From 10a86db00c2227a88c283f3ac962074f74cad4cf Mon Sep 17 00:00:00 2001 From: Aitor Emper Date: Sun, 17 Sep 2023 21:42:19 +0200 Subject: [PATCH] V2 Update Co-Authored-By: Blaise <133521603+blaise-tk@users.noreply.github.com> Co-Authored-By: TheUserNil <102625768+theusernil@users.noreply.github.com> Co-Authored-By: DeiantV <141984185+deiantv@users.noreply.github.com> --- .env | 8 + .github/FUNDING.yml | 13 + .github/workflows/docker.yml | 70 + .github/workflows/genlocale.yml | 33 + .github/workflows/pull_format.yml | 43 + .github/workflows/push_format.yml | 56 + .github/workflows/unitest.yml | 36 + Dockerfile | 29 + LICENSE | 60 + Makefile | 63 + README.md | 215 + assets/audios/.gitignore | 0 assets/audios/separated/.gitkeep | 1 + assets/audios/tracks/.gitkeep | 1 + assets/configs/32k.json | 50 + assets/configs/32k_v2.json | 50 + assets/configs/40k.json | 50 + assets/configs/48k.json | 50 + assets/configs/48k_v2.json | 50 + .../configs/__pycache__/config.cpython-39.pyc | Bin 0 -> 6163 bytes assets/configs/config.json | 15 + assets/configs/config.py | 278 + assets/configs/v1/32k.json | 46 + assets/configs/v1/40k.json | 46 + assets/configs/v1/48k.json | 46 + assets/configs/v2/32k.json | 46 + assets/configs/v2/48k.json | 46 + assets/hubert/.gitignore | 0 assets/i18n/__pycache__/i18n.cpython-39.pyc | Bin 0 -> 2612 bytes assets/i18n/extract_locale.py | 34 + assets/i18n/i18n.py | 66 + assets/i18n/langs/ar_AR.json | 247 + assets/i18n/langs/de_DE.json | 252 + assets/i18n/langs/en_US.json | 260 + assets/i18n/langs/es_ES.json | 260 + assets/i18n/langs/id_ID.json | 248 + assets/i18n/langs/it_IT.json | 252 + assets/i18n/langs/pt_PT.json | 247 + assets/i18n/langs/ru_RU.json | 247 + assets/i18n/langs/tr_TR.json | 249 + assets/i18n/langs/ur_UR.json | 247 + assets/i18n/langs/zh_CN.json | 247 + assets/i18n/locale_diff.py | 45 + assets/i18n/scan_i18n.py | 75 + assets/images/icon.png | Bin 0 -> 21150 bytes assets/pretrained/.gitignore | 2 + assets/pretrained_v2/.gitignore | 2 + assets/requirements/requirements-dml.txt | 48 + assets/requirements/requirements-ipex.txt | 56 + .../requirements/requirements-realtime-vc.txt | 29 + ...quirements-win-for-realtime_vc_gui-dml.txt | 29 + .../requirements-win-for-realtime_vc_gui.txt | 28 + assets/requirements/requirements.txt | 62 + assets/rmvpe/.gitignore | 0 assets/unzips/.gitignore | 2 + assets/uvr5_weights/.gitignore | 2 + assets/zips/.gitignore | 2 + datasets/.gitignore | 0 go-applio-manager.bat | 289 + go-applio.bat | 85 + go-tensorboard.bat | 3 + infer-web.py | 2950 ++ install_Applio.bat | 186 + lib/csvdb/formanting.csv | 1 + lib/csvdb/stop.csv | 0 lib/fixes/local_fixes.py | 136 + lib/fixes/tensor-launch.py | 15 + .../__pycache__/globals.cpython-39.pyc | Bin 0 -> 343 bytes lib/globals/globals.py | 5 + .../__pycache__/audio.cpython-39.pyc | Bin 0 -> 4286 bytes .../__pycache__/csvutil.cpython-39.pyc | Bin 0 -> 1137 bytes .../__pycache__/rmvpe.cpython-39.pyc | Bin 0 -> 19090 bytes lib/infer/infer_libs/audio.py | 184 + lib/infer/infer_libs/csvutil.py | 41 + lib/infer/infer_libs/formantshiftcfg/f2m.txt | 2 + lib/infer/infer_libs/formantshiftcfg/m2f.txt | 2 + .../infer_libs/formantshiftcfg/random.txt | 2 + lib/infer/infer_libs/infer_batch_rvc.py | 215 + .../__pycache__/attentions.cpython-39.pyc | Bin 0 -> 9984 bytes .../__pycache__/commons.cpython-39.pyc | Bin 0 -> 5909 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 25062 bytes .../__pycache__/modules.cpython-39.pyc | Bin 0 -> 11966 bytes .../__pycache__/transforms.cpython-39.pyc | Bin 0 -> 3956 bytes lib/infer/infer_libs/infer_pack/attentions.py | 417 + lib/infer/infer_libs/infer_pack/commons.py | 167 + lib/infer/infer_libs/infer_pack/models.py | 1174 + .../infer_libs/infer_pack/models_onnx.py | 824 + lib/infer/infer_libs/infer_pack/modules.py | 521 + .../modules/F0Predictor/DioF0Predictor.py | 91 + .../modules/F0Predictor/F0Predictor.py | 16 + .../modules/F0Predictor/HarvestF0Predictor.py | 87 + .../modules/F0Predictor/PMF0Predictor.py | 98 + .../modules/F0Predictor/__init__.py | 0 .../infer_libs/infer_pack/onnx_inference.py | 149 + lib/infer/infer_libs/infer_pack/transforms.py | 207 + lib/infer/infer_libs/inference-presets.json | 20 + lib/infer/infer_libs/rmvpe.py | 717 + lib/infer/infer_libs/slicer2.py | 260 + lib/infer/infer_libs/stftpitchshift | Bin 0 -> 1822104 bytes lib/infer/infer_libs/stftpitchshift.exe | Bin 0 -> 275456 bytes .../__pycache__/process_ckpt.cpython-39.pyc | Bin 0 -> 4552 bytes lib/infer/infer_libs/train/data_utils.py | 517 + lib/infer/infer_libs/train/losses.py | 58 + lib/infer/infer_libs/train/mel_processing.py | 132 + lib/infer/infer_libs/train/process_ckpt.py | 261 + lib/infer/infer_libs/train/utils.py | 478 + .../uvr5_pack/__pycache__/mdx.cpython-39.pyc | Bin 0 -> 7706 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 3042 bytes .../infer_libs/uvr5_pack/demucs/__init__.py | 7 + .../infer_libs/uvr5_pack/demucs/__main__.py | 317 + .../infer_libs/uvr5_pack/demucs/audio.py | 172 + .../infer_libs/uvr5_pack/demucs/augment.py | 106 + .../infer_libs/uvr5_pack/demucs/compressed.py | 115 + .../infer_libs/uvr5_pack/demucs/model.py | 202 + .../infer_libs/uvr5_pack/demucs/parser.py | 244 + .../infer_libs/uvr5_pack/demucs/pretrained.py | 107 + lib/infer/infer_libs/uvr5_pack/demucs/raw.py | 173 + .../infer_libs/uvr5_pack/demucs/repitch.py | 96 + .../infer_libs/uvr5_pack/demucs/separate.py | 185 + .../infer_libs/uvr5_pack/demucs/tasnet.py | 452 + lib/infer/infer_libs/uvr5_pack/demucs/test.py | 109 + .../infer_libs/uvr5_pack/demucs/train.py | 127 + .../infer_libs/uvr5_pack/demucs/utils.py | 323 + lib/infer/infer_libs/uvr5_pack/demucs/wav.py | 174 + lib/infer/infer_libs/uvr5_pack/infer_uvr5.py | 359 + .../infer_libs/uvr5_pack/julius/__init__.py | 41 + .../infer_libs/uvr5_pack/julius/bands.py | 119 + lib/infer/infer_libs/uvr5_pack/julius/core.py | 122 + .../infer_libs/uvr5_pack/julius/fftconv.py | 183 + .../infer_libs/uvr5_pack/julius/filters.py | 258 + .../infer_libs/uvr5_pack/julius/lowpass.py | 181 + .../infer_libs/uvr5_pack/julius/resample.py | 216 + .../infer_libs/uvr5_pack/julius/utils.py | 101 + .../layers_123821KB.cpython-39.pyc | Bin 0 -> 4154 bytes .../__pycache__/layers_new.cpython-39.pyc | Bin 0 -> 4456 bytes .../model_param_init.cpython-39.pyc | Bin 0 -> 1671 bytes .../__pycache__/nets_61968KB.cpython-39.pyc | Bin 0 -> 3490 bytes .../__pycache__/nets_new.cpython-39.pyc | Bin 0 -> 3843 bytes .../__pycache__/spec_utils.cpython-39.pyc | Bin 0 -> 13690 bytes .../infer_libs/uvr5_pack/lib_v5/dataset.py | 183 + .../infer_libs/uvr5_pack/lib_v5/layers.py | 118 + .../uvr5_pack/lib_v5/layers_123812KB .py | 118 + .../uvr5_pack/lib_v5/layers_123821KB.py | 118 + .../uvr5_pack/lib_v5/layers_33966KB.py | 126 + .../uvr5_pack/lib_v5/layers_537227KB.py | 126 + .../uvr5_pack/lib_v5/layers_537238KB.py | 126 + .../infer_libs/uvr5_pack/lib_v5/layers_new.py | 125 + .../uvr5_pack/lib_v5/model_param_init.py | 69 + .../modelparams/1band_sr16000_hl512.json | 19 + .../modelparams/1band_sr32000_hl512.json | 19 + .../modelparams/1band_sr33075_hl384.json | 19 + .../modelparams/1band_sr44100_hl1024.json | 19 + .../modelparams/1band_sr44100_hl256.json | 19 + .../modelparams/1band_sr44100_hl512.json | 19 + .../modelparams/1band_sr44100_hl512_cut.json | 19 + .../lib_v5/modelparams/2band_32000.json | 30 + .../lib_v5/modelparams/2band_44100_lofi.json | 30 + .../lib_v5/modelparams/2band_48000.json | 30 + .../lib_v5/modelparams/3band_44100.json | 42 + .../lib_v5/modelparams/3band_44100_mid.json | 43 + .../lib_v5/modelparams/3band_44100_msb2.json | 43 + .../lib_v5/modelparams/4band_44100.json | 54 + .../lib_v5/modelparams/4band_44100_mid.json | 55 + .../lib_v5/modelparams/4band_44100_msb.json | 55 + .../lib_v5/modelparams/4band_44100_msb2.json | 55 + .../modelparams/4band_44100_reverse.json | 55 + .../lib_v5/modelparams/4band_44100_sw.json | 55 + .../lib_v5/modelparams/4band_v2.json | 54 + .../lib_v5/modelparams/4band_v2_sn.json | 55 + .../lib_v5/modelparams/4band_v3.json | 54 + .../lib_v5/modelparams/ensemble.json | 43 + lib/infer/infer_libs/uvr5_pack/lib_v5/nets.py | 123 + .../uvr5_pack/lib_v5/nets_123812KB.py | 122 + .../uvr5_pack/lib_v5/nets_123821KB.py | 122 + .../uvr5_pack/lib_v5/nets_33966KB.py | 122 + .../uvr5_pack/lib_v5/nets_537227KB.py | 123 + .../uvr5_pack/lib_v5/nets_537238KB.py | 123 + .../uvr5_pack/lib_v5/nets_61968KB.py | 122 + .../infer_libs/uvr5_pack/lib_v5/nets_new.py | 133 + .../infer_libs/uvr5_pack/lib_v5/spec_utils.py | 672 + lib/infer/infer_libs/uvr5_pack/mdx.py | 228 + .../infer_libs/uvr5_pack/name_params.json | 263 + lib/infer/infer_libs/uvr5_pack/utils.py | 121 + .../__pycache__/attentions.cpython-39.pyc | Bin 0 -> 9963 bytes .../__pycache__/commons.cpython-39.pyc | Bin 0 -> 5899 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 24681 bytes .../__pycache__/models_onnx.cpython-39.pyc | Bin 0 -> 19504 bytes .../__pycache__/modules.cpython-39.pyc | Bin 0 -> 11922 bytes .../__pycache__/transforms.cpython-39.pyc | Bin 0 -> 3946 bytes lib/infer/infer_pack/attentions.py | 417 + lib/infer/infer_pack/commons.py | 166 + lib/infer/infer_pack/models.py | 1144 + lib/infer/infer_pack/models_dml.py | 1124 + lib/infer/infer_pack/models_onnx.py | 819 + lib/infer/infer_pack/modules.py | 522 + .../modules/F0Predictor/DioF0Predictor.py | 90 + .../modules/F0Predictor/F0Predictor.py | 16 + .../modules/F0Predictor/HarvestF0Predictor.py | 86 + .../modules/F0Predictor/PMF0Predictor.py | 97 + .../modules/F0Predictor/__init__.py | 0 lib/infer/infer_pack/onnx_inference.py | 145 + lib/infer/infer_pack/tensorlowest.py | 123 + lib/infer/infer_pack/transforms.py | 209 + lib/infer/modules/ipex/__init__.py.py | 165 + lib/infer/modules/ipex/attention.py | 128 + lib/infer/modules/ipex/gradscaler.py | 179 + lib/infer/modules/ipex/hijacks.py | 196 + lib/infer/modules/onnx/export.py | 52 + .../modules/train/extract/extract_f0_print.py | 300 + .../modules/train/extract/extract_f0_rmvpe.py | 141 + .../train/extract/extract_f0_rmvpe_dml.py | 139 + .../modules/train/extract_feature_print.py | 137 + lib/infer/modules/train/preprocess.py | 147 + lib/infer/modules/train/train.py | 723 + .../uvr5/__pycache__/mdxnet.cpython-39.pyc | Bin 0 -> 6475 bytes .../__pycache__/mdxprocess.cpython-39.pyc | Bin 0 -> 3946 bytes .../__pycache__/preprocess.cpython-39.pyc | Bin 0 -> 6522 bytes lib/infer/modules/uvr5/mdxnet.py | 246 + lib/infer/modules/uvr5/mdxprocess.py | 145 + lib/infer/modules/uvr5/modules.py | 107 + lib/infer/modules/uvr5/preprocess.py | 346 + lib/infer/modules/vc/__init__.py | 0 .../vc/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 187 bytes .../vc/__pycache__/modules.cpython-39.pyc | Bin 0 -> 9310 bytes .../vc/__pycache__/pipeline.cpython-39.pyc | Bin 0 -> 15618 bytes .../vc/__pycache__/utils.cpython-39.pyc | Bin 0 -> 1452 bytes lib/infer/modules/vc/modules.py | 535 + lib/infer/modules/vc/pipeline.py | 654 + lib/infer/modules/vc/utils.py | 42 + lib/model/.gitkeep | 1 + lib/tools/LazyImport.py | 13 + .../__pycache__/LazyImport.cpython-39.pyc | Bin 0 -> 550 bytes .../__pycache__/audioEffects.cpython-39.pyc | Bin 0 -> 1376 bytes lib/tools/app.py | 148 + lib/tools/audioEffects.py | 37 + lib/tools/calc_rvc_model_similarity.py | 96 + lib/tools/diffq/__init__.py | 18 + lib/tools/diffq/base.py | 262 + lib/tools/diffq/diffq.py | 286 + lib/tools/diffq/uniform.py | 121 + lib/tools/diffq/utils.py | 37 + lib/tools/dlmodels.bat | 348 + lib/tools/dlmodels.sh | 566 + lib/tools/get-pip.py | 32635 ++++++++++++++++ lib/tools/gui/gui_v0.py | 786 + lib/tools/gui/gui_v1.py | 704 + lib/tools/gui/guidml.py | 710 + lib/tools/infer/infer-pm-index256.py | 202 + lib/tools/infer/train-index-v2.py | 79 + lib/tools/infer/train-index.py | 42 + lib/tools/infer/trans_weights.py | 18 + lib/tools/infer_batch_rvc.py | 72 + lib/tools/infer_cli.py | 67 + lib/tools/rvc_for_realtime.py | 381 + lib/tools/torchgate/__init__.py | 12 + lib/tools/torchgate/torchgate.py | 264 + lib/tools/torchgate/utils.py | 66 + lib/train/cmd.txt | 1 + lib/train/data_utils.py | 512 + lib/train/losses.py | 59 + lib/train/mel_processing.py | 130 + lib/train/process_ckpt.py | 259 + lib/train/utils.py | 500 + lib/uvr5_pack/lib_v5/dataset.py | 183 + lib/uvr5_pack/lib_v5/layers.py | 118 + lib/uvr5_pack/lib_v5/layers_123812KB .py | 118 + lib/uvr5_pack/lib_v5/layers_123821KB.py | 118 + lib/uvr5_pack/lib_v5/layers_33966KB.py | 126 + lib/uvr5_pack/lib_v5/layers_537227KB.py | 126 + lib/uvr5_pack/lib_v5/layers_537238KB.py | 126 + lib/uvr5_pack/lib_v5/layers_new.py | 125 + lib/uvr5_pack/lib_v5/model_param_init.py | 69 + .../modelparams/1band_sr16000_hl512.json | 19 + .../modelparams/1band_sr32000_hl512.json | 19 + .../modelparams/1band_sr33075_hl384.json | 19 + .../modelparams/1band_sr44100_hl1024.json | 19 + .../modelparams/1band_sr44100_hl256.json | 19 + .../modelparams/1band_sr44100_hl512.json | 19 + .../modelparams/1band_sr44100_hl512_cut.json | 19 + .../lib_v5/modelparams/2band_32000.json | 30 + .../lib_v5/modelparams/2band_44100_lofi.json | 30 + .../lib_v5/modelparams/2band_48000.json | 30 + .../lib_v5/modelparams/3band_44100.json | 42 + .../lib_v5/modelparams/3band_44100_mid.json | 43 + .../lib_v5/modelparams/3band_44100_msb2.json | 43 + .../lib_v5/modelparams/4band_44100.json | 54 + .../lib_v5/modelparams/4band_44100_mid.json | 55 + .../lib_v5/modelparams/4band_44100_msb.json | 55 + .../lib_v5/modelparams/4band_44100_msb2.json | 55 + .../modelparams/4band_44100_reverse.json | 55 + .../lib_v5/modelparams/4band_44100_sw.json | 55 + .../lib_v5/modelparams/4band_v2.json | 54 + .../lib_v5/modelparams/4band_v2_sn.json | 55 + .../lib_v5/modelparams/4band_v3.json | 54 + .../lib_v5/modelparams/ensemble.json | 43 + lib/uvr5_pack/lib_v5/nets.py | 123 + lib/uvr5_pack/lib_v5/nets_123812KB.py | 122 + lib/uvr5_pack/lib_v5/nets_123821KB.py | 122 + lib/uvr5_pack/lib_v5/nets_33966KB.py | 122 + lib/uvr5_pack/lib_v5/nets_537227KB.py | 123 + lib/uvr5_pack/lib_v5/nets_537238KB.py | 123 + lib/uvr5_pack/lib_v5/nets_61968KB.py | 122 + lib/uvr5_pack/lib_v5/nets_new.py | 132 + lib/uvr5_pack/lib_v5/spec_utils.py | 667 + lib/uvr5_pack/name_params.json | 262 + lib/uvr5_pack/utils.py | 120 + logs/mute/0_gt_wavs/mute32k.wav | Bin 0 -> 192078 bytes logs/mute/0_gt_wavs/mute40k.wav | Bin 0 -> 240078 bytes logs/mute/0_gt_wavs/mute48k.wav | Bin 0 -> 288078 bytes logs/mute/1_16k_wavs/mute.wav | Bin 0 -> 96078 bytes logs/mute/2a_f0/mute.wav.npy | Bin 0 -> 1332 bytes logs/mute/2b-f0nsf/mute.wav.npy | Bin 0 -> 2536 bytes logs/mute/3_feature256/mute.npy | Bin 0 -> 152704 bytes logs/mute/3_feature768/mute.npy | Bin 0 -> 457856 bytes logs/weights/.gitignore | 0 tabs/__pycache__/merge.cpython-39.pyc | Bin 0 -> 5554 bytes tabs/__pycache__/processing.cpython-39.pyc | Bin 0 -> 4298 bytes tabs/__pycache__/resources.cpython-39.pyc | Bin 0 -> 35262 bytes tabs/__pycache__/tts.cpython-39.pyc | Bin 0 -> 5184 bytes tabs/merge.py | 276 + tabs/processing.py | 217 + tabs/resources.py | 1682 + tabs/tts.py | 251 + 323 files changed, 78938 insertions(+) create mode 100644 .env create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/docker.yml create mode 100644 .github/workflows/genlocale.yml create mode 100644 .github/workflows/pull_format.yml create mode 100644 .github/workflows/push_format.yml create mode 100644 .github/workflows/unitest.yml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 assets/audios/.gitignore create mode 100644 assets/audios/separated/.gitkeep create mode 100644 assets/audios/tracks/.gitkeep create mode 100644 assets/configs/32k.json create mode 100644 assets/configs/32k_v2.json create mode 100644 assets/configs/40k.json create mode 100644 assets/configs/48k.json create mode 100644 assets/configs/48k_v2.json create mode 100644 assets/configs/__pycache__/config.cpython-39.pyc create mode 100644 assets/configs/config.json create mode 100644 assets/configs/config.py create mode 100644 assets/configs/v1/32k.json create mode 100644 assets/configs/v1/40k.json create mode 100644 assets/configs/v1/48k.json create mode 100644 assets/configs/v2/32k.json create mode 100644 assets/configs/v2/48k.json create mode 100644 assets/hubert/.gitignore create mode 100644 assets/i18n/__pycache__/i18n.cpython-39.pyc create mode 100644 assets/i18n/extract_locale.py create mode 100644 assets/i18n/i18n.py create mode 100644 assets/i18n/langs/ar_AR.json create mode 100644 assets/i18n/langs/de_DE.json create mode 100644 assets/i18n/langs/en_US.json create mode 100644 assets/i18n/langs/es_ES.json create mode 100644 assets/i18n/langs/id_ID.json create mode 100644 assets/i18n/langs/it_IT.json create mode 100644 assets/i18n/langs/pt_PT.json create mode 100644 assets/i18n/langs/ru_RU.json create mode 100644 assets/i18n/langs/tr_TR.json create mode 100644 assets/i18n/langs/ur_UR.json create mode 100644 assets/i18n/langs/zh_CN.json create mode 100644 assets/i18n/locale_diff.py create mode 100644 assets/i18n/scan_i18n.py create mode 100644 assets/images/icon.png create mode 100644 assets/pretrained/.gitignore create mode 100644 assets/pretrained_v2/.gitignore create mode 100644 assets/requirements/requirements-dml.txt create mode 100644 assets/requirements/requirements-ipex.txt create mode 100644 assets/requirements/requirements-realtime-vc.txt create mode 100644 assets/requirements/requirements-win-for-realtime_vc_gui-dml.txt create mode 100644 assets/requirements/requirements-win-for-realtime_vc_gui.txt create mode 100644 assets/requirements/requirements.txt create mode 100644 assets/rmvpe/.gitignore create mode 100644 assets/unzips/.gitignore create mode 100644 assets/uvr5_weights/.gitignore create mode 100644 assets/zips/.gitignore create mode 100644 datasets/.gitignore create mode 100644 go-applio-manager.bat create mode 100644 go-applio.bat create mode 100644 go-tensorboard.bat create mode 100644 infer-web.py create mode 100644 install_Applio.bat create mode 100644 lib/csvdb/formanting.csv create mode 100644 lib/csvdb/stop.csv create mode 100644 lib/fixes/local_fixes.py create mode 100644 lib/fixes/tensor-launch.py create mode 100644 lib/globals/__pycache__/globals.cpython-39.pyc create mode 100644 lib/globals/globals.py create mode 100644 lib/infer/infer_libs/__pycache__/audio.cpython-39.pyc create mode 100644 lib/infer/infer_libs/__pycache__/csvutil.cpython-39.pyc create mode 100644 lib/infer/infer_libs/__pycache__/rmvpe.cpython-39.pyc create mode 100644 lib/infer/infer_libs/audio.py create mode 100644 lib/infer/infer_libs/csvutil.py create mode 100644 lib/infer/infer_libs/formantshiftcfg/f2m.txt create mode 100644 lib/infer/infer_libs/formantshiftcfg/m2f.txt create mode 100644 lib/infer/infer_libs/formantshiftcfg/random.txt create mode 100644 lib/infer/infer_libs/infer_batch_rvc.py create mode 100644 lib/infer/infer_libs/infer_pack/__pycache__/attentions.cpython-39.pyc create mode 100644 lib/infer/infer_libs/infer_pack/__pycache__/commons.cpython-39.pyc create mode 100644 lib/infer/infer_libs/infer_pack/__pycache__/models.cpython-39.pyc create mode 100644 lib/infer/infer_libs/infer_pack/__pycache__/modules.cpython-39.pyc create mode 100644 lib/infer/infer_libs/infer_pack/__pycache__/transforms.cpython-39.pyc create mode 100644 lib/infer/infer_libs/infer_pack/attentions.py create mode 100644 lib/infer/infer_libs/infer_pack/commons.py create mode 100644 lib/infer/infer_libs/infer_pack/models.py create mode 100644 lib/infer/infer_libs/infer_pack/models_onnx.py create mode 100644 lib/infer/infer_libs/infer_pack/modules.py create mode 100644 lib/infer/infer_libs/infer_pack/modules/F0Predictor/DioF0Predictor.py create mode 100644 lib/infer/infer_libs/infer_pack/modules/F0Predictor/F0Predictor.py create mode 100644 lib/infer/infer_libs/infer_pack/modules/F0Predictor/HarvestF0Predictor.py create mode 100644 lib/infer/infer_libs/infer_pack/modules/F0Predictor/PMF0Predictor.py create mode 100644 lib/infer/infer_libs/infer_pack/modules/F0Predictor/__init__.py create mode 100644 lib/infer/infer_libs/infer_pack/onnx_inference.py create mode 100644 lib/infer/infer_libs/infer_pack/transforms.py create mode 100644 lib/infer/infer_libs/inference-presets.json create mode 100644 lib/infer/infer_libs/rmvpe.py create mode 100644 lib/infer/infer_libs/slicer2.py create mode 100644 lib/infer/infer_libs/stftpitchshift create mode 100644 lib/infer/infer_libs/stftpitchshift.exe create mode 100644 lib/infer/infer_libs/train/__pycache__/process_ckpt.cpython-39.pyc create mode 100644 lib/infer/infer_libs/train/data_utils.py create mode 100644 lib/infer/infer_libs/train/losses.py create mode 100644 lib/infer/infer_libs/train/mel_processing.py create mode 100644 lib/infer/infer_libs/train/process_ckpt.py create mode 100644 lib/infer/infer_libs/train/utils.py create mode 100644 lib/infer/infer_libs/uvr5_pack/__pycache__/mdx.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/__pycache__/utils.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/__init__.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/__main__.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/audio.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/augment.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/compressed.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/model.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/parser.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/pretrained.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/raw.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/repitch.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/separate.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/tasnet.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/test.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/train.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/utils.py create mode 100644 lib/infer/infer_libs/uvr5_pack/demucs/wav.py create mode 100644 lib/infer/infer_libs/uvr5_pack/infer_uvr5.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/__init__.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/bands.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/core.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/fftconv.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/filters.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/lowpass.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/resample.py create mode 100644 lib/infer/infer_libs/uvr5_pack/julius/utils.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/layers_123821KB.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/layers_new.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/model_param_init.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/nets_61968KB.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/nets_new.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/spec_utils.cpython-39.pyc create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/dataset.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_123812KB .py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_123821KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_33966KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_537227KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_537238KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/layers_new.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/model_param_init.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr16000_hl512.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr33075_hl384.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl1024.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl256.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512_cut.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/2band_32000.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/2band_44100_lofi.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/2band_48000.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/3band_44100.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/3band_44100_mid.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/3band_44100_msb2.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100_mid.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100_msb.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100_msb2.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100_reverse.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_44100_sw.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_v2.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_v2_sn.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_v3.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/ensemble.json create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123812KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123821KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_33966KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537227KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537238KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_61968KB.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/nets_new.py create mode 100644 lib/infer/infer_libs/uvr5_pack/lib_v5/spec_utils.py create mode 100644 lib/infer/infer_libs/uvr5_pack/mdx.py create mode 100644 lib/infer/infer_libs/uvr5_pack/name_params.json create mode 100644 lib/infer/infer_libs/uvr5_pack/utils.py create mode 100644 lib/infer/infer_pack/__pycache__/attentions.cpython-39.pyc create mode 100644 lib/infer/infer_pack/__pycache__/commons.cpython-39.pyc create mode 100644 lib/infer/infer_pack/__pycache__/models.cpython-39.pyc create mode 100644 lib/infer/infer_pack/__pycache__/models_onnx.cpython-39.pyc create mode 100644 lib/infer/infer_pack/__pycache__/modules.cpython-39.pyc create mode 100644 lib/infer/infer_pack/__pycache__/transforms.cpython-39.pyc create mode 100644 lib/infer/infer_pack/attentions.py create mode 100644 lib/infer/infer_pack/commons.py create mode 100644 lib/infer/infer_pack/models.py create mode 100644 lib/infer/infer_pack/models_dml.py create mode 100644 lib/infer/infer_pack/models_onnx.py create mode 100644 lib/infer/infer_pack/modules.py create mode 100644 lib/infer/infer_pack/modules/F0Predictor/DioF0Predictor.py create mode 100644 lib/infer/infer_pack/modules/F0Predictor/F0Predictor.py create mode 100644 lib/infer/infer_pack/modules/F0Predictor/HarvestF0Predictor.py create mode 100644 lib/infer/infer_pack/modules/F0Predictor/PMF0Predictor.py create mode 100644 lib/infer/infer_pack/modules/F0Predictor/__init__.py create mode 100644 lib/infer/infer_pack/onnx_inference.py create mode 100644 lib/infer/infer_pack/tensorlowest.py create mode 100644 lib/infer/infer_pack/transforms.py create mode 100644 lib/infer/modules/ipex/__init__.py.py create mode 100644 lib/infer/modules/ipex/attention.py create mode 100644 lib/infer/modules/ipex/gradscaler.py create mode 100644 lib/infer/modules/ipex/hijacks.py create mode 100644 lib/infer/modules/onnx/export.py create mode 100644 lib/infer/modules/train/extract/extract_f0_print.py create mode 100644 lib/infer/modules/train/extract/extract_f0_rmvpe.py create mode 100644 lib/infer/modules/train/extract/extract_f0_rmvpe_dml.py create mode 100644 lib/infer/modules/train/extract_feature_print.py create mode 100644 lib/infer/modules/train/preprocess.py create mode 100644 lib/infer/modules/train/train.py create mode 100644 lib/infer/modules/uvr5/__pycache__/mdxnet.cpython-39.pyc create mode 100644 lib/infer/modules/uvr5/__pycache__/mdxprocess.cpython-39.pyc create mode 100644 lib/infer/modules/uvr5/__pycache__/preprocess.cpython-39.pyc create mode 100644 lib/infer/modules/uvr5/mdxnet.py create mode 100644 lib/infer/modules/uvr5/mdxprocess.py create mode 100644 lib/infer/modules/uvr5/modules.py create mode 100644 lib/infer/modules/uvr5/preprocess.py create mode 100644 lib/infer/modules/vc/__init__.py create mode 100644 lib/infer/modules/vc/__pycache__/__init__.cpython-39.pyc create mode 100644 lib/infer/modules/vc/__pycache__/modules.cpython-39.pyc create mode 100644 lib/infer/modules/vc/__pycache__/pipeline.cpython-39.pyc create mode 100644 lib/infer/modules/vc/__pycache__/utils.cpython-39.pyc create mode 100644 lib/infer/modules/vc/modules.py create mode 100644 lib/infer/modules/vc/pipeline.py create mode 100644 lib/infer/modules/vc/utils.py create mode 100644 lib/model/.gitkeep create mode 100644 lib/tools/LazyImport.py create mode 100644 lib/tools/__pycache__/LazyImport.cpython-39.pyc create mode 100644 lib/tools/__pycache__/audioEffects.cpython-39.pyc create mode 100644 lib/tools/app.py create mode 100644 lib/tools/audioEffects.py create mode 100644 lib/tools/calc_rvc_model_similarity.py create mode 100644 lib/tools/diffq/__init__.py create mode 100644 lib/tools/diffq/base.py create mode 100644 lib/tools/diffq/diffq.py create mode 100644 lib/tools/diffq/uniform.py create mode 100644 lib/tools/diffq/utils.py create mode 100644 lib/tools/dlmodels.bat create mode 100644 lib/tools/dlmodels.sh create mode 100644 lib/tools/get-pip.py create mode 100644 lib/tools/gui/gui_v0.py create mode 100644 lib/tools/gui/gui_v1.py create mode 100644 lib/tools/gui/guidml.py create mode 100644 lib/tools/infer/infer-pm-index256.py create mode 100644 lib/tools/infer/train-index-v2.py create mode 100644 lib/tools/infer/train-index.py create mode 100644 lib/tools/infer/trans_weights.py create mode 100644 lib/tools/infer_batch_rvc.py create mode 100644 lib/tools/infer_cli.py create mode 100644 lib/tools/rvc_for_realtime.py create mode 100644 lib/tools/torchgate/__init__.py create mode 100644 lib/tools/torchgate/torchgate.py create mode 100644 lib/tools/torchgate/utils.py create mode 100644 lib/train/cmd.txt create mode 100644 lib/train/data_utils.py create mode 100644 lib/train/losses.py create mode 100644 lib/train/mel_processing.py create mode 100644 lib/train/process_ckpt.py create mode 100644 lib/train/utils.py create mode 100644 lib/uvr5_pack/lib_v5/dataset.py create mode 100644 lib/uvr5_pack/lib_v5/layers.py create mode 100644 lib/uvr5_pack/lib_v5/layers_123812KB .py create mode 100644 lib/uvr5_pack/lib_v5/layers_123821KB.py create mode 100644 lib/uvr5_pack/lib_v5/layers_33966KB.py create mode 100644 lib/uvr5_pack/lib_v5/layers_537227KB.py create mode 100644 lib/uvr5_pack/lib_v5/layers_537238KB.py create mode 100644 lib/uvr5_pack/lib_v5/layers_new.py create mode 100644 lib/uvr5_pack/lib_v5/model_param_init.py create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr16000_hl512.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr33075_hl384.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl1024.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl256.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512_cut.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/2band_32000.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/2band_44100_lofi.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/2band_48000.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/3band_44100.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/3band_44100_mid.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/3band_44100_msb2.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100_mid.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100_msb.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100_msb2.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100_reverse.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_44100_sw.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_v2.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_v2_sn.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/4band_v3.json create mode 100644 lib/uvr5_pack/lib_v5/modelparams/ensemble.json create mode 100644 lib/uvr5_pack/lib_v5/nets.py create mode 100644 lib/uvr5_pack/lib_v5/nets_123812KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_123821KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_33966KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_537227KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_537238KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_61968KB.py create mode 100644 lib/uvr5_pack/lib_v5/nets_new.py create mode 100644 lib/uvr5_pack/lib_v5/spec_utils.py create mode 100644 lib/uvr5_pack/name_params.json create mode 100644 lib/uvr5_pack/utils.py create mode 100644 logs/mute/0_gt_wavs/mute32k.wav create mode 100644 logs/mute/0_gt_wavs/mute40k.wav create mode 100644 logs/mute/0_gt_wavs/mute48k.wav create mode 100644 logs/mute/1_16k_wavs/mute.wav create mode 100644 logs/mute/2a_f0/mute.wav.npy create mode 100644 logs/mute/2b-f0nsf/mute.wav.npy create mode 100644 logs/mute/3_feature256/mute.npy create mode 100644 logs/mute/3_feature768/mute.npy create mode 100644 logs/weights/.gitignore create mode 100644 tabs/__pycache__/merge.cpython-39.pyc create mode 100644 tabs/__pycache__/processing.cpython-39.pyc create mode 100644 tabs/__pycache__/resources.cpython-39.pyc create mode 100644 tabs/__pycache__/tts.cpython-39.pyc create mode 100644 tabs/merge.py create mode 100644 tabs/processing.py create mode 100644 tabs/resources.py create mode 100644 tabs/tts.py diff --git a/.env b/.env new file mode 100644 index 000000000..14b588ce8 --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +OPENBLAS_NUM_THREADS = 1 +no_proxy = localhost, 127.0.0.1, ::1 + +# You can change the location of the model, etc. by changing here +weight_root = logs/weights +weight_uvr5_root = assets/uvr5_weights +index_root = logs +rmvpe_root = assets/rmvpe diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..162a87e02 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: ["https://paypal.me/iahispano"] diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..68f74fa12 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,70 @@ +name: Build And Push Docker Image + +on: + workflow_dispatch: + push: + # Sequence of patterns matched against refs/tags + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + +jobs: + build: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - uses: actions/checkout@v3 + - name: Set time zone + uses: szenius/set-timezone@v1.0 + with: + timezoneLinux: "Asia/Shanghai" + timezoneMacos: "Asia/Shanghai" + timezoneWindows: "China Standard Time" + + # # 如果有 dockerhub 账户,可以在github的secrets中配置下面两个,然后取消下面注释的这几行,并在meta步骤的images增加一行 ${{ github.repository }} + # - name: Login to DockerHub + # uses: docker/login-action@v1 + # with: + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: | + ghcr.io/${{ github.repository }} + # generate Docker tags based on the following events/attributes + # nightly, master, pr-2, 1.2.3, 1.2, 1 + tags: | + type=schedule,pattern=nightly + type=edge + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/genlocale.yml b/.github/workflows/genlocale.yml new file mode 100644 index 000000000..96a29e891 --- /dev/null +++ b/.github/workflows/genlocale.yml @@ -0,0 +1,33 @@ +name: genlocale +on: + push: + branches: + - main +jobs: + genlocale: + name: genlocale + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@master + + - name: Run locale generation + run: | + python3 i18n/scan_i18n.py + cd i18n + python3 locale_diff.py + + - name: Commit back + if: ${{ !github.head_ref }} + continue-on-error: true + run: | + git config --local user.name 'github-actions[bot]' + git config --local user.email 'github-actions[bot]@users.noreply.github.com' + git add --all + git commit -m "🎨 同步 locale" + + - name: Create Pull Request + if: ${{ !github.head_ref }} + continue-on-error: true + uses: peter-evans/create-pull-request@v4 + diff --git a/.github/workflows/pull_format.yml b/.github/workflows/pull_format.yml new file mode 100644 index 000000000..4440f6c38 --- /dev/null +++ b/.github/workflows/pull_format.yml @@ -0,0 +1,43 @@ +name: pull format + +on: [pull_request] + +permissions: + contents: write + +jobs: + pull_format: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + python-version: ["3.10"] + os: [ubuntu-latest] + fail-fast: false + + continue-on-error: true + + steps: + - name: checkout + continue-on-error: true + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Black + run: pip install "black[jupyter]" + + - name: Run Black + # run: black $(git ls-files '*.py') + run: black . + + - name: Commit Back + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Apply Code Formatter Change diff --git a/.github/workflows/push_format.yml b/.github/workflows/push_format.yml new file mode 100644 index 000000000..0a727898e --- /dev/null +++ b/.github/workflows/push_format.yml @@ -0,0 +1,56 @@ +name: push format + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + push_format: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + python-version: ["3.10"] + os: [ubuntu-latest] + fail-fast: false + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{github.ref_name}} + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Black + run: pip install "black[jupyter]" + + - name: Run Black + # run: black $(git ls-files '*.py') + run: black . + + - name: Commit Back + continue-on-error: true + id: commitback + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add --all + git commit -m "Format code" + + - name: Create Pull Request + if: steps.commitback.outcome == 'success' + continue-on-error: true + uses: peter-evans/create-pull-request@v5 + with: + delete-branch: true + body: Apply Code Formatter Change + title: Apply Code Formatter Change + commit-message: Automatic code format diff --git a/.github/workflows/unitest.yml b/.github/workflows/unitest.yml new file mode 100644 index 000000000..1ab65f69f --- /dev/null +++ b/.github/workflows/unitest.yml @@ -0,0 +1,36 @@ +name: unitest +on: [ push, pull_request ] +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10"] + os: [ubuntu-latest] + fail-fast: false + + steps: + - uses: actions/checkout@master + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + sudo apt update + sudo apt -y install ffmpeg + sudo apt -y install -qq aria2 + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d ./ -o hubert_base.pt + python -m pip install --upgrade pip + python -m pip install --upgrade setuptools + python -m pip install --upgrade wheel + pip install torch torchvision torchaudio + pip install -r requirements.txt + - name: Test step 1 & 2 + run: | + mkdir -p logs/mi-test + touch logs/mi-test/preprocess.log + python infer/modules/train/preprocess.py logs/mute/0_gt_wavs 48000 8 logs/mi-test True 3.7 + touch logs/mi-test/extract_f0_feature.log + python infer/modules/train/extract/extract_f0_print.py logs/mi-test $(nproc) pm + python infer/modules/train/extract_feature_print.py cpu 1 0 0 logs/mi-test v1 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..5ac106624 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# syntax=docker/dockerfile:1 + +FROM python:3.10-bullseye + +EXPOSE 7865 + +WORKDIR /app + +COPY . . + +RUN apt update && apt install -y -qq ffmpeg aria2 && apt clean + +RUN pip3 install --no-cache-dir -r assets/requirements/requirements.txt + +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -d assets/pretrained_v2/ -o D40k.pth +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -d assets/pretrained_v2/ -o G40k.pth +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth -d assets/pretrained_v2/ -o f0D40k.pth +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth -d assets/pretrained_v2/ -o f0G40k.pth + +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2-人声vocals+非人声instrumentals.pth -d assets/uvr5_weights/ -o HP2-人声vocals+非人声instrumentals.pth +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5-主旋律人声vocals+其他instrumentals.pth -d assets/uvr5_weights/ -o HP5-主旋律人声vocals+其他instrumentals.pth + +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d assets/hubert -o hubert_base.pt + +RUN aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt -d assets/hubert -o rmvpe.pt + +VOLUME [ "/app/logs/weights", "/app/opt" ] + +CMD ["python3", "infer-web.py"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..bbcb9c861 --- /dev/null +++ b/LICENSE @@ -0,0 +1,60 @@ +MIT License + +Copyright (c) 2023 liujing04 +Copyright (c) 2023 源文雨 +Copyright (c) 2023 IA Hispano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +The licenses for related libraries are as follows: + +ContentVec +https://github.com/auspicious3000/contentvec/blob/main/LICENSE +MIT License + +VITS +https://github.com/jaywalnut310/vits/blob/main/LICENSE +MIT License + +HIFIGAN +https://github.com/jik876/hifi-gan/blob/master/LICENSE +MIT License + +gradio +https://github.com/gradio-app/gradio/blob/main/LICENSE +Apache License 2.0 + +ffmpeg +https://github.com/FFmpeg/FFmpeg/blob/master/COPYING.LGPLv3 +https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2021-02-28-12-32/ffmpeg-n4.3.2-160-gfbb9368226-win64-lgpl-4.3.zip +LPGLv3 License +MIT License + +UVR5 +https://github.com/Anjok07/ultimatevocalremovergui/blob/master/LICENSE +https://github.com/yang123qwe/vocal_separation_by_uvr5 +MIT License + +audio-slicer +https://github.com/openvpi/audio-slicer/blob/main/LICENSE +MIT License + +PySimpleGUI +https://github.com/PySimpleGUI/PySimpleGUI/blob/master/license.txt +LPGLv3 License \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..e1ce27677 --- /dev/null +++ b/Makefile @@ -0,0 +1,63 @@ +.PHONY: +.ONESHELL: + +help: ## Show this help and exit + @grep -hE '^[A-Za-z0-9_ \-]*?:.*##.*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +install: ## Install dependencies (Do everytime you start up a paperspace machine) + apt-get -y install build-essential python3-dev ffmpeg + pip install --upgrade setuptools wheel + pip install --upgrade pip + pip install faiss-gpu fairseq gradio ffmpeg ffmpeg-python praat-parselmouth pyworld numpy==1.23.5 numba==0.56.4 librosa==0.9.1 + pip install -r assets/requirements/requirements.txt + pip install --upgrade lxml + apt-get update + apt -y install -qq aria2 + +basev1: ## Download version 1 pre-trained models (Do only once after cloning the fork) + mkdir -p pretrained uvr5_weights + git pull + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D32k.pth -d pretrained -o D32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D40k.pth -d pretrained -o D40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D48k.pth -d pretrained -o D48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G32k.pth -d pretrained -o G32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G40k.pth -d pretrained -o G40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G48k.pth -d pretrained -o G48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D32k.pth -d pretrained -o f0D32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D40k.pth -d pretrained -o f0D40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D48k.pth -d pretrained -o f0D48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G32k.pth -d pretrained -o f0G32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G40k.pth -d pretrained -o f0G40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G48k.pth -d pretrained -o f0G48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2-人声vocals+非人声instrumentals.pth -d uvr5_weights -o HP2-人声vocals+非人声instrumentals.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5-主旋律人声vocals+其他instrumentals.pth -d uvr5_weights -o HP5-主旋律人声vocals+其他instrumentals.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d ./ -o hubert_base.pt + +basev2: ## Download version 2 pre-trained models (Do only once after cloning the fork) + mkdir -p pretrained_v2 uvr5_weights + git pull + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D32k.pth -d pretrained_v2 -o D32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -d pretrained_v2 -o D40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D48k.pth -d pretrained_v2 -o D48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G32k.pth -d pretrained_v2 -o G32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -d pretrained_v2 -o G40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G48k.pth -d pretrained_v2 -o G48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D32k.pth -d pretrained_v2 -o f0D32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth -d pretrained_v2 -o f0D40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D48k.pth -d pretrained_v2 -o f0D48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G32k.pth -d pretrained_v2 -o f0G32k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth -d pretrained_v2 -o f0G40k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G48k.pth -d pretrained_v2 -o f0G48k.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2-人声vocals+非人声instrumentals.pth -d uvr5_weights -o HP2-人声vocals+非人声instrumentals.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5-主旋律人声vocals+其他instrumentals.pth -d uvr5_weights -o HP5-主旋律人声vocals+其他instrumentals.pth + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d ./ -o hubert_base.pt + +run-ui: ## Run the python GUI + python infer-web.py --paperspace --pycmd python + +run-cli: ## Run the python CLI + python infer-web.py --pycmd python --is_cli + +tensorboard: ## Start the tensorboard (Run on separate terminal) + echo https://tensorboard-$$(hostname).clg07azjl.paperspacegradient.com + tensorboard --logdir logs --bind_all \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..c6ec02447 --- /dev/null +++ b/README.md @@ -0,0 +1,215 @@ +# 🍏 Applio-RVC-Fork (V2) +Applio is a user-friendly fork of Mangio-RVC-Fork/RVC, designed to provide an intuitive interface, especially for newcomers. +
+ +[![Discord](https://img.shields.io/badge/SUPPORT_DISCORD-37a779?style=for-the-badge)](https://discord.gg/IAHispano) + +## 📚 Table of Contents + 1. [Improvements of Applio Over RVC](#-improvements-of-applio-over-rvc) + 2. [Additional Features of This Repository](#️-additional-features-of-this-repository) + 3. [Planned Features for Future Development](#️-planned-features-for-future-development) + 4. [Installation](#-installation) + 5. [Running the Web GUI (Inference & Train)](#-running-the-web-gui-inference--train) + 6. [Running the CLI (Inference & Train)](#-running-the-cli-inference--train) + 7. [Credits](#-credits) + 8. [Thanks to all RVC, Mangio and Applio contributors](#-thanks-to-all-rvc-mangio-and-applio-contributors) + + +## 🎯 Improvements of Applio Over RVC +### f0 Inference Algorithm Overhaul +- Applio features a comprehensive overhaul of the f0 inference algorithm, including: + - Addition of the pyworld dio f0 method. + - Alternative method for calculating crepe f0. + - Introduction of the torchcrepe crepe-tiny model. + - Customizable crepe_hop_length for the crepe algorithm via both the web GUI and CLI. + +### f0 Crepe Pitch Extraction for Training +- Works on paperspace machines but not local MacOS/Windows machines (Potential memory leak). + +### Paperspace Integration +- Applio seamlessly integrates with Paperspace, providing the following features: + - Paperspace argument on infer-web.py (--paperspace) for sharing a Gradio link. + - A dedicated make file tailored for Paperspace users. + +### Access to Tensorboard +- Applio grants easy access to Tensorboard via a Makefile and a Python script. + +### CLI Functionality +- Applio introduces command-line interface (CLI) functionality, with the addition of the --is_cli flag in infer-web.py for CLI system usage. + +### f0 Hybrid Estimation Method +- Applio offers a novel f0 hybrid estimation method by calculating nanmedian for a specified array of f0 methods, ensuring the best results from multiple methods (CLI exclusive). +- This hybrid estimation method is also available for f0 feature extraction during training. + +### UI Changes +#### Inference: +- A complete interface redesign enhances user experience, with notable features such as: + - Audio recording directly from the interface. + - Convenient drop-down menus for audio and .index file selection. + - An advanced settings section with new features like autotune and formant shifting. + +#### Training: +- Improved training features include: + - A total epoch slider now limited to 10,000. + - Increased save frequency limit to 100. + - Default recommended options for smoother setup. + - Better adaptation to high-resolution screens. + - A drop-down menu for dataset selection. + - Enhanced saving system options, including Save all files, Save G and D files, and Save model for inference. + +#### UVR: +- Applio ensures compatibility with all VR/MDX models for an extended range of possibilities. + +#### TTS (Text-to-Speech, New): +- Introducing a new Text-to-Speech (TTS) feature using RVC models. +- Support for multiple languages and Edge-tts/Bark-tts. + +#### Resources (New): +- Users can now upload models, backups, datasets, and audios from various storage services like Drive, Huggingface, Discord, and more. +- Download audios from YouTube with the ability to automatically separate instrumental and vocals, offering advanced options and UVR support. + +#### Extra (New): +- Combine instrumental and vocals with ease, including independent volume control for each track and the option to add effects like reverb, compressor, and noise gate. +- Significant improvements in the processing interface, allowing tasks such as merging models, modifying information, obtaining information, or extracting models effortlessly. + +## ⚙️ Additional Features of This Repository + +In addition to the aforementioned improvements, this repository offers the following features: + +### Enhanced Tone Leakage Reduction +- Implements tone leakage reduction by replacing source features with training-set features using top1 retrieval. This helps in achieving cleaner audio results. + +### Efficient Training +- Provides a seamless and speedy training experience, even on relatively modest graphics cards. The system is optimized for efficient resource utilization. + +### Data Efficiency +- Supports training with a small dataset, yielding commendable results, especially with audio clips of at least 10 minutes of low-noise speech. + +### Universal Compatibility +- Acceleration support for AMD/Intel graphics cards and enhanced acceleration for Intel ARC graphics cards, including IPEX compatibility. + +## 🛠️ Planned Features for Future Development +As part of the ongoing development of this fork, the following features are planned to be added: + +- Incorporating an inference batcher script based on user feedback. This enhancement will allow for processing 30-second audio samples at a time, improving output quality and preventing memory errors during inference. +- Implementing an automatic removal mechanism for old generations to optimize storage space usage. This feature ensures that the repository remains efficient and organized over time. +- Streamlining the training process for Paperspace machines to further improve efficiency and resource utilization during training tasks. + +## ✨ Installation + +### Automatic installation (Windows): +To quickly and effortlessly install Applio along with all the necessary models and configurations on Windows, you can use the [install_Applio.bat](https://github.com/IAHispano/Applio-RVC-Fork/releases) script available in the releases section. + +### Manual installation (Windows/MacOS): +**Note for MacOS Users**: When using `faiss 1.7.2` under MacOS, you may encounter a Segmentation Fault: 11 error. To resolve this issue, install `faiss-cpu 1.7.0` using the following command if you're installing it manually with pip: + ```bash +pip install faiss-cpu==1.7.0 +``` +Additionally, you can install Swig on MacOS using brew: +```bash +brew install swig +``` + +Install requirements: +*Using pip (Python 3.9.8 is stable with this fork)* +```bash +for Nvidia graphics cards: + pip install -r assets/requirements/requirements.txt + +for AMD / Intel graphics cards: + pip install -r assets/requirements/requirements-dml.txt + +for Intel ARC graphics cards on Linux / WSL using Python 3.10: + pip install -r assets/requirements/requirements-ipex.txt +``` + +### Manual installation (Paperspace): +```bash +cd Applio-RVC-Fork +make install # Do this everytime you start your paperspace machine +``` + +## 🪄 Running the Web GUI (Inference & Train) +*Use --paperspace or --colab if on cloud system.* +```bash +python infer-web.py --pycmd python --port 3000 +``` + +## 💻 Running the CLI (Inference & Train) +```bash +python infer-web.py --pycmd python --is_cli +``` + +```bash +Applio-RVC-Fork CLI + +Welcome to the CLI version of RVC. Please read the documentation on README.MD to understand how to use this app. + +You are currently in 'HOME': + go home : Takes you back to home with a navigation list. + go infer : Takes you to inference command execution. + + go pre-process : Takes you to training step.1) pre-process command execution. + go extract-feature : Takes you to training step.2) extract-feature command execution. + go train : Takes you to training step.3) being or continue training command execution. + go train-feature : Takes you to the train feature index command execution. + + go extract-model : Takes you to the extract small model command execution. + +HOME: +``` + +Typing 'go infer' for example will take you to the infer page where you can then enter in your arguments that you wish to use for that specific page. For example typing 'go infer' will take you here: + +```bash +HOME: go infer +You are currently in 'INFER': + arg 1) model name with .pth in ./weights: mi-test.pth + arg 2) source audio path: myFolder\MySource.wav + arg 3) output file name to be placed in './audio-outputs': MyTest.wav + arg 4) feature index file path: logs/mi-test/added_IVF3042_Flat_nprobe_1.index + arg 5) speaker id: 0 + arg 6) transposition: 0 + arg 7) f0 method: harvest (pm, harvest, crepe, crepe-tiny) + arg 8) crepe hop length: 160 + arg 9) harvest median filter radius: 3 (0-7) + arg 10) post resample rate: 0 + arg 11) mix volume envelope: 1 + arg 12) feature index ratio: 0.78 (0-1) + arg 13) Voiceless Consonant Protection (Less Artifact): 0.33 (Smaller number = more protection. 0.50 means Dont Use.) + +Example: mi-test.pth saudio/Sidney.wav myTest.wav logs/mi-test/added_index.index 0 -2 harvest 160 3 0 1 0.95 0.33 + +INFER: +``` + +## 🏆 Credits +Applio owes its existence to the collaborative efforts of various repositories, including Mangio-RVC-Fork, and all the other credited contributors. Without their contributions, Applio would not have been possible. Therefore, we kindly request that if you appreciate the work we've accomplished, you consider exploring the projects mentioned in our credits. + +Our goal is not to supplant RVC or Mangio; rather, we aim to provide a contemporary and up-to-date alternative for the entire community. + ++ [Retrieval-based-Voice-Conversion-WebUI](Retrieval-based-Voice-Conversion-WebUI) ++ [Mangio-RVC-Fork](https://github.com/Mangio621/Mangio-RVC-Fork) ++ [RVG_tts](https://github.com/Foxify52/RVG_tts) ++ [ContentVec](https://github.com/auspicious3000/contentvec/) ++ [VITS](https://github.com/jaywalnut310/vits) ++ [HIFIGAN](https://github.com/jik876/hifi-gan) ++ [Gradio](https://github.com/gradio-app/gradio) ++ [FFmpeg](https://github.com/FFmpeg/FFmpeg) ++ [Ultimate Vocal Remover](https://github.com/Anjok07/ultimatevocalremovergui) ++ [audio-slicer](https://github.com/openvpi/audio-slicer) ++ [Vocal pitch extraction:RMVPE](https://github.com/Dream-High/RMVPE) + + +## 🙏 Thanks to all RVC, Mangio and Applio contributors + + + + + + + + + + + diff --git a/assets/audios/.gitignore b/assets/audios/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/assets/audios/separated/.gitkeep b/assets/audios/separated/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/assets/audios/separated/.gitkeep @@ -0,0 +1 @@ + diff --git a/assets/audios/tracks/.gitkeep b/assets/audios/tracks/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/assets/audios/tracks/.gitkeep @@ -0,0 +1 @@ + diff --git a/assets/configs/32k.json b/assets/configs/32k.json new file mode 100644 index 000000000..bcae72223 --- /dev/null +++ b/assets/configs/32k.json @@ -0,0 +1,50 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": false, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 32000, + "filter_length": 1024, + "hop_length": 320, + "win_length": 1024, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [10, 4, 2, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16, 16, 4, 4, 4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/32k_v2.json b/assets/configs/32k_v2.json new file mode 100644 index 000000000..ad42f87b1 --- /dev/null +++ b/assets/configs/32k_v2.json @@ -0,0 +1,50 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 32000, + "filter_length": 1024, + "hop_length": 320, + "win_length": 1024, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [10, 8, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [20, 16, 4, 4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/40k.json b/assets/configs/40k.json new file mode 100644 index 000000000..28ff4d91f --- /dev/null +++ b/assets/configs/40k.json @@ -0,0 +1,50 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": false, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 40000, + "filter_length": 2048, + "hop_length": 400, + "win_length": 2048, + "n_mel_channels": 125, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [10, 10, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16, 16, 4, 4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/48k.json b/assets/configs/48k.json new file mode 100644 index 000000000..4d01946ed --- /dev/null +++ b/assets/configs/48k.json @@ -0,0 +1,50 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": false, + "lr_decay": 0.999875, + "segment_size": 11520, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 48000, + "filter_length": 2048, + "hop_length": 480, + "win_length": 2048, + "n_mel_channels": 128, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [10, 6, 2, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16, 16, 4, 4, 4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/48k_v2.json b/assets/configs/48k_v2.json new file mode 100644 index 000000000..50f064219 --- /dev/null +++ b/assets/configs/48k_v2.json @@ -0,0 +1,50 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 17280, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 48000, + "filter_length": 2048, + "hop_length": 480, + "win_length": 2048, + "n_mel_channels": 128, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3, 7, 11], + "resblock_dilation_sizes": [ + [1, 3, 5], + [1, 3, 5], + [1, 3, 5] + ], + "upsample_rates": [12, 10, 2, 2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [24, 20, 4, 4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/__pycache__/config.cpython-39.pyc b/assets/configs/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cfc0ca676932ba365e5fcf2c749c0e9c338e1f1 GIT binary patch literal 6163 zcma)A%X1sYnV)V9215`8K}sSeQIH&NpM1rUZ{fzcX&S&Qj5Z*j@H zg?&@-5o6=AVylR;LSXeuty11+x9s$yo-x%bOS?P0Ul|#ygB~-O=~Y`*X2|LTgBd?C z!gv%4uniy8l5gnVVZZmm_5wf#9cKVq#DdaX$+*#60p(K;oHtp&+I(W0>ADNz!( zm=a}CmJ2^Ke!)kj*6DRaOn=H+XGBHJd}y@J%CqknqAF%TG{o!!{(!ZX1iNk2YX>;9 zv6k{?v(B=qc7Ncuqd}NZ!|%%-*AM+9wH;zKxcy(p6@%rP&<>gl=8;5h+jOfaLR4?Qu zK8?zcjUTfP7fkRE?SF!ZK4LBkj#F4`=X3Oj1DYt$qQvI_K4M)XUiiou8on`P|Hgj8 z##6fnCbPBASZ4cSoOoed)_G=nY8{8#+@|kmXm<2~7qglxPmy+Pu4cJFy{ER*6hAbfR~C9o zy2lbF-D9I?O7}oZbx-+mPgzXsp6OgqEBRc~RI@cBYLLrZW?j<^`jS$R8nbtqXB^<{{e9uzk2dmzaIN$tSL4l3D@prjyr0hWN;OHX7oW6BTdDDGf$ zk(GAb4+c{0X7-NTmSG}QhLN7P13zKLGU$wTO)H$%HQUvm!*yRH@w@~;N<99TnKftu?1%OkA>xuEHYDb+SH;nNx1bw#vrI%#2r778GDjX>I_K#4oa*;6gQd8=2?@a zi#Z#f)RM1e0w@Oqx~y*t23Fv}BV!M2=ptw(Fi|qlhb999&|@Vq1B8vEo^b$~eh8Lm zj0ytEj5umn(Vm@X*U+AuXwRd4VxoOgoDvISF|owyhsAu&Gr&1}h(kuW$Hmf+cWo2y zeUqvG6z2dx4?$&UQGdu`$Q)+MyHnIgDWgoIR8VG6swlH4wayfT_RLyljjbfL8VxcI z|JUaYBb~mf&BdV}$i+-{`!G%+JKi9G=r&}~PfM7v3)@Po<0$5|qh8Mo1r6lp6(^CB zZlVSnL6D; zoH+4@rzAQZ1Zm+%PT+@|PA5{pmCm-j@7(=%)48)Th@G~F{iHL9rEsFqiGZL$OxVy- z#<_O$+fKX-KhcYusoiLdJxTfyX@Opg#&bX7L>&jAEy4MmLH}s)@m3(Q6L{;+wjTse zFlHpSMwoOGxszZKc$f~nm9q^Bq_Z0hG;MN6wg)&V#bIJKmQhg;=pCsVI0+)>g_JiE z5}9^x>AQEx$LZ6)qfg&-5QxD?r{TQ+ZnP2J?)k~al`F4bUXFXX@;(t%>50pFUwNc_3(E7?xIds8ncLovyyYj>}| z)zrbmfAk39doC-0%~^STT+*A&hDgUzp!!xW+*=eBR95kXa1RBZ6~H>oP89ikjMGS* znWXovqE_#$sP$DjMCJto&k=YYAS-I7sTWa)l@zc)%t>$4vSAr+)KB6kJiVf{>NZOJ zLjZ%9wFjF=zG5=#kyS7mr~jX=;!|o?-bWaJwCu+imd#(n%qRYTNNc%Q#G%G9@t8ZL z{cV(MDDe#da)({*2;&-MyXm;e4OwpBi9lB z#(|FPgr+LXUNVVXG1AmH9jzN>TZC=%JajP-RZBs=Bhzh=W2zhItzgM zC93}ofg>_Cg|qNoZm0jsQUi z-k%;BTP*%W(9ChmKnvN&L<`v|%|SnM)VzjFRj>1_q_RIFkh6BnBaRy=Wv-OnR!7JM z!m1ucCOaNYN}8HkqNZCDvrD)K=B2g>YB3jiZg)=1Z8DtnKazPdFHRtPa`yO;@1GbM z`zHm0`iSopCiACoeifXFFHUAqdhP<|p4D?t4Z#y_WskG2eAW*qXN7k_`-0~4Cz|#} zeb+uc!Rg~Cd|?9X%vWLIOpD^|CdZjRPfkA|sV$<
  • Nj(w-^K?G?o{dzLuAR|;$5 zS@byQxqzPM_DC{w!WgiRxq9I-cTm@O&jarT;Jv8v&H(3knxdD8?&NHDY5!dEjQE5aGOY>#p-+e2G#A>pJ@uh$Zq)rkJ$k`vzh2h{TfwutEyHumcf&;p29n=XF2_XG7 z4jh2=EBOhVn30{DBGLfx{R~wC=7StbrT==L$mGm{j_qJz%)e=q_qiz z2Hk$s*~uQtdQ93awGZ>0^!x+@GOP$^#4XCD$+TqsIURto8#=}j=q`xX!Bf$Z)B=IG z0kUF@$CV_TU6+ZQUsvf)t>|eeD}s$ki>x48U&q&kI3o1}8aXwA4+4Od_&97Oi4rfM z%XXx8)e`NpO6aDd`)~=83+Ucl+*aU`dXL5z2~c3usZz!f=*_;DY-DCP@^O>TFY3C> zk~_G2;2B9teetjAAH>bOn%_e5lhmhmaBJCq-l6CQ-7=BVDRq&yB+;su3D5&k zYwmC*7hFVElx(OW^)DXh@zLn-SLGKF6C053t)+-}3q_2&<#^yF| zy7Z^~Q2+Vq@fXm>j0HReU{zZ2k!jIWL5@Wo#?wf5|=?gkUA^Q z%==Lkj5S8Rp8>9B}4s)0rPO7u$0oaOnUP@N&;I8 zfq%cL9a=MYXibel9!PzUb}EsbVTWuA)^$_coca-sMl@=p69~xUD(!)S1tczVFO^ku z3&|f+)DF$qC7`oBdWO_zeHx=O`|6mMZ&Feo(*zqzLu!ixh2UC+Dr3b%yA1WP3s5 dict: + d = {} + for config_file in version_config_list: + with open(f"./assets/configs/{config_file}", "r") as f: + d[config_file] = json.load(f) + return d + + @staticmethod + def arg_parse() -> tuple: + exe = sys.executable or "python" + parser = argparse.ArgumentParser() + parser.add_argument("--port", type=int, default=7865, help="Listen port") + parser.add_argument("--pycmd", type=str, default=exe, help="Python command") + parser.add_argument("--colab", action="store_true", help="Launch in colab") + parser.add_argument( + "--noparallel", action="store_true", help="Disable parallel processing" + ) + parser.add_argument( + "--noautoopen", + action="store_true", + help="Do not open in browser automatically", + ) + parser.add_argument( + "--paperspace", + action="store_true", + help="Note that this argument just shares a gradio link for the web UI. Thus can be used on other non-local CLI systems.", + ) + parser.add_argument( + "--is_cli", + action="store_true", + help="Use the CLI instead of setting up a gradio UI. This flag will launch an RVC text interface where you can execute functions from infer-web.py!", + ) + + parser.add_argument( + "-t", + "--theme", + help = "Theme for Gradio. Format - `JohnSmith9982/small_and_pretty` (no backticks)", + default = "JohnSmith9982/small_and_pretty", + type = str + ) + + parser.add_argument( + "--dml", + action="store_true", + help="Use DirectML backend instead of CUDA." + ) + + cmd_opts = parser.parse_args() + + cmd_opts.port = cmd_opts.port if 0 <= cmd_opts.port <= 65535 else 7865 + + return ( + cmd_opts.pycmd, + cmd_opts.port, + cmd_opts.colab, + cmd_opts.noparallel, + cmd_opts.noautoopen, + cmd_opts.paperspace, + cmd_opts.is_cli, + cmd_opts.theme, + cmd_opts.dml, + ) + + # has_mps is only available in nightly pytorch (for now) and MasOS 12.3+. + # check `getattr` and try it for compatibility + @staticmethod + def has_mps() -> bool: + if not torch.backends.mps.is_available(): + return False + try: + torch.zeros(1).to(torch.device("mps")) + return True + except Exception: + return False + + @staticmethod + def has_xpu() -> bool: + if hasattr(torch, "xpu") and torch.xpu.is_available(): + return True + else: + return False + + def use_fp32_config(self): + for config_file in version_config_list: + self.json_config[config_file]["train"]["fp16_run"] = False + + def device_config(self) -> tuple: + if torch.cuda.is_available(): + if self.has_xpu(): + self.device = self.instead = "xpu:0" + self.is_half = True + i_device = int(self.device.split(":")[-1]) + self.gpu_name = torch.cuda.get_device_name(i_device) + if ( + ("16" in self.gpu_name and "V100" not in self.gpu_name.upper()) + or "P40" in self.gpu_name.upper() + or "P10" in self.gpu_name.upper() + or "1060" in self.gpu_name + or "1070" in self.gpu_name + or "1080" in self.gpu_name + ): + logger.info("Found GPU %s, force to fp32", self.gpu_name) + self.is_half = False + self.use_fp32_config() + else: + logger.info("Found GPU %s", self.gpu_name) + self.gpu_mem = int( + torch.cuda.get_device_properties(i_device).total_memory + / 1024 + / 1024 + / 1024 + + 0.4 + ) + if self.gpu_mem <= 4: + with open("lib/infer/modules/train/preprocess.py", "r") as f: + strr = f.read().replace("3.7", "3.0") + with open("lib/infer/modules/train/preprocess.py", "w") as f: + f.write(strr) + elif self.has_mps(): + logger.info("No supported Nvidia GPU found") + self.device = self.instead = "mps" + self.is_half = False + self.use_fp32_config() + else: + logger.info("No supported Nvidia GPU found") + self.device = self.instead = "cpu" + self.is_half = False + self.use_fp32_config() + + if self.n_cpu == 0: + self.n_cpu = cpu_count() + + if self.is_half: + # 6G显存配置 + x_pad = 3 + x_query = 10 + x_center = 60 + x_max = 65 + else: + # 5G显存配置 + x_pad = 1 + x_query = 6 + x_center = 38 + x_max = 41 + + if self.gpu_mem is not None and self.gpu_mem <= 4: + x_pad = 1 + x_query = 5 + x_center = 30 + x_max = 32 + if self.dml: + logger.info("Use DirectML instead") + directml_dll_path = os.path.join(python_path, "Lib", "site-packages", "onnxruntime", "capi", "DirectML.dll") + if ( + os.path.exists( + directml_dll_path + ) + == False + ): + try: + os.rename( + os.path.join(python_path, "Lib", "site-packages", "onnxruntime"), + os.path.join(python_path, "Lib", "site-packages", "onnxruntime-cuda"), + ) + except: + pass + try: + os.rename( + os.path.join(python_path, "Lib", "site-packages", "onnxruntime-dml"), + os.path.join(python_path, "Lib", "site-packages", "onnxruntime"), + ) + except: + pass + # if self.device != "cpu": + import torch_directml + + self.device = torch_directml.device(torch_directml.default_device()) + self.is_half = False + else: + if self.instead: + logger.info(f"Use {self.instead} instead") + providers_cuda_dll_path = os.path.join(python_path, "Lib", "site-packages", "onnxruntime", "capi", "onnxruntime_providers_cuda.dll") + if ( + os.path.exists( + providers_cuda_dll_path + ) + == False + ): + try: + os.rename( + os.path.join(python_path, "Lib", "site-packages", "onnxruntime"), + os.path.join(python_path, "Lib", "site-packages", "onnxruntime-dml"), + ) + except: + pass + try: + os.rename( + os.path.join(python_path, "Lib", "site-packages", "onnxruntime-cuda"), + os.path.join(python_path, "Lib", "site-packages", "onnxruntime"), + ) + except: + pass + return x_pad, x_query, x_center, x_max diff --git a/assets/configs/v1/32k.json b/assets/configs/v1/32k.json new file mode 100644 index 000000000..d5f16d691 --- /dev/null +++ b/assets/configs/v1/32k.json @@ -0,0 +1,46 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 32000, + "filter_length": 1024, + "hop_length": 320, + "win_length": 1024, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3,7,11], + "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]], + "upsample_rates": [10,4,2,2,2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16,16,4,4,4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/v1/40k.json b/assets/configs/v1/40k.json new file mode 100644 index 000000000..4ffc87b9e --- /dev/null +++ b/assets/configs/v1/40k.json @@ -0,0 +1,46 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 40000, + "filter_length": 2048, + "hop_length": 400, + "win_length": 2048, + "n_mel_channels": 125, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3,7,11], + "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]], + "upsample_rates": [10,10,2,2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16,16,4,4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/v1/48k.json b/assets/configs/v1/48k.json new file mode 100644 index 000000000..2d0e05beb --- /dev/null +++ b/assets/configs/v1/48k.json @@ -0,0 +1,46 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 11520, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 48000, + "filter_length": 2048, + "hop_length": 480, + "win_length": 2048, + "n_mel_channels": 128, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3,7,11], + "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]], + "upsample_rates": [10,6,2,2,2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [16,16,4,4,4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/v2/32k.json b/assets/configs/v2/32k.json new file mode 100644 index 000000000..70e534f4c --- /dev/null +++ b/assets/configs/v2/32k.json @@ -0,0 +1,46 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 12800, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 32000, + "filter_length": 1024, + "hop_length": 320, + "win_length": 1024, + "n_mel_channels": 80, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3,7,11], + "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]], + "upsample_rates": [10,8,2,2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [20,16,4,4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/configs/v2/48k.json b/assets/configs/v2/48k.json new file mode 100644 index 000000000..75f770cda --- /dev/null +++ b/assets/configs/v2/48k.json @@ -0,0 +1,46 @@ +{ + "train": { + "log_interval": 200, + "seed": 1234, + "epochs": 20000, + "learning_rate": 1e-4, + "betas": [0.8, 0.99], + "eps": 1e-9, + "batch_size": 4, + "fp16_run": true, + "lr_decay": 0.999875, + "segment_size": 17280, + "init_lr_ratio": 1, + "warmup_epochs": 0, + "c_mel": 45, + "c_kl": 1.0 + }, + "data": { + "max_wav_value": 32768.0, + "sampling_rate": 48000, + "filter_length": 2048, + "hop_length": 480, + "win_length": 2048, + "n_mel_channels": 128, + "mel_fmin": 0.0, + "mel_fmax": null + }, + "model": { + "inter_channels": 192, + "hidden_channels": 192, + "filter_channels": 768, + "n_heads": 2, + "n_layers": 6, + "kernel_size": 3, + "p_dropout": 0, + "resblock": "1", + "resblock_kernel_sizes": [3,7,11], + "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]], + "upsample_rates": [12,10,2,2], + "upsample_initial_channel": 512, + "upsample_kernel_sizes": [24,20,4,4], + "use_spectral_norm": false, + "gin_channels": 256, + "spk_embed_dim": 109 + } +} diff --git a/assets/hubert/.gitignore b/assets/hubert/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/assets/i18n/__pycache__/i18n.cpython-39.pyc b/assets/i18n/__pycache__/i18n.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fe1a23ccd1b1e7bccf1825d8d8130b14d45db6d GIT binary patch literal 2612 zcmai0-ER{|5Z~Q9+lO(|K!JvqwnrtZx*`{lKt(9E0)bSmDz}P75mwOkdb>_8obN8X zYao{MQl|nQs;bWjDS1Sd`Ul->pLp&YFYU~p?R-GhwRUc9XK!Y9<~OqrrlzU{M%=Z; z9}XdZ;mg5c!OJ2{)d0c?r!i?4Puiw}Zm?a8vpq^DYuw`Y4r$w85nkfu9m2~))-G|{ zBK68E&_SAg=6NASb~G3~!8TcfsS+UlWet`FH&g@qb<=~wHwbK6wYT{fV5^e$mw z(T3m9qU0`Vk;_C~zeK3{-2-};B%jzsTU+bJnzne^Xso=jhV*B8k0k68=m5W*=Ic}5 ze4v!jYCgJrEt!vlWKGS#E_oX&O>!#xrJnB0U8~dF5lNWxC|T>DUk;*Ja95{poCe&* zZ+gL+a67Qz=!`F2V@mWAL+#37Q5%D5JB~ zqcwO||B<*9;_|^ULC#HB6{Jl$X){jS7N5e5?$EX^N(DxSv|R?i!krxge1#w5RltzL zkMkNlk8uWBn$DfC!M__lo%a8%x-f3IVGN$TJq2mNfJccIG6{5)CP5ta4FgihmitZX zyXN5(DX(g@+*}E;GO})DQ7Y1(rre`fM&A;HiWgaWE)DLfV;dn0N%HfD+354w|-$D zwLog`kz3^c?6y6ycS{3nkIKb?jXNpX{Bd)U8(stOHvsgoUNL|#H6_*`z*)#j2da)tP-X6tI=pJMvi{l=#6zD2L#uSWGslysC5{wR#lk zb%T+-Hi1(&$m*rsRwC{gEyhCoILiG@ica*neez9}2JQu!Leq}#M@gi8|9yBU*SqM#M?lud zfZRW`O`npdkn;f@vLTiBfd0-lZBS1oI&ESBU4eO*aE zqRu3qGPg11NAfB^2FX>J(ggxIVX2as;=Gb7FAD%p=TQ0~N|}+grzg~^F4<;}HSU_b$MZ%S3;{^j5+OM+ms9a3OFcRSO z1$f9$3m(hJ@JHit3It!kRA?2w?w{TFcyi!E`=K6#mL{HJdxj1`b|Eovd15oA{nm=m zJ((zTF=-hjDlYnETHIA@(L<5A55yK;UXgYSBNtr}E8)rm-fnVB5cs-RnEL*M--gIohq8P(>xv&P_jp`a<`QcrHJOwMCd?r>7_BFrU_G zvtGsHB|%sCeqQzcZpwSm6#cyB`>> i18n = I18nAuto() + >>> i18n.print() + Using Language: en_US + """ + def __init__(self, language=None): + from locale import getdefaultlocale + language = language or getdefaultlocale()[0] + + # Check if a specific language variant exists, e.g., 'es_ES' + if self._language_exists(language): + self.language = language + else: + # If not, check if there is a language with the first two characters + # matching, e.g., 'es_' for 'es_ES'. + lang_prefix = language[:2] + for available_language in self._get_available_languages(): + if available_language.startswith(lang_prefix): + self.language = available_language + break + else: + # If no match found, default to 'en_US'. + self.language = 'en_US' + + self.language_map = load_language_list(self.language) + + @staticmethod + def _get_available_languages(): + from os import listdir + from os.path import isfile, join + + language_files = [f for f in listdir("./assets/i18n/langs/") if isfile(join("./assets/i18n/langs/", f))] + return [lang.replace(".json", "") for lang in language_files] + + @staticmethod + def _language_exists(language): + from os.path import exists + return exists(f"./assets/i18n/langs/{language}.json") + + def __call__(self, key): + """Returns the translation of the given key if it exists, else returns the key itself.""" + return self.language_map.get(key, key) + + def print(self): + """Prints the language currently in use.""" + print(f"Using Language: {self.language}") \ No newline at end of file diff --git a/assets/i18n/langs/ar_AR.json b/assets/i18n/langs/ar_AR.json new file mode 100644 index 000000000..c54cb50c0 --- /dev/null +++ b/assets/i18n/langs/ar_AR.json @@ -0,0 +1,247 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "لسوء الحظ، لا تتوفر وحدة معالجة رسومات متوافقة لدعم تدريبك.", + "Yes": "نعم", + "Select your dataset:": "حدد مجموعة البيانات الخاصة بك.", + "Update list": "قائمة التحديث.", + "Download Model": "تحميل الموديل", + "Download Backup": "تحميل النسخ الاحتياطي", + "Download Dataset": "تحميل مجموعة البيانات", + "Download": "تحميل", + "Url:": "عنوان URL:", + "Build the index before saving.": "قم ببناء الفهرس قبل الحفظ.", + "Save your model once the training ends.": "احفظ النموذج الخاص بك بمجرد انتهاء التدريب.", + "Save type": "حفظ النوع", + "Save model": "حفظ النموذج", + "Choose the method": "اختر الطريقة", + "Save all": "احفظ الكل", + "Save D and G": "احفظ D وG", + "Save voice": "حفظ الصوت", + "Downloading the file: ": "تنزيل الملف:", + "Stop training": "توقف عن التدريب", + "Too many users have recently viewed or downloaded this file": "لقد قام عدد كبير جدًا من المستخدمين مؤخرًا بعرض هذا الملف أو تنزيله", + "Cannot get file from this private link": "لا يمكن الحصول على الملف من هذا الرابط الخاص", + "Full download": "تحميل كامل", + "An error occurred downloading": "حدث خطأ أثناء التنزيل", + "Model saved successfully": "تم حفظ النموذج بنجاح", + "Saving the model...": "جارٍ حفظ النموذج...", + "Saved without index...": "تم الحفظ بدون فهرس...", + "model_name": "اسم النموذج", + "Saved without inference model...": "تم الحفظ بدون نموذج الاستدلال...", + "An error occurred saving the model": "حدث خطأ أثناء حفظ النموذج", + "The model you want to save does not exist, be sure to enter the correct name.": "النموذج الذي تريد حفظه غير موجود، تأكد من إدخال الاسم الصحيح.", + "The file could not be downloaded.": "لا يمكن تحميل الملف.", + "Unzip error.": "خطأ في فك الضغط.", + "Path to your added.index file (if it didn't automatically find it)": "المسار إلى ملف add.index (إذا لم يتم العثور عليه تلقائيًا)", + "It has been downloaded successfully.": "لقد تم تحميله بنجاح.", + "Proceeding with the extraction...": "المضي قدما في عملية الاستخراج...", + "The Backup has been uploaded successfully.": "تم تحميل النسخة الاحتياطية بنجاح.", + "The Dataset has been loaded successfully.": "تم تحميل مجموعة البيانات بنجاح.", + "The Model has been loaded successfully.": "تم تحميل النموذج بنجاح.", + "It is used to download your inference models.": "يتم استخدامه لتنزيل نماذج الاستدلال الخاصة بك.", + "It is used to download your training backups.": "يتم استخدامه لتنزيل النسخ الاحتياطية للتدريب.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "قم بتنزيل مجموعة البيانات مع التسجيلات الصوتية بتنسيق متوافق (.wav/.flac) لتدريب النموذج الخاص بك.", + "No relevant file was found to upload.": "لم يتم العثور على ملف ذي صلة للتحميل.", + "The model works for inference, and has the .index file.": "يعمل النموذج من أجل الاستدلال، ويحتوي على ملف .index.", + "The model works for inference, but it doesn't have the .index file.": "يعمل النموذج من أجل الاستدلال، لكنه لا يحتوي على ملف .index.", + "This may take a few minutes, please wait...": "قد يستغرق ذلك بضع دقائق، يرجى الانتظار...", + "Resources": "موارد", + "Step 1: Processing data": "الخطوة 1: معالجة البيانات", + "Step 2: Skipping pitch extraction": "الخطوة 2 أ: تخطي استخراج الملعب", + "Step 3: Extracting features": "الخطوة 2 ب: استخراج الميزات", + "Step 4: Model training started": "الخطوة 3 أ: بدأ التدريب النموذجي", + "Step 5: Export lowest points on a graph of the model": "الخطوة 4: تصدير أدنى النقاط على الرسم البياني للنموذج", + "Training is done, check train.log": "تم الانتهاء من التدريب، قم بزيارة Train.log", + "All processes have been completed!": "تم الانتهاء من جميع العمليات!", + "Model Inference": "الاستدلال النموذجي", + "Inferencing voice:": "الاستدلال الصوتي:", + "Model_Name": "اسم النموذج", + "Dataset_Name": "اسم مجموعة البيانات", + "Whether the model has pitch guidance.": "ما إذا كان النموذج يحتوي على توجيهات في الملعب.", + "Whether to save only the latest .ckpt file to save hard drive space": "ما إذا كان سيتم حفظ أحدث ملف .ckpt فقط لتوفير مساحة على القرص الصلب", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "قم بتخزين جميع مجموعات التدريب مؤقتًا في ذاكرة GPU. يمكن أن يؤدي تخزين مجموعات البيانات الصغيرة مؤقتًا (أقل من 10 دقائق) إلى تسريع عملية التدريب", + "Save a small final model to the 'weights' folder at each save point": "احفظ نموذجًا نهائيًا صغيرًا في مجلد \"الأوزان\" عند كل نقطة حفظ", + "Refresh": "تحديث قائمة الصوت ومسار الفهرس والملفات الصوتية", + "Unload voice to save GPU memory": "قم بإلغاء تحميل الصوت لحفظ ذاكرة GPU:", + "Select Speaker/Singer ID:": "حدد معرف المتحدث/المغني:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "يوصى باستخدام مفتاح +12 للتحويل من ذكر إلى أنثى، ومفتاح -12 للتحويل من أنثى إلى ذكر. إذا تجاوز نطاق الصوت كثيرًا وكان الصوت مشوهًا، فيمكنك أيضًا ضبطه على النطاق المناسب بنفسك.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "تبديل الموضع (عدد صحيح، عدد نصف النغمات، رفع بمقدار أوكتاف: 12، خفض بمقدار أوكتاف: -12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "أدخل مسار الملف الصوتي المراد معالجته (الافتراضي هو مثال التنسيق الصحيح):", + "Select the pitch extraction algorithm:": "حدد خوارزمية استخراج الملعب:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "طول قفزة المانجيو-كريب (ينطبق فقط على كريب المانجيو): يشير طول القفزة إلى الوقت الذي يستغرقه المتحدث للانتقال إلى طبقة الصوت الدرامية. يستغرق استنتاج أطوال القفزات المنخفضة وقتًا أطول ولكنها أكثر دقة في درجة الصوت.", + "Feature search dataset file path": "مسار ملف مجموعة بيانات البحث عن المعالم", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "إذا كان > = 3: قم بتطبيق التصفية المتوسطة على نتائج العرض التقديمي المحصودة. تمثل القيمة نصف قطر المرشح ويمكن أن تقلل من التنفس.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "المسار إلى ملف فهرس الميزات. اتركه فارغًا لاستخدام النتيجة المحددة من القائمة المنسدلة:", + "Auto-detect index path and select from the dropdown:": "الكشف التلقائي عن مسار الفهرس والاختيار من القائمة المنسدلة", + "Path to feature file:": "المسار إلى ملف الميزة:", + "Search feature ratio:": "نسبة ميزة البحث:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "قم بإعادة تشكيل الصوت الناتج في مرحلة ما بعد المعالجة إلى معدل العينة النهائي. اضبط على 0 لعدم إعادة التشكيل:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "استخدم مظروف حجم الإدخال لاستبدال أو مزج مظروف حجم الإخراج. كلما اقتربت النسبة من 1، زاد استخدام مظروف الإخراج:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "قم بحماية الحروف الساكنة وأصوات التنفس التي لا صوت لها لمنع المؤثرات مثل تمزيق الموسيقى الإلكترونية. اضبط على 0.5 للتعطيل. قم بتقليل القيمة لزيادة الحماية، ولكنه قد يقلل من دقة الفهرسة:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "ملف منحنى F0 (اختياري). خطوة واحدة لكل سطر. يستبدل الإعداد الافتراضي F0 وتعديل درجة الصوت:", + "Convert": "يتحول", + "Output information:": "معلومات الإخراج", + "Export audio (click on the three dots in the lower right corner to download)": "تصدير الصوت (انقر على النقاط الثلاث في الزاوية اليمنى السفلية للتنزيل)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "تحويل دفعة. أدخل المجلد الذي يحتوي على الملفات الصوتية المراد تحويلها أو قم بتحميل ملفات صوتية متعددة. سيتم إخراج الصوت المحول في المجلد المحدد (الافتراضي: \"اختياري\").", + "Specify output folder:": "تحديد مجلد الإخراج:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "أدخل مسار مجلد الصوت المراد معالجته (انسخه من شريط العناوين الخاص بمدير الملفات):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "يمكنك أيضًا إدخال الملفات الصوتية على دفعات. اختر أحد الخيارين. تعطى الأولوية للقراءة من المجلد.", + "Export file format": "تصدير تنسيق الملف", + "UVR5": "الأشعة فوق البنفسجية5", + "Enter the path of the audio folder to be processed:": "أدخل مسار مجلد الصوت المراد معالجته:", + "Model": "نموذج", + "Vocal Extraction Aggressive": "استخراج الصوتية العدوانية", + "Specify the output folder for vocals:": "حدد مجلد الإخراج للغناء:", + "Specify the output folder for accompaniment:": "حدد مجلد الإخراج للمرافقة:", + "Train": "يدرب", + "Enter the model name:": "أدخل اسم النموذج:", + "Target sample rate:": "معدل العينة المستهدف:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "ما إذا كان النموذج يحتوي على إرشادات لطبقة الصوت (مطلوبة للغناء، واختيارية للكلام):", + "Version": "إصدار", + "Number of CPU processes:": "عدد عمليات وحدة المعالجة المركزية المستخدمة لاستخراج الملعب ومعالجة البيانات:", + "Enter the path of the training folder:": "أدخل مسار مجلد التدريب:", + "Specify the model ID:": "يرجى تحديد معرف النموذج:", + "Auto detect audio path and select from the dropdown:": "الكشف التلقائي عن مسار الصوت والاختيار من القائمة المنسدلة:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "أضف اسم الصوت إلى المسار إلى الملف الصوتي المراد معالجته (الافتراضي هو مثال التنسيق الصحيح) قم بإزالة المسار لاستخدام الصوت من القائمة المنسدلة:", + "Advanced Settings": "إعدادات متقدمة", + "Settings": "إعدادات", + "Status:": "حالة", + "Process data": "معالجة البيانات", + "Drag your audio here:": "اسحب الصوت الخاص بك هنا واضغط على زر التحديث", + "Or record an audio:": "أو تسجيل الصوت.", + "Formant shift inference audio": "تحويل صيغة الاستدلال الصوتي", + "Used for male to female and vice-versa conversions": "يستخدم للتحويل من ذكر إلى أنثى والعكس", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "يرجى تقديم فهرس (فهارس) وحدة معالجة الرسومات مفصولة بـ \"-\"، مثل 0-1-2 لاستخدام وحدات معالجة الرسومات 0 و1 و2:", + "GPU Information:": "معلومات وحدة معالجة الرسومات", + "Feature extraction": "ميزة استخراج", + "Save frequency:": "حفظ التردد:", + "Training epochs:": "فترات التدريب:", + "Batch size per GPU:": "حجم الدفعة لكل GPU:", + "Save only the latest '.ckpt' file to save disk space:": "احفظ فقط أحدث ملف '.ckpt' لتوفير مساحة على القرص:", + "No": "لا", + "Save a small final model to the 'weights' folder at each save point:": "احفظ نموذجًا نهائيًا صغيرًا في مجلد \"الأوزان\" عند كل نقطة حفظ:", + "Load pre-trained base model G path:": "تحميل مسار G للنموذج الأساسي المُدرب مسبقًا:", + "Load pre-trained base model D path:": "تحميل المسار D للنموذج الأساسي المُدرب مسبقًا:", + "Train model": "نموذج القطار", + "Train feature index": "مؤشر ميزة القطار", + "One-click training": "التدريب بنقرة واحدة", + "Processing": "يعالج", + "Model fusion, can be used to test timbre fusion": "يمكن استخدام نموذج الاندماج لاختبار دمج الجرس", + "Path to Model A:": "المسار إلى النموذج أ:", + "Path to Model B:": "المسار إلى النموذج ب:", + "Weight for Model A:": "الوزن للنموذج أ:", + "Whether the model has pitch guidance:": "ما إذا كان النموذج يحتوي على توجيه الملعب:", + "Model information to be placed:": "معلومات النموذج المراد وضعها:", + "Model architecture version:": "نسخة البنية النموذجية:", + "Fusion": "انصهار", + "Modify model information": "تعديل معلومات النموذج", + "Path to Model:": "المسار إلى النموذج:", + "Model information to be modified:": "معلومات النموذج المراد تعديلها:", + "Save file name:": "حفظ اسم الملف:", + "Modify": "يُعدِّل", + "View model information": "عرض معلومات النموذج", + "View": "منظر", + "Model extraction": "استخراج النموذج (أدخل مسار نموذج الملف الكبير ضمن مجلد \"السجلات\"). يعد هذا مفيدًا إذا كنت تريد إيقاف التدريب في منتصف الطريق واستخراج ملف نموذج صغير وحفظه يدويًا، أو إذا كنت تريد اختبار نموذج متوسط:", + "Name:": "حفظ الاسم:", + "Whether the model has pitch guidance (1: yes, 0: no):": "ما إذا كان النموذج يحتوي على توجيه درجة الصوت (1: نعم، 0: لا):", + "Extract": "يستخرج", + "Export Onnx": "تصدير اونكس", + "RVC Model Path:": "مسار نموذج RVC:", + "Onnx Export Path:": "مسار تصدير Onnx:", + "MoeVS Model": "نموذج MoVS", + "Export Onnx Model": "تصدير نموذج Onnx", + "Load model": "نموذج التحميل", + "Hubert Model": "نموذج هيوبرت", + "Select the .pth file": "حدد ملف .pth", + "Select the .index file": "حدد ملف الفهرس", + "Select the .npy file": "حدد ملف .npy", + "Input device": "جهاز الإدخال", + "Output device": "جهاز إخراج", + "Audio device (please use the same type of driver)": "جهاز الصوت (يرجى استخدام نفس نوع برنامج التشغيل)", + "Response threshold": "عتبة الاستجابة", + "Pitch settings": "إعدادات الملعب", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "ما إذا كان سيتم استخدام أسماء الملاحظات بدلاً من قيمتها بالهيرتز. على سبيل المثال. [C5، D6] بدلاً من [523.25، 1174.66] هرتز", + "Index Rate": "معدل المؤشر", + "General settings": "الاعدادات العامة", + "Sample length": "طول العينة", + "Fade length": "طول التلاشي", + "Extra inference time": "وقت الاستدلال الإضافي", + "Input noise reduction": "تقليل ضوضاء الإدخال", + "Output noise reduction": "الحد من الضوضاء الناتج", + "Performance settings": "إعدادات الأداء", + "Start audio conversion": "ابدأ تحويل الصوت", + "Stop audio conversion": "إيقاف تحويل الصوت", + "Inference time (ms):": "وقت الاستدلال (مللي ثانية):", + "Select the pth file": "حدد ملف pth", + "Select the .index file:": "حدد ملف الفهرس", + "The hubert model path must not contain Chinese characters": "يجب ألا يحتوي مسار نموذج Hubert على أحرف صينية", + "The pth file path must not contain Chinese characters.": "يجب ألا يحتوي مسار الملف pth على أحرف صينية.", + "The index file path must not contain Chinese characters.": "يجب ألا يحتوي مسار ملف الفهرس على أحرف صينية.", + "Step algorithm": "خوارزمية الخطوة", + "Number of epoch processes": "عدد عمليات العصر", + "Lowest points export": "أدنى نقاط التصدير", + "How many lowest points to save:": "كم عدد أدنى النقاط للحفظ", + "Export lowest points of a model": "تصدير أدنى نقاط النموذج", + "Output models:": "نماذج الإخراج", + "Stats of selected models:": "إحصائيات النماذج المختارة", + "Custom f0 [Root pitch] File": "ملف f0 مخصص [درجة الجذر]", + "Min pitch:": "الملعب دقيقة", + "Specify minimal pitch for inference [HZ]": "تحديد الحد الأدنى من درجة الاستدلال [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "تحديد الحد الأدنى من درجة الصوت للاستدلال [ملاحظة] [أوكتاف]", + "Max pitch:": "ماكس الملعب", + "Specify max pitch for inference [HZ]": "تحديد أقصى درجة للاستدلال [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "تحديد أقصى درجة للاستدلال [ملاحظة] [أوكتاف]", + "Browse presets for formanting": "تصفح الإعدادات المسبقة للتشكيل", + "Presets are located in formantshiftcfg/ folder": "توجد الإعدادات المسبقة في المجلدformantshiftcfg/", + "Default value is 1.0": "القيمة الافتراضية هي 1.0", + "Quefrency for formant shifting": "التردد لتحويل الصياغة", + "Timbre for formant shifting": "Timbre لتحويل الصياغة", + "Apply": "يتقدم", + "Single": "أعزب", + "Batch": "حزمة", + "Separate YouTube tracks": "مسارات يوتيوب منفصلة", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "قم بتنزيل الصوت من مقطع فيديو على YouTube وفصل المسارات الصوتية والمسارات الآلية تلقائيًا", + "Extra": "إضافي", + "Merge": "دمج", + "Merge your generated audios with the instrumental": "دمج الصوتيات التي تم إنشاؤها مع الآلات الموسيقية", + "Choose your instrumental:": "اختر آلتك الموسيقية", + "Choose the generated audio:": "اختر الصوت الذي تم إنشاؤه", + "Combine": "يجمع", + "Download and Separate": "تحميل وفصل", + "Enter the YouTube link:": "أدخل رابط اليوتيوب", + "This section contains some extra utilities that often may be in experimental phases": "يحتوي هذا القسم على بعض الأدوات المساعدة الإضافية التي غالبًا ما تكون في مراحل تجريبية", + "Merge Audios": "دمج صوتيات", + "Audio files have been moved to the 'audios' folder.": "تم نقل الملفات الصوتية إلى مجلد \"التسجيلات الصوتية\".", + "Downloading audio from the video...": "تحميل الصوت من الفيديو...", + "Audio downloaded!": "تحميل الصوت!", + "An error occurred:": "حدث خطأ:", + "Separating audio...": "فصل الصوت...", + "File moved successfully.": "تم نقل الملف بنجاح.", + "Finished!": "انتهى!", + "The source file does not exist.": "الملف المصدر غير موجود.", + "Error moving the file:": "خطأ في نقل الملف:", + "Downloading {name} from drive": "تنزيل {name} من محرك الأقراص", + "The attempt to download using Drive didn't work": "لم تنجح محاولة التنزيل باستخدام Drive", + "Error downloading the file: {str(e)}": "حدث خطأ أثناء تنزيل الملف: {str(e)}", + "Downloading {name} from mega": "تنزيل {name} من ميجا", + "Downloading {name} from basic url": "تنزيل {name} من عنوان url الأساسي", + "Download Audio": "تحميل الصوت", + "Download audios of any format for use in inference (recommended for mobile users).": "تنزيل صوتيات بأي تنسيق لاستخدامها في الاستدلال (موصى به لمستخدمي الأجهزة المحمولة)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "تعتبر أي أخطاء في ConnectionResetErrors بعد التحويل غير ذات صلة ومرئية بحتة؛ يمكن تجاهلها.", + "Processed audio saved at: ": "تم حفظ الصوت المعالج في:", + "Conversion complete!": "اكتمل التحويل!", + "Reverb": "تردد", + "Compressor": "ضاغط", + "Noise Gate": "بوابة الضجيج", + "Volume": "مقدار", + "Drag the audio here and click the Refresh button": "اسحب الصوت هنا وانقر على زر التحديث", + "Select the generated audio": "حدد الصوت الذي تم إنشاؤه", + "Volume of the instrumental audio:": "حجم الصوت الآلي", + "Volume of the generated audio:": "حجم الصوت الذي تم إنشاؤه", + "### Add the effects": "### أضف التأثيرات", + "Starting audio conversion... (This might take a moment)": "بدء تحويل الصوت... (قد يستغرق ذلك بعض الوقت)", + "TTS Model:": "أصوات TTS", + "TTS": "TTS", + "TTS Method:": "طريقة TTS", + "Audio TTS:": "صوت TTS", + "Audio RVC:": "نموذج صوتي" +} diff --git a/assets/i18n/langs/de_DE.json b/assets/i18n/langs/de_DE.json new file mode 100644 index 000000000..b83c2de56 --- /dev/null +++ b/assets/i18n/langs/de_DE.json @@ -0,0 +1,252 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Leider steht keine kompatible GPU zur Unterstützung Ihres Trainings zur Verfügung.", + "Yes": "Ja", + "Select your dataset:": "Wählen Sie Ihren Datensatz:", + "Update list": "Liste aktualisieren", + "Download Model": "Modell herunterladen", + "Download Backup": "Backup herunterladen", + "Download Dataset": "Datensatz herunterladen", + "Download": "Download", + "Url:": "Url:", + "Build the index before saving.": "Erstellen Sie den Index vor dem Speichern.", + "Save your model once the training ends.": "Speichern Sie Ihr Modell, sobald das Training beendet ist.", + "Save type": "Speicherart", + "Save model": "Modell speichern", + "Choose the method": "Wählen Sie die Methode", + "Save all": "Speicher alle", + "Save D and G": "D. und G.", + "Save voice": "Stimme speichern", + "Downloading the file: ": "Datei Downloaden:", + "Stop training": "Beenden Sie das Training", + "Too many users have recently viewed or downloaded this file": "Zu viele Benutzer haben diese Datei kürzlich angesehen oder heruntergeladen", + "Cannot get file from this private link": "Datei kann nicht von diesem privaten Link abgerufen werden", + "Full download": "Vollständiger Download", + "An error occurred downloading": "Beim Herunterladen der Datei ist ein Fehler aufgetreten. ", + "Model saved successfully": "Modell erfolgreich gespeichert", + "Saving the model...": "Modell wird gespeichert...", + "Saved without index...": "Ohne Index gespeichert...", + "Saved without inference model...": "Ohne Inferenzmodell gespeichert...", + "An error occurred saving the model": "Beim Speichern des Modells ist ein Fehler aufgetreten", + "The model you want to save does not exist, be sure to enter the correct name.": "Das Modell, das Sie speichern möchten, existiert nicht, geben Sie den richtigen Namen ein.", + "The file could not be downloaded.": "Die Datei konnte nicht heruntergeladen werden", + "Unzip error.": "Unzip-Fehler.", + "Path to your added.index file (if it didn't automatically find it)": "Pfad zu Ihrer Datei added.index (falls diese nicht automatisch gefunden wurde)", + "It has been downloaded successfully.": "wurde erfolgreich heruntergeladen.", + "Proceeding with the extraction...": "Fahren Sie mit der Extraktion fort...", + "The Backup has been uploaded successfully.": "Das Backup wurde erfolgreich hochgeladen.", + "The Dataset has been loaded successfully.": "Der Datensatz wurde erfolgreich geladen.", + "The Model has been loaded successfully.": "Das Modell wurde erfolgreich geladen.", + "It is used to download your inference models.": "Es wird verwendet, um Ihre Inferenzmodelle herunterzuladen.", + "It is used to download your training backups.": "Es wird verwendet, um Ihre Trainings-Backups herunterzuladen.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Laden Sie den Datensatz mit den Audios in einem kompatiblen Format (.wav/.flac) herunter, um Ihr Modell zu trainieren.", + "No relevant file was found to upload.": "Keine relevante Datei zum Hochladen gefunden.", + "The model works for inference, and has the .index file.": "Das Modell funktioniert für Inferenz und hat eine .index Datei.", + "The model works for inference, but it doesn't have the .index file.": "Das Modell funktioniert für Inferenz, hat jedoch keine .index Datei.", + "This may take a few minutes, please wait...": "Es kann einige Minuten dauern, bitte warten.", + "Resources": "Ressourcen", + "Step 1: Processing data": "Schritt 1: Datenverarbeitung", + "Step 2: Skipping pitch extraction": "Schritt 2: Pitch-Extraktion", + "Step 3: Extracting features": "Schritt 3: Merkmale extrahieren", + "Step 4: Model training started": "Schritt 4: Modelltraining gestartet", + "Step 5: Export lowest points on a graph of the model": "Schritt 5: Exportieren Sie die niedrigsten Punkte in einem Diagramm des Modells", + "Training is done, check train.log": "Training ist abgeschlossen, überprüfen Sie train.log", + "All processes have been completed!": "Alle Prozesse sind abgeschlossen!", + "Model Inference": "Modell Inferenz", + "Inferencing voice:": "Inferenz Stimme:", + "Model_Name": "Model Name", + "Dataset_Name": "Name des Datensatzes", + "Whether the model has pitch guidance.": "Ob das Modell eine Tonhöhenführung hat.", + "Whether to save only the latest .ckpt file to save hard drive space": "Gibt an, ob nur die neueste .ckpt-Datei gespeichert werden soll, um Speicherplatz auf der Festplatte zu sparen", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Alle Trainings-Sets im GPU-Speicher zwischenspeichern. Das Zwischenspeichern kleiner Datensätze (weniger als 10 Minuten) kann das Training beschleunigen", + "Save a small final model to the 'weights' folder at each save point": "Speichern Sie an jedem Speicherpunkt ein kleines endgültiges Modell im Ordner \"Weights\"", + "Refresh": "Stimmenliste, Indexpfad und Audiodateien aktualisieren", + "Unload voice to save GPU memory": "Stimme entladen, um GPU-Speicher zu sparen", + "Select Speaker/Singer ID:": "Lautsprecher-/Sänger-ID auswählen:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Empfohlen wird +12-Taste für die Umwandlung von Mann zu Frau und -12-Taste für die Umwandlung von Frau zu Mann. Wenn der Klangbereich zu weit geht und die Stimme verzerrt ist, können Sie ihn auch selbst auf den entsprechenden Bereich einstellen.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Transponieren (Ganzzahl, Anzahl der Halbtöne, um eine Oktave erhöhen: 12, um eine Oktave senken: -12):", + "Feature search database file path:": "Dateipfad der Funktionssuchdatenbank:", + "Enter the path of the audio file to be processed (default is the correct format example):": "Geben Sie den Pfad der zu verarbeitenden Audiodatei ein (Standard ist das richtige Formatbeispiel):", + "Select the pitch extraction algorithm:": "Wählen Sie den Pitch-Extraktionsalgorithmus:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Mangio-Crepe Hopfenlänge (Gilt nur für Mangio-Crepe): Die Hopfenlänge bezieht sich auf die Zeit, die der Sprecher benötigt, um zu einer dramatischen Tonhöhe zu springen. Niedrigere Hopfenlängen benötigen mehr Zeit zur Inferenz, sind aber genauer.", + "Feature search dataset file path": "Dateipfad für Feature-Suche-Datensatz", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Wenn >=3: Wendet es die Medianfilterung auf die geernteten Pitch-Ergebnisse an. Der Wert stellt den Filterradius dar und kann die Atmungsaktivität reduzieren.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Pfad zur Feature-Indexdatei. Leer lassen, um das ausgewählte Ergebnis aus der Dropdown-Liste zu verwenden:", + "Auto-detect index path and select from the dropdown:": "Indexpfad automatisch erkennen und aus dem Dropdown-Menü auswählen:", + "Path to feature file:": "Pfad zur Feature-Datei:", + "Search feature ratio:": "Verhältnis der Suchfunktionen:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Sample das ausgegebene Audio in der Nachbearbeitung auf die endgültige Samplerate zurück. Für kein Resampling auf 0 setzen:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Verwende die Volumenhüllkurve der Eingabe, um die Volumenhüllkurve der Ausgabe zu ersetzen oder mit ihr zu mischen. Je näher das Verhältnis bei 1 liegt, desto mehr wird die Ausgabehüllkurve verwendet:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Schütze stimmlose Konsonanten und Atemgeräusche, um Artefakte wie das Reißen in elektronischer Musik zu verhindern. Zum Deaktivieren auf 0,5 setzen. Verringern Sie den Wert, um den Schutz zu erhöhen, aber es kann die Indexierungsgenauigkeit verringern:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "F0-Kurvendatei (optional). Eine Tonhöhe pro Linie. Ersetzt die voreingestellte F0- und Tonhöhenmodulation:", + "Convert": "Konvertieren", + "Output information:": "Ausgangs informationen", + "Export audio (click on the three dots in the lower right corner to download)": "Audio exportieren (klicken Sie auf die drei Punkte in der unteren rechten Ecke, um sie herunterzuladen)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Stapelkonvertierung. Geben Sie den Ordner mit den zu konvertierenden Audiodateien ein oder laden Sie mehrere Audiodateien hoch. Das konvertierte Audio wird im angegebenen Ordner ausgegeben (Standard: 'opt').", + "Specify output folder:": "Ausgabeordner festlegen:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Geben Sie den Pfad des zu verarbeitenden Audioordners ein (kopieren Sie ihn aus der Adressleiste des Dateimanagers):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Sie können Audiodateien auch stapelweise eingeben. Wählen Sie eine der beiden Optionen. Das Lesen aus dem Ordner hat Vorrang.", + "Export file format:": "Export Dateiformat", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Geben Sie den Pfad des zu verarbeitenden Audioordners ein:", + "Model:": "Modell:", + "Vocal Extraction Aggressive": "Vokale Extraktion aggressiv", + "Specify the output folder for vocals:": "Geben Sie den Ausgabeordner für Vocals an:", + "Specify the output folder for accompaniment:": "Geben Sie den Ausgabeordner für die Begleitung an:", + "Train": "Trainieren", + "Enter the model name:": "Modellname eingeben", + "Target sample rate:": "Sample Rate Ziel:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Ob das Modell eine Tonhöhenführung hat (erforderlich für Gesang, optional für Sprache):", + "Version:": "Version:", + "Number of CPU processes:": "Anzahl der Prozesse,", + "Enter the path of the training folder:": "Geben Sie den Pfad des Trainingsordners ein:", + "Specify the model ID:": "Geben Sie die Modell-ID an:", + "Auto detect audio path and select from the dropdown:": "Audiopfad automatisch erkennen und aus der Dropdown-Liste auswählen:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Fügen Sie dem Pfad zur zu verarbeitenden Audiodatei den Namen des Audios hinzu (Standard ist das richtige Formatbeispiel) Entfernen Sie den Pfad zur Verwendung eines Audios aus der Dropdown-Liste:", + "Advanced Settings": "Erweiterte Einstellungen", + "Settings": "Einstellungen", + "Status:": "Status:", + "Process data": "Betriebsdaten", + "Drag your audio here:": "Ziehen Sie Ihr Audio hierher:", + "Or record an audio:": "Oder nehmen Sie ein Audio auf:", + "Formant shift inference audio": "Formant Shift Inferenz-Audio", + "Used for male to female and vice-versa conversions": "Wird für Konvertierungen von Männern zu Frauen und umgekehrt verwendet", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Geben Sie den/die GPU-Index (e) getrennt durch '-' an, wie 0-1-2 für die Verwendung von GPUs 0, 1 und 2:", + "GPU Information:": "GPU-Informationen:", + "Feature extraction": "Merkmalsextraktion", + "Save frequency:": "Speicher-Häufigkeit", + "Training epochs:": "Trainingsepochen:", + "Batch size per GPU:": "Batch-Size pro GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Speicher nur die neueste '.ckpt' -Datei, um Speicherplatz zu sparen:", + "No": "Nein", + "Save a small final model to the 'weights' folder at each save point:": "Speicher an jedem Speicherpunkt ein kleines endgültiges Modell im Ordner \"Gewichte\":", + "Load pre-trained base model G path:": "Vortrainiertes Basismodell G Pfad:", + "Load pre-trained base model D path:": "Vorgeschultes Basismodell D Pfad:", + "Train model": "Modell trainieren", + "Train feature index": "Trainiere-Feature-Index", + "One-click training": "Ein-Klick-Training", + "Processing": "Es wird bearbeitet", + "Model fusion, can be used to test timbre fusion": "Modellfusion, kann zum Testen der Timbrefusion verwendet werden", + "Path to Model A:": "Pfad zu Modell A:", + "Path to Model B:": "Pfad zu Modell B:", + "Weight for Model A:": "Gewicht für Modell A:", + "Whether the model has pitch guidance:": "Ob das Modell eine Tonhöhenführung hat:", + "Model information to be placed:": "Zu platzierende Modellinformationen:", + "Model architecture version:": "Modellarchitekturversion:", + "Fusion": "Fusion", + "Modify model information": "Modellinformationen ändern", + "Path to Model:": "Pfad zum Modell:", + "Model information to be modified:": "Zu ändernde Modellinformationen:", + "Save file name:": "Dateiname zu speichern:", + "Modify": "Modifizieren", + "View model information": "Modellinformationen", + "View": "Ansehen", + "Model extraction": "Modellextraktion", + "Name:": "Name:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Ob das Modell eine Pitchführung hat (1: ja, 0: nein):", + "Extract": "Extrahieren", + "Export Onnx": "Onnx exportieren", + "RVC Model Path:": "RVC-Modellpfad:", + "Onnx Export Path:": "ONNX-Exportpfad:", + "MoeVS Model": "MoeVS-Modell", + "Export Onnx Model": "Onnx-Modell exportieren", + "Load model": "Lastmodell", + "Hubert Model": "Hubert-Modell", + "Select the .pth file": "Wählen Sie die Datei aus. ", + "Select the .index file": "Wählen Sie die .index-Datei", + "Select the .npy file": "Wählen Sie die Datei aus. ", + "Input device": "Eingabegerät", + "Output device": "Ausgabegerät", + "Audio device (please use the same type of driver)": "Audiogerät (bitte verwenden Sie den gleichen Treibertyp)", + "Response threshold": "Ansprechschwelle", + "Pitch settings": "Tonhöheneinstellungen", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Gibt an, ob Notiznamen anstelle ihres Hertz-Wertes verwendet werden sollen. Z.B. [C5, D6] statt [523.25, 1174.66]Hz", + "Index Rate": "Indexsatz", + "General settings": "Allgemeine Einstellungen", + "Sample length": "Probenlänge:", + "Fade length": "Ausblendlänge", + "Extra inference time": "Zusätzliche Inferenzzeit", + "Input noise reduction": "Eingangsgeräuschreduzierung", + "Output noise reduction": "Ausgangsgeräuschreduzierung", + "Performance settings": "Leistungseinstellungen", + "Start audio conversion": "Audiokonvertierung starten", + "Stop audio conversion": "Audiokonvertierung stoppen", + "Inference time (ms):": "Inferenzzeit (ms):", + "Select the pth file": "Wähle die Datei aus...", + "Select the .index file:": "Wählen Sie die Indexdatei aus", + "The hubert model path must not contain Chinese characters": "Der Hubert-Modellpfad darf keine chinesischen Schriftzeichen enthalten", + "The pth file path must not contain Chinese characters.": "Der pth-Dateipfad darf keine chinesischen Zeichen enthalten.", + "The index file path must not contain Chinese characters.": "Der Indexdateipfad darf keine chinesischen Zeichen enthalten.", + "Step algorithm": "Schritt-Algorithmus", + "Number of epoch processes": "Anzahl der Epochenprozesse", + "Lowest points export": "Export der niedrigsten Punkte", + "How many lowest points to save:": "Wie viele niedrigste Punkte zu sparen sind:", + "Export lowest points of a model": "Niedrigste Punkte eines Modells exportieren", + "Output models:": "Ausgabemodelle:", + "Stats of selected models:": "Statistiken ausgewählter Modelle:", + "Custom f0 [Root pitch] File": "Benutzerdefinierte f0 [Root Pitch] -Datei", + "Min pitch:": "Min. Tonhöhe:", + "Specify minimal pitch for inference [HZ]": "Minimale Tonhöhe für Inferenz angeben [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Geben Sie die minimale Tonhöhe für die Inferenz an [HINWEIS][OKTAVE]", + "Max pitch:": "Max. Tonhöhe ", + "Specify max pitch for inference [HZ]": "Max. Tonhöhe für Inferenz angeben [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Maximale Tonhöhe für Inferenz angeben [HINWEIS][OKTAVE]", + "Browse presets for formanting": "Voreinstellungen für Formanting durchsuchen", + "Presets are located in formantshiftcfg/ folder": "Voreinstellungen befinden sich in formantshiftcfg/ Ordner", + "Default value is 1.0": "Standardwert ist 1", + "Quefrency for formant shifting": "Quefrency für Formant-Verschiebung", + "Timbre for formant shifting": "Timbre für Formantverschiebung", + "Apply": "Übernehmen", + "Single": "Einzel", + "Batch": "Batch", + "Separate YouTube tracks": "Separate YouTube-Tracks", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Laden Sie Audio von einem YouTube-Video herunter und trennen Sie automatisch die Gesangs- und Instrumentalspuren", + "Extra": "Extra", + "Merge": "Zusammenführen", + "Merge your generated audios with the instrumental": "Fügen Sie Ihre generierten Audios mit dem Instrumental", + "Choose your instrumental:": "Wählen Sie Ihr Instrumental:", + "Choose the generated audio:": "Wählen Sie das erzeugte Audio:", + "Combine": "Kombinieren", + "Download and Separate": "Herunterladen und trennen", + "Enter the YouTube link:": "Youtube Link eingeben:", + "This section contains some extra utilities that often may be in experimental phases": "Dieser Abschnitt enthält einige zusätzliche Dienstprogramme, die sich oft in experimentellen Phasen befinden", + "Merge Audios": "Audios zusammenführen", + "Audio files have been moved to the 'audios' folder.": "Audiodateien wurden in den Ordner 'audios' verschoben.", + "Downloading audio from the video...": "Audio aus dem Video wird heruntergeladen...", + "Audio downloaded!": "Audio heruntergeladen!", + "An error occurred:": "Ein Fehler ist aufgetreten:", + "Separating audio...": "Audio wird getrennt...", + "File moved successfully.": "Datei erfolgreich verschoben.", + "Finished!": "Abgeschlossen!", + "The source file does not exist.": "Die Quelldatei ist nicht vorhanden!", + "Error moving the file:": "Fehler beim Verschieben der Datei:", + "Downloading {name} from drive": "{name} wird vom Drive heruntergeladen", + "The attempt to download using Drive didn't work": "Der Versuch, mit Drive herunterzuladen, hat nicht funktioniert", + "Error downloading the file: {str(e)}": "Fehler beim Herunterladen der Datei: {str(e)}", + "Downloading {name} from mega": "{name} wird von Mega heruntergeladen", + "Downloading {name} from basic url": "{name} wird von der Basis-URL heruntergeladen", + "Download Audio": "Audio herunterladen", + "Download audios of any format for use in inference (recommended for mobile users).": "Laden Sie Audios in jedem Format zur Verwendung in Inferenz herunter (empfohlen für mobile Benutzer).", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Alle ConnectionResetErrors nach der Konvertierung sind irrelevant und rein visuell; sie können ignoriert werden.", + "Processed audio saved at: ": "Verarbeitete Audiodaten gespeichert unter:", + "Conversion complete!": "Konvertierung abgeschlossen", + "Reverb": "Nachhall", + "Compressor": "Kompressor", + "Noise Gate": "Noise-Gate", + "Volume": "Lautstärke", + "Drag the audio here and click the Refresh button": "Ziehen Sie das Audio hierher und klicken Sie auf den Aktuallisierungs Knopf", + "Select the generated audio": "Wählen Sie das erzeugte Audio", + "Volume of the instrumental audio:": "Lautstärke des Instrumental-Audios:", + "Volume of the generated audio:": "Lautstärke des erzeugten Audios:", + "### Audio settings:": "### Audio-Einstellungen", + "### Instrumental settings:": "### Instrumentale Einstellungen:", + "### Add the effects:": "### Fügen Sie die Effekte hinzu:", + "Name for saving": "Name zum Speichern", + "Path to model": "Pfad zum Modell", + "Model information to be placed": "Zu platzierende Modellinformationen", + "Starting audio conversion... (This might take a moment)": "Starte Audio-Konvertierung... (Das kann einen Moment dauern)", + "TTS Model:": "TTS-Stimmen", + "TTS": "TTS", + "TTS Method:": "TTS-Methode", + "Audio TTS:": "Audio-TTS", + "Audio RVC:": "Audio-Modell" +} diff --git a/assets/i18n/langs/en_US.json b/assets/i18n/langs/en_US.json new file mode 100644 index 000000000..239004dd9 --- /dev/null +++ b/assets/i18n/langs/en_US.json @@ -0,0 +1,260 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Unfortunately, there is no compatible GPU available to support your training.", + "Yes": "Yes", + "Select your dataset:": "Select your dataset:", + "Update list": "Update list", + "Download Model": "Download Model", + "Download Backup": "Download Backup", + "Download Dataset": "Download Dataset", + "Download": "Download", + "Url:": "Url:", + "Build the index before saving.": "Build the index before saving.", + "Save your model once the training ends.": "Save your model once the training ends.", + "Save type": "Save type:", + "Save model": "Save model", + "Choose the method": "Choose the method", + "Save all": "Save all", + "Save D and G": "Save D and G", + "Save voice": "Save voice", + "Downloading the file: ": "Downloading the file: ", + "Stop training": "Stop training", + "Too many users have recently viewed or downloaded this file": "Too many users have recently viewed or downloaded this file", + "Cannot get file from this private link": "Cannot get file from this private link", + "Full download": "Full download", + "An error occurred downloading": "An error occurred downloading", + "Model saved successfully": "Model saved successfully", + "Saving the model...": "Saving the model...", + "Saved without index...": "Saved without index...", + "Saved without inference model...": "Saved without inference model...", + "An error occurred saving the model": "An error occurred saving the model", + "The model you want to save does not exist, be sure to enter the correct name.": "The model you want to save does not exist, be sure to enter the correct name.", + "The file could not be downloaded.": "The file could not be downloaded.", + "Unzip error.": "Unzip error.", + "Path to your added.index file (if it didn't automatically find it)": "Path to your added.index file (if it didn't automatically find it)", + "It has been downloaded successfully.": "It has been downloaded successfully.", + "Proceeding with the extraction...": "Proceeding with the extraction...", + "The Backup has been uploaded successfully.": "The Backup has been uploaded successfully.", + "The Dataset has been loaded successfully.": "The Dataset has been loaded successfully.", + "The Model has been loaded successfully.": "The Model has been loaded successfully.", + "It is used to download your inference models.": "It is used to download your inference models.", + "It is used to download your training backups.": "It is used to download your training backups.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.", + "No relevant file was found to upload.": "No relevant file was found to upload.", + "The model works for inference, and has the .index file.": "The model works for inference, and has the .index file.", + "The model works for inference, but it doesn't have the .index file.": "The model works for inference, but it doesn't have the .index file.", + "This may take a few minutes, please wait...": "This may take a few minutes, please wait...", + "Resources": "Resources", + "Step 1: Processing data": "Step 1: Processing data", + "Step 2: Skipping pitch extraction": "Step 2: Skipping pitch extraction", + "Step 3: Extracting features": "Step 3: Extracting features", + "Step 4: Model training started": "Step 4: Model training started", + "Step 5: Export lowest points on a graph of the model": "Step 5: Export lowest points on a graph of the model", + "Training is done, check train.log": "Training is done, check train.log", + "All processes have been completed!": "All processes have been completed!", + "Model Inference": "Model Inference", + "Inferencing voice:": "Inferencing voice:", + "Model_Name": "Model_Name", + "Dataset_Name": "Dataset_Name", + "Whether the model has pitch guidance.": "Whether the model has pitch guidance.", + "Whether to save only the latest .ckpt file to save hard drive space": "Whether to save only the latest .ckpt file to save hard drive space", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training", + "Save a small final model to the 'weights' folder at each save point": "Save a small final model to the 'weights' folder at each save point", + "Refresh": "Refresh", + "Unload voice to save GPU memory": "Unload voice to save GPU memory", + "Select Speaker/Singer ID:": "Select Speaker/Singer ID:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Transpose (integer, number of semitones, raise by an octave: 12, lower by an octave: -12):", + "Feature search database file path:": "Feature search database file path:", + "Enter the path of the audio file to be processed (default is the correct format example):": "Enter the path of the audio file to be processed (default is the correct format example):", + "Select the pitch extraction algorithm:": "Select the pitch extraction algorithm:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.", + "Feature search dataset file path": "Feature search dataset file path", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Path to the feature index file. Leave blank to use the selected result from the dropdown:", + "Auto-detect index path and select from the dropdown:": "Auto-detect index path and select from the dropdown:", + "Path to feature file:": "Path to feature file:", + "Search feature ratio:": "Search feature ratio:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:", + "Convert": "Convert", + "Output information:": "Output information:", + "Export audio (click on the three dots in the lower right corner to download)": "Export audio (click on the three dots in the lower right corner to download)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').", + "Specify output folder:": "Specify output folder:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.", + "Export file format:": "Export file format:", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Enter the path of the audio folder to be processed:", + "Model:": "Model:", + "Vocal Extraction Aggressive": "Vocal Extraction Aggressive", + "Specify the output folder for vocals:": "Specify the output folder for vocals:", + "Specify the output folder for accompaniment:": "Specify the output folder for accompaniment:", + "Train": "Train", + "Enter the model name:": "Enter the model name:", + "Target sample rate:": "Target sample rate:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Whether the model has pitch guidance (required for singing, optional for speech):", + "Version:": "Version:", + "Number of CPU processes:": "Number of CPU processes:", + "Enter the path of the training folder:": "Enter the path of the training folder:", + "Specify the model ID:": "Specify the model ID:", + "Auto detect audio path and select from the dropdown:": "Auto detect audio path and select from the dropdown:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:", + "Advanced Settings": "Advanced Settings", + "Settings": "Settings", + "Status:": "Status:", + "Process data": "Process data", + "Drag your audio here:": "Drag your audio here:", + "Or record an audio:": "Or record an audio:", + "Formant shift inference audio": "Formant shift inference audio", + "Used for male to female and vice-versa conversions": "Used for male to female and vice-versa conversions", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:", + "GPU Information:": "GPU Information:", + "Feature extraction": "Feature extraction", + "Save frequency:": "Save frequency:", + "Training epochs:": "Training epochs:", + "Batch size per GPU:": "Batch size per GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Save only the latest '.ckpt' file to save disk space:", + "No": "No", + "Save a small final model to the 'weights' folder at each save point:": "Save a small final model to the 'weights' folder at each save point:", + "Load pre-trained base model G path:": "Load pre-trained base model G path:", + "Load pre-trained base model D path:": "Load pre-trained base model D path:", + "Train model": "Train model", + "Train feature index": "Train feature index", + "One-click training": "One-click training", + "Processing": "Processing", + "Model fusion, can be used to test timbre fusion": "Model fusion, can be used to test timbre fusion", + "Path to Model A:": "Path to Model A:", + "Path to Model B:": "Path to Model B:", + "Weight for Model A:": "Weight for Model A:", + "Whether the model has pitch guidance:": "Whether the model has pitch guidance:", + "Model information to be placed:": "Model information to be placed:", + "Model architecture version:": "Model architecture version:", + "Fusion": "Fusion", + "Modify model information": "Modify model information", + "Path to Model:": "Path to Model:", + "Model information to be modified:": "Model information to be modified:", + "Save file name:": "Save file name:", + "Modify": "Modify", + "View model information": "View model information", + "View": "View", + "Model extraction": "Model extraction", + "Name:": "Name:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Whether the model has pitch guidance (1: yes, 0: no):", + "Extract": "Extract", + "Export Onnx": "Export Onnx", + "RVC Model Path:": "RVC Model Path:", + "Onnx Export Path:": "Onnx Export Path:", + "MoeVS Model": "MoeVS Model", + "Export Onnx Model": "Export Onnx Model", + "Load model": "Load model", + "Hubert Model": "Hubert Model", + "Select the .pth file": "Select the .pth file", + "Select the .index file": "Select the .index file", + "Select the .npy file": "Select the .npy file", + "Input device": "Input device", + "Output device": "Output device", + "Audio device (please use the same type of driver)": "Audio device (please use the same type of driver)", + "Response threshold": "Response threshold", + "Pitch settings": "Pitch settings", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz", + "Index Rate": "Index Rate", + "General settings": "General settings", + "Sample length": "Sample length", + "Fade length": "Fade length", + "Extra inference time": "Extra inference time", + "Input noise reduction": "Input noise reduction", + "Output noise reduction": "Output noise reduction", + "Performance settings": "Performance settings", + "Start audio conversion": "Start audio conversion", + "Stop audio conversion": "Stop audio conversion", + "Inference time (ms):": "Inference time (ms):", + "Select the pth file": "Select the pth file", + "Select the .index file:": "Select the .index file:", + "The hubert model path must not contain Chinese characters": "The hubert model path must not contain Chinese characters", + "The pth file path must not contain Chinese characters.": "The pth file path must not contain Chinese characters.", + "The index file path must not contain Chinese characters.": "The index file path must not contain Chinese characters.", + "Step algorithm": "Step algorithm", + "Number of epoch processes": "Number of epoch processes", + "Lowest points export": "Lowest points export", + "How many lowest points to save:": "How many lowest points to save:", + "Export lowest points of a model": "Export lowest points of a model", + "Output models:": "Output models:", + "Stats of selected models:": "Stats of selected models:", + "Custom f0 [Root pitch] File": "Custom f0 [Root pitch] File", + "Min pitch:": "Min pitch:", + "Specify minimal pitch for inference [HZ]": "Specify minimal pitch for inference [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Specify minimal pitch for inference [NOTE][OCTAVE]", + "Max pitch:": "Max pitch:", + "Specify max pitch for inference [HZ]": "Specify max pitch for inference [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Specify max pitch for inference [NOTE][OCTAVE]", + "Browse presets for formanting": "Browse presets for formanting", + "Presets are located in formantshiftcfg/ folder": "Presets are located in formantshiftcfg/ folder", + "Default value is 1.0": "Default value is 1.0", + "Quefrency for formant shifting": "Quefrency for formant shifting", + "Timbre for formant shifting": "Timbre for formant shifting", + "Apply": "Apply", + "Single": "Single", + "Batch": "Batch", + "Separate YouTube tracks": "Separate YouTube tracks", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks", + "Extra": "Extra", + "Merge": "Merge", + "Merge your generated audios with the instrumental": "Merge your generated audios with the instrumental", + "Choose your instrumental:": "Choose your instrumental:", + "Choose the generated audio:": "Choose the generated audio:", + "Combine": "Combine", + "Download and Separate": "Download and Separate", + "Enter the YouTube link:": "Enter the YouTube link:", + "This section contains some extra utilities that often may be in experimental phases": "This section contains some extra utilities that often may be in experimental phases", + "Merge Audios": "Merge Audios", + "Audio files have been moved to the 'audios' folder.": "Audio files have been moved to the 'audios' folder.", + "Downloading audio from the video...": "Downloading audio from the video...", + "Audio downloaded!": "Audio downloaded!", + "An error occurred:": "An error occurred:", + "Separating audio...": "Separating audio...", + "File moved successfully.": "File moved successfully.", + "Finished!": "Finished!", + "The source file does not exist.": "The source file does not exist.", + "Error moving the file:": "Error moving the file:", + "Downloading {name} from drive": "Downloading {name} from drive", + "The attempt to download using Drive didn't work": "The attempt to download using Drive didn't work", + "Error downloading the file: {str(e)}": "Error downloading the file: {str(e)}", + "Downloading {name} from mega": "Downloading {name} from mega", + "Downloading {name} from basic url": "Downloading {name} from basic url", + "Download Audio": "Download Audio", + "Download audios of any format for use in inference (recommended for mobile users).": "Download audios of any format for use in inference (recommended for mobile users).", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n", + "Processed audio saved at: ": "Processed audio saved at: ", + "Conversion complete!": "Conversion complete!", + "Reverb": "Reverb", + "Compressor": "Compressor", + "Noise Gate": "Noise Gate", + "Volume": "Volume", + "Drag the audio here and click the Refresh button": "Drag the audio here and click the Refresh button", + "Select the generated audio": "Select the generated audio", + "Volume of the instrumental audio:": "Volume of the instrumental audio:", + "Volume of the generated audio:": "Volume of the generated audio:", + "### Audio settings:": "### Audio settings:", + "### Instrumental settings:": "### Instrumental settings:", + "### Add the effects:": "### Add the effects:", + "Name for saving": "Name for saving", + "Path to model": "Path to model", + "Model information to be placed": "Model information to be placed", + "Starting audio conversion... (This might take a moment)": "Starting audio conversion... (This might take a moment)", + "Error no reformatted.wav found:": "Error no reformatted.wav found:", + "Error at separating audio:": "Error at separating audio:", + "Vocal": "Vocal", + "Instrumental": "Instrumental", + "Finished": "Finished", + "TTS Model:": "TTS Model:", + "TTS": "TTS", + "RVC Model:": "RVC Model:", + "TTS Method:": "TTS Method:", + "Audio TTS:": "Audio TTS:", + "Audio RVC:": "Audio RVC:", + "Enter the text you want to convert to voice...": "Enter the text you want to convert to voice...", + "Text:": "Text:" +} diff --git a/assets/i18n/langs/es_ES.json b/assets/i18n/langs/es_ES.json new file mode 100644 index 000000000..959775e01 --- /dev/null +++ b/assets/i18n/langs/es_ES.json @@ -0,0 +1,260 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Lamentablemente, no hay una GPU compatible disponible para respaldar tu formación.", + "Yes": "Sí", + "Select your dataset:": "Seleccione su dataset:", + "Update list": "Actualizar lista", + "Download Model": "Descargar modelo", + "Download Backup": "Descargar copias de seguridad", + "Download Dataset": "Descargar dataset", + "Download": "Descargar", + "Url:": "Enlace:", + "Build the index before saving.": "Genere el índice antes de guardarlo.", + "Save your model once the training ends.": "Guarde su modelo una vez finalice el entrenamiento.", + "Save type": "Método de guardado:", + "Save model": "Guardar modelo", + "Choose the method": "Elige el método", + "Save all": "Guardar todos los archivos", + "Save D and G": "Guardar archivos G y D", + "Save voice": "Guadar modelo para inferencia", + "Downloading the file: ": "Descargando el archivo:", + "Stop training": "Detener entrenamiento", + "Too many users have recently viewed or downloaded this file": "Demasiados usuarios han visto o descargado recientemente este archivo", + "Cannot get file from this private link": "No se puede obtener el archivo de este enlace privado", + "Full download": "Descarga completa", + "An error occurred downloading": "Se ha producido un error al descargar", + "Model saved successfully": "Modelo guardado correctamente", + "Saving the model...": "Guardando el modelo...", + "Saved without index...": "Guardado sin archivo .index...", + "Saved without inference model...": "Guardado sin modelo de inferencia...", + "An error occurred saving the model": "Se ha producido un error al guardar el modelo", + "The model you want to save does not exist, be sure to enter the correct name.": "El modelo que desea guardar no existe, asegúrese de introducir el nombre correcto.", + "The file could not be downloaded.": "No se pudo bajar el archivo", + "Unzip error.": "Error al descomprimir.", + "Path to your added.index file (if it didn't automatically find it)": "Ruta a su archivo added.index (si no lo encontró automáticamente)", + "It has been downloaded successfully.": "Se ha descargado con éxito.", + "Proceeding with the extraction...": "Continuando con la extracción...", + "The Backup has been uploaded successfully.": "La copia de seguridad se ha cargado correctamente.", + "The Dataset has been loaded successfully.": "El dataset se ha cargado correctamente.", + "The Model has been loaded successfully.": "El modelo se ha cargado correctamente.", + "It is used to download your inference models.": "Se utiliza para descargar sus modelos de inferencia.", + "It is used to download your training backups.": "Se utiliza para descargar las copias de seguridad de entrenamientos.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Descargue el dataset con los audios en un formato compatible (.wav/.flac) para entrenar su modelo.", + "No relevant file was found to upload.": "No se ha encontrado ningún archivo relevante para cargar.", + "The model works for inference, and has the .index file.": "El modelo funciona para inferencia y tiene el archivo .index.", + "The model works for inference, but it doesn't have the .index file.": "El modelo funciona para inferencia, pero no tiene el archivo .index.", + "This may take a few minutes, please wait...": "Esto puede tardar unos minutos, espere por favor.", + "Resources": "Recursos", + "Step 1: Processing data": "Paso 1: Procesamiento de datos", + "Step 2: Skipping pitch extraction": "Paso 2: Extracción de tono", + "Step 3: Extracting features": "Paso 3: Extracción de funciones", + "Step 4: Model training started": "Paso 4: Entrenamiento del modelo", + "Step 5: Export lowest points on a graph of the model": "Paso 5: Exporte los puntos más bajos en un gráfico del modelo", + "Training is done, check train.log": "El entrenamiento ha finalizado, revisa train.log.", + "All processes have been completed!": "¡Todos los procesos se han completado!", + "Model Inference": "Inferencia", + "Inferencing voice:": "Modelo de voz:", + "Model_Name": "Nombre_Modelo", + "Dataset_Name": "Nombre_Dataset", + "Whether the model has pitch guidance.": "Si el modelo tiene guía de tono.", + "Whether to save only the latest .ckpt file to save hard drive space": "Si guardar solo el último archivo .ckpt para ahorrar espacio en el disco duro", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "El almacenamiento en caché de pequeños conjuntos de datos (menos de 10 minutos) puede acelerar el entrenamiento", + "Save a small final model to the 'weights' folder at each save point": "Guarde un pequeño modelo final en la carpeta 'weights' en cada punto de guardado", + "Refresh": "Actualizar", + "Unload voice to save GPU memory": "Eliminar voz para ahorrar memoria de GPU", + "Select Speaker/Singer ID:": "Seleccionar ID de orador/cantante:", + "Transpose (integer, number of semitones, raise by an octave: 12, lower by an octave: -12):": "Transponer (entero, número de semitonos, subir una octava: 12, bajar una octava -12):", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Se recomienda la tecla +12 para la conversión de hombre a mujer y la tecla -12 para la conversión de mujer a hombre. Si el rango de sonido va demasiado lejos y la voz está distorsionada, también puede ajustarlo al rango apropiado usted mismo.", + "Enter the path of the audio file to be processed (default is the correct format example):": "Introduzca la ruta del archivo de audio a procesar (el ejemplo de formato correcto es el predeterminado):", + "Select the pitch extraction algorithm:": "Seleccione el algoritmo de extracción de tono:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Longitud de salto de mangio-crepe (solo se aplica a mangio-crepe): la longitud de salto se refiere al tiempo que tarda el hablante en saltar a un tono dramático. Las longitudes de salto más bajas tardan más tiempo en inferirse, pero son más precisas en el tono.", + "Feature search dataset file path": "Ruta del archivo del dataset de búsqueda de funciones", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Si >=3: aplicar filtrado de mediana a los resultados de brea cosechada. El valor representa el radio del filtro y puede reducir la transpiración.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Ruta al archivo .index de entidades. Déjelo en blanco para usar el resultado seleccionado del menú desplegable:", + "Auto-detect index path and select from the dropdown:": "Detectar automáticamente la ruta del archivo .index y seleccionar en el menú desplegable:", + "Path to feature file:": "Ruta del archivo de características:", + "Search feature ratio:": "Proporción de función de búsqueda:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Vuelva a muestrear el audio de salida en el posprocesamiento a la frecuencia de muestreo final. Establecer en 0 para no volver a muestrear:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Utilice la envolvente de volumen de la entrada para reemplazar o mezclar con la envolvente de volumen de la salida. Cuanto más cerca esté la relación a 1, más se utilizará la envolvente de salida:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Proteja las consonantes sordas y los sonidos de la respiración para evitar artefactos como el desgarro en la música electrónica. Establecer en 0.5 para desactivar. Disminuya el valor para aumentar la protección, pero puede reducir la precisión de la indexación:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "Archivo de curva F0 (opcional). Un paso por línea. Sustituye la modulación de paso y F0 predeterminada:", + "Convert": "Convertir", + "Output information:": "Información de salida:", + "Export audio (click on the three dots in the lower right corner to download)": "Exportar audio (haga clic en los tres puntos en la esquina inferior derecha para descargar)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Conversión por lotes. Introduzca la carpeta que contiene los archivos de audio a convertir o cargue varios archivos de audio. El audio convertido se emitirá en la carpeta especificada (predeterminado: 'opt').", + "Specify output folder:": "Especificar carpeta de salida:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Introduzca la ruta de la carpeta de audio a procesar (cópiela desde la barra de direcciones del gestor de archivos):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "También puede introducir archivos de audio en lotes. Elige una de las dos opciones. Se da prioridad a la lectura de la carpeta.", + "Export file format:": "Formato de archivo de exportación:", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Introduzca la ruta de la carpeta de audio a procesar:", + "Model:": "Modelo:", + "Vocal Extraction Aggressive": "Extracción vocal agresiva", + "Specify the output folder for vocals:": "Especifique la carpeta de salida para las voces:", + "Specify the output folder for accompaniment:": "Especifique la carpeta de salida para el acompañamiento:", + "Train": "Entrenar", + "Enter the model name:": "Nombre del modelo:", + "Target sample rate:": "Tasa de muestreo objetivo:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Si el modelo tiene guía de tono (requerido para cantar, opcional para el habla):", + "Version:": "Versión:", + "Number of CPU processes:": "Número de procesos de CPU:", + "Enter the path of the training folder:": "Introduzca la ruta de la carpeta de formación:", + "Specify the model ID:": "Especifique el ID del modelo:", + "Auto detect audio path and select from the dropdown:": "Detectar automáticamente la ruta de audio y seleccionar en el menú desplegable:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Agregue el nombre del audio a la ruta del archivo de audio que se procesará (el ejemplo de formato correcto es el predeterminado) Elimine la ruta para usar un audio de la lista desplegable:", + "Advanced Settings": "Ajustes avanzados", + "Settings": "Configuración", + "Status:": "Estado:", + "Process data": "Procesar datos", + "Drag your audio here:": "Arrastra tu audio aquí:", + "Or record an audio:": "O graba un audio:", + "Formant shift inference audio": "Audio de inferencia de desplazamiento formante", + "Used for male to female and vice-versa conversions": "Se utiliza para conversiones de hombre a mujer y viceversa", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Proporcione los índices de la GPU separados por '-', como 0-1-2 para usar las GPU 0, 1 y 2:", + "GPU Information:": "Información de la GPU:", + "Feature extraction": "Extracción de característicos", + "Save frequency:": "Frecuencia de guardado:", + "Training epochs:": "Epochs de entrenamiento:", + "Batch size per GPU:": "Tamaño de lote por GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Guarde solo el último archivo '.ckpt' para ahorrar espacio en disco:", + "No": "No", + "Save a small final model to the 'weights' folder at each save point:": "Guarde un pequeño modelo final en la carpeta 'pesos' en cada punto de guardado:", + "Load pre-trained base model G path:": "Cargar ruta base modelo G pre-entrenada:", + "Load pre-trained base model D path:": "Ruta del modelo D base de carga pre-entrenada:", + "Train model": "Entrenar modelo", + "Train feature index": "Índice de características", + "One-click training": "Entrenamiento con un solo clic", + "Processing": "Procesamiento", + "Model fusion, can be used to test timbre fusion": "Modelo de fusión, se puede utilizar para probar la fusión de timbre", + "Path to Model A:": "Ruta al Modelo A:", + "Path to Model B:": "Ruta al Modelo B:", + "Weight for Model A:": "Peso para el modelo A:", + "Whether the model has pitch guidance:": "Si el modelo tiene guía de tono:", + "Model information to be placed:": "Información del modelo a colocar:", + "Name:": "Nombre:", + "Model architecture version:": "Versión de la arquitectura del modelo:", + "Fusion": "Fusión", + "Modify model information": "Modificar información del modelo", + "Path to Model:": "Ruta al modelo:", + "Model information to be modified:": "Información del modelo a modificar:", + "Save file name:": "Guardar nombre de archivo:", + "Modify": "Modificar", + "View model information": "Información del modelo", + "View": "Ver", + "Model extraction": "Extracción del modelo", + "Whether the model has pitch guidance (1: yes, 0: no):": "Si el modelo tiene guía de tono (1: sí, 0: no):", + "Extract": "Extraer", + "Export Onnx": "Exportar Onnx", + "RVC Model Path:": "Ruta del modelo RVC:", + "Onnx Export Path:": "Ruta de exportación Onnx:", + "MoeVS Model": "Modelo MoeVS", + "Export Onnx Model": "Exportar modelo Onnx", + "Load model": "Cargar modelo", + "Hubert Model": "Modelo Hubert", + "Select the .pth file": "Seleccione un archivo.", + "Select the .index file": "Seleccione el archivo .index", + "Select the .npy file": "Seleccione un archivo.", + "Input device": "Dispositivo de entrada", + "Output device": "Dispositivo de salida", + "Audio device (please use the same type of driver)": "Dispositivo de audio (utilice el mismo tipo de controlador)", + "Response threshold": "Umbral de respuesta", + "Pitch settings": "Ajustes de tono", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Si se deben usar nombres de notas en lugar de su valor de hercios. POR EJEMPLO, [C5, D6] en lugar de [523,25, 1174,66]Hz", + "Index Rate": "Tasa de Índice", + "General settings": "Configuración general", + "Sample length": "Longitud de la muestra", + "Fade length": "Longitud del desvanecimiento", + "Extra inference time": "Tiempo de inferencia adicional", + "Input noise reduction": "Reducción de ruido de entrada", + "Output noise reduction": "Reducción de ruido de salida", + "Performance settings": "Ajustes de rendimiento", + "Start audio conversion": "Iniciar conversión de audio", + "Stop audio conversion": "Detener conversión de audio", + "Inference time (ms):": "Tiempo de inferencia (ms):", + "Select the pth file": "Seleccione un archivo.", + "Select the .index file:": "Selecciona el archivo .index:", + "The hubert model path must not contain Chinese characters": "La ruta del modelo hubert no debe contener caracteres chinos", + "The pth file path must not contain Chinese characters.": "La ruta del archivo pth no debe contener caracteres chinos.", + "The index file path must not contain Chinese characters.": "La ruta del archivo .index no debe contener caracteres chinos.", + "Step algorithm": "Algoritmo de pasos", + "Number of epoch processes": "Número de procesos de Epoch", + "Lowest points export": "Exportación de puntos más bajos", + "How many lowest points to save:": "Cuántos puntos bajos quieres guardar:", + "Export lowest points of a model": "Exportar los puntos más bajos de un modelo", + "Output models:": "Modelos de salida:", + "Stats of selected models:": "Estadísticas de los modelos seleccionados:", + "Custom f0 [Root pitch] File": "Archivo personalizado f0 [Root pitch]", + "Min pitch:": "Tono mínimo:", + "Feature search database file path:": "Ruta del archivo de la base de datos de búsqueda de características:", + "Specify minimal pitch for inference [HZ]": "Especificar paso mínimo para inferencia [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Especifique el tono mínimo para la inferencia [NOTA][OCTAVA]", + "Max pitch:": "Tono máximo:", + "Specify max pitch for inference [HZ]": "Especifique el paso máximo para la inferencia [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Especifique el tono máximo para la inferencia [NOTA][OCTAVA]", + "Browse presets for formanting": "Examinar ajustes preestablecidos para formatear", + "Presets are located in formantshiftcfg/ folder": "Los ajustes preestablecidos se encuentran en formantshiftcfg/ folder", + "Default value is 1.0": "El valor por defecto es 1.", + "Quefrency for formant shifting": "Quefrencia para desplazamiento de formantes", + "Timbre for formant shifting": "Timbre para el cambio de formantes", + "Apply": "Aplicar", + "Single": "Individual", + "Batch": "Lote", + "Separate YouTube tracks": "Pistas separadas de YouTube", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Descarga el audio de un vídeo de YouTube y separa automáticamente las pistas vocales e instrumentales.", + "Extra": "Extra", + "Merge": "Combinar", + "Merge your generated audios with the instrumental": "Combina tus audios generados con el instrumental", + "Choose your instrumental:": "Elige tu instrumental:", + "Choose the generated audio:": "Elige el audio generado:", + "Combine": "Combinar", + "Download and Separate": "Descargar y separar", + "Enter the YouTube link:": "Introduce el enlace de YouTube:", + "This section contains some extra utilities that often may be in experimental phases": "Esta sección contiene algunas utilidades adicionales que a menudo pueden estar en fases experimentales", + "Merge Audios": "Combinar audios", + "Audio files have been moved to the 'audios' folder.": "Los archivos de audio se han movido a la carpeta 'audios'.", + "Downloading audio from the video...": "Descargando audio del vídeo...", + "Audio downloaded!": "¡Audio descargado!", + "An error occurred:": "Se ha producido un error:", + "Separating audio...": "Separando audio...", + "File moved successfully.": "El artículo se ha movido correctamente", + "Finished!": "¡Listo!", + "The source file does not exist.": "El archivo no existe.", + "Error moving the file:": "Error al mover el archivo:", + "Downloading {name} from drive": "Descargando {name} de la unidad", + "The attempt to download using Drive didn't work": "El intento de descarga con Drive no ha funcionado", + "Error downloading the file: {str(e)}": "Error al descargar el archivo: {str(e)}", + "Downloading {name} from mega": "Descargando {name} de mega", + "Downloading {name} from basic url": "Descargando {name} desde la URL básica", + "Download Audio": "Descargar audio", + "Download audios of any format for use in inference (recommended for mobile users).": "Descargar audios de cualquier formato para su uso en inferencia (recomendado para usuarios móviles).", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Cualquier posconversión de ConnectionResetErrors es irrelevante y puramente visual; se puede ignorar.\n", + "Processed audio saved at: ": "Audio procesado guardado en:", + "Conversion complete!": "Actualización finalizada", + "Reverb": "Reverberación", + "Compressor": "Compresor", + "Noise Gate": "Puerta de ruido", + "Volume": "Volumen", + "Drag the audio here and click the Refresh button": "Arrastre el audio aquí y haga clic en el botón Actualizar", + "Select the generated audio": "Selecciona el audio generado", + "Volume of the instrumental audio:": "Volumen del audio instrumental:", + "Volume of the generated audio:": "Volumen del audio generado:", + "### Audio settings:": "### Audio generado:", + "### Instrumental settings:": "### Audio de instrumental:", + "### Add the effects:": "### Añade los efectos:", + "Name for saving": "Nombre de guardado", + "Path to model": "Ruta al modelo", + "Model information to be placed": "Información del modelo a modificar", + "Starting audio conversion... (This might take a moment)": "Iniciando la conversión del audio... (Esto podría llevar un tiempo)", + "Error no reformatted.wav found:": "Error no se encontró el archivo reformatted.wav:", + "Error at separating audio:": "Error al separar el audio:", + "Vocal": "Vocal", + "Instrumental": "Instrumental", + "Finished": "Terminado", + "TTS Model:": "Modelo TTS:", + "TTS": "TTS", + "RVC Model:": "Modelo RVC:", + "TTS Method:": "Método TTS:", + "Audio TTS:": "Audio TTS:", + "Audio RVC:": "Audio RVC:", + "Enter the text you want to convert to voice...": "Introduce el texto que desea convertir en voz...", + "Text:": "Texto:" +} diff --git a/assets/i18n/langs/id_ID.json b/assets/i18n/langs/id_ID.json new file mode 100644 index 000000000..4b19a691e --- /dev/null +++ b/assets/i18n/langs/id_ID.json @@ -0,0 +1,248 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Sayangnya, tidak ada GPU kompatibel yang tersedia untuk mendukung pelatihan Anda.", + "Yes": "Ya", + "Select your dataset:": "Pilih kumpulan data Anda.", + "Update list": "Perbarui daftar.", + "Download Model": "Unduh Model", + "Download Backup": "Unduh Cadangan", + "Download Dataset": "Unduh Kumpulan Data", + "Download": "Unduh", + "Url:": "URL:", + "Build the index before saving.": "Bangun indeks sebelum menyimpan.", + "Save your model once the training ends.": "Simpan model Anda setelah pelatihan berakhir.", + "Save type": "Simpan jenis", + "Save model": "Simpan modelnya", + "Choose the method": "Pilih metodenya", + "Save all": "Simpan semua", + "Save D and G": "Simpan D dan G", + "Save voice": "Simpan suara", + "Downloading the file: ": "Mengunduh file:", + "Stop training": "Hentikan pelatihan", + "Too many users have recently viewed or downloaded this file": "Terlalu banyak pengguna yang baru-baru ini melihat atau mengunduh file ini", + "Cannot get file from this private link": "Tidak dapat memperoleh file dari tautan pribadi ini", + "Full download": "Unduhan penuh", + "An error occurred downloading": "Terjadi kesalahan saat mengunduh", + "Model saved successfully": "Model berhasil disimpan", + "Saving the model...": "Menyimpan model...", + "Saved without index...": "Disimpan tanpa indeks...", + "model_name": "nama model", + "Saved without inference model...": "Disimpan tanpa model inferensi...", + "An error occurred saving the model": "Terjadi kesalahan saat menyimpan model", + "The model you want to save does not exist, be sure to enter the correct name.": "Model yang ingin disimpan tidak ada, pastikan memasukkan nama yang benar.", + "The file could not be downloaded.": "File tidak dapat diunduh.", + "Unzip error.": "Kesalahan buka zip.", + "Path to your added.index file (if it didn't automatically find it)": "Jalur ke file add.index Anda (jika tidak menemukannya secara otomatis)", + "It has been downloaded successfully.": "Itu telah berhasil diunduh.", + "Proceeding with the extraction...": "Melanjutkan ekstraksi...", + "The Backup has been uploaded successfully.": "Cadangan telah berhasil diunggah.", + "The Dataset has been loaded successfully.": "Dataset telah berhasil dimuat.", + "The Model has been loaded successfully.": "Model telah berhasil dimuat.", + "It is used to download your inference models.": "Ini digunakan untuk mengunduh model inferensi Anda.", + "It is used to download your training backups.": "Ini digunakan untuk mengunduh cadangan pelatihan Anda.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Unduh kumpulan data dengan audio dalam format yang kompatibel (.wav/.flac) untuk melatih model Anda.", + "No relevant file was found to upload.": "Tidak ada file relevan yang ditemukan untuk diunggah.", + "The model works for inference, and has the .index file.": "Model ini berfungsi untuk inferensi, dan memiliki file .index.", + "The model works for inference, but it doesn't have the .index file.": "Model ini berfungsi untuk inferensi, tetapi tidak memiliki file .index.", + "This may take a few minutes, please wait...": "Ini mungkin memakan waktu beberapa menit, harap tunggu...", + "Resources": "Sumber daya", + "Step 1: Processing data": "Langkah 1: Memproses data", + "Step 2: Skipping pitch extraction": "Langkah 2a: Melewatkan ekstraksi nada", + "Step 3: Extracting features": "Langkah 2b: Mengekstraksi fitur", + "Step 4: Model training started": "Langkah 3a: Pelatihan model dimulai", + "Step 5: Export lowest points on a graph of the model": "Langkah 4: Ekspor titik terendah pada grafik model", + "Training is done, check train.log": "Pelatihan selesai, periksa train.log", + "All processes have been completed!": "Semua proses telah selesai!", + "Model Inference": "Inferensi Model", + "Inferencing voice:": "Menyimpulkan suara:", + "Model_Name": "Nama model", + "Dataset_Name": "Kumpulan Data_Nama", + "Whether the model has pitch guidance.": "Apakah model memiliki panduan nada.", + "Whether to save only the latest .ckpt file to save hard drive space": "Apakah hanya menyimpan file .ckpt terbaru untuk menghemat ruang hard drive", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Simpan semua set pelatihan ke memori GPU. Menyimpan kumpulan data kecil (kurang dari 10 menit) dapat mempercepat pelatihan", + "Save a small final model to the 'weights' folder at each save point": "Simpan model akhir kecil ke folder 'bobot' di setiap titik penyimpanan", + "Refresh": "Segarkan daftar suara, jalur indeks, dan file audio", + "Unload voice to save GPU memory": "Bongkar suara untuk menghemat memori GPU:", + "Select Speaker/Singer ID:": "Pilih ID Pembicara/Penyanyi:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Direkomendasikan kunci +12 untuk konversi pria ke wanita, dan -12 kunci untuk konversi wanita ke pria. Jika rentang suara terlalu jauh dan suaranya terdistorsi, Anda juga dapat menyesuaikannya sendiri ke rentang yang sesuai.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Transpos (bilangan bulat, jumlah seminada, dinaikkan satu oktaf: 12, diturunkan satu oktaf: -12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "Masukkan jalur file audio yang akan diproses (defaultnya adalah contoh format yang benar):", + "Select the pitch extraction algorithm:": "Pilih algoritma ekstraksi nada:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Panjang Hop Mangio-Crepe (Hanya berlaku untuk mangio-crepe): Panjang hop mengacu pada waktu yang dibutuhkan pembicara untuk melompat ke nada dramatis. Panjang lompatan yang lebih rendah membutuhkan lebih banyak waktu untuk menyimpulkan tetapi nadanya lebih akurat.", + "Feature search dataset file path": "Jalur file kumpulan data pencarian fitur", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Jika >=3: terapkan pemfilteran median pada hasil pitch yang dipanen. Nilai tersebut mewakili radius filter dan dapat mengurangi sesak napas.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Jalur ke file indeks fitur. Biarkan kosong untuk menggunakan hasil yang dipilih dari dropdown:", + "Auto-detect index path and select from the dropdown:": "Deteksi jalur indeks secara otomatis dan pilih dari dropdown", + "Path to feature file:": "Jalur ke file fitur:", + "Search feature ratio:": "Rasio fitur pencarian:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Sampel ulang audio keluaran dalam pasca-pemrosesan ke laju sampel akhir. Setel ke 0 tanpa pengambilan sampel ulang:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Gunakan amplop volume masukan untuk menggantikan atau mencampur dengan amplop volume keluaran. Semakin dekat rasionya ke 1, semakin banyak amplop keluaran yang digunakan:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Lindungi konsonan tak bersuara dan bunyi napas untuk mencegah artefak seperti robek pada musik elektronik. Setel ke 0,5 untuk menonaktifkan. Turunkan nilainya untuk meningkatkan perlindungan, namun hal ini dapat mengurangi akurasi pengindeksan:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "File kurva F0 (opsional). Satu nada per baris. Menggantikan F0 dan modulasi nada default:", + "Convert": "Mengubah", + "Output information:": "Informasi keluaran", + "Export audio (click on the three dots in the lower right corner to download)": "Ekspor audio (klik tiga titik di pojok kanan bawah untuk mengunduh)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Konversi batch. Masuk ke folder yang berisi file audio yang akan dikonversi atau unggah beberapa file audio. Audio yang dikonversi akan dikeluarkan di folder yang ditentukan (default: 'opt').", + "Specify output folder:": "Tentukan folder keluaran:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Masukkan jalur folder audio yang akan diproses (salin dari bilah alamat pengelola file):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Anda juga dapat memasukkan file audio secara berkelompok. Pilih salah satu dari dua opsi. Prioritas diberikan untuk membaca dari folder.", + "Export file format": "Ekspor format file", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Masukkan jalur folder audio yang akan diproses:", + "Model": "Model", + "Vocal Extraction Aggressive": "Ekstraksi Vokal Agresif", + "Specify the output folder for vocals:": "Tentukan folder keluaran untuk vokal:", + "Specify the output folder for accompaniment:": "Tentukan folder keluaran untuk pengiring:", + "Train": "Kereta", + "Enter the model name:": "Masukkan nama model:", + "Target sample rate:": "Tingkat sampel target:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Apakah model memiliki panduan nada (wajib untuk bernyanyi, opsional untuk berbicara):", + "Version": "Versi: kapan", + "Number of CPU processes:": "Jumlah proses CPU yang digunakan untuk ekstraksi nada dan pemrosesan data:", + "Enter the path of the training folder:": "Masukkan jalur folder pelatihan:", + "Specify the model ID:": "Silakan tentukan ID model:", + "Auto detect audio path and select from the dropdown:": "Deteksi otomatis jalur audio dan pilih dari dropdown:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Tambahkan nama audio ke jalur ke file audio yang akan diproses (standarnya adalah contoh format yang benar) Hapus jalur untuk menggunakan audio dari daftar dropdown:", + "Advanced Settings": "Pengaturan lanjutan", + "Settings": "Pengaturan", + "Status:": "Status:", + "Process data": "Data proses", + "Drag your audio here:": "Seret audio Anda ke sini dan tekan tombol segarkan", + "Or record an audio:": "Atau rekam audio.", + "Formant shift inference audio": "Audio inferensi pergeseran formant", + "Used for male to female and vice-versa conversions": "Digunakan untuk konversi pria ke wanita dan sebaliknya", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Harap berikan indeks GPU yang dipisahkan dengan '-', seperti 0-1-2 untuk menggunakan GPU 0, 1, dan 2:", + "GPU Information:": "Informasi GPU", + "Feature extraction": "Ekstraksi fitur", + "Save frequency:": "Simpan frekuensi:", + "Training epochs:": "Zaman pelatihan:", + "Batch size per GPU:": "Ukuran batch per GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Simpan hanya file '.ckpt' terbaru untuk menghemat ruang disk:", + "No": "TIDAK", + "Save a small final model to the 'weights' folder at each save point:": "Simpan model akhir kecil ke folder 'bobot' di setiap titik penyimpanan:", + "Load pre-trained base model G path:": "Memuat jalur G model dasar terlatih:", + "Load pre-trained base model D path:": "Memuat jalur model D dasar yang telah dilatih sebelumnya:", + "Train model": "Model kereta api", + "Train feature index": "Indeks fitur kereta", + "One-click training": "Pelatihan sekali klik", + "Processing": "Pengolahan", + "Model fusion, can be used to test timbre fusion": "Fusi model, dapat digunakan untuk menguji fusi timbre", + "Path to Model A:": "Jalan menuju Model A:", + "Path to Model B:": "Jalan menuju Model B:", + "Weight for Model A:": "Berat untuk Model A:", + "Whether the model has pitch guidance:": "Apakah model memiliki panduan nada:", + "Model information to be placed:": "Informasi model yang akan ditempatkan:", + "Name:": "Nama model yang disimpan (tanpa ekstensi):", + "Model architecture version:": "Versi arsitektur model:", + "Fusion": "Fusi", + "Modify model information": "Ubah informasi model", + "Path to Model:": "Jalur Menuju Model:", + "Model information to be modified:": "Informasi model yang akan dimodifikasi:", + "Save file name:": "Simpan nama file:", + "Modify": "Memodifikasi", + "View model information": "Lihat informasi model", + "View": "Melihat", + "Model extraction": "Ekstraksi model (masukkan jalur model file besar di bawah folder 'logs'). Ini berguna jika Anda ingin menghentikan pelatihan di tengah jalan dan mengekstrak serta menyimpan file model kecil secara manual, atau jika Anda ingin menguji model perantara:", + "Name:": "Simpan nama:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Apakah model memiliki panduan nada (1: ya, 0: tidak):", + "Extract": "Ekstrak", + "Export Onnx": "Ekspor Onnx", + "RVC Model Path:": "Jalur Model RVC:", + "Onnx Export Path:": "Jalur Ekspor Onnx:", + "MoeVS Model": "Model MoeVS", + "Export Onnx Model": "Ekspor Model Onnx", + "Load model": "Model beban", + "Hubert Model": "Model Hubert", + "Select the .pth file": "Pilih file .pth", + "Select the .index file": "Pilih file .index", + "Select the .npy file": "Pilih file .npy", + "Input device": "Alat input", + "Output device": "Perangkat keluaran", + "Audio device (please use the same type of driver)": "Perangkat audio (harap gunakan jenis driver yang sama)", + "Response threshold": "Ambang batas respons", + "Pitch settings": "Pengaturan nada", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Apakah akan menggunakan nama nada dan bukan nilai hertznya. MISALNYA. [C5, D6] bukannya [523.25, 1174.66]Hz", + "Index Rate": "Tingkat Indeks", + "General settings": "Pengaturan Umum", + "Sample length": "Panjang sampel", + "Fade length": "Panjang pudar", + "Extra inference time": "Waktu inferensi ekstra", + "Input noise reduction": "Pengurangan kebisingan masukan", + "Output noise reduction": "Pengurangan kebisingan keluaran", + "Performance settings": "Pengaturan kinerja", + "Start audio conversion": "Mulai konversi audio", + "Stop audio conversion": "Hentikan konversi audio", + "Inference time (ms):": "Waktu inferensi (ms):", + "Select the pth file": "Pilih file pth", + "Select the .index file:": "Pilih file indeks", + "The hubert model path must not contain Chinese characters": "Jalur model hubert tidak boleh berisi karakter China", + "The pth file path must not contain Chinese characters.": "Jalur file pth tidak boleh berisi karakter Cina.", + "The index file path must not contain Chinese characters.": "Jalur file indeks tidak boleh berisi karakter Cina.", + "Step algorithm": "Algoritma langkah", + "Number of epoch processes": "Jumlah proses zaman", + "Lowest points export": "Ekspor poin terendah", + "How many lowest points to save:": "Berapa banyak poin terendah yang harus disimpan", + "Export lowest points of a model": "Ekspor titik terendah suatu model", + "Output models:": "Model keluaran", + "Stats of selected models:": "Statistik model yang dipilih", + "Custom f0 [Root pitch] File": "File f0 [Root pitch] khusus", + "Min pitch:": "nada minimal", + "Specify minimal pitch for inference [HZ]": "Tentukan nada minimal untuk inferensi [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Tentukan nada minimal untuk inferensi [CATATAN][OCTAVE]", + "Max pitch:": "Nada maksimal", + "Specify max pitch for inference [HZ]": "Tentukan nada maksimal untuk inferensi [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Tentukan nada maksimal untuk inferensi [CATATAN][OCTAVE]", + "Browse presets for formanting": "Telusuri preset untuk pembentukan", + "Presets are located in formantshiftcfg/ folder": "Preset terletak di folder formantshiftcfg/", + "Default value is 1.0": "Nilai defaultnya adalah 1,0", + "Quefrency for formant shifting": "Quefrency untuk pergeseran formant", + "Timbre for formant shifting": "Timbre untuk pergeseran formant", + "Apply": "Menerapkan", + "Single": "Lajang", + "Batch": "Kelompok", + "Separate YouTube tracks": "Pisahkan trek YouTube", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Unduh audio dari video YouTube dan pisahkan trek vokal dan instrumental secara otomatis", + "Extra": "Tambahan", + "Merge": "Menggabungkan", + "Merge your generated audios with the instrumental": "Gabungkan audio yang Anda hasilkan dengan instrumental", + "Choose your instrumental:": "Pilih instrumen Anda", + "Choose the generated audio:": "Pilih audio yang dihasilkan", + "Combine": "Menggabungkan", + "Download and Separate": "Unduh dan Pisahkan", + "Enter the YouTube link:": "Masukkan tautan youtube", + "This section contains some extra utilities that often may be in experimental phases": "Bagian ini berisi beberapa utilitas tambahan yang mungkin sering berada dalam tahap percobaan", + "Merge Audios": "Gabungkan Audio", + "Audio files have been moved to the 'audios' folder.": "File audio telah dipindahkan ke folder 'audios'.", + "Downloading audio from the video...": "Mengunduh audio dari video...", + "Audio downloaded!": "Unduhan audio!", + "An error occurred:": "Terjadi kesalahan:", + "Separating audio...": "Memisahkan audio...", + "File moved successfully.": "File berhasil dipindahkan.", + "Finished!": "Selesai!", + "The source file does not exist.": "File sumber tidak ada.", + "Error moving the file:": "Kesalahan saat memindahkan file:", + "Downloading {name} from drive": "Mengunduh {name} dari drive", + "The attempt to download using Drive didn't work": "Upaya mengunduh menggunakan Drive tidak berhasil", + "Error downloading the file: {str(e)}": "Kesalahan saat mengunduh berkas: {str(e)}", + "Downloading {name} from mega": "Mengunduh {name} dari mega", + "Downloading {name} from basic url": "Mengunduh {name} dari url dasar", + "Download Audio": "Unduh Audio", + "Download audios of any format for use in inference (recommended for mobile users).": "Mengunduh audio dalam format apa pun untuk digunakan dalam inferensi (disarankan untuk pengguna seluler)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Setiap ConnectionResetErrors pasca-konversi tidak relevan dan murni visual; mereka dapat diabaikan.", + "Processed audio saved at: ": "Audio yang diproses disimpan di:", + "Conversion complete!": "Konversi selesai!", + "Reverb": "Berkumandang", + "Compressor": "Kompresor", + "Noise Gate": "Gerbang Kebisingan", + "Volume": "Volume", + "Drag the audio here and click the Refresh button": "Seret audio ke sini dan klik tombol Refresh", + "Select the generated audio": "Pilih audio yang dihasilkan", + "Volume of the instrumental audio:": "Volume audio instrumental", + "Volume of the generated audio:": "Volume audio yang dihasilkan", + "### Add the effects": "### Tambahkan efeknya", + "Starting audio conversion... (This might take a moment)": "Memulai konversi audio... (Ini mungkin memerlukan waktu sebentar)", + "TTS Model:": "Suara TTS", + "TTS": "TTS", + "TTS Method:": "Metode TTS", + "Audio TTS:": "Audio TTS:", + "Audio RVC:": "Model Audio" +} diff --git a/assets/i18n/langs/it_IT.json b/assets/i18n/langs/it_IT.json new file mode 100644 index 000000000..70afb3f72 --- /dev/null +++ b/assets/i18n/langs/it_IT.json @@ -0,0 +1,252 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Purtroppo non è disponibile una GPU compatibile per supportare l'addestramento.", + "Yes": "Sì", + "Select your dataset:": "Seleziona il tuo dataset:", + "Update list": "Aggiorna la lista", + "Download Model": "Scarica il modello", + "Download Backup": "Scarica il backup", + "Download Dataset": "Scarica il dataset", + "Download": "Scarica", + "Url:": "Link:", + "Build the index before saving.": "Genera l'indice prima di salvarlo.", + "Save your model once the training ends.": "Salva il modello una volta terminato il training.", + "Save type": "Metodo di salvataggio:", + "Save model": "Salva modello", + "Choose the method": "Scegli il metodo", + "Save all": "Salva tutto", + "Save D and G": "Salva i file G e D", + "Save voice": "Salva il modello", + "Downloading the file: ": "Scaricamento del file: ", + "Stop training": "Interrompi training", + "Too many users have recently viewed or downloaded this file": "Troppi utenti hanno visto o scaricato di recente questo file", + "Cannot get file from this private link": "Impossibile ottenere il file, il link è privato", + "Full download": "Download completato", + "An error occurred downloading": "Si è verificato un errore durante il download", + "Model saved successfully": "Modello salvato con successo", + "Saving the model...": "Salvando il modello...", + "Saved without index...": "Salvataggio senza file .index...", + "Saved without inference model...": "Salvataggio senza modello di inferenza...", + "An error occurred saving the model": "Si è verificato un errore durante il salvataggio del modello", + "The model you want to save does not exist, be sure to enter the correct name.": "Il modello che vuoi salvare non esiste, assicurati di inserire il nome corretto.", + "The file could not be downloaded.": "Impossibile scaricare il file.", + "Unzip error.": "Estrazione non riuscita.", + "Path to your added.index file (if it didn't automatically find it)": "Percorso del tuo file added.index (se non l'ha trovato automaticamente)", + "It has been downloaded successfully.": "Scaricato con successo.", + "Proceeding with the extraction...": "Proseguo con l'estrazione...", + "The Backup has been uploaded successfully.": "Il backup è stato caricato correttamente.", + "The Dataset has been loaded successfully.": "Il dataset è stato caricato correttamente.", + "The Model has been loaded successfully.": "Il modello è stato caricato correttamente.", + "It is used to download your inference models.": "Serve per scaricare i suoi modelli di inferenza.", + "It is used to download your training backups.": "Serve per scaricare i backup degi training.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Scarica il dataset con gli audio in un formato compatibile (.wav/.flac) per trainare il tuo modello.", + "No relevant file was found to upload.": "Non è stato trovato alcun file rilevante da caricare.", + "The model works for inference, and has the .index file.": "Il modello funziona per l'inferenza ed ha il file .index.", + "The model works for inference, but it doesn't have the .index file.": "Il modello funziona per l'inferenza, ma non ha il file .index.", + "This may take a few minutes, please wait...": "Potrebbe richiedere alcuni minuti, attendere per favore.", + "Resources": "Risorse", + "Step 1: Processing data": "Fase 1: Elaborazione dei dati", + "Step 2: Skipping pitch extraction": "Fase 2: Estrazione del pitch", + "Step 3: Extracting features": "Fase 3: Estrazione delle caratteristiche", + "Step 4: Model training started": "Fase 4: Training del modello", + "Step 5: Export lowest points on a graph of the model": "Fase 5: Esportare i punti più bassi su un grafico del modello", + "Training is done, check train.log": "Il training è terminato, controlla train.log.", + "All processes have been completed!": "Tutti i processi sono stati completati!", + "Model Inference": "Inferenza del modello", + "Inferencing voice:": "Modello vocale:", + "Model_Name": "Nome_Modello", + "Dataset_Name": "Nome_Dataset", + "Whether the model has pitch guidance.": "Indica se il modello ha una guida tonale.", + "Whether to save only the latest .ckpt file to save hard drive space": "Indica se salvare solo l'ultimo file .ckpt per risparmiare spazio sul disco rigido", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "La memorizzazione nella cache di piccoli dataset (meno di 10 minuti) può accelerare l'allenamento", + "Save a small final model to the 'weights' folder at each save point": "Salva un piccolo modello finale nella cartella 'weights' in ogni punto di salvataggio", + "Refresh": "Aggiorna la lista dei modelli, il percorso del file .index e gli audio", + "Unload voice to save GPU memory": "Rimuovi modelli per risparmiare memoria GPU", + "Select Speaker/Singer ID:": "Seleziona ID della persona che parla o del cantante:", + "Transpose (integer, number of semitones, raise by an octave: 12, lower by an octave: -12):": "Trasporre (numero intero, numero di semitoni, per alzare di un'ottava: 12, per scendere di un'ottava: -12):", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Si consiglia +12 per la conversione da uomo a donna e -12 per la conversione da donna a uomo. Se la gamma sonora va troppo oltre e la voce è distorta, puoi anche regolarla tu stesso nella gamma appropriata.", + "Enter the path of the audio file to be processed (default is the correct format example):": "Inserisci il percorso del file audio da elaborare (l'esempio di formato corretto è quello predefinito):", + "Select the pitch extraction algorithm:": "Selezionare l'algoritmo di estrazione del pitch:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Lunghezza di salto di Mangio-Crepe (si applica solo a mangio-crepe): la lunghezza di salto si riferisce al tempo impiegato dal parlante per saltare in una tonalità drammatica. Le lunghezze di salto più basse richiedono più tempo per essere dedotte, ma sono più precise nel tono.", + "Feature search dataset file path": "Percorso del file del dataset di ricerca delle caratteristiche", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Se >=3: applica un filtro di media usati con il metodo di tonalità harvest. Il valore rappresenta il raggio del filtro e può ridurre la traspirazione.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Percorso al file .index. Lasciarlo vuoto per utilizzare il risultato selezionato dal menu a tendina:", + "Auto-detect index path and select from the dropdown:": "Rilevare automaticamente il percorso del file .index e selezionare dal menu a tendina:", + "Path to feature file:": "Percorso al file delle caratteristiche:", + "Search feature ratio:": "Proporzione della caratteristiche di ricerca:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Ricampionare l'audio in uscita in post-elaborazione alla frequenza di campionamento finale. Impostare a 0 per non campionare di nuovo:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Utilizzare l'inviluppo del volume dell'ingresso per sostituire o mescolare con l'inviluppo del volume dell'uscita. Più il rapporto è vicino a 1, più verrà utilizzato l'inviluppo di uscita:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Proteggi le consonanti sorde e i suoni del respiro per evitare artefatti come la lacerazione nella musica elettronica. Impostare su 0.5 per disattivare. Diminuire il valore per aumentare la protezione, ma può ridurre la precisione dell'indicizzazione:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "File curva F0 (opzionale). Un passo per riga. Sostituisce la modulazione di passo e F0 di default:", + "Convert": "Conversione", + "Output information:": "Informazioni in uscita", + "Export audio (click on the three dots in the lower right corner to download)": "Esporta audio (clicca sui tre puntini nell'angolo in basso a destra per scaricare)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Conversione batch. Inserire la cartella contenente i file audio da convertire o caricare più file audio. L'audio convertito verrà emesso nella cartella specificata (default: 'opt').", + "Specify output folder:": "Specifica cartella di output:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Inserire il percorso della cartella audio da elaborare (copiarla dalla barra degli indirizzi del file manager):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Puoi anche inserire file audio in batch. Scegli una delle due opzioni. Viene data priorità alla lettura della cartella.", + "Export file format:": "Formato file di esportazione:", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Inserire il percorso della cartella audio da elaborare:", + "Model:": "Modello:", + "Vocal Extraction Aggressive": "Estrazione vocale aggressiva", + "Specify the output folder for vocals:": "Specificare la cartella di output per le voci:", + "Specify the output folder for accompaniment:": "Specificare la cartella di uscita per l'accompagnamento:", + "Train": "Addestramento", + "Enter the model name:": "Inserisci il nome del modello:", + "Target sample rate:": "Tasso di campionamento target:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Se il modello ha una guida di pitch (richiesto per cantare, opzionale per parlare):", + "Version:": "Versione:", + "Number of CPU processes:": "Numero di processi della CPU:", + "Enter the path of the training folder:": "Inserire il percorso della cartella del training:", + "Specify the model ID:": "Specificare l'ID del modello:", + "Auto detect audio path and select from the dropdown:": "Rileva automaticamente il percorso audio e seleziona dal menu a tendina:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Aggiungere il nome dell'audio al percorso del file audio da elaborare (l'esempio di formato corretto è quello predefinito) Eliminare il percorso per utilizzare un audio dall'elenco a discesa:", + "Advanced Settings": "Impostazioni avanzate", + "Settings": "Impostazioni", + "Status:": "Stato:", + "Process data": "Elabora dati", + "Drag your audio here:": "Trascina il tuo audio qui:", + "Or record an audio:": "Oppure registra un audio:", + "Formant shift inference audio": "Audio di inferenza di spostamento formante", + "Used for male to female and vice-versa conversions": "Viene utilizzato per le conversioni da uomo a donna e viceversa", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Fornire gli indici GPU separati da '-', come 0-1-2 per utilizzare le GPU 0, 1 e 2:", + "GPU Information:": "Informazioni GPU:", + "Feature extraction": "Estrazione delle caratteristiche", + "Save frequency:": "Frequenza di salvataggio:", + "Training epochs:": "Epoch di addestramento:", + "Batch size per GPU:": "Dimensione del lotto per GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Salvare solo l'ultimo file '.ckpt' per risparmiare spazio su disco:", + "No": "No", + "Save a small final model to the 'weights' folder at each save point:": "Salvare un piccolo modello finale nella cartella \"pesi\" in ogni punto di salvataggio:", + "Load pre-trained base model G path:": "Carica percorso base modello G pre-allenato:", + "Load pre-trained base model D path:": "Percorso del modello D base di ricarica pre-allenata:", + "Train model": "Allena modello", + "Train feature index": "Allena l'indice delle caratteristiche", + "One-click training": "Allenamento con un clic", + "Processing": "Elaborazione", + "Model fusion, can be used to test timbre fusion": "Modello di fusione, può essere utilizzato per testare la fusione del timbro", + "Path to Model A:": "Percorso al Modello A:", + "Path to Model B:": "Percorso al Modello B:", + "Weight for Model A:": "Peso per il modello A:", + "Whether the model has pitch guidance:": "Indica se il modello ha una guida di tono:", + "Model information to be placed:": "Informazioni sul modello da mettere:", + "Name:": "Nome:", + "Model architecture version:": "Versione dell'architettura del modello:", + "Fusion": "Fusione", + "Modify model information": "Modifica informazioni modello", + "Path to Model:": "Percorso al modello:", + "Model information to be modified:": "Informazioni sul modello da modificare:", + "Save file name:": "Salva nome file:", + "Modify": "Modifica", + "View model information": "Visualizza informazioni sul modello", + "View": "Vedi", + "Model extraction": "Estrazione del modello", + "Whether the model has pitch guidance (1: yes, 0: no):": "Indica se il modello ha una guida di tono (1: sì, 0: no):", + "Extract": "Estrai", + "Export Onnx": "Esporta Onnx", + "RVC Model Path:": "Percorso del modello RVC:", + "Onnx Export Path:": "Percorso di esportazione:", + "MoeVS Model": "Modello MoeVS", + "Export Onnx Model": "Esporta modello", + "Load model": "Carica modello", + "Hubert Model": "Modello Hubert", + "Select the .pth file": "Seleziona il file .pth", + "Select the .index file": "Seleziona il file .index", + "Select the .npy file": "Seleziona il file .npy", + "Input device": "Dispositivo di input", + "Output device": "Dispositivo di output", + "Audio device (please use the same type of driver)": "Dispositivo audio (utilizzare lo stesso tipo di dispositivo)", + "Response threshold": "Soglia di risposta", + "Pitch settings": "Impostazioni di tonalità (pitch)", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Indica se i nomi delle note devono essere utilizzati al posto del loro valore di hertz. AD ESEMPIO, [C5, D6] anziché [523,25, 1174,66]Hz", + "Index Rate": "Tasso dell'indice", + "General settings": "Impostazioni generali", + "Sample length": "Lunghezza campione", + "Fade length": "Lunghezza sbiadimento/fade", + "Extra inference time": "Tempo di inferenza aggiuntivo", + "Input noise reduction": "Riduzione del rumore in ingresso", + "Output noise reduction": "Riduzione del rumore in uscita", + "Performance settings": "Impostazioni delle prestazioni", + "Start audio conversion": "Avvia conversione audio", + "Stop audio conversion": "Interrompi la conversione audio", + "Inference time (ms):": "Tempo di inferenza (ms):", + "Select the pth file": "Seleziona il file .pth", + "Select the .index file:": "Seleziona il file .index", + "The hubert model path must not contain Chinese characters": "Il percorso del modello hubert non deve contenere caratteri cinesi", + "The pth file path must not contain Chinese characters.": "Il percorso del file pth non deve contenere caratteri cinesi.", + "The index file path must not contain Chinese characters.": "Il percorso del file index non deve contenere caratteri cinesi.", + "Step algorithm": "Algoritmo dei passi", + "Number of epoch processes": "Numero di processi dell'epoch", + "Lowest points export": "Esportazione dei punti più bassi", + "How many lowest points to save:": "Quanti punti bassi vuoi salvare:", + "Export lowest points of a model": "Esporta i punti più bassi di un modello", + "Output models:": "Modelli di uscita:", + "Stats of selected models:": "Statistiche dei modelli selezionati:", + "Custom f0 [Root pitch] File": "File personalizzato f0 [Root pitch]", + "Min pitch:": "Tonalità minima:", + "Feature search database file path:": "Percorso del file del database di ricerca delle caratteristiche:", + "Specify minimal pitch for inference [HZ]": "Specificare tonalità minima per l'inferenza [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Specificare tonalità minima per l'inferenza [NOTA][OTTAVA]", + "Max pitch:": "Tonalità massima:", + "Specify max pitch for inference [HZ]": "Specificare tonalità massima per l'inferenza [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Specificare tonalità massima per l'inferenza [NOTA][OTTAVA]", + "Browse presets for formanting": "Sfoglia i preset per il formante", + "Presets are located in formantshiftcfg/ folder": "I preset si trovano nella cartella /formantshiftcfg/", + "Default value is 1.0": "Il valore di default è 1.0", + "Quefrency for formant shifting": "Frequenza per spostamento formanti", + "Timbre for formant shifting": "Timbro per il format shifting", + "Apply": "Applica", + "Single": "Singola", + "Batch": "Batch", + "Separate YouTube tracks": "Separa tracce di YouTube", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Scarica l'audio di un video da YouTube e separa automaticamente le tracce vocali e strumentali.", + "Extra": "Altro", + "Merge": "Unisci", + "Merge your generated audios with the instrumental": "Combina i tuoi audio generati con la base strumentale", + "Choose your instrumental:": "Scegli la base strumentale:", + "Choose the generated audio:": "Scegli l'audio generato:", + "Combine": "Combina", + "Download and Separate": "Scaricare e separare", + "Enter the YouTube link:": "Inserisci il link di YouTube:", + "This section contains some extra utilities that often may be in experimental phases": "Questa sezione contiene alcune utility aggiuntive che spesso possono essere in fase sperimentale", + "Merge Audios": "Unisci audio", + "Audio files have been moved to the 'audios' folder.": "I file audio sono stati spostati nella cartella 'audios'.", + "Downloading audio from the video...": "Scaricamento audio del video in corso...", + "Audio downloaded!": "Audio scaricato!", + "An error occurred:": "Si è verificato un errore:", + "Separating audio...": "Separazione audio in corso...", + "File moved successfully.": "Il file è stato spostato correttamente", + "Finished!": "Finito!", + "The source file does not exist.": "Il file sorgente non esiste.", + "Error moving the file:": "Errore durante lo spostamento del file:", + "Downloading {name} from drive": "Download di {name} da Google Drive", + "The attempt to download using Drive didn't work": "Il tentativo di download con Drive non ha funzionato", + "Error downloading the file: {str(e)}": "Errore durante il download del file: {str(e)}", + "Downloading {name} from mega": "Download di {name} da MEGA", + "Downloading {name} from basic url": "Download di {name} dall'URL di base", + "Download Audio": "Scarica Audio", + "Download audios of any format for use in inference (recommended for mobile users).": "Scarica audio di qualsiasi formato per l'uso in inferenza (consigliato per utenti mobili).", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Qualsiasi post-conversione di ConnectionResetErrors è irrilevante e puramente visiva; può essere ignorata.", + "Processed audio saved at: ": "Audio elaborato salvato in:", + "Conversion complete!": "Conversione completata", + "Reverb": "Riverbero", + "Compressor": "Compressore", + "Noise Gate": "Riduzione del Rumore", + "Volume": "Volume", + "Drag the audio here and click the Refresh button": "Trascina l'audio qui e fai clic sul pulsante Aggiorna", + "Select the generated audio": "Seleziona l'audio generato", + "Volume of the instrumental audio:": "Volume della base strumentale:", + "Volume of the generated audio:": "Volume dell'audio generato:", + "### Audio settings:": "### Impostazioni audio:", + "### Instrumental settings:": "### Impostazioni base strumentale:", + "### Add the effects:": "### Aggiungi gli effetti:", + "Name for saving": "Nome salvataggio", + "Path to model": "Percorso al modello", + "Model information to be placed": "Informazioni sul modello da modificare", + "Starting audio conversion... (This might take a moment)": "Avvio conversione audio... (Questo potrebbe richiedere un po' di tempo)", + "TTS Model:": "Voci TTS", + "TTS": "TTS", + "TTS Method:": "Metodo TTS", + "Audio TTS:": "Audio TTS:", + "Audio RVC:": "Modello Audio" +} diff --git a/assets/i18n/langs/pt_PT.json b/assets/i18n/langs/pt_PT.json new file mode 100644 index 000000000..1a08dded1 --- /dev/null +++ b/assets/i18n/langs/pt_PT.json @@ -0,0 +1,247 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Infelizmente, não há GPU compatível disponível para apoiar o seu treinamento.", + "Yes": "Sim", + "Select your dataset:": "Selecione seu conjunto de dados.", + "Update list": "Lista de atualização.", + "Download Model": "Baixar modelo", + "Download Backup": "Baixar cópia de segurança", + "Download Dataset": "Baixar conjunto de dados", + "Download": "Download", + "Url:": "URL:", + "Build the index before saving.": "Crie o índice antes de salvar.", + "Save your model once the training ends.": "Salve seu modelo quando o treinamento terminar.", + "Save type": "Salvar tipo", + "Save model": "Salvar modelo", + "Choose the method": "Escolha o método", + "Save all": "Salvar tudo", + "Save D and G": "Salve D e G", + "Save voice": "Salvar voz", + "Downloading the file: ": "Baixando o arquivo:", + "Stop training": "Pare de treinar", + "Too many users have recently viewed or downloaded this file": "Muitos usuários visualizaram ou baixaram este arquivo recentemente", + "Cannot get file from this private link": "Não é possível obter o arquivo deste link privado", + "Full download": "Download completo", + "An error occurred downloading": "Ocorreu um erro ao baixar", + "Model saved successfully": "Modelo salvo com sucesso", + "Saving the model...": "Salvando o modelo...", + "Saved without index...": "Salvo sem índice...", + "model_name": "nome_modelo", + "Saved without inference model...": "Salvo sem modelo de inferência...", + "An error occurred saving the model": "Ocorreu um erro ao salvar o modelo", + "The model you want to save does not exist, be sure to enter the correct name.": "O modelo que você deseja salvar não existe, certifique-se de inserir o nome correto.", + "The file could not be downloaded.": "O arquivo não pôde ser baixado.", + "Unzip error.": "Erro ao descompactar.", + "Path to your added.index file (if it didn't automatically find it)": "Caminho para o seu arquivo add.index (se não o encontrou automaticamente)", + "It has been downloaded successfully.": "Ele foi baixado com sucesso.", + "Proceeding with the extraction...": "Prosseguindo com a extração...", + "The Backup has been uploaded successfully.": "O backup foi carregado com sucesso.", + "The Dataset has been loaded successfully.": "O conjunto de dados foi carregado com sucesso.", + "The Model has been loaded successfully.": "O modelo foi carregado com sucesso.", + "It is used to download your inference models.": "Ele é usado para baixar seus modelos de inferência.", + "It is used to download your training backups.": "Ele é usado para baixar seus backups de treinamento.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Baixe o conjunto de dados com os áudios em formato compatível (.wav/.flac) para treinar seu modelo.", + "No relevant file was found to upload.": "Nenhum arquivo relevante foi encontrado para upload.", + "The model works for inference, and has the .index file.": "O modelo funciona para inferência e possui o arquivo .index.", + "The model works for inference, but it doesn't have the .index file.": "O modelo funciona para inferência, mas não possui o arquivo .index.", + "This may take a few minutes, please wait...": "Isso pode levar alguns minutos, aguarde...", + "Resources": "Recursos", + "Step 1: Processing data": "Etapa 1: Processamento de dados", + "Step 2: Skipping pitch extraction": "Passo 2a: Ignorando a extração do tom", + "Step 3: Extracting features": "Etapa 2b: Extraindo recursos", + "Step 4: Model training started": "Etapa 3a: treinamento do modelo iniciado", + "Step 5: Export lowest points on a graph of the model": "Etapa 4: Exportar os pontos mais baixos em um gráfico do modelo", + "Training is done, check train.log": "O treinamento foi concluído, verifique train.log", + "All processes have been completed!": "Todos os processos foram concluídos!", + "Model Inference": "Inferência de modelo", + "Inferencing voice:": "Inferência de voz:", + "Model_Name": "Nome_modelo", + "Dataset_Name": "Conjunto de dados_Nome", + "Whether the model has pitch guidance.": "Se o modelo tem orientação de pitch.", + "Whether to save only the latest .ckpt file to save hard drive space": "Se deseja salvar apenas o arquivo .ckpt mais recente para economizar espaço no disco rígido", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Armazene em cache todos os conjuntos de treinamento na memória da GPU. Armazenar pequenos conjuntos de dados em cache (menos de 10 minutos) pode acelerar o treinamento", + "Save a small final model to the 'weights' folder at each save point": "Salve um pequeno modelo final na pasta 'pesos' em cada ponto de salvamento", + "Refresh": "Atualizar lista de voz, caminho de índice e arquivos de áudio", + "Unload voice to save GPU memory": "Descarregue a voz para economizar memória da GPU:", + "Select Speaker/Singer ID:": "Selecione o ID do palestrante/cantor:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Chave recomendada +12 para conversão de homem para mulher e chave -12 para conversão de mulher para homem. Se o alcance do som for muito longe e a voz estiver distorcida, você também poderá ajustá-lo para o alcance apropriado.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Transpor (inteiro, número de semitons, aumentar uma oitava: 12, diminuir uma oitava: -12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "Digite o caminho do arquivo de áudio a ser processado (o padrão é o exemplo de formato correto):", + "Select the pitch extraction algorithm:": "Selecione o algoritmo de extração de pitch:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Comprimento do salto do Mangio-Crepe (aplica-se apenas ao mangio-crepe): A duração do salto refere-se ao tempo que leva para o locutor saltar para um tom dramático. Comprimentos de salto mais baixos levam mais tempo para serem inferidos, mas são mais precisos no tom.", + "Feature search dataset file path": "Caminho do arquivo do conjunto de dados de pesquisa de recursos", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Se >=3: aplique filtragem mediana aos resultados de pitch colhidos. O valor representa o raio do filtro e pode reduzir a soprosidade.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Caminho para o arquivo de índice de recursos. Deixe em branco para usar o resultado selecionado no menu suspenso:", + "Auto-detect index path and select from the dropdown:": "Detecte automaticamente o caminho do índice e selecione no menu suspenso", + "Path to feature file:": "Caminho para o arquivo de recurso:", + "Search feature ratio:": "Proporção de recursos de pesquisa:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Faça uma nova amostragem do áudio de saída no pós-processamento para a taxa de amostragem final. Defina como 0 para nenhuma reamostragem:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Use o envelope de volume da entrada para substituir ou mixar com o envelope de volume da saída. Quanto mais próxima a proporção estiver de 1, mais o envelope de saída será usado:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Proteja consoantes surdas e sons respiratórios para evitar artefatos como lacrimejamento na música eletrônica. Defina como 0,5 para desativar. Diminua o valor para aumentar a proteção, mas poderá reduzir a precisão da indexação:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "Arquivo de curva F0 (opcional). Um tom por linha. Substitui o F0 padrão e a modulação de pitch:", + "Convert": "Converter", + "Output information:": "Informações de saída", + "Export audio (click on the three dots in the lower right corner to download)": "Exportar áudio (clique nos três pontos no canto inferior direito para fazer o download)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Conversão em lote. Entre na pasta que contém os arquivos de áudio a serem convertidos ou carregue vários arquivos de áudio. O áudio convertido será enviado para a pasta especificada (padrão: 'opt').", + "Specify output folder:": "Especifique a pasta de saída:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Digite o caminho da pasta de áudio a ser processada (copie-o da barra de endereço do gerenciador de arquivos):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Você também pode inserir arquivos de áudio em lotes. Escolha uma das duas opções. É dada prioridade à leitura da pasta.", + "Export file format": "Exportar formato de arquivo", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "Digite o caminho da pasta de áudio a ser processada:", + "Model": "Modelo", + "Vocal Extraction Aggressive": "Extração Vocal Agressiva", + "Specify the output folder for vocals:": "Especifique a pasta de saída para vocais:", + "Specify the output folder for accompaniment:": "Especifique a pasta de saída para acompanhamento:", + "Train": "Trem", + "Enter the model name:": "Digite o nome do modelo:", + "Target sample rate:": "Taxa de amostragem desejada:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Se o modelo possui orientação de tom (obrigatório para canto, opcional para fala):", + "Version": "Versão", + "Number of CPU processes:": "Número de processos de CPU usados ​​para extração de pitch e processamento de dados:", + "Enter the path of the training folder:": "Digite o caminho da pasta de treinamento:", + "Specify the model ID:": "Especifique o ID do modelo:", + "Auto detect audio path and select from the dropdown:": "Detecte automaticamente o caminho de áudio e selecione no menu suspenso:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Adicione o nome do áudio ao caminho do arquivo de áudio a ser processado (o padrão é o exemplo de formato correto) Remova o caminho para usar um áudio da lista suspensa:", + "Advanced Settings": "Configurações avançadas", + "Settings": "Configurações", + "Status:": "Status:", + "Process data": "Processar dados", + "Drag your audio here:": "Arraste seu áudio aqui", + "Or record an audio:": "Ou grave um áudio.", + "Formant shift inference audio": "Áudio de inferência de mudança de formante", + "Used for male to female and vice-versa conversions": "Usado para conversões de homem para mulher e vice-versa", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Forneça os índices de GPU separados por '-', como 0-1-2 para usar GPUs 0, 1 e 2:", + "GPU Information:": "Informações da GPU", + "Feature extraction": "Extração de recursos", + "Save frequency:": "Salvar frequência:", + "Training epochs:": "Épocas de treinamento:", + "Batch size per GPU:": "Tamanho do lote por GPU:", + "Save only the latest '.ckpt' file to save disk space:": "Salve apenas o arquivo '.ckpt' mais recente para economizar espaço em disco:", + "No": "Não", + "Save a small final model to the 'weights' folder at each save point:": "Salve um pequeno modelo final na pasta 'pesos' em cada ponto de salvamento:", + "Load pre-trained base model G path:": "Carregar caminho G do modelo base pré-treinado:", + "Load pre-trained base model D path:": "Carregar caminho D do modelo base pré-treinado:", + "Train model": "Modelo de trem", + "Train feature index": "Índice de recursos de trem", + "One-click training": "Treinamento com um clique", + "Processing": "Em processamento", + "Model fusion, can be used to test timbre fusion": "Fusão de modelos, pode ser usada para testar a fusão de timbres", + "Path to Model A:": "Caminho para o modelo A:", + "Path to Model B:": "Caminho para o modelo B:", + "Weight for Model A:": "Peso para o Modelo A:", + "Whether the model has pitch guidance:": "Se o modelo tem orientação de pitch:", + "Model information to be placed:": "Informações do modelo a ser colocado:", + "Model architecture version:": "Versão da arquitetura do modelo:", + "Fusion": "Fusão", + "Modify model information": "Modificar informações do modelo", + "Path to Model:": "Caminho para o modelo:", + "Model information to be modified:": "Informações do modelo a serem modificadas:", + "Save file name:": "Salvar nome do arquivo:", + "Modify": "Modificar", + "View model information": "Ver informações do modelo", + "View": "Visualizar", + "Model extraction": "Extração de modelo (insira o caminho do modelo de arquivo grande na pasta 'logs'). Isso é útil se você quiser interromper o treinamento no meio e extrair e salvar manualmente um arquivo de modelo pequeno, ou se quiser testar um modelo intermediário:", + "Name:": "Salvar nome:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Se o modelo possui orientação de pitch (1: sim, 0: não):", + "Extract": "Extrair", + "Export Onnx": "Exportar Onnx", + "RVC Model Path:": "Caminho do modelo RVC:", + "Onnx Export Path:": "Caminho de exportação Onnx:", + "MoeVS Model": "Modelo MoeVS", + "Export Onnx Model": "Exportar modelo Onnx", + "Load model": "Modelo de carga", + "Hubert Model": "Modelo Hubert", + "Select the .pth file": "Selecione o arquivo .pth", + "Select the .index file": "Selecione o arquivo .index", + "Select the .npy file": "Selecione o arquivo .npy", + "Input device": "Dispositivo de entrada", + "Output device": "Dispositivo de saída", + "Audio device (please use the same type of driver)": "Dispositivo de áudio (use o mesmo tipo de driver)", + "Response threshold": "Limite de resposta", + "Pitch settings": "Configurações de tom", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Se deve usar nomes de notas em vez de seu valor em hertz. POR EXEMPLO. [C5, D6] em vez de [523,25, 1174,66] Hz", + "Index Rate": "Taxa de índice", + "General settings": "Configurações Gerais", + "Sample length": "Comprimento da amostra", + "Fade length": "Comprimento do esmaecimento", + "Extra inference time": "Tempo extra de inferência", + "Input noise reduction": "Redução de ruído de entrada", + "Output noise reduction": "Redução de ruído de saída", + "Performance settings": "Configurações de desempenho", + "Start audio conversion": "Iniciar conversão de áudio", + "Stop audio conversion": "Pare a conversão de áudio", + "Inference time (ms):": "Tempo de inferência (ms):", + "Select the pth file": "Selecione o arquivo pth", + "Select the .index file:": "Selecione o arquivo de índice", + "The hubert model path must not contain Chinese characters": "O caminho do modelo Hubert não deve conter caracteres chineses", + "The pth file path must not contain Chinese characters.": "O caminho do arquivo pth não deve conter caracteres chineses.", + "The index file path must not contain Chinese characters.": "O caminho do arquivo de índice não deve conter caracteres chineses.", + "Step algorithm": "Algoritmo de etapas", + "Number of epoch processes": "Número de processos de época", + "Lowest points export": "Exportação de pontos mais baixos", + "How many lowest points to save:": "Quantos pontos mais baixos salvar", + "Export lowest points of a model": "Exportar os pontos mais baixos de um modelo", + "Output models:": "Modelos de saída", + "Stats of selected models:": "Estatísticas dos modelos selecionados", + "Custom f0 [Root pitch] File": "Arquivo f0 [inclinação da raiz] personalizado", + "Min pitch:": "Passo mínimo", + "Specify minimal pitch for inference [HZ]": "Especifique o tom mínimo para inferência [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Especifique o tom mínimo para inferência [NOTA][OCTAVE]", + "Max pitch:": "Tom máximo", + "Specify max pitch for inference [HZ]": "Especifique o tom máximo para inferência [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Especifique o tom máximo para inferência [NOTE][OCTAVE]", + "Browse presets for formanting": "Procure predefinições para formatação", + "Presets are located in formantshiftcfg/ folder": "As predefinições estão localizadas na pasta formantshiftcfg/", + "Default value is 1.0": "O valor padrão é 1,0", + "Quefrency for formant shifting": "Quefrency para mudança de formantes", + "Timbre for formant shifting": "Timbre para mudança de formantes", + "Apply": "Aplicar", + "Single": "Solteiro", + "Batch": "Lote", + "Separate YouTube tracks": "Faixas separadas do YouTube", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Baixe o áudio de um vídeo do YouTube e separe automaticamente as faixas vocais e instrumentais", + "Extra": "Extra", + "Merge": "Mesclar", + "Merge your generated audios with the instrumental": "Mescle seus áudios gerados com o instrumental", + "Choose your instrumental:": "Escolha seu instrumental", + "Choose the generated audio:": "Escolha o áudio gerado", + "Combine": "Combinar", + "Download and Separate": "Baixe e separe", + "Enter the YouTube link:": "Digite o link do youtube", + "This section contains some extra utilities that often may be in experimental phases": "Esta seção contém alguns utilitários extras que muitas vezes podem estar em fases experimentais", + "Merge Audios": "Mesclar áudios", + "Audio files have been moved to the 'audios' folder.": "Os arquivos de áudio foram movidos para a pasta ‘audios’.", + "Downloading audio from the video...": "Baixando o áudio do vídeo...", + "Audio downloaded!": "Baixar áudio!", + "An error occurred:": "Um erro ocorreu:", + "Separating audio...": "Separando áudio...", + "File moved successfully.": "Arquivo movido com sucesso.", + "Finished!": "Finalizado!", + "The source file does not exist.": "O arquivo de origem não existe.", + "Error moving the file:": "Erro ao mover o arquivo:", + "Downloading {name} from drive": "Baixando {name} da unidade", + "The attempt to download using Drive didn't work": "A tentativa de download usando o Drive não funcionou", + "Error downloading the file: {str(e)}": "Erro ao baixar o arquivo: {str(e)}", + "Downloading {name} from mega": "Baixando {nome} do mega", + "Downloading {name} from basic url": "Baixando {nome} do URL básico", + "Download Audio": "Baixar áudio", + "Download audios of any format for use in inference (recommended for mobile users).": "Baixe áudios de qualquer formato para uso em inferência (recomendado para usuários móveis)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Qualquer ConnectionResetErrors pós-conversão é irrelevante e puramente visual; eles podem ser ignorados.", + "Processed audio saved at: ": "Áudio processado salvo em:", + "Conversion complete!": "Conversão concluída!", + "Reverb": "Ressonância", + "Compressor": "Compressor", + "Noise Gate": "Portão de Ruído", + "Volume": "Volume", + "Drag the audio here and click the Refresh button": "Arraste o áudio aqui e clique no botão Atualizar", + "Select the generated audio": "Selecione o áudio gerado", + "Volume of the instrumental audio:": "Volume do áudio instrumental", + "Volume of the generated audio:": "Volume do áudio gerado", + "### Add the effects": "### Adicione os efeitos", + "Starting audio conversion... (This might take a moment)": "Iniciando a conversão de áudio... (Isso pode levar um tempo)", + "TTS Model:": "Vozes TTS", + "TTS": "TTS", + "TTS Method:": "Método TTS", + "Audio TTS:": "Áudio TTS", + "Audio RVC:": "Modelo de Áudio" +} diff --git a/assets/i18n/langs/ru_RU.json b/assets/i18n/langs/ru_RU.json new file mode 100644 index 000000000..dc4990659 --- /dev/null +++ b/assets/i18n/langs/ru_RU.json @@ -0,0 +1,247 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "К сожалению, для вашего обучения не существует совместимого графического процессора.", + "Yes": "Да", + "Select your dataset:": "Выберите свой набор данных.", + "Update list": "Обновить список.", + "Download Model": "Скачать модель", + "Download Backup": "Скачать резервную копию", + "Download Dataset": "Скачать набор данных", + "Download": "Скачать", + "Url:": "URL:", + "Build the index before saving.": "Создайте индекс перед сохранением.", + "Save your model once the training ends.": "Сохраните свою модель после окончания обучения.", + "Save type": "Тип сохранения", + "Save model": "Сохранить модель", + "Choose the method": "Выберите метод", + "Save all": "Сохранить все", + "Save D and G": "Спасите D и G", + "Save voice": "Сохранить голос", + "Downloading the file: ": "Скачиваем файл:", + "Stop training": "Прекратить тренировку", + "Too many users have recently viewed or downloaded this file": "Слишком много пользователей недавно просмотрели или скачали этот файл.", + "Cannot get file from this private link": "Невозможно получить файл по этой частной ссылке", + "Full download": "Полная загрузка", + "An error occurred downloading": "Произошла ошибка при загрузке", + "Model saved successfully": "Модель успешно сохранена", + "Saving the model...": "Сохраняем модель...", + "Saved without index...": "Сохранено без индекса...", + "model_name": "название модели", + "Saved without inference model...": "Сохранено без модели вывода...", + "An error occurred saving the model": "Произошла ошибка при сохранении модели.", + "The model you want to save does not exist, be sure to enter the correct name.": "Модель, которую вы хотите сохранить, не существует. Обязательно введите правильное имя.", + "The file could not be downloaded.": "Не удалось загрузить файл.", + "Unzip error.": "Ошибка разархивирования.", + "Path to your added.index file (if it didn't automatically find it)": "Путь к файлу add.index (если он не был найден автоматически)", + "It has been downloaded successfully.": "Он был успешно загружен.", + "Proceeding with the extraction...": "Приступаем к извлечению...", + "The Backup has been uploaded successfully.": "Резервная копия успешно загружена.", + "The Dataset has been loaded successfully.": "Набор данных успешно загружен.", + "The Model has been loaded successfully.": "Модель успешно загружена.", + "It is used to download your inference models.": "Он используется для загрузки ваших моделей вывода.", + "It is used to download your training backups.": "Он используется для загрузки резервных копий тренировок.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Загрузите набор данных со звуками в совместимом формате (.wav/.flac), чтобы обучить свою модель.", + "No relevant file was found to upload.": "Не найден соответствующий файл для загрузки.", + "The model works for inference, and has the .index file.": "Модель работает для вывода и имеет файл .index.", + "The model works for inference, but it doesn't have the .index file.": "Модель работает для вывода, но у нее нет файла .index.", + "This may take a few minutes, please wait...": "Это может занять несколько минут, пожалуйста, подождите...", + "Resources": "Ресурсы", + "Step 1: Processing data": "Шаг 1: Обработка данных", + "Step 2: Skipping pitch extraction": "Шаг 2а: Пропуск извлечения высоты тона", + "Step 3: Extracting features": "Шаг 2б: Извлечение объектов", + "Step 4: Model training started": "Шаг 3а: Начало обучения модели", + "Step 5: Export lowest points on a graph of the model": "Шаг 4. Экспортируйте самые низкие точки на графике модели.", + "Training is done, check train.log": "Обучение завершено, проверьте train.log", + "All processes have been completed!": "Все процессы завершены!", + "Model Inference": "Вывод модели", + "Inferencing voice:": "Выводящий голос:", + "Model_Name": "Название модели", + "Dataset_Name": "Имя_набора данных", + "Whether the model has pitch guidance.": "Имеет ли модель наведение по тангажу.", + "Whether to save only the latest .ckpt file to save hard drive space": "Сохранять ли только последний файл .ckpt для экономии места на жестком диске", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Кэшируйте все обучающие наборы в память графического процессора. Кэширование небольших наборов данных (менее 10 минут) может ускорить обучение.", + "Save a small final model to the 'weights' folder at each save point": "Сохраняйте небольшую окончательную модель в папке «веса» в каждой точке сохранения.", + "Refresh": "Обновить список голосов, индексный путь и аудиофайлы.", + "Unload voice to save GPU memory": "Выгрузите голос, чтобы сэкономить память графического процессора:", + "Select Speaker/Singer ID:": "Выберите идентификатор докладчика/певца:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Рекомендуемый ключ +12 для преобразования мужчины в женщину и ключ -12 для преобразования женщины в мужчину. Если звуковой диапазон заходит слишком далеко и голос искажается, вы также можете самостоятельно настроить его на соответствующий диапазон.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Транспонирование (целое число, количество полутонов, повышение на октаву: 12, понижение на октаву: -12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "Введите путь к аудиофайлу, который необходимо обработать (по умолчанию — правильный пример формата):", + "Select the pitch extraction algorithm:": "Выберите алгоритм извлечения высоты звука:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Длина прыжка с манжио-крепом (применяется только к крепу с манжио): длина прыжка означает время, необходимое говорящему, чтобы перейти на драматический тон. Для определения более низкой длины скачка требуется больше времени, но они более точны по высоте.", + "Feature search dataset file path": "Путь к файлу набора данных поиска объектов", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Если >=3: применить медианную фильтрацию к собранным результатам высоты тона. Значение представляет собой радиус фильтра и может уменьшить одышку.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Путь к индексному файлу объекта. Оставьте поле пустым, чтобы использовать выбранный результат из раскрывающегося списка:", + "Auto-detect index path and select from the dropdown:": "Автоматическое определение пути к индексу и выбор из раскрывающегося списка.", + "Path to feature file:": "Путь к файлу объекта:", + "Search feature ratio:": "Соотношение функций поиска:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Повторно дискретизируйте выходной звук при постобработке до окончательной частоты дискретизации. Установите значение 0, чтобы не выполнять повторную выборку:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Используйте огибающую громкости входа для замены или смешивания с огибающей громкости выхода. Чем ближе соотношение к 1, тем больше используется выходная огибающая:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Защищайте глухие согласные и звуки дыхания, чтобы предотвратить появление таких артефактов, как разрывы в электронной музыке. Установите значение 0,5, чтобы отключить. Уменьшите значение, чтобы повысить защиту, но это может снизить точность индексации:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "Файл кривой F0 (опционально). Один шаг на строку. Заменяет стандартную F0 и модуляцию высоты тона:", + "Convert": "Конвертировать", + "Output information:": "Выходная информация", + "Export audio (click on the three dots in the lower right corner to download)": "Экспортируйте аудио (нажмите на три точки в правом нижнем углу, чтобы загрузить)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Пакетное преобразование. Введите папку, содержащую аудиофайлы, которые нужно преобразовать, или загрузите несколько аудиофайлов. Конвертированный звук будет выводиться в указанную папку (по умолчанию: «opt»).", + "Specify output folder:": "Укажите выходную папку:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "Введите путь к папке аудио, подлежащей обработке (скопируйте его из адресной строки файлового менеджера):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Вы также можете вводить аудиофайлы в пакетном режиме. Выберите один из двух вариантов. Приоритет отдается чтению из папки.", + "Export file format": "Формат файла экспорта", + "UVR5": "УВР5", + "Enter the path of the audio folder to be processed:": "Введите путь к аудиопапке, которую необходимо обработать:", + "Model": "Модель", + "Vocal Extraction Aggressive": "Извлечение вокала агрессивное", + "Specify the output folder for vocals:": "Укажите выходную папку для вокала:", + "Specify the output folder for accompaniment:": "Укажите выходную папку для аккомпанемента:", + "Train": "Тренироваться", + "Enter the model name:": "Введите название модели:", + "Target sample rate:": "Целевая частота дискретизации:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Имеет ли модель управление высотой тона (обязательно для пения, необязательно для речи):", + "Version": "Версия", + "Number of CPU processes:": "Количество процессов ЦП, используемых для извлечения высоты звука и обработки данных:", + "Enter the path of the training folder:": "Введите путь к папке обучения:", + "Specify the model ID:": "Пожалуйста, укажите идентификатор модели:", + "Auto detect audio path and select from the dropdown:": "Автоматическое определение пути аудио и выбор из раскрывающегося списка:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Добавьте имя аудио к пути к обрабатываемому аудиофайлу (по умолчанию используется правильный пример формата). Удалите путь для использования аудио из раскрывающегося списка:", + "Advanced Settings": "Расширенные настройки", + "Settings": "Настройки", + "Status:": "Положение дел", + "Process data": "Данные обработки", + "Drag your audio here:": "Перетащите сюда свой аудиофайл и нажмите кнопку «Обновить».", + "Or record an audio:": "Или записать звук.", + "Formant shift inference audio": "Звук вывода формантного сдвига", + "Used for male to female and vice-versa conversions": "Используется для преобразования мужского и женского пола и наоборот.", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "Укажите индексы графического процессора, разделенные знаком «-», например 0-1-2, для использования графических процессоров 0, 1 и 2:", + "GPU Information:": "Информация о графическом процессоре", + "Feature extraction": "Извлечение признаков", + "Save frequency:": "Частота сохранения:", + "Training epochs:": "Эпохи обучения:", + "Batch size per GPU:": "Размер пакета на графический процессор:", + "Save only the latest '.ckpt' file to save disk space:": "Сохраните только последний файл «.ckpt», чтобы сэкономить место на диске:", + "No": "Нет", + "Save a small final model to the 'weights' folder at each save point:": "Сохраните небольшую окончательную модель в папке «веса» в каждой точке сохранения:", + "Load pre-trained base model G path:": "Загрузите предварительно обученную базовую модель G-путь:", + "Load pre-trained base model D path:": "Загрузите путь D предварительно обученной базовой модели:", + "Train model": "Модель поезда", + "Train feature index": "Индекс характеристик поезда", + "One-click training": "Обучение в один клик", + "Processing": "Обработка", + "Model fusion, can be used to test timbre fusion": "Модель Fusion, можно использовать для проверки синтеза тембров.", + "Path to Model A:": "Путь к модели А:", + "Path to Model B:": "Путь к модели Б:", + "Weight for Model A:": "Вес модели А:", + "Whether the model has pitch guidance:": "Имеет ли модель наведение по тангажу:", + "Model information to be placed:": "Информация о модели, которую необходимо разместить:", + "Model architecture version:": "Версия архитектуры модели:", + "Fusion": "Слияние", + "Modify model information": "Изменить информацию о модели", + "Path to Model:": "Путь к модели:", + "Model information to be modified:": "Информация о модели, которую необходимо изменить:", + "Save file name:": "Имя файла сохранения:", + "Modify": "Изменить", + "View model information": "Просмотр информации о модели", + "View": "Вид", + "Model extraction": "Извлечение модели (введите путь к модели большого файла в папке «logs»). Это полезно, если вы хотите остановить обучение на полпути и вручную извлечь и сохранить небольшой файл модели или если вы хотите протестировать промежуточную модель:", + "Name:": "Сохранить имя:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Имеет ли модель управление по тангажу (1: да, 0: нет):", + "Extract": "Извлекать", + "Export Onnx": "Экспортировать Onnx", + "RVC Model Path:": "Путь модели RVC:", + "Onnx Export Path:": "Путь экспорта Onnx:", + "MoeVS Model": "Модель МоэВС", + "Export Onnx Model": "Экспорт модели Onnx", + "Load model": "Загрузить модель", + "Hubert Model": "Хьюберт Модель", + "Select the .pth file": "Выберите файл .pth.", + "Select the .index file": "Выберите файл .index.", + "Select the .npy file": "Выберите файл .npy.", + "Input device": "Устройство ввода", + "Output device": "Устройство вывода", + "Audio device (please use the same type of driver)": "Аудиоустройство (пожалуйста, используйте драйвер того же типа)", + "Response threshold": "Порог ответа", + "Pitch settings": "Настройки высоты тона", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Использовать ли названия нот вместо их значения в герцах. НАПРИМЕР. [C5, D6] вместо [523,25, 1174,66] Гц", + "Index Rate": "Индексная ставка", + "General settings": "Общие настройки", + "Sample length": "Длина образца", + "Fade length": "Длина затухания", + "Extra inference time": "Дополнительное время вывода", + "Input noise reduction": "Снижение входного шума", + "Output noise reduction": "Снижение выходного шума", + "Performance settings": "Настройки производительности", + "Start audio conversion": "Начать преобразование аудио", + "Stop audio conversion": "Остановить преобразование аудио", + "Inference time (ms):": "Время вывода (мс):", + "Select the pth file": "Выберите pth-файл", + "Select the .index file:": "Выберите индексный файл", + "The hubert model path must not contain Chinese characters": "Путь модели Хьюберта не должен содержать китайские символы.", + "The pth file path must not contain Chinese characters.": "Путь к файлу pth не должен содержать китайских символов.", + "The index file path must not contain Chinese characters.": "Путь к индексному файлу не должен содержать китайских символов.", + "Step algorithm": "Пошаговый алгоритм", + "Number of epoch processes": "Количество эпохальных процессов", + "Lowest points export": "Экспорт наименьших баллов", + "How many lowest points to save:": "Сколько самых низких баллов нужно сохранить", + "Export lowest points of a model": "Экспортировать самые низкие точки модели", + "Output models:": "Выходные модели", + "Stats of selected models:": "Статистика выбранных моделей", + "Custom f0 [Root pitch] File": "Пользовательский файл f0 [Шаг основного тона]", + "Min pitch:": "Минимальный шаг", + "Specify minimal pitch for inference [HZ]": "Укажите минимальный шаг для вывода [Гц]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Укажите минимальный шаг для вывода [NOTE][OCTAVE]", + "Max pitch:": "Максимальный шаг", + "Specify max pitch for inference [HZ]": "Укажите максимальную высоту звука для вывода [Гц]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Укажите максимальный шаг для вывода [ПРИМЕЧАНИЕ][ОКТАВА]", + "Browse presets for formanting": "Просмотр пресетов для форматирования", + "Presets are located in formantshiftcfg/ folder": "Пресеты находятся в папке formantshiftcfg/.", + "Default value is 1.0": "Значение по умолчанию — 1,0.", + "Quefrency for formant shifting": "Quefrency для сдвига форманты", + "Timbre for formant shifting": "Тембр для смещения форманты", + "Apply": "Применять", + "Single": "Одинокий", + "Batch": "Партия", + "Separate YouTube tracks": "Отдельные треки YouTube", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "Загрузите аудио из видео YouTube и автоматически разделите вокальные и инструментальные дорожки.", + "Extra": "Дополнительный", + "Merge": "Объединить", + "Merge your generated audios with the instrumental": "Объедините сгенерированные аудио с инструментальной композицией.", + "Choose your instrumental:": "Выберите свой инструментал", + "Choose the generated audio:": "Выберите сгенерированный звук", + "Combine": "Объединить", + "Download and Separate": "Скачать и отделить", + "Enter the YouTube link:": "Введите ссылку на ютуб", + "This section contains some extra utilities that often may be in experimental phases": "Этот раздел содержит некоторые дополнительные утилиты, которые часто могут находиться на экспериментальной стадии.", + "Merge Audios": "Объединить аудио", + "Audio files have been moved to the 'audios' folder.": "Аудиофайлы перемещены в папку «audios».", + "Downloading audio from the video...": "Загрузка звука из видео...", + "Audio downloaded!": "Аудио скачать!", + "An error occurred:": "Произошла ошибка:", + "Separating audio...": "Разделение звука...", + "File moved successfully.": "Файл успешно перемещен.", + "Finished!": "Законченный!", + "The source file does not exist.": "Исходный файл не существует.", + "Error moving the file:": "Ошибка перемещения файла:", + "Downloading {name} from drive": "Загрузка {name} с диска", + "The attempt to download using Drive didn't work": "Попытка скачать с Диска не удалась.", + "Error downloading the file: {str(e)}": "Ошибка загрузки файла: {str(e)}", + "Downloading {name} from mega": "Скачиваю {name} из мега", + "Downloading {name} from basic url": "Загрузка {name} с основного URL", + "Download Audio": "Скачать аудио", + "Download audios of any format for use in inference (recommended for mobile users).": "Загрузите аудио любого формата для использования в умозаключениях (рекомендуется для мобильных пользователей)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Любые пост-преобразования ConnectionResetErrors не имеют значения и являются чисто визуальными; их можно игнорировать.", + "Processed audio saved at: ": "Обработанный звук сохранен по адресу:", + "Conversion complete!": "Преобразование завершено!", + "Reverb": "Реверберация", + "Compressor": "Компрессор", + "Noise Gate": "Шумовые ворота", + "Volume": "Объем", + "Drag the audio here and click the Refresh button": "Перетащите аудио сюда и нажмите кнопку «Обновить».", + "Select the generated audio": "Выберите сгенерированный звук", + "Volume of the instrumental audio:": "Громкость инструментального звука", + "Volume of the generated audio:": "Громкость сгенерированного звука", + "### Add the effects": "### Добавьте эффекты", + "Starting audio conversion... (This might take a moment)": "Начинается конвертация аудио... (Это может занять некоторое время)", + "TTS Model:": "Голоса TTS", + "TTS": "TTS", + "TTS Method:": "Метод TTS", + "Audio TTS:": "Аудио TTS", + "Audio RVC:": "Аудио Модель" +} diff --git a/assets/i18n/langs/tr_TR.json b/assets/i18n/langs/tr_TR.json new file mode 100644 index 000000000..3175bd8d8 --- /dev/null +++ b/assets/i18n/langs/tr_TR.json @@ -0,0 +1,249 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "Üzgünüz, eğitiminizi desteklemek için uyumlu bir GPU bulunmuyor.", + "Yes": "Evet", + "Select your dataset:": "Veri setinizi seçin:", + "Update list": "Listeyi güncelle.", + "Download Model": "Modeli İndir", + "Download Backup": "Yedeklemeyi İndir", + "Download Dataset": "Veri Setini İndir", + "Download": "İndir", + "Url:": "URL:", + "Build the index before saving.": "Kaydetmeden önce dizini oluşturun.", + "Save your model once the training ends.": "Eğitim sona erdiğinde modelinizi kaydedin.", + "Save type": "Kaydetme türü:", + "Save model": "Modeli Kaydet", + "Choose the method": "Yöntemi seçin", + "Save all": "Hepsini kaydet", + "Save D and G": "D ve G'yi kaydet", + "Save voice": "Sesi kaydet", + "Downloading the file: ": "Dosya indiriliyor: ", + "Stop training": "Eğitimi durdur", + "Too many users have recently viewed or downloaded this file": "Çok sayıda kullanıcı bu dosyayı yakın zamanda görüntüledi veya indirdi", + "Cannot get file from this private link": "Bu özel bağlantıdan dosya alınamıyor", + "Full download": "Tam indirme", + "An error occurred downloading": "İndirme sırasında bir hata oluştu", + "Model saved successfully": "Model başarıyla kaydedildi", + "Saving the model...": "Model kaydediliyor...", + "Saved without index...": "Dizin oluşturulmadan kaydedildi...", + "Saved without inference model...": "Çıkarsama modeli oluşturulmadan kaydedildi...", + "An error occurred saving the model": "Model kaydedilirken bir hata oluştu", + "The model you want to save does not exist, be sure to enter the correct name.": "Kaydetmek istediğiniz model mevcut değil, doğru adı girdiğinizden emin olun.", + "The file could not be downloaded.": "Dosya indirilemedi.", + "Unzip error.": "Sıkıştırılmış dosya açma hatası.", + "Path to your added.index file (if it didn't automatically find it)": "added.index dosyanızın yolu (eğer otomatik olarak bulunmadıysa)", + "It has been downloaded successfully.": "Başarıyla indirildi.", + "Proceeding with the extraction...": "Çıkarma işlemine devam ediliyor...", + "The Backup has been uploaded successfully.": "Yedekleme başarıyla yüklendi.", + "The Dataset has been loaded successfully.": "Veri seti başarıyla yüklendi.", + "The Model has been loaded successfully.": "Model başarıyla yüklendi.", + "It is used to download your inference models.": "Çıkarsama modellerinizi indirmek için kullanılır.", + "It is used to download your training backups.": "Eğitim yedeklemelerinizi indirmek için kullanılır.", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "Modelinizi eğitmek için ses içeren uyumlu bir format (.wav/.flac) ile veri setini indirin.", + "No relevant file was found to upload.": "Yüklemek için ilgili dosya bulunamadı.", + "The model works for inference, and has the .index file.": "Model çıkarsama için çalışır ve .index dosyasına sahiptir.", + "The model works for inference, but it doesn't have the .index file.": "Model çıkarsama için çalışır, ancak .index dosyasına sahip değildir.", + "This may take a few minutes, please wait...": "Bu birkaç dakika sürebilir, lütfen bekleyin...", + "Resources": "Kaynaklar", + "Step 1: Processing data": "Adım 1: Verileri işleme", + "Step 2: Skipping pitch extraction": "Adım 2: Pitch çıkarma atlanıyor", + "Step 3: Extracting features": "Adım 3: Özellik çıkarma", + "Step 4: Model training started": "Adım 4: Model eğitimi başladı", + "Step 5: Export lowest points on a graph of the model": "Adım 5: Modelin grafikteki en düşük noktalarını dışa aktarın", + "Training is done, check train.log": "Eğitim tamamlandı, train.log dosyasını kontrol edin", + "All processes have been completed!": "Tüm işlemler tamamlandı!", + "Model Inference": "Model Çıkarsama", + "Inferencing voice:": "Ses çıkarma:", + "Model_Name": "Model_Adı", + "Dataset_Name": "Veri_Seti_Adı", + "Whether the model has pitch guidance.": "Modelin pitch rehberi olup olmadığı.", + "Whether to save only the latest .ckpt file to save hard drive space": "Sadece en son .ckpt dosyasını kaydetmek için kayıt alanı tasarrufu yapılıp yapılmayacağı", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "Tüm eğitim setlerini GPU belleğine önbelleğe alın. Küçük veri setlerini önbelleğe almak (10 dakikadan az) eğitimi hızlandırabilir.", + "Save a small final model to the 'weights' folder at each save point": "Her kaydetme noktasında 'weights' klasörüne küçük bir nihai modeli kaydedin", + "Refresh": "Ses listesini, dizin yolunu ve ses dosyalarını yenileyin", + "Unload voice to save GPU memory": "GPU belleğini kaydetmek için sesi boşalt", + "Select Speaker/Singer ID:": "Konuşmacı/Şarkıcı Kimliği Seç:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "Erkekten kadına dönüşüm için önerilen +12 ton, kadından erkeğe dönüşüm için -12 ton. Ses aralığı fazla uzaklaşırsa ve ses bozulursa, uygun aralığı kendiniz ayarlayabilirsiniz.", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "Transpoze et (tamsayı, yarıton Fof sayısı, bir oktav yukarı: 12, bir oktav aşağı: -12):", + "Feature search database file path:": "Özellik arama veritabanı dosya yolu:", + "Enter the path of the audio file to be processed (default is the correct format example):": "İşlenecek ses dosyasının yolunu girin (varsayılan olarak doğru format örneğidir):", + "Select the pitch extraction algorithm:": "Pitch çıkarma algoritmasını seçin:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Mangio-Crepe Hop Uzunluğu (Sadece mangio-crepe için geçerlidir): Hop uzunluğu, konuşmacının dramatik bir pitch'e atlama süresini belirtir. Daha düşük hop uzunlukları daha fazla çıkarım süresi alır, ancak daha doğru pitch verir.", + "Feature search dataset file path": "Özellik arama veri seti dosya yolu", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "Eğer >=3 ise: elde edilen pitch sonuçlarına medyan filtreleme uygulayın. Değer, filtre yarıçapını temsil eder ve nefes sesini azaltabilir.", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "Özellik dizin dosyasının yolu. Seçilen sonucu kullanmak için boş bırakın:", + "Auto-detect index path and select from the dropdown:": "Dizin yolunu otomatik algılayın ve açılır menüden seçin:", + "Path to feature file:": "Özellik dosyasının yolu:", + "Search feature ratio:": "Özellik oranını arayın:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "Çıkış sesini son işlemde nihai örnekleme hızına göre yeniden örnekleme yapın. Örnekleme yapmamak için 0 olarak ayarlayın:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "Girişin ses zarfını çıkışın ses zarfıyla değiştirin veya karıştırın. Oran 1'e ne kadar yakınsa, çıkış zarfı o kadar çok kullanılır:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "Sessiz ünsüzleri ve nefes seslerini koruyarak elektronik müzikte yırtılma gibi sanat efektlerini önleyin. Devre dışı bırakmak için 0.5 olarak ayarlayın. Korumayı artırmak için değeri azaltın, ancak dizinleme doğruluğunu azaltabilir:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "F0 eğrisi dosyası (isteğe bağlı). Her satırda bir pitch bulunur. Varsayılan F0 ve pitch modülasyonunu değiştirir:", + "Convert": "Dönüştür", + "Output information:": "Çıkış bilgisi:", + "Export audio (click on the three dots in the lower right corner to download)": "Sesi dışa aktar (indirmek için sağ alt köşedeki üç noktaya tıklayın)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "Toplu dönüşüm. Dönüştürülecek ses dosyalarını içeren klasörü girin veya birden fazla ses dosyası yükleyin. Dönüştürülen ses, belirtilen klasöre (varsayılan: 'opt') çıktı olarak verilir.", + "Specify output folder:": "Çıkış klasörünü belirtin:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "İşlenecek ses klasörünün yolunu girin (dosya yöneticisinin adres çubuğundan kopyalayın):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "Ses dosyalarını toplu olarak da girebilirsiniz. İki seçenekten birini seçin. Öncelik klasörden okuma yapmaya verilir.", + "Export file format:": "Çıkış dosya formatı:", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "İşlenecek ses klasörünün yolunu girin:", + "Model:": "Model:", + "Vocal Extraction Aggressive": "Vokal Çıkarma Agresif", + "Specify the output folder for vocals:": "Vokaller için çıkış klasörünü belirtin:", + "Specify the output folder for accompaniment:": "Eşlik için çıkış klasörünü belirtin:", + "Train": "Eğit", + "Enter the model name:": "Model adını girin:", + "Target sample rate:": "Hedef örnek hızı:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "Modelin ton yönü rehberliği olup olmadığı (şarkı için gereklidir, konuşma için isteğe bağlıdır):", + "Version:": "Sürüm:", + "Number of CPU processes:": "CPU işlem sayısı:", + "Enter the path of the training folder:": "Eğitim klasörünün yolunu girin:", + "Specify the model ID:": "Model kimliğini belirtin:", + "Auto detect audio path and select from the dropdown:": "Otomatik olarak ses yolunu algıla ve açılır menüden seç:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "İşlenecek ses dosyasının yoluna ses dosyasının adını ekleyin (varsayılan olarak doğru format örneği) Yolu kaldırarak açılır menüden bir ses kullanın:", + "Advanced Settings": "Gelişmiş Ayarlar", + "Settings": "Ayarlar", + "Status:": "Durum:", + "Process data": "Veriyi işle", + "Drag your audio here:": "Sesinizi buraya sürükleyin:", + "Or record an audio:": "Veya bir ses kaydedin", + "Formant shift inference audio": "Formant kaydırma çıkarsama sesi", + "Used for male to female and vice-versa conversions": "Erkekten kadına ve tam tersine dönüşümler için kullanılır", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "GPU dizinini '-' ile ayırarak belirtin, örneğin 0-1-2; GPU'ları 0, 1 ve 2 kullanmak için:", + "GPU Information:": "GPU Bilgileri:", + "Feature extraction": "Özellik çıkarma", + "Save frequency:": "Kaydetme frekansı:", + "Training epochs:": "Eğitim dönemleri:", + "Batch size per GPU:": "Her GPU için toplu iş boyutu:", + "Save only the latest '.ckpt' file to save disk space:": "Sadece en son '.ckpt' dosyasını kaydederek disk alanı tasarrufu yapın:", + "No": "Hayır", + "Save a small final model to the 'weights' folder at each save point:": "Her kaydetme noktasında 'weights' klasörüne küçük bir son model kaydedin:", + "Load pre-trained base model G path:": "Önceden eğitilmiş temel G model yolu yükle:", + "Load pre-trained base model D path:": "Önceden eğitilmiş temel D model yolu yükle:", + "Train model": "Modeli eğit", + "Train feature index": "Eğitim özellik dizini", + "One-click training": "Bir tıklamayla eğitim", + "Processing": "İşleniyor", + "Model fusion, can be used to test timbre fusion": "Model birleştirme, timbre birleştirmeyi test etmek için kullanılabilir", + "Path to Model A:": "Model A'nın yolu:", + "Path to Model B:": "Model B'nin yolu:", + "Weight for Model A:": "Model A için ağırlık:", + "Whether the model has pitch guidance:": "Modelin ton yönü rehberliği olup olmadığı:", + "Model information to be placed:": "Yerleştirilecek model bilgisi:", + "Model architecture version:": "Model mimari sürümü:", + "Fusion": "Birleştirme", + "Modify model information": "Model bilgisini değiştir", + "Path to Model:": "Model yoluna:", + "Model information to be modified:": "Değiştirilecek model bilgisi:", + "Save file name:": "Dosya adını kaydet:", + "Modify": "Değiştir", + "View model information": "Model bilgisini görüntüle", + "View": "Görüntüle", + "Model extraction": "Model çıkarımı (büyük dosya modelinin 'logs' klasörünün altına yolunu girin). Eğitimi yarıda kesmek ve manuel olarak küçük bir model dosyası çıkarmak ve kaydetmek istiyorsanız veya ara bir modeli test etmek isterseniz bu yararlı olabilir:", + "Name:": "Adı kaydet:", + "Whether the model has pitch guidance (1: yes, 0: no):": "Modelin ton yönü rehberliği olup olmadığı (1: evet, 0: hayır):", + "Extract": "Çıkar", + "Export Onnx": "Onnx'i dışa aktar", + "RVC Model Path:": "RVC Model Yolu:", + "Onnx Export Path:": "Onnx Dışa Aktarma Yolu:", + "MoeVS Model": "MoeVS Modeli", + "Export Onnx Model": "Onnx Modelini Dışa Aktar", + "Load model": "Modeli yükle", + "Hubert Model": "Hubert Modeli", + "Select the .pth file": ".pth dosyasını seçin", + "Select the .index file": ".index dosyasını seçin", + "Select the .npy file": ".npy dosyasını seçin", + "Input device": "Giriş cihazı", + "Output device": "Çıkış cihazı", + "Audio device (please use the same type of driver)": "Ses cihazı (lütfen aynı sürücü türünü kullanın)", + "Response threshold": "Yanıt eşiği", + "Pitch settings": "Ton ayarları", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "Hertz değeri yerine nota isimlerinin kullanılıp kullanılmayacağı. Örn. [C5, D6] yerine [523.25, 1174.66]Hz", + "Index Rate": "Dizin Oranı", + "General settings": "Genel ayarlar", + "Sample length": "Örnek uzunluğu", + "Fade length": "Solma uzunluğu", + "Extra inference time": "Ek çıkarsama süresi", + "Input noise reduction": "Giriş gürültü azaltma", + "Output noise reduction": "Çıkış gürültü azaltma", + "Performance settings": "Performans ayarları", + "Start audio conversion": "Ses dönüşümünü başlat", + "Stop audio conversion": "Ses dönüşümünü durdur", + "Inference time (ms):": "Çıkarsama süresi (ms):", + "Select the pth file": ".pth dosyasını seçin", + "Select the .index file:": ".index dosyasını seçin", + "The hubert model path must not contain Chinese characters": "Hubert model yolu Çince karakter içermemelidir", + "The pth file path must not contain Chinese characters.": ".pth dosya yolu Çince karakter içermemelidir.", + "The index file path must not contain Chinese characters.": ".index dosya yolu Çince karakter içermemelidir.", + "Step algorithm": "Adım algoritması", + "Number of epoch processes": "Dönem işlem sayısı", + "Lowest points export": "En düşük noktaları dışa aktar", + "How many lowest points to save:": "Kaç en düşük noktanın kaydedileceği", + "Export lowest points of a model": "Bir modelin en düşük noktalarını dışa aktar", + "Output models:": "Modelleri dışa aktar", + "Stats of selected models:": "Seçilen modellerin istatistikleri", + "Custom f0 [Root pitch] File": "Özel f0 [Kök ton] Dosyası", + "Min pitch:": "Minimum ton yüksekliği:", + "Specify minimal pitch for inference [HZ]": "Çıkarsama için minimum ton yüksekliğini belirt [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "Çıkarsama için minimum ton yüksekliğini belirt [NOTA][OKTAV]", + "Max pitch:": "Maksimum ton yüksekliği:", + "Specify max pitch for inference [HZ]": "Çıkarsama için maksimum ton yüksekliğini belirt [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "Çıkarsama için maksimum ton yüksekliğini belirt [NOTA][OKTAV]", + "Browse presets for formanting": "Formant ayarları için ön ayarları göz at", + "Presets are located in formantshiftcfg/ folder": "Ön ayarlar formantshiftcfg/ klasöründe bulunur", + "Default value is 1.0": "Varsayılan değer 1.0'dır", + "Quefrency for formant shifting": "Formant kaydırma için kvarakfrekans", + "Timbre for formant shifting": "Formant kaydırma için timbre", + "Apply": "Uygula", + "Single": "Tek", + "Batch": "Toplu", + "Separate YouTube tracks": "YouTube parçalarını ayır", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "YouTube videosundan ses indirin ve otomatik olarak vokal ve enstrümantal parçaları ayırın", + "Extra": "Ekstra", + "Merge": "Birleştir", + "Merge your generated audios with the instrumental": "Üretilen seslerinizi enstrümantal ile birleştirin", + "Choose your instrumental:": "Enstrümantal seçin:", + "Choose the generated audio:": "Üretilen sesi seçin:", + "Combine": "Birleştir", + "Download and Separate": "İndir ve Ayır", + "Enter the YouTube link:": "YouTube bağlantısını girin:", + "This section contains some extra utilities that often may be in experimental phases": "Bu bölüm genellikle deneysel aşamalarda olabilecek bazı ek hizmet programlarını içerir", + "Merge Audios": "Sesleri Birleştir", + "Audio files have been moved to the 'audios' folder.": "Ses dosyaları 'audios' klasörüne taşındı.", + "Downloading audio from the video...": "Videodan ses indiriliyor...", + "Audio downloaded!": "Ses indirildi!", + "An error occurred:": "Bir hata oluştu:", + "Separating audio...": "Ses ayrıştırılıyor...", + "File moved successfully.": "Dosya başarıyla taşındı.", + "Finished!": "Tamamlandı!", + "The source file does not exist.": "Kaynak dosya mevcut değil.", + "Error moving the file:": "Dosya taşınırken hata oluştu:", + "Downloading {name} from drive": "{name} Google Drive'dan indiriliyor", + "The attempt to download using Drive didn't work": "Drive kullanılarak indirme denemesi başarısız oldu", + "Error downloading the file: {str(e)}": "Dosya indirilirken hata oluştu: {str(e)}", + "Downloading {name} from mega": "{name} Mega'dan indiriliyor", + "Downloading {name} from basic url": "{name} temel URL'den indiriliyor", + "Download Audio": "Ses İndir", + "Download audios of any format for use in inference (recommended for mobile users).": "Çıkarsama için herhangi bir formatta ses indirin (mobil kullanıcılar için önerilir).", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "Dönüşümden sonra herhangi bir ConnectionResetErrors önemsizdir ve sadece görseldir; ihmal edilebilirler.\n", + "Processed audio saved at: ": "İşlenmiş ses kaydedildi: ", + "Conversion complete!": "Dönüşüm tamamlandı!", + "Reverb": "Yankı", + "Compressor": "Sıkıştırıcı", + "Noise Gate": "Gürültü Kapısı", + "Volume": "Ses Düzeyi", + "Drag the audio here and click the Refresh button": "Sesi buraya sürükleyin ve Yenile düğmesine tıklayın", + "Select the generated audio": "Üretilen sesi seçin", + "Volume of the instrumental audio:": "Enstrümantal sesin ses düzeyi:", + "Volume of the generated audio:": "Üretilen sesin ses düzeyi:", + "### Audio settings:": "### Ses ayarları:", + "### Instrumental settings:": "### Enstrümantal ayarları:", + "### Add the effects:": "### Efektleri ekle:", + "Starting audio conversion... (This might take a moment)": "Ses dönüşümü başlatılıyor... (Bu biraz zaman alabilir)", + "TTS Model:": "TTS Sesleri", + "TTS": "TTS", + "TTS Method:": "TTS Yöntemi", + "Audio TTS:": "Sesli TTS", + "Audio RVC:": "Sesli Model" +} diff --git a/assets/i18n/langs/ur_UR.json b/assets/i18n/langs/ur_UR.json new file mode 100644 index 000000000..e58c68312 --- /dev/null +++ b/assets/i18n/langs/ur_UR.json @@ -0,0 +1,247 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "بدقسمتی سے، آپ کی تربیت کو سپورٹ کرنے کے لیے کوئی ہم آہنگ GPU دستیاب نہیں ہے۔", + "Yes": "جی ہاں", + "Select your dataset:": "اپنا ڈیٹا سیٹ منتخب کریں۔", + "Update list": "فہرست کو اپ ڈیٹ کریں۔", + "Download Model": "ماڈل ڈاؤن لوڈ کریں۔", + "Download Backup": "بیک اپ ڈاؤن لوڈ کریں۔", + "Download Dataset": "ڈیٹا سیٹ ڈاؤن لوڈ کریں۔", + "Download": "ڈاؤن لوڈ کریں", + "Url:": "یو آر ایل:", + "Build the index before saving.": "محفوظ کرنے سے پہلے انڈیکس بنائیں۔", + "Save your model once the training ends.": "ٹریننگ ختم ہونے کے بعد اپنے ماڈل کو محفوظ کریں۔", + "Save type": "قسم محفوظ کریں۔", + "Save model": "ماڈل کو محفوظ کریں۔", + "Choose the method": "طریقہ منتخب کریں۔", + "Save all": "محفوظ کریں", + "Save D and G": "ڈی اور جی کو محفوظ کریں۔", + "Save voice": "آواز محفوظ کریں۔", + "Downloading the file: ": "فائل ڈاؤن لوڈ کرنا:", + "Stop training": "تربیت بند کرو", + "Too many users have recently viewed or downloaded this file": "بہت سارے صارفین نے حال ہی میں اس فائل کو دیکھا یا ڈاؤن لوڈ کیا ہے۔", + "Cannot get file from this private link": "اس نجی لنک سے فائل حاصل نہیں کی جا سکتی", + "Full download": "مکمل ڈاؤن لوڈ", + "An error occurred downloading": "ڈاؤن لوڈ کرنے میں ایک خرابی پیش آگئی", + "Model saved successfully": "ماڈل کامیابی سے محفوظ ہو گیا۔", + "Saving the model...": "ماڈل محفوظ ہو رہا ہے...", + "Saved without index...": "انڈیکس کے بغیر محفوظ کیا گیا...", + "model_name": "ماڈل_نام", + "Saved without inference model...": "بغیر کسی اندازہ کے ماڈل کے محفوظ کیا گیا...", + "An error occurred saving the model": "ماڈل کو محفوظ کرنے میں ایک خرابی پیش آگئی", + "The model you want to save does not exist, be sure to enter the correct name.": "آپ جس ماڈل کو محفوظ کرنا چاہتے ہیں وہ موجود نہیں ہے، درست نام ضرور درج کریں۔", + "The file could not be downloaded.": "فائل ڈاؤن لوڈ نہیں ہو سکی۔", + "Unzip error.": "ان زپ کی خرابی۔", + "Path to your added.index file (if it didn't automatically find it)": "آپ کی add.index فائل کا راستہ (اگر یہ خود بخود اسے نہیں مل پاتی ہے)", + "It has been downloaded successfully.": "اسے کامیابی کے ساتھ ڈاؤن لوڈ کر لیا گیا ہے۔", + "Proceeding with the extraction...": "نکالنے کے ساتھ آگے بڑھ رہا ہے...", + "The Backup has been uploaded successfully.": "بیک اپ کامیابی کے ساتھ اپ لوڈ ہو گیا ہے۔", + "The Dataset has been loaded successfully.": "ڈیٹا سیٹ کامیابی کے ساتھ لوڈ ہو گیا ہے۔", + "The Model has been loaded successfully.": "ماڈل کامیابی کے ساتھ لوڈ ہو گیا ہے۔", + "It is used to download your inference models.": "یہ آپ کے انفرنس ماڈلز کو ڈاؤن لوڈ کرنے کے لیے استعمال ہوتا ہے۔", + "It is used to download your training backups.": "یہ آپ کے تربیتی بیک اپ کو ڈاؤن لوڈ کرنے کے لیے استعمال ہوتا ہے۔", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "اپنے ماڈل کو تربیت دینے کے لیے ڈیٹاسیٹ کو آڈیوز کے ساتھ مطابقت پذیر فارمیٹ (.wav/.flac) میں ڈاؤن لوڈ کریں۔", + "No relevant file was found to upload.": "اپ لوڈ کرنے کے لیے کوئی متعلقہ فائل نہیں ملی۔", + "The model works for inference, and has the .index file.": "ماڈل تخمینہ کے لیے کام کرتا ہے، اور اس میں .index فائل ہے۔", + "The model works for inference, but it doesn't have the .index file.": "ماڈل تخمینہ کے لیے کام کرتا ہے، لیکن اس میں .index فائل نہیں ہے۔", + "This may take a few minutes, please wait...": "اس میں کچھ منٹ لگ سکتے ہیں، براہ کرم انتظار کریں...", + "Resources": "حوالہ جات", + "Step 1: Processing data": "مرحلہ 1: ڈیٹا پر کارروائی کرنا", + "Step 2: Skipping pitch extraction": "مرحلہ 2a: پچ نکالنا چھوڑنا", + "Step 3: Extracting features": "مرحلہ 2b: خصوصیات کو نکالنا", + "Step 4: Model training started": "مرحلہ 3a: ماڈل ٹریننگ شروع ہوئی۔", + "Step 5: Export lowest points on a graph of the model": "مرحلہ 4: ماڈل کے گراف پر سب سے کم پوائنٹس برآمد کریں۔", + "Training is done, check train.log": "ٹریننگ ہو چکی ہے، ٹرین ڈاٹ لاگ چیک کریں۔", + "All processes have been completed!": "تمام عمل مکمل ہو چکے ہیں!", + "Model Inference": "ماڈل کا اندازہ", + "Inferencing voice:": "اندازہ لگانے والی آواز:", + "Model_Name": "ماڈل_نام", + "Dataset_Name": "ڈیٹا سیٹ_نام", + "Whether the model has pitch guidance.": "آیا ماڈل میں پچ گائیڈنس ہے۔", + "Whether to save only the latest .ckpt file to save hard drive space": "آیا ہارڈ ڈرائیو کی جگہ بچانے کے لیے صرف تازہ ترین .ckpt فائل کو محفوظ کرنا ہے۔", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "تمام تربیتی سیٹوں کو GPU میموری میں کیش کریں۔ چھوٹے ڈیٹا سیٹس (10 منٹ سے کم) کیشنگ ٹریننگ کو تیز کر سکتی ہے۔", + "Save a small final model to the 'weights' folder at each save point": "ہر سیو پوائنٹ پر ایک چھوٹا فائنل ماڈل 'وزن' فولڈر میں محفوظ کریں۔", + "Refresh": "آواز کی فہرست، انڈیکس پاتھ اور آڈیو فائلوں کو ریفریش کریں۔", + "Unload voice to save GPU memory": "GPU میموری کو بچانے کے لیے آواز اتاریں:", + "Select Speaker/Singer ID:": "اسپیکر/گلوکار کی شناخت منتخب کریں:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "مرد سے خاتون کی تبدیلی کے لیے تجویز کردہ +12 کلید، اور عورت سے مرد کی تبدیلی کے لیے -12 کلید۔ اگر آواز کی حد بہت دور جاتی ہے اور آواز بگڑ جاتی ہے، تو آپ اسے خود بھی مناسب رینج میں ایڈجسٹ کر سکتے ہیں۔", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "ٹرانسپوز (انٹیجر، سیمیٹونز کی تعداد، ایک آکٹیو سے بڑھائیں: 12، ایک آکٹیو سے کم: -12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "کارروائی کی جانے والی آڈیو فائل کا راستہ درج کریں (پہلے سے طے شدہ فارمیٹ کی صحیح مثال ہے):", + "Select the pitch extraction algorithm:": "پچ نکالنے کا الگورتھم منتخب کریں:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Mangio-Crepe Hop Length (صرف mangio-crepe پر لاگو ہوتا ہے): ہاپ کی لمبائی سے مراد وہ وقت ہوتا ہے جو اسپیکر کو ڈرامائی انداز میں چھلانگ لگانے میں لگتا ہے۔ نچلی ہاپ کی لمبائی کا اندازہ لگانے میں زیادہ وقت لگتا ہے لیکن پچ زیادہ درست ہوتی ہے۔", + "Feature search dataset file path": "فیچر سرچ ڈیٹاسیٹ فائل پاتھ", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "اگر >=3: کٹائی ہوئی پچ کے نتائج پر میڈین فلٹرنگ لگائیں۔ قدر فلٹر کے رداس کی نمائندگی کرتی ہے اور سانس لینے میں کمی کر سکتی ہے۔", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "فیچر انڈیکس فائل کا راستہ۔ ڈراپ ڈاؤن سے منتخب کردہ نتیجہ کو استعمال کرنے کے لیے خالی چھوڑ دیں:", + "Auto-detect index path and select from the dropdown:": "انڈیکس پاتھ کا خود بخود پتہ لگائیں اور ڈراپ ڈاؤن سے منتخب کریں۔", + "Path to feature file:": "فیچر فائل کا راستہ:", + "Search feature ratio:": "تلاش کی خصوصیت کا تناسب:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "پوسٹ پروسیسنگ میں آؤٹ پٹ آڈیو کو حتمی نمونے کی شرح پر دوبارہ نمونہ دیں۔ دوبارہ نمونے لینے کے لیے 0 پر سیٹ کریں:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "آؤٹ پٹ کے والیوم لفافے کو تبدیل کرنے یا ملانے کے لیے ان پٹ کے والیوم لفافے کا استعمال کریں۔ تناسب 1 کے جتنا قریب ہوگا، اتنا ہی زیادہ آؤٹ پٹ لفافہ استعمال ہوتا ہے:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "الیکٹرونک میوزک میں پھاڑنے جیسے فن پاروں کو روکنے کے لیے بے آواز تلفظ اور سانس کی آوازوں کی حفاظت کریں۔ غیر فعال کرنے کے لیے 0.5 پر سیٹ کریں۔ تحفظ کو بڑھانے کے لیے قدر کو کم کریں، لیکن یہ اشاریہ سازی کی درستگی کو کم کر سکتا ہے:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "F0 وکر فائل (اختیاری)۔ فی لائن ایک پچ۔ پہلے سے طے شدہ F0 اور پچ ماڈیولیشن کو بدل دیتا ہے:", + "Convert": "تبدیل کریں", + "Output information:": "آؤٹ پٹ کی معلومات", + "Export audio (click on the three dots in the lower right corner to download)": "آڈیو برآمد کریں (ڈاؤن لوڈ کرنے کے لیے نیچے دائیں کونے میں تین نقطوں پر کلک کریں)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "بیچ کی تبدیلی۔ وہ فولڈر درج کریں جس میں آڈیو فائلیں تبدیل کی جائیں یا متعدد آڈیو فائلیں اپ لوڈ کریں۔ تبدیل شدہ آڈیو مخصوص فولڈر میں آؤٹ پٹ ہو گا (پہلے سے طے شدہ: 'opt')۔", + "Specify output folder:": "آؤٹ پٹ فولڈر کی وضاحت کریں:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "آڈیو فولڈر کا راستہ درج کریں جس پر کارروائی کی جائے (اسے فائل مینیجر کے ایڈریس بار سے کاپی کریں):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "آپ آڈیو فائلوں کو بیچوں میں بھی ڈال سکتے ہیں۔ دو آپشنز میں سے ایک کا انتخاب کریں۔ فولڈر سے پڑھنے کو ترجیح دی جاتی ہے۔", + "Export file format": "فائل کی شکل برآمد کریں۔", + "UVR5": "UVR5", + "Enter the path of the audio folder to be processed:": "جس آڈیو فولڈر پر کارروائی کی جائے گی اس کا راستہ درج کریں:", + "Model": "ماڈل", + "Vocal Extraction Aggressive": "آواز نکالنا جارحانہ", + "Specify the output folder for vocals:": "آواز کے لیے آؤٹ پٹ فولڈر کی وضاحت کریں:", + "Specify the output folder for accompaniment:": "ساتھ کے لیے آؤٹ پٹ فولڈر کی وضاحت کریں:", + "Train": "ٹرین", + "Enter the model name:": "ماڈل کا نام درج کریں:", + "Target sample rate:": "ہدف نمونہ کی شرح:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "آیا ماڈل میں پچ گائیڈنس ہے (گانے کے لیے ضروری، تقریر کے لیے اختیاری):", + "Version": "ورژن", + "Number of CPU processes:": "پچ نکالنے اور ڈیٹا پروسیسنگ کے لیے استعمال ہونے والے CPU عملوں کی تعداد:", + "Enter the path of the training folder:": "ٹریننگ فولڈر کا راستہ درج کریں:", + "Specify the model ID:": "براہ کرم ماڈل ID کی وضاحت کریں:", + "Auto detect audio path and select from the dropdown:": "آڈیو پاتھ کا خود بخود پتہ لگائیں اور ڈراپ ڈاؤن سے منتخب کریں:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "آڈیو فائل کے راستے میں آڈیو کا نام شامل کریں جس پر کارروائی کی جائے (پہلے سے طے شدہ فارمیٹ کی صحیح مثال ہے) ڈراپ ڈاؤن فہرست سے آڈیو استعمال کرنے کے لیے راستے کو ہٹا دیں:", + "Advanced Settings": "اعلی درجے کی ترتیبات", + "Settings": "ترتیبات", + "Status:": "حالت", + "Process data": "ڈیٹا پر کارروائی کریں۔", + "Drag your audio here:": "اپنے آڈیو کو یہاں گھسیٹیں اور ریفریش بٹن کو دبائیں۔", + "Or record an audio:": "یا آڈیو ریکارڈ کریں۔", + "Formant shift inference audio": "فارمینٹ شفٹ انفرنس آڈیو", + "Used for male to female and vice-versa conversions": "مرد سے عورت اور اس کے برعکس تبادلوں کے لیے استعمال کیا جاتا ہے۔", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "براہ کرم '-' سے الگ کردہ GPU انڈیکس فراہم کریں، جیسے GPUs 0، 1، اور 2 استعمال کرنے کے لیے 0-1-2:", + "GPU Information:": "GPU کی معلومات", + "Feature extraction": "خصوصیت کا اخراج", + "Save frequency:": "تعدد کو محفوظ کریں:", + "Training epochs:": "تربیتی دور:", + "Batch size per GPU:": "بیچ سائز فی GPU:", + "Save only the latest '.ckpt' file to save disk space:": "ڈسک کی جگہ بچانے کے لیے صرف تازہ ترین '.ckpt' فائل کو محفوظ کریں:", + "No": "نہیں", + "Save a small final model to the 'weights' folder at each save point:": "ہر سیو پوائنٹ پر ایک چھوٹا فائنل ماڈل 'وزن' فولڈر میں محفوظ کریں:", + "Load pre-trained base model G path:": "پہلے سے تربیت یافتہ بیس ماڈل جی پاتھ لوڈ کریں:", + "Load pre-trained base model D path:": "پہلے سے تربیت یافتہ بیس ماڈل ڈی پاتھ لوڈ کریں:", + "Train model": "ٹرین ماڈل", + "Train feature index": "ٹرین فیچر انڈیکس", + "One-click training": "ایک کلک کی تربیت", + "Processing": "پروسیسنگ", + "Model fusion, can be used to test timbre fusion": "ماڈل فیوژن، ٹمبر فیوژن کو جانچنے کے لیے استعمال کیا جا سکتا ہے۔", + "Path to Model A:": "ماڈل A کا راستہ:", + "Path to Model B:": "ماڈل B کا راستہ:", + "Weight for Model A:": "ماڈل A کے لیے وزن:", + "Whether the model has pitch guidance:": "آیا ماڈل میں پچ گائیڈنس ہے:", + "Model information to be placed:": "ماڈل کی معلومات رکھی جائے گی:", + "Model architecture version:": "ماڈل آرکیٹیکچر ورژن:", + "Fusion": "امتزاج", + "Modify model information": "ماڈل کی معلومات میں ترمیم کریں۔", + "Path to Model:": "ماڈل کا راستہ:", + "Model information to be modified:": "ماڈل کی معلومات میں ترمیم کی جائے گی:", + "Save file name:": "فائل کا نام محفوظ کریں:", + "Modify": "ترمیم کریں۔", + "View model information": "ماڈل کی معلومات دیکھیں", + "View": "دیکھیں", + "Model extraction": "ماڈل نکالنا ('لاگز' فولڈر کے نیچے بڑی فائل ماڈل کا راستہ داخل کریں)۔ یہ مفید ہے اگر آپ تربیت کو آدھے راستے سے روکنا چاہتے ہیں اور دستی طور پر ایک چھوٹی ماڈل فائل کو نکالنا اور محفوظ کرنا چاہتے ہیں، یا اگر آپ انٹرمیڈیٹ ماڈل کی جانچ کرنا چاہتے ہیں:", + "Name:": "نام محفوظ کریں:", + "Whether the model has pitch guidance (1: yes, 0: no):": "آیا ماڈل میں پچ گائیڈنس ہے (1: ہاں، 0: نہیں):", + "Extract": "نکالنا", + "Export Onnx": "Onnx برآمد کریں۔", + "RVC Model Path:": "RVC ماڈل کا راستہ:", + "Onnx Export Path:": "Onnx برآمد کا راستہ:", + "MoeVS Model": "MoeVS ماڈل", + "Export Onnx Model": "Onnx ماڈل برآمد کریں۔", + "Load model": "لوڈ ماڈل", + "Hubert Model": "ہیوبرٹ ماڈل", + "Select the .pth file": ".pth فائل کو منتخب کریں۔", + "Select the .index file": ".index فائل کو منتخب کریں۔", + "Select the .npy file": ".npy فائل کو منتخب کریں۔", + "Input device": "ان پٹ ڈیوائس", + "Output device": "آؤٹ پٹ ڈیوائس", + "Audio device (please use the same type of driver)": "آڈیو ڈیوائس (براہ کرم ایک ہی قسم کا ڈرائیور استعمال کریں)", + "Response threshold": "جوابی حد", + "Pitch settings": "پچ کی ترتیبات", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "آیا نوٹ کے نام ان کی ہرٹز قدر کے بجائے استعمال کیے جائیں۔ ای جی [C5, D6] بجائے [523.25, 1174.66]Hz", + "Index Rate": "انڈیکس ریٹ", + "General settings": "عام ترتیبات", + "Sample length": "نمونہ کی لمبائی", + "Fade length": "دھندلا لمبائی", + "Extra inference time": "اضافی تخمینہ کا وقت", + "Input noise reduction": "ان پٹ شور کی کمی", + "Output noise reduction": "آؤٹ پٹ شور کی کمی", + "Performance settings": "کارکردگی کی ترتیبات", + "Start audio conversion": "آڈیو کی تبدیلی شروع کریں۔", + "Stop audio conversion": "آڈیو تبادلوں کو روکیں۔", + "Inference time (ms):": "انفرنس ٹائم (ms):", + "Select the pth file": "pth فائل کو منتخب کریں۔", + "Select the .index file:": "انڈیکس فائل کو منتخب کریں۔", + "The hubert model path must not contain Chinese characters": "ہیوبرٹ ماڈل پاتھ میں چینی حروف نہیں ہونے چاہئیں", + "The pth file path must not contain Chinese characters.": "pth فائل کا راستہ چینی حروف پر مشتمل نہیں ہونا چاہیے۔", + "The index file path must not contain Chinese characters.": "انڈیکس فائل کا راستہ چینی حروف پر مشتمل نہیں ہونا چاہیے۔", + "Step algorithm": "مرحلہ الگورتھم", + "Number of epoch processes": "عہد کے عمل کی تعداد", + "Lowest points export": "کم ترین پوائنٹس کی برآمد", + "How many lowest points to save:": "کتنے کم پوائنٹس کو بچانا ہے۔", + "Export lowest points of a model": "ماڈل کے سب سے کم پوائنٹس برآمد کریں۔", + "Output models:": "آؤٹ پٹ ماڈلز", + "Stats of selected models:": "منتخب ماڈلز کے اعدادوشمار", + "Custom f0 [Root pitch] File": "اپنی مرضی کے مطابق f0 [روٹ پچ] فائل", + "Min pitch:": "منٹ پچ", + "Specify minimal pitch for inference [HZ]": "تخمینہ کے لیے کم سے کم پچ کی وضاحت کریں [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "قیاس کے لیے کم سے کم پچ کی وضاحت کریں [NOTE][OCTAVE]", + "Max pitch:": "زیادہ سے زیادہ پچ", + "Specify max pitch for inference [HZ]": "تخمینہ کے لیے زیادہ سے زیادہ پچ کی وضاحت کریں [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "تخمینہ کے لیے زیادہ سے زیادہ پچ کی وضاحت کریں [NOTE][OCTAVE]", + "Browse presets for formanting": "فارمیٹنگ کے لیے پیش سیٹوں کو براؤز کریں۔", + "Presets are located in formantshiftcfg/ folder": "presets formantshiftcfg/ فولڈر میں واقع ہیں۔", + "Default value is 1.0": "پہلے سے طے شدہ قدر 1.0 ہے۔", + "Quefrency for formant shifting": "فارمینٹ شفٹنگ کے لیے Quefrency", + "Timbre for formant shifting": "فارمینٹ شفٹنگ کے لیے ٹمبر", + "Apply": "درخواست دیں", + "Single": "سنگل", + "Batch": "بیچ", + "Separate YouTube tracks": "یوٹیوب ٹریکس کو الگ کریں۔", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "یوٹیوب ویڈیو سے آڈیو ڈاؤن لوڈ کریں اور خودکار طور پر آواز اور ساز کے ٹریک کو الگ کریں۔", + "Extra": "اضافی", + "Merge": "ضم", + "Merge your generated audios with the instrumental": "اپنے تیار کردہ آڈیوز کو انسٹرومینٹل کے ساتھ ضم کریں۔", + "Choose your instrumental:": "اپنے آلے کا انتخاب کریں۔", + "Choose the generated audio:": "تیار کردہ آڈیو کا انتخاب کریں۔", + "Combine": "یکجا", + "Download and Separate": "ڈاؤن لوڈ کریں اور الگ کریں۔", + "Enter the YouTube link:": "یوٹیوب کا لنک درج کریں۔", + "This section contains some extra utilities that often may be in experimental phases": "اس حصے میں کچھ اضافی افادیتیں ہیں جو اکثر تجرباتی مراحل میں ہو سکتی ہیں۔", + "Merge Audios": "آڈیوز کو ضم کریں۔", + "Audio files have been moved to the 'audios' folder.": "آڈیو فائلوں کو 'آڈیوز' فولڈر میں منتقل کر دیا گیا ہے۔", + "Downloading audio from the video...": "ویڈیو سے آڈیو ڈاؤن لوڈ ہو رہا ہے...", + "Audio downloaded!": "آڈیو ڈاؤن لوڈ!", + "An error occurred:": "ایک خرابی آگئی:", + "Separating audio...": "آڈیو کو الگ کیا جا رہا ہے...", + "File moved successfully.": "فائل کامیابی سے منتقل ہو گئی۔", + "Finished!": "ختم!", + "The source file does not exist.": "سورس فائل موجود نہیں ہے۔", + "Error moving the file:": "فائل کو منتقل کرنے میں خرابی:", + "Downloading {name} from drive": "ڈرائیو سے {name} ڈاؤن لوڈ ہو رہا ہے۔", + "The attempt to download using Drive didn't work": "Drive کا استعمال کرتے ہوئے ڈاؤن لوڈ کرنے کی کوشش نے کام نہیں کیا۔", + "Error downloading the file: {str(e)}": "فائل ڈاؤن لوڈ کرنے میں خرابی: {str(e)}", + "Downloading {name} from mega": "میگا سے {name} ڈاؤن لوڈ ہو رہا ہے۔", + "Downloading {name} from basic url": "بنیادی url سے {name} ڈاؤن لوڈ ہو رہا ہے۔", + "Download Audio": "آڈیو ڈاؤن لوڈ کریں۔", + "Download audios of any format for use in inference (recommended for mobile users).": "کسی بھی فارمیٹ کے آڈیوز کو قیاس میں استعمال کرنے کے لیے ڈاؤن لوڈ کریں (موبائل صارفین کے لیے تجویز کردہ)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "تبدیلی کے بعد کی کوئی بھی ConnectionResetErrors غیر متعلقہ اور خالصتاً بصری ہیں۔ انہیں نظر انداز کیا جا سکتا ہے.", + "Processed audio saved at: ": "پروسیس شدہ آڈیو کو محفوظ کیا گیا:", + "Conversion complete!": "تبدیلی مکمل!", + "Reverb": "Reverb", + "Compressor": "کمپریسر", + "Noise Gate": "شور گیٹ", + "Volume": "حجم", + "Drag the audio here and click the Refresh button": "آڈیو کو یہاں گھسیٹیں اور ریفریش بٹن پر کلک کریں۔", + "Select the generated audio": "تیار کردہ آڈیو کو منتخب کریں۔", + "Volume of the instrumental audio:": "آلہ ساز آڈیو کا حجم", + "Volume of the generated audio:": "تیار کردہ آڈیو کا حجم", + "### Add the effects": "### اثرات شامل کریں۔", + "Starting audio conversion... (This might take a moment)": "آڈیو کنورشن شروع ہورہی ہے... (یہ تھوڑی دیر لگ سکتی ہے)", + "TTS Model:": "TTS آوازیں", + "TTS": "TTS", + "TTS Method:": "TTS میثاق", + "Audio TTS:": "آڈیو TTS", + "Audio RVC:": "آڈیو ماڈل" +} diff --git a/assets/i18n/langs/zh_CN.json b/assets/i18n/langs/zh_CN.json new file mode 100644 index 000000000..c1c1b4201 --- /dev/null +++ b/assets/i18n/langs/zh_CN.json @@ -0,0 +1,247 @@ +{ + "Unfortunately, there is no compatible GPU available to support your training.": "不幸的是,没有可用的兼容 GPU 来支持您的训练。", + "Yes": "是的", + "Select your dataset:": "选择您的数据集。", + "Update list": "更新列表。", + "Download Model": "下载模型", + "Download Backup": "下载备份", + "Download Dataset": "下载数据集", + "Download": "下载", + "Url:": "网址:", + "Build the index before saving.": "保存前构建索引。", + "Save your model once the training ends.": "训练结束后保存您的模型。", + "Save type": "保存类型", + "Save model": "保存模型", + "Choose the method": "选择方法", + "Save all": "保存全部", + "Save D and G": "保存D和G", + "Save voice": "保存语音", + "Downloading the file: ": "下载文件:", + "Stop training": "停止训练", + "Too many users have recently viewed or downloaded this file": "最近有太多用户查看或下载了此文件", + "Cannot get file from this private link": "无法从此私人链接获取文件", + "Full download": "完整下载", + "An error occurred downloading": "下载时发生错误", + "Model saved successfully": "模型保存成功", + "Saving the model...": "保存模型...", + "Saved without index...": "保存时没有索引...", + "model_name": "型号名称", + "Saved without inference model...": "保存时没有推理模型...", + "An error occurred saving the model": "保存模型时出错", + "The model you want to save does not exist, be sure to enter the correct name.": "您要保存的模型不存在,请务必输入正确的名称。", + "The file could not be downloaded.": "无法下载该文件。", + "Unzip error.": "解压错误。", + "Path to your added.index file (if it didn't automatically find it)": "添加的.index 文件的路径(如果没有自动找到它)", + "It has been downloaded successfully.": "已经下载成功了。", + "Proceeding with the extraction...": "继续提取...", + "The Backup has been uploaded successfully.": "备份已成功上传。", + "The Dataset has been loaded successfully.": "数据集已成功加载。", + "The Model has been loaded successfully.": "模型已成功加载。", + "It is used to download your inference models.": "它用于下载您的推理模型。", + "It is used to download your training backups.": "它用于下载您的训练备份。", + "Download the dataset with the audios in a compatible format (.wav/.flac) to train your model.": "下载包含兼容格式 (.wav/.flac) 音频的数据集来训练您的模型。", + "No relevant file was found to upload.": "没有找到相关文件可以上传。", + "The model works for inference, and has the .index file.": "该模型用于推理,并具有 .index 文件。", + "The model works for inference, but it doesn't have the .index file.": "该模型适用于推理,但没有 .index 文件。", + "This may take a few minutes, please wait...": "这可能需要几分钟,请稍候...", + "Resources": "资源", + "Step 1: Processing data": "步骤一:处理数据", + "Step 2: Skipping pitch extraction": "步骤 2a:跳过音调提取", + "Step 3: Extracting features": "步骤2b:提取特征", + "Step 4: Model training started": "步骤3a:模型训练开始", + "Step 5: Export lowest points on a graph of the model": "步骤 4:导出模型图表上的最低点", + "Training is done, check train.log": "训练完成,查看train.log", + "All processes have been completed!": "所有流程已完成!", + "Model Inference": "模型推理", + "Inferencing voice:": "推理语音:", + "Model_Name": "型号名称", + "Dataset_Name": "数据集_名称", + "Whether the model has pitch guidance.": "模型是否有俯仰引导。", + "Whether to save only the latest .ckpt file to save hard drive space": "是否仅保存最新的.ckpt文件以节省硬盘空间", + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training": "将所有训练集缓存到 GPU 内存。缓存小数据集(少于 10 分钟)可以加快训练速度", + "Save a small final model to the 'weights' folder at each save point": "在每个保存点将一个小的最终模型保存到“权重”文件夹中", + "Refresh": "刷新语音列表、索引路径和音频文件", + "Unload voice to save GPU memory": "卸载语音以节省 GPU 内存:", + "Select Speaker/Singer ID:": "选择演讲者/歌手 ID:", + "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.": "建议+12键用于男性到女性的转换,-12键用于女性到男性的转换。如果音域走得太远,声音失真,也可以自行调整到合适的音域。", + "Transpose (integer, number Fof semitones, raise by an octave: 12, lower by an octave: -12):": "移调(整数,半音数,升高八度:12,降低八度:-12):", + "Enter the path of the audio file to be processed (default is the correct format example):": "输入要处理的音频文件的路径(默认为正确格式示例):", + "Select the pitch extraction algorithm:": "选择音高提取算法:", + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate.": "Mangio-Crepe 跳跃长度(仅适用于 mangio-crepe):跳跃长度是指说话者跳跃到戏剧性音高所需的时间。较短的跳跃长度需要更多的时间来推断,但音高更准确。", + "Feature search dataset file path": "特征搜索数据集文件路径", + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness.": "如果 >=3:对收获的音高结果应用中值滤波。该值代表过滤半径,可以减少呼吸味。", + "Path to the feature index file. Leave blank to use the selected result from the dropdown:": "功能索引文件的路径。留空以使用下拉列表中选定的结果:", + "Auto-detect index path and select from the dropdown:": "自动检测索引路径并从下拉列表中选择", + "Path to feature file:": "功能文件的路径:", + "Search feature ratio:": "搜索特征比例:", + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:": "在后处理中将输出音频重新采样到最终采样率。设置为 0 表示不重采样:", + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:": "使用输入的音量包络来替换或与输出的音量包络混合。该比率越接近 1,使用的输出包络就越多:", + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:": "保护清辅音和呼吸音,以防止电子音乐中出现撕裂等伪影。设置为 0.5 以禁用。减小该值可增强保护,但可能会降低索引精度:", + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:": "F0 曲线文件(可选)。每行一个音高。替换默认的 F0 和音调调制:", + "Convert": "转变", + "Output information:": "输出信息", + "Export audio (click on the three dots in the lower right corner to download)": "导出音频(点击右下角三点即可下载)", + "Batch conversion. Enter the folder containing the audio files to be converted or upload multiple audio files. The converted audio will be output in the specified folder (default: 'opt').": "批量转换。输入包含要转换的音频文件的文件夹或上传多个音频文件。转换后的音频将输出到指定文件夹(默认:“opt”)。", + "Specify output folder:": "指定输出文件夹:", + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):": "输入要处理的音频文件夹路径(从文件管理器地址栏复制):", + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder.": "您还可以批量输入音频文件。选择两个选项之一。优先从文件夹中读取。", + "Export file format": "导出文件格式", + "UVR5": "紫外线5", + "Enter the path of the audio folder to be processed:": "输入要处理的音频文件夹路径:", + "Model": "模型", + "Vocal Extraction Aggressive": "声音提取 攻击性", + "Specify the output folder for vocals:": "指定人声的输出文件夹:", + "Specify the output folder for accompaniment:": "指定伴奏的输出文件夹:", + "Train": "火车", + "Enter the model name:": "输入型号名称:", + "Target sample rate:": "目标采样率:", + "Whether the model has pitch guidance (required for singing, optional for speech):": "模型是否有音调引导(唱歌时需要,语音时可选):", + "Version": "版本", + "Number of CPU processes:": "用于音高提取和数据处理的CPU进程数:", + "Enter the path of the training folder:": "输入训练文件夹的路径:", + "Specify the model ID:": "请指定型号 ID:", + "Auto detect audio path and select from the dropdown:": "自动检测音频路径并从下拉列表中选择:", + "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "将音频的名称添加到要处理的音频文件的路径中(默认是正确的格式示例)从下拉列表中删除使用音频的路径:", + "Advanced Settings": "高级设置", + "Settings": "设置", + "Status:": "地位", + "Process data": "处理数据", + "Drag your audio here:": "将音频拖到此处并点击刷新按钮", + "Or record an audio:": "或者录制音频。", + "Formant shift inference audio": "共振峰移位推断音频", + "Used for male to female and vice-versa conversions": "用于男性到女性的转换,反之亦然", + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:": "请提供以“-”分隔的 GPU 索引,例如使用 GPU 0、1 和 2 时为 0-1-2:", + "GPU Information:": "GPU信息", + "Feature extraction": "特征提取", + "Save frequency:": "保存频率:", + "Training epochs:": "训练时期:", + "Batch size per GPU:": "每个 GPU 的批量大小:", + "Save only the latest '.ckpt' file to save disk space:": "仅保存最新的“.ckpt”文件以节省磁盘空间:", + "No": "不", + "Save a small final model to the 'weights' folder at each save point:": "在每个保存点将一个小的最终模型保存到“权重”文件夹中:", + "Load pre-trained base model G path:": "加载预训练的基础模型G路径:", + "Load pre-trained base model D path:": "加载预训练的基础模型D路径:", + "Train model": "火车模型", + "Train feature index": "列车特征指标", + "One-click training": "一键培训", + "Processing": "加工", + "Model fusion, can be used to test timbre fusion": "模型融合,可用于测试音色融合", + "Path to Model A:": "模型 A 的路径:", + "Path to Model B:": "模型 B 的路径:", + "Weight for Model A:": "A 型重量:", + "Whether the model has pitch guidance:": "模型是否有俯仰引导:", + "Model information to be placed:": "需放置的型号信息:", + "Model architecture version:": "模型架构版本:", + "Fusion": "融合", + "Modify model information": "修改型号信息", + "Path to Model:": "模型路径:", + "Model information to be modified:": "待修改型号信息:", + "Save file name:": "保存文件名:", + "Modify": "调整", + "View model information": "查看型号信息", + "View": "看法", + "Model extraction": "模型提取(输入“logs”文件夹下大文件模型的路径)。如果您想中途停止训练并手动提取并保存一个小模型文件,或者如果您想测试中间模型,这非常有用:", + "Name:": "保存名称:", + "Whether the model has pitch guidance (1: yes, 0: no):": "模型是否有俯仰引导(1:有,0:无):", + "Extract": "提炼", + "Export Onnx": "导出Onnx", + "RVC Model Path:": "RVC模型路径:", + "Onnx Export Path:": "Onnx 导出路径:", + "MoeVS Model": "MoeVS模型", + "Export Onnx Model": "导出 Onnx 模型", + "Load model": "负载模型", + "Hubert Model": "休伯特模型", + "Select the .pth file": "选择 .pth 文件", + "Select the .index file": "选择.index文件", + "Select the .npy file": "选择.npy 文件", + "Input device": "输入设备", + "Output device": "输出设备", + "Audio device (please use the same type of driver)": "音频设备(请使用同类型驱动程序)", + "Response threshold": "反应阈值", + "Pitch settings": "音调设置", + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz": "是否使用音符名称而不是赫兹值。例如。 [C5,D6]而不是[523.25,1174.66]Hz", + "Index Rate": "指数率", + "General settings": "常规设置", + "Sample length": "样品长度", + "Fade length": "淡入淡出长度", + "Extra inference time": "额外的推理时间", + "Input noise reduction": "输入噪声降低", + "Output noise reduction": "输出噪声降低", + "Performance settings": "性能设置", + "Start audio conversion": "开始音频转换", + "Stop audio conversion": "停止音频转换", + "Inference time (ms):": "推理时间(毫秒):", + "Select the pth file": "选择.pth文件", + "Select the .index file:": "选择索引文件", + "The hubert model path must not contain Chinese characters": "hubert模型路径不能包含中文字符", + "The pth file path must not contain Chinese characters.": "pth文件路径不能包含中文字符。", + "The index file path must not contain Chinese characters.": "索引文件路径不能包含中文字符。", + "Step algorithm": "步进算法", + "Number of epoch processes": "纪元进程数", + "Lowest points export": "最低点导出", + "How many lowest points to save:": "保存多少个最低点", + "Export lowest points of a model": "导出模型的最低点", + "Output models:": "输出型号", + "Stats of selected models:": "所选模型的统计数据", + "Custom f0 [Root pitch] File": "自定义 f0 [根音] 文件", + "Min pitch:": "最小间距", + "Specify minimal pitch for inference [HZ]": "指定推理的最小间距 [HZ]", + "Specify minimal pitch for inference [NOTE][OCTAVE]": "指定推理的最小间距 [NOTE][OCTAVE]", + "Max pitch:": "最大螺距", + "Specify max pitch for inference [HZ]": "指定推理的最大间距 [HZ]", + "Specify max pitch for inference [NOTE][OCTAVE]": "指定推理的最大音高 [NOTE][OCTAVE]", + "Browse presets for formanting": "浏览共振峰预设", + "Presets are located in formantshiftcfg/ folder": "预设位于formantshiftcfg/文件夹中", + "Default value is 1.0": "默认值为 1.0", + "Quefrency for formant shifting": "共振峰移位频率", + "Timbre for formant shifting": "共振峰转换的音色", + "Apply": "申请", + "Single": "单身的", + "Batch": "批", + "Separate YouTube tracks": "单独的 YouTube 曲目", + "Download audio from a YouTube video and automatically separate the vocal and instrumental tracks": "从 YouTube 视频下载音频并自动分离人声和器乐曲目", + "Extra": "额外的", + "Merge": "合并", + "Merge your generated audios with the instrumental": "将生成的音频与乐器合并", + "Choose your instrumental:": "选择您的乐器", + "Choose the generated audio:": "选择生成的音频", + "Combine": "结合", + "Download and Separate": "下载并分离", + "Enter the YouTube link:": "输入 YouTube 链接", + "This section contains some extra utilities that often may be in experimental phases": "本节包含一些通常可能处于实验阶段的额外实用程序", + "Merge Audios": "合并音频", + "Audio files have been moved to the 'audios' folder.": "音频文件已移至“audios”文件夹。", + "Downloading audio from the video...": "正在从视频下载音频...", + "Audio downloaded!": "音频下载!", + "An error occurred:": "发生错误:", + "Separating audio...": "分离音频...", + "File moved successfully.": "文件移动成功。", + "Finished!": "完成的!", + "The source file does not exist.": "源文件不存在。", + "Error moving the file:": "移动文件时出错:", + "Downloading {name} from drive": "正在从驱动器下载 {name}", + "The attempt to download using Drive didn't work": "尝试使用云端硬盘下载失败", + "Error downloading the file: {str(e)}": "下载文件时出错:{str(e)}", + "Downloading {name} from mega": "正在从 mega 下载 {name}", + "Downloading {name} from basic url": "从基本网址下载 {name}", + "Download Audio": "下载音频", + "Download audios of any format for use in inference (recommended for mobile users).": "下载任何格式的音频用于推理(推荐移动用户)", + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n": "转换后的任何 ConnectionResetErrors 都是无关紧要的并且纯粹是视觉上的;它们可以被忽略。", + "Processed audio saved at: ": "处理后的音频保存在:", + "Conversion complete!": "转换完成!", + "Reverb": "混响", + "Compressor": "压缩机", + "Noise Gate": "噪声门", + "Volume": "体积", + "Drag the audio here and click the Refresh button": "将音频拖至此处并单击刷新按钮", + "Select the generated audio": "选择生成的音频", + "Volume of the instrumental audio:": "乐器音频的音量", + "Volume of the generated audio:": "生成音频的音量", + "### Add the effects": "### 添加效果", + "Starting audio conversion... (This might take a moment)": "开始音频转换...(这可能需要一点时间)", + "TTS Model:": "TTS 语音", + "TTS": "TTS", + "TTS Method:": "TTS 方法", + "Audio TTS:": "音频 TTS", + "Audio RVC:": "音频模型" +} diff --git a/assets/i18n/locale_diff.py b/assets/i18n/locale_diff.py new file mode 100644 index 000000000..387ddfe1b --- /dev/null +++ b/assets/i18n/locale_diff.py @@ -0,0 +1,45 @@ +import json +import os +from collections import OrderedDict + +# Define the standard file name +standard_file = "en_US.json" + +# Find all JSON files in the directory +dir_path = "./" +languages = [ + f for f in os.listdir(dir_path) if f.endswith(".json") and f != standard_file +] + +# Load the standard file +with open(standard_file, "r", encoding="utf-8") as f: + standard_data = json.load(f, object_pairs_hook=OrderedDict) + +# Loop through each language file +for lang_file in languages: + # Load the language file + with open(lang_file, "r", encoding="utf-8") as f: + lang_data = json.load(f, object_pairs_hook=OrderedDict) + + # Find the difference between the language file and the standard file + diff = set(standard_data.keys()) - set(lang_data.keys()) + + miss = set(lang_data.keys()) - set(standard_data.keys()) + + # Add any missing keys to the language file + for key in diff: + lang_data[key] = key + + # Del any extra keys to the language file + for key in miss: + del lang_data[key] + + # Sort the keys of the language file to match the order of the standard file + lang_data = OrderedDict( + sorted(lang_data.items(), key=lambda x: list(standard_data.keys()).index(x[0])) + ) + + # Save the updated language file + with open(lang_file, "w", encoding="utf-8") as f: + json.dump(lang_data, f, ensure_ascii=False, indent=4) + f.write("\n") diff --git a/assets/i18n/scan_i18n.py b/assets/i18n/scan_i18n.py new file mode 100644 index 000000000..1b27f5b19 --- /dev/null +++ b/assets/i18n/scan_i18n.py @@ -0,0 +1,75 @@ +import ast +import glob +import json +from collections import OrderedDict + + +def extract_i18n_strings(node): + i18n_strings = [] + + if ( + isinstance(node, ast.Call) + and isinstance(node.func, ast.Name) + and node.func.id == "i18n" + ): + for arg in node.args: + if isinstance(arg, ast.Str): + i18n_strings.append(arg.s) + + for child_node in ast.iter_child_nodes(node): + i18n_strings.extend(extract_i18n_strings(child_node)) + + return i18n_strings + + +# scan the directory for all .py files (recursively) +# for each file, parse the code into an AST +# for each AST, extract the i18n strings + +strings = [] +for filename in glob.iglob("**/*.py", recursive=True): + with open(filename, "r") as f: + code = f.read() + if "I18nAuto" in code: + tree = ast.parse(code) + i18n_strings = extract_i18n_strings(tree) + print(filename, len(i18n_strings)) + strings.extend(i18n_strings) +code_keys = set(strings) +""" +n_i18n.py +gui_v1.py 26 +app.py 16 +infer-web.py 147 +scan_i18n.py 0 +i18n.py 0 +lib/train/process_ckpt.py 1 +""" +print() +print("Total unique:", len(code_keys)) + + +standard_file = "i18n/langs/en_US.json" +with open(standard_file, "r", encoding="utf-8") as f: + standard_data = json.load(f, object_pairs_hook=OrderedDict) +standard_keys = set(standard_data.keys()) + +# Define the standard file name +unused_keys = standard_keys - code_keys +print("Unused keys:", len(unused_keys)) +for unused_key in unused_keys: + print("\t", unused_key) + +missing_keys = code_keys - standard_keys +print("Missing keys:", len(missing_keys)) +for missing_key in missing_keys: + print("\t", missing_key) + +code_keys_dict = OrderedDict() +for s in strings: + code_keys_dict[s] = s + +# write back +with open(standard_file, "w", encoding="utf-8") as f: + json.dump(code_keys_dict, f, ensure_ascii=False, indent=4, sort_keys=True) + f.write("\n") diff --git a/assets/images/icon.png b/assets/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f9aae65bbbb712383531d26e6a956362576634fb GIT binary patch literal 21150 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.1.0 +numba==0.56.4 +numpy==1.23.5 +scipy +librosa==0.9.1 +llvmlite==0.39.0 +fairseq==0.12.2 +faiss-cpu==1.7.3 +gradio==3.34.0 +Cython +pydub>=0.25.1 +soundfile>=0.12.1 +ffmpeg-python>=0.2.0 +tensorboardX +Jinja2>=3.1.2 +json5 +Markdown +matplotlib>=3.7.0 +matplotlib-inline>=0.1.3 +praat-parselmouth>=0.4.2 +Pillow>=9.1.1 +resampy>=0.4.2 +scikit-learn +tensorboard +tqdm>=4.63.1 +tornado>=6.1 +Werkzeug>=2.2.3 +uc-micro-py>=1.0.1 +sympy>=1.11.1 +tabulate>=0.8.10 +PyYAML>=6.0 +pyasn1>=0.4.8 +pyasn1-modules>=0.2.8 +fsspec>=2022.11.0 +absl-py>=1.2.0 +audioread +uvicorn>=0.21.1 +colorama>=0.4.5 +pyworld==0.3.2 +httpx +onnxruntime-directml +torchcrepe==0.0.20 +fastapi==0.88 +ffmpy==0.3.1 +python-dotenv>=1.0.0 +av +edge-tts +git+https://github.com/suno-ai/bark.git diff --git a/assets/requirements/requirements-ipex.txt b/assets/requirements/requirements-ipex.txt new file mode 100644 index 000000000..afcc738df --- /dev/null +++ b/assets/requirements/requirements-ipex.txt @@ -0,0 +1,56 @@ +torch==2.0.1a0 +intel_extension_for_pytorch==2.0.110+xpu +torchvision==0.15.2a0 +https://github.com/Disty0/Retrieval-based-Voice-Conversion-WebUI/releases/download/torchaudio_wheels_for_ipex/torchaudio-2.0.2+31de77d-cp310-cp310-linux_x86_64.whl +-f https://developer.intel.com/ipex-whl-stable-xpu +joblib>=1.1.0 +numba==0.56.4 +numpy==1.23.5 +scipy +librosa==0.9.1 +llvmlite==0.39.0 +fairseq==0.12.2 +faiss-cpu==1.7.3 +gradio==3.34.0 +Cython +pydub>=0.25.1 +soundfile>=0.12.1 +ffmpeg-python>=0.2.0 +tensorboardX +Jinja2>=3.1.2 +json5 +Markdown +matplotlib>=3.7.0 +matplotlib-inline>=0.1.3 +praat-parselmouth>=0.4.2 +Pillow>=9.1.1 +resampy>=0.4.2 +scikit-learn +tensorboard +tqdm>=4.63.1 +tornado>=6.1 +Werkzeug>=2.2.3 +uc-micro-py>=1.0.1 +sympy>=1.11.1 +tabulate>=0.8.10 +PyYAML>=6.0 +pyasn1>=0.4.8 +pyasn1-modules>=0.2.8 +fsspec>=2022.11.0 +absl-py>=1.2.0 +audioread +uvicorn>=0.21.1 +colorama>=0.4.5 +pyworld==0.3.2 +httpx +onnxruntime; sys_platform == 'darwin' +onnxruntime-gpu; sys_platform != 'darwin' +torchcrepe==0.0.20 +fastapi==0.88 +ffmpy==0.3.1 +python-dotenv>=1.0.0 +av +PySimpleGUI +sounddevice +edge-tts +git+https://github.com/suno-ai/bark.git diff --git a/assets/requirements/requirements-realtime-vc.txt b/assets/requirements/requirements-realtime-vc.txt new file mode 100644 index 000000000..9d6935bfe --- /dev/null +++ b/assets/requirements/requirements-realtime-vc.txt @@ -0,0 +1,29 @@ +#1.Install torch from pytorch.org: +#torch 2.0 with cuda 11.8 +#pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 +#torch 1.11.0 with cuda 11.3 +#pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 +einops +fairseq +flask +flask_cors +gin +gin_config +librosa +local_attention +matplotlib +praat-parselmouth +pyworld +PyYAML +resampy +scikit_learn +scipy +SoundFile +tensorboard +tqdm +wave +PySimpleGUI +sounddevice +gradio +noisereduce +torchcrepe==0.0.20 diff --git a/assets/requirements/requirements-win-for-realtime_vc_gui-dml.txt b/assets/requirements/requirements-win-for-realtime_vc_gui-dml.txt new file mode 100644 index 000000000..651498960 --- /dev/null +++ b/assets/requirements/requirements-win-for-realtime_vc_gui-dml.txt @@ -0,0 +1,29 @@ +#1.Install torch from pytorch.org: +#torch 2.0 with cuda 11.8 +#pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 +#torch 1.11.0 with cuda 11.3 +#pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 +einops +fairseq +flask +flask_cors +gin +gin_config +librosa +local_attention +matplotlib +praat-parselmouth +pyworld +PyYAML +resampy +scikit_learn +scipy +SoundFile +tensorboard +tqdm +wave +PySimpleGUI +sounddevice +gradio +noisereduce +onnxruntime-directml \ No newline at end of file diff --git a/assets/requirements/requirements-win-for-realtime_vc_gui.txt b/assets/requirements/requirements-win-for-realtime_vc_gui.txt new file mode 100644 index 000000000..37ca23823 --- /dev/null +++ b/assets/requirements/requirements-win-for-realtime_vc_gui.txt @@ -0,0 +1,28 @@ +#1.Install torch from pytorch.org: +#torch 2.0 with cuda 11.8 +#pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 +#torch 1.11.0 with cuda 11.3 +#pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 +einops +fairseq +flask +flask_cors +gin +gin_config +librosa +local_attention +matplotlib +praat-parselmouth +pyworld +PyYAML +resampy +scikit_learn +scipy +SoundFile +tensorboard +tqdm +wave +PySimpleGUI +sounddevice +gradio +noisereduce diff --git a/assets/requirements/requirements.txt b/assets/requirements/requirements.txt new file mode 100644 index 000000000..3dd146820 --- /dev/null +++ b/assets/requirements/requirements.txt @@ -0,0 +1,62 @@ +tornado>=6.1 +setuptools +pydantic +fairseq==0.12.2 +wheel +google-auth-oauthlib +pedalboard +pydub==0.25.1 +httpx==0.23.0 +faiss_cpu==1.7.3 +ffmpeg_python==0.2.0 +ffmpy==0.3.1 +websockets>=10.0 +gradio==3.34.0 +librosa==0.9.1 +elevenlabs +gTTS==2.3.2 +wget +psutil +matplotlib==3.7.2 +mega.py==1.0.8 +gdown +edge-tts +git+https://github.com/suno-ai/bark.git +nltk +noisereduce==2.0.1 +unidecode +numba==0.57.1 +numpy==1.23.5 +onnxruntime +onnxruntime_gpu==1.15.1 +opencv_python==4.8.0.74 +opencv_python_headless==4.8.0.74 +pandas==2.0.3 +praat-parselmouth==0.4.2 +PySimpleGUI==4.60.5 +pyworld==0.3.3 +requests==2.31.0 +resampy==0.4.2 +scikit_learn==1.3.0 +scipy==1.11.1 +yt_dlp==2023.7.6 +sounddevice==0.4.6 +soundfile==0.12.1 +tensorboard==2.13.0 +tb_nightly==2.14.0a20230803 +torch==2.0.0 +torchcrepe==0.0.21 +torch_directml==0.2.0.dev230426 +torchaudio==2.0.1 +torchvision==0.15.1 +torchgen>=0.0.1 +tqdm==4.65.0 +python-dotenv>=1.0.0 +av +fastapi==0.95.2 +protobuf==3.20.0 +tensorboardX==2.6.2.1 +gin +gin_config +flask_cors +flask diff --git a/assets/rmvpe/.gitignore b/assets/rmvpe/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/assets/unzips/.gitignore b/assets/unzips/.gitignore new file mode 100644 index 000000000..d6b7ef32c --- /dev/null +++ b/assets/unzips/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/assets/uvr5_weights/.gitignore b/assets/uvr5_weights/.gitignore new file mode 100644 index 000000000..d6b7ef32c --- /dev/null +++ b/assets/uvr5_weights/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/assets/zips/.gitignore b/assets/zips/.gitignore new file mode 100644 index 000000000..d6b7ef32c --- /dev/null +++ b/assets/zips/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/datasets/.gitignore b/datasets/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/go-applio-manager.bat b/go-applio-manager.bat new file mode 100644 index 000000000..10db48ae8 --- /dev/null +++ b/go-applio-manager.bat @@ -0,0 +1,289 @@ +@echo off +title Applio - Manager + +::: +::: _ _ +::: /\ | (_) +::: / \ _ __ _ __ | |_ ___ +::: / /\ \ | '_ \| '_ \| | |/ _ \ +::: / ____ \| |_) | |_) | | | (_) | +::: /_/ \_\ .__/| .__/|_|_|\___/ +::: | | | | +::: |_| |_| +::: +::: + +setlocal +set "branch=applio-recode" +set "runtime=runtime-recode" +set "repoUrl=https://github.com/IAHispano/Applio-RVC-Fork/archive/refs/heads/%branch%.zip" +set "fixesFolder=lib/fixes" +set "localFixesPy=local_fixes.py" +set "principal=%cd%" +set "URL_BASE=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main" +set "URL_EXTRA=https://huggingface.co/IAHispano/applio/resolve/main" + +:menu +for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do @echo(%%A + +echo [1] Reinstall Applio +echo [2] Update Applio +echo [3] Update Applio + Dependencies +echo. + +set /p choice=Select an option: +set choice=%choice: =% + +if "%choice%"=="1" ( + cls + echo. + goto reinstaller + pause + cls + goto menu + +) + +if "%choice%"=="2" ( + cls + echo. + goto updater + pause + cls + goto menu +) + +if "%choice%"=="3" ( + cls + echo. + goto updaterDependencies + pause + cls + goto menu + +) + +cls +echo Invalid option. Please enter a number from 1 to 3. +echo. +echo Press 'Enter' to access the main menu... +pause>nul +cls +goto menu + +:reinstaller + +echo WARNING: Remember to install Microsoft C++ Build Tools, Redistributable, Python, and Git before continuing. +echo. +echo Step-by-step guide: https://rentry.org/appliolocal +echo Build Tools: https://aka.ms/vs/17/release/vs_BuildTools.exe +echo Redistributable: https://aka.ms/vs/17/release/vc_redist.x64.exe +echo Git: https://github.com/git-for-windows/git/releases/download/v2.42.0.windows.2/Git-2.42.0.2-64-bit.exe +echo Python: Add this route to the windows enviroment variables the user path variable: %principal%\runtime\Scripts +echo. +pause +cls + +echo Updating the repository... +git pull + +echo Proceeding to download the models... +echo. + +echo WARNING: At this point, it's recommended to disable antivirus or firewall, as errors might occur when downloading pretrained models. +pause +cls + +echo Downloading models in the assets folder... +cd "assets" +echo. +echo Downloading the "pretrained" folder... +cd "pretrained" +curl -LJO "%URL_BASE%/pretrained/D32k.pth" +curl -LJO "%URL_BASE%/pretrained/D40k.pth" +curl -LJO "%URL_BASE%/pretrained/D48k.pth" +curl -LJO "%URL_BASE%/pretrained/G32k.pth" +curl -LJO "%URL_BASE%/pretrained/G40k.pth" +curl -LJO "%URL_BASE%/pretrained/G48k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D32k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D40k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D48k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G32k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G40k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G48k.pth" +cd ".." +echo. +cls + +echo Downloading the "pretrained_v2" folder... +cd "pretrained_v2" +curl -LJO "%URL_BASE%/pretrained_v2/D32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/D40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/D48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G48k.pth" +cd ".." +echo. +cls + +echo Downloading the hubert_base.pt file... +cd "hubert" +curl -LJO "%URL_BASE%/hubert_base.pt" +cd ".." +echo. +cls + + +echo Downloading the rmvpe.pt file... +cd "rmvpe" +curl -LJO "%URL_BASE%/rmvpe.pt" +echo. +cls + +echo Downloading the rmvpe.onnx file... +curl -LJO "%URL_BASE%/rmvpe.onnx" +cd ".." +cd ".." +echo. +cls + +echo Downloading the rest of the large files +cd "assets" +echo Downloading the "uvr5_weights" folder... +cd "uvr5_weights" +curl -LJO "%URL_BASE%/uvr5_weights/HP2_all_vocals.pth" +curl -LJO "%URL_BASE%/uvr5_weights/HP3_all_vocals.pth" +curl -LJO "%URL_BASE%/uvr5_weights/HP5_only_main_vocal.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoAggressive.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoDeReverb.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoNormal.pth" +cd ".." +cd ".." +echo. +cls + +echo Downloading the ffmpeg.exe file... +curl -LJO "%URL_BASE%/ffmpeg.exe" +echo. +cls + +echo Downloading the ffprobe.exe file... +curl -LJO "%URL_BASE%/ffprobe.exe" +echo. +cls + +echo Downloads completed! +echo. + +echo Checking if the local_fixes.py file exists in the Fixes folder... +if exist "%fixesFolder%\%localFixesPy%" ( + echo Running the file... + runtime\python.exe "%fixesFolder%\%localFixesPy%" +) else ( + echo The "%localFixesPy%" file was not found in the "Fixes" folder. +) +echo. + +echo Fixes Applied! +echo. + +echo Applio has been reinstalled! +echo. +echo Press 'Enter' to access the main menu... +pause>nul +cls +goto menu + + +:updater + +echo Updating the repository... +git pull + +echo Verifying if the local_fixes.py file exists in the Fixes folder... +if exist "%fixesFolder%\%localFixesPy%" ( + echo Running the file... + runtime\python.exe "%fixesFolder%\%localFixesPy%" +) else ( + echo The file "%localFixesPy%" was not found in the "Fixes" folder. +) +echo. + +echo Applio has been updated! +echo. +echo Press 'Enter' to access the main menu... +pause>nul +cls +goto menu + + +:updaterDependencies + +echo Updating the repository... +git pull + +echo Installing dependencies... + +echo [1] Nvidia graphics cards +echo [2] AMD / Intel graphics cards +echo [3] I have already installed the dependencies +echo. + +set /p choice=Select the option according to your GPU: +set choice=%choice: =% + +if "%choice%"=="1" ( +cls +pip install -r requirements/requirements.txt +echo. +pip uninstall torch torchvision torchaudio -y +echo. +pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu117 +echo. +echo. +cls +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +if "%choice%"=="2" ( +cls +pip install -r requirements/requirements-dml.txt +echo. +echo. +cls +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +if "%choice%"=="3" ( +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +:dependenciesFinished +echo Verifying if the local_fixes.py file exists in the Fixes folder... +if exist "%fixesFolder%\%localFixesPy%" ( + echo Running the file... + runtime\python.exe "%fixesFolder%\%localFixesPy%" +) else ( + echo The file "%localFixesPy%" was not found in the "Fixes" folder. +) +echo. + +echo Applio has been updated! +echo. +echo Press 'Enter' to access the main menu... +pause>nul +cls +goto menu diff --git a/go-applio.bat b/go-applio.bat new file mode 100644 index 000000000..619677c2b --- /dev/null +++ b/go-applio.bat @@ -0,0 +1,85 @@ +@echo off +setlocal +title Applio - Start + +::: +::: _ _ +::: /\ | (_) +::: / \ _ __ _ __ | |_ ___ +::: / /\ \ | '_ \| '_ \| | |/ _ \ +::: / ____ \| |_) | |_) | | | (_) | +::: /_/ \_\ .__/| .__/|_|_|\___/ +::: | | | | +::: |_| |_| +::: +::: + +:menu +for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do @echo(%%A + +echo [1] Start Applio (Mostly recommended) +echo [2] Start Applio (DML) +echo [3] Start Realtime GUI (DML) +echo [4] Start Realtime GUI (V0) +echo [5] Start Realtime GUI (V1) +echo. + +set /p choice=Select an option: +set choice=%choice: =% + +if "%choice%"=="1" ( + cls + echo WARNING: At this point, it's recommended to disable antivirus or firewall, as errors might occur when downloading pretrained models. + echo. + python infer-web.py --pycmd python --port 7897 + pause + cls + goto menu +) + +if "%choice%"=="2" ( + cls + echo. + python infer-web.py --pycmd python --port 7897 --dml + pause + cls + goto menu +) + +if "%choice%"=="3" ( + cls + echo Starting Realtime GUI ^(DML^)... + echo. + python lib/tools/gui/gui_v1.py --pycmd python --dml + pause + cls + goto menu +) + +if "%choice%"=="4" ( + cls + echo Starting Realtime GUI ^(V0^)... + echo. + python lib/tools/gui/gui_v0.py + pause + cls + goto menu +) + +if "%choice%"=="5" ( + cls + echo Starting Realtime GUI ^(V1^)... + echo. + python lib/tools/gui/gui_v1.py + pause + cls + goto menu +) + +cls +echo Invalid option. Please enter a number from 1 to 5. +echo. +echo Press 'Enter' to access the main menu... +pause>nul +cls +goto menu \ No newline at end of file diff --git a/go-tensorboard.bat b/go-tensorboard.bat new file mode 100644 index 000000000..b3894d397 --- /dev/null +++ b/go-tensorboard.bat @@ -0,0 +1,3 @@ +title Applio - Tensorboard +python lib/fixes/tensor-launch.py +pause \ No newline at end of file diff --git a/infer-web.py b/infer-web.py new file mode 100644 index 000000000..42ab905ca --- /dev/null +++ b/infer-web.py @@ -0,0 +1,2950 @@ +import os, sys + +now_dir = os.getcwd() +sys.path.append(now_dir) +os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" +os.environ["OPENBLAS_NUM_THREADS"] = "1" +os.environ["no_proxy"] = "localhost, 127.0.0.1, ::1" +import logging +import shutil +import threading +import lib.globals.globals as rvc_globals +import lib.infer.infer_libs.uvr5_pack.mdx as mdx +from lib.infer.modules.uvr5.mdxprocess import ( + get_model_list, + id_to_ptm, + prepare_mdx, + run_mdx, +) +import math as math +import ffmpeg as ffmpeg +import traceback +import warnings +from random import shuffle +from subprocess import Popen +from time import sleep +import json +import pathlib + +import fairseq + +logging.getLogger("faiss").setLevel(logging.WARNING) +import faiss +import gradio as gr +import numpy as np +import torch as torch +import regex as re +import soundfile as SF + +SFWrite = SF.write +from dotenv import load_dotenv +from sklearn.cluster import MiniBatchKMeans +import datetime + + +from glob import glob1 +import signal +from signal import SIGTERM + +from assets.configs.config import Config +from assets.i18n.i18n import I18nAuto +from lib.infer.infer_libs.train.process_ckpt import ( + change_info, + extract_small_model, + merge, + show_info, +) +from lib.infer.modules.uvr5.mdxnet import MDXNetDereverb +from lib.infer.modules.uvr5.preprocess import AudioPre, AudioPreDeEcho +from lib.infer.modules.vc.modules import VC +from lib.infer.modules.vc.utils import * +import lib.globals.globals as rvc_globals +import nltk + +nltk.download("punkt", quiet=True) + +import tabs.resources as resources +import tabs.tts as tts +import tabs.merge as mergeaudios +import tabs.processing as processing + +from lib.infer.infer_libs.csvutil import CSVutil +from lib.infer.infer_pack.models_onnx import SynthesizerTrnMsNSFsidM +from sklearn.cluster import MiniBatchKMeans +import time +import csv +from shlex import quote as SQuote + +RQuote = lambda val: SQuote(str(val)) + +tmp = os.path.join(now_dir, "temp") + +# directories = ["logs", "datasets", "weights", "audio-others", "audio-outputs"] + +shutil.rmtree(tmp, ignore_errors=True) + +os.makedirs(tmp, exist_ok=True) + + +# for folder in directories: +# os.makedirs(os.path.join(now_dir, folder), exist_ok=True) +def remove_invalid_chars(text): + pattern = re.compile(r"[^\x00-\x7F]+") + return pattern.sub("", text) + + +def remove_text_between_parentheses(lines, start_line, end_line): + pattern = r"\[([^\]]*)\]\([^)]*\)" + processed_lines = [] + for line_number, line in enumerate(lines, start=1): + if start_line <= line_number <= end_line: + modified_line = re.sub(pattern, r"\1", line) + processed_lines.append(modified_line) + else: + processed_lines.append(line) + + return "\n".join(processed_lines) + + +with open("README.md", "r", encoding="utf8") as f: + inforeadme = f.read() + +inforeadme = remove_text_between_parentheses(inforeadme.split("\n"), 6, 15) +inforeadme = remove_invalid_chars(inforeadme) +inforeadme = remove_text_between_parentheses(inforeadme.split("\n"), 191, 207) + +os.makedirs(tmp, exist_ok=True) +os.makedirs(os.path.join(now_dir, "logs"), exist_ok=True) +os.makedirs(os.path.join(now_dir, "logs/weights"), exist_ok=True) +os.environ["temp"] = tmp +warnings.filterwarnings("ignore") +torch.manual_seed(114514) +logging.getLogger("numba").setLevel(logging.WARNING) + +logger = logging.getLogger(__name__) + + +if not os.path.isdir("lib/csvdb/"): + os.makedirs("lib/csvdb") + frmnt, stp = open("lib/csvdb/formanting.csv", "w"), open("lib/csvdb/stop.csv", "w") + frmnt.close() + stp.close() + +global DoFormant, Quefrency, Timbre + +try: + DoFormant, Quefrency, Timbre = CSVutil( + "lib/csvdb/formanting.csv", "r", "formanting" + ) + DoFormant = ( + lambda DoFormant: True + if DoFormant.lower() == "true" + else (False if DoFormant.lower() == "false" else DoFormant) + )(DoFormant) +except (ValueError, TypeError, IndexError): + DoFormant, Quefrency, Timbre = False, 1.0, 1.0 + CSVutil( + "lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, Quefrency, Timbre + ) + +load_dotenv() +config = Config() +vc = VC(config) + +if config.dml == True: + + def forward_dml(ctx, x, scale): + ctx.scale = scale + res = x.clone().detach() + return res + + fairseq.modules.grad_multiply.GradMultiply.forward = forward_dml + +i18n = I18nAuto() +i18n.print() +# 判断是否有能用来训练和加速推理的N卡 +ngpu = torch.cuda.device_count() +gpu_infos = [] +mem = [] +if_gpu_ok = False + +isinterrupted = 0 + + +if torch.cuda.is_available() or ngpu != 0: + for i in range(ngpu): + gpu_name = torch.cuda.get_device_name(i) + if any( + value in gpu_name.upper() + for value in [ + "10", + "16", + "20", + "30", + "40", + "A2", + "A3", + "A4", + "P4", + "A50", + "500", + "A60", + "70", + "80", + "90", + "M4", + "T4", + "TITAN", + ] + ): + # A10#A100#V100#A40#P40#M40#K80#A4500 + if_gpu_ok = True # 至少有一张能用的N卡 + gpu_infos.append("%s\t%s" % (i, gpu_name)) + mem.append( + int( + torch.cuda.get_device_properties(i).total_memory + / 1024 + / 1024 + / 1024 + + 0.4 + ) + ) +if if_gpu_ok and len(gpu_infos) > 0: + gpu_info = "\n".join(gpu_infos) + default_batch_size = min(mem) // 2 +else: + gpu_info = ( + "Unfortunately, there is no compatible GPU available to support your training." + ) + default_batch_size = 1 +gpus = "-".join([i[0] for i in gpu_infos]) + + +class ToolButton(gr.Button, gr.components.FormComponent): + """Small button with single emoji as text, fits inside gradio forms""" + + def __init__(self, **kwargs): + super().__init__(variant="tool", **kwargs) + + def get_block_name(self): + return "button" + + +hubert_model = None +weight_root = os.getenv("weight_root") +weight_uvr5_root = os.getenv("weight_uvr5_root") +index_root = os.getenv("index_root") +datasets_root = "datasets" +fshift_root = "lib/infer/infer_libs/formantshiftcfg" +audio_root = "assets/audios" +audio_others_root = "assets/audios/audio-others" +sup_audioext = { + "wav", + "mp3", + "flac", + "ogg", + "opus", + "m4a", + "mp4", + "aac", + "alac", + "wma", + "aiff", + "webm", + "ac3", +} + +names = [ + os.path.join(root, file) + for root, _, files in os.walk(weight_root) + for file in files + if file.endswith((".pth", ".onnx")) +] + +indexes_list = [ + os.path.join(root, name) + for root, _, files in os.walk(index_root, topdown=False) + for name in files + if name.endswith(".index") and "trained" not in name +] + +audio_paths = [ + os.path.join(root, name) + for root, _, files in os.walk(audio_root, topdown=False) + for name in files + if name.endswith(tuple(sup_audioext)) and root == audio_root +] + +audio_others_paths = [ + os.path.join(root, name) + for root, _, files in os.walk(audio_others_root, topdown=False) + for name in files + if name.endswith(tuple(sup_audioext)) and root == audio_others_root +] + +uvr5_names = [ + name.replace(".pth", "") + for name in os.listdir(weight_uvr5_root) + if name.endswith(".pth") or "onnx" in name +] + + +check_for_name = lambda: sorted(names)[0] if names else "" + +datasets = [] +for foldername in os.listdir(os.path.join(now_dir, datasets_root)): + if "." not in foldername: + datasets.append(os.path.join(now_dir, "datasets", foldername)) + + +def get_dataset(): + if len(datasets) > 0: + return sorted(datasets)[0] + else: + return "" + + +def update_model_choices(select_value): + model_ids = get_model_list() + model_ids_list = list(model_ids) + if select_value == "VR": + return {"choices": uvr5_names, "__type__": "update"} + elif select_value == "MDX": + return {"choices": model_ids_list, "__type__": "update"} + + +def update_dataset_list(name): + new_datasets = [] + for foldername in os.listdir(os.path.join(now_dir, datasets_root)): + if "." not in foldername: + new_datasets.append( + os.path.join( + now_dir, + "datasets", + foldername, + ) + ) + return gr.Dropdown.update(choices=new_datasets) + + +def get_indexes(): + indexes_list = [ + os.path.join(dirpath, filename) + for dirpath, _, filenames in os.walk(index_root) + for filename in filenames + if filename.endswith(".index") and "trained" not in filename + ] + + return indexes_list if indexes_list else "" + + +def get_fshift_presets(): + fshift_presets_list = [ + os.path.join(dirpath, filename) + for dirpath, _, filenames in os.walk(fshift_root) + for filename in filenames + if filename.endswith(".txt") + ] + + return fshift_presets_list if fshift_presets_list else "" + + +def uvr( + model_name, + inp_root, + save_root_vocal, + paths, + save_root_ins, + agg, + format0, + architecture, +): + infos = [] + if architecture == "VR": + try: + infos.append( + i18n("Starting audio conversion... (This might take a moment)") + ) + inp_root = inp_root.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + save_root_vocal = ( + save_root_vocal.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + ) + save_root_ins = ( + save_root_ins.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + ) + usable_files = [ + os.path.join(inp_root, file) + for file in os.listdir(inp_root) + if file.endswith(tuple(sup_audioext)) + ] + if model_name == "onnx_dereverb_By_FoxJoy": + pre_fun = MDXNetDereverb(15, config.device) + else: + func = AudioPre if "DeEcho" not in model_name else AudioPreDeEcho + pre_fun = func( + agg=int(agg), + model_path=os.path.join( + os.getenv("weight_uvr5_root"), model_name + ".pth" + ), + device=config.device, + is_half=config.is_half, + ) + if inp_root != "": + paths = usable_files + else: + paths = [path.name for path in paths] + for path in paths: + inp_path = os.path.join(inp_root, path) + need_reformat = 1 + done = 0 + try: + info = ffmpeg.probe(inp_path, cmd="ffprobe") + if ( + info["streams"][0]["channels"] == 2 + and info["streams"][0]["sample_rate"] == "44100" + ): + need_reformat = 0 + pre_fun._path_audio_( + inp_path, save_root_ins, save_root_vocal, format0 + ) + done = 1 + except: + need_reformat = 1 + traceback.print_exc() + if need_reformat == 1: + tmp_path = "%s/%s.reformatted.wav" % ( + os.path.join(os.environ["tmp"]), + os.path.basename(inp_path), + ) + os.system( + "ffmpeg -i %s -vn -acodec pcm_s16le -ac 2 -ar 44100 %s -y" + % (inp_path, tmp_path) + ) + inp_path = tmp_path + try: + if done == 0: + pre_fun.path_audio( + inp_path, save_root_ins, save_root_vocal, format0 + ) + infos.append("%s->Success" % (os.path.basename(inp_path))) + yield "\n".join(infos) + except: + try: + if done == 0: + pre_fun._path_audio_( + inp_path, save_root_ins, save_root_vocal, format0 + ) + infos.append("%s->Success" % (os.path.basename(inp_path))) + yield "\n".join(infos) + except: + infos.append( + "%s->%s" + % (os.path.basename(inp_path), traceback.format_exc()) + ) + yield "\n".join(infos) + except: + infos.append(traceback.format_exc()) + yield "\n".join(infos) + finally: + try: + if model_name == "onnx_dereverb_By_FoxJoy": + del pre_fun.pred.model + del pre_fun.pred.model_ + else: + del pre_fun.model + del pre_fun + except: + traceback.print_exc() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + logger.info("Executed torch.cuda.empty_cache()") + yield "\n".join(infos) + elif architecture == "MDX": + try: + infos.append( + i18n("Starting audio conversion... (This might take a moment)") + ) + yield "\n".join(infos) + inp_root, save_root_vocal, save_root_ins = [ + x.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + for x in [inp_root, save_root_vocal, save_root_ins] + ] + + usable_files = [ + os.path.join(inp_root, file) + for file in os.listdir(inp_root) + if file.endswith(tuple(sup_audioext)) + ] + try: + if paths != None: + paths = [path.name for path in paths] + else: + paths = usable_files + + except: + traceback.print_exc() + paths = usable_files + print(paths) + invert = True + denoise = True + use_custom_parameter = True + dim_f = 3072 + dim_t = 256 + n_fft = 7680 + use_custom_compensation = True + compensation = 1.025 + suffix = "Vocals_custom" # @param ["Vocals", "Drums", "Bass", "Other"]{allow-input: true} + suffix_invert = "Instrumental_custom" # @param ["Instrumental", "Drumless", "Bassless", "Instruments"]{allow-input: true} + print_settings = True # @param{type:"boolean"} + onnx = id_to_ptm(model_name) + compensation = ( + compensation + if use_custom_compensation or use_custom_parameter + else None + ) + mdx_model = prepare_mdx( + onnx, + use_custom_parameter, + dim_f, + dim_t, + n_fft, + compensation=compensation, + ) + + for path in paths: + # inp_path = os.path.join(inp_root, path) + suffix_naming = suffix if use_custom_parameter else None + diff_suffix_naming = suffix_invert if use_custom_parameter else None + run_mdx( + onnx, + mdx_model, + path, + format0, + diff=invert, + suffix=suffix_naming, + diff_suffix=diff_suffix_naming, + denoise=denoise, + ) + + if print_settings: + print() + print("[MDX-Net_Colab settings used]") + print(f"Model used: {onnx}") + print(f"Model MD5: {mdx.MDX.get_hash(onnx)}") + print(f"Model parameters:") + print(f" -dim_f: {mdx_model.dim_f}") + print(f" -dim_t: {mdx_model.dim_t}") + print(f" -n_fft: {mdx_model.n_fft}") + print(f" -compensation: {mdx_model.compensation}") + print() + print("[Input file]") + print("filename(s): ") + for filename in paths: + print(f" -{filename}") + infos.append(f"{os.path.basename(filename)}->Success") + yield "\n".join(infos) + except: + infos.append(traceback.format_exc()) + yield "\n".join(infos) + finally: + try: + del mdx_model + except: + traceback.print_exc() + + print("clean_empty_cache") + + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +def change_choices(): + names = [ + os.path.join(root, file) + for root, _, files in os.walk(weight_root) + for file in files + if file.endswith((".pth", ".onnx")) + ] + indexes_list = [ + os.path.join(root, name) + for root, _, files in os.walk(index_root, topdown=False) + for name in files + if name.endswith(".index") and "trained" not in name + ] + audio_paths = [ + os.path.join(root, name) + for root, _, files in os.walk(audio_root, topdown=False) + for name in files + if name.endswith(tuple(sup_audioext)) and root == audio_root + ] + + return ( + {"choices": sorted(names), "__type__": "update"}, + {"choices": sorted(indexes_list), "__type__": "update"}, + {"choices": sorted(audio_paths), "__type__": "update"}, + ) + + +def change_choices2(): + names = [ + os.path.join(root, file) + for root, _, files in os.walk(weight_root) + for file in files + if file.endswith((".pth", ".onnx")) + ] + indexes_list = [ + os.path.join(root, name) + for root, _, files in os.walk(index_root, topdown=False) + for name in files + if name.endswith(".index") and "trained" not in name + ] + + return ( + {"choices": sorted(names), "__type__": "update"}, + {"choices": sorted(indexes_list), "__type__": "update"}, + ) + + +def clean(): + return {"value": "", "__type__": "update"} + + +def export_onnx(): + from lib.infer.modules.onnx.export import export_onnx as eo + + eo() + + +sr_dict = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +def if_done(done, p): + while 1: + if p.poll() is None: + sleep(0.5) + else: + break + done[0] = True + + +def if_done_multi(done, ps): + while 1: + # poll==None代表进程未结束 + # 只要有一个进程未结束都不停 + flag = 1 + for p in ps: + if p.poll() is None: + flag = 0 + sleep(0.5) + break + if flag == 1: + break + done[0] = True + + +def formant_enabled( + cbox, qfrency, tmbre, frmntapply, formantpreset, formant_refresh_button +): + if cbox: + DoFormant = True + CSVutil( + "lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, qfrency, tmbre + ) + + # print(f"is checked? - {cbox}\ngot {DoFormant}") + + return ( + {"value": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + ) + + else: + DoFormant = False + CSVutil( + "lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, qfrency, tmbre + ) + + # print(f"is checked? - {cbox}\ngot {DoFormant}") + return ( + {"value": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + ) + + +def formant_apply(qfrency, tmbre): + Quefrency = qfrency + Timbre = tmbre + DoFormant = True + CSVutil("lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, qfrency, tmbre) + + return ( + {"value": Quefrency, "__type__": "update"}, + {"value": Timbre, "__type__": "update"}, + ) + + +def update_fshift_presets(preset, qfrency, tmbre): + if preset: + with open(preset, "r") as p: + content = p.readlines() + qfrency, tmbre = content[0].strip(), content[1] + + formant_apply(qfrency, tmbre) + else: + qfrency, tmbre = preset_apply(preset, qfrency, tmbre) + + return ( + {"choices": get_fshift_presets(), "__type__": "update"}, + {"value": qfrency, "__type__": "update"}, + {"value": tmbre, "__type__": "update"}, + ) + + +def preprocess_dataset(trainset_dir, exp_dir, sr, n_p): + sr = sr_dict[sr] + os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True) + f = open("%s/logs/%s/preprocess.log" % (now_dir, exp_dir), "w") + f.close() + per = 3.0 if config.is_half else 3.7 + cmd = ( + '"%s" lib/infer/modules/train/preprocess.py "%s" %s %s "%s/logs/%s" %s %.1f' + % ( + config.python_cmd, + trainset_dir, + sr, + n_p, + now_dir, + exp_dir, + config.noparallel, + per, + ) + ) + logger.info(cmd) + p = Popen(cmd, shell=True) # , stdin=PIPE, stdout=PIPE,stderr=PIPE,cwd=now_dir + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + done = [False] + threading.Thread( + target=if_done, + args=( + done, + p, + ), + ).start() + while 1: + with open("%s/logs/%s/preprocess.log" % (now_dir, exp_dir), "r") as f: + yield (f.read()) + sleep(1) + if done[0]: + break + with open("%s/logs/%s/preprocess.log" % (now_dir, exp_dir), "r") as f: + log = f.read() + logger.info(log) + yield log + + +def extract_f0_feature( + gpus, n_p, f0method, if_f0, exp_dir, version19, echl +): + gpus_rmvpe = gpus + gpus = gpus.split("-") + os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True) + f = open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "w") + f.close() + if if_f0: + if f0method != "rmvpe_gpu": + cmd = ( + '"%s" lib/infer/modules/train/extract/extract_f0_print.py "%s/logs/%s" %s %s' + % ( + config.python_cmd, + now_dir, + exp_dir, + n_p, + f0method, + ) + ) + logger.info(cmd) + p = Popen( + cmd, shell=True, cwd=now_dir + ) # , stdin=PIPE, stdout=PIPE,stderr=PIPE + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + done = [False] + threading.Thread( + target=if_done, + args=( + done, + p, + ), + ).start() + else: + if gpus_rmvpe != "-": + gpus_rmvpe = gpus_rmvpe.split("-") + leng = len(gpus_rmvpe) + ps = [] + for idx, n_g in enumerate(gpus_rmvpe): + cmd = ( + '"%s" lib/infer/modules/train/extract/extract_f0_rmvpe.py %s %s %s "%s/logs/%s" %s ' + % ( + config.python_cmd, + leng, + idx, + n_g, + now_dir, + exp_dir, + config.is_half, + ) + ) + logger.info(cmd) + p = Popen( + cmd, shell=True, cwd=now_dir + ) # , shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=now_dir + ps.append(p) + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + done = [False] + threading.Thread( + target=if_done_multi, # + args=( + done, + ps, + ), + ).start() + else: + cmd = ( + config.python_cmd + + ' lib/infer/modules/train/extract/extract_f0_rmvpe_dml.py "%s/logs/%s" ' + % ( + now_dir, + exp_dir, + ) + ) + logger.info(cmd) + p = Popen( + cmd, shell=True, cwd=now_dir + ) # , shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=now_dir + p.wait() + done = [True] + while 1: + with open( + "%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "r" + ) as f: + yield (f.read()) + sleep(1) + if done[0]: + break + with open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "r") as f: + log = f.read() + logger.info(log) + yield log + ####对不同part分别开多进程 + """ + n_part=int(sys.argv[1]) + i_part=int(sys.argv[2]) + i_gpu=sys.argv[3] + exp_dir=sys.argv[4] + os.environ["CUDA_VISIBLE_DEVICES"]=str(i_gpu) + """ + leng = len(gpus) + ps = [] + for idx, n_g in enumerate(gpus): + cmd = ( + '"%s" lib/infer/modules/train/extract_feature_print.py %s %s %s %s "%s/logs/%s" %s' + % ( + config.python_cmd, + config.device, + leng, + idx, + n_g, + now_dir, + exp_dir, + version19, + ) + ) + logger.info(cmd) + p = Popen( + cmd, shell=True, cwd=now_dir + ) # , shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=now_dir + ps.append(p) + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + done = [False] + threading.Thread( + target=if_done_multi, + args=( + done, + ps, + ), + ).start() + while 1: + with open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "r") as f: + yield (f.read()) + sleep(1) + if done[0]: + break + with open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "r") as f: + log = f.read() + logger.info(log) + yield log + + +def get_pretrained_models(path_str, f0_str, sr2): + if_pretrained_generator_exist = os.access( + "assets/pretrained%s/%sG%s.pth" % (path_str, f0_str, sr2), os.F_OK + ) + if_pretrained_discriminator_exist = os.access( + "assets/pretrained%s/%sD%s.pth" % (path_str, f0_str, sr2), os.F_OK + ) + if not if_pretrained_generator_exist: + logger.warn( + "assets/pretrained%s/%sG%s.pth not exist, will not use pretrained model", + path_str, + f0_str, + sr2, + ) + if not if_pretrained_discriminator_exist: + logger.warn( + "assets/pretrained%s/%sD%s.pth not exist, will not use pretrained model", + path_str, + f0_str, + sr2, + ) + return ( + "assets/pretrained%s/%sG%s.pth" % (path_str, f0_str, sr2) + if if_pretrained_generator_exist + else "", + "assets/pretrained%s/%sD%s.pth" % (path_str, f0_str, sr2) + if if_pretrained_discriminator_exist + else "", + ) + + +def change_sr2(sr2, if_f0_3, version19): + path_str = "" if version19 == "v1" else "_v2" + f0_str = "f0" if if_f0_3 else "" + return get_pretrained_models(path_str, f0_str, sr2) + + +def change_version19(sr2, if_f0_3, version19): + path_str = "" if version19 == "v1" else "_v2" + if sr2 == "32k" and version19 == "v1": + sr2 = "40k" + to_return_sr2 = ( + {"choices": ["40k", "48k"], "__type__": "update", "value": sr2} + if version19 == "v1" + else {"choices": ["40k", "48k", "32k"], "__type__": "update", "value": sr2} + ) + f0_str = "f0" if if_f0_3 else "" + return ( + *get_pretrained_models(path_str, f0_str, sr2), + to_return_sr2, + ) + + +def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D15 + path_str = "" if version19 == "v1" else "_v2" + return ( + {"visible": if_f0_3, "__type__": "update"}, + *get_pretrained_models(path_str, "f0", sr2), + ) + + +global log_interval + + +def set_log_interval(exp_dir, batch_size12): + log_interval = 1 + folder_path = os.path.join(exp_dir, "1_16k_wavs") + + if os.path.isdir(folder_path): + wav_files_num = len(glob1(folder_path, "*.wav")) + + if wav_files_num > 0: + log_interval = math.ceil(wav_files_num / batch_size12) + if log_interval > 1: + log_interval += 1 + + return log_interval + + +global PID, PROCESS + + +def click_train( + exp_dir1, + sr2, + if_f0_3, + spk_id5, + save_epoch10, + total_epoch11, + batch_size12, + if_save_latest13, + pretrained_G14, + pretrained_D15, + gpus16, + if_cache_gpu17, + if_save_every_weights18, + version19, +): + CSVutil("lib/csvdb/stop.csv", "w+", "formanting", False) + # 生成filelist + exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) + os.makedirs(exp_dir, exist_ok=True) + gt_wavs_dir = "%s/0_gt_wavs" % (exp_dir) + feature_dir = ( + "%s/3_feature256" % (exp_dir) + if version19 == "v1" + else "%s/3_feature768" % (exp_dir) + ) + if if_f0_3: + f0_dir = "%s/2a_f0" % (exp_dir) + f0nsf_dir = "%s/2b-f0nsf" % (exp_dir) + names = ( + set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) + & set([name.split(".")[0] for name in os.listdir(feature_dir)]) + & set([name.split(".")[0] for name in os.listdir(f0_dir)]) + & set([name.split(".")[0] for name in os.listdir(f0nsf_dir)]) + ) + else: + names = set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) & set( + [name.split(".")[0] for name in os.listdir(feature_dir)] + ) + opt = [] + for name in names: + if if_f0_3: + opt.append( + "%s/%s.wav|%s/%s.npy|%s/%s.wav.npy|%s/%s.wav.npy|%s" + % ( + gt_wavs_dir.replace("\\", "\\\\"), + name, + feature_dir.replace("\\", "\\\\"), + name, + f0_dir.replace("\\", "\\\\"), + name, + f0nsf_dir.replace("\\", "\\\\"), + name, + spk_id5, + ) + ) + else: + opt.append( + "%s/%s.wav|%s/%s.npy|%s" + % ( + gt_wavs_dir.replace("\\", "\\\\"), + name, + feature_dir.replace("\\", "\\\\"), + name, + spk_id5, + ) + ) + fea_dim = 256 if version19 == "v1" else 768 + if if_f0_3: + for _ in range(2): + opt.append( + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" + % (now_dir, sr2, now_dir, fea_dim, now_dir, now_dir, spk_id5) + ) + else: + for _ in range(2): + opt.append( + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s" + % (now_dir, sr2, now_dir, fea_dim, spk_id5) + ) + shuffle(opt) + with open("%s/filelist.txt" % exp_dir, "w") as f: + f.write("\n".join(opt)) + logger.debug("Write filelist done") + logger.info("Use gpus: %s", str(gpus16)) + if pretrained_G14 == "": + logger.info("No pretrained Generator") + if pretrained_D15 == "": + logger.info("No pretrained Discriminator") + if version19 == "v1" or sr2 == "40k": + config_path = "v1/%s.json" % sr2 + else: + config_path = "v2/%s.json" % sr2 + config_save_path = os.path.join(exp_dir, "config.json") + if not pathlib.Path(config_save_path).exists(): + with open(config_save_path, "w", encoding="utf-8") as f: + json.dump( + config.json_config[config_path], + f, + ensure_ascii=False, + indent=4, + sort_keys=True, + ) + f.write("\n") + if gpus16: + cmd = ( + '"%s" lib/infer/modules/train/train.py -e "%s" -sr %s -f0 %s -bs %s -g %s -te %s -se %s %s %s -l %s -c %s -sw %s -v %s' + % ( + config.python_cmd, + exp_dir1, + sr2, + 1 if if_f0_3 else 0, + batch_size12, + gpus16, + total_epoch11, + save_epoch10, + "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "", + "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "", + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, + version19, + ) + ) + else: + cmd = ( + '"%s" lib/infer/modules/train/train.py -e "%s" -sr %s -f0 %s -bs %s -te %s -se %s %s %s -l %s -c %s -sw %s -v %s' + % ( + config.python_cmd, + exp_dir1, + sr2, + 1 if if_f0_3 else 0, + batch_size12, + total_epoch11, + save_epoch10, + "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "", + "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "", + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, + version19, + ) + ) + logger.info(cmd) + global p + p = Popen(cmd, shell=True, cwd=now_dir) + global PID + PID = p.pid + + p.wait() + + return ( + i18n("Training is done, check train.log"), + {"visible": False, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + ) + + +def train_index(exp_dir1, version19): + # exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) + exp_dir = "logs/%s" % (exp_dir1) + os.makedirs(exp_dir, exist_ok=True) + feature_dir = ( + "%s/3_feature256" % (exp_dir) + if version19 == "v1" + else "%s/3_feature768" % (exp_dir) + ) + if not os.path.exists(feature_dir): + return "Please do the feature extraction first" + listdir_res = list(os.listdir(feature_dir)) + if len(listdir_res) == 0: + return "Please perform the feature extraction first" + infos = [] + npys = [] + for name in sorted(listdir_res): + phone = np.load("%s/%s" % (feature_dir, name)) + npys.append(phone) + big_npy = np.concatenate(npys, 0) + big_npy_idx = np.arange(big_npy.shape[0]) + np.random.shuffle(big_npy_idx) + big_npy = big_npy[big_npy_idx] + if big_npy.shape[0] > 2e5: + infos.append("Trying doing kmeans %s shape to 10k centers." % big_npy.shape[0]) + yield "\n".join(infos) + try: + big_npy = ( + MiniBatchKMeans( + n_clusters=10000, + verbose=True, + batch_size=256 * config.n_cpu, + compute_labels=False, + init="random", + ) + .fit(big_npy) + .cluster_centers_ + ) + except: + info = traceback.format_exc() + logger.info(info) + infos.append(info) + yield "\n".join(infos) + + np.save("%s/total_fea.npy" % exp_dir, big_npy) + n_ivf = min(int(16 * np.sqrt(big_npy.shape[0])), big_npy.shape[0] // 39) + infos.append("%s,%s" % (big_npy.shape, n_ivf)) + yield "\n".join(infos) + index = faiss.index_factory(256 if version19 == "v1" else 768, "IVF%s,Flat" % n_ivf) + # index = faiss.index_factory(256if version19=="v1"else 768, "IVF%s,PQ128x4fs,RFlat"%n_ivf) + infos.append("training") + yield "\n".join(infos) + index_ivf = faiss.extract_index_ivf(index) # + index_ivf.nprobe = 1 + index.train(big_npy) + faiss.write_index( + index, + "%s/trained_IVF%s_Flat_nprobe_%s_%s_%s.index" + % (exp_dir, n_ivf, index_ivf.nprobe, exp_dir1, version19), + ) + + infos.append("adding") + yield "\n".join(infos) + batch_size_add = 8192 + for i in range(0, big_npy.shape[0], batch_size_add): + index.add(big_npy[i : i + batch_size_add]) + faiss.write_index( + index, + "%s/added_IVF%s_Flat_nprobe_%s_%s_%s.index" + % (exp_dir, n_ivf, index_ivf.nprobe, exp_dir1, version19), + ) + infos.append( + "Successful Index Construction,added_IVF%s_Flat_nprobe_%s_%s_%s.index" + % (n_ivf, index_ivf.nprobe, exp_dir1, version19) + ) + yield "\n".join(infos) + + +def change_info_(ckpt_path): + if not os.path.exists(ckpt_path.replace(os.path.basename(ckpt_path), "train.log")): + return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"} + try: + with open( + ckpt_path.replace(os.path.basename(ckpt_path), "train.log"), "r" + ) as f: + info = eval(f.read().strip("\n").split("\n")[0].split("\t")[-1]) + sr, f0 = info["sample_rate"], info["if_f0"] + version = "v2" if ("version" in info and info["version"] == "v2") else "v1" + return sr, str(f0), version + except: + traceback.print_exc() + return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"} + + +F0GPUVisible = config.dml == False + + +import re as regex +import scipy.io.wavfile as wavfile + +cli_current_page = "HOME" + + +def cli_split_command(com): + exp = r'(?:(?<=\s)|^)"(.*?)"(?=\s|$)|(\S+)' + split_array = regex.findall(exp, com) + split_array = [group[0] if group[0] else group[1] for group in split_array] + return split_array + + +def execute_generator_function(genObject): + for _ in genObject: + pass + + +def cli_infer(com): + # get VC first + com = cli_split_command(com) + model_name = com[0] + source_audio_path = com[1] + output_file_name = com[2] + feature_index_path = com[3] + f0_file = None # Not Implemented Yet + + # Get parameters for inference + speaker_id = int(com[4]) + transposition = float(com[5]) + f0_method = com[6] + crepe_hop_length = int(com[7]) + harvest_median_filter = int(com[8]) + resample = int(com[9]) + mix = float(com[10]) + feature_ratio = float(com[11]) + protection_amnt = float(com[12]) + protect1 = 0.5 + + if com[14] == "False" or com[14] == "false": + DoFormant = False + Quefrency = 0.0 + Timbre = 0.0 + CSVutil( + "lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, Quefrency, Timbre + ) + + else: + DoFormant = True + Quefrency = float(com[15]) + Timbre = float(com[16]) + CSVutil( + "lib/csvdb/formanting.csv", "w+", "formanting", DoFormant, Quefrency, Timbre + ) + + print("Applio-RVC-Fork Infer-CLI: Starting the inference...") + vc_data = vc.get_vc(model_name, protection_amnt, protect1) + print(vc_data) + print("Applio-RVC-Fork Infer-CLI: Performing inference...") + conversion_data = vc.vc_single( + speaker_id, + source_audio_path, + transposition, + f0_file, + f0_method, + feature_index_path, + feature_index_path, + feature_ratio, + harvest_median_filter, + resample, + mix, + protection_amnt, + crepe_hop_length, + ) + if "Success." in conversion_data[0]: + print( + "Applio-RVC-Fork Infer-CLI: Inference succeeded. Writing to %s/%s..." + % ("assets", "audios", "audio-outputs", output_file_name) + ) + wavfile.write( + "%s/%s" % ("assets", "audios", "audio-outputs", output_file_name), + conversion_data[1][0], + conversion_data[1][1], + ) + print( + "Applio-RVC-Fork Infer-CLI: Finished! Saved output to %s/%s" + % ("assets", "audios", "audio-outputs", output_file_name) + ) + else: + print("Applio-RVC-Fork Infer-CLI: Inference failed. Here's the traceback: ") + print(conversion_data[0]) + + +def cli_pre_process(com): + com = cli_split_command(com) + model_name = com[0] + trainset_directory = com[1] + sample_rate = com[2] + num_processes = int(com[3]) + + print("Applio-RVC-Fork Pre-process: Starting...") + generator = preprocess_dataset( + trainset_directory, model_name, sample_rate, num_processes + ) + execute_generator_function(generator) + print("Applio-RVC-Fork Pre-process: Finished") + + +def cli_extract_feature(com): + com = cli_split_command(com) + model_name = com[0] + gpus = com[1] + num_processes = int(com[2]) + has_pitch_guidance = True if (int(com[3]) == 1) else False + f0_method = com[4] + crepe_hop_length = int(com[5]) + version = com[6] # v1 or v2 + + print("Applio-RVC-CLI: Extract Feature Has Pitch: " + str(has_pitch_guidance)) + print("Applio-RVC-CLI: Extract Feature Version: " + str(version)) + print("Applio-RVC-Fork Feature Extraction: Starting...") + generator = extract_f0_feature( + gpus, + num_processes, + f0_method, + has_pitch_guidance, + model_name, + version, + crepe_hop_length, + ) + execute_generator_function(generator) + print("Applio-RVC-Fork Feature Extraction: Finished") + + +def cli_train(com): + com = cli_split_command(com) + model_name = com[0] + sample_rate = com[1] + has_pitch_guidance = True if (int(com[2]) == 1) else False + speaker_id = int(com[3]) + save_epoch_iteration = int(com[4]) + total_epoch = int(com[5]) # 10000 + batch_size = int(com[6]) + gpu_card_slot_numbers = com[7] + if_save_latest = True if (int(com[8]) == 1) else False + if_cache_gpu = True if (int(com[9]) == 1) else False + if_save_every_weight = True if (int(com[10]) == 1) else False + version = com[11] + + pretrained_base = "pretrained/" if version == "v1" else "pretrained_v2/" + + g_pretrained_path = "%sf0G%s.pth" % (pretrained_base, sample_rate) + d_pretrained_path = "%sf0D%s.pth" % (pretrained_base, sample_rate) + + print("Applio-RVC-Fork Train-CLI: Training...") + click_train( + model_name, + sample_rate, + has_pitch_guidance, + speaker_id, + save_epoch_iteration, + total_epoch, + batch_size, + if_save_latest, + g_pretrained_path, + d_pretrained_path, + gpu_card_slot_numbers, + if_cache_gpu, + if_save_every_weight, + version, + ) + + +def cli_train_feature(com): + com = cli_split_command(com) + model_name = com[0] + version = com[1] + print("Applio-RVC-Fork Train Feature Index-CLI: Training... Please wait") + generator = train_index(model_name, version) + execute_generator_function(generator) + print("Applio-RVC-Fork Train Feature Index-CLI: Done!") + + +def cli_extract_model(com): + com = cli_split_command(com) + model_path = com[0] + save_name = com[1] + sample_rate = com[2] + has_pitch_guidance = com[3] + info = com[4] + version = com[5] + extract_small_model_process = extract_small_model( + model_path, save_name, sample_rate, has_pitch_guidance, info, version + ) + if extract_small_model_process == "Success.": + print("Applio-RVC-Fork Extract Small Model: Success!") + else: + print(str(extract_small_model_process)) + print("Applio-RVC-Fork Extract Small Model: Failed!") + + +def preset_apply(preset, qfer, tmbr): + if str(preset) != "": + with open(str(preset), "r") as p: + content = p.readlines() + qfer, tmbr = content[0].split("\n")[0], content[1] + formant_apply(qfer, tmbr) + else: + pass + return ( + {"value": qfer, "__type__": "update"}, + {"value": tmbr, "__type__": "update"}, + ) + + +def print_page_details(): + if cli_current_page == "HOME": + print( + "\n go home : Takes you back to home with a navigation list." + "\n go infer : Takes you to inference command execution." + "\n go pre-process : Takes you to training step.1) pre-process command execution." + "\n go extract-feature : Takes you to training step.2) extract-feature command execution." + "\n go train : Takes you to training step.3) being or continue training command execution." + "\n go train-feature : Takes you to the train feature index command execution." + "\n go extract-model : Takes you to the extract small model command execution." + ) + elif cli_current_page == "INFER": + print( + "\n arg 1) model name with .pth in ./weights: mi-test.pth" + "\n arg 2) source audio path: myFolder\\MySource.wav" + "\n arg 3) output file name to be placed in './audio-outputs': MyTest.wav" + "\n arg 4) feature index file path: logs/mi-test/added_IVF3042_Flat_nprobe_1.index" + "\n arg 5) speaker id: 0" + "\n arg 6) transposition: 0" + "\n arg 7) f0 method: harvest (pm, harvest, crepe, crepe-tiny, hybrid[x,x,x,x], mangio-crepe, mangio-crepe-tiny, rmvpe)" + "\n arg 8) crepe hop length: 160" + "\n arg 9) harvest median filter radius: 3 (0-7)" + "\n arg 10) post resample rate: 0" + "\n arg 11) mix volume envelope: 1" + "\n arg 12) feature index ratio: 0.78 (0-1)" + "\n arg 13) Voiceless Consonant Protection (Less Artifact): 0.33 (Smaller number = more protection. 0.50 means Dont Use.)" + "\n arg 14) Whether to formant shift the inference audio before conversion: False (if set to false, you can ignore setting the quefrency and timbre values for formanting)" + "\n arg 15)* Quefrency for formanting: 8.0 (no need to set if arg14 is False/false)" + "\n arg 16)* Timbre for formanting: 1.2 (no need to set if arg14 is False/false) \n" + "\nExample: mi-test.pth saudio/Sidney.wav myTest.wav logs/mi-test/added_index.index 0 -2 harvest 160 3 0 1 0.95 0.33 0.45 True 8.0 1.2" + ) + elif cli_current_page == "PRE-PROCESS": + print( + "\n arg 1) Model folder name in ./logs: mi-test" + "\n arg 2) Trainset directory: mydataset (or) E:\\my-data-set" + "\n arg 3) Sample rate: 40k (32k, 40k, 48k)" + "\n arg 4) Number of CPU threads to use: 8 \n" + "\nExample: mi-test mydataset 40k 24" + ) + elif cli_current_page == "EXTRACT-FEATURE": + print( + "\n arg 1) Model folder name in ./logs: mi-test" + "\n arg 2) Gpu card slot: 0 (0-1-2 if using 3 GPUs)" + "\n arg 3) Number of CPU threads to use: 8" + "\n arg 4) Has Pitch Guidance?: 1 (0 for no, 1 for yes)" + "\n arg 5) f0 Method: harvest (pm, harvest, dio, crepe)" + "\n arg 6) Crepe hop length: 128" + "\n arg 7) Version for pre-trained models: v2 (use either v1 or v2)\n" + "\nExample: mi-test 0 24 1 harvest 128 v2" + ) + elif cli_current_page == "TRAIN": + print( + "\n arg 1) Model folder name in ./logs: mi-test" + "\n arg 2) Sample rate: 40k (32k, 40k, 48k)" + "\n arg 3) Has Pitch Guidance?: 1 (0 for no, 1 for yes)" + "\n arg 4) speaker id: 0" + "\n arg 5) Save epoch iteration: 50" + "\n arg 6) Total epochs: 10000" + "\n arg 7) Batch size: 8" + "\n arg 8) Gpu card slot: 0 (0-1-2 if using 3 GPUs)" + "\n arg 9) Save only the latest checkpoint: 0 (0 for no, 1 for yes)" + "\n arg 10) Whether to cache training set to vram: 0 (0 for no, 1 for yes)" + "\n arg 11) Save extracted small model every generation?: 0 (0 for no, 1 for yes)" + "\n arg 12) Model architecture version: v2 (use either v1 or v2)\n" + "\nExample: mi-test 40k 1 0 50 10000 8 0 0 0 0 v2" + ) + elif cli_current_page == "TRAIN-FEATURE": + print( + "\n arg 1) Model folder name in ./logs: mi-test" + "\n arg 2) Model architecture version: v2 (use either v1 or v2)\n" + "\nExample: mi-test v2" + ) + elif cli_current_page == "EXTRACT-MODEL": + print( + "\n arg 1) Model Path: logs/mi-test/G_168000.pth" + "\n arg 2) Model save name: MyModel" + "\n arg 3) Sample rate: 40k (32k, 40k, 48k)" + "\n arg 4) Has Pitch Guidance?: 1 (0 for no, 1 for yes)" + '\n arg 5) Model information: "My Model"' + "\n arg 6) Model architecture version: v2 (use either v1 or v2)\n" + '\nExample: logs/mi-test/G_168000.pth MyModel 40k 1 "Created by Cole Mangio" v2' + ) + + +def change_page(page): + global cli_current_page + cli_current_page = page + return 0 + + +def execute_command(com): + if com == "go home": + return change_page("HOME") + elif com == "go infer": + return change_page("INFER") + elif com == "go pre-process": + return change_page("PRE-PROCESS") + elif com == "go extract-feature": + return change_page("EXTRACT-FEATURE") + elif com == "go train": + return change_page("TRAIN") + elif com == "go train-feature": + return change_page("TRAIN-FEATURE") + elif com == "go extract-model": + return change_page("EXTRACT-MODEL") + else: + if com[:3] == "go ": + print("page '%s' does not exist!" % com[3:]) + return 0 + + if cli_current_page == "INFER": + cli_infer(com) + elif cli_current_page == "PRE-PROCESS": + cli_pre_process(com) + elif cli_current_page == "EXTRACT-FEATURE": + cli_extract_feature(com) + elif cli_current_page == "TRAIN": + cli_train(com) + elif cli_current_page == "TRAIN-FEATURE": + cli_train_feature(com) + elif cli_current_page == "EXTRACT-MODEL": + cli_extract_model(com) + + +def cli_navigation_loop(): + while True: + print("\nYou are currently in '%s':" % cli_current_page) + print_page_details() + command = input("%s: " % cli_current_page) + try: + execute_command(command) + except: + print(traceback.format_exc()) + + +if config.is_cli: + print("\n\nApplio-RVC-Fork CLI\n") + print( + "Welcome to the CLI version of RVC. Please read the documentation on README.MD to understand how to use this app.\n" + ) + cli_navigation_loop() + + +def switch_pitch_controls(f0method0): + is_visible = f0method0 != "rmvpe" + + if rvc_globals.NotesOrHertz: + return ( + {"visible": False, "__type__": "update"}, + {"visible": is_visible, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": is_visible, "__type__": "update"}, + ) + else: + return ( + {"visible": is_visible, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": is_visible, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + ) + + +def match_index(sid0: str) -> tuple: + sid0strip = re.sub(r"\.pth|\.onnx$", "", sid0) + sid0name = os.path.split(sid0strip)[-1] # Extract only the name, not the directory + + # Check if the sid0strip has the specific ending format _eXXX_sXXX + if re.match(r".+_e\d+_s\d+$", sid0name): + base_model_name = sid0name.rsplit("_", 2)[0] + else: + base_model_name = sid0name + + sid_directory = os.path.join(index_root, base_model_name) + directories_to_search = [sid_directory] if os.path.exists(sid_directory) else [] + directories_to_search.append(index_root) + + matching_index_files = [] + + for directory in directories_to_search: + for filename in os.listdir(directory): + if filename.endswith(".index") and "trained" not in filename: + # Condition to match the name + name_match = any( + name.lower() in filename.lower() + for name in [sid0name, base_model_name] + ) + + # If in the specific directory, it's automatically a match + folder_match = directory == sid_directory + + if name_match or folder_match: + index_path = os.path.join(directory, filename) + if index_path in indexes_list: + matching_index_files.append( + ( + index_path, + os.path.getsize(index_path), + " " not in filename, + ) + ) + + if matching_index_files: + # Sort by favoring files without spaces and by size (largest size first) + matching_index_files.sort(key=lambda x: (-x[2], -x[1])) + best_match_index_path = matching_index_files[0][0] + return best_match_index_path, best_match_index_path + + return "", "" + + +def stoptraining(mim): + if int(mim) == 1: + CSVutil("lib/csvdb/stop.csv", "w+", "stop", "True") + # p.terminate() + # p.kill() + try: + os.kill(PID, signal.SIGTERM) + except Exception as e: + print(f"Couldn't click due to {e}") + pass + else: + pass + + return ( + {"visible": False, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + ) + + +weights_dir = "weights/" + + +def note_to_hz(note_name): + SEMITONES = { + "C": -9, + "C#": -8, + "D": -7, + "D#": -6, + "E": -5, + "F": -4, + "F#": -3, + "G": -2, + "G#": -1, + "A": 0, + "A#": 1, + "B": 2, + } + pitch_class, octave = note_name[:-1], int(note_name[-1]) + semitone = SEMITONES[pitch_class] + note_number = 12 * (octave - 4) + semitone + frequency = 440.0 * (2.0 ** (1.0 / 12)) ** note_number + return frequency + + +def save_to_wav(record_button): + if record_button is None: + pass + else: + path_to_file = record_button + new_name = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".wav" + new_path = ".assets/audios/" + new_name + shutil.move(path_to_file, new_path) + return new_name + + +def save_to_wav2_edited(dropbox): + if dropbox is None: + pass + else: + file_path = dropbox.name + target_path = os.path.join("assets", "audios", os.path.basename(file_path)) + + if os.path.exists(target_path): + os.remove(target_path) + print("Replacing old dropdown file...") + + shutil.move(file_path, target_path) + return + + +def save_to_wav2(dropbox): + file_path = dropbox.name + target_path = os.path.join("assets", "audios", os.path.basename(file_path)) + + if os.path.exists(target_path): + os.remove(target_path) + print("Replacing old dropdown file...") + + shutil.move(file_path, target_path) + return target_path + + +def GradioSetup(): + default_weight = names[0] if names else "" + + with gr.Blocks( + theme="JohnSmith9982/small_and_pretty", title="Applio-RVC-Fork" + ) as app: + gr.HTML("

    🍏 Applio-RVC-Fork

    ") + with gr.Tabs(): + with gr.TabItem(i18n("Model Inference")): + with gr.Row(): + sid0 = gr.Dropdown( + label=i18n("Inferencing voice:"), + choices=sorted(names), + value=default_weight, + ) + refresh_button = gr.Button(i18n("Refresh"), variant="primary") + clean_button = gr.Button( + i18n("Unload voice to save GPU memory"), variant="primary" + ) + clean_button.click( + fn=lambda: ({"value": "", "__type__": "update"}), + inputs=[], + outputs=[sid0], + ) + + with gr.TabItem(i18n("Single")): + with gr.Row(): + spk_item = gr.Slider( + minimum=0, + maximum=2333, + step=1, + label=i18n("Select Speaker/Singer ID:"), + value=0, + visible=False, + interactive=True, + ) + + with gr.Group(): + with gr.Row(): + with gr.Column(): # First column for audio-related inputs + dropbox = gr.File(label=i18n("Drag your audio here:")) + record_button = gr.Audio( + source="microphone", + label=i18n("Or record an audio:"), + type="filepath", + ) + + best_match_index_path1, _ = match_index( + sid0.value + ) # Get initial index from default sid0 (first voice model in list) + + with gr.Column(): # Second column for pitch shift and other options + file_index2 = gr.Dropdown( + label=i18n( + "Auto-detect index path and select from the dropdown:" + ), + choices=get_indexes(), + value=best_match_index_path1, + interactive=True, + allow_custom_value=True, + ) + + with gr.Column(): + input_audio1 = gr.Dropdown( + label=i18n( + "Auto detect audio path and select from the dropdown:" + ), + choices=sorted(audio_paths), + value="", + interactive=True, + ) + vc_transform0 = gr.Number( + label=i18n( + "Transpose (integer, number of semitones, raise by an octave: 12, lower by an octave: -12):" + ), + value=0, + ) + + dropbox.upload( + fn=save_to_wav2, + inputs=[dropbox], + outputs=[], + ) + dropbox.upload( + fn=resources.change_choices2, + inputs=[], + outputs=[input_audio1], + ) + record_button.change( + fn=save_to_wav, + inputs=[record_button], + outputs=[], + ) + record_button.change( + fn=resources.change_choices2, + inputs=[], + outputs=[input_audio1], + ) + refresh_button.click( + fn=change_choices, + inputs=[], + outputs=[sid0, file_index2, input_audio1], + ) + # Create a checkbox for advanced settings + advanced_settings_checkbox = gr.Checkbox( + value=False, + label=i18n("Advanced Settings"), + interactive=True, + ) + + # Advanced settings container + with gr.Column( + visible=False + ) as advanced_settings: # Initially hidden + with gr.Row(label=i18n("Advanced Settings"), open=False): + with gr.Column(): + f0method0 = gr.Radio( + label=i18n( + "Select the pitch extraction algorithm:" + ), + choices=[ + "pm", + "harvest", + "dio", + "crepe", + "crepe-tiny", + "mangio-crepe", + "mangio-crepe-tiny", + "rmvpe", + "rmvpe+", + ], + value="rmvpe+", + interactive=True, + ) + f0_autotune = gr.Checkbox( + label="Enable autotune", interactive=True + ) + crepe_hop_length = gr.Slider( + minimum=1, + maximum=512, + step=1, + label=i18n( + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate." + ), + value=120, + interactive=True, + visible=False, + ) + filter_radius0 = gr.Slider( + minimum=0, + maximum=7, + label=i18n( + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness." + ), + value=3, + step=1, + interactive=True, + ) + + minpitch_slider = gr.Slider( + label=i18n("Min pitch:"), + info=i18n( + "Specify minimal pitch for inference [HZ]" + ), + step=0.1, + minimum=1, + scale=0, + value=50, + maximum=16000, + interactive=True, + visible=(not rvc_globals.NotesOrHertz) + and (f0method0.value != "rmvpe"), + ) + minpitch_txtbox = gr.Textbox( + label=i18n("Min pitch:"), + info=i18n( + "Specify minimal pitch for inference [NOTE][OCTAVE]" + ), + placeholder="C5", + visible=(rvc_globals.NotesOrHertz) + and (f0method0.value != "rmvpe"), + interactive=True, + ) + + maxpitch_slider = gr.Slider( + label=i18n("Max pitch:"), + info=i18n("Specify max pitch for inference [HZ]"), + step=0.1, + minimum=1, + scale=0, + value=1100, + maximum=16000, + interactive=True, + visible=(not rvc_globals.NotesOrHertz) + and (f0method0.value != "rmvpe"), + ) + maxpitch_txtbox = gr.Textbox( + label=i18n("Max pitch:"), + info=i18n( + "Specify max pitch for inference [NOTE][OCTAVE]" + ), + placeholder="C6", + visible=(rvc_globals.NotesOrHertz) + and (f0method0.value != "rmvpe"), + interactive=True, + ) + + file_index1 = gr.Textbox( + label=i18n("Feature search database file path:"), + value="", + interactive=True, + ) + + f0_file = gr.File( + label=i18n( + "F0 curve file (optional). One pitch per line. Replaces the default F0 and pitch modulation:" + ) + ) + + f0method0.change( + fn=lambda radio: ( + { + "visible": radio + in ["mangio-crepe", "mangio-crepe-tiny"], + "__type__": "update", + } + ), + inputs=[f0method0], + outputs=[crepe_hop_length], + ) + + f0method0.change( + fn=switch_pitch_controls, + inputs=[f0method0], + outputs=[ + minpitch_slider, + minpitch_txtbox, + maxpitch_slider, + maxpitch_txtbox, + ], + ) + + with gr.Column(): + resample_sr0 = gr.Slider( + minimum=0, + maximum=48000, + label=i18n( + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:" + ), + value=0, + step=1, + interactive=True, + ) + rms_mix_rate0 = gr.Slider( + minimum=0, + maximum=1, + label=i18n( + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:" + ), + value=0.25, + interactive=True, + ) + protect0 = gr.Slider( + minimum=0, + maximum=0.5, + label=i18n( + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:" + ), + value=0.33, + step=0.01, + interactive=True, + ) + index_rate1 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("Search feature ratio:"), + value=0.75, + interactive=True, + ) + formanting = gr.Checkbox( + value=bool(DoFormant), + label=i18n("Formant shift inference audio"), + info=i18n( + "Used for male to female and vice-versa conversions" + ), + interactive=True, + visible=True, + ) + + formant_preset = gr.Dropdown( + value="", + choices=get_fshift_presets(), + label=i18n("Browse presets for formanting"), + info=i18n( + "Presets are located in formantshiftcfg/ folder" + ), + visible=bool(DoFormant), + ) + + formant_refresh_button = gr.Button( + value="\U0001f504", + visible=bool(DoFormant), + variant="primary", + ) + + qfrency = gr.Slider( + value=Quefrency, + info=i18n("Default value is 1.0"), + label=i18n("Quefrency for formant shifting"), + minimum=0.0, + maximum=16.0, + step=0.1, + visible=bool(DoFormant), + interactive=True, + ) + + tmbre = gr.Slider( + value=Timbre, + info=i18n("Default value is 1.0"), + label=i18n("Timbre for formant shifting"), + minimum=0.0, + maximum=16.0, + step=0.1, + visible=bool(DoFormant), + interactive=True, + ) + frmntbut = gr.Button( + "Apply", variant="primary", visible=bool(DoFormant) + ) + + formant_preset.change( + fn=preset_apply, + inputs=[formant_preset, qfrency, tmbre], + outputs=[qfrency, tmbre], + ) + formanting.change( + fn=formant_enabled, + inputs=[ + formanting, + qfrency, + tmbre, + frmntbut, + formant_preset, + formant_refresh_button, + ], + outputs=[ + formanting, + qfrency, + tmbre, + frmntbut, + formant_preset, + formant_refresh_button, + ], + ) + frmntbut.click( + fn=formant_apply, + inputs=[qfrency, tmbre], + outputs=[qfrency, tmbre], + ) + formant_refresh_button.click( + fn=update_fshift_presets, + inputs=[formant_preset, qfrency, tmbre], + outputs=[formant_preset, qfrency, tmbre], + ) + + # Function to toggle advanced settings + def toggle_advanced_settings(checkbox): + return {"visible": checkbox, "__type__": "update"} + + # Attach the change event + advanced_settings_checkbox.change( + fn=toggle_advanced_settings, + inputs=[advanced_settings_checkbox], + outputs=[advanced_settings], + ) + + but0 = gr.Button(i18n("Convert"), variant="primary").style( + full_width=True + ) + + with gr.Row(): # Defines output info + output audio download after conversion + vc_output1 = gr.Textbox(label=i18n("Output information:")) + vc_output2 = gr.Audio( + label=i18n( + "Export audio (click on the three dots in the lower right corner to download)" + ) + ) + + with gr.Group(): # I think this defines the big convert button + with gr.Row(): + but0.click( + vc.vc_single, + [ + spk_item, + input_audio1, + vc_transform0, + f0_file, + f0method0, + file_index1, + file_index2, + index_rate1, + filter_radius0, + resample_sr0, + rms_mix_rate0, + protect0, + crepe_hop_length, + minpitch_slider, + minpitch_txtbox, + maxpitch_slider, + maxpitch_txtbox, + f0_autotune, + ], + [vc_output1, vc_output2], + ) + + with gr.TabItem(i18n("Batch")): # Dont Change + with gr.Group(): # Markdown explanation of batch inference + with gr.Row(): + with gr.Column(): + vc_transform1 = gr.Number( + label=i18n( + "Transpose (integer, number of semitones, raise by an octave: 12, lower by an octave: -12):" + ), + value=0, + ) + opt_input = gr.Textbox( + label=i18n("Specify output folder:"), value="opt" + ) + with gr.Column(): + file_index4 = gr.Dropdown( + label=i18n( + "Auto-detect index path and select from the dropdown:" + ), + choices=get_indexes(), + value=best_match_index_path1, + interactive=True, + ) + dir_input = gr.Textbox( + label=i18n( + "Enter the path of the audio folder to be processed (copy it from the address bar of the file manager):" + ), + value=os.path.join(now_dir, "assets", "audios"), + ) + sid0.select( + fn=match_index, + inputs=[sid0], + outputs=[file_index2, file_index4], + ) + + refresh_button.click( + fn=lambda: change_choices()[1], + inputs=[], + outputs=file_index4, + ) + + with gr.Column(): + inputs = gr.File( + file_count="multiple", + label=i18n( + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder." + ), + ) + with gr.Group(): + with gr.Row(): + with gr.Column(): + # Create a checkbox for advanced batch settings + advanced_settings_batch_checkbox = gr.Checkbox( + value=False, + label=i18n("Advanced Settings"), + interactive=True, + ) + + # Advanced batch settings container + with gr.Row( + visible=False + ) as advanced_settings_batch: # Initially hidden + with gr.Row( + label=i18n("Advanced Settings"), open=False + ): + with gr.Column(): + file_index3 = gr.Textbox( + label=i18n( + "Feature search database file path:" + ), + value="", + interactive=True, + ) + + f0_autotune = gr.Checkbox( + label="Enable autotune", + interactive=True, + ) + f0method1 = gr.Radio( + label=i18n( + "Select the pitch extraction algorithm:" + ), + choices=[ + "pm", + "harvest", + "dio", + "crepe", + "crepe-tiny", + "mangio-crepe", + "mangio-crepe-tiny", + "rmvpe", + ], + value="rmvpe", + interactive=True, + ) + + format1 = gr.Radio( + label=i18n("Export file format:"), + choices=["wav", "flac", "mp3", "m4a"], + value="wav", + interactive=True, + ) + + with gr.Column(): + resample_sr1 = gr.Slider( + minimum=0, + maximum=48000, + label=i18n( + "Resample the output audio in post-processing to the final sample rate. Set to 0 for no resampling:" + ), + value=0, + step=1, + interactive=True, + ) + rms_mix_rate1 = gr.Slider( + minimum=0, + maximum=1, + label=i18n( + "Use the volume envelope of the input to replace or mix with the volume envelope of the output. The closer the ratio is to 1, the more the output envelope is used:" + ), + value=1, + interactive=True, + ) + protect1 = gr.Slider( + minimum=0, + maximum=0.5, + label=i18n( + "Protect voiceless consonants and breath sounds to prevent artifacts such as tearing in electronic music. Set to 0.5 to disable. Decrease the value to increase protection, but it may reduce indexing accuracy:" + ), + value=0.33, + step=0.01, + interactive=True, + ) + filter_radius1 = gr.Slider( + minimum=0, + maximum=7, + label=i18n( + "If >=3: apply median filtering to the harvested pitch results. The value represents the filter radius and can reduce breathiness." + ), + value=3, + step=1, + interactive=True, + ) + + index_rate2 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("Search feature ratio:"), + value=0.75, + interactive=True, + ) + f0_autotune = gr.Checkbox( + label="Enable autotune", interactive=True + ) + crepe_hop_length = gr.Slider( + minimum=1, + maximum=512, + step=1, + label=i18n( + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate." + ), + value=120, + interactive=True, + visible=False, + ) + + but1 = gr.Button(i18n("Convert"), variant="primary") + vc_output3 = gr.Textbox( + label=i18n("Output information:") + ) + but1.click( + vc.vc_multi, + [ + spk_item, + dir_input, + opt_input, + inputs, + vc_transform1, + f0method1, + file_index3, + file_index4, + index_rate2, + filter_radius1, + resample_sr1, + rms_mix_rate1, + protect1, + format1, + crepe_hop_length, + minpitch_slider + if (not rvc_globals.NotesOrHertz) + else minpitch_txtbox, + maxpitch_slider + if (not rvc_globals.NotesOrHertz) + else maxpitch_txtbox, + f0_autotune, + ], + [vc_output3], + ) + + sid0.change( + fn=vc.get_vc, + inputs=[sid0, protect0, protect1], + outputs=[spk_item, protect0, protect1], + ) + if not sid0.value == "": + spk_item, protect0, protect1 = vc.get_vc( + sid0.value, protect0, protect1 + ) + + # spk_item, protect0, protect1 = vc.get_vc(sid0.value, protect0, protect1) + + # Function to toggle advanced settings + def toggle_advanced_settings_batch(checkbox): + return {"visible": checkbox, "__type__": "update"} + + # Attach the change event + advanced_settings_batch_checkbox.change( + fn=toggle_advanced_settings_batch, + inputs=[advanced_settings_batch_checkbox], + outputs=[advanced_settings_batch], + ) + + with gr.TabItem(i18n("Train")): + with gr.Accordion(label=i18n("Step 1: Processing data")): + with gr.Row(): + exp_dir1 = gr.Textbox( + label=i18n("Enter the model name:"), + value=i18n("Model_Name"), + ) + sr2 = gr.Radio( + label=i18n("Target sample rate:"), + choices=["40k", "48k", "32k"], + value="40k", + interactive=True, + ) + if_f0_3 = gr.Checkbox( + label=i18n("Whether the model has pitch guidance."), + value=True, + interactive=True, + ) + version19 = gr.Radio( + label=i18n("Version:"), + choices=["v1", "v2"], + value="v2", + interactive=True, + visible=True, + ) + np7 = gr.Slider( + minimum=1, + maximum=config.n_cpu, + step=1, + label=i18n("Number of CPU processes:"), + value=config.n_cpu, + interactive=True, + ) + with gr.Group(): + with gr.Accordion(label=i18n("Step 2: Skipping pitch extraction")): + with gr.Row(): + # trainset_dir4 = gr.Textbox( + # label=i18n("Enter the path of the training folder:"), value=os.path.join(now_dir, datasets_root) + # ) + with gr.Column(): + trainset_dir4 = gr.Dropdown( + choices=sorted(datasets), + label=i18n("Select your dataset:"), + value=get_dataset(), + ) + btn_update_dataset_list = gr.Button( + i18n("Update list"), variant="primary" + ) + spk_id5 = gr.Slider( + minimum=0, + maximum=4, + step=1, + label=i18n("Specify the model ID:"), + value=0, + interactive=True, + ) + btn_update_dataset_list.click( + resources.update_dataset_list, [spk_id5], trainset_dir4 + ) + but1 = gr.Button(i18n("Process data"), variant="primary") + info1 = gr.Textbox( + label=i18n("Output information:"), value="" + ) + but1.click( + preprocess_dataset, + [trainset_dir4, exp_dir1, sr2, np7], + [info1], + ) + with gr.Group(): + with gr.Accordion(label=i18n("Step 3: Extracting features")): + with gr.Row(): + with gr.Column(): + gpus6 = gr.Textbox( + label=i18n( + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:" + ), + value=gpus, + interactive=True, + ) + gpu_info9 = gr.Textbox( + label=i18n("GPU Information:"), + value=gpu_info, + visible=F0GPUVisible, + ) + with gr.Column(): + f0method8 = gr.Radio( + label=i18n( + "Select the pitch extraction algorithm:" + ), + choices=[ + "pm", + "harvest", + "dio", + "crepe", + "mangio-crepe", + "rmvpe", + "rmvpe_gpu", + ], + # [ MANGIO ]: Fork feature: Crepe on f0 extraction for training. + value="rmvpe", + interactive=True, + ) + + + extraction_crepe_hop_length = gr.Slider( + minimum=1, + maximum=512, + step=1, + label=i18n( + "Mangio-Crepe Hop Length (Only applies to mangio-crepe): Hop length refers to the time it takes for the speaker to jump to a dramatic pitch. Lower hop lengths take more time to infer but are more pitch accurate." + ), + value=64, + interactive=True, + visible=False, + ) + + f0method8.change( + fn=lambda radio: ( + { + "visible": radio + in ["mangio-crepe", "mangio-crepe-tiny"], + "__type__": "update", + } + ), + inputs=[f0method8], + outputs=[extraction_crepe_hop_length], + ) + but2 = gr.Button( + i18n("Feature extraction"), variant="primary" + ) + info2 = gr.Textbox( + label=i18n("Output information:"), + value="", + max_lines=8, + interactive=False, + ) + + but2.click( + extract_f0_feature, + [ + gpus6, + np7, + f0method8, + if_f0_3, + exp_dir1, + version19, + extraction_crepe_hop_length, + ], + [info2], + ) + with gr.Group(): + with gr.Row(): + with gr.Accordion(label=i18n("Step 4: Model training started")): + with gr.Row(): + save_epoch10 = gr.Slider( + minimum=1, + maximum=100, + step=1, + label=i18n("Save frequency:"), + value=10, + interactive=True, + visible=True, + ) + total_epoch11 = gr.Slider( + minimum=1, + maximum=10000, + step=2, + label=i18n("Training epochs:"), + value=750, + interactive=True, + ) + batch_size12 = gr.Slider( + minimum=1, + maximum=50, + step=1, + label=i18n("Batch size per GPU:"), + value=default_batch_size, + # value=20, + interactive=True, + ) + + with gr.Row(): + if_save_latest13 = gr.Checkbox( + label=i18n( + "Whether to save only the latest .ckpt file to save hard drive space" + ), + value=True, + interactive=True, + ) + if_cache_gpu17 = gr.Checkbox( + label=i18n( + "Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training" + ), + value=False, + interactive=True, + ) + if_save_every_weights18 = gr.Checkbox( + label=i18n( + "Save a small final model to the 'weights' folder at each save point" + ), + value=True, + interactive=True, + ) + + with gr.Row(): + pretrained_G14 = gr.Textbox( + lines=4, + label=i18n("Load pre-trained base model G path:"), + value="assets/pretrained_v2/f0G40k.pth", + interactive=True, + ) + pretrained_D15 = gr.Textbox( + lines=4, + label=i18n("Load pre-trained base model D path:"), + value="assets/pretrained_v2/f0D40k.pth", + interactive=True, + ) + gpus16 = gr.Textbox( + label=i18n( + "Provide the GPU index(es) separated by '-', like 0-1-2 for using GPUs 0, 1, and 2:" + ), + value=gpus, + interactive=True, + ) + sr2.change( + change_sr2, + [sr2, if_f0_3, version19], + [pretrained_G14, pretrained_D15], + ) + version19.change( + change_version19, + [sr2, if_f0_3, version19], + [pretrained_G14, pretrained_D15, sr2], + ) + if_f0_3.change( + fn=change_f0, + inputs=[if_f0_3, sr2, version19], + outputs=[f0method8, pretrained_G14, pretrained_D15], + ) + if_f0_3.change( + fn=lambda radio: ( + { + "visible": radio + in ["mangio-crepe", "mangio-crepe-tiny"], + "__type__": "update", + } + ), + inputs=[f0method8], + outputs=[extraction_crepe_hop_length], + ) + + butstop = gr.Button( + i18n("Stop training"), + variant="primary", + visible=False, + ) + but3 = gr.Button( + i18n("Train model"), variant="primary", visible=True + ) + but3.click( + fn=stoptraining, + inputs=[gr.Number(value=0, visible=False)], + outputs=[but3, butstop], + ) + butstop.click( + fn=stoptraining, + inputs=[gr.Number(value=1, visible=False)], + outputs=[but3, butstop], + ) + + with gr.Column(): + info3 = gr.Textbox( + label=i18n("Output information:"), + value="", + max_lines=4, + ) + save_action = gr.Dropdown( + label=i18n("Save type"), + choices=[ + i18n("Save all"), + i18n("Save D and G"), + i18n("Save voice"), + ], + value=i18n("Choose the method"), + interactive=True, + ) + + but7 = gr.Button( + i18n("Save model"), variant="primary" + ) + but4 = gr.Button( + i18n("Train feature index"), variant="primary" + ) + + if_save_every_weights18.change( + fn=lambda if_save_every_weights: ( + { + "visible": if_save_every_weights, + "__type__": "update", + } + ), + inputs=[if_save_every_weights18], + outputs=[save_epoch10], + ) + + but3.click( + click_train, + [ + exp_dir1, + sr2, + if_f0_3, + spk_id5, + save_epoch10, + total_epoch11, + batch_size12, + if_save_latest13, + pretrained_G14, + pretrained_D15, + gpus16, + if_cache_gpu17, + if_save_every_weights18, + version19, + ], + [info3, butstop, but3], + ) + + but4.click(train_index, [exp_dir1, version19], info3) + but7.click( + resources.save_model, [exp_dir1, save_action], info3 + ) + with gr.TabItem(i18n("UVR5")): # UVR section + with gr.Group(): + with gr.Row(): + with gr.Column(): + model_select = gr.Radio( + label=i18n("Model Architecture:"), + choices=["VR", "MDX"], + value="VR", + interactive=True, + ) + dir_wav_input = gr.Textbox( + label=i18n( + "Enter the path of the audio folder to be processed:" + ), + value=os.path.join(now_dir, "assets", "audios"), + ) + wav_inputs = gr.File( + file_count="multiple", + label=i18n( + "You can also input audio files in batches. Choose one of the two options. Priority is given to reading from the folder." + ), + ) + + with gr.Column(): + model_choose = gr.Dropdown( + label=i18n("Model:"), choices=uvr5_names + ) + agg = gr.Slider( + minimum=0, + maximum=20, + step=1, + label="Vocal Extraction Aggressive", + value=10, + interactive=True, + visible=False, + ) + opt_vocal_root = gr.Textbox( + label=i18n("Specify the output folder for vocals:"), + value="assets/audios", + ) + opt_ins_root = gr.Textbox( + label=i18n( + "Specify the output folder for accompaniment:" + ), + value="assets/audios/audio-others", + ) + format0 = gr.Radio( + label=i18n("Export file format:"), + choices=["wav", "flac", "mp3", "m4a"], + value="flac", + interactive=True, + ) + model_select.change( + fn=update_model_choices, + inputs=model_select, + outputs=model_choose, + ) + but2 = gr.Button(i18n("Convert"), variant="primary") + vc_output4 = gr.Textbox(label=i18n("Output information:")) + # wav_inputs.upload(fn=save_to_wav2_edited, inputs=[wav_inputs], outputs=[]) + but2.click( + uvr, + [ + model_choose, + dir_wav_input, + opt_vocal_root, + wav_inputs, + opt_ins_root, + agg, + format0, + model_select, + ], + [vc_output4], + ) + with gr.TabItem(i18n("TTS")): + with gr.Group(): + with gr.Column(): + text_test = gr.Textbox( + label=i18n("Text:"), + placeholder=i18n( + "Enter the text you want to convert to voice..." + ), + lines=6, + ) + + with gr.Group(): + with gr.Row(): + with gr.Column(): + tts_methods_voice = ["Edge-tts", "Bark-tts"] + ttsmethod_test = gr.Dropdown( + tts_methods_voice, + value="Edge-tts", + label=i18n("TTS Method:"), + visible=True, + ) + tts_test = gr.Dropdown( + tts.set_edge_voice, + label=i18n("TTS Model:"), + visible=True, + ) + ttsmethod_test.change( + fn=tts.update_tts_methods_voice, + inputs=ttsmethod_test, + outputs=tts_test, + ) + + with gr.Column(): + model_voice_path07 = gr.Dropdown( + label=i18n("RVC Model:"), + choices=sorted(names), + value=default_weight, + ) + best_match_index_path1, _ = match_index( + model_voice_path07.value + ) + + file_index2_07 = gr.Dropdown( + label=i18n("Select the .index file:"), + choices=get_indexes(), + value=best_match_index_path1, + interactive=True, + allow_custom_value=True, + ) + with gr.Row(): + refresh_button_ = gr.Button(i18n("Refresh"), variant="primary") + refresh_button_.click( + fn=change_choices2, + inputs=[], + outputs=[model_voice_path07, file_index2_07], + ) + with gr.Row(): + original_ttsvoice = gr.Audio(label=i18n("Audio TTS:")) + ttsvoice = gr.Audio(label=i18n("Audio RVC:")) + + with gr.Row(): + button_test = gr.Button(i18n("Convert"), variant="primary") + + button_test.click( + tts.use_tts, + inputs=[ + text_test, + tts_test, + model_voice_path07, + file_index2_07, + # transpose_test, + vc_transform0, + f0method8, + index_rate1, + crepe_hop_length, + f0_autotune, + ttsmethod_test, + ], + outputs=[ttsvoice, original_ttsvoice], + ) + + with gr.TabItem(i18n("Resources")): + resources.download_model() + resources.download_backup() + resources.download_dataset(trainset_dir4) + resources.download_audio() + resources.youtube_separator() + with gr.TabItem(i18n("Extra")): + gr.Markdown( + value=i18n( + "This section contains some extra utilities that often may be in experimental phases" + ) + ) + with gr.TabItem(i18n("Merge Audios")): + mergeaudios.merge_audios() + + with gr.TabItem(i18n("Processing")): + processing.processing_() + + with gr.TabItem(i18n("Settings")): + with gr.Row(): + with gr.Column(): + gr.Markdown(value=i18n("Pitch settings")) + noteshertz = gr.Checkbox( + label=i18n( + "Whether to use note names instead of their hertz value. E.G. [C5, D6] instead of [523.25, 1174.66]Hz" + ), + value=rvc_globals.NotesOrHertz, + interactive=True, + ) + + noteshertz.change( + fn=lambda nhertz: rvc_globals.__setattr__("NotesOrHertz", nhertz), + inputs=[noteshertz], + outputs=[], + ) + + noteshertz.change( + fn=switch_pitch_controls, + inputs=[f0method0], + outputs=[ + minpitch_slider, + minpitch_txtbox, + maxpitch_slider, + maxpitch_txtbox, + ], + ) + + with gr.TabItem(i18n("Readme")): + gr.Markdown(value=inforeadme) + return app + + +def GradioRun(app): + share_gradio_link = config.iscolab or config.paperspace + concurrency_count = 511 + max_size = 1022 + + if config.iscolab or config.paperspace: + app.queue(concurrency_count=concurrency_count, max_size=max_size).launch( + server_name="0.0.0.0", + inbrowser=not config.noautoopen, + server_port=config.listen_port, + quiet=True, + favicon_path="./assets/images/icon.png", + share=share_gradio_link, + ) + else: + app.queue(concurrency_count=concurrency_count, max_size=max_size).launch( + server_name="0.0.0.0", + inbrowser=not config.noautoopen, + server_port=config.listen_port, + quiet=True, + favicon_path="./assets/images/icon.png", + share=share_gradio_link, + ) + + +if __name__ == "__main__": + if os.name == "nt": + print( + i18n( + "Any ConnectionResetErrors post-conversion are irrelevant and purely visual; they can be ignored.\n" + ) + ) + app = GradioSetup() + GradioRun(app) \ No newline at end of file diff --git a/install_Applio.bat b/install_Applio.bat new file mode 100644 index 000000000..eeb6c98a6 --- /dev/null +++ b/install_Applio.bat @@ -0,0 +1,186 @@ +@echo off +Title Applio - Installer +setlocal + +::: +::: _ _ +::: /\ | (_) +::: / \ _ __ _ __ | |_ ___ +::: / /\ \ | '_ \| '_ \| | |/ _ \ +::: / ____ \| |_) | |_) | | | (_) | +::: /_/ \_\ .__/| .__/|_|_|\___/ +::: | | | | +::: |_| |_| +::: +::: + +set "repoUrl=https://github.com/IAHispano/Applio-RVC-Fork/archive/refs/heads/applio-recode.zip" +set "repoFolder=Applio-RVC-Fork" +set "fixesFolder=lib/fixes" +set "localFixesPy=local_fixes.py" +set "principal=%cd%\%repoFolder%" +set "URL_BASE=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main" +set "URL_EXTRA=https://huggingface.co/IAHispano/applio/resolve/main" + +echo. +cls +echo INFO: It's important not to run this installer as an administrator as it might cause issues, and it's recommended to disable antivirus or firewall, as errors might occur when downloading pretrained models. +echo. +pause + +cls +echo INFO: Please ensure you have installed the required dependencies before continuing. Refer to the installation guide for details. +echo. +echo Step-by-step guide: https://rentry.org/appliolocal +echo Build Tools: https://aka.ms/vs/17/release/vs_BuildTools.exe +echo Redistributable: https://aka.ms/vs/17/release/vc_redist.x64.exe +echo Git: https://github.com/git-for-windows/git/releases/download/v2.42.0.windows.2/Git-2.42.0.2-64-bit.exe +echo Python 3.9.8: https://www.python.org/ftp/python/3.9.8/python-3.9.8-amd64.exe +echo. +echo INFO: Its recommend installing Python 3.9.X and ensuring that it has been added to the system's path. +echo. +pause +cls + +for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do @echo(%%A +echo. + +echo Cloning the repository... +git clone %repoUrl% %repoFolder% +cd %repoFolder% +echo. + +echo Proceeding to download the models... +echo. + +echo Downloading the "pretrained" folder... +cd "assets/pretrained/" +curl -LJO "%URL_BASE%/pretrained/D32k.pth" +curl -LJO "%URL_BASE%/pretrained/D40k.pth" +curl -LJO "%URL_BASE%/pretrained/D48k.pth" +curl -LJO "%URL_BASE%/pretrained/G32k.pth" +curl -LJO "%URL_BASE%/pretrained/G40k.pth" +curl -LJO "%URL_BASE%/pretrained/G48k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D32k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D40k.pth" +curl -LJO "%URL_BASE%/pretrained/f0D48k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G32k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G40k.pth" +curl -LJO "%URL_BASE%/pretrained/f0G48k.pth" +cd ".." +echo. +cls + +echo Downloading the "pretrained_v2" folder... +cd "pretrained_v2" +curl -LJO "%URL_BASE%/pretrained_v2/D32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/D40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/D48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/G48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0D48k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G32k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G40k.pth" +curl -LJO "%URL_BASE%/pretrained_v2/f0G48k.pth" +cd ".." +echo. +cls + +echo Downloading the "uvr5_weights" folder... +cd "uvr5_weights" +curl -LJO "%URL_BASE%/uvr5_weights/HP2_all_vocals.pth" +curl -LJO "%URL_BASE%/uvr5_weights/HP3_all_vocals.pth" +curl -LJO "%URL_BASE%/uvr5_weights/HP5_only_main_vocal.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoAggressive.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoDeReverb.pth" +curl -LJO "%URL_BASE%/uvr5_weights/VR-DeEchoNormal.pth" +cd ".." +echo. +cls + +echo Downloading the rmvpe.pt file... +cd "rmvpe" +curl -LJO "%URL_BASE%/rmvpe.pt" +echo. +cls +cd ".." + +echo Downloading the hubert_base.pt file... +cd "hubert" +curl -LJO "%URL_BASE%/hubert_base.pt" +echo. +cls +cd ".." +cd ".." + +echo Downloading the ffmpeg.exe and ffprobe.exe file... +curl -LJO "%URL_BASE%/ffmpeg.exe" +curl -LJO "%URL_BASE%/ffprobe.exe" + +echo. +cls +cd assets + +echo Installing dependencies... + +echo [1] Nvidia graphics cards +echo [2] AMD / Intel graphics cards +echo [3] I have already installed the dependencies +echo. + +set /p choice=Select the option according to your GPU: +set choice=%choice: =% + +if "%choice%"=="1" ( +cls +pip install -r requirements/requirements.txt +echo. +pip uninstall torch torchvision torchaudio -y +echo. +pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu117 +echo. +echo. +cls +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +if "%choice%"=="2" ( +cls +pip install -r requirements/requirements.txt +pip install -r requirements/requirements-dml.txt +echo. +echo. +cls +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +if "%choice%"=="3" ( +echo Dependencies installed! +echo. +goto dependenciesFinished +) + +:dependenciesFinished +cls +cd ".." +echo Checking if the local_fixes.py file exists in the Fixes folder... +if exist "%fixesFolder%\%localFixesPy%" ( + echo Running the file... + python "%fixesFolder%\%localFixesPy%" +) else ( + echo The "%localFixesPy%" file was not found in the "Fixes" folder. +) +echo. + +cls +echo The fixes were successfully applied and Applio has been successfully downloaded, run the file go-applio.bat to run the web interface! +echo. +pause +exit diff --git a/lib/csvdb/formanting.csv b/lib/csvdb/formanting.csv new file mode 100644 index 000000000..bd72a81f6 --- /dev/null +++ b/lib/csvdb/formanting.csv @@ -0,0 +1 @@ +False,1.0,1.0 diff --git a/lib/csvdb/stop.csv b/lib/csvdb/stop.csv new file mode 100644 index 000000000..e69de29bb diff --git a/lib/fixes/local_fixes.py b/lib/fixes/local_fixes.py new file mode 100644 index 000000000..fa404bf68 --- /dev/null +++ b/lib/fixes/local_fixes.py @@ -0,0 +1,136 @@ +import os +import sys +import time +import shutil +import requests +import zipfile + +def insert_new_line(file_name, line_to_find, text_to_insert): + lines = [] + with open(file_name, 'r', encoding='utf-8') as read_obj: + lines = read_obj.readlines() + already_exists = False + with open(file_name + '.tmp', 'w', encoding='utf-8') as write_obj: + for i in range(len(lines)): + write_obj.write(lines[i]) + if lines[i].strip() == line_to_find: + # If next line exists and starts with sys.path.append, skip + if i+1 < len(lines) and lines[i+1].strip().startswith("sys.path.append"): + print('It was already fixed! Skip adding a line...') + already_exists = True + break + else: + write_obj.write(text_to_insert + '\n') + # If no existing sys.path.append line was found, replace the original file + if not already_exists: + os.replace(file_name + '.tmp', file_name) + return True + else: + # If existing line was found, delete temporary file + os.remove(file_name + '.tmp') + return False + +def replace_in_file(file_name, old_text, new_text): + with open(file_name, 'r', encoding='utf-8') as file: + file_contents = file.read() + + if old_text in file_contents: + file_contents = file_contents.replace(old_text, new_text) + with open(file_name, 'w', encoding='utf-8') as file: + file.write(file_contents) + return True + + return False + +if __name__ == "__main__": + current_path = os.getcwd() + file_name = os.path.join(current_path, "lib", "infer", "modules", "train", "extract", "extract_f0_print.py") + line_to_find = 'import numpy as np, logging' + text_to_insert = "sys.path.append(r'" + current_path + "')" + + + success_1 = insert_new_line(file_name, line_to_find, text_to_insert) + if success_1: + print('The first operation was successful!') + else: + print('He skipped the first operation because it was already fixed!') + + file_name = 'infer-web.py' + old_text = 'with gr.Blocks(theme=gr.themes.Soft()) as app:' + new_text = 'with gr.Blocks() as app:' + + success_2 = replace_in_file(file_name, old_text, new_text) + if success_2: + print('The second operation was successful!') + else: + print('The second operation was omitted because it was already fixed!') + + print('Local corrections successful! You should now be able to infer and train locally in Applio RVC Fork.') + + time.sleep(5) + +def find_torchcrepe_directory(directory): + """ + Recursively searches for the topmost folder named 'torchcrepe' within a directory. + Returns the path of the directory found or None if none is found. + """ + for root, dirs, files in os.walk(directory): + if 'torchcrepe' in dirs: + return os.path.join(root, 'torchcrepe') + return None + +def download_and_extract_torchcrepe(): + url = 'https://github.com/maxrmorrison/torchcrepe/archive/refs/heads/master.zip' + temp_dir = 'temp_torchcrepe' + destination_dir = os.getcwd() + + try: + torchcrepe_dir_path = os.path.join(destination_dir, 'torchcrepe') + + if os.path.exists(torchcrepe_dir_path): + print("Skipping the torchcrepe download. The folder already exists.") + return + + # Download the file + print("Starting torchcrepe download...") + response = requests.get(url) + + # Raise an error if the GET request was unsuccessful + response.raise_for_status() + print("Download completed.") + + # Save the downloaded file + zip_file_path = os.path.join(temp_dir, 'master.zip') + os.makedirs(temp_dir, exist_ok=True) + with open(zip_file_path, 'wb') as file: + file.write(response.content) + print(f"Zip file saved to {zip_file_path}") + + # Extract the zip file + print("Extracting content...") + with zipfile.ZipFile(zip_file_path, 'r') as zip_file: + zip_file.extractall(temp_dir) + print("Extraction completed.") + + # Locate the torchcrepe folder and move it to the destination directory + torchcrepe_dir = find_torchcrepe_directory(temp_dir) + if torchcrepe_dir: + shutil.move(torchcrepe_dir, destination_dir) + print(f"Moved the torchcrepe directory to {destination_dir}!") + else: + print("The torchcrepe directory could not be located.") + + except Exception as e: + print("Torchcrepe not successfully downloaded", e) + + # Clean up temporary directory + if os.path.exists(temp_dir): + shutil.rmtree(temp_dir) + +# Run the function +download_and_extract_torchcrepe() + +temp_dir = 'temp_torchcrepe' + +if os.path.exists(temp_dir): + shutil.rmtree(temp_dir) diff --git a/lib/fixes/tensor-launch.py b/lib/fixes/tensor-launch.py new file mode 100644 index 000000000..cd4ec997f --- /dev/null +++ b/lib/fixes/tensor-launch.py @@ -0,0 +1,15 @@ +import threading +import time +from tensorboard import program +import os + +log_path = "logs" + +if __name__ == "__main__": + tb = program.TensorBoard() + tb.configure(argv=[None, '--logdir', log_path]) + url = tb.launch() + print(f'Tensorboard can be accessed at: {url}') + + while True: + time.sleep(600) # Keep the main thread running \ No newline at end of file diff --git a/lib/globals/__pycache__/globals.cpython-39.pyc b/lib/globals/__pycache__/globals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd3726f4c00b097139bbcbcf15cca2227f3417f8 GIT binary patch literal 343 zcmYk0%}T>S6on_hZ6(!LaN9-P2ri^(wWYYKSZx`cZMUz;}b?Yat~f9KfB?-JQ`+n^cC5Ly0zg;Rc8upv_b>=Q9Xb% zAFIhgIrPT*8KSgjX)2lqjW889I!%?^-35h2VN};w`D90?h8=hIy`5k4jRvK8Ez}P9 z0^b{2&o#f>?`4I*5wExNn0mg&YuI59@jZyvRK|okrTN;4X9ft literal 0 HcmV?d00001 diff --git a/lib/globals/globals.py b/lib/globals/globals.py new file mode 100644 index 000000000..d0da59d56 --- /dev/null +++ b/lib/globals/globals.py @@ -0,0 +1,5 @@ +DoFormant: bool = False +Quefrency: float = 8.0 +Timbre: float = 1.2 + +NotesOrHertz: bool = False \ No newline at end of file diff --git a/lib/infer/infer_libs/__pycache__/audio.cpython-39.pyc b/lib/infer/infer_libs/__pycache__/audio.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c32402c7299bf57dd91be158d3da4145ebd11e5a GIT binary patch literal 4286 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 literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/__pycache__/csvutil.cpython-39.pyc b/lib/infer/infer_libs/__pycache__/csvutil.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06ddaeab56e323f9e7b1167f734ce81a4903a06a GIT binary patch literal 1137 zcmZ`(OK;Oa5Z;#^$4MXRsZ}pk#i6N4MG+@dl}Dl6a%iA{6$!c7O=RLn*mW9O*<8{i zRr?cKiA(=JIGMw=F9GOA!5kY^z35F?Zk zj(g-3%h?Qb(j)RiiZV39Cp$SyaZ1i;#?J8w=T>HMG{EvXSh|1;nXK5Km9>C6GtG5L%W?sMt+ zJ+C?mHd)8fV*oh=)c+P$7G2S$$zx|>qgFv7>|zIGn%X~a5$DIU&9F-to`*S$r}14l zn=>o92+{CLD;`8pNfP%pNtCAQK*2-(m?x2(gAfyU4cD~QfIAye!Uv()EWQ*~{9hdA JV28l8egS@-5%mB7 literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/__pycache__/rmvpe.cpython-39.pyc b/lib/infer/infer_libs/__pycache__/rmvpe.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcf4424b8a4e829453256a4fce5bc9a357255fff GIT binary patch literal 19090 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 1 else 1.0 + tmb = args[2] if len(args) > 2 else 1.0 + with open(file, rw, newline="") as fileCSVwrite: + csv_writer = csv.writer(fileCSVwrite, delimiter=",") + csv_writer.writerow([doformnt, qfr, tmb]) + elif type == "stop": + stop = args[0] if args else False + with open(file, rw, newline="") as fileCSVwrite: + csv_writer = csv.writer(fileCSVwrite, delimiter=",") + csv_writer.writerow([stop]) + diff --git a/lib/infer/infer_libs/formantshiftcfg/f2m.txt b/lib/infer/infer_libs/formantshiftcfg/f2m.txt new file mode 100644 index 000000000..40356a80c --- /dev/null +++ b/lib/infer/infer_libs/formantshiftcfg/f2m.txt @@ -0,0 +1,2 @@ +1.0 +0.8 \ No newline at end of file diff --git a/lib/infer/infer_libs/formantshiftcfg/m2f.txt b/lib/infer/infer_libs/formantshiftcfg/m2f.txt new file mode 100644 index 000000000..fa69b52dc --- /dev/null +++ b/lib/infer/infer_libs/formantshiftcfg/m2f.txt @@ -0,0 +1,2 @@ +1.0 +1.2 \ No newline at end of file diff --git a/lib/infer/infer_libs/formantshiftcfg/random.txt b/lib/infer/infer_libs/formantshiftcfg/random.txt new file mode 100644 index 000000000..427be5c80 --- /dev/null +++ b/lib/infer/infer_libs/formantshiftcfg/random.txt @@ -0,0 +1,2 @@ +32.0 +9.8 \ No newline at end of file diff --git a/lib/infer/infer_libs/infer_batch_rvc.py b/lib/infer/infer_libs/infer_batch_rvc.py new file mode 100644 index 000000000..4b60acd12 --- /dev/null +++ b/lib/infer/infer_libs/infer_batch_rvc.py @@ -0,0 +1,215 @@ +""" +v1 +runtime\python.exe myinfer-v2-0528.py 0 "E:\codes\py39\RVC-beta\todo-songs" "E:\codes\py39\logs\mi-test\added_IVF677_Flat_nprobe_7.index" harvest "E:\codes\py39\RVC-beta\output" "E:\codes\py39\test-20230416b\weights\mi-test.pth" 0.66 cuda:0 True 3 0 1 0.33 +v2 +runtime\python.exe myinfer-v2-0528.py 0 "E:\codes\py39\RVC-beta\todo-songs" "E:\codes\py39\test-20230416b\logs\mi-test-v2\aadded_IVF677_Flat_nprobe_1_v2.index" harvest "E:\codes\py39\RVC-beta\output_v2" "E:\codes\py39\test-20230416b\weights\mi-test-v2.pth" 0.66 cuda:0 True 3 0 1 0.33 +""" +import os, sys, pdb, torch + +now_dir = os.getcwd() +sys.path.append(now_dir) +import sys +import torch +import tqdm as tq +from multiprocessing import cpu_count + + +class Config: + def __init__(self, device, is_half): + self.device = device + self.is_half = is_half + self.n_cpu = 0 + self.gpu_name = None + self.gpu_mem = None + self.x_pad, self.x_query, self.x_center, self.x_max = self.device_config() + + def device_config(self) -> tuple: + if torch.cuda.is_available(): + i_device = int(self.device.split(":")[-1]) + self.gpu_name = torch.cuda.get_device_name(i_device) + if ( + ("16" in self.gpu_name and "V100" not in self.gpu_name.upper()) + or "P40" in self.gpu_name.upper() + or "1060" in self.gpu_name + or "1070" in self.gpu_name + or "1080" in self.gpu_name + ): + print("16系/10系显卡和P40强制单精度") + self.is_half = False + for config_file in ["32k.json", "40k.json", "48k.json"]: + with open(f"assets/configs/{config_file}", "r") as f: + strr = f.read().replace("true", "false") + with open(f"assets/configs/{config_file}", "w") as f: + f.write(strr) + with open("infer/modules/train/preprocess.py", "r") as f: + strr = f.read().replace("3.7", "3.0") + with open("infer/modules/train/preprocess.py", "w") as f: + f.write(strr) + else: + self.gpu_name = None + self.gpu_mem = int( + torch.cuda.get_device_properties(i_device).total_memory + / 1024 + / 1024 + / 1024 + + 0.4 + ) + if self.gpu_mem <= 4: + with open("infer/modules/train/preprocess.py", "r") as f: + strr = f.read().replace("3.7", "3.0") + with open("infer/modules/train/preprocess.py", "w") as f: + f.write(strr) + elif torch.backends.mps.is_available(): + print("没有发现支持的N卡, 使用MPS进行推理") + self.device = "mps" + else: + print("没有发现支持的N卡, 使用CPU进行推理") + self.device = "cpu" + self.is_half = True + + if self.n_cpu == 0: + self.n_cpu = cpu_count() + + if self.is_half: + # 6G显存配置 + x_pad = 3 + x_query = 10 + x_center = 60 + x_max = 65 + else: + # 5G显存配置 + x_pad = 1 + x_query = 6 + x_center = 38 + x_max = 41 + + if self.gpu_mem != None and self.gpu_mem <= 4: + x_pad = 1 + x_query = 5 + x_center = 30 + x_max = 32 + + return x_pad, x_query, x_center, x_max + + +f0up_key = sys.argv[1] +input_path = sys.argv[2] +index_path = sys.argv[3] +f0method = sys.argv[4] # harvest or pm +opt_path = sys.argv[5] +model_path = sys.argv[6] +index_rate = float(sys.argv[7]) +device = sys.argv[8] +is_half = sys.argv[9].lower() != "false" +filter_radius = int(sys.argv[10]) +resample_sr = int(sys.argv[11]) +rms_mix_rate = float(sys.argv[12]) +protect = float(sys.argv[13]) +print(sys.argv) +config = Config(device, is_half) +now_dir = os.getcwd() +sys.path.append(now_dir) +from lib.infer.modules.vc.modules import VC +from lib.infer.infer_pack.models import ( + SynthesizerTrnMs256NSFsid, + SynthesizerTrnMs256NSFsid_nono, + SynthesizerTrnMs768NSFsid, + SynthesizerTrnMs768NSFsid_nono, +) +from lib.infer.infer_libs.audio import load_audio +from fairseq import checkpoint_utils +from scipy.io import wavfile + +hubert_model = None + + +def load_hubert(): + global hubert_model + models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task( + ["hubert_base.pt"], + suffix="", + ) + hubert_model = models[0] + hubert_model = hubert_model.to(device) + if is_half: + hubert_model = hubert_model.half() + else: + hubert_model = hubert_model.float() + hubert_model.eval() + + +def vc_single(sid, input_audio, f0_up_key, f0_file, f0_method, file_index, index_rate): + global tgt_sr, net_g, vc, hubert_model, version + if input_audio is None: + return "You need to upload an audio", None + f0_up_key = int(f0_up_key) + audio = load_audio(input_audio, 16000) + times = [0, 0, 0] + if hubert_model == None: + load_hubert() + if_f0 = cpt.get("f0", 1) + # audio_opt=vc.pipeline(hubert_model,net_g,sid,audio,times,f0_up_key,f0_method,file_index,file_big_npy,index_rate,if_f0,f0_file=f0_file) + audio_opt = vc.pipeline( + hubert_model, + net_g, + sid, + audio, + input_audio, + times, + f0_up_key, + f0_method, + file_index, + index_rate, + if_f0, + filter_radius, + tgt_sr, + resample_sr, + rms_mix_rate, + version, + protect, + f0_file=f0_file, + ) + print(times) + return audio_opt + + +def get_vc(model_path): + global n_spk, tgt_sr, net_g, vc, cpt, device, is_half, version + print("loading pth %s" % model_path) + cpt = torch.load(model_path, map_location="cpu") + tgt_sr = cpt["config"][-1] + cpt["config"][-3] = cpt["weight"]["emb_g.weight"].shape[0] # n_spk + if_f0 = cpt.get("f0", 1) + version = cpt.get("version", "v1") + if version == "v1": + if if_f0 == 1: + net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=is_half) + else: + net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) + elif version == "v2": + if if_f0 == 1: # + net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=is_half) + else: + net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"]) + del net_g.enc_q + print(net_g.load_state_dict(cpt["weight"], strict=False)) # 不加这一行清不干净,真奇葩 + net_g.eval().to(device) + if is_half: + net_g = net_g.half() + else: + net_g = net_g.float() + vc = VC(tgt_sr, config) + n_spk = cpt["config"][-3] + # return {"visible": True,"maximum": n_spk, "__type__": "update"} + + +get_vc(model_path) +audios = os.listdir(input_path) +for file in tq.tqdm(audios): + if file.endswith(".wav"): + file_path = input_path + "/" + file + wav_opt = vc_single( + 0, file_path, f0up_key, None, f0method, index_path, index_rate + ) + out_path = opt_path + "/" + file + wavfile.write(out_path, tgt_sr, wav_opt) diff --git a/lib/infer/infer_libs/infer_pack/__pycache__/attentions.cpython-39.pyc b/lib/infer/infer_libs/infer_pack/__pycache__/attentions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9c245bba2d610b8fc477ebc6869af7d1cd115a GIT binary patch literal 9984 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 literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/infer_pack/__pycache__/commons.cpython-39.pyc b/lib/infer/infer_libs/infer_pack/__pycache__/commons.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..529ff3bd71efe6941678729ed16f5fc269781cca GIT binary patch literal 5909 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 Y%6#Ry%DL(r)kgJ9rC2FcDwWUvAMO*YsQ>@~ literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/infer_pack/__pycache__/transforms.cpython-39.pyc b/lib/infer/infer_libs/infer_pack/__pycache__/transforms.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ed5ea2966c61fba869d067d615b3ae1f1ca8810 GIT binary patch literal 3956 zcmai1&2JmW6`z^?;BvX7NQts2Tej%$vW3;4Jp>4hB>t>b#6saXE~WHZ@u(i=pWGIo(l93_|T#Sf~F|ixWAdDB+`x%3iD>(n>RDR zdHdeHC%;^F34Sj&jo{-ILjJ0l>7N7UL$pMKaKdSyw5je{o1tfYV_>!|O1ROs(F$k| zH#y~2UDk=ogOHqX&6U-|KWdM{PWLuw|@4)?Jw0VA^-TGt1pyuq=LSLb^|T>2t-<(jEI;| z$=D6axD-`VI(DTcZBD;nYZnCjAE=y0Adkm0_ zjTXzS)DQbf=Blo<6^|m`axy!NhNCpe7DiDNi-F${_X6J84SBkqWc3;0b`UTIFujk3xin{Scx#|wdNSzrrgr_QG%pDU)@NrwF} z3bML_@WzZ-i&vne(dvP^V$%Y<4Jer z-h&%gZpUKh%Dtc)^We($z#pYy@9Abg+}aGIULcM~ouS{|*~BHIq=)a2tPP)Lmxf`` z4R*sM__kXg>8cwh7eI*TP?Orsq%Inp{rk6BWM8`_QHS1_&;Itu{jdM@hxfaNS~mHq zu`-l)!S7=r5k(eRCX&5N404sE0PR;gH3^R{vkXiSIF941sa>3jSg1B8iP0%Fzg&<_z%(w##{rDUHi7kXKZYw=Dvkyb5j-@Siwz2#}!$Dj&+sj-bPPk3D)ss=_=s`Synv) zx4@l!M_LE;bNU%gi_mhRMWu^(iTsB3lttMLXUuS>!Y}O!%|pHT%-du*$;GKYIoYim1`v>0gYS`f+IbB4|c&+6)K7elQ3kSbeSK zy*02hvmf-*%o6Hl$n32+P2)jkr19{zKx?@Ik2cBNy+FiCryuSF8NDseDjAE0nSmgK z13VdK-n~(jhJ)ai5V6Q?6%2kV)c0)7y%opX1H2waNyvjvh^vUlcwYv7veRBfaK9-Q zRh%Mf3X`Ls96w55b4a0_>m9V@DhToB5pFKR&7l?ApbmAI2d-i4$BF-JYf&FDEwf2kB zIG|WPhy88ICZ|;q0EHYiPN-@;RgI@Q(Wq%WwJAI`$jx}V(n#SXxS9oeO zcoa8{rz*|oRQxh^WlfUL8J~kS=Mlax!uyDqmHiTDa{hpE5AzGMJj2&zZH8ZzRarho z#wX;78Tpc&o8cRBZW`On+_J3B@F#)O5bsDL7jfH$TwWr)Dwpb{L2&bva!EGS2o^X6 zt^wJ%YT^s5$R#{1dbUo+r{&7N$E$eWYVs6TomM-J&&V@;e#hD`ACTuPdHz%K8O3Rs zlPe|VnH72FfHny3xGGm=9r6X7+?1>Meya+{_^d)SjZ&V~=+4Qd{5-iVSMw44R^KGo zkd1tg!?`83+j*QhC(i>V`~jnL2UO#{Ae-_+iKu!9H(G#Y>cDhSUc??3CpeUCE*|a% zOd1FFy!2Lti}I2@cS_l^IfeFUk2lcbq{IEc8?D01Rr*}m*t@c>3bAGyH~r>OYHx;# zevWs;bUTciVVX2~JU}6&GpxYVK=yugH;h6QZcU`rrmnZJN!;wCiV2!{KAY(_-t^I6 zD-g}Nr?is2A5X8zi?Z)rB$jbno=qm1MQ4#UCH)~t%gCQ|bAVbWv+&lA0&z~wszkFU z8lW$kBDxw=i(Az^D;TH`Gh^UC$=nBOS^oB0$+kZX#P^_>6_U7@Dh0bc8lZ&8k8+fB z*dHa6V&I{Vy9%VbcsDcrem^slPem$JEz`RE_T+IM^FkF+;-Vs#6q&6PGY1A#1#Obq zd2QS-0?4FHE*+P$s2e9`a@&Q%VaZ%jBLdcF6VQHc&MMzt&DavkB3QDgs?wyU1o|nPIVS+FT#?k zuhw=jiCr|G;i^%rw9{C$>&N%*z&-&=^H}8h)5_J0$6{4E9~X8yp>IKy{2qim)v^&4R-e_&%MdCS0l8JqEZlDRRJ6e5e(d1> z-R-p~63WlD=e8Gb-nxD5laKCq?yhfiuA}{Y{pS5U?Gvwy@7!Ad$({SN@|(Brtv|SS zfBnHNUAAj4*L8yiGF6&ri@(}%fbKv literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/infer_pack/attentions.py b/lib/infer/infer_libs/infer_pack/attentions.py new file mode 100644 index 000000000..1ad360e96 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/attentions.py @@ -0,0 +1,417 @@ +import copy +import math + +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + +from lib.infer.infer_libs.infer_pack import commons, modules +from lib.infer.infer_libs.infer_pack.modules import LayerNorm + + +class Encoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=10, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.window_size = window_size + + self.drop = nn.Dropout(p_dropout) + self.attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + window_size=window_size, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class Decoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.encdec_attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.encdec_attn_layers.append( + MultiHeadAttention( + hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, h, h_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class MultiHeadAttention(nn.Module): + def __init__( + self, + channels, + out_channels, + n_heads, + p_dropout=0.0, + window_size=None, + heads_share=True, + block_length=None, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.p_dropout = p_dropout + self.window_size = window_size + self.heads_share = heads_share + self.block_length = block_length + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = nn.Conv1d(channels, channels, 1) + self.conv_k = nn.Conv1d(channels, channels, 1) + self.conv_v = nn.Conv1d(channels, channels, 1) + self.conv_o = nn.Conv1d(channels, out_channels, 1) + self.drop = nn.Dropout(p_dropout) + + if window_size is not None: + n_heads_rel = 1 if heads_share else n_heads + rel_stddev = self.k_channels**-0.5 + self.emb_rel_k = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + self.emb_rel_v = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + + nn.init.xavier_uniform_(self.conv_q.weight) + nn.init.xavier_uniform_(self.conv_k.weight) + nn.init.xavier_uniform_(self.conv_v.weight) + if proximal_init: + with torch.no_grad(): + self.conv_k.weight.copy_(self.conv_q.weight) + self.conv_k.bias.copy_(self.conv_q.bias) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + # reshape [b, d, t] -> [b, n_h, t, d_k] + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) + key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + + scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) + if self.window_size is not None: + assert ( + t_s == t_t + ), "Relative attention is only available for self-attention." + key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) + rel_logits = self._matmul_with_relative_keys( + query / math.sqrt(self.k_channels), key_relative_embeddings + ) + scores_local = self._relative_position_to_absolute_position(rel_logits) + scores = scores + scores_local + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to( + device=scores.device, dtype=scores.dtype + ) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + if self.block_length is not None: + assert ( + t_s == t_t + ), "Local attention is only available for self-attention." + block_mask = ( + torch.ones_like(scores) + .triu(-self.block_length) + .tril(self.block_length) + ) + scores = scores.masked_fill(block_mask == 0, -1e4) + p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + if self.window_size is not None: + relative_weights = self._absolute_position_to_relative_position(p_attn) + value_relative_embeddings = self._get_relative_embeddings( + self.emb_rel_v, t_s + ) + output = output + self._matmul_with_relative_values( + relative_weights, value_relative_embeddings + ) + output = ( + output.transpose(2, 3).contiguous().view(b, d, t_t) + ) # [b, n_h, t_t, d_k] -> [b, d, t_t] + return output, p_attn + + def _matmul_with_relative_values(self, x, y): + """ + x: [b, h, l, m] + y: [h or 1, m, d] + ret: [b, h, l, d] + """ + ret = torch.matmul(x, y.unsqueeze(0)) + return ret + + def _matmul_with_relative_keys(self, x, y): + """ + x: [b, h, l, d] + y: [h or 1, m, d] + ret: [b, h, l, m] + """ + ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) + return ret + + def _get_relative_embeddings(self, relative_embeddings, length): + max_relative_position = 2 * self.window_size + 1 + # Pad first before slice to avoid using cond ops. + pad_length = max(length - (self.window_size + 1), 0) + slice_start_position = max((self.window_size + 1) - length, 0) + slice_end_position = slice_start_position + 2 * length - 1 + if pad_length > 0: + padded_relative_embeddings = F.pad( + relative_embeddings, + commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]), + ) + else: + padded_relative_embeddings = relative_embeddings + used_relative_embeddings = padded_relative_embeddings[ + :, slice_start_position:slice_end_position + ] + return used_relative_embeddings + + def _relative_position_to_absolute_position(self, x): + """ + x: [b, h, l, 2*l-1] + ret: [b, h, l, l] + """ + batch, heads, length, _ = x.size() + # Concat columns of pad to shift from relative to absolute indexing. + x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])) + + # Concat extra elements so to add up to shape (len+1, 2*len-1). + x_flat = x.view([batch, heads, length * 2 * length]) + x_flat = F.pad( + x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]]) + ) + + # Reshape and slice out the padded elements. + x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[ + :, :, :length, length - 1 : + ] + return x_final + + def _absolute_position_to_relative_position(self, x): + """ + x: [b, h, l, l] + ret: [b, h, l, 2*l-1] + """ + batch, heads, length, _ = x.size() + # padd along column + x = F.pad( + x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) + ) + x_flat = x.view([batch, heads, length**2 + length * (length - 1)]) + # add 0's in the beginning that will skew the elements after reshape + x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) + x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:] + return x_final + + def _attention_bias_proximal(self, length): + """Bias for self-attention to encourage attention to close positions. + Args: + length: an integer scalar. + Returns: + a Tensor with shape [1, 1, length, length] + """ + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + + +class FFN(nn.Module): + def __init__( + self, + in_channels, + out_channels, + filter_channels, + kernel_size, + p_dropout=0.0, + activation=None, + causal=False, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.activation = activation + self.causal = causal + + if causal: + self.padding = self._causal_padding + else: + self.padding = self._same_padding + + self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) + self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) + self.drop = nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(self.padding(x * x_mask)) + if self.activation == "gelu": + x = x * torch.sigmoid(1.702 * x) + else: + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(self.padding(x * x_mask)) + return x * x_mask + + def _causal_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = self.kernel_size - 1 + pad_r = 0 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x + + def _same_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = (self.kernel_size - 1) // 2 + pad_r = self.kernel_size // 2 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x diff --git a/lib/infer/infer_libs/infer_pack/commons.py b/lib/infer/infer_libs/infer_pack/commons.py new file mode 100644 index 000000000..ccd334b73 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/commons.py @@ -0,0 +1,167 @@ +import math + +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def kl_divergence(m_p, logs_p, m_q, logs_q): + """KL(P||Q)""" + kl = (logs_q - logs_p) - 0.5 + kl += ( + 0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q) + ) + return kl + + +def rand_gumbel(shape): + """Sample from the Gumbel distribution, protect from overflows.""" + uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 + return -torch.log(-torch.log(uniform_samples)) + + +def rand_gumbel_like(x): + g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) + return g + + +def slice_segments(x, ids_str, segment_size=4): + ret = torch.zeros_like(x[:, :, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, :, idx_str:idx_end] + return ret + + +def slice_segments2(x, ids_str, segment_size=4): + ret = torch.zeros_like(x[:, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, idx_str:idx_end] + return ret + + +def rand_slice_segments(x, x_lengths=None, segment_size=4): + b, d, t = x.size() + if x_lengths is None: + x_lengths = t + ids_str_max = x_lengths - segment_size + 1 + ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) + ret = slice_segments(x, ids_str, segment_size) + return ret, ids_str + + +def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4): + position = torch.arange(length, dtype=torch.float) + num_timescales = channels // 2 + log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / ( + num_timescales - 1 + ) + inv_timescales = min_timescale * torch.exp( + torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment + ) + scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) + signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) + signal = F.pad(signal, [0, 0, 0, channels % 2]) + signal = signal.view(1, channels, length) + return signal + + +def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4): + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return x + signal.to(dtype=x.dtype, device=x.device) + + +def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1): + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) + + +def subsequent_mask(length): + mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) + return mask + + +@torch.jit.script +def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def shift_1d(x): + x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] + return x + + +def sequence_mask(length, max_length=None): + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) + + +def generate_path(duration, mask): + """ + duration: [b, 1, t_x] + mask: [b, 1, t_y, t_x] + """ + device = duration.device + + b, _, t_y, t_x = mask.shape + cum_duration = torch.cumsum(duration, -1) + + cum_duration_flat = cum_duration.view(b * t_x) + path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) + path = path.view(b, t_x, t_y) + path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] + path = path.unsqueeze(1).transpose(2, 3) * mask + return path + + +def clip_grad_value_(parameters, clip_value, norm_type=2): + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = list(filter(lambda p: p.grad is not None, parameters)) + norm_type = float(norm_type) + if clip_value is not None: + clip_value = float(clip_value) + + total_norm = 0 + for p in parameters: + param_norm = p.grad.data.norm(norm_type) + total_norm += param_norm.item() ** norm_type + if clip_value is not None: + p.grad.data.clamp_(min=-clip_value, max=clip_value) + total_norm = total_norm ** (1.0 / norm_type) + return total_norm diff --git a/lib/infer/infer_libs/infer_pack/models.py b/lib/infer/infer_libs/infer_pack/models.py new file mode 100644 index 000000000..6fb832299 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/models.py @@ -0,0 +1,1174 @@ +import math +import logging + +logger = logging.getLogger(__name__) + +import numpy as np +import torch +from torch import nn +from torch.nn import AvgPool1d, Conv1d, Conv2d, ConvTranspose1d +from torch.nn import functional as F +from torch.nn.utils import remove_weight_norm, spectral_norm, weight_norm + +from lib.infer.infer_libs.infer_pack import attentions, commons, modules +from lib.infer.infer_libs.infer_pack.commons import get_padding, init_weights +has_xpu = bool(hasattr(torch, "xpu") and torch.xpu.is_available()) + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +class PosteriorEncoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): + super(Generator, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + if uv.device.type == "privateuseone": # for DirectML + uv = uv.float() + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + if hasattr(self, "ddtype") == False: + self.ddtype = self.l_linear.weight.dtype + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + # print(x.dtype,sine_wavs.dtype,self.l_linear.weight.dtype) + # if self.is_half: + # sine_wavs = sine_wavs.half() + # sine_merge = self.l_tanh(self.l_linear(sine_wavs.to(x))) + # print(sine_wavs.dtype,self.ddtype) + if sine_wavs.dtype != self.ddtype: + sine_wavs = sine_wavs.to(self.ddtype) + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMs256NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + logger.debug( + "gin_channels: " + + str(gin_channels) + + ", self.spk_embed_dim: " + + str(self.spk_embed_dim) + ) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + logger.debug( + "gin_channels: " + + str(gin_channels) + + ", self.spk_embed_dim: " + + str(self.spk_embed_dim) + ) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs256NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + logger.debug( + "gin_channels: " + + str(gin_channels) + + ", self.spk_embed_dim: " + + str(self.spk_embed_dim) + ) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + logger.debug( + "gin_channels: " + + str(gin_channels) + + ", self.spk_embed_dim: " + + str(self.spk_embed_dim) + ) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(DiscriminatorS, self).__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super(DiscriminatorP, self).__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + if has_xpu and x.dtype == torch.bfloat16: + x = F.pad(x.to(dtype=torch.float16), (0, n_pad), "reflect").to(dtype=torch.bfloat16) + else: + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap diff --git a/lib/infer/infer_libs/infer_pack/models_onnx.py b/lib/infer/infer_libs/infer_pack/models_onnx.py new file mode 100644 index 000000000..ec8ca3f13 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/models_onnx.py @@ -0,0 +1,824 @@ +import math +import logging + +logger = logging.getLogger(__name__) + +import numpy as np +import torch +from torch import nn +from torch.nn import AvgPool1d, Conv1d, Conv2d, ConvTranspose1d +from torch.nn import functional as F +from torch.nn.utils import remove_weight_norm, spectral_norm, weight_norm + +from lib.infer.infer_libs.infer_pack import attentions, commons, modules +from lib.infer.infer_libs.infer_pack.commons import get_padding, init_weights + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +class PosteriorEncoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): + super(Generator, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMsNSFsidM(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + version, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + if version == "v1": + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + else: + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + self.speaker_map = None + logger.debug( + "gin_channels: " + + gin_channels + + ", self.spk_embed_dim: " + + self.spk_embed_dim + ) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def construct_spkmixmap(self, n_speaker): + self.speaker_map = torch.zeros((n_speaker, 1, 1, self.gin_channels)) + for i in range(n_speaker): + self.speaker_map[i] = self.emb_g(torch.LongTensor([[i]])) + self.speaker_map = self.speaker_map.unsqueeze(0) + + def forward(self, phone, phone_lengths, pitch, nsff0, g, rnd, max_len=None): + if self.speaker_map is not None: # [N, S] * [S, B, 1, H] + g = g.reshape((g.shape[0], g.shape[1], 1, 1, 1)) # [N, S, B, 1, 1] + g = g * self.speaker_map # [N, S, B, 1, H] + g = torch.sum(g, dim=1) # [N, 1, B, 1, H] + g = g.transpose(0, -1).transpose(0, -2).squeeze(0) # [B, H, N] + else: + g = g.unsqueeze(0) + g = self.emb_g(g).transpose(1, 2) + + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * rnd) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(DiscriminatorS, self).__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super(DiscriminatorP, self).__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap diff --git a/lib/infer/infer_libs/infer_pack/modules.py b/lib/infer/infer_libs/infer_pack/modules.py new file mode 100644 index 000000000..0febcbe0f --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/modules.py @@ -0,0 +1,521 @@ +import copy +import math + +import numpy as np +import scipy +import torch +from torch import nn +from torch.nn import AvgPool1d, Conv1d, Conv2d, ConvTranspose1d +from torch.nn import functional as F +from torch.nn.utils import remove_weight_norm, weight_norm + +from lib.infer.infer_libs.infer_pack import commons +from lib.infer.infer_libs.infer_pack.commons import get_padding, init_weights +from lib.infer.infer_libs.infer_pack.transforms import piecewise_rational_quadratic_transform + +LRELU_SLOPE = 0.1 + + +class LayerNorm(nn.Module): + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) + + +class ConvReluNorm(nn.Module): + def __init__( + self, + in_channels, + hidden_channels, + out_channels, + kernel_size, + n_layers, + p_dropout, + ): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + assert n_layers > 1, "Number of layers should be larger than 0." + + self.conv_layers = nn.ModuleList() + self.norm_layers = nn.ModuleList() + self.conv_layers.append( + nn.Conv1d( + in_channels, hidden_channels, kernel_size, padding=kernel_size // 2 + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + nn.Conv1d( + hidden_channels, + hidden_channels, + kernel_size, + padding=kernel_size // 2, + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask + + +class DDSConv(nn.Module): + """ + Dialted and Depth-Separable Convolution + """ + + def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0): + super().__init__() + self.channels = channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.drop = nn.Dropout(p_dropout) + self.convs_sep = nn.ModuleList() + self.convs_1x1 = nn.ModuleList() + self.norms_1 = nn.ModuleList() + self.norms_2 = nn.ModuleList() + for i in range(n_layers): + dilation = kernel_size**i + padding = (kernel_size * dilation - dilation) // 2 + self.convs_sep.append( + nn.Conv1d( + channels, + channels, + kernel_size, + groups=channels, + dilation=dilation, + padding=padding, + ) + ) + self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) + self.norms_1.append(LayerNorm(channels)) + self.norms_2.append(LayerNorm(channels)) + + def forward(self, x, x_mask, g=None): + if g is not None: + x = x + g + for i in range(self.n_layers): + y = self.convs_sep[i](x * x_mask) + y = self.norms_1[i](y) + y = F.gelu(y) + y = self.convs_1x1[i](y) + y = self.norms_2[i](y) + y = F.gelu(y) + y = self.drop(y) + x = x + y + return x * x_mask + + +class WN(torch.nn.Module): + def __init__( + self, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + p_dropout=0, + ): + super(WN, self).__init__() + assert kernel_size % 2 == 1 + self.hidden_channels = hidden_channels + self.kernel_size = (kernel_size,) + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + self.p_dropout = p_dropout + + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.drop = nn.Dropout(p_dropout) + + if gin_channels != 0: + cond_layer = torch.nn.Conv1d( + gin_channels, 2 * hidden_channels * n_layers, 1 + ) + self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight") + + for i in range(n_layers): + dilation = dilation_rate**i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d( + hidden_channels, + 2 * hidden_channels, + kernel_size, + dilation=dilation, + padding=padding, + ) + in_layer = torch.nn.utils.weight_norm(in_layer, name="weight") + self.in_layers.append(in_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * hidden_channels + else: + res_skip_channels = hidden_channels + + res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight") + self.res_skip_layers.append(res_skip_layer) + + def forward(self, x, x_mask, g=None, **kwargs): + output = torch.zeros_like(x) + n_channels_tensor = torch.IntTensor([self.hidden_channels]) + + if g is not None: + g = self.cond_layer(g) + + for i in range(self.n_layers): + x_in = self.in_layers[i](x) + if g is not None: + cond_offset = i * 2 * self.hidden_channels + g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :] + else: + g_l = torch.zeros_like(x_in) + + acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor) + acts = self.drop(acts) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + res_acts = res_skip_acts[:, : self.hidden_channels, :] + x = (x + res_acts) * x_mask + output = output + res_skip_acts[:, self.hidden_channels :, :] + else: + output = output + res_skip_acts + return output * x_mask + + def remove_weight_norm(self): + if self.gin_channels != 0: + torch.nn.utils.remove_weight_norm(self.cond_layer) + for l in self.in_layers: + torch.nn.utils.remove_weight_norm(l) + for l in self.res_skip_layers: + torch.nn.utils.remove_weight_norm(l) + + +class ResBlock1(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): + super(ResBlock1, self).__init__() + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) + self.convs1.apply(init_weights) + + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) + self.convs2.apply(init_weights) + + def forward(self, x, x_mask=None): + for c1, c2 in zip(self.convs1, self.convs2): + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c1(xt) + xt = F.leaky_relu(xt, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c2(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs1: + remove_weight_norm(l) + for l in self.convs2: + remove_weight_norm(l) + + +class ResBlock2(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3)): + super(ResBlock2, self).__init__() + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) + self.convs.apply(init_weights) + + def forward(self, x, x_mask=None): + for c in self.convs: + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs: + remove_weight_norm(l) + + +class Log(nn.Module): + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask + logdet = torch.sum(-y, [1, 2]) + return y, logdet + else: + x = torch.exp(x) * x_mask + return x + + +class Flip(nn.Module): + def forward(self, x, *args, reverse=False, **kwargs): + x = torch.flip(x, [1]) + if not reverse: + logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) + return x, logdet + else: + return x + + +class ElementwiseAffine(nn.Module): + def __init__(self, channels): + super().__init__() + self.channels = channels + self.m = nn.Parameter(torch.zeros(channels, 1)) + self.logs = nn.Parameter(torch.zeros(channels, 1)) + + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = self.m + torch.exp(self.logs) * x + y = y * x_mask + logdet = torch.sum(self.logs * x_mask, [1, 2]) + return y, logdet + else: + x = (x - self.m) * torch.exp(-self.logs) * x_mask + return x + + +class ResidualCouplingLayer(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=0, + gin_channels=0, + mean_only=False, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=p_dropout, + gin_channels=gin_channels, + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class ConvFlow(nn.Module): + def __init__( + self, + in_channels, + filter_channels, + kernel_size, + n_layers, + num_bins=10, + tail_bound=5.0, + ): + super().__init__() + self.in_channels = in_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.num_bins = num_bins + self.tail_bound = tail_bound + self.half_channels = in_channels // 2 + + self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) + self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.0) + self.proj = nn.Conv1d( + filter_channels, self.half_channels * (num_bins * 3 - 1), 1 + ) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) + h = self.convs(h, x_mask, g=g) + h = self.proj(h) * x_mask + + b, c, t = x0.shape + h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] + + unnormalized_widths = h[..., : self.num_bins] / math.sqrt(self.filter_channels) + unnormalized_heights = h[..., self.num_bins : 2 * self.num_bins] / math.sqrt( + self.filter_channels + ) + unnormalized_derivatives = h[..., 2 * self.num_bins :] + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x diff --git a/lib/infer/infer_libs/infer_pack/modules/F0Predictor/DioF0Predictor.py b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/DioF0Predictor.py new file mode 100644 index 000000000..54c2fd248 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/DioF0Predictor.py @@ -0,0 +1,91 @@ +import numpy as np +import pyworld + +from lib.infer.infer_libs.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor + + +class DioF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer/infer_libs/infer_pack/modules/F0Predictor/F0Predictor.py b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/F0Predictor.py new file mode 100644 index 000000000..f56e49e7f --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/F0Predictor.py @@ -0,0 +1,16 @@ +class F0Predictor(object): + def compute_f0(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length] + """ + pass + + def compute_f0_uv(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length],uv:[signal_length//hop_length] + """ + pass diff --git a/lib/infer/infer_libs/infer_pack/modules/F0Predictor/HarvestF0Predictor.py b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/HarvestF0Predictor.py new file mode 100644 index 000000000..7d415a5bb --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/HarvestF0Predictor.py @@ -0,0 +1,87 @@ +import numpy as np +import pyworld + +from lib.infer.infer_libs.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor + + +class HarvestF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.hop_length, + f0_ceil=self.f0_max, + f0_floor=self.f0_min, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.fs) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer/infer_libs/infer_pack/modules/F0Predictor/PMF0Predictor.py b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/PMF0Predictor.py new file mode 100644 index 000000000..9f4b3cd0f --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/PMF0Predictor.py @@ -0,0 +1,98 @@ +import numpy as np +import parselmouth + +from lib.infer.infer_libs.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor + + +class PMF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def compute_f0(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0 + + def compute_f0_uv(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0, uv diff --git a/lib/infer/infer_libs/infer_pack/modules/F0Predictor/__init__.py b/lib/infer/infer_libs/infer_pack/modules/F0Predictor/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/infer/infer_libs/infer_pack/onnx_inference.py b/lib/infer/infer_libs/infer_pack/onnx_inference.py new file mode 100644 index 000000000..822bb8dcb --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/onnx_inference.py @@ -0,0 +1,149 @@ +import librosa +import numpy as np +import onnxruntime +import soundfile + +import logging + +logger = logging.getLogger(__name__) + + +class ContentVec: + def __init__(self, vec_path="pretrained/vec-768-layer-12.onnx", device=None): + logger.info("Load model(s) from {}".format(vec_path)) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(vec_path, providers=providers) + + def __call__(self, wav): + return self.forward(wav) + + def forward(self, wav): + feats = wav + if feats.ndim == 2: # double channels + feats = feats.mean(-1) + assert feats.ndim == 1, feats.ndim + feats = np.expand_dims(np.expand_dims(feats, 0), 0) + onnx_input = {self.model.get_inputs()[0].name: feats} + logits = self.model.run(None, onnx_input)[0] + return logits.transpose(0, 2, 1) + + +def get_f0_predictor(f0_predictor, hop_length, sampling_rate, **kargs): + if f0_predictor == "pm": + from lib.infer.infer_pack.modules.F0Predictor.PMF0Predictor import PMF0Predictor + + f0_predictor_object = PMF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "harvest": + from lib.infer.infer_pack.modules.F0Predictor.HarvestF0Predictor import ( + HarvestF0Predictor, + ) + + f0_predictor_object = HarvestF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "dio": + from lib.infer.infer_pack.modules.F0Predictor.DioF0Predictor import DioF0Predictor + + f0_predictor_object = DioF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + else: + raise Exception("Unknown f0 predictor") + return f0_predictor_object + + +class OnnxRVC: + def __init__( + self, + model_path, + sr=40000, + hop_size=512, + vec_path="vec-768-layer-12", + device="cpu", + ): + vec_path = f"pretrained/{vec_path}.onnx" + self.vec_model = ContentVec(vec_path, device) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(model_path, providers=providers) + self.sampling_rate = sr + self.hop_size = hop_size + + def forward(self, hubert, hubert_length, pitch, pitchf, ds, rnd): + onnx_input = { + self.model.get_inputs()[0].name: hubert, + self.model.get_inputs()[1].name: hubert_length, + self.model.get_inputs()[2].name: pitch, + self.model.get_inputs()[3].name: pitchf, + self.model.get_inputs()[4].name: ds, + self.model.get_inputs()[5].name: rnd, + } + return (self.model.run(None, onnx_input)[0] * 32767).astype(np.int16) + + def inference( + self, + raw_path, + sid, + f0_method="dio", + f0_up_key=0, + pad_time=0.5, + cr_threshold=0.02, + ): + f0_min = 50 + f0_max = 1100 + f0_mel_min = 1127 * np.log(1 + f0_min / 700) + f0_mel_max = 1127 * np.log(1 + f0_max / 700) + f0_predictor = get_f0_predictor( + f0_method, + hop_length=self.hop_size, + sampling_rate=self.sampling_rate, + threshold=cr_threshold, + ) + wav, sr = librosa.load(raw_path, sr=self.sampling_rate) + org_length = len(wav) + if org_length / sr > 50.0: + raise RuntimeError("Reached Max Length") + + wav16k = librosa.resample(wav, orig_sr=self.sampling_rate, target_sr=16000) + wav16k = wav16k + + hubert = self.vec_model(wav16k) + hubert = np.repeat(hubert, 2, axis=2).transpose(0, 2, 1).astype(np.float32) + hubert_length = hubert.shape[1] + + pitchf = f0_predictor.compute_f0(wav, hubert_length) + pitchf = pitchf * 2 ** (f0_up_key / 12) + pitch = pitchf.copy() + f0_mel = 1127 * np.log(1 + pitch / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / ( + f0_mel_max - f0_mel_min + ) + 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > 255] = 255 + pitch = np.rint(f0_mel).astype(np.int64) + + pitchf = pitchf.reshape(1, len(pitchf)).astype(np.float32) + pitch = pitch.reshape(1, len(pitch)) + ds = np.array([sid]).astype(np.int64) + + rnd = np.random.randn(1, 192, hubert_length).astype(np.float32) + hubert_length = np.array([hubert_length]).astype(np.int64) + + out_wav = self.forward(hubert, hubert_length, pitch, pitchf, ds, rnd).squeeze() + out_wav = np.pad(out_wav, (0, 2 * self.hop_size), "constant") + return out_wav[0:org_length] diff --git a/lib/infer/infer_libs/infer_pack/transforms.py b/lib/infer/infer_libs/infer_pack/transforms.py new file mode 100644 index 000000000..6f30b7177 --- /dev/null +++ b/lib/infer/infer_libs/infer_pack/transforms.py @@ -0,0 +1,207 @@ +import numpy as np +import torch +from torch.nn import functional as F + +DEFAULT_MIN_BIN_WIDTH = 1e-3 +DEFAULT_MIN_BIN_HEIGHT = 1e-3 +DEFAULT_MIN_DERIVATIVE = 1e-3 + + +def piecewise_rational_quadratic_transform( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails=None, + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if tails is None: + spline_fn = rational_quadratic_spline + spline_kwargs = {} + else: + spline_fn = unconstrained_rational_quadratic_spline + spline_kwargs = {"tails": tails, "tail_bound": tail_bound} + + outputs, logabsdet = spline_fn( + inputs=inputs, + unnormalized_widths=unnormalized_widths, + unnormalized_heights=unnormalized_heights, + unnormalized_derivatives=unnormalized_derivatives, + inverse=inverse, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + **spline_kwargs + ) + return outputs, logabsdet + + +def searchsorted(bin_locations, inputs, eps=1e-6): + bin_locations[..., -1] += eps + return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1 + + +def unconstrained_rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails="linear", + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound) + outside_interval_mask = ~inside_interval_mask + + outputs = torch.zeros_like(inputs) + logabsdet = torch.zeros_like(inputs) + + if tails == "linear": + unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1)) + constant = np.log(np.exp(1 - min_derivative) - 1) + unnormalized_derivatives[..., 0] = constant + unnormalized_derivatives[..., -1] = constant + + outputs[outside_interval_mask] = inputs[outside_interval_mask] + logabsdet[outside_interval_mask] = 0 + else: + raise RuntimeError("{} tails are not implemented.".format(tails)) + + ( + outputs[inside_interval_mask], + logabsdet[inside_interval_mask], + ) = rational_quadratic_spline( + inputs=inputs[inside_interval_mask], + unnormalized_widths=unnormalized_widths[inside_interval_mask, :], + unnormalized_heights=unnormalized_heights[inside_interval_mask, :], + unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :], + inverse=inverse, + left=-tail_bound, + right=tail_bound, + bottom=-tail_bound, + top=tail_bound, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + ) + + return outputs, logabsdet + + +def rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + left=0.0, + right=1.0, + bottom=0.0, + top=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if torch.min(inputs) < left or torch.max(inputs) > right: + raise ValueError("Input to a transform is not within its domain") + + num_bins = unnormalized_widths.shape[-1] + + if min_bin_width * num_bins > 1.0: + raise ValueError("Minimal bin width too large for the number of bins") + if min_bin_height * num_bins > 1.0: + raise ValueError("Minimal bin height too large for the number of bins") + + widths = F.softmax(unnormalized_widths, dim=-1) + widths = min_bin_width + (1 - min_bin_width * num_bins) * widths + cumwidths = torch.cumsum(widths, dim=-1) + cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0) + cumwidths = (right - left) * cumwidths + left + cumwidths[..., 0] = left + cumwidths[..., -1] = right + widths = cumwidths[..., 1:] - cumwidths[..., :-1] + + derivatives = min_derivative + F.softplus(unnormalized_derivatives) + + heights = F.softmax(unnormalized_heights, dim=-1) + heights = min_bin_height + (1 - min_bin_height * num_bins) * heights + cumheights = torch.cumsum(heights, dim=-1) + cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0) + cumheights = (top - bottom) * cumheights + bottom + cumheights[..., 0] = bottom + cumheights[..., -1] = top + heights = cumheights[..., 1:] - cumheights[..., :-1] + + if inverse: + bin_idx = searchsorted(cumheights, inputs)[..., None] + else: + bin_idx = searchsorted(cumwidths, inputs)[..., None] + + input_cumwidths = cumwidths.gather(-1, bin_idx)[..., 0] + input_bin_widths = widths.gather(-1, bin_idx)[..., 0] + + input_cumheights = cumheights.gather(-1, bin_idx)[..., 0] + delta = heights / widths + input_delta = delta.gather(-1, bin_idx)[..., 0] + + input_derivatives = derivatives.gather(-1, bin_idx)[..., 0] + input_derivatives_plus_one = derivatives[..., 1:].gather(-1, bin_idx)[..., 0] + + input_heights = heights.gather(-1, bin_idx)[..., 0] + + if inverse: + a = (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + input_heights * (input_delta - input_derivatives) + b = input_heights * input_derivatives - (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + c = -input_delta * (inputs - input_cumheights) + + discriminant = b.pow(2) - 4 * a * c + assert (discriminant >= 0).all() + + root = (2 * c) / (-b - torch.sqrt(discriminant)) + outputs = root * input_bin_widths + input_cumwidths + + theta_one_minus_theta = root * (1 - root) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * root.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - root).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, -logabsdet + else: + theta = (inputs - input_cumwidths) / input_bin_widths + theta_one_minus_theta = theta * (1 - theta) + + numerator = input_heights * ( + input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta + ) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + outputs = input_cumheights + numerator / denominator + + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, logabsdet diff --git a/lib/infer/infer_libs/inference-presets.json b/lib/infer/infer_libs/inference-presets.json new file mode 100644 index 000000000..7f68a27d9 --- /dev/null +++ b/lib/infer/infer_libs/inference-presets.json @@ -0,0 +1,20 @@ +{ + "presets": [ + { + "name": "Default Preset", + "model": "", + "transpose": 0, + "audio_file": "", + "f0_method": "pm", + "crepe_hop_length": 160, + "median_filtering": 3, + "feature_path": "", + "auto_feature_path": "", + "search_feature_ratio": 0.88, + "resample": 0, + "volume_envelope": 1, + "protect_voiceless": 0.33, + "f0_file_path": "" + } + ] +} diff --git a/lib/infer/infer_libs/rmvpe.py b/lib/infer/infer_libs/rmvpe.py new file mode 100644 index 000000000..ee1f4508f --- /dev/null +++ b/lib/infer/infer_libs/rmvpe.py @@ -0,0 +1,717 @@ +import pdb, os + +import numpy as np +import torch +try: + #Fix "Torch not compiled with CUDA enabled" + import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + if torch.xpu.is_available(): + from lib.infer.modules.ipex import ipex_init + ipex_init() +except Exception: + pass +import torch.nn as nn +import torch.nn.functional as F +from librosa.util import normalize, pad_center, tiny +from scipy.signal import get_window + +import logging + +logger = logging.getLogger(__name__) + + +###stft codes from https://github.com/pseeth/torch-stft/blob/master/torch_stft/util.py +def window_sumsquare( + window, + n_frames, + hop_length=200, + win_length=800, + n_fft=800, + dtype=np.float32, + norm=None, +): + """ + # from librosa 0.6 + Compute the sum-square envelope of a window function at a given hop length. + This is used to estimate modulation effects induced by windowing + observations in short-time fourier transforms. + Parameters + ---------- + window : string, tuple, number, callable, or list-like + Window specification, as in `get_window` + n_frames : int > 0 + The number of analysis frames + hop_length : int > 0 + The number of samples to advance between frames + win_length : [optional] + The length of the window function. By default, this matches `n_fft`. + n_fft : int > 0 + The length of each analysis frame. + dtype : np.dtype + The data type of the output + Returns + ------- + wss : np.ndarray, shape=`(n_fft + hop_length * (n_frames - 1))` + The sum-squared envelope of the window function + """ + if win_length is None: + win_length = n_fft + + n = n_fft + hop_length * (n_frames - 1) + x = np.zeros(n, dtype=dtype) + + # Compute the squared window at the desired length + win_sq = get_window(window, win_length, fftbins=True) + win_sq = normalize(win_sq, norm=norm) ** 2 + win_sq = pad_center(win_sq, n_fft) + + # Fill the envelope + for i in range(n_frames): + sample = i * hop_length + x[sample : min(n, sample + n_fft)] += win_sq[: max(0, min(n_fft, n - sample))] + return x + + +class STFT(torch.nn.Module): + def __init__( + self, filter_length=1024, hop_length=512, win_length=None, window="hann" + ): + """ + This module implements an STFT using 1D convolution and 1D transpose convolutions. + This is a bit tricky so there are some cases that probably won't work as working + out the same sizes before and after in all overlap add setups is tough. Right now, + this code should work with hop lengths that are half the filter length (50% overlap + between frames). + + Keyword Arguments: + filter_length {int} -- Length of filters used (default: {1024}) + hop_length {int} -- Hop length of STFT (restrict to 50% overlap between frames) (default: {512}) + win_length {[type]} -- Length of the window function applied to each frame (if not specified, it + equals the filter length). (default: {None}) + window {str} -- Type of window to use (options are bartlett, hann, hamming, blackman, blackmanharris) + (default: {'hann'}) + """ + super(STFT, self).__init__() + self.filter_length = filter_length + self.hop_length = hop_length + self.win_length = win_length if win_length else filter_length + self.window = window + self.forward_transform = None + self.pad_amount = int(self.filter_length / 2) + scale = self.filter_length / self.hop_length + fourier_basis = np.fft.fft(np.eye(self.filter_length)) + + cutoff = int((self.filter_length / 2 + 1)) + fourier_basis = np.vstack( + [np.real(fourier_basis[:cutoff, :]), np.imag(fourier_basis[:cutoff, :])] + ) + forward_basis = torch.FloatTensor(fourier_basis[:, None, :]) + inverse_basis = torch.FloatTensor( + np.linalg.pinv(scale * fourier_basis).T[:, None, :] + ) + + assert filter_length >= self.win_length + # get window and zero center pad it to filter_length + fft_window = get_window(window, self.win_length, fftbins=True) + fft_window = pad_center(fft_window, size=filter_length) + fft_window = torch.from_numpy(fft_window).float() + + # window the bases + forward_basis *= fft_window + inverse_basis *= fft_window + + self.register_buffer("forward_basis", forward_basis.float()) + self.register_buffer("inverse_basis", inverse_basis.float()) + + def transform(self, input_data): + """Take input data (audio) to STFT domain. + + Arguments: + input_data {tensor} -- Tensor of floats, with shape (num_batch, num_samples) + + Returns: + magnitude {tensor} -- Magnitude of STFT with shape (num_batch, + num_frequencies, num_frames) + phase {tensor} -- Phase of STFT with shape (num_batch, + num_frequencies, num_frames) + """ + num_batches = input_data.shape[0] + num_samples = input_data.shape[-1] + + self.num_samples = num_samples + + # similar to librosa, reflect-pad the input + input_data = input_data.view(num_batches, 1, num_samples) + # print(1234,input_data.shape) + input_data = F.pad( + input_data.unsqueeze(1), + (self.pad_amount, self.pad_amount, 0, 0, 0, 0), + mode="reflect", + ).squeeze(1) + # print(2333,input_data.shape,self.forward_basis.shape,self.hop_length) + # pdb.set_trace() + forward_transform = F.conv1d( + input_data, self.forward_basis, stride=self.hop_length, padding=0 + ) + + cutoff = int((self.filter_length / 2) + 1) + real_part = forward_transform[:, :cutoff, :] + imag_part = forward_transform[:, cutoff:, :] + + magnitude = torch.sqrt(real_part**2 + imag_part**2) + # phase = torch.atan2(imag_part.data, real_part.data) + + return magnitude # , phase + + def inverse(self, magnitude, phase): + """Call the inverse STFT (iSTFT), given magnitude and phase tensors produced + by the ```transform``` function. + + Arguments: + magnitude {tensor} -- Magnitude of STFT with shape (num_batch, + num_frequencies, num_frames) + phase {tensor} -- Phase of STFT with shape (num_batch, + num_frequencies, num_frames) + + Returns: + inverse_transform {tensor} -- Reconstructed audio given magnitude and phase. Of + shape (num_batch, num_samples) + """ + recombine_magnitude_phase = torch.cat( + [magnitude * torch.cos(phase), magnitude * torch.sin(phase)], dim=1 + ) + + inverse_transform = F.conv_transpose1d( + recombine_magnitude_phase, + self.inverse_basis, + stride=self.hop_length, + padding=0, + ) + + if self.window is not None: + window_sum = window_sumsquare( + self.window, + magnitude.size(-1), + hop_length=self.hop_length, + win_length=self.win_length, + n_fft=self.filter_length, + dtype=np.float32, + ) + # remove modulation effects + approx_nonzero_indices = torch.from_numpy( + np.where(window_sum > tiny(window_sum))[0] + ) + window_sum = torch.from_numpy(window_sum).to(inverse_transform.device) + inverse_transform[:, :, approx_nonzero_indices] /= window_sum[ + approx_nonzero_indices + ] + + # scale by hop ratio + inverse_transform *= float(self.filter_length) / self.hop_length + + inverse_transform = inverse_transform[..., self.pad_amount :] + inverse_transform = inverse_transform[..., : self.num_samples] + inverse_transform = inverse_transform.squeeze(1) + + return inverse_transform + + def forward(self, input_data): + """Take input data (audio) to STFT domain and then back to audio. + + Arguments: + input_data {tensor} -- Tensor of floats, with shape (num_batch, num_samples) + + Returns: + reconstruction {tensor} -- Reconstructed audio given magnitude and phase. Of + shape (num_batch, num_samples) + """ + self.magnitude, self.phase = self.transform(input_data) + reconstruction = self.inverse(self.magnitude, self.phase) + return reconstruction + + +from time import time as ttime + + +class BiGRU(nn.Module): + def __init__(self, input_features, hidden_features, num_layers): + super(BiGRU, self).__init__() + self.gru = nn.GRU( + input_features, + hidden_features, + num_layers=num_layers, + batch_first=True, + bidirectional=True, + ) + + def forward(self, x): + return self.gru(x)[0] + + +class ConvBlockRes(nn.Module): + def __init__(self, in_channels, out_channels, momentum=0.01): + super(ConvBlockRes, self).__init__() + self.conv = nn.Sequential( + nn.Conv2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(3, 3), + stride=(1, 1), + padding=(1, 1), + bias=False, + ), + nn.BatchNorm2d(out_channels, momentum=momentum), + nn.ReLU(), + nn.Conv2d( + in_channels=out_channels, + out_channels=out_channels, + kernel_size=(3, 3), + stride=(1, 1), + padding=(1, 1), + bias=False, + ), + nn.BatchNorm2d(out_channels, momentum=momentum), + nn.ReLU(), + ) + if in_channels != out_channels: + self.shortcut = nn.Conv2d(in_channels, out_channels, (1, 1)) + self.is_shortcut = True + else: + self.is_shortcut = False + + def forward(self, x): + if self.is_shortcut: + return self.conv(x) + self.shortcut(x) + else: + return self.conv(x) + x + + +class Encoder(nn.Module): + def __init__( + self, + in_channels, + in_size, + n_encoders, + kernel_size, + n_blocks, + out_channels=16, + momentum=0.01, + ): + super(Encoder, self).__init__() + self.n_encoders = n_encoders + self.bn = nn.BatchNorm2d(in_channels, momentum=momentum) + self.layers = nn.ModuleList() + self.latent_channels = [] + for i in range(self.n_encoders): + self.layers.append( + ResEncoderBlock( + in_channels, out_channels, kernel_size, n_blocks, momentum=momentum + ) + ) + self.latent_channels.append([out_channels, in_size]) + in_channels = out_channels + out_channels *= 2 + in_size //= 2 + self.out_size = in_size + self.out_channel = out_channels + + def forward(self, x): + concat_tensors = [] + x = self.bn(x) + for i in range(self.n_encoders): + _, x = self.layers[i](x) + concat_tensors.append(_) + return x, concat_tensors + + +class ResEncoderBlock(nn.Module): + def __init__( + self, in_channels, out_channels, kernel_size, n_blocks=1, momentum=0.01 + ): + super(ResEncoderBlock, self).__init__() + self.n_blocks = n_blocks + self.conv = nn.ModuleList() + self.conv.append(ConvBlockRes(in_channels, out_channels, momentum)) + for i in range(n_blocks - 1): + self.conv.append(ConvBlockRes(out_channels, out_channels, momentum)) + self.kernel_size = kernel_size + if self.kernel_size is not None: + self.pool = nn.AvgPool2d(kernel_size=kernel_size) + + def forward(self, x): + for i in range(self.n_blocks): + x = self.conv[i](x) + if self.kernel_size is not None: + return x, self.pool(x) + else: + return x + + +class Intermediate(nn.Module): # + def __init__(self, in_channels, out_channels, n_inters, n_blocks, momentum=0.01): + super(Intermediate, self).__init__() + self.n_inters = n_inters + self.layers = nn.ModuleList() + self.layers.append( + ResEncoderBlock(in_channels, out_channels, None, n_blocks, momentum) + ) + for i in range(self.n_inters - 1): + self.layers.append( + ResEncoderBlock(out_channels, out_channels, None, n_blocks, momentum) + ) + + def forward(self, x): + for i in range(self.n_inters): + x = self.layers[i](x) + return x + + +class ResDecoderBlock(nn.Module): + def __init__(self, in_channels, out_channels, stride, n_blocks=1, momentum=0.01): + super(ResDecoderBlock, self).__init__() + out_padding = (0, 1) if stride == (1, 2) else (1, 1) + self.n_blocks = n_blocks + self.conv1 = nn.Sequential( + nn.ConvTranspose2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(3, 3), + stride=stride, + padding=(1, 1), + output_padding=out_padding, + bias=False, + ), + nn.BatchNorm2d(out_channels, momentum=momentum), + nn.ReLU(), + ) + self.conv2 = nn.ModuleList() + self.conv2.append(ConvBlockRes(out_channels * 2, out_channels, momentum)) + for i in range(n_blocks - 1): + self.conv2.append(ConvBlockRes(out_channels, out_channels, momentum)) + + def forward(self, x, concat_tensor): + x = self.conv1(x) + x = torch.cat((x, concat_tensor), dim=1) + for i in range(self.n_blocks): + x = self.conv2[i](x) + return x + + +class Decoder(nn.Module): + def __init__(self, in_channels, n_decoders, stride, n_blocks, momentum=0.01): + super(Decoder, self).__init__() + self.layers = nn.ModuleList() + self.n_decoders = n_decoders + for i in range(self.n_decoders): + out_channels = in_channels // 2 + self.layers.append( + ResDecoderBlock(in_channels, out_channels, stride, n_blocks, momentum) + ) + in_channels = out_channels + + def forward(self, x, concat_tensors): + for i in range(self.n_decoders): + x = self.layers[i](x, concat_tensors[-1 - i]) + return x + + +class DeepUnet(nn.Module): + def __init__( + self, + kernel_size, + n_blocks, + en_de_layers=5, + inter_layers=4, + in_channels=1, + en_out_channels=16, + ): + super(DeepUnet, self).__init__() + self.encoder = Encoder( + in_channels, 128, en_de_layers, kernel_size, n_blocks, en_out_channels + ) + self.intermediate = Intermediate( + self.encoder.out_channel // 2, + self.encoder.out_channel, + inter_layers, + n_blocks, + ) + self.decoder = Decoder( + self.encoder.out_channel, en_de_layers, kernel_size, n_blocks + ) + + def forward(self, x): + x, concat_tensors = self.encoder(x) + x = self.intermediate(x) + x = self.decoder(x, concat_tensors) + return x + + +class E2E(nn.Module): + def __init__( + self, + n_blocks, + n_gru, + kernel_size, + en_de_layers=5, + inter_layers=4, + in_channels=1, + en_out_channels=16, + ): + super(E2E, self).__init__() + self.unet = DeepUnet( + kernel_size, + n_blocks, + en_de_layers, + inter_layers, + in_channels, + en_out_channels, + ) + self.cnn = nn.Conv2d(en_out_channels, 3, (3, 3), padding=(1, 1)) + if n_gru: + self.fc = nn.Sequential( + BiGRU(3 * 128, 256, n_gru), + nn.Linear(512, 360), + nn.Dropout(0.25), + nn.Sigmoid(), + ) + else: + self.fc = nn.Sequential( + nn.Linear(3 * nn.N_MELS, nn.N_CLASS), nn.Dropout(0.25), nn.Sigmoid() + ) + + def forward(self, mel): + # print(mel.shape) + mel = mel.transpose(-1, -2).unsqueeze(1) + x = self.cnn(self.unet(mel)).transpose(1, 2).flatten(-2) + x = self.fc(x) + # print(x.shape) + return x + + +from librosa.filters import mel + + +class MelSpectrogram(torch.nn.Module): + def __init__( + self, + is_half, + n_mel_channels, + sampling_rate, + win_length, + hop_length, + n_fft=None, + mel_fmin=0, + mel_fmax=None, + clamp=1e-5, + ): + super().__init__() + n_fft = win_length if n_fft is None else n_fft + self.hann_window = {} + mel_basis = mel( + sr=sampling_rate, + n_fft=n_fft, + n_mels=n_mel_channels, + fmin=mel_fmin, + fmax=mel_fmax, + htk=True, + ) + mel_basis = torch.from_numpy(mel_basis).float() + self.register_buffer("mel_basis", mel_basis) + self.n_fft = win_length if n_fft is None else n_fft + self.hop_length = hop_length + self.win_length = win_length + self.sampling_rate = sampling_rate + self.n_mel_channels = n_mel_channels + self.clamp = clamp + self.is_half = is_half + + def forward(self, audio, keyshift=0, speed=1, center=True): + factor = 2 ** (keyshift / 12) + n_fft_new = int(np.round(self.n_fft * factor)) + win_length_new = int(np.round(self.win_length * factor)) + hop_length_new = int(np.round(self.hop_length * speed)) + keyshift_key = str(keyshift) + "_" + str(audio.device) + if keyshift_key not in self.hann_window: + self.hann_window[keyshift_key] = torch.hann_window(win_length_new).to( + # "cpu"if(audio.device.type=="privateuseone") else audio.device + audio.device + ) + # fft = torch.stft(#doesn't support pytorch_dml + # # audio.cpu() if(audio.device.type=="privateuseone")else audio, + # audio, + # n_fft=n_fft_new, + # hop_length=hop_length_new, + # win_length=win_length_new, + # window=self.hann_window[keyshift_key], + # center=center, + # return_complex=True, + # ) + # magnitude = torch.sqrt(fft.real.pow(2) + fft.imag.pow(2)) + # print(1111111111) + # print(222222222222222,audio.device,self.is_half) + if hasattr(self, "stft") == False: + # print(n_fft_new,hop_length_new,win_length_new,audio.shape) + self.stft = STFT( + filter_length=n_fft_new, + hop_length=hop_length_new, + win_length=win_length_new, + window="hann", + ).to(audio.device) + magnitude = self.stft.transform(audio) # phase + # if (audio.device.type == "privateuseone"): + # magnitude=magnitude.to(audio.device) + if keyshift != 0: + size = self.n_fft // 2 + 1 + resize = magnitude.size(1) + if resize < size: + magnitude = F.pad(magnitude, (0, 0, 0, size - resize)) + magnitude = magnitude[:, :size, :] * self.win_length / win_length_new + mel_output = torch.matmul(self.mel_basis, magnitude) + if self.is_half == True: + mel_output = mel_output.half() + log_mel_spec = torch.log(torch.clamp(mel_output, min=self.clamp)) + # print(log_mel_spec.device.type) + return log_mel_spec + + +class RMVPE: + def __init__(self, model_path, is_half, device=None): + self.resample_kernel = {} + self.resample_kernel = {} + self.is_half = is_half + if device is None: + device = "cuda" if torch.cuda.is_available() else "cpu" + self.device = device + self.mel_extractor = MelSpectrogram( + is_half, 128, 16000, 1024, 160, None, 30, 8000 + ).to(device) + if "privateuseone" in str(device): + import onnxruntime as ort + + ort_session = ort.InferenceSession( + "%s/rmvpe.onnx" % os.environ["rmvpe_root"], + providers=["DmlExecutionProvider"], + ) + self.model = ort_session + else: + model = E2E(4, 1, (2, 2)) + ckpt = torch.load(model_path, map_location="cpu") + model.load_state_dict(ckpt) + model.eval() + if is_half == True: + model = model.half() + self.model = model + self.model = self.model.to(device) + cents_mapping = 20 * np.arange(360) + 1997.3794084376191 + self.cents_mapping = np.pad(cents_mapping, (4, 4)) # 368 + + def mel2hidden(self, mel): + with torch.no_grad(): + n_frames = mel.shape[-1] + mel = F.pad( + mel, (0, 32 * ((n_frames - 1) // 32 + 1) - n_frames), mode="constant" + ) + if "privateuseone" in str(self.device): + onnx_input_name = self.model.get_inputs()[0].name + onnx_outputs_names = self.model.get_outputs()[0].name + hidden = self.model.run( + [onnx_outputs_names], + input_feed={onnx_input_name: mel.cpu().numpy()}, + )[0] + else: + hidden = self.model(mel) + return hidden[:, :n_frames] + + def decode(self, hidden, thred=0.03): + cents_pred = self.to_local_average_cents(hidden, thred=thred) + f0 = 10 * (2 ** (cents_pred / 1200)) + f0[f0 == 10] = 0 + # f0 = np.array([10 * (2 ** (cent_pred / 1200)) if cent_pred else 0 for cent_pred in cents_pred]) + return f0 + + def infer_from_audio(self, audio, thred=0.03): + # torch.cuda.synchronize() + t0 = ttime() + mel = self.mel_extractor( + torch.from_numpy(audio).float().to(self.device).unsqueeze(0), center=True + ) + # print(123123123,mel.device.type) + # torch.cuda.synchronize() + t1 = ttime() + hidden = self.mel2hidden(mel) + # torch.cuda.synchronize() + t2 = ttime() + # print(234234,hidden.device.type) + if "privateuseone" not in str(self.device): + hidden = hidden.squeeze(0).cpu().numpy() + else: + hidden = hidden[0] + if self.is_half == True: + hidden = hidden.astype("float32") + + f0 = self.decode(hidden, thred=thred) + # torch.cuda.synchronize() + t3 = ttime() + # print("hmvpe:%s\t%s\t%s\t%s"%(t1-t0,t2-t1,t3-t2,t3-t0)) + return f0 + + def infer_from_audio_with_pitch(self, audio, thred=0.03, f0_min=50, f0_max=1100): + audio = torch.from_numpy(audio).float().to(self.device).unsqueeze(0) + mel = self.mel_extractor(audio, center=True) + hidden = self.mel2hidden(mel) + hidden = hidden.squeeze(0).cpu().numpy() + if self.is_half == True: + hidden = hidden.astype("float32") + f0 = self.decode(hidden, thred=thred) + f0[(f0 < f0_min) | (f0 > f0_max)] = 0 + return f0 + + def to_local_average_cents(self, salience, thred=0.05): + # t0 = ttime() + center = np.argmax(salience, axis=1) # 帧长#index + salience = np.pad(salience, ((0, 0), (4, 4))) # 帧长,368 + # t1 = ttime() + center += 4 + todo_salience = [] + todo_cents_mapping = [] + starts = center - 4 + ends = center + 5 + for idx in range(salience.shape[0]): + todo_salience.append(salience[:, starts[idx] : ends[idx]][idx]) + todo_cents_mapping.append(self.cents_mapping[starts[idx] : ends[idx]]) + # t2 = ttime() + todo_salience = np.array(todo_salience) # 帧长,9 + todo_cents_mapping = np.array(todo_cents_mapping) # 帧长,9 + product_sum = np.sum(todo_salience * todo_cents_mapping, 1) + weight_sum = np.sum(todo_salience, 1) # 帧长 + devided = product_sum / weight_sum # 帧长 + # t3 = ttime() + maxx = np.max(salience, axis=1) # 帧长 + devided[maxx <= thred] = 0 + # t4 = ttime() + # print("decode:%s\t%s\t%s\t%s" % (t1 - t0, t2 - t1, t3 - t2, t4 - t3)) + return devided + + +if __name__ == "__main__": + import librosa + import soundfile as sf + + audio, sampling_rate = sf.read(r"C:\Users\liujing04\Desktop\Z\冬之花clip1.wav") + if len(audio.shape) > 1: + audio = librosa.to_mono(audio.transpose(1, 0)) + audio_bak = audio.copy() + if sampling_rate != 16000: + audio = librosa.resample(audio, orig_sr=sampling_rate, target_sr=16000) + model_path = r"D:\BaiduNetdiskDownload\RVC-beta-v2-0727AMD_realtime\rmvpe.pt" + thred = 0.03 # 0.01 + device = "cuda" if torch.cuda.is_available() else "cpu" + rmvpe = RMVPE(model_path, is_half=False, device=device) + t0 = ttime() + f0 = rmvpe.infer_from_audio(audio, thred=thred) + # f0 = rmvpe.infer_from_audio(audio, thred=thred) + # f0 = rmvpe.infer_from_audio(audio, thred=thred) + # f0 = rmvpe.infer_from_audio(audio, thred=thred) + # f0 = rmvpe.infer_from_audio(audio, thred=thred) + t1 = ttime() + logger.info("%s %.2f", f0.shape, t1 - t0) diff --git a/lib/infer/infer_libs/slicer2.py b/lib/infer/infer_libs/slicer2.py new file mode 100644 index 000000000..5b29ee262 --- /dev/null +++ b/lib/infer/infer_libs/slicer2.py @@ -0,0 +1,260 @@ +import numpy as np + + +# This function is obtained from librosa. +def get_rms( + y, + frame_length=2048, + hop_length=512, + pad_mode="constant", +): + padding = (int(frame_length // 2), int(frame_length // 2)) + y = np.pad(y, padding, mode=pad_mode) + + axis = -1 + # put our new within-frame axis at the end for now + out_strides = y.strides + tuple([y.strides[axis]]) + # Reduce the shape on the framing axis + x_shape_trimmed = list(y.shape) + x_shape_trimmed[axis] -= frame_length - 1 + out_shape = tuple(x_shape_trimmed) + tuple([frame_length]) + xw = np.lib.stride_tricks.as_strided(y, shape=out_shape, strides=out_strides) + if axis < 0: + target_axis = axis - 1 + else: + target_axis = axis + 1 + xw = np.moveaxis(xw, -1, target_axis) + # Downsample along the target axis + slices = [slice(None)] * xw.ndim + slices[axis] = slice(0, None, hop_length) + x = xw[tuple(slices)] + + # Calculate power + power = np.mean(np.abs(x) ** 2, axis=-2, keepdims=True) + + return np.sqrt(power) + + +class Slicer: + def __init__( + self, + sr: int, + threshold: float = -40.0, + min_length: int = 5000, + min_interval: int = 300, + hop_size: int = 20, + max_sil_kept: int = 5000, + ): + if not min_length >= min_interval >= hop_size: + raise ValueError( + "The following condition must be satisfied: min_length >= min_interval >= hop_size" + ) + if not max_sil_kept >= hop_size: + raise ValueError( + "The following condition must be satisfied: max_sil_kept >= hop_size" + ) + min_interval = sr * min_interval / 1000 + self.threshold = 10 ** (threshold / 20.0) + self.hop_size = round(sr * hop_size / 1000) + self.win_size = min(round(min_interval), 4 * self.hop_size) + self.min_length = round(sr * min_length / 1000 / self.hop_size) + self.min_interval = round(min_interval / self.hop_size) + self.max_sil_kept = round(sr * max_sil_kept / 1000 / self.hop_size) + + def _apply_slice(self, waveform, begin, end): + if len(waveform.shape) > 1: + return waveform[ + :, begin * self.hop_size : min(waveform.shape[1], end * self.hop_size) + ] + else: + return waveform[ + begin * self.hop_size : min(waveform.shape[0], end * self.hop_size) + ] + + # @timeit + def slice(self, waveform): + if len(waveform.shape) > 1: + samples = waveform.mean(axis=0) + else: + samples = waveform + if samples.shape[0] <= self.min_length: + return [waveform] + rms_list = get_rms( + y=samples, frame_length=self.win_size, hop_length=self.hop_size + ).squeeze(0) + sil_tags = [] + silence_start = None + clip_start = 0 + for i, rms in enumerate(rms_list): + # Keep looping while frame is silent. + if rms < self.threshold: + # Record start of silent frames. + if silence_start is None: + silence_start = i + continue + # Keep looping while frame is not silent and silence start has not been recorded. + if silence_start is None: + continue + # Clear recorded silence start if interval is not enough or clip is too short + is_leading_silence = silence_start == 0 and i > self.max_sil_kept + need_slice_middle = ( + i - silence_start >= self.min_interval + and i - clip_start >= self.min_length + ) + if not is_leading_silence and not need_slice_middle: + silence_start = None + continue + # Need slicing. Record the range of silent frames to be removed. + if i - silence_start <= self.max_sil_kept: + pos = rms_list[silence_start : i + 1].argmin() + silence_start + if silence_start == 0: + sil_tags.append((0, pos)) + else: + sil_tags.append((pos, pos)) + clip_start = pos + elif i - silence_start <= self.max_sil_kept * 2: + pos = rms_list[ + i - self.max_sil_kept : silence_start + self.max_sil_kept + 1 + ].argmin() + pos += i - self.max_sil_kept + pos_l = ( + rms_list[ + silence_start : silence_start + self.max_sil_kept + 1 + ].argmin() + + silence_start + ) + pos_r = ( + rms_list[i - self.max_sil_kept : i + 1].argmin() + + i + - self.max_sil_kept + ) + if silence_start == 0: + sil_tags.append((0, pos_r)) + clip_start = pos_r + else: + sil_tags.append((min(pos_l, pos), max(pos_r, pos))) + clip_start = max(pos_r, pos) + else: + pos_l = ( + rms_list[ + silence_start : silence_start + self.max_sil_kept + 1 + ].argmin() + + silence_start + ) + pos_r = ( + rms_list[i - self.max_sil_kept : i + 1].argmin() + + i + - self.max_sil_kept + ) + if silence_start == 0: + sil_tags.append((0, pos_r)) + else: + sil_tags.append((pos_l, pos_r)) + clip_start = pos_r + silence_start = None + # Deal with trailing silence. + total_frames = rms_list.shape[0] + if ( + silence_start is not None + and total_frames - silence_start >= self.min_interval + ): + silence_end = min(total_frames, silence_start + self.max_sil_kept) + pos = rms_list[silence_start : silence_end + 1].argmin() + silence_start + sil_tags.append((pos, total_frames + 1)) + # Apply and return slices. + if len(sil_tags) == 0: + return [waveform] + else: + chunks = [] + if sil_tags[0][0] > 0: + chunks.append(self._apply_slice(waveform, 0, sil_tags[0][0])) + for i in range(len(sil_tags) - 1): + chunks.append( + self._apply_slice(waveform, sil_tags[i][1], sil_tags[i + 1][0]) + ) + if sil_tags[-1][1] < total_frames: + chunks.append( + self._apply_slice(waveform, sil_tags[-1][1], total_frames) + ) + return chunks + + +def main(): + import os.path + from argparse import ArgumentParser + + import librosa + import soundfile + + parser = ArgumentParser() + parser.add_argument("audio", type=str, help="The audio to be sliced") + parser.add_argument( + "--out", type=str, help="Output directory of the sliced audio clips" + ) + parser.add_argument( + "--db_thresh", + type=float, + required=False, + default=-40, + help="The dB threshold for silence detection", + ) + parser.add_argument( + "--min_length", + type=int, + required=False, + default=5000, + help="The minimum milliseconds required for each sliced audio clip", + ) + parser.add_argument( + "--min_interval", + type=int, + required=False, + default=300, + help="The minimum milliseconds for a silence part to be sliced", + ) + parser.add_argument( + "--hop_size", + type=int, + required=False, + default=10, + help="Frame length in milliseconds", + ) + parser.add_argument( + "--max_sil_kept", + type=int, + required=False, + default=500, + help="The maximum silence length kept around the sliced clip, presented in milliseconds", + ) + args = parser.parse_args() + out = args.out + if out is None: + out = os.path.dirname(os.path.abspath(args.audio)) + audio, sr = librosa.load(args.audio, sr=None, mono=False) + slicer = Slicer( + sr=sr, + threshold=args.db_thresh, + min_length=args.min_length, + min_interval=args.min_interval, + hop_size=args.hop_size, + max_sil_kept=args.max_sil_kept, + ) + chunks = slicer.slice(audio) + if not os.path.exists(out): + os.makedirs(out) + for i, chunk in enumerate(chunks): + if len(chunk.shape) > 1: + chunk = chunk.T + soundfile.write( + os.path.join( + out, + f"%s_%d.wav" + % (os.path.basename(args.audio).rsplit(".", maxsplit=1)[0], i), + ), + chunk, + sr, + ) + + +if __name__ == "__main__": + main() diff --git a/lib/infer/infer_libs/stftpitchshift b/lib/infer/infer_libs/stftpitchshift new file mode 100644 index 0000000000000000000000000000000000000000..310e89c6193b05671e82f8a299b3cc165412acb4 GIT binary patch literal 1822104 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

    k}s?aaFCZ0nA|Y$eHuR&1jPh%;G5 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

    0a>1B$`&nvT>;&&lIf-7&j$6gyb!+| zo?+u`Y(PxZIbVXwg|euWsXbgB@w1M&IgT zLv8JvOug>}JRSIDzmDctspx{0zoc3qL{^~(HHp7q7ZIm-VFUnA*d;A~)^+d}kEAKE zAbe0b=O3lYu$dJ$1)Ygh!h7S6W%c|H)g6f@*PKsqd0n#SKRuA>?8u(q?LJpO#$p)V z0N-31cZBM1ATXUhfLd)kpdyLvY(MI3M2C_GjLTDu|65QPHU4e7R{EMF2YpNC<{0m3 zvcuj=MVV4o+o|bvGHLTYTJ0qL_4Rxf{@TjIw>$EuWjfNP{gZh+V*Jp_`&(OJqY|zd$ama1Z3vx$z#zYf!$@J&<4E=1Qyw za&vqZ1uC(TDsk(-QS$~K$Oi$Ljy;eW@JKDq`g|V9kp!}`O24}sK!5ZuJa@?hISky= zRS)F8Xd7^>?2I631KFO(uXi+>T7JE4$+Oy@49IPW$H1?5sJzsB6k(UMSrX&dQ_@~` z5snA)2GqBABh*u!o#_~~wPt#hOvd*>4#8tE(?jH??SVXtB{4HCv$thAK8$uC+Pb^X zuGl8WT>_aAe+DdfLjNbW$yfVR;?WT2ra^G{5U#Uz%{H0J&N{SBZUgtZ(2KJL#Lloi zj7K3{Q`;HZ!?-g_qDF@0eTeHzBjb2TwT3Uc7pNQ88zP7!^u?icv9EtJ3KYI7S8R`Fvi#_l|Ll3f9J0 zGNj_LXHX%R*Y7rYCw`*`rl4We>o@3$W$^kv^&2Xi!LwfFIUN`kX2lnyoo!U8*=N0V z(1F%(Yl4rx*KajOh0k}C;l7J6&^g#okc+U>(1&NV{h?Ck5}JD=vGnwcJ@0Vsx@k~0ri>AA#d$w7^MU{2GbQ9D*SJ;6n`8Fy<}H75)n4MQ8*Ahb9~oSaNB(KR zu6=;imMIHrny;53_-cfHh1tuim+-3f5bYui-eG&C+Hj?^^238?ndW4bVGh&GdcVy_ z|H_8jp-zTE3XLFI>4TeD=H?zTo)6j2N+#hoF*p3P_&+@_5X`+Xg4;Fs_&ZVN-x6oU^$UuXWDmRY^0| zbNl5yW7mAXClm`zy@2*@m;p!~z26q?xikXw5EWJ?zi*!&&wjeKa zz{nVELR{*L;5NLdTcIHXAaHDA9dtzp_b9jtI9S$OkGx9n*aC0#??}+p@i=;9os-Fm zR*6bBe@+H&7_erMWU~ukYxDz=!5bUY3zCdOvWgcM(n?_Md=E7( z-CQ(pv)&-NL&bf-w;C~{2ycmw#PNm{OR(-yY$%UeZ%6*djBFwBZf(SaiW<)RfO=co z(QoKn|0q4!-9@nW%E(E-&1C4!cheMFN^iP3=~q>h>8nYNQa4&Ax)x|oyB}@>4I4CK zz<}CZykiE!Xu=f#8Je4Q<)T>Dt2@KZ#Oe1Yy=1)x@wPqFBb%I_~Hc zAtCfNfFv;_cm`7-8c+yA$(iqQ&>q{n9{p-vcNS$P8^4i>w;FW)T5&>@Jn_6gGrM;a zi-l<@i430v^2>a#B=W6~QwSgp)qGJT&lky%KPOXfGpQ(8_8Lsam(ys*vhir7<@5(&qC$_!FQu&Xkt{AWPyrlM8z1&53%r2iGp7xDspc&gv|BF^QV8KIC}D zZ^&Ug5%A%y!w5wr0@g^r3CEw32w080sUDeKor~s{8BdtOzB!OHYUa;jV1BRgI-!j5 zqQO5W%o#HP8j9iWZB^?4)CwriA5Zh-r9=Qgv6|D;=r0(ng|aqWKZD5IrjdEgVmiw)`Ged} z!&{IXnasw!t>PH8)KxAt0khs~!aM+nqi1eFZxAzv^CD-~HiHHCk``TVombzEF2F-n ztJBp%SflzW=haQ}8{;pKY*LZ)>Vu)^(7IVQK_)z95~Wme3yNFtx*mV)xC&h4fd~K( zGJqo3pXpTPEy+yZ?rOmA^~IY1s!K^C7S$Wr`_j38De2Z@spZSiCx>g)SBw6tW>Aky zN%eS#wPE;e-Ik-IB{&!7>}iBGs7p!fnU=cIj{+b;sO%^?YyMe<@o3ny8fJ(7$Ua!vQ2)h`FasIRR|CQ-&*67Mysm?yr;R!UScV*RoWtvjIyn#rL4ty9DZ04gQL^$+eW5B6!}# zPw)C`@Eo#b^PhOX%1mb1EI~X5R|Ce$q+ovN6Ymj71Bb=YUh}gVZh@g(9vA@*isTQY zz~(U_K{aJnbi*5Vf@1;3VCLmXN&Zif)QedK3rgEr%bc)esrH7hhE6{QI1qClSvR>d z=Zs9Yq8`y1&5*8x8J*C%8SNF!i1v@yD{e*;zp4>XyhNpp;P*-6Lh4xMOr7B8i8`?l z0?}qlwHolUPC9>`j76Ipzz{HISR#;>6gRr`zi4d(_f|gZKGO0o1n8Yxx7C!T`Uclq zO-AS@0Q#vlSmI`r4A28fIPt5xV1@Wv0nLt7Q_Z9^b1amJB}f_YSw}nXa8c7q-|qg38lrOJpjiqNqXRaiSFQQ8K3$!UQqR{fsYX z;r@wAparYyGc86gXQA98l`ZJ{eFYZiC+nR7o2C|wXgOjWHj_#R(C|^>r3&=yl~rT) z)pN(fuCaDAU4X!9_{OSPf)9Z@z1-ngA0R+-HxM{YihKyH0)Uw2J_ODHR3i|$l!XBV z)}y$QZV~H=Th$#xV1HE75I7&??(KNx3W7i%e8AN#Ap(ItqY(J33xS>o#6UoOxt2*_ zEE>2Nptc}TB9elT1Q#O*Lx&I;j7k~;=YsgX?I*4v2=sm~4+J)gLSUc^f$oVI2%IXP z#SKAVJPQLFSX+rSfxyWyjXH!tIVx!goC5~%wwpcG1uP68u%;4l0)Z28S-L|A?1M@g0%w5%y#80LAPDrpS63qtFmm871p!+Q zJmW&(kHIkzIFaGPsSpi}V_^V+BDJFv2pr$N6A;)Nl{5s-00VeiUA}@K&~0WO2#kzE z;CvSXzYU6k!13}e+YkiKV_^V+)hXDtBs>loiaMl$Jtf0bGv&r6g}}}(1b!`#fxvNqYJ>*HvM_+aY7}f50;Ax?><|J2#MLPfI28=wZFXrK1dJcL zd0ygM+VIVC)rMeO1zd=;pIz}nU#6`qR>#-Pepbs7uuSn4gVY=ymA1h93Y6A*f^^hF z8%r;Nm~(Z+)K9@i}%4YTrNEX{c=ueELwE;6v?d1+@uk zZDLZsAVmbCK&|mF@le}Vg0DkR+lz$()ZUYna_kC8ZGP_r)Ow(j7M#0)U%ao!uLP*Q zIHS{0`x=vof!dBysGaCS?Z&<1p|%(pQ=-PAwO&s-P@6`{p=s^=C7poU8>pnA_8Z8| zd-lSW0JW>1=rq)xy(AWD@4*5AhuXBZnhUj&d&NU-7BCip+FL9PXzg^#kf&(v#a}xC zwOdh1Lv7wgfZD_h;-Q92w#skVoT_>^nN74nX5!L*!sFl8!_tX&k?*qTiA0N1OV}`K z;RTOdrdG>rPtNt;_wE3GgrFMImG7#fzB>t)x}n`#;8@|k4Nr;tUeXeb^8v9r5TC~8 zXD_NKcu;F@sk^IU^v-n7EA`R{2w&`_88KqZU~w%U;FR<%i)@>PvTK#}1od ze<>YnokU7z14@HoJSr?M5k5M&R+6V#epxi2i}zf2aN{{F->8oeyK>bMSw6s zcdK3uqA|LGa3;($8gjdKP=X#S1tp*z0EhiT0IjzfTEc zM#*|x;RX^OO(@q+belUa6(?~<8OfM<`_TUl>XX=YUq^ol7edv5E+- z>~pK3m2!cHrj<&Ccj?8a71pq6MeT_vsfJnaBVstMQc0U{5U3~L61-=+p%v5US~*rE zt(406!tmFy(3FUIc<-);R@A}_@$~}nDOxE&^MF>?X1U3YE#9_A(9rKQ>;3wJJep~A zKr3o)h~+~o>$uThx;4rt|xv7nXH&+0s_>|gHE z%CTcyxpL;-0j<>R`#++UZ6FvUwDS3lv9$7Ul7W#CxoBlH@f^VW7&$S_ODjX}3)9M~ zjF}c4q_8M*r8f&5S~<8Zo>m^aKb}@zV7Wsphb@*8Lo4@u+Z9?l6RkR+mFlxWEBl<0 zlU7P`k&YzbjolK^TGI!XH`^16>Gd-y-_TBSO2!q?$|(7DgL}~gI>_@Rnpd5M4FmpKE8Vi25QW$}$n9d?++EB%6xG*q zyXcA7dr2SvY7lctD?NJRg|Hjitf|JDNhjfN*l4Gv+Fb)>;@3c*F{2sFqT^)b42+Gf zGq9V#L0yuV?+=;6lE@j@*X+|WU#Id}+oCtgyAI9QGp#10bray@oHIca+nxrRaL&LS ziv-oi;?9_DjfUT^)4}_>Sa-hmWuf-O!U&KI_DY~Jto@m3Q8OlKxG3vgh5qqq46?g> zlI|w4O)`V%6!S({_}X4L@PCS(o8qiD3uS6k(mk zoS@zO_kyU**pl)BFK|`yt1zY?VTmAKjEhyJf=Rb8?wIFVQ6qh)Co@umniVTq1fbz7 zk813!Hxlv^Ty(-?ImUveBrI21>Tz+n zwK6Jse!dK>Jtc<&E5WN z^yf4fYo&i;kB$&qV6LAj;zt@eN?06QqlSoKJvC~h8dd&a)a@dpvYCO<6jFF*3W4XB z3aK1{7l_KAg!{z=wr0Q3h<~jhd^u%{JuNuwEboiWdqyP5hd*>!ktb~9lR*)(@naII zeb&2UNyP1cdh3ay5QyW!QI@JC=OPD$Tj&q)I1(~imHm-+!AROQwcV+Zp`V{f8LDQQ z#}j~&iUFmZvM>uR0{9^Nto~c9|Mt^=OZDIW`Y)^xsXsvfE!TfxQ4`K8NcUVNe$9T< z#JAOj^_UJXyO9Wn7oKM+!6y=j2-*|VtfF30#1FS3hqpAAG%zQzSod`SzST#Em=%`L z%X{twqi}*KO5-mvvG2j1fg{l!0A^+%);*8nb?&z>=6(A|sOwyDgzybkwb;;70rV)& zdM{Jb(IF-=^errUREj{u3_1k;GwvH-U-e5-iC_G6#*U?v@-)&tlelWE8PuMUSl_;sBi> zhzmh_$z&ILoR4T}e5DhPfg8 zy)h;Keg&$rtRE`r`xV_sV`b`GWYDNV$666*M0OH0!N^q&m`S}YYgNRxOzN9M4U5WS zFN~M(yW^jZ5QIqG58S4&$s^BysJ?jhNyv2CHgtc4zdL>>D-X24JASe*3BEgi7)n}u z0(vc^d^@oApP&s_nuTfGBf$3=NG=E8C~3NrJc5Yzr^4|i2S*^<`Z6{@ZxJUHxl$Px z2|42H3((l%ZcId9)uLh+86W^#0~JG5T4qSfMxs)f%_?`4N~`vBGrkj`LX{yZL`h1Q zYYz}{hf&-B2(NT8dQnW?ttnR>0!ioOZ_^hfBKf0yGGN;5g`66)N0mWIVqv(!*@qj% z5f$O`-C17UP=Wi+PeCI+2Tp`JzT5p;JG~6QNQz0f7pfDEmw=!=q{Ec}5h-qAA@T$P z-N;s0e*jJ+E&3ZCwNWdfBcmG80<4Pz%RxY&^!L8*?^~IIdfR*!7)*k>@OF;a2MfGO zJE2J?fs(9ug>py=&mMZ(?^*_-cXEad&|^*Is?(3ti~oRtK?dv(<+2Z)759^V~UsMsp(g)V$R~@XX+Cf)c)f0;PIxf4Jlajk4sIBgi%WhBzz~ zgKI2y8gv(|uU_7Thl!*D0gT{=ejy<-mBG1y5$Qq@v-DpsA|p~0@_UAj85Mml>#V`~ zIg>s;NNPz#=E({L-G4ks5b*MeMDo{btbL)1TTru^x6_PM?=#gyJxoyDi`aN)f&UiG z6IxUXqcMMpI~TY7gNQtHJurSfy*PF26-IgA!z#kE|}SO&g1Q zOsYxo&8j%G_21r4o*yXoO0>>V+5xQDr_*y*7bz;J~4Do2EcxQ}z$u{c7pkHV(K zKt$CD!#q@QL=_UqBd&MY^c*PrH%?}WvR9%gJGed;WxJ~42+IDD9)?Xzrt!TcbxlW5 zr$2)5A2_uaeW)-YxVm=@q7HFuP>%|kH<*$}luR=LUDeaf*E?g-Ib>vj&VA&!gU*jv zi$%siRI!5$`V@|jqO&jDEHUW(5$+-sJ3U0uxyRx8(HXsDcZG979O$H)17qTTc zgW!d6MYbM zU;(Jt9om&$R2m1PL`fmmYTKus*!i^7Iy;|#KA?>77p@ z6~c1ud>)sRYdUYB&G6YhK5m1n?jNG00cltz^lV&TJc$JV;$Q)y)VEAblL~x2_ll2Zb2vi;HeD;t>NXoA6 zeBQzlahG>K4QLz~zCOQ3mHeBiXj7I}3C-M0+Zuftc0L;>2?&sWXy=m}=InfYX&dqW zpmAsRCm5hus;2m-i~EzuC2v+#M&815B_r1z7Rbmx_)W^)WRNQ(|AgQrmquKe$Lvoo z6tQYc^JUqe%&brvL-reDLY}PpYvA-&IgyqXW2UYB$t&e(qW34~98W$`T(}pq7AYTz zy+0WUOP66MdVey%D6~Hr{ur^`$^A(Ihg18LSHMl7{mF>n?fsOUqsjKc{=~RD0nu{k zIw4Kt=LwT&Ch-N=KN_(lu%0f#1e>q|G!YPOaV)1HE>5u=b@A$|81#f!aO%P8f*D!R zdakTbUG+v6vOzc$0bz1j*jzM|WY-7_bHE(aVqd7WW`0GrQN`Bom1r8bDr=$JhN@R( zDk!UB(kN9HG4R@Lr^^vT9G0p6sv-;kSl_U~hdHh$@~Q^JkvJKr^?j$<&JHlv8x;$T z0#zIULmS1l(!;PBu)eWr0^WH^9-!6M_ZS!rt>4h-b{ z=J-uPvIi~-*tYO)yrdF38P$r6W`~5hTOO5=p)d;D9OV~%k0IpBwI%n7xY&5ls5Y^8 z0Sp{HjZv|833R8~bm{sd8_C^tyR>U5S3oF=X2mIf@SSjI+ThC5)q}<0^3%6SeVx_? zqg#?#QMDfIJFI4fy>+-y;I$oqBl|n7rTVh=f^nP3y!ftX~@~}vNa}d?LvK1$50o(BdSo8P8PB%NbGsUr=T;@p=J5z zmj-nLKKr0f3`xlp9WT|^s{ZTm$)F5sv9nSp!IeKxuHEl!I1|ZsQKSYhDffO#*MfyTX? zkHeHz9?T(g<%XRj^VnAs69$h|HRL&G{g@Mxu2B;?&<2AE@^~9AQh<`Wo3d`ubS-%V z?p<%gfWA-_5pTnP2cfOwZ8(e*K}q0k7=)5|Z^MbenQID!j0h-0Eaq{h;0nAAQ{@rd zsJ#u6M9X!C=FuCmC$Dp{#r6FUft?Yd-Y8}j`3Su{hE5b5W!87eBk0BKMBb);NzM0e z<%@U&C@S)&p|VB6poUUcm^cbzimDx~AY5Hm&wT38Q`!-&^wgwiOJ6bA3c>e{K-pno zPUbEi4}+qBw2X5+{5lg{#W+b$f=shyg(Jdbf^FKI+b{wIVBZ{WQ(}XW0Ml>`o>q%z ztuDjch8{Y`XO_z)5i~#hF3%s~*)=1jguP@+dSMEPa_T3b%arV)9*Zs1Fao-U(@DO}1{~YESilLu_F$Wv|hsd04`jHYf z|MBkpA6};UKe1f%e}Y+pV&;E;X#Ue9^Oq7e|99N^_Y_mMA_V_Z>Qv{;Sz;q7cXHi8 zP#`)hnpL@2mF&Y#VExw&?$&kgc$*o3Vpi84THTV!>ZC-iZcDWs!`(+N`|1Y#qNWk7 z?nZxgggkT8>%WZ1uP-xZ6Lny5HD|;BGlqSCV6O zucLE&b#KXx?bS(%THP;dIc9a+(OHmMCd#actnL(cvb?L?gUN|vD06poZm({j%-CL? zl&IC6sFq_^H$^?#xTDqB+>MKVsXs2^q}ozbO7XX5(iZrC#CV)EfERUOyI!;_uG-F; z!b-_ZMoMvc7EiuIYwGVX&@vg8C6Uepf1WQa;5g!zdhXABD=paF2HVM_>HUnd-j!ndWSEYslaMi{=*e*g`o+i{WHc$MZWzxA zJhZJGV)cFj_TSRhK1qDz2=!?U%hXxr>h1BZtY(U&z-B$Z^=RV_3KlaAec2a)%&MmB z#HopoXj@DzXsD)^^|rtWxD+{)#74nEZFyrRJ9!$NXnN7h0+;@EL2q{D3btV%CO51;FL% zM|pgd;ED9}w$;zc`TKb{-+W%R`gtzY53Pl&#R>=&-T7J7otxmvtZwOsyQ<=2D0;TI z=-I^LQ+V~X9xydN7W*tmY>rb>iN&d=8pcroq|a6^K1Fc_pxahc(cKDM3;C?s==HFe zq_-_Sg6L@?p1%fLE4Q9JPTmHO-R7FNZ{e*(WQ#{nJk~pw;vftzIz;ulba5akh94u! zBwCb+gG(Go&f}OwY3i0dMVt3BR$1VE3rPupysqxr6Bcl%Rg8w;Pf-%RI<2NS$^JBn zEh3Cj-Emp(P3df0*1jAtoO<$0B(YcfvG z^Cj0YkNeL_zJEKYACg@6W3M4CGa{a_7Li;dzR|@>a*bsbCAr3{al8racbk12iPL#r zV~4_A6Ukf>Nh6P&ZRPOViFh00wK*H*;I)r%UDx5Yt5BeM?a!N8yjDFtKdA{b!s^@qn2X&1*f|<9Y3OOu*)~0+AxrT!z=AMDg0T^3vzE zk?JwZYaa~70u--}1X*>O*Z%#J%WJD0>GM_@d7$KH|Gn_q$-#4o*9Pj12P8Xnjp4QT zT06ySFYUR!yjDWy3V3biW)83Yyd`+88s%QL((XCSpq>ymrzSUE#GGO+HJ-RE%2DT-3;)n%B;BYjJ#C>uvez^4dPCEX-^F zX0gj_b6Di+wNIo-&1Q%4m~~#d`HJVYI;J2Z(S`KdahQP3YbW5@)oW6scGRqw z^%&)~vkvlktqo+=Xxq5evbiC&v}n9FO`5Bkr-Yrh2bL%j9|1EtuL%WH=(>J+d2 zb&uucwTH-D0j~|&#No9x-iCPX%aRzsa)e2E^#RZ_>tam{&$o_S*eoHNR!#zT@+pBg60Mj$TQjK$W3+CiE6sw%2l{{y3wNaezBP0o^Q77iwaLsB#Cy|s#i^N|)tuJ_)R1)c zV|<*3FVT8K{ABkd?Pkj1odYyhxg4!Ah3yZBY7$nWvK+oFCn*%d>v_FEM@U+(x)ue z!R!%nzf@tVFF*v!`UB;pEcpxQuvI`=8-dOdLMpjTNLkV+fW8NAC<3pbEVd(M$s0GV z>BCrvP}Wk^5z1mEpRzVN%21Z{F>ey931xATpez=fp4FUR6B|`1i!U{0v7MqUS)CBT zEsP0N%Ow?mAUaE@0W;Zh)szh(Ogqd_mJE+ZHIVs=vPwB2MY5Av=wvFqdx4=Wx5FMF zRYh3^XdYxhU6bV|x037w9=cab)F@f6{VsVdmqD}M4*4m|w3>rfHf5RS-%RJ+n*|Dg z0%hI2flwAn$ce67ag?<&K-3{+&Dk%WvX~H~L&~byI4@=W12OIB12T(L(ycR;b-5fE zbcV7dhjKt!t)vG{{=Up|3E_ahhAHcI9Z_!RNJ#cp7Mc=~SqFX+PgxHQkEg6>S?*BQ zp-M;@8oBEZhq9KEG;+%<(`pP_#Zgv6Kv`F82+G>C-^!+}GJvQ<${K^%(Kwk^{kKj~ z)=yYS9+`E<;mb@}yWoC~)`lI(tUq`KFrcj8Ne}rc>#IY;l=Ub#&Y}$!_Jpz?VxdD> zUw;@+S%+4{Q`RV!JCyaK5>kdn_P^bsthYNyS!| zasvYCy|?+Tzvt{Bj4|H{$4021@BIbr50I7a1+2f~rlJ{b1LP*NTbrA6*iq@YZSi+A z$`IGDnCA=sjwno~hZN%xwUWhn?uX}6Jom?QDW3bIdvVc~Ohc~5_SKXkraM$h|NSDd zh)>7Bajm1B*ZEv10x3IQE`eS{-O>;tkF}(I1LtlGbB^_ZDjC>$K0U zM^iTDOU=F)8}Y4?Oc-u@i|qtVn4jKuTmn4eRs|eLf%6`MNA7#9S*)LKr>(z71SP1g9GZWWuLYOWB20x(ZUsK7U}ZxWVKfa3LCex zf=E)oAQ1?#b}-;z?j{3IWH4-98wA&8tz{4@#=(m4F>sQ@Wr5W~)OO)i&NYU)mLfpz z5=$fO{Gk3QypRZy^U}Y!KrW&%TkZ;$2r%bTURsv#Asy8KE`2wwf)89DITNI5DvTgF zgjA8t1VkuDf*iV)xd`ON7hHEp4n=Ut@%v+eXrVHypmj5s@v6|af6JjCmBr&bQd!K- zoANKpzwvP9TwOQ^+=Ah+JeaG>dPf3+0knJx<5TTe>@CShhGCLP^*kU60lrPUx`j78 zi3oRmAbsGx3;HGX-7q;5)}(X{2C*n4Crmzv5?7A279J7{Om1fwOqXDS)iEcwwYms) z{Pl8;sNZ-huWuyUb&R|lOht+AOso+@>lvIl4(d%T@jEQ z<`5l;X-YKrMUYm}tVR|HMQT5Wl+w^>P}TM=M4#32=_oo=#*#Vrk_`7%4;8J z{mn8VUjr7;$C#PKb-J{NqJv+t1(hyAMd`$KiiW0wpYXM)bmh%xP^(t(Bg({Lfzf0l zNbronG=HF;s>=t_WqQ=jt(1QC=@Esk+v6&AT``{Okd$CX(WITZ`kDy4u#P+w(>$rlK;UfN60%vjomh>vM0 zdX`vhR|vctL1!>uw}9*aGZRfS?oWI_>o`5%s~}7VBo?|cH5N-L>Q{1E!W}5)lw=<| zmtp``l{^a)U#75+Zyi=$Y{auKg_jv<$a&dH`UX-Ps@d{6PBsxPmW0t)kwj96ik>Jk z-WVwqs{;s0U)7`RAy{j{2kDT z)jzB1JD>wWGTy@O1TM{(rewDUrsC9>K{s4QHlSf}0UlLNl0AeOI8q6(bq}+yPmyy{ z=_6V4*0L)WOJGO-)UdpjwImsVia|h!0)l-}4iGSD1qgx=Fhc`Tp@l|JdkGpl4a$I7 znQD~Wnv>~5tQd>1R~&oEEP;G?m`@w2+ul+w1>~IJI+|a?nO|UK(aO=mL)Q^5a$^$E z)7t!X9E^5Zn_t)6fk~8Obcwm?21YT8+>WJ-0AFeD*$GNoiotdrZ5qKq~e;B_b6! zzyLW~N6FNdihT&IkW{>cxUdghA z2}XjVVopsSv)=7PgpHsSToJz!h{*y8Xf|d)1CFU`Y26MW#c0C%_?z{1zY?rZC!%W< zwQdjSS6|jrQ1xc5D+Y?qV%hpxOxPMZv^jV@@7w#Gw`S+qY)cn)VOX+!?fs2jd!`c4 zqJ=L)2ep8WykGnV9juT5fi>pXtWxPMRMIwUf7lY>LMmSCbGicnaT1vnm` zJ>32bR)lycWp%m;q2F2KK_g-Xpcpbo9^u6oI{_`^%PPg}FbrPwH4J$+D z{`l*XrQWpm95VO)B}+o;(xLP(;lU2g(S>s;y{-mSOL9Ayh;~Aw%Qqo{f}~7NLZdl~ zAg$LRP9`+6smYnwhvHe!dSl%A83^Yf(Kp@NQK|`xRWU;%)c2!w6P=rks%)D(KN!e#o&${!ARU~&IB-K*G z4QQg(@PGKz*(x}^m8$$Wo%k4z?%vhy-NtRuI)I{#T=f;(WlE0Uu@8DGZrvT_Ei6A- zx~7v+s!8{$ey!`KD?f%E1#!-D*-Cznn)TQ@>)``vsT7NikPZ#D&{ZcZ4IJc;f0Dzg zp_;VJUCI)AZ-b&TaIbpIdUcoaHRIh}4R!G^OF|k->^L%l?B|ND8!nWUD+pzzPm82t zQP#>JT(g%!?k=uISx!6gXBSX5kcXFK~`x8v~Y|0LW}7{4R9U4o!S z3vSb7H3GL+__GW2_9~P8WlGlAHUzhXbnT0X2jnppZV%yA4!Er#PW%odbOf2>H+3NM ztISs*^Cud?U4YCJ5~^0Ruzv_LQ>AMkG6iD($3mtDUaefn9E=ekwq*Yr%mu93vyeLgoy-TDg$l?#~-UFS@!URxW1d=_MOp<71jwMy~O*j~%d znIgwaNO8$2TZSO>z6+TFGEyvL_QI&b(Q}LgyRIvrz1G7iZDkDj`zsw1djjU&o1!w2quQkl>DhQ1jhrVYafme%3~}X zAI7VEa1@rt2JEwM=&b;I<9DeFwTQ?7#r`^K3CBe$U<1205eqmzVsqIE7NZB#+hhbd z0&?-aVYH2{y1V2X8Fly1_g=ohO#x+Q_BN&yGdX_z&rI&GYI6R*$9OX|Bv#(sX18~b zogBXzXePH#2aww+42?K{L#gW#bbN5Dst)|sFKhe7ATEn3WF$b&Qmj$e3XTm)CgN9} zA8M~^d#S30AvXc9@ud@*01;}0o`y{T8 zZgn2JXT5&%4P5xGRG@Obrn6yEOz%>&F1bX1ELYWQ(4|{O>K!H}h^Axz$c!ymoyJ0- z%s%|?{srY{*y2cH4dJ^VG^oA~VvB4LEPRxfZXi0}I4Ie;%GM zxpxH_!EYVukV>r4@yVKwvit!}wDHzw1b#+9*`Is^pHxdu2j+IW6DTDu{raFM%Yj)Z zUHi)ND|w7nmfzx)r7VqHG}M?2lf%Q9{P7qIlQk27Z5Np*k|BL$9(1^RA~LVQ8wZ&x zUC734V32u31euc-u0&+MH?m`779(QVvV49;6OGK`QTW*fWFEUKfl|_Ay$~{|O4mLz ze~`ymWd4L#7BVBUrPJ8FcXWPiPNC@cv3ZGRRAQ4c-7(m#V1wM)eD<@Ih|RL&JI3bV zH5_anjwTwLr}JkQuvyD|UYU|DOG4QE1)#O)W|)i=i_HqWS|Ql1JUKr$v-C0e*nCWL zDzV8=fyQ9-N;b%i%|$IM5u2Z3F_un_6}00JGikwil~V|E(IOl1XBV(Jr;H#fIdJU| zHXp%ktdW+=V=OkiW8^q&8Y{u^Hq2y9sxq`_eo6SiT17L5cPpCpj?$dRAu6?%U&Mle zRxqzXhnqv0GGkn9&Qw(ukvr&mTh%bW>z)jFH60VyjvN^erBnx{R0|uWCTgS9`3cB> z-carw>aSjnV_rdFJ4Jpxm~>n=Qdi;jcdDSw5)A#%-S{y)&|-snpqA8XhgjlMFI0j0eCSFAYUWA z+6&hgkdxHymd|tAs`)im^S8JdB2-_y>~*rbxhP+!W(vNZ_M*-Ngq%eoXnN_QwC-cp z8vKEkE$$~%IKg0j3~I?B>AD&N02i4%LUanPHl*gvQdj&Jc&&)aDw^3OEi*p7Xi_Oh zR{K^?F#Vo_I=HvM`zHcZ#j4Y@g6=;u2!;edrNgBQi z5_hEG*pWG<;nz?EVPPLH4Ud#bbSw>j*Ja~^5<+ap>Uo}(uy((nlc<913K9{*3QMA?Q% zybEc#CK*Wt)bdEfPms~fwGCf6Iz}4aM^XI$4{7*D-{q2qlU4IP((sPafi(Q;b-*>p zPI(5by|B2*Ee!|18Yc}4)NDE-4L3SIP8v3>woKA+67Ie`w&CH!b4tUv--#|SUK;Kt zljv9)J`L`RmxjNrD$D3V8t&9+36Av`J)c(^j{j>;Y4{^}Q==|U8WsZ9Ii=w+HP<{l zg%@$%Uik}acMcIBE>QdbRzef zX5_oqbToPiZhM3sxJWu&z<**sxQHp?d(VH9DELTj;_gkD~KCh&{(n5Hn+c zm@lsm__|(Y>>rJl)MF)ZV^&VbMVx6vQ;E8WQwWYU;OhA!f7gkPr}42HMpVvnG|YPA z@s`;=aQGX1h56fKS%;S#)bVz2?n+Z2NF>$bDY4q>a_*?rB)6vMeZu9A4FG$<3768- z!`K{kv))E%-U`8nOBGTgB>guzpp!gX4H{YV)#kSWHLWx5!L57IF~yF0%_Rdm-5ic? zyf>f(Rh?J7b6@jmWh?Nj_h}Z-)pJKX`6`Lw0f1p6VCY;8vCjCfl11~x54E!1aqxJCM-dDt&U!ycQ!+Y0ARanuLKviL zm{B)HtJa=U-vLT5uMgMdNy> z6l%Di-{&CPgsGuc>IKxWmE5w5P{Zl+sSB4H{>$a0Y-+eceGtQ^h7WLH5l;Y>DZP7@#0A`71(#p*sc=--)njlo@8$>7mB2 zD67Q}$~hI0HSVO=QAW=F>1FaZJ2kM-ppYXseZo<1bTljKToK+YpaUZbPX!xjTWKS3 znD_o1_8O**dR~W%d!N5s`6%q5r`m)J{ zv1XaX&w!=r?GS}eAOlzV_)6)N$t;#fo z1%!NNIiJn@e)_qeeKk)BA5?=WkrKs@8E3uzoC|qVC8pA|-4dmi_9mC~^TDZYhlI5B z14jgkIJK9o*hM%oTK@$a>d2|~lHlC)KkqkME#DKMrH3bznWGC?@p0*pR0LFIy~)1R zK+R+siZNlKlm5zR^fVRYH9D!DgH8mW<)ei=P+T!UwGxuFL&>lf1qq)R0LQ4k6Whc932TS`>EByI)aC0x2z%ktPLBpl5L~OD7QUX#mEi z&j34Or4hHo2k7b4sOf}2IN$)m*r}GH^ylgo@2V9D z*-T7ffHn#0kz{mooth$qfb0ju3L87R+nKknDOvOcX!ASuR)cLUu!@##>LT`>Wc?#L zy$~uR{%}`@CSU+V`>Hl1QhN_lwOhMen+0^8oHWeLNGBuzTmfkTKvHsMy-HFP)0DdT zNRywFvVm?_>nCT~TAJ7y0Zi7@s!idWZ;ztaddxVf{vsD<02*JhRL;O#Bn|>(MC_x1 zgi}D|zmpu;RCM*jN(G>tfKsowLsjUDOkYtD6E1tSVBD&BIfL@KwU-JHK>{M_v{AR} zk1S1%=l9o7;KgL2|3*?h3dfxXI$6}Gn~=7xfzTP%I)`_gDn`AQ&ED~6Izn}=Vrge+ zmGrl3sUZuJ-I%SHsuZe>9YUokj(Yo3-eeYJ@JhZ~qSApmmdGi2?lRrk1q-{48v->R z#vG0b4#VF*TF~s8l-(d_1GdnB=EOww8s*xkS2FZ7U0W$vq`3O5M=~>{9jyT;~1Vpv6gQ3lpZr7ylDWi!Z)l)1r|ymYAU+G&JACDvzp*c5*`QtY4aM zdh4uT`#lH6{LM@e{b1gfUTnSN^G>1$wdE_ttN>lDr&Gh4fDhri=dc4(AFct!v);qp zR|S`9WSf=BqB3}7wtPrnzE{UO)pJXoJyFc6wIv>niznq2&6H0)|qAgtASmqE7Er#tdeyr4|)wh{&uq<4daGTq} zs*+8qI?>!OS$!6>NnO@naK-x=tl7cJa*p(JT_;D<3w2nKV>jp0P>xiXf&ghqiLg|7 zU_q=@c;H!wMx#TsWMxQ&9iD+yXnx9-3jH7@Ec%WkSxYLsisKwhDm;%zODa4fk0Gfr zorSSd!S`E{?Anwv1KT+{EzAxw%5IN!7lCi(5R99&v6VZoZKga1t!N|0%bf^;9Q$Ae@M2nfba$XGe-Bc@aJKzE5Pg63MhO zMK~!#fF74Z3cUFnE14_L6x_i^~*Zzi9-JPm#v~+zziphZd(8#Rl`q z5*q=YJ1Wdg*(p7T@Q$>8uP4{$zul~^m)TOd;DoLDZ+C4etp6lr!raFx697Hf!X`gx zcbafIP3U4&idnhkKL$ig1t9(gmo{5mZ!`}vkSKyj(XS)!EsQ&=b^UXkJd=ZtFyFG^ zpfFc-w$jwF2K3%Y!btAGk5145-N46#@wk7wKPfD63CaAXKswtwo&p{bvS zroQk#!hIS4QxvGivi(s>e~My9h)*rZ28|kYtiAduK^yFnlraA8=Pq?uS{AEZ^zMp= zxQD4@WymEY7knbhdipQLrErEt)`^6Kt$ffk47n}Cs*<0 z6D|pbgw4FfQm`F;{7wp{Qmj3mKw8%ad<3-WJ`_TY2`4y`%H+jfiMFawLMK&uDHOA` zNpnriH-2Pv5Bkk||9x5x&twkABYXq5 zF|21=IMf6N?gqwpZ|OnqJgmW=?)g!O^5!A(EM_4Zc+;J?9K1gW6Z13|)2iEhj5`ni zyW-;N_U_{lT+scBu|c*ie1AT+yAaEIcD&k745p<9QcTxR|=W8s6DSFswhZS7#* zzc26AmQl%sD{&XFb#>G4LwKrHd*}F7M(u(J(FDz5jAd8JfvbwfWb zil*X~g|t{SJV1;Gi#ZcN_GM7?#gR3Tt8c zf`#2N=>Wr{@DzvPSV)X?G4LgXvyXwRIG#lV=iEev#*K!#3W z;3R=xfPwSy>_RAlfy+d~`eZg-dJrBsia+!7z#PPzx&3zy19d!}%anZb$#P@hO9X-h z7+4cah{J$urz*Ac2tJl!WXG4#G``xo3a8bU1k)CoFLz$Yh%hUBx$_~OU6@2*-UrIT zk~_~!4+8Vq{Fxu-hhT1Q|6POm7W`OxrsSxPmmB88G3fy27vU)m=CN|8f@Oc#W zM)LP<#6xE!|5gIO00XU{z`zc8>NEx>xEMHF0*JNsQ^+&n&hWs8 zhq)N=@a#e;f`Mwex8Y-;QF;&zyv3jSG0=#x9k>6kVc@RC!UOldzuXuYjY$U>xCT$1 z#=uT42EKy8Cl7SzrsL{Y5FPpK+NX4Af9@*q3#8CsJi8EzV4$0*86N|iNe_a7ZTK@k z1`fb1-Tu3VfsK9;46OOya%13mq%;UH@F||+Fktj2FGemj#`}^x3G#$|fQL$08MH4* zppmoZmK)!0R=!xpavv@OTLON4>Jp%|m?-`GY(C()wns93SYa}SsF%MMcCfqH1*@?o zTsfXy=tr=-In;zTg;ME3u)8&X=Ev?Bgp0ZTcMZGyd?(o5{N3foZaosk1lV1Gr#S4! zBI7t08P`#*7-VeKumK!T1mW897-{$*v1x0(6E z!o>nScYupkCFIi=doN25f{S_lnHLuo2$*ua?;0+)`bKck+O*ub7=bwlxL{(QI9y=k zt9A%FP@7H!9Rwzuj%;}`L{mY&(5C9k+6u<4C$)KS&(J1yWIJ=Ie4HhalOg(Dm2(RF zyk!C$5&-XbE||R?)vRTByPP4UFqxclyYtY{*rB=22)|!;ICXh$`^Ao3*Un3ikgT+pr_V)>$_V;m5 z`+J`qd)hzpcALv0*w!AmvzecW9w;Zs?(`h<3?KNi6F2|dIQB;eV<`6E&D-qRQ2veq zJ52}iO+(CIOdS1m?5eJx+_S)s&67N@DaPLl;3a%_X0BTJOcqy z_%DIp#jm!fDsECu7}F}nr>f#+6gQ()3;x#8seGg)fu-xU2|-Jfgoaq98w12JYYDT! zH@=r5xVA;VMRC^qSi;d>Q6p!)D)yf)Q{H=?w#es8`m0e};E`|XsXBy<-fg*;v_xYB z^`xsBb<1xAT{2Gqp%VWMFHUZUfaux3b_WhIfXwV^m2ZPpu&iPkLc*3zbkI81lDJCD zy@JkJJ205+C4htxCxV>V-A&gZ=4W&y4{2y$htFBIgPF$Ex& zIG18de9Wv5YBnvpkpjcegZ{?Vov6@yutK8*&%UK0JsmGpE}0!vfB42Wibx6z@waFu zqA-=W|7cyz&!g6`6oVtnsgyEZVH3=$Wa@qIa*!S_E!Dyr13PCDZ;Z}ffUXL zOzNnHcy92PcMS@`j;qRL?M36E!mUO*hWr6-Y7*C573CY^iD_8sG>-J8jD$p7`dMfd zSGZb7VDMVjXe9NDhVf^Z8IR;X!_aG@UL|1yUicGv(XmwTQM3pq`WB;5bzih7K}2=x zS&-dJDp%cLO)*_QCYhe1z_C^`o#C&dnFj%oucn8OR#eq9CD)TQFwT%jSATwTMwj(2 zz5dYqVzD|PUJ8|7Fru*?IGJRK+s+7 z9_R#nHJzBJ=(;6KulmSf^a0^GYuF?v4`oF)l=U_@9qQ-f)N@_y5$H`2)lIhH(D4B& z1&~CxIKb~U@Xw6&S_*`-uL-`=$W!Rn{-&p!*ta|JauiYi>Vs8V>PE9j?U4pos=Kk< zgF(G7YNK4L5}AL;sFsd4bBw8pBuAmM8CgwC&1Y6ZpUg0R6P2vLfln6BRLCHa z;Q<*f=(>gc`Pzd^85;C*9cp_&fwAEr8=Cq&nOfkrh}Ki4!C2|KUoE17irt{+(DpG+ z!JO{M;cy$Gwk=QGIFaV!aJWR;=RIYf|96{Ty6*jX`V%OwOv!1uPe<1ABRMuDege-_ zu1T*yT7<3WU!z?9JXGj6^{dq?ZZ*~Xtu$Hs( zR%_k&4rHH{@TLRcwMq&h-Bp8>5%9mDoJ#Hmiq1t(D{XArWs>f|w5q3Rd+08)-2EYx zKAr#|OduIeAlg!s#>xs*(Q~SZTCjB_<{|G;wGuq4)tf)=c#=NU>)2BDw-Te`dhqwK zqP@LPKbY}PqL%&67IKh`Qo3dcK?&&)g8v!|D(P}?(iAl&^)r8k_47#+m3~&>Nh$qo zrl}R@hZj8Z=?+uUp^ZTOV(7&&D*9%AJ5GZ-cID_T z(A6hirF6Ag5Y?bFK4cQIm`dKytaqW+vo4yUiXuoHDj!^<{pC|c0Ny}p*BYhWcY?39 zWhSjVTNLpT2Z>wCm3ToUzJO_?Mgmlk^=_zMvXrR=Y+b%*>!0b`As1*Hvb>1o|%5Uew-m>fWKLz@Ie5`(-R%6SnJi7BCY!)qvou_8!wd_Idlqs>= z>v9U=cDg`Wp*{y7nGe6m=onGbpxL)2<6aeuVBMMoi+`%z0Ix`Riky@Cr?T1TL`h$!t0ZV)q(vkX?N^;6SW_GTkWzqslA7{&FGf?9ZQ`4Kt^ z-^p_YdX|>%O3j)TCBb0{i8Gb zzSDclk1nNjXeKP1CPDS2ucYt|%LMEmViFX0YHt~@d$zzZo!a4T`h8A4aRlsb%I=t5 z&b~pbu$~xiUj5&zCr-P|(i6X4A>w;^^u#5!xjWPocRnfu89i~580xb3IYZiqX+rIv zMVI1hUk}*$?7E()ZxTH*?C;C1Cw@D?))Sj!3Ayyd^6Y(P-Vnd{`EXCNylpyz!7h@* z=-%gdlm|PBW!U>n#u_0)f_(t^6q_8q_qj^MkhAxBNflAbID4O?w1l!cgW^C(Ircs! z0B11c(B8-6AaQ2%^-3@;>)vO~xQ_Qe^G~N>@6z7qn!Q3mgcl|2Wu!wJfm(%BoE4)& z>h>nO6{urZj@|-Ya_WVh-}_u*^{n?kPphH`5-a|~NpybiQ+&R!RHA#I1so)9DOck~ zWbZTOg3j!H&Oxon-sfl(Y6WyCM4h)P71B!I``mYlEwA$IXzp&!sej(1z>L>FZyO~O z-KVsh4*&1fKhNG~>7R=)61A{A`lp)Gr9=JmC#Vn+nQEVMridibKj%yPy!z*aX*NE) zu73u+Ci>^4N0(dw^u(ltead!tiqk)8rzqwXyq`^R=ZQS8Opl;2ZlqxP5cp8{zvb}~ zu+Kr==9;%J3byD2Y?iEl0>5u5ko6hiF(75)5$mvy0(Bp($D2#3YLX-R za5a3(_rPL8MVS$0>aTp0q)8pdey|I7 zum81P=#P~&$cu#l!GE!!h1xTHGN5uwD)Bjr;M2#F7kK|5i-c+9Hy|^j4T^aVrB80! z2*d?D0mi_w7^4E>$Jv<`$<}E;8;eeavCbo7rF_O(`+P%H^7e4iS|L8WX5WC%exQz5 ze0J$ri>hj;%7P4^k*xzhn+)!?`K#^L2?ZyA4jK3VT*G`7lBj|uj! zz`Q5u%KK47pko0nJ4a6=!3G>X2wY=n&MQS(g*f^d*&C?nnoU7XntmTX)1u#5e}`(T=gKfgZ-G>x5sprr5v*TvuSJ!;ywAx1D}bXXldl4f-sx-u5#i{u zqEkW~eJ}U08l^=behrZ)&#)l!D1t&UJ%^)z07f~KZaNoyWO4Mr1>YRX(wtur_%27E z#f58*-V~`;WfYgANADZZ>>sB|6$^Gzj{cB!6sf%h67a62FkNoV`Qqso|K4$%Oru#b zFQ^FzsrY`4)|?q|W1u@YR+Znn6t?u0ml>( zhk>nGA!;YYG1UWrG?FIN^0&a2rjPNbS@dyTolGsBW3B}fY>qh`Cv>i@`8{q!MmT2e zG3ZmFu~3ACYimBOWczaKz>#E;fMb3K4JwET$LvFxhjrk&djuTw2|%VHa>W=6A{XCE zh`1ax8-!_b%#C^|%|Q1G*@iggc>>?%n7z1g%`xAeqDOH#X2-n)j(J^G$;&a*Sx15T zPOQfpLFSF&nB~=h<4?7CXv8g?d*^iEg?}au+DbC20}o>z!ZM-*H}oZ(=)g97R!}N} zpr3yNlL&O+)RXzBG}cY{9pb^L4!jucEnVm9z$4JuDpx%YV($vfyMwO0??m1?I*@j- zeb0bqF>T;pWgJKBkSK5HQ1=M>$6BHNypmTD+;N>yK(O#PSpi+*_J z=|~>@&EgZ4=#8#WwXffQD(w&^*ltlpCf)i@tQR_YQ0w#eFM0elyQvA9nV9(nbBmFF z$gkgkIf$%Un`=&CiaK4b9;W?;GKD#~b zxoQ!t`988C7GY8<|HaHM%@;yX0A<#@R33T$3d|sHzs&K#!>u_Mnz?8(I9m6N#s|x^ z7=~zpXYri^o>NfTz!C0bAcgr3&GrFQxTkj@v*54Rs5f$58QcNMAfsvky~hr->YOcW zcc8Z>2x!p}QXW9>z8+k1Xqv-hnnhQ2&jG+Esdp>@`sl6Wi&QT3ZeTCs4Iwp5M1!t3 z1gWO1Vwn@QzrpB>hyw!|jYbi$ne`yQ0=R8s!HqDnDeA$B04A-YlmZ(D;1Z*P&hZw> zweB6Fw*|Yy^|ZCsJ-T*4{-M0fhc{g-6fo>z-hjMh=2<~qH_X9w~X4pgU=0Npj4Fy&E0eq;H_4<%(2PW#r?TiUF z8lc_=Y%2p~1}hx^xg>cLMOW?lwgG;68nhvRF05Rgk7#b?}SB05P!_5-wv^zhH zLV>G;F{e;lb>^^Kuv!B%ioj|~T~1g%!3-o0tgg`|@v!=e{l~y+`x82X)k)a(IF^PD zk1S9iNO14ON`A4dH;{e}1)MSx#5Src+a>@p`qqT+4JCzzd6C~%mV0f&;}?mHtz_Kk z7n&_rDE5N{{mFmI~U&iEPQ``YLp;EW)n&K3w zOCU7-+sa?UM31Eeb2AWtXr~#kTdJ66DM3dT&)5`%HovNVeX{8IGE;M?g|?_;XbI~@ z410=c6cwf#X*kLiEfniqEh8nQ13~K{YuBDf9of_{P#G60~gTDdM%0vu>icvdT+}k%_I=J z2`qn;g^q^L+1(9pcUQ)B_jRPZFd_!V3hWLP8|K^y`RcXqsb-(`*4+b1gM)2TZ+Ya} z8iKWb#mOLpcPWKHskGcH(Ny&!et{dgRrKk=(K%#WE88=k-0Pf*WHO4dK01lknT@|_ z=1|ZSN#4mE`YGaQiLY}!&DMHI~%u3bHdb@Il=*Dt<_42MbibFeW6r$pN(Om%cD9svr z?a!_`+p}oCq{L?``{4Jz4LBq4a2a{H4E36!$eXI(WQ*Vfc?%EcRH)3!0kXQ2MnRE3 z3KAjKAt}5Hu16{IUZVS*na2^b;&Y9}XFqn6YloJ)7L-=7RAb!+Vl7%iaP%{*VgT?4 z(I;XJD8c8Ka1F$Gd+D0EoaRG3$Stk^5o-w)LEZukmgHf8UqY|rfKi62Hiu0?Kg2cb zy)1-BwTZDwV}gw)u0p&+@&PjaS`tMW+Cs1da7QD|eoJa|xP8qdI{@(iPVig}#>tE8 z|J_uURL09dO|+LHG9~X!Bbe?CRo*z!rOIa7Rvl91ZZL{ms$@wXsysgb>uHy)jJ3_2 z;I8f0POa_w$l6$vXKgR!e?1pLDk~muA3{di(&TW?xWyx$J*3<)6kwXS*`3g`>s%2g7VJ}K z|MmBGC6=e|ReNVL?`50}7I;q~4lBKOG^4K`8%xHri`B|`(BZF`qa-m3Hf!pAD>jG72!<>NN5@F0_p9(=$4#s(az^~F;?-(Pkhw}Gne-`%G7$)jv`xd+Bh zMm9!!_rpmwb}ab3q{=)e<6Owf0~0OhA>V-NZC_n-f&WeF9Z=HR6YpEN@w88VP90+Q z#r}G+ToMJUg}zV@+6Z!hy~q<9fth<;wk|phxFyy?zd`)|a7HSB%9Zkn{j1~vo88`B ziDr8~c&X2#BQ*d8vknIVL~ z)?;wI(_B!6PyH}l!}0IEvl9S#6uuqUOz$7w(!(L3?S>U9=a=sk1l0dO=H3Lps^aV) zPk=~39QtN`6ShXT(i01ZsCAFehYsHkl~aP;Eg1ws>dqQOBy^iSAy1M3zOG{8BR zIsIjV&AwQz*=~`ebeqegDBX=Ar4!2{FQAiZ;}{krZm=gmD~RU29f7yHu@EjP=M9y| zf>Hc(wyWA!F9BFnX!%+xGOI(e-Z*GvR!GT!ktl}BR)c-AUxU9n?@7qjT6TX(9=V_l zWX+bs{VWtSvi(h&4~{a;RPg)t00}Pf%bHdDD^cgX+fN3Y0ZVGh*M?C`jN@j$kz$w= zHq~7HBK*KHDKBa)?l!>)7hYmNP&5h`T{80rN{~vABcKSTVJ)SH3p};lIvV4t&mC{8 zk#?6+uTL$-VpjmKGLPrq!GTAqi~^Z$kV-40(qbctg<)?RwoE}(i&{>jOoVX*L`vdO zxJ3)*iH$BrF-+|{U`dO0N9KDdMie#b=_{NJD8O|_xvP$hj&hKIb+7y;@^p>}i4lWq znx*I{;@SGZ(*yIsYZ+(5i#7G_rKvx@43S4?dibJE8Ms^ z24Z4XM>d(`^L9x*XD8*r)d%dTPqtgb)HZ9d;^{xf+?TW?^}jZPB08Kuk{5WMQQlJCjeI}b;89p?ToFcZ3ZuR>MCf=Yt69J$dYlh7SPez@wft+zcW{?Q7bPum&g- z`3abu_aefYMkIX{AT#OZcd)N+aW#xN99Pbpt zQ+frd@%AkFIie7bdR4C`YCz9__ep{DW%$@EU!bl>*!8&WiYiw7X4MF;ex3j9hKGO^0?DsbQ^R(3xhLx_ra*>eWb=)2S@fj9q%I@ZNrX~ z_jwSO7kD25aSK4`x7XvXca%bFp?@U6He($pU%@0G{C_>c+^(2EZV#@Dc0mMJF!KneFn5syH}h+}qQgo5IBt)C-Ru``GU z912r}R=D++B#1&7-y$WJy%tIh|4V2`t?*tD&NXpcf)XM+w1N`p;vp|!zabq z>!rQeYw2HHd;K5>dtIRI^{!D7d!=9MA=>M9VjD^v7j3PB)pjM8Rj((vPj?Xt^RDUi z|2gkG_)D92?P5K)*YSI`eBHaOC2C-Jx4*mI7ATMQbpsk)-o4Rc@$T$HBD~uKU-t_b zVyv&5KOpdRH=+x$c!A~X9y!qQb^D7O3i-Of?rHhDuKoJp>-J(t%GWg=8u4`x0fc^g zC*FFeDzu`$&U_tvB$TMl%x0Lu+yH%pF}r`D?QNj0$-i*nZy*L@9iLc6gKzQ6AM(rT zA6otLd8!=ug^y2nj8DI#j##`(G1sgZi45(rr{<4PMxFXU*TbnuD7E$Q7_6D}Zo|j2 zmZOIYdeOtL|LW@Dm9`$PfktSDWyYM~j`^8&5X0@O+XW;P=`79Y*Mkqoc*CFHF6&jR>#!6M2E@!K-Eid zvBIZSyk7)|d$L6zsGsxkbIqkvx~TICfS-@|m^ASJ5`~D21)m@GH4j-#M$ygmF?+#p z;j-Yn35AvMMTF+={=@|sDqKoV*2qn|8HIIzEHSE3>`TBL2-bD(j1;8##i%nMDM*VF zwU?;HIxr4tr3bMe6*SzpFMh)@U`=>{I!NK%b1DGeJ-|KE)%z`EmNnaGHRed-Fuyn!R+r& zc^jJj)l3PRU*$Icz1#c@c^jVn-GWko_IE>3A7+0yQ<)Uo_J%43@t2VBV}Q_ahvKdG zENe$*e`KofjG}rkkZwJV{ctk^E-U9lH;XU4m@^bQ^GM6 zV(bFUF2Z~zGHSELUY`nv9`gkdm8uL!SW$u8^ zm#u?%(UMd*gbQgoCwD^gv~$qdcO=i_!IJyf6V2#X9v=NBDxcO06qbX#1>UihT3LbT z2g`Wm5+_5Im)Y+b-a_>^JhqUEh4OX<9??4Ief|r>6=C`tfHo=JH8I^Gr=f&BKL=Vt z2IZZ5u_qki5bYLUiuiA%cMhDrwkU6CU}#VCr#i$r_SCVbIiqJ8$ckN`6Hg7!3G@zL zB^5J~*#j=i;+F88(*>NuvU<^xG_qdHf>P?obTpU`or}E{35;2L1{uT8R&WT(c~3nr z&kfHcA1>@X7Nv{Sz;fz*^*iVF!_KF&qk2(|HQvW(^346ivu8eBP{sW~G{MyTX&k%f zPNY25;YoM12!|u9?*(shu8*P<>N^2c+Mj?Hg2+8*OA8E=a*oDS9F4wYkyf3RT%faknBpf|7^q7N83?^^O%Y!~R8V_)U@q5f5-7tkU?4WAoqvbw)> zyWm(NR>wHp`R4}D+=tra#Myzw?8Dc#-C(x__@?(3MeJ5<^>&WFT^Dj^h|gCmiuS>gC$Y*B(4)?a z9E=oC3!m_OSSG#B+T=gDkQ6{M7&|a5EI1X_Mh71W zQ}qs3W=65J?2;2X*#ip|yvh>wSG{bJmxWyxGxSCA_7Kk`X3XE@zgaL^3_EIse|;ZD zKcG#0Le0}O&Nz-53aZ_GiWv^+^hHy^`UXa6X{=>E2&fGpJf;4oMp}f|G$A8eOpbm@ ze}Ah@Rm4Ua504bSlp5WdxaNMvZU7>o_#^vhZK+id#t;$4?3oW1R1L<0 zN}fxmi(Nq2jv!3;2Ob^=1aTxfGf0!Y%QSQ?+`xiTS~FVhIZClQdR1_+F2Y^Bii`hg_m%9cFvMb_U-ElJ-bws>|Y8&bt>G0hVG%JeOKy zfSYu7aocF@hXS%XB@J$4l0^kJm(5J#z`KanSM?y{QT|if9krS`{vVD%i7= zuw2fes%RNq*-PE}p5AA~v7`55-)#<{pc)>yU;T$60>KR>CzYg6@nO%u4@PJdwnr>v zkBo)``t{rI8J+=#I7Iw~t_qwJEI21&tmpyGXCtxD;>x&8MqzR~4WFXIUTBBd)4jr4 zDK>mP;XCw>J)P2h;UZg4%#5NG-M~zd9iZm{9e^#f1gxN?-&T`~ud$&H>z|nZ4=*d7 zH575{jtucxFa0*lx=>?c8u;Np)!l(f&5BaJNEXo^y#icx&V|KTw?mQ&g4G{jvF2nv zv;7BXFM~PCcPB~yqFmd4h@y-3WW8+BUb=dwOc9P1&-IEskDyxO@e%z{K|a%B8ArtB z`Rb=sT8#b$$cp_EnNyAebj+=2gWjje0|-f}M5LrE?~BS-XIfVby}y~^(tA0c*~ORN z%}4Kc`;*?ISub1kBVGO0ox}8gqUhZP6?&yNc0wF%_lW?{PAQs;Npm4+PGz>@=rO!@3Bv6m*V+iKSkJZJZoo* zPSA~R+)3ErLF{Xl*bhWChv?QGG$y3uJnhPgID zajggy;<@(8d8)sy*i>~{7|*H)leple1Gm8HQC(0Y|p?DIW) zdSr|>@5Cl*{~AAK|3B!({`-p6pkA=*i@r6Fw>WnSFzXxVeuHLx;@s-pd*)nUaNN!Cj--JhxF)NX0wrTk9wD*6J>ywz~2CfVK?_Eg4L;wi*55HR`E;Wc!v8cdL!TYN_x0SMi9RtR-sMTXW+^@v9 zXGdCz2LN0N%6_ve<_H)9OYzsjMi1LqF`*7Sk$=Cyy3Ak!1G0rPR05+th-q z@Npz^zKd#DbF>e8e;C)+#b^9|Q-c)&t3z+^(U0{q3KVk(N-Nx)hF;@^+(7kllz z*bQ%da9`k}T$v!sDGl^4K<*(qSsp3KdHlGN%7ez+oOdH0>qbZIRY{ec(+%SBl{1`9X~ zFyw1bX7CcE12~g=_<6=JYcvjOn>C3770A)#?F}dS{c42 z^4M#3o-GUQ^#mQW>f@Z^0}tVs!>0#F*{qGZl~B{uq}Agg<#$@C&nM!e>#*`xW$n}; zVc%n@61ma(MeHZ&8O*_AR<5bNvt^8_DczFMq=blT6b883VN^3b@>skf$ESnNh2Z!C zsL*`S8MEVvS2@os;V_N$;cRjVpXb96k%O@WM8Zg`=c63F$a%ltUh++(&Wd5IqsrTc zvOQh6RQpo`kCKBSkB#z{_O=kf8niQC3;n1!Ew&lL2gemTNvzW2aqLk|2;WCzJ=r!O zUfJA#`z+pib68utboThv@EYCw#n>2ls0TSNQpH0$T@ILzjh2ainP|iqx3rE7wlyfW zBa?5TyHRcS`xk7r#_$ht*HMYO+mFxswcdaVwgJsMn6$JpZSm}65JYUr^@VUVfx;dE zgRs{hW2yZ=fae2{%Ku+@I_q`LD#9M3D}E&BGv1H)qW)BFb(GO;C(%DT=cZCVL9VC?`Sw9cr*RI zwBM+6ZvuM7EIRbk&Yg)Q>icH}zK13gd4+h+o5()R3ZEmd>3#IZCyOTwyzyW{jPb@d zsbNWcshgd)lF|wH2Z9GJk*w#l z^08gP%S7ANL}xORp6ZgXxrIZda5au}t~fOL+N?qN@!FxurYpBpC9CDM=W3L=r#&Ha zYl`jMliWr}c$YXD`8f*K?|m}Ru-f;ECVq%nX}tq_7H7tO+nz?i9d^j8_1k|%EMiB% z&2X+=zY1&p<~#jg)cVt3&oeH*_G*mQceMFhzmTHYWUb%7i0T!m^$Tl5`}*&86N^}_FU_y@Bews)sP%7R+=}(}?JtF2zzcoys;~8rQZ$>a z^@sPPdc|q|{^>kgzb%?*t^Wc0jMe&4@bz$x)va9K>3t1ikKvGoKJxJ7=1gmitU8pNZtUnoIv=%dIxjnp|jkr`!V#iSI)2!Zw5jhb3w)UR;!`TJ9s(u^(f z&dKNh%6Q}qvH`P|{iKSM&!1zBV99QvfMUu!x;6Ryr_`7FT^pOT|es|q|FazbfpsF7fKoq);}c31(7O| zaUl^HR!SKl+c7&C|0fsdY1LOtq_|ZzLGHC0qwi5b+fWSs;5GBM6_XGUzeqee(-EW*F+ReUn~>IbZdLNn)~{`-jqUncMPd zX$iOt@~T^O%L7eIp?ESFa9l}hFD#sACIPr$wF5KR)oYMaqJOrlWd=c`L8WP;SNX_* ztDManztqZU`%X+)XSUhGv2OVNM6?|$gWG!iW%ahrMM_;LgkI#l)1Dw!Zf5L>=qhl$ z)P<40#>?F@!72M0BY8RmI}K~Rg0G1nyPHymzo0Sa9UHv<=T~1w5-K-kJ~9X@Zm&&* zw}udag_ODz2I96T5qp-kYNh^m`sS9-aHHnNWUnWdPP)^RT5;l|1;jz@_@YhLd{e8H zkCitn4b!COt|Mn)Xv$3l-_#mMLf{6~N20BnT$zuZvR9E02SEn8vY5m_Kqu!N{XIH8 zT^hbwM^Pyaa^9m3RnmjWolf+$J;ue>oVS8&>7$cfiJOt!-K4U-u`s@!pMSkG-(FJW z?F#97FLa9rAjKOW%s}g*&F)zpXl>Bl$#V#N7gFv~S>ZH*%NycC z{bNVZ%Ojlz#EL{joUnP(Yhj_||6_Dtfy=nyu80Hoz7H<2SZe(L2LJE+0{lPbbC>_u ze<}R;RV>cjLIQ~xQ9XzV*z0R3)>M1ao(P!BqhOq2HC8nswu^Dk0`4!^E?LG)Y&m3;%k-#r6^)wlOLnp;dc+ig z=-t&|g26*tE!V9MDE@lm#Oztip|nlRBPhr4=B?S51EGn?j**u5yq3OrV|okTa(`Kd zLV$jg71SUEA4UfvuIxQ2#tlR1eu5Wj{!AeR{Bqu>;6gp>TG5g-#g$5}!YXn5lVSK? z2~-kpZmOi6yA}Ws?5t~@}7cy5O&A3I=TNw(Eb8a0>ckYu%TzLi$ znQm6O3f|o;jHD%4=@@Xk5k6-puSQVV4oI+liNaqZ7|H5Grp6Iqs)`!3$BEAOYPbj-a7%!!y90xUH(>)g%2 z+=nhymV~8W^sPj5g7k}HDnVb*-;eHVx(n6yqRZ+Xf2j}6p#vvH$;=HTaBNL|j#Fx2 zFe7$wApo5`1)yU#e2;+KEscxDMmn))b8yDG5%X(&EC~5MNWT0-lN()O(5H3yj6i@5 zQTY;Cqa~6-5DJO>8n5u$xl(k7dc_qUnh_w0`yB*+b^Mi%P&MIf$3PnsGyycf$!pMy z4z&|U-uvatP~LfQ44h9f$pluohu5ipJ?kH->yxXd-@gU*?S4;Vecr}u<9`$idx&pv zY+3KFANl}AB^;x2ystTSlJr&mI*PhzoUd+&PS{AEa(Gf$3olKh-TX!%NZ<=EZ^1%Z zO;;gE-HdF3vbqG{MrazH2cVQ4=Yqk3vPZQkhTT&WMESMg8^k9E*02Ky+{ zm9LjIMJQo*(i)VRY@r_kOPKwGD1xwaUYQH)>pu||eS#G}6?q?hNC#@u2GUBz95gpi z!m%YRqy)T-2Fco1L|w(beE}4m1`47~d6h4@9^z3acf0sWyfjl1jos9uN2@hV(-}4b zSnd_YL)~UNl3=i1Y3adxet)tR z6BQCFwF;;$YH4K65V1JG>nHWa0psW^tD{hIQ1CbB9Vbwf6|fT4m-NA~(S*j;sx-v(@i)Kxe) z4+k*_2zVWp7(nq(+WXN-S9@F?qzn}ZuYC;z7(xH$*#N7s(UZ% z)|}T}DCa#Bb1SHWE`7P{L0?UGe~kM0H!(NO<``V7PR76es`l#S*kcpXzKsw}kLY#& z++cNh6ssk6MS2}!%U02f*V`3KOvMjgCr^^?u2Dit?)*thI&MxSyNLjS;i2+U%mLPO z9fw-E+MA3nEgLdt5=YX#q6;SvxD99S)n}X0I_Hf?Q{_4kHi-&6u~9IUw?A)FE=GbX zEUv&at?_nc6Di4g^FEN^5xwA6xq{$c6x{r%Z^8J*y^@1s9*5!)m!V+sTM|)lBAU=> zmC78Fi2TguO-`;H(8GM1-Kku;zyAA6KRZLueGlH?Z;IT8x84-i4z3yVt!z{HGave?C#(QaB*`(`4~yp(M_S`12tvX#Kf`C~5xO4qlmibprmJzR=O1 z0eE!uXR}S=&z=DXe%%@2&)&h?Q}Na-_2T&xjf7-EBx~s&)pX;(sHSxO7-)=I9Q{5D zWtYO4#{3%Gu(!7az}An!29=(_EEdM-!q;CJBg3A<&bmX#@Dla2;rv`jvG-PXP_Zd? zaPrAmrv@#7oY#*C>|o_Kd>fMUu9loL{}iVpeqzu*Ty0nPCk1l;D`G7*krdA}6_1Xb z4;8iQqo3G;-6{V44oYsaxU{0}6uhm*Td(}RcsZLe&hor5JZ&3h^R#bm?snSr7NyL% zJsPEa{3R{jj#5s>(wUA@Mh~E97-IAir93E5;-ZuSk**V^Y|84h8XcdL2o*>=Ta<5N z&o>$;BBTy|p#?D9yZSwD7RO9yXRNg+<>cmcn8-qmd<$Y%aIqVh9kJi*){f^QLhgOX z^D;6ey5sq0Ron{P7J}^!dLVsW73;tf6A-=Q`52~WN_4HbI))Ts`c4@DV+sB5VTI7H z=eRE@Z-3XbQ^ZrQ{E5Ho`A5~G?0Qo20GRWN-Ik9?OR5JD@^?MYG%XbgAmcc->$&Pn zNUupFwtNB*Q#GJlh-!u2cEr8K_}!q-tbrQpB|4AU{9N%4yM<9)#YaB8|)E5+-fb;>G=-GG@Ldrx` z(5nVpVbxB03vn4NxN(0<9(U#txJUjkCms1V8KUZb!lNQGla{7y{QRUbxk68W!rn7kCB154+H<-S5tX7Lbqy$TnhI)F?$~U(tOs~MQWc4z;COg zx91`~0AsGckL1NIp&g<7NT#BOzK`T+v0OVoFY-R4^46@F628cn(-;tIo!b!}NRdB` z82utwfZd(%gqJK72va|9AzIt;k-*$qggy|D)`HY`@faMF+e2QGO>LS@DVBuSqkHJ> zRSe!%Z_nV->TL-ggWmc@dV7P_!@a?^gmjYH?u?opXcxG%J~Y@KU0V%&kr;jgL_W>@ z37T4(*+b2Tp4PMapi^zAe?{?uF%&u9SR z*(2dyezs8p^(1Il4Gi#mCF zz}sW~gkv4{NMd7v_so2;-y0o+`MaAcY79p)?k2q!^O@|3`v&077V$CEUyQ?3@OLtz zHm=W$-u%MDSS*i{Idv0baCyvmk1v!dkHD*hzM7CvHDpa_thA-KS*oVH?-9rx=pz=XL#bU2-H^xzrVWR*;7=}Tqg=w9@2Y<0< zcBpU$V1|(PU>o3@1RojJHj#3bm-8hHYm#jP@Q=qpqzxB(w^lQiAO6mcw$NuK`a~bq zXzvDF-2KV|4LOt}Vz_oL#y;+${jrIMz~_qhDM}Q8z(8ac6(YZ{O1((6{C?|?4n)!d3>AneF8DS)ND5O zFuIR=TulK;CrPbTvF&NzwqVhtiR-1{e9v(M^ zT*lZN&O)<{E>}CuarH)A4rL&6ex{i#Mxrkl)G#H}^}_ktI!n3;#@AT)InuXiC4G7u za8TrOE@%5P8>g{L(S?8+SraV3+h5yV9yOc3@#B1lAAzmO{2ew|%;^mF5?8sqZDh45 zukA@x4gx6w0|o6Qpi|*&@Ak?|B2v#%(M{&ib^@2{6+VZ?#Bu2SyL=Aa_UgCP7y`C% zwRS*zrv1*1A+N`4=oMef|}& z*dzbC)C13pfB-e;J^?NM$LxsjbozG({5#OrwbycB3Te3mxANogL{u(W%*vNe zHl0hcG3)PLD{Y<%H>jqW0(0bMBEfxi z>9t(i4<5_K*E^%QJ2-y9gXjz_B?4OUcQIq@HC~18aiUt-BT`HkVEn7$|MvA1yf8@}U%(Xwm&-zfD z77KNB1Zs9`7wR@rL!j=2pJAw!yzO!Iv+tsfYKxnW9!L5yKw6YLx+pO{SFkZ>Clbu4 zO7|0HQ#Y`&V(Vq^>T?Fs4_OA3BWATgkaZ>qXNB52Wc8`0w(apR_q>vuj{`p-2hvcM zNpKzv^+baY6}~7QVe=negX&}yWVcz7>B$txrvV;h5dy4*>6W_W-FE1vMnt@WLdhp% zl5IK>3WmYYL11@*7lqM;I04OKUrXuYez@XSMnReFn$qp1lw05T1t&W1d__`9i!kkP zE0kD20Q13q1OrbiGiH2EKyKU1d4IuQ*@%+Ulm`5hsx}upTBs$LqL$<{wgJW>V2Mxs z@%l1*HG}i4>u}#Co%O;RoPWgaA+=c<#-w^^@dMSXFA{otB!B-9-v60RIS1{%Ut z-6ga$pD_W0Wu9fm!P$yn<}ZLWN_AD2{2buK&+INGC4^pA0*pRqhr|5B_BvkU?ap*Q z_?t5d_HL_#;lM0Y&FAXt?i~P0G;TrM6|kI+EqO z1daf0Vdj_<2eY7QdPvE6iKiqNp$oAe{`bxBHRKa9_6r?tcx^?9C+rBOi={10ex6Bg zRL0>Z_U{V0y8f~Rt$=rR7ZC5FB)*STct!Srrves+y+4rl=ca!a&!IOEa^CxM0N^`q z>KtSb5uF=R{S#YM(yejP!by5*ax~0l?0yHh!RPgb_9=rxI$@FSxZq0pW^C-rd(^Y< zswOtnh`d`Xv$bU07Tr+FPlTAmXDFoEmo}Q6W4FkmC46f zH~TvOUZ10!yFSisX)Bb8wUg%d&HhJxd^4;%4jc10m($`6OsmS2e}gw5^%wEA@&tHK zhHG=YQT~eYU7k72yKXDp!rG^aTcoy5UJZtuw6>wY0yt}-dYwFmPF{7eFuXdQFB(g5 zTm~<0Kb`ubC8+-BeJIzxxkN{2Hve$x?R|VC0+y1JK@gKYr!-uaIjMzVSL*-8Es_7P zd;j0aWjW}t$Yp77kRYNflFPEqlWs1HFM?2P73jK5TAYj+jtzh;v$@siE$_(gc#vUO za&pzna%Y66a{%st3#da$|GjjRF=gz6BR+5<8;pu&QN0ttQ;}9 z+Mi6fAWdgsUGg#8eXF@fQ#3-yTnd2CG_aq~GUSx{; zstHa53VRfU4Y8P0M0)f45F@P2uP7{rm!egZ(O&N+{ggkoNXN1kcE0<8&6FGfiZDCy zL2H~ldsLb`+~`BsA7AElUE9S+*~r?}>Utq-$)>y8btTH7 z%cdg;N9{rMH3u0&vvvX}IJZTaaN?{xz5+U7g_BLf-#?@_3CBGy-l_%6GOdo1;9e&5 z?MMSiTrvg+`#8OCYs9PV>a;2O$5+(!K%jbB-n|FdS?)+Sl=Gr2-Wp?fWgtjS2*xCEi@HrtPse z5zhCI|9YeMGAK}#J?;GpglOdV{x*jEeo@Gf%V}k{#&D8u=AlQ}^U$x*6wl##=rNK_ zOC9AdeW=dbSeX;K>8LQz-8nexi~ehyE-Ui>17>-*JR)+&JiCcv zf8#M{Na`h;I|}qz(cGazp6^fglE+XqHsXfAGyCR^c`)T|rvXe%&xKc0AH+~Pu= z(sYJhp~VH`8Z?8p0wxxFLsMP9vpz3cC!}MH#=(_B5d>VC3_VU4<>=Xl(c_}^t>Oz% zKe}jb27S>DfDAN-wmH&au67;I+RF{kEXR3_0&fF$BQsn19~bhWhQ}|R(|-MV99K&~ zgLO{UY81}^f3;{g+JG=1&no@>a9aL*MrkgK<49|#UXSlj%kx$9AbDh-7rdd#^V*+< zk%27CDFIjQf}0ix?u-bycu|!4qR`8D^KIaItMymNNQm8PCB+d46Q^0ORSWVUK!_70 zOs|3CO`sn{(|R&y!+E58@Ve#dukFYcq0QH7FY2_EbH@?6;$9c$Y+3$(&^%rQ1NiO_*NPxK=+vpiA68M6CPKCO9k8RyBN6JN)# zkw+ra6zKQ{B77U*dY{m=Wt>7SXrme3x+W6=MJk^Zau)_)YEXh{z^e$?&Y z_zoT|9ACy`fa7)%99Kcpqob;^TrI&zKX-Px!X8|&QqSg{9uR=LpOtGtsjh)5JXH;U zA$_;@_~lvM@vXql((g#ek-5?=w*j?KucHU@_KiqK`KO&t3^%QxRJ0$W%p3q?`sk)i z1W5$AFczJ69pFOgy#XxA#j}@DF)qxxe&(BZ5s&BL-XZ;ELQyJ4tc)n ztlvM*5CFfIT?!m&_OIU`zxt6K@xv(e37<*yXs;4GJ|qJD*Lk7;^Hmpjog==oRpCd} zX3vnN-MqcsYiKFgv~1z_7K~SV0(|-^Dz15F>T3t>zG}sb3CW8y0k_)kIO+i!HliQ z8!1GE)K$gJnk;@Y4YQ7JZ!lsx<}l#`O@xrm%DJe!Gxj+_=SJxk3V|DtlX?b#@d zxHmbSE&yyf%{`MOMC7#Z{X$tpPHS0R%jr^S>dI-h5Y>~MeovlJPCsV~rY)zHZ~Jl@ z)bj1*RQPhNoa)YEQi<{n<>&QLPIX#NOYiMjPDf1xa92(hNbk~eI-Z$cn`}=Tb-G1h zPxH~ME+Wq;r^XjUa@y@5zMOuBE&Xp}PrqFi zE2s6x3N_-x>weisIpIngFgxdsxTj}1U3(k}a_p&HQkKN;eG;TBSzPJOo^BTawmlVA zl7xty#w`}gB62#B)wP^H__5S+{9d^bWnokXPwe=;MdTUfv?cQ~ZF{=nOGBjwS!4Q zL{1Y<63QZSdW+SyoMuQ<*PiNxsGj8X40%R5or9E2M^3N2?#pS|)89@`kGv2or%{DM zjo8zu>3x(F!$k`AZ+G-8r{@XWl~bAQY>J!?z|T#W)0$%TZObXSQTD6Dam0q>g|dj8 ze$VP!PWwtzS5EChR8MkRU!djm)N>&@?afe7#Sy>2j{di?r?G#JmDBE@lSnl_)lciA zoXq&N$^bLW#a%$pUfr=wAV15fZ%@P2%oDTRjR!&z>ikDLzt7|#!AWdC4jS`}I zl9TX^_Ou;hI>(;oyynZPdHJTviBps|uC;_?U52SVUaG|3B1`vJ_K~T-EWqFPZ)Di( zVD^B!m~HP8boTAQ64m1(L^bQfjI44bs&wg261e}y-sm(l9_mS^0yQx$s(EUZB=)ZM z{)r2b?Am%wBk_1exi!s0sa^&P;?$t#epXG>o1T#(-*Oa5(zreGd!fd;`6$|Aiq+!U z*cRls8qJV%7Unsk_h%}~3jqXCymSxIV4r8T_xt(MJ&TL+8W2PVFLTvB#P<(xld3rA z6Hpvl1dr`^KhrOXF#YZl-|s0g{r)Pp-!emQe4oTVOwet1x*6oU7?ydht{d#I% zY`8{2-K^jo=z!V(Y=XPKr4;MI7R z#FY-9JgvwLv^cnbo>f!}YSaHNwUJe3mBSN%d7UhP0(VOZjPFnwV+4fOs8}J1S&qeN zqy2s`0^P$ZI7j}RcM6wS)7*z`mjGmq_d~Xhtm;_WDf)!i1pNg!>dfTKiemOtHhabZ z#OBaM8hNSg6vjG&&~tK49XGvzBX=L=eAMNprhqp=(QEj0n?^Oi-ueguB)C+-t6{b_ zzrle6ki)0$ClBSDRTX(JxtWM#Pc$2sQ=ysjp{(`TQK&;|!)!a~Y2#hDD9$GTtR?an zwG`5X?N?Lut|S62$9+iG(V&<$xxW#rkCrMrz z_dEIdmXEPN%4>34$f@+H4d@+ka$fzxG8<{~Z^SsBYel@8ORfwo!OsTPJ57r5g?bz^ z(4QT?N}&jhu>ytPV6}Y@*9o1IXmQxC)gO1hAL%F))19X0t#!|AelVH`pBWU!AVZ0Z zLdrLuiKxWe`FEg2eeh-MsbfzI+#5A`6gUnAQJHWyx0MgatDJXr1psD8tX?WJQ52Cn zxbVpRIfE2s@X(@NGycMM>VAl+2Z`fvA-o@aP2=FQnt(q{#6;C>4TglH!SBv}$p}+Z z?;Cummb|3p%|G!+fy-4KWaVrXdAr}h*eJB#UFMGmX-S8I(&xMf&CZ>3AJXB#0p^y^ z25jGOE!87CVx?kHH&|rZsnPC{Hm^ahFk?S-t+wVt{oBjAz2x1A+@oM?ekOcLcx(P9 z)X-b=vu_mfj?}ld`Pdriq8InhXeC+ceC01W1szfSlt>mulq|PsO39V!+)m|lu3{w6 zlHZtK>A(A_cY4e_RCq0Ir?Bmw>bc3lIvlXD{BacY0d(T-=ilnxf^21}DwAp2e(X|L z*;t^fXml1oO%=lWTYB8cP9oZ*rza?pX$roDR#{Gj>*Nm~_fwDj11}*nLXtO1yMj5t zp@zt-DXfWCz+PsCzrd@`V*&-#?{KVDwb5X3mr(F5TuT|WLFGbT0i{gwb;S@zL2Kt4 z1@)!o@80SW^mc;)vThl`@c#2oHOrAfM8eQZ{d=#IHr^{PuV!r{IX9XRo%2_=MQ zF2KV9&~gWc(Saj|+~}4(u&+JJJ{0G?mg${ECSkH34?3FG0>#hCW`~X`F z-NfxxxARD-<}kF|m9xWnXeq!weqH=>1PLPU)dOYas`C_*fCVtQzHUeLARm53A=w9D zRLG61I_W1^vxL#i&blV61T~*o4#EpiH)ij*+z659Atf`jW@c+a^ob6AVi3 z6advPkc;JM@qqx5D)lj;N@-BwPaLg*a7AzS6OLEy2?$*vP%zv{JqTD762pMig|0^sinF#=TVreQp7U&#X+Bp#yEw@rW zxQ6OtN%LZyQuG`3vmHMlR6pVW2#~^{q%<@zFatx-(1@;`P_SAtswL`ta4Op}X6=z` z+6P*NibBAyZck5si@L#2mWGVIX69SCT@L^DOVr*8Dkh4f7DU?{nRTi}2Gu}b`~WzA zjHrVfo`=PE48y=F)w2@9^icgXR)0r$1W`c&4jEclkmgjS1>-1%1jaxq@n*RAlF2RU zaauFLS6M!7g=^`!C5&N72*VPE;XuK#^CAbm;!xdUQY@)A5VZYVHlB?Qg6@mp5Yz=6a?9m1;5JJ<1;=Jgd26S<-WaF#=EHYmluuvyxoA!zF#_O2{gAL5i`z)h-Ye>ww3*C{bf{vrr68j>|$I>t1YIbP0^ozy{3-Nv*!XFsXXg@tn z8VXt*aWj(_WhOPGpG_4$CkI^B3l6w_LGCMr_Zm5vsv!0VEV*VW$tkEBq<-|P-VPeS z0HOFxH}(hLB|bWCNMQl|{I04>VfA-(m03ZRH#TP#IC+Z8I?*)%z$0Dkq1#^&wEs}r zD^)%~VYd}G4-_t22Nf^0Drz!5z|!_aB?zqM!I9QdG>v(jfNr!{*28_?X6bJNhN`K- zX@g+%nR(QQX)jrBoQs28)9)0F-bLFC9nU&p3M4@3v0y26^7*Cno8-FY}j5w~EI zf`L$pgyv;P33-cm@e0+HJZv5(mZ-ZFjBqr*WItXNChOqYRF6scsJcB`>Cl7jpoNh^ z<8r^FV$j4^sWVcjo&r|asCsII~zY_Vr1wSgb)L3G6MSK=551V80|2ShjWWMR!I7eXv-ji+(eg&!g4 zPj33(BEZ{Ja;aP`2RKj{W;(bJqYVk~vuQ~+vfK0_GH86i(jc&2rS~Ih~pbFN- zcX}0KFCZ+40fOGDMl+}|dX<$ah;@g4Y%(!3wOpFQF;&2VCl z@VM@JvW;xLQ(ok}8?F$?W4gs*Zbo{hOHBI0-@7MI%-OP<5eec}P1L zQH*lDE|u5dN4czPGk<98##e-K>2YKh@lt;ka}_KZD-kYi?EE3?#0p;4$aUN%ZnRj% znILUknLy4}Q~+NUW`Kbu@+ED5K_V2nA=KC6ABo0b*$k3~zXhqxOi;q`a&ngrWgY}> zoiN5^_e8#DHBJwy4hZXw2eM{P$EU7ZH=oQ)$3$3mG{r@~T(X{cW3{|KmE~MYqNr4Q zRpV{~0#gBwD)>N!eua4)zqUt3yECf{@*1URHP;zMD-@N>d3#(=`&~+prc8K-ZgH(@ zajf5>zi#pQWn%I3cT3db9mo~umn)F*Pp_5VS}3Cd$CC6o4&F^>z`x3V!?BxhiaBN7zpMRv|_j z<-G(BW8+3}9a);pGp-0D#lVsEtU08tL*^0VQs&!#6HB+7s-!;E9QCp#+ z1sT;dsd5gc@R&i**&PZ&=mHY?-bRd;{h?+Hu#+`F6A8sH&rCw27HQNX&NjOP#_ZMJ zVm3GuQJb_V?n8?jX#s_h7DM{b;#g?`MUfUTDq($3SnVt=pg_`s@rEKkKOO(xKstsq ztkAU~qS49g5?9{{A0oHKYk`Z`yNR4ODljq-9it5`y6bR4E9HxBl#c@j3ivV_=Ahs7 zN9E?mMas-RsN*9?fChPiovKSX0+@c&ICgC47zNVm@u(%AO3MNF14LU8F~RNFr>@&B zB^-OznCs2c;o28sz<}T<&yPABnNy&f1~{CRaA>HyO0Q((JY?a~+rSYe7h1075KU2& zqNvoT=%zGj%X!PH#c?zZNYvJeH6-Wf3Pj(t$(5{d);DDA}i!(Hb0E#8_5xp>0-OI5x&!FfKry=rjRcOXXrgwYhPnqTz&VjZ|LJG<;b_ZVGN3 z0GlB5T=FppzM$g{WtU`GE2;>~j8Wc1eIU!QEC!>j6Qg9;sgext`iQZ}Rx;#-ueC*D zf?Y=0Q)Yyiqrf0Y*<% z-mDw9IaG+K!_a$1{g+=6by_*AYq8{~^l+(86K8dpc+b$ckm|7S$6((gyV1$V5?BA& z7O1 zj?u6g*C;EQf00;;H?aCFG;PflZ~+l=`v{ti=eo*bJbY{(2I1io^Dr0>>&?UFc=*&j z48g-^=3xswd~O~vM<$N$Ud`Rmax32MVVO5u-3|aPigcsx3$Yjo(%bmPB7JL3`T*vR zXNx|sF{D@5D$;MeP)Kisg*-B+o%0IOtNDyx1M<<^YG z57B#RTs4gCa5%dC;?S~FHC8Yjh>`VG?md7uwY*g$@dlQlWt$08Tl~zX1Y0}${>{gt z1A04yBi;of<>toyl=!=^GUC5ii~o-o(CE0CBpWK-CJdS(#of|VVe2!Z7_oaBWnczc zS^Hu#)Sjk0PO6S)`5oV+JN_;^_NTnx*VQMe>Xm-=%XIb6&L=`iPeLw#si;JkQqF41 zO0(+1#EOF%gv&K3J^OHM3kn9TWjUE_8mYTKUUk1}wqetk;wo@ix9SM|pr6Da3}2zU zq!mcDpN3Uxf*q#8o~*!L?t{HcgDvyH%4R~BnsE|*accBamkexpAA;|sDx=J;g6)R} z(&ms=?rWyrRLdpTvr@q5XQb!m#&Z-(@6R%nmS~i+=ZRce3#v9px2?erH#n=giUE|P zC%%@U)(&|5zxxt$972H6aROgm3PH4?$kQtP5*&XzxxRC>D$9B2bE?Q#!)Ut1-!HIx zwo>G_DUJY$P;ZLyS8<43{zQCQbK{kYq~ShE`)iUK&qaFG%=HD;TLLwoFxkw?!^1W% zRM-)k+Fff?V(q7SI9GLe*Oi8cE3f9SoOcvDl&(YzUe@^4tLjyL^+6iH?N}YWp2odo zjISP|na@xFELJtj3=c537XGcRnYk95q{1P7*1af`T-!rI8r74-JEk>Fav~S)h z{0YlBySSb&GqtR$23ambv(F&+}NmSzwQdds=*@hoVWiup#7?) zY)ycP+7309CoZ{yG7iU1Vzo6E!o%ew^8TNz8eeEwi;!8F=l&d5BDkh;t(* z&Ole}=~gu3Q7vj@eUje-_rLoRU_xEXTtyv z@^@@}EI6AxaG<#^oCn!3Q!D6ZXJDZ~UMnHskf8`+h)lXnojsj8GP40ga9juY%$q{8 z4O+5MghOk5@zcnQ_wXW9%kp#+=G$e+NX4qIdgMBw>Q5HPbk~&?F6ah@mq-8tC|FjZ z5&ndqJ;}_|GMHjuWoArqa5vTWws}xF)$QbXoA}C~yDtxRUY_Z`+}3$H&3*Z`)8};e zuwMd#Qbt zY1K~WL(NkDDM-xu3t?mK%|eNDls=NHTCZ>Kz$>4pDW9hmvR=wzVTeZKUkZ(HE;VTU zMWb=oG(khel9>Sz^Q1q^?!~8eqN74%@~SdAfsQTy6uM$GBVAe9iS1^k8o7!TFeL@7 zpR1_UPg6-x$R|HE-SJbQkN>47IoE1(7&4#7&SI%NTTR!AaX45gSRmin;Q*Sn=K=o_ zAJp9Vh2qACzcSo7PsEe+=A8v@ARfa)L9^hVY{D!#%|Kn;?U;X)AT!m;wZo{}VM{MX+uN?I%87f7ed)n=^6c z6tX}tFOl_Nb-f`-h5(=gow(NoGnNXR=qG-tq+>q(ZV&T%EELZg6Kd8?MZDC2v3?Qa z{e|Iiz)z3CgjY?uP<2%!H!s=yA=E%M;cBo(futsA8%5AHml#G55CzP6dxIb_x@~x( z_AL78OmY#%eg5KH27q7gWa;EZp$XTMelaGNT;)zKs;ex)&kpr-7=C`Ber}1Mo$BXS z0##46$~6eg+00C9D0?go%D2|_5#b?SGbndvVBQA`L%`uJAPZ}};pybcnwcvLs-O%j zl`9ccxf${z=XL#@ z%0QTC$Khd8E8!E@g-|k4hDEuG9kenmf-;op->B#YLkB|P9c8G1GDt9#Mi04UmuZ+z zu0tnWPr!oJKI-R4&Jj_FWZKLmd2Q49CTQ#!poEJUI7LG77Xt>uW^3cD5NgcGKG_YT z(j_%B*TMJQfqpZ|b&84In90O+aK~EZNVG)(L|{=@NZirfI6*P7sLC+$O?i>?9{3rV zNTktjMhS6~0hV0+`Fo<&T`265OTEVOHNaQMteC&kl@*{7U(JA?u+L5sfFuFrnGFAs(cI9lXD4wq=qo{%^!&YiFAqT9hn#+RV zMTJopkLrRlR|Cq@Gr#7NL7KDnNnR%T^{&Zo?874oQXE^Co- za4b5jgsFo$4bXsSaW&n$Ca&2ROAII^0-{Cu;Ed>olt4WoU;VS9M4ZGjx+fT0kg@=U z5PUl1q9^qm(#HOn6sNNDh;1snxQl-@IBU#*kfKi4w()JvQvSgxeiJW^%GOE~5Hj;$ zSnaL7Q~?lH2nBg|&(gK+sEO?k)*meoiQ4f3u@_v*;&2)4;_}g2;&O$;MKMmlIq6YP4y|=R=EUAru`GwtlvCDX_Zg6YYr$5TISi3OV_rFJu)@my^am{I|QdIs@aUO#G9L(T+GKurr7dDT+>;hQSoJs&N@rSDQ7E8@0Hf-5m3m!I07xLdh-1C@zG3YWT5<}nUp59W*RP4j zAxxnDH})NKwN=y;{MXTpN2pw#eh$=4u3|KV1XJ}-$*y$md?Hh`lz%X6P*^=RYuv zH-Ul$EXXb<&VC&A8;L1bHCCWYDm@lU;LE=kt~Om)o2{y?mTGRqM@}O<7n>MM*%2J) z1eJ9z-7-ZXUAu@FC=RRP@lgNC)k9=@T6JyZ-MtMCaUE8m1MWXF!`F|GKr2JhCrD3c z(G$ei*E36pBVk1$GF9gZrbYpB-q8P$fubmYL48RbCQMA!{*nmf*WZbPpUdez1I+WaxZZM??+{JJx2+P_3{}82->_*~yKocuX4SR%_Mg|lx5so+nt+Z!9_sbyCpk5yX_16X}JQJY4hAmt@*hO)r^HNZg7SvHOQ1>)YF*yO$ z**!t!{6#_iFpxsWJG8hE2VOr($4Aesm)Y$^{%ATO2iiY}c`3#zvWJh~JlmqXbt2uzc0DK+U6I4{uP;a)N{w4E7J z>pE39pR!q%dB>-L)m%3xD7GJ+{Mww(>yO14=O|_gR_k=8gg(Frl}vUgmdGiXDy~)W zp;M*0=<5e^ugFP!ljm)cA7ynFOYKQ(qtY!;V4R{wc&Gmz?6A(s5^TqQ92v676^N8?n@($&Ncnxp){Id2 z5Rd@YS^gc!=`}581T7W^EfRC?WEH=aSc*X|9?w?d$?YBDxn!l_IYfoQS~t>IUCK!q zjamhrqcSR_o}YO9grZjUz>{zDQ`s$k{L}u(>l;u!>M3(vYa$xgNP|KZgKvK2awMrJ zvKO80lil@lKsJ=ikd3jopi|>f$W<=&1}mUY8p9quAz33)TLf}-1+|_Ul}d{(m1l8W zIU*!jBc*x1?@Oeqrr%J_#(quJ}ReJ zsOXAU$ih`}0sI(_^2#Xb+0KC8P;|@TVl?5Slcg0|=<*AvWd`w#=I3)QFjE z^&~;ztpVN---L=t@D+v;2E4w-=KL2a47L7ZknF)J82ER##K5nLfj?Bi*D;8~-{A*> zEn$`lhc`kPM$nomI}vJTo}NNVU16~8|+IApH6R zip=mi4UkY&KP_E*1A3iSvy^`}APOKVdek2FcO=lN3aM;u85Xk|D`6h~XnW^)D?p>$V;#?+) zTMy)?M8`KtINaPgn^u!8ntLK`l+p34@*?LQ1m+=Zn4Q{78sR*uG0$$G;1g|W4Cv2f z<)u=`8OwYHfzQv(BSmN@HAD$n(9wy1bdX8eU|$jjZ`M3i2^lN1?#5+4MB``1z^Du| z*~&7Xei{0Y%Nf=~j2LoxQU^awgWiQexoaT|eUd_0h=Q7>{I{TLo0_EpFj0FvMjPe! z{)`nTU*#TRS2ar+FBK%_+>WP-{+xi6jkisYH>qepCy~4&y?i3F!IVl}iWWFvfRwnI z^*_PzId748Sy)WTRIw81QSD#au3T{N_D72hDM2yswU#Gm2y#oKeu%i)`le@fIoOB{TB*PY^bQV?{Km@^@0mnTXRYqVpxEij@+Vz)I=Yz%rt zbAZM!FRz8cn4odG)~|YaM!cmgw>F@8hor~_(}4~(K{8UoQB-V!IJC_<)~D^omOvKg zYYF6|i=B}!GuR%4VJb414-Duk?wPJkvJNy9>dh)aSGg$tQ=Fa>qqwMFKjABCbu!RO zso{^jzT>!9avaU@Y^iR?NqFN=zvorZV6=Nk*DnH}GV@YFS-PIy#}J~2{#~)qs1>RD zC#JD@SB-j|vXOugzoTDF0yW7S|DHNwt3w1>P^H1dRSJf}zY0yUV6Sda^1%@+;C2f(0lJlTmHl-2|s}zXQ0v!huYUH^P z?{C0e8|l`L~0=9qi<(Z`i@C$V&kw3CtqcD1&)ONtmxWK8!~2l6BCu3>L3?MzOfc$+-cm+hC>g)Co4dK*37K0#M9zkLP5DpVzRcT{& z+c^beCE^Aa!^u0&t>y?{_B1VRlpiSVthIMM*$aEF@*Bfd_J* zCLtI=&OcU5ty=`*upf_9Slt;~yHx1TKElprh+o)>KoXsV1CX&!a_vT14=MG7?iIk& z?p`korZThXwsig=PCCgWTLP+=n=KMkPxisJ@P!Nh38-U!!qK6*aXx0Uscg}UKjI_f z*J<)1=T(oE__Z6$Uc6sV(#W>ejc!qme(yJ`(2Xi|Bi!7FIi$`(6G>QCG&q6;%V&0{ zyXug1?Bh0AcXNm8<^aE&=OoI;_XS5qaeGzXH8y8dn9YL=H&Yi6r-LD!=^&4%b8*PS0 zvZ82|rW7t@E!Jw$`3C&lFs-?%7}GgmlAW}cGH>Kkln(5Nz^BAuUTvYhqsCyd!r<+r z41cO8^Hp1<$+{LBdo-B%BeqI;ok^ptA!Wy;XFKsQ=|Mh?1M*=;vTxhbHG z-|gTq9fD^kp56a-9L}F4h9%e9%eU&>nAVi-G&(OSbbjfh(@&!_EQW@E$-CypmsO*K z{YGycuLytZAbysdk4m!X!^JZ#kZFzi-HQ(q4--D+W(sbR70pyk>d3~Z3~R;+W_ z4NrzF;u_*`grGXGfy&moWyWr_CcY7w=r$X!n@vlck7yz16~ngN-pcKSW~H*^PFv?W z;0{I}YLv{MpL`lazhrzP@m0nNB+F{10V-L6r0cee_cbZeoxCO9^T&c$co3&1*(Isx zsl8AeIky+R#l9?lU$w515m{PNi*S!%6F{fuJ&AwAnwgWSE_j2vJR@rL>lOVAQ(!ig zi}%>t59EHgEgLX`VuOw!LNj$h<)*i%c{qk3)G{QOY;v`4>1KGvf=t183pVt}%&?lN zH>w1am+EcJQ^gQYe+K7ji5BR>_+}b5;j!n2{n?O|ISp&N%M#Zz!4ET$?C@F=fq||J z6U@v2#$VYH!#UY3Z2iGT*uCnlayJz|B0EXQ5=<*b7Pi(j?UojzP?Is8vaReEryfJ| zlsU{_plX=%a6KV2kM!%RN-2`?e)_H783s!MrfTdOQ-e8a>`v9dx8fo&N}L*0_i!(8 zb{34KF*RV`R*hR@YA`u7z~i!*8f8um+(IA0gK=d51DD@NYK(MhY!%eVNqkEQcAQV8 zSJFZ%S$SrjM7~ZUWMK=BZ(DsmOXsH~(|gm(0Z!ZOCbe}Xdh8~(b!9zbliIrU;)?Z6 zpx4!p+k&<=!gY8dWgED+M`eg#eT7nPZ5#+)=B&rMfnSeT$N3T(rMan%8m7wqXsD@J|fuWF98XYgp@ox2D&uWE==I@d(O3w~DKXjcwJfRq=yvzrO$? z&Spd^Hpf-Ok&Q^j`EeDEysb#oyCAOO7BLVf#8t%Bf28XjgNhxKnb>DMU9s=!uxlFY z+v+9y5)rKCjVpOY@Qa|20KCRUd9EJ@HFC9Up*~{E)s8KfWajZrs%KmNCcs4Z1vikd zX~>qFH=!*Kq#9$k*!T;|9B^#5WTPEsw+AF#s6j zs~!&C`sm3~NYMjG*eJP1@5L^kz|KKIs$WK?1}ZI+7e{H@r3C<~!A41I`F6u=^^es#+>`U+^}7DsGC3zz9==)P5kx6H305r>gqq-Wj~= zc#^C($|Mf#eyc=GD^Yv1T~tEiD0b5fC$rTlAq6Inmpdfr)HIZIh`@;c7Szbh)AVcF zLO!ljU4>FW3y`k!__clk#8{J`gZX>SQdw}q$sSBSa*`4g@@u<8kbSYxawS&&$w2MV zs%pCYNz5hd$IQk*Rolv+#9XHKfZbKIkR+9;{Ue{G?_%|bGkgJ5F@)?EgU}_o*+gn; z&)5aYcAn`pX5gqA?|_}sADJiIf)Q!BuX#yH_pjbX!|_YuM5O~~Bw>l~Q27w=P$^je z;veG;KRC>HsNduDFvg)0h_0#}>J!1+5Qs+t5Nmnyi2`9c)O|5U=!>{ULQc8b_2?PQ zr!uoZ3obEdCB&zNcQ^Dw32#R&ycJm7P zPjFr+rS^O~aovFFeKzV=4h8 zo`}?7qsPD8_C(!oifZ>OzumtNA%vW_Bibo`0CNzNWuFf7m76->^SN%&rb?2LS|#~2 zGmro3=1QjjifL$KepTb?XpM>?;^P!GVITJ{52eQYxPbwvj`uL$D9VN_N!Th`J(}dp z62grRIChz-pan5rk|$bF?{t0>1;e{FEMNX+ObvG;{zRk(+^X^L_H4hMhh}{i5KF}J z!^1K2ei3k}wRO1G=5e(mQ_O$G^%$9AE|1g_UMA-J6o#ew3H9`E+*u;(-rRVpQqQ)1 zj9PDyp*H7TxxKH}fMhF0ndYsQ;tR};^f^LN`vc#{!K)4&1u%GI#Q7y^SJ*`u)U*bZ zsX*1gvt)=yb&f)HA0O4{4_21+@^(I|c?QEh14LpB<;j@03W;#A{|@gyQM9_jK2gsz zDE>QW6FVq2ad|Z(n*@M>9d@}(Z5uI@=EfTp(WCY@@;OOf z>|H$biPJXhtG42XBXx~ZE5fPe;D3R)l+<&(D!T&|p7;FV0~$9V(nhuxuJml$4I5Wp z1G+)-O47Szkot)-?ohc$T)2gAYIgsMTVcF8mQ9_LMWwQB#@6WSgWpP5YIBS*@sW&H zbUWSJ*y2GXzCgNi0H`;*{zblr=$fuN6S`8HMi&uqJHHfU7^a$YO-Ke=gqqm*Ogh(! z`DdJXxT(qCP@4zidQk!=<0h9h75ljCTh}oto}prp9>X5a}|iS*~ht% z4m1@C03KF@ci@+~H7=KIqg?@JLuNJs!lDo16NZ4}kjH`Kv*bc7PW6Y5fI0X=5%)4j zG`y)StnCubs81!t!5wGR;dK211yj}jIWfjPL1~=P0%Q~Jb?xtut^MDE+zP>n$x=fJ zbL~G=q21>Bpv{Xwfo(cg`h9WYkF%UW6c!1D+odVyoQQ?C_-c2*yBl>=AS+e0_I&4U zt3%!D)u7dBx>e_C01L{v;d{J|+#UgP`};j48B~2DlF9`@9U!^833kuo1l21 zRlC41235dGBEvC0WThN(A+u)BSY`+aCoQ=@^$CVgfxw9hhgB8u<>U zz@niR82uzIu@sib5z!agBgj$K=nU5IfQnSnYI(DU*m;Bj*H5m~^HKVzL>PinZncrS zWoiq3WdJrM>|9;&w#fMH1|}a1aPixCeXcy|i{$tk$;fD2F+eFM3aSXlVw(6~YvAuW zzq2iza>-L28>?{y?F;0M@-8=UPb>;KrO2OI!KD=Yi=@akk-VsGT~Vk<+#8eT(;ZG) zRcW7+UkZ<>5?B5HpB+n;Lf5PGR&LIFiraNj6iSu*P-tio-hyrEXrfU(2KFbMv0j_( zqBvxX@sM4OkH5hr5T!`YkwP*!c(yIPXkYvBfdtvKKDA+PujXc6l+=TOUN^`^a3q=c ze9TNPRXO)@lK3s8=HgdjLN1;qPfy~|hU+<%4{yc5O8ZAaiE!ZmlRz{o zI6*Vc9X%O%$yC7M6)Y}~ z*^JC|sLfPVwO=mePJea-7X=)z&)|l|Su-}$Ul_Sz7rJI}8GyIfsR4?|?sdACN=WuP zNk!8iz~E^3H)JCH4nq*a&h)EpXaz&?19qmLWC)(V&h(>hDxYiR@qo_sT?|10I@7;( zLpL*osLphpA^4g))7LSyk)bMv(CIqUyaT7fVd#GtLZCB!K11-ucBV%$1d-@WpX{a% zWk@JJgdwb(bf))Z2&*`q>2ES5RP|#BJ+L#)6Du0}H=IdY-*pTLjx6+45^@@ogo}NH;~6MgmYe9m3C9wa(gy1_jAxzj!=s-8LCqqKZu5Mgk zH`L1wZGfvrY5B+vz3Ybl>4sLip_Ch1%8<15U){L78EPZVzh?+TV`sYFjY}{Di>EU^ ziy;I$)6?A0L^pJ?8{#Ezn(s_E6m>(x+|Z$JXn%%qb7N=v+YCut?#vLZmd^BcZa(e| zRLGw&B(0iZNNV(!8+ygf_naGgf}uAFk2iiOl>6P#pWM)|8G>oknf?Vs|6u3_hJ>ma z486*@D;a8K=*J9U`0Y$z#Ly~+Dj1S}c?Lr-Gj2FTFEMm9LvYM?roY1w0-fo-84^D8 z`aumv+z>A#(6}$4B^q92iH{i)X@8HQ7Z~?CLn|4=4G0D@Pt7R~IuEpc7ctbrd|a|> zSi#UA+z{6?8lGod(hXHJL_TM(5n!1r{h6dcKhmG^qGU2-g|5um(#rWs332{mc5vPRrsHamPRv->ofLILW@;E7PD8Xx=oWx^m z_qL*2GG}2-!wBnc_B~<;%(lhE!4OYbU1(_z``6f6;&%Gd**5{nztie61TdSfCugbW$repVG@&}B%ruvmhmUO z+nd#oHUfQPXVuP51-_-u+_abOuLLy4^d4H8ijNkwU|ixKUPgE)(bflo&7Q7B5QVId-(;$05<**2gQ_VObVd zZ7cSxdDIri31SyFqmH0M?3{mW`+29B)WN%%bBOh9#?#^})ii#Dm3HlOu7Uc6eoc9x zH{v)KPFg)XB2Fty91IRDThO`^TeeRCCu7MYS3eHXaJ4b=P{<0q*U2E> z!7M&5C#&U>dO7yR?u*Wva?V7XXutH8UdLW5os+EYo=!{+8nZho4e%ta$K-%fp8sP8 zMriO)jz*iabVE3oNX)=&aTLT-^a|b|=Cr0!Ps9z6gZn9`h1G?PU588o=kIx_YJkKn z!RfXwFhXu_9dYRrkI=E6(lisqmw>l_Hou+@2ENdGPC}yu>N&)UOdO9!Kw|Q@z%%=} zv*j?kG2<}cs7kTkwPEm4iXaayv~-;$A^+b zd3RVgeWBfrV$6x7cqXc}i>M@?7XSOmWbu<|Rd@jt{DDNi1;d@#a=On$McRFif~Z2K z^}>3iLGHs`Ag4gJDWErN1sIu^(EP3a!Cr1__wC4OZR~2QYKJmu%<6NPC7Yi15_(!r zFKY*hn@L!9Cpk;#OF7$Z4spkX5qC~DaX}Tpx3R=L@p$jTkTtR#QX@@dOeAAMvc7|b)EZ!L5CpS;s{7r^Z z&h7u+K*OaymZ)n6%QZN&g~6fAt|W-&Jru;%3gQtL#Cwu}d*i}D)Cvgf*6-qlK$y>` z8{CaqxRZT~%#hb+)Wahl76DE7Cy%sqfT^=F0lt@U6o^-?j;om}VNt^=`_T_{I%*FtDw#Y7(E@yB52T>9G<_IL?X_VuBn|Glg$>sc~O1p)>Ss`f`5O zio9T@8Pv}Wrh0I+5}8AIR+iQBL7uiVF`tPZhcw>De%HbK{xo(6&$(1UJ($p?4}#^$cdSnollh*(jZfDKYuiX zrCZ2T8Eyt{(1NMW3g?s0UDiqtKHDW?1cTF7iM2Dc9U_)|5TC3HvVbpFo79GCajwJ) zmCXUMDC?>>9QSP%ij~@;FYRE3;&S+m$e*8W(B2TKxf!UWM{r@5a!v}fdW6t`9>LyC zIp()3)XX1mink1I#!>K$TqNp2vAu1n$Kl!>~FRuWJMp^GP{rwx21{>-Z{20JF>}ApOFHlr#RG z>>+fBp9S$ztL1(Ud3@M7Jxn*bN#M)!hmfrcE|}in{a{YVz6-;ZGPL&Y9IA1L&L&XJ z%>KJFL@2WF%9sb<1WkcJJ=m12NDlLZeICAj@`-G8-9DIT^s%8&s(qKGk4X4tLL_jS`|1y*+y;lGbNn`U)q8xQHj1!N~?ZyxR*N#Af_?}pZI2v zYMyQIX+>K7!pzos6xI;y5KtnatkmVNTXG^ zh)>8(ZGD&pLGDx-sM%-EBq%U%hl!laG>W?$^> zv#Z!1p(0MHS6PQ<-RQ7DH#*$+s3pvzk(;ZMlQ#yC`te2Pq&Rd7O)ei^7T9M0nSp&a zV5jLO7y8Io9O+q{w_c^$^`eF5RUzfv3LF^H9hD9wX%%kER|RxMAK!viFz@*J!T&_T zw*x%>yWo#yEnYHIt8_$ap2T-5x?H!wMi=0=8Ml!Vqn1lMNf*XlGu8ufl5nB>R@%@i zwS+DZ^WWC;udW2)_-k}|a&k%D+VP2j0OR^;&DsDG|J|C6Hz4f}ib^VPaHMXgsV(Gu zK7)7y_BeDaaq1s#U@v3>47oS>@M@q-#dhV7uGV z+iIRg#_FZ~>*C>Vc$6h=1(jf%lo*Ls1d9Y5z-6?=kVrC@>JW%h4A(T`Tc0V!6&Qqo ze;MBPC;1PQIAm)@60I2CX3FrC9k6|#0sOnpMZ_*Iu`p&mZwzH`1La30Vc;&~XLcWFx z$SE+V{ZvI}PeN7oT7GTO+IiqdLYl&4RS)%NpTVimBhr#BUdL?q%ZPzxD`s&vmxzbK zm?fhRvCAJ(EEGI*bc zEsBfI8?8z)<0v;i0X`Ju@2TL|SI=0_^($u1oJhYuyS>~yMX=a-3P1*l z`7nGExG#&PW1oHOGZtp8DW~Md zkQYSeoQKT|U}meNrJUD)$G*aYE7eQ+*X0b4sGEG)1P10bdtbN=u|p5x2(h1iCQ?k0 z$cjX6lu@*Xx_CWLLxL9W|Bf%>w(be>0LgXerkFrf9*%t#XhOEjRahNAE zXA-nSdMctofB`dv&=LX-K##$fo@mh1%GFCd0J3*vP7++RA2)QkAAq?WJl2$6ksID{ zQ*ah$gZoj0t@QW+9zhqEL%R4PI$(|QCsi{VKWs5>wv-RZG|QATxv&LKIn0AjVJKA_^iwkON-UT_xuHU1JOb{z>8W&5B z#>1+TtF{Qo4FxI56&i-g=d_u1vUZKwAwmUrJ{v}2(J&Qdr!L6gj2G5W?Y0_jkLGeB zx(Xuu)H4ghh)3uxQ=1d+IWSW69zV#Iw@0f{6zU~(7Af@!DbxgZUDIIPoU96NAxs<*t&K*9M4N5`TK(NB6x3gAk zWh}8H2sTM_rWM$sc+v(8oG?Lh5@3>LO~lLSf&!iR4^s}-pqX>?fV4)-tOCh0tAM0y zUY*HUi`@S{!8_Xee8a{Jghp&wbnF7Xt|y@+cOokVJBmJohP=>qB{KK8m~+&pgXljvT@>p-6w|cBXoQ+DgG8Y zAdoU$%b>ai>C&u}p*2K26@!GuFdcn~aVExXnwt9%iAM+cQ&hRV33bs%_lZ~-u)-#o zr-XbZED?={74sV`w?IDqQgOM=-$M#Ut{>@7vc{WG3r8|urUG=?GKF!d5n*i?W5v}p zBgU&0Y=-s*p0GE@&!@c57dfU{>eQ~t%7aVI15os4Zz%ivc8O2=l8s69IiC}V3q6@1 zc=%NoyDa(eE?!BB<)RYRURSGFe)x$M%O|&0vApFSilv~!YlI}l_R)bl#E>bm!O9Rb zHHy@%fHF$2^|cn7WoSKZw1vo?HSbyB%a<5E-An@Xp5skq^}9>8@NVAQLcPkfz1&)0O5<{_V9+J%rOg$qqgZ7sF-)coS7J}D&LIwz=>oXl zf=p>ygz!Xf&o6RBkDKRgSySj4MA5qD1=y|y7;x!K`0i;`91BL_T0~1N6 z$rQ`ZZn9*3rXtij>!d~CsgWx)TWmkpDT`!srz~1TX0C~PA>rbuWwmY@=rdW_1PP^Y z9-5t0!z$-bL8NAX3>>1Kp!@^V?l&Msz7fSb(#`&K2uo*X2(+E+V>OcuN#Hp#OfXE> z<9S0ZPUP@04fe|R*T~RBe;o}xEteRO!b=4s7y2FdX1RtH2`U|?$v{LkS=!F{>I9u zpTHl$X;ziOsY(<@2%1rR8%}0y_9U6zwI}=2u#x;EWCWSukT*;Nt<2!og6%>$TcL7K z4$#Ke;0s^Ax}%gtw6-M8^zsx|6^QahU`pnE5<*)hJAgwn+#wt;Rui zDE)Rq5@y#BC^~)zf3y@Q&Hq!!&w2%NHpYOp+S5Lb*Zd7RtC#XGI>#)ST_U*YXK8>z zohY~h^qmH}H%td*cIbBe#bYk~D`2EGht@Fj)LnBDFneG}Ow{X7Qbncf>O6K~3_({|Y5%tS~9v0?<_<_mEADQ7Ej!8A14vZx0F!Xyf+#5N= z-Bl;t3aq9~sH!1MFm4b**AOViJOW$FzwQiIKW^9sU^K;@;W7m?+>MY4O~DLzS2r7G zxbiG1=GBU4h+-u=U_FLEshV>9upMQF%MZ1*Yb3KZw(B)PX1JO_llvi{NB#AOCih~E z;E&Jb78J0$72`1Z{? zGSpnEU;L37?gJnPsroH5Tn1%^D_M1h%Un9cB_5J1Gz=3OIKzEhh24-lS&ov*FdFwR^)81!6Lqh&yM3gZ9+G(#qBw>PWn0!vV z)y#jtq=Dkie?PGH%79LWF#r9B%zt?!G$52J*|q$^yhgw3@MFbr74YIRE&P>PFawwc zQG<(WS^R`&Az)Nq?`|0Imuq8be9r{`mh1gw0avOQ)0uhdZGp# z#;K#Ll|fexXo9E#O`sZRU^_f)ey9ePXas-!YJi1V7s06JBh-M@<1z8q;HG??f?xN( zt;czikaG5AJv`IDfK=I`Mh52!o)pB*Tui{7SokTZJQi6bVz7=W<_ot4fijy`sN+`k zQU{S3j()~jIxg0N2b8(o;oCPF`Uh&+X=l?o(eVcHPqVGP_E!Ve-lqBwKEygvsQ+Lk z>K@dO-Gs~b}V7b@e zPI2@##&9mdm~slj8;aKrbmOF`5cDk*mlB>paTlbI$6prBt}rfq z3siVVe}$hEGtXDywOv&hEXa5)*v6|!5i4@)h2bpd&BO!ziG941+c2@OKhejZ5+=5P z&j)shS8{tMzUWUBmMPo&FmbUz@gT!7KW9tbIGY-;Gv{g00v@-$77+aTTHsObISUFZ zufjStKDb=XpUkP|)`&zcMVKr$Ms?)=CYbqf&0~XSl2<81QmdDZNc6A6dNULZ^TJ!) zJRx3M9bFC$>6RQCT|VV*-**hpF%=?j^~8mR@B-uF8^TJc$4Acwq1W3Pq3KM?(bBWx zbwU<Jo}u4BcotmZl@K`(vEZZa?Q5F<<@tbEF%i{j;h#J=8=6rSl21 z?&)>MLcetGAAsW$YkK1ojZSYq(Tq9L;^-4|8n4<8)1~TWywf2ONUCm&;FJqf<)Z}7 zQsjA7^2qf8p1L^G^d7I-BM;AHC+Dni9$KP?4G9f6ZQ!;z@LL#vIdXqHnd8Y*o&poJ z0K6oH?M)pedPfO3TteXYN1F?yt+OyIoY~oV4PF^(UDA17LBY_L$eGKy_J~*%U=6gg zB*lGa;oe}ZSuP zQO2kDRGbEp2y%m9Kv> z!RuePzVW()Y=MeZahDA^!s8bwqy)tYWduu@5`LIgAMMd-Tedwpe?^u(IlgPN&k^+| z-ZGkfcdu2WY~ZfIo-E$}O>4vbLCo)zv+!Bh?7M?DM6!6QDe?_1^2!^w$Z3+0a%R{f zV)mVCvhS|h7r5DXGugk(>{PHbYrz8=dGK5thI7$~F>qc>jHkzS2A6FGwfk-yRI{(Q zH_kZe;%qC38}Xn)i3YN<_P8-qd6f+YLRne^NlcNIH8Cu`-8;;cl2qX*oR;YYGH;;| zHs$Pd4ggv!@fZVLR=zGN2nPWmJ;Rikn(w~~B;Go*>dtFN_ zYhHY(jq9WbiYLuy@^vVDud>rhQ0Y&%sM3Gs$SubfQ_dl0Z$hP629ITsS)ZNdD|Z~K zN~%JbHNtQq;bYcJH;x7KGH?+)7dNd|UYUxnVv}XikyL@yQtVhV)Kn{F3QV=piF4~p z646!Jw%V$ot+r~)0w1U>Tg~a#RwF5{`6G1sZ8hy5`E9k`JX>uSS$On!s()p5D%ff- znkbbtOo?E}wvajLKbe$lfdkaQ9K-Z3E<>O@kUsvymy_lN9*ovLlpO8rYUZN1H0}w* zSqNA?BZ}K$!qrBfw_h-VYNIQpI8HuR<2s%Zb)^9lU`&L=N0DwyXyExs%>}z_HPmEN zM=!iE2|;>ZFPDTlh`1t{92!>y6R`wwD?8k%-iX=;QEmjy$X=g~do57`h_4m4;L>r} zZg|{GKSKtX)t2Jq=_8RXer_$7KV0fY)|C=_pdO=llzJ34*ECM&Dflik?`<EQktpI5*gm1yGAz;01 zK~q!%AXb)oMXrAmI|-|!vg5|K<td<8j*s!oJsshuhyvmf%btN&00 zEAlYqsx_93!G|ykcUP8T^4d<;$ho#DEosh50Hjwani$a(X^!5ZIo@NAHlPNKlBwKu zf|)k==|x-J-6=aiv7u8hk~d_g|9}E^lTiaT;DOQQe6S7=!baENvmjGZJ!8$bQ)w$b zmsVTpOSNR)c*z<*y^O6i2jCMGYk-nn3F{6R=b;MG;4i)%!`y$nXh(I_DXEUGDNIDy z48z3!kND-qktos;Yw8#xvH>Pxg#z1IC&WtvOp44t3mV?HESTjz#Hk~kHS5in0CV;i z9Rl`bh9bEnGDqYyW|x)DG2z$B3A8&UMi)4=Z z2lgQFVj@$XrpC%EWql1ruvR7@%;p|mOyuFA4>ut$dw03gx7VD@zLrGfZ1(5;IF2(3 zb{B{&Zh2eD)29GQLhyQPnlWsVj&q?^Dlimxv7NdsX8iN+E*J5$2P*e7Id!0J^lIG% z9+~qg`Rn@DSxDq|;(IE$M-N1DvUtB2t=!%r2`T5PmH75_asoyV=y40@R07xVDVEqhk4M6`YRetXNJpg7dpaw?Hf(5FkxU<}37HxzMi= z&kHV)7wAS$>Pa1|CuLOIlWT9Arz-Eq-lhDi@_h7%|I1On2deT`+@_Z;lM&qi6{;$~ zZZi1@E(q+YOupErGWncJ%_YxRnS9$w&GwIMflO8z=r1VrZCvQDzeYSM=U&_(2#Y|+ z?hu*WVD@Zr0N%vmyK9+zVo5+Iv&>yMbg&1HTmRbK?QFcZ5fQj!5RYT)&U^phJE8>= z^@()+XoqWIa$bWeQDCEf-%pT}n^9?+o18i|$0tzT%iw{XR!Io;;#-r1We6WCCh7zMizvnI7uuGgK8 zZQy1D_QW@Uv2eu(kIT(ztgK`a9Ry^fWgB>j^+)hiul(&mu>!e1uEWeM@*dxSZ{}hC z$M%uv8wkGP+c@GsvhmkC;B4EZ$~?jg$LK4P%Jh@UaBdMe{P$l{8=m^G=NawsmlMEM zaF&})bzX_p&~{9no7&*-T0d*z`huA%sXiVjD%R^PTTZ)l;IvEYl!m&xz}Da#Oy=Hn zUfqH@EKG4sO~5vbmH3)KicF+q^-?*VdQw0_ zh>y&^gnOR4sX%6!fu!rWiWawMD!V#x$yyIkO?fm64ZI!Zh9J`->ANA;S(rHK#}>2# zoX?7`L7@2DxA36hA<;Ecx98U>_{!{wkRjvamTa`?OpZ`s*gELvkA}>PA<l z7&LGrc(i@$_WZmGpP9W7lGMIaG!?aD;w4NhHi`YB9SDu$pW-u+uokr=R4?{;i5-hr z)^7EziK~rtTi=A%Zna9cIMp3UH)?lkZtZd;JX4<2mqehwgJiYQ&)}y0j1EHV%SaYa z{Cpd%UiL1OqnfISv^Oozl9H`}t8inFa8=7apKi-_<)E8{70UGYpuNRG7v{qIh&hI8 zj&SeWh{W$;MV)P*D0FchY()S2zd0#VX>;B6&W6?guXUENL7uf0x$ha)wVQom6+YA%Om3TGBN_#ae z`9xX0cByU1$>QHkIrHw3hVZPo3L8Rs#w;|Ls9CUgnAq9CGVmul`5OsNv%jWy*dsQ9fb#D6W%ewZ`Ke!CDr!}5R zpco%`;r}P9PmD{)`0(9XTz-CLkK-VzPbv}8YpzLyJq z!?Oy#c|o_TV<2|LTlw6&s^g!3{!d6OMXhmc9#L!ZMAGOV)g|Ih_zdUQHfKTTasu^@ zQryw9m0X-Zc|1haXh5OGL=_Gb9U{tYA902^Ejd$#VZb9+)NU4cByO|2a|=Z6DUsKv zCFd&ihjH9Ut+by%t)ezgpyzid{T1u5n=5DcxtcL-Ip|6V`TxCUq@0a8|Nj#?D_Yuf zIqUO08@y@B43&hxEVhzxptu-Q&N+8%ft=kZ!rHWCwn9JCg}z_2%GoD>B=r1p_Nvcq zxvBcBYdPBi67G|;9{4T)&7PXyZ+Ro{$$M3Lv+EVq{TSKa$bNV!DSdx1XAzz>@w|!Q zZo(1VV(Rxz_6qeT-U(-Cz&9E0={%I4PQPz5+|xOQo=&}aE5I&Ti@t;2xxUHUd*qvp z%(+4N(7k{1Jo3jsgEFq1+-ROljA9mu3vw7*g)M>DXome^JcSrt#RUA3`*3`>%*@|( zm*rzUb6Ng3SJF2R7TJ!>nWbWm+XAk(ll}}Q0a?CHPQ=&Y^*J(lJvcgwe~J%=Hdz;; z(@SF|sqcDdfpw7!eX(e>z*HJrXnY>fxmW?q;{s*(s~ihTLEhOedB+(Uz>pLb7bdRz z0)c-Afz2fA*FwNpxIDW;yCfT}>$?HIR?I_QRL-;@*vz2apmdLjFfS_h{IRZcqfz|7 z*mdZoTZgPa51gJ*6Tv+6$olgPj7QhtR_Gm~&JNKv@Xd-dL|y>&yXGE*wYU~-5at!h z+NwlfTy~{hw}^;C;Ju6#`thOcxFPP&dd&De_ZX z+&RWI4MzI@c?y!>Zxu}O;%Jtc2Qw*CrjjgK1b|XOBQcd{I2_*u|pay6VqXT+bGlWXidE-WC}4RR;Q>6#7&b`l!EY zXZRMNcjM-ix0Q_dY*TIfuHBr6pr8AU)&D*>=W}mJLyAYUJ2&SAqF$PoJfW=K;cnZI zadCL2oCj`|h75CB=5ceb*j{GuVI{V%oAXXcLEeV=%G{is%qL*mgziE5y7l=Z|I+h5 ze}i=GrX}yIsI=W_MdkbAOH4V}-?9aLez1Z5kwTyCLLV#cqm(lU(7WmL$A4x1$zkXP z{~1v$!@CTjqV{$3Pd<%@MzHuIu1I&odLI8|r6`}KB?G@D)=12W$7;nJ-^>*kFU%>`Qpw0DLHF6>HiZs`@w>q%h@HOxtf-oqLR?} zb}MHI@g=65zuvS3a<+|ueuhH7{|^@W^?3E0!$^fd&o5_3d}aR0%OK%CeYWNP$u)O= z)&9vu&-{}ge2x5*m6I_e>)tncB64N>CKK>R$>rDem}D}{3$Ss42xfS$H&U-j_cN*Q?P;t$O7w9^2s;n@$IA*Me<_y3@+%Gx2*`u^aCPTgd|mFDre3 z@VH*k%w2;=!U|9)DXp@kYCihr8mWr)7BnONg}b;hrJ= zTXtLaz~`AInAyI-4^|rQTepJLU5&#WuH7J?{NiRJ&+_!atJVm9<5t{3aB!XU5Qo5~ zB^z~Yy!lslY&<{=e_V)N%aIojIlYUx)!SjdjFK**Et~SnL<01&s3byMP*-4#{uV9CEJamn&#Dp!o%9IWE77cE}xBknhn%0#De>9JSBy z1QKRK`1!d8a^`Fs^(dl%A6FCiWmIDH<@jl)XrlYdyXvMc6x|ky$Nj|-DXw)z?Mm_4 z9vGm@{pYcRy!^hH6WH4EZLyY5z0LCS4Y6!-|Ks)fdC4hxI5T_yJCvFK{6!C#S@cd1 znYle%%rJA7h3qkN5~BWZnR(TNDwv~{nVRIWGLm#uh|@CKKw-}Gk=cjk*V7Y zx{}NaSUx?H%%vMWW*%W7d(7MuQCppvv(~i1yN*3&V`NEo(P;UpkI7H696uv*%dq?; zhcGe`EyXl&5Q5p8|EiZVyY!nHhEikmtZ-oRr z%OhWlguG*&pUPB>0(h^!~3SYi?Bh-oo4{vOyoS;ryslGuU$_ZsNF62_6wtFt)L(z9NZ z+eawR+8G#fI|HR%qZx9ewMVg!h$Nf%gc0wguUD8ovRC{pw8m08q1`&6o!sjc+u>f3 zoL*7#b*b@nS8sZaFAl5mF0;QTZJfMn(`)=#SdI6YwY6%TM||@L`zA~E{+rRphvNWf zj#M8u^J`M$BR8XslVLS3zwT>NP%1HU93kn^)tJaWNipRdycXRw>3TAQ#F$A{{WvjT`L^CFAg$U$D@Hg4n)FLGNq@|ajwbpsU{nq3hvp{mWEP&|a^4liyI z-tgRaseCu%8$04~<95L@%PP(EAW|LOhzsd9My`EEj@0`&Y-Pva{_UjivBsgxs`wzK zCk?~}r;W;nq@QZim31~GCD%fph)fs7KiFbI*y*TGP&%Wqj#CFajsi zO68}%M1GP5`0*=o=g>wdW6hd!hE!tyA5X=S`pjuER^kS6dQ)SE%bXsE9-NKXjm_yU zAy+Tu4^D600OXHjUsQo}vH*J`mWzp|Y&>3-95o-0d7ta0 z96QRS;QVX+P3QBgKov7Wn4iBw!t)tk#&DwepLkP)_vR#vn{Z1lPh+6Wc~@gaU24Ib z5ROJ2k0F`vHZ7%^7XT!Me)|llPhlY^{LXFC( zLm@W?K0cfoj>Vtw#dI(0>T2E1aWwx_B2(nKZ>c-#QADEoEiL6t>F~iX81w zP8vi}eZ+Hjn5{_V^ljc`-+rVKkR7x!Y@yA3gJQ7qeO$*0wPB<2P|cV|0AUBfQGC;;$f!^5 z!XH@|gQkSjqqjIcB6D7W^vW^rb&=gaKP`?I3{>{c2Bn#8y~z0_|M);8B=2u%tC8_G zrtJyxz3h#Q+A)xwT?3IDCItb{WaR2#q|3f%v*Ilu9}2{Ski$Jf=1tqs>72vi6k~ugQ^qw0A*s-LX4LUu_UgI z;8}RYUkzCWpCr#55p;HZ`5bKJo?L{`ix@3rq{+|-brEQS%6&7tlQ{Mtljk?g6K^G| zXQrYu*I!A=7}wzqXsY|_c$ap3>2z7zTQnIze3$4_`K%w0pPYKtER@8Qb0$f`Ggjtv zG@cw`cTLtyhGb2hBnb7F2=#8sBl%gql;8`i@HU_eqYq$EfV`N2MlD!yDd!Co9vOc- z7Jq}4yYF4BHTPj96ds;9dlL&qaSclWhqN`|B%O2}NNWZIJdVvTHul=DlJ z3=;P<<`h)H7%@bLfXq{*PnA+O0uS%3CVg%Pxc-B8&@s;f|!#vr7{ahYPJD~cU1PIpy}5x{JVVVs`)OV1SV^w1RCzh%j9zi3Bc!m`l%RF z&aV0?bRo4wKcyP@-0%|$bMa0KtqSb;gR26QK$8-VK@18~H4jn9B-Dsd8A6aQN*^m{gkMet_<$Q zLC-W9aIgBYd|Hk^$)o* zC90sTTD>WYP*S{qSgrooOP@R*;(fVUMZu*C&tc=udfBe&r z0%NMn@MKoJm8Yt#_;%AF#%0B~nD}TQ9>eW&Fn(nGo%GA-6{J+ju`JsqkljcW+kb+e zOn{kTz}yrHWA;Gw)$Y)%9-$ zRjoJ#Llumr-N^lVS6M6E2fY0p`$iZUT@Tw7>+Sd$8h!1`V(c%;oPuMN!=mk1mf!=k z!OT(ez21BmWpHfgHLlA~)eOBd0}x@9byWv8KH*GD@62Dk$sWzNK``4|<5jD2teWV1 zWa7e!m<2^wJ%-jQz~@mknxWe(-UC}OmX2^5o2MZf{knRfMX%-5ylgRG|Z}WL)f~uEAL1++}G9aNktc zW&bM6{#8EqBhq94DzpP`8PXOwgA;Ln*(Nv^_ayluiZX+RFT(V0!yJ&eC89@qEiqgatG2|E=$%EvjaD^naV&tO3$jiUtuU7^_r^=QH3R%bR{&H|fj4 zlAwRhiC3+TSG3{aX0=m@u9caFU2fRU_2b4pYBFcVnw+vGr}(nwOX4kqoAC%lbR(QN zXzxHWu0@20CmAc${an~dxGes6xC%aJ7zuQe61{}nNuH6BsQV5p>3e4MmFgxJUm@D7?OPQ&*G_xa$RyPh&Otq!K zgSza*(2ULKR#MqD=>_Psm}y~l)r_hZ#g;tr$)F2wTK37H*k^CYn%>9GmKM0uaK{mL zwwcSZ5M<0?zIYK!_TGsq2*^Xqvn*iZkvXJ;R`Lhig+lfKI^FqaB@fa6A*mQ;hY)4Jtk7F({ zi+hHeEw>N>ZuupvOeD{o;KN)L&d%Tkr`w7!QnES2b!C+$SYgQPWb$`tv_0}m7_+h& zN}|UyT6Q$H^EpFlEhLDu1Gfie@4;4QyLXe@z>BDI zuq7SNogmAv9gh_7(O1_jz4IX_%cf0Bl+Aug@%RV$yLFYGkjG)rF21&~#2`*kh*_~3 zVqh_T2yawZT5m1$8X-!+ok}PP#0a4Ge1LwOrT&yu2KMy z>EN!NOQFI894n)Qgn*jP_U5@L6lgC`Y6HD~r{cW%P>CM^ieDCc z!nNb2E={1t$F=*V4zhRFa;*sZCWmW__#ThibVt#E3v#W8I>~n(g4IcOi!w$WpH4Ch zbiVP%&K@xSy~Lgk<%^H@?4lJ@I7`++27+4};fL zPrN@z28Z}Zi)@{cWPeII{}A-NjMEG#s<5`9gi&r?Z#lLIeldChE?o9eLG;E!qAHGK}#?PZO_1JY{^sUt0y1qjQK$v8OylDz9v zb?8U6#q?+kPb$rvsI!8U(`Sr~z(7xhFbd=eU+9%~TF~@n_TW@PGL14AjN!a4OBUw){!zwTmTmXu zXAngUxip4QQpzG&4ncOqSXzKs2TOEmZ_1Vd&I|$An4U`9J?tO8zF=|tV27JRb|CnT z0&qtRUyWjRB*?afd(xjL0WN4ow+dXa`zxYjJ^cOozzYKXnRN(oL%%JFc96mFkvsjR z1d3NdM&1P!YU5-$oMH6f$S>hvRS&^O@Yc-vCr%3_ixvD&X9K_r#L#~oqVAs!qt5N zOQFa1GlioQQ1&Mh+ItRyi1SZnzxGJl{4!wm9Z%=OSg1zn%9*R8BkZ z!s}|aoxg|vpvtVvRw)r<$XJE`R@p(kntW9tw^g)N+qbB1Kdu8=cHdru=$yWNCOVYQ z&_q`b2!)!RBr2)m_yWaU^&Esuy2V{^%KJcMy|s~TPssIl8~~*(PP}mJC-<8v?N`&m zKQ!7VbMVNV7gQ%p(j%BysgR?)O5wS(QZ=dp%AgS*Ul+(YStX#Uq(HB8OJdBDu>-&8 zFfx2pGI3J})^!`)Lf}HFmgf(KFM43qywCv^xMW~OB}SK~SNdwyNs(e@Z>7KBP!|eo zL=Fjkhe>4&K&kc;*h}fS!a*+2G`e3z6z&?D?vix`3rpod+$acy3-+HP_R61WrX0y1 z+yaOgVl^eodRm)AY5^ETe}iJ*NJ{k*Lw2xL_bB)UO*S!U6{d@X(PJ%Al=u)e8vF#849JY3%Oc{e>4Pt+ z)`~Mlu}I#Fm{(k^@;O>Q!P_Ln&ExUU%iyAbI2D5Fo*?hd%xK#wJ6X&hajgt7Q+Ye3 z0DK)W8O~53xxwM=k+ZwjFm{Wg*c-MVZb!8ha=m1bsd0|?V#lMEJ?GcwP!54k94uw6 z8fgxZ%K~8Y4+*x3MS+=_nF`?!Svh;CV*)V#kxky{d`+)D5z~W0bX`k<07`c{CMK2f>zK3u^m(|BdF6b-gQ?-k{{<{8mCM#KAB&Bt{Q12pm#bq| z{+bXuD*}J0W1wHe`GBod0y>Y5sYg!@NbC@ZM5|v5P!t-_{rPVXqt?(#;q|kPmxPcd zUHk4JY>Lt;7nPZ7TOO2+sMOU`!9BunW!dWayTtvV2$h6t!xoAjmr4mgX*U!}VQc@3 zV(w6rA?RuzT^j77!A_lb)>5BCQm|mK+H`OQ8X_Nmewzcf=S^10y0gCpo9wEp&?dWT zRQULltDNZP3-Tx*_5L<{;N#%ZRQ{GeUd)TlZ?nx&mRG}9;~Ob4P>$}ow#2bnbVqL> zlSeYCKytO^{@_B;A}inq;1F%ukKQAnw)~*omJHFBZ!@tAZ5it7_#dxO`{r9@6aNL& z-D%5z@uC{2K$55<+#ncGp%&S<2``{6JLHxds=91#d6P|nPIwoa{w!yM7TI6LRtwdZ z{}cduwB?UZ4`@q>73?OCUhQzY@GAFa;ne8N;#@e<;{7% z^5!^hxlof5*%Z z#B3RZ0iUy-ggU-iejCYn2d1amc1XfrGWjH1K_u1+WE;auMh3v4zGbMdLgP@T>!|{w z0mn>GD>4q>VtITC072!#(jCJ2IQ@Fo4l_$>YVof}DW5(yZ4sE3xkNk_?JNXRm~<}E zjltpp)uedLCJ!;=PKD6;kYzig@>q*grIdg68>|?q@jQ&^kiw32r-aF%&t(Aimbwf| zf|cGv)MY`8J(0Xy92yp?xT-fRqw?j-NPlS3u%!`nXZbUuoCl6UiIuH?ngy@H~W zSMpXj!CcQV1I@dd;almgSMCh)&VqiYRnCj(avhC3oA0r>qJH&1e8tQ?~Kh(XSMKJ{(N1LQ)MDq+6S2u`0`4~jeaa@#cqateCk0{6 z7a!Gv64Hco;bQeQVKqIjUK3WzX9}5H(22A$opHj1tahV}40Ibq2HBMJYvxQ0L~)Ui z8|4$KvX$O5E?)(uolW0U(fbu1tn<-*vM`>`D;X<}z^5mAr%Iw<^nQ=hxuWM+vB8W^Cgd95}z~4=f{C>dS zmE?bu>A8}hRpGwDiDl-DelbJq*3q4?Erq>q8%$+cueKPYzP}U#9rzbNhN%YIi zJv6*?)RnDZ?u2cTohjO)XuFhcV2h8H%=7KOYn66Y$4w$#`ETWGRTTzkT zryfVM6gZQyh^-G%^vkMhP&&<$$m5*kQBy%n{R&0ZnT0+N+-lM993(xfn_(J2z14<^ zm=jq2zIG2p!w9xZ^;l{b^(H!b8z{+OGBjUdi+|pqqjAQ%P$<~d=JO3ASKzoAXGH& z)eRUT8rPvZ7tN^^t<8lfgdLs`}Ujp1qaT39MrzgrLmcK!&HD`CPodFwK+KI`URW zTT5cq6LFO(xBOg(m5^v_7tGIXyWjMP4lJ@jo`eqHJ4f=uHR%8e(bnEw&=IU1-$X-Q z`b9TpxWdP(@kR|>CmJrpqHR^H1G}EHKqLxqL?OfFKqpbL5&h1X;9Au27o|-x1})x< z`D-IQZ4Ep*wJ_d1BEGCPdT+d?HoCyS@*(S=q2;`WFEaEKMMF}&*sNIPTPnQzbLBd)s zVYqaqVwDocU<(QJY1QEsI$f9!GUkDdI*?II5@zC0k}Jgct)GlvKNDLIZ6p%r0d-&> zjI7~H(GSVX`^nd9@eDQ@BY7dtQpMt!S*M)a^!$z#n8H979`?DPw+|fw#(2El8L6Af+taxIWH@t` zV(OB&)rY&>JLsq!-X2W|%G({0>iqq%E_gd@O)X{4C%WiCl*$?-xk*Y0CHT@%3AWkt z2=OC_ftKzVy-G4EqZc4dxg@q&Vkwc2Bxe$%W}^Sr!mCfE;L2!<^0gZ*V9UN^$r|YR zu0(SL@hO8ofZSz?W`~!$0;$gb9t!r&T23~FO6OP1!D)E^vs(_%l}yUP2?%d02b+DJ zyMwU0;b0N-CBWUGTrdYo`gmf?sFWiuprc38D|4`@l_*pP2Z{Lm2F z|CJUwR7Bm{6I#y1oX|&0=;^UUfp6sMf2_<6>blSQ{!quU5fiFBu!g2gZ2!L=7DvrdlX7m}P7w zW2oejKbufwDfS-*Z#i5lqSq(LjTy0|-Y_D1UMlgS^tu@faa9BvkNQY6;8Iwnom?UDFJXQNs&#P8)idVH(kq@`|zo9i%CgN2rlIhn>kvaFGb<(%vkE_Jp z!rvvCs-w0&Bu7V03St_J&&su8?Oy;Sg`DsEGri^iGkzZ3GvGAAXf>v z{$QxV;RlKuWdAb*Ne_DQhv)RPzb`jA|C{>zeexzj7yW(g=^|QImVdQ2Pk(=4B%408 zzc1IMu>StKB<1bzYrW*2_xHpPLi_vLQBsjE`}+Ws~l94J*wK%7kO2iCyK|d+N=6$`}-;EKt1m7-*0#O z`>yC|S$+24Af_}xhxPYw07y=MUrRc?1~?p`!utC!`Obm%_gfD@e?M#gp7nQgQplbX zN|nnAAymAB+Wu!9SaxAJRX(r){}66x{07VwvB1SAwdK15-@2;@#YC&GXN-7Z2JFV> zF>_lSI2)y(+`kuUM|4e5`m=C~rUI&;qAJ0{txT4pD;T2`;V}q5MR@<1pPNb1`FSW> z2dI9E)(RFsMecF#p*MK*M5C&OmK3?$}?v$x%tlSocRON1&V=Ro-mH&nTF<|BQc!N`E<|xDq zss&O(7geF48kpH7QSn;V@^k@`^kPs!Z|lE>>=?}ob;FL=KMb(rVxdvkF`K1>&Z(ZU zfR#g1(Sw#$z3@)^pGi;%SS*>OKB)D1gUloa}?0Ac%H-{ZhO%Zn7 zJT{9R69l%)4z8xf;-Tz#3`tv`9XrCL?T#Id+XmRNC#_(;X|bH8H-{Y$Um@(M9FxV4 zCxh(RT~LLx)b8o_B9~Z!9TrS*x@$4<;_VX}LJ#K%DuWW7yHw~nmpAWb6Tm5Lvzko5At$jsNz2qvoHtOo) ze^EWi3f{B~&Yy(v%xs8Z?#VfZ^yQ>hS(!~FP5nGc&tq6Ig#r`@Yts|@qwl)(zx95% z^zWWSKW9jJh>Ye>+HtGVe|@J*|9c;FOaHSulf7odpxHY7f9gw@{I%)J;Any zLx~;5ukQ)AB`6Wr0zJWYtsmRKo?sif1=vdc*#3-##V{=%;N%-n_1^q}Y9T&jW4x*Z zuUr&X4VyKi15Y>~d0adxS?>v;404!LeD*laxv(a$%O0rJW ztW6Vu=&Bwd3e@J?XR^c~sZDPQwnPRsMb2FoIk`7`q$y(H1N<#O zNs)qBF2r4y%QTFPPfKpDL$(V82>_fK)uB*^Lkiryjb4ko@bVGDMr_ALpjMpb<%phw z?S>pSQakmNUFK|be%?0^Nzj|Z1H+BdQR{^WmPS+w{+IXmpOrFt7MThH?ICk8#FqE= zoz&xKEzlKQX%xV*xwX3-IT!^7fR9>Fxd_n4k1pV0`KNSrZxuCS9}AfqE1oXE)Y^qW zFytZ~^+CpLISJOBB0xD9x5XYWEXMQp$OX1}nmk(ILUXqA-%(i!A|ssHGJ3{X5B01wEm1J7D!PKo>Vox-(!`P>H)OPJ+G7gSROvOT3$txp0RtseNci*+au`Ojc9Q z9rzBVPRqoY=UFWK7}^9zrS~l`#`gfm>btd%SUSvGH{d?r(s`*14jL{$?R1d`F!FMl z^(Y=KR(;BWO{Pm$#mAVKk(RFF7SnloIlQUuWK#DwFR)Q=4C43i>^H)5R&_yDb>npA ze`pt%d*k_ihxaYqy~X<$?k-v2;wxqTN~CwuLXu~6S9yvTnwl-~Y6hKw6MiZ#xsu7+ zBK=1L>|A)f7su^1l>P>p-Z|;$h+PC)kPkpZ?3$q-`>!*S@ODSWfxQ#dF^d$THPq} zx_)PunH>}4=hF1jUtQ7k=}(ANS^s!<=Jd`JqVj=y1*=L|Il`Ze`tdR2zQY` zM_zAj=@P!Q`(CTN$P?1;e5Y`M^v|WTu{6GDJbOsIehhy6W1T)w$XJTk#3&ktDJ}$9J)G!OD?6LSO&f_?ohf@$Uai;}x4vW@Jc@~rh4;cKm zm~F)a2I2bJjFY#&^?xFNd!L4?1mtfK6?IVlPC7gwe@`4{<*!f@@HS*oK>nr>M40@Y zN^C~nPUF6;I2j5lMQa=Rn`z{))+c`t6-!pI(v`nGwKPN$5RClw)i??O<3#>4CreSv z4C6%p-jzCI=aa^X{H@eD$|UoN{4LeEMhFw%Sg%gcagt?QUB=_$fma5WG}jbxkin1 z9}&R0yu_tiazO?)_poT~lqYkN<9Vlxu6 zayT)28tg2&s|w%h$f3AcB3H2?RD)R*KNb{GN{g$(>J=iTg>fQ5cWWG_r8ZVvD-42< zP-7`Ch@Ed@D>N3Oz*x>XDA^}!Y;%^PA{ML1zMz-})f@@4dTbOR-NNdytrf+zdNpr~qicMOVf#hSd!ZNX#D z$Z5eR1Vyj~w^N9L7JTnSDVo)SZ%VDBSuOZ?jm>JoziMn(EjU|-n!rHiZ^7FDA*TiB ziqHqnnwi_oj*Mbao{mhc~)y*(VVRm z))S!0oek2K02&;pvQ`ZEVnwu#g$|YSvb1-MAP<%c%wO&7T&Bc3p8L7aQBC;J#@;DG zoYYuIhf(g~Kzrg(p!~UA#0Jd+4eT8PTxj;%iFauM;FOnv;O1Cz`XH$D1;|a2XrS_h zQ}!w6RZ-^55SxrdWY9$H`Ip=7Kcff=fO#^Ua9k~MXh2&$% z(0Cp=-%)N0oWFDp=k~7P{L%+!e}u#6QO^+kc%vau+(ZjGdc{eE=cb^yBO9{UseGBm z1eUq-yP+8TWkj6p0tCz4l~ZO26-m4uM^^na5_sQc&RA7Yc?6_Fy7Nsa2tuG!>O`U> zT1YQA6DcOwvAD@Db2PsmgJ_8)f0N0f1yclR3KpUurIWXmy60}M|GdMe336H#fb-7q z(Bf;fs^Jzj(#>0JdDE}g8q=FrN&$O_1`wOVc-scfb-!awzr{-*&+j?j_jG<&;=3z) zcgeyxA}c>NApp%-0H@}BHuAhU&KTd~Z#A*PqSRvZ;noJR^QkD}lzNnsJ5{0cN{f$& zwNBl~EDLbB_?B8Z8NC2iDJNp+1BG*-|{{kBa_m177t$<>Xc zRfC^h5-WVcjEj$JBa-S%vw*Z(x~iR-Zo%qhMW*B=5eFzHb!ROgua+L!Vbqway#WyyfKe4 zrrVy)Z#@cGt%eSpLldklvQp}>|Lp#uo=Skq%XVvMkSBm&%u zjRLKaUoCqC!ihZw8rg=(ws>=7#IiZK5`7%^UZtX~6yi)d`ZEk!3YFMt6@oP7T=^FL zHrH~)W;4{0SY8~ubd25sx#9zPrv{q{WmC?wLjjd9d+^5ns=Ku+I#A>0*jdYTB|>lv zAdXbDjRd6M#h)OOHiP6&D24>;fKEC34ZIQ3SUC~IwkbjZv;aBeAaEddE)@zWTG$p= z1q(ffT<~WR{xkGvp|Y~KWMuq3=MI$2oE}b9Daw(r@PC2s0OD^5;$?~A*AC?V4)r;V z0W2`8&1KYWLxfRn!l+11fsT!6Q?*dCnYD_{QX!hGRTr(FQ64(vVde@D;`sPdC$fvS z3&dV6u_u`p=Ja~pY zU>O--;R2j#%xi6!Jae-0cyl>uj>qO-UkIvF&JpJeEe^Ge8@Y!US?)$|??sMxBY%X* z%xF)45l%Vboj{+VNYGquvxJON>^XG0rP$ z^3Dwumu7ffD=Y2mUUpSO2FH@$DvBj7U~LD{fYSjO9kely$6J-#rb!Pc_-d&nI;&Q8 zm?)dbY=vmEkEaBTxQGN6KlN?cZRoMd;+kW0L*VOcAYn2iZUg~RSsf_u{2!Ju#>kt_ z51B79VE6B^n2>hz2Z)gjSgUXtE}r6o-_L-*HWz&LGB86S1W^f2~nBhY)Tv06hmSxg-gQ9`Of=sGjHr}A9 z{$T*caf;%T1KnEe=0owuzgP>m-|W8;SI;k|_@-(GT5+Ds?}U7BlKkFIP3j7fPdeYc zAPiuaa#!#@SMI8X5(*h9j9DSOfFHJNr<{k?C*oOQkvW_~rSHQZs}a3=f9EVvq~_bR zA9nbT5;syaLeiC|rlcBmSA9E>#X4pOb*deuI0|!DBrQu0xfpL{>z;9RBrqXD>BTjG zX6G0^SfZLw}OZ#5AHy7@>F|V}vM-slU$-m0x-$Ur9$G0PF`1!-n zvo}Ir3JZ50=HGR^ZHreH;l8h0S?==>1I>KHm`kG-$S0lpTdxUk7=>bT^B2Q2jW=>$ zWO4m95S>~~omtQh zbCkdJdW5B?B4^5(A)m0=4gg#=a&T(p6=&51b`>r#EN98n;!j!tXQ0Gs@s$0nl}{*4 zVoo{V5qK%RD{N%EZDjoYSR6NtHI9sbJ~IBPvyO0Ctt4gyQbw$!x*xgG<-X{vG)UI4zAOwkr9C(y$T4qwz|29GbQ528lK(-uR@ISv>snRmfY zR0o*Np6Bbl%$Z*Al?E?Grp(S>r0{(rBK_iWs1-60mb%|{w9Z7&b%s%kS1-R*t^gVS z{oxk{R};`-aTk)`>N|mUvoXqCTW+uy=~;dKy-3gMy8@A+R$mPFYI^#{XZ0PDlYnaM zhDf6lA4yvUR7XDKoEbD`P#>1?S$(bR-S0BCShM{`nD??~TYWlXTdD)aqBgN+>RaU} z*@7Qfea-mscXxQ*%-l$autbd%^NbmmlRG|*Es>~^811wTmr@qo!LK*PCn1(4X5g^P zthrdgp+$=nFppPc-K@apQ(Snl5a8nL!tVShvwDE;^-99-ETi2ys8=9I^S?b*hT$8y z0+JGg4Wn8?dS9B&9?UOgfkf+*jG_P6OGOfkgr^BL^w1XXu-lt)I+@fwT1xBulOUT; z!`4uX#n_g&5R*I7vyqJQ{UkT<_JJr7j0!C-m|bI7#Xywnfh54NH5n`SDk5#^RpbsI zp~fuz4F`6&MFz$SwbnLN=T4A@aq_HK(yv}g(6FXV((+v0(EEWXsnX9)1QJkYF z`gkY~^`ZFWH9>Kii=w|lad{XDXjmCM4-KMdZv&9TfV=l}YwVUAa6Un(vmCo zGVy}guepSXb&eAz_E(A>ZRbEfp)MOO1@nsQH7w{7kSng1fKPn+c>7qP&ItpuDS3Ue zxp&aYUAbD6f{=nLy*vY-Q0(q_7Mb%l6$4#w?g-{`?T(dQEW3sPwz`6X%=1R`hU`h`0~R<56W!%}G7 z$8Wu87;ILqliv3rnh2-i+Y=445Rp>>+cfwg&;`!>)RtY&hc0EM;(1n_$0?UO2>Ju? z)8|XK^CZ+*l9zP_=V2e5qY(~+6TaenPk3%FY_tpNkQL{fe;kUzUnXb8Ih9jp2#n1h ztT^9~f*>Sh#kow)=Qc8L`U_~R;EMAwCWjV$k08y8^NA=(sS2z(_lIiFzlWfbPHeR; zONsk-EEkw>)G6icc!!7@J&ZAa&-T(W(4?Fx-uHBV{{Y{9`!l=cduQQ0EGz$3ToFF7 z|JGj--cHG1fO%gTxZYyC;zuC5>lNV^`q#Oxm9rw;;ikx<-~!*8?_d{OT_co(lowxu zOg4A0soky!e~eAGiacjU_$iA$d`0*!o9wO#zeFn}dqsHnW|11D-CGgfU`vzeO}itz4=X6vp9KhQ6HMR+Or(W4dN$;b#w{~K3?HyoV54pvGV zO}DrkdAE2)_>$+1Y?+xy`*ZkK>*^{PJdkT|5XHsz`@UiaF?UYg{Yq|uSd9KP+hZ|+ z<*sU#(@cnS{IgXY$rz5O?n>@Y5VNT(xj*4jh+WA&306|8qL8`5#or-P>|j}rWl-#I z$g`B&cp!J82G?>A!m&bcE%z=Tp}gBUu$KE0JzA+~8}v+pn*L&F*#+Y^)1(&=3l?)_ zi^Y45vYN|P%Qhdu4;~b@n)@5XvKo7ZSHmLMaDZI8Ef}7m0$`Q-XA*pG?>YOSbY`Sf z#9hp`MIS>^dMz+^qfG)N?IFm~aK(Lhgl~+{=pJl+0^)BR$gFwCy$$}B-zH+)U^ zSGM(oi=+=QIu&)u%SV$h(>+_~lqV@5Xbr00~*k#=-Fv|&D*6mb(rq4nh3R^q31Dr?;JkSB^FGGxo zN?>oql*?)0+GSnq-3nigy%YCq14M8&_7`5H=a;+2i}d_*uOc$kFSii3h2Q9PS7U#f zlK{CC%SQFeo-gO5Zb7>m`w3N$mm_2~_MKyp!?zk+5cG;UOmc+K>wILakko z4YjsemAw~d;@wr*9vob&aA1{i$Tj1xb2F&swBns&TK&A+qqO)H318SG&4@pfaI1}L zkLIP#%e|G?Y9~J?;=%RV+Mch~UIS&u%IqYS=@*@k-nxJc|IV{uS&}D50&BGw$d(_? za)4yf#nf-H3y3CK$kI(z_i@@{vwFL>n5@>G%#2AME6iT4O`?o%wf1TGbXRMCDiHIp z*8V{HV9si7(NBR+7jesh7R1TCI-|M0)mjP#tSxx3+?4JcT zCkkA6FDKW}KvZDCc99I7+Ctxb20aM5n_UNYWnjTpTK)W|;fl;&uraa zhBI;!P>)LyY3i{p>XGFW53>v}UkAfx zv|?l3QkN3HR5))N>2=GTq;pfe$VsH%sDgXoO^Qv`v3m@d?feGnR(}( zciwH@d1sC>IkKn6uQJB%*zR*SCC@jGBU(7Cxp!>OILc`btvlLjE{t)TYA)Et?bzN$1pI-N1p^7~*luUdr;eL^ym!!4?TU#L zV&*8{9ozr>hT|xl@IT{k?vPNP+C@tt8m_;o+}R`-ZGo@Zm-T8kTiDlk1V3Pjb_DNy zioXl{`QV=xpET`l9R(k_vmeO%!1tJMT_RnK4Z66*>f#X9#bfxYgYuY9)?F-MGj{}4 zi=jMarE!Vd#X+izRek(XY-M$kc~VAklHbJ|@k!I(adBOosJqziK!;FoEtXMS8+7p) zTWdm1lP-K#T&Eq|i8L2E*#0x?y~EUtPmzXM*|m!ebFiz~u|0>T(QxA0?bv?Luwbpq z!iQG9XsOsG+adk{&V800+l!X?mTJdmEQi=9@87qG-?3fwM2xTe0Sm*v@{24C@7Ol8 zFveHTwqsl34)TTo?MY9=!0sX(-Xd}?62p1VWEs8$oUG#^mOA7sa}bknMMw3B zOck_GV0;Q5@B%(nFDifa19E;ftOSFxJVZ*al2(iZ6qK*xH+wOc>0|?++c#DK8c^7X z!X_zv8~*|T9C81G9AMT8j3l464L{@x%p|_FLPj>V)XJb2mOacsK+hPTJ2*YVnajcUjH z5vqG*f>UG^8B7%-=-`g_C8{805fgnQWGDe|pTNyv0OI+U53`zk{G1}WJO2<14^F8K zuTil-ihNE7xE77&&#abIMs`au7lW71sKx~K`(SQx@UrU67EVwK6I5S3a}P{rWP-kU zJUl_UtcG)6t-0ACU#s!regEHBjZZ)a&LBpP$;G)9hUX~T>UgUm@5U&$t;P!F2BZ_^ zkKEw~n=lejunFb(6A?%$B}HGtMU=D&-+y7-ga&03JQUhCp~0~UN{v(}8?a)dss}0s z9Vb8)i{3Z4J}K)%g{jJY`B0Z*Df1we7om!bpci9ry|DyF=ZWD(_)%6Axh6_RF!?IT z`*g~C`y8d^r-#i16=|a~6HtoM%9x2puo4a0Tw>m?(}U)sunvXwQix0Z$su+AB~}_k zo)`yq{gNsCC?kr(r1e2PQeSjJ1qHQVP?8RMd}=UX`8z^Fs|N z?YE8569_WlQkXtyc}Nj7tM0NjKt~801u#AqfHuZZV6X`Ck!cQqhNP}|<|nilq-ihS ze1!jp3Q>z^KBWwaf1O-I@uh!>GbBem8rDC+&=M00m`pjtwz^9*j)27@r3ac!=c^3%>TjbP42%;Ej^} zYY2cIq=R6cwngMIGwua$JI!NN7&DBLI2`mPI8VhhH^RRWyEOLU@O)?YcON>*)^OSD zT`?hRJ#fa|m?}FK=fJ^x?)O_u8UMAIKP-3xKYcoC@-fi5#-;|RRNUs=sz@jZ>W@Cr z+_nufE@YRP5^CSH{DykfS)QiOaWJQgH2__D5Q_{}S#9LZR>1L~cM8isp?+qT1YAsW zB8_qEZZ7TP2gS#?C@B5pE(L-ky7_}amfSKeq#{15i@@975{PLS%sX_&4$Y ztN0CLzyYXRUKkZFp*;WjLbcY%^B_Kt4W3Itu?#@tdTMxdB90#}uxdx%K7+R%dzqD; z3Ox(ZfmrXdchl)F`K*H5U*zUfVAKMx%f(mBY|r%`NiR-}*ykK!INamYP5X)6ypMrj zD*Ot@CgXS*d6zI>weTh;UCjdwnEXm?^zV%dgP-A zK|je=aJ;1&Wi9?uA{HYX0q0`g^KRfvUGXofA{&>Rvb|xW;Yt2i0C3ajJ+DlP6ztzr zM3kAcn<5DO0&qLFH;kq`TRlRLLDT7ohx9XfXsXX}Gaf{+=YXb&cGR&1jJk05b|vAt zz5{RzqIX%ju0|+`NiPcGMJn@0%7pRc5YeTK0ct*6jZJk2qQ=P4c|K=hV!>FB+MKLV zGO;3u&$D6Fe9ztLzw+Ywm_h1@5Q@LGP<%|G==ac54EM=_A!g}-O@9oUek;2t4Em%! z+~%}yG+hB;m=rT&V;PieiCD-@S&$>y{#?m@9V0FLtF`Q`hsl4!>`y85luTGvP712* zN|Kutxbqb}$!~^1l5Xx`1q9mz1k9UNy@M1(iWZHVu2zn}rrKNqz}aqNpa}6CUL~!7 z-^6!S>UtA@086N`ha^od9G5xbVYiA+*h=V?W8I0q=C^RL6KL=oID zrGoe#W3$(i(d#gGAP{B3_LvWi^6@>g)&x1j!I~1^lc=$7!<6R25QF)XQ{%MsrB_7< zgqzRC$+9>Np~~vXNYfK$G3c9f4}4I+Z#7BV=4Y zG%Yp%^N9w)OQ8^DCjjwQJ7q<}RXRb6gS9VmM6IzIeFM2wo+zr~ciOvB!OSS6%1rT8 z77Hqw@?D^ms3N5PI4s*J-zqyAMK70EFDIY@=rH&u_Fx0nM-^;I`eg!C(O6KujJ%W!%0V3PnR#{sv2^D^}#&Lror(HN0~ zd4^wK_kZ*oy)d7P7HmoVUR!v(JTimv1NoKqp1U3TNFS?d=eG+nux15ZW^ZzDG6Zft z!dmOg;<0q}5a3{MwPMklwKceN^*7985?>XSuvLMIa48d`*kn|FOp|j|lTr1kK;CIK zE0$Dut0V#g=yELaB^8VvsXQ>sNF(P#X7Fer&3OaDquAgGemQLt5K@UgV22)b3U)y^ zqbt~oz!+E>Bg4csa-Y5RMe*2i*qG=y4nuV)D4{D*kf$AZ`w*ka*ubc$HaQTU z5co84`ZHn11Zk-5?N|tMIe4FhDwR19(%buQMh+Z3*Bc=hO9#Z(>EqNf>zEcu2{|)G zcAbB)5sMax#UK_P`2p#rzJjsozm-@}cp(g<Y`58f(bk-__dj91J^A(p8<=0`Zc>v(@uZY@;1%jpy^i&2wjTBlx|A&qanUkbZZ-id z)LlXhZ@CH>+9xI250WW1CnYLTS3sa{2CGe~T;^xgYybo?&c$%uD)ILjj(5$=QnjXR zfd5kYZA+ykR%L*4lMe*~XrK(zP|6h)<6!>L!rs%^AH%33;7qQQfu^t}L$+;$sMHi5 z{dO<8CdM08tH=OEU?w<0LdGv~DTJJ*!A6jtwypzZz{-8Byu!GSQ4ST`!BtHK{-;%x zWzy$h*lhX})qD*(6jlzmRLs7)FNqkG7v2rcS=H66_*z)t;#n_=I#jRydx;mW5=B=4 z#@=YRw>Uz4j`D9Q@kUwJ-;^bJf8^`~f-VO6Fg6;Eeto4~?w9wMa_X=KA@FkKum35mzBnmgg8QI0k~fP81V)bFmFn{PFS7eSp_0@VLJsh`6oF{Z??Y1kQH+ECD9x zSja>$Im(urzQ+D9W_oCpX>@I*+L;V2b8o;eK>|2RVAsq9?JUA46Vx0`kU$G2=%5(j zmq&n~s(}~o(iTk79halWs${EgmsY%uf+5LPJw+=xMO8`JAoT_CW}b>4l5Ej+CbNz{ zn%Dj@NC_oUSb|PSA>JXJA(8Rd(#^P$fs}r|#^|PpsGA-F zr#4O5M1Csp;`+jK)oWQF$yIk)YuU;gtJ93`;`B(The)SjAUR!V_-{9qqQgGuk3&1e zPpgm{VNnbBuf8QzQ#ZmE&;AY+>F8V6(W@@xIftzs(=~)lOod1h(nTjIKLeQ!+9G8x z*x39ko^>rK$icsj`>9w1S2@#Et)643^r27ZqeBY&)Gkt#gR|B6NGVNwlP*&b01ilv zsrV4E<&s#&7cRj|Ltw!&wOq!lHU0JeK<&l(#BO}wiwMJ4qhjO_;Zb^RUL| z8aT7!ds30(%M<}gPWf7qWX4>>F5HQG0*fas1Vq=~50^su+{iTnqm9Bp{YG7jU*l+I z#(|+7i2VSO)lj2fg0*1m`;BJK5h6`m>tE9*%wn|uCtzRtGp;3SZ8@`9iBd)v9bYj ztiLz~9-4hF-R0_s8H0>0p4Db>O<7UiQU~eXsP<*qe}N?TV}h9iQaf^_`B_s|t|wrN zFWEOf=|&`sDgFvH0*BYK?91Zgp&Z3q649L=z$nE|_*{^DE=Z1GYqGBWD$z~4yE-O6 z$ZIv%jh{-G0uCu`C9veWRL(XV^afd#FGOYXX|RL5>bF{6p;ovD&*eJ29y7RbZ~RgR z6&b712c|~jHhV1+ylRuvHMbvtk*YArjnrNZqF_t7K87F2ISxz?Bk?vKVKcrhC zkhXLOCs{4PcQ!VXAU1}e(-lGM^xPc>Fc_I+>Yy^TYhoT7;5R-PP?emEy>&^5RPDLK z8j_q_Jaa6)7!9>P8l9Oc zO8tyZQPR40zfwSunrJbRsv7x;Rm?f?M^BO<6>cLy4GO^}Bl$>))Qs{A0H&N2z7At; z(qpT+gn~M4;zvTgCdlgdj;3X7a!$51X zd6`xp{fJnW{jP;tnz6J2(-*owUB@^OOR+*0A)}H8@$JZY5Es!B!ibd99Gs(+zOA)X z)H6fuR{{|wTq>BwtrYplb=pJ3QhgB|)(3W@H^<^!RP>i?LKhXmYf?MFkz3IDsk|Rb)go(P{5rRn*A1!Gft6=z_-6!TofMFFWqLL~*B| z0L4G8+3rzdwBwq+T|jZDf{db`WDAue?5{L!qHy^0vWJY&w91-HX~7r+W#UdUr$YvC zHR2`#M11!Z&lr%(^8n(7Uq45fYGR(&5iURKD&r3L{u9R)@j&`F zck$~Ig7mtYAVK&>lhI zL>X1@MlH|kAj@UfD5l!z5mPdI21;1Dyk<=Fu4JE#z0|BFTT z>T$(YO1fbtm`v)eE65eJ>?u9)t;>v_aE!3NSZ@uwhzzj_`ctT>huBm+b1$kCiVKzm zoERtVe5)%B(>QWW0nMcom!0V7#GLZe&MsW}DZ&cZ$WQN-K;M8eEI zC$vBUXb{KDht6HaG4&S-2kgd2CvJ87sI)gpXIgJshUR&K<$^LHe`93_a5q{XMc!)y*}u^R(=MxN22y^LGAmc zwugUvQ6<#Q=Fgz^RMegt)IL~n6BKc7e%M09r`hH$wgDYl@r{fT`my%9lE4=x~R>!#*_HaX|v0uODSx*lzcdwQ(@Mm+ww#&13^yd!d+GCn!;&IU_$6D zi9`H`_eU_9D2MXu*`0*rHk^fqyi>p}T_E7Xos5=Jc-@61rjx+&-geKRpRQ;>*Ixy; z&Nq|0#=dm!=d)D$~C7Ty@tJW2|~)3tpa;~!}Cp4U(%eAL2u(SoQPhV#&} z&I}CWnZt^vL)=s_Qy!HN;G5M2TW^=wb|)c^ zB4*qH$;*(WUxCyCtP@2T(%z@Q#5vij%b%IymK#(HWbXmiBkkP=fZlkLsAjfMV8&8v zI=SZG+N1q3wBVP`z7|{`W9mi=wn%N!f^QI8T7t}^x6>3w5WYvO`gW5wFr&r7w zrv;xI-BT^th86&5wBSGGvAa2b6#-^n3o2C~qXqvxM(Hubf}#Z%V~#`O-+ut>g*pDw zomK0a!t-Q_>77A)&2 zyganvp^!8)gpd|IeYU6rkx5$%esoq=Ew~@FL;1Dy0MHvv62)mje@SDd z9wOkCT-h-UVW?3n@mt~sT~w%T*wALFhtdRoRN!@@aMQ=RhdEll1GBQcmWc{!ubO+` zwMbr&XOZUpP=pUbHr9o*7wBDMC5`w$PM4Hdw~W9}L-li9`*5kyQ4SDzjnf!tk7STq zt`?Q0eG;J{Y{2m*Bs9c#tWg8W7P|g=f`WSUE%&IAlce4WI*lj-I=9lSxh{V*jG7hf zf%G$$VZ8q)Cf}Nt}lId6bdG2iS?4II+NqzZ|1_(9Fb6e_bT7zbCPV)x4pS6 zmUkPJSAU`X@_h-PjnW*LYM)lAv8uQ%q00rk$@@9j?HORVo9bO^?e$C6Vz!~etZ837 zb4Q$+p~bTns*a@UC^nPf%Hy|Y&mAW+r16`i$#kj2sZj71>_GU8vS6TcLI{5WMphd0 z`BL8WfDF3_jleA+9U=1%4=ExgOZ9~VAML#`Co*1ypmJu~47OA>eNej3^EN0(lYH%ZZ zbvjpi?a#@~Mjrxc!S!3E`g=){xNeukIIBfXBtPsJ386z#+Pm>+Q6JD8{fs2yOW>*y z8e|N2V-pp~0#v%>L(}d+R53!mr~G#G%6s@;4Fvf{G){gPL`WHQ7~rawiq=4zYzRQ2 zP53EO@!R_%MbXwK9|LZnO`7GaI7*w`E5FScM4OCNNW^Fppiv4me4;=+y--Tm)I%i? z+|tEmVZ@QI&_yBbn4sE&qByqce?|$BNx3?r2(+zu0aXy2VoXJFOM>4(93k-wsE{-j zAO=$5NZcGo>hUFyJ9PCzYrIT*Benn|3`urL4ol@Ms%~EoMhB**`PTZV?D&(MWD$oZ7h{(B?07J|=6Ix1z(uR<4feX;LaJV6|nT4m+JHD>~p~tl3 zoJdfRY!W}sA|LKV-L{!EQN^?W1fvtSvks-XC(sJ`9>c*GJSg!+>b(4qUox(W?UC^q zhaBPi|II1R+lRsN15OB>3?dI-8$3guLTa5;oZHN>YDeA{;BD+F&IuRz%}UtGC_XEP zYghPW5jIMQ3ecN6eQ`1>BuUQu=8?JIFXimIlIXPW?56$g-Mo*1UusmC+Dww*H?**r zQS4zQ!lyWk?L1Vit`z&2664+B6NF-bND9O;+qe`*{3*@e5s?# z?>(=<)?&j|mz{PVhU1>%tfvLnuP5R)^oqTy5Iw~?2XG^&ICm#tjzM$s$uo54V7T4~ z`waK^`S9?kOo?z^unSu_alVpp`|McMKqB`90s@WbYu)C}`7Hp>B2*l#B-G@4-u*|C zSP&!%nbOXEe;kVihxI#c7Z+>)RY~%7~xk3 zqNYc7e+7f;RKUdKEC(wazE60T z3~j>HSx;mhBmn4-gBL?5GRHp)8K?@K$lR0I{YWP=EAI`R$ovxuf;(s=2OiS>lby&s z%bx-NMCRW(%|@N@eMp@|_qC275WW7dn@GdwY*0H14usT+(!W1IllJ+L>h`-Kmee5=d zj{K8d&*AJAIjOd==pX!*_BtnFT_{coOD0FNKo5|e%Rg%%D z8S{l_Bsr9uiJ_=9$^i?fxlN(hN^=Tb|Y|ML?gZ%?^aIy;>1t+`e85WZT z$!!$|=^CCN3!m&t^{7*mP|H>X7M$#Af!b?CDJDeJ-T`SvvwG7#YGc8N)D5#spW?BF zbH<~Z+p;%WvNGI4l{eRhAIO{2X$3OlA0RlwyaJsSKLT;U5H}Zkcb^rp7Fsh>9dvi1 zYbW3xqqP;Mc9I(=nUMkiE@lwfzEof}%Swf1Bur_=f5_K^!PjsrbmRvh=TD&uRRI8P zt-BuJNYz=ak;1u)79e^Jzo78hzZ*tg9~bu!rJc_ZMs6h|cbo^jS}`M_v&_iuxPugQ zg%(005Azgo9w+Ht@N@s?xtpQ3Cy09Q{8@!@mvpROUbFRkcL6@v>ndToRrCAkr&ah> zj%1xM4v6a04d@a%#Fe5>&FO|oa5n`8UR4aDI^g1NKya9b z0Lq~7k*qc$#>p1?Z5sU>;h_@Fw#UmbxN#>3TcN#b3ctFO3q+MqlJYJ-TayDch5GYp zx_mJwtOVnh^9eHUkI$8HtMdt!b9#C*>wK`4rq1Z}SI+cfC8`F^pQo7=`x8T6AZUv~^AEHYyllbkC&9RYhl z1nivxmdGhSrwW>dE|d)Hk@U{llu$q$>Q$^q@ zQ)&sURZ-UkL!A}5q%#UPq zf!Jwp?tLg2l5EoR)6V(v6WX+MQS?`laASQcS;rg<{{(ad=M+AHUdWXxylEkY@mJ~P zaTdOkMA)Gm6&AYVi zV_9Z(61ICS04IdfY87820Hb1llsY!XDRV)w|Fd}3&5Fo8rNfh1tSmF?Ju|`IeT1`V zD1KbX5;iWi{Jx7$BClNr1VRz?pmJI zQ>&JQ{&bC6mQ6>+sp68BmBR0%a-0jn%i|Q$$qQu0MQLGOm-`gazNk#B0iT>5R&ikn4*5T zZqxiBjgCNi4M9!|4>?0a#(a+I>S$_zP|BRM5{qRWl=gTNB&Cy{Pm>ZrF?9b3y{B#vhw3>pjjZmUA3*`84_}v3 zox)0r^d2q2H)*2n=CX|)_BVGG>(dnX0}}YmJunh;nqshsKqA>djA6P*@i>KliPVeZ z#L+{Za@b}a4n!a-16jZyM2b1)pPL1H}A+Uk$1vdH7Ei~ z^FVJpDAoXDPsisN$gqdIV}h?O68@@j3l6!Poi(aMi{_uC(IvXT&>3Xeg4)L$`h zW1!RC19-}jA2op3EXwqW&5ydBB-G^lo#5A9e$<;hPXut`{HT8#NQi{0{4t9@Mbbx> z{HQ_DaiT|fXDxL}reh>zPBh50;i5sHJo;ftpoMgzDiqVgC<1TlQ|g4WD(!xSDyI5o z^4rOeS~5)KN1?I3;ttehbU9LuOetTrtU!B)d|?G>R7AC0P!m!ui&!a8Em!bStCpGa z+fglpP!z9P;5n4qB%<{QWlMc~{&(EhHR=W}%6wl#GDs`<<()2yayVP+X)WK(mI677 zKpv;4edaXME-m|VN_%MsjFC{VU}dZAA*o9;L9(>>@&(_C z713EIjR1h|phqfjO}I%BeHo>75KOr_{0@0=q8ZVhr^Lxs84Zy1wNqK?bJLv9|$m? zk2R8CG53)PMg$`@N3pTDSfe^`QSzKSBTZ^q~KLAC-0dF|;R}Y;iD* z3|0^zZsC44T+B^sEk3Rl6duKkz{Kx;=O9&w?lfmY?xbY&=vusRrzXRx`49~=;i=g_ zK&{S~TqD;e!y(WB+hWu?G{Ecf+J_Tx9<)dgG{Acfn0z$AvMG)RNC7}p1GJ;m*8mIU zp&JcQPdG{g9Cb7_z=k8&LIXSiAeIK$0jLHVppiY~uK_-Sh1MEiC4T0q0hFvqG^mnw zdRDMBD(P4K*3_!CeC%4 zbutD)$f}(oNn7GPXV(d@Qj#3ao)AlZb0Yx!(KB z-7bXBi>PrQekA-=y;9$vV!cvcHLbJY+%04v#xGY#Pdc&;UzDelRQaW@|^$$qnPIc5%uIVHA8Sw<| zB`N8`&9;H;zKgRBvp21);M~1{kqm#Ad1lg3Q$ngByL9|3z7YVx$Nl1ptbCVF2j|TN z=i#sYL2TR8;ZnV7;Z#Js!I_Wul{uMPt~e2Y(O}b zg3?uR=oDYbcR`b&UfTPQfFMt{=%Bxp$i17`MU=PTvH*(J_Ab9|vu^t}O4|Qr4eZdr zabS=D1z?~O6B#Du6lo;D;R}I-wD0QSC{tAZIU1@J3`U3DZH>@ArprnkTz_AGNTx-0 zV|>!3U=$r1=(b%_jYGxUArPsi_7FnUQ~NP?6xy#4E>Hv~GPRqnuJjefhBV35$p(Yw z8Ema4pUXUuRDzaY0uYKD)kNaM*Q)qQ)w&7AO?X{zplrjCqL@kROQB8WwFmU}*-_CC zbN)0(p+8q^+P`}v+w)*P5J-E)GSES)bB-6C$*J!R6t?I$m{0lStD^Z0024#=6bB<} zt6pd>TSMG`vxo3UL4oXr`4VZyU(^us8OfLOhPnN6jvjx5bM#u%q0Bl*f7~~IBj67n zBxK|S2v;W?WRiuS@u^zXFE>k=I;iv-$!`)Uq=HmjOeUr>33 zz{czA>q$odt7tSNvOeRBITKB<=ZMmZl1@FwGtjnUI|FHi4~dfu{DltXELGzG2UVEj zGrOQ@zZzyxTjJFZ_Z4jgFs?%z=Z?ItgNgde>7lzrwf?o$ppLDD_F>1$j7Il$8vxhx zb&OvXb&U200M`R66+c3IVD-D{wIw*D(+vypGK=I&4v4!ODX(SV8g%LV6*{ch#o$0E zYT<|aCX=Th5WJSpyN%~(c@d~i6mCD2v8n;@W1}X+EpYw=zz>0*c+Gubbx(SyIrbqt z_90)FKhZNf`Beac zURMb^@LTRItj(=kY4-xxsywy*))a}~r9>^i;f-W9XHOY`984R+m<~cW5E(cAO>V+b zG`LX(9Xmi6i3ci)%9{$_##BT2MkAykTQzVP+C2+7i0p{#b)S&$*mfErw@Kpg6B$$i-*c*DKE|ywJi|!fQlG9M+b^k zW&rNlFL7%t4yBWZH9%iZ?#uNmU)3bP;swIqwgWJ>^5R`V&t#Y1qziQ!hCW_Z7WZcA zRtgS{8-i@00FLuda~#;Y$uEl^Nq#At@Wr!hm9a$EWhEFcoFxB?x2ur=r_qsUH@~ld z`(I#;@O52uJB}gnac#Oo)mqKPVyh)SoRh(vOhDs)6I39#rYwQ3GJ4{kx?UzuDwHB6 z*OEr-JKb|Fcgt2VYD;7~+4zdr^~SokRrqcMOLSuHYm;b17cDr21FkJR@GL&^aM}6t zEA3q~n9QIo*dYQ+3}ij&&5Lzg@NzCB8i7OHL#t<_8HKEo;v}a0scFWSC}dWy1-D&` zSxez>J^liS#twWYoyjVMaEqu+{&fxoXOBh2m)@i%rXCa6e9-{l`3pUO8EOC*$s-5w zqWnsGuk42bq>~MJU(mtnXh5eaP324AOe054&Ntxu*?{>j`fmnGjUC&gZljNwNXD

    @}HcY_uWk49ht9 z!sew6Xt(B=T;4%Lh=HB!qGb~|--Ys$s08o{_~m3Vu?+H@ep8-3=#@?&4w075Iu9m= z+zp|nU@u1pl!~UNZDXuWl$rD8r`f|C8~0OZ;ao4e+t0#zx|*(txLQ}>4T$O}5j=xL zU}q5JQnr+(W&AoaHVfzXE5#MbHw&kWp|K!GXy*XCJyq}E^R#zRC6N}%63hnhU3?bK znY_Lvj$;4mO5a;R+zU(O($~*ifo{Lt|ES!G8K>5!y`Z~ehpV5y%LMsdBj05=S-%`{Mk3kkrA({qRI5*%a zM;1=YIlu-Xz1S?AY9hf=VS4_G7+d$Z6rHcZg|l$ThFR%TByVzL;dr#RQK{yxZwbxV zYXFeJS#_G*+qb1f8k2ktFOq!0TBWpK)Y+!irl^I_ZK5KN%F5R^#n*hz+%QzIofx*f zwu|rFC%S*)hx!8V6h%(_Og)?MTJBv#+1^4XfM}=;+>`!|=_H_q@gS{;cVaeMP(HgTm;92RlFfTmmt9=pTk8hPpT&1rrtQGied;0> zq11S5WChaVuy-V#M1O*oR2rqJG-(f^lGM6$H^~81wTfpwqs*qfI%|IbPdDM-{(AZPE?{Nqc?X#ar2Ouqo2qB!fseE>K8n2hnlvjUpgIRYJ>u6fHc%|Y3W>$AZuhEHbA^aNyww` zJD8ZnYPidXu2=)-l?XhDB}ZY> z-m}|?EBFd-%ZIY-H)@u7QKw$;GqE`9c=2*V#AH{@G750bR!RY~RCu9cE_vm03}P;s z*v=Eb1A;>`yX#`Elb|-Dt3Vn^OxYYdT9!X{o_Y@ZW0f)f*gojco+Me5W%K*`AsQ$Y zqK|&^MEJWvwMFik#zKIngV-hhhcu}vyiU5Lr|6Dz;qL4&xJQ%X!+3N>>j(te?QyG5ptOOiln-M~dvieQN+__UB&+q8 zB4tf+Z7!D?+-(Ekw09rg(NEKlbMY8t$GncGjst=aqS#}^voM)L?kB*v=B1omgdbonB4+Ild zf9j;wJb@Hmw$NHXdV=z4I!PG~WH5m+F(M?e8xC}s(n?qsRod}u0O*og#eqC!y%G%i zg${xI1#k6`P+LacA4M3_Q)r~pS5lN5O92M%36m_fPq6wEEIH+-&}S4Ey2<^ zr+*1CL}LY?xIGK1fNY1DvYn>KGLe^0{;aj96(`6k!Ki zuW){&I`o3Q&4oLNL#SW{dz*DH{;I+kkHuN=c?|D5hRghc71)OW=usZkvskm*m}#XdK(l#jP92)E&T=PH zD?X1(`$o)PLx=YKJF@j;2q7cJQBJyDmfOxENZT39$mCuJQgO^77>H1?QjrojZ>g1) zqz3NH=ubyW6t}auDBnJ0KiqL`Vy(95$#Ug4NsiQ}y#E%Pm&!KV)Dh{R7a-abX1oLs z<7gweP>k*re)C5L$|F04m+jbtok9omzPT{JW#jCaJ5XMO=M&W|YFySX;jIZSxv?_G z_{7@ONdfNhhO?u;ikQ`b(M_HgPmLi-fpE5Q+zS6SR;?RSddKh!yx~+RmndSs1{rg0 z`{ucJ2bbf*Hszd+<~kXkp1D&JeD?kTs_Mw@;CD&!F}_qmG8+#N#JP#@ z;^vUrxjPweVwS*AnrcI4EL+N!Q~b_dYzFATuZfY(cjxW}IzPeA-GkiSQP>r#-cuB( z1t+jL*tuJ+T&B41i_95n07}bU{%C6y$CHj-)fq4Y{mK#lYO>6YF&$wJ9qOYJ3DuGFDEtp8J)AOvvYUp{?5+bKs*LJ zceNOJuygkko^tHm9ZGDFtQfmaK09~+8>hg9ckZ4xkmBf5Bz?s0+(msx zlvqIpv$zBO-6)ep=_C$rB6Jy|pf|Vv!r$(G*Qzu9{jNhtPz$BK+cy*4!-czZp~>o! zutqRwz@ahu3pV`8_4HYWp`M_bXj1q>f zUvj$be<`ZZ1vu1^73F6w#szh+(8BJ6+$trNo(olKB49*UN2M@fO&ZcpxCdNer69Gk z5(27{^4zK`eX)~q8daqRR%!&42GX?GdI|(LIi;YrP{RZmIaT(&cvC!DHXE-%34ZZ{ z7de6)E&N9<48k1o@#cE#A{-TPR%28RjIARx*p96Sbvl*$z?>yQJYE8_E9TOE^9x+y z1~I^e@(7;pE(S%~jUpU`4)`*3SmlLHBaRxk@#vlId1}Jp<&`<`Wvo?xr zmN?s!IFbfC0P$f6EA3s)8$M(g14Tic?H&293vT8)ScSszMUH;HxVFL^gIr>YOD2A^ z#_PXD5NBJ6-#X4VIWI|uM5n#sCbdkhTlSX6P@L^z!6}qXR4T-ckF!0F29}!;r$(gn zg_4`%FPi=(kD<=*>Av%7<`{CP*vT@=prNg00)7NP7@o!Euf?-Ol=BE%TbYU|0A+9A z_Hjln+?Oqn$XJF@i%G$kc5z8T+Ivo31a^8-0XREYih&1&xlRCwBUHWgUTbSTqfcc-P-$Llh8UYA(KzZ zs!9QN+S>swot1V_L%+=xf7ukREq=i)5aBM&LMNn&A_J~Zdyfw0xp2_MndkqK&_KoN zo^3@D_%w*<_~`7;Wfzahb`&|Xj*m&{ksMhc+&$5(X0{on&8*aju&SCaRFX;kR@F#} zD&Umi%k{&aNzU&DHo+`Y+AG)`_0!%$X%2f(J8C{IxxioU0E>)YF7}naI!T%-xQMt!BI zQy<6+@zNl2H<%@Z))|s?@(({Kn+k!GTw?r#SeE2#@E5MXkem*5BY#Ks)kOVbF9GT#RnF`J}<|0Guy z4|o%aR%lKv36FnyMaSsp@jo>H3RM0D{z^w7&nXZT-P4pF_H;aYI=rSnagO#DXIo$kBYDx%{WAw$7;qRwZewz#AwF7@iIm;cExMPh52a4*7YNr@kMIJ zdd$Dkj0cdxlxF-KKfQZ@ZWzwjgKMc7SMWO)@tW}?^(u#EY!jzcrxo3cE9pd|sZ1~x z-8A7;m76BtIa7Wr)(BKehBjjSz3Ce->*^krWc&j4c9jJ4yDv8MDGx)4=rx(aDbC0}N(Y3)bW+PO$jF3Y?D zR5zr%u~%Yv55mNUERZ9!dxhWYSzo8qrJ)mNlj`_;CI8|ho+a{PXtJ~N9s5&|d31M1sJj@P4dwjo zG`Jl4AblSz8_ThO*l*ye{Lgv`ceD`Kd&O_mQNFlS`AAs}EZznjnR6 z`otn%r*Hi;|6sl^1WIgxm-wEZOvXTTzo?7zjn$EJE`Jq1e4wTcHAUHg@G>8t@eNlw zG8ZH5Om5#>h~rQ~bH3CU#6IFUcDLRE$KqT(kjc%lA>cL(f5Rn?!@{x-%bSI3eOk1H zSompK&uJFE&}HEV_VZcz1+~Tsv+x~?vq4ErE_iN7>4#outD7(Y%8}r;8}`Ouh!2t@ zMdu$T-K)mlF{Dv8c9vy&R(7s_xqQ(#eaaWybGQ1hym&rB1JP?Ip1`H&f~*LM#ox$s zvah1i`1;ZJBE>7Ys#yGW?Np72#b0sN)+~0DPY~j+1TOyImQf=H}!;_kKYy&|%yROY&yiOZ_o~8Mm|_r7K?d zezT9yxHqsn27-+GQM&hR#m_$DZsYfpL-*d7V3&$nKlua6kd0Z(4O>eDB2V2r>tUG{ z43rAo;!U9BpRBMHEO;^x-8*Y_EH7?>&b)HyWutpnQb#L)`qn-@p{7SglhzgcPxT{rsG0T-8ID=qWeKBp zRPVT`R#Mb9#8Wfh|NUFdg!sJ$>jr^~B6)S~ zxSiZ4k0dBMFuBbQ(GI$oM^24P%2Gkg2wMC`$-mJmpfISzM$woUOhAx-K3QlSjfXWu ztO8h33RtARMuzQ^dX_xKkoxzC@P%cB+BBj!?WL%$5H3=TXKVDlM!OGji;4a{_l-T; ztdygh>16MJC_{=;?}9jZGEzpZS9T1>4B!!8SruX}su{HsB^_8qn1g8_W3|MqhO2QC zjIR3zJ5xta&{jllHi{5hyw zS~(KUTd2tG?H6P>GI>lc3qc!bQTMWtHVB4<aIRX5WN_&N0iRGP6K0ZxAAv%l*u}L5V?c#F{S>wmLjihuBlWTaF zn)%>1k{$H`X7ELA;itQp0UWFcaOjs9K(<`N;vBh#gD_W(yCOJXs@3AO!HOWN5anXV+74m!f$j_Bu$UOf-s9&Eo@$ks3 ziHCC!4$u2|HSbvy4+lRHlX!TY%)jgNM7?9Jz;%*_`vG9I%~^20CXoSyBv(?rBt zfRT_Ix*$b4V|@_Qtl1ok_W*NL(*vS3r@gb~gA}mg40&>YSNVdw?JI`E%I28!nb5xt zHCwHP_?C@W{QT~JtNg{!XZWobKevC)CNb$3-Pq_A`$*@V=*l@WuqpW0)#|Q0q`j0D zHW#nh;|L#<$B>uuh;-r3Wj2c%v4V$X!S7tKXn>!#s$F95qpO8~0Ep%CL_H2Yn%f0^ z-`luO9z&zKS`dmMbkKRc2bD%c2jfAob8R6TSB`sni5i8;lHmd6vNep$*=rqs4`%yM#PU6pF*NT6dy0Xqpg|oy@zaNU3#Huj`nS zhUs$hYwq96;Uo@tA_m-u0XJYhULPHFBQ_gO+M!p$lL+2Ih2ReB8wnT-?;0d6a^Z&+ zx%`BGrY>&ZfFRfyaM68%TwUTPQ4ZUjuLhwwHjf?;v?IOt5dlB{Mc z@P;8#w17JU1hz99UpO_K_!e3?&t`oP)i?d|0ar`kkV^(r z2~uXc*&pE&TpGYoWN_6$2RdhSl&`6lGptzQY_s72p43P zO`)yZ1c;4R)c9%dNI-Gyr+TYa_=Mf5yB;bPZHyf_XSi?zeg}*MIs^5vG+m6PsT-wn zX8t??sRIv%XEx}G8Z7Od5W*$s4c)Le49(7W*5pMgX0e(9brYR))a|dMV*scC-`Foy zDHeM1UVeUXDY}-q*$j{@7G4jJ!TAZwtD4p}P20gNF(0q--RSHRe+24V5|7~p6asnp zMQ6MY=E}^sm2r_SE7A&>_v%zJja!l zvp?6&lDzllUiVLqw1hU6uP2-=`*UOZ`}=eASj|NEgHX^EAsRHCUfNCa`?1}OP;SKb z(xr0!4wMF5asaVNZp4uUFRx$}^UaNDc~V?=G@v?x&XF+ny5>fFn4!@mmelF~UhyB% znb)`?SfY;jFX|~{+sj+kv%O*{M>jWOTU;e%%#6D=yanITv}iBL);YO2l+gZfaw8tw z9dqfh@Lep)n}r{qWN3joC@Zp@!`XymSU8j$asB2#3t!G^Q5K${I2)8y99bd#^dL84 zJ?UOGPDtZy?7XL8{Mha0d~+j4AbzAd(dBP(#DdTCV5Z3+YndDI)jP5LzU*=Ed-Hz+ zen0+0pWpj^)I)v`u_7iXEC8u9%%o#}oaCTpzHtS>v8s-ZghV*cmH_|^+n0KJH`jh^ zSqeN2-=Zr&%<^gklHQ>{;&-xM!EjRGRCsDZ*8bt@RS$QluLfRz2QI*_BV>o#8NC`6 zR^&lxwg{BtSl_O?!KmEm*w^pHM4zIOHn5w!r*ljecz4FZ6DN={3$NnJ^g#k;*E(|a&-yFvp< z+6Yfs#Z}am49zHOR>{8qeruI~B|{5)YBrI3e%@AH$-V)x0 zc@(=akLq2R_swct?ZUvJkOjx=w1@`!;^hK~!c(^3x9C+*DUc(j>z#uvOyFp)xs+p{ zVz7xriRjH>J7$mqissF_`97iM{z=RXDz)lLUti(&QO{YdQxq$s1#Zw4pG0gN$jYsl z3H%sWhnk~{Vm4!DLH`7+pPuc-9RDkl2Js|+FXjlA=)IV4H=#-J_hPok@>uP~oFKoj zbG}?u-*oa{KLPcBaPPylo0+|sf2#Qp?tK`d2QY&#Y70+Jm;pQ}ztUdwn;1a0y_ofL z?8V@^z3^VlhI6m)SQ^=ld6^Axbw%hJhzo?w{%*`| z#RmOvY@z@KnR&$SCPUfut0~ms}w})ZPG$S9o5p_fW7#vRH?NabHo6# zEY@z!H~$v;D_DW6`}|dF5ZG2^&y4>Bz6>>lFty0V)hrr zkP76H9uts+2P1dbeZMntvcW~-1hj#&u+4idOKa@@BKq0M9w? zor=dG`1AbNxW5}LD4Zx@-~c%VRMXAX6|xjGcineUubtxZH{bfEe^QgMS_Q3iNr(0RCx|(1}vHx z801)ge+fSY&ec|2)#q*L4H6g*hAK(cw12?O5JfM}Dkk(Cqx8lR9Z~*QeQTH-B$91} z(*V5ARkG1})UEGAU9GNKIDL(aw3$_Nv5x^>sr!>Vd2V4NS)tkVW*-wlhI(+Nb1k~s z8bmSj2I!)2%S&%wU96s)d04#TD3mtgZ8LDMSHII94)Fj%%5I$=-ib&rotvCLecJp2 zxgh{e(%!y1U~_@luJUvso^&@&IE-F-C%6S$NxtX&TY!-E$DoBEcBP^NVq37XLB%HE zhkKWPg<`aK4y)g%h|o&8>zJn6q`mi~RM1Zmuj^!h6bGOWBPil$I$wDOz3vbFO2cFr<}n^f8;R|86@Wt%90MD?j&GcCCE*3lR>_t(CuF zuhq6z{+W!!)yn$}im8BlZ-d0M3P<3V_Qr9*sB48$oJ16(|UpY9_p@Xk|Um0hx*9y@8N7GI!wKkG`AN1Faa9i4E+>~-OKq>)NB zpM7%A*n=+2wVbgRQ@Lks{^DT9Ze`tI#;%sf$c#<8CT_+iu<}~Z*o{xG#f&{wx(+ke zgvL2$?1EO30;wRc@^i~(#`2v5ejCRkfpm-F8;!Z6>nIg?bO9=I`6C!yMG1akkzlIcXXs zx~g5}(K~1^Lt}X*9=}-&y@F}Y8GnOlQsH~hdvPC!cI^`{2d!qz!l?cRutKDbAge=nm^R`dwyaC& zXPDDhIuZm{DO3xDfGWs05TuEK4$zT+w#mGMlGLheth5R^LYq8y^(Yn;4ID!lva4#% z`y5He5j!bf$A@Ok*_?OG*sMrRnN8bzF`-m{;pueL=ClRpGyg0loLJX6E{UUih&YVw zIcOgNU=~Fq-aw96@1baFMWy#8S|atB+qAb69)no#ujQp3>ph$$F|pnd$s-8wjCQtk zsQn3HuN=|gebCAprWT+u$)QawI`>x68KHC2Qx1QVWWuhTk%ZzoJ2#XHx5S96;(UC! zOkkJbF+*Z~B9Dl({s?#BM)}-6(*R@!8Dt{EmoFjW5Tv?Kk#`m9`xF)bnS-eJAr}=# z5cB#(Y}J$gVGB#h-ARt$hw9kI)vVpoIV!+8c=tm9w|Msysm>dx>^t|5yG zu!bCntzM*Ss5`^035gZatv{r_^hI=Ic?1dc%>#YH-gz7a93!AsKD%NN=(^ic`~vlq zU4?oPQ@JTiNc|vZexNC0f)@11Nl0U}#$`l;X*!l&)0hUZY;~n=Jlv}Ax8$K4os;g1 zw-$UN`mt_7Ui#6dz(`=)VwQ2?z`8nJ(G1OOm0 zdJX%}r8F4b^TSqL)62f0>z7P#j-i)5`+;83H%>F|=XoV2U6umn;fLgq+vclhmlTgFE;rPS70G zi9)G!q_RJPd{?QVn}N1o2A!Q_l{))@V3qp$OLXHY6Hp*&?*n;^tWpoHid&^V%*xIx zwI??NodtS_t%q$XVq-g(P(`in%|K_PvCALMjCG1~#KcN9qe-+SuqDKvu@_yKYdK>Z zF-VbP#$Ig-X6${=ZZKo7$YW&2uAUJ$V|TFfTF=uv zXlJl`3|@osu;Y&bn#CGMF^Z|cciZKyZzqfew@s?G!p-3>C;{{5%ygsOh0->ti<&q* zi~t&8sJ5&>E{3(O|BdcQG?TlimYNY{@j)JUVML8+IG}UNO?I?bpbJ-*B?5lzwlv0d z4O&we2LJ>(R5@f28!uSoVVN+x2t{pV;LK}G4dCW8@PxOilD0}PC{;uu1RQYzE+BJe zvx|EA8T<0D9ykjRmW~`YO7SysL+4ILaVyt=gA1?*-1#LjC@Erh*WdgPgz<52Agg2% z)zh8_N-Cb0p?n6UM^v{5Y`+b<55BK)**^&v2~|Ou;JjYw?+^2XRO7GlTkjm+L%UYB zbO1IDhm8wpYgBNY`mGsRVnwIU77mR@0XMnN(X0`MK?{uSQJDczfogXYlaTh#c%3`? zy41a?*vN;{kgWW(du71T)V(og`$GhFUG342MSqr1Tl(G_dqi)B)js$q?HzTanHIr$ zG?&2Y(|o@`Cz^pGa&3w2PSS!r*|`8Sgw{yCTIQ`mv85Zkm63RP`q3ok&X?mP=W^mM z!o*oJlJjXW@IW)#vjDQai#opK{70t4ubZFbeDWM8oLlm^YHFS%Ip4H8lGAdtnIe&# zQ_!0uIai|~kercs3L~`wHmZv%5XmV4gK-`qgWeNlHnr#eS1|ZGNzMzB?j4n!Hb}6= zqgf_2u!x-+Q|R3xqU*+s0uJTH4~)CY+*o?vP>%GdN`Vis4GHKD zZ3oeahpk{UkmrBSEnDXcQ$n2GTeiM@kwS*9-C)$0cTmU!+DB}TvA}e0Vq(y{gb`J2 zEKCsHuN)VyT`Ek^+6*~m*{{4j+$x?Jqtt(eSd1~=DSXfzPmC4FQ;H$RirXEH*Hc=Y z9>y~#E#`%5=S7Quhg;?BW9P7l=GDis(#q!vV+|)_uIj-Cb(pKUHY>JaceZBKT*%G8 zv~XMq2zbP%?I=@pk0}Com(pg)NdRdzU$>$u8Bu%Y{1G)1nvmD_6pnEfcypFus+i~Y zDf8SWOUrQ#exnuc^%*PTn|e~j3I)5Big?unp=KrZ_=9{nDaIE|;haf^f7<(_LJ0V! zz0W{Z3Ns|kTq$%+M+Ftu;nh#;6uV7<$cX9=)ANU8RL^Xl0H}`jwQWWPf%!MU)F%2R z2$@&?4-BMg>BO*ytMx;483cL2dP2OKWLL*F_|?VEt`riaJ+7w8tIo{y;PqA`4g)th*bDvj@o3rNF3cxt0emZ#OKOeb#ctjiYoMs5ZuOQ9 z_I?k8kFR zc|ge;*5Zj#49ROA*>#rb)#VD^B>?Jk5E zP2lsLNh~N&=%lt`6RnjXWUofKKfiE(ZFR3ZC5KIW+ zv`)Evix8EFzM4(LGrnq*?OX6p75g@vg6=HU7RVpQWizBtsi20LW0?_WH}M2?V2h`w z5#R-_1G>REM(aobb|MDS2p!!3{)ps#*CtVnd|siVoN8+ZolrgP9mX=bG<;U7c-HOI zbo$M3zJX^x6bh-)6duAtrmo@cIDy9XMm?uS9Vnak%6DtRN2Kt)pK0Gm8Z8cvlU1}p zUqP+DM37aN28R~f@9oX5kb5rph@1NjtXTWCQZ6Vpv(YnR+Q`?yL;U6vL85pT?grp! zP>WgYu+w^EN77hf5PI0>9%x?dE7pv=PC}cV z4)q>~5^O(K$^+`n70nnz^Nm)bSv;$E76Kk9o9_Vu{psC7>skM_pfiZuXIX=IQCJO# zXwrR0dMVEO>X-NlmI`L{FhS_t6Hz2{J}_g^Z5NAfpoi1to>rF~<5X&R1&Hett+&N; zxDv+Yw`w5L5k6&Oll)Is>+spfoo=K@5@*XX3S0a6%ED+Z<*bZ^M7Kbq!6@oHhaXW}4nJnl;G3((9Rm)L!;cwI-ypFSkNa?S1e0&4 z3V(cqxThoCQyZ}n$Dx9VpFOdqJWAZ;5c~{#Q;rr^F03cq7Kxke!Pb^V)w6^FB`nKj zO4sqMqvCktfY~;>^r#oV%XZdr3mK(-*729R1RN1_RvlUw!o}Hg={)oL96Z{E+MTYY z@%>C~PoDtoEE+|kauJVko-}an8emxz?H}o$<{nYE6^|$WD7C`o37Bo)OV?AN1NYvx|CrE8fgxk^g*REUC z;}OWWGYJWCdBo9(Mm^fYwM+flIiemV;fWrER?!epT-4*xcw%%u9!reQYaFUabYnLW zp#OzOmy;H|gh!PZEl!eFJ`b-&L}Cs};zlGMHAPUKyDC|30;9}DH4~B855~t%DibN#t0!$r|H~^C7t-1;W$r+LGDJ~2f)*56;Pl6QLuOYbvsng5#4^-m5!F_9xw0k z?`)eh>{ui9CxY$jF(GyE(&i#&Jl!@B(OBd=M$Cg)(CNmIjZ{@$VBKSf_Cl?E>Ko@jf7}5pT#Os1vqPpN7OBWoB-`(kgDZs_j z1sCg{iTa6gx}YP_1%sdlypCGY1w6DnY}~N%mUj?vf50PgHX^6m{~DADgg6?rQ-MM7 zQ`*~(s7u@q{zcmR*Ms^p1rrOETWB^1#XypXt1l`lz|;7i+IKn(tpY53&ng-pIGW&{ znx&!vS(7F^s&tZWi?!y~p@0*zQ-3iN6 zaO*8HU0dJIMw%zjR8y@IF*+*)vd9Jihecs=LVP;}7na+F)|C-?wg?XQW= z%EGO;g<3$K!?7>d+T|2(Ztd7H+=y<6TaKCi64k&rz^ga7ic1|>x^PxacXGBUiaCLG zqpz~lZhi<}_L?1~VJa)4Xx*~;uWX+2b&GzxLHI4lseGqM6m&H@BE8l_n|z|6!Gg%5 zLUay5cYJw=QH5MPJlpCWp0{R0%r32hn5i8er1Bx|cWF;{cqU^URx0NyGAuu8aEuxy zz_$iFJV&uGCQs6#^gmE3!tGgTxg+iYCFaiyV7*yZl0Bka-fY%W>q1NY8T1V_Ew7vf zTJArSwB+jE`HXqm`zt7INpCmXW=RahBI<8At{^{_he0u1m#90)*q4^NksYyT{!)5f zMhlkWe};2z1=DyVX1JVlIY^NIAirN>t^~_)@;=3*HOTkmF*HbK2509S(U~gtQ~+uK zldL{MCjeQP`hu)L1erH)NTeG6x|4as*3?H1e+JxJ(|zU*lbW;Q$Mzt|*QgWIL)0?7 zr+}F#r#~32l}d-YnKj|}Ym<3%*q)MkGxWh8X5N&Oays*7?*5o?oxyQ&0a=>sBIpT; zgR*AF?i`abygF%SUvQymc4j#O-zq_FB(xTa8SV5x7qnWWG2%WNKFK>zhg;ItOl0?q zh2nY_`XOclR4?XL;^j4k=RYprQ&kr*zjC&7l!&g!U`T2kBW}0 zNbQG71iH{`>@Yy84c9K}ywo%JM%S7{Tm>U_`68OiB(H}$xZeE%q8Fq_?mJDCC=ezI zq~f*1aDValm`=?Q9`%o&`D3AVLSu{A#Yp&IEA$*pDF<3&*=kWpZDLilDbths9qc0Ch{PQfG*1?{)051_UPCPQ*a! z8FjIdwr+Rb@EV|M-R^p#D4}GIdjuzQCs#Cko!&)$<-zZwx4X71!R6?)oH(u>%};yX&)TL3`ue?s_W?k-D5VMajgWPhdhV3-rwf zQUW8$0`(jlYIuh;g-LJKTkMy^7*>$YG zs(a@7S?Y$>AvAFbD3DL@P4ODd9 zG_=oodimMd7O^r2M9y5y!SM8wxfS=HB8%=m(!&=xipxwz{D!5RfX_h>(slp_0ln{^ zBND>Cg`3-b#g+D6kVi5eOaT~A%=<1r#j`nkm0{A7V5+ak67)1e0~P+tzwwDUem5NS zPqB^|a~{?aeJja`l4B?<&_k#8WF7Hte`m3@438EaQ}P&EM=WGvcPr41dqB#E#h$0V zE&=?1v;y5|3TWAUjtF&UWCi*e-deKM%?flf24by1PZ25x%X)bX5%nk;dt?P_Y>x4| z!EiUDX4cgY-e0cX`^@Kp2v%q32pZwl8C!#!)?sxvD;Iuxb#^uCFRQZ&cl2;|_91eyp$l;sT!Kyy}S z<3;M%eRVbyxCAqihx5Hgw7$>GJA6UKE6(@IFY!~aSsrGsm^I6IlxK0iyI*#E70#0! z1oaFGb(3L%Z*ahGh-6qidA`h1#MAD3u4AyeM{AseR@nTDdHNfw_-a+JhF(TaL0+q& zSc7-tKF$X{E|bTQ!P}3$x*I^QGUy_&PDia=`s8f&J|cojB?bEAI2mJDpRo11>63}M z@YDKa3hD%0?0aibpXdYyEHW6aPyT#D&-KY*!-NbzL_L3z;A6HGo$_WwcRFPVmjuCC ztEK#OxYj8zjTe4x;ha5j1NTrUgaUqs1b{gEVD$gT-u=K;RUeN3KNJ;nrs&8~W9??F zp&?!Vi0H`Bz_8Gml97`9yBEPOaJ%=SXy&M>QKC^JXO5g})~J!AW{wpVHI~e|M&*o8 zV~rJSw{pgeDLUr;zTWS1?!D(;E`QY8@A3FO=5~5=&pq$=dH+A}d;Z+(z9sZI!Uh~= zz9IIZg)B+*oCC_B-Lu+flo_y!b!R`ym`IDRe&l>;;lq*Q|L6G3$PE-Gtv&aj}IEMG%<~@eL+H-EY_>vu<)TWoqgScmYIm%J|=B@5Rrd0PipSe|c z#`Sge$(sx7#6`OIwE?iA01&=hG=2&16 zWvYz@-MQYep!xgmW;*;>u$-`?js>^IdB%bi+3$VFg2R^2XDk>`T6FdEMU4eluVyT8 zt{QGExRg;sU%R7>1vfnGE@U|tyvSJWnc!<gKgKO1 zMqR#q#yFqezlxbC4Zt&$iFUa8qCcodXbwT*yM#PP3eSu}8yos2jXX})kMh3%*x?_4 z^C;nW4LuV0jMJmNzkihY%SL&BwDdnPO8C*zH`@EX;>4n;i+kFP;>cJ(Qh8|Ga7suG z!}jfj*Y|$^^8fHZY`giQFKv@!v}g_5-a^FQiiX>p=UDyvE5%I7oJYQQoMECZlH}vSwwsBJ}FU9n;&3m@3eIj|~Vw!jqj%zStzUg-{ZP?zm#W#=cKCJb< z*NNDt%>3Th+NP&t`@F4<)i;Ujo!a-Ixi4hyOA*h%Qa}5gKPE%|W5b!0(|*sFnlLZh z=X_DV^ed;SS~+pYMVeEbC>~Ny?wpLVa=zqyE5OOW1*n{mQ7gy2Q!ym_jD+fI&)e?O zl}&%>ef?iyN51n(|KmxYD4FFVJ>C=V{7HeG?tM?+B9akn&HdTJCqF(J@Hs+UhD|D`X+)iY#CmOcrHuznC*~-o*U55Aj5L?B^T&(fvj7;SMah^-VXu$oX`JM z^iI!-(IQ|Om za;t!-px-(Fdq?|=#?wU3>}Wrg%@z-~GQL`m?wD2lLX~{Y&l;rw{bq|3yN3y1#cOe0FW-N8`rSX8z7*XWeF=Cz8*z z&HThKzM<`19!FlQQcKeJp3*usu(urDElz7kAM(C;j1e=0DC$~0K&jt{)1w~BSfw7| zbYDoi=Q=U4%bPZ0wlUHKxNF0wUz}b)uaHU8r`+#or5=M{VzaZZvrTF-dHU1Y_Vaaq z@eNaF6TTa$&WhB)`kd>IWnAOn{WGq!OK$MgSu?+NKcvq5+D8HVQYSL|oNL^FYiH(D zxKEpgK5ROdjgpUsyF^mdnXNi&PjK&ngY@=)_?-dpOPNi#ZTFY7RB9=Evg+(o_S$_T zrL0X&nWwP~t=v8_%eYM>P-JhB{$tB3HQ92D8$WgLhTbJVw%o_N`mw_=&jT;YXWu#E zaJSQ={-1CHc8`?-Q?Xo^in*KpQ!#q$mC4@_FzQNO)IT`nAN3D-*Qd>hp7upNH*xb) z&aa;H9dTIW2+VoWpf+)}Tf5*jJ8PKJtHW2SIyctEqMsU{U~hqX!q6GOJ)Qp57Ag;} za!WCyz5YrtCtI8c#6?G{`5~INzC{EcnHbHzhvopER%l-|NO=-RG{`=+OUqATDe4Zq zy;$4Bh@XCCeCltviFtjGi2g-!vP*tPPk;-fz6l&56W(F^jea@c|t!{Sm0583>lU?k_djom@V%eHFAbL(S zEG5&yiyGc}=+|fnL_;bkJU_-M$%v2lnVIrELd-$m0 zU43I2ChB_vM*Uq~)X6{e@3=esq89o1BKqx*ZlvE{zetw!(0+SY=I7gQ=MkT-9r=E0 z_L;et@I}YIMLVS5QbLL|>~_%r_=d#`e5+z;y~`5RuG8yIGzI9ra=aI3Z^gBvq2I44 z?-qDCGDy3!bSur&8Is{GLC>{*zTI@6b1ns}&xj{s`kv=^DDj>bkXO%%M?d%tvP18D zWP~!T__I$Lx}V99VgRJaXb-8#r!zPsUvbivu_=n7q?4NnUg;EN+rn)MTwLUV`HcJj z?tF$4{^aYTxHa&+3dM0P*-m%@8<=gF{VtpB2F;%zFyx$*kpYGMzq z{PV2|8!?WlCXRCYof$4v?gM>VZvJz_i$0mzb2-#g;o>e#ZlP%_535%gx{F& zVQZ6SM+?c(0yPk-r+x(9T0smB*;Eu)J z)q$#Z=#CAe)N-KD&vGu%cT7~JHdWGYbNrYa4aRbzKzE!OdKu{j((cpa{YGx}jC9Jg zT08Tp>6kMu#?=HI+Hk~u|6?o0d;PW?bHm9ExZ`HO=!S1NZ>d{)#|!rCKc2|0rTaxF z?J6jndD@$M2U_2+eP8R4_q2tJBkTt6YomB=;kC~wrVp=OgWsN^eX`Tyc)nv>glu->FitEoD$rhB3`CdiCn&{{=HND z{ha!DoA~=l@%N_lUb&Y$Gw$bv>UmGB6@SUIb8{Ao_te62XN9wQYN@=*!GME+R@nS1 zsrILQd{+x29vvs9cbw}7MZK$QH)p1}|CDza$_;Mu*&uu921z~}Sch)#Rs9BaHPpw@ zZ9eNl7Yk?*iC}tUeVlF?o#k8=C2H2%qP~1V*ZT(x{LX5F~bz|cep>)y@LU@^**mU z>3OY~Ut)w1jq)YmViseGu9!DB$YRz4O)^rMS53*V{Yp!TUo-jr57m^sa>SbwE?kT5{Di8v-5pj_ z;@j@rxff??^d@T()6^H_?6_fT1sZ>QqrTQyJ*%c~$>Tx=6G5SCt+sH)T&EgcgvaL=vyW2A`xdKag*2lIyhb z;_o6IV$SbwX(Fv6jCLsfiF}{S<#MH8Ud48{#*cnN^y(RocHMN~#iZjd^=r<=t=8JS z;7PxgJ4Gvg$ZsXtW`63kk{?F-_qWAo^$)z?oTerDo;EqJ>iw6u#I@PiC-X$xlpk$k z=83t5?;Y{)Ud_6@+Qk%4esPdz=B&;1-M1`=3H0dm>-1~cnb=gD-zIrq%eiM1uSb}_ z%5B2aed7pmzot9}uNxse?^kiFwtoLD^F49NxEsB%(?$7i^S;g#ug_$DT}+y^ead}g zdtb}>b-MdC@gE#F!u(o{6wI$hH#OwU@ zMO5niTKuKWujQXZ=hrT_V16waGQYlvX6T(?%LvpXdHq{H^XtFfF8Yz2UqAMa&-_~V z&WTX}`Sp9=VBNYm)d}&VqJetn*Q;lWm+Jg_rTVw*K1ik;%>771X>%7IT&aeG8xY1_=ameu7AjW3{ zF_QajaG`z!_tDC4n~xsUCBuCj@!RG%KHF#`yx%rIW*Y|B^FFeP0d~^81~L5Ylb<`p z$obJV>ijxXtai@~8H5APuf^)ujxxU%1NNgbJ~`v@>~ZYjS9Xw=&6(^}r0r@gZE^(n zO#IZLUS5<s<5J`{)?-yox!bgv?ceY5B)#Orgc7S*JC zvtSxh7W?_K=z^Or3KndZhi^)-gAiqW^8{bkdIgPavwGxI z-`0+t$GN#lA8+6S7j0ix;A^(XruKxkv4I3UqZN4Z85Q_U>*rSB@0P30f7k;5^X4%X zcnLQX>I=rdz_+s>3jF(m00sVR^PK2i&E5bkgnhLBg}AVf&S~SHH$_i?-K-G3|9HLz8b_FIM+D zY~#}Q>Q_P^Y*O=j_`|W}RU1KddHo6DhcDrKWMznXqh|=5Emuvv`zdvftfflKJ3X7I zqtg$#cILBopK}(CL(GwjO7(MO@i|+aBQIvXevT~O@tGsb6`Ssr+^@1vPJP8lFXzbG z7U3eKI?(JBH}1$evM#Oa`|@nkcSSny7jtB>(l4)K)v$BqAIu0aN50!{r98-&`mK~l z`)r?;%#q(Q4w)m%Bx`dcgE+yj6|**jdg5wP`*MyvE>X-KeCNn}<5)M$9NGVzwEpC? z=VZC(EcUQh9Xez|d#*aj>(dS{i_)g#uh`WExKV?P9wYC~bLC539+6k4`n1}-*6$tx z_j&H2TmGDsF=cmuE*Lfk4&NMv(~_LeiOY%V7i&B$qVd1$(08w-ZJ#rFrkvrscjvvE z^~}o9NDBBAJ<1oqiHcH7)3X=3H^|nm7<_6vKubyzb&PXLQoqS=wJ^dt&JU==PY7|GqJ35;?14x<)&`- zBDdM1+ooOJrfcHOT?BiV^!5>SQMdb)Wt^5`u{Nz=q?oi%O6w)A9#ZV{YeZdi7@1=4 zAm<)+2pz(bBEBwi5phjQ>nDajxwY?;PN6c0d-NnncmJ6Ch1Gk2_@cn+1Y?Nd#y+uH zJ`~oMKCMGu%@J?Np1a~)4!%k5E$6u-cv$>`-DPsM?E8K4&d4BfTaP>BEWb9bjb}r` zbn32*x^Erdm)0ka`ux({fbf&>^f%3YgmlX5CEVutW~q~>Vg@*(vp;?b()J#I^?73w z4K+KJ3ioYhFP&n0 z(N^X5|Ge05`!>0P?WucOwfb2_w$?TBozO*{j38-UA{OyEX5(uj;{E>3^-t4BYOX_m zhDqyZh3rDaNqgORUb;!n$jeB@&Fpg$U(~8?7NOtlGHo*&ERB}HqSf}0#zi8h>c^}X z!{sb;kyxGP6dU;_-KX6e+({qWZVAp$yN0HO_(dUhq<>cKb8Q3Rv;n8MormoAh)O?? z_N=yWR?8Ot)g&?Xy4C64;sg2Bpz^xs$NcF(KM*ZzNUSr4#QJQeZ>(RITgX@^^Jkz~ zlicl<`-R$+iPfKqE8JRB>v&9bQSr5)Vsw*VjEw0a;?88c?5hLfnaM8q)()}t?6l6c zQ`~C`#F{G!KRc~!jn75wY6e9@emkwr7Vq9VF`lzw_lwTVPB?eIX%UlJc?Rt@Q8=5# zcR|k&`Dn3BAn%FoHeYn-3Q@Fjvwtj>$?Z{NxQUXNMZGLju6DZj^G2L|KYT;#_}|Db zF9ufmWGcI)xc=b0QSMUhagWIWud2~nNtj5WND!5|&lw}4m#awNrt3pxLN~>wPy1*3 z{rl5jJxLiIQrC@3zyGL~)KC$n8i+_l7*WXbW^eCvr6fr$4W7s3-JbM-Z-stxjhJkR zq=Z~9=29YcWPTIRN~z`Ylh^^5^FWmMeqZY}aY*hGLB2`XsT*>DGUytxQ&z^6>|U*J zW?JGg-#B(8^Z#99ceicPHe{2R^|4mGBeoLB@q4D!^MSx;qNE-*`aI8}QZNj=n`HI} zL=@UaT9AuJdlIhVl6=TXHubV(^aKa?O8h??dkM^0{Z1hBx%)C`!7b zNBbdY(Y|>t+csBs^&1b(m+lTec|)KhMGd{rxlevdp%`UR@^xB7<^FO9np!$l$5-dd zUCG*M;-rbWvnsQ5x+`JMElWvag@{b8N{ zI>AIDN0$P&n#*PbQN4dE9&J(f0PpWj=fJ9>-+E;=4JXCvtg@Aycb1 zxxc67=@a=KlrQmT-H_2Kg;wPA)qLvoxx*bniHtxzp7|H8o4oU!$O7Z@=0$%Ia}BLs zE#q7RWz!*Yd03nmmv8agh`*436MCPsO$JR9^9|2$DKyJWc}6aMAJeiW%ZxgAK72h5 zdUjfm;}Uj6x4LNXW^n;VcHY@sgk(bNcVKj=ZTCEJW=-Gf-6g&GqWsK&^)!V~Y3^2$ z_u*;Q(?7m3ay|V+MDANp*PkyMl&q&)`SbMa=}R&KeLY?NjL5=}dOF!Ib2g-&D#hlq zmiIZw%b>pX6k_nZv)n+-VNj71Gu-EtWhUzBV{z}AzMis{dFtt*YtF2m{<%0{Jze^g z%nhRe-vQD)#(EMbkwk#BOGmD!zlg|v>*-@2&C=@WKm2+6_4JgCKwnQ+if8GE*3+f0 z%A5_Urz)|zR!?CvsBb;x$xMyZpF(7|sHgeY`PEZXmZzRR;`->B^ryQP1+1qoo>g@B zr_c{hvz{J{7`dJv-A?4b_4I(8tjqrNn0KA%ptXQ;W=$E=5E7(`%y4M1R_z=2uU_;!viJd-Iadtez%i1gxjMoNsm4 zQ}JKNSWlH&fBM%YBiGYHPW$=Q({%CCKppq4=FijbPala-F!$^0>DM-qg(3CS@Q}>e zka`NYvtFyGCK=SXoO~Gv@T%JaRlYj5R$o{o)BU$M=?)c4cQl zw`@7$thk(0y>a<4vqbl29u6%{%-!@A;n`80uE!7A(}qspJ>3`ax$H^%oS>f;2T0G@ zw(@Cv;`1bP>QF|EJ`Sj^x3nxXljXbZ+CzRVrd|L0_rDVOUkUuL1pZe7|0{w2mB9Ze zB@m>D6QSJI<0vl?|1oK)P}eF7vm&_#pLrBMpDJAUQ#hZXaPCJD_l$6lj=~LM3U}ox z+<+!-Vw3+?M&`s!zw(->X)A8M^G)jv=E@Sg!>%kWTa#}oF&WC$ z_lwGHrTGqnGS9ZEqSRc*Uy5R|JMwJ~yJ2mKqu7vdm|-ZWa2Sg7?S_)F!g8C^ z*OfW)D;0yO+-x_Ll{?hf6+?;LP+DTQmz1qCQRj2Q~4RSYYxR-&#}rroNrF3Mys z%CE3E<`|S|`d3q@PNO~vp%tQi&NyY4ff)aA_v7pdn$6scjX$zYAc}<9K{r5vDso(ilZg!>NR9URBBm8X@S|M zXfG9WS$=`VY_L_75xLn=YR{etXwIg?39u+D^(e@Hh+ylyf&0k zI!Z~jT&I0C#|9<8od)GTkNhErKS0bHCjff7`^eRO_FMpjgn%pP)25(;r0r1kGqGLv1o zJ=*ggiP5FQuavcf&Q_;THLX>DRH+c3AZWkxU>ueY2Ku^2Qo=pGTZ23qD9f>$XH2H3AG@rfW~MkDKonp z@ny;)t>>z(#M3}7bC*x1g_h-xW}RV1v8X6RQH8}~s1U86-sg!!YfQRG)=;YDwmEZh z7v(Y_SuEv+xg}+Gv(2H|(=h=L|*hVmlX-70gXVQsOw z%wV<`=3B{VjH29BHo|sd&=$ieW#O=uThL@CjQBTVxO{tINr|DbnEplzY$C{FIb4Wz zEM72=a-nqW4A_Ncv&l{qC@pcs7__>r5cOMJZWG;3O|)7q(FST-zDaMe@MZzgn~6jW z-(pOX8BB*QLu-zJ@|ezTK|w zN(-me(kS($?MGjR?tlUJGq&xu_U4zo7$wtNRH7}*Zel6t$Rzf;xSZn+O^pG=X13CK z3i>FGs9*s zGK=GZS%k5cTh^78mzGf9rCJx6@4u0W&gX9Lg%!+TIJVd;3TAjKnC`{VQ>y^K@N#!H zIy2>?H9cPVhL<4&j6WvkJ?7ztA9wzT)RswEtJsx%3&(l>Yc0-K3M~0$w<(1T1s26r zvZ}ixo@xS|$Q=cA!`*$_gEd-Acz)Di{@QN~OA~u0Blpb_TP6P28}6E}nVg z(uLXD>@J%6SGQLij6;sA;-JCkz$mcJP+rD=1ImEG2F6ca(Y8-auWbhpWQd)KYfj7bs=swc;o$CS#70!hFjN zu~JN6W)v~LDuwwrTM5TT8m*(kRz}py(uGQDMw*g(Z7fS1OFT=0vUuJN%F~_bS;SZMt{qY<6!kh-8sthK3pW z4rQJ~xhknjnzBH-PDxi5D%UGFC>hEkWwCOjlBs-0S)wdevXq;YWy;M;wsMQITrCbe zyR?~SXrnu`6{=rmPAwb1w+l;bg%zbm7IURiQD&lq`N(7zy>*RwMt-3veueI=6e^U2 zvPvmdN|e>gZHh%HRmzld#j4z{*c69Sp{!9Vm37K`H4ThfmUW&ac-oq5d1^9zw{VnL zOlBoDEkk*~Y8%U=bVDU-#lC0{2A-#%~*cxmD4sv$(6=wN|a+m*0d-- zPffdKL#z^2v|+)tDDfGKmtwL%V@A}96?5dUH0Rb^SIo%uzPNH))YVZj)2Fee&qh~@ zNmi6T*tF#R$U|imjCIyX7H(hzO|?z z^O`HaH|77{IR5D?n!0V&t-tky6Rrs?6Stmly~mQratF&+mfbAVS<+a|wZO2#Wm)kQ@n93~V|kzDB+D9>hgigRlUe4otmW_^{^$O;)Dah-yVRO1k6~t0 zuGL{**cTS2EzRdYX@aFQ zbJH>w&(6(VRaPNG$K_^}7v7f3(YB;;U0PgPntSKSK9X{CO=bt5&tqri&R3^Ti}Lx% zYqt5OK+Y+>J50+ch?R>^e7dORpJyGvkxcnVs(XD_@f*M3^o#gUC;f4`;&A)<6+Y$U zQ$D91|0sz+tN6!I_-7seX{J9mcV5}L(<*+^2gcq$&m{g)vfxv{ryKtms^F~S|Dw{b zru~a6e|P*}Wct6z@)vQd%ZTlBl;e-**pQIR`G=8@2d97Vp?{CK|5+USII(C?lqZ($ zu?d|2C^O~TOu2G}Z*s-ndvg~D9yK?QGpVR(avE@oxCg@HqmKI9SK|$C|d?5l;_a+{rVtfjDA49|YrEjd^{q?jLTm$Gsl z>#XJxcdvN%A2(aQM3GAy%q=TdOD9*HS&|pihKt1;K1mDD`L|r{!q@1*z59<((89Yf zr{#L`Gg2bF`%ly^&W$acyDGflXX(CRbr+8}eX+CE@Jl)SuM6&p zKX#`2zV1Dr{LNe@E`AQl2%{sznfLRZxTLsn%%9H0@iBI`2ro|0=W4^OBY%}A{k$KW zyQsopuFO5%sAU{td{nQUxnnP~m6zsU;kQcFJczgXmT9}lZ^;- zbIZ%bbthAl`cnK!7c4J~HmoTxF-`ZN28z}~Rd59@F=4uTspu+ktycagQ(Wd;DlXw( zRcN(dwUqVxRqBl6s+gFoOtxH0Nr7ERB4Ua;7q)~w8!o$ATwUVgmSVlO!e-}OsdtT{ zrcmrUX}UZ0T*b~8`OIBqcI1|tOUrHRw4CrtdyDgSTu&n_?mVb^u5(3MmzeEb&o*2s zx0q%~zSEoL&T_d-lV4ckSmzEfZJI8fi3#ptvRv(@RtraE zZ_3IGRu7+Ad9_aqUszmGc3W;SMIrG_^A!gA|6?IQ7L zZAnJp?grBoE>VhB?^}7E`qSQ3GgDAe#I+^aWT2$1#1W-7Pi>HJ_pAV0(>ks5WpLe| z=y9Sc>(;PeU5r}G_1!J!@3g%J-i^9;gml}@=G(L~@`>3qG^j(usPTx-JWM=(<)M~~ z)_1r#3l}t1~vU+oQzErrJri|t>iJ~ zFSjB-Zq)eW<3!fH`}6DX1?I{#??=9e8c{P*{PXTBY5KH4=@VypqplDoWVTJ4HjRNh zDmKX|{$f0g5-HNg^F(8ub_DPr=fp+~9OdFZgLG~V}Xw7+P zuAZIonB`8lI$dxl*uT7Gdf6jG^%A+ifT<4L&O9X|<}6$iV{9ra&t=Ny;BFO;Y+4iX z9&$aCfio{(v5PF(MurrwI8G|ev$zM3YtGs~{hqXH)ul&EH)$;^Ut2a>s`ZlsbtdFn z#_m_1a^Zd=c?Fch_b+#Cmoe%L$9otM$9Y8@0~K+=QfLPTMf3?JW8u;)MKp3H-{i0; z3l}fAQK9lIifHPJ#la>EmoCUs7G8T}ChyK$q%54bM7&%i{<9=iS$N&zCCb7~@mJQ8 z8&0cyMyXAGxr{hj(sdnfRgjy?QCA$0#E9%(DMpE<;?}h#3l}Wla&J+QvSdMGf^ze` zWoe4Z&R^QNS5RJViI3CjRU8>}X@gt}<~~cc@p<~Pnl7KowYO=+yGJ8MDG)~icY4%0 zUyT0vpdM7*EorTd`wl#N(j7y+2YTzx+}P-?U-5Fr-14%UMM&NH0P*IEw0I)-rZ!3R ztNEa5CuS)y4ISyEW8XUSq&$x_T>W7)uRA4?s}c9vZ%yIERT zUSm1Ha)_meEE@6peiD5}%na`5JvWz8GL>Z-i;-m( z%UqT;7F&VBy%&s2+JL>5Kg3mb_iNw&qMc8mqsR~AfzBd`PRT!Y98$OANNUb6jSMvs~W0F5*##C7*FvoYfGseZN%DC*21~`EEJ)h?JCR$?@y= z#2|-OzbFC@up$+K@*_uBnW<~F(*%Jtrf#R@PQDP?8$DlY3Zt|#9xiv{ZTHclz`i!$ znroMz;qAHB!cuo&@7SK0;4UNg7^dCPK72eSX0v%L5vk=gY&@e!p--85Fd@nSEWHm2lcGnbp-OWlVgt-?nL=O049U-h8EejVIgW)ZDb`{3rSTkQy5n$LWIXBo7A z`XbiqgGSHkHh1#uxpvNI=9b#?O`>Mx_C5y`Z`DxO^243XmOZOnP8a4HWKE5AKP9F4 zW7>zlzC>CnSJJ5l6>}XD63vaGOc=FXxhJOTzz}VyC=<8badRjePg7PKk_}0sNXDAZ z(<=*E5=`XuC6gsixr)0p<pD#WzxY>mv+M z&vwtr9l9iEaZacIj;Y^{T+eEWsk;t%zI@2IDB>Hvp3f}a5$f4D!m+n=$~QN6g!(?K zct@)DKoNV^F;HtGv^ZuC8fK}Loh z8l~S3{r8|&fG0mR+|l>uY3irDH}B(OqBR<(DpR#5zHTbB^BjSA7|5hOawwi5;^cZ+ znb~6J0ZH!7pQ^}*z^3wWhfa;8*0m z!7kSVb)EQcAM2#@e&8P0UsCR>Qj%FCkI8I5SAD-{9$u&Z9r(XSqmifmjPb?<<4j|s zah5U3I6KxTZm5lok4=c38Jie8D>f;1cAPOTHZCqMJ}x0{W?W+2thl7O+408s*!Z~k z`1pkQnemD7v*MHDXD1jFViV#L;u8`QW+o&i%t}Z~m_5@tGj?X&%=noJGiT0BoH=V| z(#+Y3#>CjfxWxFxgv6PNiHWlklM-joGR}&f6*nt>R>G{Avl3^`nw2zbc9JnEHYqMC zJ}Dt-W>R9(tfZu**|SOFY<54JsAm&wHmd^Xj^~B{f1bZ{w2aH+gYWaUbLM0%S+F20 zIcx5mIYmY8i#@tW2YKfTPB3|&B}|ro^JoDV2P>0vv#fIsbFY|YSRo&l&N46`6K7X$ z6}uek^_KTtvoy~ zo*$S00;X?Sxp;EZCR-Q}Bk_0CnYE^~X-`@rv?k@-p43F;@{}0|MfGx_*1FVO4O7q8 znyunNAek@qIc=YO4OfRE&NJ^9+D^56n9J6fEj;Au?hIV`5|4iJ`H}Q5zmk-hS#3u5ULo;u2zE7k{&gkXV8A!jalp=VEm_7kNW5W z$ER=aXHc&09RyJ*r#(Lye#W7Dhey&ae43X}o{v!OOU&xYBX6Fo@Gq3^3aB-uXN#&BMZC3LkfwL8RO7`yA98=Ga7MwH+Rd)ulz_W&Ah>s zX&5eE@@8&huJ4YuSO2yB2j0DM z2Kz6{EE;S6i@u2bpV|Jk{PX2S-_=(HFL_<%S*3lwk!KtA^{3kFP_doonz$#B(szyg z49AM_8L3(SzU<;Q?Y$Jd=1&uUE976#HQM_r@}(j^|E0XDD292Y!=`BjA~O~M~WW-du)55s8;So`dH>`^b<8}{)F#%A_}%(KJ7KS){ALQj;Ps1Ru44X9fBBfJ4vVo7TRM)pGV#a1 zJ?09b75``dF_#gozdPo#V*7z(u5GyIjbpAoZ*t6j`TCf`L#$8yC?f4t)#bX%! z0^gVBJm!i-8>Zq8G~s@%##6Wp<31uhTCo@3!r&JbW%b8|$0sorThN62u^K}@p&l?2 zJ8&*KF$Y6hNgqaGGp6I~Sd8yu4F(-1JQ}eBZ$&3Qj=?V}$~XVP{xK0#(S#=4g4OtY z+=U-tJD$K^oOp!rFB2XkF$q)gPBfttYcTXv_Kz9ZffjUPErz_JC`}lJ1DK8z`ba-U zVhtu@BW}PBjOZskS}>$dQMRKPDGy;f2LFrj7>PBQij8Q(4%~uHY{5+0Z5OuT0QO+a zG1|jxq!$fXfhqV?%){5Q3L}nFE;tw4aRc^Z69)fUQKAP(7dBxAzKa$dcjB0<7OPIu zUvT%okGZ7da?Gr0H=f=cOAw=9N$5E$7no-88~&)ahC<> zV=eBUeB8AMJHK+=)s07S5SN9K?%y&#VKQ#S9IVF;xCa~XAhu#Zc4Os5gvVZt*iU+< z5FVp32j}AkJcJEs{OWO68)jk;Zb0RCj6-O^R!qTe%tKT7aaR>q<4)X#ZPG^j z8F&OO7TQ|JnqWG zEojBvSSQ}+_y1aO3cp;~jo~qbJIMA%(ucb-1Gn>AmsWfa>(Cf~+|`VU3CCSsxCRGs zJBI&}dc!2_#ccd|9`%aR^Ql+N#5R17FQa$jrThv|$RUo~7=^9kSAlSAI{U=|ti$ky z>=%=;6SJ`ovzD;mcj!k;X;0XUd3ayeaaRq_znO4&3On&g4*dvs+)DX$Day;3itnKb zPhmA)x{~t6hE0US&|3C~MhyKw@_|OQVkXw37588rzKvZtfCE^xnRLFZC=X*2zJ%F$ z6e}_KLCOb>*oG^x2g_0U6YZgn^1)_IN8>~64aS}1T8q>5!yS>$0po`2kpuDgLt8wy=Xcyu& z9>Cz8^lyyB@$Ylo!f3Q%28R8Z{NfE*k1KHxK7t4F6b@p<KP-k4O6iPH(>DJI1XbZHef2Yq6xdP z8pEETyfFnkFb|#hERO$BQGSil_(#mZzoP|DVl6Iyl6>Ri*o_0I{GIrI%6@S*reY16 za5q-tLEMF>upJ{B8Ru|520J;9VkB05(iZY1NIQ3cbjW)F4b6ATV*n~&%0ERwCJI6#Ee}wrPMq>?T;4jgF5x=0^Fd3W0 z``C$H*oUVu^ixH-eh=d(R$?ap6sBKtkcd>NB) zWh?cC<6feFVHEDf_1KP$*o*IA@Mo0A%j_46FdeJ07@x)(JcNyS3_CFW70MgyFtnd~ zK_i~ROkCVXdEpkU!@byy2e1>5VIPLQO89@#4$z2OFbmt!fuXNa-gpJ>!RzrL+OQwD zV%Rb20~1jBHQ})rH(*9P<&D+Yio38I+i?)r{DyXVoZ~E}aSNNU1v{|| zKg9ve>Y%&_i0`+IXV`;zsO+b_aW3w{z1WTiu@{eG@CnAb-?3j@f~mL>P1uPwIDm~< zbAa;3W_04+zo&nkWM1_K<%J2Di3`w**;t2_*o;qOC%%Av*pH$AW_?#+mQXuW>cj;?KKiC#d`%?F8enU%ZcD zF8U27;M16eJ?KE?UD_EIU<*313m?Y;Y{PIRNKyVozA*{2(T0_{6Sv_ZY{8ql$v5_3 zNKlY+45M($pJ`{9h{b5a8r=FG^^JS60}r7S|Aisv1SuE%h46SCrsHxf#=TgBlY0n{ zM(n`(=)@fua&D0FGDcw^rlay#!s8sQ!D4L0`>+Fdp%dFMB$(~qCp<34bX<+a*oCz? z?gPeSoQ?-@4j#rv3_UMMc^8d%5;HNnm-dFqScetZj5XMaPhuaoVCeZl$`gO1-mnF; z@DMuCiS_u$4=H!?8oO}v->Em;h~XCmDRr2HFJm@lIjJ|?f!nYZTX4xogvSOPz!xw) zBuH8CG3^zLFb~&Y753sTobn0n6%(-+7hv$0f|O+#iEWsQ@1Y4#VKq)TOnBUa?YJ9z z@nsAiM>+k2a>rXS9j#c5by$Nx$42bN4m^TRRE|(@U#1)|3in_-eux$f`ILIYORx!( z@BpsH!&rmk$5Rg&jqR9$htPtF|D@b;4er7HM;TYq@EQI5Lehx_?EDw|#l&Nz8?&$m z*I*;oUDRVtgNKupb*SZh-K(@g(g9dogrkkW%|^+6$h< zEL<{3d%+D@kK1t%cH%)i|38cq7=vM#=R9fkx~&XTX(>N3jw^&mC}W!$fSs z9PGl4IDkzU{uSy6lW_oZaPD~nu4>H0UAP6?@jdLtLl+FVLc+*T$bc&f7h^i^Knps) z#IM+4J2qo4cH)$Aq#Lim(2IhUJT#&WGjS(c@inZ&UTnr=*on1YCOjU(&?$^t;|E*` zI3Kg{W30sS7m{zx!4|v^yRZodunWV#%J!IqgP4t%P9Qw4z-_o4TkvV@!WVD=doetm zc7jP5KaucQjFlJ>I^b%+7;MEH?8enNh&wUjV%qhj0apsvVIDq?RTwjw`o<#czH7xt zh2O?(EW%3MirerIw%~aN!lUDIj^YN!Ni<+iB<&pU#$ufNP5LJ~unDicf^_3NJd8Ku z_{)Nn5{$;Jn1P?51r6UK-M9psunG@g9UjJ=IDRVQBu3-8QG~}BwBSmt#U0p$zsCcZ z6g}YT$DJ5fLMk2x6j%^>A=Ou%Z)!X9+s6-L5iBJRNqJc!${AA2$E3dTE3z;XN_ zdloK32R@GV_$=6xB(~6q`jjNTd^3saXSv;#~3j!NC`_MJjP)T=HUjkVgufXt@svp!M_#^soU+i(N!#s+*DTd@bb@hA>rL=xezq+Brtb1)BWScNa+P8>ITz}1GA zU=L15C7SUG4R|-E;6BX5ZmhzixD!{*VVuG{(TNQhGK29FqwpxE&~{jTyLL9{mM# zuol;26Yj$8y6Srr81T@SH`IH%`XzgdpW7n1XvT4|gtRe8c_Nh^MdvjW<%yScM@o z8GkSer)F|I!5nm8)pw|8d=mHIG3>$xOV}?i!|+7rZJ30+FbChj4cLPXcobVPcq!$L z)u_y3o_q6vD-x?P6<24|POt`R@ZnoXH@=4*s4OSl*oWhjn7^!`p0N%yaUWXo6xLyA z4#z>9ik+B&eYhS&XER?yBTl%L@c8aZ(v5xCfam9uZhQ@Uum_bn#E%BNFpu)aYcLO2 zV-?omPHe?CJc2zqH=pp|W}HC-uE!K?!8{BpAUw7eGH=5xOw8Lb345^&gOe#gjKqgA z6`Rq7NoL9o%dru6VF$i}PCSeuS5qEE)HkljbbJ|$@ja};|6n6dUqyIKMkj8=khyG+ zQTTgI#}BX=Pht%w6%!s8V+Vd*LjOc%HT8B4?Hr@gh#8oE8}){DScki@8QZWE-@-oZ z$IukoyM=l~17>1;8R4-A>#!D^@dfO}r^-2=U=N1P3sNq!ay-H)%)%UW;C8IXHr#_p z@E}IsPI$Zy!{#%-U;V)yCY-#Ma>p`k#K*A%bJkIAScjo$j3;Qs==GEvTF{Dh zScgwyGj?MqPQHWicnyXw;ByBW@kz|YLukdU4TQ&?*o=MHiN-q#j|CWd9qB?N{t`2B zKU#4B>o8^`;nDtG@{M=l06vZ3>CF2v3HvY`ldG5qU=eP^ZPI*Y53+vE*>DY|R zu@ft?4-a7IjnrEm;jsfV@m;iH@I!>hORyOoco27BKQ4Kg`pV=uiplr}=HX$i!sPEW zzG5!6;ltR2ji`Kw<6=GIBSvE?_MiphAK^HPHf+KMJb*9YVeG~6OE?~EWqd*dW?&pz zumtOH12$s=c4GSvXlFQQ8~a^K`Y{z3Jj%F;R;`iV@35 zA0}hzPWlH{VKtunW73VS*onQ56AqXEg#6x2d0;A9cadM*jx`wk1m%n|cmQ`{A0Ecg zY|7zD`ZIQ7Hjeu#{TUbHHoOm8uo1iPbsWG;8fn+JkPl44DNhj|6R{FkKF#qH58?ql zhKKRvpRwQNlvfk&5~pJ(euxeXeui?wskjFh<3WtxO}kn_KGA>=V+uB69y+lKtDD&` zZpU_fAA51avmCc`Xdf7f>oFDU(1d%j8js*EjChXlxCDE#0)ua5e8or{_Y01@n2HuG z!&=;iO*ml>^@MTHQ{K1^LsteV526vD#7uk_tr)(Sc8$}q8Pl;78?X=8|B~>z#E(XN z4>NIk3*qtNUr}zDgM0A%co6qvKXzkS9^=~!v`@5R7T$*rY{q)L_(j6wb$AdrU_U;H zVfnOwOu&Pfg}vy&39W?3XxxKkcn}+L0AI%N0{X#Av=>alY^=jd+>6`r6t>{>muYX9 zjstiXh8L1AOv1yMjbX149{1u-Jg<#2x_dwx3*)J}`ZCHyfxF5UlLma^1eWbgHet}7tgV|V*mDq;c zum@XE=^#9AL}eA@F&gk?Ou_ds57+#b{*7C)5uJDdPvT*W+Rr#z%sddI@d3=l2DIXS ztV1U@W-P`|T#tQNi=nG2cQj%fX5vM^ zCp=z>bvPTFF$+8K0qnyL484u~pb@WlgYdWjtyqM0*o!R~{0GVnBXIyzG2BAC#}pjI zJY3vKePbT(!Y$a2JFpk~Fr<{@*PGNg8ZjN0V=->Q8f?Z!d>1=#!duMG(TE{soKM9l zG+{cf!D8HxHRAn)^b>5vgZLKqW5gfnXXT7jn1CxW3-3e+{v7M^UEG6_hX{|?VL#r2 zVOH8NCg1~@g>&Aays+%i$^ioPX4>;r??bT@h&vs_put!{WIl` ziP(XA-lN>{Eevr`u79DuV-sdzJ6dpB592e|VKb)um2$(|v0tpmunIoEV*M3x8|@9h@geOTW3dl!#L%_O&(Vla zVJ5bs756$B*YLO4hR3l7$9=^3P|5rNqtW;=;jjR$Vm;R3ZfwRj>_p=yq!$Y?Y#rmy zVbY7IFbhNfL4I*A*5ht$!8Ys??;oLmVK#=Z=W{tG;X%yC!&r&tPibd(09$cfTAc82$_?+qPD~!8zHm8)-^F= zjShSO>v0e6!T0bWe)Y>IT>Us7!|n@G?!W|m0<*9k9r!-h=M$A=YQ>lD|8d{4m9HRn2C94#fPyDpTlPSBX;6v*oTuN2wzKn(1>xEiN$Ee zTCBsLV>A99JMjqi;rOo;elzn%G-4KJ;$3LPZCHnUu^D@?6X$+|`oc_%*h2foWPAv7 z@aMPz-^T`=YT$PTaS3+g8XUwIFycYRJ50vIn1d59BRs}n11`Z_saEKg8!9jKt?K6{kkh-Y^5JG5nk48<$}xR$(9B za0TgpSX^Ht-FOG)U>{at=(pG}#$X#}U=OZA<@=0JXu!jmg27Rw8&_i$-i#taO7gm!@mxEr&u3mrIs^%x#a zKfz@)*e_P1vX$~e13rf-cv+12eMJVH5V_0URI8Z%^XgIDT7@vMBC^D+zNk8}GzQd=R(cxOmzLMqoE4;~*}_h)3y{ zn2g&o2S3FsyexrqV+OY2R_wt>RJI2x-%KRkxByeogn4*3R^cw(iG$dNMY9Nxm8krX zaSRRkFHFIlB-$CS$7=j7HsYVK10SEwxP;2L3D-b;n1a=qhug3U58+Pi$2K%1vtQhT z!H+RcV24Bs7aVGA<3~a|r?8T=rcn9MRM&j4!5+1A3ggsb|$~A#?&;JuiF+b|FJV-;SojPUqPY{OLS!8NG-l=%P}a1c{4^=883GOWTT+=T-5niBDt5 z&uJeRg&$)&ZnIME_yX2qH#Xs6Jb?ek!#MqR#`R{(6Qgk}W?&;)uoY{u51a538{sh< z591mf|19GtM&sWx15cm@!|jB}>DYwncmRv=Fdo6s=NQKv^jGZ0Y&?RMIKF~IZ98gsA)H{f<`z*cO3l}X~q-3;cA!D51i=JwGuIp!y*R@`aoA>$Ne?Is9{T>(_ z3)sU7PFiKZGl6YPWgnL?@Vx#rnGttecP6rkb6CkB8@ZYtTwLy)WCdeeT#u<7Wsosn zb51ge)m+aIr>)j+F5(zhGvP-k1RiGw+nCSTdyJd&S;qplay5Hd%`u)>Vca{tZ(%0a zv5?!jmanjZlfLep;X)3un9)C0r%dJ!W^*r#`0N_}W;a7T%q}M1Yuud6*jDSsRIXx> z&$EOBtma{cn73A*MI2%oV_$GRrg4zD+`mq}vj2Yd%0nB}D`!0DoZ%vlaQ3&2dzW!A zldUY^%7=`bm2BV+wsVaAoW9BV`V;pDCUH5l81b-qV;!Md@B4Se>y){XJotQ%J|>SgoFB$hrY&-g}pPW&71l|1Pw>&9tK z){Uz<$ZE!PIM12F*O|k97IWSAz2D%k*}}-D%{v!!jFn7y#n(@m!4=P#H_ix|caE`+ z%YI$)d)UGBAK7PI!`N4SU5%;yJA<6H z(>`T7tNA^K*ugILa)^_EEZ=!T;3}r_b_ThICEUSkzReKF*u}G3d5+{p4zrnYulc?s)41U$>Xid5V@sQQ=c1pQcdlm-3tv?4+|Br3 zs{fyi|KFJXI#j&%x42vv7J@y=MF~gRfkOCK4$R{3wcwIJWJWYXW7nP z_H&F;Z#aM6lxH@xSj0kBaxG)`$upJhtYts9GpfgY{YIYOXBL0LLXL4Qr}fG+h3%Zj zer{m&o7R)b%zDc?!F(3;RaS97o0zcQa~v0NkZFDP`98mA1`C=Z`2=?7=1v$*~?-k|K4@EfK4o9Cx600zRs9l_rZSW8>cXb=dhSTR&hO>*vd}6 z#z7un%v+v&{vgkbnZsNbvzS%vWfNx}l;=7QvV}4G&Ep@{JJ$`UcWz?|hgi+ZKdCpy zz3slhQbzsO=QD}BnZ-dCviBY5I+F*T>nvsmpWp!ZF}ly^GnqAi)^F}$F`I{6mvaw0 zpV-1~_HdYSVe9of{bB~E2S&sBT+4Dk!aBCIl?zT74fpZ03>;AROym}3@I{O>(SF_GJu$qp9qFe|twYBb!)@3VtH;Q-%abic0~F_|ZvI2z98 z4J_u4lSjifOo$#0H*+4l8RRf;W85Fy&zQz$=5mmwj6Fr3nQUgwBzbmln6ponKWN>U z#=O(ynRL2&oA^EJSk6{%XD#{Ea*V+t=gV>Fz@Wh`bXt9XDR#!MLvcX2w0SjD&j z^UO3(jdNX=v6P*xVa-(iW`4Zu@+FRO)`v#J34b~va2GT98uJ;Lrr(^-I_9vIZ?K<# zV$|E_@htPrEgv2Y2N^YeG+e@&tY$hx%wZSTa)^zLeaG|9*`wi9PD_;MN|vyl)toa! zp5y0^hI^QjG#Vb^8YT=H=SQqFpJ5UES;@m}WZ}%wa3?o#koAoDv-`k#uFEV2xhC0l zxsTOMI^T7@hfUzpCfnaAV{M#E)X%v!Ey3#-|~1s7W9zqmgzkps-+ zC=0kG)jChKvx%G8$=5l=zc6-4U4Kl!c{YQb!xEOUn(Yj6FS|I*A*Rfc|Eu+4D)SiR z3YKsKtJ%U37hELIJPvU^V-LAMGnHqg$uo&1T*hivF~ktN*u^2v{-cfDvW&e}32WtT!)b%-_8aVG5sM4u8mE z9%2=%Gwcr@W;ZJ@vp+a(-e@@Ku=^x)ICQyv#Y36;%i$|V!|gmg-}N|hrTzF1>zZXh zaqOzma3RMRxDEr^uEX8znfU!e`)I`dBE zJo;#@2cO~qUtn}(L}1Dt`psF);R7t@V^UY7*Y2UD#2~iP&mzlw% z%xCgSb;bu-#|E~tgS{N(7{79tbMi#(%;e9?T$k-%bzS~#mFx1HyVV(Q;2`f}%t;Y} zTBh(7<}jgLo)@x;SFnk|!}VSbZw z(Gh_snZ`-?s8jZ^oMWuxSrx|3eD<=Afm0#^yO_uUW-|Kg?hj061?Q}>Ud&|&S8{+G z7(L0nFq!Avt4_I|MXX~bo7u<@t(9j52ieJ(QzHUD{)TZgcAb7Ro26XB8vcMS{0)0J z=|205S&WZ~2<%`w`2l@H^_4f>zVd|Jj>a~Db@0)8y^!n#7w3?D9_he!KoYN z*~B(3sWI=|%;;F_#$@hiHpf}S=?|HA&SN8&vV*HRz%7hEL!Qap&unhkB+tF9;`E2r z8<(@2O&n$~{a-fU(m zcRl7@;?{a~I`MJ#vgC2+N?b%BajSEMv!2jjPHwQjCO*z8_Oh85KPkuR@5y~I!k?FR zJ!U=adaPh6>siD7Y+=(g&M|g|%+J(_K=23Vhqp1CRV?DOtmJ++GVrYV`htX$7 z1d5r=HU^pUoc+wDtY$Ss+{!NYbBKA(o?GH00_&K{gA6kFhx*OstYI5l_%3@Gx5K{R zD#m{(BGAnY9%4SDp0_@n%{tCwE7!4?O&sH|m@q9Oa6*eb)0xj3S@Q8otA3 zCj894;8!@pwTwU8K4dy4w>yuxgk>yaEjO`+&Fo?3&z%Q}>Wzu~JTtk01?*r2M_JF9 zmz)PoWFHqYaE|$A5_d6+ds)b=m)&={j14ShJA2vBhz{#EBO;K>B+h3R%UH5Mv8o=N;7v$&0goVnY&v!0FI#SXsC0sfxRNuEPqwO{yIX0wOIJj^Pd z(&_%mv)IWX2l*glKH~oI3+u+&4Dt$=@OoCWk|DmrE@r>xJmZawn;8-K64SVqx%@p# zx$KwLjd!wz_pyhq9N|&MpQk>$>=!=3d_K-{?qwa%eBFNICid}r3?!>lCUS_G{Ma7r z&Jfq~Wj1gh+d0U7p7Sg7e!l)Oi3ga?)4QEhoWV+_v5~j1gWEa4S-&=KvmyeYVG36; zhvh8h4_L)RY~t;E%^M%%5T9l2M?D`gmG3dgxo?@#L? zjQLD>)4cIE)^h{fSkFGb#=r&c_e|vEeddjcEZ`zmFvNPM{zjhV>|-Ybvm*jWn8;bZ z^2}oa6W%iK>|`T<%MSjP1Dv^Eyoad`W?ZWL z@0=4{#XMHAj6Y>9BMzuHu3;}f{(JrYn7U;mmoSqLuz+2xV6b1kFvNC_v7d(qtoI!E zpFdeI?qZOW-qvph-gR9Tvz49fW&B^<7dZKE>g*!@Wj6P*h%<-P852f~mzC^hBZt|- zxHRV&(>Uin`-?%Aa`LGC!Asc6rR?Qej`3+GeB61!OpdaEnPaZYsYlf(m$Q>q9AqzJ zE_UA?SKnO3943X0mqAvugdt|1a3tKr8jdhJ;z&5*66X;!xQY3^Ir2!jf*V-RVYcy< zs3YM%rZJEn5%?jKc*}`L!dcwILjL{aBjHLejXn}?WC=T1$pQYE(VuX?Kjla`h0B@4 zE*A4WR`J|PN5V}EvXf05;vi$^IuB1h5>Dku7~}&i;d`v+sWC^wA(pa>>o~+MjJ-4> z5P6zBS1^|wS<0WVhG$Ja5^muV_HZ>v_-)2#I2W1Dn@>Ly&f`~E#wylwfGxZrR-W@Y z!p|`NGIhvwZe|{zWf{*qL!NWl!qx0yBS)A%#k|jRUt|`GSjatG%YHU+jO|?Ufg|C5 zKE|la)eV#Qp*VSdnuWZVYuU~Q9$-5IAC%{IMrYbjQ;&p`nagahVG-L|$pdU;)tT0f zdpXFc_#@$%E4)8v3JaOT$se+A%wsjzF~kmb@gRp-J?)5}>$Y#1#!==n<1FjOC9Gjo zf_dX2_OP5I+{O4Sji2dU_hI$UE|zngb}B-X>OISIJ`-8NOuonh_OXKN z6U`gD+0KY_%p0>9b(Q-VlNd9@ym0}G_&HYcSvIkcot$y5d1EGH7I@BQDlbnmZhncS ze3~`vWHVQO#JKq?$M_x-u2xSo?Q`ZapAqNjH`7?p+t|hp>|+}P+2)6doRn zvx3E}=Qg(S*X(1MfomcH=btanTxN0?3pmCK=FF1kNh#)y=dqug8MV;!$_46;&CF(C zws~VFD<|67$c-18H*Vt~dl_@B^MWZ%zsS6CGfNqlX5KiD%`9R!H*%P*jLT7fOk?cF z<#~vuyyjy2lq=Z6CiZYQM_77^dHL z%q`4j_B`h!Yp&359%eJ&ov+`#>Ppw;a>jqkdBJqP#5|T{sdL6OkU`^T)-j@v5F_wYkR0 z{7+k-#h$xvFu&aW8Fk6opEWBl1tdgeeC3# zrOpxVWo)kc{=DmQKXW}L-nZZf}2Wc;VS4`(_LF`rYGnP29!j>T+c z)ED%d)r`5p>oJuHg|5q7mhukP@Vjhg3%fbSVb1!Zdi;$0A=9{nx$I{t|G^r5aJf7S z*~8~J#@CsU=eeI5%)8k>F0SVg8yS0}=WV94lR-`?R$siD)m+XH z%h<(Jz9i4H7@Ke3FqPXFWa4e|oX2Vg8R9Z_v5`Z3i?N@x4ou~=FUvE9C7j1ON8;&uI*@fF*p0)of;nd)UQ(4)HK!Kkq*G6?uMzK~}SbPqUhB3~>*; z7=ODwKgrkv^~hANXOML);nS?xm$8IFR&yCc+{P|;aEL8m zwQrX@2Ugj)%w{g{VJUa8h8=9?A$Id)ciZl>aIxtS##Vhty+ zGj1lbo69-O?=Y@d-7sy!`<&BEu5?bbjCE{b>qI+yd5B|N_)X{Km%J}$CU>!bU98~L z^~TL>*~TjNv4MfxydD!d%1p-GFVDrS;C-xT2iqpBGHw=rOTB&B{feoqVUYV+!qYdX zHwGDERJC)SpMB7EOUyr$7_reg%k3=UIIEcXZO@rp#V*!zi0zF1igUfj{eg#=&*+ED z7pJq1J2&YsyV%Du25#5>u<zGK`RV-}~?xj!+5Yq^V$W*gfFq0{S5K6?^$r!lY;3Y_eEs{LXI6Xue_FlqMrQF97O{_&JmVSl#s%!))R1-K4UE3W z{g}zzz--pDh#5aHZ!BbpmF(h{XFY%NZN^tP$DT88E@U3_S;pH~%YAI&AbU8qS)OYc z|8?gI)47Xzob^L_Ue8)CXA8INFm6tLUccAaPc7Dqix^}9OSpkGtY`pt@XZOmv!QdpV-&DmTS3`4Qy(YW71Du zk8Mo&hV^3xSG{Oov4s^}+Aha-wsZQ=tq)Tfz0Uq)GOL))oh;(4mz)Q@olUG}CmT7) z$uB!k?wk0&g!6>gGlyScG22+p*bei=WOnmg9Oh$;t8~6HjR%>_GhcC@@O;*AIh*+~ zyZJp1^C08C>G}9o(cZ z${P0aJ&v*9m(H{My$|Vfo^d4$*vkq|f8BY;1$&%_jQExM;&qIw^7XQA^Ug)g<~=Op z3#{a;Y~(OIIOo^ajYW+9mi1yXcQBjF_nLQ>vx=M9#71^i^>Crn`zbJ+Q& zeZj$f>V+}A_9Lq}!g|I(;Ojn2=kQzVlgazlC-d3BQ-7Z=%;Bpn=AT%_BWz;HJLZi=gXWD-GIo>S|JnXx z6?6F-OPTSm^N%ap!YA3oJse^5U#$1T=7$+dYq- z`6e?Nd{3U+xRzsVWX!1b=2;xzLPkG2@%<9}ggcnc4i@ncE17Uao^#p391ieFMsIO` zA5||*9ak^BiNy@DioanKv%=<`t2oF8#ysY}%M@k?#=<$glf~T1D)z96A3I^p&v%;UA#P$9qfVCRRK`Bx{XA2-nn6Cz61K6LM;YSj z(ek|IlrcZ&t^OF-V1F`=W6b4Ulg7ejJj6OCpE~B}yv=*eSh$~aPBZTBMg+dV6m~L) z{Ve7clZ~5=3~?vBc-rau&5ts6oBJ1285OJFoXQd|VKpCMh<{}lGtbcPiH|e>N%PNi z{+@X}cZz=VV%9Q?Exe6Ae1m~T&%YngZ$8W*f5;NP%xY%DjfI=JgxxIWF!wS3d-fC4 zx#WXm;d~aeoU2*KYPNEmeN33@y4%ew6ZsG``4S7*%L*Q4J!hXe7H;E}>|-edPx<;I z6FJOG&WM-iVpgz%^$c-jY;baytn}=A$ylG?MN^W8!Ut$NN&ywe6Mt@&D zCdhLhvw0hf7-A*oe^{Q4?BGETaO!mVr(K81e4E(}o-NM}tmG~>GLR_GjU3@%x3CLc{Z|=QRm4so*i7k0hTiQS?4>GxrNzmW)TmvlJUv%tY!zJ&zEN*qn~rX zU@|u`o6RiZepYgfjhs14o>?5=ZH#VqA7wIkFq_>h;y5dr@KJd#U_VNLaG5QkY*lAyKh+kmrk0S!#U@D(wkiTXLbJLB3 znV&EZe1KiNdagY48Qbc83R8JvhCCl<35zb1XYfjSo|GleD>%eyS2^cjaPBjWH!g5q z@)eeG!L`Q2yB9fkxbjoZ9qtR7$6XPD4_xQm;TM_7gvHJs?qLN#a=mkh-(ws9oGZ^a zKP~?g-@m#+o?p6Ao^R&M^Wai>E-H{`aG5;o*vGr>kZ)7pOyrfN^8D1DW8p$xw@&?X zD;s(Ged?DRIKWOu|J3&_D%Am_zo`!RB8ynEUY<$!%kzXPd1i8eWsH8&^D~oqkl8%@ zTk;ICk}p3g&pC~r4|oFy`Ax?B%yTAFIO%)VjR`E_^rzGz*M!tBPx^uSWhI9>#JG0n z!n4+mJDziY<~uE8;Zm;skv#AJu{?LNn}6jn(_7_#?$19kjpw`|&vusb#9i`iVl%UU zBF_O1^T9Uxmz;|~mFLUM<*6^qb1`f944e5kc608}eU6o2=ode<#oD4#;!X+w#1Zal4&&!}4q!lV{PmJl|psYfm^DZsvtiN5kFx*-1yk z!~D!CN5gTis?SMB!)g5TsYk=Pye#HuxRg(_hDE2z^Ox-AQ+#(JDYjV40%pHSDxQy z+-vR=Ok-7&Jg0p`o^3Pb`HA!7`Of+BEd8iFe|v%aFP&ql@_c5FJojHD&nMI5`IV2$ zvxnWBcdt4N|)z-EM?RuQ)n zXViRo9%eHKu9WA#EO~ZbCBJ9loRsHFSIhHf+44O38hOrPGlT5r;~eJ8jQf@EQ!$Oz z3+4GVOBs2sJnPuZJ)b%n&gfQ8!K2|q&dxg;uHsQYewKIbqqnQ*Iq^EOuTSvIkqojk-rMi(Cq$Na|E37Ntz3^M9V zN5f^zW-V8+g|D)QZ*qi_Z!_P$_HD`0a5}S@$CWJO@~`MOA7v|l#a^CxyMFURCcNd` zVFqt!KEF|F+K=KX$r@&|nFrX* zk5wG?^WDySCbEH<+`$4Sef?;7ErV>}H`vaH+0PM1_1oWTj)s$XC$regBA$J(ar0wr zIl}8!moOSjYvsleL z8RGryVk?I@z}P=}pLCx*YZ>Hrmhe?pbBrN=v{Ih=9AYVB2h=}P8Tn0l=CFiISf0@dy4Dwej;qO?@`S;874t8-bhZtQY|F-KemDLRLAWL}ux8zyK zp}#nPHmHjs*I_BgA2=GW=aL7_E9*Ae$K3yI>-ksvqDCF_Fsly9KV-iDW}TSAgSGbc zuyH&h$GMFEyZ+UwtM@!FJgSaH?H?A8IS;pZoukg>$Bu^kPL2#*z(90l;8G^Cn3;T< z1-zi%^-qfoWUz<}S;@QE$QRf#(f+u3_&}t8=iWTBz}`TXl61BncBIZIfAG@g;U~fJ2=6to)z#i>X}4Aa}5Y zds)p9hB)mxd1i2kD;WE(=N_iAmqCuQgy%QQa~(r$Wfu=|h{->ccP=btD(_&B?JVIR zSj}OE7{5cF>5OwulrfE4S?rwH%PLNL-g(U>?Br?=atmXeBXKRx50){9bu8u{Ht`TU zIpariT+BS@%{rEGH)}a*r~Sy;?BODgu$}SFqvRjk$IM|K*RYmb*}^^SVMMFCa&FCJ zAs28h*X&Z?+{O;R!~sVC)Hn|7$BX8TRqg7OTUg3jKew;AjICVHUaorC{qi5`jmezU zVf~L9%?xpXU95SWFzqd_EgF%)=*)hZDx#eAH%+d0U7#!S)g2=@slv58qc@B#g1 zM4Wze2Af#QF0SJcn;9D!8JPOP@o*ZGnadkk%9X5P2V1z0J&c|@9v)%Rnfe{2pUmL* zna}ii{pRg#;3l@SmHixG)QMi_L;B4n%w`>nIKWDlO&bq4GWo1=f8Ri4AcupToG|Y1 z8*u(Jg^QTOt<%TDCEUeo_AhmD{+)R1`*HJdYGmL{rto6saPr0Gfpb{RciF=2 zm$)u>GY}IQ=*p1eudf*Q_XZfx{PA!Zf5$owv6X=<)hnkhux_5mo@5d)yxRDA6JsV@ z&up*9h0NhQEMfCC`oTHZ>IWCIhqrTt8ySCkWZ+q*a}V=)h-JJz$9k~wlje^d?Bjw( zJ+|6=EEjABKW-Ci` zU6f64e* z#yXyLn|WnF`#AZ_#&@Ru!bC1+ChuSY<4W|0%h|*&>|`?sxtlTZ>fkH-!`;l8`2FqH zg$G&1*gNDoo1M(%An#<%hn!2L)`dmPV?E2bgSEWmPW8kV_V5!c)f4wIewycOrgM~e zOu9>+LDsT_Ev#b?TRFnF8Glw};M_8KE@B?SQvXn7rTkreiSzam6ch}p;yy1TPn3W9iVRmsFhuF43 zzY`+^UwuG7S;aBdG2xuZz*EfNoN9H%T2```jSM`ft~q_9^Nm49&xj1{Wiqe$w)+HE z)z}w2$Vx7KNS^!I!H7-r{3@f*jSSq+WNu+Lcd>~3S;?MES@>zw?E^C8Lm zQKoSxbGe_T{2OaHX|w&zi`dNt9Og#GeZ>8kXnJnaDuI24) z;1;%X7yFs?sP#F|eqahWF^9ioF-KX&i?&!_E@da*%OJo|Xxy5=?xa6hBdoC`lSZZOA9BhY>Yg*$#W@^eK4UNQoXd2^^cV*h zvy4NmW$c^omt4gj)^da|GJc-=W;##WC(jg?aS?0zWwx+^J>0<&CjCa;UheZa#@i-- zpJ`o~!4UJ=#d1dUs$))JD~s97Ega(ym~cg8;P=d6;#=~}W;vJs*7?B~*}+i`aM1zt zFyH$}rm>s3>}M$_|6V;Xk^^Etv> z8J}f8F`e6($LzQ5BRR*g&;^VC0QZ}=k-Q3J!ZfD#z_5;&6 z##|N*sgH@@|J8ajc*uHk?%$j*T*JUZ&oxZser9r*1q=v@n#3^I!wS;)hzocR4e%mWXylU*am&G`3>JIB6dD%Xr!4{l-^x3QKx*up{f@cbjz zlb167lkQ7QXEpPoJ4t#*LdVu!6&^=d`f%g_8o| za6hkL)Tf-gOyaA|;#(}_4JU-dYq_2ce4g$61N)f}As=);Fo{{r;@4Tor?{38k@CER z?YxHle4f$QMF#%FWKNF?`+0NsTNd$tR&qBR`7S#cbz<1hoqG;q^kU~Mlevf4{2PmS z;z{zngH3#toqUFa{P4-)aP0NYFIKaJA+BW?cW{XPjLr4_CpsKXMvVFpnd= zjq#sXhfL=t<}u8xaz~k%{s;{^E}8jCQmnR&SfcYW(^-=Ghbyl)6SOX z0>*v8eq|aTXD;7hDNjt4X9kmzd3eu!yH6nKuU6$VPT>CkOZ!Mlbi=^AUM|jM-eqA~vv+&$E%Qu!Ex< zVC+o!o1F_xW+k(^heiAyD>=+YPCrkcb2z{tql>&Ro@L!Q`J>@*4ij0-^c3sHRSdD2 z-Q3M#_A%}j>vw^A<4)$Whh>~J+rDQ4TeyflY~~23U#MPJ*k?@V=a|R)S;n8Tma|gj znZX|3!Vx~q_*;G5l<7>FW1lgTYq^*WypQc{WItbFRIzzv5;HEcPx&bpvVv>5j}07Q zJ7=ZIvzk#~@?6Fw&b?T@a}i5ez-n$_h`(ny4|AAtmzcNPA_Mc7#uDaoAU*8o!ktsB z=j2Z~ub9C;KFFvqs|zOaMP_l3g`7TDzd4%?yo~KEWJ#*iElHD<1A$IrSe?N z29~g$8`#etMt#Ne8I$ zKfy-c$4*9MxsNiAv3I%-Q`y8I-(m^>!fIZ2mGgzG*v$YPLDVM4Y#XEx*S@_fj2)-aDdSjIlqa>_OG{33gJH%GXU@n!0U>HHh>dB#Hb z1ukJ7Z)YptU@zxg>wNsG`xg_rjhWoV0;c4sSJtqBEo|o->}UKZ)ypdPCnj?hv)RBR zwzHD`Y-HOa>&*ikV$`S1``yl2rZL1^P7RtjUdwSJXG~)sXI}4I{F-@ZGFLF0YgoiXtYluU=fjD1c5(v;`7C2rTSula?$hd= z7qOV7tYR}m+{-QoZZK{pGWH(l7*jdtGuE5AEaOVnasyj9&K?%#8TUjx6Dr*2n897l z=NQWw_gU-Bd)dlO>}5B{IL?HxtG^}k%wRtASjq3@3p4o!3pj15 zb!Q6e`8eA-_4Cdr&SdmAJZCbQh0Nv_7O{(!JitaCW(N}s(m>Q`7>s7h($c{ zCV5`ZCU&rsQ-EbX8_zL5{>FZfcXK=ZBX93IkW!7;ETiL^2PP*B;F@Xu|-Ori9CCukq zmUAoX7+ECG53+Znoq_wEBTVEI%;X*xFyirH+`$x0%WG74pnx z1wX@ju45b9*vCT*d`lhOD$jUkay|=K!3u6+JqOvw}KJ^1JL{;5K!`d`3UuTwpQ}Fq^|H;+!wbGoOvDVh6WyfFVX#dtPTUBTM9YIg5B5 zEBOUBawR*sl>^NAin@8w*H@UzA2Gn2}gS?F; ze2di_Vu-U#<(bDJzQ%-at50Tdg!#PrPIbdotYZsXd4RplTWQ=i&R-^TJ+rx)McmFx z#@%JyOk)SLIKZbF{g66fGLJHw=atFx6RhM)HnN@_e3k?J3!^tVSH3FGS+RU8e9E=5Qa2`8KN|`|uImDP+A1{~Z!gcmLOIXSf zYdFMa2JiD+GVyT^^R@@g`y;+?#|(ap`K)I-2Uy1=Y~|#Q=AG#r<1!{}Hjm8U>&$0A z%X#s)?H4X&8<(+

    kR=am}!jrTE!n_0{Qtm5C<#OQ~Nn{znGe8$wdpEHH8GKY_B zQg6KaVfDt94DqB|^~PBoVku)EwQnDBPBP3~&faX^SjHN@#ug@h$GAE7QO`45>^mki z#B3&PQ7@d$N^WK&UuFk~Ilz-1Q!kIHYbJ9ev$>B&9AG7{sh8*7?BGrgaD>tI&Yj2Q zxSU1Y#7g$Ckt?>!v5Nzo{Dj=&&QB(@g4vwXAkQ*Zat9lEkR43^t~_@#daL`~HhC^( zHaD<{U99A?C*|3}4xZE~&x;xTgzGSwlfEa<5*Bd-E7`(E?qvr9+vPc((GAv%$z0BC zRh<?;6(mk|4m%0%CCqE z4u?NH@v*BW$F7UG^0bq3b;xfg+M6amuKkM>{<}RQ|DT^Q(cU@nVeM0oZ~x@6{Gg9t zs{I4Uw=X=_9%J0IwV!%?`}||=DcYxLKmGXj1;^TRw4d@{^2OSRQ{MmetF-_2zqB`L z->rSh@z=lR*!4TLw`%{$@$LUJJ^!4)LG3@)e%|rzOONGa{L#w}?d`|6NBsDopD;1M zDcXyTZ{G3kcOJ{68sBNOQUzE>b)R94d(Z|1P@Tz+w zSG&r@YoyvXZ~L708)Hy=-+yT@(Y{yv`>mnJ7eB}S{&N)4{^oya@6!I?`ZuI~qJPVc zm^u5fe~0S0_AeY;qg3s4{!4pM`#kLvXT*PA|JGyq677rsOMA8U z<=QVhK3{q)AJV>7`%TBUN96sd|6ST&(q8+&+8_8&`;hi|7ak5@dVKrs$6i17#6Vz) z_V-(#RP8zM)1K%xi`3x6>rd>Fs2}@7{r|3^w_ks(4>j6zwNE>~ zkJlY*Z`Qs@`}E`6KYgsd`(J(h=ehmw*Z-d-{^vO`tbMWk1;^(LkLBY|a_(z?zZy@| zeuMV2j?XVXme18b@%m>U-+sff_EPQFX}|FJ_T|UgYyNfp|6l*&Wtz2rN&c$i^Y-Y( ze0FKur0w40+agx|^Tj9HhqS+^{fy(=vyWXn_GJ4<`~UCS|J?uDN3@@Re7@jVKBzq+ z^>Fy| zPyZ8*DO>HF;q_Pe|53m7Ludc4udAyf@3prk<|x-|4`q!*ICGGw1bKTnWwZC5t4{Kkc{r%=Y z&U4wi|B_GBUZef})+hJ>XfORg+H3yRKI{1Tx#`&aG;81D`v1T7B$+`q{$TX~BkYU= zDyyo6f9G;FG#Ys$jy$9BIFizcBaS$tq2fp*j;J`I(uj%^87fUQqLI-^O2t!BGBlo# zjAvwIWPC_QeDs4@p?qA5xMMl?_1*Ky( zM&ZX$-kKMt;o0yH=<+IerKPdFhHudPT3>%I{7gf?LzzcfoJb`o)G%#_JH7S!5PMWW?8*?;(esY>%M=_%-k# zJEYI+h^?F8H%gzs=TFJ8QSHY@2Xez3_bsj$xr3I;z0Z%;9_oAM6x*H=_&D6MCqmy( z!CiZP!k4XetSWnQklT2wC-=B5SB6~kX`b8IUihFV_kCNg3pwX>Pwsoca=G|* z1i2k&us&v;75k2oE4wS@&e)d@Xg%<@cco-T-OiSNm`A>@$kTg=l9ybd+U*b%KR#>U z;(t>n_C+NpvGbL9?1;V+iG%f?~=IqH&u_= zy~~fEapaCE-nW<{aw$qq?0(B1S5wp%{g53W4)ODE@N>nl&+{dI9Uld8e@eUZ*ag^d z4mpqKgiQ22w<6(X@N3{fxmkD}ybf-?1Gd3$g$MaX%J;$Vh9AvyqW*1uJICPn!Y#kg zc>D@oJ{sR-5dG;a40jv#yZyg164?Wn^07gFEMdt{;_nN6J1Wp~M2T%@1AGnKva`eE zRyzmaYeUM9d%P~GogYi|(>#19@R>nY}D`OKjKYzt;D7LNQLrK z%9Vcnb|Cl0xy%P5cgHfh43+<=Z+eS8Z;ZfSgMTEcJ@LShew~7EIL}^_rLyUe4Y$^O zIq)MwcnLfmZuMu)et64%c#p?#OKPA0UNZu(r~cX`9)EFn+YcXtZ_r%L?Wt_cy%5sA z9Qa5GFM&S+Z`b;xcewH7@L3IfL+QT7ZJNuNDfP!pD>606SU&9a_;FgtcE9{6ygsD- z^nQ5SVd3R-J>H`0kKU3PGo|o}kos%)!&^OWwXYXG6{3H1KYV&WJdNNN{Z{*O;brIB z{ZqOhUb`ROx*y)_acgcFg>MV7Z`$Kl`Lx3$k?N50xgNL5m%?{YK8QQSOf9?t{tX>J zG6wF6$FRt>Av2H6Tgzqs;>+|S^UMYN7WXZenexZNI5M3VlJCf?iQJoVkeg5?AI!t= zEVKJElZ_VPRxB34?+Ynku^-;BAKu|{D;5Xf(Ti;R$M?hM_ro*)JzRgmet5-xc*A~p z$A0*L$F2Suhp!Cr&-{LPCYz68!dr_^#?bSa z(i7hs_+AV-8LvI)xf4A>@Ajf+5-_9Q*=%{;NQ5?%$TIzNWgIZ)$%cxMO~J9ob?uK%B@;;&_P?oD+AMC2Bb%l{1i z5Wn7|Kg@lPZ5-G0ly#m9M0jIrn=uHBNW`q6Vt)4s*mW9T_S=_&nEN^9)415#d+*@5>~ zWG9i`+q`eFkLOs4l9fF2fGg(4;0$%{{Jh;K>1)Gz-hOyl2$wds5DZfPuH&)udoTF0 zwbZ6-k9Um~|8$~j_>tf^6+Q^h{J!0miT&_}{qQUXs^||IuTp;@AS@p!to7H%V@ldlDKQ2Aw-vPG`Q+G3N%6;5Ey9)kwjHhTnh@R#zX8r`yzhtj z)}uQH_F%`y;75ramn^g6P~VPO^i=&IIBr0ZT;f7_6VI{tChLiMcLhYQ9JvAHt`)hI zWpbDMW3HNx`v-E?nxz?@`lx;0-wlt#t^ON^uY?EXSqIxB&V|c79J^kPId3i&8HX4t zM5aV!&Qmh+?F~0~t7_|M?66x9x~^9R13 z7W7>9qu~8n8EZr6ITwDSjO|}O@B2gM@T2{)J%*mGkL_DLPummSNggr{>j z+5=~L@_nlA#^k{tg$Ipghaxq^)l=|~@*F!|*{SYF)T86T$AjA{Hnzj((Ls}a8&tmU zhra{2VrLo~iqKyoHazv5?<+Ni=Fw4&jOC|H7RzmL%Z38@y>QD<74UAj<)=2{^80Yt zPw!VYDnE6iV-^`Jb_e0vgTY*4W|lh2;n#{Ee)&t^4-$J`eipebV&Y!po)NhpD7pB$ z?lB1-2Ud(+!H?s2dt(2k2hRFL_RSlYy9ybaefW_m*CjtN{86=6MsB( zpeOAKJO2#8)8SVB8Q%||_qa7~CC=BN|G&k~pK`NOo!=~-hf1s#<+6u?+$lV3897=I zUIqUioZ}att2?Vr@CS_Y(l-Ox@gum~hntt#q2|~T^t_E6%V57Abti5LK5x_`cBT@@ z=|8dKJqNxTj@x|w+x`A3fv<%J^@l@|CSq0icAjH*KI{84>c20wqNB>tAvX4U+-l<} z{7TAOd>UQ}x5jiD!LS{E8g=Qul%<~3p9^nhRW4;>&S#d<_|E+|9%93gMY~k;vylcmezdgUh(BBi62g zm-8HZc*OUE9M6Lt5yO-o{50-O~>!H3Ukh_Fu9h*yci$rD*x@M4Z=etcSl0 z4~lQ$?IGNOk79$AcgNUu$_AAO#?kQxG9N@f5ij1mo76E6U-{Eu8yt8ZaU%S5o?{2A zI@DeCLKgQq$XMgJ5}t3=AvQF6+$!G*FA6C?7{a9uv$R3VyMEg8l;2m%Px57+i;*cn zKH;ZN#Pg|)&jRA*diWhY#|~CHWE`var4sZ!hnzKTYT%=AQkP#({Ca}BZfb##hm`Mu zzZk+t;Je{xYW>(K*Z#!UQ}9{1v?Bz3bMbPS_*Yz9KlLGVA2ODo$KV|ydb@KeKaGKfD2M<)~@K#TVgjj@tgDANMLp&7)%k87og`GH9NImuWlIdvgK&9k>;5 z74S8~c04t}GvGmf5+8JU<*j}mfM-$Onuo^WYvESB&%=*_Tk}9B2_YYD`M8WYIvei# z_~4%g`nVDu&B$1JzR}~QNj^T?4JPqHC%ljHRv!$)C*f8fPQYJ zc+S(oxkvaO_!;mbU0$7^#aQrP3AbV)8(s^y{7^|OeFpCOVf9b`j~~Q_8gvXIW5sg| z{4qFNm44oczZ$uDug5DN)YrUHM<%i1Ny;B7`$P9X;oESocUJNqe~)MuU620Uj++b? z4TJEYvFT7(KKyC;MLZ|wl6Vd~OL|r8sUx=DMCNZi$Bt3)WVzKmfy0FX+!2=WUN^1gAc;3Se(L1&%)hU z{4pnROZyfo_s^mu?b%>|hz%Jm`c}iOSj~rLz^(CG4nG2Jt?TOH$H0T~qWGzo_!KUF ziXEWZp!UhfkSRyTeb@Q(<9<8UyUqmlG$3;ndJ=w!e^t_ry9M~oa4SD%oe_yV2)FWY zA^b(SH3wG0_rckQ^XpgN18ao813yf2wdU%C&%%S^R{CksE5AmUS9?Aa@CC{T^^-%H z1$cBce7)t+xDCiK-T7_s)^%b-5xfL$`LGIJ54YOb1iub$&C^}*9dOHsL-3nI%1^>? zhFd<06cHovAp70*KQYn`{}XMEeeOqooXOb#jX(BF&{OrxeTy~7C1Ndll`9~As)6^w zNsB)B-ZO-^z=z;RYOd}I^n`G+a}qnH{3ATa{yLCsXLsCA2bM~oZ+XreH)Bf98#kgW z7nvQ%bc(J%B_nOVGpnwvfr6=;SKO0 zI~>Ya6Klfhib(7sRgZdSu0zM&$b1SJ-`4mGso2m4-wR)(xf;`b@Tm|!27eXK>%FgE z-E*IT&%@aU^tpFlCH1GD&DqQg!MWRkOPsHQySe$9M}1$ay|;376d_}c*?M>hybXQ6 z55AZfEA8+BxU3@*JU*1%yxk8Ug1?}7^cQY<>F?)Q#MNcdf$VSwl1LO z8RRTqWfgOu9llD}qxS9#;m?KeO85{wC|;!gMvq(dcfwzw{2{u2wck7le-du3izeV< z_AkK2ek&HTJ`^u+*;fdEEyTV`_{$;oHNxlNmVZ0pdqeCS^vcV4OT>vc*0T9%mRMiC zn=`&B)>+dJo5q-$l(~6!|zqR9~cRzg8<1CGQf2eq$hUXgk9g1WV55l+e96MFn zsm^Hf&SAbr#_F>&cqQD5sXDKG5p^W`OudV>!EdL$71Mq2Zn(8R9)mvu=hf8LPk+n) zjr2t-F*5>xhUeIaAMyJl{{G^gbxKTRvaq~v+|JVl@Snni)Ot^O#7??%7eRY~|eCC3eV8C&)6S10WH+xNr!_rrI?|BQYso@U{{ zg%@Edt8eI*O^|L}U^% zrp`+m;FpHj(BW~*hB0i|OnKLazkVmsh6!}Eh1jqFe;~w$tPA7ZijzWkKjnjL6hBwO zyWv)xG{S!jx8l4L-UqkhWDx$aQQo0`iSsV_-*}Ea`;hX{p2S#F%ZJVIg%JJS@ST6O^$){4 z;X(Rk-jq1M4}J&Fv1fbyIFR>2HE*VE#ZKg`yqW9qLv%a6_c4dhs)@(fDDRHRPpEoS zUZ_Jy!7FxNXoGKoTQ>B0Jje#=>oNFgl(+Z{d>#Bc-G*p9n529riXeq-!U_IS*PN8nZ;mG6hw!xyRlcwN7`gVGL93#q>!{to3=>GEn{VmEvygwMiX zfj^+jNB`3uuMVF{oL5u-2A*Tz`=;+hwMHnogg8KEt=6H=t1962A#G@YUjw(|tOLGe zLn5cB`Ul`Qg_Ixn>bLaI!^M7!XI{!XoMFG@6p8cg@T=tg?yhd%NAiAmk-OA&*CJKu zxo=PKT2u6Npyx5T`x{!9FVnL*uE#;H2R*O;*}nfJV`mhZ%vXcoC8e$y{aymUD#~-p zvbrwv_d_x+B{*BCh_|tI9cjfS5_)*lE=sR`pQty?w;K>2%gc{Shk!`J_> zJs<3bSHOdEg!pL|UIMq~(~Jt%*Ko`Je0VwBY`<6DYF|CPnDW-XRWGr*9q#U1-S$9o zY^i;#LG*m#ufhG~(9Q|?D7;7eQRX~#_8$2#u{<5mmx;boxzd5(565MGUwU7#5MLI- zUxa@^bM>2QRq#o;<*O$6%kYzRd3Cz}-CXvt&IfULFvC z_o1izHM>1y@OusJP<{s90>6;wM1M<6#FuNXtr@)7_9J7>Z~6P-4rDLt$Z{L-vtj^PdJocpq;I7 z$#=24?)TdnU-r3uo_Yo6Qbrx(t0Lm29lm)5IxbW?;%8_ZWu_8a%h2=4-|hIUgLlJ& za-WoMgFgum8jlXV5B>&x4m))Gru=Vwt`r@+k$L*f;Jhe&7M?a6Y@-9uxRUi1<*hLy zG6l%2L&tA;)^If8t+;K3=Z4hZ377WWqwQDgfI)aWJm|gC zq09vQ2{@ta`%iM6x?>TkA|4DI9Ev&cSK(oEXfZO^?X%li4X=e;anKC!gj?&8Zuo<6 zD}M~bd*Qhe{#!bOS9go|zz5(~KgX_Szb=Gl!^J+UAB*Al!%x@s<7c_vAaPy|e;j`1 zGQM;-xf%Wv+=}CF_%k7V82%XC^4}i#F#IrGzlwp__IUZEaf1Ewv+ZJkHvHF=51P9j zcrknm{(Y@q;_RD#E~r7KVb1P@7Wj2=YpnHnFS4#NX}kd*MOz znecviH~a)$UVTSnx{CD&++CAB|5e`(bq8)99ka;1U+YlcG0m)Ij~AX46DoHWz%%|~ z=k5xRTQS`Lk5S&@9dNPlI&GiYrx}2sLHRYBt9v5j@Iv^zS0J#I6H=n?B< zSKpr~ftSLqw$#9{4B;*CI`}18zc*1y%=f?_gj?}40>39j{}lXNa4Scqek>CCe<9^_ z;6F3U=U`tI@$?-0MxJ9|Y4`hLY2EJ4M-IFmU77FjyDmH@d?~T_N8jHa$ovVJvzN)- z=;eq3_<@Vda)|m~&p7;j@Qu2>I=7yOp9Hu3ky*p|f*-2OtG|^~06!5Plncclb;NEq z{Lehc?)u9A^~bOMwl<^dWn`_s?S?-W!iV8cz^%6IfseqC&~3TMuRnGzYi_ue>$2g$ z57A!?e-(a$*6-zGiQQ^Azt)&M|EuqeH^Wy)<^s#hcpD^k-w)rBf-kq;?fX*h8D5d% zHbm+fMNe(YT;Lr{(G#Q3`{B39^9Ph3i9K~sCWEA#7MnBITlw%+@W;`Uh+pq_iyS_x zrJjf35__>#pB2fP<R+e*d$k|) z^YD8qZ^e8jhiTt~TjdMjkHM{&uYf-TPg?V;m~VjZHOfn@_7ThffL|{$|K+><7?POZ z=EwXHdI}E;j(O>aNq95-NbLu8uQ>AYaPGiwqr4R-MesJb)sI#1`{7->{^(Z|aoz-9 zbMTyb7SjdKgIoHC;Ag6qvjiVy?Y4D`AteS_a z;9KE`Y5nTmqX}LTVqX{h6u32xhTvO5^iRUYeyje-C&&Zvpn1$~KRgG{R+`FF{#}W|d%ZX8m-1AjQA{v!BGA@x_m4}5n>`{8d<-s;~jcq-+s{uzS5P5B(%e($cd!)KH5 zDCJ3ae*eYqI=ZV@@nP(f#1JwplYJR=KQ9~J8e&5+d>7oZp&I^${n*fg%yS_&^uW{8 z=FIij2s{ODqr^;e;$4UkFlyR`s)d`PEWfL z7Gh&Ad=?#+4@=>D;Z`5k!dIi;>cdv}rjYu3;TuBuD10qE$OkgUr{TG9D~8ios<5S%GgWsn4(tEu3p5(yFiMe->JB{aOs7#-QjgxTx9|IzU8xOVp-2=Y`9yI?r=pTW1 z!hfj88TO`p+Z}3dTu&pDcbJ{O(>{Yw;6d$?KF@`}7jDH=DSRdTWMmUDQ|tSy7M=|+ z(>&_mwP=Nx!>yRQvh_Km_z;8x5`!#@nS>`!ZC4;OCPp9|j(x9l&4-wn6ytA)3~ zE&E#G{|UF|r(XDj@NG%{i*Mv*@!2SR5*}o~PPVT0@_OAZe%z|O zUhrA&L?C13^$K|H;lX)b#zq@;?1Vo{yvEX19ZSE1{iq+e-RN5N@Alem7#=maw0jTy zjm){lFY}y;OMeWyCsX3Tv|W+N<>(2D57ARh{9FM4U!G%iyL`V$UiiHq=jG^0Kf=yE z_3$I$R_<$uuZLT4(ho0!Te)vHybitwI}`2o&W5BNv+y18{l!5(@$w9Er%8Li@>##V zDh`U+Or1o=ii0Znp7#dFfrH*A_+EHYTg0Dd`Tp!iW_6Z5?uOx;;fJ6v(O&iLu?M~p z9<-hk8?uOx0(dUZvF|nd?exwpBsOxI@HsNpd|3kD0uPEEDPIFG4B;*C^#*q+-vf8x zG{tXYeBI)%+#Eh0ZQ_gRx^H}JhYCwv*N z=cT2&Dj%7*kqL?~X=^!r9)1vGJE0>b;tpux_3&4YTJ|1*oiY%Gx5HPiwbx($@O1d= z$R_kl%>2=hnQ>$$kSWzN-oBB;XY=sXqvw+Uj-%*Mag%i`ae<7r1}lVL2oG9ANINRw z*TAiqXoOdU@J{#^xD|7Q@N)Qi-A47jjS2X6IN|O4DH?xi75f(8L-3&aN^*356X&;Z zH%I^1r~PpekfTdTCYQe7UR%__OAYQ&R||X-e30j)K8+uVxa*f*WL`qXin~$xcnF_{ zzX-STL|QYyT@Bx$ZBX~Ea^b&)Tm4ZAeosROaGw=%dO3gpy=Z*9)FqgoCV$7jT9=sSH_Fhnq zOb;?v-l&KF1Rk_b6Cbq0cf+lI?1#S$53*6p?}kr==%0nZ0k1$dG1k04-YVrYXxzFF z*zczK@C)Ea>hkJLseC`Y9)3RMt#xiYd>h<~fqr-?{Bm8t`u^>1cnkdfnyb4#v+z6N zRvyS`;WzT(Rt)9CZwTS#@ay2#II4$>eL?yiY;K3|f_JXqA4~g8GLPTsuZahc*|#oO zhxFk%d>U@W$UJ;6JjlmlL*{=FL-5134emN1R<56Te%?XcHXNge`r*-FXdqOVv*Z^ z_~Xah^F<~6IruT!zIdv0=d(umZg|i*a46FWe+3@4&KW}HyX)`w_?2t{tn#oK@&W7g1v_6g0F&G`F;qV13y~Zzs--qN%(Pa zE5;(N>@UKtT;ag8L-ZHHrG6_HR_%v3dHloL{%D!o0Ew|K_|@o_zk8P$W6}8pAA)bn zv*(IQcqx2?*00tykuR~&2sis5ei7XAPZ9i5c+ePksIv-Q4zJPm%Q{>2Q8O|f$Yf|4 z@9!Fk54z#4aLdQTAv~M%3yc9N{~LT5`^yf09UISQPf0#=kjo}kPTMdS|4qT&O3wRj zG?6Jm=E^0R{{Jf@_Lkqt@BJWS%}@34C*UU`o9NT);xQ}s_EN_S@E?i2<*JUjz3z^l z)H8^l>il3m!YAMj@KT-=^?2_9{3esv}}0Y4UQ*}nka3_n(vSHI7g z)y6speuC!eysQv@C486WQQ5(dpD9jqM5e zmXPub@ay1K|75XYb`{*porUnN@b%h$_5N82uYw27JrXnR#NSPD_cxM0bG<(CD4d0--%E8U>ad=P;b|}*gABBhI&=F+P3+x;@6~d)29AZJrKPfrq@az1( zi07O~mU3hXau1#A<;a+lQ#rC0ndg>d_FU`h@?^xP4PW6M1Q{y__Mzjz)8-Z*6nnar zj<`MdF0Da_(9`_EU_DaLB)kJ|^#A{UBB9+8-gDZ!Y4ib*4T{POaD>+2(3SUq~fm89r#N4`!p~2 z$954s4IVT{IFzY^XTh)64hHbEK*IDE?&? zhmZEa$Kgq9OtC?&u~NTEJI@HtVUiz;h@(vS_j!&TeT_e+MUVGAC#kCpJ>AHK)m4wo zOCfdjQrDiPx}N%IU|kY>gXpO{(|$LZfH%XfcasJ91Mr}=tLV?_VEqj*=h@E{|*O>oP;33xx;vTp&t^DNuGtpCKnaLc|z z_;$E8wkqMZ@WZr!y!$c^pEY{rKdkw(xa>lv!>B{za-7(H0Pe=+w?1OV$`pFmZ<<@& zw5%@K-gNlPAr{Ku?pfC-l^%80m3tri`N&xDQVOqzU#RO)`?Iz1cDVJf+6w5%f{@Uaj+4}S@6#dc;VYc7L3*jGk8iT$VW9J}o5BtJ=) zNgFEB@hd}z@J9GB{79Y?`Ni8u&Ecbd>JWactbyjL{5le6*D3B_^_6~`M0TinZt*6b zV}Dh$GM>~u)*0$t`62f8kW18gL3}=Q_$d8rth?Z|n!9VRsQaU7Vs}0=FCt_0T{(O* zgxACO!h?J-?Up#7fV=HJMYUyFyTz6vbd7Je*DsUsm*LhsO5}d_N#PrHd(}NE2Od2q zcz&1qi{Pu^)|jq>uZ9P;RmwNPQ{iiL{oYx<@Gkg)a4W|T!B2z#L6?vEbI>GwK16@y z>+He8uT3iN-}7?dMJ4uGZ4tZ{9ux}_mkph~^5vXkd|V zyL|k2F%Op7cOlaMn=>wW==et_a(=Kc9Z)&^V0cnY#dC;zqgnd90hzK89Ubs(aLH$h zJhiMXgUIwE6LkI{KAC{;h7V~S3ExF~#nWO->;Yo<0(%T+!|ULuX+3IPPz=8vex~L( z`LSIM|2F(|&1K=izoq_W_|x#Unyb6t-S82(l_Q3|@>Y)61Am+Hf6)3>j);AOd$t$a z`m^DW!h^=1#A#($oV#)Q-pl>5lkl}aPqiTXNSPO>hbY-)ecM5uk&A+T;(!L=QFvIK zP9XCFGC^Zr{JsF6fUo8`5o6w2vBO7M-SP5+nv0$4PC^kf*KM_ZR|T&L;Z5*s;K%7Y zw);6?fEeBhe;FQ|`*477qt7hG@hG~oFSgg8)9`Y5PGED1#0TjQ zk{{ugkMiKzaBIJ$489Itp!Iuq>qUPZd=uPSkF>$d;2U*$wI1n%Ujsi{b9I(72EP^_ z6!Q*cX5jU3D>sWwE^+c0GLr9NU%$+cIhFGYzQy|5s7Kma0e{KhQbz-P5Bw&c6Ju{# z4(LQ?|H zjqsgtE3bFL>)=*iAB1u-0^6?~m2p%*ZBt{|+ zamN*Yt*&2v&%uFbYzuzpmhwgLgW;C`DzChyzX^T?<*j_s1-~ACvbIm%sULzj!4K73 zo!?KwZwM(L`3`GuxV69Pz#Bq%5xfSzPS>x_KC0k5;Z}?{!Rz3gba`TIXRwC_Yt`D?vxF0g&(W+ zd*`Itd{#+}wZmCvMq;13$nPV`=k5ObpcXwVE0?WLMCPoxjM&Uz`{$AZC_4giz z;jh9ipYMV1fp5^|)xK)1k2NLy{hF)$g4yr|xV5G$hG$$IyoQ%Pt%f^rtIwN5xb(vy zF)QVF@f^G2f~5Y6s^26VMbAwk^-S-Fr~N;>yx37pY>9rh$|JEqpYPidkFPIEL`Zwf z(etWdhXZd#kMN5`&qGR&`Wtc`=*ZY^kJAD8f$;U{NUR&w-Ggzj{2`iq=Y|fSr4th| z%DXnK3$`Ka5$;2W*iZ=14zZ!qD{sYRBRr4t7Vm_whg);&AiMzn0o_J*?_mPI34W61 z-aRAfrv><>aOvBG57qshtnaf21GmO)A-pc6{z~}GA@w)H?}Q(v>sR+TJK=5cRhp}F z&q4UDA$$T}AEJK&ep5*KtbW!u@Jn?4>NnX6;a`JW>yAqJSKupk`49Pdvl0F|_z{|` zv*%8DBi!=;ApCB)l{Y8geeexhzsh?H@F(HNY3}VkNPJ}dfVDN;%3FmYTw%H& z-g@R-KVQh4ukuzida^%a*VDZpJ{-cu4vBNo@8+$o%8q4uEA3I{Uc(LtJ;lU}a5rZh zuJow9Rfdiyk+EX74&D#9@>ZKy-pX4e*zm}b4PPzseX4BOjgH9>8)o4zgxHYr!+3cs zujIq`QvM`-lE@n>uav{zfv?qE?Pu1*Bh_}^YKI>TxAgbJ*TAj3u^aBdtv;BAuL>!j zF~HmtQa&GkApBz8KJR@ZhtFz>$J5{qE0|;EHv4_#?}t_|-Ct@#*B3r&e;=j`J_@(y zfFbyc@GVKU#23^uh9}|tFswPpM1DkHQQq25a^O+QTRETzz5>2M*ROI+75q@RWq%WV z4cxN73tj@Z>>Glg2eCI>eymIWdce=)#mGDsqN5t# z3uifBk;;4cuBQjKHr6;ZyKxxYZA-kMo^ixYZ9i@D8}u4<+zU zxYZ9e@H<25Z}Ie7anu8UC`A8=SN|E>$LhUt3jP@7E&rtsa;6YsUk?09xaFS`_%uAo zKQaeNoX^0Ib92HbKPR|zP>TD5DALbu=$Wmt_jCH-Q*f&tWAInuRzJ_cXW*x3KM~I| zWV84z{l}5WyRNn8r#$#!@SuKnC|~B4uhaVD^Q^lvl{)H?xfmT*U$?`rfqxcXCFYlu zdP$k?`$a!|__|;pI273pe-a*M!#px8uebO8GM``%8=i^2gbnIFyZ~MXx8B1m;P=3- z_i(YZ5t(sh!g5O&GS#*AcS48YH^SFwJJtPxNq9Z{P|el;VB{x}$j9K;dc=W?{-FMr zzAV~L`KtYtZ}Q4pvCsv-ImG@U_zt+)et0cBXgtVVok<+r1pg$@v5%kWkISXsJGv^K zqaAqe5a0JgHY~2nkV*Y`aO_HbE!20-j=9D6NFI21Kz;x8=Y&plo%0FX_k-|L;a1xx z;HQL?Ux2TJpA+G~rSBQ4@9$;(lp|Q9d@e=GiLGMzKcp>Jo#Feg?5>nMV_!O;^}yTS zl``oLTX)>nqHpCV?O1GuuYg;z*b6@d9u$k>+dbG5h2O|?>`$lr_AK?Kx2NjB=h0P) zY}nY#dXn*p%!$Y+{G;wt6~gzzE&o@-r{Gq58sYokLG2M6JH7H@@iv4^{!TlWPQo|C zty~)U8D~g0*llp&55R+LbjLru9Ujz1X+xD)KCBJR$h;O(M>l*DUWUFzKd3wU!|?Qa zdw+coyZ~;U!Ni8yM}S*x%!b#)t+}8WUJL(pl70UD>uUH@aBD6QKeix~dZT?V-2=~o zAF1n5cLgVjXW?#MdGoaY8~a{faVS5Fu7ht1zbBgcR3vgHGL}yY;3vYZ*sp+}5K_JY zz7`&od$O^ykGS0ezlrDA*{VIV_EuwX2t6Ihtwk;o8{WI7!$*_w`{1*h$JZl?`;4)t zxx?`(yRF&q$`D=*zW^T8H)2Dz$HQ_>3o20zEX72$pGciF*%Jt79bgiIe@9jr;4{A}Q?|Mpxlyf^88!3+Oow9$SH)la(H+Z=WCgY0q*_ z-58w5q@G-l@8mgQb2J`&!b{;blz+eG>Kv^Wz5{-m=H8tmv9p`lY=N&4JG=7z_R4SG zzbC$qbdc*u&#uqTEncAYNLz~HZ4sGqWO|UPLs!C9*Ka9RqDkysKxTH=+~N&9CuE}W zjZEQLqwGE1GPhWn#4mO$armqd-VDD~bFrhu_h}U}k0KKkC(`B)VzD3o4$rZtPD*NX z^lx!JA~%HG?M-uwcZ=K)l$_Mp?AJF&eY42jsoS0M`NX^P41D{ob|0tzGR|wM$M;Em z;VeGMgFj69pgb$Q3_cXX>)c^`rxmIlplkS!>#>|8Tbr* zoz{P~uRr}c?#jY9Xs+^W9z5-~;Qa4UrVJj1%ije~*iRqnzX@EA%o)x0ott*}dV@_q90chFYZl%_}$~k^L&p5xniyBGrm6@_$%<^ zG*@RtMex_)L2DoB&nk~w{%(TLQ{LiT@aX54-EC24M?>)U!maX?@MA*CN5)v^hLm^U z=fZ==ue7fSUJ}Bq;G0AAH^IvcF8w$_yl#WDQxJ*0bV5=;rkogcJ4);rLC?-F&Mn^0 zb0Q|9_qbg2M2MLg_*TiS-&&@pIG$TYPx`O;KJ9+1C!-K|$L-{iJMtEraBeV1N zkobphH@MW%55EW=8vnGn9~n3P|7U%Y-;(101=eH8neh)_eMdfLr}B1OGkz zENy2)Jl{EdmP2eUz|Z74wma8vulhbm{%-aS@3Pm}T#=k^KoycS~T0(>TfXZ?n;0bfl$iP-hNA0fG-5IzOppt+hWE8%a$ zt#&qg-0I6t_`fJ`<=#Q~KSTJ0r~eRbpZe{91^8adTRiJU-pS!7>+g z&xY_u_#E77Unl%6xTEV=bN3*8Ur6~0uYODa0$lpniqov$G8W*+>-yDQ$U^u*ZNc9q zmH4QHN8ncdjqrDj`g17SPkg3Q{z{p%F8_c(7QOx4lv01*8bQ}-U$)nkQ}A54WlQQf zd*N`aFLU6>hmeh1|(|JJ~7hg;=a;CF`9-vj>=+{)XN#PY*% z@o((xWBpiBKAuL$GsswbBWW*@TjADt$c4WMw|rC@!X50Y_4s#nA4tyry5A3N$W+~J z+t>%+9>T}q)o`l~Gw>boOl^ZY*G&IC=Tq>Yd0fVH9{f>5zl_-$;%o@c>qjK^llS}m zuyh9VBfqVU=&JgPeQ&rEz6&1I7O87Db+y3Vy0(YcHHEHY+wJ&Fo#1aw!h^<#LtQ!W z!{ImboEX2-ciw)D_@)$@8e|+Tqw;mF$E`8a3cn`A#$I?eJjfqe)Hw>@0k6>YtM5Qh z!ygRMpY{j#VBl74K<&Yn!e0p~UkiT;ZpBtBeBC{EJoLg#;FkYJ;hRJF zG`tud`G+T+#4KI(qE16 zbhwohJK-5{E8h&l4~1JfahCSv!`+-%wbpNs%88Nx;hhZ`D?^>gq+;j<4Fbj>79g_%wVc+=}nCN#2#< zR($5de*|~1CDG?gRjwC-NmSd4}|bm_@i*k*S+u|xHY~<;q&mI947vohVO-& z?f)a=7ar7p>8oPmZ9|7QK8|+$z6!|g73g{a*)u4Y@Rhoc)c~J?muarfbUWbAf7-SV zz%$`V`8XP1oQth9*t!G$EYGno92shB?3GC5J@?su%Z4wa%j(x+_`l#mes`$98vZ)` zGdw4JA-O_*ueSx6%^^1Qzzg6yi2QuLZY5#%?dM z`ffPKR*~56-s_Lu#GDZQz66EHjwAaZvhF+L<4QK*9dVj^$M3h#71Lg2zW#b}+obKe z@GSVDJSWDnx=U9IPlunOxypI9@bw}3Tj9Cz<8*m%uifFZUU&g~hvxDANt~UIA#*D- z$7mUKPhbY#0?*alyB8&GO#ch#uW&2I^59tv zzbK|Sb)=jfOXTVbWHP@wxA@QsC6n^s?uL!j(Exwo!DWAwE860g&xZFAry1Xh|Mo#_ z?r=W`NL$n%-Vl0K3_sq~9g8M(d;yt@ zl61r`P)HlQ-~;f>lequ)=ZE04aBEJUgipZ>bb0UhcqG;{iGj#>=N7-f|6-5xmp+#6 zLCg5_&V|H|oY&Z&MeY`!6Eaah&y>J_4Bw!+TKm?(pNF5Uxp$V}@L3mj?19VsOzdoB zhxbk+HuR$7;_$GMJT;aAKeihuxSFP|XLU=E{GNk@d_zrlDZhtiX1qQeM@JB=R zr~REX7kG&-uhvGn@CmpzkCnoogNMB%)*%z=vvXn_JQrT3ZBY9Heeg=Sl@rI{jc^&; zi7}wQ(>?=lf?GK;{SChF0uO4V_%IJ%125G2Z}7)Z8N3<(-+CTS=}4@5>fi@FV%y&a z&xU_M>sR0D?}M+0TkGdBuYAxL5ueP!Gbmq^!atUBUE;ker98zOE17Syj{Sk%jso~^ z9<|3x1$-ogH^2wsR$lHSR(HeQynM<^GcOOJXTuNeygUj2GJJ#fr^?Hb*+}FYa4Rnt z5HAC8H!uI>J-!_(FBhZZpaFZ_RKrh%TY0$|ely(4%iZv1xRsZO;rGF3#dWnUSvwOjJj9d0)G;2 z<-H#G8*nS{jlfquX6L;r_-goJx_-45Or2xT1s>E!>BAiOJJfIGy%P8ll(+I;4ZQPl zJFm6CAB3;g_Nje=9NxzQ(VJJaWR7aOwAWb)u!;nr9wgI@$c zOSePaFKQtccfzF~V>cY+=acwS(p`7AqvK9w)@mJUAF&_a2DkFXZuot0%f{Id?oemO zKjP)TtLv9|{<=TU6(E!SQ`^Q0_%R{80iFX7>Q9Nc4tQn=AAr9LzFym?_Or*~tKp|< zuHMP#;dyW?CuP3PS`KcFhXQy$+{#%MaB1I3y8igpa<`8g;DvCj4?EzS;Z{x?fLFt< zwd6Q_JN#l@zxvI)dH6jcQe z@l*ouhg;*R2L3eMil-L%0Nff+J#cBCHC{&GkB0Cm_z>Lcqtth}2M<3=x39vFfgHG$ zxBOEAe=eka4SX!5d<*<#_!?cmIy>%xPrxtNT>Z`45qRd$?DA9a)o{!Isf*mT3n`xi zKQM%sz+)l$YvB7r{L=!TH~iz!<{q#9q`kQKcy~`hvyd4@rUVQx5&U0dnE}hM*y{uW} z`jN9@ErUNc`bY@Rhxfs)c9g>(2q|9=?}7*US=!M{tUe6?HP5kYBFTCADSu23qG#K1 zupWtr33v_MYUcv{8n`v4vZAyDZnd)z-VV>Cu7tnUUAjtmEBvFHd-tVs_^h3Hd;xwJ z&#~6U6$u@Q_wlIvO&n=U54tu!W&alS2z(3t1YMW9KRN~920vPJ_5Iz{logRH;Fhm) z;FWOe{iFom3O`ZnSLc2;@cTpbx4=6?cn|zOcu-$B)H&kSf1|En=5cjDZyK3Dgy=}) z3zE;ncW52U&R6r0IpS&Ck7e*R@FTSjH$%nm-<+Bcqmp@(Cul{aFA^c3rTQOe= zFN3et<@N7B!q0$Tt-1F-WU0Rs-UPSivq5;B!5zv^z^mX_X#MeccHgX}j>x+hSI7kI z3pij0-UfeT1^-yuFQlJS_PAS`?z>DeGFSd$Zt=haluXLM+{0k0qZ(fP9KTJW_Z(AV zveoF8Z-#I9)!brURF^;2{c@3%?}l&sb@06iiN^`z`2zSPHpV{kc2Yd1yx`k8jh+L4 z6TA+WdeTx?M6%&QInIIS!pq_EcbSuX@g2X8GGz9?Xvbt7d;)I8T$@*ZGgTz&kRROV zpJHPlJpH%!m>Pqxf}gC*d*@72eg=Ll+!{0K2Qg;how|JVE3N@jJ`a8`{L&;I->4B@ z1|Nl6xu*{PVo3dM@DaFWe;@p1cvVvU@k^KvpN+xSj4#XKl9$vT`YbXv$Q+|}s5>$l z2d{|ifLr^u`S1aF(3lY)l*7LZw|r3Vl|M??uiiD<;g3Z5*mFFYtOIOvo(?}VSi zbL>-d{&-M-S79Cz97`bUc=2 z+_n>og}?K@qxtK7zMUec?$vgq>t^K6)w-hbFZ+wF!|-nSS(>Z$?jHD4@E}{Id@OB6 zb0E zz_-Dz_3H@y3eU!b50rgV@JhI~zD->j*B`_k+LQyYp#1Z?eet>UCrk5KDKfF&+k5=A z@H}|X{33DE3a^68+Aq-t#=_Elk6w5a+{zoH@Xx`mIGu)n0)CO!uYNZ;jmtw_aH|h; z;djHWyjBYDgx4nN|43r)sD)3#E&E&HdyV=XboRn0;3HbU2rsIY}Kn7yi2>{bPypZSYs& zLGO&xzCJ1cKQ^nY6s$(fv6{6-SL&*cuE<-vR5 ztg@0~G-cXf1C=9l>nn4MZzk#3o2a86e(9gMccgWsyxUbEbx53V*)z9T&2#M889(1d z;|KZDjsbMsj*JznpdTcO5kkuZLUb?3t@pL_P}-%E>Z!l@UjE@CSH~ z9j9!RcvOG$qzXNIk-JdaAu?zAwlpJi*q?*fgbwAp;YY*6bc`T#0W#JcHU+PSTmDEr zl>7*PM%x+vX`;_^;0L~H$9)O>ez+CaHSmhR*m2t;k;^AQ+8ZW!S91V zk<`8)xa|`krxJ_>|7*v!$mAlk@~`Ym>A0mYQ=al;zYLitrso!UjrZd&I-jVg4*vDO zg|CZxiOuM1-n!`ZzxnYmaii8ngXk(k&RQ2uz^{X!g(-kT@H^nvx+3ea6_KyO zt(Yo=KLWSrn@V^W+*%hk!v78rnsa50cfx1jL1R$(AbbzpvVQ`;4{oiC7U1uB-JT1w zR`V_d4_X&V{e|#@;ntd_622ycH^Mi-tsK?~&xTuTowWb(?-wQvA_9kLny-Q8P zJB<3pN0ChC5qQ{|A{&|Yf4A2Z#qb)qwPvV>XTCAFc#qV#w1*OHP2|>Q_?_@V&DEW< zZumoRE4L2AtKYP9>mDf|!ejr=ID=ccH5uF$UL-f*>B`Wzmf1!4}9aCy=Iss*4NE@Ylfds`8iXq8K%*39WqudrX9f? z2)E|QTzEO$S~HZwuYd>TD_Ju%6N_bVcg=9DvQhH7S~Ikx=NaU}=KBF;-a;m5A4z;Z z4o~?xxb)Y;Sy`-E7UmZFllXTMb9o_r8g9k4L%AwscD=)VzdZIo?ZX>4pzS=FNF%7~UVk_rSja4~iAhAA2A3INUnd%!ZG`t$DT>{xaMeSJm(_ zc+j|z`kUd>K5Gu>hCdg=hvDOJYaOu%{vzBur;DwL>;D9{_;CpWBwscH^(u?t9G`y6!{P>Wdk8 zE8IFeN=gRa547z`&E}mOZuMIZJYtj=pO(PiIAA{czNPq7 zo%hxvvlbme_f14cEBs3M^*kr$As$P zh>bz`uX&C=_XppvVu!kWQ}BM?dEPaj{I|iq@BWD$74UX=P(8vM;CF}c4tN_p$X8N+ z0RAl88mHs%AHz>XHsMQkA7vi?9Q+W?)pyAIAf7vURp z{pxN*2Yd={wQm6a65Lu-jl-pVLE}gKHxC~V;hD#>CWTx5R{)=cTlt{^F8Zzf&;ZX# zoi~5$qXWJbUZwrxZGO4^55F58|MBx0_a=?#SU~2$gXR}Y7}^P$ zlr!C=Av`OGb=$%ATvh1tEyyOydmFnlmg#U3Y4hfuQa!u@ZrRWd?}S_XcKz`0!#8RhGO-9 z*Y{%LGB+OJ`MU|3U5CvtepcHOjbAd7wsgTK;6dv>i7|&v5Uw37~9gCa$77V zC)KNG3OzILn_sL?swaLxEA^xv$GiTTdGlR82mTm5>He+yE_?|*a^$>uC!z-a7UhHT zkwg70Uir^y`y{T^K3Fd@S5k+S^G4wp!Gm&wv~e0<4G)S7;c2;?OTn%E)?D~DxHV^# z!neRr)@@LCZ))LJ!LQZayO<*Nx59hi)k)kx^Xi39!_U_oAIa)k%8$bT-I-s!O!H{` z(93N>TD#m~8UCC`txyZe` z=H`(qbRBWDJ#L!dRq&vED}B}l-wwBYF$6D%TfUftZ-rZZ9yx(A0k_7K1FwJw?M;Y% zMesVfHD;>d_3%7o6S-F1$!&r+!!IU%BzVe}#2nlOAIP3J&sc`wqj2lId=kFu{q~rM zQ{cBNqqg#kFOr|G@M}19V753;nhiY_;be;{J=bW?npgpMdT#7HFxB| zuY+58qy*jwxAIU8{APGie9M^VA|6}d?%Z+onD2*Wb4MR~{)(Ix6Jzi{z{7HP8Zoi* zL@#$g|9nziI(KK~bMAGLox2O+t?;9?&(+yuCHzi!kgXCMjqoP8m3uqk^>8cq4tn)l zxpxBIM)}i|VlUqfDye?~{&2pXv$9Smrr_2)cp>~9c+z?#TI?nn(O(JAJ(=;DRR2d4 zvENQi-n`Mvt)F<#?}uf%wHrNa3W8(Dp`Kx>2OgFiBgDm($hf&NOVt&S8#6ZYZhESn z8}s33!mXTA4ljoX^}E_9;UKZaD!0!vGV;tVPpE?$hc@Y__9a*Qa z-h^B6QwTr!gY(J1HK%@Wx)Qz#9`t_f#y`9k{?VlPs7%C1Kk@lUp_dzP9!-u9l^ciA zv-J#nFJcdT3p~l+(T^tLG*-Z#89b=J#LjH^?Qm<)w;0|7xB99Y{s`P!?>57qFzT1w zI7oc=!GD0CVt23-Sz3dT8}%9bD0lne0d;MN{xR^f`sk3#A%g!jVF(Dtiy z-%9v1aI^jJ-Ehl)o$ztEHHHQ~p7i~$XnDea6Y$lW=FRVfF2Ik02i=91@t#k7hw=ghlz%VKlGNqVBU#p6Td zCXs7ilAEyQQt9{Ckb8wPv7ahA`EAo*`TFvZ>nWLc|88{bTg&9U_h_lN0=fEg=iU3h zu{)Jq{9X6&qEY0Ukh@@uC)Z%h^&ppXo+r26mK#GZTI$J_+Hw--6H9U%Z8?W{c=UWv zpJU6FAlG(*CwH(dSBKnn7kYBDKlA%d`Na{xoW;I#*?jUHGGZh;81DkaPqrmowg}nOa!>XXwyd|A8+?POYzW#zIJ5(CT-fF^vS!=grCQ{(6#NdW#|3T_(7$_)i`=?hfj!}cb@e9 z9N+){g=ms|G=-isK5Xl8ikNHRuAb*@J$YwyhJCrMrv^P+;jW%8TTcUe4!pwF(}$jo za97VKZ9PNi*?Z;u;=5>n!q?Gv+~5)a%%kUptL7IE6#r~edStx66^}9TPiir1>?(V% z&Djqx*$=M?;bLbO<3Q?vHin(w{;A)O?z^!2Rcbe{_o1i!qqd!69^Z*h-yiXVWvM51 z6L)nf{}rBNHL4yNbMd8@TTkYPh~aDOwMzj!3vR8wE8s_j@CJA$+*;dozz>I8^UnbM zAo!<~+8O`Dn$n-+@a^!R`N@IL!<*p0(&fbmKl5WEYx9c8@gK8oD1;vgx9X^b7sA8p zXhLQ$GS(hY7yMGzQzZ-t7VT1T!7=Afi)`^LjS8LNf@EW)kYq63z zx88%Y;oFV+WzMN2mdfFG@f^#1!XLZKe#gau*P&|w+1Gha*ed?|qaSze$lP}Avb8WW zOK0@`@CV^Z?|tgMcsKmVaBFQh3;#9TdN0X1mzaZF=al*IW3RJgsvQ1)c+j|z{;G#> zf?H#|9i9)De3kH#IxFdi7r-}Y?%kbn_-r?P3;a`>i;q1Sv0)yWuOV}imhpa{Px>^E znCXKbDf33zpx>uUYYy-4(TlF)E!;J^KKM?p1FwcZ2v0gA5PQ7)Mk3RK%!|nE((@QH zDRur@pck3Ej|ac6iH=eD>F@`Z>uC3N%pmjl4*R_&{XF(W;MSgC9{gqaQPh{{8}%Mn z2LGQBUI(9qTkq^`@V~<^*80`&7WTojKVj#~G5FzdE4F6f2f?lS(@UAR;H!20YF{f4 zo(|upx%V6B4xg35x4^?am+K9s=;BL-L{gFSu0&-?Ix^^KOmNQ3? zIro!x&YXhR!mXT{dI32XZsp7z_v3t4u1|F77q)^ti5S|@xAm%q7T(w!mNwfgMy!? zIdhU+X_7uHgcrcAbycOu57Fh-oYzh~=1^YFBVsw6ZY-T^s56N!bbJySD_0J|KM}$w z;U5p-k*zBt*TX-eZH#Vn7h^IO3y714;lC6cTl#$)W&U=5`6GUxq69tVpR)IIYv2`d z%U3P%%iw2eI~w9^LWj?Wu%iKfrr5Dk+2P)1joUDaj&@|$Y8~o#qo?8b!mS*Zb}{Ea zaLdNr5H7x|CZ44H!HoIX|0nGJEjRedXNyn3UGYys03cTPpQ>HsCcO-hr>jwR2ZLej~1( zyT{#Teie8O52~L<|1{vI;lA&{IDKe;`(OI7 zlbAYUf}Sl&9s_tMuAMU_W{Q|w*XjFGDaSgO_m+s!&YL-SFCMhcNg2iXOZd0>>>l58 z?40JzZ7HLMn12(a&C3>i2d<4*5B{a=$ES}r%W!T5*z;{Wz5u`4^!UYqlpk9$C$bjT z%3pw2y@o|3E&nOYjLgoe0(G%eHs2~NcuV{znbqOnDfl}>YP1~+wcZlE58^2(#?AM5quG@ zrB6DKJxxgZ47@KSeLjB5EqeK7_!>N@d^vx#Fh95BPswqV|D^9YN_fz_hV3Aq)iut! z&|FhyekZFR-+*g-=`nmGuAS#n&JXv@op`}cykaNbuoLgtiTCfs$9Cc=7dY*2H|JsW zNA^Ny@o)LeqkX>bjC1VgPk7@LpQ{p6PRx>-mkr1OkFk*b26XZ zu{OTX){VF0LGKq^BpJfH@h>u`-1N@5bV3>=F|i`<&#WJx-p*$?M$S=hduw+(F{^G1 zKF`TKD`rj=;x9^m&pqz-iRAO7mrptQj1Z^wZ9QI98(!ZIVpiTBUf%&?_TQk_H<>w* zg4^}oL$9y(9o7WmwEE`YS$Bljw}hB|>cZ<=OU%2(1nncFf4iw~A8yz8svoQU+ebbn zck1;W#mDfl`H*rU->usiUf(QYHs7V!x14!bhuigivo)~3(ym70ta`5FRB{M&szc(ItQ*fLdf7W;T9%3WkFXFR%Y+UWl z=NvqCfACsrk))Dx#N}Ra>@cGo=POS3d+SZa>_d!wjrCh?~e!F`;zi2 z@Wb)_%=#JkP#f@t_`#+dzhB#d9}|+kAJ4{v&Tlf8l9;>Vaz8rO_LzTe8sC9UyNKr^ z#Fd%#h&m5eq#fCK2d>>iDZ*b3@hW@(4?5;0|0aAJzQim){`;}wUHAxIVS3d2PTL@! z(-eHaT+&bB%kW}fdixT~J};!LuoZ8`wfCWh@uzX^8ZxnjXJ+_f>f){$S9t4OI^K_K@9O2@ zf53zKPmZ~2=Gxmhe?c%3%YD>4=H&VQl(%-(lTX*fv+mnPorinUPwn^~&H8(3efW|1 za~*Exs8~hdP+M7@J9SfGmq#hyOQGL_&=2N7M{9_?^5Am&rq_7 zIb=)lm`fQ&csj22brrrB{taT?IalQMV-s%S+A-0E=i%BhF^Dh2wPRumKNr`IiL^`S zL@vg)VHk4|(WCl2 zoWc*mwRxCU$~{*+Y#!zi^CmG`9gFcHT$_j0_z^9^=`GsOjOXBC^RS1QtBBF&*>=1H zU+3#5xmtGa8^~=)jT`Kwc{ZJKM?ml4{^HDzCV+X=irOXelp%U zD8tXjwQ;J$b8+pNQX4Mq3p&SIl-Y|f!NcatC@~epXk(RpIq%Hl+ShTO*n*;6mz9HU+&%?F;9mS>nTKkf(aO!s=b#>249B1+~ z3>N>i5I=_WH_h^>aU2v7b1yO4dQ*Xq;@TW+z(2yZKIp*zife7`$A5=wZ5+dgajlIh zYj{WGN8xSEBBq2Gtqq0vN?dD0C4MfhwV@F|71!F(i5KBo8wT(j@UU^3B4&UXtqo~c zvM%FV8?y0V<60Yv@E38d4OMs_uC<{F|2H1ihHhf=TlG2);V0l)9V6xJmvOC*7Jdq@ z)iDRZ6c4Lo2{A7dqxEAA{v58=u?7DTuGO&z@4~e@ZpZ(Oht)ChD$XrG*6Wy#ABt;r z%)`HqYjrHe7vWkRYw>gNusXI8^As^!Klb8};94C=@OyBrj!9Q@?!mP>X5hcZ!|J%4 zm<5lItG}6Bj_-|YZK%iR;#wQp@d&Q9p%32^*V-_OFUG^#ka7**^CTwddtq`8%fuhX zwKf#Q(`#+0z-vgawV?sOAJ^K@fxm!COphqa-Jn9am!|7vY%*VJ|2Rf!ROf0P2S$#_#J^3@+eU9konky7vuZ#+1;}^KX)0i_@^n#5SQ!B z*avqTWjHUXOCE`9>5Gsu((%TSGK!f`;%7-28_Y7CA83&>%E;qYB@gksxNGCphIf)) z+uQc;B>l)v(kET#)K4ov0}m@dKc0RiZE?pT>b!ttw;xY@a@Kr_IxjHU?Z-=T?K-m! zZ@{(t1-*C=euP=RbIZrRJ{!S*him3XgmajhL0 z_(8bVj(j{1*V-X-znqvBVv5aqW&EyZJ-!|Hz1J51U0Jyow3WG={4BrYlE6B9V4b&? zGdC0dkzh|wi?{*udH4BQ&#q+t8sCwgBIdxK>UBx0;+a3L)un*BwF$TD^3)w_T}sHO z_{H$L)DqK5OfhwLk2j-VTJd3AtBcI@l&*MP7VC8xC7<_x5nh*+8#pI->vhS*SL0e; z%9v;O;hv_b8cD)K4m39m~tF>S=`YxYb0+%EH}JMP-O%OSjp^qNO*Gv?Y>qkzHYWN zpXIT!)N?CdjR)O#vhWDwz9H_he50ODQ|&q?-Nd~6Kosw8IRYx=po5#NMs{n3dxhNK_B zw}$vQK928i)-nFBw8g)rR?mq{;$dybCZ=s`@ZMI&qzLcCgXXUEX9IIn{14Kff4R*! zcM|MxZaeqqTgaz$Tk!EFbsZ$12K*X6$6hq@i8^0sle!F($97_5f9j5j@wXonZ|1u3 z_2BR9StLov7vaA()61Ct${W*sV*WymHfCk``}is|592pv>+p*X>8jNZ8Z+O^X6z zE_pLJ4=JMpe+t*m!wq;duHA$0z#DPx{qcVM&$#a%`mFcI$BD7}^g5*8%3c81*2OHm z2-n_GDa0?qgT_kwpc20l*Y?_tcokkmtlQ5{8}enaB#$m)I*2*JjA1Nh-UA)P`*Ate z+&ql$kxtI^!7niTF#e9sgE{$2etV;6Y<3^;>`+gKP6F7hi;5>uaC$!`G6&1iuZ} z`lkk8hv%B|JJkmsIL9N?u9*dR>xh`Arz| z3fk{U`i1xut{t<>@l!(bFUPZRtuO2Gg}C;7wH?0^KZ?4z?R2`@UK9K9dvNW$_oH}w zh$pkH`wgCL=5L%o7vlfKwRzkzFY zY{ExztslGakMOWM4iQr^pwDOi7+Rzr*Xn5D58+xJbMS6lt79?#5*}8^8e($)sP|(F zz6RIo*n?N$S{=9J58+xJV|TL8z{Bd8PR#!A=ylA)^Kq??rTF={R>xYr3fJn`im$`N z>ex$6%t&T|>S(|aKjv4s*xK_t}ybuqoV>vPJ60=lUd+PDTLA{Rc_ir_99P#=mN|!TB>25n0~~@ZaF)n$G%a{w7c*F`pBo zjYT7#^k==Do%rFn*3JPu1J~Lq^_(K+8DhffY1Pk({EZl`o;moxacw+`@p`M1S=5ue??kMVw8FWyOd?Oxvq-WpPV5|1BW4kvHpm-{-RUr#^fm z{)Jg(MD1_;Ic1CybM@c!Yk-sn?n~p^bI44*9@nl{3-ES4=sBp=u>$`D|CrBi8)SX_ ztG9=3B<7{<`m>x){25%k4j90<;z7rPTt_D}7dr9Ng z`bT@9ENMT!_MfwU-@v&~Wxre?eN;lskBQlj&u$*Z_q}SQ4!E{9x8S|Fwl??R+i-1d zw(pxTAC`YGKHVbY-F20JyzlYGJNZ7!`jEpQ^PYv;Me1Cl0?2Gu1Bv|}g zJwA#1elKEHe|8Xa*vEQ*_Tz`+T7Qn=%WyGGJ(m-9ku#ngmyN_N-9dXKuI_*0PL()0E?Oyb-IV_BiL5id z#O(E1@Hs)siZKrs;&z=f|EDasP8r1Q^Le~Z`~FXyT_?$}fVgGT{C1MmeK#Xc&LL+z z=X8myB5p%u!YMau#Leo97UC-BOgMea_~yUEz%d`Yw#{UyLFKMe#+~w z8e(=$((BNI$3naZkB0bmJc0+cLFyQLm}|eC)G?iyjpU(So8`rQsoBo>q>_Ft#XCtK zG^gZvZDwA!;`d2?PG9XE`_fmpJAEZ_TZv2k@`UrZa=$q%?nWohB5r{4s)!5w%~hG_ zZNz*_%ACH;E7SNbU8|YDTc59((rBXJAwwBy(E*&Sz@dzX4`$slHw zm_yB&m7eG0JMjHXH}?5u_!O>Pv(@2W**&bHo0NJ; z`a!%tB>yS=mJm<-A@_6eQ^?CaCMs!yL83Msz{Z^rL7%a7LD z9Vq2@;a~ZR-hYF50*@g{r&uJwNx z-i~YiKZw7AYyCfk_uyLn(|*MLP+Xgz*?32Y7va)=t^QSbFRsG{ipE05Kn7$+OO3=8y_aUR{tXWGhC~G6+VS)^>4x_L+aOskA(OjF74OqKZVEU z>Ge;FOgC|s-m6rPD|^-p`8 z=ky`<%f=Ukco8n`*Xmz|XX9G^oA9%6t^Qs3a$KwbAifOO`hN<~3GuWioc3$=&&CT$ zuhqW@zXI3lUxk<9TK${w)gkrk!iz$D5SR9A^`F8kaIOAnZM-XrYxU2@YjLgqMfiGL z>;EdeGQ^v3X}?zgF1#Ms>OYA85ZCHIg}2~Z{nMW0UIwn!KO1id@giK>uhqW_Z^O0v zH{rj;wfcAA-MCi&LHs3LtN#?<9^z?FIqlc#pN(%Ny;lDs{Li>n|0;YC54t9n{X-M} zI=;x<{}|6ZyYP2I(huUl2}wVN{{`2s-O`@sZ)b&gHvUS87vY__*8f%b<9M#wKK97+ zjX=Bo_#1f8^^`@LF1!!_cvgDzIoc30O?ynJ&+;Pej3KUFUt9PHF82uBJ+N_qAO}xK znNWWtsTki2*ZQCuPr|k9rDl9Seu7y(eKhlqb2oleh!5cfc&C{@{>2pO&kk^{A2RU@T<~;wL`W*MVb`q0K%>H}n`N*6oCZ>QG?HpZ= zpN(tBZ!?~YYvT%-o)e79 z(If3hf1bVC-uj%#!&`7|PL$&PxHczh@iAPR6Rr3-uFZ+9_(yo5+0N*h_Q7xQZ^QV3 zY2jm)^i%fp#Asucfv>=|vC7BuaBZy0@HMzLR(1HTc+gnM7_{Ln_*cy~F7wv6Uc3p{ z?$wXr9k|xMq)v_-Tx(wjF6C?O%g49jTKmfIzu-ablW}ihu13BdpNlV^6*w0qu7i9A zh-)(YVdl4zH+cOqNL>CtdV8nvrMTAKw4ZT(ifir7##iE6dyDYvaIL)!%*jTa<%sV; zF8A6i&r~1vo*#D+x4??8>u(xy#=36N7rm5s)_xQIzw;sMT8Y;uqr@~56I5r(Bl!j1 z4ZvIZ?5-!0NBs9qB_@-YWA>l*+)-jq_R1+FW;HQE`x?okp1D|u%WnzB_AuIH{Ek`^ zd2As@o3CAXGaj_g%lBf&D5DL3SIT(yOs{{v@5OAB8q2Yj_#%I=`+!;doaiZbgY5MW z--ri2Lln=$YZSNeQhXiG<2zr!CTw)ZS@NhO=92|_8EyD5oCgB2KOdL=(b`vrzl8@Kd-nL_|G+ny z`NtprinrnCePbf;+_Dm9dirur|_UYk~%EMoAEV# zcIT+Gm#}|%LSib2`5+`l+S*7=X1ZRFPJ9ureW!2$zXI3xBjfl(A^E5Nf^%s|{#p0{ zehzhY+iCor&O$ut;NZ1M+EU4j_q-}w|2#UPe@|=iCIBR zp2YlTsTX7X&72|1S*MgE^@wyko-3bcuG@_79$NTAqz{@8vc?uNpPKNi_#C^&sKd

    5#@{8V!%sdWcy8JAAO9AfZKgNAo7amM;6Zhj^dtD$xK@7BFL`e+ zr2Gv0N4W1D56*it-4^odL=ERM-U5|l0wH|3N^L#NwuSYhXfNS+A!VkxT>LKl{!ZYxL`RvX; z<8KQz;YWp(--RE9Yx7|c&kZSm3SSaZe%i0*L{1MWKN~*|SKE)5hLm50uL>!@3BNL= z{4V^Wkn#udx{&gx@C_m5r}gmsJ*50>{QDv07vb$8|L^?}wB>g>MfjKkbz{k!huTi~42b|HjXqRsWg$2-1dPV)j2wKL)CC3)lLf z89x@+&bQt8VR%>_wi9zLh6u*W{kECETvKgz+8{A)#B>vL@a$`dy}fIQK4M-uVq&_|%qQx+uqX3z z6#x1{eLf{`|g^Z9J%5jDvp0U%g2k3W>Rw z7`Zp$w!^qDQHj5VYuAR2co&{(rgt9a*!OEY@eVxbx4oqN0elkI_88-Ma*lqlF7>zU z{gwJz1E+Bc^~Dt)0zyKCZR18^0S5n%9#55PmDJ?ZqN*@eUKN z?d2?dLrD4@{DF}2i}5>gZSPTyKOT~QGyY;o{@wVKO8&CGk2BY|;fKolzWdSMI%&_> z1bgQ!{gn7S_9!Rn`}cJGWjyG9outo;yLL>K;{Bx8?hV)Czrr6TFZXzf-s|ppTk$1J z^l{#bXX01;(mMyW)NdGHAL5DqthXVajvsQ8o_`)*gt%uBosUyG-k=ZA!S?URFe9e(2}v%V`Aeb%m@g}32*ovN=V64OV_$;1ru*_}sn z9(%*vdyEnD88Q2rG3NEp+q_4DYimX(zI&ejoTdOj44-S}Z#)~U!1u7@@J@%k`}m`{k&*3CkE7}w5k zmH7L()<=zaKmNFHt~}z-l}`M^rTTg`fS(=WO$s7A-=Dyn}7eNw{FJo z>nD8K+0#gD5wZEF$76pJ9$QOnPJTT0XL_uRT?et5XE@)Jjs4Jwm9a3M6ZZ^opOZN4 z-ph8p8qYMx^Kxe_rT%HmhX&kk>lsElv)U@h=)ynp&hxV1yu_E|O^RE1Io^(k&8-Gv zjy+RfD?9MRaP6Ghk1xf8o_$Fj#_)A`yE(V$(}XR~m`XcR-{Bhatl)jBcov?I2d#Bd zMj^fi|CrD2F(~8qSMM0ABIcO0^><5~@U!s6W*){pw=TRC*T#JiFT%Bcn!?xN+Bqlf zPy9{}zQ!y+>RjAPA7ta*c+ff`^QwY*w+(-t&#^Bb`9H@{^k-gQ)RNa_=jdbJiWi0W zR(u(*tvADXzLMUeeu;zJ^TK^?b@ue`bK4AJYC~e|`A^JS#00G?;^p|?LcAUy!?k@v zJN`Z%)aR0aA3hr5qxdAAL##V5uk*$s`OlnV3nu)(?a#cGKeH+MFT_vAwfZf`vv93` z<@k~iugCLot$yuz8GgE1f1`eVcq1NkPf_YWiZ|ifJ~sJX_Vf6OX8!VpNB-a9zdYtq z7k&btV|j;rb6Q?n=ij7^0`eFjMtcvX0)Ho@4h8fD}wKXTlgS;7ye5#z4Vi_rL@N?GQ>03Z|i#{3txz9>wFG=Hm*;m-^OR(eEFU?UlRYyv))2|PnnJv z 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ⅈpP`HGjj?n^|yjy_hqh_m6L)=Zo<)Ma{Hd8Br2IEJ*k^Bd>`cX5hA2psE zPSywdtm7B#lCW=v$B%3|u}ZWZjGsR+_G|Hmff3b-YWXkq%6-XqTyW(5$B0^38s9rr zle;}$Zv2JzW#hxY&aeTRc2ur4p%r*&AnY#+wzIqUd*>kiz7vEmTki9{Pu6*7u#r+4 zfHdX3+&j6A`fwPYN&EsaKt78a^>XhlSK>g>bfqkmIEWZ6NK}g@b1WsWjEFn=w}S9$ zSKdI(+WXVJ?cPpzL*}bkmPt1RDd2!=cTe{Yd{Z^Kqi{aP2@Q9$5nBy&Pftg1ol=?q zZf{Nh)44h&Mrn}oR0V9EuvgO&623UP5(mf`+9yl%oT2rOaNp0(WG;__hHSZIn8p^o zoMrHmV)XatWxRK289|&Ih>l#_pH|L^-FIj?Ps0%E{E{nx?Y%>LKEcdPcIC!caVFwJ zzqiTEzp<701vB~a%$O4~lAzIb`HdC>nCa@*c=;H~llP7XA}u}Ybn`@Azf|f;YXi=g zB&~f@)i7f+f0gG zxOe*=ZK<>sznln9NZ(;B=kg`uUEZTTum!vpq0`lSv>#m0N6$C;@Z^=?Sy2CMM#FYW z{&A8=`K=X=#IT-14#*d*ZN}JuRS8EJat{(J(~}J3DG1{nBb=@aNa0bP*`cXnD5}+1 z(lHVvRwDCYhp?ogj{I1vRGVVfN<3lQYChbezx<)dyvufY_|-191CQ|@_x!>FjCQ{3 z>pP88$lCfc-u&{5vNN502L+S$rNQ08T-no3_ONS2e*Xz-mx|J=?Tbz;w$mkjU>`AI6jQ;A45x3H z!$K1#k|&^asQPe*9uR8GmZ#{lonB(xW@O6`&=7{ydIrxh(ro$b3j|Zmt9?HHHQtG4Nnpkd zv8y)NDNCHRM(bgn7(Bay^oX_0fz0v~T$0kf%lyQAxb^4u=h~!%9OkaujyHZVs2ySF z5w8`JW(}`6Ex##WS5tz!Hf644p*SZSetSNJ!(9ct)9L^`NIJgO#WSoO8E)rSmU{`N@R6F&}6k{H}L zh27Jo8FR$9EA84Mjy8E(0YBHe^w!F2Orpv}ycKuB;VTaioAl*@d&7izRuTJc z^%LZ4d&7v}KZauhEI*#i6ttlGlDlJQp+y5}1mnT}uNi^aOzcl5coRD;<>@{WH4k5m zszYr>-(irCGB+q+@m#K839t=4B=#2*mWsC8w(2{qm7{x0WC1}&Cde+HPUVYQp3JIv zmaUzj`*QaXhV=1F>+vx5m5{RBE~7ny6k;}mc#M+N zPsu846(s)1>@KPjxrw^ z31z|qhDFCYx+#C&C<#XVnvP^jP7tTBsA91P8PM#DvuE2WTJ;p7 z2=u|c;AVj&FT0_tGup8|fLi6sVbSz(wv8nAo_5uA9p24y^%DW6fT0 z%6MoL9YwlWZvDAHHKr6Jqs9E6t(DN*wpP{`I&eAWS+2%)^4|wg)~%^HAk!D zH$K2anA<+kG=yxd?~steA4aJa z<4MOtu~K1pf$@sT-2#t$xx~Ag7H6J)6f+L1lKcPU5+AO#)2$US5yNAH_}emE@M$5` z6!>eoS#$5GXs5V@uK)3wZFarEhc^hIr{@Exf!2-aLFmV{dx^P>Lqz$VZiM#;4ZN7m z7-J=|?NqgBF>PoHS;v+}t;tL=dO-vQ3%MDy#PY5Vuv?^r%P3&!~N&q>_O0AJ2Sr3_Q&v zUzcVDc#Z&1QnMEP&jF7yfPV(yr9CWn1wDVkDAuimo3Au3mU18M(ZtZV;W}bzbZ~__ z`1UW&iOvIVsvfD81_4ijHn%{QDOme?{9FC<;Ed7UN`&^7r|k*9EGk>N)o&&0r<`>D!$Xzgj2L}6Y-eqQ&vt&mouF*_rI#5BzSR^nJ@SQ51MiE6^w-TA(xBT4ZxQ&# zo7hXYOLo*6p*43d+*n%%ts-n0P|05DpRX7hvR`#%&Kr#qGsw9zFP}L~=MPb0S|has zK*$V@*8b4qy*yWPD(tyQ_^sM%%L$+U!x7&n)=fVYhP+J1HSGSHy{Rk8GAGtby?b&& z?`gVK17||L+iBUgkIc7RAM8kuwH>V4JsejflwiLwPby9F4#lk=3wW8>QR@4nVN98K zkc;(Hs<%eZmDI%H?zNI+Jkb@sVdlGB{Pve;qpxxOIm($m6OtFik(l!z5vPVsBH{U) z$M-m7le%WKc`G5{zLdbz9(gY%)Gel7q#S9ilMh$tMDyHw?$*ak0Ws$>&%A&t#~Vg$ z>^UYDV9()nNyEGor%oW>8u`Cju_r&wHSgh^fh<@Tm59kW_C&_NZm(afVdBNga81R* zs&x8jy_+uXjS9SWvvpG|gC|AD>}a|eL1ao<%;5}4PCj|}bRLg~eG?t#0UZ8cb;wjb zT*?ck`^Rdx&M#?jcJ>Zy!2f&I=e=b6l%BDW9m=p}qHLR8+b4;!C-8;D6-|#itf6ZC z)b#L^?ZC5{!%Qso$TjKgUUN!U85yr#Il;Vf*PE@@lVBg z=E=p>QczVhsw⁡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 YDM3}k<_241urbycWSgw||MlPh0l_H(ivR!s literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/train/__pycache__/process_ckpt.cpython-39.pyc b/lib/infer/infer_libs/train/__pycache__/process_ckpt.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35e533ad0c5741f06fd2ff63ed9b6818d1c38530 GIT binary patch literal 4552 zcmb_f>uVg>6~A-mv9q%e$+9dbzR=Pb+xb_-c3CIovp6NR zRTi_Zw#P29w~u#h!DIUxlc%oE$1JuNSeNgqUJEF#GSpgI`j#Q|MJ9}+OqeK}Tb7b3 zC2b|sN;*nrl*}rbQ!=mQl#?8*^j{tcW$FX`~#f zgVaQtS!K~&_b77NSf68iTw`xBky~e)dZYR7!XC5OH`qEmgN>kNTuZF$o?op+iRm>f z<*Pl~&>j|u^_CzKtI}$2`qiD($Eyo-7Amvl`VBv(XY>P|EvF zs;t!9X44D8(p1eC!fTFI42JFZNK(ym&2vSV*v)d_-h@F(rtV3ME{Fb(S4y|bLblqi z?Wkl+FT4`8D)rKl{akshYgjrutQLOYM))(OBP`{&+o9WN2VPmakr$Tchh@L%N4^{E z8(2CrY&oDg7q;tVuW`i_W#KnU*{VPKrzEFz`^~D-o|sWf(o%=+H7`j=(ye$`+)6!h zHe0gcMrH3trI1dHO1&M)3@xtdZJ0*htzanWF~1)(#WB)s7M!>;D0h&!YBW z<>HGQUk|ZR8x2=hyp2n(>&>8rCER$q-46WLAX$F>&5O&ITe80Vx>v#GEMM^4?a1G} zxe@qRHsA-IR5=*vH#gd{MH^lwtBUQLiAmObWJP!hf@xf{G+WE!haO{zWd<) z-ykOmZ4+ay)%4WP$}GxiD+{KaS8cRWiC*<0xkznKKoodlv|YrI=Bf?uixbp69oAac z%M`OOpcu|V&`!|mJN@@Rwq((wY7kg$7AFcSjUR^ z5K#>vlGW9Rh-xZCy?pgtY$-&=+5)AF0ivFZxv=V7{#F3nL>ez3pWt5P#Z;Av={p+a zp$Vy@Zsv|A4kMjKdPK~LqY5kMSJ`c?`6je3)cI{qels@3qRP!Y_6$!9W_WTi!&Cb+ zG{5@Tx{eKWJ^cw?zk;nxu#ii8XzM-k%ww*`@d;a>9kcaub)6XKIyta)s4F(aDP`%L zc&=l_2KMoD1O6!t_~?1?kQwW{#8IC|o^>tcPRH7ila_~Zmg?FQaaLTDr{IM0ITD9S z7$i)HME~NMy04)uDe8NFhVYq=BDro)36z*5j7YSVf-cWe104l=gp{bDe7}}77K|Q+ zoct0A8n1-U;P7agriybAJ!Qg|Dc2wYlwkh(_t8pm0<+H56Mk(4L8=t3pmL;5<U&@^@E1M28#L~#qDT7qQ7t!%Rn{`CRDnH<`4d%Lt2$VJzA}iL8v`X z70RHY8425&e&q(SP2`Cs#l}U2M+$$&;3!XHryvSxg-P;xsvszqYQYX6m+0Vexj=Oz zm`cmjRB?<1?S_1cgj#>%3Hc<6XGk0;L0mNkWrw}Kapkb#20>XFcphECe?u_M0H_gF zjFF6Ha}J=Jd@XGjy@-xf%g5PSK;i$?)0vypMde9-&i`4T4Sk0CH=@r06~2Ohu8^qMN6a|;aD45y#gbr9Q$D79ZN9FXatjqYAIV=`@U&pXyZFvL2x?ex`S6dL$t^ngT&poZgiWUNi_Pl1nM z4j`)ha~X4eHfW^=p!GL0i_noBfT$U5XAXf-^@^)>o(#g5ih}`T97q&1GGyoCW!Ddu zqSlfcxD?gAK3Ipvr8oBTOE}lp{K%_B+qlu7$x>4xfFD9^rm|EUvAvB|#X85%^)$Cjg=Xod0WX+e`F@-%QL+oLVEPh{5o2 zL7xo$sl=oM>`Fg5n^S!ZM4kj)u8_rBJ ziK$lZuTY^p1>C`HCqLj1hZByFTmrHyHsMR!F+Qg)KH`t2t>cfTP1~}yMTN)%G=2lR z3VC^%eq0Z4hKlr(Or;eB*aKW6!@lDXnJ3e37 any batch is included either {x | b1 < length(x) <=b2} or {x | b2 < length(x) <= b3}. + + It removes samples which are not included in the boundaries. + Ex) boundaries = [b1, b2, b3] -> any x s.t. length(x) <= b1 or length(x) > b3 are discarded. + """ + + def __init__( + self, + dataset, + batch_size, + boundaries, + num_replicas=None, + rank=None, + shuffle=True, + ): + super().__init__(dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle) + self.lengths = dataset.lengths + self.batch_size = batch_size + self.boundaries = boundaries + + self.buckets, self.num_samples_per_bucket = self._create_buckets() + self.total_size = sum(self.num_samples_per_bucket) + self.num_samples = self.total_size // self.num_replicas + + def _create_buckets(self): + buckets = [[] for _ in range(len(self.boundaries) - 1)] + for i in range(len(self.lengths)): + length = self.lengths[i] + idx_bucket = self._bisect(length) + if idx_bucket != -1: + buckets[idx_bucket].append(i) + + for i in range(len(buckets) - 1, -1, -1): # + if len(buckets[i]) == 0: + buckets.pop(i) + self.boundaries.pop(i + 1) + + num_samples_per_bucket = [] + for i in range(len(buckets)): + len_bucket = len(buckets[i]) + total_batch_size = self.num_replicas * self.batch_size + rem = ( + total_batch_size - (len_bucket % total_batch_size) + ) % total_batch_size + num_samples_per_bucket.append(len_bucket + rem) + return buckets, num_samples_per_bucket + + def __iter__(self): + # deterministically shuffle based on epoch + g = torch.Generator() + g.manual_seed(self.epoch) + + indices = [] + if self.shuffle: + for bucket in self.buckets: + indices.append(torch.randperm(len(bucket), generator=g).tolist()) + else: + for bucket in self.buckets: + indices.append(list(range(len(bucket)))) + + batches = [] + for i in range(len(self.buckets)): + bucket = self.buckets[i] + len_bucket = len(bucket) + ids_bucket = indices[i] + num_samples_bucket = self.num_samples_per_bucket[i] + + # add extra samples to make it evenly divisible + rem = num_samples_bucket - len_bucket + ids_bucket = ( + ids_bucket + + ids_bucket * (rem // len_bucket) + + ids_bucket[: (rem % len_bucket)] + ) + + # subsample + ids_bucket = ids_bucket[self.rank :: self.num_replicas] + + # batching + for j in range(len(ids_bucket) // self.batch_size): + batch = [ + bucket[idx] + for idx in ids_bucket[ + j * self.batch_size : (j + 1) * self.batch_size + ] + ] + batches.append(batch) + + if self.shuffle: + batch_ids = torch.randperm(len(batches), generator=g).tolist() + batches = [batches[i] for i in batch_ids] + self.batches = batches + + assert len(self.batches) * self.batch_size == self.num_samples + return iter(self.batches) + + def _bisect(self, x, lo=0, hi=None): + if hi is None: + hi = len(self.boundaries) - 1 + + if hi > lo: + mid = (hi + lo) // 2 + if self.boundaries[mid] < x and x <= self.boundaries[mid + 1]: + return mid + elif x <= self.boundaries[mid]: + return self._bisect(x, lo, mid) + else: + return self._bisect(x, mid + 1, hi) + else: + return -1 + + def __len__(self): + return self.num_samples // self.batch_size diff --git a/lib/infer/infer_libs/train/losses.py b/lib/infer/infer_libs/train/losses.py new file mode 100644 index 000000000..b1b263e4c --- /dev/null +++ b/lib/infer/infer_libs/train/losses.py @@ -0,0 +1,58 @@ +import torch + + +def feature_loss(fmap_r, fmap_g): + loss = 0 + for dr, dg in zip(fmap_r, fmap_g): + for rl, gl in zip(dr, dg): + rl = rl.float().detach() + gl = gl.float() + loss += torch.mean(torch.abs(rl - gl)) + + return loss * 2 + + +def discriminator_loss(disc_real_outputs, disc_generated_outputs): + loss = 0 + r_losses = [] + g_losses = [] + for dr, dg in zip(disc_real_outputs, disc_generated_outputs): + dr = dr.float() + dg = dg.float() + r_loss = torch.mean((1 - dr) ** 2) + g_loss = torch.mean(dg**2) + loss += r_loss + g_loss + r_losses.append(r_loss.item()) + g_losses.append(g_loss.item()) + + return loss, r_losses, g_losses + + +def generator_loss(disc_outputs): + loss = 0 + gen_losses = [] + for dg in disc_outputs: + dg = dg.float() + l = torch.mean((1 - dg) ** 2) + gen_losses.append(l) + loss += l + + return loss, gen_losses + + +def kl_loss(z_p, logs_q, m_p, logs_p, z_mask): + """ + z_p, logs_q: [b, h, t_t] + m_p, logs_p: [b, h, t_t] + """ + z_p = z_p.float() + logs_q = logs_q.float() + m_p = m_p.float() + logs_p = logs_p.float() + z_mask = z_mask.float() + + kl = logs_p - logs_q - 0.5 + kl += 0.5 * ((z_p - m_p) ** 2) * torch.exp(-2.0 * logs_p) + kl = torch.sum(kl * z_mask) + l = kl / torch.sum(z_mask) + return l diff --git a/lib/infer/infer_libs/train/mel_processing.py b/lib/infer/infer_libs/train/mel_processing.py new file mode 100644 index 000000000..f458775bf --- /dev/null +++ b/lib/infer/infer_libs/train/mel_processing.py @@ -0,0 +1,132 @@ +import torch +import torch.utils.data +from librosa.filters import mel as librosa_mel_fn +import logging + +logger = logging.getLogger(__name__) + +MAX_WAV_VALUE = 32768.0 + + +def dynamic_range_compression_torch(x, C=1, clip_val=1e-5): + """ + PARAMS + ------ + C: compression factor + """ + return torch.log(torch.clamp(x, min=clip_val) * C) + + +def dynamic_range_decompression_torch(x, C=1): + """ + PARAMS + ------ + C: compression factor used to compress + """ + return torch.exp(x) / C + + +def spectral_normalize_torch(magnitudes): + return dynamic_range_compression_torch(magnitudes) + + +def spectral_de_normalize_torch(magnitudes): + return dynamic_range_decompression_torch(magnitudes) + + +# Reusable banks +mel_basis = {} +hann_window = {} + + +def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False): + """Convert waveform into Linear-frequency Linear-amplitude spectrogram. + + Args: + y :: (B, T) - Audio waveforms + n_fft + sampling_rate + hop_size + win_size + center + Returns: + :: (B, Freq, Frame) - Linear-frequency Linear-amplitude spectrogram + """ + # Validation + if torch.min(y) < -1.07: + logger.debug("min value is %s", str(torch.min(y))) + if torch.max(y) > 1.07: + logger.debug("max value is %s", str(torch.max(y))) + + # Window - Cache if needed + global hann_window + dtype_device = str(y.dtype) + "_" + str(y.device) + wnsize_dtype_device = str(win_size) + "_" + dtype_device + if wnsize_dtype_device not in hann_window: + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + # Padding + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) + y = y.squeeze(1) + + # Complex Spectrogram :: (B, T) -> (B, Freq, Frame, RealComplex=2) + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) + + # Linear-frequency Linear-amplitude spectrogram :: (B, Freq, Frame, RealComplex=2) -> (B, Freq, Frame) + spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) + return spec + + +def spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax): + # MelBasis - Cache if needed + global mel_basis + dtype_device = str(spec.dtype) + "_" + str(spec.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device + if fmax_dtype_device not in mel_basis: + mel = librosa_mel_fn( + sr=sampling_rate, n_fft=n_fft, n_mels=num_mels, fmin=fmin, fmax=fmax + ) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=spec.dtype, device=spec.device + ) + + # Mel-frequency Log-amplitude spectrogram :: (B, Freq=num_mels, Frame) + melspec = torch.matmul(mel_basis[fmax_dtype_device], spec) + melspec = spectral_normalize_torch(melspec) + return melspec + + +def mel_spectrogram_torch( + y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False +): + """Convert waveform into Mel-frequency Log-amplitude spectrogram. + + Args: + y :: (B, T) - Waveforms + Returns: + melspec :: (B, Freq, Frame) - Mel-frequency Log-amplitude spectrogram + """ + # Linear-frequency Linear-amplitude spectrogram :: (B, T) -> (B, Freq, Frame) + spec = spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center) + + # Mel-frequency Log-amplitude spectrogram :: (B, Freq, Frame) -> (B, Freq=num_mels, Frame) + melspec = spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax) + + return melspec diff --git a/lib/infer/infer_libs/train/process_ckpt.py b/lib/infer/infer_libs/train/process_ckpt.py new file mode 100644 index 000000000..93430b1fd --- /dev/null +++ b/lib/infer/infer_libs/train/process_ckpt.py @@ -0,0 +1,261 @@ +import os +import sys +import traceback +from collections import OrderedDict + +import torch + +from assets.i18n.i18n import I18nAuto + +i18n = I18nAuto() + + +def savee(ckpt, sr, if_f0, name, epoch, version, hps): + try: + opt = OrderedDict() + opt["weight"] = {} + for key in ckpt.keys(): + if "enc_q" in key: + continue + opt["weight"][key] = ckpt[key].half() + opt["config"] = [ + hps.data.filter_length // 2 + 1, + 32, + hps.model.inter_channels, + hps.model.hidden_channels, + hps.model.filter_channels, + hps.model.n_heads, + hps.model.n_layers, + hps.model.kernel_size, + hps.model.p_dropout, + hps.model.resblock, + hps.model.resblock_kernel_sizes, + hps.model.resblock_dilation_sizes, + hps.model.upsample_rates, + hps.model.upsample_initial_channel, + hps.model.upsample_kernel_sizes, + hps.model.spk_embed_dim, + hps.model.gin_channels, + hps.data.sampling_rate, + ] + opt["info"] = "%sepoch" % epoch + opt["sr"] = sr + opt["f0"] = if_f0 + opt["version"] = version + torch.save(opt, "logs/weights/%s.pth" % name) + return "Success." + except: + return traceback.format_exc() + + +def show_info(path): + try: + a = torch.load(path, map_location="cpu") + return "模型信息:%s\n采样率:%s\n模型是否输入音高引导:%s\n版本:%s" % ( + a.get("info", "None"), + a.get("sr", "None"), + a.get("f0", "None"), + a.get("version", "None"), + ) + except: + return traceback.format_exc() + + +def extract_small_model(path, name, sr, if_f0, info, version): + try: + ckpt = torch.load(path, map_location="cpu") + if "model" in ckpt: + ckpt = ckpt["model"] + opt = OrderedDict() + opt["weight"] = {} + for key in ckpt.keys(): + if "enc_q" in key: + continue + opt["weight"][key] = ckpt[key].half() + if sr == "40k": + opt["config"] = [ + 1025, + 32, + 192, + 192, + 768, + 2, + 6, + 3, + 0, + "1", + [3, 7, 11], + [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + [10, 10, 2, 2], + 512, + [16, 16, 4, 4], + 109, + 256, + 40000, + ] + elif sr == "48k": + if version == "v1": + opt["config"] = [ + 1025, + 32, + 192, + 192, + 768, + 2, + 6, + 3, + 0, + "1", + [3, 7, 11], + [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + [10, 6, 2, 2, 2], + 512, + [16, 16, 4, 4, 4], + 109, + 256, + 48000, + ] + else: + opt["config"] = [ + 1025, + 32, + 192, + 192, + 768, + 2, + 6, + 3, + 0, + "1", + [3, 7, 11], + [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + [12, 10, 2, 2], + 512, + [24, 20, 4, 4], + 109, + 256, + 48000, + ] + elif sr == "32k": + if version == "v1": + opt["config"] = [ + 513, + 32, + 192, + 192, + 768, + 2, + 6, + 3, + 0, + "1", + [3, 7, 11], + [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + [10, 4, 2, 2, 2], + 512, + [16, 16, 4, 4, 4], + 109, + 256, + 32000, + ] + else: + opt["config"] = [ + 513, + 32, + 192, + 192, + 768, + 2, + 6, + 3, + 0, + "1", + [3, 7, 11], + [[1, 3, 5], [1, 3, 5], [1, 3, 5]], + [10, 8, 2, 2], + 512, + [20, 16, 4, 4], + 109, + 256, + 32000, + ] + if info == "": + info = "Extracted model." + opt["info"] = info + opt["version"] = version + opt["sr"] = sr + opt["f0"] = int(if_f0) + torch.save(opt, "logs/weights/%s.pth" % name) + return "Success." + except: + return traceback.format_exc() + + +def change_info(path, info, name): + try: + ckpt = torch.load(path, map_location="cpu") + ckpt["info"] = info + if name == "": + name = os.path.basename(path) + torch.save(ckpt, "logs/weights/%s" % name) + return "Success." + except: + return traceback.format_exc() + + +def merge(path1, path2, alpha1, sr, f0, info, name, version): + try: + + def extract(ckpt): + a = ckpt["model"] + opt = OrderedDict() + opt["weight"] = {} + for key in a.keys(): + if "enc_q" in key: + continue + opt["weight"][key] = a[key] + return opt + + ckpt1 = torch.load(path1, map_location="cpu") + ckpt2 = torch.load(path2, map_location="cpu") + cfg = ckpt1["config"] + if "model" in ckpt1: + ckpt1 = extract(ckpt1) + else: + ckpt1 = ckpt1["weight"] + if "model" in ckpt2: + ckpt2 = extract(ckpt2) + else: + ckpt2 = ckpt2["weight"] + if sorted(list(ckpt1.keys())) != sorted(list(ckpt2.keys())): + return "Fail to merge the models. The model architectures are not the same." + opt = OrderedDict() + opt["weight"] = {} + for key in ckpt1.keys(): + # try: + if key == "emb_g.weight" and ckpt1[key].shape != ckpt2[key].shape: + min_shape0 = min(ckpt1[key].shape[0], ckpt2[key].shape[0]) + opt["weight"][key] = ( + alpha1 * (ckpt1[key][:min_shape0].float()) + + (1 - alpha1) * (ckpt2[key][:min_shape0].float()) + ).half() + else: + opt["weight"][key] = ( + alpha1 * (ckpt1[key].float()) + (1 - alpha1) * (ckpt2[key].float()) + ).half() + # except: + # pdb.set_trace() + opt["config"] = cfg + """ + if(sr=="40k"):opt["config"] = [1025, 32, 192, 192, 768, 2, 6, 3, 0, "1", [3, 7, 11], [[1, 3, 5], [1, 3, 5], [1, 3, 5]], [10, 10, 2, 2], 512, [16, 16, 4, 4,4], 109, 256, 40000] + elif(sr=="48k"):opt["config"] = [1025, 32, 192, 192, 768, 2, 6, 3, 0, "1", [3, 7, 11], [[1, 3, 5], [1, 3, 5], [1, 3, 5]], [10,6,2,2,2], 512, [16, 16, 4, 4], 109, 256, 48000] + elif(sr=="32k"):opt["config"] = [513, 32, 192, 192, 768, 2, 6, 3, 0, "1", [3, 7, 11], [[1, 3, 5], [1, 3, 5], [1, 3, 5]], [10, 4, 2, 2, 2], 512, [16, 16, 4, 4,4], 109, 256, 32000] + """ + opt["sr"] = sr + opt["f0"] = 1 if f0 == i18n("是") else 0 + opt["version"] = version + opt["info"] = info + torch.save(opt, "logs/weights/%s.pth" % name) + return "Success." + except: + return traceback.format_exc() diff --git a/lib/infer/infer_libs/train/utils.py b/lib/infer/infer_libs/train/utils.py new file mode 100644 index 000000000..dd965fc4d --- /dev/null +++ b/lib/infer/infer_libs/train/utils.py @@ -0,0 +1,478 @@ +import argparse +import glob +import json +import logging +import os +import subprocess +import sys +import shutil + +import numpy as np +import torch +from scipy.io.wavfile import read + +MATPLOTLIB_FLAG = False + +logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) +logger = logging + + +def load_checkpoint_d(checkpoint_path, combd, sbd, optimizer=None, load_opt=1): + assert os.path.isfile(checkpoint_path) + checkpoint_dict = torch.load(checkpoint_path, map_location="cpu") + + ################## + def go(model, bkey): + saved_state_dict = checkpoint_dict[bkey] + if hasattr(model, "module"): + state_dict = model.module.state_dict() + else: + state_dict = model.state_dict() + new_state_dict = {} + for k, v in state_dict.items(): # 模型需要的shape + try: + new_state_dict[k] = saved_state_dict[k] + if saved_state_dict[k].shape != state_dict[k].shape: + logger.warn( + "shape-%s-mismatch. need: %s, get: %s", + k, + state_dict[k].shape, + saved_state_dict[k].shape, + ) # + raise KeyError + except: + # logger.info(traceback.format_exc()) + logger.info("%s is not in the checkpoint", k) # pretrain缺失的 + new_state_dict[k] = v # 模型自带的随机值 + if hasattr(model, "module"): + model.module.load_state_dict(new_state_dict, strict=False) + else: + model.load_state_dict(new_state_dict, strict=False) + return model + + go(combd, "combd") + model = go(sbd, "sbd") + ############# + logger.info("Loaded model weights") + + iteration = checkpoint_dict["iteration"] + learning_rate = checkpoint_dict["learning_rate"] + if ( + optimizer is not None and load_opt == 1 + ): ###加载不了,如果是空的的话,重新初始化,可能还会影响lr时间表的更新,因此在train文件最外围catch + # try: + optimizer.load_state_dict(checkpoint_dict["optimizer"]) + # except: + # traceback.print_exc() + logger.info("Loaded checkpoint '{}' (epoch {})".format(checkpoint_path, iteration)) + return model, optimizer, learning_rate, iteration + + +# def load_checkpoint(checkpoint_path, model, optimizer=None): +# assert os.path.isfile(checkpoint_path) +# checkpoint_dict = torch.load(checkpoint_path, map_location='cpu') +# iteration = checkpoint_dict['iteration'] +# learning_rate = checkpoint_dict['learning_rate'] +# if optimizer is not None: +# optimizer.load_state_dict(checkpoint_dict['optimizer']) +# # print(1111) +# saved_state_dict = checkpoint_dict['model'] +# # print(1111) +# +# if hasattr(model, 'module'): +# state_dict = model.module.state_dict() +# else: +# state_dict = model.state_dict() +# new_state_dict= {} +# for k, v in state_dict.items(): +# try: +# new_state_dict[k] = saved_state_dict[k] +# except: +# logger.info("%s is not in the checkpoint" % k) +# new_state_dict[k] = v +# if hasattr(model, 'module'): +# model.module.load_state_dict(new_state_dict) +# else: +# model.load_state_dict(new_state_dict) +# logger.info("Loaded checkpoint '{}' (epoch {})" .format( +# checkpoint_path, iteration)) +# return model, optimizer, learning_rate, iteration +def load_checkpoint(checkpoint_path, model, optimizer=None, load_opt=1): + assert os.path.isfile(checkpoint_path) + checkpoint_dict = torch.load(checkpoint_path, map_location="cpu") + + saved_state_dict = checkpoint_dict["model"] + if hasattr(model, "module"): + state_dict = model.module.state_dict() + else: + state_dict = model.state_dict() + new_state_dict = {} + for k, v in state_dict.items(): # 模型需要的shape + try: + new_state_dict[k] = saved_state_dict[k] + if saved_state_dict[k].shape != state_dict[k].shape: + logger.warn( + "shape-%s-mismatch|need-%s|get-%s", + k, + state_dict[k].shape, + saved_state_dict[k].shape, + ) # + raise KeyError + except: + # logger.info(traceback.format_exc()) + logger.info("%s is not in the checkpoint", k) # pretrain缺失的 + new_state_dict[k] = v # 模型自带的随机值 + if hasattr(model, "module"): + model.module.load_state_dict(new_state_dict, strict=False) + else: + model.load_state_dict(new_state_dict, strict=False) + logger.info("Loaded model weights") + + iteration = checkpoint_dict["iteration"] + learning_rate = checkpoint_dict["learning_rate"] + if ( + optimizer is not None and load_opt == 1 + ): ###加载不了,如果是空的的话,重新初始化,可能还会影响lr时间表的更新,因此在train文件最外围catch + # try: + optimizer.load_state_dict(checkpoint_dict["optimizer"]) + # except: + # traceback.print_exc() + logger.info("Loaded checkpoint '{}' (epoch {})".format(checkpoint_path, iteration)) + return model, optimizer, learning_rate, iteration + + +def save_checkpoint(model, optimizer, learning_rate, iteration, checkpoint_path): + logger.info( + "Saving model and optimizer state at epoch {} to {}".format( + iteration, checkpoint_path + ) + ) + if hasattr(model, "module"): + state_dict = model.module.state_dict() + else: + state_dict = model.state_dict() + torch.save( + { + "model": state_dict, + "iteration": iteration, + "optimizer": optimizer.state_dict(), + "learning_rate": learning_rate, + }, + checkpoint_path, + ) + + +def save_checkpoint_d(combd, sbd, optimizer, learning_rate, iteration, checkpoint_path): + logger.info( + "Saving model and optimizer state at epoch {} to {}".format( + iteration, checkpoint_path + ) + ) + if hasattr(combd, "module"): + state_dict_combd = combd.module.state_dict() + else: + state_dict_combd = combd.state_dict() + if hasattr(sbd, "module"): + state_dict_sbd = sbd.module.state_dict() + else: + state_dict_sbd = sbd.state_dict() + torch.save( + { + "combd": state_dict_combd, + "sbd": state_dict_sbd, + "iteration": iteration, + "optimizer": optimizer.state_dict(), + "learning_rate": learning_rate, + }, + checkpoint_path, + ) + + +def summarize( + writer, + global_step, + scalars={}, + histograms={}, + images={}, + audios={}, + audio_sampling_rate=22050, +): + for k, v in scalars.items(): + writer.add_scalar(k, v, global_step) + for k, v in histograms.items(): + writer.add_histogram(k, v, global_step) + for k, v in images.items(): + writer.add_image(k, v, global_step, dataformats="HWC") + for k, v in audios.items(): + writer.add_audio(k, v, global_step, audio_sampling_rate) + + +def latest_checkpoint_path(dir_path, regex="G_*.pth"): + f_list = glob.glob(os.path.join(dir_path, regex)) + f_list.sort(key=lambda f: int("".join(filter(str.isdigit, f)))) + x = f_list[-1] + logger.debug(x) + return x + + +def plot_spectrogram_to_numpy(spectrogram): + global MATPLOTLIB_FLAG + if not MATPLOTLIB_FLAG: + import matplotlib + + matplotlib.use("Agg") + MATPLOTLIB_FLAG = True + mpl_logger = logging.getLogger("matplotlib") + mpl_logger.setLevel(logging.WARNING) + import matplotlib.pylab as plt + import numpy as np + + fig, ax = plt.subplots(figsize=(10, 2)) + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") + plt.colorbar(im, ax=ax) + plt.xlabel("Frames") + plt.ylabel("Channels") + plt.tight_layout() + + fig.canvas.draw() + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + plt.close() + return data + + +def plot_alignment_to_numpy(alignment, info=None): + global MATPLOTLIB_FLAG + if not MATPLOTLIB_FLAG: + import matplotlib + + matplotlib.use("Agg") + MATPLOTLIB_FLAG = True + mpl_logger = logging.getLogger("matplotlib") + mpl_logger.setLevel(logging.WARNING) + import matplotlib.pylab as plt + import numpy as np + + fig, ax = plt.subplots(figsize=(6, 4)) + im = ax.imshow( + alignment.transpose(), aspect="auto", origin="lower", interpolation="none" + ) + fig.colorbar(im, ax=ax) + xlabel = "Decoder timestep" + if info is not None: + xlabel += "\n\n" + info + plt.xlabel(xlabel) + plt.ylabel("Encoder timestep") + plt.tight_layout() + + fig.canvas.draw() + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") + data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + plt.close() + return data + + +def load_wav_to_torch(full_path): + sampling_rate, data = read(full_path) + return torch.FloatTensor(data.astype(np.float32)), sampling_rate + + +def load_filepaths_and_text(filename, split="|"): + with open(filename, encoding="utf-8") as f: + filepaths_and_text = [line.strip().split(split) for line in f] + return filepaths_and_text + + +def get_hparams(init=True): + """ + todo: + 结尾七人组: + 保存频率、总epoch done + bs done + pretrainG、pretrainD done + 卡号:os.en["CUDA_VISIBLE_DEVICES"] done + if_latest done + 模型:if_f0 done + 采样率:自动选择config done + 是否缓存数据集进GPU:if_cache_data_in_gpu done + + -m: + 自动决定training_files路径,改掉train_nsf_load_pretrain.py里的hps.data.training_files done + -c不要了 + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "-se", + "--save_every_epoch", + type=int, + required=True, + help="checkpoint save frequency (epoch)", + ) + parser.add_argument( + "-te", "--total_epoch", type=int, required=True, help="total_epoch" + ) + parser.add_argument( + "-pg", "--pretrainG", type=str, default="", help="Pretrained Discriminator path" + ) + parser.add_argument( + "-pd", "--pretrainD", type=str, default="", help="Pretrained Generator path" + ) + parser.add_argument("-g", "--gpus", type=str, default="0", help="split by -") + parser.add_argument( + "-bs", "--batch_size", type=int, required=True, help="batch size" + ) + parser.add_argument( + "-e", "--experiment_dir", type=str, required=True, help="experiment dir" + ) # -m + parser.add_argument( + "-sr", "--sample_rate", type=str, required=True, help="sample rate, 32k/40k/48k" + ) + parser.add_argument( + "-sw", + "--save_every_weights", + type=str, + default="0", + help="save the extracted model in weights directory when saving checkpoints", + ) + parser.add_argument( + "-v", "--version", type=str, required=True, help="model version" + ) + parser.add_argument( + "-f0", + "--if_f0", + type=int, + required=True, + help="use f0 as one of the inputs of the model, 1 or 0", + ) + parser.add_argument( + "-l", + "--if_latest", + type=int, + required=True, + help="if only save the latest G/D pth file, 1 or 0", + ) + parser.add_argument( + "-c", + "--if_cache_data_in_gpu", + type=int, + required=True, + help="if caching the dataset in GPU memory, 1 or 0", + ) + + args = parser.parse_args() + name = args.experiment_dir + experiment_dir = os.path.join("./logs", args.experiment_dir) + + config_save_path = os.path.join(experiment_dir, "config.json") + with open(config_save_path, "r") as f: + config = json.load(f) + + hparams = HParams(**config) + hparams.model_dir = hparams.experiment_dir = experiment_dir + hparams.save_every_epoch = args.save_every_epoch + hparams.name = name + hparams.total_epoch = args.total_epoch + hparams.pretrainG = args.pretrainG + hparams.pretrainD = args.pretrainD + hparams.version = args.version + hparams.gpus = args.gpus + hparams.train.batch_size = args.batch_size + hparams.sample_rate = args.sample_rate + hparams.if_f0 = args.if_f0 + hparams.if_latest = args.if_latest + hparams.save_every_weights = args.save_every_weights + hparams.if_cache_data_in_gpu = args.if_cache_data_in_gpu + hparams.data.training_files = "%s/filelist.txt" % experiment_dir + return hparams + + +def get_hparams_from_dir(model_dir): + config_save_path = os.path.join(model_dir, "config.json") + with open(config_save_path, "r") as f: + data = f.read() + config = json.loads(data) + + hparams = HParams(**config) + hparams.model_dir = model_dir + return hparams + + +def get_hparams_from_file(config_path): + with open(config_path, "r") as f: + data = f.read() + config = json.loads(data) + + hparams = HParams(**config) + return hparams + + +def check_git_hash(model_dir): + source_dir = os.path.dirname(os.path.realpath(__file__)) + if not os.path.exists(os.path.join(source_dir, ".git")): + logger.warn( + "{} is not a git repository, therefore hash value comparison will be ignored.".format( + source_dir + ) + ) + return + + cur_hash = subprocess.getoutput("git rev-parse HEAD") + + path = os.path.join(model_dir, "githash") + if os.path.exists(path): + saved_hash = open(path).read() + if saved_hash != cur_hash: + logger.warn( + "git hash values are different. {}(saved) != {}(current)".format( + saved_hash[:8], cur_hash[:8] + ) + ) + else: + open(path, "w").write(cur_hash) + + +def get_logger(model_dir, filename="train.log"): + global logger + logger = logging.getLogger(os.path.basename(model_dir)) + logger.setLevel(logging.DEBUG) + + formatter = logging.Formatter("%(asctime)s\t%(name)s\t%(levelname)s\t%(message)s") + if not os.path.exists(model_dir): + os.makedirs(model_dir) + h = logging.FileHandler(os.path.join(model_dir, filename)) + h.setLevel(logging.DEBUG) + h.setFormatter(formatter) + logger.addHandler(h) + return logger + + +class HParams: + def __init__(self, **kwargs): + for k, v in kwargs.items(): + if type(v) == dict: + v = HParams(**v) + self[k] = v + + def keys(self): + return self.__dict__.keys() + + def items(self): + return self.__dict__.items() + + def values(self): + return self.__dict__.values() + + def __len__(self): + return len(self.__dict__) + + def __getitem__(self, key): + return getattr(self, key) + + def __setitem__(self, key, value): + return setattr(self, key, value) + + def __contains__(self, key): + return key in self.__dict__ + + def __repr__(self): + return self.__dict__.__repr__() diff --git a/lib/infer/infer_libs/uvr5_pack/__pycache__/mdx.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/__pycache__/mdx.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a253fd7435710d2c24a2d4f48be371eba3cb184 GIT binary patch literal 7706 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 b8O|Q_Q}TDn%i>iKhz9&iRR8e`U%2#t7hq*S literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/uvr5_pack/__pycache__/utils.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..533bacea3228358d23d4dc1d591ad32c49e33e18 GIT binary patch literal 3042 zcmaJ@Ns}B$70%3ByLy=wNh1lx1dDMCYb3MS;BeT06m!!YBmtshh^Aaw)l;MHs-CRu z(GppwkpnIcbKpd9nDNd00uCJf3pjGf;6Maibb=EHU(ENar^k}5a8~5Ywen@Y_vQC8 z?sg-F^yghC?e`e_7d4(wE*d{UuI@lcCi$2R<|QA9rtJ(Ilw#~o+=0uP?51AoOZQJg zdeVRD4FVa+@F^RFvLz#wE!mbGl#%3jS-$06bx2`^rlTTmSx}FzVs;-ao_pZ+l z)enc$IC*frh$ks(DxOqZ`&C)=g>7Z|I33b}^;N28sz^Akb($QMA@WV+>PHZo8EpSZ ze0Z_unjZ_pPk1eUiNm<~jvUU4<=0tt^#F%xaVL|h&-JedU7G zdT{Mdnv^oV_Ompe={$S9i?i=GR%mKxR@lYpxZ0XNwk=w2NIL0=l@GyqhrcQme8>_y z`y$a8wHrIUfr=5eW4Li7UuPFs?HX5#2SQyooa%-d_Z<3-bDq_nag1l&%z+i0oo51n zE3$EO%)W2Ehq=^ygD_F$w922r5oMNDsfKydOxsYE`LOBtR6g3%&2Mwj#VWQli64+x zrOb=b5_&2!ALA~L5<)Hu^)<8;k9tqjI!Zb-9jQ9TX5{K`S;nQ1&eK-yNmqJLS?wF& zup_=J>YxryaLi6v-7(rgPTlci9y<^|B zP45yr;YYk)(%ybxA{olibWArBnL}v)z^RvYXvA^rgdImG&?ws*Y`?8L`(2pyBgyNP z!j+wR1!i0}J+lPE3mA3fD5zJ>s_e?{`(hzY`+cm7eXU|oy$$wzuAV|$Px=?xo2-W3 zvwGJo$tCoC#lBvmam}nPbdlcqYE)~qeqmI0&-SxsR?XUZCYRTlX(0!&PEW3wa2?hm zaA5qU{jv+-tj(^#SJ5UC0e160fBoa8%#+QeEV6u5H3RpO0CN_JFifnphFtvv!nou? z&gj~nun+&j*@)GF5hGrQ+A$$K)FPi5aRhJOV!wVuUN!)D-NvPFKG+#0PTg*N&NtY3 zv@#d=?qFTtbU+6kTeKnpm$nlnw3=r+YDi0#V#^$BA&tsVWoL?Jd$br}79JfAaO0Z20rpiXfuSLG;BO zGsMg`gb!iOLKAw(JNGSWZaeLSx$rCQD@W@^~O&j`E zE0|%OywLMwx=EUktpiwq=JQJ12>Nt7oI?yaoux2?)Q|E12K^djh*tXbH>{IBn)cV# zo9I-15?4ulmqg>_A5e{~peSCeA46C-DbsAQfTBtVK{3qm3;_7BgCQ;j6{+yKJn_eD+!Ia_Dz}q)bk4q4ySb zQqUmDy4g4$4O+KJ%MO9XZQ$78?FLpFtStVf7v&Jou5z&S`7WA{FW%JU;V9M3CQtXB zVWH|95RCgE8+x^@^UHh_txeF83;0|B1+4=z>ON-mxguKWw-r5L)Hg{GaWuE2;c-Qj wgSRBedVX|z{xr~P7I 1: + if device != "cuda" and args.rank == 0: + print("Error: distributed training is only available with cuda device", file=sys.stderr) + sys.exit(1) + th.cuda.set_device(args.rank % th.cuda.device_count()) + distributed.init_process_group(backend="nccl", + init_method="tcp://" + args.master, + rank=args.rank, + world_size=args.world_size) + + checkpoint = args.checkpoints / f"{name}.th" + checkpoint_tmp = args.checkpoints / f"{name}.th.tmp" + if args.restart and checkpoint.exists() and args.rank == 0: + checkpoint.unlink() + + if args.test or args.test_pretrained: + args.epochs = 1 + args.repeat = 0 + if args.test: + model = load_model(args.models / args.test) + else: + model = load_pretrained(args.test_pretrained) + elif args.tasnet: + model = ConvTasNet(audio_channels=args.audio_channels, + samplerate=args.samplerate, X=args.X, + segment_length=4 * args.samples, + sources=SOURCES) + else: + model = Demucs( + audio_channels=args.audio_channels, + channels=args.channels, + context=args.context, + depth=args.depth, + glu=args.glu, + growth=args.growth, + kernel_size=args.kernel_size, + lstm_layers=args.lstm_layers, + rescale=args.rescale, + rewrite=args.rewrite, + stride=args.conv_stride, + resample=args.resample, + normalize=args.normalize, + samplerate=args.samplerate, + segment_length=4 * args.samples, + sources=SOURCES, + ) + model.to(device) + if args.init: + model.load_state_dict(load_pretrained(args.init).state_dict()) + + if args.show: + print(model) + size = sizeof_fmt(4 * sum(p.numel() for p in model.parameters())) + print(f"Model size {size}") + return + + try: + saved = th.load(checkpoint, map_location='cpu') + except IOError: + saved = SavedState() + + optimizer = th.optim.Adam(model.parameters(), lr=args.lr) + + quantizer = None + quantizer = get_quantizer(model, args, optimizer) + + if saved.last_state is not None: + model.load_state_dict(saved.last_state, strict=False) + if saved.optimizer is not None: + optimizer.load_state_dict(saved.optimizer) + + model_name = f"{name}.th" + if args.save_model: + if args.rank == 0: + model.to("cpu") + model.load_state_dict(saved.best_state) + save_model(model, quantizer, args, args.models / model_name) + return + elif args.save_state: + model_name = f"{args.save_state}.th" + if args.rank == 0: + model.to("cpu") + model.load_state_dict(saved.best_state) + state = get_state(model, quantizer) + save_state(state, args.models / model_name) + return + + if args.rank == 0: + done = args.logs / f"{name}.done" + if done.exists(): + done.unlink() + + augment = [Shift(args.data_stride)] + if args.augment: + augment += [FlipSign(), FlipChannels(), Scale(), + Remix(group_size=args.remix_group_size)] + augment = nn.Sequential(*augment).to(device) + print("Agumentation pipeline:", augment) + + if args.mse: + criterion = nn.MSELoss() + else: + criterion = nn.L1Loss() + + # Setting number of samples so that all convolution windows are full. + # Prevents hard to debug mistake with the prediction being shifted compared + # to the input mixture. + samples = model.valid_length(args.samples) + print(f"Number of training samples adjusted to {samples}") + samples = samples + args.data_stride + if args.repitch: + # We need a bit more audio samples, to account for potential + # tempo change. + samples = math.ceil(samples / (1 - 0.01 * args.max_tempo)) + + args.metadata.mkdir(exist_ok=True, parents=True) + if args.raw: + train_set = Rawset(args.raw / "train", + samples=samples, + channels=args.audio_channels, + streams=range(1, len(model.sources) + 1), + stride=args.data_stride) + + valid_set = Rawset(args.raw / "valid", channels=args.audio_channels) + elif args.wav: + train_set, valid_set = get_wav_datasets(args, samples, model.sources) + elif args.is_wav: + train_set, valid_set = get_musdb_wav_datasets(args, samples, model.sources) + else: + train_set, valid_set = get_compressed_datasets(args, samples) + + if args.repitch: + train_set = RepitchedWrapper( + train_set, + proba=args.repitch, + max_tempo=args.max_tempo) + + best_loss = float("inf") + for epoch, metrics in enumerate(saved.metrics): + print(f"Epoch {epoch:03d}: " + f"train={metrics['train']:.8f} " + f"valid={metrics['valid']:.8f} " + f"best={metrics['best']:.4f} " + f"ms={metrics.get('true_model_size', 0):.2f}MB " + f"cms={metrics.get('compressed_model_size', 0):.2f}MB " + f"duration={human_seconds(metrics['duration'])}") + best_loss = metrics['best'] + + if args.world_size > 1: + dmodel = DistributedDataParallel(model, + device_ids=[th.cuda.current_device()], + output_device=th.cuda.current_device()) + else: + dmodel = model + + for epoch in range(len(saved.metrics), args.epochs): + begin = time.time() + model.train() + train_loss, model_size = train_model( + epoch, train_set, dmodel, criterion, optimizer, augment, + quantizer=quantizer, + batch_size=args.batch_size, + device=device, + repeat=args.repeat, + seed=args.seed, + diffq=args.diffq, + workers=args.workers, + world_size=args.world_size) + model.eval() + valid_loss = validate_model( + epoch, valid_set, model, criterion, + device=device, + rank=args.rank, + split=args.split_valid, + overlap=args.overlap, + world_size=args.world_size) + + ms = 0 + cms = 0 + if quantizer and args.rank == 0: + ms = quantizer.true_model_size() + cms = quantizer.compressed_model_size(num_workers=min(40, args.world_size * 10)) + + duration = time.time() - begin + if valid_loss < best_loss and ms <= args.ms_target: + best_loss = valid_loss + saved.best_state = { + key: value.to("cpu").clone() + for key, value in model.state_dict().items() + } + + saved.metrics.append({ + "train": train_loss, + "valid": valid_loss, + "best": best_loss, + "duration": duration, + "model_size": model_size, + "true_model_size": ms, + "compressed_model_size": cms, + }) + if args.rank == 0: + json.dump(saved.metrics, open(metrics_path, "w")) + + saved.last_state = model.state_dict() + saved.optimizer = optimizer.state_dict() + if args.rank == 0 and not args.test: + th.save(saved, checkpoint_tmp) + checkpoint_tmp.rename(checkpoint) + + print(f"Epoch {epoch:03d}: " + f"train={train_loss:.8f} valid={valid_loss:.8f} best={best_loss:.4f} ms={ms:.2f}MB " + f"cms={cms:.2f}MB " + f"duration={human_seconds(duration)}") + + if args.world_size > 1: + distributed.barrier() + + del dmodel + model.load_state_dict(saved.best_state) + if args.eval_cpu: + device = "cpu" + model.to(device) + model.eval() + evaluate(model, args.musdb, eval_folder, + is_wav=args.is_wav, + rank=args.rank, + world_size=args.world_size, + device=device, + save=args.save, + split=args.split_valid, + shifts=args.shifts, + overlap=args.overlap, + workers=args.eval_workers) + model.to("cpu") + if args.rank == 0: + if not (args.test or args.test_pretrained): + save_model(model, quantizer, args, args.models / model_name) + print("done") + done.write_text("done") + + +if __name__ == "__main__": + main() diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/audio.py b/lib/infer/infer_libs/uvr5_pack/demucs/audio.py new file mode 100644 index 000000000..b29f156e4 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/audio.py @@ -0,0 +1,172 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +import json +import subprocess as sp +from pathlib import Path + +import julius +import numpy as np +import torch + +from .utils import temp_filenames + + +def _read_info(path): + stdout_data = sp.check_output([ + 'ffprobe', "-loglevel", "panic", + str(path), '-print_format', 'json', '-show_format', '-show_streams' + ]) + return json.loads(stdout_data.decode('utf-8')) + + +class AudioFile: + """ + Allows to read audio from any format supported by ffmpeg, as well as resampling or + converting to mono on the fly. See :method:`read` for more details. + """ + def __init__(self, path: Path): + self.path = Path(path) + self._info = None + + def __repr__(self): + features = [("path", self.path)] + features.append(("samplerate", self.samplerate())) + features.append(("channels", self.channels())) + features.append(("streams", len(self))) + features_str = ", ".join(f"{name}={value}" for name, value in features) + return f"AudioFile({features_str})" + + @property + def info(self): + if self._info is None: + self._info = _read_info(self.path) + return self._info + + @property + def duration(self): + return float(self.info['format']['duration']) + + @property + def _audio_streams(self): + return [ + index for index, stream in enumerate(self.info["streams"]) + if stream["codec_type"] == "audio" + ] + + def __len__(self): + return len(self._audio_streams) + + def channels(self, stream=0): + return int(self.info['streams'][self._audio_streams[stream]]['channels']) + + def samplerate(self, stream=0): + return int(self.info['streams'][self._audio_streams[stream]]['sample_rate']) + + def read(self, + seek_time=None, + duration=None, + streams=slice(None), + samplerate=None, + channels=None, + temp_folder=None): + """ + Slightly more efficient implementation than stempeg, + in particular, this will extract all stems at once + rather than having to loop over one file multiple times + for each stream. + + Args: + seek_time (float): seek time in seconds or None if no seeking is needed. + duration (float): duration in seconds to extract or None to extract until the end. + streams (slice, int or list): streams to extract, can be a single int, a list or + a slice. If it is a slice or list, the output will be of size [S, C, T] + with S the number of streams, C the number of channels and T the number of samples. + If it is an int, the output will be [C, T]. + samplerate (int): if provided, will resample on the fly. If None, no resampling will + be done. Original sampling rate can be obtained with :method:`samplerate`. + channels (int): if 1, will convert to mono. We do not rely on ffmpeg for that + as ffmpeg automatically scale by +3dB to conserve volume when playing on speakers. + See https://sound.stackexchange.com/a/42710. + Our definition of mono is simply the average of the two channels. Any other + value will be ignored. + temp_folder (str or Path or None): temporary folder to use for decoding. + + + """ + streams = np.array(range(len(self)))[streams] + single = not isinstance(streams, np.ndarray) + if single: + streams = [streams] + + if duration is None: + target_size = None + query_duration = None + else: + target_size = int((samplerate or self.samplerate()) * duration) + query_duration = float((target_size + 1) / (samplerate or self.samplerate())) + + with temp_filenames(len(streams)) as filenames: + command = ['ffmpeg', '-y'] + command += ['-loglevel', 'panic'] + if seek_time: + command += ['-ss', str(seek_time)] + command += ['-i', str(self.path)] + for stream, filename in zip(streams, filenames): + command += ['-map', f'0:{self._audio_streams[stream]}'] + if query_duration is not None: + command += ['-t', str(query_duration)] + command += ['-threads', '1'] + command += ['-f', 'f32le'] + if samplerate is not None: + command += ['-ar', str(samplerate)] + command += [filename] + + sp.run(command, check=True) + wavs = [] + for filename in filenames: + wav = np.fromfile(filename, dtype=np.float32) + wav = torch.from_numpy(wav) + wav = wav.view(-1, self.channels()).t() + if channels is not None: + wav = convert_audio_channels(wav, channels) + if target_size is not None: + wav = wav[..., :target_size] + wavs.append(wav) + wav = torch.stack(wavs, dim=0) + if single: + wav = wav[0] + return wav + + +def convert_audio_channels(wav, channels=2): + """Convert audio to the given number of channels.""" + *shape, src_channels, length = wav.shape + if src_channels == channels: + pass + elif channels == 1: + # Case 1: + # The caller asked 1-channel audio, but the stream have multiple + # channels, downmix all channels. + wav = wav.mean(dim=-2, keepdim=True) + elif src_channels == 1: + # Case 2: + # The caller asked for multiple channels, but the input file have + # one single channel, replicate the audio over all channels. + wav = wav.expand(*shape, channels, length) + elif src_channels >= channels: + # Case 3: + # The caller asked for multiple channels, and the input file have + # more channels than requested. In that case return the first channels. + wav = wav[..., :channels, :] + else: + # Case 4: What is a reasonable choice here? + raise ValueError('The audio file has less channels than requested but is not mono.') + return wav + + +def convert_audio(wav, from_samplerate, to_samplerate, channels): + wav = convert_audio_channels(wav, channels) + return julius.resample_frac(wav, from_samplerate, to_samplerate) diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/augment.py b/lib/infer/infer_libs/uvr5_pack/demucs/augment.py new file mode 100644 index 000000000..bb36d3298 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/augment.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import random +import torch as th +from torch import nn + + +class Shift(nn.Module): + """ + Randomly shift audio in time by up to `shift` samples. + """ + def __init__(self, shift=8192): + super().__init__() + self.shift = shift + + def forward(self, wav): + batch, sources, channels, time = wav.size() + length = time - self.shift + if self.shift > 0: + if not self.training: + wav = wav[..., :length] + else: + offsets = th.randint(self.shift, [batch, sources, 1, 1], device=wav.device) + offsets = offsets.expand(-1, -1, channels, -1) + indexes = th.arange(length, device=wav.device) + wav = wav.gather(3, indexes + offsets) + return wav + + +class FlipChannels(nn.Module): + """ + Flip left-right channels. + """ + def forward(self, wav): + batch, sources, channels, time = wav.size() + if self.training and wav.size(2) == 2: + left = th.randint(2, (batch, sources, 1, 1), device=wav.device) + left = left.expand(-1, -1, -1, time) + right = 1 - left + wav = th.cat([wav.gather(2, left), wav.gather(2, right)], dim=2) + return wav + + +class FlipSign(nn.Module): + """ + Random sign flip. + """ + def forward(self, wav): + batch, sources, channels, time = wav.size() + if self.training: + signs = th.randint(2, (batch, sources, 1, 1), device=wav.device, dtype=th.float32) + wav = wav * (2 * signs - 1) + return wav + + +class Remix(nn.Module): + """ + Shuffle sources to make new mixes. + """ + def __init__(self, group_size=4): + """ + Shuffle sources within one batch. + Each batch is divided into groups of size `group_size` and shuffling is done within + each group separatly. This allow to keep the same probability distribution no matter + the number of GPUs. Without this grouping, using more GPUs would lead to a higher + probability of keeping two sources from the same track together which can impact + performance. + """ + super().__init__() + self.group_size = group_size + + def forward(self, wav): + batch, streams, channels, time = wav.size() + device = wav.device + + if self.training: + group_size = self.group_size or batch + if batch % group_size != 0: + raise ValueError(f"Batch size {batch} must be divisible by group size {group_size}") + groups = batch // group_size + wav = wav.view(groups, group_size, streams, channels, time) + permutations = th.argsort(th.rand(groups, group_size, streams, 1, 1, device=device), + dim=1) + wav = wav.gather(1, permutations.expand(-1, -1, -1, channels, time)) + wav = wav.view(batch, streams, channels, time) + return wav + + +class Scale(nn.Module): + def __init__(self, proba=1., min=0.25, max=1.25): + super().__init__() + self.proba = proba + self.min = min + self.max = max + + def forward(self, wav): + batch, streams, channels, time = wav.size() + device = wav.device + if self.training and random.random() < self.proba: + scales = th.empty(batch, streams, 1, 1, device=device).uniform_(self.min, self.max) + wav *= scales + return wav diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/compressed.py b/lib/infer/infer_libs/uvr5_pack/demucs/compressed.py new file mode 100644 index 000000000..eb8fbb754 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/compressed.py @@ -0,0 +1,115 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import json +from fractions import Fraction +from concurrent import futures + +import musdb +from torch import distributed + +from .audio import AudioFile + + +def get_musdb_tracks(root, *args, **kwargs): + mus = musdb.DB(root, *args, **kwargs) + return {track.name: track.path for track in mus} + + +class StemsSet: + def __init__(self, tracks, metadata, duration=None, stride=1, + samplerate=44100, channels=2, streams=slice(None)): + + self.metadata = [] + for name, path in tracks.items(): + meta = dict(metadata[name]) + meta["path"] = path + meta["name"] = name + self.metadata.append(meta) + if duration is not None and meta["duration"] < duration: + raise ValueError(f"Track {name} duration is too small {meta['duration']}") + self.metadata.sort(key=lambda x: x["name"]) + self.duration = duration + self.stride = stride + self.channels = channels + self.samplerate = samplerate + self.streams = streams + + def __len__(self): + return sum(self._examples_count(m) for m in self.metadata) + + def _examples_count(self, meta): + if self.duration is None: + return 1 + else: + return int((meta["duration"] - self.duration) // self.stride + 1) + + def track_metadata(self, index): + for meta in self.metadata: + examples = self._examples_count(meta) + if index >= examples: + index -= examples + continue + return meta + + def __getitem__(self, index): + for meta in self.metadata: + examples = self._examples_count(meta) + if index >= examples: + index -= examples + continue + streams = AudioFile(meta["path"]).read(seek_time=index * self.stride, + duration=self.duration, + channels=self.channels, + samplerate=self.samplerate, + streams=self.streams) + return (streams - meta["mean"]) / meta["std"] + + +def _get_track_metadata(path): + # use mono at 44kHz as reference. For any other settings data won't be perfectly + # normalized but it should be good enough. + audio = AudioFile(path) + mix = audio.read(streams=0, channels=1, samplerate=44100) + return {"duration": audio.duration, "std": mix.std().item(), "mean": mix.mean().item()} + + +def _build_metadata(tracks, workers=10): + pendings = [] + with futures.ProcessPoolExecutor(workers) as pool: + for name, path in tracks.items(): + pendings.append((name, pool.submit(_get_track_metadata, path))) + return {name: p.result() for name, p in pendings} + + +def _build_musdb_metadata(path, musdb, workers): + tracks = get_musdb_tracks(musdb) + metadata = _build_metadata(tracks, workers) + path.parent.mkdir(exist_ok=True, parents=True) + json.dump(metadata, open(path, "w")) + + +def get_compressed_datasets(args, samples): + metadata_file = args.metadata / "musdb.json" + if not metadata_file.is_file() and args.rank == 0: + _build_musdb_metadata(metadata_file, args.musdb, args.workers) + if args.world_size > 1: + distributed.barrier() + metadata = json.load(open(metadata_file)) + duration = Fraction(samples, args.samplerate) + stride = Fraction(args.data_stride, args.samplerate) + train_set = StemsSet(get_musdb_tracks(args.musdb, subsets=["train"], split="train"), + metadata, + duration=duration, + stride=stride, + streams=slice(1, None), + samplerate=args.samplerate, + channels=args.audio_channels) + valid_set = StemsSet(get_musdb_tracks(args.musdb, subsets=["train"], split="valid"), + metadata, + samplerate=args.samplerate, + channels=args.audio_channels) + return train_set, valid_set diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/model.py b/lib/infer/infer_libs/uvr5_pack/demucs/model.py new file mode 100644 index 000000000..e9d932f4d --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/model.py @@ -0,0 +1,202 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import julius +from torch import nn + +from .utils import capture_init, center_trim + + +class BLSTM(nn.Module): + def __init__(self, dim, layers=1): + super().__init__() + self.lstm = nn.LSTM(bidirectional=True, num_layers=layers, hidden_size=dim, input_size=dim) + self.linear = nn.Linear(2 * dim, dim) + + def forward(self, x): + x = x.permute(2, 0, 1) + x = self.lstm(x)[0] + x = self.linear(x) + x = x.permute(1, 2, 0) + return x + + +def rescale_conv(conv, reference): + std = conv.weight.std().detach() + scale = (std / reference)**0.5 + conv.weight.data /= scale + if conv.bias is not None: + conv.bias.data /= scale + + +def rescale_module(module, reference): + for sub in module.modules(): + if isinstance(sub, (nn.Conv1d, nn.ConvTranspose1d)): + rescale_conv(sub, reference) + + +class Demucs(nn.Module): + @capture_init + def __init__(self, + sources, + audio_channels=2, + channels=64, + depth=6, + rewrite=True, + glu=True, + rescale=0.1, + resample=True, + kernel_size=8, + stride=4, + growth=2., + lstm_layers=2, + context=3, + normalize=False, + samplerate=44100, + segment_length=4 * 10 * 44100): + """ + Args: + sources (list[str]): list of source names + audio_channels (int): stereo or mono + channels (int): first convolution channels + depth (int): number of encoder/decoder layers + rewrite (bool): add 1x1 convolution to each encoder layer + and a convolution to each decoder layer. + For the decoder layer, `context` gives the kernel size. + glu (bool): use glu instead of ReLU + resample_input (bool): upsample x2 the input and downsample /2 the output. + rescale (int): rescale initial weights of convolutions + to get their standard deviation closer to `rescale` + kernel_size (int): kernel size for convolutions + stride (int): stride for convolutions + growth (float): multiply (resp divide) number of channels by that + for each layer of the encoder (resp decoder) + lstm_layers (int): number of lstm layers, 0 = no lstm + context (int): kernel size of the convolution in the + decoder before the transposed convolution. If > 1, + will provide some context from neighboring time + steps. + samplerate (int): stored as meta information for easing + future evaluations of the model. + segment_length (int): stored as meta information for easing + future evaluations of the model. Length of the segments on which + the model was trained. + """ + + super().__init__() + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.resample = resample + self.channels = channels + self.normalize = normalize + self.samplerate = samplerate + self.segment_length = segment_length + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + if glu: + activation = nn.GLU(dim=1) + ch_scale = 2 + else: + activation = nn.ReLU() + ch_scale = 1 + in_channels = audio_channels + for index in range(depth): + encode = [] + encode += [nn.Conv1d(in_channels, channels, kernel_size, stride), nn.ReLU()] + if rewrite: + encode += [nn.Conv1d(channels, ch_scale * channels, 1), activation] + self.encoder.append(nn.Sequential(*encode)) + + decode = [] + if index > 0: + out_channels = in_channels + else: + out_channels = len(self.sources) * audio_channels + if rewrite: + decode += [nn.Conv1d(channels, ch_scale * channels, context), activation] + decode += [nn.ConvTranspose1d(channels, out_channels, kernel_size, stride)] + if index > 0: + decode.append(nn.ReLU()) + self.decoder.insert(0, nn.Sequential(*decode)) + in_channels = channels + channels = int(growth * channels) + + channels = in_channels + + if lstm_layers: + self.lstm = BLSTM(channels, lstm_layers) + else: + self.lstm = None + + if rescale: + rescale_module(self, reference=rescale) + + def valid_length(self, length): + """ + Return the nearest valid length to use with the model so that + there is no time steps left over in a convolutions, e.g. for all + layers, size of the input - kernel_size % stride = 0. + + If the mixture has a valid length, the estimated sources + will have exactly the same length when context = 1. If context > 1, + the two signals can be center trimmed to match. + + For training, extracts should have a valid length.For evaluation + on full tracks we recommend passing `pad = True` to :method:`forward`. + """ + if self.resample: + length *= 2 + for _ in range(self.depth): + length = math.ceil((length - self.kernel_size) / self.stride) + 1 + length = max(1, length) + length += self.context - 1 + for _ in range(self.depth): + length = (length - 1) * self.stride + self.kernel_size + + if self.resample: + length = math.ceil(length / 2) + return int(length) + + def forward(self, mix): + x = mix + + if self.normalize: + mono = mix.mean(dim=1, keepdim=True) + mean = mono.mean(dim=-1, keepdim=True) + std = mono.std(dim=-1, keepdim=True) + else: + mean = 0 + std = 1 + + x = (x - mean) / (1e-5 + std) + + if self.resample: + x = julius.resample_frac(x, 1, 2) + + saved = [] + for encode in self.encoder: + x = encode(x) + saved.append(x) + if self.lstm: + x = self.lstm(x) + for decode in self.decoder: + skip = center_trim(saved.pop(-1), x) + x = x + skip + x = decode(x) + + if self.resample: + x = julius.resample_frac(x, 2, 1) + x = x * std + mean + x = x.view(x.size(0), len(self.sources), self.audio_channels, x.size(-1)) + return x diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/parser.py b/lib/infer/infer_libs/uvr5_pack/demucs/parser.py new file mode 100644 index 000000000..4e8a19cf9 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/parser.py @@ -0,0 +1,244 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +from pathlib import Path + + +def get_parser(): + parser = argparse.ArgumentParser("demucs", description="Train and evaluate Demucs.") + default_raw = None + default_musdb = None + if 'DEMUCS_RAW' in os.environ: + default_raw = Path(os.environ['DEMUCS_RAW']) + if 'DEMUCS_MUSDB' in os.environ: + default_musdb = Path(os.environ['DEMUCS_MUSDB']) + parser.add_argument( + "--raw", + type=Path, + default=default_raw, + help="Path to raw audio, can be faster, see python3 -m demucs.raw to extract.") + parser.add_argument("--no_raw", action="store_const", const=None, dest="raw") + parser.add_argument("-m", + "--musdb", + type=Path, + default=default_musdb, + help="Path to musdb root") + parser.add_argument("--is_wav", action="store_true", + help="Indicate that the MusDB dataset is in wav format (i.e. MusDB-HQ).") + parser.add_argument("--metadata", type=Path, default=Path("metadata/"), + help="Folder where metadata information is stored.") + parser.add_argument("--wav", type=Path, + help="Path to a wav dataset. This should contain a 'train' and a 'valid' " + "subfolder.") + parser.add_argument("--samplerate", type=int, default=44100) + parser.add_argument("--audio_channels", type=int, default=2) + parser.add_argument("--samples", + default=44100 * 10, + type=int, + help="number of samples to feed in") + parser.add_argument("--data_stride", + default=44100, + type=int, + help="Stride for chunks, shorter = longer epochs") + parser.add_argument("-w", "--workers", default=10, type=int, help="Loader workers") + parser.add_argument("--eval_workers", default=2, type=int, help="Final evaluation workers") + parser.add_argument("-d", + "--device", + help="Device to train on, default is cuda if available else cpu") + parser.add_argument("--eval_cpu", action="store_true", help="Eval on test will be run on cpu.") + parser.add_argument("--dummy", help="Dummy parameter, useful to create a new checkpoint file") + parser.add_argument("--test", help="Just run the test pipeline + one validation. " + "This should be a filename relative to the models/ folder.") + parser.add_argument("--test_pretrained", help="Just run the test pipeline + one validation, " + "on a pretrained model. ") + + parser.add_argument("--rank", default=0, type=int) + parser.add_argument("--world_size", default=1, type=int) + parser.add_argument("--master") + + parser.add_argument("--checkpoints", + type=Path, + default=Path("checkpoints"), + help="Folder where to store checkpoints etc") + parser.add_argument("--evals", + type=Path, + default=Path("evals"), + help="Folder where to store evals and waveforms") + parser.add_argument("--save", + action="store_true", + help="Save estimated for the test set waveforms") + parser.add_argument("--logs", + type=Path, + default=Path("logs"), + help="Folder where to store logs") + parser.add_argument("--models", + type=Path, + default=Path("models"), + help="Folder where to store trained models") + parser.add_argument("-R", + "--restart", + action='store_true', + help='Restart training, ignoring previous run') + + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("-e", "--epochs", type=int, default=180, help="Number of epochs") + parser.add_argument("-r", + "--repeat", + type=int, + default=2, + help="Repeat the train set, longer epochs") + parser.add_argument("-b", "--batch_size", type=int, default=64) + parser.add_argument("--lr", type=float, default=3e-4) + parser.add_argument("--mse", action="store_true", help="Use MSE instead of L1") + parser.add_argument("--init", help="Initialize from a pre-trained model.") + + # Augmentation options + parser.add_argument("--no_augment", + action="store_false", + dest="augment", + default=True, + help="No basic data augmentation.") + parser.add_argument("--repitch", type=float, default=0.2, + help="Probability to do tempo/pitch change") + parser.add_argument("--max_tempo", type=float, default=12, + help="Maximum relative tempo change in %% when using repitch.") + + parser.add_argument("--remix_group_size", + type=int, + default=4, + help="Shuffle sources using group of this size. Useful to somewhat " + "replicate multi-gpu training " + "on less GPUs.") + parser.add_argument("--shifts", + type=int, + default=10, + help="Number of random shifts used for the shift trick.") + parser.add_argument("--overlap", + type=float, + default=0.25, + help="Overlap when --split_valid is passed.") + + # See model.py for doc + parser.add_argument("--growth", + type=float, + default=2., + help="Number of channels between two layers will increase by this factor") + parser.add_argument("--depth", + type=int, + default=6, + help="Number of layers for the encoder and decoder") + parser.add_argument("--lstm_layers", type=int, default=2, help="Number of layers for the LSTM") + parser.add_argument("--channels", + type=int, + default=64, + help="Number of channels for the first encoder layer") + parser.add_argument("--kernel_size", + type=int, + default=8, + help="Kernel size for the (transposed) convolutions") + parser.add_argument("--conv_stride", + type=int, + default=4, + help="Stride for the (transposed) convolutions") + parser.add_argument("--context", + type=int, + default=3, + help="Context size for the decoder convolutions " + "before the transposed convolutions") + parser.add_argument("--rescale", + type=float, + default=0.1, + help="Initial weight rescale reference") + parser.add_argument("--no_resample", action="store_false", + default=True, dest="resample", + help="No Resampling of the input/output x2") + parser.add_argument("--no_glu", + action="store_false", + default=True, + dest="glu", + help="Replace all GLUs by ReLUs") + parser.add_argument("--no_rewrite", + action="store_false", + default=True, + dest="rewrite", + help="No 1x1 rewrite convolutions") + parser.add_argument("--normalize", action="store_true") + parser.add_argument("--no_norm_wav", action="store_false", dest='norm_wav', default=True) + + # Tasnet options + parser.add_argument("--tasnet", action="store_true") + parser.add_argument("--split_valid", + action="store_true", + help="Predict chunks by chunks for valid and test. Required for tasnet") + parser.add_argument("--X", type=int, default=8) + + # Other options + parser.add_argument("--show", + action="store_true", + help="Show model architecture, size and exit") + parser.add_argument("--save_model", action="store_true", + help="Skip traning, just save final model " + "for the current checkpoint value.") + parser.add_argument("--save_state", + help="Skip training, just save state " + "for the current checkpoint value. You should " + "provide a model name as argument.") + + # Quantization options + parser.add_argument("--q-min-size", type=float, default=1, + help="Only quantize layers over this size (in MB)") + parser.add_argument( + "--qat", type=int, help="If provided, use QAT training with that many bits.") + + parser.add_argument("--diffq", type=float, default=0) + parser.add_argument( + "--ms-target", type=float, default=162, + help="Model size target in MB, when using DiffQ. Best model will be kept " + "only if it is smaller than this target.") + + return parser + + +def get_name(parser, args): + """ + Return the name of an experiment given the args. Some parameters are ignored, + for instance --workers, as they do not impact the final result. + """ + ignore_args = set([ + "checkpoints", + "deterministic", + "eval", + "evals", + "eval_cpu", + "eval_workers", + "logs", + "master", + "rank", + "restart", + "save", + "save_model", + "save_state", + "show", + "workers", + "world_size", + ]) + parts = [] + name_args = dict(args.__dict__) + for name, value in name_args.items(): + if name in ignore_args: + continue + if value != parser.get_default(name): + if isinstance(value, Path): + parts.append(f"{name}={value.name}") + else: + parts.append(f"{name}={value}") + if parts: + name = " ".join(parts) + else: + name = "default" + return name diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/pretrained.py b/lib/infer/infer_libs/uvr5_pack/demucs/pretrained.py new file mode 100644 index 000000000..6aac5db10 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/pretrained.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# author: adefossez + +import logging + +from diffq import DiffQuantizer +import torch.hub + +from .model import Demucs +from .tasnet import ConvTasNet +from .utils import set_state + +logger = logging.getLogger(__name__) +ROOT = "https://dl.fbaipublicfiles.com/demucs/v3.0/" + +PRETRAINED_MODELS = { + 'demucs': 'e07c671f', + 'demucs48_hq': '28a1282c', + 'demucs_extra': '3646af93', + 'demucs_quantized': '07afea75', + 'tasnet': 'beb46fac', + 'tasnet_extra': 'df3777b2', + 'demucs_unittest': '09ebc15f', +} + +SOURCES = ["drums", "bass", "other", "vocals"] + + +def get_url(name): + sig = PRETRAINED_MODELS[name] + return ROOT + name + "-" + sig[:8] + ".th" + + +def is_pretrained(name): + return name in PRETRAINED_MODELS + + +def load_pretrained(name): + if name == "demucs": + return demucs(pretrained=True) + elif name == "demucs48_hq": + return demucs(pretrained=True, hq=True, channels=48) + elif name == "demucs_extra": + return demucs(pretrained=True, extra=True) + elif name == "demucs_quantized": + return demucs(pretrained=True, quantized=True) + elif name == "demucs_unittest": + return demucs_unittest(pretrained=True) + elif name == "tasnet": + return tasnet(pretrained=True) + elif name == "tasnet_extra": + return tasnet(pretrained=True, extra=True) + else: + raise ValueError(f"Invalid pretrained name {name}") + + +def _load_state(name, model, quantizer=None): + url = get_url(name) + state = torch.hub.load_state_dict_from_url(url, map_location='cpu', check_hash=True) + set_state(model, quantizer, state) + if quantizer: + quantizer.detach() + + +def demucs_unittest(pretrained=True): + model = Demucs(channels=4, sources=SOURCES) + if pretrained: + _load_state('demucs_unittest', model) + return model + + +def demucs(pretrained=True, extra=False, quantized=False, hq=False, channels=64): + if not pretrained and (extra or quantized or hq): + raise ValueError("if extra or quantized is True, pretrained must be True.") + model = Demucs(sources=SOURCES, channels=channels) + if pretrained: + name = 'demucs' + if channels != 64: + name += str(channels) + quantizer = None + if sum([extra, quantized, hq]) > 1: + raise ValueError("Only one of extra, quantized, hq, can be True.") + if quantized: + quantizer = DiffQuantizer(model, group_size=8, min_size=1) + name += '_quantized' + if extra: + name += '_extra' + if hq: + name += '_hq' + _load_state(name, model, quantizer) + return model + + +def tasnet(pretrained=True, extra=False): + if not pretrained and extra: + raise ValueError("if extra is True, pretrained must be True.") + model = ConvTasNet(X=10, sources=SOURCES) + if pretrained: + name = 'tasnet' + if extra: + name = 'tasnet_extra' + _load_state(name, model) + return model diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/raw.py b/lib/infer/infer_libs/uvr5_pack/demucs/raw.py new file mode 100644 index 000000000..d4941ad2d --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/raw.py @@ -0,0 +1,173 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +from collections import defaultdict, namedtuple +from pathlib import Path + +import musdb +import numpy as np +import torch as th +import tqdm +from torch.utils.data import DataLoader + +from .audio import AudioFile + +ChunkInfo = namedtuple("ChunkInfo", ["file_index", "offset", "local_index"]) + + +class Rawset: + """ + Dataset of raw, normalized, float32 audio files + """ + def __init__(self, path, samples=None, stride=None, channels=2, streams=None): + self.path = Path(path) + self.channels = channels + self.samples = samples + if stride is None: + stride = samples if samples is not None else 0 + self.stride = stride + entries = defaultdict(list) + for root, folders, files in os.walk(self.path, followlinks=True): + folders.sort() + files.sort() + for file in files: + if file.endswith(".raw"): + path = Path(root) / file + name, stream = path.stem.rsplit('.', 1) + entries[(path.parent.relative_to(self.path), name)].append(int(stream)) + + self._entries = list(entries.keys()) + + sizes = [] + self._lengths = [] + ref_streams = sorted(entries[self._entries[0]]) + assert ref_streams == list(range(len(ref_streams))) + if streams is None: + self.streams = ref_streams + else: + self.streams = streams + for entry in sorted(entries.keys()): + streams = entries[entry] + assert sorted(streams) == ref_streams + file = self._path(*entry) + length = file.stat().st_size // (4 * channels) + if samples is None: + sizes.append(1) + else: + if length < samples: + self._entries.remove(entry) + continue + sizes.append((length - samples) // stride + 1) + self._lengths.append(length) + if not sizes: + raise ValueError(f"Empty dataset {self.path}") + self._cumulative_sizes = np.cumsum(sizes) + self._sizes = sizes + + def __len__(self): + return self._cumulative_sizes[-1] + + @property + def total_length(self): + return sum(self._lengths) + + def chunk_info(self, index): + file_index = np.searchsorted(self._cumulative_sizes, index, side='right') + if file_index == 0: + local_index = index + else: + local_index = index - self._cumulative_sizes[file_index - 1] + return ChunkInfo(offset=local_index * self.stride, + file_index=file_index, + local_index=local_index) + + def _path(self, folder, name, stream=0): + return self.path / folder / (name + f'.{stream}.raw') + + def __getitem__(self, index): + chunk = self.chunk_info(index) + entry = self._entries[chunk.file_index] + + length = self.samples or self._lengths[chunk.file_index] + streams = [] + to_read = length * self.channels * 4 + for stream_index, stream in enumerate(self.streams): + offset = chunk.offset * 4 * self.channels + file = open(self._path(*entry, stream=stream), 'rb') + file.seek(offset) + content = file.read(to_read) + assert len(content) == to_read + content = np.frombuffer(content, dtype=np.float32) + content = content.copy() # make writable + streams.append(th.from_numpy(content).view(length, self.channels).t()) + return th.stack(streams, dim=0) + + def name(self, index): + chunk = self.chunk_info(index) + folder, name = self._entries[chunk.file_index] + return folder / name + + +class MusDBSet: + def __init__(self, mus, streams=slice(None), samplerate=44100, channels=2): + self.mus = mus + self.streams = streams + self.samplerate = samplerate + self.channels = channels + + def __len__(self): + return len(self.mus.tracks) + + def __getitem__(self, index): + track = self.mus.tracks[index] + return (track.name, AudioFile(track.path).read(channels=self.channels, + seek_time=0, + streams=self.streams, + samplerate=self.samplerate)) + + +def build_raw(mus, destination, normalize, workers, samplerate, channels): + destination.mkdir(parents=True, exist_ok=True) + loader = DataLoader(MusDBSet(mus, channels=channels, samplerate=samplerate), + batch_size=1, + num_workers=workers, + collate_fn=lambda x: x[0]) + for name, streams in tqdm.tqdm(loader): + if normalize: + ref = streams[0].mean(dim=0) # use mono mixture as reference + streams = (streams - ref.mean()) / ref.std() + for index, stream in enumerate(streams): + open(destination / (name + f'.{index}.raw'), "wb").write(stream.t().numpy().tobytes()) + + +def main(): + parser = argparse.ArgumentParser('rawset') + parser.add_argument('--workers', type=int, default=10) + parser.add_argument('--samplerate', type=int, default=44100) + parser.add_argument('--channels', type=int, default=2) + parser.add_argument('musdb', type=Path) + parser.add_argument('destination', type=Path) + + args = parser.parse_args() + + build_raw(musdb.DB(root=args.musdb, subsets=["train"], split="train"), + args.destination / "train", + normalize=True, + channels=args.channels, + samplerate=args.samplerate, + workers=args.workers) + build_raw(musdb.DB(root=args.musdb, subsets=["train"], split="valid"), + args.destination / "valid", + normalize=True, + samplerate=args.samplerate, + channels=args.channels, + workers=args.workers) + + +if __name__ == "__main__": + main() diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/repitch.py b/lib/infer/infer_libs/uvr5_pack/demucs/repitch.py new file mode 100644 index 000000000..8846ab2d9 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/repitch.py @@ -0,0 +1,96 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import io +import random +import subprocess as sp +import tempfile + +import numpy as np +import torch +from scipy.io import wavfile + + +def i16_pcm(wav): + if wav.dtype == np.int16: + return wav + return (wav * 2**15).clamp_(-2**15, 2**15 - 1).short() + + +def f32_pcm(wav): + if wav.dtype == np.float: + return wav + return wav.float() / 2**15 + + +class RepitchedWrapper: + """ + Wrap a dataset to apply online change of pitch / tempo. + """ + def __init__(self, dataset, proba=0.2, max_pitch=2, max_tempo=12, tempo_std=5, vocals=[3]): + self.dataset = dataset + self.proba = proba + self.max_pitch = max_pitch + self.max_tempo = max_tempo + self.tempo_std = tempo_std + self.vocals = vocals + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, index): + streams = self.dataset[index] + in_length = streams.shape[-1] + out_length = int((1 - 0.01 * self.max_tempo) * in_length) + + if random.random() < self.proba: + delta_pitch = random.randint(-self.max_pitch, self.max_pitch) + delta_tempo = random.gauss(0, self.tempo_std) + delta_tempo = min(max(-self.max_tempo, delta_tempo), self.max_tempo) + outs = [] + for idx, stream in enumerate(streams): + stream = repitch( + stream, + delta_pitch, + delta_tempo, + voice=idx in self.vocals) + outs.append(stream[:, :out_length]) + streams = torch.stack(outs) + else: + streams = streams[..., :out_length] + return streams + + +def repitch(wav, pitch, tempo, voice=False, quick=False, samplerate=44100): + """ + tempo is a relative delta in percentage, so tempo=10 means tempo at 110%! + pitch is in semi tones. + Requires `soundstretch` to be installed, see + https://www.surina.net/soundtouch/soundstretch.html + """ + outfile = tempfile.NamedTemporaryFile(suffix=".wav") + in_ = io.BytesIO() + wavfile.write(in_, samplerate, i16_pcm(wav).t().numpy()) + command = [ + "soundstretch", + "stdin", + outfile.name, + f"-pitch={pitch}", + f"-tempo={tempo:.6f}", + ] + if quick: + command += ["-quick"] + if voice: + command += ["-speech"] + try: + sp.run(command, capture_output=True, input=in_.getvalue(), check=True) + except sp.CalledProcessError as error: + raise RuntimeError(f"Could not change bpm because {error.stderr.decode('utf-8')}") + sr, wav = wavfile.read(outfile.name) + wav = wav.copy() + wav = f32_pcm(torch.from_numpy(wav).t()) + assert sr == samplerate + return wav diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/separate.py b/lib/infer/infer_libs/uvr5_pack/demucs/separate.py new file mode 100644 index 000000000..890ef271f --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/separate.py @@ -0,0 +1,185 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys +from pathlib import Path +import subprocess + +import julius +import torch as th +import torchaudio as ta + +from .audio import AudioFile, convert_audio_channels +from .pretrained import is_pretrained, load_pretrained +from .utils import apply_model, load_model + + +def load_track(track, device, audio_channels, samplerate): + errors = {} + wav = None + + try: + wav = AudioFile(track).read( + streams=0, + samplerate=samplerate, + channels=audio_channels).to(device) + except FileNotFoundError: + errors['ffmpeg'] = 'Ffmpeg is not installed.' + except subprocess.CalledProcessError: + errors['ffmpeg'] = 'FFmpeg could not read the file.' + + if wav is None: + try: + wav, sr = ta.load(str(track)) + except RuntimeError as err: + errors['torchaudio'] = err.args[0] + else: + wav = convert_audio_channels(wav, audio_channels) + wav = wav.to(device) + wav = julius.resample_frac(wav, sr, samplerate) + + if wav is None: + print(f"Could not load file {track}. " + "Maybe it is not a supported file format? ") + for backend, error in errors.items(): + print(f"When trying to load using {backend}, got the following error: {error}") + sys.exit(1) + return wav + + +def encode_mp3(wav, path, bitrate=320, samplerate=44100, channels=2, verbose=False): + try: + import lameenc + except ImportError: + print("Failed to call lame encoder. Maybe it is not installed? " + "On windows, run `python.exe -m pip install -U lameenc`, " + "on OSX/Linux, run `python3 -m pip install -U lameenc`, " + "then try again.", file=sys.stderr) + sys.exit(1) + encoder = lameenc.Encoder() + encoder.set_bit_rate(bitrate) + encoder.set_in_sample_rate(samplerate) + encoder.set_channels(channels) + encoder.set_quality(2) # 2-highest, 7-fastest + if not verbose: + encoder.silence() + wav = wav.transpose(0, 1).numpy() + mp3_data = encoder.encode(wav.tobytes()) + mp3_data += encoder.flush() + with open(path, "wb") as f: + f.write(mp3_data) + + +def main(): + parser = argparse.ArgumentParser("demucs.separate", + description="Separate the sources for the given tracks") + parser.add_argument("audios/tracks", nargs='+', type=Path, default=[], help='Path to tracks') + parser.add_argument("-n", + "--name", + default="demucs_quantized", + help="Model name. See README.md for the list of pretrained models. " + "Default is demucs_quantized.") + parser.add_argument("-v", "--verbose", action="store_true") + parser.add_argument("-o", + "--out", + type=Path, + default=Path("audios/separated"), + help="Folder where to put extracted tracks. A subfolder " + "with the model name will be created.") + parser.add_argument("--models", + type=Path, + default=Path("models"), + help="Path to trained models. " + "Also used to store downloaded pretrained models") + parser.add_argument("-d", + "--device", + default="cuda" if th.cuda.is_available() else "cpu", + help="Device to use, default is cuda if available else cpu") + parser.add_argument("--shifts", + default=0, + type=int, + help="Number of random shifts for equivariant stabilization." + "Increase separation time but improves quality for Demucs. 10 was used " + "in the original paper.") + parser.add_argument("--overlap", + default=0.25, + type=float, + help="Overlap between the splits.") + parser.add_argument("--no-split", + action="store_false", + dest="split", + default=True, + help="Doesn't split audio in chunks. This can use large amounts of memory.") + parser.add_argument("--float32", + action="store_true", + help="Convert the output wavefile to use pcm f32 format instead of s16. " + "This should not make a difference if you just plan on listening to the " + "audio but might be needed to compute exactly metrics like SDR etc.") + parser.add_argument("--int16", + action="store_false", + dest="float32", + help="Opposite of --float32, here for compatibility.") + parser.add_argument("--mp3", action="store_true", + help="Convert the output wavs to mp3.") + parser.add_argument("--mp3-bitrate", + default=320, + type=int, + help="Bitrate of converted mp3.") + + args = parser.parse_args() + name = args.name + ".th" + model_path = args.models / name + if model_path.is_file(): + model = load_model(model_path) + else: + if is_pretrained(args.name): + model = load_pretrained(args.name) + else: + print(f"No pre-trained model {args.name}", file=sys.stderr) + sys.exit(1) + model.to(args.device) + + out = args.out / args.name + out.mkdir(parents=True, exist_ok=True) + print(f"Separated tracks will be stored in {out.resolve()}") + for track in args.tracks: + if not track.exists(): + print( + f"File {track} does not exist. If the path contains spaces, " + "please try again after surrounding the entire path with quotes \"\".", + file=sys.stderr) + continue + print(f"Separating track {track}") + wav = load_track(track, args.device, model.audio_channels, model.samplerate) + + ref = wav.mean(0) + wav = (wav - ref.mean()) / ref.std() + sources = apply_model(model, wav, shifts=args.shifts, split=args.split, + overlap=args.overlap, progress=True) + sources = sources * ref.std() + ref.mean() + + track_folder = out / track.name.rsplit(".", 1)[0] + track_folder.mkdir(exist_ok=True) + for source, name in zip(sources, model.sources): + source = source / max(1.01 * source.abs().max(), 1) + if args.mp3 or not args.float32: + source = (source * 2**15).clamp_(-2**15, 2**15 - 1).short() + source = source.cpu() + stem = str(track_folder / name) + if args.mp3: + encode_mp3(source, stem + ".mp3", + bitrate=args.mp3_bitrate, + samplerate=model.samplerate, + channels=model.audio_channels, + verbose=args.verbose) + else: + wavname = str(track_folder / f"{name}.wav") + ta.save(wavname, source, sample_rate=model.samplerate) + + +if __name__ == "__main__": + main() diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/tasnet.py b/lib/infer/infer_libs/uvr5_pack/demucs/tasnet.py new file mode 100644 index 000000000..ecc125792 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/tasnet.py @@ -0,0 +1,452 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +# Created on 2018/12 +# Author: Kaituo XU +# Modified on 2019/11 by Alexandre Defossez, added support for multiple output channels +# Here is the original license: +# The MIT License (MIT) +# +# Copyright (c) 2018 Kaituo XU +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .utils import capture_init + +EPS = 1e-8 + + +def overlap_and_add(signal, frame_step): + outer_dimensions = signal.size()[:-2] + frames, frame_length = signal.size()[-2:] + + subframe_length = math.gcd(frame_length, frame_step) # gcd=Greatest Common Divisor + subframe_step = frame_step // subframe_length + subframes_per_frame = frame_length // subframe_length + output_size = frame_step * (frames - 1) + frame_length + output_subframes = output_size // subframe_length + + subframe_signal = signal.view(*outer_dimensions, -1, subframe_length) + + frame = torch.arange(0, output_subframes, + device=signal.device).unfold(0, subframes_per_frame, subframe_step) + frame = frame.long() # signal may in GPU or CPU + frame = frame.contiguous().view(-1) + + result = signal.new_zeros(*outer_dimensions, output_subframes, subframe_length) + result.index_add_(-2, frame, subframe_signal) + result = result.view(*outer_dimensions, -1) + return result + + +class ConvTasNet(nn.Module): + @capture_init + def __init__(self, + sources, + N=256, + L=20, + B=256, + H=512, + P=3, + X=8, + R=4, + audio_channels=2, + norm_type="gLN", + causal=False, + mask_nonlinear='relu', + samplerate=44100, + segment_length=44100 * 2 * 4): + """ + Args: + sources: list of sources + N: Number of filters in autoencoder + L: Length of the filters (in samples) + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(ConvTasNet, self).__init__() + # Hyper-parameter + self.sources = sources + self.C = len(sources) + self.N, self.L, self.B, self.H, self.P, self.X, self.R = N, L, B, H, P, X, R + self.norm_type = norm_type + self.causal = causal + self.mask_nonlinear = mask_nonlinear + self.audio_channels = audio_channels + self.samplerate = samplerate + self.segment_length = segment_length + # Components + self.encoder = Encoder(L, N, audio_channels) + self.separator = TemporalConvNet( + N, B, H, P, X, R, self.C, norm_type, causal, mask_nonlinear) + self.decoder = Decoder(N, L, audio_channels) + # init + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_normal_(p) + + def valid_length(self, length): + return length + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + est_source: [M, C, T] + """ + mixture_w = self.encoder(mixture) + est_mask = self.separator(mixture_w) + est_source = self.decoder(mixture_w, est_mask) + + # T changed after conv1d in encoder, fix it here + T_origin = mixture.size(-1) + T_conv = est_source.size(-1) + est_source = F.pad(est_source, (0, T_origin - T_conv)) + return est_source + + +class Encoder(nn.Module): + """Estimation of the nonnegative mixture weight by a 1-D conv layer. + """ + def __init__(self, L, N, audio_channels): + super(Encoder, self).__init__() + # Hyper-parameter + self.L, self.N = L, N + # Components + # 50% overlap + self.conv1d_U = nn.Conv1d(audio_channels, N, kernel_size=L, stride=L // 2, bias=False) + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + mixture_w: [M, N, K], where K = (T-L)/(L/2)+1 = 2T/L-1 + """ + mixture_w = F.relu(self.conv1d_U(mixture)) # [M, N, K] + return mixture_w + + +class Decoder(nn.Module): + def __init__(self, N, L, audio_channels): + super(Decoder, self).__init__() + # Hyper-parameter + self.N, self.L = N, L + self.audio_channels = audio_channels + # Components + self.basis_signals = nn.Linear(N, audio_channels * L, bias=False) + + def forward(self, mixture_w, est_mask): + """ + Args: + mixture_w: [M, N, K] + est_mask: [M, C, N, K] + Returns: + est_source: [M, C, T] + """ + # D = W * M + source_w = torch.unsqueeze(mixture_w, 1) * est_mask # [M, C, N, K] + source_w = torch.transpose(source_w, 2, 3) # [M, C, K, N] + # S = DV + est_source = self.basis_signals(source_w) # [M, C, K, ac * L] + m, c, k, _ = est_source.size() + est_source = est_source.view(m, c, k, self.audio_channels, -1).transpose(2, 3).contiguous() + est_source = overlap_and_add(est_source, self.L // 2) # M x C x ac x T + return est_source + + +class TemporalConvNet(nn.Module): + def __init__(self, N, B, H, P, X, R, C, norm_type="gLN", causal=False, mask_nonlinear='relu'): + """ + Args: + N: Number of filters in autoencoder + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + C: Number of speakers + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(TemporalConvNet, self).__init__() + # Hyper-parameter + self.C = C + self.mask_nonlinear = mask_nonlinear + # Components + # [M, N, K] -> [M, N, K] + layer_norm = ChannelwiseLayerNorm(N) + # [M, N, K] -> [M, B, K] + bottleneck_conv1x1 = nn.Conv1d(N, B, 1, bias=False) + # [M, B, K] -> [M, B, K] + repeats = [] + for r in range(R): + blocks = [] + for x in range(X): + dilation = 2**x + padding = (P - 1) * dilation if causal else (P - 1) * dilation // 2 + blocks += [ + TemporalBlock(B, + H, + P, + stride=1, + padding=padding, + dilation=dilation, + norm_type=norm_type, + causal=causal) + ] + repeats += [nn.Sequential(*blocks)] + temporal_conv_net = nn.Sequential(*repeats) + # [M, B, K] -> [M, C*N, K] + mask_conv1x1 = nn.Conv1d(B, C * N, 1, bias=False) + # Put together + self.network = nn.Sequential(layer_norm, bottleneck_conv1x1, temporal_conv_net, + mask_conv1x1) + + def forward(self, mixture_w): + """ + Keep this API same with TasNet + Args: + mixture_w: [M, N, K], M is batch size + returns: + est_mask: [M, C, N, K] + """ + M, N, K = mixture_w.size() + score = self.network(mixture_w) # [M, N, K] -> [M, C*N, K] + score = score.view(M, self.C, N, K) # [M, C*N, K] -> [M, C, N, K] + if self.mask_nonlinear == 'softmax': + est_mask = F.softmax(score, dim=1) + elif self.mask_nonlinear == 'relu': + est_mask = F.relu(score) + else: + raise ValueError("Unsupported mask non-linear function") + return est_mask + + +class TemporalBlock(nn.Module): + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride, + padding, + dilation, + norm_type="gLN", + causal=False): + super(TemporalBlock, self).__init__() + # [M, B, K] -> [M, H, K] + conv1x1 = nn.Conv1d(in_channels, out_channels, 1, bias=False) + prelu = nn.PReLU() + norm = chose_norm(norm_type, out_channels) + # [M, H, K] -> [M, B, K] + dsconv = DepthwiseSeparableConv(out_channels, in_channels, kernel_size, stride, padding, + dilation, norm_type, causal) + # Put together + self.net = nn.Sequential(conv1x1, prelu, norm, dsconv) + + def forward(self, x): + """ + Args: + x: [M, B, K] + Returns: + [M, B, K] + """ + residual = x + out = self.net(x) + # TODO: when P = 3 here works fine, but when P = 2 maybe need to pad? + return out + residual # look like w/o F.relu is better than w/ F.relu + # return F.relu(out + residual) + + +class DepthwiseSeparableConv(nn.Module): + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride, + padding, + dilation, + norm_type="gLN", + causal=False): + super(DepthwiseSeparableConv, self).__init__() + # Use `groups` option to implement depthwise convolution + # [M, H, K] -> [M, H, K] + depthwise_conv = nn.Conv1d(in_channels, + in_channels, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=in_channels, + bias=False) + if causal: + chomp = Chomp1d(padding) + prelu = nn.PReLU() + norm = chose_norm(norm_type, in_channels) + # [M, H, K] -> [M, B, K] + pointwise_conv = nn.Conv1d(in_channels, out_channels, 1, bias=False) + # Put together + if causal: + self.net = nn.Sequential(depthwise_conv, chomp, prelu, norm, pointwise_conv) + else: + self.net = nn.Sequential(depthwise_conv, prelu, norm, pointwise_conv) + + def forward(self, x): + """ + Args: + x: [M, H, K] + Returns: + result: [M, B, K] + """ + return self.net(x) + + +class Chomp1d(nn.Module): + """To ensure the output length is the same as the input. + """ + def __init__(self, chomp_size): + super(Chomp1d, self).__init__() + self.chomp_size = chomp_size + + def forward(self, x): + """ + Args: + x: [M, H, Kpad] + Returns: + [M, H, K] + """ + return x[:, :, :-self.chomp_size].contiguous() + + +def chose_norm(norm_type, channel_size): + """The input of normlization will be (M, C, K), where M is batch size, + C is channel size and K is sequence length. + """ + if norm_type == "gLN": + return GlobalLayerNorm(channel_size) + elif norm_type == "cLN": + return ChannelwiseLayerNorm(channel_size) + elif norm_type == "id": + return nn.Identity() + else: # norm_type == "BN": + # Given input (M, C, K), nn.BatchNorm1d(C) will accumulate statics + # along M and K, so this BN usage is right. + return nn.BatchNorm1d(channel_size) + + +# TODO: Use nn.LayerNorm to impl cLN to speed up +class ChannelwiseLayerNorm(nn.Module): + """Channel-wise Layer Normalization (cLN)""" + def __init__(self, channel_size): + super(ChannelwiseLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + cLN_y: [M, N, K] + """ + mean = torch.mean(y, dim=1, keepdim=True) # [M, 1, K] + var = torch.var(y, dim=1, keepdim=True, unbiased=False) # [M, 1, K] + cLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return cLN_y + + +class GlobalLayerNorm(nn.Module): + """Global Layer Normalization (gLN)""" + def __init__(self, channel_size): + super(GlobalLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + gLN_y: [M, N, K] + """ + # TODO: in torch 1.0, torch.mean() support dim list + mean = y.mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) # [M, 1, 1] + var = (torch.pow(y - mean, 2)).mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) + gLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return gLN_y + + +if __name__ == "__main__": + torch.manual_seed(123) + M, N, L, T = 2, 3, 4, 12 + K = 2 * T // L - 1 + B, H, P, X, R, C, norm_type, causal = 2, 3, 3, 3, 2, 2, "gLN", False + mixture = torch.randint(3, (M, T)) + # test Encoder + encoder = Encoder(L, N) + encoder.conv1d_U.weight.data = torch.randint(2, encoder.conv1d_U.weight.size()) + mixture_w = encoder(mixture) + print('mixture', mixture) + print('U', encoder.conv1d_U.weight) + print('mixture_w', mixture_w) + print('mixture_w size', mixture_w.size()) + + # test TemporalConvNet + separator = TemporalConvNet(N, B, H, P, X, R, C, norm_type=norm_type, causal=causal) + est_mask = separator(mixture_w) + print('est_mask', est_mask) + + # test Decoder + decoder = Decoder(N, L) + est_mask = torch.randint(2, (B, K, C, N)) + est_source = decoder(mixture_w, est_mask) + print('est_source', est_source) + + # test Conv-TasNet + conv_tasnet = ConvTasNet(N, L, B, H, P, X, R, C, norm_type=norm_type) + est_source = conv_tasnet(mixture) + print('est_source', est_source) + print('est_source size', est_source.size()) diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/test.py b/lib/infer/infer_libs/uvr5_pack/demucs/test.py new file mode 100644 index 000000000..4140914dd --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/test.py @@ -0,0 +1,109 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import gzip +import sys +from concurrent import futures + +import musdb +import museval +import torch as th +import tqdm +from scipy.io import wavfile +from torch import distributed + +from .audio import convert_audio +from .utils import apply_model + + +def evaluate(model, + musdb_path, + eval_folder, + workers=2, + device="cpu", + rank=0, + save=False, + shifts=0, + split=False, + overlap=0.25, + is_wav=False, + world_size=1): + """ + Evaluate model using museval. Run the model + on a single GPU, the bottleneck being the call to museval. + """ + + output_dir = eval_folder / "results" + output_dir.mkdir(exist_ok=True, parents=True) + json_folder = eval_folder / "results/test" + json_folder.mkdir(exist_ok=True, parents=True) + + # we load tracks from the original musdb set + test_set = musdb.DB(musdb_path, subsets=["test"], is_wav=is_wav) + src_rate = 44100 # hardcoded for now... + + for p in model.parameters(): + p.requires_grad = False + p.grad = None + + pendings = [] + with futures.ProcessPoolExecutor(workers or 1) as pool: + for index in tqdm.tqdm(range(rank, len(test_set), world_size), file=sys.stdout): + track = test_set.tracks[index] + + out = json_folder / f"{track.name}.json.gz" + if out.exists(): + continue + + mix = th.from_numpy(track.audio).t().float() + ref = mix.mean(dim=0) # mono mixture + mix = (mix - ref.mean()) / ref.std() + mix = convert_audio(mix, src_rate, model.samplerate, model.audio_channels) + estimates = apply_model(model, mix.to(device), + shifts=shifts, split=split, overlap=overlap) + estimates = estimates * ref.std() + ref.mean() + + estimates = estimates.transpose(1, 2) + references = th.stack( + [th.from_numpy(track.targets[name].audio).t() for name in model.sources]) + references = convert_audio(references, src_rate, + model.samplerate, model.audio_channels) + references = references.transpose(1, 2).numpy() + estimates = estimates.cpu().numpy() + win = int(1. * model.samplerate) + hop = int(1. * model.samplerate) + if save: + folder = eval_folder / "wav/test" / track.name + folder.mkdir(exist_ok=True, parents=True) + for name, estimate in zip(model.sources, estimates): + wavfile.write(str(folder / (name + ".wav")), 44100, estimate) + + if workers: + pendings.append((track.name, pool.submit( + museval.evaluate, references, estimates, win=win, hop=hop))) + else: + pendings.append((track.name, museval.evaluate( + references, estimates, win=win, hop=hop))) + del references, mix, estimates, track + + for track_name, pending in tqdm.tqdm(pendings, file=sys.stdout): + if workers: + pending = pending.result() + sdr, isr, sir, sar = pending + track_store = museval.TrackStore(win=44100, hop=44100, track_name=track_name) + for idx, target in enumerate(model.sources): + values = { + "SDR": sdr[idx].tolist(), + "SIR": sir[idx].tolist(), + "ISR": isr[idx].tolist(), + "SAR": sar[idx].tolist() + } + + track_store.add_target(target_name=target, values=values) + json_path = json_folder / f"{track_name}.json.gz" + gzip.open(json_path, "w").write(track_store.json.encode('utf-8')) + if world_size > 1: + distributed.barrier() diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/train.py b/lib/infer/infer_libs/uvr5_pack/demucs/train.py new file mode 100644 index 000000000..6bd221279 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/train.py @@ -0,0 +1,127 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +import tqdm +from torch.utils.data import DataLoader +from torch.utils.data.distributed import DistributedSampler + +from .utils import apply_model, average_metric, center_trim + + +def train_model(epoch, + dataset, + model, + criterion, + optimizer, + augment, + quantizer=None, + diffq=0, + repeat=1, + device="cpu", + seed=None, + workers=4, + world_size=1, + batch_size=16): + + if world_size > 1: + sampler = DistributedSampler(dataset) + sampler_epoch = epoch * repeat + if seed is not None: + sampler_epoch += seed * 1000 + sampler.set_epoch(sampler_epoch) + batch_size //= world_size + loader = DataLoader(dataset, batch_size=batch_size, sampler=sampler, num_workers=workers) + else: + loader = DataLoader(dataset, batch_size=batch_size, num_workers=workers, shuffle=True) + current_loss = 0 + model_size = 0 + for repetition in range(repeat): + tq = tqdm.tqdm(loader, + ncols=120, + desc=f"[{epoch:03d}] train ({repetition + 1}/{repeat})", + leave=False, + file=sys.stdout, + unit=" batch") + total_loss = 0 + for idx, sources in enumerate(tq): + if len(sources) < batch_size: + # skip uncomplete batch for augment.Remix to work properly + continue + sources = sources.to(device) + sources = augment(sources) + mix = sources.sum(dim=1) + + estimates = model(mix) + sources = center_trim(sources, estimates) + loss = criterion(estimates, sources) + model_size = 0 + if quantizer is not None: + model_size = quantizer.model_size() + + train_loss = loss + diffq * model_size + train_loss.backward() + grad_norm = 0 + for p in model.parameters(): + if p.grad is not None: + grad_norm += p.grad.data.norm()**2 + grad_norm = grad_norm**0.5 + optimizer.step() + optimizer.zero_grad() + + if quantizer is not None: + model_size = model_size.item() + + total_loss += loss.item() + current_loss = total_loss / (1 + idx) + tq.set_postfix(loss=f"{current_loss:.4f}", ms=f"{model_size:.2f}", + grad=f"{grad_norm:.5f}") + + # free some space before next round + del sources, mix, estimates, loss, train_loss + + if world_size > 1: + sampler.epoch += 1 + + if world_size > 1: + current_loss = average_metric(current_loss) + return current_loss, model_size + + +def validate_model(epoch, + dataset, + model, + criterion, + device="cpu", + rank=0, + world_size=1, + shifts=0, + overlap=0.25, + split=False): + indexes = range(rank, len(dataset), world_size) + tq = tqdm.tqdm(indexes, + ncols=120, + desc=f"[{epoch:03d}] valid", + leave=False, + file=sys.stdout, + unit=" track") + current_loss = 0 + for index in tq: + streams = dataset[index] + # first five minutes to avoid OOM on --upsample models + streams = streams[..., :15_000_000] + streams = streams.to(device) + sources = streams[1:] + mix = streams[0] + estimates = apply_model(model, mix, shifts=shifts, split=split, overlap=overlap) + loss = criterion(estimates, sources) + current_loss += loss.item() / len(indexes) + del estimates, streams, sources + + if world_size > 1: + current_loss = average_metric(current_loss, len(indexes)) + return current_loss diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/utils.py b/lib/infer/infer_libs/uvr5_pack/demucs/utils.py new file mode 100644 index 000000000..436418405 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/utils.py @@ -0,0 +1,323 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import errno +import functools +import hashlib +import inspect +import io +import os +import random +import socket +import tempfile +import warnings +import zlib +from contextlib import contextmanager + +from diffq import UniformQuantizer, DiffQuantizer +import torch as th +import tqdm +from torch import distributed +from torch.nn import functional as F + + +def center_trim(tensor, reference): + """ + Center trim `tensor` with respect to `reference`, along the last dimension. + `reference` can also be a number, representing the length to trim to. + If the size difference != 0 mod 2, the extra sample is removed on the right side. + """ + if hasattr(reference, "size"): + reference = reference.size(-1) + delta = tensor.size(-1) - reference + if delta < 0: + raise ValueError("tensor must be larger than reference. " f"Delta is {delta}.") + if delta: + tensor = tensor[..., delta // 2:-(delta - delta // 2)] + return tensor + + +def average_metric(metric, count=1.): + """ + Average `metric` which should be a float across all hosts. `count` should be + the weight for this particular host (i.e. number of examples). + """ + metric = th.tensor([count, count * metric], dtype=th.float32, device='cuda') + distributed.all_reduce(metric, op=distributed.ReduceOp.SUM) + return metric[1].item() / metric[0].item() + + +def free_port(host='', low=20000, high=40000): + """ + Return a port number that is most likely free. + This could suffer from a race condition although + it should be quite rare. + """ + sock = socket.socket() + while True: + port = random.randint(low, high) + try: + sock.bind((host, port)) + except OSError as error: + if error.errno == errno.EADDRINUSE: + continue + raise + return port + + +def sizeof_fmt(num, suffix='B'): + """ + Given `num` bytes, return human readable size. + Taken from https://stackoverflow.com/a/1094933 + """ + for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']: + if abs(num) < 1024.0: + return "%3.1f%s%s" % (num, unit, suffix) + num /= 1024.0 + return "%.1f%s%s" % (num, 'Yi', suffix) + + +def human_seconds(seconds, display='.2f'): + """ + Given `seconds` seconds, return human readable duration. + """ + value = seconds * 1e6 + ratios = [1e3, 1e3, 60, 60, 24] + names = ['us', 'ms', 's', 'min', 'hrs', 'days'] + last = names.pop(0) + for name, ratio in zip(names, ratios): + if value / ratio < 0.3: + break + value /= ratio + last = name + return f"{format(value, display)} {last}" + + +class TensorChunk: + def __init__(self, tensor, offset=0, length=None): + total_length = tensor.shape[-1] + assert offset >= 0 + assert offset < total_length + + if length is None: + length = total_length - offset + else: + length = min(total_length - offset, length) + + self.tensor = tensor + self.offset = offset + self.length = length + self.device = tensor.device + + @property + def shape(self): + shape = list(self.tensor.shape) + shape[-1] = self.length + return shape + + def padded(self, target_length): + delta = target_length - self.length + total_length = self.tensor.shape[-1] + assert delta >= 0 + + start = self.offset - delta // 2 + end = start + target_length + + correct_start = max(0, start) + correct_end = min(total_length, end) + + pad_left = correct_start - start + pad_right = end - correct_end + + out = F.pad(self.tensor[..., correct_start:correct_end], (pad_left, pad_right)) + assert out.shape[-1] == target_length + return out + + +def tensor_chunk(tensor_or_chunk): + if isinstance(tensor_or_chunk, TensorChunk): + return tensor_or_chunk + else: + assert isinstance(tensor_or_chunk, th.Tensor) + return TensorChunk(tensor_or_chunk) + + +def apply_model(model, mix, shifts=None, split=False, + overlap=0.25, transition_power=1., progress=False): + """ + Apply model to a given mixture. + + Args: + shifts (int): if > 0, will shift in time `mix` by a random amount between 0 and 0.5 sec + and apply the oppositve shift to the output. This is repeated `shifts` time and + all predictions are averaged. This effectively makes the model time equivariant + and improves SDR by up to 0.2 points. + split (bool): if True, the input will be broken down in 8 seconds extracts + and predictions will be performed individually on each and concatenated. + Useful for model with large memory footprint like Tasnet. + progress (bool): if True, show a progress bar (requires split=True) + """ + assert transition_power >= 1, "transition_power < 1 leads to weird behavior." + device = mix.device + channels, length = mix.shape + if split: + out = th.zeros(len(model.sources), channels, length, device=device) + sum_weight = th.zeros(length, device=device) + segment = model.segment_length + stride = int((1 - overlap) * segment) + offsets = range(0, length, stride) + scale = stride / model.samplerate + if progress: + offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit='seconds') + # We start from a triangle shaped weight, with maximal weight in the middle + # of the segment. Then we normalize and take to the power `transition_power`. + # Large values of transition power will lead to sharper transitions. + weight = th.cat([th.arange(1, segment // 2 + 1), + th.arange(segment - segment // 2, 0, -1)]).to(device) + assert len(weight) == segment + # If the overlap < 50%, this will translate to linear transition when + # transition_power is 1. + weight = (weight / weight.max())**transition_power + for offset in offsets: + chunk = TensorChunk(mix, offset, segment) + chunk_out = apply_model(model, chunk, shifts=shifts) + chunk_length = chunk_out.shape[-1] + out[..., offset:offset + segment] += weight[:chunk_length] * chunk_out + sum_weight[offset:offset + segment] += weight[:chunk_length] + offset += segment + assert sum_weight.min() > 0 + out /= sum_weight + return out + elif shifts: + max_shift = int(0.5 * model.samplerate) + mix = tensor_chunk(mix) + padded_mix = mix.padded(length + 2 * max_shift) + out = 0 + for _ in range(shifts): + offset = random.randint(0, max_shift) + shifted = TensorChunk(padded_mix, offset, length + max_shift - offset) + shifted_out = apply_model(model, shifted) + out += shifted_out[..., max_shift - offset:] + out /= shifts + return out + else: + valid_length = model.valid_length(length) + mix = tensor_chunk(mix) + padded_mix = mix.padded(valid_length) + with th.no_grad(): + out = model(padded_mix.unsqueeze(0))[0] + return center_trim(out, length) + + +@contextmanager +def temp_filenames(count, delete=True): + names = [] + try: + for _ in range(count): + names.append(tempfile.NamedTemporaryFile(delete=False).name) + yield names + finally: + if delete: + for name in names: + os.unlink(name) + + +def get_quantizer(model, args, optimizer=None): + quantizer = None + if args.diffq: + quantizer = DiffQuantizer( + model, min_size=args.q_min_size, group_size=8) + if optimizer is not None: + quantizer.setup_optimizer(optimizer) + elif args.qat: + quantizer = UniformQuantizer( + model, bits=args.qat, min_size=args.q_min_size) + return quantizer + + +def load_model(path, strict=False): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + load_from = path + package = th.load(load_from, 'cpu') + + klass = package["klass"] + args = package["args"] + kwargs = package["kwargs"] + + if strict: + model = klass(*args, **kwargs) + else: + sig = inspect.signature(klass) + for key in list(kwargs): + if key not in sig.parameters: + warnings.warn("Dropping inexistant parameter " + key) + del kwargs[key] + model = klass(*args, **kwargs) + + state = package["state"] + training_args = package["training_args"] + quantizer = get_quantizer(model, training_args) + + set_state(model, quantizer, state) + return model + + +def get_state(model, quantizer): + if quantizer is None: + state = {k: p.data.to('cpu') for k, p in model.state_dict().items()} + else: + state = quantizer.get_quantized_state() + buf = io.BytesIO() + th.save(state, buf) + state = {'compressed': zlib.compress(buf.getvalue())} + return state + + +def set_state(model, quantizer, state): + if quantizer is None: + model.load_state_dict(state) + else: + buf = io.BytesIO(zlib.decompress(state["compressed"])) + state = th.load(buf, "cpu") + quantizer.restore_quantized_state(state) + + return state + + +def save_state(state, path): + buf = io.BytesIO() + th.save(state, buf) + sig = hashlib.sha256(buf.getvalue()).hexdigest()[:8] + + path = path.parent / (path.stem + "-" + sig + path.suffix) + path.write_bytes(buf.getvalue()) + + +def save_model(model, quantizer, training_args, path): + args, kwargs = model._init_args_kwargs + klass = model.__class__ + + state = get_state(model, quantizer) + + save_to = path + package = { + 'klass': klass, + 'args': args, + 'kwargs': kwargs, + 'state': state, + 'training_args': training_args, + } + th.save(package, save_to) + + +def capture_init(init): + @functools.wraps(init) + def __init__(self, *args, **kwargs): + self._init_args_kwargs = (args, kwargs) + init(self, *args, **kwargs) + + return __init__ diff --git a/lib/infer/infer_libs/uvr5_pack/demucs/wav.py b/lib/infer/infer_libs/uvr5_pack/demucs/wav.py new file mode 100644 index 000000000..a65c3b2ba --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/demucs/wav.py @@ -0,0 +1,174 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from collections import OrderedDict +import hashlib +import math +import json +from pathlib import Path + +import julius +import torch as th +from torch import distributed +import torchaudio as ta +from torch.nn import functional as F + +from .audio import convert_audio_channels +from .compressed import get_musdb_tracks + +MIXTURE = "mixture" +EXT = ".wav" + + +def _track_metadata(track, sources): + track_length = None + track_samplerate = None + for source in sources + [MIXTURE]: + file = track / f"{source}{EXT}" + info = ta.info(str(file)) + length = info.num_frames + if track_length is None: + track_length = length + track_samplerate = info.sample_rate + elif track_length != length: + raise ValueError( + f"Invalid length for file {file}: " + f"expecting {track_length} but got {length}.") + elif info.sample_rate != track_samplerate: + raise ValueError( + f"Invalid sample rate for file {file}: " + f"expecting {track_samplerate} but got {info.sample_rate}.") + if source == MIXTURE: + wav, _ = ta.load(str(file)) + wav = wav.mean(0) + mean = wav.mean().item() + std = wav.std().item() + + return {"length": length, "mean": mean, "std": std, "samplerate": track_samplerate} + + +def _build_metadata(path, sources): + meta = {} + path = Path(path) + for file in path.iterdir(): + meta[file.name] = _track_metadata(file, sources) + return meta + + +class Wavset: + def __init__( + self, + root, metadata, sources, + length=None, stride=None, normalize=True, + samplerate=44100, channels=2): + """ + Waveset (or mp3 set for that matter). Can be used to train + with arbitrary sources. Each track should be one folder inside of `path`. + The folder should contain files named `{source}.{ext}`. + Files will be grouped according to `sources` (each source is a list of + filenames). + + Sample rate and channels will be converted on the fly. + + `length` is the sample size to extract (in samples, not duration). + `stride` is how many samples to move by between each example. + """ + self.root = Path(root) + self.metadata = OrderedDict(metadata) + self.length = length + self.stride = stride or length + self.normalize = normalize + self.sources = sources + self.channels = channels + self.samplerate = samplerate + self.num_examples = [] + for name, meta in self.metadata.items(): + track_length = int(self.samplerate * meta['length'] / meta['samplerate']) + if length is None or track_length < length: + examples = 1 + else: + examples = int(math.ceil((track_length - self.length) / self.stride) + 1) + self.num_examples.append(examples) + + def __len__(self): + return sum(self.num_examples) + + def get_file(self, name, source): + return self.root / name / f"{source}{EXT}" + + def __getitem__(self, index): + for name, examples in zip(self.metadata, self.num_examples): + if index >= examples: + index -= examples + continue + meta = self.metadata[name] + num_frames = -1 + offset = 0 + if self.length is not None: + offset = int(math.ceil( + meta['samplerate'] * self.stride * index / self.samplerate)) + num_frames = int(math.ceil( + meta['samplerate'] * self.length / self.samplerate)) + wavs = [] + for source in self.sources: + file = self.get_file(name, source) + wav, _ = ta.load(str(file), frame_offset=offset, num_frames=num_frames) + wav = convert_audio_channels(wav, self.channels) + wavs.append(wav) + + example = th.stack(wavs) + example = julius.resample_frac(example, meta['samplerate'], self.samplerate) + if self.normalize: + example = (example - meta['mean']) / meta['std'] + if self.length: + example = example[..., :self.length] + example = F.pad(example, (0, self.length - example.shape[-1])) + return example + + +def get_wav_datasets(args, samples, sources): + sig = hashlib.sha1(str(args.wav).encode()).hexdigest()[:8] + metadata_file = args.metadata / (sig + ".json") + train_path = args.wav / "train" + valid_path = args.wav / "valid" + if not metadata_file.is_file() and args.rank == 0: + train = _build_metadata(train_path, sources) + valid = _build_metadata(valid_path, sources) + json.dump([train, valid], open(metadata_file, "w")) + if args.world_size > 1: + distributed.barrier() + train, valid = json.load(open(metadata_file)) + train_set = Wavset(train_path, train, sources, + length=samples, stride=args.data_stride, + samplerate=args.samplerate, channels=args.audio_channels, + normalize=args.norm_wav) + valid_set = Wavset(valid_path, valid, [MIXTURE] + sources, + samplerate=args.samplerate, channels=args.audio_channels, + normalize=args.norm_wav) + return train_set, valid_set + + +def get_musdb_wav_datasets(args, samples, sources): + metadata_file = args.metadata / "musdb_wav.json" + root = args.musdb / "train" + if not metadata_file.is_file() and args.rank == 0: + metadata = _build_metadata(root, sources) + json.dump(metadata, open(metadata_file, "w")) + if args.world_size > 1: + distributed.barrier() + metadata = json.load(open(metadata_file)) + + train_tracks = get_musdb_tracks(args.musdb, is_wav=True, subsets=["train"], split="train") + metadata_train = {name: meta for name, meta in metadata.items() if name in train_tracks} + metadata_valid = {name: meta for name, meta in metadata.items() if name not in train_tracks} + train_set = Wavset(root, metadata_train, sources, + length=samples, stride=args.data_stride, + samplerate=args.samplerate, channels=args.audio_channels, + normalize=args.norm_wav) + valid_set = Wavset(root, metadata_valid, [MIXTURE] + sources, + samplerate=args.samplerate, channels=args.audio_channels, + normalize=args.norm_wav) + return train_set, valid_set diff --git a/lib/infer/infer_libs/uvr5_pack/infer_uvr5.py b/lib/infer/infer_libs/uvr5_pack/infer_uvr5.py new file mode 100644 index 000000000..74efb42f0 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/infer_uvr5.py @@ -0,0 +1,359 @@ +import os, sys, torch, warnings, pdb + +now_dir = os.getcwd() +sys.path.append(now_dir) +from json import load as ll + +warnings.filterwarnings("ignore") +import librosa +import importlib +import numpy as np +import hashlib, math +from tqdm import tqdm +from lib.uvr5_pack.lib_v5 import spec_utils +from lib.uvr5_pack.utils import _get_name_params, inference +from lib.uvr5_pack.lib_v5.model_param_init import ModelParameters +import soundfile as sf +from lib.uvr5_pack.lib_v5.nets_new import CascadedNet +from lib.uvr5_pack.lib_v5 import nets_61968KB as nets + + +class _audio_pre_: + def __init__(self, agg, model_path, device, is_half): + self.model_path = model_path + self.device = device + self.data = { + # Processing Options + "postprocess": False, + "tta": False, + # Constants + "window_size": 512, + "agg": agg, + "high_end_process": "mirroring", + } + mp = ModelParameters("lib/uvr5_pack/lib_v5/modelparams/4band_v2.json") + model = nets.CascadedASPPNet(mp.param["bins"] * 2) + cpk = torch.load(model_path, map_location="cpu") + model.load_state_dict(cpk) + model.eval() + if is_half: + model = model.half().to(device) + else: + model = model.to(device) + + self.mp = mp + self.model = model + + def _path_audio_(self, music_file, ins_root=None, vocal_root=None, format="flac"): + if ins_root is None and vocal_root is None: + return "No save root." + name = os.path.basename(music_file) + if ins_root is not None: + os.makedirs(ins_root, exist_ok=True) + if vocal_root is not None: + os.makedirs(vocal_root, exist_ok=True) + X_wave, y_wave, X_spec_s, y_spec_s = {}, {}, {}, {} + bands_n = len(self.mp.param["band"]) + # print(bands_n) + for d in range(bands_n, 0, -1): + bp = self.mp.param["band"][d] + if d == bands_n: # high-end band + ( + X_wave[d], + _, + ) = librosa.core.load( + music_file, + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + if X_wave[d].ndim == 1: + X_wave[d] = np.asfortranarray([X_wave[d], X_wave[d]]) + else: # lower bands + X_wave[d] = librosa.core.resample( + X_wave[d + 1], + self.mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + # Stft of wave source + X_spec_s[d] = spec_utils.wave_to_spectrogram_mt( + X_wave[d], + bp["hl"], + bp["n_fft"], + self.mp.param["mid_side"], + self.mp.param["mid_side_b2"], + self.mp.param["reverse"], + ) + # pdb.set_trace() + if d == bands_n and self.data["high_end_process"] != "none": + input_high_end_h = (bp["n_fft"] // 2 - bp["crop_stop"]) + ( + self.mp.param["pre_filter_stop"] - self.mp.param["pre_filter_start"] + ) + input_high_end = X_spec_s[d][ + :, bp["n_fft"] // 2 - input_high_end_h : bp["n_fft"] // 2, : + ] + + X_spec_m = spec_utils.combine_spectrograms(X_spec_s, self.mp) + aggresive_set = float(self.data["agg"] / 100) + aggressiveness = { + "value": aggresive_set, + "split_bin": self.mp.param["band"][1]["crop_stop"], + } + with torch.no_grad(): + pred, X_mag, X_phase = inference( + X_spec_m, self.device, self.model, aggressiveness, self.data + ) + # Postprocess + if self.data["postprocess"]: + pred_inv = np.clip(X_mag - pred, 0, np.inf) + pred = spec_utils.mask_silence(pred, pred_inv) + y_spec_m = pred * X_phase + v_spec_m = X_spec_m - y_spec_m + + if ins_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], y_spec_m, input_high_end, self.mp + ) + wav_instrument = spec_utils.cmb_spectrogram_to_wave( + y_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_instrument = spec_utils.cmb_spectrogram_to_wave(y_spec_m, self.mp) + print("%s instruments done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + ins_root, + "instrument_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) # + else: + path = os.path.join( + ins_root, "instrument_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + if vocal_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], v_spec_m, input_high_end, self.mp + ) + wav_vocals = spec_utils.cmb_spectrogram_to_wave( + v_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_vocals = spec_utils.cmb_spectrogram_to_wave(v_spec_m, self.mp) + print("%s vocals done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + vocal_root, + "vocal_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + else: + path = os.path.join( + vocal_root, "vocal_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + + +class _audio_pre_new: + def __init__(self, agg, model_path, device, is_half): + self.model_path = model_path + self.device = device + self.data = { + # Processing Options + "postprocess": False, + "tta": False, + # Constants + "window_size": 512, + "agg": agg, + "high_end_process": "mirroring", + } + mp = ModelParameters("lib/uvr5_pack/lib_v5/modelparams/4band_v3.json") + nout = 64 if "DeReverb" in model_path else 48 + model = CascadedNet(mp.param["bins"] * 2, nout) + cpk = torch.load(model_path, map_location="cpu") + model.load_state_dict(cpk) + model.eval() + if is_half: + model = model.half().to(device) + else: + model = model.to(device) + + self.mp = mp + self.model = model + + def _path_audio_( + self, music_file, vocal_root=None, ins_root=None, format="flac" + ): # 3个VR模型vocal和ins是反的 + if ins_root is None and vocal_root is None: + return "No save root." + name = os.path.basename(music_file) + if ins_root is not None: + os.makedirs(ins_root, exist_ok=True) + if vocal_root is not None: + os.makedirs(vocal_root, exist_ok=True) + X_wave, y_wave, X_spec_s, y_spec_s = {}, {}, {}, {} + bands_n = len(self.mp.param["band"]) + # print(bands_n) + for d in range(bands_n, 0, -1): + bp = self.mp.param["band"][d] + if d == bands_n: # high-end band + ( + X_wave[d], + _, + ) = librosa.core.load( + music_file, + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + if X_wave[d].ndim == 1: + X_wave[d] = np.asfortranarray([X_wave[d], X_wave[d]]) + else: # lower bands + X_wave[d] = librosa.core.resample( + X_wave[d + 1], + self.mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + # Stft of wave source + X_spec_s[d] = spec_utils.wave_to_spectrogram_mt( + X_wave[d], + bp["hl"], + bp["n_fft"], + self.mp.param["mid_side"], + self.mp.param["mid_side_b2"], + self.mp.param["reverse"], + ) + # pdb.set_trace() + if d == bands_n and self.data["high_end_process"] != "none": + input_high_end_h = (bp["n_fft"] // 2 - bp["crop_stop"]) + ( + self.mp.param["pre_filter_stop"] - self.mp.param["pre_filter_start"] + ) + input_high_end = X_spec_s[d][ + :, bp["n_fft"] // 2 - input_high_end_h : bp["n_fft"] // 2, : + ] + + X_spec_m = spec_utils.combine_spectrograms(X_spec_s, self.mp) + aggresive_set = float(self.data["agg"] / 100) + aggressiveness = { + "value": aggresive_set, + "split_bin": self.mp.param["band"][1]["crop_stop"], + } + with torch.no_grad(): + pred, X_mag, X_phase = inference( + X_spec_m, self.device, self.model, aggressiveness, self.data + ) + # Postprocess + if self.data["postprocess"]: + pred_inv = np.clip(X_mag - pred, 0, np.inf) + pred = spec_utils.mask_silence(pred, pred_inv) + y_spec_m = pred * X_phase + v_spec_m = X_spec_m - y_spec_m + + if ins_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], y_spec_m, input_high_end, self.mp + ) + wav_instrument = spec_utils.cmb_spectrogram_to_wave( + y_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_instrument = spec_utils.cmb_spectrogram_to_wave(y_spec_m, self.mp) + print("%s instruments done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + ins_root, + "instrument_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) # + else: + path = os.path.join( + ins_root, "instrument_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + if vocal_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], v_spec_m, input_high_end, self.mp + ) + wav_vocals = spec_utils.cmb_spectrogram_to_wave( + v_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_vocals = spec_utils.cmb_spectrogram_to_wave(v_spec_m, self.mp) + print("%s vocals done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + vocal_root, + "vocal_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + else: + path = os.path.join( + vocal_root, "vocal_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + + +if __name__ == "__main__": + device = "cuda" + is_half = True + model_path = "assets/uvr5_weights/DeEchoNormal.pth" + pre_fun = _audio_pre_new(model_path=model_path, device=device, is_half=True, agg=10) + audio_path = "雪雪伴奏对消HP5.wav" + save_path = "opt" + pre_fun._path_audio_(audio_path, save_path, save_path) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/__init__.py b/lib/infer/infer_libs/uvr5_pack/julius/__init__.py new file mode 100644 index 000000000..69811b041 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/__init__.py @@ -0,0 +1,41 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 + +# flake8: noqa +""" +.. image:: ../logo.png + +Julius contains different Digital Signal Processing algorithms implemented +with PyTorch, so that they are differentiable and available on CUDA. +Note that all the modules implemented here can be used with TorchScript. + +For now, I have implemented: + +- `julius.resample`: fast sinc resampling. +- `julius.fftconv`: FFT based convolutions. +- `julius.lowpass`: FIR low pass filter banks. +- `julius.filters`: FIR high pass and band pass filters. +- `julius.bands`: Decomposition of a waveform signal over mel-scale frequency bands. + +Along that, you might found useful utilities in: + +- `julius.core`: DSP related functions. +- `julius.utils`: Generic utilities. + + +Please checkout [the Github repository](https://github.com/adefossez/julius) for other informations. +For a verification of the speed and correctness of Julius, check the benchmark module `bench`. + + +This package is named in this honor of +[Julius O. Smith](https://ccrma.stanford.edu/~jos/), +whose books and website were a gold mine of information for me to learn about DSP. Go checkout his website if you want +to learn more about DSP. +""" + +from .bands import SplitBands, split_bands +from .fftconv import fft_conv1d, FFTConv1d +from .filters import bandpass_filter, BandPassFilter +from .filters import highpass_filter, highpass_filters, HighPassFilter, HighPassFilters +from .lowpass import lowpass_filter, lowpass_filters, LowPassFilters, LowPassFilter +from .resample import resample_frac, ResampleFrac diff --git a/lib/infer/infer_libs/uvr5_pack/julius/bands.py b/lib/infer/infer_libs/uvr5_pack/julius/bands.py new file mode 100644 index 000000000..ef2162440 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/bands.py @@ -0,0 +1,119 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 +""" +Decomposition of a signal over frequency bands in the waveform domain. +""" +from typing import Optional, Sequence +import torch + +from .core import mel_frequencies +from .lowpass import LowPassFilters +from .utils import simple_repr + + +class SplitBands(torch.nn.Module): + """ + Decomposes a signal over the given frequency bands in the waveform domain using + a cascade of low pass filters as implemented by `julius.lowpass.LowPassFilters`. + You can either specify explicitely the frequency cutoffs, or just the number of bands, + in which case the frequency cutoffs will be spread out evenly in mel scale. + + Args: + sample_rate (float): Sample rate of the input signal in Hz. + n_bands (int or None): number of bands, when not giving them explictely with `cutoffs`. + In that case, the cutoff frequencies will be evenly spaced in mel-space. + cutoffs (list[float] or None): list of frequency cutoffs in Hz. + pad (bool): if True, appropriately pad the input with zero over the edge. If `stride=1`, + the output will have the same length as the input. + zeros (float): Number of zero crossings to keep. See `LowPassFilters` for more informations. + fft (bool or None): See `LowPassFilters` for more info. + + ..note:: + The sum of all the bands will always be the input signal. + + ..warning:: + Unlike `julius.lowpass.LowPassFilters`, the cutoffs frequencies must be provided in Hz along + with the sample rate. + + Shape: + + - Input: `[*, T]` + - Output: `[B, *, T']`, with `T'=T` if `pad` is True. + If `n_bands` was provided, `B = n_bands` otherwise `B = len(cutoffs) + 1` + + >>> bands = SplitBands(sample_rate=128, n_bands=10) + >>> x = torch.randn(6, 4, 1024) + >>> list(bands(x).shape) + [10, 6, 4, 1024] + """ + + def __init__(self, sample_rate: float, n_bands: Optional[int] = None, + cutoffs: Optional[Sequence[float]] = None, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + if (cutoffs is None) + (n_bands is None) != 1: + raise ValueError("You must provide either n_bands, or cutoffs, but not boths.") + + self.sample_rate = sample_rate + self.n_bands = n_bands + self._cutoffs = list(cutoffs) if cutoffs is not None else None + self.pad = pad + self.zeros = zeros + self.fft = fft + + if cutoffs is None: + if n_bands is None: + raise ValueError("You must provide one of n_bands or cutoffs.") + if not n_bands >= 1: + raise ValueError(f"n_bands must be greater than one (got {n_bands})") + cutoffs = mel_frequencies(n_bands + 1, 0, sample_rate / 2)[1:-1] + else: + if max(cutoffs) > 0.5 * sample_rate: + raise ValueError("A cutoff above sample_rate/2 does not make sense.") + if len(cutoffs) > 0: + self.lowpass = LowPassFilters( + [c / sample_rate for c in cutoffs], pad=pad, zeros=zeros, fft=fft) + else: + # Here I cannot make both TorchScript and MyPy happy. + # I miss the good old times, before all this madness was created. + self.lowpass = None # type: ignore + + def forward(self, input): + if self.lowpass is None: + return input[None] + lows = self.lowpass(input) + low = lows[0] + bands = [low] + for low_and_band in lows[1:]: + # Get a bandpass filter by substracting lowpasses + band = low_and_band - low + bands.append(band) + low = low_and_band + # Last band is whatever is left in the signal + bands.append(input - low) + return torch.stack(bands) + + @property + def cutoffs(self): + if self._cutoffs is not None: + return self._cutoffs + elif self.lowpass is not None: + return [c * self.sample_rate for c in self.lowpass.cutoffs] + else: + return [] + + def __repr__(self): + return simple_repr(self, overrides={"cutoffs": self._cutoffs}) + + +def split_bands(signal: torch.Tensor, sample_rate: float, n_bands: Optional[int] = None, + cutoffs: Optional[Sequence[float]] = None, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Functional version of `SplitBands`, refer to this class for more information. + + >>> x = torch.randn(6, 4, 1024) + >>> list(split_bands(x, sample_rate=64, cutoffs=[12, 24]).shape) + [3, 6, 4, 1024] + """ + return SplitBands(sample_rate, n_bands, cutoffs, pad, zeros, fft).to(signal)(signal) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/core.py b/lib/infer/infer_libs/uvr5_pack/julius/core.py new file mode 100644 index 000000000..6b7504184 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/core.py @@ -0,0 +1,122 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 +""" +Signal processing or PyTorch related utilities. +""" +import math +import typing as tp + +import torch +from torch.nn import functional as F + + +def sinc(x: torch.Tensor): + """ + Implementation of sinc, i.e. sin(x) / x + + __Warning__: the input is not multiplied by `pi`! + """ + return torch.where(x == 0, torch.tensor(1., device=x.device, dtype=x.dtype), torch.sin(x) / x) + + +def pad_to(tensor: torch.Tensor, target_length: int, mode: str = 'constant', value: float = 0): + """ + Pad the given tensor to the given length, with 0s on the right. + """ + return F.pad(tensor, (0, target_length - tensor.shape[-1]), mode=mode, value=value) + + +def hz_to_mel(freqs: torch.Tensor): + """ + Converts a Tensor of frequencies in hertz to the mel scale. + Uses the simple formula by O'Shaughnessy (1987). + + Args: + freqs (torch.Tensor): frequencies to convert. + + """ + return 2595 * torch.log10(1 + freqs / 700) + + +def mel_to_hz(mels: torch.Tensor): + """ + Converts a Tensor of mel scaled frequencies to Hertz. + Uses the simple formula by O'Shaughnessy (1987). + + Args: + mels (torch.Tensor): mel frequencies to convert. + """ + return 700 * (10**(mels / 2595) - 1) + + +def mel_frequencies(n_mels: int, fmin: float, fmax: float): + """ + Return frequencies that are evenly spaced in mel scale. + + Args: + n_mels (int): number of frequencies to return. + fmin (float): start from this frequency (in Hz). + fmax (float): finish at this frequency (in Hz). + + + """ + low = hz_to_mel(torch.tensor(float(fmin))).item() + high = hz_to_mel(torch.tensor(float(fmax))).item() + mels = torch.linspace(low, high, n_mels) + return mel_to_hz(mels) + + +def volume(x: torch.Tensor, floor=1e-8): + """ + Return the volume in dBFS. + """ + return torch.log10(floor + (x**2).mean(-1)) * 10 + + +def pure_tone(freq: float, sr: float = 128, dur: float = 4, device=None): + """ + Return a pure tone, i.e. cosine. + + Args: + freq (float): frequency (in Hz) + sr (float): sample rate (in Hz) + dur (float): duration (in seconds) + """ + time = torch.arange(int(sr * dur), device=device).float() / sr + return torch.cos(2 * math.pi * freq * time) + + +def unfold(input, kernel_size: int, stride: int): + """1D only unfolding similar to the one from PyTorch. + However PyTorch unfold is extremely slow. + + Given an input tensor of size `[*, T]` this will return + a tensor `[*, F, K]` with `K` the kernel size, and `F` the number + of frames. The i-th frame is a view onto `i * stride: i * stride + kernel_size`. + This will automatically pad the input to cover at least once all entries in `input`. + + Args: + input (Tensor): tensor for which to return the frames. + kernel_size (int): size of each frame. + stride (int): stride between each frame. + + Shape: + + - Inputs: `input` is `[*, T]` + - Output: `[*, F, kernel_size]` with `F = 1 + ceil((T - kernel_size) / stride)` + + + ..Warning:: unlike PyTorch unfold, this will pad the input + so that any position in `input` is covered by at least one frame. + """ + shape = list(input.shape) + length = shape.pop(-1) + n_frames = math.ceil((max(length, kernel_size) - kernel_size) / stride) + 1 + tgt_length = (n_frames - 1) * stride + kernel_size + padded = F.pad(input, (0, tgt_length - length)).contiguous() + strides: tp.List[int] = [] + for dim in range(padded.dim()): + strides.append(padded.stride(dim)) + assert strides.pop(-1) == 1, 'data should be contiguous' + strides = strides + [stride, 1] + return padded.as_strided(shape + [n_frames, kernel_size], strides) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/fftconv.py b/lib/infer/infer_libs/uvr5_pack/julius/fftconv.py new file mode 100644 index 000000000..1920e5369 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/fftconv.py @@ -0,0 +1,183 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 + +""" +Implementation of a FFT based 1D convolution in PyTorch. +While FFT is used in CUDNN for small kernel sizes, it is not the case for long ones, e.g. 512. +This module implements efficient FFT based convolutions for such convolutions. A typical +application is for evaluationg FIR filters with a long receptive field, typically +evaluated with a stride of 1. +""" +from typing import Optional + +import torch +try: + import torch.fft as new_fft +except ImportError: + new_fft = None # type: ignore +from torch.nn import functional as F + +from .core import pad_to, unfold +from .utils import simple_repr + + +# This is quite verbose, but sadly needed to make TorchScript happy. +def _new_rfft(x: torch.Tensor): + z = new_fft.rfft(x, dim=-1) + return torch.view_as_real(z) + + +def _old_rfft(x: torch.Tensor): + return torch.rfft(x, 1) # type: ignore + + +def _old_irfft(x: torch.Tensor, length: int): + result = torch.irfft(x, 1, signal_sizes=(length,)) # type: ignore + return result + + +def _new_irfft(x: torch.Tensor, length: int): + x = torch.view_as_complex(x) + return new_fft.irfft(x, length, dim=-1) + + +if new_fft is None: + _rfft = _old_rfft + _irfft = _old_irfft +else: + _rfft = _new_rfft + _irfft = _new_irfft + + +def _compl_mul_conjugate(a: torch.Tensor, b: torch.Tensor): + """ + Given a and b two tensors of dimension 4 + with the last dimension being the real and imaginary part, + returns a multiplied by the conjugate of b, the multiplication + being with respect to the second dimension. + + """ + # PyTorch 1.7 supports complex number, but not for all operations. + # Once the support is widespread, this can likely go away. + + op = "bcft,dct->bdft" + return torch.stack([ + torch.einsum(op, a[..., 0], b[..., 0]) + torch.einsum(op, a[..., 1], b[..., 1]), + torch.einsum(op, a[..., 1], b[..., 0]) - torch.einsum(op, a[..., 0], b[..., 1]) + ], + dim=-1) + + +def fft_conv1d( + input: torch.Tensor, weight: torch.Tensor, + bias: Optional[torch.Tensor] = None, stride: int = 1, padding: int = 0, + block_ratio: float = 5): + """ + Same as `torch.nn.functional.conv1d` but using FFT for the convolution. + Please check PyTorch documentation for more information. + + Args: + input (Tensor): input signal of shape `[B, C, T]`. + weight (Tensor): weight of the convolution `[D, C, K]` with `D` the number + of output channels. + bias (Tensor or None): if not None, bias term for the convolution. + stride (int): stride of convolution. + padding (int): padding to apply to the input. + block_ratio (float): can be tuned for speed. The input is splitted in chunks + with a size of `int(block_ratio * kernel_size)`. + + Shape: + + - Inputs: `input` is `[B, C, T]`, `weight` is `[D, C, K]` and bias is `[D]`. + - Output: `(*, T)` + + + ..note:: + This function is faster than `torch.nn.functional.conv1d` only in specific cases. + Typically, the kernel size should be of the order of 256 to see any real gain, + for a stride of 1. + + ..Warning:: + Dilation and groups are not supported at the moment. This function might use + more memory than the default Conv1d implementation. + """ + input = F.pad(input, (padding, padding)) + batch, channels, length = input.shape + out_channels, _, kernel_size = weight.shape + + if length < kernel_size: + raise RuntimeError(f"Input should be at least as large as the kernel size {kernel_size}, " + f"but it is only {length} samples long.") + if block_ratio < 1: + raise RuntimeError("Block ratio must be greater than 1.") + + # We are going to process the input blocks by blocks, as for some reason it is faster + # and less memory intensive (I think the culprit is `torch.einsum`. + block_size: int = min(int(kernel_size * block_ratio), length) + fold_stride = block_size - kernel_size + 1 + weight = pad_to(weight, block_size) + weight_z = _rfft(weight) + + # We pad the input and get the different frames, on which + frames = unfold(input, block_size, fold_stride) + + frames_z = _rfft(frames) + out_z = _compl_mul_conjugate(frames_z, weight_z) + out = _irfft(out_z, block_size) + # The last bit is invalid, because FFT will do a circular convolution. + out = out[..., :-kernel_size + 1] + out = out.reshape(batch, out_channels, -1) + out = out[..., ::stride] + target_length = (length - kernel_size) // stride + 1 + out = out[..., :target_length] + if bias is not None: + out += bias[:, None] + return out + + +class FFTConv1d(torch.nn.Module): + """ + Same as `torch.nn.Conv1d` but based on `fft_conv1d`. + Please check PyTorch documentation for more information. + + Args: + in_channels (int): number of input channels. + out_channels (int): number of output channels. + kernel_size (int): kernel size of convolution. + stride (int): stride of convolution. + padding (int): padding to apply to the input. + bias (bool): if True, use a bias term. + + ..note:: + This module is faster than `torch.nn.Conv1d` only in specific cases. + Typically, `kernel_size` should be of the order of 256 to see any real gain, + for a stride of 1. + + ..warning:: + Dilation and groups are not supported at the moment. This module might use + more memory than the default Conv1d implementation. + + >>> fftconv = FFTConv1d(12, 24, 128, 4) + >>> x = torch.randn(4, 12, 1024) + >>> print(list(fftconv(x).shape)) + [4, 24, 225] + """ + def __init__(self, in_channels: int, out_channels: int, kernel_size: int, + stride: int = 1, padding: int = 0, bias: bool = True): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.stride = stride + self.padding = padding + + conv = torch.nn.Conv1d(in_channels, out_channels, kernel_size, bias=bias) + self.weight = conv.weight + self.bias = conv.bias + + def forward(self, input: torch.Tensor): + return fft_conv1d( + input, self.weight, self.bias, self.stride, self.padding) + + def __repr__(self): + return simple_repr(self, overrides={"bias": self.bias is not None}) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/filters.py b/lib/infer/infer_libs/uvr5_pack/julius/filters.py new file mode 100644 index 000000000..afabcc015 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/filters.py @@ -0,0 +1,258 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2021 +""" +FIR windowed sinc highpass and bandpass filters. +Those are convenience wrappers around the filters defined in `julius.lowpass`. +""" + +from typing import Sequence, Optional + +import torch + +# Import all lowpass filters for consistency. +from .lowpass import lowpass_filter, lowpass_filters, LowPassFilter, LowPassFilters # noqa +from .utils import simple_repr + + +class HighPassFilters(torch.nn.Module): + """ + Bank of high pass filters. See `julius.lowpass.LowPassFilters` for more + details on the implementation. + + Args: + cutoffs (list[float]): list of cutoff frequencies, in [0, 0.5] expressed as `f/f_s` where + f_s is the samplerate and `f` is the cutoff frequency. + The upper limit is 0.5, because a signal sampled at `f_s` contains only + frequencies under `f_s / 2`. + stride (int): how much to decimate the output. Probably not a good idea + to do so with a high pass filters though... + pad (bool): if True, appropriately pad the input with zero over the edge. If `stride=1`, + the output will have the same length as the input. + zeros (float): Number of zero crossings to keep. + Controls the receptive field of the Finite Impulse Response filter. + For filters with low cutoff frequency, e.g. 40Hz at 44.1kHz, + it is a bad idea to set this to a high value. + This is likely appropriate for most use. Lower values + will result in a faster filter, but with a slower attenuation around the + cutoff frequency. + fft (bool or None): if True, uses `julius.fftconv` rather than PyTorch convolutions. + If False, uses PyTorch convolutions. If None, either one will be chosen automatically + depending on the effective filter size. + + + ..warning:: + All the filters will use the same filter size, aligned on the lowest + frequency provided. If you combine a lot of filters with very diverse frequencies, it might + be more efficient to split them over multiple modules with similar frequencies. + + Shape: + + - Input: `[*, T]` + - Output: `[F, *, T']`, with `T'=T` if `pad` is True and `stride` is 1, and + `F` is the numer of cutoff frequencies. + + >>> highpass = HighPassFilters([1/4]) + >>> x = torch.randn(4, 12, 21, 1024) + >>> list(highpass(x).shape) + [1, 4, 12, 21, 1024] + """ + + def __init__(self, cutoffs: Sequence[float], stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + self._lowpasses = LowPassFilters(cutoffs, stride, pad, zeros, fft) + + @property + def cutoffs(self): + return self._lowpasses.cutoffs + + @property + def stride(self): + return self._lowpasses.stride + + @property + def pad(self): + return self._lowpasses.pad + + @property + def zeros(self): + return self._lowpasses.zeros + + @property + def fft(self): + return self._lowpasses.fft + + def forward(self, input): + lows = self._lowpasses(input) + + # We need to extract the right portion of the input in case + # pad is False or stride > 1 + if self.pad: + start, end = 0, input.shape[-1] + else: + start = self._lowpasses.half_size + end = -start + input = input[..., start:end:self.stride] + highs = input - lows + return highs + + def __repr__(self): + return simple_repr(self) + + +class HighPassFilter(torch.nn.Module): + """ + Same as `HighPassFilters` but applies a single high pass filter. + + Shape: + + - Input: `[*, T]` + - Output: `[*, T']`, with `T'=T` if `pad` is True and `stride` is 1. + + >>> highpass = HighPassFilter(1/4, stride=1) + >>> x = torch.randn(4, 124) + >>> list(highpass(x).shape) + [4, 124] + """ + + def __init__(self, cutoff: float, stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + self._highpasses = HighPassFilters([cutoff], stride, pad, zeros, fft) + + @property + def cutoff(self): + return self._highpasses.cutoffs[0] + + @property + def stride(self): + return self._highpasses.stride + + @property + def pad(self): + return self._highpasses.pad + + @property + def zeros(self): + return self._highpasses.zeros + + @property + def fft(self): + return self._highpasses.fft + + def forward(self, input): + return self._highpasses(input)[0] + + def __repr__(self): + return simple_repr(self) + + +def highpass_filters(input: torch.Tensor, cutoffs: Sequence[float], + stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Functional version of `HighPassFilters`, refer to this class for more information. + """ + return HighPassFilters(cutoffs, stride, pad, zeros, fft).to(input)(input) + + +def highpass_filter(input: torch.Tensor, cutoff: float, + stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Functional version of `HighPassFilter`, refer to this class for more information. + Output will not have a dimension inserted in the front. + """ + return highpass_filters(input, [cutoff], stride, pad, zeros, fft)[0] + + +class BandPassFilter(torch.nn.Module): + """ + Single band pass filter, implemented as a the difference of two lowpass filters. + + Args: + cutoff_low (float): lower cutoff frequency, in [0, 0.5] expressed as `f/f_s` where + f_s is the samplerate and `f` is the cutoff frequency. + The upper limit is 0.5, because a signal sampled at `f_s` contains only + frequencies under `f_s / 2`. + cutoff_high (float): higher cutoff frequency, in [0, 0.5] expressed as `f/f_s`. + This must be higher than cutoff_high. Note that due to the fact + that filter are not perfect, the output will be non zero even if + cutoff_high == cutoff_low. + stride (int): how much to decimate the output. + pad (bool): if True, appropriately pad the input with zero over the edge. If `stride=1`, + the output will have the same length as the input. + zeros (float): Number of zero crossings to keep. + Controls the receptive field of the Finite Impulse Response filter. + For filters with low cutoff frequency, e.g. 40Hz at 44.1kHz, + it is a bad idea to set this to a high value. + This is likely appropriate for most use. Lower values + will result in a faster filter, but with a slower attenuation around the + cutoff frequency. + fft (bool or None): if True, uses `julius.fftconv` rather than PyTorch convolutions. + If False, uses PyTorch convolutions. If None, either one will be chosen automatically + depending on the effective filter size. + + + Shape: + + - Input: `[*, T]` + - Output: `[*, T']`, with `T'=T` if `pad` is True and `stride` is 1. + + ..Note:: There is no BandPassFilters (bank of bandpasses) because its + signification would be the same as `julius.bands.SplitBands`. + + >>> bandpass = BandPassFilter(1/4, 1/3) + >>> x = torch.randn(4, 12, 21, 1024) + >>> list(bandpass(x).shape) + [4, 12, 21, 1024] + """ + + def __init__(self, cutoff_low: float, cutoff_high: float, stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + if cutoff_low > cutoff_high: + raise ValueError(f"Lower cutoff {cutoff_low} should be less than " + f"higher cutoff {cutoff_high}.") + self._lowpasses = LowPassFilters([cutoff_low, cutoff_high], stride, pad, zeros, fft) + + @property + def cutoff_low(self): + return self._lowpasses.cutoffs[0] + + @property + def cutoff_high(self): + return self._lowpasses.cutoffs[1] + + @property + def stride(self): + return self._lowpasses.stride + + @property + def pad(self): + return self._lowpasses.pad + + @property + def zeros(self): + return self._lowpasses.zeros + + @property + def fft(self): + return self._lowpasses.fft + + def forward(self, input): + lows = self._lowpasses(input) + return lows[1] - lows[0] + + def __repr__(self): + return simple_repr(self) + + +def bandpass_filter(input: torch.Tensor, cutoff_low: float, cutoff_high: float, + stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Functional version of `BandPassfilter`, refer to this class for more information. + Output will not have a dimension inserted in the front. + """ + return BandPassFilter(cutoff_low, cutoff_high, stride, pad, zeros, fft).to(input)(input) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/lowpass.py b/lib/infer/infer_libs/uvr5_pack/julius/lowpass.py new file mode 100644 index 000000000..0eb46e382 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/lowpass.py @@ -0,0 +1,181 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 +""" +FIR windowed sinc lowpass filters. +""" + +import math +from typing import Sequence, Optional + +import torch +from torch.nn import functional as F + +from .core import sinc +from .fftconv import fft_conv1d +from .utils import simple_repr + + +class LowPassFilters(torch.nn.Module): + """ + Bank of low pass filters. Note that a high pass or band pass filter can easily + be implemented by substracting a same signal processed with low pass filters with different + frequencies (see `julius.bands.SplitBands` for instance). + This uses a windowed sinc filter, very similar to the one used in + `julius.resample`. However, because we do not change the sample rate here, + this filter can be much more efficiently implemented using the FFT convolution from + `julius.fftconv`. + + Args: + cutoffs (list[float]): list of cutoff frequencies, in [0, 0.5] expressed as `f/f_s` where + f_s is the samplerate and `f` is the cutoff frequency. + The upper limit is 0.5, because a signal sampled at `f_s` contains only + frequencies under `f_s / 2`. + stride (int): how much to decimate the output. Keep in mind that decimation + of the output is only acceptable if the cutoff frequency is under `1/ (2 * stride)` + of the original sampling rate. + pad (bool): if True, appropriately pad the input with zero over the edge. If `stride=1`, + the output will have the same length as the input. + zeros (float): Number of zero crossings to keep. + Controls the receptive field of the Finite Impulse Response filter. + For lowpass filters with low cutoff frequency, e.g. 40Hz at 44.1kHz, + it is a bad idea to set this to a high value. + This is likely appropriate for most use. Lower values + will result in a faster filter, but with a slower attenuation around the + cutoff frequency. + fft (bool or None): if True, uses `julius.fftconv` rather than PyTorch convolutions. + If False, uses PyTorch convolutions. If None, either one will be chosen automatically + depending on the effective filter size. + + + ..warning:: + All the filters will use the same filter size, aligned on the lowest + frequency provided. If you combine a lot of filters with very diverse frequencies, it might + be more efficient to split them over multiple modules with similar frequencies. + + ..note:: + A lowpass with a cutoff frequency of 0 is defined as the null function + by convention here. This allows for a highpass with a cutoff of 0 to + be equal to identity, as defined in `julius.filters.HighPassFilters`. + + Shape: + + - Input: `[*, T]` + - Output: `[F, *, T']`, with `T'=T` if `pad` is True and `stride` is 1, and + `F` is the numer of cutoff frequencies. + + >>> lowpass = LowPassFilters([1/4]) + >>> x = torch.randn(4, 12, 21, 1024) + >>> list(lowpass(x).shape) + [1, 4, 12, 21, 1024] + """ + + def __init__(self, cutoffs: Sequence[float], stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + self.cutoffs = list(cutoffs) + if min(self.cutoffs) < 0: + raise ValueError("Minimum cutoff must be larger than zero.") + if max(self.cutoffs) > 0.5: + raise ValueError("A cutoff above 0.5 does not make sense.") + self.stride = stride + self.pad = pad + self.zeros = zeros + self.half_size = int(zeros / min([c for c in self.cutoffs if c > 0]) / 2) + if fft is None: + fft = self.half_size > 32 + self.fft = fft + window = torch.hann_window(2 * self.half_size + 1, periodic=False) + time = torch.arange(-self.half_size, self.half_size + 1) + filters = [] + for cutoff in cutoffs: + if cutoff == 0: + filter_ = torch.zeros_like(time) + else: + filter_ = 2 * cutoff * window * sinc(2 * cutoff * math.pi * time) + # Normalize filter to have sum = 1, otherwise we will have a small leakage + # of the constant component in the input signal. + filter_ /= filter_.sum() + filters.append(filter_) + self.register_buffer("filters", torch.stack(filters)[:, None]) + + def forward(self, input): + shape = list(input.shape) + input = input.view(-1, 1, shape[-1]) + if self.pad: + input = F.pad(input, (self.half_size, self.half_size), mode='replicate') + if self.fft: + out = fft_conv1d(input, self.filters, stride=self.stride) + else: + out = F.conv1d(input, self.filters, stride=self.stride) + shape.insert(0, len(self.cutoffs)) + shape[-1] = out.shape[-1] + return out.permute(1, 0, 2).reshape(shape) + + def __repr__(self): + return simple_repr(self) + + +class LowPassFilter(torch.nn.Module): + """ + Same as `LowPassFilters` but applies a single low pass filter. + + Shape: + + - Input: `[*, T]` + - Output: `[*, T']`, with `T'=T` if `pad` is True and `stride` is 1. + + >>> lowpass = LowPassFilter(1/4, stride=2) + >>> x = torch.randn(4, 124) + >>> list(lowpass(x).shape) + [4, 62] + """ + + def __init__(self, cutoff: float, stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + super().__init__() + self._lowpasses = LowPassFilters([cutoff], stride, pad, zeros, fft) + + @property + def cutoff(self): + return self._lowpasses.cutoffs[0] + + @property + def stride(self): + return self._lowpasses.stride + + @property + def pad(self): + return self._lowpasses.pad + + @property + def zeros(self): + return self._lowpasses.zeros + + @property + def fft(self): + return self._lowpasses.fft + + def forward(self, input): + return self._lowpasses(input)[0] + + def __repr__(self): + return simple_repr(self) + + +def lowpass_filters(input: torch.Tensor, cutoffs: Sequence[float], + stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Functional version of `LowPassFilters`, refer to this class for more information. + """ + return LowPassFilters(cutoffs, stride, pad, zeros, fft).to(input)(input) + + +def lowpass_filter(input: torch.Tensor, cutoff: float, + stride: int = 1, pad: bool = True, + zeros: float = 8, fft: Optional[bool] = None): + """ + Same as `lowpass_filters` but with a single cutoff frequency. + Output will not have a dimension inserted in the front. + """ + return lowpass_filters(input, [cutoff], stride, pad, zeros, fft)[0] diff --git a/lib/infer/infer_libs/uvr5_pack/julius/resample.py b/lib/infer/infer_libs/uvr5_pack/julius/resample.py new file mode 100644 index 000000000..fd3b9b547 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/resample.py @@ -0,0 +1,216 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 +""" +Differentiable, Pytorch based resampling. +Implementation of Julius O. Smith algorithm for resampling. +See https://ccrma.stanford.edu/~jos/resample/ for details. +This implementation is specially optimized for when new_sr / old_sr is a fraction +with a small numerator and denominator when removing the gcd (e.g. new_sr = 700, old_sr = 500). + +Very similar to [bmcfee/resampy](https://github.com/bmcfee/resampy) except this implementation +is optimized for the case mentioned before, while resampy is slower but more general. + +""" + +import math +from typing import Optional + +import torch +from torch.nn import functional as F + +from .core import sinc +from .utils import simple_repr + + +class ResampleFrac(torch.nn.Module): + """ + Resampling from the sample rate `old_sr` to `new_sr`. + """ + def __init__(self, old_sr: int, new_sr: int, zeros: int = 24, rolloff: float = 0.945): + """ + Args: + old_sr (int): sample rate of the input signal x. + new_sr (int): sample rate of the output. + zeros (int): number of zero crossing to keep in the sinc filter. + rolloff (float): use a lowpass filter that is `rolloff * new_sr / 2`, + to ensure sufficient margin due to the imperfection of the FIR filter used. + Lowering this value will reduce anti-aliasing, but will reduce some of the + highest frequencies. + + Shape: + + - Input: `[*, T]` + - Output: `[*, T']` with `T' = int(new_sr * T / old_sr) + + + .. caution:: + After dividing `old_sr` and `new_sr` by their GCD, both should be small + for this implementation to be fast. + + >>> import torch + >>> resample = ResampleFrac(4, 5) + >>> x = torch.randn(1000) + >>> print(len(resample(x))) + 1250 + """ + super().__init__() + if not isinstance(old_sr, int) or not isinstance(new_sr, int): + raise ValueError("old_sr and new_sr should be integers") + gcd = math.gcd(old_sr, new_sr) + self.old_sr = old_sr // gcd + self.new_sr = new_sr // gcd + self.zeros = zeros + self.rolloff = rolloff + + self._init_kernels() + + def _init_kernels(self): + if self.old_sr == self.new_sr: + return + + kernels = [] + sr = min(self.new_sr, self.old_sr) + # rolloff will perform antialiasing filtering by removing the highest frequencies. + # At first I thought I only needed this when downsampling, but when upsampling + # you will get edge artifacts without this, the edge is equivalent to zero padding, + # which will add high freq artifacts. + sr *= self.rolloff + + # The key idea of the algorithm is that x(t) can be exactly reconstructed from x[i] (tensor) + # using the sinc interpolation formula: + # x(t) = sum_i x[i] sinc(pi * old_sr * (i / old_sr - t)) + # We can then sample the function x(t) with a different sample rate: + # y[j] = x(j / new_sr) + # or, + # y[j] = sum_i x[i] sinc(pi * old_sr * (i / old_sr - j / new_sr)) + + # We see here that y[j] is the convolution of x[i] with a specific filter, for which + # we take an FIR approximation, stopping when we see at least `zeros` zeros crossing. + # But y[j+1] is going to have a different set of weights and so on, until y[j + new_sr]. + # Indeed: + # y[j + new_sr] = sum_i x[i] sinc(pi * old_sr * ((i / old_sr - (j + new_sr) / new_sr)) + # = sum_i x[i] sinc(pi * old_sr * ((i - old_sr) / old_sr - j / new_sr)) + # = sum_i x[i + old_sr] sinc(pi * old_sr * (i / old_sr - j / new_sr)) + # so y[j+new_sr] uses the same filter as y[j], but on a shifted version of x by `old_sr`. + # This will explain the F.conv1d after, with a stride of old_sr. + self._width = math.ceil(self.zeros * self.old_sr / sr) + # If old_sr is still big after GCD reduction, most filters will be very unbalanced, i.e., + # they will have a lot of almost zero values to the left or to the right... + # There is probably a way to evaluate those filters more efficiently, but this is kept for + # future work. + idx = torch.arange(-self._width, self._width + self.old_sr).float() + for i in range(self.new_sr): + t = (-i/self.new_sr + idx/self.old_sr) * sr + t = t.clamp_(-self.zeros, self.zeros) + t *= math.pi + window = torch.cos(t/self.zeros/2)**2 + kernel = sinc(t) * window + # Renormalize kernel to ensure a constant signal is preserved. + kernel.div_(kernel.sum()) + kernels.append(kernel) + + self.register_buffer("kernel", torch.stack(kernels).view(self.new_sr, 1, -1)) + + def forward(self, x: torch.Tensor, output_length: Optional[int] = None, full: bool = False): + """ + Resample x. + Args: + x (Tensor): signal to resample, time should be the last dimension + output_length (None or int): This can be set to the desired output length + (last dimension). Allowed values are between 0 and + ceil(length * new_sr / old_sr). When None (default) is specified, the + floored output length will be used. In order to select the largest possible + size, use the `full` argument. + full (bool): return the longest possible output from the input. This can be useful + if you chain resampling operations, and want to give the `output_length` only + for the last one, while passing `full=True` to all the other ones. + """ + if self.old_sr == self.new_sr: + return x + shape = x.shape + length = x.shape[-1] + x = x.reshape(-1, length) + x = F.pad(x[:, None], (self._width, self._width + self.old_sr), mode='replicate') + ys = F.conv1d(x, self.kernel, stride=self.old_sr) # type: ignore + y = ys.transpose(1, 2).reshape(list(shape[:-1]) + [-1]) + + float_output_length = self.new_sr * length / self.old_sr + max_output_length = int(math.ceil(float_output_length)) + default_output_length = int(float_output_length) + if output_length is None: + output_length = max_output_length if full else default_output_length + elif output_length < 0 or output_length > max_output_length: + raise ValueError(f"output_length must be between 0 and {max_output_length}") + else: + if full: + raise ValueError("You cannot pass both full=True and output_length") + return y[..., :output_length] + + def __repr__(self): + return simple_repr(self) + + +def resample_frac(x: torch.Tensor, old_sr: int, new_sr: int, + zeros: int = 24, rolloff: float = 0.945, + output_length: Optional[int] = None, full: bool = False): + """ + Functional version of `ResampleFrac`, refer to its documentation for more information. + + ..warning:: + If you call repeatidly this functions with the same sample rates, then the + resampling kernel will be recomputed everytime. For best performance, you should use + and cache an instance of `ResampleFrac`. + """ + return ResampleFrac(old_sr, new_sr, zeros, rolloff).to(x)(x, output_length, full) + + +# Easier implementations for downsampling and upsampling by a factor of 2 +# Kept for testing and reference + +def _kernel_upsample2_downsample2(zeros): + # Kernel for upsampling and downsampling by a factor of 2. Interestingly, + # it is the same kernel used for both. + win = torch.hann_window(4 * zeros + 1, periodic=False) + winodd = win[1::2] + t = torch.linspace(-zeros + 0.5, zeros - 0.5, 2 * zeros) + t *= math.pi + kernel = (sinc(t) * winodd).view(1, 1, -1) + return kernel + + +def _upsample2(x, zeros=24): + """ + Upsample x by a factor of two. The output will be exactly twice as long as the input. + Args: + x (Tensor): signal to upsample, time should be the last dimension + zeros (int): number of zero crossing to keep in the sinc filter. + + This function is kept only for reference, you should use the more generic `resample_frac` + one. This function does not perform anti-aliasing filtering. + """ + *other, time = x.shape + kernel = _kernel_upsample2_downsample2(zeros).to(x) + out = F.conv1d(x.view(-1, 1, time), kernel, padding=zeros)[..., 1:].view(*other, time) + y = torch.stack([x, out], dim=-1) + return y.view(*other, -1) + + +def _downsample2(x, zeros=24): + """ + Downsample x by a factor of two. The output length is half of the input, ceiled. + Args: + x (Tensor): signal to downsample, time should be the last dimension + zeros (int): number of zero crossing to keep in the sinc filter. + + This function is kept only for reference, you should use the more generic `resample_frac` + one. This function does not perform anti-aliasing filtering. + """ + if x.shape[-1] % 2 != 0: + x = F.pad(x, (0, 1)) + xeven = x[..., ::2] + xodd = x[..., 1::2] + *other, time = xodd.shape + kernel = _kernel_upsample2_downsample2(zeros).to(x) + out = xeven + F.conv1d(xodd.view(-1, 1, time), kernel, padding=zeros)[..., :-1].view( + *other, time) + return out.view(*other, -1).mul(0.5) diff --git a/lib/infer/infer_libs/uvr5_pack/julius/utils.py b/lib/infer/infer_libs/uvr5_pack/julius/utils.py new file mode 100644 index 000000000..944b973ad --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/julius/utils.py @@ -0,0 +1,101 @@ +# File under the MIT license, see https://github.com/adefossez/julius/LICENSE for details. +# Author: adefossez, 2020 +""" +Non signal processing related utilities. +""" + +import inspect +import typing as tp +import sys +import time + + +def simple_repr(obj, attrs: tp.Optional[tp.Sequence[str]] = None, + overrides: dict = {}): + """ + Return a simple representation string for `obj`. + If `attrs` is not None, it should be a list of attributes to include. + """ + params = inspect.signature(obj.__class__).parameters + attrs_repr = [] + if attrs is None: + attrs = list(params.keys()) + for attr in attrs: + display = False + if attr in overrides: + value = overrides[attr] + elif hasattr(obj, attr): + value = getattr(obj, attr) + else: + continue + if attr in params: + param = params[attr] + if param.default is inspect._empty or value != param.default: # type: ignore + display = True + else: + display = True + + if display: + attrs_repr.append(f"{attr}={value}") + return f"{obj.__class__.__name__}({','.join(attrs_repr)})" + + +class MarkdownTable: + """ + Simple MarkdownTable generator. The column titles should be large enough + for the lines content. This will right align everything. + + >>> import io # we use io purely for test purposes, default is sys.stdout. + >>> file = io.StringIO() + >>> table = MarkdownTable(["Item Name", "Price"], file=file) + >>> table.header(); table.line(["Honey", "5"]); table.line(["Car", "5,000"]) + >>> print(file.getvalue().strip()) # Strip for test purposes + | Item Name | Price | + |-----------|-------| + | Honey | 5 | + | Car | 5,000 | + """ + def __init__(self, columns, file=sys.stdout): + self.columns = columns + self.file = file + + def _writeln(self, line): + self.file.write("|" + "|".join(line) + "|\n") + + def header(self): + self._writeln(f" {col} " for col in self.columns) + self._writeln("-" * (len(col) + 2) for col in self.columns) + + def line(self, line): + out = [] + for val, col in zip(line, self.columns): + val = format(val, '>' + str(len(col))) + out.append(" " + val + " ") + self._writeln(out) + + +class Chrono: + """ + Measures ellapsed time, calling `torch.cuda.synchronize` if necessary. + `Chrono` instances can be used as context managers (e.g. with `with`). + Upon exit of the block, you can access the duration of the block in seconds + with the `duration` attribute. + + >>> with Chrono() as chrono: + ... _ = sum(range(10_000)) + ... + >>> print(chrono.duration < 10) # Should be true unless on a really slow computer. + True + """ + def __init__(self): + self.duration = None + + def __enter__(self): + self._begin = time.time() + return self + + def __exit__(self, exc_type, exc_value, exc_tracebck): + import torch + if torch.cuda.is_available(): + torch.cuda.synchronize() + self.duration = time.time() - self._begin diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/layers_123821KB.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/layers_123821KB.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..926c8802fb5387b6aa47d8a54da8ac4a74cbdf97 GIT binary patch literal 4154 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 S`+3Le*lVw?b=NMgz4c$xMx9Uq literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/model_param_init.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/model_param_init.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfdbd715834641ddc435e8865a221ab67d822d44 GIT binary patch literal 1671 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 O*yYRk=6PfJ`~L%V5*kqe literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/nets_new.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/nets_new.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38e052f2bc9b175dd493bd3621141a9d7f2efde4 GIT binary patch literal 3843 zcma)9-E-T<5x+Zp68sP?tB#_ksXJ}lVLMVQIZoR&?bw#%bkc@Rt<(<~bx?=^B~T#9 z96-tTKr?NvPWs}R{t42f`X}MFPy81;)1<#WfE4NEq2OS#x4XCZwfEbl-)uSz&%gGy z@ULyg{!NX=M@Qp6-qZyNSiocEmR~*;f^jy~T%D6d#B3;B0bUFA*ch6w$=OFNFaq6}a()Jtha4cg~dI_A+pzb2%$1)sAywkn;oFqfHb zrP7t-m1~&k+R)vAPg;YP>z5kFS*`3jW+vXCISMt$S)ZE$!y(kWQ`$nQ$b8#non$qT z&v5WoAV=fTB%8J%m{Npx)(Rt?j6*36vZPtqY4&D~LQvh(O+_dzdU_6eaQT5q;@^p9e@kkzTK2bB>d>HzZ zEb2eskE4VADCvh%ag!5y&l~%_V`_OP_x6)8Q}<|V{9N9^meEe9>mW>P@io5A-=d$u zPjPGfMZ3BxTeGe1(N&o}bZ~SMyLi)ofaL6g<@}PL32?Xv;1ClRBGyjU;d-kfdZ$K`Ty@mMFx+=7= z!CDXvJ56~Lvycj^_wD zYgNg5Xf8c-aQ!*Nb8u}aa0RR?a8Lr@HM$inLpnlF>KrrBzPNG%Rcm1^I2Vnrn zo!*A8>0dy4Gxy+O%NSj7f`jzeUxU@02Yds;|^CdxNv-FDI)Q=OWU0cmOm%f+0 zwzAq{pXC|Ny{}-tNDu(YCGR=rjIrC9H6VzkgffHjRgx|CSG{RWRpFH!xboBCm8j08MXY%`)ihPHN3jO)DRIA*AJpCyM<1OLv7Ve=b zbbgDke`y+m-}=hbb-uyZzBF~g-$tvH0T9;~g87?4k#>~f)_-@%m=}039tmKCBT}QJ}`0s>or6wiIy9X zpacPE+Df7;n^IC!5NrdC9dK4&16Nm8PF|mTYA6W@+%^ui%2yNicHV@2E7LE?kCV49 zDG{t>^+6+FK^2A{R^H54W-DH2ebi=w`AR!mfu{9OE_3CZJkMs?uKca!ZRM}6{IwVS zwZFk%JBNK=?6G`h54%QHUv(pXjFTy=4!R6QO@>IU!1=JF6-JaG;0tZ+2Zau(4Lfal zpRDvWdJ)P;)b&Fmn?xvvBVWrXGa1;gdV`}lo^7o{AKn**SKB|@EQ2rLp z&J7i;@+YJ+D6mgmBi=?m;~GcwDMXAMbF__`Wb$kqx}8!-ALx*Kj!<_%x8oZ9yGqzc zl`{0x<3fXY0s2)kvic)=>dT;u0n-ma7!rLOF}|TP(yCbHs};A#9cXkekekGRP1A;E zp>5dW#m&WAPA;-@F?Mjm#Mv)JR`~jq+U2m}b6G>mo&W*7QgQ%Bzv}G9# zQc6G!Yj^k^z9wF*FRpRXxZ9)E%^m~He5LgNXueWh*&LNI)jidUpXU1iv0^>fmsb2# ztyte<^3QNDeUOfEy}F|1A0EmuO{0@A!AGsuwQ0s!+u`f$wyLF^!A(lJ088ffY|%>x zTUmC5q=1pX0_pHB>Y$%dld1yw3nGMg<@O&C7Z7=$$n}DXHkv4DLw(r)W_RefzG$yR@opp+ja$T4NoSrF`@d%?=e-z-b=G7+g%c0KYO_zU}kvV5ZY PqC9Pi?1pG)tMB{|p4?;R literal 0 HcmV?d00001 diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/spec_utils.cpython-39.pyc b/lib/infer/infer_libs/uvr5_pack/lib_v5/__pycache__/spec_utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b523b9206e99d2703ff6fd73d2e74283d2d7ac1c GIT binary patch literal 13690 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 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123812KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123812KB.py new file mode 100644 index 000000000..167d4cb21 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123812KB.py @@ -0,0 +1,122 @@ +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_123821KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 32) + self.stg1_high_band_net = BaseASPPNet(2, 32) + + self.stg2_bridge = layers.Conv2DBNActiv(34, 16, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(16, 32) + + self.stg3_bridge = layers.Conv2DBNActiv(66, 32, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(32, 64) + + self.out = nn.Conv2d(64, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(32, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(32, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123821KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123821KB.py new file mode 100644 index 000000000..167d4cb21 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_123821KB.py @@ -0,0 +1,122 @@ +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_123821KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 32) + self.stg1_high_band_net = BaseASPPNet(2, 32) + + self.stg2_bridge = layers.Conv2DBNActiv(34, 16, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(16, 32) + + self.stg3_bridge = layers.Conv2DBNActiv(66, 32, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(32, 64) + + self.out = nn.Conv2d(64, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(32, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(32, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_33966KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_33966KB.py new file mode 100644 index 000000000..73a5b8361 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_33966KB.py @@ -0,0 +1,122 @@ +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_33966KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16, 32)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 16) + self.stg1_high_band_net = BaseASPPNet(2, 16) + + self.stg2_bridge = layers.Conv2DBNActiv(18, 8, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(8, 16) + + self.stg3_bridge = layers.Conv2DBNActiv(34, 16, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(16, 32) + + self.out = nn.Conv2d(32, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(16, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(16, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537227KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537227KB.py new file mode 100644 index 000000000..823b44fb6 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537227KB.py @@ -0,0 +1,123 @@ +import numpy as np +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_537238KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 64) + self.stg1_high_band_net = BaseASPPNet(2, 64) + + self.stg2_bridge = layers.Conv2DBNActiv(66, 32, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(32, 64) + + self.stg3_bridge = layers.Conv2DBNActiv(130, 64, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(64, 128) + + self.out = nn.Conv2d(128, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(64, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(64, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537238KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537238KB.py new file mode 100644 index 000000000..823b44fb6 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_537238KB.py @@ -0,0 +1,123 @@ +import numpy as np +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_537238KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 64) + self.stg1_high_band_net = BaseASPPNet(2, 64) + + self.stg2_bridge = layers.Conv2DBNActiv(66, 32, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(32, 64) + + self.stg3_bridge = layers.Conv2DBNActiv(130, 64, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(64, 128) + + self.out = nn.Conv2d(128, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(64, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(64, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_61968KB.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_61968KB.py new file mode 100644 index 000000000..167d4cb21 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_61968KB.py @@ -0,0 +1,122 @@ +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_123821KB as layers + + +class BaseASPPNet(nn.Module): + def __init__(self, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + self.aspp = layers.ASPPModule(ch * 8, ch * 16, dilations) + + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, x): + h, e1 = self.enc1(x) + h, e2 = self.enc2(h) + h, e3 = self.enc3(h) + h, e4 = self.enc4(h) + + h = self.aspp(h) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = self.dec1(h, e1) + + return h + + +class CascadedASPPNet(nn.Module): + def __init__(self, n_fft): + super(CascadedASPPNet, self).__init__() + self.stg1_low_band_net = BaseASPPNet(2, 32) + self.stg1_high_band_net = BaseASPPNet(2, 32) + + self.stg2_bridge = layers.Conv2DBNActiv(34, 16, 1, 1, 0) + self.stg2_full_band_net = BaseASPPNet(16, 32) + + self.stg3_bridge = layers.Conv2DBNActiv(66, 32, 1, 1, 0) + self.stg3_full_band_net = BaseASPPNet(32, 64) + + self.out = nn.Conv2d(64, 2, 1, bias=False) + self.aux1_out = nn.Conv2d(32, 2, 1, bias=False) + self.aux2_out = nn.Conv2d(32, 2, 1, bias=False) + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, x, aggressiveness=None): + mix = x.detach() + x = x.clone() + + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + aux1 = torch.cat( + [ + self.stg1_low_band_net(x[:, :, :bandw]), + self.stg1_high_band_net(x[:, :, bandw:]), + ], + dim=2, + ) + + h = torch.cat([x, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(h)) + + h = torch.cat([x, aux1, aux2], dim=1) + h = self.stg3_full_band_net(self.stg3_bridge(h)) + + mask = torch.sigmoid(self.out(h)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad( + input=aux1, + pad=(0, 0, 0, self.output_bin - aux1.size()[2]), + mode="replicate", + ) + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad( + input=aux2, + pad=(0, 0, 0, self.output_bin - aux2.size()[2]), + mode="replicate", + ) + return mask * mix, aux1 * mix, aux2 * mix + else: + if aggressiveness: + mask[:, :, : aggressiveness["split_bin"]] = torch.pow( + mask[:, :, : aggressiveness["split_bin"]], + 1 + aggressiveness["value"] / 3, + ) + mask[:, :, aggressiveness["split_bin"] :] = torch.pow( + mask[:, :, aggressiveness["split_bin"] :], + 1 + aggressiveness["value"], + ) + + return mask * mix + + def predict(self, x_mag, aggressiveness=None): + h = self.forward(x_mag, aggressiveness) + + if self.offset > 0: + h = h[:, :, :, self.offset : -self.offset] + assert h.size()[3] > 0 + + return h diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_new.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_new.py new file mode 100644 index 000000000..1c0f4fa96 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/nets_new.py @@ -0,0 +1,133 @@ +import torch +import torch.nn.functional as F +from torch import nn + +from . import layers_new + + +class BaseNet(nn.Module): + def __init__( + self, nin, nout, nin_lstm, nout_lstm, dilations=((4, 2), (8, 4), (12, 6)) + ): + super(BaseNet, self).__init__() + self.enc1 = layers_new.Conv2DBNActiv(nin, nout, 3, 1, 1) + self.enc2 = layers_new.Encoder(nout, nout * 2, 3, 2, 1) + self.enc3 = layers_new.Encoder(nout * 2, nout * 4, 3, 2, 1) + self.enc4 = layers_new.Encoder(nout * 4, nout * 6, 3, 2, 1) + self.enc5 = layers_new.Encoder(nout * 6, nout * 8, 3, 2, 1) + + self.aspp = layers_new.ASPPModule(nout * 8, nout * 8, dilations, dropout=True) + + self.dec4 = layers_new.Decoder(nout * (6 + 8), nout * 6, 3, 1, 1) + self.dec3 = layers_new.Decoder(nout * (4 + 6), nout * 4, 3, 1, 1) + self.dec2 = layers_new.Decoder(nout * (2 + 4), nout * 2, 3, 1, 1) + self.lstm_dec2 = layers_new.LSTMModule(nout * 2, nin_lstm, nout_lstm) + self.dec1 = layers_new.Decoder(nout * (1 + 2) + 1, nout * 1, 3, 1, 1) + + def __call__(self, x): + e1 = self.enc1(x) + e2 = self.enc2(e1) + e3 = self.enc3(e2) + e4 = self.enc4(e3) + e5 = self.enc5(e4) + + h = self.aspp(e5) + + h = self.dec4(h, e4) + h = self.dec3(h, e3) + h = self.dec2(h, e2) + h = torch.cat([h, self.lstm_dec2(h)], dim=1) + h = self.dec1(h, e1) + + return h + + +class CascadedNet(nn.Module): + def __init__(self, n_fft, nout=32, nout_lstm=128): + super(CascadedNet, self).__init__() + + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + self.nin_lstm = self.max_bin // 2 + self.offset = 64 + + self.stg1_low_band_net = nn.Sequential( + BaseNet(2, nout // 2, self.nin_lstm // 2, nout_lstm), + layers_new.Conv2DBNActiv(nout // 2, nout // 4, 1, 1, 0), + ) + + self.stg1_high_band_net = BaseNet( + 2, nout // 4, self.nin_lstm // 2, nout_lstm // 2 + ) + + self.stg2_low_band_net = nn.Sequential( + BaseNet(nout // 4 + 2, nout, self.nin_lstm // 2, nout_lstm), + layers_new.Conv2DBNActiv(nout, nout // 2, 1, 1, 0), + ) + self.stg2_high_band_net = BaseNet( + nout // 4 + 2, nout // 2, self.nin_lstm // 2, nout_lstm // 2 + ) + + self.stg3_full_band_net = BaseNet( + 3 * nout // 4 + 2, nout, self.nin_lstm, nout_lstm + ) + + self.out = nn.Conv2d(nout, 2, 1, bias=False) + self.aux_out = nn.Conv2d(3 * nout // 4, 2, 1, bias=False) + + def forward(self, x): + x = x[:, :, : self.max_bin] + + bandw = x.size()[2] // 2 + l1_in = x[:, :, :bandw] + h1_in = x[:, :, bandw:] + l1 = self.stg1_low_band_net(l1_in) + h1 = self.stg1_high_band_net(h1_in) + aux1 = torch.cat([l1, h1], dim=2) + + l2_in = torch.cat([l1_in, l1], dim=1) + h2_in = torch.cat([h1_in, h1], dim=1) + l2 = self.stg2_low_band_net(l2_in) + h2 = self.stg2_high_band_net(h2_in) + aux2 = torch.cat([l2, h2], dim=2) + + f3_in = torch.cat([x, aux1, aux2], dim=1) + f3 = self.stg3_full_band_net(f3_in) + + mask = torch.sigmoid(self.out(f3)) + mask = F.pad( + input=mask, + pad=(0, 0, 0, self.output_bin - mask.size()[2]), + mode="replicate", + ) + + if self.training: + aux = torch.cat([aux1, aux2], dim=1) + aux = torch.sigmoid(self.aux_out(aux)) + aux = F.pad( + input=aux, + pad=(0, 0, 0, self.output_bin - aux.size()[2]), + mode="replicate", + ) + return mask, aux + else: + return mask + + def predict_mask(self, x): + mask = self.forward(x) + + if self.offset > 0: + mask = mask[:, :, :, self.offset : -self.offset] + assert mask.size()[3] > 0 + + return mask + + def predict(self, x, aggressiveness=None): + mask = self.forward(x) + pred_mag = x * mask + + if self.offset > 0: + pred_mag = pred_mag[:, :, :, self.offset : -self.offset] + assert pred_mag.size()[3] > 0 + + return pred_mag diff --git a/lib/infer/infer_libs/uvr5_pack/lib_v5/spec_utils.py b/lib/infer/infer_libs/uvr5_pack/lib_v5/spec_utils.py new file mode 100644 index 000000000..a9634fd51 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/lib_v5/spec_utils.py @@ -0,0 +1,672 @@ +import hashlib +import json +import math +import os + +import librosa +import numpy as np +import soundfile as sf +from tqdm import tqdm + + +def crop_center(h1, h2): + h1_shape = h1.size() + h2_shape = h2.size() + + if h1_shape[3] == h2_shape[3]: + return h1 + elif h1_shape[3] < h2_shape[3]: + raise ValueError("h1_shape[3] must be greater than h2_shape[3]") + + # s_freq = (h2_shape[2] - h1_shape[2]) // 2 + # e_freq = s_freq + h1_shape[2] + s_time = (h1_shape[3] - h2_shape[3]) // 2 + e_time = s_time + h2_shape[3] + h1 = h1[:, :, :, s_time:e_time] + + return h1 + + +def wave_to_spectrogram( + wave, hop_length, n_fft, mid_side=False, mid_side_b2=False, reverse=False +): + if reverse: + wave_left = np.flip(np.asfortranarray(wave[0])) + wave_right = np.flip(np.asfortranarray(wave[1])) + elif mid_side: + wave_left = np.asfortranarray(np.add(wave[0], wave[1]) / 2) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1])) + elif mid_side_b2: + wave_left = np.asfortranarray(np.add(wave[1], wave[0] * 0.5)) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1] * 0.5)) + else: + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + + spec_left = librosa.stft(wave_left, n_fft, hop_length=hop_length) + spec_right = librosa.stft(wave_right, n_fft, hop_length=hop_length) + + spec = np.asfortranarray([spec_left, spec_right]) + + return spec + + +def wave_to_spectrogram_mt( + wave, hop_length, n_fft, mid_side=False, mid_side_b2=False, reverse=False +): + import threading + + if reverse: + wave_left = np.flip(np.asfortranarray(wave[0])) + wave_right = np.flip(np.asfortranarray(wave[1])) + elif mid_side: + wave_left = np.asfortranarray(np.add(wave[0], wave[1]) / 2) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1])) + elif mid_side_b2: + wave_left = np.asfortranarray(np.add(wave[1], wave[0] * 0.5)) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1] * 0.5)) + else: + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + + def run_thread(**kwargs): + global spec_left + spec_left = librosa.stft(**kwargs) + + thread = threading.Thread( + target=run_thread, + kwargs={"y": wave_left, "n_fft": n_fft, "hop_length": hop_length}, + ) + thread.start() + spec_right = librosa.stft(wave_right, n_fft, hop_length=hop_length) + thread.join() + + spec = np.asfortranarray([spec_left, spec_right]) + + return spec + + +def combine_spectrograms(specs, mp): + l = min([specs[i].shape[2] for i in specs]) + spec_c = np.zeros(shape=(2, mp.param["bins"] + 1, l), dtype=np.complex64) + offset = 0 + bands_n = len(mp.param["band"]) + + for d in range(1, bands_n + 1): + h = mp.param["band"][d]["crop_stop"] - mp.param["band"][d]["crop_start"] + spec_c[:, offset : offset + h, :l] = specs[d][ + :, mp.param["band"][d]["crop_start"] : mp.param["band"][d]["crop_stop"], :l + ] + offset += h + + if offset > mp.param["bins"]: + raise ValueError("Too much bins") + + # lowpass fiter + if ( + mp.param["pre_filter_start"] > 0 + ): # and mp.param['band'][bands_n]['res_type'] in ['scipy', 'polyphase']: + if bands_n == 1: + spec_c = fft_lp_filter( + spec_c, mp.param["pre_filter_start"], mp.param["pre_filter_stop"] + ) + else: + gp = 1 + for b in range( + mp.param["pre_filter_start"] + 1, mp.param["pre_filter_stop"] + ): + g = math.pow( + 10, -(b - mp.param["pre_filter_start"]) * (3.5 - gp) / 20.0 + ) + gp = g + spec_c[:, b, :] *= g + + return np.asfortranarray(spec_c) + + +def spectrogram_to_image(spec, mode="magnitude"): + if mode == "magnitude": + if np.iscomplexobj(spec): + y = np.abs(spec) + else: + y = spec + y = np.log10(y**2 + 1e-8) + elif mode == "phase": + if np.iscomplexobj(spec): + y = np.angle(spec) + else: + y = spec + + y -= y.min() + y *= 255 / y.max() + img = np.uint8(y) + + if y.ndim == 3: + img = img.transpose(1, 2, 0) + img = np.concatenate([np.max(img, axis=2, keepdims=True), img], axis=2) + + return img + + +def reduce_vocal_aggressively(X, y, softmask): + v = X - y + y_mag_tmp = np.abs(y) + v_mag_tmp = np.abs(v) + + v_mask = v_mag_tmp > y_mag_tmp + y_mag = np.clip(y_mag_tmp - v_mag_tmp * v_mask * softmask, 0, np.inf) + + return y_mag * np.exp(1.0j * np.angle(y)) + + +def mask_silence(mag, ref, thres=0.2, min_range=64, fade_size=32): + if min_range < fade_size * 2: + raise ValueError("min_range must be >= fade_area * 2") + + mag = mag.copy() + + idx = np.where(ref.mean(axis=(0, 1)) < thres)[0] + starts = np.insert(idx[np.where(np.diff(idx) != 1)[0] + 1], 0, idx[0]) + ends = np.append(idx[np.where(np.diff(idx) != 1)[0]], idx[-1]) + uninformative = np.where(ends - starts > min_range)[0] + if len(uninformative) > 0: + starts = starts[uninformative] + ends = ends[uninformative] + old_e = None + for s, e in zip(starts, ends): + if old_e is not None and s - old_e < fade_size: + s = old_e - fade_size * 2 + + if s != 0: + weight = np.linspace(0, 1, fade_size) + mag[:, :, s : s + fade_size] += weight * ref[:, :, s : s + fade_size] + else: + s -= fade_size + + if e != mag.shape[2]: + weight = np.linspace(1, 0, fade_size) + mag[:, :, e - fade_size : e] += weight * ref[:, :, e - fade_size : e] + else: + e += fade_size + + mag[:, :, s + fade_size : e - fade_size] += ref[ + :, :, s + fade_size : e - fade_size + ] + old_e = e + + return mag + + +def align_wave_head_and_tail(a, b): + l = min([a[0].size, b[0].size]) + + return a[:l, :l], b[:l, :l] + + +def cache_or_load(mix_path, inst_path, mp): + mix_basename = os.path.splitext(os.path.basename(mix_path))[0] + inst_basename = os.path.splitext(os.path.basename(inst_path))[0] + + cache_dir = "mph{}".format( + hashlib.sha1(json.dumps(mp.param, sort_keys=True).encode("utf-8")).hexdigest() + ) + mix_cache_dir = os.path.join("cache", cache_dir) + inst_cache_dir = os.path.join("cache", cache_dir) + + os.makedirs(mix_cache_dir, exist_ok=True) + os.makedirs(inst_cache_dir, exist_ok=True) + + mix_cache_path = os.path.join(mix_cache_dir, mix_basename + ".npy") + inst_cache_path = os.path.join(inst_cache_dir, inst_basename + ".npy") + + if os.path.exists(mix_cache_path) and os.path.exists(inst_cache_path): + X_spec_m = np.load(mix_cache_path) + y_spec_m = np.load(inst_cache_path) + else: + X_wave, y_wave, X_spec_s, y_spec_s = {}, {}, {}, {} + + for d in range(len(mp.param["band"]), 0, -1): + bp = mp.param["band"][d] + + if d == len(mp.param["band"]): # high-end band + X_wave[d], _ = librosa.load( + mix_path, bp["sr"], False, dtype=np.float32, res_type=bp["res_type"] + ) + y_wave[d], _ = librosa.load( + inst_path, + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + else: # lower bands + X_wave[d] = librosa.resample( + X_wave[d + 1], + mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + y_wave[d] = librosa.resample( + y_wave[d + 1], + mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + + X_wave[d], y_wave[d] = align_wave_head_and_tail(X_wave[d], y_wave[d]) + + X_spec_s[d] = wave_to_spectrogram( + X_wave[d], + bp["hl"], + bp["n_fft"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ) + y_spec_s[d] = wave_to_spectrogram( + y_wave[d], + bp["hl"], + bp["n_fft"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ) + + del X_wave, y_wave + + X_spec_m = combine_spectrograms(X_spec_s, mp) + y_spec_m = combine_spectrograms(y_spec_s, mp) + + if X_spec_m.shape != y_spec_m.shape: + raise ValueError("The combined spectrograms are different: " + mix_path) + + _, ext = os.path.splitext(mix_path) + + np.save(mix_cache_path, X_spec_m) + np.save(inst_cache_path, y_spec_m) + + return X_spec_m, y_spec_m + + +def spectrogram_to_wave(spec, hop_length, mid_side, mid_side_b2, reverse): + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + + wave_left = librosa.istft(spec_left, hop_length=hop_length) + wave_right = librosa.istft(spec_right, hop_length=hop_length) + + if reverse: + return np.asfortranarray([np.flip(wave_left), np.flip(wave_right)]) + elif mid_side: + return np.asfortranarray( + [np.add(wave_left, wave_right / 2), np.subtract(wave_left, wave_right / 2)] + ) + elif mid_side_b2: + return np.asfortranarray( + [ + np.add(wave_right / 1.25, 0.4 * wave_left), + np.subtract(wave_left / 1.25, 0.4 * wave_right), + ] + ) + else: + return np.asfortranarray([wave_left, wave_right]) + + +def spectrogram_to_wave_mt(spec, hop_length, mid_side, reverse, mid_side_b2): + import threading + + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + + def run_thread(**kwargs): + global wave_left + wave_left = librosa.istft(**kwargs) + + thread = threading.Thread( + target=run_thread, kwargs={"stft_matrix": spec_left, "hop_length": hop_length} + ) + thread.start() + wave_right = librosa.istft(spec_right, hop_length=hop_length) + thread.join() + + if reverse: + return np.asfortranarray([np.flip(wave_left), np.flip(wave_right)]) + elif mid_side: + return np.asfortranarray( + [np.add(wave_left, wave_right / 2), np.subtract(wave_left, wave_right / 2)] + ) + elif mid_side_b2: + return np.asfortranarray( + [ + np.add(wave_right / 1.25, 0.4 * wave_left), + np.subtract(wave_left / 1.25, 0.4 * wave_right), + ] + ) + else: + return np.asfortranarray([wave_left, wave_right]) + + +def cmb_spectrogram_to_wave(spec_m, mp, extra_bins_h=None, extra_bins=None): + wave_band = {} + bands_n = len(mp.param["band"]) + offset = 0 + + for d in range(1, bands_n + 1): + bp = mp.param["band"][d] + spec_s = np.ndarray( + shape=(2, bp["n_fft"] // 2 + 1, spec_m.shape[2]), dtype=complex + ) + h = bp["crop_stop"] - bp["crop_start"] + spec_s[:, bp["crop_start"] : bp["crop_stop"], :] = spec_m[ + :, offset : offset + h, : + ] + + offset += h + if d == bands_n: # higher + if extra_bins_h: # if --high_end_process bypass + max_bin = bp["n_fft"] // 2 + spec_s[:, max_bin - extra_bins_h : max_bin, :] = extra_bins[ + :, :extra_bins_h, : + ] + if bp["hpf_start"] > 0: + spec_s = fft_hp_filter(spec_s, bp["hpf_start"], bp["hpf_stop"] - 1) + if bands_n == 1: + wave = spectrogram_to_wave( + spec_s, + bp["hl"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ) + else: + wave = np.add( + wave, + spectrogram_to_wave( + spec_s, + bp["hl"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ), + ) + else: + sr = mp.param["band"][d + 1]["sr"] + if d == 1: # lower + spec_s = fft_lp_filter(spec_s, bp["lpf_start"], bp["lpf_stop"]) + wave = librosa.resample( + spectrogram_to_wave( + spec_s, + bp["hl"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ), + bp["sr"], + sr, + res_type="sinc_fastest", + ) + else: # mid + spec_s = fft_hp_filter(spec_s, bp["hpf_start"], bp["hpf_stop"] - 1) + spec_s = fft_lp_filter(spec_s, bp["lpf_start"], bp["lpf_stop"]) + wave2 = np.add( + wave, + spectrogram_to_wave( + spec_s, + bp["hl"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ), + ) + # wave = librosa.core.resample(wave2, bp['sr'], sr, res_type="sinc_fastest") + wave = librosa.core.resample(wave2, bp["sr"], sr, res_type="scipy") + + return wave.T + + +def fft_lp_filter(spec, bin_start, bin_stop): + g = 1.0 + for b in range(bin_start, bin_stop): + g -= 1 / (bin_stop - bin_start) + spec[:, b, :] = g * spec[:, b, :] + + spec[:, bin_stop:, :] *= 0 + + return spec + + +def fft_hp_filter(spec, bin_start, bin_stop): + g = 1.0 + for b in range(bin_start, bin_stop, -1): + g -= 1 / (bin_start - bin_stop) + spec[:, b, :] = g * spec[:, b, :] + + spec[:, 0 : bin_stop + 1, :] *= 0 + + return spec + + +def mirroring(a, spec_m, input_high_end, mp): + if "mirroring" == a: + mirror = np.flip( + np.abs( + spec_m[ + :, + mp.param["pre_filter_start"] + - 10 + - input_high_end.shape[1] : mp.param["pre_filter_start"] + - 10, + :, + ] + ), + 1, + ) + mirror = mirror * np.exp(1.0j * np.angle(input_high_end)) + + return np.where( + np.abs(input_high_end) <= np.abs(mirror), input_high_end, mirror + ) + + if "mirroring2" == a: + mirror = np.flip( + np.abs( + spec_m[ + :, + mp.param["pre_filter_start"] + - 10 + - input_high_end.shape[1] : mp.param["pre_filter_start"] + - 10, + :, + ] + ), + 1, + ) + mi = np.multiply(mirror, input_high_end * 1.7) + + return np.where(np.abs(input_high_end) <= np.abs(mi), input_high_end, mi) + + +def ensembling(a, specs): + for i in range(1, len(specs)): + if i == 1: + spec = specs[0] + + ln = min([spec.shape[2], specs[i].shape[2]]) + spec = spec[:, :, :ln] + specs[i] = specs[i][:, :, :ln] + + if "min_mag" == a: + spec = np.where(np.abs(specs[i]) <= np.abs(spec), specs[i], spec) + if "max_mag" == a: + spec = np.where(np.abs(specs[i]) >= np.abs(spec), specs[i], spec) + + return spec + + +def stft(wave, nfft, hl): + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + spec_left = librosa.stft(wave_left, nfft, hop_length=hl) + spec_right = librosa.stft(wave_right, nfft, hop_length=hl) + spec = np.asfortranarray([spec_left, spec_right]) + + return spec + + +def istft(spec, hl): + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + + wave_left = librosa.istft(spec_left, hop_length=hl) + wave_right = librosa.istft(spec_right, hop_length=hl) + wave = np.asfortranarray([wave_left, wave_right]) + + +if __name__ == "__main__": + import argparse + import sys + import time + + import cv2 + from model_param_init import ModelParameters + + p = argparse.ArgumentParser() + p.add_argument( + "--algorithm", + "-a", + type=str, + choices=["invert", "invert_p", "min_mag", "max_mag", "deep", "align"], + default="min_mag", + ) + p.add_argument( + "--model_params", + "-m", + type=str, + default=os.path.join("modelparams", "1band_sr44100_hl512.json"), + ) + p.add_argument("--output_name", "-o", type=str, default="output") + p.add_argument("--vocals_only", "-v", action="store_true") + p.add_argument("input", nargs="+") + args = p.parse_args() + + start_time = time.time() + + if args.algorithm.startswith("invert") and len(args.input) != 2: + raise ValueError("There should be two input files.") + + if not args.algorithm.startswith("invert") and len(args.input) < 2: + raise ValueError("There must be at least two input files.") + + wave, specs = {}, {} + mp = ModelParameters(args.model_params) + + for i in range(len(args.input)): + spec = {} + + for d in range(len(mp.param["band"]), 0, -1): + bp = mp.param["band"][d] + + if d == len(mp.param["band"]): # high-end band + wave[d], _ = librosa.load( + args.input[i], + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + + if len(wave[d].shape) == 1: # mono to stereo + wave[d] = np.array([wave[d], wave[d]]) + else: # lower bands + wave[d] = librosa.resample( + wave[d + 1], + mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + + spec[d] = wave_to_spectrogram( + wave[d], + bp["hl"], + bp["n_fft"], + mp.param["mid_side"], + mp.param["mid_side_b2"], + mp.param["reverse"], + ) + + specs[i] = combine_spectrograms(spec, mp) + + del wave + + if args.algorithm == "deep": + d_spec = np.where(np.abs(specs[0]) <= np.abs(spec[1]), specs[0], spec[1]) + v_spec = d_spec - specs[1] + sf.write( + os.path.join("{}.wav".format(args.output_name)), + cmb_spectrogram_to_wave(v_spec, mp), + mp.param["sr"], + ) + + if args.algorithm.startswith("invert"): + ln = min([specs[0].shape[2], specs[1].shape[2]]) + specs[0] = specs[0][:, :, :ln] + specs[1] = specs[1][:, :, :ln] + + if "invert_p" == args.algorithm: + X_mag = np.abs(specs[0]) + y_mag = np.abs(specs[1]) + max_mag = np.where(X_mag >= y_mag, X_mag, y_mag) + v_spec = specs[1] - max_mag * np.exp(1.0j * np.angle(specs[0])) + else: + specs[1] = reduce_vocal_aggressively(specs[0], specs[1], 0.2) + v_spec = specs[0] - specs[1] + + if not args.vocals_only: + X_mag = np.abs(specs[0]) + y_mag = np.abs(specs[1]) + v_mag = np.abs(v_spec) + + X_image = spectrogram_to_image(X_mag) + y_image = spectrogram_to_image(y_mag) + v_image = spectrogram_to_image(v_mag) + + cv2.imwrite("{}_X.png".format(args.output_name), X_image) + cv2.imwrite("{}_y.png".format(args.output_name), y_image) + cv2.imwrite("{}_v.png".format(args.output_name), v_image) + + sf.write( + "{}_X.wav".format(args.output_name), + cmb_spectrogram_to_wave(specs[0], mp), + mp.param["sr"], + ) + sf.write( + "{}_y.wav".format(args.output_name), + cmb_spectrogram_to_wave(specs[1], mp), + mp.param["sr"], + ) + + sf.write( + "{}_v.wav".format(args.output_name), + cmb_spectrogram_to_wave(v_spec, mp), + mp.param["sr"], + ) + else: + if not args.algorithm == "deep": + sf.write( + os.path.join("ensembled", "{}.wav".format(args.output_name)), + cmb_spectrogram_to_wave(ensembling(args.algorithm, specs), mp), + mp.param["sr"], + ) + + if args.algorithm == "align": + trackalignment = [ + { + "file1": '"{}"'.format(args.input[0]), + "file2": '"{}"'.format(args.input[1]), + } + ] + + for i, e in tqdm(enumerate(trackalignment), desc="Performing Alignment..."): + os.system(f"python lib/align_tracks.py {e['file1']} {e['file2']}") + + # print('Total time: {0:.{1}f}s'.format(time.time() - start_time, 1)) diff --git a/lib/infer/infer_libs/uvr5_pack/mdx.py b/lib/infer/infer_libs/uvr5_pack/mdx.py new file mode 100644 index 000000000..4cc7c08b3 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/mdx.py @@ -0,0 +1,228 @@ +import torch +import onnxruntime as ort +from tqdm import tqdm +import warnings +import numpy as np +import hashlib +import queue +import threading + +warnings.filterwarnings("ignore") + +class MDX_Model: + def __init__(self, device, dim_f, dim_t, n_fft, hop=1024, stem_name=None, compensation=1.000): + self.dim_f = dim_f + self.dim_t = dim_t + self.dim_c = 4 + self.n_fft = n_fft + self.hop = hop + self.stem_name = stem_name + self.compensation = compensation + + self.n_bins = self.n_fft//2+1 + self.chunk_size = hop * (self.dim_t-1) + self.window = torch.hann_window(window_length=self.n_fft, periodic=True).to(device) + + out_c = self.dim_c + + self.freq_pad = torch.zeros([1, out_c, self.n_bins-self.dim_f, self.dim_t]).to(device) + + def stft(self, x): + x = x.reshape([-1, self.chunk_size]) + x = torch.stft(x, n_fft=self.n_fft, hop_length=self.hop, window=self.window, center=True, return_complex=True) + x = torch.view_as_real(x) + x = x.permute([0,3,1,2]) + x = x.reshape([-1,2,2,self.n_bins,self.dim_t]).reshape([-1,4,self.n_bins,self.dim_t]) + return x[:,:,:self.dim_f] + + def istft(self, x, freq_pad=None): + freq_pad = self.freq_pad.repeat([x.shape[0],1,1,1]) if freq_pad is None else freq_pad + x = torch.cat([x, freq_pad], -2) + # c = 4*2 if self.target_name=='*' else 2 + x = x.reshape([-1,2,2,self.n_bins,self.dim_t]).reshape([-1,2,self.n_bins,self.dim_t]) + x = x.permute([0,2,3,1]) + x = x.contiguous() + x = torch.view_as_complex(x) + x = torch.istft(x, n_fft=self.n_fft, hop_length=self.hop, window=self.window, center=True) + return x.reshape([-1,2,self.chunk_size]) + + +class MDX: + + DEFAULT_SR = 44100 + # Unit: seconds + DEFAULT_CHUNK_SIZE = 0 * DEFAULT_SR + DEFAULT_MARGIN_SIZE = 1 * DEFAULT_SR + + DEFAULT_PROCESSOR = 0 + + def __init__(self, model_path:str, params:MDX_Model, processor=DEFAULT_PROCESSOR): + + # Set the device and the provider (CPU or CUDA) + self.device = torch.device(f'cuda:{processor}') if processor >= 0 else torch.device('cpu') + self.provider = ['CUDAExecutionProvider'] if processor >= 0 else ['CPUExecutionProvider'] + + self.model = params + + # Load the ONNX model using ONNX Runtime + self.ort = ort.InferenceSession(model_path, providers=self.provider) + # Preload the model for faster performance + self.ort.run(None, {'input':torch.rand(1, 4, params.dim_f, params.dim_t).numpy()}) + self.process = lambda spec:self.ort.run(None, {'input': spec.cpu().numpy()})[0] + + self.prog = None + + @staticmethod + def get_hash(model_path): + try: + with open(model_path, 'rb') as f: + f.seek(- 10000 * 1024, 2) + model_hash = hashlib.md5(f.read()).hexdigest() + except: + model_hash = hashlib.md5(open(model_path,'rb').read()).hexdigest() + + return model_hash + + @staticmethod + def segment(wave, combine=True, chunk_size=DEFAULT_CHUNK_SIZE, margin_size=DEFAULT_MARGIN_SIZE): + """ + Segment or join segmented wave array + + Args: + wave: (np.array) Wave array to be segmented or joined + combine: (bool) If True, combines segmented wave array. If False, segments wave array. + chunk_size: (int) Size of each segment (in samples) + margin_size: (int) Size of margin between segments (in samples) + + Returns: + numpy array: Segmented or joined wave array + """ + + if combine: + processed_wave = None # Initializing as None instead of [] for later numpy array concatenation + for segment_count, segment in enumerate(wave): + start = 0 if segment_count == 0 else margin_size + end = None if segment_count == len(wave)-1 else -margin_size + if margin_size == 0: + end = None + if processed_wave is None: # Create array for first segment + processed_wave = segment[:, start:end] + else: # Concatenate to existing array for subsequent segments + processed_wave = np.concatenate((processed_wave, segment[:, start:end]), axis=-1) + + else: + processed_wave = [] + sample_count = wave.shape[-1] + + if chunk_size <= 0 or chunk_size > sample_count: + chunk_size = sample_count + + if margin_size > chunk_size: + margin_size = chunk_size + + for segment_count, skip in enumerate(range(0, sample_count, chunk_size)): + + margin = 0 if segment_count == 0 else margin_size + end = min(skip+chunk_size+margin_size, sample_count) + start = skip-margin + + cut = wave[:,start:end].copy() + processed_wave.append(cut) + + if end == sample_count: + break + + return processed_wave + + def pad_wave(self, wave): + """ + Pad the wave array to match the required chunk size + + Args: + wave: (np.array) Wave array to be padded + + Returns: + tuple: (padded_wave, pad, trim) + - padded_wave: Padded wave array + - pad: Number of samples that were padded + - trim: Number of samples that were trimmed + """ + n_sample = wave.shape[1] + trim = self.model.n_fft//2 + gen_size = self.model.chunk_size-2*trim + pad = gen_size - n_sample%gen_size + + # Padded wave + wave_p = np.concatenate((np.zeros((2,trim)), wave, np.zeros((2,pad)), np.zeros((2,trim))), 1) + + mix_waves = [] + for i in range(0, n_sample+pad, gen_size): + waves = np.array(wave_p[:, i:i+self.model.chunk_size]) + mix_waves.append(waves) + + mix_waves = torch.tensor(mix_waves, dtype=torch.float32).to(self.device) + + return mix_waves, pad, trim + + def _process_wave(self, mix_waves, trim, pad, q:queue.Queue, _id:int): + """ + Process each wave segment in a multi-threaded environment + + Args: + mix_waves: (torch.Tensor) Wave segments to be processed + trim: (int) Number of samples trimmed during padding + pad: (int) Number of samples padded during padding + q: (queue.Queue) Queue to hold the processed wave segments + _id: (int) Identifier of the processed wave segment + + Returns: + numpy array: Processed wave segment + """ + mix_waves = mix_waves.split(1) + with torch.no_grad(): + pw = [] + for mix_wave in mix_waves: + self.prog.update() + spec = self.model.stft(mix_wave) + processed_spec = torch.tensor(self.process(spec)) + processed_wav = self.model.istft(processed_spec.to(self.device)) + processed_wav = processed_wav[:,:,trim:-trim].transpose(0,1).reshape(2, -1).cpu().numpy() + pw.append(processed_wav) + processed_signal = np.concatenate(pw, axis=-1)[:, :-pad] + q.put({_id:processed_signal}) + return processed_signal + + def process_wave(self, wave:np.array, mt_threads=1): + """ + Process the wave array in a multi-threaded environment + + Args: + wave: (np.array) Wave array to be processed + mt_threads: (int) Number of threads to be used for processing + + Returns: + numpy array: Processed wave array + """ + self.prog = tqdm(total=0) + chunk = wave.shape[-1]//mt_threads + waves = self.segment(wave, False, chunk) + + # Create a queue to hold the processed wave segments + q = queue.Queue() + threads = [] + for c, batch in enumerate(waves): + mix_waves, pad, trim = self.pad_wave(batch) + self.prog.total = len(mix_waves)*mt_threads + thread = threading.Thread(target=self._process_wave, args=(mix_waves, trim, pad, q, c)) + thread.start() + threads.append(thread) + for thread in threads: + thread.join() + self.prog.close() + + processed_batches = [] + while not q.empty(): + processed_batches.append(q.get()) + processed_batches = [list(wave.values())[0] for wave in sorted(processed_batches, key=lambda d: list(d.keys())[0])] + assert len(processed_batches) == len(waves), 'Incomplete processed batches, please reduce batch size!' + return self.segment(processed_batches, True, chunk) \ No newline at end of file diff --git a/lib/infer/infer_libs/uvr5_pack/name_params.json b/lib/infer/infer_libs/uvr5_pack/name_params.json new file mode 100644 index 000000000..8ed51a683 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/name_params.json @@ -0,0 +1,263 @@ +{ + "equivalent" : [ + { + "model_hash_name" : [ + { + "hash_name": "47939caf0cfe52a0e81442b85b971dfd", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "4e4ecb9764c50a8c414fee6e10395bbe", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2.json", + "param_name": "4band_v2" + }, + { + "hash_name": "ca106edd563e034bde0bdec4bb7a4b36", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2.json", + "param_name": "4band_v2" + }, + { + "hash_name": "e60a1e84803ce4efc0a6551206cc4b71", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "a82f14e75892e55e994376edbf0c8435", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "6dd9eaa6f0420af9f1d403aaafa4cc06", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2_sn.json", + "param_name": "4band_v2_sn" + }, + { + "hash_name": "08611fb99bd59eaa79ad27c58d137727", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2_sn.json", + "param_name": "4band_v2_sn" + }, + { + "hash_name": "5c7bbca45a187e81abbbd351606164e5", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_msb2.json", + "param_name": "3band_44100_msb2" + }, + { + "hash_name": "d6b2cb685a058a091e5e7098192d3233", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_msb2.json", + "param_name": "3band_44100_msb2" + }, + { + "hash_name": "c1b9f38170a7c90e96f027992eb7c62b", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "c3448ec923fa0edf3d03a19e633faa53", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "68aa2c8093d0080704b200d140f59e54", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100.json", + "param_name": "3band_44100" + }, + { + "hash_name": "fdc83be5b798e4bd29fe00fe6600e147", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_mid.json", + "param_name": "3band_44100_mid.json" + }, + { + "hash_name": "2ce34bc92fd57f55db16b7a4def3d745", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_mid.json", + "param_name": "3band_44100_mid.json" + }, + { + "hash_name": "52fdca89576f06cf4340b74a4730ee5f", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100.json" + }, + { + "hash_name": "41191165b05d38fc77f072fa9e8e8a30", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100.json" + }, + { + "hash_name": "89e83b511ad474592689e562d5b1f80e", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/2band_32000.json", + "param_name": "2band_32000.json" + }, + { + "hash_name": "0b954da81d453b716b114d6d7c95177f", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/2band_32000.json", + "param_name": "2band_32000.json" + } + + ], + "v4 Models": [ + { + "hash_name": "6a00461c51c2920fd68937d4609ed6c8", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr16000_hl512.json", + "param_name": "1band_sr16000_hl512" + }, + { + "hash_name": "0ab504864d20f1bd378fe9c81ef37140", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json", + "param_name": "1band_sr32000_hl512" + }, + { + "hash_name": "7dd21065bf91c10f7fccb57d7d83b07f", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json", + "param_name": "1band_sr32000_hl512" + }, + { + "hash_name": "80ab74d65e515caa3622728d2de07d23", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json", + "param_name": "1band_sr32000_hl512" + }, + { + "hash_name": "edc115e7fc523245062200c00caa847f", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr33075_hl384.json", + "param_name": "1band_sr33075_hl384" + }, + { + "hash_name": "28063e9f6ab5b341c5f6d3c67f2045b7", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr33075_hl384.json", + "param_name": "1band_sr33075_hl384" + }, + { + "hash_name": "b58090534c52cbc3e9b5104bad666ef2", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512.json", + "param_name": "1band_sr44100_hl512" + }, + { + "hash_name": "0cdab9947f1b0928705f518f3c78ea8f", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512.json", + "param_name": "1band_sr44100_hl512" + }, + { + "hash_name": "ae702fed0238afb5346db8356fe25f13", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl1024.json", + "param_name": "1band_sr44100_hl1024" + } + ] + } + ], + "User Models" : [ + { + "1 Band": [ + { + "hash_name": "1band_sr16000_hl512", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr16000_hl512.json", + "param_name": "1band_sr16000_hl512" + }, + { + "hash_name": "1band_sr32000_hl512", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr32000_hl512.json", + "param_name": "1band_sr16000_hl512" + }, + { + "hash_name": "1band_sr33075_hl384", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr33075_hl384.json", + "param_name": "1band_sr33075_hl384" + }, + { + "hash_name": "1band_sr44100_hl256", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl256.json", + "param_name": "1band_sr44100_hl256" + }, + { + "hash_name": "1band_sr44100_hl512", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl512.json", + "param_name": "1band_sr44100_hl512" + }, + { + "hash_name": "1band_sr44100_hl1024", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/1band_sr44100_hl1024.json", + "param_name": "1band_sr44100_hl1024" + } + ], + "2 Band": [ + { + "hash_name": "2band_44100_lofi", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/2band_44100_lofi.json", + "param_name": "2band_44100_lofi" + }, + { + "hash_name": "2band_32000", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/2band_32000.json", + "param_name": "2band_32000" + }, + { + "hash_name": "2band_48000", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/2band_48000.json", + "param_name": "2band_48000" + } + ], + "3 Band": [ + { + "hash_name": "3band_44100", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100.json", + "param_name": "3band_44100" + }, + { + "hash_name": "3band_44100_mid", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_mid.json", + "param_name": "3band_44100_mid" + }, + { + "hash_name": "3band_44100_msb2", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/3band_44100_msb2.json", + "param_name": "3band_44100_msb2" + } + ], + "4 Band": [ + { + "hash_name": "4band_44100", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100.json", + "param_name": "4band_44100" + }, + { + "hash_name": "4band_44100_mid", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100_mid.json", + "param_name": "4band_44100_mid" + }, + { + "hash_name": "4band_44100_msb", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100_msb.json", + "param_name": "4band_44100_msb" + }, + { + "hash_name": "4band_44100_msb2", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100_msb2.json", + "param_name": "4band_44100_msb2" + }, + { + "hash_name": "4band_44100_reverse", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100_reverse.json", + "param_name": "4band_44100_reverse" + }, + { + "hash_name": "4band_44100_sw", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_44100_sw.json", + "param_name": "4band_44100_sw" + }, + { + "hash_name": "4band_v2", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2.json", + "param_name": "4band_v2" + }, + { + "hash_name": "4band_v2_sn", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2_sn.json", + "param_name": "4band_v2_sn" + }, + { + "hash_name": "tmodelparam", + "model_params": "infer/lib/uvr5_pack/lib_v5/modelparams/tmodelparam.json", + "param_name": "User Model Param Set" + } + ] + } + ] +} \ No newline at end of file diff --git a/lib/infer/infer_libs/uvr5_pack/utils.py b/lib/infer/infer_libs/uvr5_pack/utils.py new file mode 100644 index 000000000..f4805cdb2 --- /dev/null +++ b/lib/infer/infer_libs/uvr5_pack/utils.py @@ -0,0 +1,121 @@ +import json + +import numpy as np +import torch +from tqdm import tqdm + + +def load_data(file_name: str = "./infer/lib/uvr5_pack/name_params.json") -> dict: + with open(file_name, "r") as f: + data = json.load(f) + + return data + + +def make_padding(width, cropsize, offset): + left = offset + roi_size = cropsize - left * 2 + if roi_size == 0: + roi_size = cropsize + right = roi_size - (width % roi_size) + left + + return left, right, roi_size + + +def inference(X_spec, device, model, aggressiveness, data): + """ + data : dic configs + """ + + def _execute( + X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half=True + ): + model.eval() + with torch.no_grad(): + preds = [] + + iterations = [n_window] + + total_iterations = sum(iterations) + for i in tqdm(range(n_window)): + start = i * roi_size + X_mag_window = X_mag_pad[ + None, :, :, start : start + data["window_size"] + ] + X_mag_window = torch.from_numpy(X_mag_window) + if is_half: + X_mag_window = X_mag_window.half() + X_mag_window = X_mag_window.to(device) + + pred = model.predict(X_mag_window, aggressiveness) + + pred = pred.detach().cpu().numpy() + preds.append(pred[0]) + + pred = np.concatenate(preds, axis=2) + return pred + + def preprocess(X_spec): + X_mag = np.abs(X_spec) + X_phase = np.angle(X_spec) + + return X_mag, X_phase + + X_mag, X_phase = preprocess(X_spec) + + coef = X_mag.max() + X_mag_pre = X_mag / coef + + n_frame = X_mag_pre.shape[2] + pad_l, pad_r, roi_size = make_padding(n_frame, data["window_size"], model.offset) + n_window = int(np.ceil(n_frame / roi_size)) + + X_mag_pad = np.pad(X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") + + if list(model.state_dict().values())[0].dtype == torch.float16: + is_half = True + else: + is_half = False + pred = _execute( + X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half + ) + pred = pred[:, :, :n_frame] + + if data["tta"]: + pad_l += roi_size // 2 + pad_r += roi_size // 2 + n_window += 1 + + X_mag_pad = np.pad(X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") + + pred_tta = _execute( + X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half + ) + pred_tta = pred_tta[:, :, roi_size // 2 :] + pred_tta = pred_tta[:, :, :n_frame] + + return (pred + pred_tta) * 0.5 * coef, X_mag, np.exp(1.0j * X_phase) + else: + return pred * coef, X_mag, np.exp(1.0j * X_phase) + + +def _get_name_params(model_path, model_hash): + data = load_data() + flag = False + ModelName = model_path + for type in list(data): + for model in list(data[type][0]): + for i in range(len(data[type][0][model])): + if str(data[type][0][model][i]["hash_name"]) == model_hash: + flag = True + elif str(data[type][0][model][i]["hash_name"]) in ModelName: + flag = True + + if flag: + model_params_auto = data[type][0][model][i]["model_params"] + param_name_auto = data[type][0][model][i]["param_name"] + if type == "equivalent": + return param_name_auto, model_params_auto + else: + flag = False + return param_name_auto, model_params_auto diff --git a/lib/infer/infer_pack/__pycache__/attentions.cpython-39.pyc b/lib/infer/infer_pack/__pycache__/attentions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8480fc3c96f753dd211c053e9a71a58807c9418 GIT binary patch literal 9963 zcmbVSYi}Iad7d-3y`l%?+hoWeK7Wx5gg9MQJyywi$ zUbu3U%yQ10+nhO<_dM_OzK3q5Qq*w$&!OS}^=CEhKPfSJnMiydcl3P(p60PY+fYxo z!DL$BFyzzRF!9s_vukZwjOrMH-OX*}W!wx3-Qq@3#x2B48zmXHgL1dBQDNE_H81Do z-`BjnZ|zp^8XGm_6ucsGifK+AIVG=*oN}78fSig~MNT!%X?W}%tyQ~^-fHVDCiE~w zSlsG|?YPqm-2kavyVvdZ!ib{Xp4Sh2iWc5-4}HGgK3Gwo=hFB$w zRkK(vi`CKthfaIP4MRVOL~W}R#6BNqBPXi%_7!4d^D5wg3&-n;Gc?MSfB zJxHeGv;#Ma9Os_)qs^;VZhj@gNN;vs-u7=^>)j569_HZYYy0~_rt9T3u`^T zcj3BEQh4EY-|fept;3r^XY*z!-14~!oqe~xcN3#m-Hk5pAMzUdQNKclDXN zx#_yMo*sQMAxJUS?~@GOe~7D<7lnQp-Rk@Pz~`&TR*SeyvC|ZsrC^1Ea|l{CZ{i`? z9bw;bx^A>53R2!E%70!K9r9nqQw0PwBDdA!5CZR4kcg;JjV-Y}tFi_rzoFL=QhHDu zO>J7gWpF|lUZ8+*<(^G@Ds;O(_Egbv6yzaZcAQ&%H&7*V(fLKx7nM}r+I|o?&P2aH zMNLxYcn(1YcSIk^=Kxhq`(gEYng5vZS&;B)dA5X4iTxAsS;S_Qg3HIFS-a7uL5(ij zEu%X+4Uqj=a5KpRCkt_LSW3~ejCe(&XElq}vRFNfEo8Aq7Fz^Hju7?zqaxzf;i>qv zl1)O?Bo9mlN=r9U?&! zB`W*8cc;^J181}2MiWT_Tu$qGqou2=cH8Yo(3WR80f7>ZPsXj6sNQENpnbwmQ6Tri z8N@`Lkk5G}$i5&Ne%SW>_GFcrU8FYJ6V&dL6cB3grx3JCa(n#*TpjoC=jcV+bzBOx z+;>u{3HRQ{9c>`c$}_mf>gN130K|K}iF&Yy3jV_Y$ z3=RJci5P4ENT?Gc9y8z_+cj}pkP*T#b7-enX?upmN_&J{F}T5QUSj1(M-(q4xfClc zU?pT9tRWAqL~OT|mgO_7ET=hO11D-%PSmcZIfSg!E!U>&-nusGpF~!3@Jg|nUU#lE zAq2#lnw@aJA7=$SSDFwISpWtxS;C*e6y4K>?fD0twl6F%J_L{WCFHj1oT!_qMg7gl z2V94-LSK`ZhtT65e+A{7AeOf%7-Koea4Nr_qu3P+W>CGL#O_%tdJchLJHp;kU#O1d zUE+OxQoJ+R=NIVRY2cR_{B`6Kgn>KylUd|9PJ=t_ z>CwuY+V2r7cuWSZG(iF$>=Zp>&n3KTtWc~RSB6!j7`OA?#-esqLS5*L;hCg}n&uMt&lzIiWqi4`q{%jx zAEVCMxU#!4Jcl=HyQ`#0vUGhWy`a)b0e$)-eEErE?GHXJH56(NpB%SGL3c_QtwP6u#_o5GNQN!U9^fcO>KYLQ(L$n+}Ja0V+3&9te{Zsi@s?4>~YY z`e6rKvg-)@w%^&_iA65#IosUzgw^itA3DM$HQXvI82JJXag73L6=WmkU!=S@C>Rg0 zlo~$N1yQ7aL@{iogLxY5dw4aXjZPY^u1|4!#p`wCr@u1d#P3aZn&}Vqhqjr;fJF4O zQQBaGb0ozP?16zmA}l8-ulAZGN6AvRi`f z33f0Kf&Ud1Br<9kFMj$mW@fN5XVfX|wn=A?E?PnwxE%BkA^zLara9KWi|#Ai=3DH# zcGEnvj_jix^d-Yoki`O99}|#2HixE1ctgY2r^<2@Wx$R{mKm`%1QUpJL(=YG2Ir^` zrU$-wOzo1zUmz^v|3%Cci1}AD5{`x=u!{DX2dTlrOX+Mu$XLy}%>nZ*!niM90 z?zRG~Hz{3+;Sh=TdvH+v2Bqz;8+ZEw?bLV&?vGnMRxrNoZ2K{xmz)F#5bAqgC)|$s zJM`WPSQNeJ-0s9X<7#{UVI-azr}3cz=eV0uFX+dBqLHnVg%oD9-4 zgRf*Z2#k}jZJuxLoNor_o85P_{6pmLG_h4LA^UvO8<%iDo_uGrgeVd0a@r+)hXS%c z?wMmPC2a#?po!U8JwVM?xU;M#U06nhR;XnKP5a3A;F1Mza$VAn(cXgsiZ^g~y%{f|RN0AcKQ$sk%Q# z#DhBA)f5pwGT?qB6)kD`GR`<)?3&UgsffCs=D|ge_u#NRgZyO;yatMQ&*X8e4`IN^ z=Foy7Hnw$e9djEKOz~|fX-so2gn18hJ?DWye;}PaALv{9Sq(HH51BNTN>Nsxlp|Y# zszHzxq07S9cRgkME)duCc?>_VN340@Zz;P~EM^;f0wZk2rNt>UHQwPP1QSJSC9Sd) z1+ce4JY8x%MPkuVx$uUM^H%Vd2WXx5!R3B5zhrii_b{$!XpzZA*H~3wg8vi7G4MlY zD-Udoo>kz%;JJB={|I%{Cc|KK5(86Oq7stDKUEnvGsel)cR7y`0rC0 zArSwFf-MC1@?-cC)}|Yiy(H~5{!J7M22<#cvjv?ma(H%d95=hlUDW#=t@08gaDM2| z8p~MWCY))j>`7YPEAv)2ldO>(&SeBA7MqMLx!8Y$$WOP}*@Dek@I@@RDyRMbNeho! z5TJD5PcFJ#@RN%z7amLhcndwbl+&7MRs?1intvPf!M{VnjB~1wymeY1at71-nCxk+ zN>l#@cA3pzo5v$ZQ)@$Fm0>Uu%UIjRmO_Xv2MVu4MHvaXS4J@?D4?uC`RQ%qX@T0q z(kx-?9Lw5-o`ZjSorv>EZrzM~(#hE8?)D@vM|L{^rEQLcE4r9%tk-Z#cO^?Tn+hAR zG~Eym%-G+CBQpZSa{2g`>wetl;nZ7h^M)TrU=T!in-Zm)Ujv)KpK5UQ9PiB*Q*O&_ z^g^-^!I3;i6m*c zI$LJ*aW$h?)9f0(p#@yOvA(v}VldX%TNVBSa`+_*E>l46cIoZp#1lEu8cwR56V!7; z0#4$_sW1FR3dX|tDM~&~0Wp^E;*Kbiw^Q#E9Z3Ce^`&C5_+q|*Un74iUzc^;s5W(x zu+bHL20`Z7EYCaL_wrr=PD;xwdL=w<>8vEIt;mB2HRQFa(|yt@HKo4^r8HzjEZBc+j}MZGb^G0RLVvPB4qu`bMQKj?4g zf3UjYz5L@>F$I5tPxC*cKn_>#;9S(%?)EyKFrn7^>JaVwr~-4LNj0CP;5iD$`$2An zi^%(sCZ>uA9T($>7+xznC?1q(Dn_oVNzy~Yna#u-NJw@|qlU}-oiqh(1%4ipDFBkA zLZUaMyNLgeXc0NN75$Op9aGeMmXa%Cr!&+6MNP`3VF?Qow+B1A4_NBoWNh^xIr85KyRu|67m~fqrlh S;ItM$qw#9vtBv2)zV!d0A}iJa literal 0 HcmV?d00001 diff --git a/lib/infer/infer_pack/__pycache__/commons.cpython-39.pyc b/lib/infer/infer_pack/__pycache__/commons.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb28013b97dbd99fce04b9dc231b213afc7f342f GIT binary patch literal 5899 zcmcgwNpBp-74GWp>FF6RqDV@jB}E!L)-sAj@0-FXm5=dp)Fb=|pFlmzkMc>>WBf%v&5vQ` zIDd&B=O@rQ!e8by{3*01_$&N0{}Nh9`K$a4Ka18Re~s7p(`ZfcXZV+~$8=z=9a}rj zpXKN789Qw81V7(<=LLQd<1_qqUgwvv;wkx!E;IYIv))pzIrIa_7-w{OXRXcwQs&rSv@IdS2qk0b2G-m~iFX z4Z`MXrflwKzA7iFi2cZ`+ls}?jsrhYmdv=S==HSnp&=%5nlFBECILv3e#S7<-HGYTzNYc>sQ_j8YvI1ycPKEEL_=Iio)fkFj)zN*YX?d zON}&+(?rg;w$x~tgqc?yOuEFsgTi1g8)pKxWjtai8YU5YKWdZow6thS26^Rd8qW-D z?G&^JxtI%&Xd?7rg-KR7)yR4vk|6SAxE&~$hmlXZ(F_*F6sD_@W{}~KoQFws90aM~ z%*08w8+4StAJO|dtD%#V732N)t*49*G{&uaIMGd@Zq++wGXS`EzSybi=+?s6wCgp{2~(=T%v@m!nWZpJ5in!;DntXbh5W&6AA& zjmP-nTmzO82+g4YNdfFQ&?VUrv zLCo#_N@$RFwc@U$kz0kzW{i%V+ni;_E(Axa>@uj-ggUJ$!B#mGO8%qs=<|s4SrN_1my0q*>6& zidiX+wi2ax9n@FusbCQV{(L2O%-yzOuesgf#g#)aa1YLNb;|C@g_bub0 zx$qFj;MrCyP!137gpHtH(%ULq`=|+Zy@Gwjt0-_}wy9Wi_<$1!4(LVUdT;@gi&L_b zOneo+M|7$Iye)%3k5HI}T7)v=){#*MZiPUa=DKaDMn6qhmhpVfqFdlqUw zV7W65d(GHdiCYg?r<{>`%elE@b==&|%PVF9=g07tI@9*~kZD`3m$e$Tj>Rm7#p_g% z1uHvBlcpAWy;5kovgt)Z(#%$+AX8LqSuw6yrbc?|_hNrjyhS_Qq+&==Q`+_irA1Pe z6u1mPu*+;V%AUm|-Ua1zA{)j(uN93?{&;-=o(a$>0&B1M9U2*Okeo{7AaGmQJU36m z<}+*8hDTUC45hh)hzq!esAh~)<$+$t&EZKb_#X(bV+3vOCHVKme&$r;=AF94v@$;@lee1t~|n zTz#x?Img$2rb+-xA5k;*vsLjN&ANa>RoaQ%Xa@nZ1FL~?ONK~@8mUz5ZDk=8D*H|t z+^ts;C$!R(+gSAzq!dz(#bM%QVH`-r(g0n5^FY^ar7|SYR^v%K-XD|vTY2v!c8 ze(YG&zJf;YT{b05?Y0?6M+$6=e~EH4fK%0m(*c5h*)O0x77J38Ohs0nw8rO(1O3S@+^6 zN37V3!oBzl905r0#aC-TO83S|e}HUYOSulfG3LalqhKx{2C3M-oUBZ8e6i9L9~fvRjmq48^=L+&BX;AK#R2RkU+i1)r|8hv60+PKQ%vSY6JIAXD}z3`iSHH04)QrraH~NL zO(1DzVh(-WeDGBR$#ibu1~g9>_BCg%jGPVDj`Z5fOS_dWkbR1-=g7p zFLQtXS6Hi2Yx|i-6t+BC;ob40cHkZS=uu2A5=9eU873m9mG7abkEm*hG*BXnG=iR? zydNYo70Bl4(~GkbMp+=l2ejm;RM0I;+4OBqoS~+JuW511gU44}NI>HN)1|8FBk9wq z3QhL(J-C{s8PYbr`e(GdSW^&&3}a%Lt6yM&JdMIY!teBMO0H=G3dVKvcbqN)zr;9V zJH;45b^(w)R#bBbDsw^TuBqi9NDo*-Bg6+qwJ^>s<#_4Ey<$RsJ03QB-lu z5wkoDR(YTc{>W`DUe741Hw%gVj8uoPStiDw}Pist>9m+ PPJo7R?f>`wj{pLP{= literal 0 HcmV?d00001 diff --git a/lib/infer/infer_pack/__pycache__/models.cpython-39.pyc b/lib/infer/infer_pack/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41e8b15fa33e37ad40503bb8d57e4b5f05875b8a GIT binary patch literal 24681 zcmeHvX^QdRw}1cm8zti%O4W^gWFX}sv?&HCw8bLvP9}Y ze!u_g>6zIB1Zf?Pqn_&jy#Dv=*YEt_uPga{#=!BF>oNEC=M3Y&@}mE+aq$FB&$bN1 zF&wjD%;`; z9CQvjhkrFTb1&`}og=t^Bz)U_z#Mh%0p^|%a}1b!o%?{fFT~sr%rWPFVD1kw$ALNS zlz=Hk?VEl}Tc4fty&ya5 z`sKxnTW!@0 zMwQ!aUva9Q8gf}ORSJ!$vL*coXFCt?7=UYVhGTXoK4sKQ$8usXr)Of0 z?ZjU;X6#QHwlNb&e%;)bh*A|hEl8ZNx7>;f(r)ug zd2z1YLYDJxW#Rhs?)evjctg33k1W8wqks`?p>_yd{ z-$)0x=Qe6;KTzrb!9jvU1cwQV1V;b@t2T)~NtesjM#b~Wz~W+~-VXmxKL3$(C#TwK;pFo!XUWMY-O93GuU)^~s9(8UZ`E9- zA?AN|;WCyEdh*obb+r%g9mVMt0gPsqP3>yVIJ5 zbm!waq`kin&;j|z>>2MEYnYMi=BnL_(!g=nnR|>?%uU}~!+e>y*UfQW8*A|n(yO+g zSW9+n2TNoxOCn}9;V0&Y zIrryBP@;V^cG+4@uBNaKQk{4$cG1{~Ppdts_pRGF)NZ6ODlwGF4{+t(>F9nI0ba`>luYlH>&A@K7 zXFWB^;sl�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 fogO_oet!Jp7L!$oyYF& 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 literal 0 HcmV?d00001 diff --git a/lib/infer/infer_pack/__pycache__/modules.cpython-39.pyc b/lib/infer/infer_pack/__pycache__/modules.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e3cd94f005188b18529a8259beb8b0d82a16fc0 GIT binary patch literal 11922 zcmbta+m9UCS+9FnUuUM>zRh~QlTEVOPO!6{ED(jTvDeP*vN)4q=SE{vYIoJl^i1D; zs>YXA4}|qDxqzhzNFX7=Ob8&q@P-s5{skUDNJ#Y*6r^Cm3l9+_AT7V&SJlNLEKB7L;@T)1W+^Qr-^AdH)$uo=GY1@b#NoedP(~f4#29 zMz4pmu(8`~MeTmC*{NHxbG6^Qd&!R%`2TU$?1h7V7=Vz!a(DA%{eA~k>9gwBjktI( zXm4&sUazmZaa9G~{@uWvqG9-4tKaSRdm(z4+P!v^HivO>Gl;xF)A!rGP4s(i&<=LQs+qiwcW1Zh^P=TNe3K14W%Fxa&*v&TF1!W{m-rMeEx6#`(IybnKDjNux{hzfA|uL zNPDR5>j#>yjr5V`86yLw8Cm;w5RxG5!{Q3}3xQ+uqh*Nd?o?hXPKyPhXA z;>B)jtJ&)XoiH|oL8uHoC(eJYshZs&LPtC5tJYR*^?N}W+ndd9w;9{RK=s4ex*bH# zx*1zx(AiKYaHFcBc&x{H&uev>Vd!~}wI6s_KXB_4VW7fW-KJ^k_hZUn8qA6$4jXzoVsjR&_n?c2B7y^TO6B^Iu=bF16;cRN9N zaqvJ@@z9evLlJkqpgX!_RP|vso8OD$uWj-3#s}*;oL6y%FQORf`#=HTI576~NZ&U& z%iHD#OADus(>bvB^hrOgqq+VB@S#0<3kMff*oBN6>uYhL!zC6TO(y6Jx~gRsoT|E^ zp2A*CoXtc>T3 z9F)0{?dv;M_|j{@>4*C3dgSis4>YtCvRV=ASlBN`?sgd~Y+ww_H=7AFvnvF@x|0!6qWF1CAKCi@FpZQl>32&MjRG-)pG1PU18h3#PwyFD*? zZk!)@zUmLqHNlO-M?@;Gx5Fqdwy?tEjzyyM_`+!p20_nP#hiudM}56fyE^j zt1RBff}$Slo)SjSL{27!92|ZSg_ai>A(Y5((I^P8SbFI#>n+P()X(UPXt8ude$M}b z>Q+Ik=);rK%ss)Lv7B&t;ySzF@Sz^6W1D64JfJO-= zx!Sjg@O%253Z-G+=GAG9_{2MIYHAS!*B$kX_)9+h=UDrB7W_y>rBb((>3S#Xv2)++ zHp89RzVG$bW~{fTa6uq}(D4zRA+bTj=U4P9&JsVnHuKpjJgIk~-_$4*bom)Hyd7tX zE~UC6rG<0m;4JY7**ZoSUk9qVf-%IFJnXZ)@A$bl^oA`O)`7efz(v!^n23xyYf&JEiTpgAUG9qaw)@qLh+-) zNmMg{1tRXEJ_e(4t(ehDS*;B4F@+5Vdp01#KB4V7_;+gB$TL zm<|BU`NksvR0?8f-IrG1JTOyg31GG~0+XfJ<>~7?pAn$3*3|`k8&tcqsrtKvFn0ZR zM=T?C5e))E_38vm65Tc{VS)(i7tkFt3Sm}1%WA%bc@DiW7>uiz?q7;?gon_}Dys?0 zzMs#^P+~0CVrU$C)*5@h#zNk2j%43LqbPYTF%T%#MhW%gSJK@Xc^0Yu0c5&x3iRP( z%1D_oueZj0iE%Y5=uDcwhzp>)wyP^nzDbFklI)E+l1ntdJv9$?+Rg`JO&L=h9z zH59SFsW`{6{$NU$GemfRrjVwMhG~SMAed0Ve5<$=(8vBOmaKqP6!4BCm!t<|buTxB6 zua68`l(1c>^=+|W9I;?>V!^mk9@a@wY?jhgy&M(xE3`gv*8(gLbH`L)m-a>4AtN2& zVAb%n19LA&`u5Ux6@UQ0;}PwZ6H#qs38;Ky&&9J{fJ#0(3E;@%&OBk|DQcO5+zZZ4 z$3*+6;5(1(y<#?MF&TA_mQ-o~)Tk(6;=+zH&S*Q@mvmK2?%pf)priJZ@1Qi4LzrurGZu~6$Hqk9>!%Yeq9RSWM)W>GA})`i zi@seTYA`NsPT4+U52#bTmF7~4Q|OQyISVQPVC}RADM2tz#6++uwxKjSp&}o|1;Cr1 z^b?7T&2}$R#IbrM5vlCO6xlY>%AaP9R*51?iJ(osEq2GR5-(+MlG$yQj3jS6&!+hT z#tbRMTD~F}=Mwu;{441tgV&X}EVBkYboCmp3^{>;|KsGUddY+s8a;C4Ii*0SXH3( zb+9s79HZ30xTN~pn`F*BSWT#>ah*^%%(L2Fp;y3j^^uDwi19yiM+FFwNw(cDkZFa1 zi}I`@o>dyrh<7q3E`eR;DZV^+W^}p^<H*kUZ2ao|8mm_`K*fzmoaNJW{$AP0(rE8zI zhz)dS1wC?eTRtE#WF){3^F!ox0u;Z7=PA0XiP*}5aF&5giC5n_{ORoc&p5*p3V!-x zdJa$G1LwrBj0E@i$xxM#539;44Jq$&tePY+ejcZUNZcGENZ+r#uke&2{l`?5g(+*> z^oyyrZTYUBpHY>iIDaDuU+(l@e5I*#t{`7VFe?E zw;*jWXdvmPZ=BVl9MqQ79wNN<$a$zA>Z50UP&=j%T&r{()W&@_fk#l5E_ecggQ!5x zIs6X3&ij0Qe9!c=f0DNJSyZCM@w28K{bcPwiOEUK@lvAX1|*1Sl&LFGK8dAF&Wate zvMtY$bYVVnvJDEEd(QFZ?gKE2J^2K`JdH@pDseS1-XfhM=b2FaMq6 zY5#7#e!o$*0SoIG|FXE;KUSl*aoTtQuYbb3dHtgw`|wfI+h|>ijn-;x+>Z|9 z$#WR#J&>7@5k*Zu1-PXB?PmW4xf(7_rtLTsqpwOZ*Uk?{y)IB zX&ePD0TMX!D|qq*Nb1D|LwM`<6SgQFTiM&2z_KihOJcko`W|<>7#E2UkCq?a`A@|J`pK@^{9MW>a!SE zq*Bq5RYMfhQL)qmZmB)CPM9yVWpCSqnJ?=Gu(3&~f0{;yh3zjm+>xn(yK|z!yCrj|)D70)#HY)Adboz5$2A9yuGv zO-L9~J?#hJx(VYQ&w~`u!bn6x0$X-sZJV9`Cc;piW_RFqVcDADZWmdw`vVwShvFYO z72HJ%D^Na1x`85gaJL`K#pFJxDzWh_pmJ4rVa^VV`06neAP2ezRs1|htFw4F3*z|{ zg9)n%m%WaL9tWk$cXh?<1~bGo~Xmro(MAA5oja8RA+@&;AO=5ez~i z*7l$uSs6JN_UiqH!~I>twor2MrIVrkmGuryKOyr0-1H%aNon;z?6U-=z)qG_OCwu8Wg*VN`!_f-V-4;gUNBrf@=Y0-zYXqak_BIO8s z34){Hr?pc~!mMih$oyVK1iyog4%eBA7BO6FQGtvP*14R*a(|5qSt|`&){sU;CIV^H zxmyn;ggKjp#l6c=Vo1coheF09k4Ou{)`o9MnzI;{=(|BN1GEv-u^%yQi+~{dF-C+a z&&WN4v~$|O0$OEzVS90ZDNT!3wyWbSVR9#pqhLz4;oHWMv8kM>-@e-p+f4G@ez3Bd zNQ9BZ+vw5PPaKvGT82r!FpJT}<*jCCW0DZfcY|in>-XSYi7auoVsoGZajBt1dMzX> z`(Y$8OLdteUSaVv3dp0VmlGt+dD!IL)E~0T93lJ)8HhSVE7qXq(|{iSQODkg8As~} zuDc8uZg_q!M`WV9-lAxZ4{9%7U&R^z8;V2`U^R?QtZ@=(hBIYD{fa_P)h;7w7UF31 z&&@{&MN48bm$uTccET+gi}l&D@`%}0MlQnA8n(0K8Mhl*;kOXub3j4#ZY=2R^sjsm4 zk63(_#n)KKLN!?Eii840S?ONUGe8Bi22Jh~TfUW)ZCY|Dw72$cyo2_hY**1pAs zU%?|Zor}tRv!kCgEJkPnOpExr26NNHr{^#CJO>bCisq5UCemSP(w#=rwx@h8;R2R} zFz_L;WYgdC{U{QeK74-u8_e|RBla;?+9_ku}UKkgmX1n9v?(bqRhloUmgo$vx!tp=L;w2Uz zVsV+p6&3=7sh!Pds=r{d%Hn-2{*uLCv6usY|40rX_Z{A+Q2_W=p{8qZImlWJm&VID zLAkXVm|Nr!IEC}iVN?JGEQce|GzD{#pg11lumfq^xn=GF#sFVA0GW#vg$3}k_FW_x zu`dvon}tzw;5$lM{!L?pK}}@+a8)`$9uA2Kw6aZ-8_3Yj>4S6yM&P@mok<6dvR97E zP^`sKX;el&jv!m{^N(_XYG<#4uS4!|44R3Z1lr;V@hkFF3Z4ri>q~lA!#pg^*z$#` zl!f|ZOq+Te3rt(WNEhK0!J=&{Y#qq8d*U%+2O-!bl%=dMC5G46dBX%nKg&z<2w-rl z3GV>jR$9Sc#qKURk=zhl-DZTXh~XU-CEQZxjlv^;!Wyl(`r@&8tNxUo{*1*wides` zeoOwN_{46HTM(KZ>~HeDdu>133gg-gaZ9$FhVhvhsvoHKUF?jwi`|iVSkKMdA$`K* z(EC3yRcWkb8LArSjhx##<2_>@6d|>~UntZhBM0YYG2`X2m1(Fy=f`{#g@ER} zctxp53XvOeAHMwLv}wa-1h%4iM7bkg9$&$o1Y~;Ks8#$9wHgYB@taJ04E~eXe zlkgMqzVXc5e%TJ)PzgscfD=2(UNqTYCOeB{Ux1ir5*U>Dg*eiR?wuInqC;d}rlwIQ zl+zfyA53;tzC?x(FQQ1Itx3eSM74|MTtvduGOG*K7ps?QpRP4)7plc-p<1ne@c#fg CAEajh literal 0 HcmV?d00001 diff --git a/lib/infer/infer_pack/__pycache__/transforms.cpython-39.pyc b/lib/infer/infer_pack/__pycache__/transforms.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f48e73bb6978a98207d6d8726279b5ad304ea2dd GIT binary patch literal 3946 zcmai1&2JmW6`z^?;BvX7NQts2Tej)%vaO6FDG(qqlK8V$5etQDyMRG}SaFutTI4P> zyR>X|SQJTnbm2cB2MOq*MlZeeU+5pu(c>yXwY0{KD4;;&_*ku zIo#xwTY()E0;gwln-_jX9~OCy7rBd(i}}*jyvNIsmLRQgOSj2NhtKgUW;{-RN?P-; zfPk#GsB(LwsGEjy&PF_nc*{|C7!5~hq83I`6pMl14|f9I*$#QSnW*}Va5D%WZ9=s% zBjtezpZIC`BuG>tjGhD{2~>FyMx70`Y$H|KXY(y`{%|3%EemX+?bP{XU!h@vLi$imdb(nQ->c$$DCxoa$>rfQb#WL5-C#RR zf^WL(fv&zoavp?u4mGLGOzNVs*}s3AMfR0j633wT#q+=Yardh~{o#YIp_fg5daTWp zIo@|Mkcb_NEECDzBL=xbQu3He${8eN3(>>P=Zsqo0=Kf)U$V=uUgL*;T`XhuOR5YW z4qj1=GoOn^cT*Y3XwWiLS-V6(?q=UQ$v&4df?<-GH7AQ$r@SP9VK7 ztx|DT&)eEDpfMdlbC}RUl-=X+7$7+85)kWti++SKlI|P=DJ8p9l07>14n}1J8{J~! zmnnN}NP{zOJZEDgHFqsEo13!OzzS|^IuvNzmS7!EmaY(9kY(K?TnpUU zb)>aNKck=0v)S(XZz*Q_pZAkPVLrCT=3&=0c|LHlq zn(Z{n0EBdP5byskVW1zd%z^)65CmTCsM6XZ$qG28-4@Pliu0+#Gq;lTv8h9I?8&0^ z>VzAZy@pv+JDqe7WDg*-GDox?+d7=N4HqvXXB6_44LDStERk^;0S_mhXjD?`u_G(o z(J7Iao||xgTO#~rrH&j0{R(nYg?n&F8+{pl1*x%c;NqG?8qOWQf&FDEwRVfr*rQlI zhy88ICZ|;q0EHYiPN-&hsu`Z@M5C7BsZHUjA@dcWT?3v1cB~;6)-pT}dX1+xgGY1I zc&gHTLB%gpSJou?jPW^Ga~|RABD@cHS=lXdCg=AU_b|U8%QJjk)@JxcS(W7zWPD5> zn~^Wcxf#A8=ccjE%q`3641XLr4eD@9z%?NI zMooNy6}g0mC7Z32@kzO|>+vd{x0*bGRVVe1<5Th!pWm`}%X{PnOJ4k#d`fW|=HyCA zduBzR+M^AEJD!%OWgYSboZOVB@%>I~9OE+@(KJeVCPQ~tF6HORWqCRu!EdvhB$At+FZJP`Gy8%;% z1AAUP65*n}D9@hIwrozJJ=o(dv^Z&h|8GaDv2vY07uI)H*L3;SOyj2CJV@=$Fv*_d z?J(U8qh^>UO&$+W{$v?e;AtQ`@7xKa5an7EDYcnZS=c0Q_EEb8O+25?bQ5p-Xs{88 zX57!68BQAV0T9Ylo0t*j+PGl zqhwMHJo0f@fm9c7E5q;im6?1ZQlaaH)}^D9$3=}tKf2;OnzS@|qdIh8KwZWr%AQoj zMF5!$ONRw4s>S`{*oDIWxS-3OkUv#(S&`j2TwBcrdVaFoL^8G7;z2+4RVi1^nc6;c zSaTnLOVrV}>BK0V%lX_s9_lN)p=eimJWRSGg#D50lqupk&9b0cge6m7ukBzGyJWn= zRijvIr%2BA!+UpNp8y4UEb{zm<@= zc~p7GsIGx2>0 z)Z&esx31p*_+IDE+Ir_2+RxT*+`Fxgy(zwZbL~gB@6F0@+`PN?;Of1#2RE~_J@fLc zZpeU4l_r^Svx3>Vg76#lgAa6YChvpb63j77lp&@w^*_PC+%v8_!@oDh>Hi(R{6DUt B(ZK)! literal 0 HcmV?d00001 diff --git a/lib/infer/infer_pack/attentions.py b/lib/infer/infer_pack/attentions.py new file mode 100644 index 000000000..3306127a4 --- /dev/null +++ b/lib/infer/infer_pack/attentions.py @@ -0,0 +1,417 @@ +import copy +import math +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + +from lib.infer.infer_pack import commons +from lib.infer.infer_pack import modules +from lib.infer.infer_pack.modules import LayerNorm + + +class Encoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=10, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.window_size = window_size + + self.drop = nn.Dropout(p_dropout) + self.attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + window_size=window_size, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class Decoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.encdec_attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.encdec_attn_layers.append( + MultiHeadAttention( + hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, h, h_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x + + +class MultiHeadAttention(nn.Module): + def __init__( + self, + channels, + out_channels, + n_heads, + p_dropout=0.0, + window_size=None, + heads_share=True, + block_length=None, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.p_dropout = p_dropout + self.window_size = window_size + self.heads_share = heads_share + self.block_length = block_length + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = nn.Conv1d(channels, channels, 1) + self.conv_k = nn.Conv1d(channels, channels, 1) + self.conv_v = nn.Conv1d(channels, channels, 1) + self.conv_o = nn.Conv1d(channels, out_channels, 1) + self.drop = nn.Dropout(p_dropout) + + if window_size is not None: + n_heads_rel = 1 if heads_share else n_heads + rel_stddev = self.k_channels**-0.5 + self.emb_rel_k = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + self.emb_rel_v = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + + nn.init.xavier_uniform_(self.conv_q.weight) + nn.init.xavier_uniform_(self.conv_k.weight) + nn.init.xavier_uniform_(self.conv_v.weight) + if proximal_init: + with torch.no_grad(): + self.conv_k.weight.copy_(self.conv_q.weight) + self.conv_k.bias.copy_(self.conv_q.bias) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + # reshape [b, d, t] -> [b, n_h, t, d_k] + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) + key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + + scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) + if self.window_size is not None: + assert ( + t_s == t_t + ), "Relative attention is only available for self-attention." + key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) + rel_logits = self._matmul_with_relative_keys( + query / math.sqrt(self.k_channels), key_relative_embeddings + ) + scores_local = self._relative_position_to_absolute_position(rel_logits) + scores = scores + scores_local + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to( + device=scores.device, dtype=scores.dtype + ) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + if self.block_length is not None: + assert ( + t_s == t_t + ), "Local attention is only available for self-attention." + block_mask = ( + torch.ones_like(scores) + .triu(-self.block_length) + .tril(self.block_length) + ) + scores = scores.masked_fill(block_mask == 0, -1e4) + p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + if self.window_size is not None: + relative_weights = self._absolute_position_to_relative_position(p_attn) + value_relative_embeddings = self._get_relative_embeddings( + self.emb_rel_v, t_s + ) + output = output + self._matmul_with_relative_values( + relative_weights, value_relative_embeddings + ) + output = ( + output.transpose(2, 3).contiguous().view(b, d, t_t) + ) # [b, n_h, t_t, d_k] -> [b, d, t_t] + return output, p_attn + + def _matmul_with_relative_values(self, x, y): + """ + x: [b, h, l, m] + y: [h or 1, m, d] + ret: [b, h, l, d] + """ + ret = torch.matmul(x, y.unsqueeze(0)) + return ret + + def _matmul_with_relative_keys(self, x, y): + """ + x: [b, h, l, d] + y: [h or 1, m, d] + ret: [b, h, l, m] + """ + ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) + return ret + + def _get_relative_embeddings(self, relative_embeddings, length): + max_relative_position = 2 * self.window_size + 1 + # Pad first before slice to avoid using cond ops. + pad_length = max(length - (self.window_size + 1), 0) + slice_start_position = max((self.window_size + 1) - length, 0) + slice_end_position = slice_start_position + 2 * length - 1 + if pad_length > 0: + padded_relative_embeddings = F.pad( + relative_embeddings, + commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]), + ) + else: + padded_relative_embeddings = relative_embeddings + used_relative_embeddings = padded_relative_embeddings[ + :, slice_start_position:slice_end_position + ] + return used_relative_embeddings + + def _relative_position_to_absolute_position(self, x): + """ + x: [b, h, l, 2*l-1] + ret: [b, h, l, l] + """ + batch, heads, length, _ = x.size() + # Concat columns of pad to shift from relative to absolute indexing. + x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])) + + # Concat extra elements so to add up to shape (len+1, 2*len-1). + x_flat = x.view([batch, heads, length * 2 * length]) + x_flat = F.pad( + x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]]) + ) + + # Reshape and slice out the padded elements. + x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[ + :, :, :length, length - 1 : + ] + return x_final + + def _absolute_position_to_relative_position(self, x): + """ + x: [b, h, l, l] + ret: [b, h, l, 2*l-1] + """ + batch, heads, length, _ = x.size() + # padd along column + x = F.pad( + x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) + ) + x_flat = x.view([batch, heads, length**2 + length * (length - 1)]) + # add 0's in the beginning that will skew the elements after reshape + x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) + x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:] + return x_final + + def _attention_bias_proximal(self, length): + """Bias for self-attention to encourage attention to close positions. + Args: + length: an integer scalar. + Returns: + a Tensor with shape [1, 1, length, length] + """ + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + + +class FFN(nn.Module): + def __init__( + self, + in_channels, + out_channels, + filter_channels, + kernel_size, + p_dropout=0.0, + activation=None, + causal=False, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.activation = activation + self.causal = causal + + if causal: + self.padding = self._causal_padding + else: + self.padding = self._same_padding + + self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) + self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) + self.drop = nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(self.padding(x * x_mask)) + if self.activation == "gelu": + x = x * torch.sigmoid(1.702 * x) + else: + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(self.padding(x * x_mask)) + return x * x_mask + + def _causal_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = self.kernel_size - 1 + pad_r = 0 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x + + def _same_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = (self.kernel_size - 1) // 2 + pad_r = self.kernel_size // 2 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x diff --git a/lib/infer/infer_pack/commons.py b/lib/infer/infer_pack/commons.py new file mode 100644 index 000000000..54470986f --- /dev/null +++ b/lib/infer/infer_pack/commons.py @@ -0,0 +1,166 @@ +import math +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + + +def init_weights(m, mean=0.0, std=0.01): + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) + + +def get_padding(kernel_size, dilation=1): + return int((kernel_size * dilation - dilation) / 2) + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def kl_divergence(m_p, logs_p, m_q, logs_q): + """KL(P||Q)""" + kl = (logs_q - logs_p) - 0.5 + kl += ( + 0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q) + ) + return kl + + +def rand_gumbel(shape): + """Sample from the Gumbel distribution, protect from overflows.""" + uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 + return -torch.log(-torch.log(uniform_samples)) + + +def rand_gumbel_like(x): + g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) + return g + + +def slice_segments(x, ids_str, segment_size=4): + ret = torch.zeros_like(x[:, :, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, :, idx_str:idx_end] + return ret + + +def slice_segments2(x, ids_str, segment_size=4): + ret = torch.zeros_like(x[:, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, idx_str:idx_end] + return ret + + +def rand_slice_segments(x, x_lengths=None, segment_size=4): + b, d, t = x.size() + if x_lengths is None: + x_lengths = t + ids_str_max = x_lengths - segment_size + 1 + ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) + ret = slice_segments(x, ids_str, segment_size) + return ret, ids_str + + +def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4): + position = torch.arange(length, dtype=torch.float) + num_timescales = channels // 2 + log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / ( + num_timescales - 1 + ) + inv_timescales = min_timescale * torch.exp( + torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment + ) + scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) + signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) + signal = F.pad(signal, [0, 0, 0, channels % 2]) + signal = signal.view(1, channels, length) + return signal + + +def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4): + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return x + signal.to(dtype=x.dtype, device=x.device) + + +def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1): + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) + + +def subsequent_mask(length): + mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) + return mask + + +@torch.jit.script +def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + + +def convert_pad_shape(pad_shape): + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape + + +def shift_1d(x): + x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] + return x + + +def sequence_mask(length, max_length=None): + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) + + +def generate_path(duration, mask): + """ + duration: [b, 1, t_x] + mask: [b, 1, t_y, t_x] + """ + device = duration.device + + b, _, t_y, t_x = mask.shape + cum_duration = torch.cumsum(duration, -1) + + cum_duration_flat = cum_duration.view(b * t_x) + path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) + path = path.view(b, t_x, t_y) + path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] + path = path.unsqueeze(1).transpose(2, 3) * mask + return path + + +def clip_grad_value_(parameters, clip_value, norm_type=2): + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = list(filter(lambda p: p.grad is not None, parameters)) + norm_type = float(norm_type) + if clip_value is not None: + clip_value = float(clip_value) + + total_norm = 0 + for p in parameters: + param_norm = p.grad.data.norm(norm_type) + total_norm += param_norm.item() ** norm_type + if clip_value is not None: + p.grad.data.clamp_(min=-clip_value, max=clip_value) + total_norm = total_norm ** (1.0 / norm_type) + return total_norm diff --git a/lib/infer/infer_pack/models.py b/lib/infer/infer_pack/models.py new file mode 100644 index 000000000..9bf5ca934 --- /dev/null +++ b/lib/infer/infer_pack/models.py @@ -0,0 +1,1144 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer.infer_pack import modules +from lib.infer.infer_pack import attentions +from lib.infer.infer_pack import commons +from lib.infer.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer.infer_pack.commons import init_weights +import numpy as np +from lib.infer.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +class PosteriorEncoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): + super(Generator, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + if uv.device.type == "privateuseone": # for DirectML + uv = uv.float() + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMs256NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs256NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(DiscriminatorS, self).__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super(DiscriminatorP, self).__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap \ No newline at end of file diff --git a/lib/infer/infer_pack/models_dml.py b/lib/infer/infer_pack/models_dml.py new file mode 100644 index 000000000..c005ecac7 --- /dev/null +++ b/lib/infer/infer_pack/models_dml.py @@ -0,0 +1,1124 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer.infer_pack import modules +from lib.infer.infer_pack import attentions +from lib.infer.infer_pack import commons +from lib.infer.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer.infer_pack.commons import init_weights +import numpy as np +from lib.infer.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +class PosteriorEncoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): + super(Generator, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv.float() + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMs256NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs256NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid_nono(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(DiscriminatorS, self).__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super(DiscriminatorP, self).__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap diff --git a/lib/infer/infer_pack/models_onnx.py b/lib/infer/infer_pack/models_onnx.py new file mode 100644 index 000000000..2ae06274f --- /dev/null +++ b/lib/infer/infer_pack/models_onnx.py @@ -0,0 +1,819 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer.infer_pack import modules +from lib.infer.infer_pack import attentions +from lib.infer.infer_pack import commons +from lib.infer.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer.infer_pack.commons import init_weights +import numpy as np +from lib.infer.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.emb_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + self.encoder = attentions.Encoder( + hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.encoder(x * x_mask, x_mask) + stats = self.proj(x) * x_mask + + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask + + +class ResidualCouplingBlock(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.n_flows = n_flows + self.gin_channels = gin_channels + + self.flows = nn.ModuleList() + for i in range(n_flows): + self.flows.append( + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) + self.flows.append(modules.Flip()) + + def forward(self, x, x_mask, g=None, reverse=False): + if not reverse: + for flow in self.flows: + x, _ = flow(x, x_mask, g=g, reverse=reverse) + else: + for flow in reversed(self.flows): + x = flow(x, x_mask, g=g, reverse=reverse) + return x + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +class PosteriorEncoder(nn.Module): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + + self.pre = nn.Conv1d(in_channels, hidden_channels, 1) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) + + def forward(self, x, x_lengths, g=None): + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) + x = self.pre(x) * x_mask + x = self.enc(x, x_mask, g=g) + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask + return z, m, logs, x_mask + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class Generator(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): + super(Generator, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(torch.nn.Module): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 + + self.ups = nn.ModuleList() + for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + self.resblocks = nn.ModuleList() + for i in range(len(self.ups)): + ch = upsample_initial_channel // (2 ** (i + 1)) + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): + self.resblocks.append(resblock(ch, k, d)) + + self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) + self.ups.apply(init_weights) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + xs = None + for j in range(self.num_kernels): + if xs is None: + xs = self.resblocks[i * self.num_kernels + j](x) + else: + xs += self.resblocks[i * self.num_kernels + j](x) + x = xs / self.num_kernels + x = F.leaky_relu(x) + x = self.conv_post(x) + x = torch.tanh(x) + return x + + def remove_weight_norm(self): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMsNSFsidM(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + version, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + if version == "v1": + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + else: + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + self.speaker_map = None + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def construct_spkmixmap(self, n_speaker): + self.speaker_map = torch.zeros((n_speaker, 1, 1, self.gin_channels)) + for i in range(n_speaker): + self.speaker_map[i] = self.emb_g(torch.LongTensor([[i]])) + self.speaker_map = self.speaker_map.unsqueeze(0) + + def forward(self, phone, phone_lengths, pitch, nsff0, g, rnd, max_len=None): + if self.speaker_map is not None: # [N, S] * [S, B, 1, H] + g = g.reshape((g.shape[0], g.shape[1], 1, 1, 1)) # [N, S, B, 1, 1] + g = g * self.speaker_map # [N, S, B, 1, H] + g = torch.sum(g, dim=1) # [N, 1, B, 1, H] + g = g.transpose(0, -1).transpose(0, -2).squeeze(0) # [B, H, N] + else: + g = g.unsqueeze(0) + g = self.emb_g(g).transpose(1, 2) + + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * rnd) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + + +class DiscriminatorS(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(DiscriminatorS, self).__init__() + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) + self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) + + def forward(self, x): + fmap = [] + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap + + +class DiscriminatorP(torch.nn.Module): + def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): + super(DiscriminatorP, self).__init__() + self.period = period + self.use_spectral_norm = use_spectral_norm + norm_f = weight_norm if use_spectral_norm == False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) + self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) + + def forward(self, x): + fmap = [] + + # 1d to 2d + b, c, t = x.shape + if t % self.period != 0: # pad first + n_pad = self.period - (t % self.period) + x = F.pad(x, (0, n_pad), "reflect") + t = t + n_pad + x = x.view(b, c, t // self.period, self.period) + + for l in self.convs: + x = l(x) + x = F.leaky_relu(x, modules.LRELU_SLOPE) + fmap.append(x) + x = self.conv_post(x) + fmap.append(x) + x = torch.flatten(x, 1, -1) + + return x, fmap diff --git a/lib/infer/infer_pack/modules.py b/lib/infer/infer_pack/modules.py new file mode 100644 index 000000000..559794285 --- /dev/null +++ b/lib/infer/infer_pack/modules.py @@ -0,0 +1,522 @@ +import copy +import math +import numpy as np +import scipy +import torch +from torch import nn +from torch.nn import functional as F + +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm + +from lib.infer.infer_pack import commons +from lib.infer.infer_pack.commons import init_weights, get_padding +from lib.infer.infer_pack.transforms import piecewise_rational_quadratic_transform + + +LRELU_SLOPE = 0.1 + + +class LayerNorm(nn.Module): + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) + + +class ConvReluNorm(nn.Module): + def __init__( + self, + in_channels, + hidden_channels, + out_channels, + kernel_size, + n_layers, + p_dropout, + ): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + assert n_layers > 1, "Number of layers should be larger than 0." + + self.conv_layers = nn.ModuleList() + self.norm_layers = nn.ModuleList() + self.conv_layers.append( + nn.Conv1d( + in_channels, hidden_channels, kernel_size, padding=kernel_size // 2 + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + nn.Conv1d( + hidden_channels, + hidden_channels, + kernel_size, + padding=kernel_size // 2, + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask + + +class DDSConv(nn.Module): + """ + Dialted and Depth-Separable Convolution + """ + + def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0): + super().__init__() + self.channels = channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.drop = nn.Dropout(p_dropout) + self.convs_sep = nn.ModuleList() + self.convs_1x1 = nn.ModuleList() + self.norms_1 = nn.ModuleList() + self.norms_2 = nn.ModuleList() + for i in range(n_layers): + dilation = kernel_size**i + padding = (kernel_size * dilation - dilation) // 2 + self.convs_sep.append( + nn.Conv1d( + channels, + channels, + kernel_size, + groups=channels, + dilation=dilation, + padding=padding, + ) + ) + self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) + self.norms_1.append(LayerNorm(channels)) + self.norms_2.append(LayerNorm(channels)) + + def forward(self, x, x_mask, g=None): + if g is not None: + x = x + g + for i in range(self.n_layers): + y = self.convs_sep[i](x * x_mask) + y = self.norms_1[i](y) + y = F.gelu(y) + y = self.convs_1x1[i](y) + y = self.norms_2[i](y) + y = F.gelu(y) + y = self.drop(y) + x = x + y + return x * x_mask + + +class WN(torch.nn.Module): + def __init__( + self, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + p_dropout=0, + ): + super(WN, self).__init__() + assert kernel_size % 2 == 1 + self.hidden_channels = hidden_channels + self.kernel_size = (kernel_size,) + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + self.p_dropout = p_dropout + + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.drop = nn.Dropout(p_dropout) + + if gin_channels != 0: + cond_layer = torch.nn.Conv1d( + gin_channels, 2 * hidden_channels * n_layers, 1 + ) + self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight") + + for i in range(n_layers): + dilation = dilation_rate**i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d( + hidden_channels, + 2 * hidden_channels, + kernel_size, + dilation=dilation, + padding=padding, + ) + in_layer = torch.nn.utils.weight_norm(in_layer, name="weight") + self.in_layers.append(in_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * hidden_channels + else: + res_skip_channels = hidden_channels + + res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight") + self.res_skip_layers.append(res_skip_layer) + + def forward(self, x, x_mask, g=None, **kwargs): + output = torch.zeros_like(x) + n_channels_tensor = torch.IntTensor([self.hidden_channels]) + + if g is not None: + g = self.cond_layer(g) + + for i in range(self.n_layers): + x_in = self.in_layers[i](x) + if g is not None: + cond_offset = i * 2 * self.hidden_channels + g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :] + else: + g_l = torch.zeros_like(x_in) + + acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor) + acts = self.drop(acts) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + res_acts = res_skip_acts[:, : self.hidden_channels, :] + x = (x + res_acts) * x_mask + output = output + res_skip_acts[:, self.hidden_channels :, :] + else: + output = output + res_skip_acts + return output * x_mask + + def remove_weight_norm(self): + if self.gin_channels != 0: + torch.nn.utils.remove_weight_norm(self.cond_layer) + for l in self.in_layers: + torch.nn.utils.remove_weight_norm(l) + for l in self.res_skip_layers: + torch.nn.utils.remove_weight_norm(l) + + +class ResBlock1(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): + super(ResBlock1, self).__init__() + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) + self.convs1.apply(init_weights) + + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) + self.convs2.apply(init_weights) + + def forward(self, x, x_mask=None): + for c1, c2 in zip(self.convs1, self.convs2): + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c1(xt) + xt = F.leaky_relu(xt, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c2(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs1: + remove_weight_norm(l) + for l in self.convs2: + remove_weight_norm(l) + + +class ResBlock2(torch.nn.Module): + def __init__(self, channels, kernel_size=3, dilation=(1, 3)): + super(ResBlock2, self).__init__() + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) + self.convs.apply(init_weights) + + def forward(self, x, x_mask=None): + for c in self.convs: + xt = F.leaky_relu(x, LRELU_SLOPE) + if x_mask is not None: + xt = xt * x_mask + xt = c(xt) + x = xt + x + if x_mask is not None: + x = x * x_mask + return x + + def remove_weight_norm(self): + for l in self.convs: + remove_weight_norm(l) + + +class Log(nn.Module): + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask + logdet = torch.sum(-y, [1, 2]) + return y, logdet + else: + x = torch.exp(x) * x_mask + return x + + +class Flip(nn.Module): + def forward(self, x, *args, reverse=False, **kwargs): + x = torch.flip(x, [1]) + if not reverse: + logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) + return x, logdet + else: + return x + + +class ElementwiseAffine(nn.Module): + def __init__(self, channels): + super().__init__() + self.channels = channels + self.m = nn.Parameter(torch.zeros(channels, 1)) + self.logs = nn.Parameter(torch.zeros(channels, 1)) + + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = self.m + torch.exp(self.logs) * x + y = y * x_mask + logdet = torch.sum(self.logs * x_mask, [1, 2]) + return y, logdet + else: + x = (x - self.m) * torch.exp(-self.logs) * x_mask + return x + + +class ResidualCouplingLayer(nn.Module): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=0, + gin_channels=0, + mean_only=False, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=p_dropout, + gin_channels=gin_channels, + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +class ConvFlow(nn.Module): + def __init__( + self, + in_channels, + filter_channels, + kernel_size, + n_layers, + num_bins=10, + tail_bound=5.0, + ): + super().__init__() + self.in_channels = in_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.num_bins = num_bins + self.tail_bound = tail_bound + self.half_channels = in_channels // 2 + + self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) + self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.0) + self.proj = nn.Conv1d( + filter_channels, self.half_channels * (num_bins * 3 - 1), 1 + ) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) + h = self.convs(h, x_mask, g=g) + h = self.proj(h) * x_mask + + b, c, t = x0.shape + h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] + + unnormalized_widths = h[..., : self.num_bins] / math.sqrt(self.filter_channels) + unnormalized_heights = h[..., self.num_bins : 2 * self.num_bins] / math.sqrt( + self.filter_channels + ) + unnormalized_derivatives = h[..., 2 * self.num_bins :] + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x diff --git a/lib/infer/infer_pack/modules/F0Predictor/DioF0Predictor.py b/lib/infer/infer_pack/modules/F0Predictor/DioF0Predictor.py new file mode 100644 index 000000000..01a7f2586 --- /dev/null +++ b/lib/infer/infer_pack/modules/F0Predictor/DioF0Predictor.py @@ -0,0 +1,90 @@ +from lib.infer.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import pyworld +import numpy as np + + +class DioF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer/infer_pack/modules/F0Predictor/F0Predictor.py b/lib/infer/infer_pack/modules/F0Predictor/F0Predictor.py new file mode 100644 index 000000000..f56e49e7f --- /dev/null +++ b/lib/infer/infer_pack/modules/F0Predictor/F0Predictor.py @@ -0,0 +1,16 @@ +class F0Predictor(object): + def compute_f0(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length] + """ + pass + + def compute_f0_uv(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length],uv:[signal_length//hop_length] + """ + pass diff --git a/lib/infer/infer_pack/modules/F0Predictor/HarvestF0Predictor.py b/lib/infer/infer_pack/modules/F0Predictor/HarvestF0Predictor.py new file mode 100644 index 000000000..abaf6cc77 --- /dev/null +++ b/lib/infer/infer_pack/modules/F0Predictor/HarvestF0Predictor.py @@ -0,0 +1,86 @@ +from lib.infer.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import pyworld +import numpy as np + + +class HarvestF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.hop_length, + f0_ceil=self.f0_max, + f0_floor=self.f0_min, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.fs) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer/infer_pack/modules/F0Predictor/PMF0Predictor.py b/lib/infer/infer_pack/modules/F0Predictor/PMF0Predictor.py new file mode 100644 index 000000000..29b2d78ee --- /dev/null +++ b/lib/infer/infer_pack/modules/F0Predictor/PMF0Predictor.py @@ -0,0 +1,97 @@ +from lib.infer.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import parselmouth +import numpy as np + + +class PMF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def compute_f0(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0 + + def compute_f0_uv(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0, uv diff --git a/lib/infer/infer_pack/modules/F0Predictor/__init__.py b/lib/infer/infer_pack/modules/F0Predictor/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/infer/infer_pack/onnx_inference.py b/lib/infer/infer_pack/onnx_inference.py new file mode 100644 index 000000000..9dfe7ba64 --- /dev/null +++ b/lib/infer/infer_pack/onnx_inference.py @@ -0,0 +1,145 @@ +import onnxruntime +import librosa +import numpy as np +import soundfile + + +class ContentVec: + def __init__(self, vec_path="pretrained/vec-768-layer-12.onnx", device=None): + print("load model(s) from {}".format(vec_path)) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(vec_path, providers=providers) + + def __call__(self, wav): + return self.forward(wav) + + def forward(self, wav): + feats = wav + if feats.ndim == 2: # double channels + feats = feats.mean(-1) + assert feats.ndim == 1, feats.ndim + feats = np.expand_dims(np.expand_dims(feats, 0), 0) + onnx_input = {self.model.get_inputs()[0].name: feats} + logits = self.model.run(None, onnx_input)[0] + return logits.transpose(0, 2, 1) + + +def get_f0_predictor(f0_predictor, hop_length, sampling_rate, **kargs): + if f0_predictor == "pm": + from lib.infer.infer_pack.modules.F0Predictor.PMF0Predictor import PMF0Predictor + + f0_predictor_object = PMF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "harvest": + from lib.infer.infer_pack.modules.F0Predictor.HarvestF0Predictor import ( + HarvestF0Predictor, + ) + + f0_predictor_object = HarvestF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "dio": + from lib.infer.infer_pack.modules.F0Predictor.DioF0Predictor import DioF0Predictor + + f0_predictor_object = DioF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + else: + raise Exception("Unknown f0 predictor") + return f0_predictor_object + + +class OnnxRVC: + def __init__( + self, + model_path, + sr=40000, + hop_size=512, + vec_path="vec-768-layer-12", + device="cpu", + ): + vec_path = f"pretrained/{vec_path}.onnx" + self.vec_model = ContentVec(vec_path, device) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(model_path, providers=providers) + self.sampling_rate = sr + self.hop_size = hop_size + + def forward(self, hubert, hubert_length, pitch, pitchf, ds, rnd): + onnx_input = { + self.model.get_inputs()[0].name: hubert, + self.model.get_inputs()[1].name: hubert_length, + self.model.get_inputs()[2].name: pitch, + self.model.get_inputs()[3].name: pitchf, + self.model.get_inputs()[4].name: ds, + self.model.get_inputs()[5].name: rnd, + } + return (self.model.run(None, onnx_input)[0] * 32767).astype(np.int16) + + def inference( + self, + raw_path, + sid, + f0_method="dio", + f0_up_key=0, + pad_time=0.5, + cr_threshold=0.02, + ): + f0_min = 50 + f0_max = 1100 + f0_mel_min = 1127 * np.log(1 + f0_min / 700) + f0_mel_max = 1127 * np.log(1 + f0_max / 700) + f0_predictor = get_f0_predictor( + f0_method, + hop_length=self.hop_size, + sampling_rate=self.sampling_rate, + threshold=cr_threshold, + ) + wav, sr = librosa.load(raw_path, sr=self.sampling_rate) + org_length = len(wav) + if org_length / sr > 50.0: + raise RuntimeError("Reached Max Length") + + wav16k = librosa.resample(wav, orig_sr=self.sampling_rate, target_sr=16000) + wav16k = wav16k + + hubert = self.vec_model(wav16k) + hubert = np.repeat(hubert, 2, axis=2).transpose(0, 2, 1).astype(np.float32) + hubert_length = hubert.shape[1] + + pitchf = f0_predictor.compute_f0(wav, hubert_length) + pitchf = pitchf * 2 ** (f0_up_key / 12) + pitch = pitchf.copy() + f0_mel = 1127 * np.log(1 + pitch / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / ( + f0_mel_max - f0_mel_min + ) + 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > 255] = 255 + pitch = np.rint(f0_mel).astype(np.int64) + + pitchf = pitchf.reshape(1, len(pitchf)).astype(np.float32) + pitch = pitch.reshape(1, len(pitch)) + ds = np.array([sid]).astype(np.int64) + + rnd = np.random.randn(1, 192, hubert_length).astype(np.float32) + hubert_length = np.array([hubert_length]).astype(np.int64) + + out_wav = self.forward(hubert, hubert_length, pitch, pitchf, ds, rnd).squeeze() + out_wav = np.pad(out_wav, (0, 2 * self.hop_size), "constant") + return out_wav[0:org_length] diff --git a/lib/infer/infer_pack/tensorlowest.py b/lib/infer/infer_pack/tensorlowest.py new file mode 100644 index 000000000..2ba93af65 --- /dev/null +++ b/lib/infer/infer_pack/tensorlowest.py @@ -0,0 +1,123 @@ +from tensorboard.backend.event_processing import event_accumulator + +import os +from shutil import copy2 +from re import search as RSearch +import pandas as pd +from ast import literal_eval as LEval + +weights_dir = 'logs/weights/' + +def find_biggest_tensorboard(tensordir): + try: + files = [f for f in os.listdir(tensordir) if f.endswith('.0')] + if not files: + print("No files with the '.0' extension found!") + return + + max_size = 0 + biggest_file = "" + + for file in files: + file_path = os.path.join(tensordir, file) + if os.path.isfile(file_path): + file_size = os.path.getsize(file_path) + if file_size > max_size: + max_size = file_size + biggest_file = file + + return biggest_file + + except FileNotFoundError: + print("Couldn't find your model!") + return + +def main(model_name, save_freq, lastmdls): + global lowestval_weight_dir, scl + + tensordir = os.path.join('logs', model_name) + lowestval_weight_dir = os.path.join(tensordir, "lowestvals") + + latest_file = find_biggest_tensorboard(tensordir) + + if latest_file is None: + print("Couldn't find a valid tensorboard file!") + return + + tfile = os.path.join(tensordir, latest_file) + + ea = event_accumulator.EventAccumulator(tfile, + size_guidance={ + event_accumulator.COMPRESSED_HISTOGRAMS: 500, + event_accumulator.IMAGES: 4, + event_accumulator.AUDIO: 4, + event_accumulator.SCALARS: 0, + event_accumulator.HISTOGRAMS: 1, + }) + + ea.Reload() + ea.Tags() + + scl = ea.Scalars('loss/g/total') + + listwstep = {} + + for val in scl: + if (val.step // save_freq) * save_freq in [val.step for val in scl]: + listwstep[float(val.value)] = (val.step // save_freq) * save_freq + + lowest_vals = sorted(listwstep.keys())[:lastmdls] + + sorted_dict = {value: step for value, step in listwstep.items() if value in lowest_vals} + + return sorted_dict + +def selectweights(model_name, file_dict, weights_dir, lowestval_weight_dir): + os.makedirs(lowestval_weight_dir, exist_ok=True) + logdir = [] + files = [] + lbldict = { + 'Values': {}, + 'Names': {} + } + weights_dir_path = os.path.join(weights_dir, "") + low_val_path = os.path.join(os.getcwd(), os.path.join(lowestval_weight_dir, "")) + + try: + file_dict = LEval(file_dict) + except Exception as e: + print(f"Error! {e}") + return f"Couldn't load tensorboard file! {e}" + + weights = [f for f in os.scandir(weights_dir)] + for key, value in file_dict.items(): + pattern = fr"^{model_name}_.*_s{value}\.pth$" + matching_weights = [f.name for f in weights if f.is_file() and RSearch(pattern, f.name)] + for weight in matching_weights: + source_path = weights_dir_path + weight + destination_path = os.path.join(lowestval_weight_dir, weight) + + copy2(source_path, destination_path) + + logdir.append(f"File = {weight} Value: {key}, Step: {value}") + + lbldict['Names'][weight] = weight + lbldict['Values'][weight] = key + + files.append(low_val_path + weight) + + print(f"File = {weight} Value: {key}, Step: {value}") + + yield ('\n'.join(logdir), files, pd.DataFrame(lbldict)) + + + return ''.join(logdir), files, pd.DataFrame(lbldict) + + +if __name__ == "__main__": + model = str(input("Enter the name of the model: ")) + sav_freq = int(input("Enter save frequency of the model: ")) + ds = main(model, sav_freq) + + if ds: selectweights(model, ds, weights_dir, lowestval_weight_dir) + \ No newline at end of file diff --git a/lib/infer/infer_pack/transforms.py b/lib/infer/infer_pack/transforms.py new file mode 100644 index 000000000..a11f799e0 --- /dev/null +++ b/lib/infer/infer_pack/transforms.py @@ -0,0 +1,209 @@ +import torch +from torch.nn import functional as F + +import numpy as np + + +DEFAULT_MIN_BIN_WIDTH = 1e-3 +DEFAULT_MIN_BIN_HEIGHT = 1e-3 +DEFAULT_MIN_DERIVATIVE = 1e-3 + + +def piecewise_rational_quadratic_transform( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails=None, + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if tails is None: + spline_fn = rational_quadratic_spline + spline_kwargs = {} + else: + spline_fn = unconstrained_rational_quadratic_spline + spline_kwargs = {"tails": tails, "tail_bound": tail_bound} + + outputs, logabsdet = spline_fn( + inputs=inputs, + unnormalized_widths=unnormalized_widths, + unnormalized_heights=unnormalized_heights, + unnormalized_derivatives=unnormalized_derivatives, + inverse=inverse, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + **spline_kwargs + ) + return outputs, logabsdet + + +def searchsorted(bin_locations, inputs, eps=1e-6): + bin_locations[..., -1] += eps + return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1 + + +def unconstrained_rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails="linear", + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound) + outside_interval_mask = ~inside_interval_mask + + outputs = torch.zeros_like(inputs) + logabsdet = torch.zeros_like(inputs) + + if tails == "linear": + unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1)) + constant = np.log(np.exp(1 - min_derivative) - 1) + unnormalized_derivatives[..., 0] = constant + unnormalized_derivatives[..., -1] = constant + + outputs[outside_interval_mask] = inputs[outside_interval_mask] + logabsdet[outside_interval_mask] = 0 + else: + raise RuntimeError("{} tails are not implemented.".format(tails)) + + ( + outputs[inside_interval_mask], + logabsdet[inside_interval_mask], + ) = rational_quadratic_spline( + inputs=inputs[inside_interval_mask], + unnormalized_widths=unnormalized_widths[inside_interval_mask, :], + unnormalized_heights=unnormalized_heights[inside_interval_mask, :], + unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :], + inverse=inverse, + left=-tail_bound, + right=tail_bound, + bottom=-tail_bound, + top=tail_bound, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + ) + + return outputs, logabsdet + + +def rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + left=0.0, + right=1.0, + bottom=0.0, + top=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if torch.min(inputs) < left or torch.max(inputs) > right: + raise ValueError("Input to a transform is not within its domain") + + num_bins = unnormalized_widths.shape[-1] + + if min_bin_width * num_bins > 1.0: + raise ValueError("Minimal bin width too large for the number of bins") + if min_bin_height * num_bins > 1.0: + raise ValueError("Minimal bin height too large for the number of bins") + + widths = F.softmax(unnormalized_widths, dim=-1) + widths = min_bin_width + (1 - min_bin_width * num_bins) * widths + cumwidths = torch.cumsum(widths, dim=-1) + cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0) + cumwidths = (right - left) * cumwidths + left + cumwidths[..., 0] = left + cumwidths[..., -1] = right + widths = cumwidths[..., 1:] - cumwidths[..., :-1] + + derivatives = min_derivative + F.softplus(unnormalized_derivatives) + + heights = F.softmax(unnormalized_heights, dim=-1) + heights = min_bin_height + (1 - min_bin_height * num_bins) * heights + cumheights = torch.cumsum(heights, dim=-1) + cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0) + cumheights = (top - bottom) * cumheights + bottom + cumheights[..., 0] = bottom + cumheights[..., -1] = top + heights = cumheights[..., 1:] - cumheights[..., :-1] + + if inverse: + bin_idx = searchsorted(cumheights, inputs)[..., None] + else: + bin_idx = searchsorted(cumwidths, inputs)[..., None] + + input_cumwidths = cumwidths.gather(-1, bin_idx)[..., 0] + input_bin_widths = widths.gather(-1, bin_idx)[..., 0] + + input_cumheights = cumheights.gather(-1, bin_idx)[..., 0] + delta = heights / widths + input_delta = delta.gather(-1, bin_idx)[..., 0] + + input_derivatives = derivatives.gather(-1, bin_idx)[..., 0] + input_derivatives_plus_one = derivatives[..., 1:].gather(-1, bin_idx)[..., 0] + + input_heights = heights.gather(-1, bin_idx)[..., 0] + + if inverse: + a = (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + input_heights * (input_delta - input_derivatives) + b = input_heights * input_derivatives - (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + c = -input_delta * (inputs - input_cumheights) + + discriminant = b.pow(2) - 4 * a * c + assert (discriminant >= 0).all() + + root = (2 * c) / (-b - torch.sqrt(discriminant)) + outputs = root * input_bin_widths + input_cumwidths + + theta_one_minus_theta = root * (1 - root) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * root.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - root).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, -logabsdet + else: + theta = (inputs - input_cumwidths) / input_bin_widths + theta_one_minus_theta = theta * (1 - theta) + + numerator = input_heights * ( + input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta + ) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + outputs = input_cumheights + numerator / denominator + + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, logabsdet diff --git a/lib/infer/modules/ipex/__init__.py.py b/lib/infer/modules/ipex/__init__.py.py new file mode 100644 index 000000000..9f53b2d3f --- /dev/null +++ b/lib/infer/modules/ipex/__init__.py.py @@ -0,0 +1,165 @@ +import os +import sys +import contextlib +import torch +import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import +from .hijacks import ipex_hijacks +from .attention import attention_init + +# pylint: disable=protected-access, missing-function-docstring, line-too-long + +def ipex_init(): # pylint: disable=too-many-statements + try: + #Replace cuda with xpu: + torch.cuda.current_device = torch.xpu.current_device + torch.cuda.current_stream = torch.xpu.current_stream + torch.cuda.device = torch.xpu.device + torch.cuda.device_count = torch.xpu.device_count + torch.cuda.device_of = torch.xpu.device_of + torch.cuda.getDeviceIdListForCard = torch.xpu.getDeviceIdListForCard + torch.cuda.get_device_name = torch.xpu.get_device_name + torch.cuda.get_device_properties = torch.xpu.get_device_properties + torch.cuda.init = torch.xpu.init + torch.cuda.is_available = torch.xpu.is_available + torch.cuda.is_initialized = torch.xpu.is_initialized + torch.cuda.is_current_stream_capturing = lambda: False + torch.cuda.set_device = torch.xpu.set_device + torch.cuda.stream = torch.xpu.stream + torch.cuda.synchronize = torch.xpu.synchronize + torch.cuda.Event = torch.xpu.Event + torch.cuda.Stream = torch.xpu.Stream + torch.cuda.FloatTensor = torch.xpu.FloatTensor + torch.Tensor.cuda = torch.Tensor.xpu + torch.Tensor.is_cuda = torch.Tensor.is_xpu + torch.cuda._initialization_lock = torch.xpu.lazy_init._initialization_lock + torch.cuda._initialized = torch.xpu.lazy_init._initialized + torch.cuda._lazy_seed_tracker = torch.xpu.lazy_init._lazy_seed_tracker + torch.cuda._queued_calls = torch.xpu.lazy_init._queued_calls + torch.cuda._tls = torch.xpu.lazy_init._tls + torch.cuda.threading = torch.xpu.lazy_init.threading + torch.cuda.traceback = torch.xpu.lazy_init.traceback + torch.cuda.Optional = torch.xpu.Optional + torch.cuda.__cached__ = torch.xpu.__cached__ + torch.cuda.__loader__ = torch.xpu.__loader__ + torch.cuda.ComplexFloatStorage = torch.xpu.ComplexFloatStorage + torch.cuda.Tuple = torch.xpu.Tuple + torch.cuda.streams = torch.xpu.streams + torch.cuda._lazy_new = torch.xpu._lazy_new + torch.cuda.FloatStorage = torch.xpu.FloatStorage + torch.cuda.Any = torch.xpu.Any + torch.cuda.__doc__ = torch.xpu.__doc__ + torch.cuda.default_generators = torch.xpu.default_generators + torch.cuda.HalfTensor = torch.xpu.HalfTensor + torch.cuda._get_device_index = torch.xpu._get_device_index + torch.cuda.__path__ = torch.xpu.__path__ + torch.cuda.Device = torch.xpu.Device + torch.cuda.IntTensor = torch.xpu.IntTensor + torch.cuda.ByteStorage = torch.xpu.ByteStorage + torch.cuda.set_stream = torch.xpu.set_stream + torch.cuda.BoolStorage = torch.xpu.BoolStorage + torch.cuda.os = torch.xpu.os + torch.cuda.torch = torch.xpu.torch + torch.cuda.BFloat16Storage = torch.xpu.BFloat16Storage + torch.cuda.Union = torch.xpu.Union + torch.cuda.DoubleTensor = torch.xpu.DoubleTensor + torch.cuda.ShortTensor = torch.xpu.ShortTensor + torch.cuda.LongTensor = torch.xpu.LongTensor + torch.cuda.IntStorage = torch.xpu.IntStorage + torch.cuda.LongStorage = torch.xpu.LongStorage + torch.cuda.__annotations__ = torch.xpu.__annotations__ + torch.cuda.__package__ = torch.xpu.__package__ + torch.cuda.__builtins__ = torch.xpu.__builtins__ + torch.cuda.CharTensor = torch.xpu.CharTensor + torch.cuda.List = torch.xpu.List + torch.cuda._lazy_init = torch.xpu._lazy_init + torch.cuda.BFloat16Tensor = torch.xpu.BFloat16Tensor + torch.cuda.DoubleStorage = torch.xpu.DoubleStorage + torch.cuda.ByteTensor = torch.xpu.ByteTensor + torch.cuda.StreamContext = torch.xpu.StreamContext + torch.cuda.ComplexDoubleStorage = torch.xpu.ComplexDoubleStorage + torch.cuda.ShortStorage = torch.xpu.ShortStorage + torch.cuda._lazy_call = torch.xpu._lazy_call + torch.cuda.HalfStorage = torch.xpu.HalfStorage + torch.cuda.random = torch.xpu.random + torch.cuda._device = torch.xpu._device + torch.cuda.classproperty = torch.xpu.classproperty + torch.cuda.__name__ = torch.xpu.__name__ + torch.cuda._device_t = torch.xpu._device_t + torch.cuda.warnings = torch.xpu.warnings + torch.cuda.__spec__ = torch.xpu.__spec__ + torch.cuda.BoolTensor = torch.xpu.BoolTensor + torch.cuda.CharStorage = torch.xpu.CharStorage + torch.cuda.__file__ = torch.xpu.__file__ + torch.cuda._is_in_bad_fork = torch.xpu.lazy_init._is_in_bad_fork + #torch.cuda.is_current_stream_capturing = torch.xpu.is_current_stream_capturing + + #Memory: + torch.cuda.memory = torch.xpu.memory + if 'linux' in sys.platform and "WSL2" in os.popen("uname -a").read(): + torch.xpu.empty_cache = lambda: None + torch.cuda.empty_cache = torch.xpu.empty_cache + torch.cuda.memory_stats = torch.xpu.memory_stats + torch.cuda.memory_summary = torch.xpu.memory_summary + torch.cuda.memory_snapshot = torch.xpu.memory_snapshot + torch.cuda.memory_allocated = torch.xpu.memory_allocated + torch.cuda.max_memory_allocated = torch.xpu.max_memory_allocated + torch.cuda.memory_reserved = torch.xpu.memory_reserved + torch.cuda.memory_cached = torch.xpu.memory_reserved + torch.cuda.max_memory_reserved = torch.xpu.max_memory_reserved + torch.cuda.max_memory_cached = torch.xpu.max_memory_reserved + torch.cuda.reset_peak_memory_stats = torch.xpu.reset_peak_memory_stats + torch.cuda.reset_max_memory_cached = torch.xpu.reset_peak_memory_stats + torch.cuda.reset_max_memory_allocated = torch.xpu.reset_peak_memory_stats + torch.cuda.memory_stats_as_nested_dict = torch.xpu.memory_stats_as_nested_dict + torch.cuda.reset_accumulated_memory_stats = torch.xpu.reset_accumulated_memory_stats + + #RNG: + torch.cuda.get_rng_state = torch.xpu.get_rng_state + torch.cuda.get_rng_state_all = torch.xpu.get_rng_state_all + torch.cuda.set_rng_state = torch.xpu.set_rng_state + torch.cuda.set_rng_state_all = torch.xpu.set_rng_state_all + torch.cuda.manual_seed = torch.xpu.manual_seed + torch.cuda.manual_seed_all = torch.xpu.manual_seed_all + torch.cuda.seed = torch.xpu.seed + torch.cuda.seed_all = torch.xpu.seed_all + torch.cuda.initial_seed = torch.xpu.initial_seed + + #AMP: + torch.cuda.amp = torch.xpu.amp + if not hasattr(torch.cuda.amp, "common"): + torch.cuda.amp.common = contextlib.nullcontext() + torch.cuda.amp.common.amp_definitely_not_available = lambda: False + try: + torch.cuda.amp.GradScaler = torch.xpu.amp.GradScaler + except Exception: # pylint: disable=broad-exception-caught + try: + from .gradscaler import gradscaler_init # pylint: disable=import-outside-toplevel, import-error + gradscaler_init() + torch.cuda.amp.GradScaler = torch.xpu.amp.GradScaler + except Exception: # pylint: disable=broad-exception-caught + torch.cuda.amp.GradScaler = ipex.cpu.autocast._grad_scaler.GradScaler + + #C + torch._C._cuda_getCurrentRawStream = ipex._C._getCurrentStream + ipex._C._DeviceProperties.major = 2023 + ipex._C._DeviceProperties.minor = 2 + + #Fix functions with ipex: + torch.cuda.mem_get_info = lambda device=None: [(torch.xpu.get_device_properties(device).total_memory - torch.xpu.memory_allocated(device)), torch.xpu.get_device_properties(device).total_memory] + torch._utils._get_available_device_type = lambda: "xpu" + torch.has_cuda = True + torch.cuda.has_half = True + torch.cuda.is_bf16_supported = lambda *args, **kwargs: True + torch.cuda.is_fp16_supported = lambda *args, **kwargs: True + torch.version.cuda = "11.7" + torch.cuda.get_device_capability = lambda *args, **kwargs: [11,7] + torch.cuda.get_device_properties.major = 11 + torch.cuda.get_device_properties.minor = 7 + torch.cuda.ipc_collect = lambda *args, **kwargs: None + torch.cuda.utilization = lambda *args, **kwargs: 0 + + ipex_hijacks() + attention_init() + except Exception as e: + return False, e + return True, None \ No newline at end of file diff --git a/lib/infer/modules/ipex/attention.py b/lib/infer/modules/ipex/attention.py new file mode 100644 index 000000000..0eed59630 --- /dev/null +++ b/lib/infer/modules/ipex/attention.py @@ -0,0 +1,128 @@ +import torch +import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + +# pylint: disable=protected-access, missing-function-docstring, line-too-long + +original_torch_bmm = torch.bmm +def torch_bmm(input, mat2, *, out=None): + if input.dtype != mat2.dtype: + mat2 = mat2.to(input.dtype) + + #ARC GPUs can't allocate more than 4GB to a single block, Slice it: + batch_size_attention, input_tokens, mat2_shape = input.shape[0], input.shape[1], mat2.shape[2] + block_multiply = 2.4 if input.dtype == torch.float32 else 1.2 + block_size = (batch_size_attention * input_tokens * mat2_shape) / 1024 * block_multiply #MB + split_slice_size = batch_size_attention + if block_size >= 4000: + do_split = True + #Find something divisible with the input_tokens + while ((split_slice_size * input_tokens * mat2_shape) / 1024 * block_multiply) > 4000: + split_slice_size = split_slice_size // 2 + if split_slice_size <= 1: + split_slice_size = 1 + break + else: + do_split = False + + split_block_size = (split_slice_size * input_tokens * mat2_shape) / 1024 * block_multiply #MB + split_2_slice_size = input_tokens + if split_block_size >= 4000: + do_split_2 = True + #Find something divisible with the input_tokens + while ((split_slice_size * split_2_slice_size * mat2_shape) / 1024 * block_multiply) > 4000: + split_2_slice_size = split_2_slice_size // 2 + if split_2_slice_size <= 1: + split_2_slice_size = 1 + break + else: + do_split_2 = False + + if do_split: + hidden_states = torch.zeros(input.shape[0], input.shape[1], mat2.shape[2], device=input.device, dtype=input.dtype) + for i in range(batch_size_attention // split_slice_size): + start_idx = i * split_slice_size + end_idx = (i + 1) * split_slice_size + if do_split_2: + for i2 in range(input_tokens // split_2_slice_size): # pylint: disable=invalid-name + start_idx_2 = i2 * split_2_slice_size + end_idx_2 = (i2 + 1) * split_2_slice_size + hidden_states[start_idx:end_idx, start_idx_2:end_idx_2] = original_torch_bmm( + input[start_idx:end_idx, start_idx_2:end_idx_2], + mat2[start_idx:end_idx, start_idx_2:end_idx_2], + out=out + ) + else: + hidden_states[start_idx:end_idx] = original_torch_bmm( + input[start_idx:end_idx], + mat2[start_idx:end_idx], + out=out + ) + else: + return original_torch_bmm(input, mat2, out=out) + return hidden_states + +original_scaled_dot_product_attention = torch.nn.functional.scaled_dot_product_attention +def scaled_dot_product_attention(query, key, value, attn_mask=None, dropout_p=0.0, is_causal=False): + #ARC GPUs can't allocate more than 4GB to a single block, Slice it: + shape_one, batch_size_attention, query_tokens, shape_four = query.shape + block_multiply = 2.4 if query.dtype == torch.float32 else 1.2 + block_size = (shape_one * batch_size_attention * query_tokens * shape_four) / 1024 * block_multiply #MB + split_slice_size = batch_size_attention + if block_size >= 4000: + do_split = True + #Find something divisible with the shape_one + while ((shape_one * split_slice_size * query_tokens * shape_four) / 1024 * block_multiply) > 4000: + split_slice_size = split_slice_size // 2 + if split_slice_size <= 1: + split_slice_size = 1 + break + else: + do_split = False + + split_block_size = (shape_one * split_slice_size * query_tokens * shape_four) / 1024 * block_multiply #MB + split_2_slice_size = query_tokens + if split_block_size >= 4000: + do_split_2 = True + #Find something divisible with the batch_size_attention + while ((shape_one * split_slice_size * split_2_slice_size * shape_four) / 1024 * block_multiply) > 4000: + split_2_slice_size = split_2_slice_size // 2 + if split_2_slice_size <= 1: + split_2_slice_size = 1 + break + else: + do_split_2 = False + + if do_split: + hidden_states = torch.zeros(query.shape, device=query.device, dtype=query.dtype) + for i in range(batch_size_attention // split_slice_size): + start_idx = i * split_slice_size + end_idx = (i + 1) * split_slice_size + if do_split_2: + for i2 in range(query_tokens // split_2_slice_size): # pylint: disable=invalid-name + start_idx_2 = i2 * split_2_slice_size + end_idx_2 = (i2 + 1) * split_2_slice_size + hidden_states[:, start_idx:end_idx, start_idx_2:end_idx_2] = original_scaled_dot_product_attention( + query[:, start_idx:end_idx, start_idx_2:end_idx_2], + key[:, start_idx:end_idx, start_idx_2:end_idx_2], + value[:, start_idx:end_idx, start_idx_2:end_idx_2], + attn_mask=attn_mask[:, start_idx:end_idx, start_idx_2:end_idx_2] if attn_mask is not None else attn_mask, + dropout_p=dropout_p, is_causal=is_causal + ) + else: + hidden_states[:, start_idx:end_idx] = original_scaled_dot_product_attention( + query[:, start_idx:end_idx], + key[:, start_idx:end_idx], + value[:, start_idx:end_idx], + attn_mask=attn_mask[:, start_idx:end_idx] if attn_mask is not None else attn_mask, + dropout_p=dropout_p, is_causal=is_causal + ) + else: + return original_scaled_dot_product_attention( + query, key, value, attn_mask=attn_mask, dropout_p=dropout_p, is_causal=is_causal + ) + return hidden_states + +def attention_init(): + #ARC GPUs can't allocate more than 4GB to a single block: + torch.bmm = torch_bmm + torch.nn.functional.scaled_dot_product_attention = scaled_dot_product_attention \ No newline at end of file diff --git a/lib/infer/modules/ipex/gradscaler.py b/lib/infer/modules/ipex/gradscaler.py new file mode 100644 index 000000000..3c265ddb3 --- /dev/null +++ b/lib/infer/modules/ipex/gradscaler.py @@ -0,0 +1,179 @@ +from collections import defaultdict +import torch +import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import +import intel_extension_for_pytorch._C as core # pylint: disable=import-error, unused-import + +# pylint: disable=protected-access, missing-function-docstring, line-too-long + +OptState = ipex.cpu.autocast._grad_scaler.OptState +_MultiDeviceReplicator = ipex.cpu.autocast._grad_scaler._MultiDeviceReplicator +_refresh_per_optimizer_state = ipex.cpu.autocast._grad_scaler._refresh_per_optimizer_state + +def _unscale_grads_(self, optimizer, inv_scale, found_inf, allow_fp16): # pylint: disable=unused-argument + per_device_inv_scale = _MultiDeviceReplicator(inv_scale) + per_device_found_inf = _MultiDeviceReplicator(found_inf) + + # To set up _amp_foreach_non_finite_check_and_unscale_, split grads by device and dtype. + # There could be hundreds of grads, so we'd like to iterate through them just once. + # However, we don't know their devices or dtypes in advance. + + # https://stackoverflow.com/questions/5029934/defaultdict-of-defaultdict + # Google says mypy struggles with defaultdicts type annotations. + per_device_and_dtype_grads = defaultdict(lambda: defaultdict(list)) # type: ignore[var-annotated] + # sync grad to master weight + if hasattr(optimizer, "sync_grad"): + optimizer.sync_grad() + with torch.no_grad(): + for group in optimizer.param_groups: + for param in group["params"]: + if param.grad is None: + continue + if (not allow_fp16) and param.grad.dtype == torch.float16: + raise ValueError("Attempting to unscale FP16 gradients.") + if param.grad.is_sparse: + # is_coalesced() == False means the sparse grad has values with duplicate indices. + # coalesce() deduplicates indices and adds all values that have the same index. + # For scaled fp16 values, there's a good chance coalescing will cause overflow, + # so we should check the coalesced _values(). + if param.grad.dtype is torch.float16: + param.grad = param.grad.coalesce() + to_unscale = param.grad._values() + else: + to_unscale = param.grad + + # -: is there a way to split by device and dtype without appending in the inner loop? + to_unscale = to_unscale.to("cpu") + per_device_and_dtype_grads[to_unscale.device][ + to_unscale.dtype + ].append(to_unscale) + + for _, per_dtype_grads in per_device_and_dtype_grads.items(): + for grads in per_dtype_grads.values(): + core._amp_foreach_non_finite_check_and_unscale_( + grads, + per_device_found_inf.get("cpu"), + per_device_inv_scale.get("cpu"), + ) + + return per_device_found_inf._per_device_tensors + +def unscale_(self, optimizer): + """ + Divides ("unscales") the optimizer's gradient tensors by the scale factor. + :meth:`unscale_` is optional, serving cases where you need to + :ref:`modify or inspect gradients` + between the backward pass(es) and :meth:`step`. + If :meth:`unscale_` is not called explicitly, gradients will be unscaled automatically during :meth:`step`. + Simple example, using :meth:`unscale_` to enable clipping of unscaled gradients:: + ... + scaler.scale(loss).backward() + scaler.unscale_(optimizer) + torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) + scaler.step(optimizer) + scaler.update() + Args: + optimizer (torch.optim.Optimizer): Optimizer that owns the gradients to be unscaled. + .. warning:: + :meth:`unscale_` should only be called once per optimizer per :meth:`step` call, + and only after all gradients for that optimizer's assigned parameters have been accumulated. + Calling :meth:`unscale_` twice for a given optimizer between each :meth:`step` triggers a RuntimeError. + .. warning:: + :meth:`unscale_` may unscale sparse gradients out of place, replacing the ``.grad`` attribute. + """ + if not self._enabled: + return + + self._check_scale_growth_tracker("unscale_") + + optimizer_state = self._per_optimizer_states[id(optimizer)] + + if optimizer_state["stage"] is OptState.UNSCALED: # pylint: disable=no-else-raise + raise RuntimeError( + "unscale_() has already been called on this optimizer since the last update()." + ) + elif optimizer_state["stage"] is OptState.STEPPED: + raise RuntimeError("unscale_() is being called after step().") + + # FP32 division can be imprecise for certain compile options, so we carry out the reciprocal in FP64. + assert self._scale is not None + inv_scale = self._scale.to("cpu").double().reciprocal().float().to(self._scale.device) + found_inf = torch.full( + (1,), 0.0, dtype=torch.float32, device=self._scale.device + ) + + optimizer_state["found_inf_per_device"] = self._unscale_grads_( + optimizer, inv_scale, found_inf, False + ) + optimizer_state["stage"] = OptState.UNSCALED + +def update(self, new_scale=None): + """ + Updates the scale factor. + If any optimizer steps were skipped the scale is multiplied by ``backoff_factor`` + to reduce it. If ``growth_interval`` unskipped iterations occurred consecutively, + the scale is multiplied by ``growth_factor`` to increase it. + Passing ``new_scale`` sets the new scale value manually. (``new_scale`` is not + used directly, it's used to fill GradScaler's internal scale tensor. So if + ``new_scale`` was a tensor, later in-place changes to that tensor will not further + affect the scale GradScaler uses internally.) + Args: + new_scale (float or :class:`torch.FloatTensor`, optional, default=None): New scale factor. + .. warning:: + :meth:`update` should only be called at the end of the iteration, after ``scaler.step(optimizer)`` has + been invoked for all optimizers used this iteration. + """ + if not self._enabled: + return + + _scale, _growth_tracker = self._check_scale_growth_tracker("update") + + if new_scale is not None: + # Accept a new user-defined scale. + if isinstance(new_scale, float): + self._scale.fill_(new_scale) # type: ignore[union-attr] + else: + reason = "new_scale should be a float or a 1-element torch.FloatTensor with requires_grad=False." + assert isinstance(new_scale, torch.FloatTensor), reason # type: ignore[attr-defined] + assert new_scale.numel() == 1, reason + assert new_scale.requires_grad is False, reason + self._scale.copy_(new_scale) # type: ignore[union-attr] + else: + # Consume shared inf/nan data collected from optimizers to update the scale. + # If all found_inf tensors are on the same device as self._scale, this operation is asynchronous. + found_infs = [ + found_inf.to(device="cpu", non_blocking=True) + for state in self._per_optimizer_states.values() + for found_inf in state["found_inf_per_device"].values() + ] + + assert len(found_infs) > 0, "No inf checks were recorded prior to update." + + found_inf_combined = found_infs[0] + if len(found_infs) > 1: + for i in range(1, len(found_infs)): + found_inf_combined += found_infs[i] + + to_device = _scale.device + _scale = _scale.to("cpu") + _growth_tracker = _growth_tracker.to("cpu") + + core._amp_update_scale_( + _scale, + _growth_tracker, + found_inf_combined, + self._growth_factor, + self._backoff_factor, + self._growth_interval, + ) + + _scale = _scale.to(to_device) + _growth_tracker = _growth_tracker.to(to_device) + # To prepare for next iteration, clear the data collected from optimizers this iteration. + self._per_optimizer_states = defaultdict(_refresh_per_optimizer_state) + +def gradscaler_init(): + torch.xpu.amp.GradScaler = ipex.cpu.autocast._grad_scaler.GradScaler + torch.xpu.amp.GradScaler._unscale_grads_ = _unscale_grads_ + torch.xpu.amp.GradScaler.unscale_ = unscale_ + torch.xpu.amp.GradScaler.update = update + return torch.xpu.amp.GradScaler \ No newline at end of file diff --git a/lib/infer/modules/ipex/hijacks.py b/lib/infer/modules/ipex/hijacks.py new file mode 100644 index 000000000..b06f3a9c1 --- /dev/null +++ b/lib/infer/modules/ipex/hijacks.py @@ -0,0 +1,196 @@ +import contextlib +import importlib +import torch +import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + +# pylint: disable=protected-access, missing-function-docstring, line-too-long, unnecessary-lambda, no-else-return + +class CondFunc: # pylint: disable=missing-class-docstring + def __new__(cls, orig_func, sub_func, cond_func): + self = super(CondFunc, cls).__new__(cls) + if isinstance(orig_func, str): + func_path = orig_func.split('.') + for i in range(len(func_path)-1, -1, -1): + try: + resolved_obj = importlib.import_module('.'.join(func_path[:i])) + break + except ImportError: + pass + for attr_name in func_path[i:-1]: + resolved_obj = getattr(resolved_obj, attr_name) + orig_func = getattr(resolved_obj, func_path[-1]) + setattr(resolved_obj, func_path[-1], lambda *args, **kwargs: self(*args, **kwargs)) + self.__init__(orig_func, sub_func, cond_func) + return lambda *args, **kwargs: self(*args, **kwargs) + def __init__(self, orig_func, sub_func, cond_func): + self.__orig_func = orig_func + self.__sub_func = sub_func + self.__cond_func = cond_func + def __call__(self, *args, **kwargs): + if not self.__cond_func or self.__cond_func(self.__orig_func, *args, **kwargs): + return self.__sub_func(self.__orig_func, *args, **kwargs) + else: + return self.__orig_func(*args, **kwargs) + +_utils = torch.utils.data._utils +def _shutdown_workers(self): + if torch.utils.data._utils is None or torch.utils.data._utils.python_exit_status is True or torch.utils.data._utils.python_exit_status is None: + return + if hasattr(self, "_shutdown") and not self._shutdown: + self._shutdown = True + try: + if hasattr(self, '_pin_memory_thread'): + self._pin_memory_thread_done_event.set() + self._worker_result_queue.put((None, None)) + self._pin_memory_thread.join() + self._worker_result_queue.cancel_join_thread() + self._worker_result_queue.close() + self._workers_done_event.set() + for worker_id in range(len(self._workers)): + if self._persistent_workers or self._workers_status[worker_id]: + self._mark_worker_as_unavailable(worker_id, shutdown=True) + for w in self._workers: # pylint: disable=invalid-name + w.join(timeout=torch.utils.data._utils.MP_STATUS_CHECK_INTERVAL) + for q in self._index_queues: # pylint: disable=invalid-name + q.cancel_join_thread() + q.close() + finally: + if self._worker_pids_set: + torch.utils.data._utils.signal_handling._remove_worker_pids(id(self)) + self._worker_pids_set = False + for w in self._workers: # pylint: disable=invalid-name + if w.is_alive(): + w.terminate() + +class DummyDataParallel(torch.nn.Module): # pylint: disable=missing-class-docstring, unused-argument, too-few-public-methods + def __new__(cls, module, device_ids=None, output_device=None, dim=0): # pylint: disable=unused-argument + if isinstance(device_ids, list) and len(device_ids) > 1: + print("IPEX backend doesn't support DataParallel on multiple XPU devices") + return module.to("xpu") + +def return_null_context(*args, **kwargs): # pylint: disable=unused-argument + return contextlib.nullcontext() + +def check_device(device): + return bool((isinstance(device, torch.device) and device.type == "cuda") or (isinstance(device, str) and "cuda" in device) or isinstance(device, int)) + +def return_xpu(device): + return f"xpu:{device[-1]}" if isinstance(device, str) and ":" in device else f"xpu:{device}" if isinstance(device, int) else torch.device("xpu") if isinstance(device, torch.device) else "xpu" + +def ipex_no_cuda(orig_func, *args, **kwargs): + torch.cuda.is_available = lambda: False + orig_func(*args, **kwargs) + torch.cuda.is_available = torch.xpu.is_available + +original_autocast = torch.autocast +def ipex_autocast(*args, **kwargs): + if len(args) > 0 and args[0] == "cuda": + return original_autocast("xpu", *args[1:], **kwargs) + else: + return original_autocast(*args, **kwargs) + +original_torch_cat = torch.cat +def torch_cat(tensor, *args, **kwargs): + if len(tensor) == 3 and (tensor[0].dtype != tensor[1].dtype or tensor[2].dtype != tensor[1].dtype): + return original_torch_cat([tensor[0].to(tensor[1].dtype), tensor[1], tensor[2].to(tensor[1].dtype)], *args, **kwargs) + else: + return original_torch_cat(tensor, *args, **kwargs) + +original_interpolate = torch.nn.functional.interpolate +def interpolate(tensor, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False): # pylint: disable=too-many-arguments + if antialias or align_corners is not None: + return_device = tensor.device + return_dtype = tensor.dtype + return original_interpolate(tensor.to("cpu", dtype=torch.float32), size=size, scale_factor=scale_factor, mode=mode, + align_corners=align_corners, recompute_scale_factor=recompute_scale_factor, antialias=antialias).to(return_device, dtype=return_dtype) + else: + return original_interpolate(tensor, size=size, scale_factor=scale_factor, mode=mode, + align_corners=align_corners, recompute_scale_factor=recompute_scale_factor, antialias=antialias) + +original_linalg_solve = torch.linalg.solve +def linalg_solve(A, B, *args, **kwargs): # pylint: disable=invalid-name + if A.device != torch.device("cpu") or B.device != torch.device("cpu"): + return_device = A.device + return original_linalg_solve(A.to("cpu"), B.to("cpu"), *args, **kwargs).to(return_device) + else: + return original_linalg_solve(A, B, *args, **kwargs) + +def ipex_hijacks(): + CondFunc('torch.Tensor.to', + lambda orig_func, self, device=None, *args, **kwargs: orig_func(self, return_xpu(device), *args, **kwargs), + lambda orig_func, self, device=None, *args, **kwargs: check_device(device)) + CondFunc('torch.Tensor.cuda', + lambda orig_func, self, device=None, *args, **kwargs: orig_func(self, return_xpu(device), *args, **kwargs), + lambda orig_func, self, device=None, *args, **kwargs: check_device(device)) + CondFunc('torch.empty', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + CondFunc('torch.load', + lambda orig_func, *args, map_location=None, **kwargs: orig_func(*args, return_xpu(map_location), **kwargs), + lambda orig_func, *args, map_location=None, **kwargs: map_location is None or check_device(map_location)) + CondFunc('torch.randn', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + CondFunc('torch.ones', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + CondFunc('torch.zeros', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + CondFunc('torch.tensor', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + CondFunc('torch.linspace', + lambda orig_func, *args, device=None, **kwargs: orig_func(*args, device=return_xpu(device), **kwargs), + lambda orig_func, *args, device=None, **kwargs: check_device(device)) + + CondFunc('torch.Generator', + lambda orig_func, device=None: torch.xpu.Generator(device), + lambda orig_func, device=None: device is not None and device != torch.device("cpu") and device != "cpu") + + CondFunc('torch.batch_norm', + lambda orig_func, input, weight, bias, *args, **kwargs: orig_func(input, + weight if weight is not None else torch.ones(input.size()[1], device=input.device), + bias if bias is not None else torch.zeros(input.size()[1], device=input.device), *args, **kwargs), + lambda orig_func, input, *args, **kwargs: input.device != torch.device("cpu")) + CondFunc('torch.instance_norm', + lambda orig_func, input, weight, bias, *args, **kwargs: orig_func(input, + weight if weight is not None else torch.ones(input.size()[1], device=input.device), + bias if bias is not None else torch.zeros(input.size()[1], device=input.device), *args, **kwargs), + lambda orig_func, input, *args, **kwargs: input.device != torch.device("cpu")) + + #Functions with dtype errors: + CondFunc('torch.nn.modules.GroupNorm.forward', + lambda orig_func, self, input: orig_func(self, input.to(self.weight.data.dtype)), + lambda orig_func, self, input: input.dtype != self.weight.data.dtype) + CondFunc('torch.nn.modules.linear.Linear.forward', + lambda orig_func, self, input: orig_func(self, input.to(self.weight.data.dtype)), + lambda orig_func, self, input: input.dtype != self.weight.data.dtype) + CondFunc('torch.nn.modules.conv.Conv2d.forward', + lambda orig_func, self, input: orig_func(self, input.to(self.weight.data.dtype)), + lambda orig_func, self, input: input.dtype != self.weight.data.dtype) + CondFunc('torch.nn.functional.layer_norm', + lambda orig_func, input, normalized_shape=None, weight=None, *args, **kwargs: + orig_func(input.to(weight.data.dtype), normalized_shape, weight, *args, **kwargs), + lambda orig_func, input, normalized_shape=None, weight=None, *args, **kwargs: + weight is not None and input.dtype != weight.data.dtype) + + #Diffusers Float64 (ARC GPUs doesn't support double or Float64): + if not torch.xpu.has_fp64_dtype(): + CondFunc('torch.from_numpy', + lambda orig_func, ndarray: orig_func(ndarray.astype('float32')), + lambda orig_func, ndarray: ndarray.dtype == float) + + #Broken functions when torch.cuda.is_available is True: + CondFunc('torch.utils.data.dataloader._BaseDataLoaderIter.__init__', + lambda orig_func, *args, **kwargs: ipex_no_cuda(orig_func, *args, **kwargs), + lambda orig_func, *args, **kwargs: True) + + #Functions that make compile mad with CondFunc: + torch.utils.data.dataloader._MultiProcessingDataLoaderIter._shutdown_workers = _shutdown_workers + torch.nn.DataParallel = DummyDataParallel + torch.autocast = ipex_autocast + torch.cat = torch_cat + torch.linalg.solve = linalg_solve + torch.nn.functional.interpolate = interpolate + torch.backends.cuda.sdp_kernel = return_null_context \ No newline at end of file diff --git a/lib/infer/modules/onnx/export.py b/lib/infer/modules/onnx/export.py new file mode 100644 index 000000000..f7a35562f --- /dev/null +++ b/lib/infer/modules/onnx/export.py @@ -0,0 +1,52 @@ +import torch + +from lib.infer.infer_libs.infer_pack.models_onnx import SynthesizerTrnMsNSFsidM + + +def export_onnx(ModelPath, ExportedPath): + cpt = torch.load(ModelPath, map_location="cpu") + cpt["config"][-3] = cpt["weight"]["emb_g.weight"].shape[0] + vec_channels = 256 if cpt.get("version", "v1") == "v1" else 768 + + test_phone = torch.rand(1, 200, vec_channels) # hidden unit + test_phone_lengths = torch.tensor([200]).long() # hidden unit 长度(貌似没啥用) + test_pitch = torch.randint(size=(1, 200), low=5, high=255) # 基频(单位赫兹) + test_pitchf = torch.rand(1, 200) # nsf基频 + test_ds = torch.LongTensor([0]) # 说话人ID + test_rnd = torch.rand(1, 192, 200) # 噪声(加入随机因子) + + device = "cpu" # 导出时设备(不影响使用模型) + + net_g = SynthesizerTrnMsNSFsidM( + *cpt["config"], is_half=False, version=cpt.get("version", "v1") + ) # fp32导出(C++要支持fp16必须手动将内存重新排列所以暂时不用fp16) + net_g.load_state_dict(cpt["weight"], strict=False) + input_names = ["phone", "phone_lengths", "pitch", "pitchf", "ds", "rnd"] + output_names = [ + "audio", + ] + # net_g.construct_spkmixmap(n_speaker) 多角色混合轨道导出 + torch.onnx.export( + net_g, + ( + test_phone.to(device), + test_phone_lengths.to(device), + test_pitch.to(device), + test_pitchf.to(device), + test_ds.to(device), + test_rnd.to(device), + ), + ExportedPath, + dynamic_axes={ + "phone": [1], + "pitch": [1], + "pitchf": [1], + "rnd": [2], + }, + do_constant_folding=False, + opset_version=13, + verbose=False, + input_names=input_names, + output_names=output_names, + ) + return "Finished" diff --git a/lib/infer/modules/train/extract/extract_f0_print.py b/lib/infer/modules/train/extract/extract_f0_print.py new file mode 100644 index 000000000..a0ff52dca --- /dev/null +++ b/lib/infer/modules/train/extract/extract_f0_print.py @@ -0,0 +1,300 @@ +import os +import sys +import traceback + +import parselmouth + +now_dir = os.getcwd() +sys.path.append(now_dir) +import logging + + +import numpy as np +import pyworld +import torchcrepe +import torch +#from torch import Tensor # Fork Feature. Used for pitch prediction for torch crepe. +import tqdm +from lib.infer.infer_libs.audio import load_audio + +logging.getLogger("numba").setLevel(logging.WARNING) +from multiprocessing import Process + +exp_dir = sys.argv[1] +f = open("%s/extract_f0_feature.log" % exp_dir, "a+") + +DoFormant = False +Quefrency = 1.0 +Timbre = 1.0 + +def printt(strr): + print(strr) + f.write(f"{strr}\n") + f.flush() + + +n_p = int(sys.argv[2]) +f0method = sys.argv[3] +extraction_crepe_hop_length = 0 +try: + extraction_crepe_hop_length = int(sys.argv[4]) +except: + print("Temp Issue. echl is not being passed with argument!") + extraction_crepe_hop_length = 128 + +class FeatureInput(object): + def __init__(self, samplerate=16000, hop_size=160): + self.fs = samplerate + self.hop = hop_size + + self.f0_method_dict = self.get_f0_method_dict() + + self.f0_bin = 256 + self.f0_max = 1100.0 + self.f0_min = 50.0 + self.f0_mel_min = 1127 * np.log(1 + self.f0_min / 700) + self.f0_mel_max = 1127 * np.log(1 + self.f0_max / 700) + + def mncrepe(self, method, x, p_len, crepe_hop_length): + f0 = None + torch_device_index = 0 + torch_device = torch.device( + f"cuda:{torch_device_index % torch.cuda.device_count()}" + ) if torch.cuda.is_available() \ + else torch.device("mps") if torch.backends.mps.is_available() \ + else torch.device("cpu") + + audio = torch.from_numpy(x.astype(np.float32)).to(torch_device, copy=True) + audio /= torch.quantile(torch.abs(audio), 0.999) + audio = torch.unsqueeze(audio, dim=0) + if audio.ndim == 2 and audio.shape[0] > 1: + audio = torch.mean(audio, dim=0, keepdim=True).detach() + audio = audio.detach() + + if method == 'mangio-crepe': + pitch: torch.Tensor = torchcrepe.predict( + audio, + self.fs, + crepe_hop_length, + self.f0_min, + self.f0_max, + "full", + batch_size=crepe_hop_length * 2, + device=torch_device, + pad=True, + ) + p_len = p_len or x.shape[0] // crepe_hop_length + # Resize the pitch + source = np.array(pitch.squeeze(0).cpu().float().numpy()) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * p_len, len(source)) / p_len, + np.arange(0, len(source)), + source, + ) + f0 = np.nan_to_num(target) + + elif method == 'crepe': + batch_size = 512 + audio = torch.tensor(np.copy(x))[None].float() + f0, pd = torchcrepe.predict( + audio, + self.fs, + 160, + self.f0_min, + self.f0_max, + "full", + batch_size=batch_size, + device=torch_device, + return_periodicity=True, + ) + pd = torchcrepe.filter.median(pd, 3) + f0 = torchcrepe.filter.mean(f0, 3) + f0[pd < 0.1] = 0 + f0 = f0[0].cpu().numpy() + f0 = f0[1:] # Get rid of extra first frame + + return f0 + + def get_pm(self, x, p_len): + f0 = parselmouth.Sound(x, self.fs).to_pitch_ac( + time_step=160 / 16000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ).selected_array["frequency"] + + return np.pad( + f0, + [[max(0, (p_len - len(f0) + 1) // 2), max(0, p_len - len(f0) - (p_len - len(f0) + 1) // 2)]], + mode="constant" + ) + + def get_harvest(self, x): + f0_spectral = pyworld.harvest( + x.astype(np.double), + fs=self.fs, + f0_ceil=self.f0_max, + f0_floor=self.f0_min, + frame_period=1000 * self.hop / self.fs, + ) + return pyworld.stonemask(x.astype(np.double), *f0_spectral, self.fs) + + def get_dio(self, x): + f0_spectral = pyworld.dio( + x.astype(np.double), + fs=self.fs, + f0_ceil=self.f0_max, + f0_floor=self.f0_min, + frame_period=1000 * self.hop / self.fs, + ) + return pyworld.stonemask(x.astype(np.double), *f0_spectral, self.fs) + + def get_rmvpe(self, x): + if hasattr(self, "model_rmvpe") == False: + from lib.infer.infer_libs.rmvpe import RMVPE + + print("Loading rmvpe model") + self.model_rmvpe = RMVPE( + "assets/rmvpe/rmvpe.pt", is_half=False, device="cpu" + ) + return self.model_rmvpe.infer_from_audio(x, thred=0.03) + + def get_rmvpe_dml(self, x): + ... + + def get_f0_method_dict(self): + return { + "pm": self.get_pm, + "harvest": self.get_harvest, + "dio": self.get_dio, + "rmvpe": self.get_rmvpe + } + + def get_f0_hybrid_computation( + self, + methods_str, + x, + p_len, + crepe_hop_length, + ): + # Get various f0 methods from input to use in the computation stack + s = methods_str + s = s.split("hybrid")[1] + s = s.replace("[", "").replace("]", "") + methods = s.split("+") + f0_computation_stack = [] + + for method in methods: + if method in self.f0_method_dict: + f0 = self.f0_method_dict[method](x, p_len) if method == 'pm' else self.f0_method_dict[method](x) + f0_computation_stack.append(f0) + elif method == 'crepe' or method == 'mangio-crepe': + self.the_other_complex_function(x, method, crepe_hop_length) + + if len(f0_computation_stack) != 0: + f0_median_hybrid = np.nanmedian(f0_computation_stack, axis=0) if len(f0_computation_stack)>1 else f0_computation_stack[0] + return f0_median_hybrid + else: + raise ValueError("No valid methods were provided") + + def compute_f0(self, path, f0_method, crepe_hop_length): + x = load_audio(path, self.fs, DoFormant, Quefrency, Timbre) + p_len = x.shape[0] // self.hop + + if f0_method in self.f0_method_dict: + f0 = self.f0_method_dict[f0_method](x, p_len) if f0_method == 'pm' else self.f0_method_dict[f0_method](x) + elif f0_method in ['crepe', 'mangio-crepe']: + f0 = self.mncrepe(f0_method, x, p_len, crepe_hop_length) + elif "hybrid" in f0_method: # EXPERIMENTAL + # Perform hybrid median pitch estimation + f0 = self.get_f0_hybrid_computation( + f0_method, + x, + p_len, + crepe_hop_length, + ) + return f0 + + def coarse_f0(self, f0): + f0_mel = 1127 * np.log(1 + f0 / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - self.f0_mel_min) * ( + self.f0_bin - 2 + ) / (self.f0_mel_max - self.f0_mel_min) + 1 + + # use 0 or 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > self.f0_bin - 1] = self.f0_bin - 1 + f0_coarse = np.rint(f0_mel).astype(int) + assert f0_coarse.max() <= 255 and f0_coarse.min() >= 1, ( + f0_coarse.max(), + f0_coarse.min(), + ) + return f0_coarse + + def go(self, paths, f0_method, crepe_hop_length, thread_n): + if len(paths) == 0: + printt("no-f0-todo") + return + with tqdm.tqdm(total=len(paths), leave=True, position=thread_n) as pbar: + description = f"thread:{thread_n}, f0ing, Hop-Length:{crepe_hop_length}" + pbar.set_description(description) + + for idx, (inp_path, opt_path1, opt_path2) in enumerate(paths): + try: + if ( + os.path.exists(opt_path1 + ".npy") + and os.path.exists(opt_path2 + ".npy") + ): + pbar.update(1) + continue + + featur_pit = self.compute_f0(inp_path, f0_method, crepe_hop_length) + np.save( + opt_path2, + featur_pit, + allow_pickle=False, + ) # nsf + coarse_pit = self.coarse_f0(featur_pit) + np.save( + opt_path1, + coarse_pit, + allow_pickle=False, + ) # ori + pbar.update(1) + except Exception as e: + printt(f"f0fail-{idx}-{inp_path}-{traceback.format_exc()}") + + +if __name__ == "__main__": + # exp_dir=r"E:\codes\py39\dataset\mi-test" + # n_p=16 + # f = open("%s/log_extract_f0.log"%exp_dir, "w") + printt(sys.argv) + featureInput = FeatureInput() + paths = [] + inp_root = "%s/1_16k_wavs" % (exp_dir) + opt_root1 = "%s/2a_f0" % (exp_dir) + opt_root2 = "%s/2b-f0nsf" % (exp_dir) + + os.makedirs(opt_root1, exist_ok=True) + os.makedirs(opt_root2, exist_ok=True) + for name in sorted(list(os.listdir(inp_root))): + inp_path = "%s/%s" % (inp_root, name) + if "spec" in inp_path: + continue + opt_path1 = "%s/%s" % (opt_root1, name) + opt_path2 = "%s/%s" % (opt_root2, name) + paths.append([inp_path, opt_path1, opt_path2]) + + ps = [] + print("Using f0 method: " + f0method) + for i in range(n_p): + p = Process( + target=featureInput.go, + args=(paths[i::n_p], f0method, extraction_crepe_hop_length, i), + ) + ps.append(p) + p.start() + for i in range(n_p): + ps[i].join() diff --git a/lib/infer/modules/train/extract/extract_f0_rmvpe.py b/lib/infer/modules/train/extract/extract_f0_rmvpe.py new file mode 100644 index 000000000..9e8e95119 --- /dev/null +++ b/lib/infer/modules/train/extract/extract_f0_rmvpe.py @@ -0,0 +1,141 @@ +import os +import sys +import traceback + +import parselmouth + +now_dir = os.getcwd() +sys.path.append(now_dir) +import logging + +import numpy as np +import pyworld + +from lib.infer.infer_libs.audio import load_audio + +logging.getLogger("numba").setLevel(logging.WARNING) + +n_part = int(sys.argv[1]) +i_part = int(sys.argv[2]) +i_gpu = sys.argv[3] +os.environ["CUDA_VISIBLE_DEVICES"] = str(i_gpu) +exp_dir = sys.argv[4] +is_half = sys.argv[5] +f = open("%s/extract_f0_feature.log" % exp_dir, "a+") + + +def printt(strr): + print(strr) + f.write("%s\n" % strr) + f.flush() + + +class FeatureInput(object): + def __init__(self, samplerate=16000, hop_size=160): + self.fs = samplerate + self.hop = hop_size + + self.f0_bin = 256 + self.f0_max = 1100.0 + self.f0_min = 50.0 + self.f0_mel_min = 1127 * np.log(1 + self.f0_min / 700) + self.f0_mel_max = 1127 * np.log(1 + self.f0_max / 700) + + def compute_f0(self, path, f0_method): + x = load_audio(path, self.fs) + # p_len = x.shape[0] // self.hop + if f0_method == "rmvpe": + if hasattr(self, "model_rmvpe") == False: + from lib.infer.infer_libs.rmvpe import RMVPE + + print("Loading rmvpe model") + self.model_rmvpe = RMVPE( + "assets/rmvpe/rmvpe.pt", is_half=is_half, device="cuda" + ) + f0 = self.model_rmvpe.infer_from_audio(x, thred=0.03) + return f0 + + def coarse_f0(self, f0): + f0_mel = 1127 * np.log(1 + f0 / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - self.f0_mel_min) * ( + self.f0_bin - 2 + ) / (self.f0_mel_max - self.f0_mel_min) + 1 + + # use 0 or 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > self.f0_bin - 1] = self.f0_bin - 1 + f0_coarse = np.rint(f0_mel).astype(int) + assert f0_coarse.max() <= 255 and f0_coarse.min() >= 1, ( + f0_coarse.max(), + f0_coarse.min(), + ) + return f0_coarse + + def go(self, paths, f0_method): + if len(paths) == 0: + printt("no-f0-todo") + else: + printt("todo-f0-%s" % len(paths)) + n = max(len(paths) // 5, 1) # 每个进程最多打印5条 + for idx, (inp_path, opt_path1, opt_path2) in enumerate(paths): + try: + if idx % n == 0: + printt("f0ing,now-%s,all-%s,-%s" % (idx, len(paths), inp_path)) + if ( + os.path.exists(opt_path1 + ".npy") == True + and os.path.exists(opt_path2 + ".npy") == True + ): + continue + featur_pit = self.compute_f0(inp_path, f0_method) + np.save( + opt_path2, + featur_pit, + allow_pickle=False, + ) # nsf + coarse_pit = self.coarse_f0(featur_pit) + np.save( + opt_path1, + coarse_pit, + allow_pickle=False, + ) # ori + except: + printt("f0fail-%s-%s-%s" % (idx, inp_path, traceback.format_exc())) + + +if __name__ == "__main__": + # exp_dir=r"E:\codes\py39\dataset\mi-test" + # n_p=16 + # f = open("%s/log_extract_f0.log"%exp_dir, "w") + printt(sys.argv) + featureInput = FeatureInput() + paths = [] + inp_root = "%s/1_16k_wavs" % (exp_dir) + opt_root1 = "%s/2a_f0" % (exp_dir) + opt_root2 = "%s/2b-f0nsf" % (exp_dir) + + os.makedirs(opt_root1, exist_ok=True) + os.makedirs(opt_root2, exist_ok=True) + for name in sorted(list(os.listdir(inp_root))): + inp_path = "%s/%s" % (inp_root, name) + if "spec" in inp_path: + continue + opt_path1 = "%s/%s" % (opt_root1, name) + opt_path2 = "%s/%s" % (opt_root2, name) + paths.append([inp_path, opt_path1, opt_path2]) + try: + featureInput.go(paths[i_part::n_part], "rmvpe") + except: + printt("f0_all_fail-%s" % (traceback.format_exc())) + # ps = [] + # for i in range(n_p): + # p = Process( + # target=featureInput.go, + # args=( + # paths[i::n_p], + # f0method, + # ), + # ) + # ps.append(p) + # p.start() + # for i in range(n_p): + # ps[i].join() diff --git a/lib/infer/modules/train/extract/extract_f0_rmvpe_dml.py b/lib/infer/modules/train/extract/extract_f0_rmvpe_dml.py new file mode 100644 index 000000000..a5b48d57d --- /dev/null +++ b/lib/infer/modules/train/extract/extract_f0_rmvpe_dml.py @@ -0,0 +1,139 @@ +import os +import sys +import traceback + +import parselmouth + +now_dir = os.getcwd() +sys.path.append(now_dir) +import logging + +import numpy as np +import pyworld + +from lib.infer.infer_libs.audio import load_audio + +logging.getLogger("numba").setLevel(logging.WARNING) + +exp_dir = sys.argv[1] +import torch_directml + +device = torch_directml.device(torch_directml.default_device()) +f = open("%s/extract_f0_feature.log" % exp_dir, "a+") + + +def printt(strr): + print(strr) + f.write("%s\n" % strr) + f.flush() + + +class FeatureInput(object): + def __init__(self, samplerate=16000, hop_size=160): + self.fs = samplerate + self.hop = hop_size + + self.f0_bin = 256 + self.f0_max = 1100.0 + self.f0_min = 50.0 + self.f0_mel_min = 1127 * np.log(1 + self.f0_min / 700) + self.f0_mel_max = 1127 * np.log(1 + self.f0_max / 700) + + def compute_f0(self, path, f0_method): + x = load_audio(path, self.fs) + # p_len = x.shape[0] // self.hop + if f0_method == "rmvpe": + if hasattr(self, "model_rmvpe") == False: + from lib.infer.infer_libs.rmvpe import RMVPE + + print("Loading rmvpe model") + self.model_rmvpe = RMVPE( + "assets/rmvpe/rmvpe.pt", is_half=False, device=device + ) + f0 = self.model_rmvpe.infer_from_audio(x, thred=0.03) + return f0 + + def coarse_f0(self, f0): + f0_mel = 1127 * np.log(1 + f0 / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - self.f0_mel_min) * ( + self.f0_bin - 2 + ) / (self.f0_mel_max - self.f0_mel_min) + 1 + + # use 0 or 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > self.f0_bin - 1] = self.f0_bin - 1 + f0_coarse = np.rint(f0_mel).astype(int) + assert f0_coarse.max() <= 255 and f0_coarse.min() >= 1, ( + f0_coarse.max(), + f0_coarse.min(), + ) + return f0_coarse + + def go(self, paths, f0_method): + if len(paths) == 0: + printt("no-f0-todo") + else: + printt("todo-f0-%s" % len(paths)) + n = max(len(paths) // 5, 1) # 每个进程最多打印5条 + for idx, (inp_path, opt_path1, opt_path2) in enumerate(paths): + try: + if idx % n == 0: + printt("f0ing,now-%s,all-%s,-%s" % (idx, len(paths), inp_path)) + if ( + os.path.exists(opt_path1 + ".npy") == True + and os.path.exists(opt_path2 + ".npy") == True + ): + continue + featur_pit = self.compute_f0(inp_path, f0_method) + np.save( + opt_path2, + featur_pit, + allow_pickle=False, + ) # nsf + coarse_pit = self.coarse_f0(featur_pit) + np.save( + opt_path1, + coarse_pit, + allow_pickle=False, + ) # ori + except: + printt("f0fail-%s-%s-%s" % (idx, inp_path, traceback.format_exc())) + + +if __name__ == "__main__": + # exp_dir=r"E:\codes\py39\dataset\mi-test" + # n_p=16 + # f = open("%s/log_extract_f0.log"%exp_dir, "w") + printt(sys.argv) + featureInput = FeatureInput() + paths = [] + inp_root = "%s/1_16k_wavs" % (exp_dir) + opt_root1 = "%s/2a_f0" % (exp_dir) + opt_root2 = "%s/2b-f0nsf" % (exp_dir) + + os.makedirs(opt_root1, exist_ok=True) + os.makedirs(opt_root2, exist_ok=True) + for name in sorted(list(os.listdir(inp_root))): + inp_path = "%s/%s" % (inp_root, name) + if "spec" in inp_path: + continue + opt_path1 = "%s/%s" % (opt_root1, name) + opt_path2 = "%s/%s" % (opt_root2, name) + paths.append([inp_path, opt_path1, opt_path2]) + try: + featureInput.go(paths, "rmvpe") + except: + printt("f0_all_fail-%s" % (traceback.format_exc())) + # ps = [] + # for i in range(n_p): + # p = Process( + # target=featureInput.go, + # args=( + # paths[i::n_p], + # f0method, + # ), + # ) + # ps.append(p) + # p.start() + # for i in range(n_p): + # ps[i].join() diff --git a/lib/infer/modules/train/extract_feature_print.py b/lib/infer/modules/train/extract_feature_print.py new file mode 100644 index 000000000..f771dd9b8 --- /dev/null +++ b/lib/infer/modules/train/extract_feature_print.py @@ -0,0 +1,137 @@ +import os +import sys +import traceback + +os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" +os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"] = "0.0" + +device = sys.argv[1] +n_part = int(sys.argv[2]) +i_part = int(sys.argv[3]) +if len(sys.argv) == 6: + exp_dir = sys.argv[4] + version = sys.argv[5] +else: + i_gpu = sys.argv[4] + exp_dir = sys.argv[5] + os.environ["CUDA_VISIBLE_DEVICES"] = str(i_gpu) + version = sys.argv[6] +import fairseq +import numpy as np +import soundfile as sf +import torch +import torch.nn.functional as F + +if "privateuseone" not in device: + device = "cpu" + if torch.cuda.is_available(): + device = "cuda" + elif torch.backends.mps.is_available(): + device = "mps" +else: + import torch_directml + + device = torch_directml.device(torch_directml.default_device()) + + def forward_dml(ctx, x, scale): + ctx.scale = scale + res = x.clone().detach() + return res + + fairseq.modules.grad_multiply.GradMultiply.forward = forward_dml + +f = open("%s/extract_f0_feature.log" % exp_dir, "a+") + + +def printt(strr): + print(strr) + f.write("%s\n" % strr) + f.flush() + + +printt(sys.argv) +model_path = "assets/hubert/hubert_base.pt" + +printt(exp_dir) +wavPath = "%s/1_16k_wavs" % exp_dir +outPath = ( + "%s/3_feature256" % exp_dir if version == "v1" else "%s/3_feature768" % exp_dir +) +os.makedirs(outPath, exist_ok=True) + + +# wave must be 16k, hop_size=320 +def readwave(wav_path, normalize=False): + wav, sr = sf.read(wav_path) + assert sr == 16000 + feats = torch.from_numpy(wav).float() + if feats.dim() == 2: # double channels + feats = feats.mean(-1) + assert feats.dim() == 1, feats.dim() + if normalize: + with torch.no_grad(): + feats = F.layer_norm(feats, feats.shape) + feats = feats.view(1, -1) + return feats + + +# HuBERT model +printt("load model(s) from {}".format(model_path)) +# if hubert model is exist +if os.access(model_path, os.F_OK) == False: + printt( + "Error: Extracting is shut down because %s does not exist, you may download it from https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main" + % model_path + ) + exit(0) +models, saved_cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task( + [model_path], + suffix="", +) +model = models[0] +model = model.to(device) +printt("move model to %s" % device) +if device not in ["mps", "cpu"]: + model = model.half() +model.eval() + +todo = sorted(list(os.listdir(wavPath)))[i_part::n_part] +n = max(1, len(todo) // 10) # 最多打印十条 +if len(todo) == 0: + printt("no-feature-todo") +else: + printt("all-feature-%s" % len(todo)) + for idx, file in enumerate(todo): + try: + if file.endswith(".wav"): + wav_path = "%s/%s" % (wavPath, file) + out_path = "%s/%s" % (outPath, file.replace("wav", "npy")) + + if os.path.exists(out_path): + continue + + feats = readwave(wav_path, normalize=saved_cfg.task.normalize) + padding_mask = torch.BoolTensor(feats.shape).fill_(False) + inputs = { + "source": feats.half().to(device) + if device not in ["mps", "cpu"] + else feats.to(device), + "padding_mask": padding_mask.to(device), + "output_layer": 9 if version == "v1" else 12, # layer 9 + } + with torch.no_grad(): + logits = model.extract_features(**inputs) + feats = ( + model.final_proj(logits[0]) if version == "v1" else logits[0] + ) + + feats = feats.squeeze(0).float().cpu().numpy() + if np.isnan(feats).sum() == 0: + np.save(out_path, feats, allow_pickle=False) + else: + printt("%s-contains nan" % file) + if idx % n == 0: + printt("now-%s,all-%s,%s,%s" % (len(todo), idx, file, feats.shape)) + except: + printt(traceback.format_exc()) + printt("all-feature-done") diff --git a/lib/infer/modules/train/preprocess.py b/lib/infer/modules/train/preprocess.py new file mode 100644 index 000000000..18dfb9237 --- /dev/null +++ b/lib/infer/modules/train/preprocess.py @@ -0,0 +1,147 @@ +import multiprocessing +import os +import sys + +from scipy import signal + +now_dir = os.getcwd() +sys.path.append(now_dir) +print(sys.argv) +inp_root = sys.argv[1] +sr = int(sys.argv[2]) +n_p = int(sys.argv[3]) +exp_dir = sys.argv[4] +noparallel = sys.argv[5] == "True" +per = float(sys.argv[6]) +import multiprocessing +import os +import traceback + +import librosa +import numpy as np +from scipy.io import wavfile + +from lib.infer.infer_libs.audio import load_audio +from lib.infer.infer_libs.slicer2 import Slicer + +mutex = multiprocessing.Lock() +f = open("%s/preprocess.log" % exp_dir, "a+") + + +def println(strr): + mutex.acquire() + print(strr) + f.write("%s\n" % strr) + f.flush() + mutex.release() + + +class PreProcess: + def __init__(self, sr, exp_dir, per=3.7): + self.slicer = Slicer( + sr=sr, + threshold=-42, + min_length=1500, + min_interval=400, + hop_size=15, + max_sil_kept=500, + ) + self.sr = sr + self.bh, self.ah = signal.butter(N=5, Wn=48, btype="high", fs=self.sr) + self.per = per + self.overlap = 0.3 + self.tail = self.per + self.overlap + self.max = 0.9 + self.alpha = 0.75 + self.exp_dir = exp_dir + self.gt_wavs_dir = "%s/0_gt_wavs" % exp_dir + self.wavs16k_dir = "%s/1_16k_wavs" % exp_dir + os.makedirs(self.exp_dir, exist_ok=True) + os.makedirs(self.gt_wavs_dir, exist_ok=True) + os.makedirs(self.wavs16k_dir, exist_ok=True) + + def norm_write(self, tmp_audio, idx0, idx1): + tmp_max = np.abs(tmp_audio).max() + if tmp_max > 2.5: + print("%s-%s-%s-filtered" % (idx0, idx1, tmp_max)) + return + tmp_audio = (tmp_audio / tmp_max * (self.max * self.alpha)) + ( + 1 - self.alpha + ) * tmp_audio + wavfile.write( + "%s/%s_%s.wav" % (self.gt_wavs_dir, idx0, idx1), + self.sr, + tmp_audio.astype(np.float32), + ) + tmp_audio = librosa.resample( + tmp_audio, orig_sr=self.sr, target_sr=16000 + ) # , res_type="soxr_vhq" + wavfile.write( + "%s/%s_%s.wav" % (self.wavs16k_dir, idx0, idx1), + 16000, + tmp_audio.astype(np.float32), + ) + + def pipeline(self, path, idx0): + try: + audio = load_audio(path, self.sr) + # zero phased digital filter cause pre-ringing noise... + # audio = signal.filtfilt(self.bh, self.ah, audio) + audio = signal.lfilter(self.bh, self.ah, audio) + + idx1 = 0 + for audio in self.slicer.slice(audio): + i = 0 + while 1: + start = int(self.sr * (self.per - self.overlap) * i) + i += 1 + if len(audio[start:]) > self.tail * self.sr: + tmp_audio = audio[start : start + int(self.per * self.sr)] + self.norm_write(tmp_audio, idx0, idx1) + idx1 += 1 + else: + tmp_audio = audio[start:] + idx1 += 1 + break + self.norm_write(tmp_audio, idx0, idx1) + println("%s->Suc." % path) + except: + println("%s->%s" % (path, traceback.format_exc())) + + def pipeline_mp(self, infos): + for path, idx0 in infos: + self.pipeline(path, idx0) + + def pipeline_mp_inp_dir(self, inp_root, n_p): + try: + infos = [ + ("%s/%s" % (inp_root, name), idx) + for idx, name in enumerate(sorted(list(os.listdir(inp_root)))) + ] + if noparallel: + for i in range(n_p): + self.pipeline_mp(infos[i::n_p]) + else: + ps = [] + for i in range(n_p): + p = multiprocessing.Process( + target=self.pipeline_mp, args=(infos[i::n_p],) + ) + ps.append(p) + p.start() + for i in range(n_p): + ps[i].join() + except: + println("Fail. %s" % traceback.format_exc()) + + +def preprocess_trainset(inp_root, sr, n_p, exp_dir, per): + pp = PreProcess(sr, exp_dir, per) + println("start preprocess") + println(sys.argv) + pp.pipeline_mp_inp_dir(inp_root, n_p) + println("end preprocess") + + +if __name__ == "__main__": + preprocess_trainset(inp_root, sr, n_p, exp_dir, per) diff --git a/lib/infer/modules/train/train.py b/lib/infer/modules/train/train.py new file mode 100644 index 000000000..d5fb5f7bd --- /dev/null +++ b/lib/infer/modules/train/train.py @@ -0,0 +1,723 @@ +import os +import sys +import logging + +logger = logging.getLogger(__name__) + +now_dir = os.getcwd() +sys.path.append(os.path.join(now_dir)) + +import datetime + +from lib.infer.infer_libs.train import utils + +hps = utils.get_hparams() +os.environ["CUDA_VISIBLE_DEVICES"] = hps.gpus.replace("-", ",") +n_gpus = len(hps.gpus.split("-")) +from random import randint, shuffle + +import torch +try: + import intel_extension_for_pytorch as ipex # pylint: disable=import-error, unused-import + if torch.xpu.is_available(): + from lib.infer.modules.ipex import ipex_init + from lib.infer.modules.ipex.gradscaler import gradscaler_init + from torch.xpu.amp import autocast + GradScaler = gradscaler_init() + ipex_init() + else: + from torch.cuda.amp import GradScaler, autocast +except Exception: + from torch.cuda.amp import GradScaler, autocast + +torch.backends.cudnn.deterministic = False +torch.backends.cudnn.benchmark = False +from time import sleep +from time import time as ttime + +import torch.distributed as dist +import torch.multiprocessing as mp + +from torch.nn import functional as F +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.utils.data import DataLoader +from torch.utils.tensorboard import SummaryWriter + +from lib.infer.infer_libs.infer_pack import commons +from lib.infer.infer_libs.train.data_utils import ( + DistributedBucketSampler, + TextAudioCollate, + TextAudioCollateMultiNSFsid, + TextAudioLoader, + TextAudioLoaderMultiNSFsid, +) + +if hps.version == "v1": + from lib.infer.infer_libs.infer_pack.models import MultiPeriodDiscriminator + from lib.infer.infer_libs.infer_pack.models import SynthesizerTrnMs256NSFsid as RVC_Model_f0 + from lib.infer.infer_libs.infer_pack.models import ( + SynthesizerTrnMs256NSFsid_nono as RVC_Model_nof0, + ) +else: + from lib.infer.infer_libs.infer_pack.models import ( + SynthesizerTrnMs768NSFsid as RVC_Model_f0, + SynthesizerTrnMs768NSFsid_nono as RVC_Model_nof0, + MultiPeriodDiscriminatorV2 as MultiPeriodDiscriminator, + ) + +from lib.infer.infer_libs.train.losses import ( + discriminator_loss, + feature_loss, + generator_loss, + kl_loss, +) +from lib.infer.infer_libs.train.mel_processing import mel_spectrogram_torch, spec_to_mel_torch +from lib.infer.infer_libs.train.process_ckpt import savee + +global_step = 0 +import csv + +class EpochRecorder: + def __init__(self): + self.last_time = ttime() + + def record(self): + now_time = ttime() + elapsed_time = now_time - self.last_time + self.last_time = now_time + elapsed_time_str = str(datetime.timedelta(seconds=elapsed_time)) + current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + return f"[{current_time}] | ({elapsed_time_str})" + +def reset_stop_flag(): + with open("lib/csvdb/stop.csv", "w+", newline="") as STOPCSVwrite: + csv_writer = csv.writer(STOPCSVwrite, delimiter=",") + csv_writer.writerow(["False"]) + +def create_model(hps, model_f0, model_nof0): + filter_length_adjusted = hps.data.filter_length // 2 + 1 + segment_size_adjusted = hps.train.segment_size // hps.data.hop_length + is_half = hps.train.fp16_run + sr = hps.sample_rate + + model = model_f0 if hps.if_f0 == 1 else model_nof0 + + return model( + filter_length_adjusted, + segment_size_adjusted, + **hps.model, + is_half=is_half, + sr=sr + ) + +def move_model_to_cuda_if_available(model, rank): + if torch.cuda.is_available(): + return model.cuda(rank) + else: + return model + +def create_optimizer(model, hps): + return torch.optim.AdamW( + model.parameters(), + hps.train.learning_rate, + betas=hps.train.betas, + eps=hps.train.eps, + ) + +def create_ddp_model(model, rank): + if torch.cuda.is_available(): + return DDP(model, device_ids=[rank]) + else: + return DDP(model) + +def create_dataset(hps, if_f0=True): + return TextAudioLoaderMultiNSFsid(hps.data.training_files, hps.data) if if_f0 else TextAudioLoader(hps.data.training_files, hps.data) + +def create_sampler(dataset, batch_size, n_gpus, rank): + return DistributedBucketSampler( + dataset, + batch_size * n_gpus, + # [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200,1400], # 16s + [100, 200, 300, 400, 500, 600, 700, 800, 900], # 16s + num_replicas=n_gpus, + rank=rank, + shuffle=True, + ) + +def set_collate_fn(if_f0=True): + return TextAudioCollateMultiNSFsid() if if_f0 else TextAudioCollate() + + +def main(): + n_gpus = torch.cuda.device_count() + + if torch.cuda.is_available() == False and torch.backends.mps.is_available() == True: + n_gpus = 1 + if n_gpus < 1: + # patch to unblock people without gpus. there is probably a better way. + logger.warn("NO GPU DETECTED: falling back to CPU - this may take a while") + n_gpus = 1 + os.environ["MASTER_ADDR"] = "localhost" + os.environ["MASTER_PORT"] = str(randint(20000, 55555)) + children = [] + for i in range(n_gpus): + subproc = mp.Process( + target=run, + args=( + i, + n_gpus, + hps, + ), + ) + children.append(subproc) + subproc.start() + + for i in range(n_gpus): + children[i].join() + + +def run(rank, n_gpus, hps): + global global_step + if rank == 0: + logger = utils.get_logger(hps.model_dir) + logger.info(hps) + # utils.check_git_hash(hps.model_dir) + writer = SummaryWriter(log_dir=hps.model_dir) + writer_eval = SummaryWriter(log_dir=os.path.join(hps.model_dir, "eval")) + + dist.init_process_group( + backend="gloo", init_method="env://", world_size=n_gpus, rank=rank + ) + torch.manual_seed(hps.train.seed) + if torch.cuda.is_available(): + torch.cuda.set_device(rank) + + if hps.if_f0 == 1: + train_dataset = TextAudioLoaderMultiNSFsid(hps.data.training_files, hps.data) + else: + train_dataset = TextAudioLoader(hps.data.training_files, hps.data) + train_sampler = DistributedBucketSampler( + train_dataset, + hps.train.batch_size * n_gpus, + # [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1200,1400], # 16s + [100, 200, 300, 400, 500, 600, 700, 800, 900], # 16s + num_replicas=n_gpus, + rank=rank, + shuffle=True, + ) + # It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit. + # num_workers=8 -> num_workers=4 + if hps.if_f0 == 1: + collate_fn = TextAudioCollateMultiNSFsid() + else: + collate_fn = TextAudioCollate() + train_loader = DataLoader( + train_dataset, + num_workers=4, + shuffle=False, + pin_memory=True, + collate_fn=collate_fn, + batch_sampler=train_sampler, + persistent_workers=True, + prefetch_factor=8, + ) + if hps.if_f0 == 1: + net_g = RVC_Model_f0( + hps.data.filter_length // 2 + 1, + hps.train.segment_size // hps.data.hop_length, + **hps.model, + is_half=hps.train.fp16_run, + sr=hps.sample_rate, + ) + else: + net_g = RVC_Model_nof0( + hps.data.filter_length // 2 + 1, + hps.train.segment_size // hps.data.hop_length, + **hps.model, + is_half=hps.train.fp16_run, + ) + if torch.cuda.is_available(): + net_g = net_g.cuda(rank) + net_d = MultiPeriodDiscriminator(hps.model.use_spectral_norm) + if torch.cuda.is_available(): + net_d = net_d.cuda(rank) + optim_g = torch.optim.AdamW( + net_g.parameters(), + hps.train.learning_rate, + betas=hps.train.betas, + eps=hps.train.eps, + ) + optim_d = torch.optim.AdamW( + net_d.parameters(), + hps.train.learning_rate, + betas=hps.train.betas, + eps=hps.train.eps, + ) + # net_g = DDP(net_g, device_ids=[rank], find_unused_parameters=True) + # net_d = DDP(net_d, device_ids=[rank], find_unused_parameters=True) + if hasattr(torch, "xpu") and torch.xpu.is_available(): + pass + elif torch.cuda.is_available(): + net_g = DDP(net_g, device_ids=[rank]) + net_d = DDP(net_d, device_ids=[rank]) + else: + net_g = DDP(net_g) + net_d = DDP(net_d) + + try: # 如果能加载自动resume + _, _, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, optim_d + ) # D多半加载没事 + if rank == 0: + logger.info("loaded D") + # _, _, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, optim_g,load_opt=0) + _, _, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, optim_g + ) + global_step = (epoch_str - 1) * len(train_loader) + # epoch_str = 1 + # global_step = 0 + except: # 如果首次不能加载,加载pretrain + # traceback.print_exc() + epoch_str = 1 + global_step = 0 + if hps.pretrainG != "": + if rank == 0: + logger.info("loaded pretrained %s" % (hps.pretrainG)) + if hasattr(net_g, "module"): + logger.info( + net_g.module.load_state_dict( + torch.load(hps.pretrainG, map_location="cpu")["model"] + ) + ) ##测试不加载优化器 + else: + logger.info( + net_g.load_state_dict( + torch.load(hps.pretrainG, map_location="cpu")["model"] + ) + ) ##测试不加载优化器 + if hps.pretrainD != "": + if rank == 0: + logger.info("loaded pretrained %s" % (hps.pretrainD)) + if hasattr(net_d, "module"): + logger.info( + net_d.module.load_state_dict( + torch.load(hps.pretrainD, map_location="cpu")["model"] + ) + ) + else: + logger.info( + net_d.load_state_dict( + torch.load(hps.pretrainD, map_location="cpu")["model"] + ) + ) + + scheduler_g = torch.optim.lr_scheduler.ExponentialLR( + optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) + scheduler_d = torch.optim.lr_scheduler.ExponentialLR( + optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) + + scaler = GradScaler(enabled=hps.train.fp16_run) + + cache = [] + for epoch in range(epoch_str, hps.train.epochs + 1): + if rank == 0: + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d], + [optim_g, optim_d], + [scheduler_g, scheduler_d], + scaler, + [train_loader, None], + logger, + [writer, writer_eval], + cache, + ) + else: + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d], + [optim_g, optim_d], + [scheduler_g, scheduler_d], + scaler, + [train_loader, None], + None, + None, + cache, + ) + scheduler_g.step() + scheduler_d.step() + + +def train_and_evaluate( + rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers, cache +): + net_g, net_d = nets + optim_g, optim_d = optims + train_loader, eval_loader = loaders + if writers is not None: + writer, writer_eval = writers + + train_loader.batch_sampler.set_epoch(epoch) + global global_step + + net_g.train() + net_d.train() + + # Prepare data iterator + if hps.if_cache_data_in_gpu == True: + # Use Cache + data_iterator = cache + if cache == []: + # Make new cache + for batch_idx, info in enumerate(train_loader): + # Unpack + if hps.if_f0 == 1: + ( + phone, + phone_lengths, + pitch, + pitchf, + spec, + spec_lengths, + wave, + wave_lengths, + sid, + ) = info + else: + ( + phone, + phone_lengths, + spec, + spec_lengths, + wave, + wave_lengths, + sid, + ) = info + # Load on CUDA + if torch.cuda.is_available(): + phone = phone.cuda(rank, non_blocking=True) + phone_lengths = phone_lengths.cuda(rank, non_blocking=True) + if hps.if_f0 == 1: + pitch = pitch.cuda(rank, non_blocking=True) + pitchf = pitchf.cuda(rank, non_blocking=True) + sid = sid.cuda(rank, non_blocking=True) + spec = spec.cuda(rank, non_blocking=True) + spec_lengths = spec_lengths.cuda(rank, non_blocking=True) + wave = wave.cuda(rank, non_blocking=True) + wave_lengths = wave_lengths.cuda(rank, non_blocking=True) + # Cache on list + if hps.if_f0 == 1: + cache.append( + ( + batch_idx, + ( + phone, + phone_lengths, + pitch, + pitchf, + spec, + spec_lengths, + wave, + wave_lengths, + sid, + ), + ) + ) + else: + cache.append( + ( + batch_idx, + ( + phone, + phone_lengths, + spec, + spec_lengths, + wave, + wave_lengths, + sid, + ), + ) + ) + else: + # Load shuffled cache + shuffle(cache) + else: + # Loader + data_iterator = enumerate(train_loader) + + # Run steps + epoch_recorder = EpochRecorder() + for batch_idx, info in data_iterator: + # Data + ## Unpack + if hps.if_f0 == 1: + ( + phone, + phone_lengths, + pitch, + pitchf, + spec, + spec_lengths, + wave, + wave_lengths, + sid, + ) = info + else: + phone, phone_lengths, spec, spec_lengths, wave, wave_lengths, sid = info + ## Load on CUDA + if (hps.if_cache_data_in_gpu == False) and torch.cuda.is_available(): + phone = phone.cuda(rank, non_blocking=True) + phone_lengths = phone_lengths.cuda(rank, non_blocking=True) + if hps.if_f0 == 1: + pitch = pitch.cuda(rank, non_blocking=True) + pitchf = pitchf.cuda(rank, non_blocking=True) + sid = sid.cuda(rank, non_blocking=True) + spec = spec.cuda(rank, non_blocking=True) + spec_lengths = spec_lengths.cuda(rank, non_blocking=True) + wave = wave.cuda(rank, non_blocking=True) + # wave_lengths = wave_lengths.cuda(rank, non_blocking=True) + + # Calculate + with autocast(enabled=hps.train.fp16_run): + if hps.if_f0 == 1: + ( + y_hat, + ids_slice, + x_mask, + z_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + ) = net_g(phone, phone_lengths, pitch, pitchf, spec, spec_lengths, sid) + else: + ( + y_hat, + ids_slice, + x_mask, + z_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + ) = net_g(phone, phone_lengths, spec, spec_lengths, sid) + mel = spec_to_mel_torch( + spec, + hps.data.filter_length, + hps.data.n_mel_channels, + hps.data.sampling_rate, + hps.data.mel_fmin, + hps.data.mel_fmax, + ) + y_mel = commons.slice_segments( + mel, ids_slice, hps.train.segment_size // hps.data.hop_length + ) + with autocast(enabled=False): + y_hat_mel = mel_spectrogram_torch( + y_hat.float().squeeze(1), + hps.data.filter_length, + hps.data.n_mel_channels, + hps.data.sampling_rate, + hps.data.hop_length, + hps.data.win_length, + hps.data.mel_fmin, + hps.data.mel_fmax, + ) + if hps.train.fp16_run == True: + y_hat_mel = y_hat_mel.half() + wave = commons.slice_segments( + wave, ids_slice * hps.data.hop_length, hps.train.segment_size + ) # slice + + # Discriminator + y_d_hat_r, y_d_hat_g, _, _ = net_d(wave, y_hat.detach()) + with autocast(enabled=False): + loss_disc, losses_disc_r, losses_disc_g = discriminator_loss( + y_d_hat_r, y_d_hat_g + ) + optim_d.zero_grad() + scaler.scale(loss_disc).backward() + scaler.unscale_(optim_d) + grad_norm_d = commons.clip_grad_value_(net_d.parameters(), None) + scaler.step(optim_d) + + with autocast(enabled=hps.train.fp16_run): + # Generator + y_d_hat_r, y_d_hat_g, fmap_r, fmap_g = net_d(wave, y_hat) + with autocast(enabled=False): + loss_mel = F.l1_loss(y_mel, y_hat_mel) * hps.train.c_mel + loss_kl = kl_loss(z_p, logs_q, m_p, logs_p, z_mask) * hps.train.c_kl + loss_fm = feature_loss(fmap_r, fmap_g) + loss_gen, losses_gen = generator_loss(y_d_hat_g) + loss_gen_all = loss_gen + loss_fm + loss_mel + loss_kl + optim_g.zero_grad() + scaler.scale(loss_gen_all).backward() + scaler.unscale_(optim_g) + grad_norm_g = commons.clip_grad_value_(net_g.parameters(), None) + scaler.step(optim_g) + scaler.update() + + if rank == 0: + if global_step % hps.train.log_interval == 0: + lr = optim_g.param_groups[0]["lr"] + logger.info( + "Train Epoch: {} [{:.0f}%]".format( + epoch, 100.0 * batch_idx / len(train_loader) + ) + ) + # Amor For Tensorboard display + if loss_mel > 75: + loss_mel = 75 + if loss_kl > 9: + loss_kl = 9 + + logger.info([global_step, lr]) + logger.info( + f"loss_disc={loss_disc:.3f}, loss_gen={loss_gen:.3f}, loss_fm={loss_fm:.3f},loss_mel={loss_mel:.3f}, loss_kl={loss_kl:.3f}" + ) + scalar_dict = { + "loss/g/total": loss_gen_all, + "loss/d/total": loss_disc, + "learning_rate": lr, + "grad_norm_d": grad_norm_d, + "grad_norm_g": grad_norm_g, + } + scalar_dict.update( + { + "loss/g/fm": loss_fm, + "loss/g/mel": loss_mel, + "loss/g/kl": loss_kl, + } + ) + + scalar_dict.update( + {"loss/g/{}".format(i): v for i, v in enumerate(losses_gen)} + ) + scalar_dict.update( + {"loss/d_r/{}".format(i): v for i, v in enumerate(losses_disc_r)} + ) + scalar_dict.update( + {"loss/d_g/{}".format(i): v for i, v in enumerate(losses_disc_g)} + ) + image_dict = { + "slice/mel_org": utils.plot_spectrogram_to_numpy( + y_mel[0].data.cpu().numpy() + ), + "slice/mel_gen": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].data.cpu().numpy() + ), + "all/mel": utils.plot_spectrogram_to_numpy( + mel[0].data.cpu().numpy() + ), + } + utils.summarize( + writer=writer, + global_step=global_step, + images=image_dict, + scalars=scalar_dict, + ) + global_step += 1 + # /Run steps + + if epoch % hps.save_every_epoch == 0 and rank == 0: + if hps.if_latest == 0: + utils.save_checkpoint( + net_g, + optim_g, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "G_{}.pth".format(global_step)), + ) + utils.save_checkpoint( + net_d, + optim_d, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "D_{}.pth".format(global_step)), + ) + else: + utils.save_checkpoint( + net_g, + optim_g, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "G_{}.pth".format(2333333)), + ) + utils.save_checkpoint( + net_d, + optim_d, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "D_{}.pth".format(2333333)), + ) + if rank == 0 and hps.save_every_weights == "1": + if hasattr(net_g, "module"): + ckpt = net_g.module.state_dict() + else: + ckpt = net_g.state_dict() + logger.info( + "saving ckpt %s_e%s:%s" + % ( + hps.name, + epoch, + savee( + ckpt, + hps.sample_rate, + hps.if_f0, + hps.name + "_e%s_s%s" % (epoch, global_step), + epoch, + hps.version, + hps, + ), + ) + ) + + stopbtn = False + try: + with open("lib/csvdb/stop.csv", 'r') as csv_file: + stopbtn_str = next(csv.reader(csv_file), [None])[0] + if stopbtn_str is not None: stopbtn = stopbtn_str.lower() == 'true' + except (ValueError, TypeError, FileNotFoundError, IndexError) as e: + print(f"Handling exception: {e}") + stopbtn = False + + if stopbtn: + logger.info("Stop Button was pressed. The program is closed.") + ckpt = net_g.module.state_dict() if hasattr(net_g, "module") else net_g.state_dict() + logger.info( + "saving final ckpt:%s" + % ( + savee( + ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch, hps.version, hps + ) + ) + ) + sleep(1) + reset_stop_flag() + os._exit(2333333) + + if rank == 0: + logger.info("====> Epoch: {} {}".format(epoch, epoch_recorder.record())) + if epoch >= hps.total_epoch and rank == 0: + logger.info("Training is done. The program is closed.") + + if hasattr(net_g, "module"): + ckpt = net_g.module.state_dict() + else: + ckpt = net_g.state_dict() + logger.info( + "saving final ckpt:%s" + % ( + savee( + ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch, hps.version, hps + ) + ) + ) + sleep(1) + os._exit(2333333) + + +if __name__ == "__main__": + torch.multiprocessing.set_start_method("spawn") + main() diff --git a/lib/infer/modules/uvr5/__pycache__/mdxnet.cpython-39.pyc b/lib/infer/modules/uvr5/__pycache__/mdxnet.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fbc2c93f242f9f66626c90655463cbc79949a0d GIT binary patch literal 6475 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 literal 0 HcmV?d00001 diff --git a/lib/infer/modules/uvr5/__pycache__/mdxprocess.cpython-39.pyc b/lib/infer/modules/uvr5/__pycache__/mdxprocess.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ecf0b674ebd58de5d3c12f0764799f7d480f8e7 GIT binary patch literal 3946 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 F{1?(GNsIsh literal 0 HcmV?d00001 diff --git a/lib/infer/modules/uvr5/__pycache__/preprocess.cpython-39.pyc b/lib/infer/modules/uvr5/__pycache__/preprocess.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67f6733b308b418bf984795057a937ceeabfde70 GIT binary patch literal 6522 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 chunk_size: + margin = chunk_size + + segmented_mix = {} + + if self.args.chunks == 0 or samples < chunk_size: + chunk_size = samples + + counter = -1 + for skip in range(0, samples, chunk_size): + counter += 1 + + s_margin = 0 if counter == 0 else margin + end = min(skip + chunk_size + margin, samples) + + start = skip - s_margin + + segmented_mix[skip] = mix[:, start:end].copy() + if end == samples: + break + + sources = self.demix_base(segmented_mix, margin_size=margin) + """ + mix:(2,big_sample) + segmented_mix:offset->(2,small_sample) + sources:(1,2,big_sample) + """ + return sources + + def demix_base(self, mixes, margin_size): + chunked_sources = [] + progress_bar = tqdm(total=len(mixes)) + progress_bar.set_description("Processing") + for mix in mixes: + cmix = mixes[mix] + sources = [] + n_sample = cmix.shape[1] + model = self.model_ + trim = model.n_fft // 2 + gen_size = model.chunk_size - 2 * trim + pad = gen_size - n_sample % gen_size + mix_p = np.concatenate( + (np.zeros((2, trim)), cmix, np.zeros((2, pad)), np.zeros((2, trim))), 1 + ) + mix_waves = [] + i = 0 + while i < n_sample + pad: + waves = np.array(mix_p[:, i : i + model.chunk_size]) + mix_waves.append(waves) + i += gen_size + mix_waves = torch.tensor(mix_waves, dtype=torch.float32).to(cpu) + with torch.no_grad(): + _ort = self.model + spek = model.stft(mix_waves) + if self.args.denoise: + spec_pred = ( + -_ort.run(None, {"input": -spek.cpu().numpy()})[0] * 0.5 + + _ort.run(None, {"input": spek.cpu().numpy()})[0] * 0.5 + ) + tar_waves = model.istft(torch.tensor(spec_pred)) + else: + tar_waves = model.istft( + torch.tensor(_ort.run(None, {"input": spek.cpu().numpy()})[0]) + ) + tar_signal = ( + tar_waves[:, :, trim:-trim] + .transpose(0, 1) + .reshape(2, -1) + .numpy()[:, :-pad] + ) + + start = 0 if mix == 0 else margin_size + end = None if mix == list(mixes.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + sources.append(tar_signal[:, start:end]) + + progress_bar.update(1) + + chunked_sources.append(sources) + _sources = np.concatenate(chunked_sources, axis=-1) + # del self.model + progress_bar.close() + return _sources + + def prediction(self, m, vocal_root, others_root, format): + os.makedirs(vocal_root, exist_ok=True) + os.makedirs(others_root, exist_ok=True) + basename = os.path.basename(m) + mix, rate = librosa.load(m, mono=False, sr=44100) + if mix.ndim == 1: + mix = np.asfortranarray([mix, mix]) + mix = mix.T + sources = self.demix(mix.T) + opt = sources[0].T + if format in ["wav", "flac"]: + sf.write( + "%s/%s_main_vocal.%s" % (vocal_root, basename, format), mix - opt, rate + ) + sf.write("%s/%s_others.%s" % (others_root, basename, format), opt, rate) + else: + path_vocal = "%s/%s_main_vocal.wav" % (vocal_root, basename) + path_other = "%s/%s_others.wav" % (others_root, basename) + sf.write(path_vocal, mix - opt, rate) + sf.write(path_other, opt, rate) + if os.path.exists(path_vocal): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path_vocal, path_vocal[:-4] + ".%s" % format) + ) + if os.path.exists(path_other): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path_other, path_other[:-4] + ".%s" % format) + ) + + +class MDXNetDereverb: + def __init__(self, chunks, device): + self.onnx = "assets/uvr5_weights/onnx_dereverb_By_FoxJoy" + self.shifts = 10 # 'Predict with randomised equivariant stabilisation' + self.mixing = "min_mag" # ['default','min_mag','max_mag'] + self.chunks = chunks + self.margin = 44100 + self.dim_t = 9 + self.dim_f = 3072 + self.n_fft = 6144 + self.denoise = True + self.pred = Predictor(self) + self.device = device + + def path_audio(self, input, vocal_root, others_root, format): + self.pred.prediction(input, vocal_root, others_root, format) diff --git a/lib/infer/modules/uvr5/mdxprocess.py b/lib/infer/modules/uvr5/mdxprocess.py new file mode 100644 index 000000000..9e9bd2137 --- /dev/null +++ b/lib/infer/modules/uvr5/mdxprocess.py @@ -0,0 +1,145 @@ +import gc +import requests +import subprocess +import logging +import sys +from bs4 import BeautifulSoup +import torch, pdb, os, warnings, librosa +import soundfile as sf +from tqdm import tqdm +import numpy as np +import torch +now_dir = os.getcwd() +sys.path.append(now_dir) +import lib.infer.infer_libs.uvr5_pack.mdx as mdx +branch = "https://github.com/NaJeongMo/Colab-for-MDX_B" + +model_params = "https://raw.githubusercontent.com/TRvlvr/application_data/main/mdx_model_data/model_data.json" +_Models = "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/" +# _models = "https://pastebin.com/raw/jBzYB8vz" +_models = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_checks.json" +stem_naming = "https://pastebin.com/raw/mpH4hRcF" + +file_folder = "Colab-for-MDX_B" +model_ids = requests.get(_models).json() +model_ids = model_ids["mdx_download_list"].values() +#print(model_ids) +model_params = requests.get(model_params).json() +stem_naming = requests.get(stem_naming).json() + +os.makedirs("/assets/uvr5_weights/MDX", exist_ok=True) + +warnings.filterwarnings("ignore") +cpu = torch.device("cpu") +if torch.cuda.is_available(): + device = torch.device("cuda:0") +elif torch.backends.mps.is_available(): + device = torch.device("mps") +else: + device = torch.device("cpu") + + +def get_model_list(): + return model_ids + +def id_to_ptm(mkey): + if mkey in model_ids: + mpath = f"{now_dir}/assets/uvr5_weights/MDX/{mkey}" + if not os.path.exists(f'{now_dir}/assets/uvr5_weights/MDX/{mkey}'): + print('Downloading model...',end=' ') + subprocess.run( + ["wget", _Models+mkey, "-O", mpath] + ) + print(f'saved to {mpath}') + return mpath + else: + return mpath + else: + mpath = f'{now_dir}/assets/uvr5_weights/{mkey}' + return mpath + +def prepare_mdx(onnx,custom_param=False, dim_f=None, dim_t=None, n_fft=None, stem_name=None, compensation=None): + device = torch.device('cuda:0') if torch.cuda.is_available() else torch.device('cpu') + if custom_param: + assert not (dim_f is None or dim_t is None or n_fft is None or compensation is None), 'Custom parameter selected, but incomplete parameters are provided.' + mdx_model = mdx.MDX_Model( + device, + dim_f = dim_f, + dim_t = dim_t, + n_fft = n_fft, + stem_name=stem_name, + compensation=compensation + ) + else: + model_hash = mdx.MDX.get_hash(onnx) + if model_hash in model_params: + mp = model_params.get(model_hash) + mdx_model = mdx.MDX_Model( + device, + dim_f = mp["mdx_dim_f_set"], + dim_t = 2**mp["mdx_dim_t_set"], + n_fft = mp["mdx_n_fft_scale_set"], + stem_name=mp["primary_stem"], + compensation=compensation if not custom_param and compensation is not None else mp["compensate"] + ) + return mdx_model + +def run_mdx(onnx, mdx_model,filename, output_format='wav',diff=False,suffix=None,diff_suffix=None, denoise=False, m_threads=2): + mdx_sess = mdx.MDX(onnx,mdx_model) + print(f"Processing: {filename}") + if filename.lower().endswith('.wav'): + wave, sr = librosa.load(filename, mono=False, sr=44100) + else: + temp_wav = 'temp_audio.wav' + subprocess.run(['ffmpeg', '-i', filename, '-ar', '44100', '-ac', '2', temp_wav]) # Convert to WAV format + wave, sr = librosa.load(temp_wav, mono=False, sr=44100) + os.remove(temp_wav) + + #wave, sr = librosa.load(filename,mono=False, sr=44100) + # normalizing input wave gives better output + peak = max(np.max(wave), abs(np.min(wave))) + wave /= peak + if denoise: + wave_processed = -(mdx_sess.process_wave(-wave, m_threads)) + (mdx_sess.process_wave(wave, m_threads)) + wave_processed *= 0.5 + else: + wave_processed = mdx_sess.process_wave(wave, m_threads) + # return to previous peak + wave_processed *= peak + + stem_name = mdx_model.stem_name if suffix is None else suffix # use suffix if provided + save_path = os.path.basename(os.path.splitext(filename)[0]) + #vocals_save_path = os.path.join(vocals_folder, f"{save_path}_{stem_name}.{output_format}") + #instrumental_save_path = os.path.join(instrumental_folder, f"{save_path}_{stem_name}.{output_format}") + save_path = f"{os.path.basename(os.path.splitext(filename)[0])}_{stem_name}.{output_format}" + save_path = os.path.join( + 'audios', + save_path + ) + sf.write( + save_path, + wave_processed.T, + sr + ) + + print(f'done, saved to: {save_path}') + + if diff: + diff_stem_name = stem_naming.get(stem_name) if diff_suffix is None else diff_suffix # use suffix if provided + stem_name = f"{stem_name}_diff" if diff_stem_name is None else diff_stem_name + save_path = f"{os.path.basename(os.path.splitext(filename)[0])}_{stem_name}.{output_format}" + save_path = os.path.join( + 'audio-others', + save_path + ) + sf.write( + save_path, + (-wave_processed.T*mdx_model.compensation)+wave.T, + sr + ) + print(f'invert done, saved to: {save_path}') + del mdx_sess, wave_processed, wave + gc.collect() + +if __name__ == "__main__": + print() \ No newline at end of file diff --git a/lib/infer/modules/uvr5/modules.py b/lib/infer/modules/uvr5/modules.py new file mode 100644 index 000000000..a2d4404a1 --- /dev/null +++ b/lib/infer/modules/uvr5/modules.py @@ -0,0 +1,107 @@ +import os +import traceback +import logging + +logger = logging.getLogger(__name__) + +import ffmpeg +import torch + +from assets.configs.config import Config +from lib.infer.modules.uvr5.mdxnet import MDXNetDereverb +from lib.infer.modules.uvr5.preprocess import AudioPre, AudioPreDeEcho + +config = Config() + + +def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format0): + infos = [] + try: + inp_root = inp_root.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + save_root_vocal = ( + save_root_vocal.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + ) + save_root_ins = ( + save_root_ins.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + ) + if model_name == "onnx_dereverb_By_FoxJoy": + pre_fun = MDXNetDereverb(15, config.device) + else: + func = AudioPre if "DeEcho" not in model_name else AudioPreDeEcho + pre_fun = func( + agg=int(agg), + model_path=os.path.join( + os.getenv("weight_uvr5_root"), model_name + ".pth" + ), + device=config.device, + is_half=config.is_half, + ) + if inp_root != "": + paths = [os.path.join(inp_root, name) for name in os.listdir(inp_root)] + else: + paths = [path.name for path in paths] + for path in paths: + inp_path = os.path.join(inp_root, path) + need_reformat = 1 + done = 0 + try: + info = ffmpeg.probe(inp_path, cmd="ffprobe") + if ( + info["streams"][0]["channels"] == 2 + and info["streams"][0]["sample_rate"] == "44100" + ): + need_reformat = 0 + pre_fun._path_audio_( + inp_path, save_root_ins, save_root_vocal, format0 + ) + done = 1 + except: + need_reformat = 1 + traceback.print_exc() + if need_reformat == 1: + tmp_path = "%s/%s.reformatted.wav" % ( + os.path.join(os.environ["temp"]), + os.path.basename(inp_path), + ) + os.system( + "ffmpeg -i %s -vn -acodec pcm_s16le -ac 2 -ar 44100 %s -y" + % (inp_path, tmp_path) + ) + inp_path = tmp_path + try: + if done == 0: + pre_fun.path_audio( + inp_path, save_root_ins, save_root_vocal, format0 + ) + infos.append("%s->Success" % (os.path.basename(inp_path))) + yield "\n".join(infos) + except: + try: + if done == 0: + pre_fun._path_audio_( + inp_path, save_root_ins, save_root_vocal, format0 + ) + infos.append("%s->Success" % (os.path.basename(inp_path))) + yield "\n".join(infos) + except: + infos.append( + "%s->%s" % (os.path.basename(inp_path), traceback.format_exc()) + ) + yield "\n".join(infos) + except: + infos.append(traceback.format_exc()) + yield "\n".join(infos) + finally: + try: + if model_name == "onnx_dereverb_By_FoxJoy": + del pre_fun.pred.model + del pre_fun.pred.model_ + else: + del pre_fun.model + del pre_fun + except: + traceback.print_exc() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + logger.info("Executed torch.cuda.empty_cache()") + yield "\n".join(infos) diff --git a/lib/infer/modules/uvr5/preprocess.py b/lib/infer/modules/uvr5/preprocess.py new file mode 100644 index 000000000..784f46e0b --- /dev/null +++ b/lib/infer/modules/uvr5/preprocess.py @@ -0,0 +1,346 @@ +import os +import logging + +logger = logging.getLogger(__name__) + +import librosa +import numpy as np +import soundfile as sf +import torch + +from lib.infer.infer_libs.uvr5_pack.lib_v5 import nets_61968KB as Nets +from lib.infer.infer_libs.uvr5_pack.lib_v5 import spec_utils +from lib.infer.infer_libs.uvr5_pack.lib_v5.model_param_init import ModelParameters +from lib.infer.infer_libs.uvr5_pack.lib_v5.nets_new import CascadedNet +from lib.infer.infer_libs.uvr5_pack.utils import inference + + +class AudioPre: + def __init__(self, agg, model_path, device, is_half): + self.model_path = model_path + self.device = device + self.data = { + # Processing Options + "postprocess": False, + "tta": False, + # Constants + "window_size": 512, + "agg": agg, + "high_end_process": "mirroring", + } + mp = ModelParameters("lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_v2.json") + model = Nets.CascadedASPPNet(mp.param["bins"] * 2) + cpk = torch.load(model_path, map_location="cpu") + model.load_state_dict(cpk) + model.eval() + if is_half: + model = model.half().to(device) + else: + model = model.to(device) + + self.mp = mp + self.model = model + + def _path_audio_(self, music_file, ins_root=None, vocal_root=None, format="flac"): + if ins_root is None and vocal_root is None: + return "No save root." + name = os.path.basename(music_file) + if ins_root is not None: + os.makedirs(ins_root, exist_ok=True) + if vocal_root is not None: + os.makedirs(vocal_root, exist_ok=True) + X_wave, y_wave, X_spec_s, y_spec_s = {}, {}, {}, {} + bands_n = len(self.mp.param["band"]) + # print(bands_n) + for d in range(bands_n, 0, -1): + bp = self.mp.param["band"][d] + if d == bands_n: # high-end band + ( + X_wave[d], + _, + ) = librosa.core.load( # 理论上librosa读取可能对某些音频有bug,应该上ffmpeg读取,但是太麻烦了弃坑 + music_file, + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + if X_wave[d].ndim == 1: + X_wave[d] = np.asfortranarray([X_wave[d], X_wave[d]]) + else: # lower bands + X_wave[d] = librosa.core.resample( + X_wave[d + 1], + self.mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + # Stft of wave source + X_spec_s[d] = spec_utils.wave_to_spectrogram_mt( + X_wave[d], + bp["hl"], + bp["n_fft"], + self.mp.param["mid_side"], + self.mp.param["mid_side_b2"], + self.mp.param["reverse"], + ) + # pdb.set_trace() + if d == bands_n and self.data["high_end_process"] != "none": + input_high_end_h = (bp["n_fft"] // 2 - bp["crop_stop"]) + ( + self.mp.param["pre_filter_stop"] - self.mp.param["pre_filter_start"] + ) + input_high_end = X_spec_s[d][ + :, bp["n_fft"] // 2 - input_high_end_h : bp["n_fft"] // 2, : + ] + + X_spec_m = spec_utils.combine_spectrograms(X_spec_s, self.mp) + aggresive_set = float(self.data["agg"] / 100) + aggressiveness = { + "value": aggresive_set, + "split_bin": self.mp.param["band"][1]["crop_stop"], + } + with torch.no_grad(): + pred, X_mag, X_phase = inference( + X_spec_m, self.device, self.model, aggressiveness, self.data + ) + # Postprocess + if self.data["postprocess"]: + pred_inv = np.clip(X_mag - pred, 0, np.inf) + pred = spec_utils.mask_silence(pred, pred_inv) + y_spec_m = pred * X_phase + v_spec_m = X_spec_m - y_spec_m + + if ins_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], y_spec_m, input_high_end, self.mp + ) + wav_instrument = spec_utils.cmb_spectrogram_to_wave( + y_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_instrument = spec_utils.cmb_spectrogram_to_wave(y_spec_m, self.mp) + logger.info("%s instruments done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + ins_root, + "instrument_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) # + else: + path = os.path.join( + ins_root, "instrument_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + if vocal_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], v_spec_m, input_high_end, self.mp + ) + wav_vocals = spec_utils.cmb_spectrogram_to_wave( + v_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_vocals = spec_utils.cmb_spectrogram_to_wave(v_spec_m, self.mp) + logger.info("%s vocals done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + vocal_root, + "vocal_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + else: + path = os.path.join( + vocal_root, "vocal_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + + +class AudioPreDeEcho: + def __init__(self, agg, model_path, device, is_half): + self.model_path = model_path + self.device = device + self.data = { + # Processing Options + "postprocess": False, + "tta": False, + # Constants + "window_size": 512, + "agg": agg, + "high_end_process": "mirroring", + } + mp = ModelParameters("lib/infer/infer_libs/uvr5_pack/lib_v5/modelparams/4band_v3.json") + nout = 64 if "DeReverb" in model_path else 48 + model = CascadedNet(mp.param["bins"] * 2, nout) + cpk = torch.load(model_path, map_location="cpu") + model.load_state_dict(cpk) + model.eval() + if is_half: + model = model.half().to(device) + else: + model = model.to(device) + + self.mp = mp + self.model = model + + def _path_audio_( + self, music_file, vocal_root=None, ins_root=None, format="flac" + ): # 3个VR模型vocal和ins是反的 + if ins_root is None and vocal_root is None: + return "No save root." + name = os.path.basename(music_file) + if ins_root is not None: + os.makedirs(ins_root, exist_ok=True) + if vocal_root is not None: + os.makedirs(vocal_root, exist_ok=True) + X_wave, y_wave, X_spec_s, y_spec_s = {}, {}, {}, {} + bands_n = len(self.mp.param["band"]) + # print(bands_n) + for d in range(bands_n, 0, -1): + bp = self.mp.param["band"][d] + if d == bands_n: # high-end band + ( + X_wave[d], + _, + ) = librosa.core.load( # 理论上librosa读取可能对某些音频有bug,应该上ffmpeg读取,但是太麻烦了弃坑 + music_file, + bp["sr"], + False, + dtype=np.float32, + res_type=bp["res_type"], + ) + if X_wave[d].ndim == 1: + X_wave[d] = np.asfortranarray([X_wave[d], X_wave[d]]) + else: # lower bands + X_wave[d] = librosa.core.resample( + X_wave[d + 1], + self.mp.param["band"][d + 1]["sr"], + bp["sr"], + res_type=bp["res_type"], + ) + # Stft of wave source + X_spec_s[d] = spec_utils.wave_to_spectrogram_mt( + X_wave[d], + bp["hl"], + bp["n_fft"], + self.mp.param["mid_side"], + self.mp.param["mid_side_b2"], + self.mp.param["reverse"], + ) + # pdb.set_trace() + if d == bands_n and self.data["high_end_process"] != "none": + input_high_end_h = (bp["n_fft"] // 2 - bp["crop_stop"]) + ( + self.mp.param["pre_filter_stop"] - self.mp.param["pre_filter_start"] + ) + input_high_end = X_spec_s[d][ + :, bp["n_fft"] // 2 - input_high_end_h : bp["n_fft"] // 2, : + ] + + X_spec_m = spec_utils.combine_spectrograms(X_spec_s, self.mp) + aggresive_set = float(self.data["agg"] / 100) + aggressiveness = { + "value": aggresive_set, + "split_bin": self.mp.param["band"][1]["crop_stop"], + } + with torch.no_grad(): + pred, X_mag, X_phase = inference( + X_spec_m, self.device, self.model, aggressiveness, self.data + ) + # Postprocess + if self.data["postprocess"]: + pred_inv = np.clip(X_mag - pred, 0, np.inf) + pred = spec_utils.mask_silence(pred, pred_inv) + y_spec_m = pred * X_phase + v_spec_m = X_spec_m - y_spec_m + + if ins_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], y_spec_m, input_high_end, self.mp + ) + wav_instrument = spec_utils.cmb_spectrogram_to_wave( + y_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_instrument = spec_utils.cmb_spectrogram_to_wave(y_spec_m, self.mp) + logger.info("%s instruments done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + ins_root, + "instrument_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) # + else: + path = os.path.join( + ins_root, "instrument_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_instrument) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) + if vocal_root is not None: + if self.data["high_end_process"].startswith("mirroring"): + input_high_end_ = spec_utils.mirroring( + self.data["high_end_process"], v_spec_m, input_high_end, self.mp + ) + wav_vocals = spec_utils.cmb_spectrogram_to_wave( + v_spec_m, self.mp, input_high_end_h, input_high_end_ + ) + else: + wav_vocals = spec_utils.cmb_spectrogram_to_wave(v_spec_m, self.mp) + logger.info("%s vocals done" % name) + if format in ["wav", "flac"]: + sf.write( + os.path.join( + vocal_root, + "vocal_{}_{}.{}".format(name, self.data["agg"], format), + ), + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + else: + path = os.path.join( + vocal_root, "vocal_{}_{}.wav".format(name, self.data["agg"]) + ) + sf.write( + path, + (np.array(wav_vocals) * 32768).astype("int16"), + self.mp.param["sr"], + ) + if os.path.exists(path): + os.system( + "ffmpeg -i %s -vn %s -q:a 2 -y" + % (path, path[:-4] + ".%s" % format) + ) diff --git a/lib/infer/modules/vc/__init__.py b/lib/infer/modules/vc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/infer/modules/vc/__pycache__/__init__.cpython-39.pyc b/lib/infer/modules/vc/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b44806cd2b0f20f3945bc94986345a2549b35bd GIT binary patch literal 187 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 Y%Le`7bpxES6(?R91IJK0&r+%X0hRq3F8}}l literal 0 HcmV?d00001 diff --git a/lib/infer/modules/vc/__pycache__/pipeline.cpython-39.pyc b/lib/infer/modules/vc/__pycache__/pipeline.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59b959b02214a23268c55b2f57ff5036dc981c73 GIT binary patch literal 15618 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 literal 0 HcmV?d00001 diff --git a/lib/infer/modules/vc/__pycache__/utils.cpython-39.pyc b/lib/infer/modules/vc/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a1f60d9c993b8d381d9ec911e90bbcf2256ab5 GIT binary patch literal 1452 zcma)6KX2Pc6u&zj|5%X{SIwd#Ko>7UD%C(c1%i>(MurR?5;TKBgP?dvi84jfcPH5q zs3`{83>oqb#4*U1=;ye#lRrR*7O2~Iq~OFufgW-1-5butiEM#O-p~6XW8YRM%VwqSapVv1MaiOfdsOrad2%w5yt;JL6}n$zz;CxH$X~s+Fj#c zQHhsGkP^Q}7@ZS_z!*OMi26j6;l9T4N30)=L&<}A&UhMR;hYPD#$Tt0PyC-H7t)`H zBI5p0evzel$fWIi#K{_G~pS)EX2WA#$^WxCB*UmTzxm;Do8TMFM}df(;yc4yzy>0O7kd8<-zb) z_znm*C^5djG8#ufCI*HdeaPaPtgX^ILZ^FcTG9JMErnDlO)tXqOgmtmXUo0?q6yPGK=!2)NufQn{2YyG z-X@yfe>!aPTGu1O_wlaP#$5tw#x3HI?hU=6E%JxhgMaSi5#9o1=AjXO0Ysr0bmRoO zg<0>(HlI+`j6z33UN_LIGpoX|Ml&j&z=>VKP3FPMF)QG1Ws2WEUOft> 1: + audio /= audio_max + times = [0, 0, 0] + + if self.hubert_model is None: + self.hubert_model = load_hubert(self.config) + + try: + self.if_f0 = self.cpt.get("f0", 1) + except NameError: + message = "Model was not properly selected" + print(message) + return message, None + + file_index = ( + ( + file_index.strip(" ") + .strip('"') + .strip("\n") + .strip('"') + .strip(" ") + .replace("trained", "added") + ) + if file_index != "" + else file_index2 + ) # 防止小白写错,自动帮他替换掉 + + try: + audio_opt = self.pipeline.pipeline( + self.hubert_model, + self.net_g, + sid, + audio, + input_audio_path1, + times, + f0_up_key, + f0_method, + file_index, + index_rate, + self.if_f0, + filter_radius, + self.tgt_sr, + resample_sr, + rms_mix_rate, + self.version, + protect, + crepe_hop_length, + f0_autotune, + f0_file=f0_file, + f0_min=f0_min, + f0_max=f0_max + ) + except AssertionError: + message = "Mismatching index version detected (v1 with v2, or v2 with v1)." + print(message) + return message, None + except NameError: + message = "RVC libraries are still loading. Please try again in a few seconds." + print(message) + return message, None + + if self.tgt_sr != resample_sr >= 16000: + tgt_sr = resample_sr + else: + tgt_sr = self.tgt_sr + index_info = ( + "Index:\n%s." % file_index + if os.path.exists(file_index) + else "Index not used." + ) + end_time = time.time() + total_time = end_time - start_time + + output_folder = "assets/audios/audio-outputs" + os.makedirs(output_folder, exist_ok=True) + output_filename = "generated_audio_{}.wav" + output_count = 1 + while True: + current_output_path = os.path.join(output_folder, output_filename.format(output_count)) + if not os.path.exists(current_output_path): + break + output_count += 1 + + wavfile.write(current_output_path, self.tgt_sr, audio_opt) + print(f"Generated audio saved to: {current_output_path}") + + return ( + "Success.\n%s\nTime:\nnpy: %.2fs, f0: %.2fs, infer: %.2fs." + % (index_info, *times), + (tgt_sr, audio_opt), + ) + except: + info = traceback.format_exc() + logger.warn(info) + return info, (None, None) + + def vc_single_dont_save( + self, + sid, + input_audio_path0, + input_audio_path1, + f0_up_key, + f0_file, + f0_method, + file_index, + file_index2, + index_rate, + filter_radius, + resample_sr, + rms_mix_rate, + protect, + crepe_hop_length, + f0_min, + note_min, + f0_max, + note_max, + f0_autotune, + ): + global total_time + total_time = 0 + start_time = time.time() + if not input_audio_path0 and not input_audio_path1: + return "You need to upload an audio", None + + if (not os.path.exists(input_audio_path0)) and (not os.path.exists(os.path.join(now_dir, input_audio_path0))): + return "Audio was not properly selected or doesn't exist", None + + input_audio_path1 = input_audio_path1 or input_audio_path0 + print(f"\nStarting inference for '{os.path.basename(input_audio_path1)}'") + print("-------------------") + f0_up_key = int(f0_up_key) + if rvc_globals.NotesOrHertz and f0_method != 'rmvpe': + f0_min = note_to_hz(note_min) if note_min else 50 + f0_max = note_to_hz(note_max) if note_max else 1100 + print(f"Converted Min pitch: freq - {f0_min}\n" + f"Converted Max pitch: freq - {f0_max}") + else: + f0_min = f0_min or 50 + f0_max = f0_max or 1100 + try: + input_audio_path1 = input_audio_path1 or input_audio_path0 + print(f"Attempting to load {input_audio_path1}....") + audio = load_audio(file=input_audio_path1, + sr=16000, + DoFormant=rvc_globals.DoFormant, + Quefrency=rvc_globals.Quefrency, + Timbre=rvc_globals.Timbre) + + audio_max = np.abs(audio).max() / 0.95 + if audio_max > 1: + audio /= audio_max + times = [0, 0, 0] + + if self.hubert_model is None: + self.hubert_model = load_hubert(self.config) + + try: + self.if_f0 = self.cpt.get("f0", 1) + except NameError: + message = "Model was not properly selected" + print(message) + return message, None + + file_index = ( + ( + file_index.strip(" ") + .strip('"') + .strip("\n") + .strip('"') + .strip(" ") + .replace("trained", "added") + ) + if file_index != "" + else file_index2 + ) # 防止小白写错,自动帮他替换掉 + + try: + audio_opt = self.pipeline.pipeline( + self.hubert_model, + self.net_g, + sid, + audio, + input_audio_path1, + times, + f0_up_key, + f0_method, + file_index, + index_rate, + self.if_f0, + filter_radius, + self.tgt_sr, + resample_sr, + rms_mix_rate, + self.version, + protect, + crepe_hop_length, + f0_autotune, + f0_file=f0_file, + f0_min=f0_min, + f0_max=f0_max + ) + except AssertionError: + message = "Mismatching index version detected (v1 with v2, or v2 with v1)." + print(message) + return message, None + except NameError: + message = "RVC libraries are still loading. Please try again in a few seconds." + print(message) + return message, None + + if self.tgt_sr != resample_sr >= 16000: + tgt_sr = resample_sr + else: + tgt_sr = self.tgt_sr + index_info = ( + "Index:\n%s." % file_index + if os.path.exists(file_index) + else "Index not used." + ) + end_time = time.time() + total_time = end_time - start_time + return ( + "Success.\n%s\nTime:\nnpy: %.2fs, f0: %.2fs, infer: %.2fs." + % (index_info, *times), + (tgt_sr, audio_opt), + ) + except: + info = traceback.format_exc() + logger.warn(info) + return info, (None, None) + + + def vc_multi( + self, + sid, + dir_path, + opt_root, + paths, + f0_up_key, + f0_method, + file_index, + file_index2, + index_rate, + filter_radius, + resample_sr, + rms_mix_rate, + protect, + format1, + crepe_hop_length, + f0_min, + note_min, + f0_max, + note_max, + f0_autotune, + ): + if rvc_globals.NotesOrHertz and f0_method != 'rmvpe': + f0_min = note_to_hz(note_min) if note_min else 50 + f0_max = note_to_hz(note_max) if note_max else 1100 + print(f"Converted Min pitch: freq - {f0_min}\n" + f"Converted Max pitch: freq - {f0_max}") + else: + f0_min = f0_min or 50 + f0_max = f0_max or 1100 + try: + dir_path = ( + dir_path.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + ) # 防止小白拷路径头尾带了空格和"和回车 + opt_root = opt_root.strip(" ").strip('"').strip("\n").strip('"').strip(" ") + os.makedirs(opt_root, exist_ok=True) + try: + if dir_path != "": + paths = [ + os.path.join(dir_path, name) for name in os.listdir(dir_path) + ] + else: + paths = [path.name for path in paths] + except: + traceback.print_exc() + paths = [path.name for path in paths] + infos = [] + for path in paths: + info, opt = self.vc_single( + sid, + path, + f0_up_key, + None, + f0_method, + file_index, + file_index2, + # file_big_npy, + index_rate, + filter_radius, + resample_sr, + rms_mix_rate, + protect, + ) + if "Success" in info: + try: + tgt_sr, audio_opt = opt + if format1 in ["wav", "flac"]: + sf.write( + "%s/%s.%s" + % (opt_root, os.path.basename(path), format1), + audio_opt, + tgt_sr, + ) + else: + path = "%s/%s.%s" % (opt_root, os.path.basename(path), format1) + with BytesIO() as wavf: + sf.write( + wavf, + audio_opt, + tgt_sr, + format="wav" + ) + wavf.seek(0, 0) + with open(path, "wb") as outf: + wav2(wavf, outf, format1) + except: + info += traceback.format_exc() + infos.append("%s->%s" % (os.path.basename(path), info)) + yield "\n".join(infos) + yield "\n".join(infos) + except: + yield traceback.format_exc() diff --git a/lib/infer/modules/vc/pipeline.py b/lib/infer/modules/vc/pipeline.py new file mode 100644 index 000000000..72b93575d --- /dev/null +++ b/lib/infer/modules/vc/pipeline.py @@ -0,0 +1,654 @@ +import os +import sys +import traceback +import logging + +logger = logging.getLogger(__name__) + +from functools import lru_cache +from time import time as ttime +from torch import Tensor +import faiss +import librosa +import numpy as np +import parselmouth +import pyworld +import torch +import torch.nn.functional as F +import torchcrepe +from scipy import signal +from tqdm import tqdm + +import random +now_dir = os.getcwd() +sys.path.append(now_dir) +import re +from functools import partial +bh, ah = signal.butter(N=5, Wn=48, btype="high", fs=16000) + +input_audio_path2wav = {} +import torchcrepe # Fork Feature. Crepe algo for training and preprocess +import torch +from lib.infer.infer_libs.rmvpe import RMVPE + +@lru_cache +def cache_harvest_f0(input_audio_path, fs, f0max, f0min, frame_period): + audio = input_audio_path2wav[input_audio_path] + f0, t = pyworld.harvest( + audio, + fs=fs, + f0_ceil=f0max, + f0_floor=f0min, + frame_period=frame_period, + ) + f0 = pyworld.stonemask(audio, f0, t, fs) + return f0 + + +def change_rms(data1, sr1, data2, sr2, rate): # 1是输入音频,2是输出音频,rate是2的占比 + # print(data1.max(),data2.max()) + rms1 = librosa.feature.rms( + y=data1, frame_length=sr1 // 2 * 2, hop_length=sr1 // 2 + ) # 每半秒一个点 + rms2 = librosa.feature.rms(y=data2, frame_length=sr2 // 2 * 2, hop_length=sr2 // 2) + rms1 = torch.from_numpy(rms1) + rms1 = F.interpolate( + rms1.unsqueeze(0), size=data2.shape[0], mode="linear" + ).squeeze() + rms2 = torch.from_numpy(rms2) + rms2 = F.interpolate( + rms2.unsqueeze(0), size=data2.shape[0], mode="linear" + ).squeeze() + rms2 = torch.max(rms2, torch.zeros_like(rms2) + 1e-6) + data2 *= ( + torch.pow(rms1, torch.tensor(1 - rate)) + * torch.pow(rms2, torch.tensor(rate - 1)) + ).numpy() + return data2 + + +class Pipeline(object): + def __init__(self, tgt_sr, config): + self.x_pad, self.x_query, self.x_center, self.x_max, self.is_half = ( + config.x_pad, + config.x_query, + config.x_center, + config.x_max, + config.is_half, + ) + self.sr = 16000 # hubert输入采样率 + self.window = 160 # 每帧点数 + self.t_pad = self.sr * self.x_pad # 每条前后pad时间 + self.t_pad_tgt = tgt_sr * self.x_pad + self.t_pad2 = self.t_pad * 2 + self.t_query = self.sr * self.x_query # 查询切点前后查询时间 + self.t_center = self.sr * self.x_center # 查询切点位置 + self.t_max = self.sr * self.x_max # 免查询时长阈值 + self.device = config.device + self.model_rmvpe = RMVPE("%s/rmvpe.pt" % os.environ["rmvpe_root"], is_half=self.is_half, device=self.device) + self.f0_method_dict = { + "pm": self.get_pm, + "harvest": self.get_harvest, + "dio": self.get_dio, + "rmvpe": self.get_rmvpe, + "rmvpe+": self.get_pitch_dependant_rmvpe, + "crepe": self.get_f0_official_crepe_computation, + "crepe-tiny": partial(self.get_f0_official_crepe_computation, model='model'), + "mangio-crepe": self.get_f0_crepe_computation, + "mangio-crepe-tiny": partial(self.get_f0_crepe_computation, model='model'), + + } + self.note_dict = [ + 65.41, 69.30, 73.42, 77.78, 82.41, 87.31, + 92.50, 98.00, 103.83, 110.00, 116.54, 123.47, + 130.81, 138.59, 146.83, 155.56, 164.81, 174.61, + 185.00, 196.00, 207.65, 220.00, 233.08, 246.94, + 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, + 369.99, 392.00, 415.30, 440.00, 466.16, 493.88, + 523.25, 554.37, 587.33, 622.25, 659.25, 698.46, + 739.99, 783.99, 830.61, 880.00, 932.33, 987.77, + 1046.50, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, + 1479.98, 1567.98, 1661.22, 1760.00, 1864.66, 1975.53, + 2093.00, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, + 2959.96, 3135.96, 3322.44, 3520.00, 3729.31, 3951.07 + ] + + # Fork Feature: Get the best torch device to use for f0 algorithms that require a torch device. Will return the type (torch.device) + def get_optimal_torch_device(self, index: int = 0) -> torch.device: + if torch.cuda.is_available(): + return torch.device( + f"cuda:{index % torch.cuda.device_count()}" + ) # Very fast + elif torch.backends.mps.is_available(): + return torch.device("mps") + return torch.device("cpu") + + # Fork Feature: Compute f0 with the crepe method + def get_f0_crepe_computation( + self, + x, + f0_min, + f0_max, + p_len, + *args, # 512 before. Hop length changes the speed that the voice jumps to a different dramatic pitch. Lower hop lengths means more pitch accuracy but longer inference time. + **kwargs, # Either use crepe-tiny "tiny" or crepe "full". Default is full + ): + x = x.astype( + np.float32 + ) # fixes the F.conv2D exception. We needed to convert double to float. + x /= np.quantile(np.abs(x), 0.999) + torch_device = self.get_optimal_torch_device() + audio = torch.from_numpy(x).to(torch_device, copy=True) + audio = torch.unsqueeze(audio, dim=0) + if audio.ndim == 2 and audio.shape[0] > 1: + audio = torch.mean(audio, dim=0, keepdim=True).detach() + audio = audio.detach() + hop_length = kwargs.get('crepe_hop_length', 160) + model = kwargs.get('model', 'full') + print("Initiating prediction with a crepe_hop_length of: " + str(hop_length)) + pitch: Tensor = torchcrepe.predict( + audio, + self.sr, + hop_length, + f0_min, + f0_max, + model, + batch_size=hop_length * 2, + device=torch_device, + pad=True, + ) + p_len = p_len or x.shape[0] // hop_length + # Resize the pitch for final f0 + source = np.array(pitch.squeeze(0).cpu().float().numpy()) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * p_len, len(source)) / p_len, + np.arange(0, len(source)), + source, + ) + f0 = np.nan_to_num(target) + return f0 # Resized f0 + + def get_f0_official_crepe_computation( + self, + x, + f0_min, + f0_max, + *args, + **kwargs + ): + # Pick a batch size that doesn't cause memory errors on your gpu + batch_size = 512 + # Compute pitch using first gpu + audio = torch.tensor(np.copy(x))[None].float() + model = kwargs.get('model', 'full') + f0, pd = torchcrepe.predict( + audio, + self.sr, + self.window, + f0_min, + f0_max, + model, + batch_size=batch_size, + device=self.device, + return_periodicity=True, + ) + pd = torchcrepe.filter.median(pd, 3) + f0 = torchcrepe.filter.mean(f0, 3) + f0[pd < 0.1] = 0 + f0 = f0[0].cpu().numpy() + return f0 + + # Fork Feature: Compute pYIN f0 method + def get_f0_pyin_computation(self, x, f0_min, f0_max): + y, sr = librosa.load("saudio/Sidney.wav", self.sr, mono=True) + f0, _, _ = librosa.pyin(y, sr=self.sr, fmin=f0_min, fmax=f0_max) + f0 = f0[1:] # Get rid of extra first frame + return f0 + + def get_pm(self, x, p_len, *args, **kwargs): + f0 = parselmouth.Sound(x, self.sr).to_pitch_ac( + time_step=160 / 16000, + voicing_threshold=0.6, + pitch_floor=kwargs.get('f0_min'), + pitch_ceiling=kwargs.get('f0_max'), + ).selected_array["frequency"] + + return np.pad( + f0, + [[max(0, (p_len - len(f0) + 1) // 2), max(0, p_len - len(f0) - (p_len - len(f0) + 1) // 2)]], + mode="constant" + ) + + def get_harvest(self, x, *args, **kwargs): + f0_spectral = pyworld.harvest( + x.astype(np.double), + fs=self.sr, + f0_ceil=kwargs.get('f0_max'), + f0_floor=kwargs.get('f0_min'), + frame_period=1000 * kwargs.get('hop_length', 160) / self.sr, + ) + return pyworld.stonemask(x.astype(np.double), *f0_spectral, self.sr) + + def get_dio(self, x, *args, **kwargs): + f0_spectral = pyworld.dio( + x.astype(np.double), + fs=self.sr, + f0_ceil=kwargs.get('f0_max'), + f0_floor=kwargs.get('f0_min'), + frame_period=1000 * kwargs.get('hop_length', 160) / self.sr, + ) + return pyworld.stonemask(x.astype(np.double), *f0_spectral, self.sr) + + + def get_rmvpe(self, x, *args, **kwargs): + if not hasattr(self, "model_rmvpe"): + from lib.infer.infer_libs.rmvpe import RMVPE + + logger.info( + "Loading rmvpe model,%s" % "%s/rmvpe.pt" % os.environ["rmvpe_root"] + ) + self.model_rmvpe = RMVPE( + "%s/rmvpe.pt" % os.environ["rmvpe_root"], + is_half=self.is_half, + device=self.device, + ) + f0 = self.model_rmvpe.infer_from_audio(x, thred=0.03) + + return f0 + + + def get_pitch_dependant_rmvpe(self, x, f0_min=1, f0_max=40000, *args, **kwargs): + return self.model_rmvpe.infer_from_audio_with_pitch(x, thred=0.03, f0_min=f0_min, f0_max=f0_max) + + def autotune_f0(self, f0): + autotuned_f0 = [] + for freq in f0: + closest_notes = [x for x in self.note_dict if abs(x - freq) == min(abs(n - freq) for n in self.note_dict)] + autotuned_f0.append(random.choice(closest_notes)) + return np.array(autotuned_f0, np.float64) + + # Fork Feature: Acquire median hybrid f0 estimation calculation + def get_f0_hybrid_computation( + self, + methods_str, + input_audio_path, + x, + f0_min, + f0_max, + p_len, + filter_radius, + crepe_hop_length, + time_step + ): + # Get various f0 methods from input to use in the computation stack + params = {'x': x, 'p_len': p_len, 'f0_min': f0_min, + 'f0_max': f0_max, 'time_step': time_step, 'filter_radius': filter_radius, + 'crepe_hop_length': crepe_hop_length, 'model': "full" + } + methods_str = re.search('hybrid\[(.+)\]', methods_str) + if methods_str: # Ensure a match was found + methods = [method.strip() for method in methods_str.group(1).split('+')] + f0_computation_stack = [] + + print(f"Calculating f0 pitch estimations for methods: {str(methods)}") + x = x.astype(np.float32) + x /= np.quantile(np.abs(x), 0.999) + # Get f0 calculations for all methods specified + + for method in methods: + if method not in self.f0_method_dict: + print(f"Method {method} not found.") + continue + f0 = self.f0_method_dict[method](**params) + if method == 'harvest' and filter_radius > 2: + f0 = signal.medfilt(f0, 3) + f0 = f0[1:] # Get rid of first frame. + f0_computation_stack.append(f0) + + for fc in f0_computation_stack: + print(len(fc)) + + print(f"Calculating hybrid median f0 from the stack of: {str(methods)}") + f0_median_hybrid = np.nanmedian(f0_computation_stack, axis=0) + return f0_median_hybrid + + def get_f0( + self, + input_audio_path, + x, + p_len, + f0_up_key, + f0_method, + filter_radius, + crepe_hop_length, + f0_autotune, + inp_f0=None, + f0_min=50, + f0_max=1100, + ): + global input_audio_path2wav + time_step = self.window / self.sr * 1000 + f0_min = 50 + f0_max = 1100 + f0_mel_min = 1127 * np.log(1 + f0_min / 700) + f0_mel_max = 1127 * np.log(1 + f0_max / 700) + params = {'x': x, 'p_len': p_len, 'f0_up_key': f0_up_key, 'f0_min': f0_min, + 'f0_max': f0_max, 'time_step': time_step, 'filter_radius': filter_radius, + 'crepe_hop_length': crepe_hop_length, 'model': "full" + } + + if "hybrid" in f0_method: + # Perform hybrid median pitch estimation + input_audio_path2wav[input_audio_path] = x.astype(np.double) + f0 = self.get_f0_hybrid_computation( + f0_method,+ + input_audio_path, + x, + f0_min, + f0_max, + p_len, + filter_radius, + crepe_hop_length, + time_step, + ) + else: + f0 = self.f0_method_dict[f0_method](**params) + + if "privateuseone" in str(self.device): # clean ortruntime memory + del self.model_rmvpe.model + del self.model_rmvpe + logger.info("Cleaning ortruntime memory") + + if f0_autotune: + f0 = self.autotune_f0(f0) + + f0 *= pow(2, f0_up_key / 12) + # with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()])) + tf0 = self.sr // self.window # 每秒f0点数 + if inp_f0 is not None: + delta_t = np.round( + (inp_f0[:, 0].max() - inp_f0[:, 0].min()) * tf0 + 1 + ).astype("int16") + replace_f0 = np.interp( + list(range(delta_t)), inp_f0[:, 0] * 100, inp_f0[:, 1] + ) + shape = f0[self.x_pad * tf0 : self.x_pad * tf0 + len(replace_f0)].shape[0] + f0[self.x_pad * tf0 : self.x_pad * tf0 + len(replace_f0)] = replace_f0[ + :shape + ] + # with open("test_opt.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()])) + f0bak = f0.copy() + f0_mel = 1127 * np.log(1 + f0 / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / ( + f0_mel_max - f0_mel_min + ) + 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > 255] = 255 + f0_coarse = np.rint(f0_mel).astype(np.int32) + return f0_coarse, f0bak # 1-0 + + def vc( + self, + model, + net_g, + sid, + audio0, + pitch, + pitchf, + times, + index, + big_npy, + index_rate, + version, + protect, + ): # ,file_index,file_big_npy + feats = torch.from_numpy(audio0) + if self.is_half: + feats = feats.half() + else: + feats = feats.float() + if feats.dim() == 2: # double channels + feats = feats.mean(-1) + assert feats.dim() == 1, feats.dim() + feats = feats.view(1, -1) + padding_mask = torch.BoolTensor(feats.shape).to(self.device).fill_(False) + + inputs = { + "source": feats.to(self.device), + "padding_mask": padding_mask, + "output_layer": 9 if version == "v1" else 12, + } + t0 = ttime() + with torch.no_grad(): + logits = model.extract_features(**inputs) + feats = model.final_proj(logits[0]) if version == "v1" else logits[0] + if protect < 0.5 and pitch is not None and pitchf is not None: + feats0 = feats.clone() + if ( + not isinstance(index, type(None)) + and not isinstance(big_npy, type(None)) + and index_rate != 0 + ): + npy = feats[0].cpu().numpy() + if self.is_half: + npy = npy.astype("float32") + + # _, I = index.search(npy, 1) + # npy = big_npy[I.squeeze()] + + score, ix = index.search(npy, k=8) + weight = np.square(1 / score) + weight /= weight.sum(axis=1, keepdims=True) + npy = np.sum(big_npy[ix] * np.expand_dims(weight, axis=2), axis=1) + + if self.is_half: + npy = npy.astype("float16") + feats = ( + torch.from_numpy(npy).unsqueeze(0).to(self.device) * index_rate + + (1 - index_rate) * feats + ) + + feats = F.interpolate(feats.permute(0, 2, 1), scale_factor=2).permute(0, 2, 1) + if protect < 0.5 and pitch is not None and pitchf is not None: + feats0 = F.interpolate(feats0.permute(0, 2, 1), scale_factor=2).permute( + 0, 2, 1 + ) + t1 = ttime() + p_len = audio0.shape[0] // self.window + if feats.shape[1] < p_len: + p_len = feats.shape[1] + if pitch is not None and pitchf is not None: + pitch = pitch[:, :p_len] + pitchf = pitchf[:, :p_len] + + if protect < 0.5 and pitch is not None and pitchf is not None: + pitchff = pitchf.clone() + pitchff[pitchf > 0] = 1 + pitchff[pitchf < 1] = protect + pitchff = pitchff.unsqueeze(-1) + feats = feats * pitchff + feats0 * (1 - pitchff) + feats = feats.to(feats0.dtype) + p_len = torch.tensor([p_len], device=self.device).long() + with torch.no_grad(): + hasp = pitch is not None and pitchf is not None + arg = (feats, p_len, pitch, pitchf, sid) if hasp else (feats, p_len, sid) + audio1 = (net_g.infer(*arg)[0][0, 0]).data.cpu().float().numpy() + del hasp, arg + del feats, p_len, padding_mask + if torch.cuda.is_available(): + torch.cuda.empty_cache() + t2 = ttime() + times[0] += t1 - t0 + times[2] += t2 - t1 + return audio1 + def process_t(self, t, s, window, audio_pad, pitch, pitchf, times, index, big_npy, index_rate, version, protect, t_pad_tgt, if_f0, sid, model, net_g): + t = t // window * window + if if_f0 == 1: + return self.vc( + model, + net_g, + sid, + audio_pad[s : t + t_pad_tgt + window], + pitch[:, s // window : (t + t_pad_tgt) // window], + pitchf[:, s // window : (t + t_pad_tgt) // window], + times, + index, + big_npy, + index_rate, + version, + protect, + )[t_pad_tgt : -t_pad_tgt] + else: + return self.vc( + model, + net_g, + sid, + audio_pad[s : t + t_pad_tgt + window], + None, + None, + times, + index, + big_npy, + index_rate, + version, + protect, + )[t_pad_tgt : -t_pad_tgt] + + + def pipeline( + self, + model, + net_g, + sid, + audio, + input_audio_path, + times, + f0_up_key, + f0_method, + file_index, + index_rate, + if_f0, + filter_radius, + tgt_sr, + resample_sr, + rms_mix_rate, + version, + protect, + crepe_hop_length, + f0_autotune, + f0_file=None, + f0_min=50, + f0_max=1100 + ): + if ( + file_index != "" + # and file_big_npy != "" + # and os.path.exists(file_big_npy) == True + and os.path.exists(file_index) + and index_rate != 0 + ): + try: + index = faiss.read_index(file_index) + # big_npy = np.load(file_big_npy) + big_npy = index.reconstruct_n(0, index.ntotal) + except: + traceback.print_exc() + index = big_npy = None + else: + index = big_npy = None + audio = signal.filtfilt(bh, ah, audio) + audio_pad = np.pad(audio, (self.window // 2, self.window // 2), mode="reflect") + opt_ts = [] + if audio_pad.shape[0] > self.t_max: + audio_sum = np.zeros_like(audio) + for i in range(self.window): + audio_sum += audio_pad[i : i - self.window] + for t in range(self.t_center, audio.shape[0], self.t_center): + opt_ts.append( + t + - self.t_query + + np.where( + np.abs(audio_sum[t - self.t_query : t + self.t_query]) + == np.abs(audio_sum[t - self.t_query : t + self.t_query]).min() + )[0][0] + ) + s = 0 + audio_opt = [] + t = None + t1 = ttime() + audio_pad = np.pad(audio, (self.t_pad, self.t_pad), mode="reflect") + p_len = audio_pad.shape[0] // self.window + inp_f0 = None + if hasattr(f0_file, "name"): + try: + with open(f0_file.name, "r") as f: + lines = f.read().strip("\n").split("\n") + inp_f0 = [] + for line in lines: + inp_f0.append([float(i) for i in line.split(",")]) + inp_f0 = np.array(inp_f0, dtype="float32") + except: + traceback.print_exc() + sid = torch.tensor(sid, device=self.device).unsqueeze(0).long() + pitch, pitchf = None, None + if if_f0: + pitch, pitchf = self.get_f0( + input_audio_path, + audio_pad, + p_len, + f0_up_key, + f0_method, + filter_radius, + crepe_hop_length, + f0_autotune, + inp_f0, + f0_min, + f0_max + ) + pitch = pitch[:p_len] + pitchf = pitchf[:p_len] + if self.device == "mps" or "xpu" in self.device: + pitchf = pitchf.astype(np.float32) + pitch = torch.tensor(pitch, device=self.device).unsqueeze(0).long() + pitchf = torch.tensor(pitchf, device=self.device).unsqueeze(0).float() + t2 = ttime() + times[1] += t2 - t1 + + with tqdm(total=len(opt_ts), desc="Processing", unit="window") as pbar: + for i, t in enumerate(opt_ts): + t = t // self.window * self.window + start = s + end = t + self.t_pad2 + self.window + audio_slice = audio_pad[start:end] + pitch_slice = pitch[:, start // self.window:end // self.window] if if_f0 else None + pitchf_slice = pitchf[:, start // self.window:end // self.window] if if_f0 else None + audio_opt.append(self.vc(model, net_g, sid, audio_slice, pitch_slice, pitchf_slice, times, index, big_npy, index_rate, version, protect)[self.t_pad_tgt : -self.t_pad_tgt]) + s = t + pbar.update(1) + pbar.refresh() + + audio_slice = audio_pad[t:] + pitch_slice = pitch[:, t // self.window:] if if_f0 and t is not None else pitch + pitchf_slice = pitchf[:, t // self.window:] if if_f0 and t is not None else pitchf + audio_opt.append(self.vc(model, net_g, sid, audio_slice, pitch_slice, pitchf_slice, times, index, big_npy, index_rate, version, protect)[self.t_pad_tgt : -self.t_pad_tgt]) + + audio_opt = np.concatenate(audio_opt) + if rms_mix_rate != 1: + audio_opt = change_rms(audio, 16000, audio_opt, tgt_sr, rms_mix_rate) + if tgt_sr != resample_sr >= 16000: + audio_opt = librosa.resample( + audio_opt, orig_sr=tgt_sr, target_sr=resample_sr + ) + audio_max = np.abs(audio_opt).max() / 0.99 + max_int16 = 32768 + if audio_max > 1: + max_int16 /= audio_max + audio_opt = (audio_opt * max_int16).astype(np.int16) + del pitch, pitchf, sid + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + print("Returning completed audio...") + print("-------------------") + return audio_opt diff --git a/lib/infer/modules/vc/utils.py b/lib/infer/modules/vc/utils.py new file mode 100644 index 000000000..a1cb0ff84 --- /dev/null +++ b/lib/infer/modules/vc/utils.py @@ -0,0 +1,42 @@ +import os +import re +from fairseq import checkpoint_utils + + +def get_index_path_from_model(sid): + sid0strip = re.sub(r'\.pth|\.onnx$', '', sid) + sid0name = os.path.split(sid0strip)[-1] # Extract only the name, not the directory + + # Check if the sid0strip has the specific ending format _eXXX_sXXX + if re.match(r'.+_e\d+_s\d+$', sid0name): + base_model_name = sid0name.rsplit('_', 2)[0] + else: + base_model_name = sid0name + + return next( + ( + f + for f in [ + os.path.join(root, name) + for root, _, files in os.walk(os.getenv("index_root"), topdown=False) + for name in files + if name.endswith(".index") and "trained" not in name + ] + if base_model_name in f + ), + "", + ) + + +def load_hubert(config): + models, _, _ = checkpoint_utils.load_model_ensemble_and_task( + ["assets/hubert/hubert_base.pt"], + suffix="", + ) + hubert_model = models[0] + hubert_model = hubert_model.to(config.device) + if config.is_half: + hubert_model = hubert_model.half() + else: + hubert_model = hubert_model.float() + return hubert_model.eval() diff --git a/lib/model/.gitkeep b/lib/model/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lib/model/.gitkeep @@ -0,0 +1 @@ + diff --git a/lib/tools/LazyImport.py b/lib/tools/LazyImport.py new file mode 100644 index 000000000..5bdb05ddd --- /dev/null +++ b/lib/tools/LazyImport.py @@ -0,0 +1,13 @@ +from importlib.util import find_spec, LazyLoader, module_from_spec +from sys import modules + +def lazyload(name): + if name in modules: + return modules[name] + else: + spec = find_spec(name) + loader = LazyLoader(spec.loader) + module = module_from_spec(spec) + modules[name] = module + loader.exec_module(module) + return module \ No newline at end of file diff --git a/lib/tools/__pycache__/LazyImport.cpython-39.pyc b/lib/tools/__pycache__/LazyImport.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa5a84878686420fea4da61042c1a7dc4a5c913a GIT binary patch literal 550 zcmYjO%}(4f5T3D38_6GQ$mRn6sD+H$`nsI z`Wlmg3e%8cUIu?4jmmHiN%WUGAmQ%QvRai3TZ_UCFY^2Ch0aT1+*s*yEyZGKwCYY1 zbc4QT3xe`40Y#j2N@~x^w9vo?%($UwALh_t3%~IfHmt=ToFdi)Et2Og_jitq@%r4bjeAKf#_8(yV#y#9+ul4$ZH2?qr literal 0 HcmV?d00001 diff --git a/lib/tools/__pycache__/audioEffects.cpython-39.pyc b/lib/tools/__pycache__/audioEffects.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed9ca1a98af306aa1913b2146527330b171df8d0 GIT binary patch literal 1376 zcmZWpPj4eN6u0MpCX>*XLc5$Q0TMa1+P$F_Vkw0#T&h)9fYu5`lh{dS>lqKWXG_ZD zlwQkzh4#pW55R}uisT#OREYy8g!WRNCsDT&w*3B&?e~7qlXf~Wf^qS!%YOF|`qL_R zhYQLlu+&dLD5997921;7#K~Ra<{t5|wL9F;0}?c{%R>@^&E*k^SajLCLL_G4^Y&%J z;w#+5c)XK$Nf#s5T_ExXMEiU#UnlFU9X80D%?_L7E#LuvJKrK(;0tMVj>tB3pQ2vt z8t#O8o{66@n)0DYB{lJZ$V;;oU(>fBFVvkeJdf2q~E1HSJjI$%qqAwqO zSnO9?fSfd*r)-k5LWAy=Je`evd&p`ez+12mU@5pf(x`S8kP&cq#XZX>XztgJykGm5 zSUVI`=K|ZzYgZmNHkZ28qyB}{SUve&WA$iYGo-Bx*V?sT`wKh|bWo!Oe)+>Z1PRl) z4xfjxqJ{VJa30m6tuW~E36j5p*0%mDJa5%O-Lf)m)8xXP$8~g>)C~gPpML|Wc`z3) zM#b6#q<*`Pa5J9){h#-*yI$R)odvG(7Miyq^R~^n#(+roX!7IcFOUB?JAc%}q$P#O z2P!*b**`ZoH`n)|YCXp!dJ6bV1*Zc#G`>uACbGXFU;=&^|312Y1+3@FHZW;xPGZS8 zOBEaB%HY#O0LOwi4-G1o6()r;<}^K7gp8}cY0mpmoh7~3DUA;1(nd?NZO8; z7F6k25&$u=O7oI4xC%2#QRRctG%X6omGLy=+yrBp<_t8+QfmBDnL(hJLF@Dq6K6$P z=|P$5scDN!-zr_%wBLXg>5wyOHb%Ft`Px?4)*MXWwOq>>6q*V3y%aUhe#deRsKG;1J z@?`gzjRa-8pR%;l*?89H*|4vL;HuwL^7G{-_R5**l*=Ly8b=pSQy&09IBKScJ-h~M z1JeWuIWH&8U7SUgDQwSO-YOJrO%Q^pa>1QVu5 zr__XnI33VT!s~>B%XRqBtfkNZTJ2dt8X`k5%WdoP%NebPGHPUi7SeHw(zKMQ3Oa_r zfN|8AbepI>`{0M^=tSB_-dww>?H%%--6#4e7qsH+WB3CgWslj0beF|QKnhk`;`|4H Cf_HuZ literal 0 HcmV?d00001 diff --git a/lib/tools/app.py b/lib/tools/app.py new file mode 100644 index 000000000..d45dc69e9 --- /dev/null +++ b/lib/tools/app.py @@ -0,0 +1,148 @@ +import logging +import os + +# os.system("wget -P cvec/ https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt") +import gradio as gr +from dotenv import load_dotenv + +from assets.configs.config import Config +from assets.i18n.i18n import I18nAuto +from lib.infer.modules.vc.pipeline import Pipeline +VC = Pipeline + +logging.getLogger("numba").setLevel(logging.WARNING) +logging.getLogger("markdown_it").setLevel(logging.WARNING) +logging.getLogger("urllib3").setLevel(logging.WARNING) +logging.getLogger("matplotlib").setLevel(logging.WARNING) +logger = logging.getLogger(__name__) + +i18n = I18nAuto() +#(i18n) + +load_dotenv() +config = Config() +vc = VC(config) + +weight_root = os.getenv("weight_root") +weight_uvr5_root = os.getenv("weight_uvr5_root") +index_root = os.getenv("index_root") +names = [] +hubert_model = None +for name in os.listdir(weight_root): + if name.endswith(".pth"): + names.append(name) +index_paths = [] +for root, dirs, files in os.walk(index_root, topdown=False): + for name in files: + if name.endswith(".index") and "trained" not in name: + index_paths.append("%s/%s" % (root, name)) + + +app = gr.Blocks() +with app: + with gr.Tabs(): + with gr.TabItem("在线demo"): + gr.Markdown( + value=""" + RVC 在线demo + """ + ) + sid = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names)) + with gr.Column(): + spk_item = gr.Slider( + minimum=0, + maximum=2333, + step=1, + label=i18n("请选择说话人id"), + value=0, + visible=False, + interactive=True, + ) + sid.change(fn=vc.get_vc, inputs=[sid], outputs=[spk_item]) + gr.Markdown( + value=i18n("男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ") + ) + vc_input3 = gr.Audio(label="上传音频(长度小于90秒)") + vc_transform0 = gr.Number(label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0) + f0method0 = gr.Radio( + label=i18n("选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU"), + choices=["pm", "harvest", "crepe", "rmvpe"], + value="pm", + interactive=True, + ) + filter_radius0 = gr.Slider( + minimum=0, + maximum=7, + label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), + value=3, + step=1, + interactive=True, + ) + with gr.Column(): + file_index1 = gr.Textbox( + label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), + value="", + interactive=False, + visible=False, + ) + file_index2 = gr.Dropdown( + label=i18n("自动检测index路径,下拉式选择(dropdown)"), + choices=sorted(index_paths), + interactive=True, + ) + index_rate1 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("检索特征占比"), + value=0.88, + interactive=True, + ) + resample_sr0 = gr.Slider( + minimum=0, + maximum=48000, + label=i18n("后处理重采样至最终采样率,0为不进行重采样"), + value=0, + step=1, + interactive=True, + ) + rms_mix_rate0 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), + value=1, + interactive=True, + ) + protect0 = gr.Slider( + minimum=0, + maximum=0.5, + label=i18n("保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果"), + value=0.33, + step=0.01, + interactive=True, + ) + f0_file = gr.File(label=i18n("F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调")) + but0 = gr.Button(i18n("转换"), variant="primary") + vc_output1 = gr.Textbox(label=i18n("输出信息")) + vc_output2 = gr.Audio(label=i18n("输出音频(右下角三个点,点了可以下载)")) + but0.click( + vc.vc_single, + [ + spk_item, + vc_input3, + vc_transform0, + f0_file, + f0method0, + file_index1, + file_index2, + # file_big_npy1, + index_rate1, + filter_radius0, + resample_sr0, + rms_mix_rate0, + protect0, + ], + [vc_output1, vc_output2], + ) + + +app.launch() diff --git a/lib/tools/audioEffects.py b/lib/tools/audioEffects.py new file mode 100644 index 000000000..e8a18612b --- /dev/null +++ b/lib/tools/audioEffects.py @@ -0,0 +1,37 @@ +from pedalboard import Pedalboard, Compressor, Reverb, NoiseGate +from pedalboard.io import AudioFile +import sys +import os +now_dir = os.getcwd() +sys.path.append(now_dir) +from assets.i18n.i18n import I18nAuto +i18n = I18nAuto() +from pydub import AudioSegment +import numpy as np +import soundfile as sf +from pydub.playback import play + +def process_audio(input_path, output_path, reverb_enabled, compressor_enabled, noise_gate_enabled, ): + print(reverb_enabled) + print(compressor_enabled) + print(noise_gate_enabled) + effects = [] + if reverb_enabled: + effects.append(Reverb(room_size=0.01)) + if compressor_enabled: + effects.append(Compressor(threshold_db=-10, ratio=25)) + if noise_gate_enabled: + effects.append(NoiseGate(threshold_db=-16, ratio=1.5, release_ms=250)) + + board = Pedalboard(effects) + + with AudioFile(input_path) as f: + with AudioFile(output_path, 'w', f.samplerate, f.num_channels) as o: + while f.tell() < f.frames: + chunk = f.read(f.samplerate) + effected = board(chunk, f.samplerate, reset=False) + o.write(effected) + + result = i18n("Processed audio saved at: ") + output_path + print(result) + return output_path \ No newline at end of file diff --git a/lib/tools/calc_rvc_model_similarity.py b/lib/tools/calc_rvc_model_similarity.py new file mode 100644 index 000000000..42496e088 --- /dev/null +++ b/lib/tools/calc_rvc_model_similarity.py @@ -0,0 +1,96 @@ +# This code references https://huggingface.co/JosephusCheung/ASimilarityCalculatior/blob/main/qwerty.py +# Fill in the path of the model to be queried and the root directory of the reference models, and this script will return the similarity between the model to be queried and all reference models. +import os +import logging + +logger = logging.getLogger(__name__) + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +def cal_cross_attn(to_q, to_k, to_v, rand_input): + hidden_dim, embed_dim = to_q.shape + attn_to_q = nn.Linear(hidden_dim, embed_dim, bias=False) + attn_to_k = nn.Linear(hidden_dim, embed_dim, bias=False) + attn_to_v = nn.Linear(hidden_dim, embed_dim, bias=False) + attn_to_q.load_state_dict({"weight": to_q}) + attn_to_k.load_state_dict({"weight": to_k}) + attn_to_v.load_state_dict({"weight": to_v}) + + return torch.einsum( + "ik, jk -> ik", + F.softmax( + torch.einsum("ij, kj -> ik", attn_to_q(rand_input), attn_to_k(rand_input)), + dim=-1, + ), + attn_to_v(rand_input), + ) + + +def model_hash(filename): + try: + with open(filename, "rb") as file: + import hashlib + + m = hashlib.sha256() + + file.seek(0x100000) + m.update(file.read(0x10000)) + return m.hexdigest()[0:8] + except FileNotFoundError: + return "NOFILE" + + +def eval(model, n, input): + qk = f"enc_p.encoder.attn_layers.{n}.conv_q.weight" + uk = f"enc_p.encoder.attn_layers.{n}.conv_k.weight" + vk = f"enc_p.encoder.attn_layers.{n}.conv_v.weight" + atoq, atok, atov = model[qk][:, :, 0], model[uk][:, :, 0], model[vk][:, :, 0] + + attn = cal_cross_attn(atoq, atok, atov, input) + return attn + + +def main(path, root): + torch.manual_seed(114514) + model_a = torch.load(path, map_location="cpu")["weight"] + + logger.info("Query:\t\t%s\t%s" % (path, model_hash(path))) + + map_attn_a = {} + map_rand_input = {} + for n in range(6): + hidden_dim, embed_dim, _ = model_a[ + f"enc_p.encoder.attn_layers.{n}.conv_v.weight" + ].shape + rand_input = torch.randn([embed_dim, hidden_dim]) + + map_attn_a[n] = eval(model_a, n, rand_input) + map_rand_input[n] = rand_input + + del model_a + + for name in sorted(list(os.listdir(root))): + path = "%s/%s" % (root, name) + model_b = torch.load(path, map_location="cpu")["weight"] + + sims = [] + for n in range(6): + attn_a = map_attn_a[n] + attn_b = eval(model_b, n, map_rand_input[n]) + + sim = torch.mean(torch.cosine_similarity(attn_a, attn_b)) + sims.append(sim) + + logger.info( + "Reference:\t%s\t%s\t%s" + % (path, model_hash(path), f"{torch.mean(torch.stack(sims)) * 1e2:.2f}%") + ) + + +if __name__ == "__main__": + query_path = r"assets\weights\mi v3.pth" + reference_root = r"assets\weights" + main(query_path, reference_root) diff --git a/lib/tools/diffq/__init__.py b/lib/tools/diffq/__init__.py new file mode 100644 index 000000000..2b997ee4e --- /dev/null +++ b/lib/tools/diffq/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# flake8: noqa +""" +This package implements different quantization strategies: + +- `diffq.uniform.UniformQuantizer`: classic uniform quantization over n bits. +- `diffq.diffq.DiffQuantizer`: differentiable quantizer based on scaled noise injection. + +Also, do check `diffq.base.BaseQuantizer` for the common methods of all Quantizers. +""" + +from .uniform import UniformQuantizer +from .diffq import DiffQuantizer diff --git a/lib/tools/diffq/base.py b/lib/tools/diffq/base.py new file mode 100644 index 000000000..9bd5276b5 --- /dev/null +++ b/lib/tools/diffq/base.py @@ -0,0 +1,262 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass +from concurrent import futures +from fnmatch import fnmatch +from functools import partial +import io +import math +from multiprocessing import cpu_count +import typing as tp +import zlib + +import torch + + +class BaseQuantizer: + @dataclass + class _QuantizedParam: + name: str + param: torch.nn.Parameter + module: torch.nn.Module + # If a Parameter is used multiple times, `other` can be used + # to share state between the different Quantizers + other: tp.Optional[tp.Any] + + def __init__(self, model: torch.nn.Module, min_size: float = 0.01, float16: bool = False, + exclude: tp.Optional[tp.List[str]] = [], detect_bound: bool = True): + self.model = model + self.min_size = min_size + self.float16 = float16 + self.exclude = exclude + self.detect_bound = detect_bound + self._quantized = False + self._pre_handle = self.model.register_forward_pre_hook(self._forward_pre_hook) + self._post_handle = self.model.register_forward_hook(self._forward_hook) + + self._quantized_state = None + self._qparams = [] + self._float16 = [] + self._others = [] + self._rnns = [] + + self._saved = [] + + self._find_params() + + def _find_params(self): + min_params = self.min_size * 2**20 // 4 + previous = {} + for module_name, module in self.model.named_modules(): + if isinstance(module, torch.nn.RNNBase): + self._rnns.append(module) + for name, param in list(module.named_parameters(recurse=False)): + full_name = f"{module_name}.{name}" + matched = False + for pattern in self.exclude: + if fnmatch(full_name, pattern) or fnmatch(name, pattern): + matched = True + break + + if param.numel() <= min_params or matched: + if id(param) in previous: + continue + if self.detect_bound: + previous[id(param)] = None + if self.float16: + self._float16.append(param) + else: + self._others.append(param) + else: + qparam = self._register_param(name, param, module, previous.get(id(param))) + if self.detect_bound: + previous[id(param)] = qparam + self._qparams.append(qparam) + + def _register_param(self, name, param, module, other): + return self.__class__._QuantizedParam(name, param, module, other) + + def _forward_pre_hook(self, module, input): + if self.model.training: + self._quantized_state = None + if self._quantized: + self.unquantize() + if self._pre_forward_train(): + self._fix_rnns() + else: + self.quantize() + + def _forward_hook(self, module, input, output): + if self.model.training: + if self._post_forward_train(): + self._fix_rnns(flatten=False) # Hacky, next forward will flatten + + def quantize(self, save=True): + """ + Immediately apply quantization to the model parameters. + If `save` is True, save a copy of the unquantized parameters, that can be + restored with `unquantize()`. + """ + if self._quantized: + return + if save: + self._saved = [qp.param.data.to('cpu', copy=True) + for qp in self._qparams if qp.other is None] + self.restore_quantized_state(self.get_quantized_state()) + self._quantized = True + self._fix_rnns() + + def unquantize(self): + """ + Revert a previous call to `quantize()`. + """ + if not self._quantized: + raise RuntimeError("Can only be called on a quantized model.") + if not self._saved: + raise RuntimeError("Nothing to restore.") + for qparam in self._qparams: + if qparam.other is None: + qparam.param.data[:] = self._saved.pop(0) + assert len(self._saved) == 0 + self._quantized = False + self._fix_rnns() + + def _pre_forward_train(self) -> bool: + """ + Called once before each forward for continuous quantization. + Should return True if parameters were changed. + """ + return False + + def _post_forward_train(self) -> bool: + """ + Called once after each forward (to restore state for instance). + Should return True if parameters were changed. + """ + return False + + def _fix_rnns(self, flatten=True): + """ + To be called after quantization happened to fix RNNs. + """ + for rnn in self._rnns: + rnn._flat_weights = [ + (lambda wn: getattr(rnn, wn) if hasattr(rnn, wn) else None)(wn) + for wn in rnn._flat_weights_names] + if flatten: + rnn.flatten_parameters() + + def get_quantized_state(self): + """ + Returns sufficient quantized information to rebuild the model state. + + ..Note:: + To achieve maximum compression, you should compress this with + gzip or other, as quantized weights are not optimally coded! + """ + if self._quantized_state is None: + self._quantized_state = self._get_quantized_state() + return self._quantized_state + + def _get_quantized_state(self): + """ + Actual implementation for `get_quantized_state`. + """ + float16_params = [] + for p in self._float16: + q = p.data.half() + float16_params.append(q) + + return { + "quantized": [self._quantize_param(qparam) for qparam in self._qparams + if qparam.other is None], + "float16": float16_params, + "others": [p.data.clone() for p in self._others], + } + + def _quantize_param(self, qparam: _QuantizedParam) -> tp.Any: + """ + To be overriden. + """ + raise NotImplementedError() + + def _unquantize_param(self, qparam: _QuantizedParam, quantized: tp.Any) -> torch.Tensor: + """ + To be overriden. + """ + raise NotImplementedError() + + def restore_quantized_state(self, state) -> None: + """ + Restore the state of the model from the quantized state. + """ + for p, q in zip(self._float16, state["float16"]): + p.data[:] = q.to(p) + + for p, q in zip(self._others, state["others"]): + p.data[:] = q + + remaining = list(state["quantized"]) + for qparam in self._qparams: + if qparam.other is not None: + # Only unquantize first appearance of nn.Parameter. + continue + quantized = remaining.pop(0) + qparam.param.data[:] = self._unquantize_param(qparam, quantized) + self._fix_rnns() + + def detach(self) -> None: + """ + Detach from the model, removes hooks and anything else. + """ + self._pre_handle.remove() + self._post_handle.remove() + + def model_size(self) -> torch.Tensor: + """ + Returns an estimate of the quantized model size. + """ + total = torch.tensor(0.) + for p in self._float16: + total += 16 * p.numel() + for p in self._others: + total += 32 * p.numel() + return total / 2**20 / 8 # bits to MegaBytes + + def true_model_size(self) -> float: + """ + Return the true quantized model size, in MB, without extra + compression. + """ + return self.model_size().item() + + def compressed_model_size(self, compress_level=-1, num_workers=8) -> float: + """ + Return the compressed quantized model size, in MB. + + Args: + compress_level (int): compression level used with zlib, + see `zlib.compress` for details. + num_workers (int): will split the final big byte representation in that + many chunks processed in parallels. + """ + out = io.BytesIO() + torch.save(self.get_quantized_state(), out) + ms = _parallel_compress_len(out.getvalue(), compress_level, num_workers) + return ms / 2 ** 20 + + +def _compress_len(data, compress_level): + return len(zlib.compress(data, level=compress_level)) + + +def _parallel_compress_len(data, compress_level, num_workers): + num_workers = min(cpu_count(), num_workers) + chunk_size = int(math.ceil(len(data) / num_workers)) + chunks = [data[offset:offset + chunk_size] for offset in range(0, len(data), chunk_size)] + with futures.ProcessPoolExecutor(num_workers) as pool: + return sum(pool.map(partial(_compress_len, compress_level=compress_level), chunks)) diff --git a/lib/tools/diffq/diffq.py b/lib/tools/diffq/diffq.py new file mode 100644 index 000000000..b475ec7f5 --- /dev/null +++ b/lib/tools/diffq/diffq.py @@ -0,0 +1,286 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +""" +Differentiable quantizer based on scaled noise injection. +""" +from dataclasses import dataclass +import math +import typing as tp + +import torch + +from .base import BaseQuantizer +from .uniform import uniform_quantize, uniform_unquantize +from .utils import simple_repr + + +class DiffQuantizer(BaseQuantizer): + @dataclass + class _QuantizedParam(BaseQuantizer._QuantizedParam): + logit: torch.nn.Parameter + + def __init__(self, model: torch.nn.Module, min_size: float = 0.01, float16: bool = False, + group_size: int = 1, min_bits: float = 2, max_bits: float = 15, + param="bits", noise="gaussian", + init_bits: float = 8, extra_bits: float = 0, suffix: str = "_diffq", + exclude: tp.List[str] = [], detect_bound: bool = True): + """ + Differentiable quantizer based on scaled noise injection. + For every parameter `p` in the model, this introduces a number of bits parameter + `b` with the same dimensions (when group_size = 1). + Before each forward, `p` is replaced by `p + U` + with U uniform iid noise with range [-d/2, d/2], with `d` the uniform quantization + step for `b` bits. + This noise approximates the quantization noise in a differentiable manner, both + with respect to the unquantized parameter `p` and the number of bits `b`. + + At eveluation (as detected with `model.eval()`), the model is replaced + by its true quantized version, and restored when going back to training. + + When doing actual quantization (for serialization, or evaluation), + the number of bits is rounded to the nearest integer, and needs to be stored along. + This will cost a few bits per dimension. To reduce this cost, one can use `group_size`, + which will use a single noise level for multiple weight entries. + + You can use the `DiffQuantizer.model_size` method to get a differentiable estimate of the + model size in MB. You can then use this estimate as a penalty in your training loss. + + Args: + model (torch.nn.Module): model to quantize + min_size (float): minimum size in MB of a parameter to be quantized. + float16 (bool): if a layer is smaller than min_size, should we still do float16? + group_size (int): weight entries are groupped together to reduce the number + of noise scales to store. This should divide the size of all parameters + bigger than min_size. + min_bits (float): minimal number of bits. + max_bits (float): maximal number of bits. + init_bits (float): initial number of bits. + extra_bits (float): extra bits to add for actual quantization (before roundoff). + suffix (str): suffix used for the name of the extra noise scale parameters. + exclude (list[str]): list of patterns used to match parameters to exclude. + For instance `['bias']` to exclude all bias terms. + detect_bound (bool): if True, will detect bound parameters and reuse + the same quantized tensor for both, as well as the same number of bits. + + ..Warning:: + You must call `model.training()` and `model.eval()` for `DiffQuantizer` work properly. + + """ + self.group_size = group_size + self.min_bits = min_bits + self.max_bits = max_bits + self.init_bits = init_bits + self.extra_bits = extra_bits + self.suffix = suffix + self.param = param + self.noise = noise + assert noise in ["gaussian", "uniform"] + self._optimizer_setup = False + + self._min_noise = 1 / (2 ** self.max_bits - 1) + self._max_noise = 1 / (2 ** self.min_bits - 1) + + assert group_size >= 0 + assert min_bits < init_bits < max_bits, \ + "init_bits must be between min_bits and max_bits excluded3" + + for name, _ in model.named_parameters(): + if name.endswith(suffix): + raise RuntimeError("The model already has some noise scales parameters, " + "maybe you used twice a DiffQuantizer on the same model?.") + + super().__init__(model, min_size, float16, exclude, detect_bound) + + def _get_bits(self, logit: torch.Tensor): + if self.param == "noise": + return torch.log2(1 + 1 / self._get_noise_scale(logit)) + else: + t = torch.sigmoid(logit) + return self.max_bits * t + (1 - t) * self.min_bits + + def _get_noise_scale(self, logit: torch.Tensor): + if self.param == "noise": + t = torch.sigmoid(logit) + return torch.exp(t * math.log(self._min_noise) + (1 - t) * math.log(self._max_noise)) + else: + return 1 / (2 ** self._get_bits(logit) - 1) + + def _register_param(self, name, param, module, other): + if other is not None: + return self.__class__._QuantizedParam( + name=name, param=param, module=module, logit=other.logit, other=other) + assert self.group_size == 0 or param.numel() % self.group_size == 0 + # we want the initial number of bits to be init_bits. + if self.param == "noise": + noise_scale = 1 / (2 ** self.init_bits - 1) + t = (math.log(noise_scale) - math.log(self._max_noise)) / ( + math.log(self._min_noise) - math.log(self._max_noise)) + else: + t = (self.init_bits - self.min_bits) / (self.max_bits - self.min_bits) + assert 0 < t < 1 + logit = torch.logit(torch.tensor(float(t))) + assert abs(self._get_bits(logit) - self.init_bits) < 1e-5 + if self.group_size > 0: + nparam = param.numel() // self.group_size + else: + nparam = 1 + logit = torch.nn.Parameter( + torch.full( + (nparam,), + logit, + device=param.device)) + module.register_parameter(name + self.suffix, logit) + return self.__class__._QuantizedParam( + name=name, param=param, module=module, logit=logit, other=None) + + def clear_optimizer(self, optimizer: torch.optim.Optimizer): + params = [qp.logit for qp in self._qparams] + + for group in optimizer.param_groups: + new_params = [] + for q in list(group["params"]): + matched = False + for p in params: + if p is q: + matched = True + if not matched: + new_params.append(q) + group["params"][:] = new_params + + def setup_optimizer(self, optimizer: torch.optim.Optimizer, + lr: float = 1e-3, **kwargs): + """ + Setup the optimizer to tune the number of bits. In particular, this will deactivate + weight decay for the bits parameters. + + Args: + optimizer (torch.Optimizer): optimizer to use. + lr (float): specific learning rate for the bits parameters. 1e-3 + is perfect for Adam.,w + kwargs (dict): overrides for other optimization parameters for the bits. + """ + assert not self._optimizer_setup + self._optimizer_setup = True + + params = [qp.logit for qp in self._qparams] + + for group in optimizer.param_groups: + for q in list(group["params"]): + for p in params: + if p is q: + raise RuntimeError("You should create the optimizer " + "before the quantizer!") + + group = {"params": params, "lr": lr, "weight_decay": 0} + group.update(kwargs) + optimizer.add_param_group(group) + + def no_optimizer(self): + """ + Call this if you do not want to use an optimizer. + """ + self._optimizer_setup = True + + def check_unused(self): + for qparam in self._qparams: + if qparam.other is not None: + continue + grad = qparam.param.grad + if grad is None or (grad == 0).all(): + if qparam.logit.grad is not None: + qparam.logit.grad.data.zero_() + + def model_size(self, exact=False): + """ + Differentiable estimate of the model size. + The size is returned in MB. + + If `exact` is True, then the output is no longer differentiable but + reflect exactly an achievable size, even without compression, + i.e.same as returned by `naive_model_size()`. + """ + total = super().model_size() + subtotal = 0 + for qparam in self._qparams: + # only count the first appearance of a Parameter + if qparam.other is not None: + continue + bits = self.extra_bits + self._get_bits(qparam.logit) + if exact: + bits = bits.round().clamp(1, 15) + if self.group_size == 0: + group_size = qparam.param.numel() + else: + group_size = self.group_size + subtotal += group_size * bits.sum() + subtotal += 2 * 32 # param scale + + # Number of bits to represent each number of bits + bits_bits = math.ceil(math.log2(1 + (bits.max().round().item() - self.min_bits))) + subtotal += 8 # 8 bits for bits_bits + subtotal += bits_bits * bits.numel() + + subtotal /= 2 ** 20 * 8 # bits -> MegaBytes + return total + subtotal + + def true_model_size(self): + """ + Naive model size without zlib compression. + """ + return self.model_size(exact=True).item() + + def _pre_forward_train(self): + if not self._optimizer_setup: + raise RuntimeError("You must call `setup_optimizer()` on your optimizer " + "before starting training.") + for qparam in self._qparams: + if qparam.other is not None: + noisy = qparam.other.module._parameters[qparam.other.name] + else: + bits = self._get_bits(qparam.logit)[:, None] + if self.group_size == 0: + p_flat = qparam.param.view(-1) + else: + p_flat = qparam.param.view(-1, self.group_size) + scale = p_flat.max() - p_flat.min() + unit = 1 / (2**bits - 1) + if self.noise == "uniform": + noise_source = (torch.rand_like(p_flat) - 0.5) + elif self.noise == "gaussian": + noise_source = torch.randn_like(p_flat) / 2 + noise = scale * unit * noise_source + noisy = p_flat + noise + # We bypass the checks by PyTorch on parameters being leafs + qparam.module._parameters[qparam.name] = noisy.view_as(qparam.param) + return True + + def _post_forward_train(self): + for qparam in self._qparams: + qparam.module._parameters[qparam.name] = qparam.param + return True + + def _quantize_param(self, qparam: _QuantizedParam) -> tp.Any: + bits = self.extra_bits + self._get_bits(qparam.logit) + bits = bits.round().clamp(1, 15)[:, None].byte() + if self.group_size == 0: + p = qparam.param.data.view(-1) + else: + p = qparam.param.data.view(-1, self.group_size) + levels, scales = uniform_quantize(p, bits) + return levels, scales, bits + + def _unquantize_param(self, qparam: _QuantizedParam, quantized: tp.Any) -> torch.Tensor: + levels, param_scale, bits = quantized + return uniform_unquantize(levels, param_scale, bits).view_as(qparam.param.data) + + def detach(self): + super().detach() + for qparam in self._qparams: + delattr(qparam.module, qparam.name + self.suffix) + + def __repr__(self): + return simple_repr(self) diff --git a/lib/tools/diffq/uniform.py b/lib/tools/diffq/uniform.py new file mode 100644 index 000000000..f61e9129c --- /dev/null +++ b/lib/tools/diffq/uniform.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +""" +Classic uniform quantization over n bits. +""" +from typing import Tuple +import torch + +from .base import BaseQuantizer +from .utils import simple_repr + + +def uniform_quantize(p: torch.Tensor, bits: torch.Tensor = torch.tensor(8.)): + """ + Quantize the given weights over `bits` bits. + + Returns: + - quantized levels + - (min, max) range. + + """ + assert (bits >= 1).all() and (bits <= 15).all() + num_levels = (2 ** bits.float()).long() + mn = p.min().item() + mx = p.max().item() + p = (p - mn) / (mx - mn) # put p in [0, 1] + unit = 1 / (num_levels - 1) # quantization unit + levels = (p / unit).round() + if (bits <= 8).all(): + levels = levels.byte() + else: + levels = levels.short() + return levels, (mn, mx) + + +def uniform_unquantize(levels: torch.Tensor, scales: Tuple[float, float], + bits: torch.Tensor = torch.tensor(8.)): + """ + Unquantize the weights from the levels and scale. Return a float32 tensor. + """ + mn, mx = scales + num_levels = 2 ** bits.float() + unit = 1 / (num_levels - 1) + levels = levels.float() + p = levels * unit # in [0, 1] + return p * (mx - mn) + mn + + +class UniformQuantizer(BaseQuantizer): + def __init__(self, model: torch.nn.Module, bits: float = 8., min_size: float = 0.01, + float16: bool = False, qat: bool = False, exclude=[], detect_bound=True): + """ + Args: + model (torch.nn.Module): model to quantize + bits (float): number of bits to quantize over. + min_size (float): minimum size in MB of a parameter to be quantized. + float16 (bool): if a layer is smaller than min_size, should we still do float16? + qat (bool): perform quantized aware training. + exclude (list[str]): list of patterns used to match parameters to exclude. + For instance `['bias']` to exclude all bias terms. + detect_bound (bool): if True, will detect bound parameters and reuse + the same quantized tensor for both. + """ + self.bits = float(bits) + self.qat = qat + + super().__init__(model, min_size, float16, exclude, detect_bound) + + def __repr__(self): + return simple_repr(self, ) + + def _pre_forward_train(self): + if self.qat: + for qparam in self._qparams: + if qparam.other is not None: + new_param = qparam.other.module._parameters[qparam.other.name] + else: + quantized = self._quantize_param(qparam) + qvalue = self._unquantize_param(qparam, quantized) + new_param = qparam.param + (qvalue - qparam.param).detach() + qparam.module._parameters[qparam.name] = new_param + return True + return False + + def _post_forward_train(self): + if self.qat: + for qparam in self._qparams: + qparam.module._parameters[qparam.name] = qparam.param + return True + return False + + def _quantize_param(self, qparam): + levels, scales = uniform_quantize(qparam.param.data, torch.tensor(self.bits)) + return (levels, scales) + + def _unquantize_param(self, qparam, quantized): + levels, scales = quantized + return uniform_unquantize(levels, scales, torch.tensor(self.bits)) + + def model_size(self): + """ + Non differentiable model size in MB. + """ + total = super().model_size() + subtotal = 0 + for qparam in self._qparams: + if qparam.other is None: # if parameter is bound, count only one copy. + subtotal += self.bits * qparam.param.numel() + 64 # 2 float for the overall scales + subtotal /= 2**20 * 8 # bits to MegaBytes + return total + subtotal + + def true_model_size(self): + """ + Return the true quantized model size, in MB, without extra + compression. + """ + return self.model_size().item() diff --git a/lib/tools/diffq/utils.py b/lib/tools/diffq/utils.py new file mode 100644 index 000000000..be6ab5253 --- /dev/null +++ b/lib/tools/diffq/utils.py @@ -0,0 +1,37 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import inspect +from typing import Optional, List + + +def simple_repr(obj, attrs: Optional[List[str]] = None, overrides={}): + """ + Return a simple representation string for `obj`. + If `attrs` is not None, it should be a list of attributes to include. + """ + params = inspect.signature(obj.__class__).parameters + attrs_repr = [] + if attrs is None: + attrs = params.keys() + for attr in attrs: + display = False + if attr in overrides: + value = overrides[attr] + elif hasattr(obj, attr): + value = getattr(obj, attr) + else: + continue + if attr in params: + param = params[attr] + if param.default is inspect._empty or value != param.default: + display = True + else: + display = True + + if display: + attrs_repr.append(f"{attr}={value}") + return f"{obj.__class__.__name__}({','.join(attrs_repr)})" diff --git a/lib/tools/dlmodels.bat b/lib/tools/dlmodels.bat new file mode 100644 index 000000000..5d80f5036 --- /dev/null +++ b/lib/tools/dlmodels.bat @@ -0,0 +1,348 @@ +@echo off && chcp 65001 + +echo working dir is %cd% +echo downloading requirement aria2 check. +echo= +dir /a:d/b | findstr "aria2" > flag.txt +findstr "aria2" flag.txt >nul +if %errorlevel% ==0 ( + echo aria2 checked. + echo= +) else ( + echo failed. please downloading aria2 from webpage! + echo unzip it and put in this directory! + timeout /T 5 + start https://github.com/aria2/aria2/releases/tag/release-1.36.0 + echo= + goto end +) + +echo envfiles checking start. +echo= + +for /f %%x in ('findstr /i /c:"aria2" "flag.txt"') do (set aria2=%%x)&goto endSch +:endSch + +set d32=f0D32k.pth +set d40=f0D40k.pth +set d48=f0D48k.pth +set g32=f0G32k.pth +set g40=f0G40k.pth +set g48=f0G48k.pth + +set d40v2=f0D40k.pth +set g40v2=f0G40k.pth + +set dld32=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D32k.pth +set dld40=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D40k.pth +set dld48=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D48k.pth +set dlg32=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G32k.pth +set dlg40=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G40k.pth +set dlg48=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G48k.pth + +set dld40v2=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth +set dlg40v2=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth + +set hp2_all=HP2_all_vocals.pth +set hp3_all=HP3_all_vocals.pth +set hp5_only=HP5_only_main_vocal.pth +set VR_DeEchoAggressive=VR-DeEchoAggressive.pth +set VR_DeEchoDeReverb=VR-DeEchoDeReverb.pth +set VR_DeEchoNormal=VR-DeEchoNormal.pth +set onnx_dereverb=vocals.onnx + +set dlhp2_all=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2_all_vocals.pth +set dlhp3_all=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP3_all_vocals.pth +set dlhp5_only=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5_only_main_vocal.pth +set dlVR_DeEchoAggressive=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoAggressive.pth +set dlVR_DeEchoDeReverb=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoDeReverb.pth +set dlVR_DeEchoNormal=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoNormal.pth +set dlonnx_dereverb=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx + +set hb=hubert_base.pt + +set dlhb=https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt + +echo dir check start. +echo= + +if exist "%~dp0assets\pretrained" ( + echo dir .\assets\pretrained checked. + ) else ( + echo failed. generating dir .\assets\pretrained. + mkdir pretrained + ) +if exist "%~dp0assets\pretrained_v2" ( + echo dir .\assets\pretrained_v2 checked. + ) else ( + echo failed. generating dir .\assets\pretrained_v2. + mkdir pretrained_v2 + ) +if exist "%~dp0assets\uvr5_weights" ( + echo dir .\assets\uvr5_weights checked. + ) else ( + echo failed. generating dir .\assets\uvr5_weights. + mkdir uvr5_weights + ) +if exist "%~dp0assets\uvr5_weights\onnx_dereverb_By_FoxJoy" ( + echo dir .\assets\uvr5_weights\onnx_dereverb_By_FoxJoy checked. + ) else ( + echo failed. generating dir .\assets\uvr5_weights\onnx_dereverb_By_FoxJoy. + mkdir uvr5_weights\onnx_dereverb_By_FoxJoy + ) + +echo= +echo dir check finished. + +echo= +echo required files check start. + +echo checking D32k.pth +if exist "%~dp0assets\pretrained\D32k.pth" ( + echo D32k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D32k.pth -d %~dp0assets\pretrained -o D32k.pth + if exist "%~dp0assets\pretrained\D32k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking D40k.pth +if exist "%~dp0assets\pretrained\D40k.pth" ( + echo D40k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D40k.pth -d %~dp0assets\pretrained -o D40k.pth + if exist "%~dp0assets\pretrained\D40k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking D40k.pth +if exist "%~dp0assets\pretrained_v2\D40k.pth" ( + echo D40k.pth in .\assets\pretrained_v2 checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -d %~dp0assets\pretrained_v2 -o D40k.pth + if exist "%~dp0assets\pretrained_v2\D40k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking D48k.pth +if exist "%~dp0assets\pretrained\D48k.pth" ( + echo D48k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D48k.pth -d %~dp0assets\pretrained -o D48k.pth + if exist "%~dp0assets\pretrained\D48k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking G32k.pth +if exist "%~dp0assets\pretrained\G32k.pth" ( + echo G32k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G32k.pth -d %~dp0assets\pretrained -o G32k.pth + if exist "%~dp0assets\pretrained\G32k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking G40k.pth +if exist "%~dp0assets\pretrained\G40k.pth" ( + echo G40k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G40k.pth -d %~dp0assets\pretrained -o G40k.pth + if exist "%~dp0assets\pretrained\G40k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking G40k.pth +if exist "%~dp0assets\pretrained_v2\G40k.pth" ( + echo G40k.pth in .\assets\pretrained_v2 checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -d %~dp0assets\pretrained_v2 -o G40k.pth + if exist "%~dp0assets\pretrained_v2\G40k.pth" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking G48k.pth +if exist "%~dp0assets\pretrained\G48k.pth" ( + echo G48k.pth in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G48k.pth -d %~dp0assets\pretrained -o G48k.pth + if exist "%~dp0assets\pretrained\G48k.pth" (echo download successful.) else (echo please try again! + echo=) + ) + +echo checking %d32% +if exist "%~dp0assets\pretrained\%d32%" ( + echo %d32% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dld32% -d %~dp0assets\pretrained -o %d32% + if exist "%~dp0assets\pretrained\%d32%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %d40% +if exist "%~dp0assets\pretrained\%d40%" ( + echo %d40% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dld40% -d %~dp0assets\pretrained -o %d40% + if exist "%~dp0assets\pretrained\%d40%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %d40v2% +if exist "%~dp0assets\pretrained_v2\%d40v2%" ( + echo %d40v2% in .\assets\pretrained_v2 checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dld40v2% -d %~dp0assets\pretrained_v2 -o %d40v2% + if exist "%~dp0assets\pretrained_v2\%d40v2%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %d48% +if exist "%~dp0assets\pretrained\%d48%" ( + echo %d48% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dld48% -d %~dp0assets\pretrained -o %d48% + if exist "%~dp0assets\pretrained\%d48%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %g32% +if exist "%~dp0assets\pretrained\%g32%" ( + echo %g32% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlg32% -d %~dp0assets\pretrained -o %g32% + if exist "%~dp0assets\pretrained\%g32%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %g40% +if exist "%~dp0assets\pretrained\%g40%" ( + echo %g40% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlg40% -d %~dp0assets\pretrained -o %g40% + if exist "%~dp0assets\pretrained\%g40%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %g40v2% +if exist "%~dp0assets\pretrained_v2\%g40v2%" ( + echo %g40v2% in .\assets\pretrained_v2 checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlg40v2% -d %~dp0assets\pretrained_v2 -o %g40v2% + if exist "%~dp0assets\pretrained_v2\%g40v2%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %g48% +if exist "%~dp0assets\pretrained\%g48%" ( + echo %g48% in .\assets\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlg48% -d %~dp0assets\pretrained -o %g48% + if exist "%~dp0assets\pretrained\%g48%" (echo download successful.) else (echo please try again! + echo=) + ) + +echo checking %hp2_all% +if exist "%~dp0assets\uvr5_weights\%hp2_all%" ( + echo %hp2_all% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlhp2_all% -d %~dp0assets\uvr5_weights -o %hp2_all% + if exist "%~dp0assets\uvr5_weights\%hp2_all%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %hp3_all% +if exist "%~dp0assets\uvr5_weights\%hp3_all%" ( + echo %hp3_all% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlhp3_all% -d %~dp0assets\uvr5_weights -o %hp3_all% + if exist "%~dp0assets\uvr5_weights\%hp3_all%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %hp5_only% +if exist "%~dp0assets\uvr5_weights\%hp5_only%" ( + echo %hp5_only% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlhp5_only% -d %~dp0assets\uvr5_weights -o %hp5_only% + if exist "%~dp0assets\uvr5_weights\%hp5_only%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %VR_DeEchoAggressive% +if exist "%~dp0assets\uvr5_weights\%VR_DeEchoAggressive%" ( + echo %VR_DeEchoAggressive% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlVR_DeEchoAggressive% -d %~dp0assets\uvr5_weights -o %VR_DeEchoAggressive% + if exist "%~dp0assets\uvr5_weights\%VR_DeEchoAggressive%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %VR_DeEchoDeReverb% +if exist "%~dp0assets\uvr5_weights\%VR_DeEchoDeReverb%" ( + echo %VR_DeEchoDeReverb% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlVR_DeEchoDeReverb% -d %~dp0assets\uvr5_weights -o %VR_DeEchoDeReverb% + if exist "%~dp0assets\uvr5_weights\%VR_DeEchoDeReverb%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %VR_DeEchoNormal% +if exist "%~dp0assets\uvr5_weights\%VR_DeEchoNormal%" ( + echo %VR_DeEchoNormal% in .\assets\uvr5_weights checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlVR_DeEchoNormal% -d %~dp0assets\uvr5_weights -o %VR_DeEchoNormal% + if exist "%~dp0assets\uvr5_weights\%VR_DeEchoNormal%" (echo download successful.) else (echo please try again! + echo=) + ) +echo checking %onnx_dereverb% +if exist "%~dp0assets\uvr5_weights\onnx_dereverb_By_FoxJoy\%onnx_dereverb%" ( + echo %onnx_dereverb% in .\assets\uvr5_weights\onnx_dereverb_By_FoxJoy checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlonnx_dereverb% -d %~dp0assets\uvr5_weights\onnx_dereverb_By_FoxJoy -o %onnx_dereverb% + if exist "%~dp0assets\uvr5_weights\onnx_dereverb_By_FoxJoy\%onnx_dereverb%" (echo download successful.) else (echo please try again! + echo=) + ) + +echo checking %hb% +if exist "%~dp0assets\hubert\%hb%" ( + echo %hb% in .\assets\hubert\pretrained checked. + echo= + ) else ( + echo failed. starting download from huggingface. + %~dp0%aria2%\aria2c --console-log-level=error -c -x 16 -s 16 -k 1M %dlhb% -d %~dp0assets\hubert\ -o %hb% + if exist "%~dp0assets\hubert\%hb%" (echo download successful.) else (echo please try again! + echo=) + ) + +echo required files check finished. +echo envfiles check complete. +pause +:end +del flag.txt diff --git a/lib/tools/dlmodels.sh b/lib/tools/dlmodels.sh new file mode 100644 index 000000000..5fba0edef --- /dev/null +++ b/lib/tools/dlmodels.sh @@ -0,0 +1,566 @@ +#!/bin/bash + +echo working dir is $(pwd) +echo downloading requirement aria2 check. + +if command -v aria2c &> /dev/null +then + echo "aria2c command found" +else + echo failed. please install aria2 + sleep 5 + exit 1 +fi + +d32="f0D32k.pth" +d40="f0D40k.pth" +d48="f0D48k.pth" +g32="f0G32k.pth" +g40="f0G40k.pth" +g48="f0G48k.pth" + +d40v2="f0D40k.pth" +g40v2="f0G40k.pth" + +dld32="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D32k.pth" +dld40="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D40k.pth" +dld48="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D48k.pth" +dlg32="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G32k.pth" +dlg40="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G40k.pth" +dlg48="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G48k.pth" + +dld40v2="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth" +dlg40v2="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth" + +hp2_all="HP2_all_vocals.pth" +hp3_all="HP3_all_vocals.pth" +hp5_only="HP5_only_main_vocal.pth" +VR_DeEchoAggressive="VR-DeEchoAggressive.pth" +VR_DeEchoDeReverb="VR-DeEchoDeReverb.pth" +VR_DeEchoNormal="VR-DeEchoNormal.pth" +onnx_dereverb="vocals.onnx" +rmvpe="rmvpe.pt" + +dlhp2_all="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2_all_vocals.pth" +dlhp3_all="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP3_all_vocals.pth" +dlhp5_only="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5_only_main_vocal.pth" +dlVR_DeEchoAggressive="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoAggressive.pth" +dlVR_DeEchoDeReverb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoDeReverb.pth" +dlVR_DeEchoNormal="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoNormal.pth" +dlonnx_dereverb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx" +dlrmvpe="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt" + +hb="hubert_base.pt" + +dlhb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt" + +echo dir check start. + +if [ -d "./assets/pretrained" ]; then + echo dir ./assets/pretrained checked. +else + echo failed. generating dir ./assets/pretrained. + mkdir pretrained +fi + +if [ -d "./assets/pretrained_v2" ]; then + echo dir ./assets/pretrained_v2 checked. +else + echo failed. generating dir ./assets/pretrained_v2. + mkdir pretrained_v2 +fi + +if [ -d "./assets/uvr5_weights" ]; then + echo dir ./assets/uvr5_weights checked. +else + echo failed. generating dir ./assets/uvr5_weights. + mkdir uvr5_weights +fi + +if [ -d "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy" ]; then + echo dir ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy checked. +else + echo failed. generating dir ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy. + mkdir uvr5_weights/onnx_dereverb_By_FoxJoy +fi + +echo dir check finished. + +echo required files check start. + +echo checking D32k.pth +if [ -f "./assets/pretrained/D32k.pth" ]; then + echo D32k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D32k.pth -d ./assets/pretrained -o D32k.pth + if [ -f "./assets/pretrained/D32k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking D40k.pth +if [ -f "./assets/pretrained/D40k.pth" ]; then + echo D40k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D40k.pth -d ./assets/pretrained -o D40k.pth + if [ -f "./assets/pretrained/D40k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking D40k.pth +if [ -f "./assets/pretrained_v2/D40k.pth" ]; then + echo D40k.pth in ./assets/pretrained_v2 checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -d ./assets/pretrained_v2 -o D40k.pth + if [ -f "./assets/pretrained_v2/D40k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking D48k.pth +if [ -f "./assets/pretrained/D48k.pth" ]; then + echo D48k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D48k.pth -d ./assets/pretrained -o D48k.pth + if [ -f "./assets/pretrained/D48k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking G32k.pth +if [ -f "./assets/pretrained/G32k.pth" ]; then + echo G32k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G32k.pth -d ./assets/pretrained -o G32k.pth + if [ -f "./assets/pretrained/G32k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking G40k.pth +if [ -f "./assets/pretrained/G40k.pth" ]; then + echo G40k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G40k.pth -d ./assets/pretrained -o G40k.pth + if [ -f "./assets/pretrained/G40k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking G40k.pth +if [ -f "./assets/pretrained_v2/G40k.pth" ]; then + echo G40k.pth in ./assets/pretrained_v2 checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -d ./assets/pretrained_v2 -o G40k.pth + if [ -f "./assets/pretrained_v2/G40k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking G48k.pth +if [ -f "./assets/pretrained/G48k.pth" ]; then + echo G48k.pth in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G48k.pth -d ./assets/pretrained -o G48k.pth + if [ -f "./assets/pretrained/G48k.pth" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $d32 +if [ -f "./assets/pretrained/$d32" ]; then + echo $d32 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld32 -d ./assets/pretrained -o $d32 + if [ -f "./assets/pretrained/$d32" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $d40 +if [ -f "./assets/pretrained/$d40" ]; then + echo $d40 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld40 -d ./assets/pretrained -o $d40 + if [ -f "./assets/pretrained/$d40" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $d40v2 +if [ -f "./assets/pretrained_v2/$d40v2" ]; then + echo $d40v2 in ./assets/pretrained_v2 checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld40v2 -d ./assets/pretrained_v2 -o $d40v2 + if [ -f "./assets/pretrained_v2/$d40v2" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $d48 +if [ -f "./assets/pretrained/$d48" ]; then + echo $d48 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld48 -d ./assets/pretrained -o $d48 + if [ -f "./assets/pretrained/$d48" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $g32 +if [ -f "./assets/pretrained/$g32" ]; then + echo $g32 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg32 -d ./assets/pretrained -o $g32 + if [ -f "./assets/pretrained/$g32" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $g40 +if [ -f "./assets/pretrained/$g40" ]; then + echo $g40 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg40 -d ./assets/pretrained -o $g40 + if [ -f "./assets/pretrained/$g40" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $g40v2 +if [ -f "./assets/pretrained_v2/$g40v2" ]; then + echo $g40v2 in ./assets/pretrained_v2 checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg40v2 -d ./assets/pretrained_v2 -o $g40v2 + if [ -f "./assets/pretrained_v2/$g40v2" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $g48 +if [ -f "./assets/pretrained/$g48" ]; then + echo $g48 in ./assets/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg48 -d ./assets/pretrained -o $g48 + if [ -f "./assets/pretrained/$g48" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $hp2_all +if [ -f "./assets/uvr5_weights/$hp2_all" ]; then + echo $hp2_all in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp2_all -d ./assets/uvr5_weights -o $hp2_all + if [ -f "./assets/uvr5_weights/$hp2_all" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $hp3_all +if [ -f "./assets/uvr5_weights/$hp3_all" ]; then + echo $hp3_all in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp3_all -d ./assets/uvr5_weights -o $hp3_all + if [ -f "./assets/uvr5_weights/$hp3_all" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $hp5_only +if [ -f "./assets/uvr5_weights/$hp5_only" ]; then + echo $hp5_only in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp5_only -d ./assets/uvr5_weights -o $hp5_only + if [ -f "./assets/uvr5_weights/$hp5_only" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $VR_DeEchoAggressive +if [ -f "./assets/uvr5_weights/$VR_DeEchoAggressive" ]; then + echo $VR_DeEchoAggressive in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoAggressive -d ./assets/uvr5_weights -o $VR_DeEchoAggressive + if [ -f "./assets/uvr5_weights/$VR_DeEchoAggressive" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $VR_DeEchoDeReverb +if [ -f "./assets/uvr5_weights/$VR_DeEchoDeReverb" ]; then + echo $VR_DeEchoDeReverb in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoDeReverb -d ./assets/uvr5_weights -o $VR_DeEchoDeReverb + if [ -f "./assets/uvr5_weights/$VR_DeEchoDeReverb" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $VR_DeEchoNormal +if [ -f "./assets/uvr5_weights/$VR_DeEchoNormal" ]; then + echo $VR_DeEchoNormal in ./assets/uvr5_weights checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoNormal -d ./assets/uvr5_weights -o $VR_DeEchoNormal + if [ -f "./assets/uvr5_weights/$VR_DeEchoNormal" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $onnx_dereverb +if [ -f "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy/$onnx_dereverb" ]; then + echo $onnx_dereverb in ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlonnx_dereverb -d ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy -o $onnx_dereverb + if [ -f "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy/$onnx_dereverb" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $rmvpe +if [ -f "./assets/rmvpe/$rmvpe" ]; then + echo $rmvpe in ./assets/rmvpe checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlrmvpe -d ./assets/rmvpe -o $rmvpe + if [ -f "./assets/rmvpe/$rmvpe" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo checking $hb +if [ -f "./assets/hubert/$hb" ]; then + echo $hb in ./assets/hubert/pretrained checked. +else + echo failed. starting download from huggingface. + if command -v aria2c &> /dev/null; then + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhb -d ./assets/hubert/ -o $hb + if [ -f "./assets/hubert/$hb" ]; then + echo download successful. + else + echo please try again! + exit 1 + fi + else + echo aria2c command not found. Please install aria2c and try again. + exit 1 + fi +fi + +echo required files check finished. diff --git a/lib/tools/get-pip.py b/lib/tools/get-pip.py new file mode 100644 index 000000000..ca93fe3ce --- /dev/null +++ b/lib/tools/get-pip.py @@ -0,0 +1,32635 @@ +import sys + +this_python = sys.version_info[:2] +min_version = (3, 7) +if this_python < min_version: + message_parts = [ + "This script does not work on Python {}.{}".format(*this_python), + "The minimum supported Python version is {}.{}.".format(*min_version), + "Please use https://bootstrap.pypa.io/pip/{}.{}/get-pip.py instead.".format(*this_python), + ] + print("ERROR: " + " ".join(message_parts)) + sys.exit(1) + + +import os.path +import pkgutil +import shutil +import tempfile +import argparse +import importlib +from base64 import b85decode + + +def include_setuptools(args): + """ + Install setuptools only if absent and not excluded. + """ + cli = not args.no_setuptools + env = not os.environ.get("PIP_NO_SETUPTOOLS") + absent = not importlib.util.find_spec("setuptools") + return cli and env and absent + + +def include_wheel(args): + """ + Install wheel only if absent and not excluded. + """ + cli = not args.no_wheel + env = not os.environ.get("PIP_NO_WHEEL") + absent = not importlib.util.find_spec("wheel") + return cli and env and absent + + +def determine_pip_install_arguments(): + pre_parser = argparse.ArgumentParser() + pre_parser.add_argument("--no-setuptools", action="store_true") + pre_parser.add_argument("--no-wheel", action="store_true") + pre, args = pre_parser.parse_known_args() + + args.append("pip") + + if include_setuptools(pre): + args.append("setuptools") + + if include_wheel(pre): + args.append("wheel") + + return ["install", "--upgrade", "--force-reinstall"] + args + + +def monkeypatch_for_cert(tmpdir): + """Patches `pip install` to provide default certificate with the lowest priority. + + This ensures that the bundled certificates are used unless the user specifies a + custom cert via any of pip's option passing mechanisms (config, env-var, CLI). + + A monkeypatch is the easiest way to achieve this, without messing too much with + the rest of pip's internals. + """ + from pip._internal.commands.install import InstallCommand + + # We want to be using the internal certificates. + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + install_parse_args = InstallCommand.parse_args + + def cert_parse_args(self, args): + if not self.parser.get_default_values().cert: + # There are no user provided cert -- force use of bundled cert + self.parser.defaults["cert"] = cert_path # calculated above + return install_parse_args(self, args) + + InstallCommand.parse_args = cert_parse_args + + +def bootstrap(tmpdir): + monkeypatch_for_cert(tmpdir) + + # Execute the included pip and use it to install the latest pip and + # setuptools from PyPI + from pip._internal.cli.main import main as pip_entry_point + args = determine_pip_install_arguments() + sys.exit(pip_entry_point(args)) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2ml*O_EvJ33*7hs003nH000jF003}la4%n9X>MtBUtcb8c|B0UO2j}6z0X&KUUXrd;wrc +n6ubz6s0VM$QfAw<4YV^ulDhQoop$MlK*;0ehK(> +3ZJA0oQV`^+*aO7_tw^Cd$4zs{Pl#j>6{|X*AaQ6!2wJ?w>%d+2&1X4Rc!^r6h-hMtH_d5{IF3D`nKTt~p1QY-O00;mZO7>Q7_pjHy0RRA2 +0{{RI0001RX>c!JUu|J&ZeL$6aCu!)OK;mS48HqU5b43r;JP^vOMxACEp{6QLy+m1h%E`C9MAjpBNe- +8r;{H19{ebpf{zJ27j)n8%0=-6Z#elILRo@w9oRWWbO{z8ujDS!QAC@3T%nJCf;1rX6ghzu#Z}R@K&*?Hgj1WFD91+adaM4G`4Xs@*hA^t@nbDYdL)-aOjsW~3}QVVby(8=@7U$ +Fzj5Y{w!2hUUH`?e9j7WDA;>-1aos>7j{2$~BfyL8p@__Y98dsP#Bs7^lWF +=e_gr;(4^?am?Cp93+7b-!?~nb}-$cPSR1zckA*zNp!)$;YjlZrfn&RWNM}=QA7*cb8A{(9@{5!vBfq +rEMoeu5FvJZngI@N#4#(2v$WnMGCAVD?b9t8W^qDfcFBe5ZZF%dPAPaq#>ikclG~yPvCg`JUGb_W2#PdCXxx}7!|T*xc9qdnTILbO-nAJaF2 +~0snMFDU<%E01X4*yW9@|}F2;vY~;0|XQR000O88%p+8eg`F$&;kGeqy+!~6#xJLaA|NaUte%(a4 +m9mZf<3AUtcb8d3{vDZrd;nz56RT_b?l9y`mj3AXtV0MT+&(WJ!7$x|Xq_^eh*q` +qYNbl$TgcX!{RW4b=Vw*pI`moV*K|DJ2bY*KQViviHGglIK{X_)>pN=IEr427|<0g`vfCSX-CrF6hnx- +fU6^LzLVM{GttvQ!RX(K-@qvQ<9nZh3{TwCd*xxj~wep|+d4YrpRGd3uJ(;$x#MJ^wO(dX9-I(W~SOL +|!j@ev4#PBd+t2O-3Y4TDlA%@&y9h}l?d7(gvc*a&O+atWdOv5| +XtFg8N1I1Eg2~6T^Prn{|GZSIw2~Ql9c?>!a3=lwO6eT!TZzV{RAoH`=gPAEk0OKF^-L_LxAV)%Ld>V +rC7Ea!84dqJ@cSb~%=6Dm=^V^deci#%k)qhs`k`mikNs;GRv|TRB1+w&XWHK8?pSmvO+Mn5HP0Rg& +0e2!{O&s!2A%Oz`W5|6)QOoeMptG0vVbf-p%MA<(l*rGUrRG$G|nf0000U0RR9D +0001RX>c!ac`kH$aAjmAj&U%1)EvFVxRjSzi=C>J@cM +k87yJyz4~-Qcqlg}hXv}1CF`fEox?~SG{pae%Dy$pBG>tnWs3{>FohpTZSG@fe-hAmws@4PFv7Mv`H@ +JnAXTbgKqwrl)IWaYE>+%OsO9KQH0000802@m7R+hDJp-}+<06hW#02u%P0B~t=FJEbHbY*gGVQep7U +ukY>bYEXCaCvo+F;B!W42Adn3hP*|5~K?fa1xA6Cs^1JI)&D4jnX98E~x(=w{RdN$P(+xdH(X;aUMbE +La7HDOJ;>ViJroJQOYSq=f31Z#UCgsvZ;PjisC7~V50}YW@1zhN!C_4fs|i^>lX7r-W?|$V(y(g0ZOD +x-5bTWf^iasXM`rih^?Sk#%z{jZl{Ri-7?Gn9_p +NH(fR_VZQx#ZustU5xCHVj%1=)fT*F;XSi#wiQR~iuoy}(RFp&L9pfC#Zn^7Axz>2yIKB7|@~y3-1&J5eC&FySna4hw0fjd92G^LTzc+Br>7Y7w1=({ +s_3<|LwzLQl3jT^=CKlyadUgD7M{+)3>-rRJjjOO9KQH0000802@m7Rtz49V_OUW00Srh02%-Q0B~t= +FJEbHbY*gGVQepAb!lv5UuAA~E^v9(T1#`|xDmeVS714ZB@>eSIHgphB=gYhxH9p$W;~m0sZ?Bwghq@ +hk_(WwwJ!hnbT%XT~X$2UELOWbx^D5} +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 +|#tj9{cl%YbU1ah!CbL`!H33}dzr +htU}qX&Y?3r~m~9(#^Nq?X+Q|_9G!Gbecu}-EupvSfdppnjX=t2xj3q;=s^aZd#RHI3bE@&IndzQQe? +i1`zO-;MmiOM@SbDofi_1tz~EAd#Gh=@ohyX!HEeD{|0MK8X+k#$FHr^$7_}l_w`+ZnbT?no-_f_d2^ +gF__@%r^IIH%GBQ!NI72pmqqVd1vE@1Pr*4|@_{B@EF0PV~*Do$#zj*ila-FfeFvbZm^^FGfkZ#J7flbgK~uVgNF>Y#FaF`LaUF7%-+Dl7KV>@&S?9zU2OZ+>URZm +08I^H`XRZB-mZDJ|^~e)wBFx(RzKvAh|7nx7WpE4{G`@lqRnzbUOQa+zItGP;bDTa~9p6_;}JQPNqll +{?c=cqexYp>wOMvQqd?a(Phwky}+65WS0HZFSa?+{nDh^+sm;N5$kqW|%M-jMb-&VrJWYFY;ULN#F04 +%D&c_;;kb)4@Ign6Q{aT8=KTs))4rLN4~GJJ9cF{|Jba5iQjiDJrX0$TIOnOF^e8sbtn^X)T$NFj-8@ +{iD(+L$w!^1W||6QX|+Kfkl2FcySN}PQI%LV?h@~meaT}{!YWRZ`NhSX?_PZK;&t-(w{Ko2ub;lU!un +ZJX>5qe<=~GOsoIK!+!4%fY?Ln9d#;VG76M;4bMf#m^kaD;@PQA1r)*v2LSj&^GbPMkK6><66k7}t3G +%k;6qC2p4udo4tT?R?rHN8dg)qrSbuz1WRSnNFs+5(4TFfe%EoKWbTh8VSp>k7KDv@TRHLsjAy~-W$1 +1NTW?#JpWLXRdK6RW#F?EzNxpE#>lp) +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 +ecJDlfy#iIwGj?Yd{;0`oJ +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 +hfmsk{{_ich#&FQsCgj-NF$bHQorYpJzOXm*d0 +t7_|AR#Qxl#sEn6yc?c)%r;4M&kZ$;+##_^UyeYQOVKoz?G^zz@+XAOu>$w0--q)ZA`c_^Ky;>dU8OJ +*6%^^XJ9f3wJW%YLlWhw^jbBuv?V-=&IW~e7z-HWu5@>`mn`nGrA%(uGcOs5gsR`O<%f3@Rj%A@yH&K +#1V+TK?s04awJ6%eUsf+3-BSOpX#c>PWf2~nc$G7cF8*w_4l&|o0+C&{{@>P@;4$ezZQX;H%R*$?Bn9 +ii(>YiXtF(RSuQ`*YX5;1E)4(VDgZ`}Nmf$68C_55%~|O3!$p{#Cqg_n50fd7x@*iJ?6d=1b!@#H6Xw +QSE!Lm^%|OZM$j)BPz-&QhfobO%{yAHPn790H6MTdUiHu?~83cxUEZTfUv1_;tWSEH#tFaCmMR4CR^F +AABxYpQSK{D^*EPRAJB5G8%|vZzLF+c4iu<|``%jI&fMzEowll%;yl_@8|Q;Q+?5_)?H>9fmQLmTOOy9$#nIu@8J)v<)An2fsb}{-z?A{6XeEfwYd +5AjLOg&%`=%G0>w0|7{of8Kc2HO;MG7e;yU`bQIp4X94oX$eCiid?UwFJ+iX1%To^AESHYjSxQYEN3g +vB)#o4OG16{4P_?l}}+%zal+H)SdoxnW9QUHMc9#|wT9hnc<{O|H2NIyhy}s??lRr1wIq_JWVh;*1@x +o^bu2TW}UnK+$BXADpHmfc4VHZ|ZC@KWSC&tvd@>>6%Lx)m5~{q2jU?)&01MgQD%h31WM-kaw6rN^IR +{d%xrI2WH+5-b8)>+?y!R!+bRJ@tq-_b|vTK(Q0<|X8sjnuzQ`we +0SV0XE9Q~UTGQ2!d+;pu>ObMP43+h!2c{|^KXUzfqXJ|d=Z**K2u|7my#@7n_}-^hnyF!&!(O9KQH00 +00802@m7R>_yM1-u&o0J&TM02=@R0B~t=FJEbHbY*gGVQepDcw=R7bZKvHb1ras-8|cJ<2IJ>{tAS>T +P-CLdoq_)%DYaD)2&Xs(igAoPA27eX^Mm-#uTX`NV_#ERc-Az%+~(K{=@!BzGTk@0Kto7b&{7^SJIM5 +;Nalk;M@Vv^Cll6xhj)9Q=(Eb7UiPItN9|YO0f!~yKpZ3qob=uqQo+ft5k|N?=P>!+jm!@EY_mTMY3G +wMJZ-Qz7%1$E*D8Q7Y_-3irZDP@`EHRWs!yHEi^yMSF#98=?j7h|H%(48I?G4E~Zk03#TxW0r@OUQ!z +_YsSMn5A&*ow)d)hHcm&TXH4+LiPh*kgrHJK9X0gbr`O-h~Jn!g8V;kk!ESayuLdn8;R>}`$noP};G> +^hm*1zU+n49^z3d@Dlwy^EgS{)JU2~4}p^HdocMT;=WMq&;WUQO2{=(Cbx$&JhP3JIrMUj1-B37)^2J +pcCW?KdOwB8ke8I4hBKc`*{N69vED(Yl4{NW9PB%Mk-2lHbG3^TIFWUn{9f<-^*^8jlNpJc2K31uHLm +dM44r2a2dXHESZC^Usm_!s9Chlf|+CU{zY~0JRK@yJ}@1Nfm{wU8CY6SUSLWShQJ_Ajd}n{;2mNRJaP +Jeeeo?*KeCdeT@qerbqSr27CHTS%z^~hNk`3p^`6v(nT_@aHhNZ0hRH8c%VvTRo(rJe;5HQFuf!C%jE +PdnvMMt80E(BlyF +2@K*y&2I9%^=5?HR$Q5{K3!&Nq)c}^#j5i;W6H@#EBvTW)VznM6ZVY4*!TLPK2Tdz{;}oO5*}6fy@}d +AOkf#a*5K@f^i&){9YEbG=Dhpl6jUF(i@7;`r6w;XWoz5h9|W3diqntq5o5!WCKLdSF1EB2fz>cLoiL +l?C#{MsN@h=J4!>P#Cfus6h&SPtVGt+2f1~%kYWmJj*KTHw(?1u>8>x55JpvH5?LVTOAX^R5|o)aicQoBh0jzZfsH~EgqRYcm{wV|5cv#wIf+KtLuMqn0d`rg%@7O^+T~TjC= +j@%R0@Q*^2H>&4AYlY* +QLO;84`b9zay+e)6!`1bH!EeBR!^Qb3_qh?3R^QNgP`U`CDYl+{`$23dIt=8ES_q)ckK~Az^&dxSY&{ +Uck>iBj(KdmIU^etbB%i*+M=|m8*1Vh>45v1_U%pGL@$N|somCTjLQYvYEKyS75(>|D@`fY5E)F0R*Ji9wya +u?s(Fw7GZyy}BMroek$8BS_mI1C+d+b0=QIDPAW{o}E>CQf|!jw!D;jJa=duPwA6A9kQ%)8 +z&oGqAcX?(M>Ft*pvZjQyZ^R#9vc;&Sqc@Atq1to-@m>;SrNrF5}*GNswO}Drc^ +_uhA<}l6E8p~Rja};4lg$BZYwkX!`+t1(aWjOc2hFf)Z2y`$|LO(xu3^s|w3MFMKe6tlctS3ozn0rQZ^sK4P-FYHw3;)9 +0KME&Xge|Jl?=N<_jNvKU7H}g)ZV$Gb~TqkW$+JJ1|lR9emx6UuPXkv8Vo!0JeWv_&(nhZCG(8d;Ihy +p5zH@~WM`ISw>-`T-G?*pHQB%$3uf!-pu=fYR^URB>!{!f`Y0$?ftlzmXYw8A2NO6+NBE?di +I#Iymx?5aX&~7pm^;0tMs$*MP0EU4Y*tN!-TGbU5Dk$fV>h<&$8Ptr>F)LTknDGSIx?}|I;7O(sE#?@U +@K!$&b;Tq=-N$*;Gx)Xq;H_X54SD0HWnuOYTcdZk!Nk9yhyJQx#~VllekSyj1T)iW?h*}!INv3A~%BL +%NWyU(rHsDi!r>q7Ppq-;QFlnCd^@T2DRnu**E|osZ=FxP{B?CgMh$Vz!2dyzXyYhXqBw|7FlWonF!- +uN-54K=i*PFe<^053J_*2%Mj)a>SQIOWR^t4wZ7-zH*~fe5$(5SU}rHtj$w7L-;7}~k{+r&`v>CQ9Rx +#uL%G>y0^b?Twfk?jBzf)do~S8W|))#iXSmx7Yx`DQ5CnhFX8FiynLBgSxmFJy +(Q%(!+6NTKH-Qq(m5pEo2~^3Cm0EqJFYN*RC3%E7DuPemf;%XGI7Q2WI=LFXDG-6Rjp{^A(6uvCJdHI +JMH1Dy_qgWBAm#6&z|!f)8lv*7U5FEKW!2=pAt*A+qOnR8IIpDjNG96R1y;qJIJ`fqyr2T1C@3$#L(| +WmW(1q6(kjYv_n=7UKF@;e!HZGDejE;JQ44aJrFwbgA*$@5wWR^!b8J=L>5uv-_mTGZbnh>M*BGeN<9PzqK{?t(Tz^;>mfK7^HPXwt_amwUCps*Veh05 +k~o+=gVo5(M)zu>v2S;a)v7nDs&_~PA*|qDjd>Eg~&@p=&+cp>*Mj~H^cTENXZexvJ@MJwfH%qEwow~RWySpFo} +WR#3PJ>r_g47WLVe(s8?V!2;z~5dl|+h`n!NN)I+o|vWL_b1yht%D`}M@-5RODskz^nyPoDJK9@WKIFw6_^=tg+~XI%y1F_?pt>2)=%W-U^$3<~?x;rIdt7GWq +@7IVMK?dCrC6gaJ$W=uIOmFKrIq7G$M^~CYl<3j*B&`NC1ihzk +&DWM{(7=9oqa8h(#*XP$F}SU8HZ1091Ud~&_RT<}3>-D}YQZ@??i=3BsDVvqppN5V=Qk4dpt{%aBh`` +8dBd839e?lpg_J4EN>s@Eq@-?-drh)0jXfFy=Y0mV!NL~FVE2J@+A_!nBp10ukQzvT?!(S3ifUC3U4S +*c8t$R7bF_14ja6qUIrOF5Q9Vw}y5i_28+jjN+gUwJ(-TiO7SQ%7kAmJ+X@YNh*ex=$_6>a}?xYQ>v) +V-|_fZTbYFQg`wphb)aZ1-tY!xsRZEe*71PB7F>J=gC;6Bn?Y^dELm|dLH?xPwc0_B#L7zqxpPCiArr +e;Es*=@Lw<*H8afu7+HT` ++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 +$g%=&_4Qp;MA$Xw{qj)6Rmyt +?aZnLX>M;y{%&&dHH_8_S^*jX9^=us7sD`#notfkewh~o-KXXIb3=XK=)mJzW|Wa+v;DL34CW&X|HOR +hxba9#=B)n%P)h>@6aWAK2ml*O_EskVqo?Qq002}0000#L003}la4%nJZggdGZeeUMZDDC{E^v80kil +xhFbsz8ehQJ(3Y~o!Yzu71oyKN+NJv4cNQhtasYJ1-tE{6v-IUeB+zDmX&JiY^EYaP^Rn&xLBg_?`@_o1&v~&MZO9KQH0000802@m7R%wcA+pq}$0Qnm +L02%-Q0B~t=FJEbHbY*gGVQepOd2n)XYGq?|E^v9(S>JEmI1YZFze49eWDLwWEpWwU2gn|Fv0Yq%-d? +aRun$2n(Ae^f8js|Yg1*xoa|=)k!d??jo!0bcb +%x6)XD})rubeoZs#C!61=PYaejq^n8ggaHpK@wpa#wu||U!Oxwtj&~i$Pw$M;W)WV~68DFDqd&p+e;#BP +7qnjF-_ly}@RCS5o6Q>0vbD794x+Kv?bG +-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 +msCKmrz~tXlA#MAHwVt +|VrBv+DOMquK&xDsVoq355*}1u0(~56Bi*JYiX=vVec9m#jSbLu|9W-#K6&x{#m|??#jE$!k^_@0>}*owmPfiVcY@*Cb|w;_31Q(I86iV?vLddrl&<(o^~Z)DO;Ca>E|u^@kYZxK|Lc$4=U-&lygX%3 +Kd>7zoFU@l$=x7d}~8sh|6B%`ua=%N5E?K7{+TFDwy5{USfY?0-;80|XQR000O88%p+8=?eQ`WDEcRLM{LR9smFUaA|NaUukZ1WpZv|Y%h0cWo2w +%Vs&Y3WMy(LaCzMtYmeNv@%#P?Mn+Hx(W!BeN4vlVXdJsRki>!Qq#ulfz>~PU%4sDq;v||uW} +7IAHk<0ywf(^A_HY0o^V-U+IFHt=gQ(z5+f)Uwt6xOk@DpJ4hVDc!0rMq%dWj{ixdYJhM>U!<{lg`xYJhy8 +HY+&D(*XVhMfeOymX?b5g&-znun~d1sA{38|Dlm%hx0!iyy^P35YlnNy3VKJbx^R-4rw-kZ{huG5LE&3Xi?A#Z0sk8$4HY8Z +4P5g0C$C52|qU*6tn2r&cv(?T;m%Wi*t$>d7f-Gxi}mE$G**b0c(4a744}5iN<{tzvEZGe0=rSJiGoV +xtiWS_~;4-q7+xZ{QGyWUO#{Kw>QrL*;gpw*Fui<0Jtcgy~8N?Zf+jeD*i3aTyHj;QtVk?w9UZ5&@7F +y+%j4TA^b^Vb4|aH<-C(R?@p+wdPQMLVn8_ExgGx)qE!%;3s41ibBd&rb{xznvh47KG +hPk+J95A%k?$UVV~1HJj1j9xSJCh>F;iA=n#-R1?c2F>J_VJA!AC^~Daq%_$Gq1|vx=+n)d-` +8q)!z{2h$HvsY>_(7lqoV;|T;;pW@KNoN8c=$J$q|;QJ@9z~q(FvHfdN<9oCwn81LI&ZC((=g%qDPY! +L@{5@LCFYt4eC_>`It$n6|_CC?n2D`Q8Kx;>~TTFu}y>#G8_}O?}oF;)$j +m5u0Qax$QuF%69AvikREW{NZAgM_dl?1#PJ<;rr*`v(G>OnAvRPnnt(*?XS|h%)2wh$)6zR*=!Xjo6S +r%>RTvuJE;Djx>r@x&&_ +3j8!Gy3oR47Au>~!hxIxjL@%mT?}pf?s`Wd7*lMxrvpUt{K-}y+ADbEl6&pp0pnF(JrV;DjLxzS+%cuR4WRiJ^^qx>A +?1NoEf@Av}jC}Es?$=-u%~2E|8}YsaO9M;7;}|1^%#Qu~LH}FIA|Lty9)uH72Esq_A@=D30V-0b5>2s +%2YZmh@<~4qIs&d#(tzU$9W_e^G!ghe#u3vSS(c=pj2&2CqVA%5i|cBBr1s5 +9|nhi|hz>2~;haQ{tGA4w9;T#u)i3ykC|(;NR#Qm-8U5bay|862h!1ODjp@mhp&MlG +cji{dhsmNpVCwo-IbH7};>W~ysqwB661{za$9YBWv@QOiu#+FW3O7eQl8A +DI%CBdUcZo69 +!oaWK0-OaVVynb#wyJeGF21j!)cgCpcxG`Vo3&uZuJtz^y#Q&*0=CW9ogSv2=%i#eT(EU~3oe3qa^F| +f`Y|DjKj}2Z1i!z_a*ZB9t$1X^Iv*n%>@BGX;Tl}D0b(a_)Kb@+2G&o;OlGaD-OGjl7suXfC>M=k+wN +(?lWx#~m2cD(zi4N@Mr3`ZOfl%9P%T+>1SM&`*c53h3b?HRp9OUA42|m%YUT{1vs@9K6^jllY?jRycI +J@pXEMa^8$!DMMW(A*lE_>!Aq~&=fi%YQ70X>TMWpx0C(q2vPHJ5iuF2sqVJN}7ltPmp|HlZC^U~L-s=>+`O|>?Ox~P_Ba%bs4X8`@W1YEPXPVD +zC5yg6$BIrzGb&yEK(SKx>-*jX1k0_p)sil_d6_Qt!Ryv<{9}iz)e!oK0I0*1XN9lF28}?4>a05}nzX +u|f@7h_5qw3L#3}jVEN>s +pE%7pitq%!p|H;ix3dF&-r~_5uTg=Gg$O5U_ecn;jS2D~I3`$T`i^pr3! +#1a)_Jv-X+$Aez~r-DN(dtp9;3?V*})`6CM3r!u#r9bV^7H~gx=m0>;SzS)uvIiF|KC+xK-+FsdV+1@ +vG%S#5wy8~!QUsC(mtPWzN$iUD=-+IY7?KcBBjJ)T~;9Qi60sa&mlA$_N-V5uoD@YeyR^9UgB7t1=?R +Yqx5Qhc&hiveJZ*EP7n6z29`*AC7AgBwWu&C!Yj*x-=yu7krPT|_?OSnEd;4_F6K +urzQyrZ@PrUTUIou=^~x&g=N-jam%Fnf@MUn3sx?iK*|Ff@-ko^-5sHC-Dh2j6R0W7k(o8*N8M5K1|~ +i^OXy?DRTb7T96!dk)gihyPPC8{{&D=0|XQR000O88%p+8&UflGXaE2Jga7~l9RL6TaA|NaUukZ1WpZ +v|Y%gPMX)j-2X>MtBUtcb8c_oZ74g(Pjj$fq)2mk;S8UO$z0001RX>c!JX>N37a&BR4FJo+JFJX0bZ)0z5aBO9CX>V>WaCx0r +O_SR;620qJVClnO1LE8=FVBjt^q)0dVv2S4$yxh%|8(o1sR;=Z(ASP3{zUhoDM!B}3^JU@Z9!W +=^OJ4i+~D}tF>VR1UqW;dM6{V#UBf{mRLH#(=_#5CPeO}&Bx)5VVMX;hqm`{VO{@$3En9zNWCzDr0WG(-jXHg{IpL*qv>-O0xMt)7JhFxSDlO@c~ +_Kkq;O_9@xss;#+Bv(1~;c8~x8FgcwF{fbh_HZv;$nqkkXlM-MBLA&L~>bWIvtXg)iSgXnVX2;HVQVK +aIiZP5ME^yW}F_YT82gK318iF#7BE_z9&VUu0?ZUZZkQ^y08hT=@KD0MV%PmM^JeZZ}e`6D%ZfzV)03 +Z3O;AF%6%ub*hMWQ8-VD6X6IlUP^8pevaGQlteu2aymiqo1@RDoGHM^?8tp;ib$kc*UG*J%=G +bVKDqWr2;a@cxHvC8C3hP_id3It2`B$aT+Ie!FnOcRz31PS0-mrQZ;Ljkfy|rias&g*yTlheaEdwu~ +J36Z1BkbQ<8ha_Qn{&{7yJmgh0ji_uh^%XXjTbSxhFYA7#f5_@7FR*lMWu4I)Kk~0HTS&j}_mQXhYip +uh56#k_wm-rjR;U@vq;SU-K|3W?)X^UgtkOctrB87}J#B>n`0Lm@Nk6FY{M%i}E3AR)6(yOt`0-Vfhv +UUp~1xDA5O-^#Nz8S6&MV^nmIzmzX|Bjm*=%8j;1@*nzk|AsaXL70UsJ7F1679 +G&h(c#vQ@!dGl}M@=$5*2=S?pu$N%vzQ;7c|;o~Q4FkY{}O8UKy*hkh+-$p`Ez+C5X{Co!kInr@NGr} +nwhwqEYJO;ycTi=!2!Odm^J0VH_7j)I><~-a&;VyWU%yN6?`oFNAFrEC%Z0s5~^L$}CJBQ5*`&@Gg!= +!)Z*t}~l+l6@zh`Pc4S>WH`P^d?(C&k{fQsCjVERjqtmjadAAGpeLDz<74lNCfHJ@w~PSk6IXhT4PP0 +s5&YD!B=bvK;z%N6Mj+@6ln}`B;ZV;xmX&f)P2fI0QV9Gt$fwYA63l$(&%5?L(sh1CyZvhr5NMnqK@9%7cd5CJ?YzG#8x5ER; +6(pkDP36$Eh9LjUV9=`$kBpWg;&=#C{qHw0J4QJ7ydlHTl-3V3cp~uN5%Fhnc +NZY=uBN?w2f;c6Hxfvi7|z{*mIWUPefqL`OFow_o-1Dh*}=HCZ5OX?XAbeGJycO^v +L>G!Cka?49;AJMF}?Kl}olPPSJP3jtu~-F>d!UDu~Drrs<6>^LgpVFH5uDJzWWvSUtdBW$a)X({&^>Jj8 +GVk-oy^5!7ot +994L{BFdDM35$XLG2bU>A?bD5WrW~3Jx*wXsIZa`j#(GB0itA4x{^N$m?lZg1wCceE(eS0M;hoW3;YN +nzV^X|uR__Mjg8DCTC0FR_Yr?T_ye436pya;+P)h>@6aWAK2ml*O_Evldu6ol7000&u001EX003}la4 +%nJZggdGZeeUMV{B1i_`Sl3nTDPNXr55@GF>(N7~2kxTs5MXpk5gCH1< +)GpH|XX_%3a;+0vEhKugQR$}l8b&%@t9n&uc_xgN^?QBX9_pXD5s_Sp=*wtr^sYX`%I!}gDWvs#`5^< +5YUd(7Oxcx460u6;l-(+uPuX3TE1imD%9cfz$dNyosVwBLGL5wfjf%FcPn!wLXoEN0v`(rtmj+0~C{f +kXXcuco%boy)E}V)vbdt-rygFEF{>rcZtlsA7DGW{#ra4Hu^#b0zohf_DVgX}quH{-3Np63XN%ldToy +dXa6k3~$ys+RambOAZ9x*&O4-a<_Q}^@!;pWr)?&*@yZ5DK0^NL$MbneVmv0?nl| +>h0Yd`KokbFAJ5#*UGfEo>Fy;Z%`6MN@BycN+diwm%G|Kwley{Gm&q(-lxN+@Mp`&sSaKm{Y9pad5j> +u^;@1kvobF-Ud7!>d^=^M3fV^HJTrPTWhwbYqW&u#Pp3~qgp9|k_PHhAp&KYqo5S*u$p^VXoS6d!Ou1 +PteLL1oqE{l}w2V~_8;cEjbG2Z86XUBgc_9*+zE(I*k-};lUZk-!yxAX(IEN)UXEXL3lpYnlj7FqM1l +O$2UC`F8TN`tpik;+qG8&Csf~-7oJP^E-bLTUKg$(BmYy%}SC#@;?s*w=qKLvD13F!5lt&m0m@j +1DZ8YsMj=$~hlfnXF+i(09mS_W~r%p?p(TyDZ(sGht_cV+);1&kH@a$RNoitPxK}%^qlkL;~mOPj{mv +h`sVxce_kVvw?gxt|4oU%-k9GbK2P@znrauUn(CRPkv>;5Hr69UBGpf&SqatcH>F+n22M(1pxP1dgk= +h1tDrP`lq{$tQZ;PPdV;6k9EX(7pgMEtoqSx_ch&j>+`xwJ@-QB1!^TTHVEETu4kFu>LQ6rFjiI`mTQ +)8l`Y@d2BkZzk7Cg+@Y2#yc5V1D5}C?fMj*v|er(X?8zqjkXK}Ww%Atq+NO;FBcbImmP1*unfZ=>Ak& +TcDMN%!en4$n~FB9BANM^_+& +4De9njjym42i*5BJ8S0nE^^%=Vb#lfG!9cdo9Te@Si}YKhqhrJ}c?h +*c>0>Afb2cXBY;V!AQ2314#T~rq*slAsfGWg&x`c9TPy38EIvjH`JgciF{5hZiPi`n{jz^%7RpLhcak +s9+`hwXJ~8925;0EJ|nzdoDxw<8XX#;&}uGpKHs5R+<_74+l>aj^AAp#N-9H0U9R-s!}~UgcX)htO1A>Uh$H>hr`MP0vTQzg +9?PNe_KhRqeJwGqX?IvBJNH@ptUAWV^zmfkq)yE@%0yx02AJbbeN*SXQ?Z8mnec#>I~oE&`?mK&8(tVEp)*kh#@kZW``OU3xjQhNcQ4jxlGAeF<(mzaIlr}8IMmeHtF?)9XD%gnDZ}k_p`I?kZ+L_;FARv0+iGAea>tqBehm=JF$lM_fmi@ +R%M9|DNT`=<}yj9@YP5Zbc?ZWFz*qwHM(gF3sOwk-02jdZKQ~{KE-7aG$$l``5xSsLk=>b4^cou1zmp +7Oj914vi+8BI#5F$EWe-M^M|L!V!rsu=L`P$bb0@9cXjjl2$f@8(kThuLiH+)a=8I66t+E~a-T|HY0Q +Gt*aMed!LYVrNode#&~js{7s&~ysg+o^x~?D~A!Lb&V4GGcpkAagi)-?Oo+q^5Ft>;DP32>EmC^B%<= +yq&Ia?xiBRyhHA@ndQwQ*zws%p&NOSyFE=>5HQ-ak}lsp7*Y;jnZN*cxTf+g2yBM;;y>cby$(7Y+YgB +YWF=@?a~vxvIgb~%(73HQPjXO91MFdY>FAVi +deUA>V>NW$d5)ui51_Hl2Berfb#ubB;Fqj-+tsQmfqHS1p5%P$ni-KB~tdBeIV7Q-~;=uB +1#s-@1AevMc9IF7rsUQ`Wl4oE+8ZgxaYS$XxBI1qsPn<(rHOmn0~S`4+v1^^_fSQPqeO*r?hN?0d`3e +q`%JY{G%^Nzaj$j=_%IZ^&u7R~6LRyK6eS+_i`lKjFq)zC~R#BbYdSQ8=%!@1MgkoYLu+ru(2t;CR35 +Q2(euOoV$QGCQtNcLgBUz(v*9ae}4mu|NCi<03sA&mGlsG&og{zea}|Dw-bMvFhk4r&?v*&2k#au|Mv +F8a`5uT@LOD!r!3}T!_07;Vl~GxePu@faBn~9KO%!)5i-sE;Ls-I?PUaG?uGkGY)R5D}3$kNt)kFoKs&+PDwbN`c8bw=s$y>D24$0-&Fd~*FKT7pUEFu_g +__X`!mvaNfG>^BI4Aips!SKAR5Ngh^On3%3?j485#N+W2t{l+bOVaA|NaUukZ1WpZv|Y% +gPMX)j}KWN&bEX>V?GE^v9>J!^B@Mv~w8D`w%kBDqUqD2nY`$5u&7_EI_(79@uvA`svLp +k%Jg|NZ(kFA$VvDz3XaS6LE)nVy;Mo_2)@7llIxBAAecD( ++_gS-4=?p&{_0#oQ7xTWFr3L)2s;vU3jqXi#bFX!w)@fDiI#%m!Eq|*UUFa&!ExhJFo57rmMpp%nKce +N;%W{*?i+G@$^^PWF +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 +jzh!?V?stq;t__u2S!*H2!r-2h9Z~j?}0r!Qq +Nl}E!4fHjuI1`;SmN<4Cu-P{U<Gj1q>yZY+dzK~(qzl7O84=V%A%CD#abQJ6M>iOjQnkU*+Ti3_u2 +du3_E*St1(K?2-74R=Qildc@0gOVQy&oz+*n>h+AwK48B}K~FjW@b7_%j_t4i%yX)_rT=eE|dC@a-!a +kmDY7u<*EIvz`UVHW!dJ7MU4$GacN5)&gO$`4rs3LdL87)iBM7}IIF7DQAttb06 +kWZhS#YW$m{QZNqyj=0!T_|f@7twD!0#x~uD6d3al?Mv5bX0gUiayz7&Yx9MyaG@Ml@qG(F9AUQWZSt?r`|WehPtn0gJ_2ph8;5ld)Thn%9a|moBUhddXL!01~$4hF!8k%3;j_;i-SCWYjM$<@(N+jwFZ99GZ2xbs@W;^?~*6!R->F4eP;dMV0Thu_ +>s&zGYFEHh!7Bbz@8zqO(zGDLl|JM8ZQYktX=wyAB~(S-S$C{Tc5P4PH}t*TzxM!ZEX5rC11^#pl4bz +A50E?x|(R71%~$wR(sK+o-E>J+wT7^?*KEo6Jg)`0;H=e3<8_>GIxpJM7L6bS$>4~|Q(Q%Y_rAPeE96PhQ`6)R5T-dwjc>rfq1|^ +G9u#1c@-+}|9V@fzoSTgMe(u^z3F+T_#Z4jF?M!l#3%)p=m35o^U(ZIx1ufRnH?i&f9#!g8LMnACNLB +u#fmEnCkST2jYZHg(40;Q`Abi_fDv)5~mi*+k +vI71}4LBUNKsm&ri=vE%Kv9Z=+D&HfwBZs7fd$q-*Ck=uDb;$+0bqH9h8pGh)hXKrIp*4Xp3_t-ih +vKIgWg+)2z&;Q*8J*9F)*u=U+5s8DHvroY+Um?Q_KYV8p6hZCY9nl`@;O%fic|FKE(_I`9rU5r!KmVq ++)V9F}uadQ1L&N`Fiw)*6=6M`$vIWc8W3gS3Wz`;XpLsR%%qjCw0Cn1V9>^U-FEH_pGBd{8;bxmruyp +-Gx7mjH(eG2Lq=>{g0oNd51|j<`dW-=lVeu$BmR5KwC5v2?RT~AK?^%^on95e-0dkN{MJ4UobS}XH5< +*A8IFaJ3NVslC$WDPQ3{$T0{+EjGoTW)SSPMIYPYiE|^~SVdcE>ga1kPqP?1%pj4f8+4Xdji}8fLxE> +ZJ)$3&zoevv=TmsiGL6kq9=Oj)`y-!1$K$yW(3)pl{X)3mB6~{M;ioh#Xuh6-2P^+z+`1U=PBpXk#jH +K*>E2Q0Cyv)MnTrhHZWePgNGtYcn;qF6){ic7lZV7K~awOI>ZDQjXj-m@65F?qn$Z +=TWG(W2rW`i#yOMJJ)B@($H=~NazGxdmRbQ;3SY8L{)Px_wSDKceWuc@i+DEvoa>u(wgr*6Oz$ +#)GIZw9=Pf!E8jo7{BP?&%_d(2r_a*OWVwNI_c#!p%IB~tzn{df +(Mm@d{Nz2BDwa?1bHR>&~AmKZ{RXfb;h?ypg*6AUqT7b>ZdyjG$0j8cX5!Z_LJ@_;~m;t~5-MjCFKksf3BGZ>hYC)%RNi$((~ncxeG;$ +f03b;}*%LdJzO0E_;@Xi{5f_7LHUSA^hiLD` +8sEO{=$~<$|mheL*fjDztiCk02`KFm&I^Nz$$tpM$`BNc(r3%5J#k$gUO}+`;VsKw{1yEMHy3q-Kt-% ++{k$cJ6HR5lB1I00|G`}e)^9;Neya$R!pj1KQGd^(0&8;zX`vMC$D(s>=@Fh0@AyJBV+{z>keGdNSh8 +<%tcaEJq0anF70!tkrlP>?v|ahO0}dk!g5`v3JjTvP^)mg-* +Z($YT}7QvXLAkwZj=6m#?IWcW+mgcq}0yf%PtD_1pbSy(AL@*h6BX>=}9crqcD!#%<- +Z!no*(4)PKE<(qk9%aJ}n7UWjLu2_ep>d;N0D9ZBnk3;k|@0FnKGdZC3lbE)eCwcX=!ppGC}xEchHH0R(c{{h3JbVx`b!Tr(AS@Ajcr^@&mrsKmk +c-OF9U%xid5;V}-c;!ee#HvAs!)afwqG$f_*3%+0v6m!EVcZ-Acg;@wWnJzm=h8O;v16|9u#?3IzL^d +?0laClQNROz)&*%mP6r?I*WK8;vM^<$*gHA +28$3<+gik$J(Fy*9wKs-}s`Y2CDaNZ)eck6uU!m!= +!=xUhP<`VO5uRGeUdQCZ!F+~C$$Hc0n_t+rRdR^0a^kb(!DU+hctPXkf7C=GKWsbDC+sj4=HA!N`>M`CnMU-v$|cUq!Dc-?W%?e%%* +32(m#?uuW7XS;&H8n^a<=Hxuvsm*|Ty{8UZz-4X6t@Qn%X@$T0Vcqfx2Biv`X-#B;>=Ec&r-0ovudc{ +2EQeyX{eZg;VCi;HsPm*q2br0muQTHIY*3)a}-6Z9n;+=%vCwGye_b^NulKIn956%0c8DS^9x;=Q(tp +Hq;mYfS;?CvAW*dNVxijQQl@V3H7u$jHJ&qsW4onMRG@YFqV_qcg8{vS|F0|XQR000O88%p+8B1cUvD +**ri1_J;9Bme*aaA|NaUukZ1WpZv|Y%gPMX)j}MZEaz0WM5-%ZggdMbS`jtg;K#zgfI}j_bZw`L4th1 +CTmQL8V`Drc-d^43d3$=X~{6G@b|Wh6hY$7p`kNx9`C)hL|gIP8iJ0r`rxXnEfRm|6uptmKa+7-Nh6P +dtn>@i*UB76@cn>z84wA70s|Hy>NL^c0(j7mxoT^8u8(5$gkPwHXyCCltsf_Y|?@ +bazAbT%1;nR7TlsoI-!ZeoFm9ncwe2f7^*iYQPz7(BS+|5D0dIh=&-BKB;^@8jFC_@_H`Z$XtJSS13J +*xt6yLdi(ksU6fiR@1{S8_q17R`#sbS`8mA!grDO9KQH0000802@m7R%ULjxDo{b000XB02u%P0B~t= +FJEbHbY*gGVQepBY-ulTVQFqIaCv=JZExc?4F2w4p}83542g^T8XyA>cQ>p+(K~cE>_br)icQ;E70Hm +~q}j0lzK4>XG`-#ew9pGlkq;k|&hz|>Q#;5ksk0<9sG+RzE;*c)wN|AZgRSju&=g&plwX|E_cV7>nQ +D;ElbhAzu7cuDn&wTtbmeD-+K~+Zt3l5-#TZUHU)1o)IqTk%9)r>+!G;D$3GyssIN|7K#nJuC|}#r$&MPaJ+hlW`Di8J +kDM>X*PaAFyo`yD=<{n^>g8TpCu|Edp@-RaGXpzg7hTEF2B0)Y(~J!id +#MB9=B3E3;LhcgUs$-&>iho({d*iyLBFuS6ZGONManxGE5qw(XwW)WOO$avWjhotx(hDgh;b&>^?K_( +Ej7LvW`Lm2$}`kE6r90yq{drjurM;EVwwX3>OHFSM7GQ=y$tvJ)GBj98wIwyA}41Mh-qP6w7<4~jq47 +lAxl~F=weWFcZIp5n+H{xL3lV}01A?aeC030XSO>)wasG$Wb?p#c~N=)F@D=tLfezOMxl1p(Q@nq~FS +*yu$x~B&Y3U9$F{69z&Q>e_|J`p1f8)uA5anlOK3t-^~pfL$&S#vSKHnC%KKk=Z-EHX&Nic_Vv^?*F1JlyRk3 +wd`6AlCvw>2&Vl**J^sExhGwEfE4l`H864+`5m*qr)=r7a|44W>+d(WkqDo}83@Kpn7&2csvITfu=#S +0^>yi9IPgk}9LaXOXvBQZdO<2F+hu+AE46CD|c^{LxGaPxog!96|#u{&#MAy&UYIjl3rNVO3-c91XAA +^+m(<^=b{yY*uhFR#S!Ad_P#A}mi`g$+`GP+m6Lc_d9r5!)3P1!r7}loDo6`SYa>?q?PiG%4~U#=4!< +kqM%ReSQxr0dXc^WQ-xD +JbVC+zNs8swE5c=}l4DGo3&&X8|1wdHnI{EA@!#sfy~_meJH&bQwR<*XDxgsO(Hqi=DVUh@>vs+bOLK +UD8;Z88N!(+izz3L!syIwGky~mCz@6aWA +K2ml*O_Etc+9(rX4008n3001BW003}la4%nJZggdGZeeUMV{BqHObI+ZkDEgIXE) +EqVO+|A?N~uULg*K|q4G0Jo1z}H(L@i?O7^x{2q@hYPHH)HXHsf_8l_665C*AHFC3B{Sm7|`OO4h_28 +?@t=KXYvo@})6c3R)%Prfn)V>ognQq!|~6DG;UmmRCi_#Dm{@U?x+o5OiO$40NY9*)PR{uv$C!se7bkSy=Mi_;of)!&1+s!m3h&W8TOR +3&iBDPtNlqSIeBnvc%{>t>pTn>=wuH}X|U8C4oN!9W?4q7D$B^4Y@=K;YFLIT&boj^35o2JcQM+{X0w +8o#2D47KKBtvtgShmGUB8+3crk1dw1(3UmE6-RI0$`N`*3^xMR2RM;M&62=1({9j +};kJ2OTfM+ovvh5QUR;dcAjeD;v=R6HL*Hc+jI1*6^|#_7CNd*7Tma7-R<}+a?Z#&P*proF60KF^r?# +{*>M&Ev-iw>mjP-UdTrs8nPHzlN;4C+yz9zR)imfRLooI5a-K?RKOlcCWx4V>0EK^hgA;VEwG~<`JQZ +t>_*R+t<{e|zmR8V55ix{RJZV=jxSM&1e@A~go*^b9o2Kn4XZI@xMw#?@5mQ`XO#XUxrl>x7p$%(Jh^ +sd#tSA4FOOMsGN((_EZg@xV9MeU-r@y9C^q~yT#>L6Q~zPxJd^+ZlLTaDY +#;}k?NQbsv#iE3m&*KEuac`m@6r2@C<9&8K|VZx6#7m0u|VLX&r@wS>77NdUq% +Z2d1a1D;V*60r3bMZqbvM$^T{*;hw8(-}Na7NeP{^FwW=o>8Ds3X}+b7wP4Av6+>hH}DZ4Pd(m +T%@CoXb=scJWGmDrOT_LpU9KDFcoh>-IW$q%X8H*;WM+(g0p +WM<@a82vAhcOU{ZAv>PdygY2kZ#7JZ-+v+VWEl_Qv$Jb;KIKcKyKhCXki< +ERx+Rm3t!)qp6v;JwGkU57*4E)2#*|R6FhaBIK#i7~lyD;-uCnhp>giTl}hS%V;RRO6J(_Ui(j;r`-v +<7XDl!Y*oRq0DT>M;YcMgnv4Xe^L04r>`u)B6B*`8Jvj6oxn|HHNLkT?FTwl{26<9Qrp4SqLHguzqgh +o#kEJ$+fengRFR>sQwwPw1-vJQYxA3#WuKQsKO-ER{ED*x)`(>k!<8RD +zir1Vr1%$Y<|MZJ +7_BMjTtMvgZy_~lK=j`4tiJraoOEe$K7*mW#jNt}WQra|F*yX&Y$2}uQ*^-)382h4Uy93Mw=S~1LB1_ +`tU9h(pK2)ITV$^JdedNGitvLx}A3>|rMR2>?jh3O#YWcuUgWzToznb*=vws0lO9KQH0000802@m7R+ +NCe|H}*j06{7M02=@R0B~t=FJEbHbY*gGVQepBY-ulWVRCb2axQRr&06bk+_(|{?!SVNQCP~!O438WE +G|LQyc#q}g5c7k*jos+#NFjtE9ykb&erh%-Wfh5QlcFv=!Xh{qX#)0&ht0JO_JnqR5Btu#YIax+Dq0G +$<)v#Npf<+51r^0X~b^F+nsxa(R!qNmis~RW_&tIcdOV}b=}kMWZR1asYHt}8h%0C(4p&kCZ+kVjvXx +GzP)IVIeEn^m6NxuWj$4*&&hi(;l-~**RT^atK(f!a-iI|v?;2F7gA9*$g&bOlaAV#5C8b^@n0Xx*Pl +Os{2ZMq+AZG=unY>q&U)#;%)`gmeJ}bLC6t9M4qR4_OwVdssge$AU*d#v=$o8K)hlr!M00Y2@&&m+bA +m2*Oug6d(z0ynft6);a&l5NR7&!xXG$Ia&YJFx=nquEvZ>QZ@vf~IFj5Dfv(*WK3pDzIbU2%{{&53xC +s(Y$5TO4(3@2MR9`8ma7upbTe$BR|gne>VmZ@aTHYbm0zmqGYt4EJ6ugAxXoIfWYM9a+5c%7P6Iw851 +@nMjPTrff#zH3=cuDRNe^b5T<@E{A&V%2kPpd&4_(mFZNuO(6~9o1w5QvCVJVj$OY0peB94sfT(JzWg +D=C#`EZ^ouk5hY0Ez(KR6I$e$hGt6St +aLW%QHV&QBYFLYdWJaEorx7~5g*2hkr_KVh*uE6KWU{=X%>Ygl5`i$rjEZm|IJhEQl2#}kGJ>H_4bR+ +Y_rioIH@|4aHG1Kld$xKlj5P)2EvFY9)oidvPGssZ1gII`rkW-2=LD!`*<4ycd?6u^BP%EG% +^lJ@1s|YSu;rm?G;rxfLjbEeEvhlT?s1=(x;Sl|0YLh)}d5 +vi}z;n`NGC#ax~BuOvD)0JtV(ve%^Rzg!jo`D2YvtzQyA9 +k-TiUiI7vscy`aX^WDI11S)|%bie!YWtFc~usbE+8$;ZX-JM6UXVx0+lbyM`-cl$%9}$H1e5{77+v*< +ZREaDKac#kO>4lneoP1cXm0`z0V-C<`K>dXSnkQ%IOZ@JUAk3v7PfLlA|311=8x!>C(Z1|TQ{2}ao04 +qOFO0(?E>fS)0WxqytXP<4P4u7L_@w(nV`AiSeM_7>?Q(!w&sEc&96!qzARYZRi38mLjQB6GE&beo$r +Xc#Fif8PsZ?KA@rP?JIG2Yd74q>m1wNP>|;9JAPNj5?M +ZsYh*EO&2+6&^Xf;95eX`px?@Hwkn3$8H_?i^5ygUWRb2sk%m-sLYiyf}RHy-%K>y*5MMU)X2)h3 +yfYlfCPG&P|Y2;!09-?2`#9y?kviek<&61s#r*qr|v1|r?PIg-diLXfXsJ#LC_rWMi7cR-tj9)! +>&{>d{C$vb6!E~I%GIrQM(-!{#aRb!p8xT0k(R9ZRcj)rReo*^Y*V@FTmf_aTKYghW1oK@YQib%LbcM +>zRNyfpFe3XX{w0!ekd+G2>OuV8gmFX~Gu5mhB{{4aN}SakE}cDGsfcBax*5=BZgiBvDu+ai7>yC@^x +e#6@6Dm&Uosh+&)Yde5ugfi&C)Kb$cE=7Z_iWR}W9cbVU1*qeZ@qH$roF>d$S|dmu2;hI=2eVE16m%O?x3s4gn|(%dKhlxXQh +rzp&&ee_T6hKlYijes|I_AFe~dyun|924rYQjAG^NQ|+1HA7YQFG4akOr?!j^GNxIhObg-W-{3&5dzk +f^EwP)|+j0jrJBaG>4<3b!-VE|2I002F`rn`YSj6MYS}ZCwULO0L*p-aebuJ@%{Dx>3E>A_FOHa%~Cb +@5aaCfv$C&lqhY94h)fWXe}EAN?0C7;l +oF}d1sgy{fEdA{Aks(`Ld;PCcaO=4K-F1^{Lj)1dGZ?K(u6NuZm)_S9(l=cLSb^-h2_}d_)xs{#mj1k +W0r!b0{rTJ6BcddrbhfW=d$=)&afM&fcs&ykC@Yuz$OBY}9O5P#)g{h$i$=RRe8JaCuXVR>U5K%KyBz +csazsJRZZ1Dz*H{K2`L@kzxc3Pb(Mw+f9g5}B6Y%T^naH)``U;-;x+oz3dxJ~Yz`Ih!?&H&vp3X$LBd +{dY3eq4@(`uDW{Ev9g2Xc#dDmm4{1p4?0?0K_VSe9Th5;iI8z-w$5}$^VO2)EOu=<~x1%VG*b~3xhE> +6O5T|im~v~X1#*E68IG`g;EWm=Z;m_$JxX91}ze0QbC%aC}$|=Bmj>oVpwlaG2zQ>I_fdHdI5p-Fksr +jUOhPVSI05IGd5NP0k9Ym^ccT&vVuawB|}}IeJT&MokAhZP=6{2N?J+=9nE}rsd+pc`Bwa1go( +5B^D`*3D~fe`=*xIi2^ER$mFjZ^3|wIt5kVhGFK^n8$@zIgenJ+rMHOU1liMSPAv_bssHZj-6ycNtjO_-h +oo;*%kf1DI=X(E0Ep~asrrH8S(AC%A_R+dP!~wVUDo2<@oO4D5O-N9GGUK6Ev;w`JL0JUujJ;|ZIt5T +ytat|trors3$GHCc`N>)cT)l%#N&GH<=Z2W!woP%2!>$8FBv&9`M4GCEG|k0CHPni4v$fuK7N8_qGGf +z#zwp@R<*sxD1>iWvrred6)G{bDp|@+yRkd^PbUdSbcol3)b&F&5jRGuEt?5i956m3wj1yZdGh~c5mt +YrWiXCsGC&=}May;&#B`TmG5n#yJ*I&m`);ek-D|sfj3#s+9aG#P)cIrJKnLR)#2c`+|EY}`un{pbqh +a`K;m&dmGh%JfV^9W(sosH%l9>(=Mj)87d64BpSiPXtWrVLV2)coHwhi$b^CUJ#;_X3q!N<}Z#@k^w2 +iX(*5$zRri%flH=gn#~cb$?q8mQ1qR+_CZ_X@S9N8IkU)UQFL5pGO<8ku81X!nTi+8;dX&)+~! +ykD&NrEsXu*r}RBDBrLX6jH3^E7zXNHpVEYffl)-b&Yyn#mT@hoDM3T&JkU6Gw`AijRiI}o--Mm6V^p +T3EP`fUu%Zv0#N(W;Bnok5m25&s2J?YNqBlew|EF*0;=K$RC!Qz!g;Pe)Cnm$fRcQP!!uF~cRIp*DCw +?6e;G8$Yy>w=_Fhzw70Ua%x2NP|Q|E}h&avrmNuCye0VKGmS6mEz2!N)J#(gN)1GDc1tvy6P{+`JEmEN0 +ss+)Slt0gAE|@)TDZJG=HGwLqK}8ab*N$uWqD?B*Ad6}hu6DeK%^ZuMk_mK@!N*E!Od(oh98!Bc^E&f9^CFJ5HV&#r6;5kuqsr(bxN|Mk9z;02;ZpLQ!~||pq2W%O1U +@-hwZ?YU+P>6IXvJj$4^1sG3ShOU)BHQCQk&F>;*i!x?+sepKPfZW_!_D^Mh#w@cEtX639Ui$*#K!EvaAhkr_ce|Yt7*ML5i3MR+BhL?D)oLp +VRVmHl{~`^p&{Z49^3 +(e3gC@&aMUHHEDDKNptK8Vvz)o2`-=#;n<5CWS&O+WJ1pUZ!sr-t&fz7pE7x?1{^=aijxYcC!tlehWy^a0=P)h>@6aWAK2ml*O_EsNWs53qk000O`001BW003}la4%nJZggdGZ +eeUMV{BsY} +X4i$C9u0`{KODXCqUMz06ww%3%}nk%eSK9?VjPfva)2Nlk5T3Qn +$R&%i>ioxLh&bFL|^(?4Il|8d2>ul6f;DP*@|S4{`J&dL?L?VFM>RPRPKaVn~gw@?-5u*zYQk6X^m +Q!EKKErn^A?~0lRmop7xl!H`nlQZCbt=R`S6V!y- +1k1)<|X#_LhKti9u1+U&b6Xq^!gD!it$P~VDok9B(wB#?#Qpxz^b?sLuaU3n|7q94dhP0o<+ +rNrnNeWb4XMBCdBgwFiA2$ZOKjVTa)T2CE*z3-Zeh!#ys)zB5iMAe1{foV}V`L0O|(fWII3#Fixq+I*ewCHx<0D*U4)=V{y1H+{Epi^> +&$!f+2(RO`S^6J6N*@6pztx0=S$JEw?_1^gQ^n~W3p`{#n{o%uD*q^dea!0}OfstUKX}4h>=!fh%^m@T;Q00&0Qx|6q;@Ty=+pe1I>1-fIZRW6eGO3zS`ZGGS +!2o(TX*<1QH&)X@OF{oyj3r-QM^TjP}fz{fUqRf9W?z=Qa2Q)x=jdP4S_>wXe`jfg!@E2qOdtqbiUr!c`c2A*|qFNn* +XS6-HB{JCLJMvc9W#&?^Tcwr9px&|2G{Ah`HM;gC=InuC=9+kmmhl&FeryRMNZ$H#Y~+xBY&`o{{K9` +E+e{um5Bkaqls-~Y$&*}cf`F(CAYLCb^wX3SF59NOoRBzO%Sd*t)cGd7m)kwC26!CMIS9BTv?-k2fVt +P?v9Q0cj58{qF6AaUB&X%4Fs8*#$c5D!92Qh3#LRvsyEBOsLw24^T6T4~N9qihGzjvAmg=v9o~7!0GS +(ym8~aAbW?gaNskMms>6@(M9S;Y+pWlm`}DoCEYe2ZX%t+Jm2)_%2|*lno7WbkdeK68-)&Bzj^6LDg7 +wr;QzPG74??%?B35@5JoE-)r#A!xn&5MRkb|aanfHkc5#0(NdI5Ci-9OGrU^;P`%Ce=?1IOuEACSw%^ +vUBZ+D1mHHj5wM~?|jhwBqQmZ+>CCHL&f<4$PX2jOy^{2U5qc;BRFW{j#A`1oM<3cjdhEOTJTRb^nxfxHZ^waMwwa4{5Hsc#chatn2uW+B?t +oH!j^E^AkW@d-ew!-~d*$g>`r}%_ZgG*@w5Ca +jwy8Ze5{QCPJF3;23^LN*07dI(p;XYufJWck+Km6t5@+>`n|JOh!Fh0M2d;Tu{`1bt#GClqN^zC`5(a +rh)q%_KE@kuA=FhiA!P1^QVn#r`SYn_p^HU^aYs_($g!*1w=7MV}k7nCS!F`LHzQi;#ns$5{sK&KboW +Y0=vHfn*SYm7Zdk?JQ}0swk|`9obElVWTeV$7KY>e5X^DwCpnpe76k4Q&~~#aJdEa?Q}7#%LAg4 +K3!yIpA*?opH^EP52xci%?n3MN(g{tjxR$yS)LAW~7=1sd^h340T6I7;X +5a$R&w_PYxAi?(UBV7zCnQ-x>sBK~qov4ci?n0zTMJ$Eu4#GDa?-}`2p5EcTg+PQ@DR7aJ;6+GP+KXb +3mb6a4q>(j4;-3(li{}LmCNG?=&jnC)IU;}<|WUnzFDH7KEY%O*%$bCFfV67k`hq^%RsV$uObI((c2Q +Gv?TJu9MjrayH^-WAC?HC_#V0%FnnrEVXMzmmgePT{>&wSwva;Fv9RqP;|n!TEGZFJ0ybZECbMaYd~7 +lO*!roN6ZaT!fV<-~4cLb}_(d69OjFtHiI<15WVuPDF-wBUB?oB%h@#E(7x@H>gR?j&Zjv<7_#Z{Z$G +>W!*8OTH9z5RmhtvQFJs_Gnqei5Eb)KUR5#BMuQKJ(6m~;IM{vsD+NI@uW5WBrn!3^;%Knqx*@{eVK+ +IOLGM~;yPL}Nug8VuR}m{o+#vOEVLRCNj`@f{dcCc5}nGTUP>rGOR=r?uz}k=9h^mXqL1JFm%E$BMmH +(nyyvUcbJ7wCeuM5eRiueGV6%8pQdoNI?i>oE7wf(Ai$Z7-VvJs5|~qV)i#59f}ktEKXZ};F~^VtpLt +1LlG9R&I_=Hs2U)}R^(e|MnRm~gE*{7dO$%j#-wXMC{T9-Y-0FeWW%D8-(~s!$PDEr8w(Edl+(HM(|J +d|k9x3Z5=uwkzWMfzo#TmfqaB28?lF9-ZzVW(36GMj^5T)U3TZ&%PC|#-_{=7jy-O1(-gSwUBLey?%q +A6`WHMbWIq~nA*lO626jeHv05esV*;bm1Q;PP%SmG(zBxwzdTh}lMxC$_)Q2oZqQU@+;gk$ql%Kn0-2 +=q|rr+6Gp{$&syya={K*^}X5+uwr}6RVj1@=7V)I=26zjv?!>#A;9)lcjgX%vUF90a6k_uW#OI*>sd- +EV;hem)Sq}=_6j;f(fHdCc7h08Tn+w-cRIioH3>e^Ep)KK9L5~Dl-71;l(;5S6~EaXjA?6_V#*oEIy3 +WW)(m-b5w<{pkCu0Lwnl}TyurEm6CPw+&JXuz-#eV?8uL}Hy$(-K)Aq^-)-l{I686y`ea}%p;0lUQ4y +K%NmgfuY1+EzDK3wvEgUyKIbxU!97f>td#}XNtwz)OGJ*KYZMRH;&<=w$zS&S9g*XDefJNnMHG_Buc` +>%w0rTJ!GN^45(Bjd-Lz`1W!vX!cJHQa|hEA)ik0fY}-0Y7qJr((DYIyUzZ~ovg0Y{%MzuBkm#W<%uU4F*kZ^h +y`{^WNhlr$6TWS%Ds +K0b~yN}Ts;!?AQH7tD4U*}^1T9AK?)9Fx)S07FJ*G8q?4yNqm +KGWzXzaKepe;!_v~T+=66`j*2Hekg+U_Ou}7n}+iwx)`CHid}RV6Syr-W-0RT4I +}EnZ%4?fI+30F3P#Cv8PFU~BUS`RU7cn{0 +i1flmpkE@*0!5cgwL12E%PWt($k@9k&ICBu%gg{tl;Qt*>;gmxQtt?_ms3}9I!pX78KzrBZ8}^E56h# +nchSE8rC>y)bt3U(l8gpGN%p&Qpr0!e2~fX#`>s*xv)OxBENPY%!16PW?!@^rqc^I<|T~zKi->vE#F_ +U_gA;)_GX};jGzk>YfiU*0L>pA>FOh04RME;Sevt~o|XPBP3y=~PAuct68^t7gkK_6y34b|jn7yDE%~ +vT3WRbwk;AFkrNwR7bbw&XnS0sz{0fWyid}3VRNlKiD94I2YfpmpH4-Wu!eBRag&}Z)7+R1vq~_kCW2 +#)DM$$B+P&yOsPK2rOB|0DXs^MV#+`^})qbtG@szr37PCfDc7atVcb9hu4^kMfhpa#!;-DjTYZ*{M}- +op$I%Q{x_3_tU#xW|3~cRv#`GnxK_B^Vm8GkYA4W1fJHMRcE^iOOH1|2{m3)%iu38hl>AE<{c#71(3y +mqaX5-w8}tei#&GouUqsfr2}q#2XDGnfd +ixaV08$<)hD7Xvc#L+Rj7QAQ)D?F+Y^Bg7EU4HzwSN>N@&6u1tUlOKeoln~RWL~UIT$igpP1x7?%1XQ#fZI_e9fwJ-O8B&(6MU}OCx0x;dP4YHVqvpw-;j*ua-o_; +U&+!qV$NOaTdvv$n)vv_+@6aWAK2ml*O_ExFPS;?LT0090I0012T003}la4%nJZggdGZee +UMV{B%ZW5@+ehpiK*Voo!5oDh6+HYWy@zF}fMAfuP$Ovy-dA5FPoShJH +=A=nDKS$?Xu(tSv-1kAbQX6Z!?-3t{{0~YF6i5V5z#etI7El$e%vJqt4!j&v|H?EvXJC0=+l7zW!s}Ygi7*>8jwGXHk+)XarKq@0kW^vTm_LCxTJ>u~8b9tvFXS54=0e>TER$Me;xu?G>J8 +k?)qcEm=ydvqw;*(&(Tfd?G#@%k>j_4gcRa7Vri7nVc98!8M-I`rV}P3Enrahm#-esdLr?mlO5y4Kjy +?~xw)rVE(0_5Mo7ciKYw6Wi7^0%ECqW_00 +LN<%->|j+>k(JA1Geh=Z1)XKL-vyQH^_P%;x#-Vh_GGglFs=R}n{dUvfvw-e&1HKs@u+ +!H^;r0%N~p*a(lg623zcU3jry1$Xg{_^DE!?i7Qpx6=5cQkhFOp+g)xh;)9S5yKyI&sof!KAN!F7>q& +npakjW>?*;I1KH*|Na#0IcU!tB+4WUg}RV)%`%IcfCi=MnK8qlo6;^zqorc5nbKH}IpP58cwH=g6IRV +}p(qT=taS6Is~xdG;KgNlfqEmz!yS0CSB +oWJ*z!RIHls~?^|6TRf(?fKApj-0sTx<$DE_gBK#+1yAzy0pXix?5HY4AOHjan$(1KO86Fxxm~JJ4F=Kr6JG0Nn!JwxF=xH|Tf&(TFlzK +{-hN0#Hi>1QY-O00;mZO7>R$dH_pU0001V0000X0001RX>c!JX>N37a&BR4FJo+JFLQKZbaiuIV{c?- +b1rasJ&UmofG`Ze_FT~ups+GP8$<;pC~3-=|G$6*Hp`aPQbN@*g$_`J<)t2scH*1-GZ9*mYV(2AoVfb +RM)?f`T!O8zsV`QJ?77H)jX><@T+@d7A8~*OP)h>@6aWAK2ml*O_Ezha)iII;001fv001HY003}la4% +nJZggdGZeeUMV{dJ3VQyq|FJE72ZfSI1UoLQYombtD<1`R|&tEYL545K?@LXw;j=e*y1l&p-@UU8S-N +b3EI(D#~_5$L6XU0xir_CPZ`jTcof1a<5(=<&US$<%94!Ks22_@7Xn3T|n21#|zRAG}8_Cdr(P2t$kRltqK)=`VX2eK$cI3g@^ZJq3v{V}Y!&=_vH@&;elYqIx}c}pKF4%! +sl5UXYmV`48p3t=0{Iuu3W_eZY4Rl40*_}~yu3v^nrj*+XAaDiv>*pObuxleM6wh&J#KCQfL*-{mdm6 +{#!P>x#18mxrI5aWP~HGojyZyF@P(N|pVTr-Mv@y}8c)`l6 ++~%##ti?R0RB>;@KjQ!o0z}wJkOs#T{ft#E|L#{)SH>$;PHKL*sNzR!y_f+QnO+%h_hbg>s?QqfHAOM +#nGxSjK)PVa`)RnoPcuXy^5tYod3n=0_n9PPd|9d1cVR1)1b$}FHxc5GW^e07+zyH`9{H>xdw=eShDU +53dgIB%Y#VMg+mJp01Og%>f{+ +WGfxvcpGJV&W@`~q&xuAkl{AnOb&JRaCJfeFbZrc>>2c6ujZ8;3^jr7_}-$t{l9yqcZepcN<5Q>HTP8SvOWK7_B?YYAnTo!PPSN^y*c@R^pQu ++$+=X!2`I-z1J9BDLF5Q1DOl2LUOKJR{*Vh(^VKWJ1z*0AbbXmo9JfHew$7Tzo+(!tn&1D-Xn5CrN3ytjVk!i8s +8LtBeOgUWp%T#VkV34GVi9uh$*-U5j5e+Dcf!==q*^G5c#irpj<4>LQFq!T9+-(SPy_tPjkaq|92lBD +1zhHeQ{nyO^x6aXa`b6C4NEHRn_n|EO+Xl`evc2>gy`^oyb_aXzaIrVNVC;V+f58wmeZ1~QFz@>3C4hLNA +rl6-ZKDSLKK$r+YekLY$P78Kmn8V84;M4q!=KNwAA(D=z*?u*xi$tTT{gti4->oulo*cTzDDkHsqrF* +Ws0-d258<$xVB|dpSW4{n1k#9EW~MSU=a>K%1n0Pon0(@8=|~2vpJXP5Rwu5>D!Q09Ekiz^cSso@-I+ +J0|XQR000O88%p+8nG}$9g$MuuogDxG9{>OVaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZLVPj}zE^v9x8Eb +FjHuAfF1);?vQfn*Q;(!B;^B#)a-d%x38ft+{IfpDw4QCG*fUYzz0-z2gQN*MOps$JhcD)ka +t-{3-V-8il26(dZ7(L6_j~C3&5Ei8?7JHmpvwpFljt6wv12xoV6n`CdHmCHq8ACMx)oY!C1botZEjBG +!%Ec6e!7vH~JVji3qq{{C-us?kyJ@9$x!Vr#%*+fu9<|6EJ16zT_@)0Qo&5x177AH}u;!4k>;-+;xE2 +VOmZKW}8iX}eK~w`x6wpSQIXTQu-s16ipqzoA)gjbw-y>MaG^pYx<=vr{G<=RVI&am6mtp4k$03H+GQ8C6@|f?6L0v2(VyjctUweDE +1Rr>>DG%s2juK>HrY^;sD7<77|lz0BT~-0h_mHz$q3TG`$$$4(zG3bFpES(9TkEtJbnd(^S@&V`UBlD +2BGIx!Okwk90OoMG?tVQDv_96$;W*rR$RCaS-(gORgJPnRBBP>J9q`hb-F{P^(OY59LKiQVhZK_T3$= +LGg3$dq(=+4%zFHL*)ed4JQ`9RT0yI)m&l-$AiQm6v&47M^QkW!4bss(D981x$zohE!&mT#Ww>Tg+?n +p@^)!mb2vG7T=Kco8B@;CSU54_mV}nazAYTctwFg9t>;Z{+tr@(b$cXZC&8bwERU@QuhH7Bx=x +`@-d=9KB8{OPx|^t~5GDlFmn1Eq!}9x$Ft`x{&-f#PH+x=b6?j$1>WAqYj#4C=lA1vOXtAqipX{`*6K +eb*w4h}mp<-C6a&OOR6-7PdwyzkWQVXQIs0qFbB9AjsHkK$wmfFZR_?=rjY=rkpf}#E;1Pq2p!jnK1K +V!4db-%GWlajU@Bam=H=o2Enmg1xyo|&M1vz<)89=V|)&Up?_ohVjbY)b_$;-8_x+Pd27m@nDm +gqlxZMhtc96T+2gBA3m64b3<-ssFyYxiTgL+wW<#tH#K)FDX(^5Cb| +kSzr=sDm|t#bXmVT+5j4Rdcs?)iM8?JH1N)9@IFT9yJXdW9fMC=e>J%}M(){a<(HZl7?CQYmFG@d7*J +(Vhuz|dx^8pPtLDRY>^IeOte*%NvG?qo-&)uw&j&k_cpZe>0b}t~uu!-=y6&8KrqEl=$d|<(iQbICRz +TW}41LZ-+Ez<=Bm@%@)aa49D9-&DpEeXZZ_C>VRt# +J8P$K-hMi$4+iS1asrCVnW5JHr>-8cHEAnf$IX3I2+rv2z#{X2N__j1S3Osy?{y~5*h?oU;2+_3dBsjHGhaI#v8ha%^6%|jK#C-{m +w)6NiGLn;yoiEIZGP_kEBtX-EVwOMNKzye=vHy5s`(Dj9X!+xkBi#Hqy&}nJKB5fI7{S})cYfI&}c;H +o!fC2xyr^ZA}{Y+JR!@kRNn%o>07&tYxYg^YG_7H|P0On^Duns?XdQ5)CjOF#fdo<<|tamB&+FU|edmsb3iz8 +nG2x0EgsZgO3PW~K=QvzFJ(o~|U14#=ICAC7aZ~=lMc%wkBLiOx#4k}au_~F@QZm+G3G5ELv_a8WE_ +G1Iv=G15RU!m>qd&IOokcb4>NaMU%==im==Yp&1OgkOMD)hKnb(p|&tkVOD)BjXD*`3G>BQwa^Bh<-k +*;!wChJeB>%2FI44AxNPDhNm9g=gBd7j3{VsUE21`T5~+h)op7LT=A<{%~INTH)8?9YCJ9$lY|}etpf +tfJ6_lBnOKC1J`Y$46tVQ$5nT_sI*D%jWoXiP)h>@6aWAK2ml*O_Evr7qGjBfL8zr)}#syHOX{2tl+L;!N4VF8PAP46YR~`Dn7tWUACeMTPAsZZ4+KNdX& +}ptJp=7n^9+@z0%k^ObtcTaPAU^QWc>*2KPmue~=EtUl$Dix<{o~^`q_OCDkVgAT98sJmWS#+?-oz{y +C*C0Q7|OxykOxfdET*Qc)Pz!a7{Xq-(@bH*#hE>$^RWt}37EGiWG%^5X2rFxx*(OWTIt2q&x?~((R9I +f#9E{r9o$XaR}F@T-j*|_d5eq{S(XXKy@z!iVk9pgzl+X=oqJSu38VXV+>jEuYv?U*#nuP6E8xpF>MGohSp +iZRATAjV&ZySjQ~3`i$%{GBKj@Mti7r4ABo-}+6{F>8rs4xjthy5o7sPLQ8ypuEK<~`YDJ#8x +xx9JUwdZyQXNua~fIX(Q;&kj@`mthNzSKkfnojIXS>GY&(r)hzUYXzo1kv~vN0|XQR000O88%p+8q@a +j{vaa6Ux_XgB&YYPu!{LxDh$AjRyonA=KP7#YF +WikgYaRs<#WHreppeb};ra;`>70CvS-8n(u9=XXbRuT4?XXZ%9=g80@|peU3hJz)AaFx3R~V(g$5e!L +Wg<|?qas(C-Hk@$*{n?^k<1r%z{DyS-caepJlb?R7w5CFGrIkKay_13-QK_u48!Q0DFoPwC+hoqK<8q +gN*0BHmbu)C6=$*BAC;o$x`OExz|L$my_(EtXkga?d<^9MWDK-9$Q}proC1fKhnd~(@Tne!I~`B1zYG +aPV_hDLX{D}EP0F86x_9v&*%wMUDOl>D$;e1Ah}ay4)c_d@{?*|hAVMs@%#6PgmF +41%tFi&@{kWwJ)zYdZApGb1frm4TQ|8kk&-Se>KTVC??!d* +QlF)pxLsZVL>2GqKeG&p7#T7cRr@35}Q%A~8Z*@Ld{3VDw!w&8)Ex$vXaGj3iBPB-**IT*}Tesbjxi+ +_GyelQnSe`(J-3ubDYB-Q+@7#2{r77_PMJ`p2L1{h8D+Wt7)4ocNqfP6(XtKE`4?XPKH({O`nuxhLBp +xsi*4MFllwtmbUwjna5LA1@%R`vh;M796l6m2+L(I}-}J=7OeCE>f*Vp}rK;L^oi>=7kEb-Gt6w<-LcQtIU0xc)(LV;As8kVKc0=? +SkV{OFMxf&WmD&KHx7P2Ox$A(4=8XlBzBHh}mGb%_!V;taSTk5{*Xr-f6!!rLnxAzum@2660f}PCl{r +?ivox9F#eJZmSw3DgTuukAs>V$QM@u>`tVxG*i718We>FPTQxA7E1xy<-F8y+Pw`P8dM#4M_tC!wzD9 +%MB>$nG~iaQO!R)SYI5XO*R{d%SBDWslp)1kW&1fPA72$D_3#-Z0!%Aa%ZU($E6}H=E|w!G5N1qSR`% +Xubuh){J>G;HPw4$0z+_Xa+Am)FUalxh$V+GJU&{)k1?x9?}aB+Q@H!wnsf0%IdmNPm9}l*&-DyJ&cf +Pql0+JB&v@N^ZOVvtDUs^7ptI>+Kny8NnISKuU^VxSTS3}=2Rv;Jlq@eVbvvTQ;q>b +@(dOID!mneZC5fWn6qjvj;(8%300P|tke?=@LmBf9Oam~kn0Z>Z=1QY-O00;mZO7>P_Pr^AC3jhFDCI +A2@0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!3WZf0p`b#h^JX>V>WaCyBNU2ogE_1(XMQ&B_$WVPL+a +eaX6 +^|F*=#g&?@rPwi1R%Id;XJ-A6B(J$ytM(<(uqz*neaJ2{RfX)btTIs~`9#B&SsBGyQE>_HqE((n%S7> +bC3d@{NG<-UemsPts-&tFAf;Scl(XyW%j=Nc+@7AE-Q0{~iejB@YMG!w7R{e9_&e<`h4ktlS&`~*8(z +f@ZoJNNuJqz}0E4f=7(@QJ;-q~e=&|a*vq~a-i$f_+f@debq?P$Na=CXx! +k*I5AsYX}#K2)oHJuGx3KS4?e1ou_QcSt=mKIb<}+Vlxo`X;B!)g^qF(6y+exgMUj293Ppd-R-etz2@ +LM2;8LDH!88u;5z=8?8@8_@*seXGH6E=E)jihN(>5tfUa(3KF3PLfEcZkMA}gu$Dr&NxzGRz1NFGc6-#UZOdk`6F%QtCazgAcj=1rB +rzqeSH*y1-NKGgyC`yJ)~3m}W>RHrTbO@B_yq}sv)K22Ugh8!PDu)_#yfWX?EK8!}W{yI*S;;vc2*ep +rYSi>k^@q8Vy>F?|-czV{*!`IPjM{p`?5&Q;%s9L*uq4OU0%xdn9E@2=+5%Ux*@c|kI!W>0$SGGJa=P +qyJf2O?#kp)qOAKcbwG(^O16;!T2&Tno%UNC?=`*i;8@|t-=LfwS8Ph^%XvHWG2XBAW;ai66;ja(tjVib_m*O5Ra +5f&Q^ACR-?2IhP8`^^ezjBWKmf +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 +%GU34=hNYA +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 +w?N +jftm@-7NIsFrc%FLHZ}NVCe&u&(kpt|qU3_ZD5vU!9xIv&8`ua;#?pt!q_D5HC1+Su;$$(zFb`D|tMm +-4&B{D_8aX#Mg+Uf7t^Q3){jkfnac$M%pg_`Ge4ONyCvBQMJfigBF^et8ov_J+C+7MPo~C08Okf!2zP +T>hMCfz>9XZit^&3!20|XQR000O88%p+8<~jzZP6Pk|bPNChApigXaA|NaUukZ1WpZv|Y%gPPZEaz0W +OFZRZgX&DV{|TXd8Jn0Z`(Eye)nH-P%%sb9ASGk;1yfa0Ue5FK)SsI0l`RTnGHp%B$dJ_`oHf;iIil^ +55@9goA=$Xk00+M+D;n>Qa6oI&E{Zq3%YY1Hx@w*#(%l&(GE6u>IfGtzpK+0?nLFb@IhF&88DsbO7@D +X)~4)u^}>DVvgPIljg77~9(XSuL-i_*RxK)b>1{-Hj1HX<%CXN@t0_&iF>)|gXvNqp2;tEvF3U=ah^* +S0+9RaB0xS)FVU=!MuIlJ?JN&%nVI6n9C8ruwdk_EI-oATySaWI7@tQjxp?`3Tcf_6%&%Li~3k_c5B? +Td*v?bNqaTfzwS4;8Cx|e3PxxuA3G8IX_N9Hu6v(3g!01fP;7D}q(LpaMBQ@lmSip^$INp3B?SGL2-j +l|^RXR+G={bgAeK1UF^BSNLA4CO!{fWzM>chm}IErMseGrI08B!IzCpHT4E!~I7%Xw!06rr_a=Xp}a{ +=(>7ApQM;qD*lt{F_?SH8>E9+48Ttmzk$c``kzuDQX=rWW}_juC=UhP{01Mj!rkZ$;Ezj^kH^_^a>x@ +Rly`F@b;V`2T^#euL-(0=zGg>7o&m<^u>X@wi%ZiHWw&2u37Os>JV6|YMAvia`*%lD!;xEPq<-d-(pG +5g7HSPj(<>*HL3SBwK+DsOP^4ukk?tbATeRg8UQDGGKh8{V(OmRx-9B3}{BOpxdnHexd)M_YwF6U!#G +OxjV}-*q`=P$3AyRrunSV!lapo9Cs3|ES8aH~f#^}Dwf7vc$7n2Z8uYv%#FlN||<97?(H1x~Q*+&`{P +eG#exF?0q%Bqf7y|7eVEPOOimDYr?^h(YqP6U?TxhRPt!xD3>o((IzyyT#LriuA|V#psY@5l4L1o@LC +#=eMdZ_(wmskW-V@rL*CZ7H{LBV;?sem#>;MuU+}_SyD0!=;`H^%$-!H1B6-O1dK_;i1F4~{qXEm*qD7T+eo_w;RAiMd}W`+2SNk#2dmH+BJTal{B~=4zutp((F?|`= +R*izkXFx^P2g1kaIr{!gd<(IfS3Z9M(_)Rw!Caf-cyGIZBzdsfQUd4U|}YIeT5PCgLSDGMyxlILvWlh +UMxR$$rcxVD=P3rk>+vPM41~7I$Z=de`>UB+e6h@k(rXbpot~N0LVQg$JaCyx={cqdImB0J1m@)`Vp%T5j!1W5FTw +I#C-SpDLh?DLWUV}?fBbghDR5+v^A;|sh_daIG8FDCpBxp}qY$S3%-n@C=@69;h?y9;GvaZYODCZx)s +j4*JtDUUVrmDN&%6wDTZIc(>ue^~*>$=)Pk7k$FN(%kv;{Eyg+p~*{kfjSuca)W;}dVwA~y}Q?W&^ +b)kMRnZ(;gu(+@If(t0DCWVdgw0icP#wfvZ5)pnbfE7LhV67YE|Kel--x3X-W^ZPkHzfJ2h$=6BUmPx +9Tx~dxeB5$sftdMEh?&e3csR>n+Hm!m=SF!{5?Csk(Z|ATn&!5Ad_)nH`Y|>TQq;_jr-sE*vB38UzU{!^RatoTImegAhVgve?-uT900!L7zWt$f({ +(sWcY4$U|mFptUnisIjyijvNZxanV><_>85*-kY8OF5Vb7BX4 +oUd(dmqS|aMc>#O!3ZD4)f_rRpmAM$;mC8@ttk@?&+37}Vj+3QoYl4D*6I16q5J0s8RPe)HT{SY}7dU +eQq?oUBCin#YyUjsd-73wiur!%eZL@2egO~)I>~LlS?>qSY0(L0_>ARoq229elX#w2gE);}D3CK#?aw +Y4eZ^cmczmu{`Hbu2eiwWp%QF=1*_xwOV=b!_s7I=a=V_nr2O_RttIx1*~MBMLIm?UMol}R!?Iy%aVR +4GH2TF!)Hc{n>IsDmJ|$yn@w6=Cy~K(J4b=-on`@6TU~5T$I@TqDSUflpG+M5~Z`>V9;gb~1ylgWZjE +=YKrEzzzNl&@S4#=$^jHR(fA@IcQMTF#Zr#Gkw<`%zqK{4WT@i>`eXMH3?}YG*KB-(v>4Tu6ZHCR6ri{di}G!r4U-T-S&C{7G*fj(yTK?h +v<mr99PR3W1N&Zoqab>N|wJEfLu`31_nh^#%2zKq=*q=nAaAlDh|Y+tm`gJ +gARcv4p?ZTwMzy)Wu>|?-wA?g1Pe|&9HGCC}2b|!Rl5H8i3i;!~t|p#+_mF(za;gzW_H%_tmv5cCiZs +!SSLhj~kq|Ma5zG2^bNqK49Ou_^nmiFa;(ArFe_N5m+x0!FaUiz`($jt&(63mI4IkGA~Jmka;H-i+oe +U!WJFh`bGiPKCY#ziW_+>K-$^TO+{{pS-;GO??E%bAM6Sny0*c*su-;hfeW%Vt#YmGwDw_mO=|22T3GwX#CUnHn(znSF +dNJ;{4v8)CrMZfSyGMRxaNDDG|!Ei$WdJ>C*uUaOk%60z9yHI}hZI?RDPfVgbCuk>GOHt&@xd5djdQ- +Wnc8dbgRQM^E#bFA4NyM!pFm)Q_h_unlM*(o;qS>=7}BhOH|S +3#vEuQJ?KO65xsO91F%T}wIh4PsgHhjhY&tT9z*_p{&z^!$Eo1!&FZmpI;ck5&!uwUR}Y8aHIsBUft- +P@*uo01nCvv^ae@)k+pr19Z3s5+VN!r~}Ml2|h@ffoG?GDAWoQbf*`%Km)vyn?0FxU$;vW`0b`Rgy>| +l5lfArDvSLhUoT22S8_FIm0edk@LYU3Y6e6I7_Nh>dm75ffZMzT6kb=iJx&2V1SjH}BL`>!6Z-wu?WG +3%R6Nz+u6!(etib~>+}S@AR2nlYkRhA2hKZEIeLnVBVAqmmAZ&Hk)*x@1-pYpoG|dPFLQSo4{0X9P9N +db9MF)na)=)(AVHK;d2vxm~ +2(<7oN901M14=0P~p(CJWzLUHE`2Ig1G56y;b1a-;e@q+*398OP?To|e4~`FE5+vVX?g44*!Ju#iyYq +P;W7{k+l>vVL3Z26Htj*{39a|eDKOo +}epWmuRj<0F?v`Bfe&nHcJ>4b-d0kytBR;e6xQRBfYxOT_uJcRzidH))pNWemS&;pq|pOQwc;$iitPP +#Dz*K!9z5J#4iDk(!rjy??Ms0`usRU3cVVKC-h`A<1>BuH_>F>eUAHk4lzl{ot7~UP56V-hD^*Q9gxw +i`b49QqcncNH%rV?p#u{RV0l-ZCo-S*r?E>p5|$Ok4bu2H|~Vr%`NC=59#*R0ZlFw@Nxzgl;|>oWIYy +nU1Y}d?%|=CzseE|2EZ~Ef4g||nxrMd0dixB0)&zXm@!=CD-@!}%=P5~z%bLcwFv5XIvf)$5xGNj@g#}TU;L=}FRxvM|KB)+{xNSUkV +O7+RaSjr%rRglU?Bx5_xEyPS`u<9KbORerysy$AQIrPsDSoc(I*mI|Y3!fjDgCNRcpr +sy7|2u}n<{(nKHV0ZKhTI~RZW!yhAY!Rc-siDSugVc^2hzBQJK_5l+q3PNpx2l3WKBYk76Q6JF{89UDiENF`5!laSwN +H)Qjn1TndIl67aUQ*cnI=&<>D9=~Cgp;kc12K}M{LpC@9yZB9kCUXNax@hSAAe8VF%kGc_a>#n(iW_J +Q+!%@0Q{dCmOqdG@z@DseF*{Ixzqi0Gi!Hm#4Iqj2;^S&ejlVf?=%4lq&SaihjKCdNPk-V%yew?e`It +xg*VNCcKq^m=W-4ev`1K8`Pv?G`u>dK-!9zLd>7&{RXvv%l+HXumDK_6?eZj8s0e1jLT=F2PFEl?DBj +CnTNcQ(}%{mPKVm_a!p2wlfj-hC(2XN~?$ZRXK&H66N4_@!6E8M!g^uL!nS|Lc`y3`y+#8VD$Fgfkv+ +{NT0EYj>-nW8cn=YNQ=kv?t0TT@AdbLN+qC^>SIU>FlnIsnMS}V1nq?@gRy}?{mE$*u(OpvPs3M%tN! +hv)1Q&!{=tJT$VUkQr#S=e-{ +mgcvJ`7z=}C1%)!2QqqVXe;c}x~E;@Xlr*9(_k#bNfzlaIam+9xE?F2LmZ7Chd*NH* +SPUP5kNR10*o~sj$S*KQ+yA53O{V#<;^}OG<84Sma_rVkl#PVEk7LN(_lI_Umm=&JMnDsP;7nwMmQQ8 +N<(?ty_oF!Sb^N($4#7e{RhuI>m7Ir@$i8kMVw%A@WYRWWHDCnNZvA8rYg?>G3zSiO&v6~IT55KP?Dj +aNPijA5y}PQvgmqxFuGX=I2xok_YOg8S;|8P*e8AH97OCnWfTt9;#7Ah;F#*o8JnI5AP_OQjf-Fm2!8 +s*a3RXnnEORA)e0Ou+Z!_sHA_#s2F+R4tq8G$kv!7ccFvdk(h<%ol}Sug$=%qW8A9~3`0OtfmZyK +o2|Xi^RamreY`+#JG5RhH*mpFO=%I(jjll@uAO91}|+UyLkZ*2!I=Eoq?sAPCcwXFM{^ml8BzDRHSFx +u~GbWKgi6Q<6I!`6$()2ui?c+rYq)031mVM>yUzsweM`*nni(lBq&u?{_`Ix;t8T8DL;FxB`>IdZs52 +uEw+Bhm^2Z!S^9)kFPR(0-NVq#{?}}XQ%uN#82=ul@gig_|su3%V{fu=(j2_L*OO;g454vp*a;fls@o +g{t?HktHIE#%kFrkYqSq-P5fZg1kIdygyMnq83xdF;C69vQT(^ullwUyold4gFb8pyJA_vd0Qa +nQ%(kzOM_V#2yD}Q9#3bL1@$l_G +M%$)`+g9ebQ+~>p=c`(A6Z)FmTpo%dWw~SxQ;<`8PL4;VGT5B67ahQzo1hNd^EsVf-<+CT3^t=F +Vfqvd8D=J+6L-;k$&^_&w$b?n)To=epX;*cUM!H)Sl`o!gi~O6+_1jhx`!Ue|ne9rW*m^1H~FNl%M(E +IhHFB^%I^N_w^iLAft%4?yvKckLltVG=-hWrP?%_Aflf9}lm;2pyyi6=HX+8y$i0gWSjF&Xy=`8bkpI +l8~+cfhTBOh|4Qa=naqZpzQ7@81o@n%&~4ux@yc&KBL!xo3fEG3M`m|^Eu`vmn|hG$vXGp64t0xO(oh;&>hjPsSU31|ir=2-Ui%#wqwbTNw9Z +p-ziIql^$g#4NssYxQ)HQ7K@;Y@h2?Omk+yW(dqn=7u3&J{W*Nv1JX~peCzJl5JEd<$=9}L7Hy30`qV +q4u{ub!_TZ-k%C0IH}k9YA?@nbB$cX6}@X!-7ij52shr4kxA(Qn2JrPrQFu`~B%y!4RRbazDO`f0jQL +o-J_PzWz}=OaV3tUjhgUy6KTx^c)VNxVBB4J;(_W*Ap~k0Xl-A00~iamEPqr22;g&xa)x6L_&89~NCw +bPl<45TNti;ADA#zF+|sh8cki`%kAD2JYOck +u#d4`7*~xg?8oygNqi|5gFqt)qePVAZ!T-Nuw`!Qa?z*7*g~(DDm +CzyM|FG*|~3|ANGwH_(3Cn*fqi+p4$SSxXk9(PFQmfN*Zh=8(n3$J~U_#>&(VHf%d!DUhqBUv<5pcr& +;5rbr400bMy?&XeW2L=HGY=HdXN1=wa+qSsdAiuG&a?58(J(?bKanSZj%YCTuhPS#=7_tvng +nYV#V7Q{o)5Z5!9#GB4)S8TqHzs2QB=LZ1%TzzG<82!ZIRO>)LmS9j0%w1;nnE!P5@0%{f*(_c(-$H< +Rb4QXq3h~OCn7xEP|k%PlyfuJe(*8v=>Rl-1~`~*?B9L-Ol}!|EUf3M$jcA+#5#VyF-A!mfJJ);K2w2 +UMpRkQl|ZF!Q*FWL;nG-ht;!uE;W(w}qNDM8Nw78fL5jeAKAYc4zXa#k_8eJA)j(vSP2ATQ`f +|C4-9%$oo41}*A?#z^USrZXGq#NrQH{holQ$)XQ!Fi4t(>^L23YD?=@z=uRZUKC{jLS>|KW6A* +4Q9113rbOOzpg0U>h2?nBWwD)vCnF_;S`cQ?qbMS;N0)PTcDwg(K5A@I(uzhs?b&6tSYGt@Oa{|wp;l +xV9_xLDj9?Ak(qO272c1LV;uN8y~*(;cs_aQfj;o5FBe!>MN!@2P!z^U7=H?0$ +?J@iy#AI#?=6tTS)zm1@wjGcRChaU^>xJTOM_n!RfSiw6Sp|LmchlZOx +DFPqA(ToE6W|nG-JgwROb(@c6_@DPx`$Yg#PT7{hX9GD5X@UNwPY&lL--Dbl3vb2#zlBENyT6fHPTcL +tWHU3Vy<^_SfW$Zq;Qzs-&U588344J(j*BAj29$?S?x109TV;3}6nus-_@&e#XX=Q>=tpR!98Ni5RFA +`CCZoupVO+<5)P~<&x-emK1_64(pFZ$FWBCy;R%9^##A#I9K;s5$almzSVm$%`K&6 +oa_PKEJ5{FpaO8-)7xSBcAj?R;U+zKbjp +-0LX89I?>NNVyhn-g%iR)xS{*_(ghC>J-gL%xTp@Xn!}Y~+w02e=J_{yMMzbZ>Qo=X#&SK{OjF2o?B9W7E_%cg5@3Stn!&?kdZYFxH_3tCkiv9!8!INE1@cNR+f5iir- +e%}7$ibtG;c_60mlZTiLi}}XdMd!BoTpL})d6VO1m6FT3fDn3kC;d5>0Ny`%^ZQdgx*(Ng +0(&hsDJeGJsE7}1mdwZ$Hl(rT>V$4}&^aINR(e_AOz6<6ZQz+ZGMFe%O!<_dQTy~dUI^exa^ArhtCr% +*T`d;XWjW_I5Aw+qE!8aam_3vws>2l?nyB!ef)q>SoypBAur*y~eD?a;pI@CNbf@vfOYkS}&E7Ig@tj +#ZrZRmM!|Lv3+)CbBI_SmcI8nfl;hv*LLZ^GKJCne@MRpmfs!qBcut4Iz6lkpdNpU_v&}mG#NT7-aob +MnO^w4y0rZ@0juwv4ep4gMIyfHJD=ynv7JRWFy-h(nW=9mY`$~jo2z!eduMq)lFNjTM7hz=v$77^v6$ +>snvr87DHLhcg%jSGr~8jp|mzBH3)v!bC3hN~=VYr2d-rzl6QuQ>!^ATuf^GVv6%Ejr}ks$y~#tQ_+b +@ppa8FO5ae1C{dmS_v5JjHR|9LN?^mbE!tkPtPB;A6jejaEVsc&qc0+<*Tdr= +X%^f8&H@iF$7rVS@?4_406Feg0B&ExZWWPfp=O$43$=AL|KcT|j!sIi7eY-b3Pxca9G+_?GMU>jT8`L>g?k;Hao>@znRYwHpjN6 +!3K@aX7&QZ3odWrA4xuwhSd9Rk7X^uPWHXbCBtZ6g6sS!19K!nbEzse1j^m;SYcKuCs!>dCecVGQV+m +{KWP8&DraBo_3hCaVjP86+8;v*E8{B2f=KDQ60nuKfQeY?v!K9T4?5*>xR`Q2}eA3xHEU{g)4V#0|UZW0%ITh{Qjumb?=@Z=1QY-O00;mZO7>PRIjbaK3;+PBFaQ7^0001RX> +c!JX>N37a&BR4FJo_QZDDR?b1!UZb963ndF2{iZ`?NW-M@lR5kxwyh4$5e@=%|f3odAaOWMQ1Fcj{Jy +USQBsifqO7WwZt!!MB%wYKBrUTz<}YjS2dobMTlAG%ib6Rv;P?QX}L-N{z82hw(ZM}=g>Z2nH` +fl0mB-**6KcRv2-{Y82HkBjqvzWMd_io9kG6SQx|ioE5rUy*lR&)bI9EAoN;F|cOCR^;Q*)$p~UvOm! +@JKp8x4Qr}ay0H`+0%ZIfL<}j;)mbP&o4fFh@r5%4b#k6U_<{xh*rcfIC7G2+PY>Nkf%j^%bV+SyS +R*}g~-Y+{_Bw6>(yV>Vhs7fdRoz*T7;jeWPb-e3cenY`xV)-zGTe}7j1K3O&=u!GO1-Q88Qh-WhdBn6 +p~$j535X|MMM?Uu>Q6c*FZ)}fOc2l-3PrALsAw4LOXP{w-~aoYQ8SJ>s|C5jdI{}V-b3~9%|Zyh29F@ +v$7rfZU9T=+tAw2P6&LCNHJg2(S>|5{?3HDfg-S}sg$I|{eSa*{}xV`{hManrc>!>`b7LBN%ETCFw*Z +CsXP$Uu0Ml#2_>5ry^OS5!tQ!O$(FOalKF`v@o~?9yIWq@WX(v|cIwgL3(*r){# +DtejfQn(R;&8;V5sc#$4Bp8x=7bg28{7g|deZtYp!6^W9)rS3%UQOTan{xD~M==v5<_&)4g>feU_DG$ +KDwZ8AezNJpUx-cBc{8{|hbN=fVDuHj!e0Z)p>CIL$I7K6@;R4r-RUb +!ww=9DyaeSbO+3wa2hJx5ljgJfcMZ`l_~WaIhje%I9ZL?=jh9WU^K?C{uAh+OQ6HZYcNIf}G|jJ{8^u +Mh}SAO8zOQGp#To}CIPaWL~^U0JakR<|A2O2p(hnUkOI?HQ|>tw1?JT9ho7ZxS+`awdm<#9W>(o^2}* +v_B@Hs5L2_L~*U~5~y8=Ln9~Kn|;f{VTyFzC&^YY_9w$%*pejK<7BQ&NmXeW6Vwb5dT5*788HWt)UcG +Th(2fq$x}5yc})6H7?GD6@TH{)-3K~16iQ&v6;w_AUY$GUF{0)BZIuIOo|uWignPEK>@{Kr`<*hn$V}8em`i7&}$x-j<)EH(M#&8ij@mw^hGc9SzdC|m(UfwHlXL_sZ+zpGq +UTWZ)4-lV{fC$YtO`b@L93gsLc<@s_j&WP+xlR*cccxpeQ^QFrdNgBq$695?$G +{1e(QRbrUIMINPA^X9r7X9q<%Hpn;Xu+;GEZc~_VPy9as@6h{z*SELjJ#DU8rL!V3qq_~Fm&f$viz=7 +^6w&5C^rHDmtH?h5MVcnjI>vKYiv}dY`av|I9;_4s@}c00@ZXS=$?b~C|1&<&w#3k+3kF2R4*tVvdH +R^@=DAp9Cqv2Qdln0m{d%Fl;Mq$0H_H$OlRZFw8`+Iq +`{(jO2^~ErrtA>Oa>kaFn1Z&T2%IF5*dC#rB!7CC?2iq^~r!Qb*=@n$#SUUMd|8*(jPs^x%yO>R$?XV +JX9^MW{}t=gn+m*hjUYt5ZEry5vIv>j1|+JIWFp}z(1>r8QEV~exO9b`PCLV3{tz0u9>!6$R28XR4etq>4n>ie9$1A`a0=s_-JctpUuUaGS>p!R&r(Lp6Ktf^*X%{CNdOk{ +h&;z8h=wJo1gJJc0Y(tM$74Tuc(!t$8u`yvR<-xZmK&b?ECrQ?`v?tGDu^DuQcy^K(H7FBzs<1sWw+C +m;>T0!et%+(VZXn3J9+1<8@HFiSRLVKRd~n=%mw6!iCb*wDjHeOnbEEHkAU)^Z3r^ +4N`yhLKVp4ui=ny?Qel17C$=aq9Sg5euZ%$H*n{ukS4zh*jk^yGK9yYm$ei$qqns{1Hh)Mr^ZKDFVlB*vh(+qoizccyb2WeMkLl(yX48gFyVWb+m8u;@Dt}9j0U;-svK~hzAd!%6PngK8Rp@*^xd>{c +4vynKyhj^+g6W?nmvEH}bsfFQb>0eM`s7vFwCls^_SjwGXl~h&J4p3GPU%blmhyi{Rvv3c7FBj?!d~l +%uUX2!`1f(3qbX}$;an%=QE!$d!mZ00CBEX*XY=($y&b-KM#o`HKUcR7(p%h~G2`d7WfPK;(7r@ooj6 +60mpumcw`q61L+c|!f;ifkBP}|vzAQ%N&fY%Jo57mbEFKzZ-3l#;Nad;U8!;b@7gg`TPP-?0kP+!C|w +{nm+SVUeZoqJFG4VJ~vPq+FdLR?X;&WvS(E12#t(1N`w4R)pewDcO?8n7W#=t4MJj7Pt-^(Rj +}c83$5F$g8URW6#vDQco@S^@YMF&rR{JtbKTsy(Rbhf#^ZCDkzQVs+qwVxrNe>LG_3wXVcy)2nn?` +K9tei5R{noy{Bf4vd|1Vs2}IvVW#3Z2)7nII{Njl#JNth!`cbXL6^60MQNh3ni@wLRi$d{j;dNPe)7kw%h7%mIM$1s_y)Bu1PV-X0eWDQ9=k`c&yJkRQJ{&*aB6@wJCb(T|E0;r< +h2uGwr^x+aMHd!RcQLM(`a-v;e4K&`4fdxxZ8m;>!A( +dIF9R9*s!}g#L+D&Ddx{BmriS1uy7=m8NRR2HvY+2)C?%L(<;f(FxhevLyr`*j8ZS0C2$yVstE6Y0Gt +M3OF4|7M^7+=hYdT6Kc;QX2mF;ZUlb{_XXOm +$a6+w5yi6bmyTkH4k5N?dM(4 +v_e#6P)uJbQq2LJ#;761Ss0 +001RX>c!JX>N37a&BR4FJo_QZDDR?b1!pcVRB<=E^v9RSX*z~HWYsMuOL(ukXBphu+SFN7kF>PoJeWa~G4oDgk>x9SnPzuPtP7czboH5{L+Krp3aGp|tCcGIlDXZs1THj_AQgQ|KT#lB75 +hCEYcJx&{(Oo>vM*hZIa8>`F<$ToE}r66n(9h{fHkY5cX^dvyuN`L%(J&wx0i3mWPW>cayp+631JT_R +tCX$YEPvsq +X5mIsp>S!47s04fhf&XpT7}MF^=XzpSGB5p$u-N0N|%)$jrb;n)^tSR83N#;bjURntDGuDjJ2CW?%Dc +xuH%{}v10HMbkC+lX<4tR3JyXZ!bOKbH8r4Kz}9j!8lkI9l9|uT6b|Lwti@S|lCvxUGHcA7QMuZ=V~* +YTcnEdQyeNt+4*?g; +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 +~?U_t +xEpJe#eOvmDdiF<`N4QBS)J!`SC=Iz8=mk-BJy((>9$bf^>DcfCPp)kgBp9r1p;0?&qKJCB&%>>t?c_ +4Dzf1neYPkjmgQSJ)Tw|5poM>xKNCca!XboDcre?gdP}>k{WxaD$&sUlzO+5YPTqiu +0YqW7RDmT_VO=LHfY;BcdCi5zxgb!TeKIotQkL`%C%v&$XaO^9F ++2BS4ZoWE<9AxK-y!L?a+M=XGwnmKMum1-EzbyH>dAQ8YVGKVsTzG1Nd`KcyHt6yEuW1@=CHQGF#TZ3}i((p9)x=EndAj{ +HHklC%lYm8}|6TkG7?*hn(8qZ1j>}w7PL1>*!QkO#>J6w2y +Ir;HS?8{c7?i3$LGfv71P206+ +#ZTafJuI&=Agf=(i($t!XOT5WoBy>$rokBo4EG<`b}*4+LvHu^EBwcA2%ebgVA?f!*w8qY)Ao*K2G&g8b@)HPX +388(3-e^dVvE-MPuc4cGtG)sCCY%{i#ZBV3G2hR}**$g|mOyl(s`h- +T_b2gyjv_u9J(J4m3Lv6qhtR*57w{eK39W8V`&*lEHk`*v6Aj7j=HmcU8oO~#Q#7Bo#WbX%eUa`2cku +oP4K=bVhH^y0e4~Z=1QY-O00;mZO7>ROJ13D&2L +J#}82|tu0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!#jWo2wGaCxm+ZExE)5dQ98!MP|Z1Gch#7zPAYG +4u^6P;9{3Z6AVwV5GCng%(wka_as1-I0_mT5?(kGZ0%M`P`Auz3|A$U89X-N^dr@-ppip)wX-G+tx`n +TN}M&x^ay#7Fg{2OQ;rX=yQh#@mC;bduCv +6;0rJHZYS!h1N{MCT4`VhwR;nKmh3^gEiV;_x^2#hvQD_xqO=NZC+pLnZ{EE7^l1tLUrPvc>jp<{?~K +uA3ZWY?!Xxs#R;ns|b7w?(52ll{0mqY$DN(p=zjRsStd;7p*^J@mLuefEu=MT7cX`hhY(#nB7F^r#=D +;Jt%h_T|5jla)chZ)f4ybKwfLGEiS*^`ZDETk&M!4;Hyn|gsh)%|5e1D5`E1fonDcA#fNTA`!jDKCCX +X+N&2^_7p;bCy}g4v8*8bL+p+c`4&(YIxs*J1~pFJ`k@sf4xB6$3OId(Pt8GdG{l{qJki88A$kax3@f +DmVpp(5+$S2)B$JvVsQc3hGjV&1YUhz)I}*%W!xzt +xsUn$|hx~s637ihD9e!*G`VZz=l%pNS-oOye$MTzUMsN9xD-a*B-U?33N=_Bhmhekv-IPW_JR|b#=qz +|sV)K!ogwUbT!Lu-kiqBjy_&l{sR>?V5lEqghz46_ZCaxKBUVtJmQL99#yLL*BBj{$C0fO__&W!Ui#I +yP&K`Zhr6Qm7t6LG&2rW%N0cebo={iKt+W{!(=jomo)p1zWvhzv(*iO&@B`F|*P*n;!vLKf=?ydYCUy +T2|iJD-7h5E;Owx<{=Kpy*u=}y)eam3b+=na)q{e*&50zN%t01Q>63qGYN6%^;vQ<&0Zq*)smWw_v}t +Gg&Mui$3jq{A%}R-=AMG4>Jn0(4qhDRwD>lO$1N+bHNTU!Fo$e$8Bo{i@I+|iW9Erqny}BR(rV>*s!J +tc8sH5yKmYX06Ldcv9Co%acTBqWVmyA~Zi}9DF%&B4lhviTVRpF`YfX76L~d}e1|GFq-1y!0a`U2*o< +c9BF;r^#oiK#GI2EmGy}~U`t`C!m2d6dJD@qbp%&nufJJZ6M^z&XQ3lphl{#Ms791FskT!%e7?wFWa_ +E`K>`FxllF7>;$+)yp%Faur8YjF53-CqdaD19f?5Pi8>Fx&j!luu;)4|S>93UHf*l>sc`@gx$;t34>) +_+1@MWc{+(>qDnwIhFOPW}*CwJ9=GN7AlP+{E^iElOX%(S(yOqMJz=Q^GzvGz3^e4{hu4W{E;U%O +yV9+oba%!IsoeRNccw&t-bi$VvBCPVx4fXBpLB9`4ebatp^r(po^Nbjo~l$4%(veA$ub;r}v)Tn+~dJ +>FN1*)F$T!TMfT{b!wCQj8CF9=RfSJ_GQDR5BWL84z5CQomo)RV9xs$xZV62KvEV1a_?BV@2DK4Xwid +K<=o9hxfH^2pY`3oN6N2K@JK|Jb4RXgAU|P#uqi{?efs+&A<_@LeZH!2E(ve&pW=R5jm0|d2xRvNC6L}hw<(~dkCHp^g<|lW4w|lyda9&ZlFtGhk(8Wyxi|)>&9!8b` +egVgw+Q9e;Uz$jJSdF;;Bb&~*t^;bO%406hsy?qaDQ)9v`m=oZ!7+#Zvt_V*i@j!&nPRI>Trr}AuZow +B$)|IS37Y*If1o@*(kjICK8Cgy@D%p3Du{dYS{ +6UzyOKx2a!g1=nzokIvc$AN8)+m&NQIjZDX_t~=uy20UeJrwRhhr^z+Qa4y>(*0)Gi=1W +-cRmc_ew#@55_1?kY`BWgNme$Yayc$hPC~`sRI}ed`I~9Fii5F|aBJ!v5|1L|Dx5yy-i7W;!U>27er_ +508DJ)PZcj>u?n9HNi`VJiiRQ(qCH3eeYP%tr4;0i{I&DA@6aWAK2ml*O_Eyt%4K6zY003G8001Wd003}la4%nJZggdGZeeUMWNCABa +%p09bZKvHb1z?CX>MtBUtcb8d6iPlYQr!LzWXUecUTKu9-xQ8U_10Q=mt9mCsA5a$8Ke3p>IDWX*Q1- +N)0*4^7o@pso6DfqEnWW4aioTtRf$niZ+n5J}b0GpyuQ_z)K+=U53}_g{p5c_`aMdK3vNs-bc_K5Y0s +J)fcz$jOYH73m>%k#cs!Phv$|U8?-?wRbdT{K4Kn==C$Jqo%7%Or2;uoW0N3Vs}(#wC)3&t_{Cze!_c +zzpdoI9$U-@tJI-q!LTqVJRxUrSyYO>j6V;psyNQPHu@6aWAK2ml*O_Ewaha2N*y006}V001KZ003}la4%nJZggdGZeeUM +WNCABa%p09bZKvHb1!0Hb7d}Yd4*KlZrd;nefL)od6@$={(t}-mhJ-dVZ|`)-JmTx)+$S?L@({%kFsh +f?t;!h087-lkUFs*ybBE2v_;VcH-Oi^sL+e7Imd#7Hosrhr-RO@2RXP@FTP>=|=Ih->IBD)75|4h>%gy2qO?0!tS^lk0 +9oBt|zI1<;h#adm)Ix$V!Z~s1L9|5%_`@!-3;LT)~)YlN4c>BMy59B4gE78SDxoYTUS>?~ce* +Gahmzz-=RqN;sPEMh5&Ya6_Pwiu!56Qj9%lefuzt`ShP)h>@6aWAK2ml*O_Er~{`FBeJ007wn001Ze0 +03}la4%nJZggdGZeeUMWNCABa%p09bZKvHb1!Lbb97;BY-MCFaCvP~%WA_g5WM><7M~JG^#M5)T1ugp +QcCY;ZLQ;_vZQKdsQV-)S +J0$WYL%47457pmIn7#59>eET|I-W%>IqQ;2Jz;iNi^QXX_aO9Nj{K}jRI +(a7X|qDs*0KT)v +7~xxKON?)YZQIgOF*D@bGw3LJl;o)C8rLCZPk7Wwes1^@tF82|tz0001RX>c!JX>N37a&BR4FJx(RbaH88b#!TOZgVelWNCABE^v9(SW$1 +>HVl5hUm>^{-~(K5eP}lX$bfC_hGJb>tR41H6t2$ZUDWt2Pm+@!g8cW9l4VP_@4B|@fCUH=TNFipBtK +FX`&KH$YPs8qX1CfZxo76k;{QyzrKbiI-_($?mtZpXs%vXlIl)%6c_A7UXn37(I#E{zG}nITkM!b6b1 +jr?_RyH6O_k6_iA`sOY;?Zi8vO1bHn_q|^Ei-L(g5#EXzljF;zk=@*PLEHQA(<%ZKA2*ectl&itnJ<( +xdVUUbweE+m}n5_h5L%4Iey3yFX+nF4Q{L-KJHt1U*=*x~2hD+z4}7Xat@f_PCA)tX32kwCmglDBpp3 +X5Xbn(eOPK#d@_`l{H6&FJ-67$c}Ug#P!*V;ZKqzzeB4)V`MbrOxxWo3`oARlCLg-pl5M~$+5tMp4OAHebQc}#G-cY0CokB;2j4R3U(o&=Iw#OZii +@Y<=fob@64-Ui<(X0Ehs`4QVsQX&F+6ci;+WteiWXd&@GhA75qgQTOH|oJiz%6k?!HdbWlY)vf;^P)m +fZRl8$1^1!>c5?|9b +`QAdql2(R6**yns8L}tC@e^!$Hbk8jKI3qhRfQ?24^xRw)h?oKt-KUKm@?_rR-1&4|Iazp?0Z912E$U +E6}#0g_i8)O*KVrP=M#fI!0&)W6@UL3}-VKxyh;)jyM8;HW)d;6?|_*IZ+sRhSiLEO&&>D4+@_-&hB1 +e>QZAp(fAXE9FOP5!3Pm~2qsj*I5HN-*O2a7A`)$*`smR&SVj}Im)sV(FC;88|5R>wIo3C7E_u^PL!q +fKtr&1s3sk;=l4AhajjQvCVoV;ZX8|!>x&|e-2eNc9vF{Os7Y*8iCr{Lh(GCif%0e@4I6{Hi`Lz^7$c +QxD`C(8dYRQ2bnYBLT?6I^h&M-s}7_YTtH&R_8PD*wZaB|CFy=l){)E;Afe_Z@}@%+z=9Es^Z5fhbHW +BHtP6N~i5=mJTxPXLsGnjwpFq*{e#CDmb~ms)}B%os32X^huA$EZqtQV-x3nm5863QHsDG}E32sa_qh +lZbKwz@>cd5%1kWX+2A3pU8aha2TUbKbt9Y0aj +cfwq8)Di7oEFtiwPhS*UJyRPWpAV|pQ%NBzTk-ibVk4jngW%|{s4w&LX$yx2XT_MJyiX--Gi<@Rvjh& +==(ek}iNdW}L6><2mQ>%odEwSR#?}Ykt7IxI(e>WM13Jplr0`-z$h=ODKY4i +!1$wqfZsYkz(jar>`GA_|CUAh)MHUSsW_~H{<6wTv6Ycmw579kI9^$DOuxz&yL?;={(7n%MN#ECm7;` +wz#{1Jr5f+xIEM?l+@{YJOgC5YLdAUycqd;V@m}^^203Qny&AG%dR9&bN&vyc)I6piVT2BsckR@8du1DL>Jl+@lz4tW^{BOpHkzotD8Hd!}=`e{;T<+537ci6|aYShzw;)<`k~ln`g+uQg8B`jx{9fQ7;tSPYY*z>i(?fG~QpE{LWMJPWl1p{mk+oqCd~6)8X(YCMT-re;A$t`7lBYBi=`M)4 +o^o1~2aKjp7S~p1bIT(*+p_I&7Zz-0fuF>G4irJG2HQS-kEdipVqCeR7DXFwha5>UH&A0^LUu5PP{mR +>EK3<9p~r20zkpJdAOG?LA^h1iXTqaXPnkp^wY^D^qa)4q`RrUmW)_U_J*=R@OWK~-W#zVX_AoqcTuh&bOI`&hI +kV@*NdvTT52=aQFl4@(70!^Ld?%H5>9C*CT@TDMc%@6OmQUiwNU>=)a+d}$s8`ef^Q8f}Yg&D~RMZ(z +~+@{}_*Tn*gfM#nTwc%(jL? +}Sr?!~V~y%itH0D39H}V!4XR8aXHW~Nd~m8|q%~f&=xN1&ZaITp_`0jO#h{F&KW|M?)5oJ*IlkxULki +vkj}%a1z!gvyz~2{cV}EU(q7O=wUwokPX&}-$c%jg|#$zK7fT}2pPNVmbiuY{gEoId?(Vb4GA2d1gWP +%5TL=AgtQKZ6OgYqCPc`!DBA(DV*0ftWKFct#(4EJ#q&=S))>VjTiHqkDUV!bnSO6rrI)s%yz(v$8h` +0(kSJGt{Wrbmm?Ll_7)Ym@CUlEw6FBk%w$SB%yz+_wZrVRnWUZ(REu7>xmD&uUeulVV4D;gy4wJWyM= +aX9)tv*wY_6#FK(f1VHV)T1=P#X?)&*Cx_56NaIN(@zS~NH#Tq?GOIS*~Jc|eKnd@-)D`>&s0x&80d) +S^}OVaA +|NaUukZ1WpZv|Y%ghUWMz0SUtei%X>?y-E^v8MQd08FOG&Lz$jmEAElNx-$;{7FNX}15fna-6*(6LcwG&xBDz-;u$-9+OR2T?oiWq?a2Mvhkx}4vhck~H>mS*Q;R8wQH(f#` +MyN^Z`MYGF|6x*z<#jbC6jgq2Si*8dYv2BXJk^-K(M#wMp?tNL`oiYRhf7E^bXGE#^0ApkALVp9R85)5Im24%(k+)?007NPdg-LR`IV3JXD?QciyzmHOz`;iRl>{M^c4?_nM6$ex_3-Za%5AA~$KoOb)y(>Clj4FDRAFl6eQx)GN6n=~YqWWDn$ +<;FWSvy6;q^J_ZcN0!plPwV>C39nW&qTG9V*0=@oZPtM_z@b4RHgYTHK%phhScsGVu)2op +t{FG5ZSR}rP5=|dUr#RtF9RagU@)cl{ONr%qlqB@eG4+(k!gipWZ^A{1+4$r)F6XsX=N*)DN#2(Gch| +c&0r=k!c73xMDNK6;UB;NypyWg13eZA2v^&wec5g1Jar*}cR1y$lC>GTMsU#&%gDjOzn1XUJI=fj#1_ +bwSD8{G{n&Irp1%VX?PT4}&x{T)7#PtOSo)D)$fC>$FLlonFuj_A0LLrL{JI+KOw!w +Eqw+#=X9@h5^L_&>vmJ`9-X|1@GEYt^?h&30wFA=#R@TGW=-Iu4LG>^t4a{EnnR6YJy>5n?dpRS7oDF +hB`eaK}ny;sW%fVvK>{b~htsXi=2-IpoLBTB^*U1<{~H3F`pleO8r)d3S>ELWvtt&R~@=&I)yJ9{Hz< +ViA3=@9Jh>M~m4AMp_N%ZzOf5g*Tk+%dh3sJP^{TlV7^$=)|Kqd;yAHm3fA;`24;uk{uYEL=g>>`Nj^8!HTMx@z(mXxnXK0X +w#b7`#+=yTx^@Af8O%hXPUQkkVFmwQ0s}!JdANHeI(veZYTJ^v#nKD;vaJttUuP*hh1WR1CobL?G3*?j|IRDfNpnykR6B{Q(9ti1(+g;*?MA)k=(KsNKNMj^S8;2k0E+LpB}taKj{@Uk-^Z4k +^n6j`MIl!zbmt_OKJ2=J947h6qiwl5kxL`-5V+PU6^h*D$^@QWeq>wlL?L2xTyAGMVgP>MCRZ%<{I +n(CTYKtDx;)2`SAKGWGzJ@*r6=>H*OM#{$`K2lA(81x~)o6s4{x)~@Tb818{CDx|>P7PM7zFEgdESeu +iPyo%BAoC<{0$VKsh@RXpVj1SZXkUtKzP|uK$x6o6fHxpk)cNztbfi3KZlG%=2;IygK@e;5V--0tY +N!mc!pl#cH8XB35fja1swn+6^(G+oDjU2sy;wIgUA4c>JT}I&vl&#vO~_6Y-ItI&z*v%4?qBU%5C{~h +%MS|y)JV!-sDE}41 +7TX>JJQxsT@6)EKtHWSQW&OLoB +pLftC%hnwYf%3je!`o@NbN#PNdv&elJN1%RCfq?j>`{;J*=(5|e7!*JZ$MkkIlO>C4^cD`9t{^6#4I_s +;Gct1bMk@zox4K8_A2tz;OH9GXh2ut7S5@G#erl1lY=c%IfZaF+s-3B968{a*z(|Xg{5of`u*Z)orSa +?QzNXmX@riJSWtGrK)kC9`9;r-CQ2#*SAxaH*$G+t6zivW4s;4(ZG^;eMRRA~w(?iIDFtv#U8tkoZkn +bVrpKUlkLP*yRfh0+^9-+-l**OEJV125kZNA1N%VI&`+|MvYe*@MO%&Lt_*q~BIN*P#)2A5cI*uyvG2 +muW`mlQRqX9~5xuR1ZmlLxRq5Q>xt~xg!w5$|o9tLn$ltqA1ll1oT +2y6d{l^M7Y|>sDTKLN{vk1f2iL0sO-wiJ1Iw5QExKAFn~#9Hg|l%Pz2Lf^i;Tp{WFeWwt02E2suv;tr +ZO7n^M@!wcq)SzOmbW}SpynH +S(Y(YblF>N)QXd0y#J9jKGo`u*apL8;F=wGfvR#2yA9%QDDm=ge`5J$OB${Fru**w>i&bLL=xE)e+1_ +EAtRI`s1`8(cPoD@khQsS>5?0cVL`J{xQ+C0qPu%MS6`j!Uo7ptCfH)4gEqEu6e0lav8Jg*(Q%k!%m@B0Dai76M?Ylc3=(D*AsW6Ve`#cE2!il4^+f +WO`%Rf|XozZTdoVUGs2{DLIt}Eh7^)CY70X+pTb-ECBeTHb8R>lBPi>kW?H>tk6Dvc!P;3VuJp@yo2ERaUuL1dH%^n% +Anyw#DT?gmqQkzb8{~^F1wR*$6*o|pV3-~x1Y{llZ(s9GgHc2RoX_e4b`shnaH}XEpJ>IVOpa(G!2^7 +5BE(Wo$XRgIa;|k4TTXW2;dYujNKckK1`*IC75fBEr&mN@r7IO!OCk~dv)zjw*eACBu4JI%Wm}{;Yqh +AkTeD+U3HlRIzbGqWn>hCMtF+IZuM$VU}>MF;y0}l6F(F$i*D-XwP(31 +B_nqbsc7xMyWs!>@u3R)zYbiaXM6RA7?p{2l5dyE~mp28OfIy^s4BII%VXncCDeFSBwk~-rh0oO9%^{ +KEs!5$2?en}2H))8%{uv0Y_{Wuz2KLHcb~O25NB|?;*=|@xHs +0-pDHcHw&7ADo>D!C>7Y5}5DCXCtI^D(N%O#zyUc)a#JB{zP!JhIRD*fZ^7(VbQd4o)l-yh5?s?Oex( +Q?Y{;6sCr~KbUtDhdGTK#C{a7%V0jY<$wQYzSM9^N%YFn_|gXdUPHu<#PSCn75fY<-j!>Z5|VV?(ACs +H#JMY@h%P><<#fv26z7!PbMZF0ogkB;8o>JsyHVA;juE=eEzIL7Iu;`U9NidE^1S{OQ$COVDu+VtQZ! +wt}!_rQ_1N%&C-%jW5l8hW>^U<9%rzJzr-vAQIQ0Ul56v ++tuI}2yGO(z|fKOcKnCN=rD(?Q$-82_Ds%x&`#7!I~TZ;)encO}F7YrD3Ah;WMuETn8(Zfi=RR3&mqn94PB +0IQxuIAA%khhw*Y7*k#tQ>3`k@`=5#0DXI>{`Zl0jh!vMUPuJ66klQew`h8|%W^B5zI!bA2s^Cc{d&{ +!a@V(+MC7`s0$MawQ_<^+!lv=~cba4TZHX){^tUJOTM6yxz&RFNx?b8(C9Z4;=WefGb9;{w#Ujgt(+v +*6$1wWRnyC%wSiLki8_l;cAYpzvTeob$6_E(ug2OGqda>T?vK-J6mzf(|_6rS=3G`oBsG@n)-ABa0iP +8r>e7h7~3|0t7AM5D%-zzm7DIQJ)$o@ +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 +hP@5oqqixjlIzt@Olmsu^qF +Oy-!#OR8AESH$gH4)~RBcH-F&#b1;ZO3k+3;}T!+^DhW?%^qf#8 +$9dMHF&j{1NyDeE$L!56Ad?lgSQJr(dEUJ0G`9~P=lquxp=zvW>$6lVkW*|e7^vh4)X4dtWIA_>P{eV +v@}DfX?^}DznTA2l#RvZ7qgDxBtU<~bTFU#_;TtpnHGXbOzv2 +7dw0Un|`39*AaprdEK;7u!?<{F&!i(6bjAkF31~W0i?j;=@lL$19&xTdfi8nlC(pntDBiUg+ajh71OT +!u~83xM**nLcxchM{+tols!RD7X`Tu5|YgkIa!^b{wqC(q${M6eYcO7_r1cKQ&>$&ZuUtql(s&u3dMo +9_MndlQ@uaR(fz7w$|Z`LES(a$Ap*#%QURVc^idYXpK$KV +2u`yg{!Fx)%!q4T2V5)h6o6(?KrSO#In7yown!=kL-R8{c-b~^3~3($oyZyTc!C3`F$=oHGBk-?50(o +f0ET4>ic>C9+C+}O;_EC)7sQq+VSr^m*lC&ycYq_wSAn$wXBn_-vj? +5DyJ(u8EosNbfJ3tb^)pY4DPRaq0t_v%myoB0(`P=z37MAJG$x0)xWnwbp3rgEtmBzyAItzBS)F&>#A +ya#h*`U@G3p}74=0X~l_L_*dLYQ93x^gZ4Qyym0gpw#r4b&p$^_HX#Fce}J8VLB#{S*!#Mzayc7Pq5w +*`xTwhCtgtSNXSc}2xn|9bD9T~!pWY#U#5SbTPk{PPbA26^Li;znmg=+ah%8ggc1K&>rdTW?RR6y*8k!e`2S*7q1#8NP= +_IcJpG)+72U0YGufR@h3LO*dG)^AEQ9Vhg9t0I?f()z$bXzi?d89bB1lY&pQ*x;&2I*S{RN$8XVp+aB +XXfQ^PR?HaiF^<*+O`&4HKHx|HUWOZ6(59;2MY+|lvla*Bj{oA5`Ib72ImAG&@*h>B+4yPmGg3q1Q&Y +6cvm7#C18nb8rTNKuMfULG-fc0C@+7Krjbpe5f6^!WE=d|RU)z?&cgoCrAD438~(6TW!cuOkl|r +XY`Ic#anlR^ggZ(gYT>0BmH?$k&UF?7f)40sA|xGYO*LzRgc`ivNI2F}^=T!gm0(jQ>)M|*$6_u?&1f +_^6_0{ddM0J9-B0LoCD*b#@HGJ`a)6Xv0o+)+0U!NV}UtTX#^>c4b1a7w=35q~vdwo7>z{ +*SY4%~GG0fUxCel`j%VEZm$f3P&yj6ir*yO|h!ZWrxm|SA0a@5i0GEpo4C6tQm%a%PJ3Rw{LeKDwJJN +qX<^53?OSpPQGa>h%u7t$LzU$> +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 +YI=H1*Zp!lsc+-JG_UDNJ$u1V$-;3Z20 +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 +y-IH~!yH9NG790lL@XK;Db9*$w +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 +d6@c`ckb4rO})5-_Pe#@eQF!0gblN)S7|^9W( +STHD;(*r!>@y$EvG0ABp9Uo(TMGh{nqS{Bv(B%a5Jblrx+YAm&>?QR@bive&RU{y$65b``k&gQ+4hww`o*lM1F~fT-FKV*dAw*p^Rj-&0nN{?ja=L$j+azQ01vx6>~;zcvA~hK#Lm9K5pm(BO(Y&y-qu&<3T>xo7W-23JFONTLliEzHam4caAUwS3Hh +sO4_#1`rqTJfL@SWiRDS@M;mJNOk!p=v2+*ZFh)55p_x5z&lWOgT9lCJNUHix?Z=pBb_PqmxIG6muS# +ks5ANA7tJ>|U&6MI3tUhVikISGODIQCSu*Q@1BUN5x8<+M?Ix7_Mefl5?ny4DmJiKX5|_kcBpAEs_JNTPJr5h3not627N>->nP)y#~o@b#X0N<=~g{?1;G+Q^e!qf!ed4sS8-5a3MNiH>J?j|m +9AH@UL+D7(^-oZG@#)IdR#|JN-9!#h4Y;dZ^gQ~~0TJN16eD{3+6rR`RZvX((6*Y1;tkyt)QpMldrO- +p|f+03f|EL)o#kUr1zwT0*8s>K?Otb$J^6iN(yMaC%Ki>Z`qr~5?eh+M`#>`!sAU0ZJ0Lo5HUQ=Lp*D +!H5;&Nxqt>Y4BCgZi|S&dfARD$*E$33OWQ% +j5TIcUtYh!OY>8taIk}N3_w|bD!?p->bLw>Rr9fhF-Ie=k1_*tewpfKS=8uEz3AvcRl34Tv2#$bn99h +eqM=J{g$C_3Q!K|EFIPt@lWvDT!W#XbFf!n_L^Lp#(nLA7QrSsx)yG6sQh?C^u{%%5dOuiA%NtB!sN$wC>`wcTrP4$Rui*j8lTy>9u?=L==9Vn*!NPplhkzvQtn0gH&mJGtVfF +eAE>oI}O}Jszez$+-umagb<4JFaA)aU2S*|u+M6wEJjymI8DtP(O&Cwv&A4A}+rkHg%VW!pFJwn^~ss +4U7f~rlEs;;=#4fnd>^%i%pcEyg!cB7K&w>m;Z#OrPtqoq7z3tPOAmE`C2e^a|OR?6p60j-BZ{Bp_Y^T8#@@oWar!Nj{ivCo;V +1?pBqeYPD2JoZHJ>m~)~-Lsyq)WlBlcXyl0j5NBJ*V;9og%dxmBBHsz1ey3(Ms&16x?Z{6_p_X(Xk^t +hBM_?dbGK1IwegPe14k-4yjNqT_;2lR~ANcv~2Jg68dND2WFAZ^D0fr{s8(=F#u{W3Nc0$)=-Q^UgC$M+ll%v?za2+N~W~-}lC;TaXW)s?d3 +=>^VYyS3Ucq&&EJ={&1(&~QPH$U##*9!>m(}zgFp7Kx$Z2wWxcKK|a^?xrPQ@`F@KK}+#O9KQH00008 +02@m7R&}Hfv=Ipa0Mr)%03`qb0B~t=FJEbHbY*gGVQepKZ)0I}X>V?GFJEM7b98ldX>4;YaCy~OZExJ +T5&pivf{;;Io61@Q1@4M1+~Sb<+MsCy)G3m}Fa)kd?K0MiI+F5w8zjH|p5cpL)^@Jww+4Y%B8S77;WN +(+l_beqRdOp;YuI5Yv|tCp8l~=7tu!lDTg$DpEk?mPwK<7H90kPC&A0)Iqje$nW=}wa +n~P-&AZPm==3=FDk|{sP=+&N@8BN%+kW%_FCjnvp;snHMDD4+6&c@J-oU6nKwqzE^lhq$?n{+t)gwLV +!aWpk}${0hU^>mY?Y;bd*cMLNvXOc9>@S;`_3xW7}`;8cb4t=y?`~JMQLFqOjB-+Xz!&~E%}neMQIrR +SE?0kbM!7n?QtzMnw{Lkk{ZUq(l`O{Fn28k+gaP0^=h@1cGqum#A?+YJHCQvD``wG%<7Ln{_xTTo>VI +>w-R9>Kg-@2#DwvdcGBDjNI2QUj{KY0c)$jTF!bgNtB>mi!@r`C`%YRm7^o?6_rM1!-`^n;THoX<@ed)D!+?d6}YX)q#FnAkZm5ER0Xco0r`|-r`a*uHP*;fD!{9@d&*K +t0KJzC|5^9aYF;ri9zuKsaV{Qc_R*Z<{;_=-KpScJi%e0p}9VNPm3u?)CeR*UyUs-?j&W ++WWXf_iYQ)i@vRdF2?y_V!q)F?yNp=KA^FygrA5*5y(o(1VzH=1J&C( +_G_?ly_5AAEH^MyeUq3{%g(K*aAf~EyGs?BH0kcc}2 +U#tA7rPvEB0pxl=XDfaF#+Znkti +%!7jn+$kWcd*O5-=%5uKk2Ul%APtxO*xnr(GQ5OxOjXNPE_sc_5xh{E?W5s+sL8$tM(q0Kt49Lqo#4{6TI25$Rig-mPJ)H0J#149u>oh4K|JzXs`Rwp!e` +Gx*|4a1jT{O{M~kpk!3i2@qC{6c@9Q6O`-@8u9nKM+%R8sRa?WbSofSrXL@BjLfR^3OrS*>~yBz|GQA +m?L_}ocnQe^c3cvh`*Z&aR$?QVxt4R6GuY&q=^`<_VPCnAwUDa99>W12>Q<=9H=8;rW2* +CrRywx_nCtYW2YJ^{)IsKJW|WHeK9EUjVLlbmAS~NzqR}hyoBhKqC$Qn9`^)8Wp}JY7ft(7)8Z9$z#~ +SMIYZi5fwnZC8itH|!J7j=nipgj-toG&zSe8e+5NQiYDHt1i7lUFr8|va2@wo;jXs`lZKz56O+ +4-14E7Wfly^nw`x}{VGb_Rl`t{?t$47*^_Sms+3*c6xqjEs1IAl4G~tXK{&JY(PfE48jIMW^d!NW>f! +ZH)TX1D;;TrzF?!x|5Yr`OP2ToY>fB&;(kK^uccLh0iWWy9wid33onbj-&NJ6Z0SqGB{Gm(a~M^}ZLR +zM3i+;Rn)}_r#g5WXvuERF6>AD&-O#Cr@pT9?bloGWwhpTg +Q^OjyO0{?>x`X=?f%i379ikP-hgiFReiLfm1H2<3f$1k0m>IRca)P76MI&x6dauIVl5iK{{?d+*re>m +a$Sf*N&$}B-C1#T!)B_SJX4M>19(XuqR+(*f}(uqv2v70Z?@ybgI8ht0W~&R4yI>B9r<}m-Bl08t +VnslfUlU^Yv(n|{gX^j{detbza0M}c2e!x$t}C|Z<@;+^6Zs#MzKh+h37URta1OZLlB#d3w{oMoKCa% +Xtywueq@KQ8x)geaV^)pGdDpo$_fj0j`-M9L;2X>KH|rlzzi_314F|Y0xy#(FUxvBW^%2eIe%LixpE{ +k)Jxivk_PyARcn;Zg0_LD%{-H1>V?GFJE(cb7OCAW@%?GaCx;^U2oes7Jc`xAk>H0Gm5gE1 +@<987RYqdo$O?rplPSOC<>XD=$MTx3L+K9DEi;`T#}L~TTU{&vq78K7VjbNz2|<>a$Tv~utMG4$?|R@ +-CL#GS9%-1%v8CQ-72%KNM^FE)tXhZN>W)GQJ1_(#A7BZBUP!HUwm0U@IvOd*-EU%8?|1@lGB2iebl1 +9EVbc9VL$OJ$6(hg7llr=1!<9Q-~4j%&x`cei+|t7%;As8Hbz49LDr_>g(x3d@wzEXsF5~hF6y*@?)6 +F*Tz6Y#D_-7-v{uT*>`s_;&A+NTUCR=`A4ILKLQr?uf;~y_mc^kSJdpRwQ~a5EBo0rO-n3G)7 +fM)dBxr-BQ#Sb!?~9@&JS$al$kYTg2x}rC63X+a-!I>`J9fBizROglRBeJXY)DBWnLZ`CLX0WY#|^c* +q@Wve~Ot_%&bH$jx;M305^QgjAC5h<8vHLvqIhr7HwACKo45Xj?$_YOZj-jyxnm;EY_@ozkt1t682#w +v;barT4rj8T~VI`UxXOo#`o0TjC<5{Mf(%=LPh>YjQE0qDS-GYt_^DEd`~cwZ0L{VfJZHHQ4u07buxj_TM~vA<92Esyf}(7}GZ>4E$Jx#G?d89`S(3 +>lJ^$_e^6LEOtBcf;@)j=F!c03Pa=iDH^}C+V;P~|B{l(jh_wO(M=H=4!n@fmdF*l~31_y}Ct +U+@VO0?DOIBSa&_z2!Q2(Fi01tGYk6#q0d;$!FD{&yh7+9Cm!{#Gv(*7YLrU0HKKu*bJf;EZB5x%UMh +u&%k`^71EA&QCdExEqV-X92gRW%ov5J-)lbisi5^8&Y~JqHRcH)CG2O9r)8Ph{aQVw*ZG0Vf-ewyPU| +5<_j5{Y(VQYaFKClvLskm}Y33rvVeK6_CR6BUjr}|~92(h!64e6UqocrlYYzQ6#i2&Jz-9|!HbRt7@D +T*FaJxoLMr~IM)6|sk4}*$ +Zu2PARIDVZc3lrgQQM06WlW%A#49SZP?Vlu@6RdiU@H(J9ScYBx1#(S~#5zmhKif|G3LPL!(o&L3ZeJ +%?DQ*mJ&$Z2T5C6h(Kh?tU-E%k=y(q#w`+!&|PXc?<{wiA%yy5qVn49r>ofJq0lyDNzS}!7;GbJRg$y +YRCGD4E>ShTHnCOfxqi@Kk$xa_aR{WlRQ`)`ibUcJJ8nSyQJRseIA2`Pg!4F8g$}-Tm)ykW)Q +|@Dq@B9Ofuq*xuM+~jvU};YMSml^ONlh5`UTigOL`u6T5Qcj73{i*)nxv9R`pdN+(s9<$&V0 +Ue#vDUKcI0}@D167UnVXS1|6<@nLhB^1(SuEwcRmIQ_e8`u@hcZqRhkPo* ++S^W@V_yu+!ZsQN^8zgih_u1@+%zmJsf9GR~>LNlC8ll?g9CL+lII(J|aIx^Z~HGN~2JBJ#1FoHd>Sv +HW&-C>_P^-@gmj4Mcw8L?;Y(>q?b*F!;z4a|x?BB@iQO?fZdK`$=dQT5J=$ZxJdq1pLlU0H7Qiya(S= +clp%yA01g`X`ipq5o4crUB%5R+|gMbv5A?2E>-~F_UbN$hSR5)aUL0$u>mk5P7bCXJ`x|b?!KJKq}5L1K7;mfGk^cfM?aEw*nvDIz+>JIpd-3GJdDf>hd% +f=_$+6`(Z`1pH7|bXMqV~!q8_OP{)$1{;CN +Fe-MaIUN58}YsUVLD_52=E(r}%PmE`Dcf<94;sIYL>_%1$If$~IyTt(`s1;~ubeFHK2BiDQ7_D2hpW2 +JterBg>*o_0u(D$XiQ0bGS-R?PoM}S<&PoqLu^gDt(%Kg_WkXXUw|icuCa?f4d!n3~Ei;branl-A5Gmo&`SQeW5z@%}sw{Mtvkw +$eBN%e;a*?`xQ+s!WHgqxWacKX9I7>#1Nudy8ClI +m0iFs;sMc(EF)J~I)Z;beeIv0+}g|glPgzNPNMxgq2Zwh7q +Me0c^0@eFoNgNjs>2^>9`l-IL7`yoR;O2{{T=+0|XQR000O88%p+8sh&krfdl{m{0RU69{>OVaA|NaU +ukZ1WpZv|Y%gqYV_|e@Z*FrhVqtS-E^v9BR@-jlHV}Q+R}AC_%dI2tVjl_^NYNnc#Rf&z3n#(0NCJVD +Xq#)9R7uL02Ko0MQWwjc1T7i_iFlcrGiPoTn?h+zi&CamsoVsj+EDG65tg^#2h;gXm0XBrvtbW~kjo% +gXtkk26mcS?$Xf|k6q(TG&3o}yXj`(J%WWf~ODO>drwJ_^m@y%yXAcQ=z+a(Qw2d6Im*n$dY3oawi-1U +Fl>aB>rx>HgF~y(Alp}%{UhL}?Y4u{0!Wn8KJ +5dRVqgz@qIT^OI((UqO>={bIS4r8#eVK({+4#l-Cgl(Z3C(;#@OP*+@Y$W;4e|Qpx0$tiZ1u<)wvP7P_d66wl;0qyDfKrTI}H=}PtW@=}=@HIV+j1ieo13Vm< +an=>3;)JrE5mcc|Br_I_v6Pw#Re+m6u-0`@KL6Hyq(|xW!C65Xa&}vMK4i7q1(KF_vjTqJcOqh-63@O +I{*^=ckC_ZuG^X+mtMBV=)~qCypwCGc9II*aYZ(!r`ql32N|AR4lkMXL92?59DoWnN@OASF2%|p)Wt^ +?-F{A}}R;7LQ=ZRe6t09ico^61?May%iR +<}&f_=-rejF0KAgtzZCqHuaoC6kC%`;7Kh;o*K0>D&dk7(=4594y)t%D5EoAk;InW9{cFxfZaE{<*uC +Hc1=ay%u2*D5E3mb*E&{sJ`2UQZ&96)%AiiTngrK$m>KIW7wL|nrHL=c!btaGkMK1^s+>GXzvrq1j!HXIEU#&faeG;-XHtQr-*1&!uHj^emG8ybGmIs9ZhlJ8QjjZKg4z#hnV +gV#;TW=OhZYdSXM42T`NQ3W_$n$mS&yJEI&t35(bFS)yperpBGQDIr@RfWw@cV}f>zhmO5f3UFp9!dV +_W-<=rSKvg0piYDfi=I6%E$`$*tGChM-xoJmw-fmKTl?yYb6r-Ci)h34M*PjszbJ_=NcX&mqYcLY#H7wU;n)QJpJ-%c5yxVHl6(*4hF$LP)h>@6aWAK2ml*O_Evl&QQ=_)00 +6iU001HY003}la4%nJZggdGZeeUMZDn*}WMOn+FJE72ZfSI1UoLQYwO8A2<2Dd|*H;YkQaM!w1dA4h( +Jh)}oo%q2#Aw|XMG(leL`Q5SQ6MR2-LLNqNy(BgNp`pOi=`nsmvhL&ktl1a45YF${F5ofA`s59Y^u~q +S?JavyC=QY!BWW*%(@oU19Ox5u6&zy72;F_0Gt^JGr3j( +nm<~)+lTab&td5VQ42`h>uLCc+;acJ=_9W)wB83nfI%S9xonCoX*5q9IJj++k{gyW!@?1q`~*as1L^39Q +Z+eOU?kugz-O4xyOnXfay|#CaHM{GNEFwyQ7PAG^clo~^>@AoUui@;h&<|p?kbqBO^$zW;?vV_BVbi# +ooof6D3Vfq5}L;_%Z0{`TET*YTydpDmT`Pr1H*&T)CHQC@Wj@7>~cDWt0nXRh80tSEefhLnO;qk-+!A +VSJ%_qUuPe$&XeoO?Cjmy>vIs%C4D7^8W0gGf-uCi<`5wF)G}h8^Ni5nJ%|+!x4V-9InLSzWuuK{g+zUcdFPuT +T_GJCd5b?5Wv3MdhU<3`_5!2uScE;(1c7iw@$B=NqCyj!w*q8wl3U>FEt +Zs}vcG;BA#btt5RE01dR|^+J3pVRo@2VH +^EEaV=6q?rf}X$TmKeL4{kavFCJ+{}MkzIx3xM564mP`UCYM)m?u`v7ycCzu?&2tl4JVc1gBFs9?SW# +C%BZ9-uD#6BWU>5~pSo-7;HrL?1KQupp&s)itMwek;LXI+?=v-~ABxGuV)E>7Tlr+#+lBbyuf!{MCDu ++<)m7?Qo;?JMh8|gB@I>O)uul+*pR$JNqd37f?$B1QY-O00;mZO7>PkZ6D*(0{{Rc3IG5f0001RX>c! +JX>N37a&BR4FKuOXVPs)+VJ}~5b8l`gaCwbZTaTMM5Ps)ZSnNYV0#0tmvVC81Ah=Yr2Pi^Rj(xEleXB-}kCHZz8f_sfoxF) +A;?unc$wcd|1sF^VNL&`03$k@l5W?+9SAb$X8lHM3!}Fm@FZF(clz;zwDxj{|2QI#E-}$Ej5HuXJB_u +gx8E04W|`LQNB|3N&LN}CKsw2%b#m$dM|HmIBvPCqI-_YnC&Id6v!}@T+DDbiB +Z_xvKo$pu^L=zUh%Cpg1ij*Q~@(NKKcUvFgaOcCVsWwU^xbw$q{nGtq85&&wbuKeganEISA=;xd~NZB +$6&zwGbKVJI-Q;>4+wQoMo+!bE{AX$pZKBc#9e!w#;}`>hdMiyGknS+{jXJ)1v#nk5zUA< +R$HmiP+gp5WGNv($CM|zQ));BsFYT0?7~ts}l=5!QGyNv1e<_nPIwb4nZ+%nZ52C2_C&UkIgQY6Q&v0 +hH?z3h`PQLo-FK2i<%#_?FpMRIns{o8q9A*fMcI>eTJX+te_Zyb;rJKxW6Yp!gHiYe79r9pPJicRC8H +j*A00Fu&6Jq$M}vQH4pl#vGX`-oecci|l +()C)AJ8@47!^X04povqD;HMGPzFFx$UjMwlcJV1kIjkp^Q0o|$RC`Ve>&~w7k(2hU*Z?kzDcEdF$) +G>5%9XlVBJ(w*m%kk-Uok#-M1TXl32ae%8$PVrt4~Fl#vdVhxfiYF|qz +&xn@TwNA1N2zHKQi8x+^!B$QB*279>8uE(oGeqEJ*}0!wqO~9SHbZT?FII1#f%P%L>@yh*66@6aW +AK2ml*O_Ez9u{xpOA=`0guhumgNhHu{H2RGOl +1-79wOCdkjuQT=HZn=WjjAfSR_5Vqn=R`+Pb>4_=PJ+4_cULxlWc8%7P7udlZE+NS|EQ*idB-Tqg9!2 +M7=MdkI=71M*{xNUQg)r;=j*Nqo;p7efsCKS3mHhlWfmlp5|$)mUWV6=66=hBvU2-e3mS0{&rTYQZ7> +E{Hk-^>P1rNR!EHRU~rhE>G(pe<#PWcKb#2t#h +rhW0abxmq58N~L^x;EOubaKjAboP%Q7$fx~2J2dcCToRuLnls)^WEs*LbiU*}C8tF#JZpzX4bwq@$`( +zCNSr%x}UcW+)qFHbK{o}FBrM6XU>o*Fj6Uhm4Z_47xhIN?M{<9hcDP4o?y`36|sqF%?q^igrWu7r3X +E?z%-JrghU4@$&pm1GIR6j!QL;V?wCUPoz?T^pF@cZ4DpVYjH-SM+Nb$R??l20&6pNaJ)OGQ$No^tRk +!=OtGvQXlJ54tE0L+a-kWQJwQB+#`%oS(x{mYK`wne;g$%U)E=|8a?{qyv*x-nWsmv&$p$*x6lyPoGPK2)_37r)i3DTD2g(Wtt +bNRaI{QiRf#{yN}XnPxj)Z=SR;e%m~sElqRb0b)_eK|3?i`qs8Z=_ET;bs%v5qi{3~TrDG;doYy;W|^ +@xgzJ4Y~FKQvGr+ph?2UFO^3OTZmr?`WB4pjv9+nyQwdz2gYY0P`^mt3pc6Slu%H!!W#L*-T)4dS3aM +1VQkWM-ft_wA8{5H>Kgi`Xk#Wcv0s9)km2LP!g}-Jfr6!Pygad83-#B8WiokR28+Uz?`L^A3&@DMh#6 +7J;6#SFZUC%yMn>+4FS`m+y;Cj}6q)ELOy97qB_8ZiBp#JNt1ZJDVl( +W1>V<6^pxu}S3#`C!Vqk_QZbHo~KZ`tG|Y=pUxnWpjkZ!g91u?WI2Xv7pSK_b#h0`c+l{q#vsLnCtHUysEIUrom +LU88)xmd6Zk2Jo7ugwwIc=*f)VFl(ULj;w;k)qI2iCgKsb9yeN4`%V>U(oy59X*KG&TQda8x&&=i^K& +E1YgO`ZS2?@3qNARv*+$h@d2E#+nO`deqh$&lYJU=ZQb|D@xIl3W44uUJ>ACpsx4(yZh_%Wv!a#YJBB-uFdfg93~5U6#TG5GE?jZIaS=#9S_G)I$V*uj($J^iccarWvLb74a~lz +;`=!V=gs>|pUOtF{ID?8;zr<_-*NEd}9;=>Rs=5SXBYq~exo;TXf%ygPFP`JNFnRTK?5uWXN2!6$qlm +U2go`dRRA9T0yOBmQmT)z9O=9Rfh!cZ6Wb^)^E`;7x`Co#9K5Ie)_Nvdf)7a^wNjGr*?~$Ql$b +U^{dXGPT6qPno3PQ;-gTn6p+Ja-P6>NwTFsK-H*wnIUU9qlp~QDMgiU%OytiWRzsNNWeyee*i21zm`` +ZI29Tz%o@z+j>V8!)jJ`OAc;<8l1(?@n|X%vSx)l+Wb!OoQqapvhNnqNOB+Ym32`0B5SZ4&tF`)<=$b +C_G+7FCP(hObFbP%w-C$H)rFIdme@yP?Le)E^8l|7q3ym0>#&ZBlNu9Xk0Pt1PTWO|75vMWjXOP7dl-KkH4BK$MEe=9Pq-Rt-ZeRJxuxUNW{x_HV4+D +74N)FHVMp%wcvd2E~32IW$>ao$8~7z`xn}EOd3g(QES3lBO`jg8N$5Q$s^6t3uF`w3vidpfJ>8WW5E+fKFkp2u)$?P05Pt +svRyAK-;5G~(!3|ii@4ximdVrGxpxQ>tS +ePV>6Lc4Q^vF)SkYJ5Rc?wEHXqj#nItLt;toCMSqJIh6)E^@J-Dz$OvC85KnROJPX$o#ZXKWocyo*GS +aMiw&&^dNer>{Fw_hqZWhO#Sj^c+?kRtmQm&03*#(wTS`#;JZWRUb`yV7ieRI1RCK!c?cqKM6#yHHvX~av6Xd~>Z%(v?+lq+UUvzauW2nq)G+Es^sRlPfmNEIflz$craM5A4I +X$L`64uD6 +b>)DXn*CnwRbi{1)RBaMuGnMj0`BwmIzq3R5{O})H`t8XD*1cJ13s-2h8rgzeDNX${v8F=U?PHO*y=V +(mY&edmJay=*y{yWrNK<>d$a4*QaR4_-|)uyaN6riqWdc5PSywOXy#UsNydg0sK&aU$9i49q2v^8JRw8~B*PzhKg7ez>a5{iD_L6 +;ZcQ>(O{{VQ#R!<$!AFtfTEfJk({X;Oy1gi<1{GPTvIG1%3UN2`+xbAX|U$6dLyH_#nW1-gB9x5Y>SK +!5nYm*T-P_b=Z +fbq+N5B!M8j^JLskn(w*E_;-cJ=_T8z65FW5&fqRzR7rG9(IV5+LnONyPqZDj^7ih?4?qvOu8LeTzZi972OA%nm{%Kozu9@9{t+|u1{^#4(?-}3Bp02|gegev=l7>qY +I%)WZHizpM?#fWn$ugk-Nb~X;hlHR0pqd>H=}9^N{h=l9O9d*`fdXHIRr&cEd7xCR}TqYjAELK5!($! +xoL;VvMohCB*qZ`>zzUjw;RAP)4Yr^?T}Zh9Z)rjptTzU(0Cj-%$jIg@iwPiUI}h=kMe`YunjJ7+m(I +;T?`_1^}s%=#ursI*8K{NfN?u5 +mGlmz*k3?fIdxd*9!x(DR>77+EOa+ur-2qd-EPEf|&i&E{AiFhW*4wVs2WIPV#7YBbh=iB(s%~smU&3j?< +SGn}$H5Hq;y9B|FWvg2=B8e>mze8JyvKRD(4o+J-R=TjfFC{s1%0tJ5D(-=G28B$Y{!QX%V1Tr0MCIN +hYCJ?5)?=fK0Yo`@CrAe1*X%J(|UcUhAq6r2XTnM62hFzE~JhiRqtX~b5cA(?xYaDaBE`hI#&eGie*b +K+=Im2Ki;G*N0uug{KfiTHX ++8i$F1C&*@+Vf$KeE|U}I`OLfo=vhYo0Q^@U{k@V=W=nsh6*>1VO|~Isx9xaD;h7ngEfXDuO!&A*HFM4dlM;hzjmExr=p4 +lLb=)%tDi_QQ=V-AArCWmH)k02eH3uItFn9szW>ia9%-e%xnXqVB!ur_#_MS5+h7U;$J{;4l$9e9k{! +?lxOi$cM|3^^foX4xCH2yD3nn-iiGL{ +6cp~ZW`C_nZ&b&WBpRa`DI6u1=k;*K2p^j}ycJ3ioU9cWyB#o5g!C{8b$o^O%AL*4acBz4z^5GH$Q># ++N%t8tp1}s~yL%wCIS6_XJ9p0(x`%uy(*k~!RF7^8%5byS^6;T!Z~n!YN1wE?@lBRx1Ap*N#;nEvci? +$UX45NWckEZ@cqi&V1DaDWUr`Zrfnb_cwN05@VDmYvtNGjyY(g4F*XB6|2R*}BSP<92IQEEaM{+T<$C +ZPD=BHdRr5+pgMQAk#nRHe3hzq| +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 +Q|IxePYzH~z=v~XtpNhaz=4uw-{?J*%7uY?O +B47y)#t)Xx^37otf6*C +__}xfe$^7YY5AR^On^TJGUNZ0~jnz*og09AJvJc`d1W57KylUOyp@qwqfhFV}{zsS%^{dG}Vxw&XKVP +&7@Pji49DKdNIjy1UYGXc9s_~&P_kAl!ZP_gT)m?5Q6J4#`4S=;Q +O-6mN{VC>ue-EgkpMZqH2zzqGKg=-;qNT +wl?@kp+foQS7@WNHV!3$#2d7fgPM}y5}`1RZq3LMsuJ!TO9Ni$AU|<`@}+*_X(#T6bJ`n@qJ=!%X@1T +23tN$kHCOI8K%&i +_)bkQYWehr`A(__@_MEi4m&Q6XR;+<6^HBO{Q>4bN@t$AAsKbr-Gs#33`TSCeuKw7p;16Xuh7ey~DTP ++AIiDGkR)(d55TFllJ(~=!H(`5@`<#{yAHhX{o$Y0OA)x6Kl5=1_{+|Y*1I6vF(XVR^`e$)=sNHDJEE +6nGa@cm+~N(ZAWCV!)qjc&M3PiYT&Jfr<6)gu_!ue?7wp*^6e4*JXh!rm$1^uZ4qB6_CP7u3)x83#i~ +0lIi`(t&=U&7^}K*P-6`GxNJ|q$7xfiVYptONB3(T;!aqlg0yK(Istk)SeO%nwP4 +2NXVGIKJYR*Ll9(;YthzpF&Jg5ec4wJrUT&Y{vP4p-y_lZ&VxMjFxaGfL_?apZTt?JpYIaD(8D}IFhX +mefwp434D&!Ffp%>8L-`~?a&il_q}swfnFwNee?Ole(>4L@dD;M^xn`m(Qa-RWGJxeI`H-`Y@m-B5m? +jZxl5`I;TBAZqg+Fbw<;$D0;X!92?UsHgu5B_?U?mG|e^EC3ugsMMs!OqTH3D%_B%;=zFny=%HQi +AlZ?n@O+o!RH|i1Ik>3-xRv?C5I}qo6_mgdinEw1Z3!8=ygPz&pLioXB8u>iH(0pX+#d*A1WOGqmJ-y +*53QrX;zhO`DPTU3H~C&ZaofP9V}eLN&PlgIfsQ>?mt4UwQOvB9-OyO^o&aRnfn)R+3P|H)DsnW4oi_7OE+w}0&E8WdSB+oS958I +DTCR>0fJkPoQAlUWP8QX@#F&r2he9R&O++ifGNKCMGs4sbS`&6c~Tuhm=;{MF;Nmz?y!P)h>@6aWAK2 +ml*O_Evy0b3{%6003(M001li003}la4%nJZggdGZeeUMZDn*}WMOn+FKKOXZ*p{OX<{#5UukY>bYEXC +aCu8B%Fk8Mi%-ccE-6;X%q_?-Dp7C&a*8sON=q{H^SII=3R3gR;PS3{Wtm0!dAX^1C0tzb@rgM(@$m| +_3eif)8kKYul#moE#c}}vP)h>@6aWAK2ml*O_Ev$8*Y#Ng003GC001ih003}la4%nJZggdGZeeUMZDn +*}WMOn+FKKOXZ*p{OX<{#5V{dJ6VRSBVd5u*~kJ~m7z57=TbXj?!3N3nDAVD|%N>L=;L(?9L!X8WGHM +Z;-Z{7?|*ZYvjQ4Cs^QbFN?mW#0PqOV?ZJ5K!9e@^bk(w4MV#yWkZkZxmk$yHJ#S +Noby}Us>O<_C?wLZ|mf6r>_0$6!!146Mr(OecH)rJqWJP?F`^5UYy^W0B8CzOeK4L`~9ysW8s2W1C?Q +pPYD5{59Yv0&9UkyH>NR!)S7dKV|ZvDdh)x1V)>z>=%2H^(N+n{O!=Q|DUZE}o|?`%6fv0WH`X*Yy@H +c^(_iV~Rz|l2$=f!!gL)8OHx@puG9ZG(J*_H~9Zh`jrllPpbV%Yo$T1iMQL}gKhRK>Wy@ngMdkfbBpk +X)iv!*jnHOY9eVAW_AgnJ;Oj(igi^i=f%pA{{>J +>0|XQR000O88%p+8BE&_;v;nqrXFTiyHAI`0lLs29#dhQiC!;oo-^0JXcMdZd_8~*Q|8Hy4qY1 +avGz~w`{qR8RA&od)gx2iKt)Ld3+Ewtu$;z-&>`=^q(@WSwd8}8mH?S8e~Y+#3be3We|D{)kIs%B=_% +I2;o!{Q?b|9(_eC2}KGv!ds7nH&4-CnGw3TM6&UsLnpU=Pi=54S|ueM^Sv>wOGO3jcR00OIZU;hbVm!odzk +`pvF!M#2MKWCI!jsZ;Tg3(~;A$WP4|xU~3fBSf`gzczZ?;<~UaOEjE4(_0SL1_t^8R?ek1oxI +(SX2R9Cjp=q53WzwfABWIHhLjS^Linnsf&>FGVIEOvm>hGN +Nv?LU!)VB|M*l*>iBT-Tq_uC_!MU?B43S6TGm$GpEvw{NEBwvs~36hdYZ}B*m~hVSo{Bte+em)YuJP*Otf1j*L#ZeTUHSFf*h21wd#4sb?I3vE(BcgCtnT^`sZI+23&l5sCM=#W{zYlrZbaP{EE^TC0 +6j0odqibfAVo}8(cM&U9hpK+1StCTDS$r=reqI^&Nr;x2jbQ(k?K@N@(%bN+s0353Xy_=u2g+bNR>@K +rS;NbcmJ5$hrfz=+<0ie3mm4`_OF+KssvRjt`*fY~K(KcZ25zBn3lXbDZP&Dcqbmj+B7cyygti(s8*W +l(AIm`@N|u3pNt0zZ-0+_kRk<3TP?>t|Qr=acVAG3jCoYth57vQhcW}@3cuGRdWtGZFsx@0aMY|Jr@( +;*ejaUZ^q~y4oomvLMcL8&T+uDbuoqQ_Y8d&&e{n-Oeo?RVF4b)%O&q +b?Y&uGYm=5N7ARUD+_s9uO7?V;H)R`Av>xqR(WV|@`HhDVX66!O?#0O>Gsclod?K;)d9u-0cHcpe3-{?l4g>tqA=dME3!(z~FS7KA19XSM1u!a}i0Jd0J&9*D?vvBRGpRiar6&7L +5m`((%{(8aAD}>h0;ZU(FZ*9pO|TrU7m$29$9Uw?VHp|R#vzxW;y{i9FkgJd{=GE^*+YxNpUIoUC1<* +K$_gErF1}Q#h6szDH%2FpMx3G9MQ9yUzMO+3kh6Q{v+iL@r!a`M=_d-9S7g7N_16>u +;#NqZ{yu-WZfTT~K4nS~PGb_!uxHhJ}ehL735L__$BA&y7$0HS1gIfpn5ay4FTA=!N=@c_KUHRf0ybN +J8`Ol%g!anLBlpJY>u=)SY>j5UGweedxofX?}Wj7r1#6I^^+KC5qvtVkHQP6!g|ImY9Lc +b3A52)B2h|O5vsW0~X)QBAo6zupwvwE9vSjnO9$3X-{2EuP2C#L?T|1(p=ef5gzZCT0(NJ2_eeX(t)g +Z@)r4Le)pz#eauLF^hwDXQ}X4?!7=QgL@@AChlyJyE;f_r&(T-(BzXyJ191794FBj#9_F$waOlIb{8W +0W=Rb#3R6*r>W_rHnxh|!*xH69ob!&e6FW=1cO|U88`X$`&n(<@xA@*ty0zO0*|EE|9Oq4CNq=Gg4UV +N&}1{yc_&+|FFlGkw9jD#9kVkw9CayVaAIEF^POf<2}==+dk+)oUCO|#uyv{va9`z-lQ^-1qyEV5m8J +~Jg82A&$#{UySPZ*~xJS+(M8Z|lpq&BffWilq$eW!fgB4!~4LvcgNxCK%OHs87SXqpe5dni+<{McR;~ +XH2(BA==Q4)-LW}+l@^Nk7VofJTasHJvn?5sNN{})^cG(1x40pk!^d!5Kvj61ZPunrC?rr~EPO}tXz= +Y@=b>eLr+D{&Qmfe74k4pPC3#=Xn}VE`RWb1h9Ng`RxSNDl;;&zDz=1{{k6<&oduLt6UY{`HxChXveeS6eD}kZchs0|`vKE#Fm&7jcrZ-$L%-T4lSl$>f~~@)kEj-MzZ@C&QD3FIv$Qq +RC~S=2wR=h;A*S~d^{sFb+>~ipyKLAim0|XQR000O88%p+8Y)E<&7YP6W3mpIeDF6TfaA|NaUuk +Z1WpZv|Y%gtPbYWy+bYU-PZE$aLbZlv2FJEPDc5^OpdA(U%Z`{Tee&1g)-5@YGSj|K8=0ZgpR7MTBP7 +oV#5kVkk$>Hu)Tn@__O5Ozh@BPjhUWOMbG7?mPWiEH-JNK*1xwefLMO$Uw+R|-IcoF_9%|V{ESGn@4| +E9FZqp6PlM>|}pl|SJ^|IuBBZ+^0wKFcgFd>_@Va3R;t{K5Bfi? +t};ze_~K(*12RC=rk3f0u5#PRT4nc&IFzk7rR#Cu+vcoF^NY^kt1~b%RoTj9{3@;RDuyx@xB$^XczIA +x_fX&C`R`z^F^86z+w+^7>cKR&I_t`>BH3J*PClNrE_9qQB9<()rWZNY&7(9z_ +52kDHr!>CL}B-n{?t_J{YKpfb(u88#cG%KzC(8wC0h_S}o3_Gu1bSx4ccsS2BxHgML1(V2l_tewqaXGeKYhIs_%Vg3EO}%&BH;k;(fCs`l +Xw@7(@&#)+f?F>DxHootdr!w(l}DzK=lPT*@(feDcwyQEzinlr=-Uu-ytza)aPKk7hTMNp|pD(uR~c` +shksOtmrqU%5@Wvx7%&_D7+2&(ISt|I=SIcryMV@#j5J|-qXae7 +5rSHNqUO9bXlwk?CZAK-D8X*UQnRrP+Mr;^Iyws|hyMj2{MN)h3YR@_(iQRvSq^W?dR15Lh6=9xv*p5 +7xoS<*s-At)OW62Vb?IS!r!=Z`&euT@SNA#cxhAIc?g31-DP2RKSGM4!m4oSWD^AT4%Dzxvv3_fsMELd!-g +M`dIV2>YW3ucYKX{QfJN(+^wLcsxj;@Y!y?PTe;FT(ds5|jG9xf$;9_(cynm*IF`baR{&pgncYI% +%O*X@6s<&KAs1hM!HM$i_$V2E~_QKNVpWpr{RFj>|gO)L^g_F-Di!?ms$tPkO=9yh}vm8B~>@!I^>S& +q#;Td#&>dWYAUV?|a6JF3bHPlEitr?pkSy8}#1${TQH}YL|uYb4Mf1>mh>s=p@R|GAnTXWopbj{qtIm +qgI%`duye$cT`{6$#0@MzGia3>UCxw4$7p~ijVBG)L +V7-yM-U9HLq0L;68D{gkA5kqL^G>Hw=bNSn}uBz4v}OT6~>ES43(tA@%GEP!hsLUwDFd(F>>_TCOa$BO>f3Kl^&E<68!H2#hv;g{SJoO*r{&CC)Vc1~nIg5_|K{t ++zG$z0bLidAO0R~A*;dnj{2Bp1mk2F^aF@d&)k^PBwQI98!rlop?o`i=+zh2dmRL1SyBuA~e42Mos65 +@2d+6z3li2D)(q<1tJe}cZ}3#xwRwot4LYg4iqQA#75B`eK3Q +0`{Sm~o|?L`z8;5U-2vJF9ZCD4?nT`n8ArFPUq+DYyIRZe6NO(;obKixHGIY_!uOyGA>bVPzHHJ%TIf +>U#UcrDzGR5F22xu)tFXg%??q)Vtfa5k_SV +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 +%V?;TPvQr?{6=x;3`yMe +`u;$+jB2RBlFSgf?0>LdmblwdgQ4mD-~v%nH9W81Wao52ovcZvV8_*xhc|DB&Dj8`}y0!Dw%ds&_yiW +9%Ggac_hh`!Dz*_=SYND%`kxI>WId7%`x6@ly`8s|L7mxMAAxJE?_zVkI!6)zf^u +9kp9Ll7-aLb6!MA_#CQZxttb^ddc7oCGf_1dwWY>{xKR??ZnA<_4jc2Js#`DTpm|{Al>FRqeD;*eX&n +%6YrO;Q-#?+i@Qqkm;bp+4w9VGq~d2vY0M-Te?nV>x%&?rAA`O#bM=>?JrR!e)D0HVq8z<(9$Sa=eIA +NMKUhsM`oFtgVTaU;?JfnK%;$#qn7Bq +&0w7Y!~mMgaGA`T-En(?B3nD%f-!!u*Q27Du7;cMstk$S* +SJAQk3y>nFdb{8K4^T@31QY-O00;mZO7>RYm#NLd0RR971ONaX0001RX>c!JX>N37a&BR4FKusRWo&aVX>Md +?crI{xg;Py$qc9M?^D9Q)3rH!sN6OxNsiIYHtCi)#P~1AU|ok1-^MAvt +HC>Sz*SQ520cL~t<8t9izI-{Qxv0C|*Be=sH_^h{vp2pB`a_!eRcZ?;7OG-NS>X&MwN4uHOm!3s`Dij +hrga)C)}*u!5XC8!N3kL*H|EwabxP@nzr6zyzxR{X>vNp9VSqp@E7n>btSgx7k@T9<^b+vMJMK%6$Pf +*VgNxcdzc!Q<3rerSl8%BsF_Ro5e7t%X#omhaL%RX?3v2AYE@I?JUP)j4K~yY?#B(UWc6g`}h5zB~^@ +{a3|2ly5-!SRfb7FL>-NfxJ=|L+C_8#=HS0ouC&nVIXX?T2E5qD_Bo#oTD6iI34b9nBpWo!Fz9;UgjP +}Up^H#0y-+o+X5+%70z7NFM=5Uei5sBBRr<*wQvq +aTDCdpBE-()JP;uBCy0|XQR000O88%p+87j9e000aO4F$w?xD*ylhaA|NaUukZ1WpZv|Y%gtZWMyn~F +KKRbbYX04VRUJ4ZeMa`aBp&SE^v8;R&8(FHW2>qUvW^r*nlL*D4Mkf_6BqV1`KPFt)GHGV5F19nI>71 +vMUt%?>kbKEHQ2-Ac#dCpSyeR;hk!u4&XY?8(XVAi2VC;5G_2H$H$5oHz9}kfi*C61>tH_IR^p_Cj0bQf2OI +#EC!l|Mn&X=XI6e6u`ucW(z?59wg2kT7gEA@B@jT|76}nI!U2eMJ{TULY@4jV73OeGVsmYJ|`oBL +7&C9@!dZ+@aeZtaJRXIf31??m}_tZgU|PW=5y$rnX=(W>|YvY8-hKsE`ohRU{98kf>VPsfKGUW6SD)K +SV7Q;Hz8XTP_nYY2#?7sScE+w2-5`+t#nJeAdshyj6jJBP0-?5f^>?JY#IC4INK4~v{|F^N`>XA;bjwp%2KoyF^&~?>`Bbf>?#dB)lA +s$d5iFdT!tdBpoh1&Z^%=HUx^yXvYLKpg3G;)=owQSs2LYxGJF(heVP7;46Cu^HSg=`4O)^tEZLq#h) +!t`cqF+@AYuY|thAnP)YRpOjBQ@*UgXMrtaoVlEDHi0gDZO~b127((siBgFNMhs;WK(9}FhFWFVVWLO=d-JzpO +T9S1>Yz3KL0)HNVd7fWn80rv~@vAe;ZleT#_nqci38_E&vI}zVt8)=fkCS?LOm=f6Qfqs-P+s(=$s@H +pkF&HiFtA!q!da~*ZPB$xdWgl?yN65d=fSI8`FwcZRFiY-Au^LqGOu+)t*N-|PbOt#ch)S~Jj^!y^I} +Ym^TnsQ3c~TfNcgXev>EJUEXh}u|MvFX`eyP8ke$C0B8-1Ne)zbBvNhDvoaoZ?jkiir*8XPOe%kck6f +gm#3IHCNXsNYFpi`@}+Z3$o`#g1*lmCD6e!^EpL+v!DVH-TvEtLyNL-8cAjcNsnR(K$`r{*Ck0#=r)B +{xd@4-aZiZQ1x1l4U(1*)U_2iSWpRrV`cRkb*|jFm0igel&$JXg#zZInAa}1ZQ|f`y55}^LGlenYfvw8n+E~5!PN$JYh+jMX}Fa85iO9KQH0000802@m7R>$3tSh^Sh08>!_02}} +S0B~t=FJEbHbY*gGVQepLZ)9a`b1!UZZfh=ZdDT2?cigs>-}NiF)F$ENjA%=V(?s2A?K(>B*0FsoXS2 +Inm4b#C4I>UYAxKFRNB@2A15c78DQQk~R_$>(AaHSUao@OLv0B$n8!ftO-qv-gb_#ANTG<2*Wqol`R2 +SxFZC|WwRotvayEF}rG*4Yqmc@Cx7LAfSi>6*hxoE|_6iP`I=}xwZd$gN1Ok-XqI}!Z7|L?a)+4C1i& +;S1N^U<)>GL(of%tH3H!uufP&tf+tv +&^hheqEu-v*NvPD1YptEO)}p;Y*CaF*5%gx{fnccSJ}~jy+3+={PNA~?IV{$E#0se^lN+XRiWk~<<_E +Tt_!7C*vMSW+e~!rGD9F4Y!JUu>$31)RI)AWx%W=qv`CumQ`fmHEuw#yo4*Jp^XK&nHeY^Q+!WRJv4D +jgiHwxBHDQMQgU`fVJH;a8gF`}Y1ZYv^@+O_vWhsHD8w2?zHb1YSSJm$9AUn$@ni;-MFJ$|Q+LA1*fM +v1_7-45Odeh|4ZzWoQuBMR`O<6#L-k7Dhl97mz1!OL(xs2*7cv}KL*ggxu;d&`r0Cp{->!K_H;rV6M) +={Tqx|1D$_xA0ZckhqB&R#q_esOdRSS7JqiYNOA@ifAx&%XRzKOH>z!aN +WHo!=baJvoO&}xHC2|oHFOFkuP>9N$DFZ9r@T%nMT;{pVX&KR#C_Aar=>4)#5yK*}hOx^US3v;JkaB0 +ys#9%r4uq*T(F)--QN4)H1`9pY!#tpKQQ=6y2IvSvg{X-t=Y2kV*36g1m3&z(>a#TZehG3Fd2JE$K$Y +Wq2rdBn+wq&%drCHiD2t!OIrQhX!ltb7@$J#u=!^ZwQ&@(>0Z1W=3YR94KZ-f-p_Zpcp?VTb67-ctC1ibt2Gdhl?49nMz8;Ji2Rw?QB}7Hs{l@tj3^R9Nx(9X +E}FVqM@jnWBm#m7?ielQjRz_(E~IKx5INOKkxvn>0x>K%(WR7Yh6!krqOUyC_bCQu$O9`ba94~PL{e5 +n!aYk}fKy2j#9T8f{9g)%@(P5_<#~63b5|bBbyI^%1pWcsa!{Y5$!UK +R0_c4W4tVD@>ss#v@c*S%?o>`Y-4nku_H1Wyq$EV4M`LZtNQr%8w$;m%HKK*nOrwBu|Zlj1@xZ5oLIZ +l75izq;KlVQ9!fw +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 +$za)fO23Z@TH|rpfs@Z2TCf30OA +4w03HAU0B~t=FJEbHbY*gGVQepLZ)9a`b1!paXk~3>E^v8eP))1bFc7@!S1f*)783i=TcCyVNO|yhrI +1r8#cZT?B&tY8yZLzkzH3J*Nvey+GxF}tG)-f^DTs%VSTIJEkQ1==v?p%O`~$*{5 +*3V)k5rCYh~gPeK3ES}2o9`0Ay4sOi%j4`AuG8A%{}BYkHI2gKr8>3i|}L4t#j=k+);a7Yi7{*9J6rWYp9 +!u7tzt64?+sk_aA0vI!tj`{QIgstbnE5u$M|6*xJqmTZ?*Nr_OGukFfj#-*c+9U4685y}GaHLB9ByowbeVM3Eiz@BHOg3>K*AzbQV?4#tBa#>5Pjjf_SWcHd_nTyP)qVYva3{rStu^@*@%Qmg&_+I*}u( +nKtA!)i=EEZWQoMSgq*sQq8Of4@L3x+32lJNgeIuo^PO5vqrzK~#-39pQ%FBkx2nQ|;MdZ+dcRAJsQ7 +ufMLqwtcZt~B1IDRg?D?BJ`kRQk>(YnBAZk>24;n=~vWxAEi;LCH$`!sKBgmphhO37wYVo1Uz6>+?s) +{W8S+z4P|A+wR28ZnyF;*%m1n*H`T6_blo8DY-n;x4xq1RZxqGzDt?eew3MKVuzTX!$&De4*k$6`+?8 +$e8PTgRGIgz;_UT~3C)DvH|XhTeO{w{SS5~ZD|+DZ#Yl}Ab)C+#7s^E9Zg_J +xP?WUyo(8|R^BkIfc7$jeSYxLY56K@JUmpqJnY!9H`|DX@hXeL9;Pl#{nz`WVZI0*TU3rSpEsp~QB2V>(n5%B2UWy@iPIXx}&6V-rbY%&*h4ZJ&v?)en?bdMY``hw61 +k$87?!=x75Qs!$4t!BTzeEWv9gR|>WWD*B1ECGVK8)gWSO93s6CMKQxaa5Z#)-6ZY^nHFtf1VXW>19{ +1>xo4(P6^PT!zKMz!0{1Y9(Q{@$6Z!P)Wc@OlEVAiC6Bm0fGNKhR>S<|EDb%$6e2@%j)2t4PYo)NC66 +B_Y&n5D$co*q5U){YIyD%bpXFZ9J%^$c!`5hB}JFd6HOgN&lc!**QJe>zOkC1cW8bWoy +|C0>tPX{1H0+PctFyE@uq$0woeI6-5|xD@@d-X;bgh{-y6akqvhp5B=0040lSYOQ6~>X-N%rql^TE}z +IFzqo2NU16YnKNw7ImTlR-6D&}jx0q#I&foEmU;pi7Sc1u@o@aDTk^1rE`u!yU$xQqtn>w6d{E={Y() +Ev%_lP-mS$VD0mST~iT<%J}8&)f5^c$1yOtx>SBS6+SBge5t_pQlo{H=tD{$fa;+op0I-)rKLw +$h!Vq_>my{x3TmR{1%5!%$WsG96)`a(S)?V7ubD$zrVffx%+D~xj$m8#&&)QtL>HHmZEN%N`Pa|C`(_ +qAA!EgboJ_uS39?dFt~GPbki`OK*VY_VPNQ7Zg=&v(6tcDGsC%DCh#|EQ+uha>Tdn(O3ZLH@E5KJ(pHy=!R +jxFmV5xQCOn?8vPmaK-D+j(dNx@$@p8uP>D>XPs`;PAPf4DJhWgRJq5YG)ec`$35@PU632A_#+e810nk5hFxCOnI-Ld=lJf_7qq?KRHSX4J7&@Z|%_k +%UkZ{x8)uVqWk)gU7V)LiQ;F34FgfIKPo}_C3>k0cg0MCP}nu^6+x7sSe{V{?qYW;|)VvH{#Txy32E% ++|{O<~9i8BI6=Nbo?sGF&)tH7z(}FH1mbvoE4s72#?d1Xs&!#Ar#lMqQKszJQ4s*BME0N*bBQ$795K1 +<#A+)s_$y=iVEqKj2p}i(<3;D$+(jqGn0|l7 +Krz@q)fP4<)8qSTB2DYLD}~#|UrQYf~e-t0ssJW2LJ#k0001RX>c!JX>N37a&BR +4FKusRWo&aVb7gF0V{~b6ZeMV6WoC0OaCvoAOK;mS48HqU5ZPfZ(0agt9TuPihCYs4um^T13PZ8!MvE ++IqTDq9ew1Vx=v$8V{Dk@v!I^nC@Xz +z>~Js;xfZ8|K9qE>_D5jMPsXU~K4^>6Vc&aM6fya0fui3-ws=d%#Y!+AZbN;S4w__lJkfsKC7p6A}Y_*nJ +xc&4(K5OH!a`>;84ym$xzcG5ScuFwe!JX0XJy%n!zCo@GrVydQR`klli%>m+H_(YKcdB;?DC!M&PpKg +gN$w%zBiW!M*lm#8>tF~p)&zoGV+w3a__dLIqR4Qdo^OXxej_}mt|bLFIO`fYF~h@Gt7I($-hsTtK+R +IQ;*^phZBW@UkVRt^1}vHpL;{l^+b6=fK;}wn>8tAE&^wkwd+g-2BTHBtqvm%r;*t?F|G>53(Ksh@d6 +55OrsgMh{ATpTFQfQe@Y8fpk_5Lr_9a|@iLc9}Y8H!I?i5ogPEHe;^!kPWlVorh*EE^K6qa)|^G<)w7sgNpaD-5P3BM_27#uQ4 +3Fx>R7$BM6)eKG4Tk*_5K0spTcoGE{W`SpCTpH7GQaAV-*9gmZOK;%M2p_x20MkvFQ=^(ISod)@Wq6F +nS*k`7*Z30bLE~-&9**CnJSU$??qm{nh3TyDa;s4AcX>CxL)>J3lrF}vnT-0wlRo+p{?HN +44`yv_6*frpMekBb#lr_uTYsp{Fm3|4>T<1QY-O00;mZO7 +>P!1xIDS1ONaM4*&oq0001RX>c!JX>N37a&BR4FKusRWo&aVbYXI5WprO~d30!RZZ2?ny;n +sL&jLv27ypxO3fzy)&H0tJe0(B@_YT3VuPHWVq4R19^o|GhJmB8ifc&8a%XHZ{+W-#j9#+E@>+bxCPW +1-`ANK7;Iz|B%k7@VWNVXs%LtXlf;rPO_FY%btZUjAb>?pZFOSndfKsqW!?nQ(39KuxN%gUMk0OQ`Ow +dlT^~T*;MZ=eCC>(zKbG-XJH-sNBz=d-elSo#=ma2k}iL-q>Zh(lK+ZqY9vXLTyf_xK#RWaTYoWnpCo +|KX0r*OpLEV^*C_6V1Ah@vTT=_`CH^!eaOkukIIpe1zhJZgiPFI;f)Nar#-elw5Wd#VbA?D2=Bkz9n4 +a)C8(fDkS>}}SF3aEm$8Zu}XJ?6UXLTDTvq?t@ev)qb8&OcA654aR!0DSB6T`@=NPM)se!B3NJtMe9x +V!%NvCE(kC1xSD^jWqY5EHovZUqeW0jD< +bGjFWLz^RhGs2F_4Lwl7D&0eKak-1XpVrDbv8cqUEjZ_$@s`JQgW+{CtBT!Mq%H_;9N5eHG +3KH?WKEl?yrh=s?FaTvSDOk^7C_~SL9@7~kRK+C2hCDH+VXrK;`<;G%-bJc{dKpY`rF6l82viYFEC1w +~D<8bSmMaQZwnF#X$(Ow@1zXkD;&MDrp{y-*y`>ro`U7z|S0@tpWMgMXFV2El$*|*4!5K)I+Qg~^0;7 +}wN;PQ5h{lf1;wDb*I=UZ+g3lr8oi8c!t~CiScCbQ)BeiFOMIY0BPCi%Isn3&fHR|@g&2FN6{Wz%B*%GL8Jut3fu*%TTIYA +`OdqH`7Up{Uy@7k$%?MdU>^5S_(B7jWs%S>qsl2=HkxnCtt?djJ4g5i0W#jvXp|Kaf%((fNZF-Hn~zes?~e@)3)|$+zd@abq6GUOL~XB0syyukV8V+@Dta)~fa+=j!OBD +x_W5qON3g8QoD|Mi`?_ +TfCur$i|9-3?kgi@H&O(&ZMm>GiQ4--v?jpQMyIcE5Vok2rO}%zj#v1-E2RUcP+w;wUB*qe +XiSqK52A(B6Ts@)W&1=)y~nO?(Sj-_%1kUW|)vRVWun57K~c88(FA2{Ue~M=peT)oRl!a6#Iw2amn*80fVZk}Ot%k_aNR=>Qs6h +D0bDqMzivI7!7# +Sek^Ze;aiUOVY+o}Jkr4fsGtNjn!SUuFt4aadGhfEwv2_I2hHGE{%Hr|^a$-aB3ScNZ>+p=Htr9CwO$ +fqF}svb3R${l~p=@Sv9cLFzP&ls3xkXa4PpWt +B?M8?isQ7Jh!Wc|wS5t?e_|?>K1cs(f1f8n;z++bNWw;io{6^}4X@`eTwZ;m~qzw`HI_GAPTdnf8*-< +LHib@OAh^-`PuvBphuTm7!EU5|ksNw%@+a&`Y`c)unnhx8AQ>c#;jf^^3^VloYz$s{A9>oxk|4;WGnw +3X;-@YIIHGbbdzA}6#2f>kHbYEXCaCuWwQgY7ED@n}ED^@5dElSO)RLDy$DbFv;)&+7BOHxx5N=q_xGD|X3i}kp +al$5vtP)h>@6aWAK2ml*O_Etk!O8<-%002Eu0012T003}la4%nJZggdGZeeUMZe?_LZ*prdVRdw9E^v +9pJZp2?$dTXmD-gJ@mfWLZJKl|B)iJeR`LU`vvd;DFIa(G?=F83G1(UcbPmJ`VDLQx-9ydx5-be*|AO>931hsFX~n#b=$LUU6d@D{cULa`Z?di{T~Zam +pFHx6m69hLh!OKdR8SD&A^h9S1eic?qJvPtGcS&i=^yWg$or8!c1UQ7zMCD_6c7ntwN_`{~DO+MRt&; +=|R2S@vcuAesKXH^j9wQmDmh@-I#B~3YIIGu+R4b)>zkOYQNt(fQGJV>Q%NYI>8Rs9p5I!s!Y_wXFnb +-;JfI%qU^V<-|$L~Sr2X5bB^0k=ygM07Uf34-~u4_8~wE8+bwT*9b4BQ*@ig@KrvL*ck-c{UU +i@m;EAnT?_boQfyiEe%Li^k-XUBTrWrmW)V39$N0qX$3Pw(HK8YbQ_dkdVjTY +W2UFW^G#c&o`4or$b56E9ew1CP5hM|50tNxonwa(t$E?aX@(cUU()V_OTuwAn!dpF&(N^aYIG4ZZ!k1 +5pJ@tK^-IZTS@=oN`dq?kE-q8^ +M%Jy%8+9(pIq^W=r2)+UdDhLBQWXB3dBs(?4+5}Wm8oDV&eksQuCM(bmdHaVzf$(0%)+7!@+ZyOH6Rc +S;%mx+?_FBx(;QskMx&Ie?M^p7&;)@#lF{NPyk)_1J|RzrrZI$!5O+-27G@a2#> +i=<;P)k7$NHgbX^RKH6T!SCe8QdXfl=+3krGv55E}u$qAZ$buXGRm(FaAx4->?F-wn=&bJ!^8e +NJ1AY(c5CntovJq +1^O0OMcovuM!Iq&~*!-0lxQ(q?8ATMZYp^p(Wg! +n9gC90XH7}Qa}*GAE>DhRt;Z0c>3f|e}4M-kKaM6v3~eyRXuw0^l|mw(}#b0%$}6R!$<7la +9ST?dvIrRrvBG9(@ZxwfW8rE+-SDFyIh%!8;S0p$UXpN+k3>hH~N>)gy`?G?<0R2DAkj<+DryZvnLK0 +ixO|M~u>Hz&t$UYs1gc@CLNdJc2ap>{QczT*RMyTA +VP76ogSaQ@W%j}OZaDR&Rx0!YMG=Q)+?qd8r;Kaa&hp#ICG}(b0tiCxrE&=^LLdq +@!QMUZ!ao02}vl%;wCZng@7sm%XRum6X5eF%c0LH;O#N-774;nxnbqy5`A1uvivmX2U8xJZHteh{y(< +FC-VdC($t=EodnMGh2?o9?vQ*@VIVm16&J7tof?@;T~%Wk2oQyU`hgNm6R)HDhKKB`=7WInehqFPV-E +-?R*bbtRSS#)q&){w32PNrOw7{2Up*_;)0_%Ia+bn(QMh +hn}KHphp2XGz~^IX^d~UH<&a7unR$YeN^SYmrxdF2?W;WHdJv$G(ouvp9h$>B5IE +Ug#tUkwliT;dqJ-#ZE7!aGKNAGf4bi5pXlm^b8_27zEL(fQM7s=m?W{}tO>DBJJ3(XVos%kME{hD;>4 +hRFq@ylrBy=1lH_aA@%}e|16#tjyMB*c^h#9v +ql_Hk<_A<#W&wLVlDI{z4+10DZ*bz-xpx~Y4{}HCorEu=s{2fxpkVwIkwc9i4jIe9q%;9hk%PNTK!mU +c?>1ALxj`NXi>%n~Ape?JPs!U$0C>Xtmwafeh?B4Y!C8zbC*?(LIs1jzEiEPjBHv`E76fQ1aSUu$v~q +Ndd$bl)`wC;iDUJZJQP&wMn$Xa@MJu$l2^!=AK47oFZfiBMlgXJr>{1N&3K3qx!3J@F3FwYF#88C{`y +Bil`-q1?!YMQ0=^Ukh7}KJiv*W|qjzYRbdsI1YstRIof$`?rA7asgG4@Nenvy$#+2|IS5A+)l7G1QwV +`o59xI&|I9w4PcXxKjBW# +y@uHU25Sho#x_fi*LJa@M74`2!NEz705uticY0YT9~y-11Tvk8O_Io8IDp49>WC&CVS5Zi11qyPkBHsMHdvj?ilSll$3~$> +&q#b04>qetT>?2bIJV=*q4b=^lq+EtMA`$`F+Z)Nw2{yz@CS;VZu|~L_ktguj|r@$c4>Hfna5UuFdh7}9p2Mi!+P_`3BzYb<#;MH6)YlnzMa>!hdWK_SrP_LQrjGNo7jbDqU((T=^psUn@G>07x +qv?)EF@sqKkaH>cyYDgP#dGC}bb89*GAg;viZpe~i;6vlDDaR*j*ut!ei*P%)mlQ|QmCJ*X()$Jbi8} +M0Qsy8x9K}}lOc)INWeoval~iEoRXnU=%Oc2VHb(m}CaC=Q@y$iUS4A_bdw63a4IFe1;=zfSD`|pqvK ++H$Sml?^Nk)yk56b4ZRHYrs;$01?Go29wsO0Cjuaj-jmm7T~WwjI@WmX7|5ZekBt=a=GYkA;)!CEFQt +?N#=#Xh0NuHpi_$*iTDKmZ_Y$m0Urei^{a;yBrW<6wYZKnpTSw(__ebfuf30&^nlxd>X~$aw@BRynblDW!RaICBhhDGc*h!pCq~wOam_3iZg +NNnB7{BZRihvbRk~Q~$AdFl>@(-0Ye|-$1v}Z7^4IY0V+k1O|xkAfO)QwTBs4^6?3$SxqAja+1ly +Lj7!2O8v#YE0?P_Xh$q{wSmpQv05XaX7w*yg2vt|FVu$>mW4mjs5LKwcW^4*3b(fH&Ni+-@qv+5=vOD +x-8Z>1vDxw&dQ@qXu8`*dbOF#wlBrK}OMI|mDc3})lZCh@lWfHIn^uaPsi(FK`Cjf#LA){YIK?dKxuzu{@&E9SeuB@ho@ +$=-u$7^pvbUDhAqM#Hlp0M&RsCSr9N7pPYyysk%an}i}Rh5HTa%#bIyxg`H*s0|LpF{-hoi)1zQK0c6JF~8T|v(huyZJV_Fcb&f5BPBnEXn}#(nssK +-nVfwd7{Oy%hUP#pJfkEnkS8)!tMU?vj;TuOSg02PSVPVd-+wXyb-f8oK6GGKWuf_vk;B|uLbTtGEpt +3AAUfRodO%3-c!YE>IpQtk)VwC~@u-Y5WFLCD(+E-xezkB!yJF@9*WPiIIyQoDE`5MlcrFsyx4FeP8{2b-1*~01(wra +-q+MNjf*3-uBFtHG=s~-TJgZA7oAyau@2ad_~onO)EHO%svE_P<>VYgDD|Sr{5ibi=Yx=??1YsLg8#f +!C2@?;bt7=bzdN#rKhGhKOHrHk0pBHyc6|nq)LV!)C^*9!S0Y-&hjxt^J@$G1Zdn_gdg{e$YJB;n9-T +0^FElh?om1N$*s8}KxN-y-5|))bh34}e{gbsh<(Rr=^jt>+w^=+-OBsa8hNYa#>|V|q51iOMe^;pm)A +viArA5P7L?tW&w@S(dh4~s;1MDiV47!l7HD_naXaY}b}6Y24m`zlAW3-w^Vsp>LWb!e3Iha28koy6yo +asE{UCB`8ver)7mkt<#~zFy_XPC4jr-|-d(Z3F!_q;By8BLx9g8nBwISi591*Uu +gIa1=TCs8g^FCLtr1uyHNmD%5NQf*x;A;R^u1#?jde*TIy^|1sR1?m!fcd>@@Oh@PDd9rO)GC(r@2%MWv)Nw}3I!3 +ox2@X)d7pQ-C(zqz%mml+B}zh4z4&;Ge~7d@-$bILo3xd<-Ze{axA7BHz5Qi8)z%-4@zVdD7Wd-`38b +@P*s7lrYI}9u*f5>0n+g#OXl3u5b+>%zP_{hl?1a`G8x#~lsbI_eN(|Wod|6mU<+f=S#6&gCfeO_9H$ +wKZw2W1R_S<*L#foK_wunQ%kr$pBqux{Dz5ol8@s0 +J*WytwA_;bmhDaqVRjkn>G4l6@Q4qrF_AZ}IWomWn`@rEhUZFCA-hl32UwY(15i7pqRIijQ#Arsih0po2HG#^d +NfD~Ye_qy)`?~U^%J=z9d4rA{ed5vCe)q|;(8s8X0nWdNCWDHifv4VQg^)!m1mXR3h)&@fi_tdLIM?q +CsrmX*FB%E#ApWr4J%-{1;`UK)K(-{ +@Te6nl9N{`cl6A8xa}U;{O9sO9KQH0000802@m7R!m7DT}}f40AUCK03HAU0B~t=FJEbHbY*gGVQepM +WpsCMa%(SRVPj}zE^v9hRl$y=HW0n@6(w>AWEtObX=$Qlqn%AI*(kfWQ41L;2G1DVu}$~(-=}Qcn3>s +;a!EKeG_HE}UcIs@%ksA`U;c!i_Y;Dcjl>z1=U!;Vin1(=f?jItLAzqKdWK#rk6*nM9i)}?X6A}Npk1 +T<#R&CqjrfQPE%(|s@W}*dE{iqJ2*cVFszF;8IRr4PCEEyv{P*19ui?eNNpjb$J0ai7viSFc&O0{i0p +*tQ7doSr!#z1c;w%wnix<+dkwD$Wd7Q6Fe0bzN^{n-?X~S{@7LBBLZ==k@_1An7X4xsJRrH|?H1oanNi9H?zp5>D)I9Rzd}j37(r!*k@}t*()R=fe!?_X^rX@~fBz)Ue4&~TnzymmMqe +;PztdNAE-4`aBq2_8`85Qnn1yd5I5W>n0i6#SWRkMvjotKCU%OJNIa7UckrADc!e8S2Q5rvKF_4FGB&iwd +#w?u_{SIqJKj}1j;hMOcXdG_yNyAX}bfQ#2V7;3+OXGYCQaE3&N%w~zk2So5`}OZ}i%q*(I~MxI9<@- +_^F}xDLjFfP*nkkrp$I_9X9d!JZ` +6Qq=T3b)lP|frKEuqmkW(c6w%P8Hq;4s$m+=TBdH04`;D#epJ>fzc6D`%o`dUAe4P|MgMRg$SVQ0F(8 +$7ZfK?R#0xo@Cs*#0?O_aFnA$`%1GQTkp|3hb}9TsPOO6rP#08mQ<1QY-O00;mZO7>QwD<0_m1^@ui7 +XSbu0001RX>c!JX>N37a&BR4FK%UYcW-iQFJy0bZftL1WG--d-B@jJ+cpsXu3y2aC?IdDkOKQ;zy-E6 +U4nLL(6}40AP{JYwz){6M$$>VqW^t&q)1V=;xySlO+XO6@Q(NL+;d0Aar{=?HI<+xS@Mc0a>wQW_lvY_SN>(YS;`rnF{N#L|AD@0cf1h8T{c)0#PfWFFvp<%almU70Z`G=1Nn& +QSheAN?xot&5asUX;fu3SB29D3Tmoz#s6lgp`?Y*=|-=uLmLTzQEkOFyVp^KAY_uv92zr7=?C*J$@7N +REYBxV6qRgAa?JKx>o)gh;T{P-O+A1noNXdJ)?e6AKH0E})x52q+n6ti>tfi89ye5%d7#g3NcLCGaY&BEPPoZg*Tl*obhk^!yMG3w%J0dtLQIOfpfI35Z0U!tolmSKqgEYN=kVVWHimA1@!>rm!R +f>(Sg4-OaN^CUXfUatYvfbVwpv>*sF}Nh~*P9yp*Y7k?5`Xzhk}qE;ab}^I^k35uok^%`(r+=SJsYW= +og|RJQY7(bh0JKymE@(0)4-6)NI(X{j>u8Po~+M|m4GasESJbnx9kJEWmPgEZ+y+1oxl6oZ(v0R +LZh!bC%liJd@9ZjsW6;dM%mJNA3aA%2P@hZ0MT*+5xmr%+i-^*UQnHMGN741A}0bIV?9GV;zc8v!}Gs +e0!Q_;i8lpXpFaXj6vHpqg%P;pscdB-z(P(G +_io{tK6U;m&7^XWf7?}SsSRsu)PzJd7;zI7h;Ncm-E8c0PK^xtJ&o4|v{s}J`t@>^4v=Xl&pPD0F3xbjYoen~@19%e-Fu1wJGJBL +#MDUGoRaRKFb$3fdo|*UryC`yL=D3!&YGRXFCb#CCs#+;evHM8S-mE_y>!~aRL%TR12W8LJ;NT~QNYg +GqZ?2MT~W2*T~Sf!`)+n(T}>OG;ZVYLo+tgRz^Y{$JnaX-e;k>y@wJHxPVv)$(kyq!F7NZs_fQ`eNAM +U078g+UV6ibYocp2h;TZ3_qOrmpvad{!#QNwBii6(-9AS49w%A&Ff`g9mDlzq8N9xoXz+TJY)sG|Bb-sG2S{ +jiZRLOa39re1EQbt**S}yXC;nun!s|a^E4-e`SjO~kVJ&0oqs$eqdJcQxwdJfTJFk;*9-Bn}08mQ<1Q +Y-O00;mZO7>Rus?7n{2><}r9RL6$0001RX>c!JX>N37a&BR4FK%UYcW-iQFKl6Yd0%&EWo2wGaCwzk- +EZ4C5`Xt!L1-UV-jju7AARe^<FG6bsY{1X`kOHnOB6r6$f||M#02QX(bGX_|*bw&wfeH$x@} +g7^ISz`k66WYssJ*t@&Ck3kU3W=X<}B1zbatpoh>mX}*`EB@CC-Fz-}Ti2CpL>5FW$fRzPTvhwzaVJE +Pw5ka1XEXeUZKM`y!{i>x?Wd#=c@uRXl-%wbL!4G+Bc7TrsMa1sfx?_Kq11tZeIIQ +b^ZtWt5!(+9oEr?yf%EC716$fB0|m>H5o6#BPPIt +5Og2ONf&K7vjBWc*YyV}E3YPUNEp(Pe;7l_^nXnC +qPB7IgI{a3xq-HLQ3 +Iie&_Mz_E&V;8FBGc&hu7bZvA9*sg5DyXk<{RMPWd^WOfLe6R1hIneuWwkbs-{Y-BJR0Ox>kOlgwJ`5 +brXT9bCeI*0!1XZWu=6t_9BP6??8)L)MDaE0?3e9lHxHy*f_LO`3;~UBR|>Zz_5KvOt~{knR=UU*YMF +a^AXHYvCrpy8;vs2S2KonQOJkBQue&AMTP~#`wX}N@!C2r__G{TGK%?Gn*f!KN!a5~!ds9;1*MHvDAU +|L*`&v(%ao+_)rj#!Raz)8*J8|f%QtHk&5BYs62r$`^l2Ir4FF1#AW4#hePXmI^6wxCBnHte(U6uUCK +rn97}rT6fzF4j6s{q5P};y?<;M8YbPzrXrB@bC=dM;puo@zzdkuvk0EO|(*bpQs%pA5_v0u;529Cvv? +p!b*ZR_Hr^T}C9f$-fONh?IT1wdF~5Xh?7I_Q`s2z6FEE!cG}rb1?Q +T-HG%ef%OFJ*q_+k~Ruxq%8K`?4Pshu`DW{b?~?6Pa!@YW24uc4Og%R^blyk3YL; +^9u45paVTeq(104hVwnWf_uC_K%@KosyAmYv);H1TTh6V-)FLhSqM&b3T8ej7-^(ut6#PSX= +tl+j0MJLn0d33a;{8i-u~LwlJu#uAtAzAb1`&>y7{yfJ$&U&{SH|`aLXPSU?{c-{`7n8_^SaHT?-Jpk +KhJ4foQ7K$>vZJDci_x)m8ZvF +2|7sY4*lJ5N6bE92lX8-l_n;3TA9) +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 +3o7P +8*>X+k3Lg!0f^s9ojT2>OriS%Oi?aY7~7n;IkQfBzxRLHc_<_AkQA@;z~l9R>1SR%#16YaD>3s-J>Mi +^#qpJpuDt=A&jDO^m2jE^1PQGczc}&4L)($5zyB3ubNfpmv|sLx-&f6cRWKmCrQVC-&P2F}_(OoIRbe +r@QC((_a5yvKX85a1ASz(=HfQL!1DAMjg0$0e +-YfBUj_Vb9i}m{tg20==byMoB8ECJq`9*7ZtdPiew0e?#a-MCn5DXf(DdnW(SjolR6NMi;n?ZmjcdE4 +_UA-9Vk{OIU15uui8GkC}i +oT}XUqD3&GysnBGDc9zIL-K=7PhXqd8GJz;8U#>VDB!uWoH=lAZeLx#zn!v5ZUjJ^9fvRXs1cpPgW$m +=@;crDcTAK>mGHZPp6*^;1+dV#GS}v`gvH2Jd)Dav_lYXi(5w%OXL{uG@a2o}IUE17h<}cMe6d)t7so +H2A0EFvJpN_!-`TSd1Ct^85Kj9U)@bBMhv*fi`H6n&ToG< +{Yg57>JMR*<<^$ti+>AS7e2c}g)1$|G_g#J(#GIx3w{EX_@b6R=>Q^^oOTW#VF-wGb2t)L9#ML7YI#* +zg%6|1@O~Yilqvi}Nf_YmAzKu@#6c%sEX}K4n`BRG`ns?~gpKeYCUOfYDum^@cwn!!r;OiKB8tQfDA= +GsM-XlmJ&>58T%=@zrv*66lzSppdx`m@xD +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 +o**hBbx$5Sq?i5+e!@ZC!bM$b`gDDrO=hdBu +g!}6V|7iBBZT=td8{jtX86$2bcZ={g6}tdtr$}dQYQ{qc~yywVQ@6X-DVzZn_cT%R9%+tMUe*NYig4h +Q|r7=6I*V8ak(EaIPIhTI8`R4SLF1TxIs>|h63frd#D=4HI5BqB{ +(gDgD?*StVX1vBkC=_c!{-zYZ8RxdYaLNGJlXOQ65H|&H6I!YD$4`mOQH*sTQS#-dJyY$&3pp++JKpF +2OL^2ZDoK?`KK605-0_Rb3lj?>|bfA?Y&Nmx~i`Xu&$yv}NQNIbEfD?hW%v%iiZ~)#qQ1O1;gG4A;k| +EyuLJN-}+ihVUT`4~EU*`uJJPSL4gX`9Pxnt5RIMYds#?3X?5yrdKZ?T%JNK+Ny-g^7@!+UC057;T~P +Kk=%Cgsf3=Gbd^^d)%jPH~`=$BefjiFurS#Y(3B_N!Mi)Fh||Jh3%9SS@LSa +5={*`-7D+=0Z>Z=1QY-O00;mZO7>Q?wHpV)1pol)4*&oj0001RX>c!JX>N37a&BR4FK%UYcW-iQFLiW +jY;!Jfd8JovZ`(Ey{_bCKa6cplY{N~OCNY`;U6L)ufNW?|3|LVZlytH=OQJ?naor;SeRrhZ?KErW4~| +0W?w)&p9BY+=-R3e|f=qLzEnLaaj^S6#Pz$T{U=Z^=xy+}F2h1X+ryBn$&{#7~RfLJD1TTNTy}!P_Ut +HdNxczN$_wKLjF}z2UtIS|qi_9$QOe9nM9Aa)I-B&7Z(QcGpU#cv_kZ-QFW(Y6feuWULBvBiN8mctK% +o-3`1UL8hf4~YwgxbIcHGj5(HH`%%Xpb7c`OYC8pYZ$SOE`0OC;qghK<-7QW0TJ8DSMFgO%EVr6?KH52%5JLzTsHS!j +$1Hca47rPVbBN+tJFsN0f+d5*-;fe;5qGi)iU(|@M4~b*Z|#a60Mne%QZ6k;rH +<0~AtALCfoR)~5!rA^o&tm^A~Am2TA@z3uZ +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 +K^n`*9E_`A5V|v~75?U*=%vLk+=Lu +j;g|F1h6!k37sTRSY)YrJ*w1nZ9DTbLJr8CoIJtw*_(2YQYrFsE?9Z&w1AhO6q^)nCwB)+FJJ0SL&)?E@{CRS;DYvK24a&Y_l +*2#;9q!Cjhi&upME3-XW<8|h8BC-TnGJ;U5JY=|Vxs=zX5&rVIUrT8Q?H0RJ@yf +n7NJgkO9H(gz@AhZhiubCQbpLh_+czH1$U1_kAXE4fWyZ(tOhO2)~ +InO#M5Rf|sADqGTbFqRbXT*RMQ8U|(9FYu$woH7~b9vn||sX7Gh*-rhi-V17hnqP+4|>~KmGD*y14_=L19=gU%pCTEyMjdNM7K>^c^P7rz~xbk;g+!gk<~!d9 +2WJ3*iB782D$V`E#tq&sk<_H~%0zHOLG@y)oC_fZW6C!wg%Mf2ZNlS9pxI+Jygyxf<(-*{flm!r(bKi +EnbySwiFI9H|xV;y+MJ0|XQR000O88%p+8<~*X@H3|R#SSA1fA^-pYaA|NaUukZ1WpZv|Y%gzcWpZJ3 +X>V?GFJ^LOWqM^UaCyxd+iu%9_T68>QBXv}%EHWGunz`2SZt?V6zF7%w$pjY1_CY7iKeosCFvw?kbmE +Ec#%k1lHKhtutJgA)ZyW|-{@-Ba-m4U>zWm+;*DHXW~t`4w^eiNzH+(P3ce%i(84OQt1o$@Xw@*0l3% +JqrQ{zBzEH(s;f;b%o0_HMZ6)E=72UD&k0W_mlbRA67L$B2baB$AW2!x|9A+%a?q&qfH5nG*Z#JrU>v#2rkA@?3kh@R +kTMS*)PDis5X1tn37wja@O2ef;T(Xs4*mh{VOYg3MKXh$gra(UJ!UHLq`r!Id0BbSt%{y@z*sdCS4>` +2WhyfW}Pm7`}NmXS0D5Duf}$0J!EAiz)bSJsPj8kx2z}8dqZX3vi7H+zR&HVU|S|wQ?SJXt%?bJtDWPC)%+`E&1;_$D<6>%TWE-*mKv1G(tR2J*GwUs&_LmlmRZdS2*VB`_o5`@pbc&2*AgU^%(P% +*wpsf#-SHJX$5eI3iObIeB2DVSp9r`OH +{Llz@Ot_?A2%;dfNR(QuMI+^3Ek-T;AN4?zh0qqktxNLr;XC6TyWFLiq@uH1@fg*nB!fMhC8yi~^~)sD%`w@Mv_1GfvpgqNE$h+`BGl +>iynfwiLHJ6t(>Aksf-Pxw4k0Ki+;#KE3~fPUOcxWk=+NyVa`fU>q6kG{aC;Yy>)Fd(#^dWMfZ&cVU| +R49qG$I(S}&b|(Q5*DBNxA;U$5v6B9Ej@{!wPAZ6+HKX8OW^6VJPW=$4=W&Lk4s3|=Yh9^od*cziv)* +U-f?-J6aY0Zn3T(sflZcBDjdFo+a-GhkN#S2Abl*ij6wiC#nrT-jlW68eF7itJ!@l~;*|M=6KQz#m#R +4mbF(xLfHPW_F(R8j4WC2BAVDD9Bv_Z@ru=^BdC`(Z$(T!`;%pj?W<)lHa-M%r(APh%Zcc_82DQ}r7; +6Ze0r{jqBCE}ZXgw355KC?flF6!mJ}Q~weh$JFm23B58ho74d6~?yfbZtX@0*QG?l*B1r5a)4r1)QCZ +OTwx8bY!&tj1<|)g4M!VH+|_So8tvRox(ad9teobhmZ=Lf$|PR8R;&B$~&jD;}h?sG*23B@|Rd54w)C +QeTl5r@~~A@L1n^L<*$OO~2L2W ++&%?qU%d+7tA`Xn{WLO`=Y9oEvj?FTEK^R0t=%_nW={l|ygKlL@S-W-u7j$QRiEeW;)bg|zjFyLamoy +I5m9y7@G;Zd(z{gsSRpaTB44>%zsCN~n5tiT?spe_kfI4hucErdFfkF#}c}7iv&sTVwd%i6ax+jqK=` +HhR!0BX&&y=b&Y`a~hwk@Z?{ +GsO$<)C{cAP7SJ-WfawULLjNIs)JzWUB{oYNTmT`c@R%J8eF;BlfyHiPM~&j0aU0hB7FH3?lL~`QccR +=eTv?#xLX~+vwaAjyP@h;7?KZC$E}Vasj16j3WUoRZJ%u&(KDQ&RG{B9GdhGB}%wIPo-qBM}cnHl9rMY%pMR+@C +zJG4s+KDBn?q<6J$Mwexg6C0iZMxAmM6zOK5_pxXes62H26yqk4ZQlH)wEcT&OH>gki$sLZl$ToV?hy +;Dm6g{ukPyW{DXfY3c1a2AC158_W=el&6;V~FW8ycg?ocxmS+P!j9LQREHD#0j_cC+b38wJ*Xc8WDOl +(Y`&&gkfb^!z6d*Kum9JTXrK=dGy`CW8<@!t*y&f3p?ie4CBbg*;Po*ke4J +^nueZ?!ahP0uG4sNP6X()cVF_N7_{mcHoJ2Q1ZJnlUwX6;;i#-h_nY->Wph_HulX?$YYgmdR_ZaCkoR +YxLjaiJ0ILbEU}=`n75zrlend;EXl`FNsyLI@t$Mj*D^p;)~!yuCOs?YEJ>N +OFSH>GvK50zKuM)kyt-L|i_x$80a^=gR@Wl&t#;;?*!HjMh34WM|CCB~UGPI2>@k#J7EfkbEx+JvV?d +C}b^)VW}`j>fCMu41nswGCCD6@bO(Lte8${d{oJvVs8T399@_jD=a1@6&a|9J7_y05@3x5y+7V>1>+L +{!N@8P5{gkh_CT!m=%9@_$wZKkHT{b*x?bu@OQ<)&S}rTa#i37>phHd0AnVL~&%EdK#9;yY-FM_nT3m +GKuhEaH3tOXM=>ti*QhDAJC0V`giO^#)EbCIA>cL8QGkwg#s{1L3e=)6T#DXeJ#CU#YlZO6lx%0Yp$HL$=%YeRwGarp!|E2}IW9p8Vohz#r +oI5TA!64p3Z-^hSx+@&d+YKSpjTkOun(Sk?NV^`hqZ2kX-&@*e4fJC>#lB(@7 +wb0++4q}%)Y_*dNZd6`0!O>c6qnH?w`D`0LhhY^TOkkXKh=z{P>mb@=f05FRC?+3loGj@|)MXJJjvXS +2e&`N4Tx;#1e~&*>jVs1|wy6(QS?8O6nLy# +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 +@Loov7I2vRwO91>tkkwRDZ{C+u1rs>`*qg +*j`V{*pu&!9H=P*#^WWku&m0m_yNmy{zeKaj`T-w3Vh02hU|Vd`(cR(2n&pxxqn +Cr@Nt*aRcdAY-%We1AE#~O~|KpsCWidT;!Ie?LEUL4K?}~)WCgfat`7BOY7_bYQtKKf8|E`g(f~w*lP +)h>@6aWAK2ml*O_Er%7#bxRN001)t001Wd003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVeUb!lv5FL!8V +Wo#~Rd3{n%Yuqppz3W#DhJX!QK@X*{kRH;cv{0ImYbio&kG)D{NtMRkE~Wpy`q*{6m_`?AM)PLgycsn +*>j|_S24x1OifIGuy&Zv$E_&hQy?3Onk(!lHryLi*&~(;wcXZx9VM}6f?Q=LIZYHI>8`(a`sL%1^qtq +Jx60Z!Qk2(27N(UaMT};$sm{a)481&+xXfHx!lZ-L`%K;fnw9&)$nLi(pzGh!7gpnf((J;n3>|vLvh{ +GOH3y1FA+xIntcv93B0{KlgcZKZsKh#Umh$K5nQgq74o~=JFG7yfgJJ}7q`7q1&J-U8ub4*oLIX_r~@ +Wlj*$sh6O6w{4p2&Rx^r#-^M-2+6fg+83L;Vfr)M4G$_;3VyVEac`u^$?~uh4qux$BZNn_c5D4sDK;r +C)~GKouB#STZVv9^L2lq0vJmfQo4*i=SMna47|hLG}P5C22w_*rePt_Rj4*aoQBQFGTk`9SH@h=(dqO +>xuj3&x3?btq$&P|dR{|LcGOKZBb)h^Dx9ahST|7!)a7cn7d6Y)q#BXw8M|1hONR3jY*y~Iu-9wXC9E +*V-z_?VyL?4qSK6cZ*4Nc1sWf(FTP`Ka@~0MFq$qpvGSic715X>ppR6)4RKcW7m0Y+q$$X>?&?Y +-KKRd3{t(Z=5g?z57>;kRpM!wR*~7rSy=Gs+HO%%C)L20|PiQHnmN*tE&IK{$L3kXng^XJ#Xf{c_8{h +8wXOitxzoyX{#-1jPAi52OotgdOtX!6_+F(4q~9}1y!vL9gc(1PgptDY5i_;D$? +yW(VQ@tFShdT!0DX(D(v$bV6Ec$I_!#XlFb#Dusp}gzK2~t%XhR&v}c41P*B6>O_XN=)S~Q&Y0poGFA +{mYHXkkeX&D_C>hqm@ls+=z^`y`57wDo+?J{L{lA#ROFcSXbH`aNjF&*0;{w59Kh)E{fOj8e6~Ft?kA +1w8Wm&`rtq?vd>pb`){v17AkIKOqgaX$gJls9N<>mWC048-Pi71cgMx!hY+;!kIM0y|^uwxajHKUZrn +CU3odo*(p7I$E#yl=ibJ@pfx+*EHrpj}3NmM= +`T7z5XVCe4JFF%t7xXy|5*lsbcNpX!$Y*0xr+Zmsb8<1ig(9axFFeOm4|#eN`?IoVd}pBOr%>24H~}W +Boty0KiZbjrkJj2>twZb7;w*x{DjeMMtMj7;Tr-#^hsJ2L-D-BjRhWD-;4Jxtg%T@1T8uVLr`a~bqzu +#=lZ!h3lF~d%_4RKcW7m0Y+r0;XJKP`E^v9ZR!xuFHW0n*SFkDyNQhQwuLhJun%!O&4bY;e%|ei+k<5l71(I6F +Soptp_#uh3oo-N|K3EoKIGlO&9>;W?gw%wIVW50SsCyNvoEm*ddMQStPZOGmH$76N3-W2wRPcr+&Sj! +gSyQe-;#%1IDwy#n +DlEH@%)*miQPhb!iB!9!J5{H?<%rJT#Ec%aB!Id!x#=`1MYp_L#ycvJi-gGEGO^R+CJWY`0Kati2XDx +Aa{2!Aol`)X+hLM9G{ot6l^hWre6Z@)RF2#mSUax=6&5Qd%gkVGO7MDtIzy3-g@>3N~E*ocB3Z}qEIs +!n)c+_?+I>{=;&m4cg-UW<5YK4dIl|y!Rvpd;UaSDyb|&cpZ5WX$;`lPe%oA;p7zD0BxEB`#K{=5!{! +QkT6y{-`O}EeP`CqB>_|CPW4V=yd{pQGU1neNkaZ4+75h;Q=$)mH7CV2W=zU7&h}R$FnY0objE50OPZ +_AvG`VyNv4`YQ#CKQf@yZU-EH2>NLU?8$8_AKw8AjY}zV${6tC|>aUnw&Gm#g9;E`D#NqmbB(L&FK4W +Q#6C&e~89xat7U+Jg|vT=hMbO6REkbLbvnRgj=9|086fRQyyb{}z;I3+sI%Pd`5|_i?BlC#UR|DC{_? +r<2uJxGrYd!iAs)CiV@hg;m70hTM_gvYJ%8w}th=brU-^^QmdSU<1vg8F0b2#V9Lv6{WuSeu$M0Cnrs +{>e6enCu(kuTR$`ASffkw3B$=FRoF`D_ZdQ#OFH(sjaVe%TT^%=X@qUDF2^WV@$2Rmp;<+5n-h*BO}Q +O}rdO2(*_l0S%)gBqsi6#l=4Q448z2L@7*d=`W)m)_Q|`;gArSp#$--bcX%z8>-6eZF*v~_je%#XAZo +eJ*Nu`D3gHO`(11*s#{fwzD|Et8eK-{0=$`%gpDxFUHfVnJ%lAw9%jlIXN+Jtaz_tjVa89Qu>hOaG5n +%vt5LJ^ngH@6aWAK2ml*O_EzED6nixQ001)p001l +i003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVebZgX^DY-}%IUukY>bYEXCaCuWwQgX{LQpn9uDa}bORwz +o%Ni0cCQ7Fk*$jmD)NzBQ~%u81&NKDR7OiwM=<5E&m;sO9rO9KQH0000802@m7R$jL1pbG*300IR705 +bpp0B~t=FJEbHbY*gGVQepNaAk5~bZKvHb1!Lbb97;BY%gVGX>?&?Y-L|;WoKbyc`k5yeNUx8gD=gl&1TlY +b?;WV?g^r-`lYzq?-zY#307N&|8{8Ne@7}LB5#*Ty#0nMTUTVy#98m>=y8d`-Xt{5g#UAc1l+j;wEf* +1>p{8z5TU!*$h;cjAZz`|{rlRh9$Ve?ZWep*QbaGEA+m>HSjzPpG^hru==E=yNM%Ns4{MYZAeD+uOru +r)9tEz}; +_cTsI6;d~N$bJr5M`vA|pEhXegUj;7PY^CvMvnx6KeEsyGyk_&73O|-_o=UN2vTwP^m^j-KPU8|7Yse2 +REySCcHkK{j4O9KQH0000802@m7Rt==d!N4E@08?uK04V?f0B~t=FJEbHbY*gGVQepNaAk5~bZKvHb1 +!Lbb97;BY%h0cWo2wGaCyx=YjfL1lHc_!Ch*-EOen~9vfdOo%AR8@S=Gjmv*b;76&C`MLlF@OAOI+ta +XG*J`ZX^AlF(+2*G!@)I@{KD)pTlAH7YOLE-Q+>yi{4aRP$|KEb<)+)MLYh6TY +o|jp(Q+2ku$}Tl_+hkpG5Jl0!LB1hSi>fH}qRXqYb&oc6UT6UBo|K(_(-ryLK54JbSN`L@E2_&&z{LE +l+N939wfWg-^Q~QPyWEb^?koZ~SyKXl_F&ai8#T{b{qPGJMs1s-%~m>{Km0<@=iBhRTZsyyI5y=IaRB?fH$kGX!TS9Nr6N)_vm&t5>%SU2MRu?&!_bF{O>PL(#L-}dHmPYXW +#LoN9B&cd_z<>Egu6Nvw5NU*OPqF@we}Eshg~;8vc0-NVsP7%f97^SeRIC6rP1>m*_IXj>rDT;1 +&V0%OM0AdYXkIE3C;QIB14E1p673Q4Meb1`$t}X3qPm$<+NN?2i&U8>mRgRnM0mqfo=Xrhtrcgl+ +CF$gT=^ +l6MXNVm1|24&qk;SvEs(Z>C7i<2FvC7MeR=ZuJbm@@`}FC_`J*R~&L5@E9z8vof&gOMS50vXymqnH8! +HcIAm&d`(!ZYk{cH*>##du~i9gB8&dGGomcL{R;BMM&>U2ed)#$o_XZxXS@^;}^U3c3?FVnVLR@-i>b +lJjhAWt(@>#SW1&^l|nyxYST2D>d$oCa%pv27YeaJ$LcE9OGprZ;)F&dZc(TQ#z_TawtW$rc@;gd?Y2 +l`i!v+ZG@sK)Li*4r?G_0`{G|(o^!*`=>Wo$_b45l!RyHVXGTMe=&Tn_)m5P34|tw +M*0v;dv3W7!t~9e|k-}7~W|^Y8o~h_1{dxgEBHL=I+fLqtblS(DOUp~WoT+(bM&s5i)n?Z^ZgsJmsKc ++-v#Qi?O#IY<)WN|4ZW_8#$7c6PU?F@@&*GF;c$!WQ4jf9*Qj}rrBZ?}#nHi0Pw#0>MQl&9?gn@Q#*vh6NFv%r3TS0Rm?lp5 +`^gz=r>h`E-$zoUNq@ka&P`}xZ!#BALH?4nSm)=Q+#T&ryjTZ~>(dssc%8Cgl*TG^QJIwZu9jv_EoGmj?FP4Oh%V +qE17?$D(M>EU-tqq8MGi6^!dOrWef*Em6wscUhRcpe#YM3Zol3sb&DE6ctBJ%|e%hugJ@(~5}*DLw@) +;I0v0$iZu9E7%~7m3XY)zGE9_n-3qNE+iaMLIRgLqLHB8o_a6Z*pn@gM(RaS`lZPc)EzgG&qMo0U6dc$PJqlmMtbgiQV?`<9@q#d%9S)z`Ym%DQMP=<o +eNzFrJ)qfmszBd2H+iecdZZ&?%Nu)~2U*6)Z-W~BL!wh`KX;mc0J($L1M234E0@+RKG);-^ +$DLC^a9b7D;7jn<@q7yL&m(URG9$D-t-Do?pqg4*^1p^OlP#6Qi8Ep=~P(EVQv#(Q9(VwP0y2^Vxg!8 +y?!@W+jp$~BEPVR7+k@T+JGCXWB +&nuiSvoILEs(eZcp1|-~;IgFLZgGH&w~{4o4Ox*VaYe8K}1RYnjw3in4N>jcW6*WnCZcLQ@b3JAavX- +X#JCKj-TlHt`C*K@ugLjjC1(?2>E1@!GnP2pv|X0;eIrMk|Y>G}vy0T1i&Jrn8Jcf?|Dn31>2q?NYWi +90w+|Pn6$|h~&)3YrqKieri`0uqKo=)Zd#nG$7tTAqRRgq4f=L10oT)cfJO&^SVt1d~39ns3Cg1X)jZ +<5>QTGAB;^8{z<(lnz78}JX-+VF7#E6uEo#|krqu1dKY`J0;+&X9f#d%qrM;RBV=x+7>y$%pBlmz3La +~eunz74xw!Y*4Flf2em}ex0mAGp#GnU$aH%D~z-HASY<74bwv^9QM4JK{W4#9OK7clH-lFBhUP(;Jq +Ku09%B9xU61_j2pzds-}S$vO{;N~HdtU+PNWTuE7{yorBX_psE+~lBxBYO^FO%~Vh(Lc8-APRX%%5X$ +Cb^4hKdr}}oAOOV7XV1@1W(p-#f=Mg@7&p&AV9Cmefju-$loFcg&%ggX^+bXou`qA49Z54dd-_ccO9{ +js3>J`k1>`Ss*;$gv6V$z&8sKj^V$3t#jhKV5RMiHomz-QGUrUNMjeaU+`>B{VK61|D8T4@X2$S>00Lo(KmjJjFwS`N0lU*?dXwOE|oK03(x@hB(5rHDufz8#*s3&Hy9Btpv4?CQb5=RofdYBf*Y)DHk +DiE2ruF53^KQhH(IG7Q8`2MUEn3P(*IC-Hy|KmgIjo-g`@JF#QLEMUVk|^Bi2w|iRfx$Q%Pl%TLYFm= +MI;B>K3DxEW)LO#HtpsqE&a3o6O1`-!4SE7|BO@t{QVTKvJS{lT$nsZB5KGs2F@`pcF=Ou$zEdii?%E8 +)Vv94sIDi3}zZ~#^VK`B7hc^ZlEg(x#>l+#4YLjb(Nz6#+WJPK9~q-!vaYRsZefkCu4_D&9lW78g%6n +Bv$LgLut0|y1Jbm9bJMR+s+fh|alUq1ZO*BoO0SUnYc(PoL{b8L}T1_wt+o1m< +swr8y(I$Ttcbm*#d)l#=Oh-v%r-y)xjZ7Tsj_!~r2j8#h7PFhcWl0u8$U7|eMq^m^n*G!kcPa8!=enqvtIK=^hK05gRaBRl7sJ@eRcm%OGZWecmkq$<2qA2ueo +SbjnIP}C^nF$eNtOU~uudpioh@tN;$a{Uc(7HH2I*rnOV$M6wsLp7&(vSzVHiI81^ +0~nQQ%o>Q_1&r#2O$=zCLVct{e~7lTGNf$Ze}RV+^|ksu^f5TMlZXWZTxHD3#DGQ3+i3?BhJPB^-i(5 +ussC(&?+Da6!!W$J&@lEgloaR@xILx5>2l*SW`|n8J|j&TL{5dX+fYjZEL+~V|h61McJJ)38J?2_dBwS(U1VOK^bALlCd#Qy`26-dFqB{Z#oiwsg&^D*wWs3%6-BiDTFWQ2Ejbp8F6Gh{ +7IM@UobZd4kIh>1clX^!KZ8V}0Sv(@9yW;ePIz*Tcl0QYFWDn?Q +j89=a@Z@KM;85m;p0QUQUjNP(GBkr?>18(=q0suGJr+UBhnUO^XCpk?Y)YiE3F2#g+=;7GoJj}v7q!D +77uU;Hvbnp=W3=<;Khm7ONEKXYQBEBpgeUn}XzXYdl)3c`wqWf#cKaAi)tsmWlfEI@G!{J~_ +S8Usklcg8%_OhEccT2G2^Gr<(y$VUWL8EvT|YiD&t2!}^}wjt23aueW$ybhW~XW=>0b8!?aWOc&VY-y +WsZQdB4Xx&;kWWypG*<_KBNCRt*LcB{B$D2rNhJ&S +FdqE~@H^mJygvKmUC4?CjOclNYBi(&sPEPoFbtq@=6#VqNn7fa-IAl_KtT47v4y;hG-M=gG;pk6wL$?o9!AC`lp$s-Qx0v{YKp$j8~4DVhoUQ}xC +iBRBI9I*Og)ZOUj3NAL!W7R;O2*r;n9*!V$hxY)*O&$v`v5%rZy9$*@}2pi +Y@`PeCF51U*+pS^~%z0FPf+1Ouf+624 +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 +Yz33l@`(7a+8%&GX#K>+_{ +$|?>|bOxOcD+PUSmnkX>Z-gZ;1kV8lc`S(ze<*3sJg6+?ZCqz1EZSHk4kVe_#8$0Iycjhs!M=<nPZn9=FZYu{x{8W+45#=i{$z*XL53P4|Xv +~+l(f5&(5p(Go>F$o$6jGx|pgi~^aO6$EVsotCM$tPn15;OM>SZi~?qWHCDu?%4I~9Ao87OXn=3P|zPhtGP#~ACwun +Me4^U;E3+-JXgb^5OqE{l_M+c8s-Ht&YP9sr7J?5})=j{T}o5iZqHPwAVcsfnh|H-O}u>hSV4j_$LWHg_ut2O3+@IKCME%zSHpDc!FqSKkAuxY0hX|P)x(Dm +)qknqgB!0+!R3FuTmBRIy2(nILt~8zOB=WKNHX%%PxpzjxJm}RBzM69Fy$1tn2y}QyG@Bo8t71D8yGB1LHlcOCM|U}9MS2sv-3yae}D +2a@~)%pF(8CUG;)ttfkhNPm&<79c(~`MGU~4`Ij+(J-kV6*VU_+-z&Q446he8tHr;aeo +TSBme_oxOou54M? +z>)jrD>k{%A*ewCJQ#|(TNJBLs(KMJ#tI?-id_(>{%DS=7O&l^kZps%QC$%cY)ZuU#JV+=Or7>qP?c( +U>kV=In+zHk9mh{xZC@#hUpD79W0UMvHj*n6FCTQEPtm%VjSCV?xiS;W1}?uknUIw6uLj`^Mu7~p=JC +YRtrJ*YK_2r{q)oD?)K;gL>QNcviJNKT(~r4iMD+*Hj~M)yWp?`^ZIcYG +O^4=kv2C*&9|`n +_e3MtBUtcb8d97C4irhF5efL +)=UKVWd_yZce5J(6M!v>PP4UJIS%)1C{6h=FMX6i-L4;fi3B0J$`l2@$b>PoEzaaDp{pBQ61a1e;})q86p3Ax{~>D_;Zh +YC7GTkCH9PC`avaA)%m>3sx>HYv_6!ze)chD1xN#K^ +!!hq;2;#3dBSY48bzsNsI!UT1fL(~p{ZrvkGjA$5iFyb}Q!lJ0bj#`pF-x4XDq2}9c`j!4(=1AOIy)n +T%X4jc1vdQFfa`651v`z1^$~>95^PYTrJt4Vjr`X5J2Rz-66a8Lk=L;Kc?Q)I{^9$G#DD?a*jFL-FoL +Kd6f`?E+=u!g*@(sVf=d+nR2hk-~@GWFv+X4SA0}gu@>cj+9e&7%t=gnmzK(tcGDvo3#xG2{VJAy$&& +%f@9UYM5Dw3-iYHd|ls134)rCi#fnj(?gOZXp#6_f}m89N&28>z4+X^iC*Io=<5E00KAAcYE<$LK1rc +;!{TiTB)a=EvzCZAnjBa*5isH7j|jt(x~pldi=2z3xCm_lCE +&_(?CPA7wd_<9%XsX|!qLYc6|L%!lb-aqNS8(7eIV)0Xdfx9WnazREmbNk|UJ5F +aW++LE^Ta*jSFfVlO;uxN<#o`X@el@9Lh&<7#%|(r(!-Q>ev6qwlwMCoQi_hgJL$i0dufEzH&FbqXl;Tcl=C>{IhZ=otVX)+_f4JSX!T;f!HI99U%U&u=%-FU79rhcJ +;Ry%OrQ^ocXqNhJETNsf;=ASJZ0^*S20zgKcC*%zQL!BX&A5TzXwhE~{hvr;b*|hN<+|l(T+N07WLNC +`ikJsH=!Rb$vugG)P)h>@6aWAK2ml*O_Ex^YvKb8$0081Z001EX003}la4%nJZggdGZeeUMa%FKZV{d +MAbaHiLbZ>HVE^v9>8*7i_w(+}v1*>gpDd$rjNYTQD)3kRv%QL~*UexeSv1ZR3_#>1+R0okU&JO$?U`_XJdCTN>8okPY7BeLm>>%%uEI@H!yv&$t +t4h`lteXjzi7Zcf16UiWL1fz~AOP{w(rLk!n(akV0jaeBSVeoEOMpF3pWu7(*_GPZ%@7EOyjTZ~{t$@e3Ey!}gzANG7OwR?n;^a=0nXKaqM9y)k_` +vI1;Dbf^H+nobq3((AX1y-&c#&t$z81`RIEPMEBF(qCL&CTAjZ1f4g3MrhvG^$!v{h$uVk#-^=XEXXs +c8q0W1-?4g#MGA_~!WLHE;@~jo;49DsoU)GwDnCeg+gYK@=ADANVi@3_QgDlWkszjv8KrI!$wJG%?qE +9Xccg;H{-tYUYrZk;?@M +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 +&$axIX0ipKHJqf}{AoWfwLVjKhv4Y% +*XNo(qjG{em2cuOmhn@d4<{ss|Hg;2vTj&Ls^fslvrlk7S0fV%~O#k7k2$peI6*aXVKYX;)lT;5%htC +$O%&v$6cp05;(5CNmD)xQE7-E7o+;+~eWG<0SmH@a%;z){I2n9meGz@&vH_jpPUePz2V7Q3ninV9;RW +1Trw6rXN2E_(w3pm)SIh0j~4TvHx^`IYoxW7XA*8TMtyW)6j&mw#A^B4GC?QFkhjsfuTLD4tFfBHSg$575k++#f$VYZs`5Zq`o!ikz}g?*ZXW7g +{;lKUuZ{Cnd{BU5$&+vByO?&R}8OL>slS-jjf3o#nrtvUqrm{0TMR$AIBKP5+-U2R>%6^UxSJ@Gy1ge +fL=`(2hKarx?fnOvDf!IY4HUB5w2foI;Tp$?96U&G^R@!RD&&CazbW2u;S>6a{eA2$ +F8dBF0-ry4lfEs=5~DP{rLEFwNQ$xMb*KyI;g(BS@gyHZl648&v6cP4ft9a(%Y~o}gHwwb&kWiaKPD_ +44XmS6xUnL4ui`@wTVa?`R;y$r{%cY|Yg8rC;c?zInP1!@I(jgw#@`-rNvGK`2r=M*%$%ObZvuzpaFf +06${Y$zkkf1C%4{0-#B+03CpV^|Um +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 +fy2fs9tV24qj77HliS9X-{)5#P`N~|NyKtu +$2&2cwRLP%rPx}@O14&|f-pdng9ro|0Gts$HUE9z(RVjEBiE*OmsQe`=vzA#gXHH+k!*X4H2Y1{inGno?-J;8Uk;;4WZ_@S_8 +>+sn~r;&n=JXhJFb$)Fk?~SC|Ai781gE4K8c~cXvHdd(Two>Cpm{z@>=}kAi4@l-gNNjjDhZ(eO6qFu +I`6yUsfMVoJqDThYw;HRbPLhpQjoO0K9=UhDFz{UYTd7nvQ!>HJirj?zMXITAXZ&i>n(|W!HC2RkqD9 +qUg$(5Z|xP*Ni>@5N86a(y +Ac7at3(Oo%hpLSQx(091DtK`T2r@j9)21q{Y8uWWg0RM|yoPS-OycW +^2vvHKgsiMH!&(T*99qc{w$YWswqyctflYMbtZs{aDM$Ex;wIIy(5yw$<_ZAFJQM4<{k2}&XAW+gIfg4Pi;AVpt%>~Bb?fiA6`J+!yZpN|Aqs-Z_6W9;y(cR +_IYC^7tJeC_c0w1R#iuT-SJY2wTRbteOG8{TU=Hj}6en;TO_+tm<G+ljSy@5DRhqAR80S*Rc1ej98Fid$2##N=~0AJ6}P-GE9k}KII17iAuo-GREo<*@dJ3Fh|5+*OXg +vHO#X&2HorN6Hbxkh6BC|gaJxX#lhh+4byh{BgdToAv2)j+o>u3*t+d4+|We%KMVGJ;(6hbe)>Hi%^E +lZ}|FOOnzC(Tb}Qq&7>~NXiamx_0bAH$>707~vO&)ke0=B)W?e>|T2;-gDBn7NmGZh6RHGW3 +XZdUpiv_98j)mv*(-kCZee~OVX)2d2h*IVFJt0WDVG<|2aSA^?4xd1^EwuvNAQ;v+qf{eW79n|`<@2p +Bvh_mXk92eF+fC#e}`>!7T!K#cshgF-g$33j)M)oh}>$dGL%C=xBdUS?6PPh*5Lhwj~A}vt1<&`sS!^ +Ra6pkfr$1p6ItZ*77FDhdmV0HLP2nG*4UPK*prz@Xw{=`8I~jEDWcZRQsZ7|;$-PO~fGG-IsxGFg8|B +R$uR;e?8T4h3uul_fpUnvpOcF$TqCzzA-)Ds +Jzj98TR#Aza~LYYBzB}@jv{NDXyH*&6D)zFA{-I`Z7f(M?23AYYk268ZHPJp3JCfI$c_Aj*vOc4LeyB +Z8bpZ*hqTCowD0$amJ8eg*0@C%M;eZ`EiVTF%7hp)*ux12>x>Kg>nG?F*-<$(Ew}flsO5_cg$|qqoQA +_5M3m?>lQq+691--;UmyvE$5&0MXJ44nb61(Wai-WhaPlM|HX72gaZ$mbu!Y9BKhAS#h0n4EP_OYDMF +s)A_Q>z2%d7*wf?pQuL3uIKZvu$WNWfSwZDi_)1{fmHEf(HKYnhWbuU_zaU8CkV^j9F1)M_j7q$AtG9 +~L|d(^iQ9!2xP9IM_m{jZ0lx$7W1$VA+{Be|@%*;o)hOe>0GL+%rXt-AQPA!6&lUA~j +V3zK_${O_DU6h=6$(kgnPaR=wL{`9&mkCSM8o}700jpM(phzbDhL3D}w1A?*F>%9j#n9z;@NV-Qs(t| +BW8Zf*@%Y|?3Z0{Xb$!`Xmlj;yJlL!nE7$#XhtfJNCuumQea(G)=*~q_@swzHf*sqd^xQ}~Qp!=ZiXO +ot;O}ynnhi*|2Gi6aVMJN-vr88M3xPmRc)XMCp&URy55bUMwj`sKfq01KNVSQYae2;s=vbXShrTs4SA-pH;pe@I}(!b(_A=ZULX7}`;*?mZ!9)jWmW +M1^e2mvj$LW%H1lN+OJEa?9wkqP?B+w%`u`PPCv#%82p!p<(1_QLr(bTk|Qj%{g$gSpnYgK^?sF&p2Te0iTD!2^cpZAr%)#3ln^!QGgaid5EOqfEvr1l_S&!2 +|_;J^lzt?^LdLTnDLvp{Z#%Em#JQLLF!1ni!qP@70`-390h|Ipfd0Epr}L6lG4zH`CY`TziNegX*RHv +zc0^~klW6R?D8Ke_MP?MXbdD7A|To-oU@TpdAxHzUE7Yv-u4fNSC-Jg*v*4X{XzD5N2^h;H2jNA^HT; +_-{;0B3t(LwrBj9k65ptQ06nzu))F0#_C^k!>?H6^X7EUDaS+NpS#@C8Bs}@8~!%W#{*qhiFoNglg)m +TS42q&jU+0;b3U$UO4jGGZ-ofK#%^gii*hBLM<&7E7P5}f*Md;fffyDiYmb01PT1S@qi_Jw2UB|rSXz +DumZt^U|z84%K}v)x#`9OX(1)|%pwuU0~MOx@QF5?E=IxX3eH5CG9-n9I!!w+y*<#zRXyDqj_S~J5D_ +LosY((f2U!+uMsgGiPee4I0pK@(QLKs*85hV(JTOaBg&Z=o4s(H( +7}nYJadd$sPb@^=8^=;p?bqBPnEan^8p#p0SC4&lq?Zk)5dVu-4!blt0;xh!}ag9ne1DP#|}+=*7t1c +R)F=%C@QTe?W3tL!@XHIFt>DEM>_L%;FFP3~0r&0}O;gEOw$q6JwIn`ru(=XH9CMAJI*z|7!Zhy(?+4%;UAN){k +TBX&>PiQ64DEwE`}H&r~qvM>UM7R3S^kwFK38bM8ox}j8wa^Ey8RO!+wwI$?;lAL^=Cn>94H@9iVipU +~nM_(8r8I?lQ3(2}OeXvYaIhF +BdyOU7EES#B>of%@9rr&pXuMNouFMiy}6}z(aVC>S5_Zy@#{O*Z}BT)vV=?>S=7X=KbBZ~aC1Zb-QLbEKi1FZ_Q2gJ1eB+%B+d +TbH{F7MTgG`gN8$pg9FPct43pU(%>slG^30*oZwnpFpZ`tSU-Z7>ILv-JCn`$gmB#Mky<8nf$HF=jryOhfe(w&9nIxcv43;q)!!0I4) +z0%Q%KrXb%RBS*10*zu+3Q&lQI=0H}pdDNlP(zJdy5St;W|W%79Bu#+GPW5{#zLc}>VX8f(z38S|q#MYog&K12tRWElMkZqUq|(B+rvaB-?kOv@e5 +o=TSpW)cjR9JdGmB4faIKo2gytJsPL+zaTIm{ZKt5p2-GLaiIos#nsi&^Swx#U&4JaCBg1j!7 +H<&5*V2_^Om$45vy!6R2IwXvGd6@w4SsQxQt#Rl`@T+Oln`=B=Lk!<)(HWP8)GD^sky?PTdySvSW6HXB=<)J&w&N1(}eui>>RqX>Yk5H^xViLz{xB +E%b_K9ad#56r{OS8GDt=kM?bD3Ee*#&#TKU|Kx>di$!E)w16s%ce*tH9N4XwrI*>5>HO3v99hI|YH;q +|cYjS^<(O4a}9@lF?zcCTJ3sIw=MFuVh*1Z+sD%RD2Ebj~n&~Umyo)I4bM+YEl>or+f+Fd_R$zI^-iK +|h6j?|C(_lOQCaZFeVI)q7ftZP+;~ +{JQ|BG!yK($RIERl5R6=C9+XW(wMc-wMmIsC2!v?vvQACa8nd0E_^ +;07D!vU)0*yGngDFnGtzN@q;yS%TU<94v1#Ofm;JR4UI9jwlJZO7Q)iEVl|nIZQ2HlZ8vbvY7Si>1Y4 +Uk2yeTv)unk{&=9G!Xixf;Oza0gdm4^xA!Nnxw`Buo_&_diYAQ|aJP(mw!)Ri<)NAmSI%yS&h3oo_?< +~5>NnHciiUHMKle2~1x>>CccA2|T@x6^LVO2ByB(Gh0)jgC5?8)H%dHS$n|qeDO|UyKK+3az`tZhu@N +dpaNo5P`d85M`SLQ=`Z#o}cZNR+||tXzqsZhLRr|3vwr>H+%K;KZ+mTJb&?IC4HXl5oGKR)PXv8O!I^ +QXP>t8y0)}s%MclI1b}2vHe|rxw`C=a0}OgU;4sjegyD4^3)ar+JW#<*6rs#MYZC*OJSWFKb;E&hEXz +vub>zM*V9lh4#;ySw?Xq5vLnVc!%$^K|6sdEfcAH$J9d=N|v8sWGCvV<7f1<*ESfAH}w4fnjNAKJY=z +W8NfCMPT4Ptd0S{#&pL2^u(W)UVs(1{1_G{O|XRW +p*h(-lmR^^Z9@N<>`6yoYoViH;^JHauLxs!)j1WqA-hs`0}S@ak=F{r(bN3qIPRK<0d&$#?5i4{z60Y +h&u<9XKcz$AFFUk<9PjSOf9PDQfTM{Gb7-+-GQNg6-Ko?2T+ZQOnSOtr5AH)&Fwvsp!bTY3gczOm@!c +?Wl)E5UFi&lgy^;FYgZ8iO1^9m$r&1t5{|+(#;0E+>LSr!Gn8&?p%L+cq8zqTe!;ai41$9gTw|Hi?&j +$ZE=TUKlxqrQ@VV*UEj~%LTp21x!7P)iMU}`3535#KYKjqvT;>4642EAg@et$!l<7l=P&$XpF>qUq%w +jvya+6vWVWD1*SSBP>F2^Y?A-=;D_F@3jOsbod(4EB3;E +9JRam{5vRb#jZCSkd3sG+gvbrTIMIb#H?w8l)Nfk8mW@cdKaCejk56H~p~oJLicx`j#*b8edoRU9oFM +Wg9A7E4_<~I+Q|E<{3)w&(NWsGi{XFo{V))Kfajs6foh)nKbD71`h2CCrlKa=u()ecnI78S;C4r!$Xv ++)V#CgMZd*RTv!jXk5LF}V;LePA(s_AB>4C6AQH=$mQ5h?iEAoP_d{PFDhu_wz6`jb)%^?<@Mq1(W)#!5i4if>$BNu^s+GTT?)d(oajydr45L%$yyAXs)V#jnsbEmIE%SyGZN#sS7te +nHIPd|$H$-jVTz69;f~2>O|%ss)+rriRl{LSILwa>!iFcREsu;4WV62Z7mXC1@)?KlFzkjwKT3>+G6m +=a8^mL<{I51vA^@ZaS(SuWdRGBUl3sh1P`Po@Wve7fZsypnvSUkmO>F4`L`Akbi=-^pN$a&nEpF#*48 +K&qJ2V0L4UNmmnNhB|1XUB#D*N6VO0_{($N!i7~jZK)>+T1cZ9y&S)sFSzJE}5S=Yj#@#_=!H%&;`-S) +}s&IL5R5i{&Ob<9sJ5!LCe``LD}5A+)Ew)S(B5aiQE` +*$Mh`mG;#;U3Elez=D?8&&<)Y$Ttr=y1Cc8y8wQjJ&`wt5GE*sRCg=>rBGP_=eadKO4NL~eAf#9TG#i +I0!Wp)Oa&XZv+*F6Q999k;vf_Mo*D6j|XZmSNr}9wh=x+^&FObrK_XrOLCT|^CsN=8%QM_hjX}`8pW@)B2~bzrLFNNz{dD?(xtdEw;_}%50&(Bvo0M+`(FQa!<2Kt46 +Du5*kk5gy<{5Bg-bCEU=LNzPv%E$$EW`h6i4_>gN7mwbNiB_Fz7i#6!Hm2XAMF;_wP?CL{qlF&?;5>f8 +wDZf)!ElKPltxInI2qH#V{^Il{b2GtMcFlC;&-0G1wHl6%d=aG8v*!yXa**I$330pp<|ubjF;03Rfpea=}2B1A2SgT{{?8=w+1{BkWsp9)T0Mw +=<2040AJ!Rk`XPi>}z8H>JpV*Pz}*G>A;A$W3o9=iMUkjB)gc+?2#+NA3600!(DW~E549=frl4->q6E +=yiFsK_=LWFuJCj=?0h3!_on{t#*o<^e3j!&S5)=f)sd=gObPLPiYv%A$=Q%h)NI8C80*xoi&eFg5c- +bB&nB`Iq|2u@k59spTg2a{);UQu$}rk$Zy%4=p0#HpvmKNH(%_0BPwdUyz67Cs1s ++Ys}J*%N=o%Qy0t3L1p?P`z!41Cgr>et8|K^{dU3f#N3iE^Kzm$rkPDbc7B${LZfq|9-X&|Cu#}vh?f;ia&Rm{wzsbqF0>e4pe|`>|$s +@9Q*g~Jy{8OYD{3tObm!Wt3E39{N{hSQy?<-HG&VWJF)dX=h%qy!J04wKiTvkYOOn~S4bd +=K%R8#(LHTYADVQzx~EGSgc7SZ56~A=mi6I|jx*VA`l`O21F45hz{8CaGD9q`u18u~=%nj94S=mWI3O +wt9U2MHykHQ6xV+W|N%1b9FHTCYm4WUA&^{v9ejt_8s2m8XiRN*49O=%jN2R0XmHQdLSgheNR{u7vDC +KoBM1juIr8PV8{#$muwY1_r#w~3IlyOk+FyJV9eCBz<7wee;TQ01f4rX19iJ`?t9*^l;=G_D93YVAAa +eJiPVZl4Mm;J_(@;s6phbNi9JlVr$Kdwp+!+%7Cw!7?oJUKC$1?R-)lDFH8=>`d^08;g03C7wssdCb0 +pDN?^DFY5S>hX?mEj6Q`WTOrp +FF!y0win_t~!@jl!`#E}g+QD}R;dsniGIxb$&3qdL+{X=PAB-P= +9X@bw`f?7qRXbPMMu}t=lY85xjQ$kjxxT8(dRR(1RCT9=nC1)1>)i{|H358_xp7#u0)HPf_r$>?P`8T +1Rmvr{0YO(Bki&ak1-g6Z(pD6+<)#S(O8xg9S3shvbdx=3`lrdoxT>o(oKVUIrO_d+TZx@7kY&VHh~S +^^>xGT=}s+}Is9)75%1sIGk*Ubk1rbME#R*NCpVC5ib8)iSP8Q~OlT5ACiMP2g`^B((|iPIYYk<(Jd9 +@9nN*;yxWN=f8IhA%VOHc7!=QZ)L3T;}Gtxk2y-B8MUqWtXEAP~WnQ(A0Mct^3=W!-s(~H|RR;vHuFt +IQ?%o9A**B_cay;%jsILug_lZVGljU?^W6- +2TrQPoxEM`xDJGe)-M9#z}qdg2c8604tmuSHB!U=f1L(s#U^Qcv7|#b9a;dH1xgx6}rg@Xw{0cD}HJA +3{t0AtP)1~nYI=hVUr9-Jxn8_e?;aWK*{IYz(0z;%O;WdlF&yNlKf`4B{MlPDuT-{7zyTv|Ke3B4iFh +JjDOx@dOlZMLbs2S^LKMqGwIn}SYuly>2K30s+ns)XkP5Yb3!2W4)DIXm%Tt`f4$j%EcYqE2V*S$9LE +Izn-P#c%Ge+gA$DiwNO!_SL;lMv$|WZVY$aEhD(fsK%j`Z%fALrn9kw!LkyE;?-DHu!N10pIegCUW=j +yJId5PF}&a#T3j*9P_wNDVnOW5e^ETy)p+h@7`ugN5_kms8W_Jnk9MuSIOdf+3ZEkmy|9pmh?sts8lX5@U0bkVH`c#8E8aHUZf4)a&e9SUEqIZ +x;!Nv(`CMDg0L@58XC%joee$p@>XCA&~*fm&xfAKWFgHJ=H?kdg6&fz-mZAZm@Xn?s>L{w6%FQPUdnO +;Y-A!qIeyX~QO5QjbV1?_o%NY5UCuFoL|tE1xvRw3vt&fmXTFNVGZzoTC5+r=M1F^7k^ +Gu5hT$d2JR0i0>~G|W&hRe(FE$Qvom_91hLvL +|e+%Ve*On(JVSwbDFIx`EnjLm*6KvYy808@HSXzgBQ>*?3sNYN*Qi@ym6e~AXLzGZh7*>$45_}B;S6U +Jo*}S!7utheD&2_dx;y__0ZrAcEf^U0vV3_@$Ja^{6UxOVZIimjId^{5Y=uA>x%)3wNRI95ZmpR|3_x%S +6>Cz6-Q6|q_$F^#9OUesiOL?m8iB(vV27>Sk&@e;?8I|Fjdae;FD&wY$*o8y1()IIVMn{j+jcPye@f3x(bHUdB9ddfI~`Sj?3`?~n=AE7YIbU!KlA +QHkFyhk9GJLF3_w(_O3USfrwlh;B<`xTA%I#MxsUJW{*IsfqvmiR{j0wU27z`xwNM8`WwibCZ2n_D49 +lJeL?FP~q(kd(K~d5McYoaQDbIu$N4lrv!;Yp%k)%r#B3IkK~xe0F9f#&%=^FU)HLis`tgw~?Jk5{_K +!&Vz)5WGVdBGKixN$acs5&;tR%tAL~yFQsc`2Q-Aos`;kFqB?W}(3NBI8nJS;Uv2@0+8A=QBfL0|Yh#>(JGGMX$=h7 +d-sT@lGBD;{ulNQ0n>^sJ8F6b}aQocOTNM{3uob0GgzRlz*rwUhBPjq-~WpUU@p*1324w`wRJ^RsN!m +;WDGY5PXA}G_5-@RK`L`C7N+Oi2R!`AAJ#s0@6q*kxo(o3KwABywDOMzsj86Jvho2HH2i~-AdjCWK6y +$m9e4FCkncfP*rVyae<}t**9Y1?+w2SMZRunbR4+~CcP(d23`!Nlg4S2K9*_<&DGVFo7Bo*4+-kznw) +vEBrY#=ck^nT$eQz7uhiAT@~PCluzK*4o>M^F$`T5{gU1^TtaS+e-t;J4uL<0m8xrMMuNjzrHV6xhpD +@Je`smR&U;XQe!>03uIL~RVvXeYub9p?5C!V}D<2g_h@)NGtUBA8n!UjUtIc)HGQXi}YBYb~uMZP}o7 +7TASe(SG=9Zqk?r0#Z@6aWAK2ml*O_EsmISv2_s003YT000~S +003}la4%nJZggdGZeeUMa%FKZa%FK}b7gccaCxm)OOM+&5Wf3Yu)0)2U7<~Y9^5)8(DYDrkp+^VmqkF +((%5EJCKZy}t!wzdXNIyQ>S24gSpmDS$(e6n-;76cS8C%}p*I_;HnX+SJC^C9fXqp)ER*&9t;xYa{#I +tLmT~(M<(q3dpR*fj-K@SYWts8^P`Nf~DYAP(=&3CslWPg4#l3-z$o3za^GnK=lSQkS38j_HL?QnJuE +Y*5X+EGq45n}MpZYNLS1Jcai6S-dh5qosI#Cpj;$QXG_wc2X26mv_l(P3T&7m}q2^ZLHjv$}SDBob%v +Ppcp0e9oiV(#PNJekdASs|=tfx!>p7BhxV4r|8IsC1mi7K-(pWn0MZxvfgF204G+0u*+^R$3Qm>7%J2 +VL!fM@3ev%gq|ph{xE=EF)=Wd;?=B`BO8>IMgW1S>UY+e`9x+up~ZkSanc8x_7!!eF9vQ@ic*yGzB@# +}yJ=7EKFxxxq06VF`F!BlE*&8xDq8PF++NcYqYPVXL$XY&ac0s7QB+{#gvm8i+L2(I=^a>3d`ad#xO> +(VortJso?Jo;Za +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 +BxPe-Igo`HJG^;w5bc=%pb;LxRqs?eK +V%!OVVz^LAm3G{PMFT`I9CN}vOy +i=zTLc0w(TGw3gnj%-W=)Mg6%VB +VJTm#T&02o91MdT2pkXrdNBJCA?ygq;11&zI|#g~gMI;Ea&_&H6LDBJGm3c04eE6=7aLs~je +0@$=e=!bk#`b3k!1yPHt3L&iu3E +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 +;9X8)tO9JRtGZL?wnUR#f>@q0I0HyPS6tvHO6p +%_+|vCfQE)u^P&v|izZ41R3K6kuda{cw^5<0gK_GJ(;bK`aij-5D~GN}4JAlJf4-dv5TdrlO{`EDv*6 +X5=5SmfUe=8?-krQMhQ-nWi%g1rHv!(z5^}wcv8h$=XvQ{8zST55v4M^E(p8SF`-dIoZOevU*(-K-6G +v!+A4`iXo4@R_=vyGIkJM7f6yjMg4luDm{t`S9XvD2}rj{GQ1TP-RZfeF|g)|9SM(6B^-Q2{?Pha()r$xwQ@Au%?AVo2}{Pfvu2FETlOc{$|bzxW2PD1Ph{CPV9h*mdI=Ffyq*G2a#$UhCd~0Z7_Z``Bj9 +_A_H5R+mX-dI>l8T07;=#J91VP0N*D?fAeNXg-_-jX#8_7NWaw@btgZIv8+^I^%#bK30Qs$lJhwDfve +{eK>mV5fEfF8vVVn`%`niC8O|f}S>C^3$*S)tH)SVrAEIvpRT%#J@UI`SeaZ +azLUWa8$``(#+-P@(Hf9Hha7ugBAUUsTdCj&pE_)aTp}MkYcz;Z~MqcXz;VbPYT;h^2^yBM94SolVTO +3Je+m?l(dORSp@SC8TR%sjv@`M5pSno!ALF#k0!XNAGX{dN)mh?CpyH(n0tt7`R?|Vw~kMpx{X`!H7E +!G)bU0K&QT2E%E+KN6cY_^H;D+MEz~VkYH6`uyA?*i9b9c@GvFuG&#+hv~8pp$q8``lztHq!BttLfct +mA#?UCh@bFQ{`D)6W0>z(AsGK_1s;RN;Hd#p>ECxnW^j$}(6hNIzzBW1ro1A1$VxbL?RbW50x7uJm63 +A0ASU2K%qzY8f65u&HR|N+0MuLMa2lOWx2a6-*7+tj?hch|06-M0fr0#`FD92>unMJ*1UQWO{i(Xdd;bZ`(OVwPAr1^Ny01Z<{vxIM`BCqT(!cjode%ny*SRLR)}oL;5HW1D_#nS$g +-MF6{PrO>mXHHz);nJqT?ukm-WEVY8!Yj28n5LK1CyBa#&*ecj4#bb^+z7o&NVWbq$)ZM5k4Uw+ekR< +8KGDSYNdYXwJI!Mfb@dpQ%Q(Y~K7DGl*0@@9VNV}UN)2oQ?*)*Iqhb4i6=cwwu&t0eQOv>p;a(>8I6C +^sQ8YhM_=BytA-Onw|d>Q^iU+9Kwl$7$C4qNDS}X*W?e=nTx*z@tqM-#WC(iW4f~3MQ<*2*nxWgXet3 +dA)G76w{heS)C|(M(AgP<^axZpz}^xc{$E?V#5OSBpgR+j}se$%KGsjQxOzdT2AdhG$1j(5w+6rS%?eSm9l +8L{YVdc;2TEwg^rl~TgJjsqWvoXx80*jziU?}t2}WJMp$E4E13fB0rmgERkhAw>^c-8KxfaVE&d?Hvo +Z|t^0HC16GG;+IO5a|z4|U(Q#NA`jf53{8U5wTBR)B=nERBBtjHN^{+sJg-DC|+zRLXmQ2L{47e1Rm@ +Tumu(|0PEfV65IdVtl8IuBpn20b!?;XTzw4%8NS*qQ6$`iCGK5Kl&aoKE!^Red@pRg*n7P) +E%O?}I8BNVKyj94bzzyi)6lGSC?X~r(XW+{WhS$&3HAZvS8cT8R#@=OLP?I7w9sJ_bR5(Jf=5A5q98x{o_w~!XgR>ngR$-P&L9>%990`iWHxqFoqAaT5)jcivkmD%Ll2eXcDf4tn>LmXMEelA +z|j7_^td|9H@HnOFH@`{E>n5XJ+By66-jYVCF{W;<0GsZ~5u-r2SSxG#!X3*u?^1u)>$6OOp`+CpsmE +t)r)2z)UA7EvT&6)nrz{x?}td=oKwc);(RqpDykAD24WbGi+nusg~?HT2s)m<5qZ3fiiawG_*|}jm8BUHOoCIuahq}?aNnodQ8vG?JB83xk)|;be2=; +Uw;0ArJ7NqTu>n1`|6ouIGBg9yMEC+v6SQW`c9A|k$?l@HTHh|hTgLvj^t&Yq8Tb@ZZ<}uWPqTLTTwc +K=C=`j=Ywt*0SNyhMpLf|eKy+l5`1DwqEBA`si9NVoY2K@B$%oG|fjMV!OKsKF;iLbWdZ2QvcTae4l5 +jmCHJi*j0UqpRxe9lXUFDny5;t9;>4F$GaJc?OgHh9jqHXa2wk?JLEp8uDl@pKa1b`wMoYkG*agDSQj +Xe1msj=3Nff_bT%2IJ(w5TO-`jEASFUo;$lz-+(<p92EGj{|4IOi3nHQ9eOx+$NRwgcEqwg3GGf1a34j4PdB%1DoDDX%elWKCYPy +qe%-8rjU8bF;7VR({pn&urHdwdR|d2zneHL5<;CwmMW9fUHMroM-noQ2rqRjxfgar-Bi0~~P91qa09g +lw9oQIbs2Txn+OU=WEsAUB9N^cOzJ0DQ<|3Ski +`c1v|QH2#jXY$BTXMg1b5Cere +d`iu$BYii^5n82=RD0Q!Y{{BiK}Je(hD(T|;Cnd(^FzvbBD??u(2ru+{sVv#3>UYSy7O3Lv<$`h@ij> +S2qNAFt5SV$$sUt0&7Z(Snl=P5J2nV03o=WIvavJ2E~?lT1&f+E}U9kdt0Ap6FH8zMc9&DY~Ji1}e33 +-=G1V3GoufV7hWcrDX?%SCD&@Y<)a+>7{g)fHc6$zXJ+Kn>N|24R%x41EiS;n1_n=Seyw?E|#+7i-n=p$P48{mL`2#l{dn2ur<3+b1`S)T;KbUN?SC+@PB{~ +3)xfh2`JTYpINBdw=sB@_y7@%VDkI7KCR%ghN&v0)Qjjm|~;A@)Ax-?lu6N96h;n4{%? +v>3=x$?@;L3LMpaR5|8t{lMuqp25+1bz7Gm-ohPveO2Ss%ZIQq&Qq5^^Wg7V`hO~Ni|ay_b$u=HQK`c +YNdvH-rZ2$R_i;t!3PTayi~kqa6ApQ3ZxGuLkiTGH-`)^>3rof7vc!G_D<>c&9AcnZH_dj!w$$-KeWF +Uk1UAO#R(zUZe*QxTPcpsnrIcrnwnZRy++1Tj)Z}~sInGLRZ0E5?2&kf0z)nC6g>r +W(m-?eJ&b+iehTChlCVRa|jOlsFztBoE-fgim}#;j9~@Cd$44LV|`c>KnR$h`)DponT?XH$OCFtX^Zn2zW?+BstQY=)B6bB)m;@H84>Qc9c)<>ykqw+~alI`%*TjNC1POA4BCQS(H_LO +VrXcxS0^?=POSK+fWhei9d!N*yGjt-q6zBNWPw`Mnf1h-+>j;h@5aRl#m;;cuk?KX5c!~e+`ue_x$RMB230x3(D;Z=dI*>DbXEeBhAy?gq*^ib5vrveD3 +!WFB-?>@FsFbK+iO3N~G`20!xz4;J3H_Pp7<;safki|3L +gvTk#`KQ#nB-(jj+4hT?RLu169OU#9B+J7ke8VgvurxKePFWNX+)kERkmSpJUsC<*8|B;(1VchE-^m> +Ia5OykwndZO>FAA6{TCyDJ9?eh!O1+Vjm&ODnYLkfypJ7u1Eipy2Y`BxP(8z9wp#K21Ca7_m;NasQl7 +psVQ6D?&b?~ICYAF677bV9rkd$L<-jeS>FM&Fs%(dI}rmswS5tx_UP>paqgE|h6@%B)C{o}juoIm}~* +`OoP`7{N=#!+Jl5aYNKxQ2)H=JIRpRw3-AZOUAo8=5Ax(udHjHMAB_KvH4REAtQoBy@%N)OS0O-!p!+ +LX?dx@H})pQA3{orp|OlJaadzTRbLlrpqb1QHih6&^~{D`@J*i^x>X9IUo!3*@&q|hsaJR5I2xygthA +{vAX)#e~Z${Csho8e^N#8=|ZlL9Vmo4C$qYAeeJ8np;t83ggfiEkS;eQ4rt9UI-m9Tt}Pf^1IO*TH$ps<@+a;^eE +B@dxv?;JSHW|n`pUBPlwJvxTW3=>d%OrpbyeGH9xp|@2}w#9m&g2b#CH;sM>;Kf)CU!OxsGoA>#Wqp? +ADpv?a2JCj6+@9YVroH6c%?7&We&UJYj(m=5t+MGsOzO69!%aTR@zz3HUu6(J@@m(G$EhA;nBL&+I|O +6pH9`Ne9h0^nni>=7{9YRo5r^q1RmD@X9$fy!;J=)b~{!Fmqp8;rkvq(f=q-_(caRC13nBkGtCopXf+ +ldiKYsujXzq+~;*OGn;_xfnU7VW*H?(i*V9PjXMg7U4>3u9`WufCCWVxH^1F)!8cjjiJ2h>Mn(mr!3(_@OGreuli2 +hUdPPcXMtWH?Lo66eXz&PhN<$! +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 +}sVJ9SZ-YNP;nm;h c@H~3hRBC-GkQbZKvHFLGsbZ)|pDY-wUIW?^G=Z*qAqaCz-LYj5L5lHdI+dO66MN@Py5zyWt +U==QRcnav>C$sqA=E^rKnl3EsHid5K?JzAgt`&CuHACxq=i~F<$l2~MSb#-^WtGZKfcU?cQW!Db;!_d +@=i(0-}@7v|jb&b$3n(pqdZtpJEeYa)9VF!OR^(nt#@Ld1&{&o54>({TodHe29Q+oAPy&U9UZ~E?Uy# +0ZzpKk}=SBr)_zlN@tzrL-7YW3%8hr`Gp@2V|dUGI0g(|5a}?%Jx6zkcAq?RmT8`j>*>w7)*=_+KkE# +GZ~FhB-vEZkdhUn1 +F`eFZ{T4?38(-lXOab|}YwIPwDqDCJL+ZKcng>GthP?RqPQs%a|x^1AQ!_Wzj=)v6k*w=EE*fZn +jk^2=XZvELzRzIuNcHeLHySXt;CeI-nBdlPup?TUX;E6vL_{_Hiz@8#P!^fJ|Xt8mjD{#Xg_PH@WZ_) +xC+y4p8G$=ipz@7jP$EU<3H8&NcMd#~Yr3x6MJ`iS$=ZE2FJ#@!CN33sB{^?XP><{`F&)f&yMyIh)J;7c%AvY5^T)k4G&T-kQ;7{XoxY}D2Ihy#5sfeXLy +I(MZ-Zmk404R@zzWLw-g9d6}n7;=XuG$QC%*{d +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 +D)elN=qf;ga3H-84L3jPj~by5_VtEl +q7TPvH88Oe1y&}uEXJ%Z{$0t)SDu5Qc*PsP&x8F={x-3KmARU-}dDX__>Oa~j}$ybd2y6&6Cjx!E5lv1RlGTiB{wCtV +98DS66S%oxFSet%agL(@MZ_f*T%^>UU&9kC`m8l*-D)*$Cxw;Qurgj&xxzXsg-xuiQ3?rr+CBK1G3rd +>I)e0GnSD!$>1;f9$x#$+gDtGk+a|>s3*GhJGvx%1aX?L==3282f2gFy)l&QKB2}XePHTdAWFmodwTPS+{`)hW94%v-P2!>4zJX9-p-fR*Az0*yritCd +>skj~ElFjgvpB(DxafE{F_q-TOBKfgF#_cju;87)BeyNl_%eQkKNDEz7Se=00jOsRG(DeS40z}Lrmgz +9&BB-0m<{|OGg1feD3|105B&jrw^^e77X=MSoy&SO_z@mf1YSya+sNWYbP0E5qy}@s+Fj# +^AXBX|@;!Ej>M34{_C)=)B%^lMbW3F>;ufE3Tm_zA{jg;FrBSJy5ggt=z3xlxPW*By2_VOkE-)eS;T~ +*ZGOWwZ3idiwd9J*b-6ff;GuI&G{=Vbut#fn#$(YZp0?#k(+XD-}{|1VHW0|XQR000O88%p+8Db-rPy +aoUONfrPAHvj+taA|NaUukZ1WpZv|Y%g+Ub8l>QbZKvHFLGsbZ)|pDY-wUIW^Z+FWM5-pZe(d>VRU74 +E^v9}SWR!+Mi9O8S1go6q(C7Mm!%75uag|ztkY)f +YMOk~2u{`+l*1t-U>4psX_*m+;g+b1h%I+)mf&YNHah`hScSMtc +Out!bfpmGbH~ZkW-cx&R-39hw7I#stSd!PP*}+-PPSC$+Qe0w-KIBeXKQ?OPx2*7_yHJE=%aURj57JDtphk^tX}If_-h3dMKYD&1A|));LT;_2%* +XFsFTo(jGC6J~Oy1;a`_*`35u&-&Z@lX +@g1}Iga(R_#KT8Cs%9{1q4UZ2mtWP2HKOhX(X>9t7%C7>-Ow8_DL%m|IO{=F$Xn|RV*aJ7!AW{Id-a? +@G33HEN=a$+*!TSDag@BBgqb+ugX>+huam1%HySyOkI4N}G0n_C;LqqgxLg!dV3J4q_DEbQr~+Y8KJ{9b%*7E1ivA-A8M53q(Y4UY;F~{efb_hxJ{rfIJI?!yOYUxUbz{<; +V%$T$x8n?SZPKer75beGF^6O!jdh`k4F`iqf$H__ftA~RMipq{R#w%}#SUZkfeINxJm6sL^)ayjyVuu +<|MOKB0m4DX{f}#)!!>Z(fOfAUTJ9ZE>=3o7VZE+4CFRHA7Q~^@SdRv7zl +PNEuUN~G?(I_&NvO6DxP#%o%=))(>>;B9=Un4XoeCDl@P?(;B|9<)hK8K$Gj@^Pq|H1m<;;+5dYAXd0 +N;vhhdAOosS+1lypbt3vNSC#Ch?_pz#<&4!+J?VsU}(;^EZ?)FDn!S|i4{Kg3Rt6zPHD*_T8d$3!pS3 +42fZAX-8g9}FQ+LyzQgKax@8r)9CnAJc=uaMm%;>#)MvcH9PKR7P(lC}X&@=@G#Ui?(!rOaK)%6C7j% +VT1|RbIEl9Hc2)qHd>f7yXFOPsIcwJZP9l%&qAGTn_4*uju1|6xCXJ!hJ7&2GP1Tw0a(kctJogTK?Vc +0>!wT_sxou6U!r-JxP}D;p!U(POrz-($DO}$b<^tBQ;)SuyEh@74JXz9)qSLU6M?@BwA9%y!& +=TE@@iIXnA|AzbyO52R-V6b+4CeIz%#%UtvogDrz@5MTyL9ASh(JQ8HVM9Eg+7aMWV=c~7Pf(8&Y!A7 +lZu9&A|f1Q4Cww(tr2OMsME? +Yez7Xll_OrbN5ewF>`utSEHy@I+gHMv(MWF)f;26x0m=mjUoBh+)=Ku}P&R(48CD?HAJNB-iCrhXvdh +=43VkB~Lyf9*++z0UIIBdx;;juitdXSs(LnH^-bDZl%2@Qqc7YWE`V!f1BAeshQt~_gOk#Z#N)*PHn@ +8)694B(7n4k4$PlVvsugb4`X_iE{r3?Y@sZ_BE){z{ihczQzuypho+nK-pY@3@?tg!6I0qSPW*i|FMW +z~ytj{mx5?+F8O#sOSz7MGjnThQO9KQH0000802@m7R<*OmdWZ}F0AMBn051Rl0B~t=FJEbHbY*gGVQ +epQWpi(Ab#!TOZZC3Wb8l>RWo&6;FK}{ic4=f~axQRromyLS +z(RAc_sCAv?PpT@6&8%{!d{U)eWwkX=x=_}&++D6*W97QJ2`|F+Y$cs)VP4Cs(1mQ&OuUA`fY((s6Ys +!`wrZ!UCR|##fF1gGSO5O$`rXz0{O0G|?|yunU%$C}dwc!u_0_v@WdqvA9$NTs{m;=zZ~7{mvyi_@v> +U57%96T1c{e=9yNPVq)y7yD7wR1`qKG$nB^GDy+$G1esLFefD{uAw4e5JvWR5epX98gNBUL&z|13PC( +JS%RkYT`T^Pq%PC9~%qbS+k@c~;85Xw^95U%@;x0m^g$G@X(8%trpix|Gf-myKQl>^8wAv=dSkfLk}D +;gaFK-pnTO(;CC0$q)ukSW^;7TyKmh@D?^=@XMQP{41OEp88k=e<1%3(a5l}63@myif7$CAZ&?vqsoJ +jK|^Akh%jcE#+`^`lGnh}HJFhurB)c_X5>%e0WS#10&%N@C?#bAumY-&n~CC+nDgXjVzqCC!XpUE65{P-4dZExN3VB0K!iGC=2FIDb^h5?9wSvUWT68M@)%TB?LLX23@DaR%$)un?<5>TZ@_Kd7=G>q^o`t!#5>y|UF$ +z|1nb8d0N>tp#G-<0Tt^(u!Uc0VAPu%0B6}a^5b+MSD-=8s{zwOEw71)>gqh%1*PJ;9xX@fj9?XfrCJKf^7(ejxX&OoQwfLxecPB{1iisuE_z#9!OV1EWIBH>iZ{_R5iSF^g`RiOZtUl +-=N-9mBF9eqmBsI>UsBj1&mPz2^#_=lm#v%`U%&bb^M#;I-tdX2%e@P@yluQtA^zRP%>lt&%}8@_Fj5=JloTu7AkkQrC2ojhQ{ +^jEp+^PPA}H@q=UXZNv?Fh&1qT +fwBYu2T@ppoI&~pPEELZV6DG^s-eJ*-GkBjm+#(fh0Cz$RiqPZJ!M&kuxHLQ(-sp)-@V$cp^k +Ze7D`KE|=-FaZ8rj^lNZoLng(xooH7Vt8RmeF{s+q1f)94r>?;IxV4{0Zt8=H51+C0?yGcygF1iTz2p +>y~$a`DIobt!c>U7d5%lTC>yhUBwnxd;7BWHIsRZde@vxAXU1yp=k49PLisLtl6|J~<(dQ!FclIE^2V +&;^VQ7TVGN?Cr$s6OeJ#H6>_kiapAqM9oA&MF+(BVT-w`X9OM}3YrC@xgF=rlR2TeE)A8nFz*dYR8LPEZC#TQd +4gmLp)F3(p%xdIZS9T+(22sdQ0#dWtBl~uknBZM2~bX<3RX>P*Cc;&^iTy-sq8%|5Q;JAl$U@?Iri`Ltr99Qau`DUoN=>5@&FPC3;X8hYZD|%LCSwF~C*Gu!fNLoQsuhs` +K!Qfdt=ytW=Zskgsx;adEruMmwa#s%<58YPrTxH +S}$2<>ueW-#R%c?IJoWpN`E+*Hk_vS&mT=%wS-(nn!3XdDD^EYnoUd5b%xEz4=@B3MkD)+=@RA4&Ra{ +p>F^_?p<;K(`W)Y(J2j*B?>(=UYmS6xrO48*1{$aCTnucNnjz3Z*h+pLA@y(URIkes?ph +%_NWS$E7pbj0E^4>UaDVR{}H!S)b$p!bpOu;E)Iiyii;hDGeae9iL7BpuPBajk($X#0&qS~x+W_3#UwN^yuj`nrc+(m(R|G2^pS*ll2Wp-j0r*$dGydntzRohP$p`T^m0%yhA +3J2$5#(`bKEqt87^UEEpe-!SL#kkyTI@pa59yi8H0-qMGF967C>`X>WP7!{SPenvuXcZq&0TtfFrQ%~ +6DaJv7B0du1LT@ho +r;!tgxiYoI>ijpM;oqsUHaiJsJj`uTqh@gpt?^FF`0_mrT6I;vA68LC8_~|^CN)?x(nL-& +mOr~i*9B|s(Rc4$cvYSqaMP`tE7e^;2i^b +s6^6@@$E_%zyWHs64=@U8kcn_HkDRr2p{e@(@=?(0hCE6|V(vlRpVCQR#Jv@?A$+=zgkoP-3xbY+w7p +SxX=(E@(GNlyMi<&U5{ewP|>$U&xo@#&C+ng=Yzh{RTt83ppB-pUsf|y4XhRL!=eSW6Zn +@6aWAK2ml*O_ExMKo!sXG000~e001ul003}la4%nJZggdGZeeUM +a%FRGY;|;LZ*DJgWpi(Ac4cg7VlQ%KaBp&SWpXZXdEHiBYveW*eV<=(aS6<@Q-{!(Vn|_|un;KQvMrR +7E=FTt&!~|luOufOmi+fU^0yOD+O+hgCd_0c-E+?UlnZN0%8XK+d1^)Zt1#3xDE*Ip-NV9de1sHHn!}Hx@RSK_%|4_9k{<2jz4sZooT$oTEBlKbS +`t@c}pMoQ!Oo*tU;n0L3BBaTc@cOC8z0TwOVCLI7dIps>fbWi8jfK@W5|MQ>mp-)3sw&Z0PIn=)KY0? +uREVL-ijBS(=$z`*e3qE0NuaJttGYZ=JVWlG=ZSs7XZESc0M%URttq0C1`B=@cBMpNFI2xkzX|TL@2t +;F5Gmler6-5S~h~$x1QZBeqR$O+lYKolRUG$s3BEW95v1lu|Q29AtLr0Rnzz%1U^-1MGwJ2QvPEkS}1 +^F*7cvUk;6Jt#b0>j!6V$#qr#5vz`6?_9aK1mrDJw+`af_(ccCOe*g-eDx*V@`-9L_yIQE2elsa>H?nSyv`QkEGkr%9MjLtbnw1%$@zI`^y +*lNSeo+(VKsES^Bpn)$gJ_AFpE*#*XV1V0q&-tBiworXaEQhyU_SPgaV9PIEZecD{mFOp{vtzeOwJ)- +S!m7)2yE#O@nVKvl2cd<4HTYhW%t5HLn~4w*y8TD(@q`xulD+ls_h&O1fTi0*LG)|rXm5{bms}PFTQt* +{j4kCghgv{w77AsWj9CxmgbqxDo)D5Dqm9BKC1m$WBtD^xM8k187{`-7-j1v7xtaY}bfaB`qdD!4^iE +{n*kg>F2Nuo?r5etZtu=OL7@S2lM8E5%y6H=h(5O`;&!6-zq*irrfvwQbCtcI6}moDHair!NHN)W~z-bD;M!nkX)3x+1$4 +3CfD6Zw-K<;yOH?bz=~f(`9{>K31sa4#YrtTxf+IaX@X26;C&Bu40;Nx0r$jo#s$*-g~pOvsSF(^T7_ +B}^tvs=rM;Lp-w`#%b=3^&c~JjV~ce}la*xpO4m2&%X4^H$pTsMyj5nOb8P;@n_^kv63r- +apqj8uG~#tzkD2;cI(n#%cO?4)P)h>@6aWAK2ml*O_Ev(dFx~6~002%E001)p003}la4%nJZggdGZee +UMa%FRGY;|;LZ*DJgWpi(Ac4cg7VlQ%Kadl~OWo>0{baO6ndF5AaZ`(Ey{_bCKRli7>ETkU>3ymSw~+I(sl%zx=wE78)u_y>zXC0M!K{tWaE);~4L +5pCJ0KBrFx4o>U%EKR2f6<344iijVA3+r +ovUt0KQXBPbi9A>JQjlraL-fEu3!Fx23o(@}; +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 +17>v0K@k~9L5N@p0^Gzxc{j5yGXy%EUCsI*u +lP5^I`X!riqsT{k1m*e{&$~Q754xG9#^9JO;o9HE3xgNY69Esi-dET2c*sL@CTFeJ8R&Tl+S-Q}oOOW +9F2^n%tFQ9pJ#-vCusfVkeQ%8!x?Dtx$UD>%2z>#UT2Uc=GJk`t}VqZOoc`ju=XQDx@c`jkn8WG4LJy +O|J?!bG7Lzg4cNA9*YL~g_b6p3}Cs)l6&pDOc$5xg7^LX&j0J@VQy+lUQ>H`H}ojwodMo?;xepQ9nHI +9M0m!Vy!TQ^e|5 +@#IoI6i1+^rSg?e6ERsARaFZOxM<=os!+Sb!k85FIF2jEfd_0)J9VtP$5iqL)=(K=4ou0E5%Oy1TuI3 +2D)PQH>UVI_4L=x5)ihkla)+4|13p(274U$qxqZM{$k;@Oukx$INsoEVf1s&MzFC3_3+GKk_*x|z+#wMS8;GGYI`v2bdU|xN86*O>`x|+yMj`wXw@k +yX`k;RoW2u0CbtK98~YN=vzc9{BVgd_@o-Zm01NjwggAud;BZ_aI~{^$+;ME&q!Ed@J#X}BoRrlq?*v +Lsu}#~S%LWg?(`EhtykljJtn^jR|(X|rSal8cvQXViRKiBcl(Lzgf~Z=(hOmVnSqu#{6|DE@vY956hBl~yv?lQa?DV19_WV3!Ig} +4SRH#wx7AH2K!ooHW!(8;}=?V~0a$f@72{jj3lY#W;Zr8buu623Gm3Z2#;|6bNfc$qzKP=9OS`kPWq` +xmNo`^SLHgVzZ6Nuwe1|#$3s49(|49_q2qS{?*BPgsqEfyLHup*BC=IPT8_oFTZ~J?YDoO +b?AIh03#Jql>ZTuxu +{V5fsjOG>vBiI4@HtYZs&#%&eV-d4ovU60G(6r7~oxUjdw6U;$O$jQssJ|{PwL+zf3tF*{kdb1KxtWU +pQjZp~Eua#gmwj}sXd_C|U*3d2gq>gmMM#G;K_Vk%_s1IZkb=yUKaHebKoZtkuR0sn1VBGg4YAbF@E);1X_de?SHu) +SzJwT{#g{ae}LCtNQ2)tA&3zkx3W1e$=&MQ9ofZ_O3;-Yj6nx{oGaX_sr#R?ueXt*Y-@cUbg3<2W$J| +SxUQ8zj<^&Ci~OOzOwC4@Z%~P>$;wwz&{=7w%R(7RO#+k2UkJkyCPTU{NVc|eluWonhWhmHN+ZYqqD7qgBXC~H*xO_CJ-Jp>B29CowsszB +?ggy{v2mfN;qz@T6o)myAaeEJ*Z1^Mje>FsjD-#0V?{@~v-{|it{0|XQR000O88%p+8000000ssI200 +0009{>OVaA|NaUukZ1WpZv|Y%g_mX>4;ZUtei%X>?y-E^v7R08mQ<1QY-O00;mZO7>RwCX#E|1pojS4 +FCWm0001RX>c!JX>N37a&BR4FLiWjY;!MPYGHC=V{cz{Wq5QhaCya6+fw635PjEIbeRY2iXu{ZB$cfQ +TP)fb+a-%76i_gh#@6i08r6&pIA5RBBiq>QC7Y)Rsx0;NoYS}I=}xC}zN)fD>B`c~=+&ZVNIywKbEB8 +^Nf?popph?4;CX2wt)%%*Ul>W1Zpg0cT3eY@qiH5-#jnq*DO5#|wW@;$RW;I7qI?Xf#lTLlkY&w0-=T +lp<9}pyS&3OG=}A_(HmX`sC7-47GF>ZaNzcLedGTPR)hm-p`{>NjtA+~k#Oi=(_r8G^RZgn0z;6^x%V +iBMS!HX=bR~ZytCy1f0YV{Q;mYjUU}dwaNm&<*Y-J2kO6(N1Ggi;N0{A6V5yPR%WQ7PASsR_NGK9*x3 +aEubh^RFkaV+)osps`|y~Yy4@*dUP-b9+EvKFyp@zE^ +2_a_~J!^!j*m?mM>$L|>IA}pXZ=N}^91>xz&XfQi`W0cFc52dVJh>S?fbBR~ZNR{*Do^aWW0>AHNW4PqYi-)|^u|p-z!wos$LHyFm_!s$X_AaT# +)D`;op6fpj!)NddNICA2^vW_N^fX8{a#R(-C8yj}r=M5+-TfzZ!-KO|Fv3cp8Cz0N7DHI#0k7T}Go +c04rn^eZ&V%FT&xFsl4zC)+cNq^~aN&Bz}L9(#3c +z1(e*{dBIXP6-%sQ5h~4OqM`?mjA6_QuZtHbCjeH7|cnVX!^JENo4kvbu9SHV~q85ciO$Ql)3V&Zsqa +7d(qHqYTsfW$`%7NGEbUaTjIo)j&)w;A>fkMM=1s+c1oE|D&%}P;y?&6g6PCde7(6>xQ5V-1doxCvt3 +duBj~#qqQPZWwS*t~p6%Kl>WSKvpy-C|;T5ft<2DXu3Zdiw&M5%Ienp~WM>G+JGfVUe_ +q^$q$-8<;nrn?V*eBA4~)!X}TE8QN?wLbRgcqYv8{dU8F@H-4pyQ^5~zizy%+}0!LF~Hw+l<6h+%da5 +qE&iJ$tugH`_k(cVRs8pL-wri5@Y^J8^1UmK09S*m0=|A8w(;*SMZIr^zspR|Rl?p`~=uXdsN@i_*!b%$DqdXb2mn}LpXo8z +ua%a@ky%+W`TvZ! +d;1cyg>#~j8(MiTDKJT3W(b17E${`+1Cz*5vs4?INtw4}pL~rPk6WU&7)R01Wd0*TT;MD_%kpx)XW2r +#?`<`L6eA2~M!<>#!{Rymv&*U@e?lVNaEWKbGH3@OH7o%VB#tY$R=Q{q9=BrUs +pS-Zt_jZ40oiOn#mV#cp9Sz}&pKUGDBWy;l`}8nZqW@Z%sI+w%7G=U?yJ#?kH3PZurw4`v*`<0|XQR000O88%p+8N_aUx)&T$j_X7X`8vp4;ZUu%)`W@SGXz2P9 ++wuJK%|DZ6+3jGR?!+g8)NLzN%h(+rghC7Z@GIP-fxWD)g@ZQWjtJX$%iq!Lw8flrUTmR5chn7MOeo> +1Q7|u{BPG}&>}x5pp&iK})anG9#0+%086;(N$J&KQ35K`mo?<4JWf=)~y*6%QJs1LXr=IpO{`##>C23 +g4*pIUkK;k>fz`tECN9--=!S#cqmpgPHhzjo3H-8=ot%1kQ{WE)8zuY{(uHh$KT{Fg_32!kvg5?P{9* +Y$NT3K=y;&lm)chz&&FlP5y%Yel~Ov)wfMB^C(Ou*tvI=&~xB$Zo~hY~v5uE09Vwx~^OSJ8~c;_t_FE +MWNyHdO*azetF0ss +Jk1^@sa0001RX>c!JX>N37a&BR4FLiWjY;!MRaByU4a&s$>G)$KoUT9-kORk$R{#Lv9L!twYP;Yl3I$3gf5%w6@TWp*2O{5 +O@P@h6qQ#cO5)q(-Q+aQn_g@dcBdb(zqcg@13L0gVlDdutBCoNl60Tc{$Ri11T?g9c`WVFPNUOlFXIE +qQ|D$FW`yD>aH3xdt%REk$Iu8D}bb9Kg2=djFlM4ilrw9@^MZkZ9-mSS5c9uNVqHATH`zzp5J)Ss&u9 +WzaNTCpYJt$H693=BpU^qPi=!DR$GoOYzFx~=hb=9Ey^G=IEvuPee +hNgAQH-(qjW~o#>>EG!+l0t0L}pX#(F-D)yO=dRRKA4Gjs7&cyFNQ!%n4$3Jm?uhJ1Zs*N}U7a6AS(S +Oof6tJDH6NE1_AS+v+a5Q1fjY9jcvDIrHo*u)j}SsjI{4C^Y9ibMT&{3SAK{Bg=v~$_@6aWAK2ml*O_EzL$jcert003ME0012T003}la4%nJZggdGZeeUMb#!TLb1!3WZE#_9E +^v8WRojl+HV}Q+R}8cdmH|iJW}60eu?14>rf^}{i**1u2m&oFjU-|zQY9(7LYjZ?kd%ChUrdUe%QgZpSOBG(smkgGF?*(P%p@;gjyrf5 +U%sY%MIkt4FPsKKpN(F~PFbs)3fbX?8$aD4lj%5Xiffm=j|j%Wd}bdGqwR-fmaHYzTIJ;Ne}8mbk?Ns +1hD5mo}u}%HjT>gBN#eVt@?N;Qc|NAR>KCif~yM3CgX5RKKn-h|G+X*rM +_3qsbX&~>66Gx`s-QB*wy}b+mp9IUXAZc*}WhZkd5~nS4(>k?v2v(hxmQylx{$csIlbCn#mzUlwh||= +n69pgtL1e<2*PQIB+R9j +yVtXf`kxQiGn)vG#w~%$c=nEl52KAcp1UITp3@p;mPnJex$>r{~@d|_E>8Yu%=3D!U#u_>NWkq_UeFF +_E*+P8GmzezhCL(H`s9@JPkt^x=dZ5u}$LXWsi^EgH0 +}V3vg%4O(}>_elP7qLvfS)J>DY42ww$p|>akO)ATC-xawxC2<#MQ8!$Y(Vo!^qwXSCZepiGgNg#&M%XY_T=l!%wg)^{<65f7?#= +i@ylpqZN8V(1Xfl@6aWAK2ml*O +_ExsEiLrAA0003M001cf003}la4%nJZggdGZeeUMb#!TLb1!3WZE#_9X<}(?X>@sCbYW+6E^v9ZSZ#0 +HHW2>qUvX1DOhO$cPTRCK;11g`3V>qOw{^=0N2bV!ch5a{JUR +%1UwO%Era7=OgRQKuVJq|+KK=3uUR}I~pJh=oEv`f^^bS6=m5N6}5R68msAR37=A&gT3(&htlq+aQe- +lcN;bWzRELlE=&rOx{k)2tIDo!@M%w!!`EWKtcTo`La?pB8*z`svBy_V%)yjBP@Hbc0*eMnoYa-Pt_c +Ca!loRJmzCQ@fal$zI7&G9oSS-}rSH|~Z7OOq;RdMWDy5u(v3k?JO4b-GT_0GOfwF&QIr9@aq^zlf6X +?`-(QfdE&HGQNZsIT7VjCR!$?%%l$8(WxbBj`oZpj^jlHr|&`OdTOjWfsbXrgGO;^D$o-2n!{4mN`u} +?D4XI6!D2HPooVV4f*}4XMHv>X3K3`Q88M$;ETYc3#Pc;I7pJtfF@fSa$1jU%ON&m|=)6ZpY(~w($g; +Y$6YU!MGmPWlSBaJsqNIN;)eXxH3L=^X@v4?hrNXFRNVc_>wKFzgq-%5#QidVNfn7gi4@Sv?>op}{F0OfJSlTEpizJBQgGLH>aK&LIWk%Ae +c_BCZ)*yrerl7&(Oq+sZT4aE(WgHDmsYnP-_88qYC@>y-2*K@La(frV#2eG04L1d2p7SzntxAFjri;j +1Ncs?{zEN@Q3e?DTSUEZtB=qU3Row7OdRmqHJ!Snkv +UOuo+`QZs|!BuezsZNlKWRZ&)8|EvSfw0n*lGm9rjZGm3U=)W!MaRp7GFznPr5lg?qg=ExY-O^Nb{LM +ja&3aFjZyig97kvv77-=y4Bc96>s2o-`Aodk%(W!lt=tJoYOuiw3+6w+Kh!!EU!O`efnQ&}n$eC(yDtH)j>E6n&hYqhV(!_ayBpIeY4vc51ijcj@BL1`LIJ8;Hxdmskyg +o41$A<*VRs>WSP+A!Zd(6?#!S58y?wg#OVWM^D0-JO;q?M}%{Jk8mE7%6TW1ULX$4Go|uo@{m*>5(gZ +U(eowoX7W@?O!oEguOoA`+^o3nO3pJ1&9@en*q(LdX;-a-XnI&IkMs)ns0`C$zE_{d`?^~k+u@OV8yz +Y7Pp;+srov`7VR0|Gj?Qr+EG|a4Fg1PS8K!Xvcwjc1{CMi#wf1CP6DdQshgZH>< +l^&DS>pT`)i{kDe2r7>|F&f +E;*-uiD_ehuM!dnl25Vkd++0~M}Du5Zu+2rtr^X8gy6rQ9b9h0KDoQz`2b^Rs*l`(La#tAgIj;cyW4i +&UC?qw6se}7OB~NEGY|S~FIf*~oi~*XcnFGJiAPX|(utSJHg)kn`$t7?nF5xjgEP^%rhya>j9cyNHsj^Q)T>$cvCJg +3u-DTO_{>E>H&K{hq~_|u2jHK3z++SG<(Y7+U=*3_7@v-rAJ&M`LKpXrd3U=ps$Pl!olC3;qD0X4@T#gA^*) +GS2O?X_+UEeWkw%|uX-0}&W}d!gyFzEb_6}_g!^OGp%V^oGw1pLHUEBt_kN)B?R^H}Pjc%)yRD^uBhu +SF`Ug-;0|XQR000O88%p+8Y!f}Mm;e9(@&Et;9{>OVaA|NaUukZ1WpZv|Y%g_mX>4;ZWMOn=bZKp6E^ +v8Wj=>IsFc3uV`xTR(AklsRi5&e6Qem}?(2}xB_N#Q#GgcR6fh6>v`zORR1 +}BWdNSN4?F@`8ibIPKd-6f)d@8xQ6TNjpYEPn39yI5`Pa)S`%gegVwhc2M18s`?bl*WcoMiX%P1>0R% +b*oy5M|hV{{|Ie43N*VWg)_@5$0N1<-qHt9O9KQH0000802@m7R?xP^j!Xpr04ojv03rYY0B~t=FJEb +HbY*gGVQepTbZKmJFJxtKa%E#-bZKvHE^v9RSKDqIHxPZ_uNZ6|Di!h?=%Y{tFk-hgkj6pcA}xYoLG6 +wtHWaxfxpD+U|K1sLFO)15El|HmBIkN$&J3OBd3FO^Q@0AiZ-fWAZ4_=%dk5YaCH0y<0kv3?1PZr@Ct +)=mI}l6LdZ@9nSP3tUc14zx!HjGe>p_|IngsiwydM(=0v(6AAqX7GsL{QU!c?i-xJZ +<>y?sMg4)D0ir9V~a*qUj=(8c4!^R^wt_-9gYh9aane9WeLJT)mlq=_J;tk;N8RH-5fkR%Dxf4+7Kqv +ffidVvh4Qm{fE0ZH;?xZ@5*04{#??ppYDH$1?0)i90-7{Qo=cSFPqyDoli0UN%uLOXFz`q36er-tfW+ +gD&59Bbx_S27qb7(Xi6u01)qB8f4q7PZzH^LuRX49aFNxxg4Dt!_}HRzVvX~N +>ed4Rl^=q^`MAww`{g?L1Lf!fSLYCp=%hYEg<1^m**KI$YQ?0mSN0wu&>BPene3<6_sd~(rUo<-}tH2 +<9ypLD3qhU8~Mrn4@=coKh2gGp56UOLw +weysA*_kP07?YC*c?EZIBAM1g0{g&_Ak|Nt!iA|u&OE12ZbYkmexYVF5KTi9X7OlS4vQ_Vm01dPKGUp +k*^6Cy+>z(S7D=>;?Oy5JCFvZ;5diGViFG9Z_mO>;X1CD^g)KHpRAJPgurl7SDQIevvv(^LzO`7clvr +P)bO42jl5(DU?jq-DbNqs;p`N9EGb91{O*+rXu3BA1Gt%#iEKO=aiN{V$b&BV};Al2S1Y+vhZe=}f_H +nQu*(B1r!O{{@Cr}pfabsFl(>d|CGTcrSoFnj1S6IA2^hHRnr9O6{M=ys(`&XzyOD}gL=a0iAtv!)Sv +ubfvs?jMK?$;X458i>bp($}DX&3XN=|J&s&5p*A)Z-ZWAfzKj@`l#ZjFG|Gcfqfl!S10>!cpd;>b;FOR+ZL{_DB-J4bMc&-IE4AfdpqS!+fbp-w9eR>gXlf~1l?| +z6hCFdPQ9h~MNEfk6HuaB?U3INg27+43PQ!%`{nDasHUYj(0GMZ|hZZi= +1)SvTHpslDu$ad_GwMPnII-fjVom^x!F6oFpvLkm#hVuib!^qH37a?!U*x+h~W{9KxxJcp+6dePlG1q~IONmWsB*NYJ4dslL*7>Ke29AyH9=irOmm4Fv6H+3D(bj37 +Wt7PwJN9C<$rX=`wQ}qlBf&O{4AOb(9r7BygOan@Vk-NpN}D33_fB1Ndh;}7%Dxlt3-%>Js9o~P +Z2w`}eip>mVAh;4?mO79Kw(-7k^Xu!i^qY2BP>k2 +jz7f|{p6g)BT|XaQg7xL7Dful9dGV)_dJKk#hwvpWry_ox?1XA@nhHQTnkBMKrlVF*-=C@237LYS^fc +&AdtQfm8YW0GQBS&=ek7Zxe_eF-7-yCZrq2J5F}&7}-$DH4<-=@o;Tc2^vFfYB9je6-)9i0hO9KQH00 +00802@m7Rwj=1UF`z^0EP?z04V?f0B~t=FJEbHbY*gGVQepTbZKmJFJx(QWn*+-b#iQ9Xk~10WpZ;aa +Cx;>O^>8D5WV-Wuox);4M92VsU=n$ZM4!zQF2JKm(>cnp%|P2o7kp1t5*N_R2eXa?w(bYgbQ|2pU+j# +)LM1Se(8mLW}@qrw(OVQ3MF~F+tu{37kyR;X+fhb>r@4;$tt0tw8fy?+3E*fHsT0RvQ{bk(S811w{AJ +gK9+_SuQ+Xme3{+-gzHh!=D36JCK%)5bz95oaquMJMvak+(Mi%_P|8Vgm +j{m*+yU`X7Y9zo}FpvHFv48M;5VnZ1h}f{!HHte*E;=iO8oB(pbK(F%#i2C1X+B5RW;F&X>pY<=y!bW +wp{Bx3SmU)Itsk|1=a11mRYxR9z=*Au8`GaVu!Ql5Nm+_cLBc_gbR9%A?_?*{{m+0A{@JK~~!ooXMQ5 +fyI~`L#^;y^3!M}{~+&m&Sp4_JEgxYk*`vYLcKh~2D#%SnPYet_q*VM{6ybG*&j;C*c&8MSK2|#(B^v +Zuz3oogyn}8VxtCK0*&A@S$>B0p-(Se+77+t0Sg4ql5{z3L^_`kkLS4gZ+d`9DY=m%(n&$AG{&OU-Z4 +|k!h~nS{Dhf*#zFg8Nl2Y`Aq+B6acThCqU2?R#BornMWqiM+hupFP{f~XGqlCwSxx{q#etVEc%*2LyX ++b4EOBre4A4RBtjBe-?Z?1Lh+pc?3XFvc3Gj$rt7OWGG0tq@;t?*WQE-gO2ivTt--RZXldz2%Y%w>+X +0YjbU>}rbAK(A#tdJ#6z$8FLlvxWb673m=VZ5rCXNWAE-#ZwuQhH!dHIgSR75bRyRckQ4l9d^W+Sykd +d*?c3!mZBZN;Rbk4M-zH~`2gt&BZM49+d?(Gua +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 +yK82A`V6;Kr0(250s +=4EEmjZ_WRZQx1YfMR*J6m10NyJjvjxM7?iedzlp-Mu{Q(&1cf6Q45XS;omCMCl)<8aA|5C+Oc5lTP3 +W4YgOTO?txh<(Q(is+&-4j&9VH{4@0WRj&D{m|1t+34w75s;!ETJGGi3#cQfhcEyjxirMc#y&r!h`G%#Ws;M;U6$EvGB3A9+GmJRx#=EF2adGPE`JZj#wcw)VcceEz&>SBUNoMXNJo +SI;E~PF%da__4D@y#Tf=IT@h|qX+B1uyFC>{D)woM??g09(@X%iGaHi=vuc%^ud-cFEM#?TjjCdxN6q +C5I$%YB?7Tp%iBA((Wd#sI^W)JA9jD9zqt7JyO-bp@Z&$D7R^*S%~Cj)tVHtSd{R-JAA?KZptiGH&}9 +|qwLX^CXm~922*`(u2gI54E*it +%3iorujtePMRx0O*97pBhmvq0L^$L>Bg>LbK+Xx_ypSUo)BfkzDKtQlHH0pD?Dur$Wf84L$|6n%q80B +v&PDMBw~dPgc&|ocy>UvCr04o*%YY`u$k1=5gStg^<5~I#VOn4@u}OXn}QuS8Yi*{X_1Y)sXdv0z+i} +j3C(_(v?@uY9C)Zdp$vzhA!qX*m;q*#{pzw?ir8wpp)%rL}JGv9usK7 +Kw_#0cx(sb%@mQ}lSob1AUf;y!0kSy0MytfER{qXMXr!(hw@ZPN{=__T5-odPAwm9Zoj((y+KYtnEgp +Oz_%hS#y8GwDu)!iXug>?lTO}lp|G&y0VkT^F4W-;N3FkfM2#+aP!K}lS+ju2GSqMh}1|r>NUWzgEK?H#Frh9d5Yi5sj11k +kz`+I(OVpf@^9>%B$1@^?EEmtu;%_c&mkpU&5>A;KLC01wi_Hy<+an^@8;mwH_J&P2QzzFpS&yTBJ^Y +wo{H)TMTGYMP)h>@6aWAK2ml*O_Ew|SPc2vh007Ja001BW003}la4%nJZggdGZeeUMb#!TLb1!CTY-M +zLaAk8YaCwbVQES355Pr|EIPzqf3(QAh12-xP!woIlP^3mpHIODHNvG?t-_=@d=Yz{ja+mME`@Z8Sr9 +-KN|H%YMofw;PFO6n|Qc6f-O$zuY^$uj38S5d+GbPSHnao%$wHH=%#d0r|W2tnT8tXD8y*PS8K1X5r8 +i!v|IGK&#Ch!Q99rlWn=Xvjvp7ksGh4Z!xjIkvGJCu2D*}CY_E>`(XtxfVZ`F7s +>?%w-CIT`azu%Tv$PDHEu^EtPF#VssT~WEKZ*I}$VEQr|e}oMNENIJtJ7|v(6YZv$XibX{vK0wP7jwJ +W%Wn}UxBwl^Q_%-h7Qp=ztc_9qY8aGGh0m>q$mX~s39L%!3JHM2#%L$E!ip_$j5VA&q2y%c4wW3Z0w} +!RhEuCx@vvmd9E9xzCkzsoFsb3%b)}>{_9BHe;vrW~kY7+s0|XQR000O88%p+86k2`I1qA>ADGUGr8~ +^|SaA|NaUukZ1WpZv|Y%g_mX>4;ZXKZO=V=i!ctybS}+cpq>_g`^P2Ur3W+Hw}8&5!|WniT0~t%&gI>1v_+HZXqt;be1bgMGjy4 +PO#Z*RI)so07! +)Ywtc8b5kkV;3LLHm}v{#4>M`@M&=`wS9b7+<}KBOD~ez(la@LgP}6vE56X}T95?cAv;^G1Up==BD3s +hnLyct`?2bwZDU(m@HGwNTH$a6^Aeb>A_#G2NM6(J?2BlVaOuGHI+_=C5zU~kmgHX%1gNxJ~Rs)v^&v +2c}n(7*{N{yR}V4a}0QM!dz)xBV6ad~HLXU-OjEw{VA#O&KeH`tw$iz@yvg(??K)fDw|d0aL>H_KwVt +UlDs538bSj_cDUD~i==MT_#ZSgd)u*oPwB@NQk4o*b=<_s2dS_5k)FIplJF4#@+T$EzgdGinFdGk(qL +;ql{E_M7pE!1<`=X>xJ9`F#Ctv%dOxvH5=a<@W04I>`>s82yDm7SBa`j4+kL^TT~5Q1rv|jLq+l6OzD +-6)8?f+uY>vxQFLy5z`57(~vs*yJDS%^f!y3WpCM~)=KAaa~mJNQ_+XT>})z;PoIgLJtOHo<${)iL5f +z`uC#`G2bmE3)l(h}aj%(A2GG$S +q_q<}C)O@Yg^sRL5j`{cXL@azMrbHJ*OqLj-E6?C2IbNe7cda@9b?1(UR8zVXmGcTR!0ArT}pYD6u(1 +(L*lI-nuNJFT{wwn_^jQy|2o +mF@jjeWgPS#LpX-yXk1fuxnqGX_~KFW}kER1sa($93S1&<{!8D?a-D=;C7jjbBp%eSl4Q}dCjnZEO!N +>xOdm=zBn}&WP}hdqqiF30?RSEmpqp773QzVNw^xOe2HepRq(Nr)u!4}z3IHmsOzIbJO_ySfZ9H+V1d +8Kfco7bdrFS-5sx9>yByEbT@4jWN65L$ccdCmgO1)v%_>#1G@+*A97T0P1e_fT!Q)*+_SvH0wii@mPw +gw^GR2O?+YZx{hDpPbS>Y@YB0?GhmjrJ-?3#A)KG*`7_2C9_%sQLBLl1y|eu8jkt;i`HRWOf2us8k%` +woemzDO_4vbje{=RW>ChdE-*v!}4ftwY$DvHcMcvr6nZWxf5h3zFy2RRN96~*ZQa0F=?l}@ARK_=La_Q)J+sVnfa$_L8_l(j9B%*`4#lmm3 +UgZHE$D=&Hs&y+JAXAnQa;4-4%tRfh#{kU?gMDG;+3|tH1s+0Dh;`^HA&fV*f>#`7fFGGmtM9dI>#XJ +_*k=zfhKlY8hzfqFpD-LrgdNnqfZgHc2$4}#$kd*aOo_?Bl|aeO5sVo@wFqti7l1_U&mU5-?2?yk6p{!-Sc#@JML(1TmZa3s6e~1QY-O00;mZO +7>Q2YVO4#2LJ&66951m0001RX>c!JX>N37a&BR4FLiWjY;!MYVRL9@b1raswODO$+cpsX?q5NuA1VWm +fVFEec*w9UP1|5=Qlwdj!7yZ6rffEnsFGA%qv(I%-I02;l&-@z0|_LGynF8Mx#N*CFO{}z$IUL2>q)9 +r&g`L-#g<9;>GsdJ7xDS)i}PPEuU^gAFS6kJaCtprFJxk8?9vL&*O{2H-=u-}>(WY9@ND8_m9mUtS-> +P1i^Qiy(05Zye+`P?NRxA$>}K_w0reocFqUT-$N3jpD?KK$vNAJKE=^KP)Pir~WLFh;W-^g!AOC#9;7 +4-2$@Q`rbx-K?BX*^3gspVJK#x|NDiIraWKW~#(UTwj3K&vFc3`Q}=rO^Pok;G`aaOUM!%Fz`@&GeSR +9=EDYne%VV0&qIOl2FPS&6o@d!Y?EMy2fS!R{2PYvJ~TQUjb!CXd+dPJq=QKNrOYV4-DfipRi_3WnD_x!ZHS>6;TxUY@0f4nWP=oj4dwOSd4BR^%p}_9wg +id&BR59f(++|rk#uNiQ?A6+CQC00vDP^R92uBfx2_jKHUm*3CR8k1W@&f?X+lnFAHE0@MJUQ!Y~`Bnqg@gcHNm`h!SN4TB|83# +f4-FTo+9j6?(w$l)D9rWA=xB^U}k2TP|j{9nh>RWD3Xr^`uq0U)PD#|AoYj2VO8I-ZSVqmxNY*Wha$* +h?c^;r93_Z%ZfYuAgO7%xF;C* +D5{2$y4Rj$n!jwMcwf2Dhahk2Joa;`6;w5QXc+5KIZjknSfVYl6l%fzSeU8uFcU@SlYdIU{L27O(w{EkHc<9>_Z-I<-I66)d`tigXz{MZ%wOah75qqgB4~uUZKxX4x@dc-c6iLx8vcCV_lL-FAnqBslYA07PaA)M{PRXa7 +=`5`{fdcsCKq7Jz!qg1L;IQm`SP +3YSs8SZ%!otG<`U&KglHY2Cm-!>+I-kQ_*PtcMc~ZYM(x6CN$SOZzevrC9ZFwJ4cjIZE+TOU$3EkfHs +$W^Uxj|jkuKHv}nLtF=&cadem&Tk;eA&o2o7^4t0;=i?5GFXLs$o@re2T3jDQh4`M{-9d96`!p6#j!+ +one`>Y>($ulFm{TmwX8@O+B!X?)8<&| +Z#{e;)(ea~Wh#BgsZ^m>->FvyoR0^2wik~fmvScrDjRJ-WFfftV+CD2#?gi4($e9*vef)S1|}9xJZ_2 +4(#{$>vr@^1eC=M)kgVoH2aeThPZtyx4~8fN(CO&!4zc4!`vqM%s5JF0+iK=`>^fh%Omy{J*X +&s6Nu|KeOg7}UkchJe`CJQe@6aWAK2ml*O_Ey(_5u>63000{U0 +01oj003}la4%nJZggdGZeeUMb#!TLb1!LbYGq?|Uvp(+b#i5Na$#*qR8||Hdi +?D6kqBw`_dqiQ@{$gYCvpE46KLP9U^2xEgi{HF*RR01dn281xi^-8o!ABtRcT4~%ob_-DW%9>&)ypd2 +C}U_lHAA;3NI5{#U!7$vR2G*KWQ!L0xF5>0qAiZlKJ1yt;7k{nN$gk8SQRC%!y6ZBKjS${9`d5^v*Zo +mfNBt_DV@U{XcGuhr0`?da{Rgxr1oq9e7rBsd0tY3zSD4vKGOL%_;natyp0$CT3k4%gX_r}LF%T%<@s +Hb~pVnf`)yGuxF!w2h=$J^r)@qxXX^2o=3g%eS5(-uBd*hjdYb~nt#uWMYu*A}b$0AhI_z*?tzeP#+y +=RY=?6w05Q+u}OU%Ixm@m(49)T|)Y>PSaHWZ~wvAFm=$|UYC3HHL)JpIlKF)EAo-;?%c%lDL!pz@uZ^ +_Rya|@Jr4FCXeEdT%>0001RX>c!JX>N +37a&BR4FLiWjY;!McZ)ay|Zf7oVdCeMYZ`(%lyMD!jhEXz==_WlKdO}s4lQ^kysU6t9`U;&vti+YI7m +CzzNh?C(|9&&G4=yRvc6#mM6vQHTXJ=>UJ+qSQO;J{CQRJ2QTxD`Tl6pjxWnS2qthl?A`CaEVUhzE5M +5*j};hxmaJyxqy@Dx`s%VNz^Uhzf7l@f{>2sfl5WML<+fuysGo04xfqSTXSYYXvCW|f_)b{lWzB;SqM +8^roEFURb?$VJJk0v7zpHDAeUtFDz*`2690EsPfI_nn2dcz$-H)rQ>FK(`e!B +ep*#e$=3?3%ZyA1_beoLrw>oF_kBy-(on-Pu2eQLLp}*tH^8bt#fmmZK4#AW;>s1e-R>4m@7)ER05~o +^Q%xA(TQuI1@m*^MwKK)PNLa5RFD7G6wd#EIx_+s!EHRzya%NSr%n@`gtKp&7uiuN)QBEW4KfzWpZhj +ev}(QD_F5u)TLrec&t`}DZ&X~KiB!p)uq8mMNCZ(JJ}(j?aza)!d(D+_RNam +l%uiTrFk(kPuz68rnq;8S;b2mA3D!XPDMeM6IlC@v&>|c-U>7;Nk)Uo{HD;V?;!t9OEqKno6Q~#$ZO#H#1}sR@v17r2H}_m-l|~CzG>XS8BKtR0z1~Q4!no8SvO)F0#L +vqjwF>_i)2ZYz?b0gm!re=(P4Uh_~Yd8r^(?}FtXq*0di%PB%wQ|64`R>-d^zX4y+xcsvF~JN?QQw>& +=9$8@3@e_ZGhRwC$`VW}u2SJhj5snznZ?G+szA=3=Kv%RG&ax_TLp9Hz;Jm*C(!be?ER0f)qhkUNFVW +De>G4y4XfR9y%eOZi!(4j+EDvRWYxvIH?MiZcBQNV3S|-UA^g;}#LXrq+7{T0^E2MzIqI@qO&L7&Q_@ +6*D%3%2QS$NsKKG)6xk#_%X}Gy~y%{%$_(8qy3D()M}|C1jl@CNiPngZ?`N&U$-b~(n*AKcr@S8{^5} +LB{(<={nd`PupVNsIf&a@uPheKC=(P()#Wc#qoX4%qcd=o8yx@eCc!j;$boaC4 +NHu^YkCBLAvlTaI}UdbbXytSCOgAwLNgSknC*W5Qzi1W%u4pA)B-mlv1)d~iDjjn>;ay^MKAt{G+YL~ +HNF?E)#rB@I2UByYeODyt)T%FER8ACzqlW<(J|TPScdvs&cojzgv`ZoUHxEE%LIB_)}jQzd5fD@~)7Q +)f2jfcj{W18tcJf}=t1+mFL&nG+jXM7^7~v3}jmjk=aF?TC2aA+)9ImMw!{309-N255V>2Nra9flwB} +zZU}muuFar#Q!Q}9?tA?k_LrodVs9MGptP}E0R`-saSLyb=A!~{phbvMd!yZkv5f&4TSE!Qx)liik6Y +*@*@>i8HuUL_97ND6BAdSu|n5mlTMA+#3H}=nt14_%2B{8gEQ9jk^#jH?QVytqu5hhDQW&Cnt>K?ODv +A(1k+Xr%0(=yP|KJ|(EN#dfOV}5s2)S~&)lmvun2_w`-*A;Qw@e*WoSI--%fwIxww3LHF34|%vRDfEU +ahXIBsum;pns5p6o)4NEaRxSA)-V2@ZurUVvaTC;%u%_aq8?0kU;KBd4hmbhw1dW~z5LWY$DS?IKr(zr=-4}-H%pRW2Qy|R7Usn+zEy_<=18oJ%1=u@y;5ER+P9&IhKPwV+_>c9xCpoI`QQQdDIKBgRw#2=8DcGI7hZxIQD*0V +rs7fvvRgp+C_#OqiIJOTMSt-Nv{8!`tv1o6^M&K>d+cW%LJMs=9DlT4+b030(Ppzv!c2%B2Aw*Ta@k9jcV9z%W$r(?8D$cOdre6> +_>OPrn(6hYUdM_A`PNFaFIQ_NpCXz=r%i%WyLm#8kx81TUv)~v!QKMLX-_#K@FVE5^zid33giwC`T7% +u`w=9?>eQwo=Bv`R55_-K +dn<<@AbCYke5R5@WZLk1KPr++OUgP|~J|?v#7|PI+q|e0Br7LhA+3s<&JWL$|JuYIrbA_`ewb5#%Ujf +`EF$9MY4d#WC)s7_IP1VP&hNOo&nP|UWhKL10yZwo7y2zLE4pdkf`v+EH)4tU%pesjOp*vH$?NEw;*H +AR;ZWM`)1V6@X7bSw%Hpq&5p4Flwl>_!xz&Y1gYtbg8pSn?Pv2oLX2AAfJjG_2dBOh9pE@HE|&!SpTv9+rRmWFd(IDs`Y>X6+m{|4%q*_4_hx<_m$EmnK&Y`#r`Vo2#8Eir-%8q +!xb5<}Hcp0OZQ7)!gh#Xw;d%=hv!(MBt8kwL>OJDcsTVb?RIWKuBh0o=2YL=JQE=jGs +N(+#f^xLsw($-Nt~@=sw32N87);9iUzBhRiq&ZR0}q9JG(&=1vs5XU)CB|C%rYZryCa8tkopG2^Y1>S +w$4T7$=PrbW47KMXl*fay5znRVE=LmFl>Us&o|$^DSd^LtTfW+TrK`o>Ak`mAW&w-JNj|&i{r|^njMcx9*S|Yo51`sKEPz5rZGg)XQ!ly!vOSoBvRM0*L;E|K9$flokC^ecenMsv<9JxA +&vD9sqy_yZSv_ABe5nqE$=}~%Tq5+et?1v_VMxkn&k1@6aW +AK2ml*O_ExpAbZ9pl002i<000{R003}la4%nJZggdGZeeUMb#!TLb1!Xab7L-WdF?#?bK5qSzx%JiGB +;;3OVb}|+O4+ACQY5LXVN5-xZCY{JuD?c7Hf)B3DUCa@&A7B0|3DfIqBYZZg%c68Hpl*hlhvvjR$9|b +y?M7UKX{yt@CWQm+>1}RYhrjT*-Q!C}n;w6SZ`@X0~5mUR`CymHAoP5$jTAx9g-{nip!>)LCwS)k$ri +x5{}0#1@$a*i<>p8?BQ{$-PBYu3&DV+dkA4OnvrNzprIgmu0R@^CHXP)gsB23`H&Bwzg{MJp3HKoe=&8xON!)5R{ZXpY+m!zx3Z +8`QkS~n4A5+c(l6WgI#YVk+jX6lMUwNcbAWE9K5y1$FrwZ*{VmZ@zAs=XKh6^b80_%^*V#IXZ)A~{Rk +Yr&tMX?#uj6G|UR$z!-DG+CHIM~*{S_K;p|TnduVsF)LVlByZ=E$Y8O1S*}(|k)Bo+P)wZOa>snjluu8Ko2)8}l`QHpczHQbI^clq +<5lu=S;ecYfKQFh*jVId70t^PFu582!`Yi}-v01mcXz<1ZjxLUHv{O_2hL+V;J@IEID9v6zY +r+BvUU)s>VU@1vJyY7O*^QO3+W@AR`oL|S%?kwyNZLMj4N% +{h(8Rt~!ce%HRdP-J6ORcaX!1Xn~^Wzv75yv1C=g>h5j_;j&!QScZ{H$1%_!@=m0vj*BPLw<~oOl_E& +hN0RM=tmN#w^qU16&ab^KrTNM%KWI)MUG;8u*zXjpXAyn6C5l64tht$^~&QaGc>-KM)7cK=`T&Q3+et +*H=h$n4we=?qc+FnH9eI0Zm8;AO|Q;Bu6N`DDwC-cmPT=Q~2#Wtw2ib4=SLk3gMxE-`xw63i$Td+j?0 +R@ECXzb0Mo%{O4$Z(7tp)w=Z|dsvmHdKoh3rTmv|RtpFT4zbEd_L{W4}^c&kPCaC9mM$rS9S|p;T?JF +19Nx{Zh4hj9P1CfbDl72@Cxm&`TF$e@7R +X|{MdExZHQaepfUUogA}O{SH-iyxW(NiCz=(@%A%5!N`;*8NOjI1;Nd>8y@55b@I-&{R;!C8477eK?N{y}%r|c*7vmpJ3}nlNJ+iKaf2 +Yi4w9M@<{xUfu-Ll;*u(X4Fqm#s;q33IDPZ>{Peqb=RcwwSyn0%AAlzweg4_W=k3M=MP)>8ruf5@{mq +Dx1b$0L+6>SZ2_hs;?W#R6IX!*XSu3_X`f3L1nlv3an^96--CP`91}=`&KP!aq#h_p^&_v)Hp&~q(dq +EEs-qVG5hrr~moHsR^&U4)uog^qq +tI$$$#Upf-{3^hO~j!zsCa%>W{Gxa8!c7BDZyl>}I?#?ekS*74?7~SFS^*;d|pT@!OIV9;cu?1a#-kj +K2Ck3<7hxqJ=_h;v)W17@eqFKEUYW0^U +yFov{CSO2nCV30dp0a&ep7#tV572U<&b1!`(6IS%Q-QDVYWw*TkR{B+F?<nJP7;FMUR<%N|!rowuU>;!fKU!c)t~;8VX7VBry5NrsbTFKeft +Xyns+{sCOsF=rb2K4DMf5~KXUVlUAlxeojRZ11QV;DOdTt5Ov4T*)1j_*ALEvN&pbHZdU3@L6ev+n0Q +k)>9&l8xro(G121x$aexxNOU1^H!)&-8Ay%+OoxusALONMO4=G%CQmF?_6AU6> +;;L9r32~}|xKUHCCSNF;>XMI`i`gGk9IQZcHUYQG_uieoi^+HS5WjeNe)jeadI%n<1q`!&XGOp +)4ir7_m?yx!+?Bx^4Bi%HV*_FijEfR<`MRk)>l +zu_vfw`#6Ezv8h&SC3-67YWrNP-Ed(Dm`t<+df&(9<4*o2DX{16B6LF{4a^Jd7LA$H}#7@GxUZ`tgZ# +`I0Vg@OGBhgr)3_I*^lmu*qS_5>c3~891k6Qxl*aue+G6>+{kM}T-pjxVI?FSKVOyzg{Q`;Sl(k`A_S +FpnFZV)AYESsu@;NShBx({e`5SR{1kq&mRECnXQ8-lyLw;{ag2x5Rq15Pezo((!9+h04qVgt+(<{fO_ +-(-|p&Dic1Ti$+fzx3?A7FVGtwJEFg)6htS>Hj~#MQ7q8{oTh3=B-O~fqk%uEjlotMW@YCD9V_(Sp%} ++wBuES{9ob&aK&+eDFaHKLqr_t6ac#LY;uSsQeVZkUgE-#ow`W^=mJu8L%H5okU)sAfnq$0?6#Q16k +bgqun7Dv3;aCpC_CPg<2FNJ!BFP{gL!X3AGjO>v!LHcBXEv(IY-W7{e_nmFiV!|O=8FA4!%HiJ;Mf0G +S{DNYn0YSUM6*yHvwU46wk!*(b183OkV@Myt_$syto(NeQkxChaFP?=tw^}nUWUlZlL$#x&?^Z$pspW +0($_t>s`o=#b6E&)OmUkdjpQ6^dSUst%`lXc*;!=;t`Eb&C(+#3EM2;du_=@4s9rEJTYlj%%vc +ow~g~MZ&roCZB$z7UID|)+hhe(O(y*6*|TRYnim)Qi?W<06$s4<5CG7)IJ!+C2$)H^xYVf)-}EAKU_T +VKCto~y`sK-=o<99@ABPDJ~=#YT#} +EXl~QLKV5ZO6FUhhEG8uNJ6iFwiQ{53F5^TF*A5X7+OOVxnB#iK}0bVQgf&I;!4cqJi(x_Q97tH5wwA +WsB-XqlVn6af~0Zh_=@p|wSn&hp*(8;B*!QfX$F=FL;+|^Q?_ +a$-eII`~`>#{Z-Pm*H3sP|*g#`TBDySbbnWti%$vH?ZsGu~d6F#a*XySuBy9TdthLjNvFj6i~-@b~v{ +xB}5T_fQRxZ&^!SK}kb9Um4qk-BxgzZvwtwr{qC8g&~S=5!MVm=#iGej{VGUF8{2&gKOXwSk95->qLn +;tbwTR#S4jEV6l$hnT9D2X@L7oRS$#($vx(o$Pf0_A&|JLW6b(@u{552>b6{RQm}60|1DTx2cB_v)1e +1$yB)9HOOsn5A8wfbK#!KbB-a=xLMM@CU!9S4Lvp#Gt4j~*tA%Ps7^3_P#VHu%AK+mcs^nZL!!>amO9 +wiIBO7srkq~!5TxruF)-|Waq!vXk`n;772liY$-!qG{cn-6;zozqewnA5mkPPr5k{NEn=t_|oO7^>LD +5m%yn+Z)r1B;Mv9iMQNSvV^Us>0CR)UWQkv9vR3z*g35`+hA0;pDJn>oV(NLrd;i4B8F~y02$~xj!ZjWC&j7};8d=ILc6=;=~HHU<=Aa3;m9Ad*7W_p)w(8mhn5Rj +3tR*|BY=o#k==&ax{>>s$>zcgbRiPa)@4N2fO9t;gS%Zq%%{*C94CQepuh&Bo%0CY$YUTclZF!>Wb|# +W71r0Rbh?v>S!#@z5T=7uSF~!7vznB==&Ht1tGTPz#Q(T`>Zdz+I6QRv>pa@ob$z=6Im8{pG8cgk%#vBvYv7#OmT^q$Deoli|61*0s6$MLJV#2-sd5 +%Xe!{LOT*O}DoPzhuJ#`>LncjN#<8EJp@=?h60boZR5J}a`0%Ug@LS(+k^fZlL=fOSYf@jG%|gCCG&-~pJtwko~XYp?CcW3P6^xiye&D5 +^dpz@RKzc~SV*%B1EAWRR#Ec}#45qDh~Cwk=rEzs_cds##+J*kKHzM^@7rGb$1U{8HC(z-(n#kTq!$Ti~xNS>u +5aN?#}(3&iUs~Jlxr|*63{sAM1CkDZ5+WZud(b$_G@$L# +Q}WGchb3JR5yEoGCHF*0DF7NZnt`JTLdHv=gI)W&xQw{ROnBuf-H-LlG=`20Z2;#eVRwV*p!3(iIj@S +J;h_5t#Y6kdeNzcw<1IPsRjhBupNO57~;c6pD@>ie{zjTAG#rSjk@+3`{X?$)@2kvPIe&2dcKibPFSg +!!WUsX7k$r72^CB0{H(}Erh8C=WP%K7OL@w(Q`-F@Q$`=BCh3@B3Aegb#5(VR8<5Tas?XxzMcKT(-7h +nkPW2UyQHK&z3U_y0CnFxg)v?zkQr#W*`66zD#its{rSsM)!Okyewefcewaxb4_&C#5mXF=FyR_PI^g +Q-B&+%!09S4+$K*Qr;!xAkn|MeA!pru1B;I0}zX5ik78W7}ybmHbtFY=4f+srg&uE&ncQ>Eg(KG@ALh +s@ZAMY$YO%7^@=N=*|Y$S$c4{WNgGDTEV=<3$~NAQCle0b=@w%k2JJlLw +}7l@M^;X2jDJILUa;dYn%4k6MRI&O4ZeRzu4%loUv=( +0L{RGCV{D5m_d=OKxw9DH1gy`4oE7-fufXMpzT0@yhtOiwx&Z;Ea3VIw*37?~g>r*7*b7Bw60)fFPYX +=)hIYZ-{Vsg)%h1ohCw9oC7`^v0~)UYN9k~nO+UsJZ?F+ieF9Ba1OOuD7f&>Jbz(`pFMmCPQUa=G};W +cmoHCL^Ruu9B?i5zK+b>DJvuqaAf=Wyd0C0atBc@wieQp2ONLow^yMUVmmH<{@kvNMZ3yQ`V9gxGja* +aGh`6Gc5#lbohGHtq|`B2BKpN-DH}~>sh898# +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 +JDaBZb0+my>CCGKp<$?if-7?)s^5}Q) +5MVV?p#_Xz_XE*IQyCKzEX8$*>FxV)aQfD?4n=0gH1#3Ex6n+v!LeQwyx-JSdn5VjSRqe(~3y5F&3F_ +Ui1{36GbOV<3jv7c#lWbFSrrTzCay#HDRJEjrc5)iBN#JEw2_tr60IsQs_=y{5H=ya6#$n?$>06Is`Z +3RC0ICr|BN|wZfqGNGwW%o!Xr6F!Tc~KtdM~U8L9aH=^?RNs0PUQKylKKGC9s51wr!?D$nO?EC<*ptf +HF$N(qB$O+-y>*3jKs +E>{NXVpGcSKRqjg%P23jh +G{BLDy)0001RX>c!JX>N37a&BR4FLiWjY;!Mjbz*RGZ)0V1b1rasty=AGOxeb4idlt@WQZru#zY)KEF_m>~3lly}8`$$ +wsyb1=Lcl#F0K!?)QVT`>XU+t`D8Y6@(=Qmua82N+T=zSyL`{heRBv330v@kh-sw)nZPYCDw$i5qJ*) +5{G+?RLYgfv#GL7aP-{;%#zlNC1nJlExKg%8Bk|_P)?1gx=urkuEi0RQ=La4?T;9CC{&+c$+`UGUaUC +3sy|hJG|4x>rP`Bc9J(! +V;l_4)q9PCKDkX*9(SR6md|TWvaye{~#3Qpc+^nY_{aJy+!`b7$Fta$-p_U)tKtBgZu +`b-I=~o=qU9iy=a~APl&Di-r;v3E{S(dpxHGmHC|w%{c6IL0AD05<-bx`VBkIPegvdu5e6{EGI({;ZV@?SJvR5 +O~hTCbBzaeHp3~Ju&g{mz@q?Gnh@rN|rFK|s{RJUdx7BFxH7*O(}hI&GM+2(;2&=aUEYBQbrx?-;?tL +N+_SgF++@H!kIl0?C39jR0AI7$*o6v?K%@T}?`_`KkX)kb2YfYb$t6uJ~|1^!D7D5~y1V>Y0sL5kE28w}q6f*l~k4nw+ueEpWnRo(tt3C{b!*QE8!UV}z5Zl&-mJnP3t)-x#PW +s*b7x6RfcLEY5lvsd?hOhN~#K +=Y>1JGE)q+6xJ-AbX3(r6Ve@fgGn5x_6KWsS0;9$D5(LMziH9!5mOeY}ybSx6nVL@qzr_UcUbHE!=)9w!EpZ0cvMNm?7ighVCc5`*DOKK*CPg4ioHPp_R6}@B$GWp-?J`vXtm +P6!~?YXh4wxlmjr6?FEPawOj>-dg;*9#NWp%XGd-%-B)}sh%c>e^*I;`1q!#@iP1VU|A25bjE`Z0Kuo +q2YUb{SFuO(zZI?j4DCZ6`Q2msFS&~9+biMD0-cih5C-Dz9y58mNM?`*gn~h#KLbPB#(u9!XH1P?ci= +qMOO{g(V8XQ6`BXHwhDga}pm)vr8>tS9+D?!Eq#K0^(cto4_O)zXMcW?oQw}UmKR4t?fHc7;X>(j^W! +WZm&4L}cYLLsQ(1C*zfkBV#IQXRYssY-L*Wt+6;=LsM`XFuZngcefNH^TSs5Fcc}g(lCY{GL;WqvB8s*x_8*AM?Sexjuu&E%v%jeBhwn}*@FvC;>?dcFL68;o(u +LxsEZvximrP&g@JcC{{c-ShOr6MSA%d%RG3(k$o{pl86O+oL_k>5x@#SQj53;0WK +f@c@-*Sm>>!!EK7FYax{?anvFtRwU3KnIQNGMqQ!h=qGyOhC~d9!w1!)L3Bv=mN-0qlTZ%9TvPqaE2{ +Ld=^Dh_j7iz4AdFkj1xP3+U>mwh|(4AL4B8uu~shvon_owOfa-8cLa|;k}AnwcPlR{=y}sl6BusFLoN +V(^AXgFNZL0xihCAH#6|-hUi;;&)_m( +yH)79zSteM?_oLQ&d%t5cG+nGt?&zT|af&w9Wi!Rp<2CC`$OkOe-Y}LW4U;Of{QF8~~B;8(Y)-!#cww +JM8>358YR=d@Bh5LFdJ+b33;=NF>4zN(;bj^bPC|09k}NQY{dHgs!fzUnHk%SiLT +z6#j;&RkFq#cG^3E?qyb3*y%CMXC1s8q=7B1H2D4H(!#>0qyf!H;IaEmLYl01yj)Xv4=(LCk`(3sJuG + +Cx;9czA?A^df$;Aso~2i<)3Nt6h}ve4tip6({F=Gf +w%G;E&fkW#|8D~UosnImKqfK==4M;9I%dU1R6&ZKRVDj#as0uRdHkp-`;FP9W0f^%-s{4uW1e! +F+#&??C(Rgq41DPV2Iej;FgfNZtLXUkp*Sf8YBV3P*Y*OAd?wLq~|;j1G~K3y{lFJrVc +hMUBJ#f#)>NbJ>K`0swP#cAz=GWicsO9KQH0000802@m7R>e9LRN)B#02Uqq03QGV0B~t=FJEbHbY*g +GVQepTbZKmJFLY&Xa9?C;axQRr#aZi*+qe<`?!SVk;BYc3t4-fs)Q8*d`jVhYHcj>}1@;1gmMELIvZ# +{u?z%zpw|8bp>S4*-9&l~-A(6%5a2~&TapkU2+A^Vat!C2wkXC4`RAs`4N^Lf>-h`jZqz$**@Y9N2Q_ +4!rO09M*SG5%nwvub+*H;hHzOy{PO~T@i*L)+i+h7k3@D9Z1^&w%GGPenPCTgL%RXSl;jg_kARl=?hj +rg9!r|)X`GIJ~%*`%2S)*5Kiy_J%uTqk};I#`oIcLB85rWRb3reEkq#-Rw~U@Eex|;ZW-4 +C_HQb+=2dlAIMWpA3>g87?3Oq$Nr!mG;Q7mUFJ4||tJmKzqxD`^#X{6~Q9?_rH_unEviHwdtC!iu`Ni +|qG7`;J>=yT1A*w~r^R4itZ&!cIh|@CC;vWm*1WTw+7S8s5I&1BJ)B5rQi1Zq?0P=5+yjqCT>vPN~p0 +mZ*onLQ|LBhI!Kb(6hkZaYK)LvEPCSGN@(RTalulMyoze@sM-T0T}EI;Qv>q^OGaODSvg* +pOu6mcG}w%kQMpKrtgyGK%d=$G5AnnikGc +m8+j*c;>?_IpkB*|@2y%m5g;mh+#gfx2AQEQBx9$}=A=5L0je_4;F++Pvr4(yYlz&QEUc{fhC-Qp`G= +}ORuf6f3eM*H%Cc*{7t=~;VfVV8(go8~jB+NleGs5Jz@>}OlaTs15qr$?I95;cod{r1?2T4;vH;+6W^ +&bl@qASKb67aXWx<@+;B>Y(Kxh>JJ+}ZH7x5lEy?oligbk1p40@bE!dbK9^w0{iJV87~dD0T`d^XA(l +rv5+A7zlK)2762^G9~+faO>;@Cnfo(6(&XZyq;qSvT<@(go#Ch*>F42>Dt8P4OqgPFEdWo +&6x&{qB9sPf-h1pJi!S+&(1#eUnSiQysD{wq)Qv%q|IZCd9`p2$Ulm_`a8Mv;Oz5w1KQ6)#7IdeVV4QA<(bOOL}Pr +!Y*ug&hT8lmJ-w-!1sUy}=0$bj%$UKxM(yjMH-4fZc-tB&^_K44RCPq0LgV%Qe|2`Y*NwX#R0GCWV%i +;~?#xfD7SMUJp)Dw#{$85~+!VN`Y3x>1q!CivCrJ{^7bo4lrjWdR?ickf*SPwsME|VWtteEDxl_1wjIF2S${($3(i&p_U-D9*c$ +1xwl{1cW7Wd_7trweWiAJh01de5N^#A4sw%Q32Ecl1+>~4;V2)`A~i`%0`>rZBQy_0hO7(|-MBgJq4C +i!HWfHqWj+tM_R<~yO{1Z>YkO$p9o6j`P;ho9iWdWq9M~aYWdvCr&a|%l^E?-(O)5S`eC(|H=|tZ|rt +W1PEH3?acp#16Sw?^MoHHt4S(b(=@RL6i*?yrveLcu(&Locc8OyHefb4q2AJ+%_9@-W?f!NN^+{o*jX +?nM7dYNddWjVme$!yYMs7Kurhzi(@TgYh!Bf9jchfW>#JLbn3q-BNmWg=+~sflG*|2o6@NSkWg2X2Mp +b3vrj?TX7(@P^63_%QeQ!5{se{0Vz6z>T~jDoQA8k#nf7%qYl1=3w9i!(bE>m`$Lo4Xu|YqxCqM!>*F +`t;aWbt>4lfQr|#Xfx|vf;Lw5R&{*DQlWW;n1EZ?KGzhJhs$s^e^#mWBL1?G^iej8=iD`Ti|;PJzFUsmSxn)X7Lfd@o5pwI~2Gp769IQzlps+CY!G__N9puI(U8@Im +2iUm^d-pg5TbXopO$tbbM$55dhe7S{(PS7*CR2b|%F30E@vEj016OtcknCGamxkDbeXfmrs52wj)0;e +&jj0XwaF*gJ1JU8g-|aIR$smoM1;_#=ECST4@-tHaM3Il%e|T7kbPQsQp;$EkQLN;%dO}ytJqUR4hcO +5A8V)29#Feqq{5QvUWwg+*d=12&%rhpPUr};s33xZ@XaEzT{i3c@D~Xx9#|$Kk;J4X_Yw|PACuY>K=L +~29ei5l7K@$6Ot`Tq7@<;-nH6qw)hQF2Q_GZKZkR$FLK8~qABqzGxe*@?Iy#Ha<8H6GR>jSL#+x~mXI +E5x*Z1BV1tzwfck~3O9elx!e7cgao2JXp#}Q$tHoC&o2;R#$%5^KOL!J0qC!v!cfqT4&nX^6T_+7uNK71mR+iWoowRhmp}XvbxCN{@VoPt? +!VCfP#o@Pe(S{ExJwg3ZG?&Q3i36+b``6;Rv}eJ7bqS-p3L2%2)g+gTrm^>w5zFzGhS^#GrQg4XkGE# +4~)S#Js3jS!xd!Gav(nrE~lCEA*O#F5mg&b+~P0Qq>p1t0 +KYI>0W>(rm$=4hZMt;i(q)gad^7=ZO6R6iI(nvW{D^=I{|IZsggA(RQplfx{O|2cr=YKJKC^(DsKXH& +pKUEw()1R}6pr3kpthvZ{Rhq8tT>+Fj#pFo4C8!O_|yd;D)r|MQvs=Qa6H>Q%K;)}@AC*JWVbcQaO-t +>yzq423Hz36O9_3=8WI> +&wZCk0LqYhXP5PK;etOgWU+B931yD-^1QY-O00;mZO7>PegReH;2><|fA^-p&0001RX>c!JX>N37a&B +R4FLiWjY;!MlZg62^YiVw0E^vA6T5WUOwh{h*zXGMk30a+K%jv`&wQ|O7H!FwZfX{69hiJTjeF|N|Jyb?N|1wk;I$xT%%!}4;ql +EuoumfHW)>l#=zZ-yKH+i`i54S@7J_x`m$jqpVJf +WjV8xm8{}K7Qg`LV{wxTTB{q@1&EZx$zbqUsZvcX!xQKjHvzdsvo@SDc>ebBS#td0?D+NR$(z@wa~eB +)`EE4!;p1rNDjWi;>Vd-)T=N+?wc~J(U=-GF^ +pevnWO20s3XiCdsF0Fwk#EUyEW^wU|+>w?RVwOZ#Vp5g7(bvKskx~9fHm>v1DnjlqgJ6Z@9h;Blh?O1 +DjfQ5INroh=8^5WQ@qz^;)KDpt~w_2r;(iR~QDSWE#jNtPm&}S2Ewm7=Fl%79K&!#dfQw5e+x*_>Ub@ +!qlpu1x`p^L3Ag%;2G?L9u-#HtPdeh6-kWob`CEWR&Jbxt?*Br!?3Kv;7JfQzkmEOusg{mg9$i@UBZj +ZMGHPe*PA1TOIc*Zj{UVefIK4xrlwV>Yqyg4MTZSrcRE^1=R#(4c3>qEIm*=8_|Anu*IB8>i1-|-=U~ +VSr^z+fBR%TFCUub#Nu`Uj%o{IwN8B_ssurj;NJZoov>MGX=v6}?GsoR(4MUrlgfbTKoQW%;AQUKRYC +K|Dz_NM)qKMR#YKvpM@Yy@^&Xbm#O<5$B5=(glrhN_TXaa+ac5>>{tqLsh98{qVESdJ9s3C`Aq1EiFm +P<#OuQ;fNAfpiMTO}rvNGvtgVSD6PV$3ZW2hYBB}CP1C2;)gCR6XO|3(Cef+>L1tTZ`TWd_J+*r +L*AX!d=JiFFHJz1%;uAW?%D$i^vrEA!i?cYQ;t3NI)2qUmVk(Jk)RZwRuTW+#4)xE7jQM5R;X(4=CK7 +an4eZl@ctOEaHPs@XYgUDA2056Gzte(i;Q6(UlLl0#J-h{dV+aL)58jBJVZj53tUa*6&U4;byB0@~BO +04RfE2|qE;KjC42OJB)g(gr0s&UJQ3i_sNS(GJgxFe>EPm`0=cgNq+Xhg#_|AjlQJ8fOyc~OiI|G^~Y +f+sIi!eH)o35d)Hc*CvWuo#Lvto|N(Qk2l~LJS*g^-q3}PZ5?-3M5EbvY?&VC%@;Xn6a06Zqptt(U2t +tyH*lKU<>2hiI +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 +w=nLF~KLT<)(}iC~p{8B^`{3p3lF30z1 +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 ++(LaOeWAp}~v>;^_5Cfls3`|jd&&VE +6VL5>E&0|oAhOkvyfwnL0-AjJ*g2p#hSV`=vsYWh>Ak_?g(;EgzJkD3_Z6@dkW5NylAjL581$pHr>b0 +l>#hw%=%8r9hitv3aI6V4QET~l!bnxyYtrES%u_6zza$aQP)D)*YM(fD0#)a*^W2*H+2OVM~yRozNkicnkSmA0VTh^SeX%e72rzk@{lQEM|o%0_c|plqY66%3+>Q;1^ydYA_4!d6n}4bU?6T6dqe7FB +XQNZ!n8+%fpNGpYM+Pzrd0Iv1`)VNukO)o(_4eGm#}s{Pnr+izqR?6zymwVKkR&a1V9fD{Xis07zl=IQK{tO?twd;=#_PVqgk> +S70{_&Yg_Iq$>ApQoxpSM +QGmH`J>n9{!m;WU=OyMy-2tWH0+rl5F +}u>a*yVpv{9=9fWoPUaJD(@ub^tt-Zi8RL+OA_1FVMg3QZ_}hk150TP|;?S_4~3iPWJ!fpH1OU(*6s& +P*w1(p-xp;|`&b!@3t5U!iw|%{5Uw@!V<@Yyl;UK$`0O3~d7Ft3!!WHDCa-A*UU4V0iH5cBYj`=(v0D +g^Y<5mXVtHogFmUl{;@O3lMPSTq8YD%;W4(wm=-c2V1a1{PJ%&Wjkey@>{@s)PcKehhZLl{fx! +Lrqiw!BeD1a4JxSfR`9{r}H*-JtLog7Bnp{dJ|BKSiXgHnHSj)Yzq2D)%D)p2(&L1UxIHWW}Ozm4P73 +^>d$R-1QfY+k~pe$ykbEb2%fUlR{K=IW)+5arqljeS`62O9UlPjV1V_uoc +Khx=Nr4)rXsfmfCK@RwP+(Qm~yM2@xXaqxOVuB3H6n1}&**LEmgxFNOn-L$ge*l4}6L$R9Uc|^@|6)q +-;VA?3Fc5|p67Vv?V#MW7gX6!pdOG#8sfxB#FpIND%}nPhb#8S!-w6>bR_=&2ZrAd_R%IIDF59XcW=b +i%06rI{UY)HRg=;1|Zq4E2r(u*kZ}DS_nO)~YFQ+EQvsfnCa-I&id_=p|{|+Uw_eD3mgP$hWxJ^Pj>u +>rXvobq3tr14AUCvq}rXXgQE6PP1*MkMI%3HS0P^Vtl0qolIv|VF!^-XjI(#?w^_nqdT5KbFdE +LxQ&4Pz=|u`JiV2bPK1nLUK=?g(Tz8pNHqot%%`6X0bRT59&aOCcbQF+8xvSDW^17bRn8Ca5Yw)sx<= +OCLVzW?jBP-PC@fZ5*1k{@u!iAI~mxKvSp#q6k1|nr|IlZyJeB{=u;gLtvs9Pa^~qIyzIx>(8~dfc>4x=)8)V$XW& +75O0yp5@2;rZ;=1$Xi}tz4d=et=l&Jl#e0(toZom_hE{K^%Cq~_yAjMTgCoY+j>jTX@P$HRwKL+@>&E +hf!?s2W~uO4(AOfl9?*8X18#YvEM3VpA{dT@8sLGb8`Z0q&^$HNm;nL{NbIze4Ub|T_Vk(83+Mi|Kr6P3#+H83z`&^Ku;K +KGPCbuqF>tZLC)Q8toBkf|M_NrfUN@?g#4Ps^#Xb|q+V37uBUT<}i~30^dM))nFLb7XFS4)q37)qf-{{3HO8vT!B@Sb>l(`_@-6D$beAkA8Uv2 +6OkQyAl6k0Hr;BJ>BLR)IrVy@UJRX-{zP#nk;l9?;$vZFv~bgMpp!3o+vbXVXKss%)nPco0L78O(Y!} +xOw)9M7MJj#8b_=(Xx7pJ_{E9Wt)oFS{762*9Ou5iOsEc&^|FqTGT2mR2pm0Fg<}ALEw!$B6#2HqRw2ZXLkv!yJ;Q!Cz$PB*#QaGH$gF+E6O +E?r^;O8!<%H!Hkm3Y%}aL*al&+=P`kn-?cN-3cmWRLNN0H^o@TSh*LY%J2%TfYC+Fv{^$$9=A@Q^`9i +FR5-DLSE>v4^1)>rJzt%O&ycwH{X0sFC}qjwawa@z(VSVak?7;n(B*8&698;w~&7qRTO#!Mn#LEwGE^ +H>?bPdkdQ6&0_`66 +GhT>El=W@=bcs`$WBQb}8XP^_!#B?fd$R;j2WFEKfyJM926x*Vx5!rEIz*o=7nyV``Nwa1`f9y`A@rE +`x+$AN2*?QHetiJcy8^ctN8?AMWsheHS>%P}|(&mD8cUHdXQuml&*Slj_(b=GJ8*jKfZ=(R@;;Tjm%j0Gcmx1~J4cJ#JA? +xAywmF=bj2QWbsKearQiJ1mm4_zWQt=ZWmpbJuPfHBEoZ@uIr|$Wi5r?***x!lM@9 +YhU(dzzG_*wz5snl4@8gc-V`d;rVcAaVNsjjBKGCI)-0l;7a$RlQ0}+oBiB@hN#J{hzLKet0@!<_LK> +~B6_L+3`p-;Mtv@zYj5>6Sd{ZvfN|SO4NxCa)&cyU$SIX&|4>J_(CS$ju+}$@kyI5z_AafD!M(RI-@3 +j*^fb?`;^Ikp0)V-5*9Gsy+?p#ihc9^?hxGsvO9KQH0000802@m7R+Gz(-}?ms0DKex0 +3HAU0B~t=FJEbHbY*gGVQepUV{TPmL$eXW49KLk5bhhS=p>F +fZI*N~vHCP>NKuqGo9RZ=i}!aaO0X0@>2ZwB#r$skVt*ms|~7`LO5I76~|ifwC!FZOIe;L=z+NH}I}~Q2BTxI6Zz5rd?{y&yMep+V +IWMO7h)`JY7aYHZ|L#Q(X19b>7SK{LbPhSu8$w985Al3WGWlw_1^JCd66phj^Y{;K36;9mHp9cmxB%M +G5O}n`99(a@C2U$fRM#N&CEUoI-YO$&6in<-|J_c~oT&2#oZKrJo5r0gg+BEQ@1W?8}usGmPYjeZA)h +{`8aaJ_&8CBfbZrL#56wnDP&j3x}w=x45rBbDRFE2pl|ehHWf=!}d3B{o1VqEEsi&L+SZ)1*}X1U9u@ +64JJ*je%i(i9m2XA(P_=ccLi3Bm<_#E5!r$WB_roP$q3WERB9_@tW$90UU36yKpDW&bybqSdh5F8Ja) +lL`4;=e&{Exb$Pk~?*NHt-wkV{@jqK`@2x=zp +np*Oj9)X*pL0JqM8&NUD3xE-e+<=-Sp#{X~pNv47z(-zJGQdCTA0c#H##1qjqYd|D +pQZr!(2e5fODH-!ufjFvmJ)~GbkU{&lWT3$oZ(#K&3i#_k327gNQ$wzX0%r$Ae8}=|!g7oP$GTzohI= +WbV!HB?Am2V+AemwX-Udb)72LBD3f^ESt!a3zx)LX9MSgOege>9z5-4ZM1A)RUwZ?Hnc}X!~tglQ#v9 +@i0Io>keobF<_ma>k5_CvjA2aJN&9bQUo$oh+zCZ!Z#+RGlcw9w_fzRn+4(1ce<96_+5+B$LpMUjqI@ +nnmRZKbadc$gslJ&(AH9cpH;!#l79Lrrk6@>5Z^J=vn?L%f8Z?s5{%l_QpqEZG@~AA1X*lyMv&~?q8mc)wQ@su|FSTCo9MBTq#P9 +_e6=WDWoT(JcS~9{>OVaA|NaUukZ1WpZv|Y%g|Wb1!psVs>S6b7^mGE^v9}T6=HX$PxcvpJGcRFnN&} ++3_W|5a*f;5}bkDT^swZEgY3zlPig5lFQpAB@0ErduR4RE+2N%I}}CHAb_QP%+Act<2SQP^OB2-WPH6 +&i}fVcU%9lO1e>e`&q=i}VV;=L52>uC(~myj&D3uKD}Oa$d0?c=evwM +ed&{SRcNpl^f^7#Y#UToxRuxNTFb|tPCC-)|4DtKii +${N#Z|lQ^SrOPBSnQMljLQm{~JLJa^l4-WB+X$d_hQ)WhuJn|IuQ`)2;Ukf!Qf|DdqW5 +%DRi*n`+Am1gd|ZJ5$S#ulqhdK{)rKdU7q%jD!|N=GXp%&5rAq!%uvL2R#~E0hP&R_Y3nD8KklAZ;%X +y}y)4W%;D9DwlnK=erp-SW4IbasiEtO2&4FzlV;X_LkefS!_EC+_z4(0C2Mg0qB&xe=m7!GVhd7%&jJ~ARte{n6=+X} +#)(6=UMu5sq&5eilli0>MJ`Z#Q?wrtE+T0GaWUM{?9R7r1g&%`EUgGABD4lq@CrBK{_Z+smGXMAghQ{ +FgGme}X;Cwjso)?*AsNAwF$UK*(qt?l5WbMoq)$3TGukrW;V0-UVn8BgGFqYBAQuMS@E4vIzLwhA2!? +G|dqH1bl+o^H_h3@eZz%^uu@A`mi@$#VZehHD>`*RIeDk0RCVkPsF|?^=aB;vpG8&;VVpP$=WUFKdCV +ggcl$@WphB`PE%$z~&*2h4aQS$x33pQA(Y1x%eiTBJy=_K7UW!8ejPMGQ{Ju@mZ+rY-!Zy|WGsN^oKH +k$w6Wi%BjDQ5DO;zpu9f`UjT7~H44OG}bg9TJWkfJ^%JYpd&^A1A=On`Ms$JiHv8i6d}8m7e{EmWmvD +R>h5}iNETLTBRb1LKxR-UVpUULxr#wi>R;5<#^P&+Q5y1R|t_N3}X!6Nu?fSiC|C=xiSn=adOK*gJ2E +`enHi3Q;LflYO`4_nf7!L3%=s=9Ty4VI+YW|D2yg}31&0->EnlRls7O8EjSvehdHNv{RhB3`+_rLS{z +o$e2uJwL_I1dqah=pc*)5fW97IK(qhQ6d;N6@kRu4kuGauBBa-8ZcJC-qGuu9AOUB9D)07Q$5~gD=Jw +vg8%rTJzvf&lvUn{M>2)Y80r}FU@<1T8>WEHK$#j|HHJA*{-`jU!Iz}^&ZKty;!;8L!#2K>W7;2J_N7 +&}o?c3>~}9Yvo%G%(vb4S%750+!sNl19DM-2TQ;`yA2aMlSp2Rm|-#khomO +sv$*17KgImHQ7MN5ZGJ~;i0g$z4++>q0Xaa)gIiW91P@BKG)of#<$NP^BleNECfDO17EJp}Napcg`UFh +U9yiLrr_KkZ>nVU-yU*6OM)M6d%J{J}i_^WG{)TOB)X>;}Di6lM(twe!kZ=4`t0Dxo7E`Vi$H +yvHtx$ohUU@#(R3J7SVqMdX@Ve|-08{VgmerW87y1KXb1t+$F?-9owu(h*?yF|+w! +cLFYqbKqc)UyGH|%KJFHxs1eX!=I6BZ;f_ +OvO|rCLU=*4P4*1@u;?w;+{#1BD(DjCdWtP_Ud2A;|^#2mbkk_-C)W)GAWM!?oab=^q7+W?9K)s^TC3wg)wrHygG7a@3#G>k3u; +2FKOH4Rt4bA*d4jv5Ycsf{``Yn*dXwP!&o{84f&v`YMZ>qCq=P!LTPuK|lloBlK=rOabYT8>~$bw%_2 +^TZXhn4M<^4F)KrAQUzR_Ifl6jQzE!677hi|1rOjJIGWx<+CyBZ@NW%(#A(HnoF`+9HC)uDc!K$cqAqPruZ#fR+bX2~Yt10~4Fv>aHYo@+W81moIr!Q`U1BqDHb +Wn26T@;mamo$fMY2jjQ|Ip~Sj+><)QSkDImgc3m!#N^L-rb`)+=FTxY4vR^!~@X7-K#*bmTAcs9r0$b +uHwu8{Bk?9OlKLYuO4$nv5{T>cCA4IJfBgf7`;4!6VMBSI)=KgF5sP2%#P)urD5^Nd#s`4Zcsn{!ANV +q+}ZD<$9j?Cfm`y#5=2Voi9x+k;W(0^|-wP!>6*gNegS>3V@-=mn>VUD#(2}aachPmPVn9r7qOcMVGs +G9FFxDoj>qoq5fymdPbc2EN<_4lb3KO +9-b6K(&LJO8dHA7XR9#Q{pVMeqDFpLw1D=8+hJ?l^+$Ds5;jw1qCn8?6e}n +}l?PSpn%`Yf@U`mWtbY>b0$IZu|hQF70m6hhQo|6yDr#qjc55!wN5S7(-AZ7X*-q={hXP#j4qCVr3)c +c(3k&yt}74%4I#ZYbii$+HiRk9?iq}`WC&y>Ur$J{a!M?3}^h(Hkc1w=GCdc!mvne?`Ssc$7&(9$ +Lk^9pZ(TkHAE#b&nLd7mEj$VfIaQ@h-FTU3UYjkr=Cv9{B&`0wm5q3oLa^+0K@ +hDY+clkN_ia4XO~%ecL{jJHy@tq@yAZzo6}L|=Zlk*#n&&K)AKYIT=G>l1ECYXlP|*KhL}0rJfE3nSj +&^wUxV{I{+%GpvpG5N=pO0D)pprbTyD=c>eHmtC4=wmbj-6EN{{qo3+rT-tx?_z9AwRhwQtMH+NVQ`KV +(d+RS&igBwgd%}vU7*paS6|W`SzR%kH987yu60R7+(iH0ztXx#uPAgqZjlY8Q<#L?b5!OVWL0;}*qo} +*bCEGi9aAL3J?ADa6_l&mUThFmIsDA!ZU<+*>NU1T${#7BXj5Mxvms-_ej!9o_80gMY#7YkHR~qB}sn +S8AH;#{RcyHFApp-VDS);wyhVW3Z83o6~?%VE+*q?CphA|q)o8DkuLbcCEolnJ3a5KXK!8Q=^z6NAoR +8pISRDTV>5869g(iq(BoBC{4@M7lTVa+qTM`P~r-WjnduqruQR +t46IFvto}g&ndjH-s@R*KVZ8l|J&xUsmr2jm9#we^`Q7nR}LM>#Ay>ZD7m`&TSzXIW|TR?1Y~b)#{#) +6zhjbI{`|wV`yitHqW#gAA57JTyq1-|+u00^GiDuD;J#Ub{SSu_nlHXI;ft$^oT|%V8WXf>YfN>O`fH +sEH##B?0_F%!u$NJ(r`_SX+IvtrxE7RU@Aq+kC)`-6rX0a0YQm?9cX;xP)|R{^W +zi5IB6+WAJ{E|)B!KGHq4JRnqL&)3%Dj_*M;cc086-FYD-7MShPyIVi0igaTKMql9)saM4U9BZPf?8) +x}-GcSR6(Qio%0U^D*Fl$?%3Dm2@H7QNy7ooymu%v1$rRIr`j3B{dSUcD_lKUu`?fDNt-_s4rE)h%`= +_Y3qnMRBCW#_i@8kLrhS4Y9D|cEa%>^LB*!zT33&-eTCp@QHo8C-R93O;2R+jRzYV{mzFyraR&O4AVy +iI7zaDdmA~)t8+5%UdAe;YXsx78CX55+ORlm!PuqknmAANd+d4Vx0gM+n_uir2jsdVO>7!Vi@{JU&ON +AC@Zd9=L>-N(Xi#TZxtt7-t16NrDN*fs +9*b)ru^wcxST9x;i%OE@o4hV7u2^1G?5Fb!HoN1E60&B6tlLIbbEdl8PBv|lBu7VLi_yixpU-N-F#_d5W=%=_69gWtRV{r**U{>`iN|9SKFZwq?#qTcI^m!fF()ti +<#`KsdHT`L=X_pMN-)!*|S4xn$o+qE#KywZ2?x}EL)Zoe~EKi1GKjp(yne?&nEB@FH +rwUxCgUG~21-9%<;88c%SvI$Qwp`K@;x=wPd1|D8F0tDyUVN25Jf0JL?a0VcW|0*+i;H5n#5Rjt6d`t +u2hJ(nf;6A#^6{0^vt!^57)BU=51E!##!FC-sZR5K0Y`;%&8ywhPOD!Ocfixe3RA` +IbLfiVUv>pA;gWs7Z#SS6e@g#5)oo3Wci+AI?u`AwxAKm&>ml50cE8~@D;r6&XjKVk=OF%BLyRbeLFe +e`D9eyY8C$Z;|V4Rme+e$b6$cR*S-I#HZ(QdH3lUz%4%xVSY+_(a_ZOMB+Vrih%w@zkwdI*)KopJL +u=j2{bnBUJI}*WH4LVkJL!nW~hl7A%(Y^{go`pO!w?JZ|Pq1G~jl~-PbS{(G&j}#WzEKp%}tpt36XZZ +;B1-f48HSD7UbNwtP$0fk0hbOs-R3XmBE|l|7RPX2Wr90mB3@u6vZPQ(xjxCav-Yok8`yJ_`mCS>$z% +r~+oPtIJRbj)|fH4BbFB;wH0LleyBD^zwcKb7VD*H(Y9Fw&mP0yUJBN3Cw2{ypt+LvZMeCCCGv68^gR +^`(+5+jj3n%5B>#GvdPgw0%bxTNv(EBF1a4E47E>o?EnlC30a&EZbXTdun`nl|?lIT +WMA3`Go((3|yqS&l$1YnJBUNQy;ei;~;zK7syo-9Vq0#1gn=fPd$Wb4SPt>uOSRv?vTy>Km9gwZ1q=7 +9wRvWq5~R_3}jWbSvFI=S}&Mg7d-r7s +fUGlp7t%FjUy6vLk|U{6#n;yztdI(41AzmuWB&DssnXKR~-%ciQ4f(tVMxKksyy9#L;Nb0{ARJ$od5U +I%q!V_e|2Pf-j~TwI@~z +d(MEE$@Fd_azJ$6a;QTf@Ifq_L&%q3Pkd+SI2}@u6`Ri(kDG)rs5|;-S#P1p#qhqv&5_}CH#-r38r!Kwji+88$?>I8Y>0&3eBMG9RbO; +l3)b@G){4fZj>A|>zO4AESEv}pgK`Si6B%I9DbK^5D5KPF5RM!j=GMpkY^(le$A3Dnc&fF$VX +uX4o^l%6VF%#Wg-JXsu4&OJ0#GtumX>;SHaq@{P1b=GnPvIc9Vbeh}C)Tg;;<|tUG`Mp^HY&bwzBu-Y +7IRE~hQ)pDk-QHS?qHAag7RDAY*s5!d0SEv69*0OBvO{Ba*!rM1KraD~T!rq2k5^QnX{yLMW08<~3(s +aO2YhqO?@xug&=Idj6`374(eU^q%4so8vTG~<&GM~hD7(x7G? +dE$wAh7rGBa}4@dlUCma{09d$ZO+`g&^jI(JhU+elI6Lb#fa@e3d6H-jS){{V~T3hX^KdJi#;yfJj|p$p@h);17*$iB%NY4W)5Frr_PB?TTcF>)AYpZOK<1;A$ +1vp^*!zmE@ZdASe5o#Go4~4dR_#mqgx*`YkF5(G{JXCGvaS +k~JMoLg1NDD*WVxEzbYZS-3g}9|v;zrzI($Yqc@udP2WmfE+#kLCKy&co9w+_Q48R9p}V=Vpt}%z2qPsTTydODF~g>exrODxpEPwkEP3A#wc{z<8&3y?r5m6ey^y@;{0d) +9kcU|l!{wl5UGuqv^8=5Xu1s;;M-zH~F2$mXM=2;I{4nSZ#MLG$fJolp0z=!bpKDjvTxhPSVZCi7UO%@O9?P);9kz^Qp +XGw|u{>cs;Vn0S9By4k)=vYHK~$H@};f120f2;)?o9)zM4B2b8eu*I2p6RGZG`3`iC=$Nx?$nY1;ft1 +EerZrB4J6<}|+ERK#~%Fx-lyED%R4sg+ko59TR)~o3ska&fUj>#KAZ8KX)u;N*NRXg{hABvrO?rHDM= +*=JUxYIO6D`aMP-0!DS?xDUDjjS$?Qz5P^J(aHm$-KWwuT}S|8`rSu#IBFw``Eb41hWfcFu)#1p9pyXP=SJ?oUNzxS +YH(Vg@*1w2rPb|B1Z7U>+J*aK3d{Rp?UXQN{)G&@WvG>#ZSGGT%QeS{5-^{SM&o|HVE>&Q@zs6o!+^& +oqj!k=AaQjx97N6fQ_+)q{F^cbZ|N_k&bGB4d0NDsv1HL88+U3xyL=V(r*Hy*Py*>`(Ki0d^8mpBZDf +E8F;z?9gEDsQZGu4M%Z2Gcq_@zGvU*;k+TqE{<9v) +w+v6+{%VlyGJ@-4710fcpY5sbh}SPLEaUcin|E?^-6FT>Q3~bM?xrvGpZO?XM?1Qt8eke*QABiOlzVi +-A4vdAr~m?SWa~4mW~&~T43m9*OqMQ>?hr6`-tV+dyDUvE6uxiYY+;>6WVqh3avm1$soK37A^>;;#jW +hx!M@c3TC4UEtEFG^fzuY0X#h_i;e*YCAyD5DDzLtV$Ic=Ib`y*vu5KR5s{4Gef;x|d9SP%`QgWSqwz +V|<1PvlRBt(d-z#hPgqQ%33A&kuc5b;3tLhE7$&WwhKu2!+hF_7^h3q7@bjTsV4)CF#j?ZnQrd1!HJZ +77S}WD{|XIJgGr;+AQ1KT60tW2=q+)V|qg@0Srkk_3N8@_;<#Uc)}a{A<;~>+y>>$_z;zc6MP5Q`kZF +dXn%N=o1Ntmyd7@?dPZu_WHo`m6BE0Y7a^=a_My1x!)w`I~NMWy7Z?nG1?BAmJNDWGpe#G&i?sNSi(x +~*udv1y;YcwNoxsc2ej?5}# +4THet)Zr+mJ3Cyn#*;}740x2`b&{iQ5JZ}M@wM87iLj?0vJ+v_kP5LsQY2v{7Ddpl8tjkOd4P#z#-+W +4|>DH6rpgy^Q$WDva!Z6BJyT-0Ef?1s=qx9T@FDihpEc+!XxS6-?{_{PGCMi9JJY<+TP;-59tOvcI2B_%%c2ZC>_J0B_XMw~| +i53f8w%t8HhMW!n(sevUtd7AVa4q9nK2bm +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 +6!kLDNnbHp6e@(pLIvcyxQ0B#*?U*)?$kff +yBjs!ivObz)bkyb_hXCE&K{nnEKy)7kqd_Q#Og8F<46umMy~+)CXM9|s_K+fge1;^m#v8qcaM$wCoW6 +ov9QuGG;QD8mu#a@jc&0d^;}x*@S}>Tc1yl($mp2&N0rCzn^R|Ni~*-PNUdCEg$&;^V#EBiya*v|kHt +%nkAt!z+}f9Ov8zib#P2B66fL-Bns_LvAAiI|@O=8A9dVIqD6Ss%e-JFaeYSTCBnuBJ!T<*0U7qLyDS +xI7`F<-Z%);1c+SM2AyJ@j3@W95dgTPjgn2E&l>{IBtm4^cgj@(GMIYCjFc7dCEiy=I#$6+=AbWC!GQ +GX<=~R{zg=Cu%P!yk0Tg@2q+l0+FNbGf*T|Zd;306zvehaHRHCiId8BZ)M3O7gEpogCu$;iUVlW1OVcQa`_{d@xG0scx=os!` +U27h^=wJ`e=jWk(~Kv*Z32Ho +A3^HPN0~fcb9rTZYdMlknt}F`l?G|JoIVu5k$O~|7jY5Z1UeqMfntUa_xW4ZFjanbd2NXmLyS^TI;ti +3((Dw{#uQ=Ks^;7YuYI0N?{eU8h;!s0eFGpWpi_CH?TnIz09oZG_+&a>Pv0)#4z*xpdM*$!{4wraIC{ +fU_?6kB4PQe@zQo|93x$s!#z5|&1$0JWD(+K9!Y8#4#By_M5!?~d;bfVZ;22W$e)h#qT#|?>aGTVnxl +XJ4<%8t?QLemYs*WIg>xKeKO`0v^^qaHDmO`t^yW`r=Aef{L&3B$9 +88PhlMdtFJZjg=v(VAPJ#&G60hgO#_D6Wmytbwv^96+0Lv!FbrkImR7v=ux>ThRG;F(g-Z(zgIPsKur_YCLx8ncrq_uLxCO_cX-we;MYT$-S#9_C~u!Xxo(&%vq$s*NHP$PpFX@~hH;-u`QKr%d_t319=2VJ#be%av08~A54OqIQOC0H@x7PD@ +wiLxweIC2mw811&0B*Fz7`TX&sLqT8;zk`%M$@-2b`H)x8`J-?=cf=AV13gyd>?cp4#PW1>j^Iov5`k +zmd4Ml;_J^H*(Jk>- +{CmKDnKYzbwnt?5v^6w1cU^#+Pmg^nhK=)tTZU$mVgLiA1JZ5_m{u1VCPx`^bmR4ueIY%0P4yM+)SCaGpXvklT@1#C|Zt +UrCi)=F>1p=Of_rZ45Fh_|BzmWDTpwO!!Ulp3VLzm2UxH49jWgMa@}csFR4nb_9)JPW99>Ou`E@rveLO5hGHs}0`(Px#jITbOf4&j`F* +!WD`dyrV6o+TOi@%T0K8(ciZx@r}%S&-S0b=9Ri<9v&q>j&yPCkDapZy}<1LoQJl{gunj<101)j1WZh +>edgk=*I=3IyoGlj>Lz +<)5Bkm3F{o_U=0zFc@$qh9b+Pvc?kcGuEytQSec{qv#SZbj-alSs{;AU`0{up4kzPF6wAlS`6*Tt1q( +RmLJ}LQBliEW +oR*py@?okL+$A5O;QF2^hTN%o_(-6%12Jg0Jn`dHCH=f4e(gB9{b>Mb_mB@3&UkO^H$T{~p#~t0 c{Aypn=R#0;{ +Nu^Nm;45Y`aGKamu!Yz=7r*ZT3E<4uB!g%ce|>!|4i3Z~Wbb!p?_>7c*8F#S*W#xGVeOB^+aZW-CIIx +^j(|UOR?)3P592YtG=gS#1yHJ8PThLj}j2h{`L_(X4 +gyOZx&XQFX7Km8CS;JwGC?7q!%)~iZ=M4I!<0OfbD#{Cx&?}HoC2_5cnsQ=VKfK+D)(`tNTD}a$Z@Qh +lWvb+l*k6Rf)Xu@PX`hrXrRQM26UMGD6Vs4uSy1j-97%8vBxl$69f)cy^j;&3ZX0%J7`W7?hO1MC4j+XKshT4bu@8@>FyY2K` +ojnq+c=f8u($8b57j9Rv%>QB{kb)n}cXDQ${xu2D>CjNVG8xs)#=(-mNUrfG)K3rGW{-ULI!Hh>?T?u +W@)Ut)W30#$zxCjQ4{=gv7w9nHiQ@vqCx17gnJ(ceu|x*5;cO| +LKFcE!I+y@^J;$g-qvaiDDmHCtdP~4Iq(-`A859aUg;>!)WqT@>xkih +iln_P(k$gBn(>IlxLziqBM49!WT~Mi3!tA$*T*p7gpdI3mMLK +?s~riCu6QDGVq>UjTZN1QhfJ+{PLtk=N^LLn|8V6Wbb^0kt=Nz!WTpS|6tuukDSoD0u7kh$Z*7Nk_H4 +{&tB_ZPZyiUE~2s*SQ-=^FdH8jNo6>8?<2RqMFsvq!sMOPNuEa>nl`1bV;?&?^;(@_@7Q^rXf`;(0*u +Pv~!z%QQ=cAgU3?C9E)sq%AUn63!jn0`Y{NENXHv1g{R2EZ2Tcv +kttE+0zHL+CMc#t|v*Sm9Xdo-Y(JpN6XMwaAYtpU#wBe<_sO`|DA(k^E!z5tk%YMvVUig`@4;2=$K-A +RH|;Mgn#cP}Y9@B&#m@_qZQ04^o=32(nQrT|O^RVC+cTEx*ETB9HnTQ>xmhEXCYPA&DyV^VLKESo>`A +i>p?z!WTsr0CM5Z!+7%9oo6P2aFv0trfSr)NFRGUIO2dS{mnxr-mC;8zh&an{v}4t*o<`NH>$!rikk3 +@bi^+3t)DwUCT#saP^+7+5o75?KnlOaL^uY=uv_7id~;vaaIG~YQs$AL@bC5Z9=B4s#g#h(QsRF>fNL^!@ob4UkoLK!8Ddg`S$bHR +T!2v%QekmhR#?I2p_84u1BZ#-5r8BN>=r-0*!PHIqI)Itt?Sr^X2UG|Gf0pL#u39x?e!AGDtE&u1#yn +O6OpSI(dPtzX!IM0-PAZlGeXi5|yB3>r3C)3W#CvJ2r*NFeI0OE%(QqpL{EhLM%(}5Z|zNH?CGKe_gc +T@LsuZ?W6@Y98v&O`a={F%oYp)Z4_WZ_^sK5$kCw%PJ(t*`^*b1IV$fk(4L>h_1KeRQd>EOxm{q|)?q<=}H0oIhPSw-Ngzc*bA&u`#I&JSyQdI3= +~gJAS@ctek8P9Y1-k`g;|iwdy}o&HqE!T*I~%H_x&qgdFi*ApdX^t~|b=gMk;!w#)1_6jIhNKGu-iML +y3Kp@ZwTnZm^cdS5}XQl!`gNGFlfygpr>o?H}fgud*yHD*2xpajivrRJQ|hA9_r5ITzhVjx^sMHEW1P +sgXn?<*+?WE0RDLeNLv)+mjuNkodl*3eqy&?cegS(V;tGnr_X;A`kcanwN?!rU(E6{Ix<;97E(@Kq&+ +2og{mA(Z^5tE-DkncTApG*d{mDZjSSIQnH=MQ9|fqi{*1iYiW9+B!PkMd00W7+^du`Kb-z&s^pN^I!D +P29n5SqHG)=TVc}JyOUX3@=ouU-HaOk$?#M?ekZ%5AQQo^)MF2r;|FdSlW+b|JgGce<@KTCCbyErM|f ++JF<|;grCx#^iLcG{QoU;<)#NI0y#&cFO77TBn*3GZ`UqwL#ba0eqtP+77c09XaP_0H;I$76I(OQjma +-x%ubM`g*sI~lXBz6E&~DUgK)^v5C*C}cmB-KSjxgm&r!;2x4ZaM_{vs9&-1Apz?pa1Uiz8)>AB!hNAnxeTH0lC|IncdKV`V+3{Qf?!Sd#(OU#+@zXLnWm?v~wJd(V>){1|urKw3{o +(400cY1lOgg~9PaA4!R`IK3n_geJ-F-6Z>n_2%_(nZ(mLD+8a}t76PdZKL(L2$Q8}gg~62ItYI03xgD +XTI=S1J3X0P9F-lNB2;#D*SMS0_r*gH`SC+ab6UYH@IIO}<{YdW&C}+5M2Y}k+Qf?HePBZf+f%bXkVuH;!SC<%Lz$Som^F=Ac9o$aEOO6H~%~ +f@ru&bx-?C=`jL3NU@VReJyPCH+es~H;%jTLrUPUDp|$a2gkx6LddE!OBY$!Y_}^}n4;0h`YQ(uiO}+ +i+ClSnm|f=?fSYWZR=Nvwx<~!40=T1{fGfCGPE($bZB^v?Zzu|5V%*#l0nN9zCbzJleYKVrs1L>YJlE +%P>!$j+;kY7OD`RSFDr84sAy6p@8oOlXb*yMaT%(L7vVVsSid$$!bg7tY|Dx#mp-`?~_nz$JiE%NWtS +`^IoXV`^grM1R|M*v9~okK)8#oTpOXAx_UZxf?GF(`?byey4ub6b|Te2zqf~Li2}-Ax)-y(-|ppWr=x +FP(+95!i-*k+Tm|CoF|?Vg<-0ZL%XTIy9CU( +WSnaciqDsI=Q{du=zfTf*JSZV9v3Zrk~Ks@*DM>9X6Zh}YR|F;HtGvDR)A3GOM)zM17JdR5z1iJMz5; +KfTBwHu%=qH}2%#wKCtAOYE7!)r+3a*zKU0=T}9%H0F-R`Xwj4^VrW#y0r3GFv9`W6%+~tihhB>}_g( +PD1+-;I5i353+^?`kxPS=E6{f{KqFZ^203^fwU&lCw87ohnIaWc%6L9x&ij%>N$+iT>mpGasdwEAx`| +$+iybSOOVZ#z9!NQ7hBOhoTgdgdKuI&@DB5A{@hA_6GEh}Z$e4e??Zq~&flVf--Z&^@Y^xQ)D5Wo +rLXW>7O|0CC%%V*N~9MS&R=Zca1=JPxiKqV61;p;q=MIXKK0I{+g?{YfZ4KiEeW146*YgWw4+l`WivF4NIdhP12?7=@V&WDi>4yk`6yZ(O-#_P#b +UdM7b2!ZV5%_{mafl-j&n7w!>6c?u$@%Am6%x +Ob_Y@-d+tE{4u8X%oUc#*D6m?XHHbi3xi=@eBk^4_5Z?)^ +^=OFlFh5Cm@S89PzYoA;nH+j@oPm*tM#g#ggn67vkQfr>iR66sQlK*gegwtY@Knw7dFCYLeEn91xeeo +~8!8a>f)M40detff3wms;0c7E0R|U-Xwi*;KT~(+gbkxCo$1c0D2iL#HT_q0g+{Y8R=%e_@Y)7g8476 +wHpPNk;!wRydGYB#p$ymc3`~jkMERzS%4MTTIpR?=7p7J#aewyAa*o{^eDjlbzodJdhci1l#R!*N%-| +=_n5uH0lbRd6`#QfozX{Y)N!91GAdE`6#h#yNOG#OACtZen69pkFcAP>}OSEuxfePQFnJY5=Ns1u01F +m0BGS&Tj|70AJxVX9l#!d7P8;IM_iR&~^?TEfzQ<>?{AX9%IA5I$1_F_bb$>sn4NM{Hr?WVJ14YZ*mZ +`rr+O)!pGvrzIB$NwsOf=&``-{~|L!7E@DLP{-=gK@R{zpI8= +dYiMFAXVs0twL}bEfZ@bi(M-oy$7J8ug9ZRK9K+>x<7uE8Zs`fTQ58&^2SBHFCs(P3=QF&#dua1_K*z +TUh#(Am#yr}Ku^wN6wNVIYcilPy4Aq8@Gg|BM8Op@J599+@%ak443|crK4KR0LKyxL!;W^*LAg;R+C> +!9b4sE?sNE}J2lc%YKu}zIUNg<4G=;KN1U~EGhn<_&?JV_x1%oCJSfFMrcb(58i`$SDT%+eZ4s&4CO5vQiJ?W1V{d-@nI7$*kFditcPr_uk)tY7yO(ey-9tEK--ZQj^s +4RGI5^y-Z{XvyqHGU$)$u`_kZNDjk2Uz|{a|S0fLfIlnrMi!2e_v +BpbC`3eXaI2N4|WdJ$oh`z#u3?0JH|cXOqhyrZ@fJFG9q&ext1Sh^cebOTn!|cknQuDTRw|o@&_06^T@j$#Wc3?B^gwAi6$XoeX5;PK*g9b(omY`1E%$v)!0elwM;dM$CrFyK$hP-XW+7 +nnB)Esxa4O7Ak@g+{~+=N3MJgYi$Bi{`nk`q&~wG=|Q`5N0+N5xvHoycYAdeTaE|M8FAk-#5#7}B0mf +^lT(xl27yQZxsCsM|j#m32@CZcSS_h!Y>uzrMaUeSTr<)-<1uM9_hj&%OrN!-nw}U()05I6S%ADn7Nw +FE^JX#2%W>qtX(LMp8Bkomg!&Jq>~;9gGI?G+W=;&Yxi8g%6&NFn-3miI5y_NP%&YpHn`5PFKlS6G62 +at3ym)y2)+I9W*{Eh1JeeW6*}shE^TBQkEf|tqU_~tSjw#3mF9Hf=exnP$@%2@ +gUl@vLlGC2oKg>9ZihGlQyhHG9P|K}A)k#W}}Sw@i|?c)ASqg2SQIQ3q2xVeF}w>cL3IfRtyFkB!H>2 +FlrZ+dTOwm}!db5}hULG(G5GabB9z?2$CQg9sZLaK(7pKq|01twvJXf%1fH;SC*5kLNxN-?cD?MbW`_mMV)5x#PI +GlQlL>n(;2d+gYsGFmYM6*bNw{l?&BeLSL8ldJuvb@chvb#iCFuI>+)kz2UJc4FvD;h~&eoG+Tv|G0N +#3jBtumE8o(om3#L0m4-800;^2eUdBs0@CjFhQB`T?$9Yycjt;JF0vln2qz^2 +H6iyAj{_?*Q&~4YNNH3L{f1nc0&7^4p$Y&kHPIA6ji0L|ul8Q#gKNe~B-6_I-1?83KF$fNB`V}}k*67 ++A&acyeK@YV(qdp7#~AswnoBxBpiy%K+_2^V`mJkDBsZ)%a=Jmyp%AWi+k&4#E{MRP20qT@;GSdwC^? +_ui&rF}o3n;hvdFtx$yxw_>?F4oLo`Zn3KL-Zgt>`8_1`p+?w!eKHyj#fcMwMGer%{F}7WyX9AY^KD3(~7;^@<@CMY8?9B~Vklqt1=u$P@4HqeDnjODj$1Y6IsS3wZza +ybgy7r_9p}9CH1^s1mcyVz&aSksp$G@E6wPlyx_=@Qk^v@R`4zG?cYX^wyy>hzTss%QN!1!0c#X{Gqc +8dl6ZE%YT{&_KIB5L$)ZHM`%l|qw_>oLrlDT!1`-L{b#Dx0=iYc>-9{GXxerwG$F%ob##p6j!C3Yh&> +)i#W)GrHPV^AZirNDcP3GMcBDim|hxI^$TYO<~~&Yc0L_E4bGWqk=W{%TlLGw~DKhV@_dEMiW#`Q_-{ +v-dRAK04#h0e@z3La!XdR5fRhXb^#iTxS~KU24~8hCVU9AzEdd1d6Z@7MszLIJMu$Q{Fq4uzI4(5LwK +}s@30g)a#7JL=#xETcoxcg8PXMQn_)ov!~vg``EM=pnG&A9YY+O+B*rsjeLU-1eE-91T|-m2EmTO{S>g&0{ +kHXhzIy?}rtXY7J6t$e2|iBLFE*Rl4O;3*cAqO*Y|>H5oNBSXw1uWMbk)z(OM7(cf8BMQI0acP!;gnBI1{xeC2S9oi-umn4EaeH06J+$wW!D4L_m(dIX8XIbCZE%HIj>K* +zaUBCM`lFQHk+6p3m(AUql?F{uMr$TZ_oWx}@+&qh+FGRUwe4@-+Vx_WUfpy=O1pPyhz>c$&N3Shcs1 +`X3uE4_qTwm<1g%pBD7-p^Cg@EE(Foi%^3&yhrHAWEJ}s$H@xTym?#GuVjgn`KehZ9YQwRjGt7WiTA0 +jv49$>JQ$XN?0R8gPePlg7-xRSz~eRpdWE$Du&f?XF%DHH2GTWK{6$xtJOr<&uaETUqsx_f6Mlo9Pb< +r^ujbX3e~9qi`W?A5>T>dBacU7pO@HS9B%cxM00m+8xwdZV#%wWYdD;iEA{s73Hf+^Eszjd=BwnmwcY +6>gxEn-U7&5Q3BI^!DF1Ax&De_GnP!ccN!x=>}7?(2;pfXV-FX1E;w1vuBe-`#e`;f&$wSbj5f$GhWq +)mxbr;x*+Z2pe$u|}jo@jFwNmUFmqphdUut4-61= +pKfV)4>qSVh+Vof$sSacrQ>%?(cBm?73P90}h%?d<8vL#Mo@%(|-vC-i%$f{-#sp{N%~1rgn7s_8gn@ +(#Kvc;+ZA6**mzR;(Wp$CM5>p2>u?BXKSH&ri~Zq9@dQ~_CJbvP;o$xX +x_fQ8q}ipQQaQf!-WZG+CIHT&)B(Kjs)Ba8Y1XMxfiW37$X+QVq0=!v7(YYi(12D|y8cXGG0IYw +P0)pq}sWhjdlw1_E*3bsC=%=OYp)b0rr_3GpQ~a#&bQ3ON`V7=xWf$OZ_k=;|W8YMUH3cq9?u+3SH3>Z-2^{I!S$CN<=8^H^5=^7n_$zH9 +p@{!$95WxX+&cPAVgCV{0%RERaRaUMj``hk-9@o`nIqx!4Q@-UqUv$^MX}F1BG}Y0n|-F`Na% +9GD`YkiKx|r;$El9l0gN&a{KxxnaJI=C?SMVCEn90)AXG@6aWAK2ml;P_Ey1>u)w}&000`Y0RSKX003}la4%nW +Wo~3|axZjwaA|I5UuAf7Wo~n6Z*FrgaCz;$X>%J#vMBl;zoG|aw#v?Ro!O!>8w}s*IBh(7PGdjR!!p3M3r +1@R70rZ-4IZzq24nvEbeT8JFL`Z$SF2gx7AyGQJbF>C@}>Flec3|qmv7n{A +e)D;^E$tH1C2%x9@l40^zb_vfqVR>ST4->Lm0LGt~w?^4>#+jE%NhfozLFFFB$#gCr_JfxTvd(aBW6r +o;Ht9-5SfICs%C|J$zbSKyTiMk6$dSybT||T+QQ>FIQ2ypI}nvuJ +f-}#a^{oWbHX_9J>ovRSS4NHgY74O`1%ClA>=4@Hy^|XRQ(8IYM&OC4P8SbWOTj#50QPmgrR +k5y%nQrQ=Xk!Qqz0t6Q-X>I|F3-wU{3KsaPxGem%9>S~UKAInMeV)A(M(|~TKg2HQ0=v{vDMWhtTmr2 +ED>5@F{`-L`_~Ll|E|lqeg8UWp@wOPf#{j80kg}C@aL59PjAgb*cBReA1}+ii5`T+>31)G{F@t*!h|2Ip9;W#JN-YwMk{N#q(4@zdL)SVdQ%r!j;$B4Vb1e+`0FyiYO>R!Si#9)Xgg +!%X#==3Yu^-hI6$gl=UEB@Yh7Qxd}a4O(0`vs8N#9Hc?)z#(Fe7FFRB_y@%*R465tng^=q+G?ML*D9+ +Z~S|2=Qcbq`$MfPP*yzm&zLdf*Y%km`O{TzTccFB{tppp$EL;K)y1`iH!oo!cK9BJyD^e)e^i{1qphZ)vp@bk6tT*Ma4o47C-3$e1nOe19^5v%RCS#Vn$yimqgJ~ZmA5Q1RtTK~( +-0R)TfE;C~a9HAc!})Tt&fD^|T$b%s@AdQ7(=Y$@0Jw<5dQqY1v7Jtb4X_m>evY4-_HNeyYa>;@=>wSQMP9!xY8a;lH5 +|cng2Xd<#?vvJEnx$%k%fU1x`yw?vREAm0BNY-??1&#Fc~!veB=;;WKrK;O`M`U6R;V8&4$5L3A1u|U +N+eovTaa)RnCeG2q=KMD4GTs03;rO6$QfMb}q{10(Zg0bcX(xiww>=>aLoOyo8!a1)n3#;i7*HJ-NxC +MJ%lQ2NT^N8Au2P3(2@0KxySXZ(y&~JX`(g)D3$&?T<3(J(hyE6aSq9^ufKu4|VS#gMWu{8(b`RMchj +}K6?9ygJ8Dc#rA>u-B)W3ocWs9pO!1?lbN?EoUa?=W{2z1u?KCnxtO-^rY#Z+1lVjYhGhdXMVkY~8Lr +2fW{pR#wQzW9G(#WgH`#*`ZM`9l{~I2Ew&%AUjMD9@Em(C}RoV66A_sxPPVYAiy;wro!2(F!jh->=KC +Sj&`cZS{v*>4VN^W4oTqDFA*o^N{!UBqNjj(U}xQU@X5UnOetE<(tTrDab+VJyn_VB?-k&NcN+AQZ&; +ku_NKd40-wlNt|^Y3-C9cM!(f0L=uQDQyDBG65e4~g{Sthsd>^@`<|{(t?+x__r0kFZ-!@d?{bHO;7q +yP};;MU=HPSsJ3F?p=;eU@r+!0l&G^2R~M;LeXTd1lUI+agjm65|4bKo6H@}g%g9l0ADH;h=8n8{Y6< +fP<6cqrXPEq4MA2ZXVqDqug`%5QQ^@f16~TSFh@~lf4^r(o#^rKaGW7;bMywb?(t}p9l)Z(vp1uVZhM +15>WAZUGwQ!SFq0|dfQq%)B2poyDY&^>J64at`G_2?l52>T$H#hFEQCs}g|7qp)+#LbDGF7e;8d^Xx> +$KPM022k+d@!Btr~cO0Q>zv=7t4biS!NW1=18F1i0BYPmoD^Q(Y7pFiF570Uu9z<>6a1!Bf2ex`#Z_r +eO{U_#KOgwGsI50ZQ1C*u4ee7xF@rQSUHX?cv~XFd`ku>WW}Ydf%l=eJ90$*_L9zq>B9_#fTA=f`>5s +sdnM*jyl>%1H1_V8Yw;YTkH7;qf~X+;ojo>>STMvHk$iRr;}NVRxP9a +y9`W$WJS1p+UXW1xO?f?f(|AUeFebtSgWg5Y#)656v-!AFKr@5^p(NXWVAl<2Dn;$(TmNlr)R6NqT9) +v6^q9=R81|RdER`M=bGu)K$Ts`)^6P8{-cOIy>(HALF@aZHWrB+wgo#mw-GNZMP#i=82OjpIhV=41<& +X!tzM!8L&uoRS8YnSpprzdt{J(M%!yLUBS83!;|C{a3M?NLWGiO!5VM?aH7P6)(P3%d8|Lr`lPY%<01 +0-iVQ& +7rvNGU&*TsQ6%A^gu`aP1c0284@Qv4*`@t(LI+Ga$2POF0DxN&HK(vC{t`_H#TE@@A${&5?J%lK9N4* +#T_5$60Wz!z6A4d@WEJp?`*$5F&H|bQ`NK_F%!vGo+HhUWkTv&WcGG_vVyVbkYS$^Sr%nQ~kr^f1AE} +`TsuOw-fO7g9i_GsgZqlkUhi$pC|+L7|(0rn-rbf+B&1<(`vP1-DpgJg3sa0AD+MZ`A~X$1e@#_y8Li +!hq;j#dDBWmK*wB@3E4T_X7+KzJv6joRT-+!br55agb+`;uJI1CErHPl%o^>;Hu)5QeyY8HFZ-5DfOO +QfBu63f8E2=PHoGiH`N+4S%**0|XNa2sI4$5s0o5KpM4WzG6l+iahlk&EO059nj`XYq;Bs68_gxg(dE +2g={XhQkbaU2B)>m*wuO?M}_Qw(q7zeg4HGOQ#9WaN#o*q;s>%Q`{={ko0z0<)5;&?VMZ&{S+8bk +2wXk>)bXQ6Zv&T35VSIYipQ|Sj;C|_8ep2le{TnWaG7o9^*XBL8j!hD%<-ekTCUUGMOZrd$TzmVv`93 +?*P67cJI=BVnp1d?~8m9cP8EYS9q2VvBu~_`h`I4!#i(1(y3cqb6i}}HiSYaCl=XHP8_-;@|~RE*$Ge +ahSI)i@;{hsN +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 +;MDgZ#w;L2~)gWHCKkR;M{M25;a5l? +^qZ!y9QoeCMuq*;tWpju=_tjz)ba(7YBSPc)YQa1BQmDn!7Hb2l8ESdm=ZfD#KAzGq`CxG*1x?`Sk!F +3MTXc3T&C^M%SKb`06!3YZj@ +ousv@>V?t!}b5Ot^OfocFc^HIpbASlg-!gB1Z9JYGJCT)FPf4he9 +cjyjWZs2#SG61fbZ2wwE9pA@e0VhIeNQWHv3TQ-R;s +t5gqPkmaZ5QY#X?;uOGBQo_?_^2X${NyP<@$8s%(P324TSC%wx+y@?1SiQQ-VSeI-RpLPJ8SD&(Kbev +3vA=M$QxV`b??qWaY +y5k?1)17=j>DB1wZc^5{;A?kuWqVR|r6Hg;Qnsq)aws~!_q1QpyH$5VbitKU-3>xV?N?Bb+#zO$?+5j +0x2y>JDKg8ZJ&={a*uc=I$rxaGGo0l{&u30P}XI)HlqKlnCrEi{0A1WQ`l$TOQ6*UGCuG8%I8j*5KtYJavqKw|kmE2Y&X-?&fva*}o|bJR*R`5gNK~WSa>vqiU4?UDK^Q&;|;TW9(Mrl{Uh?DaeS=dk6L!} +O)=Yx0-l9P!a7gA^|N+#MfF;sjMW8cRrIUMb!tr>4a^rZqu)HuZHDNK{r_j`I(WamHMrEF>|SCCCx1w +7(=HNb3eguKocO>z#`ng`7u|kEC7O$C1)3ebCu|oDUJ#OoWQtt3I$522+28ZoThz+20d;sU6pkvUFxR}H;(fuPRE8r<0x^~a*vk= +2ZhmO>#NWQUB++v=-tD2>NmVnM_BhbeF1g*Or=UPZAuInI$zbS=CbAiW9P9=x43&|g5z<1gtdYie45i +#@{HHH&>B(9eLB3TjOl_u#Llu>HI!>AoAPyoG*1eZK!+XLDq^_mdhtP(w{UuBLhyhO0f) +A#JZh4zYFsb?KYIy3MZ$#-FS+wRJiLt#Y+HB}z0|8Ggj&2Oea`Q;xlOr00vh={*E2k|~qQL~!Q9GvO@ +RUYOG-2v)2yYt6_0#lQ&eBweqZxE60v5pZRN9Bz1|ZcA>=haJ+TZoTzT9me-gBOGz-P6nJ%OEuq7~VP +Grh~ut3kL1pWh2${p>DGQ1eT4{T$QYZu5BCu$vJq51gR3%M)P@p&gNA?cWTQ54bUA +9`Mvvt2e{ww)1?uYOs(a_;kV(G@Jht^J><=P!v9ju`p{l*rPmS(401OvoK3_b>5u0*g`YQ@*}2y#e8U?8JXX5E68M~ZK58_rR@X}^A8@ +}J?S>Fy!0KK13;|T&qu$}?~P8*-+Hk!j=9g4y#&2diVu&v5v3VnRvG7reNu?!Ro-1*FR8qOQ`fhhLiu +t2}XZAKRC^i18?Fo=I=5?nNe7;9jV_?6NmjoGtEytYaXDoZvSIm~C#1eh5OT%5tq3{%jWu>HGiCfL6I +emXil-g!$MZr@P)w>DhB&;La(BOPRNp5iQa(a+&0(g~3Rj$4_e!NXr}xq!1%RkpDviG03JElo`r!F31 +M40htTHVET->PxY1&H~MX%BRpVZK+@%TLOLH$Hopar8`yNQc{j~W2|T#NH*j$nrdNZ&G(}J+B&AAK^m +T+*USz$N3omGN4~gNw^xakxM_ar&OI() +5rIt$k;8xwbyLn^pO*O=$d=zDSbQ!<$7v-jg3zD;~p^=pHa7-GLo1&(X^{Lc^o-IBIiyIFOP8S$3b8c +e$t!@F28pZ8)0nX*8v`-PUIgWv`*X*+a^>aczfulfXrR +Fn69HCPk69F6{<~w?{+m%oYQGJJOMK65M1oSxqlLq2zlf?*VTn=|cD*VA|8>?{`>++rV}~#N0I9D*fn +mO_`K?{sIZy+3JJxUqLURvR;Ir-_-*DEz|$e(5c^QdUG~p +o3yRp4SDxI98!!$)n3Pf@03>PNZPyWu-_X7EPy(~G}6Neq~JLQF5#f^nmvZRRiWUMC0Tj{xLN#G_6sN +y`4O~RKQa2n)ymL|NS|Dm>h3K-c)5&~O8YIEY24vb-qs24O+s^=#AUIpBS%1Y3lZ*=@ +gRxd=Cc@NWC94C{6l@CYUa1@&@@K +Pl2_!vvY#VQ0jK6dgv9Rgr{*adh8XHgsE{+dEphNl&f)3dK~m|o`Ok_y@HQV6Y$`nSBMg@#>MEdqDnF +5^%y-kwzQq7lyZ(k&^~_hlnD*p%8M(yvA97Zi>IX*I>Xl!*yrEk6_M}DZr>Re%Y?^FYpuxYdG}$_!hZ +0;7Fhd}4NaiA!O??{8lE8I2M>_rg1rA^L$vVRAm!0V4U;y~2M?0sJbkhu3N$xB4kPt3!=vq=8s5ijqq +)BfAG?u&_9$f|EcCIz4EFo&>j6(-M9kDQDsL6=187>UO(2pjeE6(T%SsUn!}zF4AxitHrlm$;|49=gZ +HrskYF?f}gZqdysJYoXS?s4-teQ<-Sb2f?UbO2dRv7Ed@V{8JTmiQghS8F9J_u509b?v4>#Ke;jgAEC +_&VUefR`~*tFFBlG-YhVJe~IUy+B*ssW?YWpG{O`C~-ACPOq}>&C(iYFKov8v5aA*#)n-rqrd7Ko_nYzTWM5Ybkct)hzJ6eEwtF-a)`3a>S~m|Ew1>cuabPylkD~+C7*xw)#qQ_y{}(S9{lm4>n}X4Hf&+mZ> +u(6_5~#L>9VRtHmjENy{5fd77i%NWIJS1dGz4RuXpPtr;2u7!4EqoRiLSMa}S(;>V=!7d=(GaVK8sS7j$~~_`BzCra!!T_Vf48@lu0L1p0K6h;6UEsZ3l`j3z2*c~24O+YF +zki~Mb2BG)@3&R$HK{E|~wR2{Sa?4(mfs%t{uXAR|h+>~J$exm68{!?5_^dBJiVZdpcZ?T#ui__o&_f +R<*;OUI++jHI>idr-(1hapVz@CW<>x;$-Hv!1zw`2z({&BMSSh`?jT|Fzq%SKwbN;&baD#eF1K8{?l4heLTkcZ(x`+Wf_~mJomyXUQFg* +t7DQLoW{VzwoNZR!~A*g}pBKk!P%^3-DL>_3$ +MkHWG+Y3bJ!BK8O?iA>!I%D!l2zfod_~ZIP_Q;6wPtSeWpWTyGrR9wo5Ewc(wN99^gJoAK?0uYESPx? +D~D0xKInS%qo|H4c9CGL7g=$^6I +V?6u4%efRvrtW-Ir?-OhN)o`~C;`wL<5qxPNe8fNKN?uU;*6r{b1xC{SpRN0S##F{Z<}igKE~by@?#i +)PTH!(ASe$pJuK$w<66~`7+2URe!acPxLK^%Z2}Qa&p}xA=s`M}&4AK%#v2c6uI?i&BJb0_#bkqnafEU-)d)LK21UudX;Jr)w0jJJ>n&jJ#eJO;T5q +?W4b)>MHE29X*tYOGiVWufI>=i9xAZ+a%?cpBt*92A6GkD2K&e_~R%Bb3B^&)QGvD{9(VI1|loO?A(9 +{Jp&SwJ|ZULddE#%a1<4Oo?jJP~V9O{yu`gR1Lll&Z +=rYxFIdqcOHOKAHc6r_;X$HG^cv@b1!>=M*N*d|B@rk%)t8t=+4yv^o1ZE3@F{lV1&{Vr8DX(;Ac}2Z +e~##a|uiwkLs1|U73?yDGf%{p6RC!FW{FBDLv8-_ckQsmWb=Xg9+Wt3Kf*4s8iL3LLE(rGH&{n$RrPu +m!(C8U$U(H&8!a~#EqJ(Cm1%5@)?XtK}6iQ5vWNm#-Q_SD?9f4()*an +T$Eft9?EGBWU8-wsFO67~?BO4A+0-y7Z?nza)Nz(wB+<66&P7Cb`p8%^cel-H1>-DoasTAnu{bv#AyhB +^P~QMGyuP^^o%mffokB5yl~1v8`=Wmx_ML3*-9uVR;!H4jMA?v)Bk#f3oWJj`*}jB*T?rTDsgxQ2i3@ +p<$torw*_>ZC);)5=q|zVD(yiECMKM_8teBil0&t`3GdruFW&OYl0hq!SwA4)S%P^R;arVqT_y?C9Bb +Sb0cizFV{3!7AGH7{_F}G>ol0eAMw%bBF1!2|_`725a1j2kIZVq#UY6xgE-tJe?r--BE-~-}_vMcZCk +v}8x${;o6dV9#J&(%eXT4tTk&_}4mV(W|Khrsw4eB;!!bMK=0;pgUXxXQ$9DTO|qhZNX5Jf8uv>-iq$ +gS_%xTPOY4q#?27Q5lT_{#(U$uzoVq!|gMNXK-cYbco`td|(40dut_cJLB4uQGCn()^$zE1zZgs7#NS +$=wc5rZC&D+eA8kc$I-xPdG)bB%IU%z +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 +4skYs7Vv|Ne|%dVH}=>7D2dg)$G7 +4&U!Q#}W($-pxXoQjVYg7IkHT+m|91@E0mFH!K0S_q*Oig*(_;BHEu8HO9+x6kYRSWj8QGo@F;ctcb^ +$|H*rnGr#%Y{O!nX>!P2{lcZm}2<=5o8VK|}cKl7#esdhg8@s2%l!@_ha+-3 +2pu7JFGTSrJLQSCh0~y`$D_S*;rNy+Y|LLNL&>8_l6-P-3Qv``6Ww(Bn(fgKU&Hdc)&{S +26u;X*V;shkG;1YLv{K@PvOnLdSd`>x$Va=UJ#X<+T?_w`5B#h~X^kvz3d3H|Gyyk@?fyS4U?R@6NtRmBRua^WSRICHQlar^_3I(_o{C{%d_9 +_NWO+{aTE<+vZ?8(Ul&`684%r{Xl9jw;$f?QFYX-7%@sP{|=I=O^wycn1U2!=^xBr|DWY_K$)UIza2j +8rCQ3hPuka^0f?T2o$VJ8J=&9ZG~SRPGE82cun4P_}(OpHG+78L%y9!^OV4{dkSn#kBqXM-jCi3oACi^286@s!zRZjzJ?lD8R +#FCB(fdtqTe1C)C4t(wl%Ot+WS@clk#IUHk1KKj;``A}vTCJ{|XR~vFnhKW2Yh~G@ip>*th_E~my7iw +eho780PgrpFSDm$)!^3hvuk_}4?%fG~Z)UC_2z`{*%NItbum^0dzL>I1BB^jtvrRl|7eAjlY<7gE;s&NxsSXY8z*RqXR&fnwxI3Ktf{cC+(L~25f&jHUE_Ij8Qbaa*LOe`hfIiqoV2N6ZEH*tha}r>SW$3*ssk>(LiSL}F3EB +11IT%Cg)>*Z>Rj=cG0K-L0$apo78_fG09Aa#46d~O<0H1Ax;9=o5D0?B4q-1J~|9^uNrI7cZ`TOe5&W +WPd^h@4R6{fUR6v76Je1IEk$3X67e;0k{S)7vcuN7wyv)@ScGXpoSyM4Te +kN3zdOuV_c8A|~I?w|dJO-@VHT^pARL!FyXLvM2u?yLQB`(e17uf7|5sT)TeI178C}kA4f+4+6ZS>j( +FTa?qKQKxkv&`pPx1-XT6znSUZ2qzT{KBR6WblY6H<=xy%dTEXyYt-!Ca~u3(&=Y9;-VI(!R_kY< +YfVjz^O%n$#CXzEUXScOfq?B=;|0?cArgq}^nzt-*g&Ti6v7qmJFMudC3$0OzzSR%{sx+ +PSFB38Rze?lAJxp-T5NE7=*C0>rKV5=jS1k~6^KC-1gh|XLQR}d;uw%#!y|(L;z*Vl#w%splNsR>$O& +|tsDy>`Gnw#1b9jBCFt9C_O9|>0gJdN#TV7G{ZVS!~MNzqj9AZwoYs0>)O<+nsnwSWgVPTjJIIB)h#x +ArSAOVGymmO(=NGLisnF9JVFZ{i=n5bu +Ov$(j`!pQio)99?K$lW#^I9_sC;sgtPH3VJ?~B+dM|rUTIBY&25Am(F1y-vo2adA`go5tpj=Ym!8HS* +K+brPoe1NY=B8nFbBsp-b&d>npu(`^xVi-z`cb9Jk`8kyDFNNdMFj{kAlzKr!qF||W<~duKrzT +GhNDqooG5sdH=Kflb{LWXDwbG2z+%oc*Tf)7Fth^YA&!aiZ`C!)vy4L0U?(frt= +r^RGeWSFuq;g}TzW?U@_fC`0DT@0anX1W@6O46F*dS>?w9A}D9A+?8j`??dX{Rgc@7&<;+~Dur;P2ev +@7&<;+~Dur;Qvl;kk#+M6svh390Wn7yCwe*sc4RuGufnb +kRFc2oB2`ML{miVEJO|M7EqITuxtH$3-7m#m@ygK?-5m*pV|x^I2k8%X1TY+PRB|&sPRu1Ezi+nK0+5 +MNaDDU`S}adDt=u6|o4QjMbu|S_U6(~;J4RU_w_HReVjp6~Kh!sU4|e*}*w}K$wl5RS{SJIcX>*8<;c +vfEo$oX@6&tlfSql5kdu`m}6o +OgLlmyK{P~MCfvlYa)8QF4vRkJ0j7OXxEvbll~|a2<$Y-GxgQ5`4@0qUO6(52HqlMT|9Oplj{99&%b~ +E^f0@hz4+162%a;CF`+`0G|gz(Q +Nr|7Q`Xn{|PyJr#@H$4Y&=d*cW&J0U^qg&2L~`N12#2?x_`@MXB7*kkBsV=kRBYTQ1Ek!`_7|EW3#6X +K^yZ+y>Q`O_@XkHFQ{W{v2FTO|5<>nc&HEz5+Q-D%afJj3LJ!_ps0W8wvz$XtfJZ)BmrU?qSRJqd=1h +(Mh`^*wzgbYKp^_!A&T-GLBUK-|8Yw`*{JcZ +^sr$?V0GDeB`sym(CZC4FzgWcXcU-;ZP+(?1>i?V>@5O@!`c-X7TyLcVIONg=?SUcj@cfL6ARxYuMen!fpCT6kwx59a+Os(BbCNU=IdJ(0<6_bbk-RhwLqHYoVlqvw*mDQM +REozG?j6;n!b(?Q6bAngEIl5Xhs6qCl;690gf252*37j_eu;j*3#`7Rd>roQD3e*Tm3_rEX#MR#Ck7XN2nfrb7*cin61 +=<#RDLUrd^bOHAJN%6nvq!=Z*l`fP~r9KvGekaPiqKdaxz25ZaA74Ly`rY)|tEXto-tYgP9%-*Pt2KI +Q*z|wB-k}kygIDAuz*knY^KvPPBv^97D@&6)T7oo;dkx(gHrWZ8y&suK^2aAEoso+Em%OIP@F$#Hda& +NeW!^dY-(fsuNs9_6OWY@jE5B-(y5;|KH)=hF +K>}3T_a{33JRiXwb+GwM9VtkHHXob}+czL$U;e;)i+}Loxz20^zgU7fdEZ$LbkF_ASiQ@g50=QvFg*e +#2UUna0-M8{AU9d`8>wDRK1g%~|8*~$jtjwaShAvcvtTT1jPM!0~Z_RN-EC=nr=+rTp7cD74`q)GH`i +gEL`MO+c(G4YEbmBEAF*MpRB#Z#p>%5|qt2qv9%rUSYO?o8Ar!pYPqK~r$PL|i%>A^TmsL-;x@-RC(mpPz2x*F4VsOhm8nRmD?G`UzC8|G+# +$-(_ar}r*`XF3Rj}d(u{9_5j>!UIZt;E+puFpXco;}5+7>S{KmM&1MS&A?dvYQ%rZ_j46QQ40Wbs#vx +fHTPxPBc*ev;0+uJfxTlWY5SPBw%MnsUY6WDC>N0)qjwO&AnrmiiEw^20~RI$#~AhyiF1t;6EsBm7zy +kp@nK)huZD;s$B>|HfiSZZIz!9HUm&hNF)!X}T&hvFaMzq8tTX>s>118 +Ail|0>o87#o8kd%n>1I6#dtMZe;B +-zjij{a>Lz#uj>?k*n2-UN6U9_ +YhhMuTLfUP?&;Cb5?NY_u^g%%p#+8Mio6TEexBpL%Z}p+}t68;K5#y4Rp%I_!x+ +f#eK%p-V=KL-$$~N7D_S`vYg~!=@HvKus9tL>eT6?dM@Tbjc#rHO;t`9NnC$bqAS8HH?Mj07Jl}(iJk +2<`rD?~(89j`Yn@{O` +k66B{YKNBgjUi;rQ?kNBw*FkRl^5bBtg}l%cMEEmqS=CB@q#0nKiy#LHl3B}%ya*!zxH!|^Tc?~}V9D +m3a%q2sp$X^6@MQE=a0PEn_LTQPsYou!bKoSLL?b+d1oQeu659hY{7P`s=8{&;nDJhnl-yqvMB#IdhW +)mF;Klv&KZcUMQQKEEaU5Vmx5cE?d#|+gwr+Q|-((7&V?adVZck3UCQxT2`FU0RcFl?M3Am~*EjZTE87>r^_tC%JP +N3`q@tNW_-SifXJ0q0ivE6~5ozOVurl>c~)e1G6<*%rJ0`Nw%Rsdnv&#QT$iFNn%#;@J&{J_m&Mze%1 +P&q@v+&ZA!u{)#CmsS!*HhAJw#uFZU@h^DkZgo)k-89gRIiKlj0VQ1mA3N-6sVt2sT{$WkN%Wt19r4b +>Eq$SKL3dOKypDZDcY;%QONXT7Z{H>Vgx}I5F8F_;Ljf}ZEjHGg$qJ1Wcp7u{*pxD|i&T%)u_bKoyg) +yQ(}FpcW~?Q~lM}rcsQ^mJ+qhb{NoxEyZ@lmcCRe?!kNYt}PH}r?xpDMmf!F4HLFydlVzkb3Up?HxS& +n#1(@{KrQCM1p$p`K8Nk<=nX}FGPYTs@2{=VW&0<~U1UGQjJua~97*O7KQm;eijY#QyNU}`hzd*c?svLbZhO~DeXa7_$6x;8s6mTMGjFx* +B9((zeiWTLCAn$0#fi}e};c3%`>N_&T)I#_q$tX#PikC82RL$ugxP0pNLgAtf0rg}*izUL};mW9(4qS +r&3Z002(#B?TbjGQi_Y~k5ZCdrhtDcb$@S3A(|w!R9&_2Vv_=q`)+@6-dNU&)4kmaUk^wCGUH8l0uY%!hOZkXB8~E0sU& +t(YHKJ$v^TMHR#8v>3AlMKq-0bpaH9dDW%?lylXV{+Y}#D)O<_>)kjF#MblwbdiGYyzekU3W`3wZew_Q;=x&Y{<7Iv;y!qKAzGI+PX%qZR +_6U;4l}2@yVeGGl-GoC4h?#(rcNYt*QoD?h11@!b%#6S?!gGMMbK6$@plwcjEd_P7IC%Ri(y&8!tpEp +cWh{s}^w^4a>onuOAyveWp1TYm}S6INcq1JP|u4 +x6{asN&*5lVwt36fE0|EhRB|rpas*ACzmh5d8wq9h2m;wZ1XOD6CzM`uFzkYj%qlPu~T|rpe{BwiGG{ +4v09qF4VKqonRl4FHa)e&t@4ezBAPpb224tW2xo!d_GDCUbq8n$13Z^aH1oc=#BUCyRP{+XO>Gpeui3w=idTa=uTV28laisSQ%&(x#bF!%*mDLp +usQr@C~ne5C3Zyh~77b}q=5Xdz2&aTmy5HYyB02TeRRxoJS +?B9!sN0XP*&^fJ?dg2XN46-m0bhnRe`7oU2j+cC+-E#{pJW4?oEg0RQqpU<6S!b<3t)k@$r=2gh5dTGaq{3@Cs~Ga$4Qo2!8E +6ED8$m_Q2L5zRL2Vm;Hzr2hveDOYkNMqQ!SkkYS9;-obmzNOyaobu4y{ZZX~Ly<}RU!x|jU}?TX)#2t +2RYi|(RYp@Z)l4JRaa@Ei@6tOfynJ~L~-3_#cp?vL8qejgt1A@obkU@WdEtT4_qkm2XZxkv?Q7MYSWW +G<}RUAgL^d1b=s(}P?RJ8>Uo;XcA{<>G}rSPgh{u&+1ux@ss@JHaN?DIB5kmDLVbO~w2sDLF0+7g-0R +_Hy|#LD4ot^Qvf8gBGQEiUj9;6yqCS=-jO+fK1UrTXA7KC08Jnec-sY__w +e^Tb3JQp< +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 +o2I_8Truqc`f|?OpK3iDqt{j +gHj!!u|RQ|onYM);?G!{=Uey(Vly@LJxEfo>NiCTk|``Q30Cm!KhWw2zNifs+HKrH47QC(Av-C(+wAzNxP;dxN*~APOl}3MU7aJMFQr?Pk!KUdg95&=# +44%^M4FG`+@VPB-bNS&lwUlL +6bWQD9Q8Uo#NPJjp7vC@Y{7n(bD6qFOe}p%6;b^*VerjwpMI!alr#o+6^${tfJxeCs;O{A$6iXA4lYu +qwID`*t^nM{T2{dkTk|eBGE+K*fVIw7$*lhKBokfgUIv7=Wut&nS+K#0S2dE&)5j;$)|fyATHAZOycX +;du|u^Rg^SBp5p3L-yR(kKPKxmj=f4NIQwoN4A_=ufTz$P#WD}pq2()q33B%@jM+mA-L)n7T59h2&{ +U9wQ@p5QM!2DMLc+d=fbgGbl!r`bQBA}DR_b(x%PO7aIH^BdznjHLA18~=?-wB3kX<|Ls6kDlNeNsbw +KS#SI56+2E%z3F%&m3wpqCD!-TCK%ZvkjJfRn?A9*@sSszw`?<%56Ci_l+fhjh5&rzRs-i-gEg#9VJ< +Q7AQW>15D?y#bYBo7gaSc)wb!4@#{5W$ZNz!B0SjT#a2 +_t!aL9`TIo(RI8A@FcQ6Z_iNdV#aWiS=AHY$xTTSS!07IW@V^*EM^5CC5b(bZv^K*rG@tM;X_*hr*A? +^f0j>|2#J%VLr0K(eM{`ObjEW9y#TYdPs%vzSBIIUKE%hPPq)H-Ub>Y1rQAe*Bo@7 +4hu|Tkg_YFn8gyc@T`1StZYV>JbN9R*mR^M`R1E%wB11B?%%)~XW^(d4A%6#9-7j@;z@onPRimRgwef +{DSH}6M#q-)RK4~O057y;s(f@8MggBaku*RcpRjsCquRB^jPi=0Db<;HigB62RCQr6<~HL>SlE!O*Qs +d^3z=3d_L^G#u`n&#tWrSLJtIzinR-_$mbbZ-t7tn= +-zQfVy6IWPU3ozZL_N3%`uhdL9qqdW6|ds{;x5S7T+N!aG76W@c&{ZN)tqFsPx>$WnpcaX!nM7E}`V} +m3V2KB#f)>pO|=tZM7a@Bpn-Yr;rQBr!Pf5#K>r?!Ug>$ABSZ@(F+~q$@;2ykN3@DL-x$dZ&B>r9-pE +`;;dygveZ)#dyiLFZ(5Zfi+}f?l&ieHdilz|Fi(0Ws;YZsp7fqtJ5cq~K7-e!3D)Vj?4usq2f62DGWL +QQqn}{Q*%$6v&ypMU);#L{jpKY)sxAAd_ct2|NWUs)y}#$pxj#1Zq^IWsX5l5G%`YWI`7=+=BYau=V9 +XPK<#o$E>3vsR1rW`X9;)lzWBk?oAz!cAb4Q-a1M|X%q#pKIGofC=&)yFkV&-G0-g8sz4G3Gr%7^953 +sM(z>*>>a`xqF0%J_kyTJ9I%LZ +ME8(>_I^QCO0b0PS#Or>MZ{mdRi$Jd_s)Cl7n-{GYU$#xK=1ztP)h>@6aWAK2ml;P_EsMici}Ao007$ +o000&M003}la4%nWWo~3|axZpeZe(wAE_8TwJy1b%!ypX2^9p8quEyZR$%RwSeM5&}#iqfC0&e5qS2% +5T(n_mcNf+y8yilx}f-xN^4N6J*BH!#CWmz-IN^(u3t(?s$gLfDUN*`s~Ql<}d6)G)3-Y7G}7Z8pDWx +LoWcz{8SzSQ8a4fek0_}}DpC +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 +L%DJ6_*apyHwsj2uW&rzpM!_h?1C)RfQ +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 +JfiMu}!TipioB0yw#8$+*zTL +v9dGt>QlF>>5Rg@~p|!-#M56iaLzaPz)J3ak9t#!%XUYTy}yArnO|c0|}Pv_A*33?l~YZW)HfcF&u3r +)vqE+mdic4LTFiDPt+wjuo^1EeFLteBDVKk4F12G+k#lpv#>LF$22%)?8Yv`w^%f&0V#6AZ1RJjL|hH +GXkQqn_~5@a>PDhgf~~^&e(g3QYx`HUA)1{tWLrZ2I9L-PU%$M$)@U$iUt5sAipicY*SZ@n%w8$do?4 +saN3TUaHJYwB4_`^kwDr-h}ViBPGm1?!qjYREjk-mZp2KKyR_Y>qPToMtkA;U(1K21)qZr!XOnXeen| +bHO`)d{(Y0Ppc+siH9zS4W&og~5FC@E|xy4j$KZFch?tr=GA9=RHdoNgFuoGkFH6k6=zysHrp{imPN@ +b4C)wkL~(>^R>){f}X9w;7;1qT3T1At0^ADL0nN@3bK=ai)aoirsEZxIvsNr7clWh3SWn{@IUSIcNmR +%YqEq&q;7K5a^;?Uih2Qde*-DtAF5Vt{YbpLQmjV(d79Df^Fe20wh)o40~wTg9UYTa{nbr)#E;PjfeH +8O68tA%81kRZ>#I)OUtW?H}DIwkO?=q?1h}m`25MJ6}4v-iCNJ6?KJD0~khEe_~Y-vC4=`dJZR0sM^w +}=Dtv0qG`><`!OR)L>)0&4N67(csjNw3ia#P?d^;9En5?%8uAdDAIp?X9hsWkjZ{_Aic-ikte^L-kDr +5T$<{{4jp57gue}al+Wnum>@OkgS#u4LcpA@Dw +XO!YySqork&|caySB8u^6HIaSbN2d+w19R7AV3 +f1os~*FC5_+H-*CYNTU_$I_?+(b>z_>^t_uo7am)E7NvsJ=DKbkl0jA5Mcjv@h=b#Rw#rQsOFwSe>zq +_y3pu6uIR3PPaBHlZY99ar@n61>qL~dv1&xuktEFaJ)KQ~ZEU>GOf^__TbT^hwcomV^B!TFQ60CqZUc +g^>d^M{tGnlKW1HuV^Qpev<9Gl8PHsmYO9pi(!XiUztw61I85YbuMm&fDpxY`eTw$A(B-iG0rx2mq7X +Mzbt~R5A44y*P9lg58^kdhvJb%gP$MzkgVX5Qg2s)0wXNJVAwR;-4ZND*C?eEi>UQaYqK){btu7Q_Y; +dY)9XJn*7Lq%J36V|2&ea#FW%Hm-yC=?ODdco=p2-xOx_ ++6RZ4Hp9Q7C8t=_PHsmQaIan2p9Alq+7^mhmpY8om4>B|SJY#D388tUGV9ez +3Gi-MF88Z;qP;EB +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 +@VaU`Sl#%2h9U2bVq-r_~2W%SB83f} +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 +%tjW1t?b-C{oN)UrenPwfHwmVYSLPAq^Z +2tQr(I!>?#+iFRCW#Kss1mbQrolT-d$65U#gP$tLdeTrZIuaT(iZXKjiFzIPiC3%dklPqdd94hBshAB +GP?)g)<~4Pa%pGS`nV-e8kY4e0I(?`(slp?ohAp-M?sA3jXDekZ)^o8Zt_4Ehq{!r5aE(0^QrIj@dbI +}Xa^AlcLZhKd?}sHSttZeI*St0mEu$ui<;9sg`|<2-B%)jYN4$=y&u}lJj9=VgCWkFr%ADWP29{7yfa +#Cf2?JC{MC_0_2#B|aZ1wSFKl8fvM`SX+aS2KbED?v{^N3wDF3*9DFpSV|NMs`CLxd)4~3Rq>~>AA`}- +SdJ44miRZMrZyIq=)ivxoHe3Z99V-(Jyj=ZL~>~C?1f}Tp-8;Tv7N@6cVXJn9L-+O+`=>^qPu&<4rtni?Obh1p$G`Pr$SaZyIi^^t%#13J`WuS(#tDn@+j>i_9nNGvDAv!p~SR6m__jyq+0E0}k?l3?} +K2fiL7(LNBxVsGetsxp->~rQa|*_Bc3b0A3A&;kZNM^~m4caJu2SZF$X(y0(+~!tIfyr9S$jmh~#`5O +AK8A|I#I&+##QOk0-X`F9Y5HR$Q$nS%OA++fFM9Hl3uC|m@_wI5~ScPe5?L>Tq@!!|h>`sTyOgIPZSy +8lPb{gjS5=y?#*3a`F2MkCs2NR-$&x2}~Kf1Na~uzXd68yIV@*FJlAPm{IcMVO#R6XRjLqd5Bj2LhLh +Da}a1t@vxl8!o>1QRKkg&(4eYfceV>-F@Hm885*>X1EsNdYgAws0R2ZgaxMozJ?ck#y*>o+&|oG5na= +iIHs=`ch~U`8t?z9pB~sdcX9detv>FjPR{=Thc|Y;?(UmYtLx0Fj8c|Sr$}&N?lPEu65^QXXbE3{RdD>0|XQR00 +0O88%p+8Uefd&!2tjO2?PKDE&u=kaA|NaUv_0~WN&gWV_{=xWn*t{baHQOFJob2Xk~LRa%E&`b6;a&V +`ybAaCv=GO^e$w5WVYHOp}WZj@d5s64*n#ZE0aCr5~_2qsrrCs3I9@oX!6Gj%>$vAgNB)%zIC7KD>sX +-#%bZC8GsOd7WE9IM6k6d+lU-!(3}&NDF*P^8R2=hC?fGjnLCcPf^DkL`+XJ2k7v%W-RLP#Tt +zw#29kV>Y;xXcX>N;yq)<^o(&Kj+tt`1`s8bOzXFcx*_i3`qZwfcg##Q=>D1BBcTw6(ypXrd6MKG3Nz +`j4zs3BM!43-Nx^FuG$|>^Gt{#gdwk6L+?i)Uy0m^*2oWh*wPaiw<3snI$rsOVaA|NaU +v_0~WN&gWV`Xx5X=Z6JUteuuX>MO%E^v8Gj=>GXFbGBOp2G4emJ$z8sfTXR4I;}SDNX`toEUVn^mqh(vwb8kxL4@-#CG{!^ +g+>l&v-7uU$onjI!`RZ5-!6>wW^F|Y_^n=mbPGRL5ocF67PR7MptxBi|&RyrdfhWVi)?VL*4^T@31QY +-O00;maO7>P-?UaibQUU;|K?DFE0001RX>c!Jc4cm4Z*nhVWpZ?BW@#^DVPj=-bS`jZZOpw{v!h6wE& +9%{2s`Jc+jLKfd5~E>FbgD*Kn#MHYs?@(NPs}_>#w6d#E?5Ov#Pu8+_cyk3dh}X5cpc_n>O^nzbRe!N +ZQReUjL_DHDOSlitPH$Y?}TX&we}n*mxcOPZxYU*#CS#3jObIr$=~6qW<3S#s~_=P>RM0hJq=QWMG&;VI1_)1mc@iT(hLTwZ#=I1WPtJu_4e6LTq4WLm(Rl-6Y5+q&7sn!Ke+ +BZbD>3QyY}o(7|$=EsOj-2RI%^8;0D_;U>m6DZXLi4T)~hU=z?ACfLx(CVe{tvYaZwH%Ppp(G3&5&4& +`?&od^ki4b^$!6T!n2n6YK1gK5n_wy*$U0rQQ_E3*>mjcKTfjyU?hxDFg$hF_)0!RI%|j$X +RxC)i+hbNWr#&=k;^sSDD9_gv1cyR9gb}*QH;9~Rr65NZ$64=;nnLSRD6m8dwA>9SsbDcP>30s0gF$0 +X8pGVnkAM$54LM&hHFy~dy#`C_@O~*{mWh +SN!ZLrl%O@qo1ViLl!)94r;e?T0j_=q8+-yS#gh${*mx#RJ@M@P1!?VD(Dp=i=?OMEd``QtW6GO{K6R ++cXe$Mgy?3LY$)C-Rc+Noy!V7Nig2|i6^7g<|&+gR{U(_rUfuW>9sX*Op^6e2vHJcX?f)rr1I3@&4iZ +t;h6sn2w|y+MfEUb?0volA*_qemBV74Aw*x*;b#RIXaRF6rrUW{T849aR;t`Y?)R(lX_(c>$lG?rIq=Maecl$XS225^DP&0m2k=uiC}aZVhX9DR_$cpm~}}AM>f;IlPq713wWehTn0~SEQ} +(z9u0AM)VT|LT%L`s3Hqh92yqrGu*P<+aqwH`%y2o*%o5ZKOanbnO=avcSe&g>vtG~4X=ZgUEAM$($j +k_H5crNImOb#`C1H{4@tTSZ3M=TE+TV-eVo5t;hor}6cjd=+FzUpnnD%^c%+o%s_}yWKrVEl=u`ctWw +i-#{;vsfOx9!kc*W92=yjgieQFs(Za)vWpWqyG1IWqQK?J&ug +HLX+AM0jwB-iJ9Iiqgd^wM^ZE21)NWFfPD0S#ION;B#_vz +bdsZ=bEj+tjxl?_%gBTKacb-ry6Fc)5ig=8dn0MTnU1q=;tlVlGNnGrfvFx?cl2OX^L&Bf&^T{wTVHR +p4wAJkNrf`FF5>zak6h6mXzd9Fd@uKcd{tajU`Omj4P1J=yZfMX?s3l(e_R;nKxF!HMlD03>A`1GVxq +f3GecrT1KYjZT02cIr0yz4yGeDwo9RHDgZ(8%m)Bn44{Z?F~roH{+TR44dlk^|o{-Y}DqVK*{MG*euK +iB^e{pUA?VVG|}&bME>B=Ik(`2WM@eW31-M~`h%7mxbeYx+|XJ=$c!-yvy#0b>RyVUj^{_$%;Dk_A<< +7kpyqhDsK&OaOQREF(54wZL%*U<=<+0GHt}!IywH7`%bW1-${PGSmx#iA|7fFlLz}3KuX0s7}SpAClO +h@iHZb{04lo`0Pub8KEPKz$j4+Q{JgQe_7#EWdO@@`PFXf5kbMfp@M_ +VR(+TRy++PVDnwl?0@S&LiHcNQ4=Wuyz1Wz76(WzZ;6w3F`oKtkGdtjA-=_8(5q1p5zSHqO_5>EG)6IdhxoCVe!6}^Vl@GOyMa$*xkDH +PF!raV?P1-p5&Cs@MXnwm%1jZDXWq5UqS~qV1>1yj)q_>e3ba%T7`BaP>8aEqV-i&&0?HD9^Yy(gC4}1BB(Bj-2w +#Wn9cI!&zj0EaD`F1&@_$>E(b}jOPKD9TSE!iytS35c8`Fbwc0m-o>b|S1CG3p%Dr#3fFa^*bEkXCWS +F)Bzun=k7#Rkm~=XZ9;HE&x8svBD#SE=Uk+huEsmPcjK&y<#FCJZ2P^uXh^ul +s$aq`h`UrT$ihKTSwR9WUcXMonqi&eKwFy2W*xfyj2_YXazHLL_C<>HY-KZsLRS}pK>cO(SYT&a6zJO ++tpN^-^42EJd5;FXg(unkza)zTLt;vd7vCj;&G6`?vprQ%Sh7B7g(IE18UP$Of$nhtSYk=dh;p_4iQ3 ++HGQGb%%7e+OGQRu@6zC5CQvky8;ZS=?xlfD0&lz8j=J2tcr$DGZhqr!O%c0{M$<5M~pT8ytV(HnEA~4IXY7Y&kKI%b+I-P8|NVM4lI +ky!u3GHe=a`^%Y73-Dz|q|0WYkGH^Cl#&T1C|xVreI3R9H +`d-UMgG1F;DQE;2;5of%kF_-ECA!wc>uQZ)`g3)Z53ZJ>fhTo=4ilbSOmSPJsisLZ-mE{&smc~kHo0{ +&#%Pw~PU9|E4Yf&ShCV0M`a@-5NQ!2NlLx7|-?7l7L3-!2cJnE&JD0hlMe+L<8d4Pf7tyZ~+{xVB%mG +VXmVJF?4hqv2oM+D;Q6)2@YT0XdVrKh>>6ApEt!lfudN@`xjk!)~erUti_t1O<2A>Cq{B%=NDD1`;mx +=0why7E*kSHBKF8Umr@$XwijE$cI-TL3X`HtIRZZsX1%6;&Q^O%lN2meb?BU){ukSs$Q~#>YEqc-2^| +5v%{>blQ^w;nQ_MG$R9^;zvH?`fX7#`(cUm*xO9(HYD`g8L}t&9_tOJ9*TSm5d(wJu#T-)dh*WyDd_- +>UF)P_8a}E_b84eQp7;Kg#l3XCt_4C{Z;S6|$KS6QCV0MYklh1Y!3#+D+ZXKU=S@TlF5#?=&Jd!%ZkN +k3LE6luT6w=7Tc1#om9oACJjEoL7_BTgEIv>JllsYVlvK_MnDErrSqeyF^gZsyS*7CpB)6?y9LEhY^DMn&tare$wYsM1t~}vthb5&UCd +5h)9!5LkW3_D!ZAP!Yu}0PknRp$uHTjV{hh5xT`x9g`3cl}!RThs^kb{lzZKoP`fLDyNaA-1nzYF^N?yVfg<24^5yk#y0tSo%9y4Y7Aw8B#A(F}4_bX?z2tn-~CJ^pc+ +V29Fm-3_g&c8?%6G%KQdash7nVpec@RaB%i;6Oo%3plQ6=wTW;8C(BWws8MPGY6_e$-Xz4*2p}1ZUGz +Kn{4z?T;ezTwJ_F%RCmTHaOYvJSmS?Q~gjLh+4d*xFw-bKGE68!Qr*vWM55N-aPaW4OBG7FU{#+E|hi +=ujKMP{$yCT-I;0%6T;sQWx1V2D-IpwD)1_0)RV*muxciZ3sf-dwX@)Ur#-VY*g%ub;5{v!4o-+iEB` +TaQeVNkB1MFIa#0KbDdssZ7v&)_5%4c4j#v?-r$kZ!#i$1G%jwslvIrJ3F+u^&Ph`7VTcP7Q1Ap#dTQ +>Ek>1m^q+@qlf>q1RV^7vw#SmKZP(@owsOLo-2S#0nEVlE1-(OLHoIV7c$G;mWr2^0H|md{lQ4^`OWM +twtb17#X6vV@9=5s2lN7v9slN`68M{WD58YKGT;hz1t->b1_Avgh1ds9U+Vm-^ZQ-RC>UXC2PcxKPA5 +cLY9RfAb?aNhT}Tn%9cN4w{d!-*iQI~T)rID$x=N>A*P7SOEc3uJtXnCHnNXqX?sh2-;roh>tW=ud=u +l0!X5@E{m!CtExgsz>tg~`ZTZ>98{b6JhyXL*S$R5U#zrfy{4h*yd8ebvo^Imk5ElL0u2y18cvO4WjN +rB_&JRlF^Ny1E>ORyIRF1g!X!tG_}2`lw1D^MGf^o4w$s`7ESJ**UG(I-VhzcP=mLtAGMDm#j9WO7{@ +*cpy9z2+WBSMcj@B#Na~dryZ=1_$}LVdOH{L{zj}Fa+OFV)o!&8(0~=X)i2j3Gm2Gw3{b6mXAlP +t>cA`7TK|&hZQrc#tf&fX0c9-xdRTsb-tV07`s_V5OTn}Yi)gbkxfeEl4L)h2EU<3InGIAP%qFn~z>#Dvz{Q~9B;0~K5}+Qx4>JaUIb6K)1hnc35vN2NUJk)3oC*Q%ud2q3`1tu@B2&QD1{nU7g=RBCdp +U?5PZMIQmGQa3s=g-fECrf^@k6e<{3{Zx>5>NZ`E5aSvVUt;F4yLZ>AHP#rjMz7etOW;wBWD&hsCl@O +O=P^Zkr`34AMSZx8%lkuHt%fy}JV@zukB#ieU(e#*-dD6#ThEh`2zoCckF0$lugWpHpe#ircevj^9%% +M34%_pPnMe)6Lwt^eU>??E(_&(kJDs)8iM87r^xq~mEX)3Y*>BeBB1$?y9r&hh;%0F`e{GZh7l(e(h4 +*92=+6=DFS;A~iWvZirkD+kFN!t^7b*ZWD^ROA^)f?8i;7(w)ge&FKu~`zxRGTjiY?w@GG0VG;2U(hi +J1*bY)E_)0TO^Le}GyBM?p(WF9ZVr9WwxmKLCH=O&TtIg-R9%fFX+|fC49D77sL@EX!L2H?bKU!{qT%g~;eH=Zo81BQOz2G^toKc +aMh6TW!`5nw*O%O-zrO?@zG6!IegNGBhUM*zXYFJK2XoVZhF(xr{G!|(Ks!gp25u;XoS{6?+QKdO5PJ +c%#&_?Wzbc*<>!F}kpLBLtbQcvG-7;YetPJ*rP34;b|8ePJ%%Y55Ef(DHKp?8$JxKSUF8iRy9G?=0L1 +fKSUg9B)~2KQT-DLOFYAc~sxII)GW}=O@zn{*vu$u!1kt1N7mO=cSNl2RD-~zwG9WSbGV^CKg3kDG3tT*qhC>gX>3s>TN({F(nX8(du-gq=l +5Cd`k5eS9?X#H&b8kGO;m=84mWB;FU7^Ru7pqO}hk*RQz=PA8dlapwP+)7@6OrlE*fH(qQlsg)J3B^& +c!GZ-fqja%O1D%eMi_IAa0FN%B8GV_*X?Ouha5ez;47LdCl==-6)5L@-;n5kSI6_yWZ=`BzXZ^~*+2eA>Qw&M3bO2{Wyq1-enfPw +1zRFiAo}#LxXjPyPTqKSh33KlG8lhlgc=`Y(RqQNJuA!p(vK(@AMf4wkZBAQ+^lW#lJ;(DNBSG*md{-lC>KUh%nHhw6OEqQNXuK +TaJDXfc;8#H&Z#!dtC0doHWdKb;%1a*bc;M%Vp$QeP)m}HDs)4v$jQYhuiL{V91DmSEPf}hR*`yv#wt +!<%$|xxqAvXOjBiPoyY6I3f2UnLhfy@wUt*^L$rQWUAx^j$k_YW^}VlcrSEq#+fq!NjdWrS3XGPizFz +5_DblAX#zGEi+lUVuiM-pcfM@6W;Vhw7$?>$6F3Mv(`$pmv<&a)zKj0tkh$BoAEWW~HEs?NwgI26L(~ +s-wtQHz`J`4e6uIAW`*rL}Ci9A)l-5X7MM#6((P;n=&w+WVp;z}vk@cE2DWp^+U@2m*e +y|seBXiv|p>&^4=&D^M=cy;jH70dKIG^m6FxOOlTNjWWjifz36(S>vfpV!eKa!)B{=-A86dUp)ApU0=z&tK)#2or?l{yavnjDInd?jR`0mNZlle{xpbu8?K??XcQgHla4?l&@89^@Z=#x0ks$tnwFQ5=h8@}1gb +}(~~4+ZbfT$O#%`Li!6sW<Z7|TUJIuej!9c(6FrOPt^V_Wr@L90+3HVMb(G=pUN7G)Vct6^Mzw#{8 +JBm7Z*hb#dgwWag5{CENy=vZVLFQwpIOk0KxVyT-o)vw*LfN{|*KC5L6{GL#WXg}2ZyukRt!(RbZ>fU +OPxd-TxiRKU!UMXR=hd6;T#k6L1v)++70IMS^G;Brl!kD~Au=?#|g=Y9pja`&|VaG+eKRQy%SBs&H~h#kT{yui!19=J +4uf>v!Ygn=)=uV|9eVZMq3~-hZ@a630jqe%Xr}9~acTFt(-=n+vTVi2jyd8w!DSWXYLXU%(3WPiov`2m!|>j# +y-OD4_yH5#nj^&fHuhI%#TB4BWN}_t-_Apca4SpoYT}%du~DT7IjKW^xhvc=_Ui$wa(W&kJgoV +%gl6OF>Yetm4>h@H%Pu+PdEXq%43nDzJNtfe)zU#l6$QVE{#oBYl^7)@c*j?m%-OSiyRLo4YnchcgM+ +n=rkz?f>OmI{$cVC1YvMQSzO@u|cZ(glS}UEnuW5(hv#i7241$8Y2h*<(a{$rF;Yl$o^MV+6emZk%ei +iMUmHgP{#Y4+$5&Zb~X&Lr!(6Zl*`7JHOexhYKMSmH!54a1l!CnlE!I$U*5?g}p0>HCg!FhPHL1e=#C@F{LoXVzdCXDo7R&N(67hWSI}JH}n;+PZ5jVg(iL%l0d&qD$#~Y7ve>{C}Z%N +F$tGOuo#$H{z*`asRgVMqc%jaL{;GN;zyydg}0I6;%ix^N;Zof2U!kb#9z@e`D*bzr?}r~S>*lSpk?z +fwCqL2^q*;&#iF`k{*Ti#?O&i}f(ALT;yUVF*ZR@25^6<7Novg1&JT}`)MPL^B7S+cj%AyP#t!CBv)m +2}Y6g0i33*kwI4kwWhqIa#rR>d)A=7N!baQ<9t5b_;C@f^ +-hWWoJ3fjg^i9X*~259S*C*QQYOz9m&rGa*`+QI=f8Mp%r=vFVp4Nw^a5x#}His5@6{=aS0DFrytf7v +l9eUyLDPVIIQR-kLQEHDAOcLDJC4&8~M0B?;DHZgK!+6!OaD!3e?>t&dU_7+mZtE)T}BY-j`W8aJrye +l}pHD53Z#|X4je3;aZ?nKe1iBx1ib|NviIHfI8?sAa+-62aur~q*hJ>p_4kGErnh!ed$RzC`wz`I-#zi>Goi)Qk!b2%juBvS7Fbp=_PmKXHR +!aB%S2AHEwoUp7t|FrTXqL&4cZz^ghdvUKrKXN={=E@@{W>SeKPeC!@OB4YWGiHjS3g)WaJmjoD@Clq&lkry=Z>)^wRg+!z&pJ1DU79l|{bIZ3ANQbz*0**GbPm#00-5sAM8*k!ZFTXL3BM1B3d`ebQivdPFz0)5E^y +1vC~6KsYHH<*x?>$?Pd9>b0jRMSC4cZX*1#3@-As+%{JfH_YOc)KH8xI6|$ue3&0+??7{1XvS!F3{S> +z!fxGdOx)>l5U(Vv6i>938YJ{{umudKeWveYXth_-aXsQ9*=Sg)-gYQ89}f>!Wd`I{8u}HvIj%7{f}< +)=@Vd~&ihU-{WDEAGnkcX6`=+QElHwkKw8~jia&k0^i!TbCk;#acI$+xi +{w^)}fxj`Sz-@lipm|)rBDQ3idMIo+c$5Zl|jox_r=*esaFw=&~v8A%@rC?LgeKn61etBzT-S29%}Da +r(d=dPgV^a!XbPxXpM-U&9HB@7Kq6owf04Jsp@+ScX@Q4==|~^9c$n>1{c=WpIqR)+*GVy7!(Hg@zG{ +Em_j19HCk>&O64>c$gGC$7|%;tczxwnwm;>(7ZiAvb8&Um+LW<(!$brCO;C$j(Y^d8V-#0b{DTZ>VnF +6aLQaGGn0sKA|)=4cnDu0cS2x8-TU6N)FTGD4YIl&4jjCr_H7yxoJ^frvvYH$>r<-}o3h8fM{nPE`_3 +$$3BU!l$|`BR%t&*s5PT2houxl&mNiy-0B@2eZ$zmP_YY6ehoC(7Vp$+gQfGNTjCXBqSn}G3R%mzglN)026PY^I~z~OP +ggqekT0|HF`WvGzgE)KzR_uV1*Wtb3W{IaR;Y(exOjq^S>)uRnNf(65w^Fzvqc8W&zBMSFPSiY+xuQ- +zvxA^~hD0Yb-5NLrfQ!p%X+~$$40pfYEv{4g`C1-?im$u8#ZIFBUdTD=mWzg@I_Pdq+nu7}cJ_(hdyE +UZc(rtoLOeEjX~dyW2Y>FYd_E@$wkkXdddceSTPzkZcoA=iO5F?4fIP4&DZd5h- +@J8xBGr5Ed(LD(M2Rm&&1UrLuG|!aID|g!(&yW==wQ2y$jHBd*m^+F+H|Ek|!=4EYjXH@ZF;?t3)P|Z +GavRyqLC-ePQtHj?vrU;#l-5sQJb)tm^dCF~1(Ep&aE$S5Uh^R7#_s#%^v_b8-z%n&C{VD*ST-c +4zuL*nZDk1vY}kpJy*hB?Ff2xs8#Q2*S(h!&zrTo@998|OPv*;`t=y7Hl&)up0?TvP22F~1k`OHuZDF +Na3#+t@3O^a&roi;Pqy4{g?Mg+lAV=CMPsk}?YZe8^ORPaCM9&=SkvV2w(o$)=-DaJ6E+@*wVn_A%g6 +wX^M;uWAJdsFq&>zA^|)upf5F#vHiP>1?X7~rpM +yt+J`4MY%n}5q5SV6QnualwKnR#28I+-61jSJdqi_O7aEACg@dVkxZ*DSd$p%5-#ZCi21po{aFJKkFA +d5kl_>vg;IzpCSAciJ4Zvin(w0sVT4UQ}UHc`4Hj{-}YTbn&7k#FFG0k-vexC|N)^2CxY)i7NoH +z%rI-TL5yzg0V5Wbcu?kqs0S=zOq6i_~og4IRxQ&$$X_>`7i**1N5)sV3r_?XYm1hhOL? +%#a-@*|I`sb9b#{lwO_`@@Enx=lH##M%x*7i^ckahenrIMQ7!e+Rs=cRXf4sZhSY?Or{3}37DDZ-b*Enf0fbrj;F>`vw*g-q9>#aEc^o0*& +bhwf<5cANB}y({hiB${_Ohx&gDUWc71>6@}M8D@9$TJ;60Ti87VxG5Jo53?UbMgw!hJof4KAGLot!a) +am?u#xL=aNYd8a^<>a*Nh;&=u&9y2_c60Qd;AgF`KT;2btL$CALnf29?YuSGP`4fJorZ|*{`r>l^63hVxpZxKFj)fZ5fspdF9@*&&cZ{c-6w_r@2*FTGgMD-uf;or9rqGMZASd?xss +3!C_+SLmKlCGCpfYH8ir#|W3#JL8oxPLZb}2&294C5NGd+9g?&Dl~p>K1>Ti6;?%j-cc+*3kKL%CJO4sNf9G$IDgzgk2~owhe&m2SQKA`TsU7IWw$#uNaQ=PXuKF&-4r%zfD;z~?E%obh`)hdAy(vN@)F8%~_KI7!NvQk11Rn% +LP%inWi6LyOR-W56n$QK0 +9YQyo}Ss!j6Z$sGK&EM)if0^;wKKk^oLi}^#Q1PO%jA*(dbnf}ATc5QGaBl95 +$g1viHM^ag?c{CXuj^zCg`n;rpWq7AV}ufW9IGHWx%ifp^pKLo0Puw^$YW7?+f&IUYI|7U!bpE81PWB +8auu-g70kL_xLNQdz#wsj<+o>c0tbJ(;+6=najn>O(Isw#>YcSC4VSJyL5BmSZ2@u +F`bKjTwrJ9sHnI*Y&B=tOn-5<9u+8%U8Q`<3?$1t^?Ro{PZkMn?t%y28me$P5DvOHUJuYDBA$4U&cy% +&cLl7O~Reka@NiwQCO3Zl@go+RELPa^;j~8AzHU_kgSC(PzBip +O&H#{3C_T#M7@+5p`jCcdMk=$JMYsufxHo|Gsg!58AXys`#6gMESL;nyg5=?}+*R_`d|g|DDr*8k7Gx +=C7d`pe`OPa2LMPFBV%e^QzsDydochSDI(M#6REwuD{MU4PIFvNVJ5JhVX)yNxI-I34j+{5D@?`f-k1 +t_?3$a^e;fikoc^d_{WF|e5uEj2Cr}lY_S0Yy-tx!O91{4FU1`gVo4n(h(&KF_{&E9im(WR1(Siyj?m +W?QA>CRioDWO(xqYrLH{Kb3risDko*-CH(%^574%u$C)XkyGxMnSZ@&9170IkTG=GHXbMVosil$F&Th +iG+uB^pBN8|L)R1#z6n-(!qY0{oV#`yyUL(E +_X4lyR68wTyu)s3!GG9G@(;;Cdf*(Zi0b2?t&DewL^~fmKPSiRUW(YCXgbnQq6faS1N2FyPdaA7%JNh +g3=<|aP1n2^|j=JdeLEV?ybPq7L7*bKYA=(#s0Ir`>JW$

    gcjP?dlKCf$vSlk}dQwhdz +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 +*+9oatPkBJ38#en}<2^W9B9X`HAC)>9o9-H)9 +R8Ft_n$>EJ-C%TvjA1!T%)@-rM0d?R<}~h@cES5B&vrekogcFg_r9VWlgadr+Zs#JYFO=p6ss;H$;^- +>H&&nff^fZ9+NI)YHr3A;){d4nbhtOd!rFM=C8MfZNG$K`!lSnW89n2ce39=O<{ +NwQOz4C2?$$qC^jHS*tH|I33>Mt~ozU+O%sQL{3Tp38>z_#6DvoR}M>#1xuC#^!jah@0KUx<8D?8=q3 +3q{>jvh;KWm{G!n+t7m>w(s5cHqhqOuVnGJLOsDTz*k2gmg@6Q<+)fle6CQ%`5%%{a?WMe+yIHkDItQ +DIh*4A)Ih%I;L2xDmo&o114~%a_>@0fJ-^NE3z;ik5&~H<9p79Qb673MV@$KXSL;$E*9jUABrzXFWm2 +UGSBp3a%Lh`eBihx5|@KgU$K%Z579X(b4D*87jC_e4E5bCm(Yk~0IBOjTiR^ +I9$Y}O#6-JYj{zZiqPb2vtz81WX-aSM|2cCzL=}w8mMRDiU**W<0O&I&@^I2%!(?wnKKs%o7sBmyk^8 +J{Ro%|wSdht}Vcd>iz<`I&Q{@pKFqSEppk?~}jM=_H*LQB|##_WsJQzaHSVC-frhIz{0X_U>aPu{e5- +`(~xL{W$7sO^-5Qy%q*R&PQNa0N~;Tk!5!1lYX{vNXZxW)HD8$rP^M +q@C6AqYh<3_)TanhS2OfH49bbEyo>TCFdN6jTIK7!;i;Vk-*JAi<7&9J4VAXfw-+&-2Z|uMhz_dmP&e +=sAeifOSv-q>+owu6K}+~0ZY(NnZmtH#&&wvr`KiJD-<}QhLs0k8+59GM10N#)C2o5kWu +;(D+$d6fE^49kE&9FBX>*rZY0~R887xZhesu?22uK_^VPk}(1ukZTxQT{@KdMGJyaiHMI)Qmzh*)m}x +^%>Txe|NU)s<1ccy2+QPcQPh3ojy-JfO2j*@>xiyM3Qi4hmoIEE1BkJMX#msYgnD>Fm4Zc_O2L@eU6=xiR3#2NKo=~nCqTbJZ;>G=2kQx +P#1%7_OrrqOna5~xvr;r|BbO}-2*;stJ6?t0fNG2P6P|ZD*(u!cg<-IKFs-tS-E}VpldkMor?s_fgS? +{i~N-3i074Dqw5nPGnf}aT~k{gkqG|0Gd2j%e`O>^#M3|KQGe7Hb-;cMeUC4>7=reP6V0UP*Z^?bRvR6R0 +DZK^`t2mrimA*^Uyfx6n33J|Rk(rWny(PprpQr*uu=bn0ueYRkXHZ6B +=*eOdV*;x^%*;x=fLnf@QdZ4j#*GJxQ@3UuY*M1|s~S00sB#It%yyuRect!wAn +Xrj5a8FHJG@@uJC)|+!BiK?vrP3F*E{}ohShk?a{J`Grnj`?$f-YT;vTY${v@&}WAJ;W&m-<;-e24~k +8cO3O+a=)?Z}sD5tC*ejN{!TqW&S-k`s+Zr0iTQCNs2(WE(aI>RK(*K}1I53uh+7d}^iap!;gJ2KeM0>U})f$oJn@=^6f&>bXzpX#LK +tG79)t|~W0{fEmI(;5?Z@;)R+TR?WKr8io4PV&cOFm9$KTXg_ +!6zT7pUO!S7|RFEjMgV#3j%mrKJap6XUSJn=3%fDCsa}?-lHEre!T>t_U3RKjcndNS&_Iv(W~3xXKOsSvj!Ja6Qc5hbE0EAQGUJWxZI8rT3-0BoYe8^nWbBT43SpWCOe#OphsqSV^+3<9%eoviQSTy|XkIw0vS8E@T7r`df1Bh7wgptQrgDUMkSLoz2FR=aE5!mpBZA-Wk&AA2kO60d+1 +_q>*d=1MK2F=z1|G6hEN;XHnmf=+oozS%-uJ)Y}o)`Pw(51v&_V%7EUkBh8mu(tP;*3B>aGoYWt5xYL +1(s&d11(CVfL)aIYVRJ}qlk{Y=pRFpubp5hT*O!oXKG#2aReT<;5572_ZPWEW;(Rz=4}BZ2|0fq_;px +GTDinG*ZC^-#H(U7-Q@;1aATq-4Fu|m_7_|9>9m1V9`TD`B<^NziBnFAB1$dypXhi^kjc~HytDp&5PHCa +UWifopaOb+`3-pQ8R0Y(sUE|H2>7I=T3P( +5!flQa0Pp+@ZQw-_A$~KIg+{7?dV!Poagft6QcuRDlmMK2_)3*+g*U8DZme*5hs%u?u^K|5%;%AxhCO +Ox)R~T^r&v51@lz>FHD#}q0@IVHUAC?|8T<}vGChQ-=iTzfgVN@wEtrWOdte-qZo=H3{E3BK{6CgFds +H!te9176Y2nMa6tW6cq9o>@WB}Xj{s`o|0Km$QTn*65sLxDQCs$6g)Sfh2LqEyfK?Tpuksl<3R?a_=?Mqxr8K}dF!h%JHJuewfdj=RV@$xH=7lnw6Gj3q0ZBo61^_7ubmM@a9RkiQ+ +prk;YcRhB!*K&c_bV83$obM+E8D%bCc_<7`dHulk4FIx|8p?>)-$-Gn)Df~-0#$1e(3UNF~e(MqgL@x +f^f|nGHTFd(I7_6f@!_Ozda-9=TrKVGx}a~2Kr40|7g0@`60i9*pA+WW8T(>!Vxv5%GuZNvvAR%i+$| +Jyw9E1&@gF1!dHzs?u{oGsY2#v@eE2S*c(=qJJRUuN{RBZri*m;E+NefF|?PIXKW;Pa(8IWlwbC634P +gk;YR}5_m}GlZeDF}5C-a6%H1g%Q@b8@J=!-i5yYtm)mK$gZe!-CA#Xo9ZQ_uUHpP>!ogU2n#5MP$G~ +HA6%pxVn@nIg}D_f5H=Xh%!@2WydcOsg7c&7tB?V^(D&*xYW{AITum}Ad@BFHR7-p(eh}r9n4`mhoQFA8!e8+t@&b!?xVECvrfoiUJ9$c|iz5qMzWDc3(nqqhEQOcs(kn0Ymh8}Ek5 +s8dGsF=eo1QT`NG0G-K&pN(X1n3Zn-{{`AAClLPYxQv0|}HaSBVQ +zQ=_FD_4&C}lOd8`;TC-uEDou9AP>nRd}2r|@iI%_Nyae+?HYPTxups}n=NQ>dVIq2t~UuZmd`>+#4B +FD!Q-*LXRI1V?>o2ZBz3Gr4wD-}^W@Ood}9nTl0TNT=Z+10ru3mSFvZEZmnBer1aIU+v(lHR3;R{Noe +=ju9(NVkAzZII}_}gRgXwCSZE~L1Q>h;so_!0f0zB!+i#Plt3~a2$iNFi_d&=L`=6ias)6!8vYMOd^Ge9 +YY+uTIz^Dt&4UW<(Cu)7fY;<_mis$?cE^<7CFev-97Cf!P{Mxf%?#gj``+{WUV)m{*&R69$KOPZl=H_9ro_=y_yh;+4dpeum2+ +T&S{^f`DoFu*EI#QgpLQ6tm^8PDb8eF=n=s2mhcXlCPB^WQ}UbH?m9qI?O&`SZK{$&a5m~lAk;om7Tb+bkguxxkw`T-g(wI9sm9p3I?A|ci)(%DXzZm2DjGQ9R|Ie}e-|yrn{Qid>e2?KcLQphHV>C&@G)XcjiP0-AGAKgO3~Hdfh)`Pt6W=05RorDSN-gk_HW_)Qxm{{0pB3y +_SJ4p{RZEX4I6(bcT-Nr!lIuc{L7sDy3iBxl|&%d7o?P4r@?aI0uHW?B|hG6&c?rJU#M3oAkk;8^rZ8EvU8&Zv#c?9{1|%4RwB+9Y@kQja +;syuMu{){i0|MN6m<ycMd;VLO`jJZUNj%Pez5lRFU9f-dQjgsAz6PoPPZscOE5>W=o`(z^pNzNYeNtKg9_jp-m +>nf5PzhVZOcwjBl8G3eF`2$Lwf9ZBSSVRz9#pQX)2Rug8rnRMt)&C+w1Hn??hv%%>FZwnD$0soH#)d`?;S+f~OE? +|6yghvJN)-{cQ~HV(7oUjmxrO_s^wqOy&=xhkl +A-&Z$O&dL3e750Y~G4BEKjCZkcW{M6kJoPccHeEqUK(>B&w8XI<56^xi7f^N5m3bLlF`}o+L!*!nqaCa|ACE7jWq4+$hpY7rxB$U?CH$hQ_ +<$n!|MepVa4@ie`Lz1U+H9oA`u%A +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 +cB#d3_Vvsd;E*@x9bI>jZ +_HJ_3B=itMNE?oyg1Y6uyeL(a32M6TSE4%%=76@??|VW%&?A2b95*#aI2~3J4YL?=JRd_<_~Q7JkyR+ +*hVY9op(?lkh0j-JRd@MRa;H_|`lH{jGcIr)kcAvJ3{q24W9Kt3nwec~gPJ>M#E=1~GdsW2Ei!-Hy=a{aXzmkez +6L!c6UwBRGD;joNNCEHtUG>q7P--^M_T$PIwePtae3^Oatd|d%_K>Y+v|9ayuaP-d`{(ww4jNlZ4QWS|W1V!Wc$Agk9j^GSvH-a%BT!Z6) +Q_vU~X#}Qzn|vb50Hx?6UE$_qnH>h?BUivHasU;@X4H$v0QLa1Y-YgJ*4ewVBnANnhA;x)gwB6uGMED +S0ia5q|0mu|f)g5yYpkcS;#j;PXP$zZT)Nft^3DFC*v2AP4i;0Orzx$QVvwmcE89fxGJ&s4H$;eI{FHs+w(<54uuQu5tM8o7RT8>3kB7ypLdx*zVC}sS7 +6DrhuRu`;ZUoZP-3Z=<4rjFFDxa}MLjm~!^R8T#y2yZ-gelNqS5fv$4iPan={sTshy!AZeRe3F&op2v +2RCWz^1jP<>{HAhMaEJ!4+Lu=wSID#@ja{*uB>$$f2eyA-k?Zpv_>*a~D| +W^ty?9p$`F5nr>O~A%0cYiTvEi=VPcH=8J^ZigKc&F!eu;J;_7(r&PVDIdofLL+G>+*Dae1qfulMfo7 +~oj=*{$%~y3hwJC!hGDC`v1LEFG>-x@ff5J1_nG#nQV9`I|@v_?~|%PYN1r6S@9883Q)$=KaL%C-~Mz +hB)i{csX^rO$bx3QzQMNE2z^KACX|0c@aD%aKKulpGSGTjJG|HnfK%C_Ocbcc(hKH=fjH^ij%sxj4Op +_LoPQ^mc2^6wf!NvrH9x)Gu45-Rkn{WA~K7@{<&kNtSvZ2y3RX&-%xIFIjP=MT=8O{C<1!UqO+`@ba3 +UbqNe8Z;&RFzP36H5j~2|IvvbakW?|im`LLIyYUeW#Q&9rkWnz*_A@taxGOA7d0;999&&D$&&w1ja3% +160SFK}~Bow_H|lESVx8Gl_1Ez@SB$*x;S~Pn`X#6*<{ +*mz(QhvI+E{6eu`?_G1K`A-#EqENwBF6QCmzvZCZIL0~Ug@pWpYvoPcX#^VP +Lb=h*EZP7NxLKm6^{4s!pKCwvmkfj)PcoE-E$o;zvyp7DLLjqq#ZEiSC{B|XSDpPl?96Ce=&-J8Y_Z? +5lsuDmsqv55E=1H#YRKHD%y8dzOy^j#dr2ulIQ&$!}|nty34ui#vYidfIc(c!w;8Ge|qyXq5bK-A +0ZF=XFsH=&3caDuH{7`L2&{7~Wi4?^1BjbT_9%7uv{zJp`3>&sO<9$rSR +^;nFGRrd!F%G3u>-qR;%rAtLl}4pQu)*gmFsrS&3aeJ0Z#!&BqlXIN_mjopPmkc8LQw=l(*46<#!v<4 +pTNu?i}ovqheNd|@fvRyZp>(=6|JNY7lyiE&Wrvi3jM6Gq +ub`l`iIAEW|xs6A|G=6j%rI*v*UTaF=P3_rpw%oU8Z*=%cHNJeRxcvyaoKePtoj9(wUfJb@@PvA(@OG +s%wLAQp+Or_LLkRwAd$uPoJLz?+mZVsdvnJE6Z7Uyjl3N_|-(WxBWoHQ)}H9jXywS!DY^E4zN>yK5(~ +D$taT*GOpesVv=RvLCbbDnuFw@XsbXOJ*Ekt%)7OW+%-=oXA>cH +~fxrq2Z<>y~HQD^Msf#UH~H`+D9Umn_cy%JOfy#uVflrOTs>`^T-whxJ#W5vNLju_Q`jI84$%q169mK +VQJ=zuw39a0aGmPzpyG3I+1582zzpAccX*Its3wz)lNN=9=)F!<{t~Bvix;r>%e4zn!f_(weI~s6FAf8`<9c7#4E{1}B6^sM +`N28#vb4Ak?h1c@{CQ3Nauv=dP**qLr@e-R2aQ<7@Kv@FM-TnMkc;DYm6g9qPSNbr|Gx^?6!uw8Oyul +Fm7s_P$VC;pNhod>ENTf~nIN*!EWua-E% +?;%DTp()0@BxohV+xYZWDNhuTJ)-$wEO8S}@!W26CEnXqS=f1EIQasoFETrE2B)q&-)<+Eq(28$ZH6z%P^)EnepEY9%h5*p5qJWTK66m`!t-o_fw +p{TiM?l9S@_j`7Fov)WGay!Jw>*Z0$keCc7J?b)Xc4US=T~KXj6?A^gWF#J5)y%}pOXK*bzQWOdMq}q +HDPyA-uSrQ5W$!@;m41i8=*{+_drJBt=?luHeO2pr2Sy*6>wLKjSs>AGgH*Db%~ghrmML##_mxkh1d( +RLU4$lX@u;ygpQ@(!Ygg{&(J%dRX-z~UxaVybDxnoNOc$)-)jQU3jH_Sl#SbdTa*v7(yS0@2=}uFp*H +;N4Wi(V}FgW%5$UrsNGl&c}3!{${$UkTfIqj0a9;Sn{$Ls$`-J3Nzifu`w@BE5>=YB2bq0Rb%c?KaSi +8tm!2qXqE{Q3*Z%&N+)%u`i;`nzV=?3{=!g#Zxy}V@%hFK +Us`E^Vao6_C+0inrt|1lDwY2OyV1W9_2yJ6q{D!s^PI3Sm;KMjp +YEEijjDi!w+FF_itvVB$Z(f7)XrYs+b`D|&s@hjSGYi&qqB=qFmPUj%}SSAd$PSEo&>K{t!ABHy^37X +d%bo@9M7Z1H&OU_;#k9jciq6nhHH8r@ofh{qZ98ISgtmhiRzX~ngN@bq_h8Vh!nC|w6~~xwSGC#imrN +lHQGqRa@XDky&4IoU!xrhtwBpA!^zV +W7zt^IkZ*kQ=fODfAE{g_fC>c;LeL=L4;?fu>5rzvz0P=pG=8810b!d-@3SMfqR*6ThJY1ymVdJTk&- +23+%<%rGxzF4Njb@o}_&YH_>oMoJLhBl}Dyy@ENZ!i|^5z}Jl%{8e +>&(RFBPoY2?bs|(>qbQgBjqPi3cd_)LIN><;Af%5w6lu%f4k&Vwyb?-M_BZKSpThrf_WDH!}(9<$Fql +j@w9IR(nm +do0gwDN7N>CoWxVvao +~-9^jZ*d^jcE-6TulDb>h)_i9e#~PbUWX{Np&?z>glwUf$B5Lvi$DAa%?!VaE^<{Ff!6NFD8I`tf^^w +9cWy{(EyJPvv?Fba-hW`Jax+2a(|!?8h-{(c1*?D{dTP*1F?AMYmx^MKpGr`&}Eu;O-3pgaJN>&d1^W +Yab&y6vW%n@3;7`9>v?&$M|A3Hw6xA2K(`h;~(Go+l_(a&PQqYH!C|8LVJy0h~bIFo%rxyz>p~M#Z{L +kZ9zeN8$FmcnJt~Gy$U4Ou*JThnCVDE)onMjA5H$spiU21Pni(V4}@gD +Ax?VqyX+`C_0-wXtx$cm<}&(jLZnur^n0Jn@;gSMJR5;w^q&E(BBDRja%U@6B!Zy~%eX$o3v~%)#yj+ +TMfB11slK^OcXSldbB$-8$O*#u8^Z54C>3FRtY#HE9|wm@(=_fX&e0OWuFUO23X0aRvdk_k4=TsgiA< +q$VljUJsYbd8<+pVqdMn(J_Zsndot`CX%(9b!nip9V1=ymT-yVa#jLmhcbBsAjkm`hZVhhek +>fd@WJF&VX$XxK>6teT6QuJCepNw0HcIpaPZ3XM6YIqd6 +%_#~WOwoR$`08pyKS$p=5HqtMYJ=UC}4S{nSk&?Gtu?g#4X!=d>bQ&y}KM+*P?6)-nTz4@P|LHqglv1 +-mN%B_7-C^(4EoEy07j$K&|yAe14&b!gxW%!>aU|Rjg<1EYEaUY3Eplw-t-MvFul)p}S$-MI@AjowfN +p8H1ZpYM}jMM|gY_udH}n@U}C%Fc1pEwf7Y;^M1hvFgP}dzR_tNrkRg13O-yR$T4u`PsC&Zy7w26 ++Yd~#IfGp&En5`U%;_xFgA-li#c$fv{CUrv(7{#wn#pCWiBa{dD}Oa|N)Q80WVec!a!$J_*4r0z-7xA##Cp|p(IKYuxQOn;+TV+_OnM5t6{p*fzpDEr7IB0VKr}yIOVv)1( +6ola+_PE;EPn*4%RHgMtoFIG%s17V;y3>8saNTq7+W)lAYVdfn>#=?CrG>o6Mw4+y*)E;zmjoJUkR9; +0`p!!Gj7M&+w{7`iV^=h;l}gI5w#+0v+qUdo;&^EgdBWh~Tzk`<>lP%th}m +7b1A1x2CWAjR=+TF2ZeIoyZ?CF-Bch!pM6@HJH|u831b>~`RC>LwbG$P8D?cL~GN>`&)xq@OU*l8-*N~6tFR4DnUZ8$avj8p +fjkA2I>TYmTj44-17NQ=)(p(TzukGOz22sKANuFhgm(N*PX!G2v5~_|`uy196Bq5j6#qaPDRuwBM`^n +L=#P{A!N2os%%;?Ro_W-9Kb1%Ro0t0SEbMPy=8v`HPnGzGflc&DPeP8fs*E^#fK+-^Vta9gdX#uG_|ffy;*U=qdCY(x@f +e>x_ZT})+0swG(_T!{9}95wBl?7>qfjKWqftqqN7wUm>!j98vW%V*m4w#FXVUKE7W(+h5#_A4bi6_Yc< +FiZG|_esLl`-1jcVEPSbtWk8sp?!I&=mCgGtSehSvx#bwTl%e!7L4L>1Z@SULX5>o)cE{H4f>6cR_u; +2rM4|JYr{@99vhnpe4)}Ys?DTRg>IH1>5WT!rNjsy3(A)?|;{kz)MMW@J3v(B|^VN3EUvy{3?u&yEl) +EjP!Vb0vvJg4Z=jU06@3XS+7?L0MSjWh~>1+h)jlsR^y8+z*Nd@9r-xL?uZ>N`S@!(4XtI~hvG^WqwE +fkrnMhsTRsy2CP=M~^{g9$5Lse@)TyZIvNxjU3gG4eIRbejdyu*A|kW1Yq{H%ba5ncgEDXD=2ms_mD6 +ba&XATc0+5t5ISmim21sM5p)@phhvMQ+OJnM!w{b!Y4sSg{L#p3~4q2^q +6M?bDDp% +mXy;nZ+P)M3n^fW5Y$#D~@ZTRO7^6O~_FuKXfpxz>*Ugf$?V7Hrel=k5zjxW+1`hu2CI1pmkC+Mi&`> +7CXC5It&f$np4EFxNBswO?vh>iJ-pkJmB@B?NK!))YGcjVb|xAYTk2< +1EE{;Kbi90z(yd?0H6nUgytqVUmr`I2%Se{!~Q_*ip-9&>VOdfautS(+WIA*heC6F%w!3O!Kw5SGTDW +5B<(x8uYIH>fhj07ES1ORUc8{4Tkg-@FTwd30@s`~(y{?bBvo%GkYgFFNN +78$Ido|3{q*sX;?h80wNiz>!9($6h38YPzr40tnRu%Zqhc=wp)6+m`lvkE~=i8V_T|jAiIsSHegzlxA +%sQAGWc0%d^F|1e!`M?tTVci4elVDYk0dpNbACSy+~2W|0sabaMR_)i5^NEdJuNcab%@q=3DL9g&>nC +L{2XtYOOSVsJDcxDy_1g;^Uz0sy%tHqCeRsgp#4#gyP*%uDd4hFSiWQ%(aPjG@8yMEk-h3UX~0uI+ +0E>0Z>zg$jAp<63&uI(0?{HZr}tpcn(~}78pG+-g1&VwxQN^~GDV)!Ij_UO!+7567J89SHcSu~H``05 +Mlu{0-jr{5|K;?gr%YBEw9x+mZoduI{olgf|Gn$~8G!%pwf_={Ve;?_+X-NFWJ4V@bvumhMDl=5`Y>_ +X>0$P9Ov#TlAvpUH!tItJmzi&fVd!C8@_2BIa?v`_S{*`$3@kKV-zBy5x)rz5pgoW^JpKt}jRDxvfGd@&8JoYQ7>NM +cUL_9(lML3J}kDx#oy~il>{|$tJ>%tRB(@nj}%QLsHzuWyPJ(JD24*P=SWoN#(Wm-={KL%_|GMGs1~C +6{4OJr;`Y0x35v_lOp#JDr-DvF0Ze5p1v9fA5!&nmUVYsY^g3&c0Iq~4S3B{oZ8EHi8HIw)?*m4fE3E +V%w$a{=d?bdZ`&5pjmw_5&fBOuQAkuir*oXG>^%i4fj{ToEj=xyj3wkrq2ChN!M^*tb2yY-E;R|AVwl +vNhm +ofV2m^H{g6Mt0n2~PY>_TiuTbqYIdKGVa+?B^z-pCpv{o%&($NAoMdk5r54rN${`Pj0c=!$BTDRhu~voKl_-%e{vy@n;nZF4t$P2*iV0Y+{dgX^cjxGkJUt +f83e_<$5vVY7JjUxXd>;k|8uy`KOKy?@IPou4;&T0nrD1MMj-LA@9t~tU)J%!zs+Xz0k!!HsQvcXXC=Uoi2hGk0(@J_pH}iu99rmdJco1Acb +6;7R=O_F(u$#`$lfoiu8*pEaf5BJ(AT=0m;264#hegcY0OXB8ITu3lA`Q2ItYH95p8~fqItcqdORezI +$sBW)Xqt7CjRMZ_k>3nbp|@B5*l&yqHaA9N03OJd!M7g2+vvjsSMR4U +fn+0+naPNY?4@UBe-ksMS0As~6|<@57;w7#1e;s*1G)Qs3tNhG7R>97U}s%5PpEtW$&R|-(qy@=4dKA +RDnD_=({|2FC#L~>xPyk?t$(rjs@-c>Xk6@hLkWMVp7FJ5@x!K_#$slar1ImvdBxp4xw2C? +|8#*H!j-gyJfe0^}0fmdWG69$KRxGWU9GiIP66XKfojZ4q+IYPdCA>^1aZi-XjoFjRLhhnZ`d(CQDmOCx2$V +X0^Q5OYvhZUK_t>aLeiLzVF^e2#sO{fw8A*>`tqG?F%wWR#k562h=>ETx>xTQr8Vw!%`NKhA65Pl0L* +NhyZ*j!pnn@;{>4jv1~I=s{X2-EaT28v3L%k0xki%sPsbJxr!V~IiSCfFZ`$-{x&Zqe)KSS1Pj$@Yr5 +}OUPUL=`p0)F!eP2gDtxPID#?X)M>L;&iCuv`Tu2T5pbe$f=>dP7AVe9oPh6Y7P`}TmS=s>`oeUYCjy +!~bS>vtxWqX%~2=^>}1j|AWYV9w +$!W-R&`)-ZFGwS5G_XBeTxk6Xqrb4qjtU{S7!?qCFsg8OBP2h`Jz)jiF=2Q~=So;@3d_}i+c+v-=Z<` +3t-5`ml2)J`*|L8L%RT4vPK)kI`;sqN$s*lL|Y3}=IWymk3md(qncQoQ*3sW3i^>=l7_|8QKY{6M1Ix +pw$%Ah54I%f#Bm(Pm=pOZHdTw}V$ZCNt&81Z3)06P(D6`G`OR}iUEGO}O_3+6*UV{Iz!7=CLyH +9moKLeMq&;28^kQ9xQ2c|$I +iXBM@@K1Yx33lwy(8o>Xh(b(`(K8e}@&KTZ*yZQ|Qin?kweygllb4kGa2@m@CK+^0!0jv{h7UpYPI`{ +8#{8JNCO(O@JB}eAnzP>r`4xE~KOQM)eoV2U*8EIZnTRCd +UwcR<{sXU8@KKTzrDW+I;mheMt7m+I%s(Fj_J-;gD~&EBP#9^8ceh%Cl|EcTBBaeuv^|L&;8v*w?W#Z +Dgn7+wAGPpIND+ZWj+(VHD3d2uW_3;ec$|i$?qTTQn +RIUqgRw9w{P}hMi2R_eiC)K2htq)OtWzcB-bQ?X5pGo4rA!j;16)Le|OLQ4%>f+jHGkNX#cqz#dl&v? +J#Jp3Zf`PWS0i}V@d>Ya4Q6^iVoybME(s +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 +A7$u&uo2SU35np3`G%N*19$bO +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 +#DI>8I`cI17iTd5(^A!Pw?+jyi;9DMPiT&#*BD +#Gg;(bu;Zs4S&}!VHO;*I$Wf-I$ALJ_k_c2$z1>(YOku3bg#wYqj3Izr=HIPj@wTWc|t(qIE(qHnH`m +s&k*SC!QF=nCfOB`*?K(8t3Y`!>k@SS6v2+8d;`KA9)bdxJi5znjkhOl($}>0Ey2Ev4ctaO?Y{S1nY6 +2zJK5l@RyOafyBIO7pjI3!geQVkrR?LSz*e +8$y&G^CJLWdlD8ZMfO}S%jcA;431|3hJ?RlCjJJRyyA#>mAS9Wu3Q{V1;f0Q-m^Gkiyb4f?#*ywD~_s +92m&w`=azO1a_TD$@OD3yNb55NihwZQAX_9h}3AK;#zeCk{5b_^?3UjDyF3s0-q|Rg0(fI31h><|=J8Twb)J#?nz6l*GnqkA +dX+mRt}5SQ5!Y13ThzR(fjBL;R2xe^OiZ@8oCcbQDiu3*Abg%+n&=GUD&}$?YxS**iq;fZTdTzrsMsh +^^&s#-&Mrb+Li)MBVt5>7+j>9zV3xh1#coPRPN%^xhOH5r8@xCX2Cd;)2;7z+)bj1ixeJ%M7{jJT`zpW$J? +bU7+7hikyh&b>1@WxAV=+~p74<4kPIX5@Kz>vUbb4BwgJbXUVkYe%1UmtTpzZWHN&hQ=n)CioVfAkh| +7*DZdgy;4_AeX#cT7w1qlN+gh=IV_C;CK>HjNZKkP!WpF@W&#BKdW}>>fy_)W?B(k0n2bgAjPwRqxnY +>~ZL)Hv@)`Dv3QV#=&D_LVbi#kl!sRhig}*^l310FZwH3xQ)Q-m)uchU)XuscR+h9WvXKI)|R(>xC4ugbW +E{C>HCV@`jURJ3pHH%@kB+K?9LOZt_}PsPuHY0E}04fh+{zEBvzZ%^+Z(}4qwk`MffZ~dj3@6vucJBL +)=v23e`cTv&uPYh0$qY(te!r2zZ)~%I9ktv&nQ3XM{>l4&jGuiEcvb*rHPv&jFpSo3;98jMf^2B4mX` +pbcsY+*&|SVE6vpjr0e?O^`cYzdtDLg`d|dOJfR0Qr6|0O3(rOpT~JLcVq`Fhr0dX_z}o$cBj5dOkiVt$ +PRIFXz602UgYCmFX5hg6-}_9^ +AQ4QlakbrACu1&fMTIa2-Q%wlt0V75N)~?z_FANdX$2H~zCl$$3c? +7bH1jnZ%N*{#W{@b=#~Uff}mt;f3j0;bmC!}R6%_>0}TiU<3nk5Jo5jK}Z<- +Wri8XkG7CK_B{ZU_~;7|AI)#<2w4w7*7$&K@Y65}{<=SN4{UMhSews3jgVP>#I`$*qRA1Y?`C#IA8Ri^5qIWd@NW5mB<$dtL=K}knKlD*D01vo7`Y@?O6CvBV!ydR7pXmByH-RHZ%6n +%YWPD_|4`T}Q=-2`OQh|(*53qs0ulCEdeBEc?d8tSK_G^%qz9S*PezGCDq<0?Nr-D6Pi2i6%bl +uc}^gB&~%a=T_bmVytNy_>` +n)D@$`M`!I-bgMBqUV5?%BvUP%n6?aS7(`mYfd2dLdInUlZVkvvu@Qnd+wuBDap;BSZ)+iphy<+g`#xmq+7sIY%lS +Jr?V&4SF;Uu>Ly7Vs8PoB-SlH&z#G6Q^EkxYL>ynBLhTV +O`czu$y+>fqC=mv<$#u0-K`u*ZUPunaIb;u!6ZtJ3p5_s_*TmSCX2;n +d>H+^V{lK%e)ObU<$Z56lbBmLUW7Sdf}h)`ax^94{c~S+u~?!OJNL3>Ahg +3((f*k`0mxQCK#7deJh-ifGVQd~g#`&f!_&Q5($pPy%tz^l4y8O2l~ +t@~Fn(9jm@N$9PIsdR>^7|bOb|HvR$7ZV?=B +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 +wa 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 +R(Xmac&4+XggV@6Xv@;BI_#ed)Ys1#)~P +1<^@GLaw6vxsP6V*;p5j9$zk((@`Zv^!b|42nuyU;Xg$9*U|t`%O#h(Hva(DUT%l0hwp5%Qt}(*$GsD +w1@ZUJrrAqe6TNs&s@rZIy;^&=6ox!)`lefeZ{;?UQsC#7p35oj#Rw1DhrY~Yao9t-{GTh7~&^H=z4R +HSgxTQ>V(yv+GQ9PLh!dla(-(({ZmQ&HE)@L8~d^?iAf0X;4;71F-o+tQkn9LIFm%1){a}pbFX|_2WV +kYOqJW8{a@ggApD8jCwyt9K0N6>zdOIBgPw~6A^g>UQw~d(Dou;5Z +zCws=>Ky_1s>P#$a>;q14)i^3L1#QQhatkC%6m!W?OAdjNaJ8UtW^e#oq(l8P;q$4s2?#PCIVEry|TB +2U!G`zwhBaLL~?HJFC31a+h>?S>}_j`b;Uk465X5fnBJ9@O?ctJ=sixGq7M)_Fm_sR$sLj42#?b|fFx +PiJjCHT0eeEOg^xeSNR+G!$gid{ubGB{6+dJNgI^J*r1=7{_r6#y|o&EImPlz(E|tP#i`u>nw +=6qEsPjD36*G*eeNMqE;6eVsH{rAem(NM71?2m|GHsBv*1Rf5@^H2gsRdg6*a%-RXEg1Rc2Zp|N>p8s +lhn@aY+ghqNBdXi?>f0TXq;(Hj5RJ7Cd;@`>H>zCulWdW!{Xuf!%B_r*`IH~}*5SIT0DqJaR+Zk&trwJ=dyna1PiivPh!BEp96z7EH2sJ4b2|uQjGUICZ4n`47i!1=W6rC7@nc!}V-PSmy&(EL-+-kC?NW#) +mmBRtvu_K!M32c{AyCa3lfi7D+k6ECEb6etcSMeyf6u$X#Xlm6@4ei&N=F6EgsF&y3b_wY#RS^t*Ov1* +LPq~Kvg8sng|M*yQbPeMg696gKG*E^&&QVDVM-w_kf#-5uPHoGv|ni@OTqa8+1yFUvQ@O?5a32XsqZ`BkDa7}5HUd($SB}Xb_WGQKA%HB`v-! +&!WIpu^pgOU%CPrg2uB}4Bm)g~UXE0vGYiH^ZsVowQ8@^M$@N{wpN +L#hCUu!7@Rewy&>&3ty_+yWH+fB?ag285%jRE1MoP79J^3V2O)|y4-lLNCtlArEK=e~xTNsN;RqIJ_O +w-d7BYX@fQV-+~4^MvIEByfPi8!}4ynp1|YyzflwY5W=)4%R<)M%}_KEiO&YQ~D696>_uWTV6$jjJ&h +<0Rv=ZfWwKFSD1SyMp1S#PE^g~k-Uj{5<9J74R%BloGO^HGX?Y1<0jRw?+q;CWj!~5W-|`iIy(;**uG +S1+1bzUNK?@1rrSc7RYfWLBw|8nW>74f8z=4*$zfkvBKuG621MnRewi+=gLz8O^xZLh$xTiV2_Zv4Ee$@j{2*n9;-6M>Ys9ZeflRL<}XSNOc5F*t3bG*UegHSxUE157_^CRt5jhv8vx6_FGm3 +|HP^g3WP8mBq$UkDQss|1d8IH6acl;tbO}Vw?G&tVU&Qe--sy0A4dT4Q<9N<$zf+lVqoV`dyEgkA491 +4cySP`UuOkC>S%t#Kg~mAa{SBEBU6oGM@&v&hj;-9e-&HKp(7n#VE<0Ze?q#_^P{i?{d7$2oGU>OUIvl-J^o`>W$`H}^D|RNBS +elkdfld^e=C}F^PY-E3_vP5SbRuBCImdFvsTJGbQ)ty8N%5fZa5UKt39U0P+-h`(Al84a^8GuJ>82*tfk6iuw<`TD9D$WX34oojXL+Uvc8W+{3okd}|y^$AF+5Mnp>7D0h{hw)K}E +3a={0lcU?1Aou&~ffD;#Vrjk~uW? +mS&Vtkc5teK1Z4mZ&gDCAF%^nTi28N8xxv0(9z$x_HuPD#+ZtV#)+Jn{N#eqjwlXj!eCm>-_rne^-`k +z8oM3%nN`f&{OS@y`NPKj|5+EYAp;NPGsS#(7`Iw<-CLqGNzB`_TC#kf +}hWJOF^yb<2XP^y|{%d#7#3K|14jlj+>V4XA!)bGm(!^Wt>j7J#`#<^UAtVE&6ybPU7PtDouJYS)jj{ +l>rr4{vedjRkeo=O)rZMgUB58%gm`ykui@)l(_JwR4HDoo?#DeylkOW13X25cMQW*P-Sj#MI2*9efpl +=!80{uu*8wvlF`!5mGxH{WYXe1Xff-JxWbBa6%m?&wm|)Y8jTx^4a&_zJ&R0j%Cy)8d`~L`>Qh5}T~q +I2i_CfR|JY0PkFvO2&c*4Ji+7m^4(?$LYUkF}N?DsVzclfi4(O6hRXJnaf7?7133k6Qz;K`iou!KoGZ +!>jOD$Z9X`Y!md$;y3ViB*#gU>G~zfSzNkY1!X~|0-~!gd(gyGm3Y2X=pZVZoVkeeGB}Yh8%H=u630B +ryUaaS*e~=Aa4#ZbPh{ELBNXtg9yV7nELr4UWT%Xf94YFBK~rxj!C!kFsm5@y^vr8Gq&=wr991Fz3{` +#qvhSiQvDQtJk33laqTkjevJf?w%ye_uE7HTTuHg=ecWTA#a^dYA^ewUr^OPBmn*zRee7AA4XN`FQck;nNTA{iH9I(ty>_pQ5nppT#dJ8378bO#Wqhi=qCElOt`c2ip4E +Fx2t|PA&yhn%4YUTiWLs51oMv??Wn%AMn%HZ0CttMsQW@Q1xYO#JfJ5jrF?emU^VpeJN;+P42cf91@_9AUYLqJzbID@p!*RK4KG%2tE5tt7J#Xyp4&3Q`4MqkuIc56y5gO*QuLkm$j&!HO~qjh2lEM$e?JNtRZNFv1bkTxwvj9;KRM4RguqR4-;^*Ii5&PcD>m5xV +~AG4`o3@)wi8U&OH(56UG3k2S%~Y9KKk;I7wk$bb?wu|W2x)NpkzqCg-;WWpY^i&Q)9#1BktKS +M4x(gxPrGsQi*q-$QXdFdX=c+|0~7m{OW`Iq4yT>y}-j!!Xg;*qH3!_sGG*M7#q5ob9Je3Xan6{SEIo +;qlrCC^T8jtzF@ycZdvPeDFeNNM1`?4C{iAX?}%JT`gph{ScCHN+{XQ=fBW*4|EY+pONt<+MY23+cUr=4$9q2hCxn&B-Jywnnz6eF +gH?bv@O_vY(iCI5D@&!bDezt9)VO +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 +-*Zdl3e9j`kF4^Z&H!`Y2Qpo4Njv1ysW+?wtF$ +4cWUg&K*i$7bl&yBr*O1c=ol5{EmQ%RSf-}1iWUm=nlv5r}z4a#Ezq+B?ah!bjPGq)MN`FYcsxOa!hk4?BA+ICqA(ZYnI$Jn#QK~fIP9qM*IerWO97wXzg9@PDY +aO}``P~&y0+Sw-0Z*RbOV96=tvDP4BUo6kY6cZ)q0*ghb!Ezhd=bYI?X&+djXjZ#tk}xBLA$sXAc_ra +N(b$~=LuRlEsl>4t`O& +)vI;|Q&l~#_18&AfEB`S~(yev!)$YTxr?8B3}Dh+PZ{#4kSMfSzOr7nbq;|*6GD^fxB2(VfjS&_|RkL +DUu@J%L`!d@GQcdtIRn2C9(ZWJkWr5FWi1%5$A&XxdQj7`(p3UV7VY{IJk89M}~SbB$22 ++iG0%ag~h<4@Ljm}CnC8)3xPOE{<0nV~rq$j!x_&?6$n%EHGPksr@)CDMc8v5&!115L+^- +`tLd&b`D9^rUs>p)1mqUg(3Yu^r`E@|1{y`);j|J?*U3^CUS?1#jKb5qERN?7*aR&SyNI5pif9Ci7 +7rhslugH8@Bl3fuf-wY*0TM+fS%{O|?Ng5vwRet7q!!;`f9Inlcz0+Fq9crXx +~#n*4Ae;26~DOL9xmK3jKobcnF?r}TyMDjAOGsGLxe8OzLd +4kcWAQ2aVo&i0i!JCW=ia<&1k3g?NvPI41vr&ja83k|_ET)kSSk(n8hk6`g)NFm5h8-WlU!C;i!3ug%Q9^?8K*apQr%!= +Oyr49BVZ-tayRtw*$9{U7?x5QSS{+?~e$!`-#@;wuqzEw>katBKL>{ocNhUNL5hNbd%(>l2mf#Y~bcl +#LHWP^v_gKhA;(H+|FzAe4Wf4y7S;rEz@56R!XbBowh(%a7C_w=V-jEvkvbnHD}7AD@a5|ABsqVXOZZ +*X*rgpnV&n!`J6BR`KXFl?pAmT|1&1D#VKvBj7Asr^f;cY14v0mWAnpG;7iPb(dM2>-4&e@mCp6LyKO +tL+IJDl6(;&?Koo41WUN7w*%aU||RwY6&?$+LbFlf+*7fDa{7W%bPs=C+_bjj?7fAomJx1RAAhU1 +z5E?5?L?YtqHG+9H06*SvazV#ZeQ4&JaNj%#KY2!+vTr7k%+#b#oQ9%O#C|eWh1Ko;L18o+>i!^I82a +5_-4i%Oh!b_uxeJGq>ZF|;*yCmc3gPLzzJ{%1MZ%-?Z5G)H&jCnZ31mBg^CCBRHn9uDNvQiw)d1W^CX +YDdp*fkN9@qlI8^Qe_~OqOo&P3wccaDijiGq2MEmq%5v!v5C4bJyerYH^GJMM%Nfvk+XSrLOt*b;`M= +#Np`Bon|t*-p_mvgefMm=f}-{w96F?kV1dm*X`S4z^R^;kJvv$>S-wzpOuMG*?!8|KCIxvu}-MRHXZ_ +p&hg=PT3wJQD_0y@B24;au1+K6FWiB|U4(CNN@y~r@=6PQK5FlhP_M^}lD#uA0guZOd@4w%9iRB~Vx0 +9?dpAHSE7Ou+=F1GnucGu=v|m57j6WpM;H}=b>2)Net2 +w}_gWG#`n`<)UxwFrJ^z(5JXQzu?i3Ofio;#<`HT%Q$z7$2ieQYLNd7RnP!z9srONT<*AJ`L{fl!2l3 +&b_i(Nv3;pYSNo0pT8B;R{70`O7fw#qqwX__>}k!#ptoi3W)`^n?;A<0>S2(}}36VO|#y{ +`q{Te`P{~XaXd4sk@=%&LzyDO$$CDlPWouggU5f>4F4JG0Xx=v;?#kz5WIWwWFg@rQI!Fq-4=EHo`UQ +jW_Wbch|f7HbkEHt4b`E2;1`9sQ%zn4$y5hsgE +#HP_GL-@u_SPlV8c@oqLV`>(4A?zO7b0UGh7M~-^EjrD_zGTEu}a&p3k^tK)}kcgTaVmY`#C>5M&_ +CqzFS(mKPV}%8j|aT(3!P8BpDB)brrT&y2ZPp+pIHnO@a7oSy+sn9?({=b?^8>QO*Mjz$OZiZ15sMer +yE<=}D#EHJE&R~j@#j+uz2K%#I$uhu@Lt-H$NBa~+xwIuGbEg4T(ZNrPWt+mDv4of311`NH}BG@do`j +$?YlXgV&1?d-+nDcxDZ)Y%+zo>XQzWUZ_J$Td&M>Il(4_`Im4(F^#qG{2As8E2Qc?2D{YsMd4 +NE}np+3!9FOWsHK*Ht=xcj+X6GA#ip_wlt18A-;Ft;vkahN!5u<56Pp<`{YzZF{l9@g1K_S^eh)3NN| +v}~O2{p~A!_;1(x1QUO1oi97SP;7&T1db9U1Y#sX5*P)M1hgH;af~3he|`@q=Gor=w4u8V7{lbsx#6Fc=ddn?YS(Z{|r@_S{GjM&-83AF +=QINzJJqG;y>WN$GdI_Si0qUA@= +uh292(WjQZ4oAej?@@S2^7IdpNQDs>RE7)tO&u^Am_-Z&;l!j1v0t8v3_c;C2Pb{k6nq!ER^iYISBY+ +$skH^)@ZCiniD=e0elF?WTy0Pi1m*G*pMD0KgM+QJ +HqCKP`p)FTa0rN;tB2q6J(8nVx58)~R6*zqWK`lLDb +RZ<-8vFBP$Bx3&xm(4(X;j7eZ@Z3v)pO$KAk}dc+Q~ydD9e1A~`)(zPgR!=YG0YAC{9bQ`lijvFpp^SURq%AXoTlR{TVb!l2om3N9N1Q> +^DAD5J>TV=!UvEi&osi^AY(e2`T!yz(jCTBZzjmsMh2SC(Zji&5vruiYhwe!9f!h!tVC>cJ>YVEIUGyT(X&yNA_sA6#Z~ao|4*45|)tL~C&}bWvm!8JlspEyNO{m2g2DhONAXqia3?qKX&N +&&*ezCY24~SQ)f}VBx9K+nTh=;ER_wA!u>+w}r@OH7~BwTKDI7 +~>#g~H)jPtc&3J~70NlSj4L9kq?edLX)Fm3&WolUNXQrSM=PdiTn +`mDS-$5-FE_EqEyOz>{LJE&8jT?rz3os9!7iD`ZUs%qw<0&Y(lMqSK!4qmNtQ!45o;6 +=bx|ThO-)!f$S761^$$@OuhY^yc=zX)`#n*MT>@nS(o#b6+*tN%F*YAMiVf5zTjoJr3?`q4668;%}gt +?_15^ZF3O3(@N3zq^=J-mdN{6^i5HX(;Z}PS8eCu(Oy_i;a$l&+OwKJB+^tnk*4^ANaIV-aCRTgoXWF +15?UE>s{9us%?A_({2R2mqbT6tpv4_U0bju=!2s2t&n#|W@rRkkAAw@v-=M|)F@b-87Qc8*;Cs*ciRb +?vnt#*_X7tGGJ0KlW9J0)pLx#}?Hu`z=U@!~UBqGvQ3)CP-;=6R?p0wi-Laq}vctp$7y1sI!Y}+evN4 +3K_%#9$i=O&%%o2U2ry1PcMoN<0_FZ%IZ&-UOR*4&nlWo1{H|B>d;fFJzy2kO3oqegRrR5F~p5Kj3TM +symQ8?9=p?+-8szMf!yT)+CrPTGC%rlczx4sqUNwe?m{3?n-D0rgY{Sl8#nD1_Txh8^9I%*>q$G4F2A +4E2m&KbC_e&-!{B9FSEFu2UL8tOQxHKr~1$u?Lu1_@n|IkKK}zwc4}v{xvJ|=^7Ld{T7>#aMTu0j6fI +iqvHDWRL2jTLaV&Cn?e2af1E%6Z?~VHWL5s_Hxv8HVE^MqK3VF&IqM5uJeVLcf`UP6`vqbk0mC>>f;d +Hj&@Pxqp~T)pg?`gQQ*V>J8B*xY5QMTlR^Gdfh&>uc$US1-8siqaIfn`=*~FI@? +CUgGt&9{4x7`M{V!Xc;Mc=W|(7Rp~zpGH&evov}4}kf*zLf1v!U(!++--hi*ObY3PEU@#4 +LP*852WvzhY_}?0djn&AMJ%J@ZAVTZF~Kpg%e|nMIU;N^=4NdTqwlQhY{k^rH-5Kz`t^MrIfN#+k|IA)AK}WA&Bjv}(PEYybAd}~DbP2JOa7(x)0C| +$;bHd=t1&umrS;t}VG0=CsOK+wy#N7v03~fUZkv_%OX}u?2YDebF2pu#hZy8YNFSEThR)JX}$2|nAiS +pKMY&%Q~<{l~^1D;wlc^mF@eb3qRSrzrW}UNQ%G +|Nx~3_pcINDD2!}|4+cSSpA14!IEhdw{7s5tjO?ZCecBbWlMu7FXl9E1o*{eb7^U`F@%AT1y^GY}ma5 +w2u0D*tiuM^D>08KPgR~g-JBjY3K>RH$x~nNj165;W9+$00M~!wLcfK~KLSW&$BM9O +UuU(F)(`m6n1C-1R*dqiI|9Dm($DPZR~Uw^!?f82yHOCQok))|gFsmx&fyZGby{e(4IsvJhtqsI;<#% +dN_dFfG?#kDc=EF&+UC`O$Tb{_2Y4xa14g +FPnIHBitREh)kdslPKE(HUl&!SPz3IG`Pvdse% +@VM|Bh#aUo-)}T^c5*;?~Ii!pxL%3fe@pHK}9d`ASrNbBxJnx_3S&3O=lUwoSr=cuOP>&WvJLvgY{#w +qREXW;TE&-^VRO>!)qszQo5J-^{aZM9M|m!kfEIJge-8-BO +?E&p1OYPnWq)oM;2d!GFCT+^9|?_$uk^d`btBzH(XZ(K#6E^&Q+{RfvQZ?eZic_+JRLwqS7UcE&1=E1?i+w+_Ow&DWhA +TBu&<5<57MqK@?>0{Feen_x6*En}}5Rj>wY_r~^>7zl=}GABDTd3)B&geWgesG@5C9)@#8OzL4KpVJ7 +O&6i3jk7&TV>$Mn0oz(e@n<;gHCuv;SstR3MNjE?gb4UkjCIJFzkgbTjdzcCe0a`k~Pf-&1uHq6&o5~ +?J9vsTO&|6i`gM$EvDKHML8-|r2DrpBd#oApT#H;CRlR~dm(= +={St+gA_Fa#Ow@p!`ggm5JI7?^>n03PhWN@Gn0CAlthSG*l}J +QUF2OM+?Mz|IEf={5MteI>jzWhTkXqvqf)(HQpX{bQjz-E;fk@Ex0KHkU&6x(3wgRXZqg?C&@G`~Yg` +%1a}PPUJ$y$!*n}yAs)l>!No{h0aw`>QrnmUfcOs%UK@x{`NRw6MXfnaXJ(y04>AN6rBwAy)6s}jY5W +sKpoRVn3Q&a2iQ|PQuUMQ2Sl;%LhoN+tCI$)0Q1hL4DL2)4_(C;Oz*?e-M5m#|ZG-_VB0sJ+YOhX^a&BT5k +eCc;|5ko+5jrTrqpx=+d{warEN5@9)_TgIol+Q)VVi1|v&ze8CGq^|0+qby*DSzjEi80}Yf1$=8;Kf9 +|PX?;&k>T9G0OPx)2eEGupv}a#Kn?CL3g5C)ryWI!XdZ<;*cGD{K4>5%cHiCOeU^%1eUAH8%S4oCGvf +NMb`N8L1&;}Wwq1(nz3t%!ah>sjDmQ)6l<7z}WNuL=-0okS3dBP&4vCXWaIZTmW5EFa87#M3n40cFHw +YGpb9mM5+fV?Bik>F80N50f2PghcmSrO8}ds^BFd-UxURLSdo)i?XhcFB{3H00@+0&ooMvsSWaWQ8l?GhIR2u?IswmiE$~BrBH9<@Osc@0!;^G;ZH~}-pFuatmj;|Vi=ru; +gObX5{l;i6RKao~aG%BqTwP)Vx20sp@d>T)Q>N_~0 +m|4*i;h_FiK|SFZ~|E$8`0!#0d}yyL}c?gtzWKkiC(4QnLOBD5Lq>SLm7*&xk5Fy{?}bZr;s#yV%o1c&zzE+{Nyuy3lNo_hWf< +|#acvoCjz%rYE7OSh)YKXtBDolY%25Tbe0UzZ5EZO<1 +6MNE^qbPG8z1@7eIGbg>e@G4-J>p7eQZ@w$2TC^B&h-(aCjvBsweYp{gVbH&2&xA!gH$9%($=Slz+IK +M)!d$GnCbd$BDn>|&Z(=!gl7VpxD4!fBMODSc9Z_g={9rs;^=4Tlq6{3M!kfW%&1d<}+QLkp5Y)cq1a +$YGvs=)>DKgUTSf7nGPa>hatcMpHigq?Ken<(Xb1KOM!qVB5Ssk|6)LF*k13i{_#gYz}zW~z7pxmDZM +xXC(Y|19Xfyr%1LOmz3=4l{aO+`6KyAKcP&(S!N_XC|BlAlIed^>(1$GuU`cdDlU^+9^)8I@ZT8`X|8BGKSZCL${;x6Xo8kDslK=f141&~eUtalNzvUaQiaspAX6bLwA^Yv#*2`B&?*F& +FeL{*qy{|9J#OQ_yDFplGI9@c~33&!u +;mj@WSgT}n=O4F%{ui*Q3}alEg(K{{eXb>HhTL6Kb+4tv)+Hn_TH2J`)5>^+bNO!p=B>4@(Fa1Ol(24 +_2rMd3YxxNQi{cJR5uzzwW!m~oeIh~DLhU4P+6sF1(xsBrnr9ptTASCzlC0)Lo8|N3f9JFu5Ug^G4Q$ +-#4u`%FJTszKuGXRx62wpjB?mq3KHI8Y*|2w3S9SD7pZe?R=bUzfZM)AB5h=s=vNr-+I4*UwOm6^?m`r@`iou{Q`dF4g1 +#n1^nF`_A|4NfsezE@!}jVFovqpK?!l2W;!H(sD0@gW-r5ypnKx^a(qQ>7E^0r1WIS+!2lg?z;w_g8A +Dxt$xC@XBGaNXH?V-y5IP#DCRCCd3!tL2^`jQTjFPT7j+xr$}&mfw +m2=X<9T*~Ov)vQ2|p3r-6fob{L+!Ho?2+h87VwqN)%@}$`Qt9QM=gw{9KJ@@mQ2x*_ro+N=|X686JFi +=-396bodxU3?CY=?7|R72ymc7a(Nm4Sr5COM;H4fBY2> +=*X$|xDa0y@m+nyVj&;Xy{7XalNyoE+Y$z99VTkK{qs23{5p?zpL2!0%OZxNCQ)F%;nNm(A(@28|^G~Jfb*NU1z +OFwUIcrVB!8?!5e!lalK;N|c->CrOytf;nPm6HTtUnQ&$C_=ms_Up;j1FBw5jkrb1`Yj<9`v~zy&$te +qRwNUj +4}6oU3yfe8Lh3H2C%%R8lS78$wEdf6+1Z&n%-?@oPl{}lPAHKf1C$+tTjz`gfi10pE6g9zx;<1>g>VZ(8>LC2dqXb(K)kj?^KnevF5@4D@X0MesH?L-+A4iak{|Y +dELKvy8N;`-LGBy&!CibyZDpSeE@&wb-(L$9d-W1%K$zMCFCKsa#pRrZwFQ6)3FVu?8l~SOnyUdDwqU +%=ODa!7myIQAJS;&4{}pa)w)jd^^;@@Wrv<~O*fo!Za%-c&$!vZ#TlOK5Eh2BZ`Mfzt*X6&r%zfdD}4 +`^+x6YRQ8ItI$^JON-k2+GA#ZvrUP)8qp=VsTlWOTiJ!A2<^G@bZj5+1@`R;#ENp^v&$P2pw7Ph~sr^ +J6=49s?#3GZ^M&A@x+kXbgAqN3E!C1TzsAiOv;GXl(FwD*WZAtwm~XQq};ZSmGn3Hac#IaU!OlWGsBO>shQ{n<6SM;SnTPGwpN +DYXbNE1^n?#;TjM{!yFcpIPss@jh1v7$)F_b6R0@pH|sT>S~YcbmrmkLd`p}tkU-r%YJzF?TzGUIHA> +(!Kx<#gLRh$Oo~kUS`P&xe2F4byylYw8oHEbmR3fVl7ev-d*X|J`NWtW)#Hsg9v^MfP159Htq&A-avJ +?XI%Y##f)D4AiFk*i4XYRAttrNYDqiwqD(Jop$0cOE#l7|;Bb}b;>E~q=1eX4dcYiZ=-QKkgin5J%ix +#zSCdYTo_t&xs|8$YhvI&1$;0q;OkiakuCcmv*h3+Z-%?)e@7k(%GiFc6z0pF7=(D(F-c#l0vXgl~#2 +e8GrG5M}r#2=|3+eKTfxH}a1Jw^lHeM*$Psl?>2&$nyVqQ8^K_h=!>yA$m#LxsNm(=KC+?Rvc1_CWNb +lHjf__}19nL+bY!jV&aFk~gh7+a(u3aF0i~JtgSw+xGAo+)E`tDq2*#13*3#mH89jtKXFT=NRv+Y5)h +=6+fx$hc~Df#L +j)2dmo*sMThRKOL<8y2T&u5cts+f3!nj-{Q{;4sgEjy)>R9bH;65#sLvvFo>b~zs$W?v!iCWEqu?f@I +BwzrLpCWR+C+2B=zP;!Bh2%X~So1(fK#^7URcDzD@~7qw3pw1LEC+FnaC!r?d +qg*ZLuIf8bfJcaR_}BhrT8nm0x6-(2eTPAUp5tV?zYe9Wk2x153MwaOr7hdU5>(`;bNlw1x}nxw`>iI +X-)ng$N%wXLxl0xuP~Nbhs&GR1vo!;1X80x^RjLSgeepV^`sH`Qw#`2FHb1I@`c@<@7`@Y(2AuCh?lh +H;zW?KR{#1HAd~ahQQvrPb1R$yAq<$wg*QA4bhxB$>LfM9)crKj%ilK^Lk{3D#O`OKES+pmz4Tj60(Q +oIaF0kz`5|&U|HPt4upZ7CtwRq?jK`Rp5iDSnfT$vS5GaGl8dGbwkACjuTFg!UL}Ab#7@rH?9K?n&kz +jxlF~cme)<^d8}M_+lhadGG))e@by{ErB^P2kTm6!5RvK$r2hV)t$1Q}#WRH|Mf8?%hzObhHx4@;zf#)!pQ~1JKT1d95Wc?|jmc9!Iggt7T;q`oHwWDQ)N +J-!q61+0Kwi4%RMF48Y&!p1aN-?Z#B{ypy**!-nuDIFdV3T3DiiNFg54Iztx@>-2@)!U|rj!4vq!xC|3VG*$ytCGR!|OXWVj6?OUug10cFB)0Aqv3OvW%#hPrp8Le)M@=%Q(= +$~*orqj(R6yIt}u|Wo54X=@-*rJ%3+C2xLC*fb>lk!H$T=p$lG=|`oq*AGFS{I!eg49B8eV}JBQ*xhI +S0;6WYqgmMqi!@90W3SP{7d%GHj-GpRC}~Ak)V5x3c@BP#^*PI+^OfyA~emVI?7LpE0nRGyPiS}d`1A +#Cr_BaP#3Z#9*oPYDS94=@MJn{An4Z4}u-j$4X58!Cjx}w +DAXY<$qO#LVlXfVERZ@kRL`~PzQ-mKP?g@aTLWIS4jSfB1Z%w|HL8i_}HiTAj%#89YUtaCoq6~YEP)o +P}+Ut-%g|z<^#{&e;@ynO=9Wx&RT_;{D8_vekT0-)AYkmqkcqBw(z@*6JO~k4{n{vo!gy8*E-LBYcz< +QeY+>RC17<7l62O$zA0&c{X9CgB0(H&D$RrBUiFm(oQkFAH+bT6L+ +0iJ!Woncjm0~|b0VWIoDZc=Ju?VD58WohB9p*^EY2LBc237E&*+dqP*GQpG2qmO&#m!(Y6$n?~YD~G> +RbI^jfJlf5QTHC@FVTrEA)KM01evjiKQD{E!xr$Qnr?VegOj<~S9%Mj!g*#-i~_|eFmAv?Wqi~1C~^w +3;*R!H}GN|cFiI#$$%kneuJdV0E=jhA +kOjk{@|YL1j}uyv5=snn~{nTLA_luFjj)z7}A7DZU8*T;>Y=to +Xt(A;sv793QU_(3v|aB`kNjSX~1jtuSYG4LOdLdE@1Bz?ZTP_OC}Ch@1}M`PPN9S==${p|RaNtSI%Z8 +p%{vK&5#yMo(jWolG2UZn8r2b}-i7Q`H#po@*Z!hAkyC=fNt~vo)`0UDuDPZwN6UxK$LN!xNB)m4!9HRS>+`}3>ES;yYx?poiKO*+-W +XqEN9)PQ<~R!7*$fhND)1@JXgN+A+|j7fWBiddbwO(5`p8v`5-~8kc$9~uFM^NxF85E~>%tez7f};q9Q +WS>c1WjQyN#PhqQ3OGw42d#7&Br6irw9`{N+J*8oR9v^A;*XuvWe7ZY{Bl?cJIg>~&j|S=8!J%Kq5`3KE?&Egnm3)RCWPhdQ6MqI5Fxl~YKNyLBg+I~k-4PO>i3$5Z^wX=DQ-^c +LK5_f~`WgHZn@DA-!kML4$cfvXc?IE>*0^ZBW*E1m*W|JSSjpz2V4W6XnxOLGKAl)ZOSpVO_hch)zM{fJc)_1plJqU{CazBebbQ +9pKu{6k#O@c>Uv~Z|vzovZTu2lm0=*Cn8G-fU_S)3v +=sL8y}fBrihDXY&qFBF?Ti`o+Q+tdvsG+W3B64s3K!0OM*m%&PHvwlK}+sz;42dH*Nj=KKK03W`F{ps +P=ccXLFIpR+Y6tdtbfX^6O0iRT)9P*X<{O5%`vSo`WmSGOx&gAt)K^V@|Nc!yS3xwX1ZFbm;09}%H5AwsGSCO +Nh=OuT5PWmRr`cH{dr2aNF=Hg{m718B;l(f?& +a1LvzDo@}%q;^mt}@m!-wQ=edg6RuKxSdEmOCIMr2=Hz0!v;T~2+)#cSSkKsU;(d+yK=dF>3GGFF&QX +6})DWaIyhQDq0odhAnP+m)#@LdW2X^f;3IDBBg}F&Xa|Q1NlV*oXQS_-D|?XB>DEf93 ++k2Mva?!^`h$X7Irt;lEcyh7Zq3{pJ}>B}>d5LAC;Y+YD$MgGx2XKdIcoUsUc&;m=-iXFcV&oUrWe?j +^XlnM{|S>@~4WJa@*|$G-PIoFQ;{!}EK0S>KYxw@*+WNo-E|Zxf8pm!@~%E4NHO0v;!CR-`Yv&Lf@ab +RL|c%ocB-p8Rb;AQaxp`e~~dSX39vH*j%W)UV3j?y<0O +(EezU>PEH^3nn51pt!Mwk(-2!|7EB2K#DF6n%dLT2hitQCRcHaBObleNZ#RQF}q+t{xc)l!v?SfwX%% +KH9HVo+DA!J0q~#4a%s-aN>7d9i}lXGEZKr_NVeWc8;A2OEsmz~e= +kTsvjV{d)BCXE$fFX4i=CITz2=NjgS) +u2>P?+J&MI#uRIBCOKGr7L&VmsH>9sz&Pb{X$m!*~Y8*rYK$!GVKA{x?Lq8X*Uz-Hd9#=G8j#+O{AaC +CnItNN{akRB6hZP%}nZ~IAjN~{gUS$Xkqv36M=9avw_^Tcz{o5J3&&3+5)@?y?1v-p>+z_z#6n-%iZx +r!?nTt{Yv=mG3jJUX{|-Br3x59(EkqNy+PXFvbOg=1T{biYf7S2}}eVBj*z1m7oO*;~Dluo-FUUvKU&}Un +m7_RwsBx2-l8EI)*voOfJQC?K%5nb;YQlD;40q|ZA`&g>cB1ovPmbjd=9w=TZKLwQ#r@!};H!x`5ARUlJDQYh16mv*6~@t-y8_=o40)Oop9a_` +n`FPqm*hWh*a|9`Fi&T7LxWUfnV0eNNxe07xN&FgyJc=SLGL|NdR^@_p8$+b85LtM$wFv +g73-Q-f5TGF(wmxJjPYtBC@O9qPvf5e|wC;6Hs8EOeTsUWHhSYs=Vsk8J8MF!W(15a;e+yy|blm2bsvgiSaVeUD9ZH^qfvIUG) +tRu$rnF)zdDEXmf(tJO$fJO{0V$c=22z#NF3I?LF_`y`X+jUMIc$w!BJIpUOr7T>;{PLn3-wP-d8`LN +KN~y2)%St%O>oRY6-+T=Lud^)d({W~(uHKi90gQg1eV+#g8|2$N4dYy0|-;p8cA+q|#SU)VIx@@{_-_ +t`I2{>bAgt$tDZ$6U|Lf#4pW$o_%NV1(Eq;J-QY0DAxRmr(Qn)ir#Bq5t9e{|HgxpP|nqPVt$Pv4hKF +;23j=-yO{p%%OjD=pf^t`i)iM8h;^HIO1d~TxCMG|Hi_B3yxG$W1dK*&mK#a*}hy2rOyDxtXKO_G +tF7uJXW6+~@7Do5;9z`a}XDam3m5Y9cEPpvudUQ@4)sw}cuR?sTuj`2Z^$`q;E;oMdcejqiorGB=QmD(06ZORFUk>$L +r81Zh#`4+Z6Sxv@?dIm~cl`_Z^yj&}O=QL7>|ALU6C$>wv#0<{5C+Ci1IIb_ln_(zBP}jmbiBX#ZUm-{wfOs)vW>1S9GNcr3lN{8GKCO4t?auYl3(U=F0bC%u?Jq@b0eI+kP +#)6nS}84@TzPmHrN*`-5c8DUPKG}UVDYebQ +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 +1y(y!+g*mY_xz?GHX|`U +(Bd?Y|54Lf84&2EZu6SqSGrrNJ(h&8w172;sA_i!&O;xseXdtKe6H3%ZdbJ5YUr^OjFH<7E=~E`86k0 +QH&>r7U&SOXgMigTL3~Wu;CyB7&D|k;EJg33TvW&Ak7K0IKy@VF|O+Ud#B$*28`g)Us{xlUVnxC~Z8U +SIOnv3L{#fs18cLif$!Js$X#$nh~N=?Bp0xgiJiqNg=>MJGC!|u);)AbUeX(I@zZRM?jvBXbkJ8};co +3E)R!_@0_VSHPE5Q~3fm{Ozi(KJPSXp_Z3GM+WGNX}Wj0NAr3<2iK)^Ve1SzPa|he%Z)@PW6z;R|BR! +X+=O`n%(ks0zA6>S7Ts)CKUNaZYxOQZvfRUvx7XQhbs8Ol?Fdmv3$-p +PfIa1)t(VBC$OWO5k1e1t596#E2sSR6s|AhCFem-Kf^a8AFOZims;^+Cy*0&}Tnj+CUI`r3cl5rctx; +VZ+L$D&z|y6jqvnE~y~~7OD}9VGhAvTZn)+ybL=zZYsA*hqpnb1`Jl%!YJtnL`!5?H^wGC?J7{w}{p; +sWb@rdoY(bZE%*QlSeBQ%67OhUN1R0`0IxOvO{2IeEuTTy5B+Ph#bFWtS;cLfhOd8vgtc1EH +3CU%dVUOV%GLP-Xb0>%KVi1_2Dh7N-ns_ddZ+7PRIWq*FX|g)Vdp#_IXTvKPQO^hx6w1Q%Np`8!e#&U +hb4YF_PSV#6aK7gfbj3~vA8dBo +ZD@kAnk2#7{>4UrA^sh*9q=EiI5&h`Rp^wT1`qMOXP$ula3D_t6LVp@3bLKb$NgnI%=R9Vs{?!21q&O +lyJDAuR*fDMg`}9v{2Ro$WgNnhQKoR;aVa5~(<=WZbj%SWpIOq{E`kK$eKAoB9LBf#FNLJ==J20jCNY +Y@xjW|;ZvkRancOv`Yr`VyAOsV}kHMqsH-T5x%{E8DKY9irx@=ef4X* +t_G1cAsWkwfd!dqPdf`uLGkFNmVX7S%<{MSCzWYK|E(0_80Njubd4AbVoc08lpS;%kaLEHb;5y+jlp7 +LoVL%-6j8c#lXM4ug`CwbgT3Mi!*aaJ*LNLJrm1Fp^(E*l&8)9)ZL=2fgh{&C0AqTYyPGFIC@s)*Y^Sj +$@t~ek1%Y93Nbs^c8{j?!5za_f%Y=r^GFEGWU3FH3=5UI)%S)p#o-oW;tHw<+eegU|c;q_o|@hGB#fU +%SAGR0?{H{D2ks}S!T6KSv35$-Wid)Y8Q);N%SSmE8T5&yY_~K!QpznP<;vcHHn|*cDMrX@}XN~(O## +TDbhSKVy=f(^E{o0U8F|rItCm809u%M*>=$?`g9sy3A +8&*urRq2VVmP=Wy9AOdFjQQ?RER>xGvr=RDBJr+m@gmPWiOfng`gn$aaU39o4I!9wwIU|C1e`bSTn7j +0b!o;Day&6{U#Kh}ZWKgyiju1WbYi|Dm7X%xV8;lrU%6TeB_)?KtQ*Vz# +smL{xA$sx6HTLq@A(yTPko=rp{vdXNq|TaQRt4GgM<*_*B_9*-L`vs+&wdOx*U2FUZHL6^{(}V^?YC0 +@T5g&FJvDcp+OhmH+*Ti%e8(Gv1TG! +1#UvC2kKKW8lR>?gCnK(_0mamFLD_rJ`RW!J +l66W7$3jO^x}`Ms=FSUlUD7ykjKxkvG-L7{KLOm16KbEw42Zadk8rE(XV(@~|soQrX6BPM*A+7T?!8D +?LmMA&~dLPR;Yknv?vH6b0uEB|1(t2gd0^xk%4jfReFzFai-AUKy~d3u3&7Dt%oO|L)BNNG4emD0bOR +(h4#Q0kvZ`Cos*;?$D!AsK9Y>yxbj@KT>iBAQ5d9@Jse-lRMv;HL3iOp1RDeO)#janeva|rM+OctJad +kjT&Y0+S`w7qli(-vMvD8Pn8t73pK!_OP>n9ov#%swqb&_fLL=s!}_G{ZTl65Kv|2iv^VaQL +`ifUAiK>zbz0J#PkoZDjHBItaNDpK|W8)GxJpNFa)uw^Arp*=N!w;CVrXUbbaT^WzTKR1ZcKq(<`6Sn +Akxro9{U35{uu_iVI-fay=pyE){r@2uI(>%*a6c}su13=!yCh0=#NG4T2HQ`T~zkDhFQ(l$w?+ +0km)8ve!5P55>UcpofT>XX>Np)u2!;1e?)UD3t-t2PV#m*_OhL>dd_FJLES`y>Au&Fc1{0(-QA57E=K +{r)nUrxa$5qrOBrwq4SJbxm#b7Z6&1a|-V9WM4k%W&(a$9CfbFXrMjP=yg$E8z5p{gD+S(wrP$XyjO3 +mgjFLZFdt(nm~%8h!{u<>?z$YfV~?q~LHFttcFnM>;f{ypxXD8Qae5Hpw(~?xEJ=RNHJ|Ux|&d5GpjxWP%c}FL}kKx +GHkagy!i&2luM4sP!=(Upa87srp`;{<85#_XLFvEAhr@2G9O&=r1&rw-ZMnC(d3<_0ftczdmH`fSD)z +dOxU-BjEGsEoDo0xVLtE&G@KL6=Tp+a#?Hj-V$xGAdVB#kLm0Y4cif&jp1BWR~riWh$wAxkT!oY@t_NvMiX>1!+9{mrdSZXrMe@e2op5qYiERe^Subo_1=@ +s`~3_$V|-#x7*%54*c9co_{u$^=l!O%x=_!Yspg&MN*DWek!^^)a&y}fx8MW4DC*Z1IqB*H}et8-sOD +F@3h*e{VgJ&W?_yq(Si;eR%z`v0hI_b8v#-fHy9~8>@+P#5Z*XBEc?;Cn|t9CoRgHKTqPZcar +w(1k1~Cir^fRt)30QIqUL;gVu+7IA*tMj +wOXiQP`6O&4XH)A@9}+9dy|Y=Vf+eo!s-uqGo2mo{6FcZWy2qdCfQKF4NxPaYQth(@M7p>g!=`Fmct% +pIgwo*L8aK@{@&g*+`Nzz5|xTrX#k%4_DnZRt)LZ@WMHqRR&m5HpC5bE(Z9Do@3E&OrU*KH_rl@Dg;7 +XS58*ryO2X35*=*fXQMp)&xYd*R0y06p&CdcW;#{$AsNx4-&uYr`NU@9L5+O?krrB&NK6~>&@a(q-U6 +xs;!k*75%!x8~pizLZ|SlSx; +Q=G8TTwl*>-^l;p^O`mG!!sOq`5GGa%8mCt+Ro#*v|{+y~?cnb`VDo>tnfB(7&!{CXm*|1mY(9n1bF) +bLje{Ud6)E%F03#AuvEPzpv7nnYj%Lq6?r+KAUa`vKdF63BF~-KNsLJ87eMd)Yy{r^{e+AKHWle^9@0 +-$8fwMMnD?$a{h`j=kHv!@Y)UV~ratqwzh~mLPj<4@&mP8iZ`z?-$e%eRq6^;a=6Tw?skjGL2wgktX( +93>tZ741;%tN3v)9b{}J8Um6Sc=;L;Fcj)=@1iNq0PD`VAgE@i!)91QNuV1(}g;A9+6F4=F2 ++)Sxab#$scIp&I*D5h8FIu5cqFs;m!(yPiW!s0%{SW!2y;`;_Xsc&N9l43IZW)}yQ?utsy>^ +5J(6kU9?MU_DwsB#=df4x}3BVyr>OZp(AKfHc-Xu6Hn($Fds$pp+)kAEk=^$aj?``yv6y;Gmc79xM%Vtkqg0r@^m^ssnBO#uCG +8KW1toHf^r}XvX4EroT{O(VGw&U5+~+QsGa+;KBTzU*Z&xt1^4%g+eH30ME@7d{S4H9Z>jI$nm{lLK} +d|oP#oF*K=DuOW|Mbg4GQl?u5hpyrfpD*zri$p1NA1S;V;&g@rJpd!u2MWH!M$~-7B3A_cRHL?5-gxw +qxg>Z;AKf+)dbTGJacW19s%yhc~*!BSGZHl%5c=DyGh}dzPe4C6A@SbVeo_u$?Om?k~ +q`T&i-5UnXk2mHdX_-v-wKUnbYNwszTzG~ak +9^Nj1 +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 +MrQ@G#EwHnUog_aQeL8|$>z)hfga +Ik`EeYY(5+5)RJ(-7*LZqrSkJ->(#6_2(sahFr&d71#VeYLNXL5A+Ru%ty3m< +T%{!4e}!5Hs%DS-C^~Ib3U}vseVBOI10o^tS6?Q`wWO34l3`pkatu?rPXx+T`k7p4C}oS2wZ1mY^KQE +OniJRC56aYp@uJHJtbWr3?^}Sp5oAWS9)EvdF`D?H(C?udWMrf{@Omo#J&|+y)y9%{4F8#jOpZobAGE +Al&e>r$kLY0$A5*dPxF`2jL)Ja`<4}@?%M(aNL+Rc2Pq8!r51wIT|Q!q$5w&nA2UXi33}Z><-&UIU5& +F)$?0c--nA&+_wLwGXo!@Hc(_J5d3(fAos3mowzOUB75Ny1mnF^+D7aRYXQ%h5yO4m!NAKASvy1NA=O +w3&m(HJ&f5m&T^v>FeVf)*PH2y{cM1Fn$Iq#^mRj!vkK4?d*Lvi;=yp9?^DPVx<>?g(V5Ns-HlkuYF8 +*LX{fkp%%q^02yt*akrghub8YO_1rT$UWC`DLaKcvV1joxZV7wi1^9Ly2xT=$7exhjc_`;cvpV2#$?`5qh07Y_+Jk@r9G?b +Toq6Tf7@BSja>AEV`taFRN8F7#DUVv0IeZHAN9`OI{;C@>^`Zq{FdOQrmcYyL8L@%5v2f!u5N0Qa9W$ +SG1aCZY?jrWMG{=O-FsTKv@c`bd**)Ak_wF6?{`E?Mi0AtW#5r?BxoYxGU<;SYdbmXXkz$O(e`GkOYg +!Ewl+rHj1GNXcoD~hLgus&e73ie6pEt3ZVyY~?a9>=q$6Z{W*9K+S_(VRzkvS9&ddQS8P-gBLoku!aB +kIV)P`Q!i*0_J_dIE^pD*j~0D4IxWg(gdiAk~|kwRY$i7$k%E^f^Suf$F%EsGx$95scO2t(Fv +x!=*84Tj+-+r0$25E5b;%NG9S$yTBy%fG(Rqc7A*$EIG(7Z{)ybaniNoF4gm_OugWtIyWOq2&2_;4BNgV9 +mN}Hm)%Es}%Ee59lpyJ;u>tIiyC*TK#yU14W@d_F6%9Ale>d_StLHxytfPL;t6!=bx@)rMR24>?!k_* +-L&3V>|Efkxg`Jj3?dpo{&mY59<17Tx+WE+m#|G%PEuQ#~tG|vAZPwB@E-xjpkugq-v=4K#W7M8z!?N +QZN2G;m$GVII7Ma?fgs^!NqXFH|`nh5=D;;zfz1q2jfim#Td*B0V#7$HwG^T7-2^LE@ZEmjOscLZ+Yh +qiae+a`b`#H}i6 +z@U*Qbcpyaqlg9*YU!3ABu7#gqbrtd~uVWaXi$D(=~p$x)%>@Kn#G*&PZx&AKuWB_`pF_GTX1SJ_IKBQVCP@2`$6p@7)jCuy&FA|7`!1Q4bw2Tfh0-c +(C!C?!U*}P1Lh`IH|$BFT`Xc>($LY{6b0EO>OKoG*i9=pSjD$1sZa3|p>}B7uG&CxuRMBtJHgbhMYlh +LF9E@Ksd(^?Z*H#;5_@2g`c(#-e(T*0grhHmzLGuqh><&%Z>#Ke>BQbTn7)Ue?{fByuPD5~b{Ow-F*d +l~ggc7vRY(c`ezIVH`Ar9-zt3QsyL?-SZ+Ll)!5OLVCFvrd*ErejVqD129OHS0{@J{Rw@cxp324vW%C +3j^u5^MU^fHSpbNdJ|3bo5$HrN9`aL-)jFHuJRE98~To^1X$qv8#Dys*4m^S{llfPS8up&LKVt#HGpc +B0l@V_pa~w)%(zTCTH+@eQ?rudpR)Usd`)Ne9n~{{TXCeVsC=?J%K2nuE%u&8@jt%Ty?m?}(;Bz4(9~ +#MxPTg*vv!MUE8^#TCD?ySAW#su{CxLW*>_+XE4rC4Y6}w7Sv*eVh}QAf?3aWU72*Siqnl2b>zvAu7M%Xn>by~$ITIfpjMZYqtw|Z%+(ppUGs*l4ERhC5j~iI+hs4Yyz2 +%zazesN+q<`N;zi~yc0P$urnSxXC8Lt+-(HDL7xfvG(R54*QO7u)eD~tc$}BZ5gD5C^(0i1GNldi)vLyr1YZMszy??~!_rm +C4Li3Jf!8wpeC2u~_ApSvjcaBZraV-sZWleQw68^eg{N1xY3e#AfI=85oaO>G&d4-;Um?qj(17N5-kAwLJp{ae<03#)X2G<|OHBq^0^cZl5ttQrEsdCT8w7&X1ne-$ +ieM-!=dLSVtxarMAL2&ma2BwC%f-3*43?#KfCY|7D7ov2T_Nm&N$p_A>QA)*U_=jKxDja_CAxMITT7d +EY+OD1!H7eT9qjvPMf6<@NK9VQ1S3&yR_GX7=TEu21ysh31iiJcp42w{JH9CuYi$kn5geXc-<)o4gY@ +DM+)h5KO1mN)IfypC}EA3H_Cy@Jvo>c;(j>QBYzOpNE{YIiHG6Mo&HKj)~dZlAG|?k +r*$KdV_uf-F+vW{;gt$WZj@&k0Nso<1#n(6<;0%+F3?P7`?xDY*#ynf9+7>;Ki$RyHc}of +D=c8CSaRK~7+~AvA)W){2R9U9^u{BNVco>a>B#mx3=ybU~kF?0?CPkr<5umta7~Ima9uBX7!-5Jph47 +TO6ZB8)qjvrx%+I8allWh5P#0fi;_unf-@EI3p7g6beqc-x0YeZ%k~qG}N&-h{65ZW1af;kv0pGrWNC +^7W?k<3L0fwi4e3?dpzD<;NIhXF9m*ji8=x(_X@6s?qK4nY+x@QGKXxDnkd)OB8)^wZt+vMSHLWk_3{ +xo{CoOjM(V`lN5PW=UAioaA5(z`yy-w}WE?f +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 +gq;mo4S-2J701o$WRQa}Z)6k4kL!3(s7s!<=b +QAvuV{Sk*LlU2ArwjtmiL3maXAJ=0`)oM_O}wy-;6GZJ>-fpiE?~WJYd;STE?fE?T9ctPgk +K(=H6W!hmw$HQMw#Dtq1M0m?#(S`8d!}I91mCw4;csg&?OlGw-(oq+`Rq$~FQ545UCn|1{9&jHN!ql+=yI~K9+@AV^%rte$e_s7Z~AAf&(;J$eCU+%%$uv3#OVXtelN`c%lW9D@3La +Tkj-0!2UkGX8@cMaw#>*NKeX)5-6Y7X=&xf~f9 +Q@dsq4lL1lrb$eq@0)k0Q0Gl2*vKi$B-wztH#Z4;b+66E^AnMz)&0H1hS*^L3Ihl4rRrnfYN?99awGI +X1a0IjGo1riTs)@Lv6O9n;$R=T3<+Ap${UXRLyWeRDN^g#RP?%b6IXF|8qIPeb4{pHu`7k;kS4HQY>&khy@D4ad`LsC14bV2?)Yy9Eb2vYY5^ +u2IBD^mqy?n<~9`DsCWqN;q487V&si+!Cq%Td|q{#ytPFN?{{o+V8cL&-V^$pF2LW8K{3ALD@y(m!h5 +KCQzRP%Zg2|y3L$sPU}9e-2=++)27nvj2FPAB8NSOpsrRtFZ6V@~klT|J>3its+q-y!`t2-^?XQQuO9 +wXKPTqQffHq0T(;pN|B*V_Em{s+@|dE@`v-|HSO|1wi={r=!SQ_uZ*p&I1)rYD@e%w8r7J9Ktaq?h$j<6>*3(zU`5#}^jKWLDKGigQ=omCrXoiqEpwIfv_ +zAS{T1lSTv&V)iaYho7#z_aa?VzasjIexq(Ks;+l$Pd>%LEAB|mWS)f>peiKkUc*n%$4yFIUkrzXT +yZsm@O-~cuJ)7>#6j807k%UX?J>^@=)EVGDIGYhq~&lN}(7NSb^=_Z&!3Tna2j7laj +;O!DK(N%)gUT8i)N{R8K=Io0dSV?O(AQ7*-F=ZWF4ND>- +;q0)RRqdf$XXTb!8?*8D498{ytIqg>7U_(-_xMl5X4V*Zff^1(x*$f9Q)leA2K~N|y)0^N##q@_!Ef= +X=&aT;bocd+rBzk5dSZQ5&r%Fa(FTy$gb142M4Lu-X_gj=m=-qwkT<$)2Ny_vU~|o-@8Kb8@o?X5y|QR6WS +%Z|CQYbKePMY+RKBG?nH1SlIu2rAXhesSukQSpUNw6&JOb*95v>R +dEJ)51&KPdi{x;Cq}-~T#y!}EtJ_dlHZ3H1K{T^~UAi#vX3EG1wP+UtEOiY8%{!f}d1D0nYgArP9RQH +-QW6eVGVLLll>{Da}0Zqx6<8YH?CWeC}=kJES$LhPl%)J~V9x6g9=d30mDWaHH_w1*>*xAW%?f#KVG3 +Eh!&_YZkHckT%QWJjg#OKd|W3CZOYsZGKV@6MaC2j|oeJCg1YNkIOKjw>0u)H4&koWmZi0aT!DD*xLe1F0BNVM +VLN4F`Wy`vm5uJgB#Zqskafc>B*Qa@z?a`mH>W%v0MruzMAvhdvB%6D%svVou8pQo{x54_jkZx4Cjls +O{3_iga!^z^=FRAxWO2F~;+S+~?wr>WuDXh)cr(P_j1;V_90jHMyr%NcIM-UVpSHhqRz3#Y+~f;vK-c~qq +392^-dIZqqfpVg_)qFgbOLB+~me?$wnX_W>)N?qdv$g5)1EbMvyIl(Sd7pGQTuX;w)*Msh*$1a?cI|V +DFaD6OdmhczIF>|$q8nY-W#Rp!hEpkkW9fDlDoo0jyq1WA;R-VodikeZu<;dkN-cL~_E~87B&9$GNx6 +5VISWnP?0->H9PMKhKx!+sO0I@wk2(*HLNRL3}`lNLKi6(+eDn_U->*-v)s=$67qQaZ??iKa`Tn9n)>4h}M1UR-VBjuq9gFgiAdnGD^<5xE1UCsgex=bE~LK#g>4t>~18Ik8e!1a!1=$gbx$ +g>o?5{y_{iV>)`Qi%YF4Ork2KPz33Vyj7w~`U+qRhp-zaRJ_wtZXwE*xZiN!PYxrOYa2lcP|!ZEpuBz6t!!k$i8-&wZRH>I+Yv`~se5^b^_(DhbviXm2ZpC+PndvTmM +0%WH~GKRz1fnZ*tRYB&R67Pm8s4ZeRIt21AQYJ(F%B@muQ3#i0Q#K%@?hOw)ducMfw8ed)l(1mO@eE}KVS9b#k`&-L#Rndv21!&mnxiWzXa=2NNbxCnf?^r61-frk~MOqS#b3Xz(S172% +FfyYb_v$CfTxdiKDbxS**kP7#wkmUk%=Q_{?fK=T;E-^P0Ueb`&F{;Ky6tD +R+kOw;tgvM*2kuX{Ee>#T_C{~EGq(;xq@dKQ+ +Xrs_?REW_kfRV1!BL9D(4DfA_y%NQ7(@t^*!|~loWRk~OI66X`sl`YzY2^Hdm#z=Zd}_BCU3i4a)+MK +p1u1N!R{t=?;+${2xZ@82KNUWt;eW6M}{Rk>LiFA;%>Yerrvrd_^)@LcczZ*_;VLC#dl~8N4tv4zAgT +?GuhU>QTc?}m0LFYo@Kj80RiqUa`0|w{H~XQ_myv}*}Lk%JtdffdqW%f_qEpcUTe*LS8J^|kck||&Z* +Ay{-5C0Pp|mA*1Cw%ze>FS2t3;~W#6p*^__l*3h*=KgcrBi>l@X^+oJuu!R!?`9;m`|9l}Dd`c +|DZ(5gArq)%UqN>;iJmZ|_YG&<`x^OslIvtMCDEwcDcl@t#zX0eT_?_>IV)4H8Ld%u8x@`io(egXgF4g2i<0{+Px_SyRd{F68A +Gf@TLSE>qqHudIOukR7>YzAHCLJV*2<;P<@+cA +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 +f2`&mm*ICO4n*#)4uO#QP?&OeUCz|S% +5Bcy%tef#^627JV{A0x30?fm|yNW3>@uRlj(;NQK0e5@Mycb5IJ>OBnx{9PXGYq$65Lg223PLDd|FYM +z&S+L67aw7!vff6gNsR{qu#b9Pd=i(kh^eRPSb2xCdi5om!CyXD?vMDPLuP(=V9okBbST*xOAWS(ew( +eS;*Tj?W+^0!oHmIf7DYJQOqx-N48Ky&GS>5+Ukh_YBh8~k_?+7-u7YLA4*T?lxxTm*8d2**&VouM7t +&sQ}66cA4ymT44qrAjwX2T;Y!yEacFI1i6da@1;P>4<`cGK(NCIVSR@CHPojML*8mk4F)u7lE9r6M^- +D<9H|1y@hGx<1{WNnf~(ssfaJLkPm4FK6oRxRYIX2z0#P+8WLMqlXrSzFh4^B_O#OUOgt&VCrQkB`jj +nUKKY1B90pg@LuTtP+{0@s`ZC{b^3#snC%nF*ZcJxTemEiIwiAYqk1Gyk0*5XOgiQCibNoYEL&4+T;{ +2fTd&TtY8t=1&d{TyPJJ=-)=b%ubh0QxRuCn<9!Af~LOBfK(S5KuaKYsu^b-3H-!O>rp0#E@%HlcQfN@kfC?9P +yWWt^ +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 +)qE&kHR{-xb6+4Zk>m8~ZT>j+ah?C +_GJ)T@&VO~8!0%k=zq-uNE#95qM~nci)~Rb>)iambV4xbKwO540Xh)K#^Gisvbm`c*_UV#n0$9q);=l +$tUQ+nHg8q63`sp>YG_73xqkghGxk3|Pl)2%ip1|Qs=V}_}UL-qyDv9_MUT#5ocyg!o=&c-+q%VNj8` +j%`yZiF>`e0w>WYmaqkWbpHtg7lv==2$FAl^Zlt{QuN|JQx9#W#pnnbfI1bthM +73KEHWD#fO{JeJPD{l**$;@^*14`!~j9xC{=ZFd|p>wAO6yX`>4I#+f;NWRE-3f`JFIC)F#+lQ~i^{A +7lNEC9Ks8_u>ubH-Z%%NKPCN>-D{&U|hCt%bY&r;mnEM63cJjibv4Z$PUzGE+)uxxl8*7kHz*Pplfc7Cq$r-%{wmp(|!y$~;n +9t;EAQ!Vup#`fr{wr1keN1XxiQzOnV5o06i6Z+&F!nya3$c3GC5``JR0HASoPux(cw%8mL=)%Jf`RpF +0^X(qT-i`CP?Hgok0%Vv8Viaf?#6lXS5xly>=;s;mS}Me(U1`EB`%XS8Bqp9?}cK)Kp%l_S=O8urKP|+9IMNW*c=51k}`xZ`|JQ(#5TvZOxJ}uBMn{Y5XpBpe$Mf0MSYd&(b+ceI1G*PRkE=c3Wy(PFlkLn0gT!zj8I2~pbjtRZttxXWA73l +z($v}Z5zWdBDyulbOy?`$-4Zd%yu}P8XDCFaWl21_-w#H~9?fi(f)clEG7mLBWDj{l28XFBB~8n%HpR +Ou30(1#Rgm?nf&6(Tk0gDfZ-s)L9xzGwys%+t^%U`?V0Ne17Tp(A#0d%qnTmaf4g^sMrHH+C1tCF-fS?UeVxNIYEZ$*X_TEgx(j5_gX*tQrU7Z2McCDlh +5k|zGGQiN!^(N50K!k*M(1*U|Bz8yNFCGKXUVfJ%d!ishcV)P3?j+r}_x3Wu{8wNS{c2FKO^RhZ7{$= +N9Ar<5KzlDZ2EF(5(!HP$&fZNb?+z8>U4a7PYl +(c{gcd5 +3-aPqVFu8BKGVoM@k+Dyk*L~ZveB9!EPrLrn&`=*<$^hcE?nTn<#~GX;X#_?_!y;VJ&w0xn99}C&<>f +3E5LCHE3;rjF)_J?*t0z@ +f_pkN#W5fXuL0wPF~gm8%b)UPFr_E?3#eS>!e&3Dpcw~zyOmcLQ$>@B|o6MMEK#ebz>m%n9%lDBFd{< +cvE(LG$^>0aQs%hzo&7~6BpIQdTcrtd88FI6zGJUA%J-z4^Wqu +;+y0UCv`WaT~lRwc)))8-KSBLh-Jow<`<%t=u(xe{(_mTU2IMSg7G8RB)S)_=Nab)aCz(sH~y-Z&Lm5 +qcW^>`p;4MeeC~;sQf$E{JB06@J*md93#$mA(j&)Cc=cq^XKglCc6)&6V<4$e0HE_JxN_IJJ?W +gr^S^4mI{#1}W@;QW1@uoTY|HBcTLF818Ld){Pa8z<%lkdX+3K$a+;^H|D!QZ*fDTW-WhsaDtR0?Kg( +m|7x{Ai}PmBjEih0OOa<>j8)t_t(EZk#-$B$6(pM8KN&z=P|F{#-nulXE`)}@TeG+Dxff$&djdK +}_LlAJov_}(Zk+Giu~htd!O&aUEr<7#pzX$hMthnXLf@s;U%+$rwnBY-5G3#5yUU`czb+Ue$^En~Y^T +XyUA{Y|zSUH>SK1Xwq4!pAz9-=mqRZTY%u-zzjmAJppp11p!F4 +}!lJ)%Q%k~&#Ma$nGvZZ<({KIoz8nBZT^Bj2h=k@J)45hTw_Nmn0Rn39VzUgg;`zXeIKHY`uyR>5edX +NiCVDf*XsY5Ju(@}zyOljhjkFuhQ4Z;bTeCI4AtGVm|AY@K20tfM)QNM +*}+DtzZ%Um(8nrR&(jsB@*HID +vc5{ovZ6csG^SyU}s1&{z0SKqBGmPxQG3;wH~*@0@^_LvzG$4Z{zXQ-#qARNgZ^KA81%?kDT%pIADV5 +?@uqK?Cb!q*2WEgr+ogsV;C7C6B{$Hg0-h-)TnfPQe-I*Oy)Typd`bb>UZxQeMW3n;*o5BwUsXh{T>i +W{RWjJ~Q%m2Wz0~hZY*dq!ABo2aGJKv5468b8x&HF}5m{qh~VLp6FmC#(5l_ODQM1IVR#O7Y4$#-ELz +S;1r9dDCNLCL{?9V4R>vs$3tNV+AhlpzCq^w1of|o%qY%J*yqEQ&c2{eiPp%E8{$T=u)6GC4sK$(NXk +#NUA-5EFf@3=YyFXTF?U*d@I-*=gI>tn;mEh^lS*Cj(pDn8rYbGZ_|gJk)*tTYITc&&bs}F73EHXAC4 +LY_wM=~py; +2NuiI1c9wfuxnKpVg@F2l%wRo+>Xv2qrPuZv3G->+Vc9>LZm+4F(}mHGi!o3qB4qfZ&p@sz^^cJwu1u +su1ck;QQa!k_A2yll`-bn^RAPYNTh+6p>W5)sd}en^!}yJjDS~ET@f7b}e}I(4%<1KTj|ux$g7q)~#J +%MCOQ@FGD(RAL8}GV9pC37I|dD$q}AHzYD6y(NF@(3rWV;DtU)sk|pT^%^br+E>p4(4&$YHT_3oMsYY +990_T)D{p?M3s0i>e;L}NLfP?DJ*l0mZTsw{LNpjt~LXx5)5v91fq9PK{*TBizw6zJ`x$#PhXF966Vb +;nns{+?2sFMO_*lR=>3!UF8<${`hG$NxZS6Xk$D}mV^7&BAydN>7-pjYhiWEaw7L)FZHTIyvbxz4Mc3 +Lfe^_ocqct!~v59n?tLHHxa_BGV)AOxZ7Ma({b8w1kp9~Lc#e+atf{FlXQf +7twX6XFbux3`C)YZ>;2(!M=wxVw*P*8ha~{{2}#@ZE3B@MD`agrV@p);C0lUeIJnM;z~}KuNN1mhSu)-t*z{=a3GE-=K?nb8B#~qTKgnk)3Dngd2Ga*}sJ +`;q=YrseLDR!(-^LjO_Q^`&$k;hTip+Z|99|B{A_nnD0Bc(A%^MjCL?bru&2F-H5kAI*i%ef& +1-h~Jgt`wl?--^t(Gbi_NP%fHD0nZXz=vElP5d`(1HP46t8*3Mtrq|u+V^uiA`zL;dI!gP;?Y!d`$uH +3@yR}WLh)$643R?R9VKzP?LT32qnTW=Uoa2LqZ%3{&WjbHKYta5bsQ8+Dw!rq6>*j`(FOuo_AjZT4{? +Nv3u;lphL#RGOCrqq;b|sv#04)e4tjH*=;)j)2$=62qI=>rB;3Fu=P7ik>ygJl +hC_^O{PSmp0A3C3g(S`UlSn`4>_$B2ZT1l``hbY5|)W75;jgxV9}HXEx3apQ*nr_v|1h^dDSv;<*6R! +7sk;Ll_}-oXY_{;CjM(V7_S-On5UeQ8fq(?LEzc~2`SkqXtsSC~F*D~mvjICAC9Azz7QC6>dOccpf*) +NQ$yG0ZzAZw%bzaJ!j{n{-}@=Pd}jyKy4b@YaQsX2D~xY_JAAiYO(mL6?w6OnWiVtk9SA!57K`jE8?v +HT8wh{^_q_q4*XjzdL##|ErIF3bwy}(noCl6YlmVK*|1fP1*vI3=sz#-3faqvD+yW_$vp%eBWW+f;gVO-HxK&iF%9j+brZ4`@ekO+$7#I65EUIMe)$CQL&BOp50rc!J +Y1B(H@I&u2J|(Jl>WeDIT^t|DkwH +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 +P-9Ez`xhH17S>Jz%F{<8g#A|r_AYml4yd|vy_ +t#5kr{6U;I*(g`uJv9HUV93LaSh1Rwdu?tH6973YWI6u@%8beH~FpA_A}N~ +<{T8~5@?}=vpkG|J;B-)cY9ysk)PCT5}#uF0N3-1?3{+a4W*pb>i^5!n>9IVu3Llm{0iTz&&NESh`s; +;Vi1T~z#X&1D8$UKZ&0~vm&;Yh_CC8i+7ZsmM1WppO3%C2Gpr?SthOUi;2%^femcht92Cud5csnX^O~ +b~6xlFgwa8AlT@@I{ZmQ_Il9iR)BRlQea_fP~2P)xaL-TonedfVv8G=OY5com*K!CxQTP}nzU9`mv0u64g42`oNJdZ=)Iv`(ky7_H@+DvN>c2^EGDBmlv{LE-D;hAS#y#UF7G{{R!!VuIZWaU0;t8Jv +Cr#GNWG*Po;os+*1|QFfQkBz&)ymK81CkjHIU@I8&dDCY#k&m`o>S4p0+J845X{N`8}_uZd@vuY1D8n +^H2(I#jB_cMNgbwrpo9L09%>L3N`Wzf+B +ptuC)}<2FcoJ_p&vV6U%z#F(jsCL(3G`!YondqQ*I0jmE8p<6ZHIZ2#G8-gvSTH*+LDVq#4BrGOMXEnVNYDO1}hzvX4)J)U*e2KI^}ELKYb#+K ++x%I(cX&Rj#pz(UycFA(VpPo!=uEOyeZA|3vN^DMr9Bf)Y3 +mV?XVB-nsK0BV**yP|eaKq8<9zAJ~lKRVv%pN8i6Qdc*yCa +_>OZ+JXWB8|T9PVNISA0J`29EdL0w+J?%lOgRw}=0o(TDUg@=S(D!6u=Pr`b=7KhDaDN>9*7oDw*%{1zjl|yyKZw<@{Z)VN?mVPE|%y$UyEoDMxH~P# +l?WW%tu-m!rg7Klvu96$eiEj5}Ty2ZsR74NYERKjbig9oXM_H@7o~5cs9>|&7-8N-At +>+xeWWd%qliW+g1>A6YSVHIc#5A +~U+zKlwJvF+|<}#;|hS)wVYf;aSnZ8(Se*=f1GVQ0hDAfrgDAFzAfd)|zSGeqC& +XZHk1H_@a~zSIS!m$p%6u2&SYgF?%DK3jbc?JsFyAf`j&m!jn?ZI=A-Ku*boubyfNz&a?5kx)XX=s=YNp`Z$ +FzBpz(l@|(h!lRBtDwgrju;fPmko_y8-CUk|joI|*a7~reH?c|ot4T44_2YOzSRqGz4$L!QpI;#PXKnGAcO5n!yhN!{>Ki9-)X#hS{4|Xn5*4D*l1}D?h978Ts8glGeZ=^|1meF9l0^!l +Mv&dPuO6t*MR{ic5?^Ul*Q`xrf)mG;TaTDXD1~a`BdED#7yllcVCZS)9j_ffcsLj6r!GH3XclVnY>&; +_>JnBYok?_gj;urw|no!VZMfC-R5DEMcMCLko%=}o?2j2-%XgTViQXcj5a2OrdU^1KKO#_Q}Mj$FGP7 +DriYs`flakGrs|fe7X!H#$$)7lfUCAD(at5i1tvs6kQ#G{`R=dpY^Hg}>26SG$|<43k|pNnjyn5mcYA +0V!I`+D@&<6p8e3sW2XgsYiEd+g$?oF(D*E{TT1sj0m((GV=6ckh1QF$pvl_RM!O9>5@Kk3Rp> +9uUo=;NQb7c&jPcLt-R0LEq=e>yu`B)a0+zDwL!AZx?Z1Z-2spj(^`|Z_q+L)DR7c0v5>F#3 +r*lBwM6FhUYNJ^Y24KtH!)NXzq0q1Zx2b$!eJvhKqsjQ<*f3w_K)qJ>K14h#9)9pbRx#^Zky&(i>pWk +0zP44=&1bw(|59>TTmPoTLn5fpaZ=x?`6wHmmXWjoHOt@>XP-Q+-rMBiX8Qx$h_`FNfRs)f0ax#`oS> +7w%h6eBw23D&5kig$~uggVMlvZF`EZ*nlQ*Qg?lOWZ|r^x;&Klu0(4K3b6Chi@+P2e|0VJWpH0}k9~5 +L@14GL9KqJuFa>F%4g6o{LSJRbYgi$?ia12lnA@cs=-!U%+rKP~!DpNdIDA8Ii>Y +C?%agli}5JJ5=#qY{)+$7~t;fl|@WHO1oWkoqS-+OSY|oW3*Yqe&(?G!hPhf$W%=z@kHsAAvps3D_}i +_jQ!+PaqIU4@?O|$Hd5?DjRoqKosX^#DIXMnZIPi$vT3PhBm^{rh%7Rpo^p7*$_nU%t0L`Bv1?xPyD=u(mnK7ocbS@m +R61@ds}@$1ZqO<(#imd!unrs;Jf~iO0XJsuucv`9IcfKJqYt#Jl~D3Zb|@`j7-Tu=zk`AS3!pFOEkb=I}Yd?1g%Oi*6 +?BMZU;5(K|ly(hZMOFHGjtHpi^=?T3L^ingHbeN1cr_0t}X)ZBzYlHN<1@nIo;pS3?p(k0jQqf)rgfVFWKDLvSg8TbR +?-zb9q|Tg^d@y{preEv0gg4P0H60RzT(y?K$ac4@R{BG5)f +PM~i9=jk#RuE`aQMYJ0@VTC82JUfpzlZCGI7PxVK3Wg@FgI4AVCWs)THiCev@6)ITA~1r8kxBy_uf*h +nHEL}ex(F&4FNk}RhKD7&T8_S%0DU93iGRoqIWzl8$D#ldy5me~OkJyBo^WB89DcjZ+#-Ysr{L +}1&kTypPP&-i?5p*i5%A$Ahrl~t6Vs|nn`itR6NgD!@85(?@|&6VY50yGze!C$JcscBZvB4M5BTpteC +w}J@PD}N_o$F0D43)^5(pHG;xtM^1h&IOgxKLCLL=lMiSSdi0s=q0-0A3$4xor*5aiGtfR0w35IMjd{ +ORI3l5RVE`+2PfLJoZc2tQh@v(M1%;i88fC=enJ%eo{z;2``#cj*VtB_9U^;#akr9pvH3??&%Qc-#U< +4yc;ZhX6tZAKg6r?Gog;BlOW$pbw|Mqt$4CR^l_HyDue54#;^3G|)%&>G0s&FZ}C-;Ojsg*!nFYc#At +*ywMy*g}0K*pg=0I>}P?LWBVTyg2&vzA3&9Lar+(G?F>xacLD7YT-@RK-oN8Veyajv#C^oI)=GRe#;E +y9ME8TR;`IPbe5szLub?Wjc)_xqqY21Vot3p5=t#$XMOW6Rm3sNT!FxHrzuEk(+0J(R(%=n$9^bwk)8 +KZFxE;>^pet@x$D!ME?F02ZP7YhGwR?&U`{vwRQnY98>s{r4Vi}1|KQKLbjXTl%w*r*3WU1W}Ve +uc3Y=)pQ=b(l{%wxE9VH2&VrZ&m+EACEMhae}UZdUl(tFE#nv7+h^r+bETn^U7yvVy^R!;ogswyzhG! +PL{G!djTbgbAK|0B6#X{&I6cxIfKMz4VNaljC#WbvK{FSU!WRnWv$8bDud}S6mk&zEeF$WPXz&MYpH%R(i!ti1Az`D(V~$mD(2(KOl7!pCeqX~}o?MK5;N!?JThDN~kPMXwff-m)$M$27IC-$l+%=0EOWyFQ$4V30G(=eU_S +$(^|DHAd!(&eNV#+L8c2bj?@A^#c)2B-RV#wyJkV#%54;T;UOO5fNbc3Sl(GqX~xsIuIYu7hyBfae_2xK`&WQ`mXCYfkkL$?3AQR7Qb?(I_i7CPY +Zm^OOl8nf60=fo;v$ZxgPO!waL7WKf*rX_Zh2S;y(Sw?!OKEDOhfu&YN3EqueCfVCUJ?Xp94RFm6ou= +e<-6hYw$EWR&pDVPs@73S@YI@Tz-xB}{I?9HiO3PYZ5m +n1jgHIW^9uszLyG#YK7#nVr75s`O~dejL}k&L?l8z +p=%`t2X^zv`;6U%qOXD%BG60lo7*KvQzS91MEd&n@nWv6ZyCe)>UFTf~m5ar18kyRh45WhGq=Oiu6k{CNBAbF3zzmb)Xp7SL3@5Icrxyc#}ja^3&*N9u7S+YZ3HwV}bZ+4v#;ADLby)@fVH!F7bbqaX)ULRPwvI^3n619@#(${%?%>1@J?&1 +FFUG0ZOrt$o8RGogB65Lx!3>U>@6>$5pRbpfNADeXkG3YxmAMkI2zAsAE-@2ZE4*HJb?xOw?^c~0MoBIX +y{bAPd-vNCG<^%p6&}TXt_qDJK{0sE`T;J-OycL&A;QNwSgG{^?TD}b&gQ+SBD9U?@Yq(~!vtLtZ!dSxK2FnxFFc;{5kNZ71ZV{^{F9{`pusx^=2yq~}jsyHQoiukkBbz(kDFP6Q_j2 +n09WB7%<74W@i$5+jc)!cVe^Lk=6=MIG(Ro5r9m7O5!+dnB(0!)6n{8`^BX4H#uR#`E9Pep9E&$-K(= +R1~7<3{JPg^tC1WX)OH19L@j +YKHuhM{@r{0A>`8J9#lybp(varNMtA8KMSu|dPKW}S7S$z-GkBLwES_1Pd|1n(MO(nkFD^|w9%jQ>gZ +s*F>*8^?g1I24+4wQpHb-Oh}d|16g&=dnD}e6OLi1;vh-K-g5*b70{;k0d=wfYL~*!?u}GyQWEXW~N(i$o47uIv+D533mHL(BL3{N)_EUf7nFNJ(`k&vpAXhJ-<4E=u +fsD3M*bQ~Zq8p1l}LQ>+5^HKUPXBdYIi#h9;(m=R9z&VN7TaKwEY8i<9-)_KGXpVbm7(UUZzDZlCwhQCjr2U(OX$gi@3Cuy1p6-VrN$!hntaRzX@!KSn=xxe{%Lm +s{+_@yr&RTLBc_6+LJ7up(1?s2=L`uA3=d9XDq=I%H*X`|x;~afkzW{ZzFv1Xod%0N<5I8V10B8cn{@ +>p6Te(Nwc#6s5f*fDUg_yK@}RWl-hX +k)X0ig`Md%FX!ycQB|tv&A@6xt%@d)_OXdaj;A2%NpIHRaK)Qp7TI#yQ8~x_lz^xMM&GWs}AwKH8Yfv +ZrYF=o{dm{4bmQksmT;Q-DA1fVhqs*R%>tcuCiiBn(h*NpZ##xML5wrnCqL#Zm*{h+{gK$-%S4J9?Bg +yqip|2C&tj~^1T!C6tLQD!Km1s8D=Crz4V>(X)KxifV|p0+>EZ>l3L$mklPt~SS9vTB +y<1whKHM$FPT+{UqbiNdB&v*eu2sHU9yQ#vw@74YOtd79W(peRl)Xw(+cHx7 +6We4LtAmP@u+WK31~R3+%ig+)#84!QT~@%yRw7T`{AG__@Fog@^n0yq#f@f#5JKY)#mq1}#%JhGx;1z +{78FmG`&wlJ{8YOlvtpHgf!_6cBq +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 +6r_jk24ii +ipV8gH^VIDcT$m2m=moyhl+^L +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 +i7u?0lISLW;EPOV)^o+#98LT4Sks(2#1S_ +a~q5l}1K;+4e=bi`4F=l>R%ozuH@_FVG@P?<;wjW`r_Mo?)N(l2!R4L}FYpZ}%rPo4R8iDh9bH1D==Y +4m)&;-k8oVXj8InFSlt}u460JcML*gibP&7uPIJ+_mOIBNA}aG6ys8W%1861xa^iQxifc(6zj>w +T#%N<$o_;#sWeVVc&8|{KbFwekK}Ap6y~Rd8M$i`$Nf;V?WEC|0OB{mG&%K*~hr6rYm!ep4iA6H6A +o3zo)H*J7n_S;*Gpc4rU|Og@b)IxeWcPt@AU{GG;l)3+ABo<@%s@*z16v38*T@!{MC$$_Q!ZblD6qqS +#l>#mlM5W7!w723*XE-6i+;4SEffm}FhoQ`h})O58nB3drke7YrTS!N5Gvhshb}$AV%BE$YI_NhVL^G +sChHuQg?eA8PYrJBQ=DByjKOw2?3tXcTiU$*!1WR?my`ry)uDzuxQoO#bm9gZQog!g0BOj9|+2>(3=# +{s;Fz?*9N`#jnRcnmL35sQCYcUjN10eg(RJd&?h2FG!X|F^a(vhFYn@8UbPiMgVOPWc>+f6+|flCFnI +m#1Qh+j*%5#fW9;WihL_FmD`XNkRHPU`rw<|H9>K}G5|!1G@bbLH +dNV7nq`lRz8Nn`{s09^(5^o?JHDzMBY=y87>GY&HMvnco)v05N|zJljQ#8Gz#i~t29KPTQz2N&t}nLq7uoJo^u_`^j=35O5!5sjf;g8EZv2&@$OEc0zWU$rB +wV^B=p$~y=ppwFJY(M35-2T<4hM_-L;Co7-y|$D^rd-v(nirXCS(s6uQu~f +L*X1T#0HRK2$=!SI@=ruaD5YaY^$W*$j5~aBQ(9;S5K4hLdNmbG8XX&+vw$Z~epu`GblR!FmKYBQ-)R +)8FciTM+b6^zw2&zG;L_;3tvqIKF2dc9GwNVy{EZF2_fAKWOQxofdRQ=O^-%E0+08ojxGLIN+(UC(V_ +U6NDYirvKRZn? +G42tN?eyVYFca>+(B?S%YHAw+u{FC>mnl9rMwM#c!^1u7;tX_etb^c1ln)sC)IRTFvVO~`=Nomy)>A0 +tF(o-j*g?8GLAHrM%emw$!~^R9E*&+Dj-f=C&t>Ha`cgM9bZVBa-}l)4jskWd$K1L@qgU82C@#3@KG8 +aoeW+V{FATNfie6ghvvXL@Jd`0=?vRmT+Ga|+b9vfK~dn2VxyMXft7=plaL$~eYq{c$9Wj_+}8S_V71 +vflI-^YmQdS>&nMgmJe!BnBn!9HMFA++DOs6JjpRKt6UQ(jX@;H11!M`!K#}Lr2v+Jsq#OVISBBkpZ)S0>)OxpjrcTYb}C#w?(= +E_Zr(9xmAZ<};_WM+SM<@7Nc*mruv$V9;-ex@ok&%Mn3-?8;K;TNYvmObMzw?u9vs)szwx(!E-Nz9Nu +P8vPlY;@y3Zh&hg3R)Uyn$-xT}j@=8|n9{Wk-Kt^1ZJ)2>(|M$vmVSnfnD1e-xlp0WKbIBi&YF42SJ-?;^{!CFT7*Ttmx!Ap-up`w#}s17cLqwcgAyU#TYtmk{(k3AuN`&GIyb;y +FVu`J+#aZscophJwAP1%&*J0h?{ZAg_4U8NG5?d>{)S_I-12*liJ=UM5G=|v7>1E+7>xlza2jPvh6Z& +8YK3HKJ+?AU8l{O(T|5a2H1RSh2ufFamXctswxmIH&2B$JHy6x;22}*=bCSty&BDnhhr34Nz>I3sI7z +m~w_+ol)MoQZZ=ra(MaS!1nP2M9(LiWmT^mD!k_TOaeh+*rT438~%z77mTV76sWv}u2%8&^bR2)idGh +rb>X9v1@UJ>QioW_7WLYDj!{k<7+wDWZsxhLyE%O+=Mn6gnxc>*czaJCYX3g4$|-5ySz<`J<5mErs +0c^W4?RZ2Jwol9PL;zIXaD})M+qfSq2_(7|;Y0^*X_R!Wb{gEQ5*L6?(JLkj1Va{rroaIyh^ezRG^3F +vI?YHIs*m7s>1jvXEyItnoQf=jCgFN|bm~=JX=r8;v{~)>meeEVD&q17oN~34@;{r=3LB~TlkX^YY>w +t6Z>*`kx8R@sCq{h=-Pxu +rlQAGaKogt076}Ap5)6!!kmc41hk{NxAc3{HG6OYsO@ugua?DN{u0Wn|sM19|=ScLB4GcKHj|7&0%Hgyyz{& +x`Q~9UQ4YZ_+P=a_}&T;vN3i@qu}*1cF>IJmvIyuk=}pCZ43Hpw?#0`;+ENjpBv`k3w(Gq5p%$(*xq@ +*Om>zS33M~Oul&$@g3?FtkTyNy2?;lGd|}A58i#o$h&{Pa{9Se%`$+c>+KeF2bMOq5T@|_2%Mo{cERu +d_zHJdjCGE{Y&9i9BHerZ)aOI3}l&N1os3>N`E0e>=E6ZVzDyPpvz)5>Dkp||XjS{-R{6fEBLx#NaR- +UYU*WD8N7_A#|%o|g*=R%&^-4zRiMbah;Zd7Y@7YQa>L}IafiB6Zth8^u`h}}I5zS<@K!eyvVnSLoQ7@u`61z|uN;ukBqv+$$Wb5r^P>6#`LrRAZO!%Lekp2v?`_@VXr%G02{~Pv`T;xmxr=io$ +R>f8_Ha--SeE_ZwgvsLqsq2lT63IL$xXOik$uQK*2jf;QkUm1HdG7xyovpfDD>gBC1%{kI1n$UGW+Z} +EU62{o!NHoap4z1h>uK+qVABmq1z5u|4rUVe|;REw?#A2JGscy8mAvFsjW|OzeY@m#XajovU>k@ofDo=d^*#vXl?ee1?Rn;P6 +Wc+h)MkxreES^FlumM$W%sR*-or@~rixwhxdWhi5ijkUd&Igl4A3(2~sy3^&*7sWQ73teZ7xI}c& +kXb90%k`$kRLp%^BjjAfuU3H=`bQR(E)1~?>S_5MT^ukgVeT|Pc_R3%_(xF!;A@Vr|jw1@ +mfIVC!s#EVAQl1?9$Q8I#-HHaaKC*bc-Q;^-JR=^l$U@1t4t91TB!+SlcDDEd~Lt{Mg_w~VjC*Gh55agFL +V+q*u`8F3t1B{0NJ&{}+txsv#P!0?nx{8NOmqmZ>>q$5J#8n#g!UlNgfQ(5PEvtN`-r6s9#Y>7(Ub2+^P=+`Z%$=wZBopv|^HFMi+n4c4qJt?#laV--|=c=t ++`8Ualg>5xx3Ol%9#BgHkYSkm&Jr{tH77zhFUMO|JwF{jadIzjVLfFtqRP^`jUdK~NNp6D)?T(Kd-uB +>EXkTcc0{-`uk{RncM_Kv<6u85mR +DKM;nz!-44alHhT)`5%{118p(&4+6xi665P7_-T3l_1JrIpex +MBHb3TvQPB40k#Rc)KcnSEbVy8Z}gEkyY%z>As;Z~W607E@ig?GGqirv?62|hqW*h^_MLIoN`2;!fiM +XJWDGji9BO#}Vtxz+6JQ|B6u%vt;-C5s-G=*a_Tlb9%Ko^w5%&0A +qIM56!WO@nA_JhlGGxY8s+wdTZ)9a=H{FzD$gLC6?0fGz8si7qaUoV2PurAjn)~8sVT%Gh(eEf1#KOl +V?}G-YLE{t$< +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 +x(%C!$!4c +h)#tDp9OhL$IlE^LK--V{aOTUu{B#U52ysaqM)fG!&*qdX3PeF<_SA|7Fxw_}Hzp7-3j}Tix+j_megTxB+?@SNrNSL}= +bY!KWgcx15}HJt_$7$Q7`8CzErbN4%PpNo9R#~f17JLHyAlzmwL*uO=!S(M%qYZ)F5=Ke52y=|?)Yvv +8AEsQ1drX(s5=-xU7)UB36#=TntEdEC}ijuvyz1CEe4Jb?t7!FJGAItx_x*2WTL-u$Ag~d!Od_4U3ln +@#_rXm-yOljWb`ofdJcd`X%4Xgvkv3};sv@~3q&%Yny^r%sXt+P6$Tgvup+M%%RHy-6~iMi7t!{+Y8V +Q>O!7sO9iSJ$7QltJVIvv#juzGGqL*ELZE*SAvEltWDiQuE#1eRDe!~{%`X&@Y+Hfh9Hmdhsv^{%wet +vd({`1*6z{JCyV-NHO*WbvDlSX49#TxWBVwe_IO-PNoDvV^pG0aTv%vVGzs+Us4Q6$9-AU=mJvZW&`klZjxnrr*6&MZ=xPoFGYa +_9X(T4?h)A+71!tZy8lPabNvy$t=>V1x|wm8Sc>T +17-7P>NGQc-;f{>zhuHW}DES?{tm0%|TVWiO<4-OO=Jqn9q1e1Z$?3GxEzZ3=aPKGg{`hXx^X`WI>nw +=l4>MOa1Gp;ZSrhF(b^o6>|HWzZua2AQoXOBE1kBt}&;YL}(CL&eEY6*Kd*@$1je9$2vo38{hJ?9Ryc +BBbB`H_iyCfZGnhS1zr7BOw^s?pWj`ono=u3T&s@OFbw}X}_1?JGtn)09-rRSTYQ;Cx)wDv414#(rZN +E9W$(ld`_b~KR#jzeMPEHVGN;0qR*S=emB#~nVE5mOB>hcKajCwIEHi)UF@#Sn)cmHvTwdFdn?%~r+o +1SUwjN5%uOQM>C|;=f5W(+_^kq217=~0srZlXz`yT4n0i&m%yCfdJ*TyXbqJ5@XLgnzD>)Pjs0LWjH8R=@Rz8nq1%5kyUdxzV{Ep`kQNb5|VwIRF4EdH?_)0001RX>c!Jc4cm4Z*nhVXkl_>WppoMX=gQNa%FKYaCw!T +U5_P2lBVzTSA^7BEl3H3e@Aq0j|4RIl!gYj0F8QYP*IgMsVOR%tfCS7>(`#gqNZ0GM%v{f$vSzChkux +xz4qGcet!46-~Mm==#xJ``F#8A$;Y33{?#YjN1uK1@xN^U#e08u^SkZqAMUm<9`FBl|LWPx?c;|Rcia +8z?Jp1i`~Kz2XYubJfBgB?{qtvU9v-*nFYoVOz1g0}d)~i!`_U(_?%&+UC;xQ!_q&%5KixfU58rQZex +uEJ|L1paUO#{K)7}5o?ES;5*YVHCpB^6lM>M>B`S6&pKYzS?_U7)z_T8_x_@5v3?2)#9`ZXT)!<+4$k +Kf(Oc^=WkZ@&Hg?ZcNZx2L@K_4f4c_1)v&?_T6cK7M%h=JEc!pJSNsyngrh@yfRS<=NxEZC~EM{M+OG +kK21&^zhC0=3)Et*Ec^ryt>98Q}y!xyT@mbzcOpzKi=JKuOGgD^GkH>58JN~KX1>Uz1kk{UfjRV=3^q +>Y|mc3_~79&KL6vxi~H|?<)xory@=t^>o<3gKfZoDhkyS3o9(l^*U{7M&v&ox9%D3L{`}p``{(iD&+e +b!y?TAOJ$t?V#A~mA_{U6rN=LrBI8~Pus`4 +b;}H#+_6_A*xE@$Dzy|II1*$4Fmn_pfaBhnV~LB^r!@{t{-jeRsG0{QB3O_{QT>`{vqBQGaY}8^~;v-fBY#-@WmFRdVKck&9Bk%Xy7lOJpK5e;}ai#^yITAU;mZf +fBNL>&p-Ln9(7^Vx?_w=chW`sEj2ee(XceRX&Dc8ZzI-C1t8;M&+fI9{k_umvT +fgd6|ekP|81Xq{-^&(r}Dd-X!xW1zYR9TzyEyq>Umh@v+rKg*D%nppWXlR?A3n{Cledt*<*C^%g2WwA +LxJV!=GP0zkeBT{2xEOdGpinKltF6Uw(Q2?#0jVzxn0&NBQ8#_{if2|K$9adTiT!@BP!Zzu#+}C0?py +zI|z|WAM@__3cZm=SyX;{d(y*+tK;p-jD00bB&|Mjs!3{Eg4OiVsG2K6q#Jy}TE{z5B=g{j!hTNWcCR{_r;+_v|}%K^^}Mlgds#yozo5`VE`u$Dg17u>B +BDO$QS0=INiF-rRij>VumAexlaD|A?At#*`RePZPd@tQ>nC4){_WEb<9|7X!9sof!?Q;$E3E3@zj +)LQxmMZ2haY|R$+urU`Cp&V_qJwy;QJrn{62c}eZC{M-qUZt{^HwDpMLT`zy0FrpFVjS?|kPb{Aal># +~we%K5wJ<s*AkyRd;BQJx-Esj&T-zhbMfXnZ(ASbw$9PA-Bxc3-HJEF)7#i@JN?*tJh;{}Znwr +i#~J--@xXFU9rBSg?(8=)M^0X2xH~;>@yQ(Dd0UqQZzDc5XY{B?&yRS^7CW7pi^V9l(Vfb(u6a22n;1sS%s +v?I&U)}0&x&_Nr%SKV8Z%NVv%fpjixuhgH>NgcgbAAbM!V;{iH}ET2KI2qI>!%I9HTfH-|T}Q@z=Ry5 +5+Z#N4G}fi^a%4@XsUdA%<`h(;NS&?cl)!V>>a57|_{bDfY9n&e4w*eJefYAzte=9&hO#E1WT3XUtcu +Z^?FRtXo;}@_vTtIID&3?=hj}=#Fn^*>^t4Kw|XKt9Zf@t!*p*8E$mSeCGsn1Xm;XRnTW_4 +lkdVS`RBULou!%$aQxjYmT)G5dbf?h)2q>KU`t_ULp=J6pV&?pJ#^Y`5;QZi~KkdqfvzbSq|yF~>5N6 +7w4?v-l8i>25G)?ua&ySl`&RIF4BEu<)7f)_xNMr`;N}x@wHM#`_C49m`IqX>GcrVjss}3mpvGi(jMD +EL3BdM{(1qoz=eI#8|>~*{SjV#=ONsl~|+bpr+nfabAn5jjpnV>F;Fwg^lwuY%iWw4m>OEj(HQ#qS0= +2Yn_vbc3CV-7@*@iSZ1J!BK`RF^HM%>}Rxp$gez9oJe-F;z%3FFzXeH`OueqHfcfMdm!jd((sLUg)>&j{B +$=sE3TriJ)AVn)It5wv0j{XAQ`h9kE2^h)%oD?cyK@P1(V235MQ{9b?_|qN|-V;auUXMSJA +O`WV?Oe!>{YF=~0hajTsSdO#B~jCBz>r6hjIF!u+c;&%AF +*y{biW*|V0CG+xEL&d#fu6QSj%~;x&c<4 +*b6Sgy724RW5++>aw;Xfen0DVa3<9@fg~SI26 +7XPZ*0Atr4wbp_-O)#<~Rz#3(wU&EVY%N#9`7^ +Hf-2pwi~#l+8P52BVs^J*TCqbtMP=18*1M6|fq6*nN#%bK&XCNE{*b1`+bXY^@I{1*T0hr6?D6HyPjD9DZh^cLMf_x#K75flBGIAfs!bTh#_RY6yUHD&cNuh&eJc +Yg0G*fb_@DT@*K-7SZvb2S9^>)oe;F78rJAMD5gJ#P!Q6~Tkr?R=pfOL=byMuy0d{=wtD5UYbU;)ECBOs)-;wAbz*GM!R}7gi{VO1 +PhxOp#kkVSJh1c3k7rN(umYEC_?Sw>tIIvBvGH`wKepc>Hy}_>Q*Ne_eQ_+E4}&ABO^kBxSG(X6_CUN +}%kN}kjLQ6}0AK--jUkaU$AaQxj7`9w5g&`?Zj1p>)zTi8xMcD&nO6i1-ftXYmjQ$}5{iST&OlT#sVo +NJ7@dfe`z?HJtXnK%0~R-Y=m7sVf!5gdUF3z8#ipyoi%Qxx2&fy#GCXT#$%w~q=OJ)O$& +C|ThpcfKj#^xP%~w!v)Y+9UiU$csX-#IfljB!wfMkC)3h8M#3ThAnRs8!>Mk_w_MElXSs$`LMn3`RH4lMHdNsjgw;!Og(P^>)>cpfOdk_8KcG+#i2ugq=wJ58Z#(?W<_V6&Dh&De=Pz +F2P_MVYf1Q@o^wQw@H?Vkya-D9JmI-(P@OCmrc8YVL6QIX=jnbvTh5yL$(u_YAO#2K;Y|UQX;@kmKo; +FUx9qx#n1?ONeHHF!X2az`&Ey-v) +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 +GlO990RPwuEGsI>}q#_+klBl$C8?@dvIKD=W< +deh9hxNgn^I}h;{q(x8u16;CsQXo~*j*tkG=h2(GR~X0!en3VD>xu(WRpNzUsVq>HO1RNkLqe;JAtUJ +|RNXA$ZM;zTI^_hAs!a`+lgM2pK_=C68hy>#_cvzRi(|-^y!NSUOY@os>No)8(bc_H4=sC6fs<%eX(~ +%bXj78p)gBuvWsm8Tl^3cDBPU~~ouPXj(&HQv9{ebXHcC;{N?B6!hAS}2vI;?ZpD^1CRy0TNeU|WXZ>3y3LF!&T|BL5L#-IF{JfJQyCLnb8qA`=%W*uKG?7?G +LZb(P?>b|Egv!Q#f1gha(V`PIB?zDK1R>AZ?03%|S^d0l6uQ^uSwa};hInsu +WdL9WRl>mR+LRH35ZugGmz(-N@B^4}D83z6o`vppI~1B$CrY}TM0cs`fPgangfyXg)1~pTf>yjx!^+` +dlgNZx;%aoSm6C8f@=!XVbZZB7V(YClQI8GkTL@rkpX9BV +RZb-D~$`HYEmR3%tQw#{egCz4C+D&*@blm2QEVSjM8%Uj+>jf2c;KU39Nt=vqA)-nBtodUcX@Gz2+yO +cJvorKaj)R|R8FCO@32Yu%{hG(Be`a#A7O1(olP^0F^kK5q~uE$H5FH0(5HvFw3jQS=!ZwwF4>a6gI-kzwPPs!! +!TO1M&saOkJ*)IAL9^5#-T-13hf*5&A8b`1#K6wKSoX?>bgD2pYt--0-=9wnsQvK55b#<@1b!@X;84l +c#2UcCW$Z(OF}%t1 +yIzGe_Q%`=YCR)x&yglSfwQOqIIwKCv^80eHYvy(g!WHDXv_!#D?Os(|UzfdDRvn_8Z@nkg{c$dEx?X +6cQL0OV0TMa=9srnaM;8)A=UvX^?8j_$QB=a+d<8=>&nqfyFq4*d>g9irM`GdBe-Q?+YOpVzU0OD_9W +_ew_Bn`g0%z17ocl=q4AUb=!rt)R;4O)zIQoQ9?)FDxEny07HVI=a`2oO=u%bl0ZXpH8SZy0UBFEKAA +9_+~9r=fkRcZI5;Qj29i<>)>*Q;XNNz(}n^n3(=sQE;FxKLDE7XU-E|w1qL(6ClOs)H|^f{Iy{qxK!T +*C=P~2uvjUZQkoyBWC1TUJ_94n>Wx>aXsxm@uE0B96oF-_0{1G4B~Z_7!WySS_LUryOn!-jkrUA17YQrb +xSM2uyNH}Ht7^Vkhl)k#XT{MQr5EbNPQ}I2HX^I36&z=N=dq@vN!D0kd9H`h1AKrG4u4QOMsrY=H(p( +>dd=2KN)^K`v!m3v~mIu`;BVTrWW-yGNUb0ZUTcepgB5h+#vlNO1>xx*e?1KwOh)Y)U+teSQbZ$|8yG +hqFq{#6o6bpbNNJiBZSjBO{GET>be2ZB)qQ4LQ*5AO@|N@H(eAcmcJ&Jx<4JWJ+6!|Jqa!2pAW4j`6R^2Z;{A)3*-&=3hQ+Vw#spd7zHtxdU$nF +PaVqQaziZAQr--Wzf)BS{kyeo)-7!E03QpeR9SNbgz}_bytSpa_&hwPsNT_UR*LDHA$54*#q!0#-yQOPE>uY{Yc<)yV|k~OCG0K;#RKH+G4g_R5O=|;U>;56N?m4G_X?%am!eBkO)I0zo436 +f(!cT;jxBi07PS&`v>2vwD6jJ6%8<)HpnDxmdlgooGAbr`c^`;ZN`Q{#%g>CKm>uLThLsl_mB|N%8xEYuaJ+Swv)P*j_$Q0L)vEE%HkV{L$WXMuhOd=1* +-6OBhMXFrzNbGk8RV^5Jk?J_05j%wNM=H3Tt@(K%8DtS`Ve;%Xpbdy>!_$1b^^-h*(b2s&^mWY(IJl=~gIOJloYh-Wh3(gC +_BZ0n6uNNTvZ5mg4COlJWe@0H8?}`VKUuvYn^-+4JGA9hbXeD}v;=l-StuX}B^VBwM=!d8(Ht}Hv*DW +3@aul*0963e#ag|YR8|tVnP{3*3D@G0xHe6ZP5>$)DL1m*-Y&d@?iJ8O->ADU&(K*+=Y}1nze@P6unF +(H^^81gN+58`wB_@~>uG1h^Ejub;3-otqsMAI1InQsDAF+n{@OIf-szR{Y{aYV%halaemf8FC0OXNU9 +bJ1=+Y=&Ht$lBnTHIoic+doZbO@Q#(;6<+`T#T((!YK_-2q(4Jky3!vV|JEec?(Lt(k2_ml{MvU(g2K +DRFqb6MD+J06fAVj!RS+ZM4XNjBl&Rmkt>g}~7>)o7ni2jlfnLTPm +-b*#|Hy4}nna&YGvFW;sqFXNYzTwuuBmVW +mw>7J=q<~EF=UPB;3La7o=(YS-9dHc|*AU4mFQEk836xQgrxC5#Hc!y +eU88Ry0RTYj$l#8h4PXT}v|yQ +F>B{bx|GH_eL~J<&vZ(wBG1flInIe(&J~oVYwl#+%>aad=YTv`^GUyd^IA2ht?g&CYl~3|P!#fzz*Mu +!BGni4<@AFlS|7lpL4Ks1^)3bNMrLuZ5FJ!!sYGEZr+ROoRQ9UjvcHj2S5&vy^oGK9H5x0}f9gUj601 +SMPo<=5H#)(H>4YOTQ+d`Ue`yBa=jTMGY{Il-CB5w&t1He&HQ-uN5Y%H8oD0GMzdaH%C4JuRjdguDCY +`Sv_)?AT=Au+j%Pu?H=5Rr#m7k$}8(3=O_~OZf?uwhh*8%QMJ~D5N +)>vAw(ZgLlJ?-_%gNI2H=i^W_|ClB)Ku_l$2Y5Cw%xXVcNW4&Zj{c{MB#UgG6=x&ngJ^jZpYxlQni&H +G-duaesex|A1O_wRIcuO;IwaK-B@y@a=ULmzcWpiV=^(u+3=D!P{pn)aMDT!y>Zc*cuEz65Z2>UVVHi +fZK!NV$vmoaW_=pb-fuE992zyI)=cGnHS*k?~F4>&(%!2P_CVTT3OmS3-F(&Lv~cmw#nnk_t@;axxMu +xz)Gp#=UAN5yli{bX9;58HQ&cc=(kBKr_GBgPOhHo-=hwVpknF6Tj9q4}3ok8iq0R{iwe3@=#oL)s?W +po2OJTMbC}8u`Ua>m!KD> +_ZwMpxFSh&llp2BCx>=&A7BLE!d3!+}_f>#obc@rYemNhnwnhjiy +{}ml*xd^55?x%F29cMwJ~p-ACdnn5RVfv)3h%sBfmt0(XGt1GknJXiYrp!-y=o$T5{2Q-bk+M-@;h^I^V5CAR+n7HRwXWRO(QSD +I{d6Z^bbSb>q^@`c^LzsLc#&L?)`Fk%Qwu4Mg#^KUJY}2%OR|&*U}diEN|O|FF`DO4*z +Fr}5BhJRL6bz(jAvAvX*xSjVrAm42OXv$&~Rmy8cUcK9ttepScmojh{mj>ZcHBv+aTa@mrH&j(YS-oS +A67rtb9o&V_@*sdN}cOQGQYuY29#SWp~E@QD|c0F{;WR#4XSAVJF;K~Z*Soh3{=YN$DDaJs*Sgx-K(* +F}xEnsz9BT!31>$uw0-@qk9@^R$6L5zApc{+nwzKgAf!Yh!x$BUHEi(9%Fh~4Pzi7mfZgG+F43UOfbd +OF3riUkyld4$vhrZU%lJBC*Rl3NZqwILPeJ%6WPpLAaBa<7_408M5ou8oz|VAv1ScF!_$AOI?=f(Hsb ++fa}SNE-@$pij9{rUxx9Pb{9_v$7!4k^% +pQW)~D5D1>vIJ~GyrV=**^)Z&SuNfKIJZOm>Md+q@DVv_8Q<=*=4@x;@?d1} +b>#FkEyPvs`Ez7H?oKw>s@~$i`dfS&LWmTAAt3H~1%xG<8mXkrlZVy*F10@$N4?-tFs_^bkO48-EaD^=M0=Y +i^OUyU9UP2VnQCqhFx2E?;5GdLmD!cK8IpXwt?V4HFN3IJ`ZETwLF>Cw}0#RKz!45nR*wNLNB)LJ-_+^7r!`1`3B +_&Do{3eHJZff-kOqFY-mCCSG9>K`;p0nhNTNX5AJHPhVt}-Nj@)h6Ey}tV&U)1^P=KlatO9KQH00008 +031s8R(v6Y`a%N$0OJM#03iSX0B~t=FJE?LZe(wAFJow7a%5$6FJftDHE?ooVr6nJaCwzfU2oes5PbK +qSi~s +%cI-ve|7XL%<)HWMUT5OqSR&Jygiei&9NkxwlAC?I*E<;R<0|w*>dea5h0og`<3QWZLBQmmY~p+H#D#P*63sZuu93b6}Aqp6_%NtDf}yhJy2~b +%7iA%xpW757~x6i{5NBPFHJ6sI)o~nqn)7Ivn}1p!>8$z#_XV!o>;R*H}h((WCrk9W~?2PaI_0Cx4k$ +u3_{YQ5E>fL@7;YMmdJ;*U)VZC=tH-6I_=2VACLnrpj?qsSX%WOJ7Ed&$H!%qUkeziIOCmE}kDy3#XCA{0>aA++hWCLRVI3Uqd(uCW9pY3`Eo)jY +o^;pnf=7Ob2O7!&yQR&7)*7ikIUkq4_eI&(cAcC}lob9L&6C^4a17l%;`_IeQ_MJGB0c@j3`pIc>!YW +6T*#Y!nInBD?y3%}^P=+4l>`#n1_W;celOY?|MYb6p{BH8cZMmSkME&kGTj4Fe2+QD1KEAK%0yTobj!6>)^ +&x6m8sv2CTuwo>y681FM_$V?8IBcxo1vmE=KHETG1te;fM%YN-SMmA+X-)Aov=gPCD(bN4ZovbFa$HB +PKXk?^D3CY*Tl9*+`wQ;E&5IO5Q+< +D166P)h>@6aWAK2ml;P_Esz{)OMi>001y2001Wd003}la4%nWWo~3|axY_OVRB?;bT4CQVRB??b98cP +Vs&(BZ*DGddF@$kbJ|D}{?4!HOX})i0~j28H+EjCz{WO-4L)8fh= +U>#JH?3(poL1G@A6kd9 +;G@5yB5O3PH9PnIKvtH^>(Ik#NebfuD5c`3dL$D0bDydkL!Ovtx{3M_LfVzAP41N`YvJzxI;V7mAGaN +P2Rsf0~~g+@%PGJVFHE}&|xD1T9)>e<;VKxB%SspdG;VcCE>A`t#JVTUKV@Lc7~!3@XD2ZeKt5Z#&nS +Gt$Z$d?l;5q79Zd33)}W6zDw4^ugE;G6z}tv2+9puiidIX3p17T%03(;e2t}rAA9+63Pdr-= +7d$j`Z5)Spt%N@bmNvX@_32gw*eP8LSNJ&1{cPY!3yW{1CEP%e8PJr+g7Ml?SG;5ME03&o$Jw4#BaSs;cprw9 +bd(#K}+rrqyRt@S`3Yn@K5)q8jiSy&pg@Lz}|CsR<+CY;JQUA4f*0dUvoT-;zqt=_zC_8xfmSIu6l(e +2VzyF)d)uXTFOi~en`L-+m8eY@Kz6Lp1HnwX85W#pBKhk%@Tu%s=NDV-oZ`UBh>V1tfLWAmGUn=K*1C +^8Wu)5SqPbUb&Y&x<8%gT5v?B-c|#n)?#m0sB(k18|}_zqf=Z@!q>MAqucyXBR=?W-@K^Z8kfy(uhXped(C#s=+yA5m@7mI#mx +HZr!_YE7auxXRfe-kozduiO4U45Y477MrI^i7%A|ZbGe-5m;tKI*z_-#X$oYlp-3$P8Jvd}ZngW@H^ybHS2KDyo +ksVjeS1l7saiQc(E{Cmr(rxax)`gJ&(79kt+pPjRQ1qZv(>!o-=%?G=JdQRhGZBLHOesZfpCTeD!rqY +=ZbJ2{Da(PPIU|^bKvOs9|^@}=J%O!EukVuGQNz0{MsFqqCkae@5mr2Od(Qo{#N9R}1{(4Cw|6Ih?+k&P>pJEUhs<`%( +nqc^uOn&CHQL^zw5t289BmD~x42)(nM-tpw1av|$+$Cis~6SgGmx(b0T9FHgeWrtJBnqp9zG5ta&$a8 +~CCxrvLL=`ckCp)Q5OB-gsJnm92uE(pV!&!se~3FS@8aO%U(3_Hd%Lw7hKM-q0l;dV@1nNA>*CiWC?* +hv8|P0VViZJG4Z;V8IlMYnKZ3)h}Kd#2}6=s6q&3WeneaEc2*T%`mgVkT$~!%{VL%n`ekm%>#&e}*J) +FAb+#0zMpi9(IrA%yic=HiH<}K%l@+Ognk@{mr7u#X~v{ObdNVKp+AtBR&dygM)(H*<=uQsxk5T*yCE +C2rjP1sNUSbxTvegyB)By^-u^~o4Tk~oQHMq(_o=QP$d4vJJqMdrwqqEKV`jP6uv7TzdUF +?>b4O|%_l+E`FzM}EI$lGC2ACs2U1x#FK}Ul)MTd1<(i@9uKxA?E7w2!p3>j?Tg;shSngfX^Od)wjT4 +xIZ2cBmxD^=tB4oBa?lAF?LpT9sxPMmAyFQgP{Z%nSB-=q@PrlLp~ex`R@^W!J||L63|Oj_uju6V%~T +BoUXFb*BhREcO*GvAHnG#Z$k^WX^a9d6--hpx}u3`=Yt{t$HB#@2 +5d<_wFvrCqW~8)J-f$!$HKuIvCgMkSQQS0Sq*%*Gbv3tJ?LXe8G$tS^EkQ?7YZCv-r@>39l?D3cu_V6 +%Tu4%JMZ;w)k!Dh41V0z^i0klV}m +KRrscr%oOnOdR2*Qql7JW%(jwpbpmRkuT<#cv$86u6$5MVdhH}M^31Nv{mkMM;;iHry&rCRNb9UBPk~ +2B)E%PuN&Wd6-vxnP^!7xjO3EJ42owW^+mg6S)$OhLYKt-_8mBmWPDnj|1<}DvUxDMGIu1phm6pu2#{ +K7`)I#gIr6S8bbGb&d_Lc1Zj;c-|AA0Td2-CJSKn+G(RIZC2oTfylU1#_dR3dWrOxx%hWUJOkq$a2!+ +$kxj)THi#n+UWeY{$Db8|-jsGAY`C<gUbIOm+O`Nxm>Rt%w_!m@;8_NEH3ZEfXeq*ueb${$-cqhWg@BZ_ +bRj@^$Q)J{<=wkEb453^WqCxo^gwyNU9l(u_k=qds?*F`ck=zH>vl_1BmnJBj-=Zf}zfRv)}{Pox*VN8tq9oiMaVAxC%zszfc=krhw>A+&)@$1Sp7E +-=w(l$F!@bT@kxe4G7@Tu`k>!FQZcdh?Vx)4TSi>ePO{?ygTKDaimpRoPAWUXtNXs$eOlp_{iW2d=-T +|M>VV+d{e9L?h^^pD>@negimg{sfSe6=yodu@?RBUXX@%rHp-|I%N_1o#PG?uyuhdmEaOog;RgJ%JYu +H953$}3(EHGZs%j&Mz^L2D3A;aH0Lo=C2*il^ZWZBESZ1tm3jA7DOTBbU +6W&lYwrv4e*sWS0|XQR000O897^_9G~vD>zytsQOAi15DF6TfaA|NaUv_0~WN&gWV`yP=WMyAWpXZXdEHfQZ{kJ}{?4x$U33zt#D%LWHRMv2aF9bK2Jxa(6h+ozuVHn|F4|oua({h +i{R-IRMe3(o{$P)1o|)&F+403i{ROwfyRi$C@nGmKhHyKX4*rHSz88%PSZ*my727aDI1FS!foZsx|1i +!8zVCLCU_LQYfzKHg27L5!8hPkgFvBqN8-1o+?x_M9f~mnof0r8VlRZ6vWm0H-RePzD7X*fxRH@xplo +%SoI!+L)sfe;z`xsMg4KxQW=w4m@fe^Ls4)i&Px%JgBr<$r~8l+4HQW(Y75z=hxRu3%z_eA}K8RHwpc +5n$;p#dXd7MraU8Gn?Dv$Y~BwyK4SQqVFqFId<$#4-Y(2v9U&I)z6e3=k3gDiy}>WWd7Mnj#S(9b2`b +YNvAz@7xtksK!d+jtZ)f%`94T=40@L`BZ2MM8n?N^tM!LWD8kjg}_K6e4_3(P=?=a?q{krTHuS*&9h~ +QZNOePiLv!#H}^KMg+<4}u^TFnbZR9inFhc_0=q@+@c{vm=nIY&tSLmAh7oTg0{X&_@$&n0wS>O=06+ +TkdEZ?=T%#{4jbE{UDH7Z5aRdWER*DD{W8nyJKb#M~V?_UUJQ*(^Z1tn@(j6`qFq+Px53~M!IUcMg{W +;85^VxJUbO08V<`P>m>qIUj4iR!EQOSTB!njVUKVW+`7RUqGl4pu-_9?@O0)j_mAAhKaT#8M?7eh)xu +YrXiq-n#8VmLcEeURJ)> +IpB6X6VcX=tx#Lp9o#-zXGOxFt;@$1B`Yr*|^2XDM&9IObFM*ef+wun#_^2@rg#B6{RdDd3kI=)NV&5 +%<5)hU83KD3ML5C&-SLf)qO9)_W=mq{sHG{MBMNi0n%dvVaPop78w$n!OY?krFAJ6WbXK=aAhw1$Z{_ +|3CIQvvTf3N`q_*tYbqxB-l$g)}wvbsoDO9;-^H4!`0LK@UUkbj|RKS3?(v5oX)zD-0i6!kRz1yD-^1QY-O00;maO7>O};>Tb>2mk;q6#xJv0001R +X>c!Jc4cm4Z*nhVXkl_>WppoNXkl`5Wpr?IZ(?O~E^v9JSZ#CSI1>KOuTYT>3pe0|+1lDU=H-qdFheb +Y6p)&m%jSr%Wl+V)K1oi({`!4dHrN4@%j{9LTd~w?bwAzxbZbsdj{n%_-j~6M4F}!cXxd|+hvV*V>>1 +gU$_bmT1RHC)l!`~J8wY|(!!F`KWE63BrR2TP20Q+WYa=WRgcZJxHS;0rRkj)iN?HlAb8#=CI1!q~A+ +twRLw+Qz@p&S!v|gu5`rOJ`8GPy_*6ss}*=4M=bzci^MZgvtr}6MAu1Qz2!Bs2EYTY_}dv?}>ilgEl> +qHTokgQ=7VT8UHLFP#}R#wYJ3jb=R-o^@J7hK=5OBpS-T(c&Fg_hZvU2g0uR!(BN+TcGP#k3#q{B;QB +00GiSE;QF0LO0YxFcXLN0hYgKn>b}YS4@jQn(TfcWf@n&X{>R69S1Vp&{C=b_)BhCq1R>$@|V#S8wvw +g*cYLM#`Tx!B9cB152Y`Z5sVv_(3)8lQ1;1?X>JJX$58L!f6s)(KHW{>#|nGvwYInA8XNGH)wm`55$= +Qz)?xI9MF^MPp7f4FP{HO0zvKh_( +azmj}TDiuVE>M4qsD4ON=6V`?r)nqpbR$0C}b{WQ_2C))KFO%_vN>K>8%#f>P%9o-qBcx!1UFvuN6;q +3htW*Z0S#L7x%m(98XE^^ho}5qTmz^0cvX8jc^W$|QBT=iMs@bA?&6|I8n*YA}+x72{@6MXPKlb}KZ; +HkLWPcTV|EN~#l}g2rxB;7iFsH(j1wywgPUZCLcrxo=&E~VOlO8^X=eYOG`};51b|6AFpGy$dd|opm3 +L7XTwVa2}oA#b}IQn$K8;wW3I%|GnqgaWyQ%OJ4Yg= +`=zfvF+?uC)--{}g42=XW|HdeqxgxIC_HGP|GnJ8>?Z{_2|!eQ-z?4m_ +hZ!=i+JVK_oL_hS{xKq$YYDU4!n4^*6aXSpS$M*3?3whjsuT=L9UXvcF0L#(1rZIOmAW8qedyC9!cut +^uSMYV>4J)@%hwSQB8Q^n~jqyML2ecwE+y}~>RRJGz+sOJx{4$SLpbf1Nt)oOM3_c!Vjp;Xjgh^fJL! +gcgL-*}X)_(Iq=6KYBQd$(fPmW+17PYi88{dCoU(neoqB}UtwU1QQAnn54cm~M!AMTFcsB)Z)Z8vUe7 +(0qYLh=Qj%WB;_nHD! +O>@Kl8U6J6%GSu>OAY^kOos`QoP7Un)Z%P^MOw8>lqM)gBClU9v@d@q#pa^qZf+b8>zLX{1C4|V0+~| +bn66XflZ+tBi1o2@d{S^yhYT-2SuwEYLB3|Cn49e8Po{vSY)pA;;Up{teu@sL?JSL!7H_K(`;ATnyMV +m5`Zbad>xr48y?O7lx4M+!2!*r+oD8;N#&}S$XqU8W(;{A2XO1LIcEY7V<;=YmeTlxcSjYEb{q)+2% +N3Pu#VpG`8Q~Lf`FeRydkwer&sfqGWkOCwWO9kh+77nxDJ5%+O9LWdZ>X$p?Yg&4*7%Nuf+KIRj^06C +CH7EnO~Rr0l+FB^$`NED+GtnRW+*(r&{&$#AisYK^f2Zad#8bK%WS-|g)Xkx{K|6286tAuih`o}vI^v +(M3zcFUl&dm5ql27xugt~d8mJUE*0d}L9r>R0y&gA8|5L6(jHgdP)kdSO1IbM3v#>8^x-M>X&uenMdI +TA&{3STv;PB+Xu$mJot}T?`p4-lvz9wTWq;o-RQa>4F{{r-}QQgj3i4@isq|#-zfWzH7aEyI*@dQ$JG +ae5$q`i{ca-x`SmMn8bYXO5ZDC_* +X>MgMaCwziVQ=C%5dF@t7_}d+y`{ObtCMb9^>mcdF1nUhK((q?6*7qf);cj~J9N2Uf6sP8NTIv8s1n4 +Ud7gPQ^PCh)4djRkuym>m2eVe8r_&a!o2Fy9WdILvBsXmK;l2R^%dPR;b+IQ7@JD4*;eIrNerxIkP;W+1exS9>ui7TCQ=_!q +QRim^vRn{sD-+<`H$Jq>-~VG~$Nq6;DDYJ(XK6W`$My$Q++xh3Jmyuk;|~T#JlO2oYMciXPT>q4F|+P +$R`mGre{!rJ8dxDzz^N?3~uBpqS;Pc_K`J2N9N7p8TdX{47P ++_*?JhX%}BtyHUwA}9x*j71w|EMABlgArRQjeCA~>~`{MOfel +C9Qf}p`GcuE*^!A(cJs$DHrO!ypMvLcC^w@eg9^okWSX$*!6Q(uJs1Z_@Nxw~TksgtQMG_+Z(2R&Xb9 +i@!CJX)#;CB^!q8(i!(uCR7@J8qhIsT|@MdI1#v?DeO^0~F@;L`L)@;Gen8CrAZ!FVN^OaDADfgg1K5 +UPTK&z-dI=b9x#)lfqxIt#G*>fp5Lv*>wAq(7ib%fk8sOU*W$yv(-jVGAF0C5&H1Algt3mox7TR#F`e +;7$V$EY+a_WN1z&cl?+yl}yMxaeL%}Fl{fu?j9PK?` +(dG&>d3-L8v6>$`D_MM90BxgxkM3H3}PM0?h60TRVYF=<~T8=<7y3GufwDw0MXm6w7Tf}~kQ=Bd9+V7 +UUF{Ym4dOYiF_NB6mmE)XOxdqZ{$g66$JuLqg%Oc_4Xcul%3a?qHf8y(TRAD!QxFSvz6!KN6nObS +m(=GMye7F4H!d?CcFaJf@RBX{ai73yjD#n&M@GOS*vTtBttOdg{2GqLeT=-M8<0aw;((Z|sM9T{NUO@ +>AWk4!Q=zi7t3^%UuTG_@cTMqB*y>e(h*F%~{5$)8nQGM1|X<+g;P&36;YZPKuyX#*2E&r`_>8=A +02tpj?xAmsTJc{v&HeP^1=Za=TZXupreh=4S +Qanci*D`n?WmU~I+a_}Mn8bYXO5ZDC_*X>Mg?X=8LQaCwE0O>4t242JLd6@pzh2)XRA +5$GxHJ{Vie*2@^9sJ7CWI<~QumHhkJ&6?3tXii3Yl=q|dwgv8;G8<5>vz}r3xtOi0r&;y#{Pvi`vU8f +UOx4GWGK2VC!LoNGr%EvFFn}`bt?UHJ_=H8zjWuvv+!q6VxS3DqCA?E>e+alCARP$S+KMfpk;g(H8jA +B>Lk6U`Zf`YoE_wa?Uv2%r*4?00p9yxbn(YapF$AcrjK~Kg(<_Qb8A`P)h>@6aWAK2ml;P_Ev>a#sY5x002Y>001HY003}la4%nWWo~3|axY_OVRB?;bT4CYIW#$Na&KZ~ +axQRrl~mhq<2Dd|_g4(!7aMTYc-sQa23yo|t$)M$tO)NzkB$Yt>^*ywFNxBZ&@=2P@;h8h +TX*Mq(x{n`+6B-Ts@g$Auel+br(Fd{3Mw8}Srm2-1sfD7xSu;sTh4~?s5|ObR%3zBc$IzjcULx{=Us# +zPTQWKM3mAx>uy>i*F-%2KYMBWyjdu98J7f1h0H&F-wLP;eJg;e0?Gb;zO4xw4t8mrUQ>)*m?(OX#fV +dbQQBNsKLad{N9orXP*Ol~*_ExS+Z*0r8Kf^*a7WO;Mq}o_n&^3XfCvRw0`K{51`XP;yD=TajRLU(gI +g|TW5WAzwl#~fgmeJdzn} +$0Qu>g3WEuN(};$^gx6L2Jm}z?}#P*;qDi<4i@?pb&t0l5IbZnwS*7+(al{*Y=d+~3f-{B%;=&7=StT +k^&WN$?ePIX6#9xWq7_r=I4@NP2#BR`!}-_gVotruGkxnNNpCWLzC$dOh8O*-kz}z`62Pd+3hgTp2f# +Q^`d^XJyC05*^XI^RFq}`~G^N2bp&re8$$Z#fjCu*p7RhXy#t~7+Y{NU7|$_%SVUe$-{qKBF#o4x2B*d+X{Och%jtuV0cCGqW_dU +ym9ofCn|>>amd5F&>QD5ZiUFUQu8shzxSlUGp;>{lwuVwbL@B4tRVFveq1Uq?<>!JcvJSXz4x5sTycV +)-TrpFOvlUd^dTNK8jVZ|=W27E*1C*_b%AYx*~n?Rlvp~;Wy`V3+jRXWO^oK+AC4=rhFb0D6xTkxkZ~ +w{2~uA!l-hbv@tljzI-SR#Yp&rHiuxwV5vCAwUq2-sY^MGAyz9tefLHtmtUj1KgyuP0);@aA^DV?ugy +#K#=3hQ;>^}>&*uEadz4b5j3~YUM((%yCr4|LBwFK;0O3S{qny&UWUws6mgx-{5^KT$ec-%r?HU0)rO +9KQH00008031s8Rw38C7UKc{0Fwp)02}}S0B~t=FJE?LZe(wAFJow7a%5$6FJ*3ZZF4Sgd8JfsPunmM +{+?fP;uA<)MR}2?N}EXA6g)ywHDMB;Qj=WU2-ogx2ZqFt-^Fgji$EG$zQlg)yL;~L@$K#H1)&h27GPH +hk!;q6R@?&D2#vvtc3L&dm1?ZJQm(kJ(87k7cYKMxAQM;+6c%Vk65nAF0e- +fy!w_%vs+bpi|L#lQnPu6(l*k6;yW=V?B_-sLpjrZk_wNhL{>mf+!^L!Za!f+bNF6&bsl#%#i(u|Ms< +I?ZR{nB^=@!q^`lx#OSVG;Gg3cH*$hbQXn)N51Vs7Neh+4(j`;VeI|%CojVg^bVb;_gHu{=X7WM^i1b +z%cASTRIA%sE}dfbTRnZg2c2#<vXCcpK>8zv1^6V|O41YH$ON{F~6!l7}>K_S;&Y+zl+zkj`l73;KgisIE5OQkVny`h&`4eSTXa1 +C6%P(hMk31Tt!yPx-va?%4}jyOi2;^mYYmKko!ix~h(L#Ta?x$4__tMbvIStW|}=P<{1wAY@czfx}0O +Z9s!|>eM@*0}asUjiLR=^3kr^<_I)y=1Ul*Nj^(sAX250rml!WMJ*L*$@)#xNbS*t-efyTj!sX +vZAzkINN@7efqqnEH&??ncEGWJJM7#&lcQ7L&0W|Q=?8xSP)h>@6aWAK2ml;P_Ey*v2=;CT005>B001 +BW003}la4%nWWo~3|axY_OVRB?;bT4IdV{meBVr6nJaCxOxZExC05dO}u7$wpPB;tddPP!zQ(-C44w_ +p$uRk^CN7JCe$?8Lg}eT+`yNjCp4ZM{x + +Rr-g3VI);%4;3M4=IwhLyGHMafjpCNjwrfu1Dzl-(OZPU +rUS7gU-oaOt#*+j7JvNCkCfZ2r{El?`lA(i=#q8>)zODk&%{jev_3c0t_J4+5k@Ur9zVLs)B!*GZEQ$ +QM3%)5qb{6gvJheCUkF9e?_KL%zf`ol^fYB)(iFoPen+#e~^V;sh{o$K6MY=-hdIZ~APr?|D<-olKxN +976|2o$=J`KJ`0e7(IotO@q20;Gu6pE`r41&S%-t9M2gEtvowk|KbezpDGsM`L1ykl?FYPB$7T7#>@y~^u*|7a~)h_kb^^gErrJqJ5fn$&k@ +H#F#QflE9Cwjyq+)>OqLU<{4z3W}W2EU{PG3P{@nndZsHYFW+&|H@_w0%l8_!u5iL1RB4rDcs(rtnAa +7q*Y>M3dJK7#_l!JDrtLrk+V%d{SjddLBMHA2SHt95;tkThFVd?_%a#(w +mgHhsO}Y@v5RZ+Ct-$_TnUS64s{zlD#Vwr4bd>G4h={BoE{_tB$m;|3FNFzS0f&%H0xIljQ5hM0}Wa^D_dNPAO`^Fp;QH9-Zfl}=BeAuUU +pY|QbQ`RWcsaoR+pTnz8(4C;D?_b*ZP6OV^c;S}%{Y_hs7%-bHT{&1F*b+4R0CNtN=M%Cr}k+*xV3XVG-567ocIU +1K9Bi1XOE2rb)7TT5GMOzO8{-pI)oy_)*>Lue3r@_EI8M&*_H2%nw9{b;6%9~E;it6mXky&r}yc8=5k&Ab(w~ANRTfac7y7klV?88&#Eao*n%MP)h>@6aWAK2ml;P_Exp?*ZFY<0059L000~S +003}la4%nWWo~3|axY_OVRB?;bT4IdV{>gTaCz;TZBOb*6vyB5DNgi_Ccr{@5H$M&5tSB7|c+q5i}cf=FuSeDPMq;1>uOjKU+XKpz&F2FIsi}65xmwT?xW*m#A)46Tx%rhO^#j +j%K2>%NjL*Eh0a$Rud@iB}RzT@Vtm>{p&0&g|(;G}s9#d^Jl7P0a?G%O2L(z>8>my2gUUiPHv*q$&)b +I%bc?&&#}0NgY27xYc*Ntjc}0k+Ts&w>8Jn>cpRe+-Rfjsz16ijpBX2iGyYpV+VqSU7XgnGJ%EO?PRJ +f$)IY<3AjM*H4|XX)LH{ZjZ4$)M}55sk@5dP4@vh+{Ko{4Y#?#-t^}q%hd7Wj;V9o<-lB+QJFh=jnp+ +YL<<@M*ACkI(Y*j}Vm;manF|+7K*<+ZcMBY|0FHnY=1~W5IA?U_DYkk677mA4U7C-L!E0B?VA{U#1cQ +(Npdt43C(a`nahSW@m|IzNKrMW44{m!8188&~;d?_>8{NU<1!^(WSc?O=bTX$i%S2=BmSDEGz?P%IeM +@cL;uVd{cBegfq}E@z2i=yY!F5lC2J{>1pxu1vG*sw6sQsSS$^&SeuVPHmjEnM1j19D$IvC0^_n2w9% +dS7-_`29YYYY?i%yFD`ZsL>zhHGTD*l7?g$A0qriRxTRmmFs@hH$2k#|^`@pIi? +o&y?vC)5i6ndo-A|q?&%MMz#0L+AFLLF6H(dS3{r-s(on&8*NOza}2VPx&1M0b~N}CPBOS|p_qk2+#9 +f;1zgF6GhY^~31l^r88TUs+=>ym;--w;ic&X)+!Sfs6mnCfZY6RnN!?21R+74v$*nAPE0bGU>Q*7Qiq +x$_ZWXCpmE5XQw<@_+rEX{Bb{26f`+qB0P+nx@c4n;RTkIQUHFB$+NoC|#le*Q(tuA$|lUrTt#>kCH- +59wssoRL$MpCyCxs9Z5I=SgmH=W#csoR*`#!|O2xs9c6oZPt7jguRfx*6nVNZkx_!>#T#L%W?e@He~g +hM3m|c*ZT!8ILM}MxHZ-w;e$Q0hv5d~woI>kt#TT}};t(*^VW- +s{B4u`3wECi_N3b&Qhxfg!R_8o{Yw*f{{GK1_7IWR9$3_-EI)^2~WW!Yk(=i>vx@u7D6IA#LZLqpv!o +<+x_L|*Vivyv}rc`}&`y+RAnNvzd#fcZ +b@Y!+)}df?+9+C$wIi5A`9bInk=n0OH@$$m=+eZqJW5$R^1%C!t|fUTwQsLPwqx0fyf)f;U;^BQ6<=xWBmH*_+_n(6U)27 +P84#kt5TGW&>|rM5lKp;>_>~H|Qp|ijM8LN0)XUaXs^v-%st(bl6t2UR9omrJ2-|BM8_(SJSmq9&1xe +_g)U61Cqbx_dT(kQI1pn6m7zBSg@D79EXUPa2%io1PBX~8$-?dZ(ultYxz7YHi!Cz!w2p*N~8NqSW`< +)Q{ld=5W2!8N~wfh0^{qehu$5-6DuY5p;-S56{l-0KmP?~Tr6u!6lyB7@KW6t1X_~$J79rs~Eup9zdT ++TrFyM4~EmNw8K^1ifT$=>m4L$Q#SH~0sbByZU0T2kKdtsj>+d}A|~mN?w0zvQ#~(z-12?7p0E(*r!a +uWZP^p4~@fUx~w4;_#`718#c%hs0rvUrqcvFrJV+e9D9G1o)0m7d{}O9|7)%dszQ5zl!j)hBy`@qS)r +g5uvsCKK@!F%q~Bb2yX)t{MzVE5`NvOarkxT2+nLDzWxJHO9KQH00008031s8Rwv=Ag8tbpY;f8wFqa!qPUwt@rpLvBsLwj4{FO(aFYtWeV6 +Rd1D!UqDP_rIYnQb7uL1=DV2j*cH=`YrBK1wWWHuLG8D1{{%&)d5bz>NE2skXu=KGPkfPN(pA!GF^{a +$b=W_ssTT58V8sHOdiz%FU0A_|x!%@@KX^bo=llZ) +S#27aR!V!3lmkz61h7q#VjV=@hIhcg;*gGlL?ORka4IGTqd0C*q*E)6GUXzSL@x=`xI1u{(op&JGISl +vtF0{hPQ6W0bS^t#o~yrqmyQkv?_y7*Detphd?^o~MQLubfVr36K$3lcJ>T|;~P03j0niZ-G-r^xVS6 +gI&CTl&=Z?nX0@I>QJ0)R{~=L+{}dwon?os9(Y)Hrr5u7+Gm1?GAy1;J!EM-T~3M>JR$fgNy#A?+ts? +Dcy`F)S+=_;`O_;L1#ka*dm?z#@Blr9Z +Zm&!SqORI5Bc%EE;jcg0+x5Lw4hxsoS|vc2WqJ5e`&pm2SmmO&V)8&p@g5-`haiZ>4bDY~bJQK_r{G% +fWEF1qo`KIfz0lu6CApu{-5<9PbtwV>Tsne|qoVkFI-zTCEm@%$Q_3fz_+oFrP4<(2Ps+eSsg@W~RhzHpH`uWVM^Bp?8d%lLp&SPPZum^%4!Zaqg#bPc +(vhWiHGSm+vD0BaX(gJLExu>+`zGNF-I7Fs}Kh15VC7mFXvk&8w=a@n!R}owNjO7E{GKrW@ifoshFJe +>^)82C5;gZAk*}a=&*-gmZV@$l?<%I|4CXzku0?Z!Fn^?k1%j%l%qjH!Vnj#6t-30C!V)$8J&!TP=!M +F$a{==J(7kN^Sl_l^vnI>-5lnoo07!rfcxlN2pTv0* +JpaCTgqY)7?aPal?0ZuXJtJkc@0-zVcHdvVxs)dH-P^|@5hYVG4Ijn&<^^n#A(LyV5QOv$BKa2 +asezE9StccY2doq4`@H|gPJa9zST{@pP;yl;xEi~HsvqWr#EhKkwh`{V_;M5dPWP@K6#1rJ2Y(W#>ny +1HGSrARa1uy6JKSehm7M(rO^O9KQH00008031s8R%pw*%54|`0RA)p03ZMW0B~t=FJE?LZe(wAFJow7 +a%5$6FJ*OOYjS3CWpOTWd6k-Lj}=FfhQIf(NQo~-YM9EXtV@oyD*=X?)?i>8(8&7*HE=LT)AV6aH}3i|qbzb)7$t9}h==B;oSxaNOR%IqoiQc5ln;&r1ost~hl$%3& +_W9=h;p)r&Q&gAx*T;+FXQcM-xZ9QM!@HYbld6@|WG!?wGrI_UZNI{!LDPynnO1y55zG>++Fz*YAIq)FT*q{)L +h9=#b=l{4_E(a9pR +&(Cl3;H1*EFm0dRIPO@7{g7JWUEYw*39<#b2Mkd{OQ_`KkQ<-ud~xCog{bKF6k{^K0sFqqP6uu{lrFyTE!OOSh{lzc4RP&qNJ}s(Tq>Fs~{QuJ7<>BgQ_nT9 +G7wGq8|E^peZcfXu$9>vPTHhbEn^b<+?`azSo4coFsyXQ5>K~V>g6BE?(f(bMesp;_98b&r!}SeAf4r +A-hp2V9Q^%o}^747U`B(qS!zVxdA3^2TNfLg3fwFQ}?~aEL<>EDpjN!+$?|rX=kJ*2ufKcb@2SRbzt@=wL$t3idT)(6L +tB4;)w{Ypd%L?RKYX=a{NfyemVetQO=I~}`L5pi^5b^CU&gxux$|T(aej9H<%_eYPhOqh%l{>%`R?%BxO?{>KYaE4>^~p +o`&=y$)`RyKM@%No<-eXD#g~iMm%D<~z58(U=QPlFU*@O(B$21D9-Tk@k5^C6e|UJFbiO+&rH-fh-;j +?OPV3m`)6&*@T9?}Mk?+bF>uH&Xep;di@9Jq;h9$=h`8B%Z;?#r5=lQhh&Ij}735iwNOTpIKn!fgn$ +F@(7*EX+zJ1$mOvWzp7nI1l>s%*t$3f-cXzR83L{HJAkF1^(r_F=QH2hRXy?XknRxRTwj&kBLPl7MYU +%yuEWA6ecLla6QBIoO9P4cTz@~n;AX(7Zl*ItQ}G1a;>J&)&bUsi9JGahO~-GeWWI4a;UFA_{fIwrVQxnW)(7|lSWIpGEi+$=r#;7?@Hn +bBdPL%Kt->0#Y59oHM#cZV;T%h5HpmwzENm|Jrvbx29o6<;2a)H?V`JIv?EpN$7>ZeL~|3y&3Tb^hv* +c6%wBwzwQastAE0bUbCn>DQWMK%2rUIdA11ro|q0AqCO~v<3fbbs9(#uuvrpIIJ#@m#=;ShsNz)YHR8 +s5H7SP?i9%6zQrPk_yI95x-D8B0v>>%s8WSFd~F4M){#Xgt%u3kZ1dIaHC& +>dw5Eu&%vErEpn_EHIF_lsp0Rr1hunAUTdpO*He>4E2v9Xpq$}NL#E9lm6)DdY8A%{pHt+s4>%!Lc+T +(n#OBj3p|HrB+tL4akCm<W7ATL1ys-ECrCZs1&?EG#jF2xRhVC^TnU6EL!5wD>jfwiHSf}8Lln|eK)p(*fmrpTUn +8~K7kKIlRtxFBMKADMMPF! +h^C!7B`k1!JkRxTCSN73^@v`Z~B4i)4Hx|Fw$C{#;o^Ed#4FRCVZ%v5-^bzHwP}q*_}*x+6#e#N?Wry +JMEyzEjK9l{;$fc)&nhHWeXcR-#f>w`{(;Tp9IcWr%;TGM8KK6)kt1q=9KbZ|aPYjIno6ql2xnh%8XW +jkRe4eF}+eh@W*eUBLCsn>woR(5e97FdOEG@u+neOh8;1!vp3JZkj6mZ!5uOstgXnCfubH0_K&^*e2M +Wf8o$F96lO+F^)A!4N|Un1~IpfTTH=Qg*bes;x52mCPqXh=9x`4;(k|Dp^bqbRS%MpG?UF>Wa3@rGJD2tml5TctdcI^qw4WvL8WM4geFvx$PCVb=jhE%g)42g$-=~e0vL=SW8f);2v>m6+ +%lL?J`y3y@@^GJfg!Dfl|qcq$PpV*5&~9}@1Po;fQ^w%jsl|&7*JgeeJVA#Z&T$I46_@92b`FcAKj2$O=dQ0#SL?tsYPy&b26~Y*{gzrVn8lO(UCp +kb=#KZ+loUVeuk6rAz={)sc$K0Ndj9Kb&BmDB9K+h;%9`tAOZC#Hv~^|r=TheDxIJZ2}*{tZc1 +4pxH4IX7CSb`;e&mTS!9Huj7Sh0s1(gxYzu*9h9CfI8PhZZ@I;8NTlopdYvVq4k)Qa_WXcICpU^(t%I=03RYBmElx8lpTc$@o`PCwNalmg)b-%Y1Oe;I44{PGWn3d4(5j41&mRX!8)sJLiPNZO3bR7Lf_0kZVidylm`f>^GMwc>*l@J_aXmeS7(BY +154aimYTC4I89cN;CTR~ExIwy-4+!G<1+W_zizD_((5%GyZ +0=VhT2EPn7zT3&Uo!QAY3|O$AwwwsVj%S0~f^%*ja3x(iRKwow7QD!46H9_$2MW22>M9H!3mC_yqi(# +LV|3!(zUs)7W*s@vNb_8kPlr|Rl63kx~9#Ux0`0pfx<5LL7xjh(l5>`|5$C@fG|l%aniBzt6rTe7cwN +l1pnMO!j?#Zg5Aio&R77XyHS+Pd890XxS8eab*ht!Xp4)6+_p +EQGkXw%Utd*$jHd^PV$MTpcxv!g&Z|F0f^W#GBC!dP3De&1ij&)hZUBCvqcmUnp_-$EC2+BeN&q^#F+ +*enngiVEa-RzEuo-M6IA}SZC@b`Dp61-L4b$)EGVafyg1Czi1uN`0pxQs9p}-XOvWUDv;Y?ZpA4KX36 +4xQJ5m@;5;jb7)Etq((F1*@lU&YbRZZQ!&EJQ~7lYu#BnTPn4y%k=W +_+StO#TS2CGGI2wI#$WY!eiwDe6jCj5gzye!i^+ZqqStg6A^RqjMgG8fG~mljltnRarxPe4S5FQBSfC +_ujeIZ=fF&~K7z6^!js_`mlrnjai{|NT4cdTC?un0ZSw;yu8rc}8oAlWV3f7)xFksw{!2!I9l}NrvES +~626T>lbtfPWRv;%ZF7^ejCQj;JfulNwq1njnW&d9&;}Y|McyMkVdf}+$U@;Wx|LZs))#C95e%e?YgMx<6>|l715l#ZO&wg_EH`6N#M~F@6p2rJS8 +?yQJM(D6Y$Lhb%<38u%w;KIx_6a0^6BHl2u=(?=gahqsQBBMa_UfSVD}-VylDfGdlymz$b2T1h);6Dq +0pmIE4>R6oaFuu;ijIQMeEh9DawbPtN~RG-|%FN2l=EU{vWCRh#o5Qg9qxCwC%CD9;mD64MMl(C^+Av43dA?Nu1}y=B%W2-ICv +#M4HGg*RFYkClh*X#}#>oaERX6b8qGvGqDVAHwE@NAm7!?(ZR&{nZ&z=g=uQ01C>k;E1Ax-1rw4i>fVuPvHrSb@Hy6Hb$;YY98j)ZM)C2ND%!1LFP8*3$r#2 +vJi+%*QT{sQZ++zGXtSu^v ++tFBlVa(U$*5T*ojgC6#iGZAQm`IPJwjw0VBYpO@_&OX^|=mTi#+?p-revB?1qH6Q-D)CqbtGRh;m}v +{m$MXVlmk=UD*Ps4@X1;oQ<%NRRp&WT<=Xa&yx$xHA#-lkx#ouxL`&Huk*)wRkUbup0HS()tG1BfGQl +P)wHWgg47nBJCtC>r#8Jtl3C7z2Rg^IavylkIdU$CpO<~SU4KK2!aHzN>8S4o3}#sgw=Z4hW$L)a`ZE +kCum_i9)1%7inmf`Pj2Y+c@#8}V^w>>ct1d#XalU$(hjan1vjDcVRz0$J4v$=;O0?g@l4obE01UGRJu +j0Q4T(1QeF5Xt-at@T})f|+IJAdgSm1N-p=5m2o48g^nH{c#F$WODZzSH8GNNn4pswcI +P+&s9vL@zz^Hn^pApwkOa+yObtEiFh3;Fj~bpFuId*2u=CTrcOn_A!L!l9v+2p}F@zVdF&0Z37$HW|t +}ZmG%WAX0Ya(GXsoy#dRTE+a7J_jq#cIx!%&w%zEvziT+3tYG(k+mH?a_;_v{5H@OV7uvH4_9mG7gHb +Fe%{{S9k@ld4YAZY^A}9HH3Gyl!aY9ZwxyP6sPx}GVFeKkASJSY{;s(0T|*T*-GU&Ej;MtZeCE6q>Rj +%JizjuuFs;!iSui{P~*EN5#lDA9;*8{`2-W;=-X+hHsnG8f!T@FJVbA~^yh2aRfa?v$8#Dh7pj9Es)a) +i`s*2!U5p?NAGVp9~X-kHF+yc{rdILQfRW?x>??Gp4e8vyoZ8#;uA+0)ML=*;dMlP5{DCqQxD{=x!pe +K|#+=9AmMU0lC9`5#bA0|XQR000O897^_9oK{>vJ_7&%*#-arA^-pYaA|NaUv_0~WN&gWV`yP=WMya3Dw7X8^{`z~CkI)a +Iwtj+{IcH|h%ucg;`J?{eel(@=C>~7H0rkhT_<>%DZ8n;;*fPzm+(<1H#U^Kxj!N@QDkZwcZYYDT+c< +@ewDb~@cl^Z4?AVei$Y0<<{FJ@R#ExMq%Sy{kcxkl5U%NAQ{|Cf0H}+u9EDO&$t?NDGuc?F$T)P^nww +_vXn|klxzXQd^@GeD4Q4(SuCG6Nfaen9|HriXcuDr1=*ZvO{qKU9yX)e{q%95@L6?*c9=C$7%ee567D +7m)6)AmX6RP%XOLx-ne!8SFJ5);dtl6TQ +d9_wD19&Vm){aRy+69~2o|PJgLegU)G&G>!t9wf<;Saf=*g9C~ZMS#Ic4X|3vD6Yi)Q@TI00c)Ud{l!h1cJ21&|rzD +8cl@;38C>#WnK@xukBI=LEqs3#WemGi82Wd*fSwa!bqhv9Pm*Xg*`7)W$(m|IfWj;w9#JnW(i^K&eO9 +Lfy_ChLmX#El6btq8fv=vW`F=s5XQ6%t0cJ*J)P#L}1_Y25b&|8uPY2!QeY$bLF+xN?K!E&B&2TPxIJ +M?c4K|+637(oj7P!^ybDr0Pi`o{SXI*EY2dE4vVT=)LD=@BhcSYG>RFunW3BhqX%3TsO0W?Nxj79uPg +1{hw^U>QFoci%Z8+=<%ZMjUZ?7kcA7)~yuTR%$*WRXSNsW_N>eqtVEeaPD9}z*?8ta4v8yup0%fRuV^NwQ4z5MVqca($r`^_`~NaoS{~``x4 +hayMQ=0zCuwSF0|VEvBaOS-wVAGLC|l|;lt}<|D4?7B6=A2)=$t8wfg#{x1+u*ElNK32ikLcmVIS4T_ +NT5Lvr;RlM;GUiOug=9`NFXzH0mrP)h>@6aWAK2ml;P_Er^-^I_LH001$N001BW003}la4%nWWo~3|a +xY_OVRB?;bT4IfV{~_Ba%FKYaCw!T?XD%om8So569CcAe +pDK))tDlJHS+NaQpP>@o$eWpTD@h|LWU^+vDroUtaz1#}_Z2&wu~$!%r_Czj^-V)zj^p7mp7w-`u{L*S! +1I{_00BAKyIAZ~pn=?+-6t{rK>7d-dJz%|E#3y#AAiH?O~W{^P^{b=${RFJI4pKK=OWiGR!+-#&Zw(N-=00Zet7!(!?(`l{ +Z}vFJUxE>)12mSUjOzF^OM`{FVCO;?e^K@i@!ZR{&4%0Ei{`AXQ +weOxD9&WE+efQ?)`Cxy%{qpLk+c(c&-ku)5eSGch=R&->J%9P_?_WL5@Bi@X+sE&ISs(rM^4mF`_0(@ +3o_=_}*YKY|`SSMh!|VB^w|{)PH_T{tBKK=ZIcW<}PA0GA+uf_aFi+o?=@8&Ikcr{n@+lM#LA78w7>VKWv`+7d$i*Ik +=KmYr~+~#i{9;Zazp3ful<1hbTd-&qj%fB(-`ITQ6^pCg4?`|(&y?N*M^V8#$ohg0)VRz?Ue%;@9rqF +-$?mM?L&5NGD{I?f#3qGG;|M2mE$<%FXn~+?fW-xe*DARKmYvmyAR*~^zNIV|IpL#f0*BR`u%@jW2fA2 +x8MElzu%5`YtC1iALaAfADykA>!UN}{ZXral#X2EqdrQn>x)P2@zH2!FKqos-#$FQ{dtS}dbnq6{cr! +Y@AdoNq~FD_zrFoaeix3BCCrzh-}AE%;x@sEak{`EQ@`TQ +?S*48ty-WQ(>LGWzMt9-%`)}Svp+w3>n-->t1tfg*+=ic_wiSM{^;{Bo_+MEFTeQc(@ +(y7_TKzI=WwoNeE<9BPfO;ey#4#9PberhF>dkRpFaNJtIt3BUmvWeFYQ`i`R<1|f0z&RU0gHI<+HE8` +1Gp}pMCH@zxwpqpFemuul>ziQ@P&KJGa!2WBxpk>zz4?bN*V(`grtrZsVO>&+pvkUs_4)s@CR3$NZ>V +X1SJw_SHU=Pxx6C&ypcgD^s?jIgerf6M +$_^GIzybDCdn=Ncogg&PdK=1|wAsrG{}%&W?|*0vl>C0CYe#2Djnm9Di2Yc1B5y{%QQZQX5NxSnLK%3 +8?W&&)%vO=;^3+buYfwc-(kBaN;2kw`Fa!lSs^c4sp$YU +u*FgAiL3xb;)(C8;rGs^XFPAq-m_>zv{VutW~}aSG=>cNXWdlWmb{DtO=u}BGx~xb(+Dntjzr0x#pdxhFhD#9rD`HHT}7@^V-G}r8TE>ZB8z0>Uk))Yc0+YrrzD^xd- +!mYr%74oU)eeTFbN~eDJu(ShqbZ(_8yin8Z3MYs*thY(q}`bbxWV)v0iRk854%si{6S2V(t)6i&5yA- +MBTgVT(Ntt~)c=Mt?WQLp)sXO3Bnq*QrR^C +l2i~ird|g37&Fo>V^Ku>sj6WgqkRRcget7uX&P}aL(WQ+UVLZG?@qIiUCfydoIlSa$Y-|*IwlHy>u+G +Qsu5ExHz~6&)HpZwB!0lE+^8vR-mmX$vI?pT<-UrC+9w)aWcn^Lzhm~Ay10PuMgRY1L&hqxPmW@R-cB$GEVIC~s8Up=XjyM_1OF%=R0hZiM1&E +G7+SmQ&xa&z7SB=j8A53U{I=_)QR-A`JeRU!;ol)jD-0_0e%$(bVfI6cA<(6jKChI#J*qa>E|TpO_1-pZZVg5J@+~{bHvVa@iZteZnn;%a%kj2T2Fk&nZ+uxSL)F?MTP{Ia-Yh%~R3zfAV0iA|yCA1*>Q@ckQSz$Zdx~_GGW-ct6C +I_Z;E==8IUtBfLDBPPq+0m2>~I@3#t7^-@6JgB*r1)3`b=xcDW@tKh66Zabms3FbGWXHU1&>{a^&aVk +2oYL&>Na`PDb^Ruz4VZwI+euG~7Ptx^Yos0=?$@KavM<|-U15d67Ld|RuO639T=5!u$QRdQgt+(AGbY(Q4Kc)+!?=|U%W4Bv +^CJ_SU`WGfs>P(*UoR7PVNvJ&G2pqp2_z2Lf~#pWqoiwAD6I5Z9IP!THNMeFD_j9odgl#I{X&!-cz#p +%y&t9%dSLfBROQ!(Qhw!$O});8;m2)hOMW65J-I;F3btypN6qg)|wIS^g~^-m>(4~ESuZ1M?&5Nmbpm +-e*#v!Le|>I5Ym9W;{xh1jI9$#b&<>4Cq7woGt@v&b>Qq)m(m>{_ESiNpiV>8@>WuA^UHR~O(-3=&8$ +qkINWS2+A&(S`?iVVSUC?mpXe0x43_y9056KEekr0@DzM5@0W1+74!LqQOp-JT_KylXO(^@Ho0lnF4O +--_UALD(wLpCnye$C%6Sb +-tVacn~vm^n0n$}(qwgc6gIgz!9rcV^?={J@4Jy73{-RUIIwwQI`_mpKoCNnr$GERR{F0e6~O-Sg=g8 +MQdEFc4GTf(@Nu_a+}@Ruo=qM$Kk8V^U+aFmr|$0lF$yIk%E)CM#mFQi$Yiy<8bb6dADrl*h2&aY|=g+KQ0D#VfonyEW}` +|@e{5LKEANnmykoD8%z&XzadAx1HlW*0VJzY<_uOa?Rrp1kHr149@y+P*{(m0Rn+!nO!nUPv5moC8G* +_YG#3--up)>`kW|1Pyc@jMTtave3nUx8hs`@;xz50W^LFeUyIzx0tFmZ_w5oxPZE^{MlqKZyIZHGP$9 +i6}9?pyRKmi8NHC0ee1svDm`9nD-l_0uTt$lF5(F|FP(g0JYZ3EEei6BI +DrF?wY2l(!Mzo3zV>~@=~^eUs#cMYjnmI_OTap==ZV+|_kwHGx-HiQ({u1Z2Ny5ffs4{kkvCQeL(t$Y +`<_ie!UVn3im(m_4AH%$3!1vBa}Wxv2Q9^}gD)~vLxotF>jCJ3Lm7LdfQ4se*OworON_4#p1K&l3mG~ +NhJrT`LiWyMjJ*N^Cpf$FigR-XE-YbLR3q9dmk^VBtnoQi9j1bbr0UFA2=O3$i2~=k`(&;_hI0j$ATG +4MOw3tvRf|WN!<~`7j56c|)FmqrW%DeqiE&t`<^#*)l$yV2Ya$p!`BUnK;zV9&21r^3>1;C^jPi1C}^hy#niRR&PB_&YL!py&11Ar{uv7*L9Wj-q%j +p48*Lm#rOlK>*fbO5hEL00+f;0B~>=gz-QWjWO~ku_FDvj>3t{eFafEwOz`d}0b1;x-( +BEr7EPE+IYv;S3gcAQ_MZ*H)vgY_m|c0$}#Ff2SnllEf=aKB#4Jbvi{wr0x=cBDq+X6c+gEu|qA8VfK +OQTITsP@zXg%$t@xEPle@0I3-hAHsl~-Kpcg?-PbK}VKY!t*b##sSpS|lsc@P4@9^$JALPPTcq}u2!= +>{wdF;^Dt#5(={f-l!WcNDHb+9RT70F0Kx~4vV>2Z53dV6QU{;sMN$r6Or>J8C!K_W{ZGj?;wo~)WEIM84VqMg;&*FEX4m{OJMGO(3 +FcTTcV498>07S=dCmp|l9+|@o2LbvL+Z=*t2qbV3zEgq%W1IkmNvdf?%m{K~tvo7ft`e#jb#lUo5~^u +n&}3BMDukoZfIz+Z34*mjRo~zcqEEnrqQ2z04W#h%K)a$>BNoF5==mo5!B2g?f~nlTK@W5|Pp4iOu1C +@B(e=d2agx}kIcs6OxSjo8ShsTpj&_%&W?HCvMhcWz<(q~lROmv~reRpJ@<-Hhz}v5nA?h-YMysOSq` +VWPgZJ$bshN5?2t(-2%(-b;?gUL&Ww{O_0_|{VbyZP#C;aYO^47&i3l|*F_a3IO-D3kqSVBA}h^`6LT +o;DH)}j3eG6ikXboD*8L@?9k?2Hg#z2VCkD3D^3N^u|vk7BG5_=5kTVp>ZktsuN-HCf~Vzr{YTJ;m%Z +M1aKYTS#pp0f_2_4mu%-;rr&ADeMS*Ih0f`z;usv@?)-95jI+-hao#ToYL24SISUZjzI0nAC;wj53F6o3`fKs*M +}t>#kGU^pa4ZM|NM)nw$@OsDfwNK=uizObyvjLb8)T|RrNW^IB#cD}-o$e`46D!m4Pj63Pbx8n~2!kPX?GKjX-z9YY43XG3gQ2s{}gl +-d38nNg#}0g4mnq~i+e9pM5HfL>HcjB*Eymyrd-+!sGl0pf1L46OP@8h90)<4&9k&|OQ&1ug@z+ofjC +AtIS}v2MRxZx-_pA+g+h(=&)VR9xS6RX5!N6}Tj=q4d^5Gnb-9X(0tU&|(?p1n6==oSxkNR1Y=ze*y* +B`4XC0=l6u|))i?9%dkdAL|ch*b|kqPO}+dp78Lb?n**vB!k_L3Od)#@njKw_4xK9?>Bds_IQLL8PUq +0YU{`cb44LiQ#b7Zaqq4(k0WhFBZWT51ck_HQ$(0X9px>M;^j7sH0_C+y&=hR7&_ +8{&;h`A;$da#JBUiLv?%rp3<%bQjXzMq^iRshBfPHWn1wuz@Z1S1@N^cI2zT*jJbSq?P9;Qlx{1@@=Z +$dXv_Hg*ZG#tg15^mGM{O)R>Xb5rp#7xlDu$Y?IP5(yeN!JwowmN|B)>@c&88!2J~do-M?<+(f)7V(VOXEW50l1q~`Gyrjq>W(=Nl`OVHNq`ewXIJbCZF!h1v-X$UWkb`KaV +eY@xY#Ujb8P5S^W8MC5}fGBY9noe2!LS#wAx$_^a7683A0r-#Fu1QVecR^;6ZAvTiv*^U2ZRKmg;`3E +u42cBwf}#YVhGaSH%nFwge1FA8Ame#f*$I?QozTabx=8}*&#fIOb;`dvs-uaS0WUiG%YY#*04BqYm3-tq;gHz9?pc;*r4D@ZZO9K=7{~ +u#&FQ$MJE50{p|+h_|kHaPkhH%_&811#*v)EWD?do9H;mP;!+{pACJ1B4j{}Kel(*_LZM3$U!R0;^DaPFEAVnhuBYY#KB_vi{38LmIbkA#}8=0d9DG;%&LhS`WA%7 +UcIiqO?$YP(mv1p$JtO*tMCfnCpugSoJL!x#36(d!@!LbO<|XFd+-VyFP)$P#297rzOqO&nXjH>J}m%blehtlm}daJjc`J8nEHL;XyB=mTULrR4t}lKK0viX +Tyc*Pz_9?6GgcsFU96H|g0lI)MrOlM=>XS_Rb0HnNn0kVa%vi_ye2^rnFw~>uI%&S9M@42BVD`|x +?tBo?@m_?&S*s<2CyOgGmj|(i0IOAmhhBlmrhX?Iq9oxQrBU@i%nm*G+O=&Ku=m4~0f`aQ)&SgOz!Hr +~jzBUrd*oUYQE4PMH9|xglv;@fGSIF_=`zf6x(F=?!tf_{=`_oxs|Gupfri!nAvNPP27>yHfJ_XuD^m +*Gb^)YkBWY*kM|v}ifVjts0kjJd*JL8@Aui)Eq7NIUsBSQ~>r*luY9-p*SlV`~vX>d^=(y^ULT8ekT{ +sg7wjl#G=3muJ_=XZX=N@XajwzG^uACM{8+ify0so|acHuSNHj$?c&tIZ~41TSs=Pp^V5b|BGQV9wta +uyN@zfk^?jcGNr7xfKbMo3Ic!W`(MaKf{nU~aV}WAD{2TcPxz5^0{-gWm}jK|Ll=Xo&(PBcM%bVZn(q +L>8eQFH$Hg9V%}ZuYi6z_tmEY*$^J==m7U%tw>jx*RrS&!{>EOLMtSZ_p-+rJ8fksH_i#)iY>X8cC@k +rzRrRm{mh{nB4l@}RUIC|@X!TnJa+*L!KXwS8Bw7UUL_&bWT7PJY*?D8yXmGCMdk?@B}ibrGdh(Idn=^XJ^vE$uXqo9UCfMOp$C6jcD(gJ^_nw)!)2 +``1QEy>QAE4gha3PUo&}Nrvt;#=@=+hjB{G6760h-;7HD;3ZM{fUL1fnnWRXR$xUMv0ets8#oLM0;D} +lgJt8XhvsSNV?C8~1!Cl;k#RlJg}gc0-35)v?zyX55;>bGhZnsBp+YS3Y-zzZcNLjeNgjgWhE +54W2rh>;JVoQy1(R>f^7?FC*UFZGU8hWHMYZY=mUBIdQT0J0F1EoW3t~;#I3)aKL5vfA&;VOz>-eI+; +oOxj#dH{U#{etUx&?1E6Ob(?X~40aCZ=+*PBUaQB=Yvy#Ov^pLdoTOxcc;SxVO`l!@B{jAO_+BjB2G0 +4xN7N!dl~7U-XQmjXXlvs#HrClE~|b+8ehX=Yds5kIj4SkQz@EaY2M%Fw4KK?j-3VBvnmB+gy(k} +q>z66X;(E6jpOb8WKpI*@{Z1Q2A%x*J16yd$ND&*^@^KxwlJfVgbUBdTXDA9aS=L?(!>1TZnL1rst11 +A&9c8mVf9CRB-0%1(AhJrfkkRG1ek!E-fE$vG$UaRM8h$4iG*A-)&`3K6qqnNn5dg>u-HFS(iJ13)?? +nVG=QnUs5+(8fkUAT@! +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 +s_jxjxn4My>D9&`Xql}qKr-Yd +uTL4J$t~iR(Aqq-~7y5cVjK$i-orv9b`A(K~u%DX!XS0O^biaw$FIgaFn3qJ1=!ov?ePM_3_U!*h_`e +^)E4E#}lkK(vg$bUlM!z^|ndlsav;DARp=CiZebrn}G!)0BA4aVx`Pu>UwySsgApr%1;53mKS#8E?jg +q|w2H`PZ;_N#!LiIV4dLFo|XC57W+AiMd%1n*>u>RIxHj_DENu8y)aU~Z%p-3E0s$9PN)Ns+|?|V*V% +Y-oy_)1FqdiV(V8&qCZY8?6@eDp$$%f+V+Uk>1A#3No|vPZhV_^_|bf#0Y1bKe{jJYmacY-^;U$)Lgt +Thj2}kSNO}Ok5o@!;E?J`Zgfym8 +vNwd$=C34}#SoV&9$|>Yi^urDg#sgH%wkz3|W7qH$-_kNXwjE(Lme3X1b+@<;5Z7#=V(3q4LUEd$Yx1 +_@90zI_@pNC4WsS$_yD&&Hj@W{R;^GOa&M_y=LOx@GnjPQep}7W{#Opv>zX!>!qC+9O)tnPzcF0~oth +u{<7#9fnpl3ge)tOU0Z4rzNw^p1y6G*)`qtec$TDXwEAvHoGZ9C4U>U+BSYjVAn{Vj(YT@Q0-l=9R?|y_{)iV +nB-N`+!zKu$(Hqbg@TMIntJ;gpcO05Feb?r@h$o?AccVV;VhjsPuQ?Ftz(h|s$mmr}6(8PXjF&@+Uhd +JbsO>VI8XFyt-B}w@)r7n%aqBoD2{@EUD15AC1E8fUS>IkObM3R*$##XAM12 +bB0I3D7m4u^)kOc9CH)wU~n@H~@LyPhpK>+zycNE=TuFE}`qpw3)XU%t7{_PLzED(c#F^RDG7;Oz=`S +mU@@r$M}oC{p*ObH1XlX#+iEG{rpZL7Ds(I#DzcE_UC=JeA->C(SuqYJJKBVtLKN!`G{aT@z`HBa2}s#ty7~85bP#EZsNULxw|@K9+qdt2c=LzbtCw&6A5cpJ1QY-O00;maO7>PvfZ%^W0{{To1 +^@se0001RX>c!Jc4cm4Z*nhVXkl_>WppoPbz^jQaB^>AWpXZXd6iV#ZsSG_efL)o@rw;OZoEZ-Zi6i< +D|XhXZ;)gJc{0WlWe;{VW6X>aXurN^e2Mqspsk)HlIM^-q}Xm>e`q**oXlxDiAVEvM8oMK{+r&3ZMWK +#?U)u;ZlxBAVpA|lN0s?1l@fhpx0J)yZ=FLYT6&4d2Yz8?_H4Lcch09o`f!bF&6mB6 +tZlBsn!MB2~~Txl{;(rIA76}9V(?q)@;$uvfe0}13Z;EYsVxU?SswjE=r9c=$q0oX;+4Jk~+o{{~l5?nehNa_Ra4%*`dglO~?YeXBS+HqN{9vBcyPm}E +PVwF)ef2OA>Nuqi7e2-Wt4KL<*WRlfhNf4teE3|J=I0$B=B>oIUG@MK)*>k9VJjv#xG^Oz(p@^1Il1< +{(G)ic>N|uXs)F(=r&k_eQuZjF7aS6)GK*@r=kjfoff5vzn3RDH{#0z80IZJF53H&1a=6}sl8NEI93& +=&#dy*w-<9qaKC3Xkf_tSL2a+z-rOP}|9^xFVILVr;hK??X-mY^OhV{DIx#`zFBi-5iRFc{q34t~8G5 +Uo;J-g{^?fB26_q}^(j)>PEbcf!6cL|8TqF#JWMRh&INeB+34CmM$val+xh&|BxRZk5P)Qu7%ZA3SOB +%#NNDq}qgJj{V-64WvHB&uZo6u<;zjo3dXXycdjf)ptd$)7g5qcoGC=o^IY_QbKQQvHdreOvqQEZ(9EVP)h>@6aWAK2ml;P_E +s>7j3jX<0093`001EX003}la4%nWWo~3|axY_OVRB?;bT4OOGBYtUW^!e5E^v93oZD_*N0O!Q`4kBl1 +K0rV+IiTgF3bS3ORg5iWqTwU4bP21OH_$yNpzER71U2Z>-$n_H&AY%#}_ime;@J?v0}xF$p4d1e*eGn +<>Nm;`L=xXBL-8|gn&OcrM?fT8_FV}bF_EmZKooD9yZ?7NjUtIli{huCtbNl +W-zux_Fd*?5CaQXiBZvOqn-SySO^~>_}d!P7^ue!S9S--r`t6o2pPrv%C)bl*@h~K^Zi}L8roAQ)v@5 +|Hc`|G>EUB8?&`RexF!`;o#zh;`B-hcK_`AaE(xw`w;^8L-5zuw)vEuWW+@S!~1mhay`yuN++Vg6aFH +#a}uUERHB)n46QUzhvaR}X*B!2Vd?-~L)&T)iuI*Dr7G=i{>w59R9J%Rk)S<^H#~FK=GG=TE=BdztAl +>WAyQxAz~{@Xz1=P`-)8!<+`RL#ue0 +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 +gRVY%^llR(2k;)LFE6FeV68jm-cnH>j+ +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 +23DpkHHea3w=i2+6wQQph#qWMKzg +vZ)vufvFTM&36V#BSXETJ%|L~!wF+Ug?SZ%>)v;UOS_b|>6v{HtG}M$O0FlkG+3nPIj!+ZKd0CXW)X8 +xOdxKmHO&6)VS#(59u~3gEHVQNa{&~?%uWVRYW&$9bW4v#NbQnwY&_7AFu#g}lBdxHntXaik^XRH-Fu- +4wVx6jD#0+!rjcAs`X+HVr`cMTobWpLO}ruYV0<9&I%kMZC7it;%ZVZG|BFWPk29yN`WAe<7`tNXoY(9{DooxY +J+{?29I)VsFZr^no?>NDB~$iPU2j%&@@Iv5{$+YCE#GfL}4nSVQ{?15JqseNz6`Q&kGF|e@d6TWQ +p(ssVRW%ro#X +Wlz5OqcWmmwT|og$BXA*575XjS>pzIuuArm}qwTc=(R{nl0!|r!-{`b?n*7N>> +Uj3ayzwSPaUBx|u@Q?QW7oOaUuw@uN1=k-D4y?HZaC(8sjOi^(!#HnT{J1`AA3$L++(+Qh3vvzPo4Mr +~%Y#gEX0z*bFQ=(BB9H7;t^evRy;BgJM__zqmT(Wu>Q-SgB-o2>+_p$XDyA(b-2BCVunsZXr}xvaS8#l9BkTw83c)pkxN>IpFI1S_g`cR^#OE67$n$z_EaA60JORPxyr>*aJMjn!ih3d?GWp4?k +Jh=^usH?>`QRD3EWq^i1XGQ7z;EjUcDHm0aZ*>MCT+wGS|PlrS!NVVN#g!InU*->hP&8)|>7#P1IfK! +IocUsB@NqJFTs*_0z;Nlf^z_H6E)U;bJqZP&^%ykKvB7-GIy>1tR!H2ph +m#DO70w8SIAv#h`pg+-xeH5BY4_mD?A(NA?6zm?QQ(>dO9Y*LSqxIp)5C5l@(2%|nsPNo8EcS`KTGec +@-g6PUB`x+Mo(>X5~oKYJdR;^fJT7y1_Gf{brz_tvxW}wvLxx@7E6Ca#Te{qKUy_I1(>azlQh$AJQh2}Jbh)i0hVjS2)(Kt*=9v{o4GyXrEWt!N4Ht#k +vkJz!Xf*%dEmvq$l-YrRIpi2t5Oj)Mj+I{;>qt>1~)V*AYkVlo>}Z9VFM6?+To$SN!mRjK#=0JQ~?)S +wY%2RwQ7nfqs=ss5}w*IiMG$9%NjP&$v1jt6Kg>E=rW2*~FeyesVtSY0PjNzR+TvbuCF_95^+!z) +zS3pnkD+dlwSkJFHAPiYK-xO+~wyW(#q=QN$D&eQ6f;?hE^tF1v?KVzSgiJID0LlsgGB0Fdb?ukW( +UV+-=FwP35HGvwBfqV^S|u3N9`9;7Kv`^TAprYczYT>*;Ab +V{$DI`R|}FNIySsSQKMCIQ*)U1fUJgJeMAApp|a(anRXfxsgbw`e|(FALG9r@bu2D{%Pjea83npJ=+nzqQZ0YIX!@+GH;Bc5|`sS)?YXl(tuhFKH5MYr=YBD6Ja*U+y?8{?Y>^Ifsi)$E9m?~BDkpV84LjwbnT?QK&)NGxIot1+L +AyiKAPcadMbCsaDZ57ejt3x(tg?T=FaX?1fQPf=p-Y6A-HZ*S74u6Ttg$fxWv^E;?H}Pb-fTPplyO9U^uxT9ok1YnYFb7k-G|-8e4YEQU7M(DU7#wz8+a+B&2NKC8FPmd2d +nsVz@s9)6R@As_Jsn5hyb?%6NPfmSQJA;1m@zjlJHM-C`@6aWAK2ml;P_EskB%N;%g007?x001KZ0 +03}la4%nWWo~3|axY_OVRB?;bT4OOGBYtUaB^>AWpXZXd6iV(Z`w!@e&??kg%^+r4XIALUexN011TyP +gh5rF&|;5a)%7mgT_!ziKgC>|u~fcoQU{Dt0#Z8n;;*fLG +6+(<1H#U^Kxj!N@gDkZwcZYYDT+c<@ewDb~@_x!}l?AVei$Y0<A8PQ}4rvKS6OZyi1W%G!LAmX6RP%XOLx-nAz9Lx9V(><)@;$utXeCX0X&u&YsVxU?Sjp1&q@tLA?dLY8XC~=)x9H@@Q2(_Y#l6g ++wGmQ9T_`hEVYCW^<$d50Bob^niQsCPsr{?3C^A7B=w$l3+?d&LNxk}HKH|B<+!L+2Mma%ucO81>2g6 +)@`TAC4BuAWdmFol``!XucT5%W* +WP*>XOcrh_g~%6yVIhrkM|X)B%>W6oG&qe$Qv+10-_LuK@4-!C9%LG +MTwq>b;;vz6E#Y~N4Q1Ko@n=p+L6=C;?nx$eEc=@BhcS +l)VQklg>`5otCWg*7F0v#qc%3lWwL0}OxBL;v=D@Am!&PlQ8JI~<845I=_AIFEfRMYffiPtbVpNrPu{ +@EjrKI%IR~ch;<-^)Y@@DKGoA=NR6U{cP_&W1K7hUDYa`tR~a@!MM?AWJ)-9v>$-2%Y3*PI2c%uf>tY +uyR%xg9IK*D*Pkdcnh*Z)xC)o3)$YE;wa+dfj;*gy*2fFYwq6za3jCwkD-ksP4k{RySzUCS?yW->fn{SUubom$MZN15_O(MTE#|PW&etkBv2pI_*v%$Z^A{88(pYK7dkAmT!mO +VIB*okX05#M7HBFXAjUD$I3I=txaBOkkICkZVv|Z9sWZsLp +v;ogN>*28q_?12s$%bxUiFy46PK&pHyu&$G11<7o+TI;Q)ES-T4ICv_7i^E_UvzFL7RRb=XBQ!KL7iV +FoL@iY(e4e4r@YpqN+E7oA_2ervc6$Yuwbrc&R54j5!q|u+U9Q&796wfyFs7xb>LtGa+UmB;f_mhw6Q +X6op-s@E7kmjbGCUJ<(mvN|5qg7zkik_K8t*HxQeGo|Q=t6tGr(8sC4o{&=s3lh5kY@b-2 +%x&QnF))$>{D*U0mO)p}HB~-jB~eUJh +^7&BxoD>$}ka9;dZaF)6c6$(4#{Ai2z-Nw|CvCq_j74D%W=m_%w3JZqRa)QFKt1&D~%<~P|e$pX_gX8CrW+1!;^h~)M)bV8&k=vgM(R~Emg5u#SjZtqtLl#M+%Z2r4j^?tQpvBvdXh5G-TJF!N;8we9+TeuPNYlVwaf%Qg-DNaijyYwcKS|%M0mGajF)h!zlw8*sd~4e?{ +<7)X8?rVu$0q>;CuOzy4eQ`$Ocgf5ZmT+4uB%9j8&YHvN;+*RN^8Wj2q)#)_Iif84&}YkwJp{RRJ~6+ +iv7wFpm`<+BVIv +>?TknM{fQ=hHcVK;dA*J7%DK+6ektoNAakiehnLW*?pcDlW+(+U69C$6voc?jL{s+XdxilP$Gc#wJ9D +PRX&@f=kpDL$B8wxzH^WRrSqEhw+S)Llg%g!afcSOXnSb^f|^4vp7Pcmi~5wHB#v1uKedNrOYwJ)%HdD&)bO0>v7>&|fWqH1p*_(1ckU>O9p^57{q4%#> +7>D!(A()vmxKa!tzN8r(3}l@3zMGhAY9>@ky7B;bVABADu;K8s{vO_>17e-4ro+5lyGfBILq&uSIaI& +m5%Wkl!97{u6D-5U5r*%EKyW=>V1Mx`s(TB;ZMn3E3j<4KIP6C<`o@o}*sGaX8d9&Wu-OGs%%Mu7=mI +rn5afCJSWL$!iUuL(;~0wlgsJygIb0HGA9v+=vJT|uG*$vlHe7Rv!kP;E6@oB9}dAGu>5tPPcLPPd7k +u_YLJ$!=k(Fglr0oTe3TDY+;oRWOY3C2G?kd;(h$>^Fp)k-~_>MuJjv$&J{E%JoEL@rm#iC$@(qK(br +o4B9t~bNoWN!}}G&ilC4?;fs1$FS10-YsXae8pJ5P+O`SRZ#n~19-uv1M=P+o!Jk0}$6I+d7z~sy!Xt +G^XGiQ*I|-tvQ17TrFn1#qF$BEm7;1kOJy|axJ6Adm5|gRJXX{0@xy4}Yw1+lL@Ab7^H#@A(0qHQrV~ +)JcLT+A0K4J|$uoY7L(yRdL<7v!iWLw@^P=YY4B-mJ5d^EEz=pGA52J#p7;>vgF0F;r4R$xD(&iV}q{ +T8*_)JcE0L5;t0Ms1`{ilrb~W>jhcF$^S17@8q3z}BhlJqk*0;PxWto@Pyf3&9Jl)z6gKz~>l=jNl{f +?2+0KcT3~2vT<^3nFrJ$v9+D$G(%Bas&d8o%c?e*X3qfg9-deUYJz={iPG3C)l-TxM=O!&Q7gR+OhML ++#{M>%sJvhF*H@o1`oYnJ%uOP4B9}(5UcFw#jc6ostY1N2)KIqIo>iGc+1hrEBvg|?nF`>e1l$>?s7W +Exy_AEPabu#F;L74;>M4YjglG#HO6}W7roRiB(kx#Rs;wi?1xxKoTPTV#qba8r;WW?&Y0rVtREt+ntq +L7DkX*{uaTaq6yN!M51j+;TA_g4ZK@>;M?ftz@zi>gMtb&Rt9}6Aqf|xAds_Hg`sYgR-TCNG+U~85F9 +8h2Ap(pfDYc51a{elWylOELQ9CibULJF{cL|84SfB>n|@NQH&0K*2nX4CtE4b;1`YN5zGJV_e?UU1k` +m_vbR!?d(tdk>1qR+TSt3x^n=&8YhzYXWS}$VVvR7qNH*A%Ciw(u}BA4%O4MiY&BAnIfuD1kmi=S)-4 +!*wFf?Jfp7K<^hCSxL{duK7bk0j2)^VHb5C|V}Q(){!+$_BFOnPA#pcK04bb!_dd_cl~A|EzKs>@ZJS ++~5>v2|(#0E|Vkwovb+3vtm`rkx93n_7g7@*LLednA1Zr8z^C>Ad%K(7T4nKTV&@(g_$a)oW>kD#I24 +2MJ#J1hqK5^-@RYEE;c@~u+buGdkO63|_sm!;fE-8h!^d&M&pb-fpXj?SxT#S`PTDiZvq#_v1QLbExs +)ME~VLia2b$@twJ{~t>(_d;&X8(2v#Y@11v +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 +J58JGED-1H?ESmFFygPZ=s2q%6^E +R7o&ZEmK}1Q!IRoqH=zx7_z5&ccritOP^yb<h1j&3I;Y@0u#jr6z-G<%}3+zJzW3M)Qk;#mYZ5gWRe!hG~-d2knNXaSea +WZeUjPR_Mky!FHN#+=&P1Kz_)cjtzBesHY9hCTJ>6qhY2s$#Q{%adU&^E@4KvON>-AkLY+r_wC;*yu|U0j%O6nb37vqEE{@ +)P{%Vu&9dQwctqARn~nw4N4mv%zsXDT1Kn|t80~E6j(hZUj}Bo;G#mE|Ysu#dc@s}~1XMErVsMPLh~{ +TZs$b;q2eeTHl3Pf}TES&y87os86AH&Bt)^Xr)rWReRx5|(#_+!0HqIKn#2Y`w0Xq&DV%PvhHar>**t +Ie^VAj5g**d1*J3Vl`j^p)y-Y>iarNQHuRYEn0wtCyaZa@A +duP66X)g7HLPxfUS>m2%_>dDMhXzY-aLk79Zz7Pmz{cV= +X1_7#+0X+}gzf#-;3WZL3ve0WGQeekOI$!U^n|Gecnt6u;4#2sfX4uj0UqPD4;hc-xZpCtWq`{7mjP1 +?AQ>>V0Ez(=11JVi44@b=wScJwOf62F_2eb_fu5C~U?pH`0Y(Ch1Q-c05@002NPv+5BN(-8=mAEe?{( +|ROByCJ8+wA3fTRT&2{001B)~|3kpLqBM&SGnHs5ge+0bL`b?c3F11rRPMVISUkzDSwnLo|H)FcOD9f +Hm5EJhF>rGvqg2ZHNNfAej6(8$f +n)&50FtnVZ0HFjgH2k2Vg-s7C{~~d7tE&7beci4?aoMEk{{>^BrA}Fv1UV0AX%{)xW{bh2^1?&Q+bdI +6f01yK(YGfJ0p2XexN6itU$5?$qFPZkR+mQ1a?hCk6F!z9zd}I#R?QFP^_oF7|BcW13iIc1(Fp=66$3 +`PlAUE6f01yK(PWv*mO4Z0E!hT*0%lpNM4d3=m{h%kgPzm0?7&_D`u+##R?QFP^>_)0>ugxD^MgjZS~ +~q171>rWCfB?sBGv7BrA}tn5_yFD`u-=wklk^f{_YFDj2C?q|S5QChG=PDp-NgXG2dgQo%?CBNdEPFj +Bz?l)g1E(!fXqBMpqSldsR@CHbN8O{W<&lZKvP1l6OVL^OzelP{BBX<(#*kp@N@7-=W3p2Mj5ILPz(@llL@U{FEilr+2*fEHdVrDE_qt7ZNdqeltTeFFFk20bG%(V +@NCP7cj5ILPzz8x&HuL}^4UDuizL@Zm238taA&AO`o?xVb5!ie-^aLXfj5ILPz(@llq7HKQ{W#YRUed +uz2P++{bnHn7Bj{ocI^58?8WK>Gpo5yy6rU5GHN|6MSx^_oUFaq7k_P=~vW_y09gK7^(!odvBSe1La4 +j&>!AJ)q9gK7^(qpgNf|qo#(!ojxD;;~%!AJ)q9gK7^(!mH;KO1_0kq$;W80laHElcCVOFCHTV5NhVj +y>sMq=OM?ZZ`A;BOQ!%Fw(&Y0$(=t03-d>9~Qi%gOv_eI#}u0lMY5Y80lc7gOLtKIvD9-q=S(TMmiYj +V5Fb%#e$b~u+qT_K}kcL%Z8p{L>e6GRwFcTM9+=Lw~17CFw((D2P6HAhZek~gOv_eI#@x5%*JS(CTJ> +6qv9rD+7Bnz{mh21B?tXGQh|HBLj>KFfzc%03!p8jIAT0qvyC_Wq_ +3dRtENDfRO=41{fJ&WPp(YMoKFfzc%03 +!p83@|dl$mqu&7hW>J$^a_^tPJc4p=Lwo$cCO^WPp(YMg|xeU}S)i0Y(NG8KduUlb7TNdV-Y!RtENDf +RO=41{fJ&1U0)Mq%_!2g9tT13CnP6ptl?hfR_GE&Q2}ULunP6mskqJg77(s~3h8|#Kf|0p-Ne1}2Zb-%1&=ago>$7q%+b<9W+McG(of1&EX{rtSqpyz{l?7H7_GEz(LWXSU2}TweSzu&=kp)H;7+GLsfswU&i8;Jvft3YT7Fb!>lLbZ=7+GKh!8aR +vf{_JA78qGzWPysc*z1Q3#= +@#valx$j4Uv+z{mn43ydrmb&vApELC>IP&@<>6^bC4ddRBT?u +2tz#=~3xX=~3yid5L8>p5s<}HhMOCHhMOCHhMOCHhMOCHm=p^(dp6Y(dp6Yv3W_Fvm?jt^z8KP^z8KP +^c?gY^c?gY^c-Ak&|}bJ&|}bJ&|~uw%Wyo$o%Edaob;UZob;UZob;UZob+5=YtduTW6@*LW6@)s>$X_ +8MbAY~u!0QP(YZRBR!7e2$XT5%T1VsTWYIcVw2mg-5h*)av~DLa$vF9h0%g%=)(Gu +dBDffW-jd=+KhfeCPlX@#i4`!!-%Q*R>BKtUG(cvJ073pM80>@XNt$})2hz$&!1*|LxlASFX2v3e4Rc ++^;EaT*hf*Wy+j}x;NWCJH|a02*3j6}S9$>z*UCvKeZvnX$>42hy`=$a9#Xx!u_1)k~zlLqNAv@#=-3 +++l$YDR!i@N_1{iO9^Dr9uc>h$M|?a8v}1o4mv@IgW~2a6E?eS`gTbeN?bY1+MKdDwL+Y%N#dQ+*}#* +LTVoE&DkazH+hM{qYRfBEREhn&3g@CbeABICSET&;S4A*9a3f(r6$=yjR-#U0+&T}4c&P_Q##z +j$dWPb-@M()*!o*g3?@VG+E;g~^}W0zO!%B61oH}N(v0s*Kqq@#lyd)%O-4la#&-tf@{$72veM}03)S +tocgs7oOPuyx`rITv|7Jpnge`M0Kh+{jh}wn>h*ksG9n0G+~c&xHjoOKA`CtEe6hab(<19*2pxlTmkcBRiBm;?mIaN<`~Q!iAougPYUtB&IH$46$QP4Y{xog*XXgL)|j6(WY5-CEO0>V6=O +cr(>_OlL$J!?mSuE5qTVPpXAA`s@4G&^H8=a@57sNM*A|Ing}Kt`#>;TVE?5_(R8Jgw|&T`LiYsz27X +C>A)2^S!UT+l8#UxjYf8Yfcmz2{5NFa|$)6PDN4IldWSpG#0W*gZ8cn-Q+e${oF)ywiWuOq$HnPh?%Q +jb74}OdeUf4AnH+f0n7Mz-Z0>?s20z{Y`mXW!PLm71jA{7zZ%*5x8-E&N|xhz}k{nn{3L18VrRbux7H +FM+uXI6_+9S9^&1~bGJD7Yx(Wn75`sF@Krd7N=T#>v=qmW*@_>ZrljjeLvMT>t~HU@c@zI{+}^P3Dk- +0BvT$ZlZASb<0h1;mYJH+fOAz=^LEb2kx9Cg1fw5y5d5fA;@QuW6Mc1X6cYKL?EvlzZoZAIC>^bnC(p +tm~BN;tDv14B*IO?I~!&Q?2Cj{$Snb}+&_*WP)K%Y+~g$=5DhkKgu#W&I7JACyK~mr37G;B%V7-x7jv +ZQ+P934p~ZI3dd@@g5=Z{3h({)0LQ>0EY(v~|MDE~moj4?9)L1u%l~w435w05^rlLM++~g(JW$Q3oNE +L?qT!=>s5t@^SG}69KfKX5%jf}4mGn*>A2w@GbU*hDclll@!m8&8x+~gWSpFKoyk +Uos3Cizl06c^xM!}N2xaZ5p>VAmN~IyWnj8rltHE}??fSl4k4oJj_JIf#P07i}8d8aGu5xJOvY-c4Ae +TKt9-LwuIc0(;N4_p7X&N_qi4kBr*}v$UYid>(yFptb{{e1eeKR%o&k)(jYfWuV6-kBm)HyEoC8}XSk +1~){kmL+wS;#4vwl$Wbh(xGX6M->ASdgBLK+RZ;ZYO?|QCt{yJv5hVvvlr=q8K#qLRQE~of!JFnIOY1 +CsRe>gDu2%!W5CdHE!|}!ygAaxKS8ZNyR$((1IH+WV-^OR8;4%JtY4sp4!!oQbY<`&N`-?n94pT+s-~ +FD-_s*Lb|9^WM?QG1&!WOrfkZ9@*ogtJ5;};^3OvR6Pn*#$@Fi`krRLvG*L&rvmL1DyQ+1Af#Deu;*3 +;FCA;jzyCr0&S&_Nx6q2712T;mjY3 +N(Ck8g9DEsKy?bx>sV+z-T+dfN@PDXXHelj?!aQwYwFkK|vqsdMB^fRZ#_jEl6@6{hZ(AC4T-MLnDas +%!H6e%v{j<4cRHUfYn(k$iLNXb@3rGKALz?fD&!clp}p2R4~k}%$ +CkGFgMbYrWTn>KLj&Ow3A+Q-+Yn>lILytm3?`0f(!@Xs#jyJ0v^&(jI +!@G7Zj2yEu?2gU9mSR)C2d4k4#BEy7^l9wvzDPUw<+BU(?B*+ya>Dh{-9M%`-xPQE06NsU6P0L|1TVCzlyi#uO?RN*6(gMM4(4R6e +;Bs@{wVb*N66o9pj=Ox>%qFI;n~@4O6y8(Y3EzpW+z?&KhX7~BrS8?`6cGW8Y* +WZHqQRL$2I_*0jE+&6Qo6*7B_G0aBacxqWQXv$c@*Wl7fuDA;ol6pRFQ2f8_cVUY8evW8@Sev@Z#Fm( +qu_QR{-c#krk-F#!X%l3jYYD!{x-;pQHti#0?TLPb2k5Kanh>0%_vBrRsfoaEVvv{U$FlYLN=8EDk;C +5~-{-4Yo%`KLztTSwPk=$ZBF-n0;u9V!tYRZ0|SfUY#!i?qXx}T&8k&7X09g+_9lYAnft-n +V#9AZcTXc(zE4@Tf#ga3U%YsVck13Ke9aBin2&c3)5wQ^7ZHuK+J)omo;}mpV@PJI=nU5U@IC +Zb)s$XY9sk3ntOV$Y`0x)!1S1CBghtd(23@yJ(FIkMH%ZL(fzC+!sQ>$L6(>0YDkd>#BgXd$)rc^W0F +a^Yt`j{X?opr_dnlyIpI>+tA0ooE3a*M&MIv8e>ipAV<8c;rp)=bsfb)P%axFWD{FnP02_nW-LU=+dh +RH{u4#mh*)lqs8`AQh_*NwTKyTQ_1$@`MNtg^Gnzciz;gd$lS5Cex=nZyh*utR98%nEBAjE{<8)(qXm +WB#2BN>{!9{lG3yDyiVO~2?gu$J}MDNuH!uUDQi))8@q7Zk;yh``9XEy=4@M`3ozO&kk#!0x#60aztx=U +Hgei=-XeD|>#ado?Di#t!<>e~I-a08t_q=q09&tNVp?nRY0sLNGZ#N0OahTCxEf(OF7J ++R3Y_do3E>wyZT&!W?3!naOBCmXyidVtEG6;?6_`~c`tiE+g-+e8N +nyYu$50wmx}41SfgB;xM3D&wR4I-s-pA25l3zAukQyS-scTU8>XJLCh^q=P5eZFY=hR^sbt{gBVuyC4 +WL`;Z+W`X<(OX2RIPoxbPFVh;DOJa#q3D@5*ajO3@LDFvr%`{86*0=AARGIE(-dgx%ZHWrynjoUf@wqsFv3G83$;h}|6wB2PQC7WX7@Yd&+khhd#Acd +Rg`HbJFdyTFTXOk~N0JM~;!`P~~uM&J=N*JWQP>M3ewYgP_>kRG9j#D?H?ln~Rk0CWzl({6ghy!7Fbc +T*OCq-7}7EnMR=mIt~#lzR#mOb ++4u@l5&}x-!Y7h)i^HY +LR8D~)1X8I@N}vr{#Hrh^D#vx*j`EdFQKPu?UN`Dqi?T8 +@QCfR^lqui6w~3Y=Cr2r7Q3Q+$u`|&RPe#2&!76R%hn%|CLS323AM=+}Vb&!k?tGTaJfakb2Ms3dT>< +gVUt@pqNIDN$cN`nky?WPic2g)M9>Wiif~FE7lpmqsJJoEQm}4U-z$A|=??9v8iYys7Dca_ +B57_@O$?iB_!daUqZcg0-VIDxU`VRGh^F>sg1L-0)HJWZ6V+>WWD60vkCA>p6babfAb6oV2r7SFS>AS=RI71An<1gBS=wj7&x{;a)CFHTJOUWpm2 +=FJA3#?cVmq=Gb=>8(-l~06KPzGAAXR!+i+!G>N&3RI9*yG+JqFykkYNH9dyqrx{tf#8OWBpayHV +JrbP2S5BQoL7jjB2@gO^?IDPYQ8C)@8<*FsOD4C;!;y6CN#-nS8;QO_LQ<~nMU+P}HYg-{bNR(I2=Fr +Lzi>s4_Ko=gRE2CT=avzY5x(mo05^>%yyo57?MO=u|J}0MZJhO4oz)W00N2;rsJ`8*4y$f1FC~8-Mid +H)IxXDYp^0#=wpq8$%GA=mFXrs0UXVM%u>e|+DF>^^URdbG$Wu|@eYTkxI+%0WFn$n_^R$R7LOcW!$l +}#15QBb&RWaPY=`28J$&yE8K?lbP5%JGX-YWDzjmpkVGu@onX_f3gM6`{eNe+M@U5RLbDAT|dysH4RYBC53vGAm;O5HgiQb@eLrtSBl@KPD>S4y +*dpEMdVHB2@0fX-iS%R{KRUDaOl!t{{4RXtggH8|%1y@Z5#QTmMVuT*t1rC&tB)sqB(i>%5SvcB*>*} +}DRR(gra<|Wj<7WSJ_FKpBdRh*X}TZ&gkg^jBW5J5&L=v6LCw2J7J)TW_Vhi@Jg)V&%#4F(p9cvQuzm +l~)Jj(OmmXFe(0iukce4})As+s22Kza+sn_qf!(Dos2@f~y1|{=z;e@@qg7?r +Xh$v+!RGnGXk$mN4@K?GMP9>Nr?Qq(4>Rw&RLkbgI#j?uMar&;PN?7y8yAVvJg`5-!<)RKnuUG{M4a) +P@9cP8=Ubl)mFcPY&?%Je!yNC2X5j_ULnRpmcZASNKE@?JG*QgK}+x`N$_2i3h +w_!hO73@P1)YPQfTJEZz@^2wWC%+obrJkl7>vj)nMCfT`?_vV>g*7hAsz>{WRQhgW +%l-jmam+*8RF8^DzkKgT7Hv$WBN<_PFW0174lSvR1AcobNLP;iQ-6-zQV$1(IGH%|2R8fzb4A_U>I +8|k*^-3yf!W(C*dv!^8;&{AK1-!e;hbf(@s)&LFIXy|<|2@}(=+^DASj4xF8x+LRZwongUK@`PAWD9_T^6nC-DaqszhA>SIx`K04*{%} +0Yv792NDR9m9SR1fG(r-<=p;_x>rMqjiq`Nfk>5IKpkEkNST +#eEkm_0t{Qw|pDwTwAV|Yu$hPZ^g1Xl-Ra{0%gWl&wknCvmj=tmQFl8w+QW>ncV3Qf*qa4hTd34E;Y7d3b3c>h +iI=#x_ZxMuMP=V-Nf5H>=Ih$H;+Q%bfRHiuRwc9~ZR^lYW3DI*Ii&B@a~_83C#AjsfGP +i?+lM-6rg<9VO;eftv2glvYHKTU|_af%h +t{o&Z7Q^pdI@pEeIRaxDsc6_tG4q_9FahWAre>UPvWntWKiWau3R5cn+`!Jj~;qeoYEwSG1MaHMNKNq +kl4n!;w9TXA<6M8mCcSV0;{+T^+)ErYsnxM0JbST!S1D!$A;8~)1FcHN;J!(seVT!SY;L}%vH3lBNEa +*RfUK_+A=6XGF7H*zvxN@uk(K4CFp&IG9U6oiXNryDP+-6M6rO7A2R88s%RAhB@sgf7Q3rUQ2LD0L(W +lQ1XXXO8qBVsUMVV6Nu}?oEGURl201aEbrV@$O2oKwsZuIqj|(qh3|GcewGj}3*eWV>(^Vy>%m1|b5(lCr>oRnK2InR(?>bsfRnq#Wx-Ard5X*!;Hz) +%TF+;1ywnWaMLQml}!9Dxu=9QsQs%t@}>*E?6t>T=*m(PTv-{_r>cr +pM;67Su=Pt-XL=CbAgd~1D{fM?IQ!?!lTq52_E&`olFoEML?Z02YQ{Y(ktZLbBYj_9RT +so9sP-H+yGpkwdD~PKpm7Z@xa01+>t0!BZMC`gEQY@;J&KW#2bJcoBVURQx~iv$FS@Ec0jgd+y5E0RP +4y)zo06X=8jNlKbUFcB!09Q~rI)4El2L7tF&W)K2Z +J&HOD4Yj61nXMS0y6pOgO5JNHZN>X~OkP-NNu8WS3#|%8(4k$oDm$S^7k-eYeCNFV`7Ov_ +g#lq67A?;+Nqsf#F*)A!(ghHk&IgI<#K~%kQnl<0~w@TfsD_AE1T2LUhlq4g=bk0c0NS&kFb@5g2d&SZh0{E)(e$ +~!W(PW(IalDTYg`_IWL%b)^AF99=``1pgE$3~!qxZd1G7>r(B}IBFjFA+-<8%^_O3%u6byYO+YH%r73 +W}sTh4$(mm%3L|?V)m%m>k=5f~ObdQmwk)>Z#IHn4PJD5h2bcH4?2DfQs{dHk>)hxCIBObhYpJNwrXt +17LP4@N_LB2^M8}T$4udzw75E{A=Mi&h)-lYO)Nm)KvjX;2L5BqNqyGa(>8QvE3vWc3lv%v2&9O;uMg +d^FVzGJ~hyCc)cTTLGDJ;4V6don>x_Vr70jYaVw6bhRS}r%IBn}$2o4FrF?dK_5M+>xcvM-UIl-5@qY +kNO9KQH00008031s8R!US6?w>IL00O1}03ZMW0B~t=FJE?LZe(wAFJow7a%5$6FKTaSVPa--WpOTWd6 +k_}kL1RcrQh`{67Y)+XtWuTWRM|aA9#aITQjmGv?L7tWVE_VR;^pz+Ul0Q+Qt6&jX0;Y{DAQQyMiBF( +Us&$#*O&0@*W=k<~RTRze^l{`0R_z=byFXi?5GMeEwzox66O>yTAG9H_7kbW2 +@P-?rafQmt!0#6SJ@PcGY=HkX(>2H^>9^ +d@+>G8+Qzg)V)50?+`E?@of;fHr`pWlDKRBs-?dwTiw%eZRaKRrBL-oN|)!#}#P-(P-t_w(h|%eR-Oh +u4qqefWMMK3rbDef?kFJ@wcB`0n-N_rHvxpWnXjZ)d3f@bL8G`(Ll&AHMkZ^7+I2uJrPUhqn(;{oQ=^ +^LK9^U-cJ%{`l(Q?fZwz%lDU`#@PEG&MS2vLcV?$a=E|jhu78p{pI1Y|NA)i-yfdd_mNBfB>j4}=Occ +6>2v+tmmh}yKAS&{7yhn`{^jzf&&JcQul(enUV`(TzP>!Z)nR|=*S`Ose!%`l|Iy3p^4-Jb=l2ia|NQ +3TeuVzJmw*54n?HW}?KhY0i$7ofeS7g@`{J8F|Gxijzta6*`~3Mxk3as@OYrrjzpJO0Z$JFfh4%ye>3 +Grp*k7^5XPxU07AK$$9TmN&P-uGSLo7a~gUjF@|PxGsX$6isFmwk!+^vnO(9KLz?_OE)s{UzrG +{r%G@O6Lr{qg&L==+;@@18!s#Jl$ +&#;^Wq>#x1$l&=4hZr60VeEW4D`Op5l9AE7JkDJPGK6>68`g-{9KR>*E^~EJ4}Ql_f}9x|RfOOY1*V+}?kNy0wcvbH +CmN`bs~3fxfYB3-pbJTcB^O+yZ@LaTe$stFu7gSdRtz#(FH!H`Zf;zOmjG=o{;4fxfYR7U&!6XMw)4U +KZ#Z>t%tyu^txa8|z_#zOfz_=-c}HU!ZTSj}`j1u6KpLturU; +=z3P@8|!a{zSiGQg}$*KEA)-^SfQ_V{T2H5e!L2Od)HT?Zy(2lzP;TD +qN6e8>C4<&8A8QYqqRCGX2j4eBXIiV^9bYgtoN}x`RT|5Ch +p*jV3LUju8gg!`tJfXq`dP0*8_Jk%I@Ci*e=o4eNO~6lR_Q9VR`)vY%Vr-}h1d6evCLkz6XMs``3?LM +t(?V&CPkF#l(=>oXP167nwE@xu5;e^WP}DRHU{M>Na}!|HG!39p(=-4_P167#HGRGXkecQNL~8m33nV +pvM1@lAFo06i4g)GRZ79G})9wH+HSG=nQ`7DMGPUtZH33ac+XdLvR4{;3Q^9~vP2~VQH7#WDsc9htQ0 +*APK&Ymb4Ma7qY%r>gm7T$;Hdb~9quO1c;-PdvD}zyOKr4e$`=o=;7#N?#!Ki)GK~JUote319&~H=>j +I)4I`>4|lM(z4L42;@~{@^&3?u&i{N=Hd$Flrwal)fHkPb%eV{S7T +wTJ!`g3__FGZ?jp4hp5AgF@+8*%^%5LuY}~rn5ll_ym=~sC|57%3##Kj|&7w?c+mG2BY>-mKluN4;>U +rRUcr~q51%$4wVBKbxhK6Dm_#mVAL@_!(=e(Pd>FDVAP?%TfwMfe0IoS)S(&!qYf1e7DWJRS14We4HA@&{o| +IPbZi&51f^rUxFsm9ItG-E4->ZprDOlNB`Do=P$(T0bW2dW>7Y=m@4hmWjtaVEDD}5rP^z!9GL-83tP +G{cGzOql-*9CpJ#<@_rZZ{|$pHOZ$C>;d4-Jo=Qb#*%#Rnw%i6 +by_vcQUFE=qxJ+#(Oy#RnuV9?POFR7)nn@^#Ofjm@zPvo{Z`PL+Qz=nu-nzrDIjzCMYdBD3p#hcblMe +(J`P@D{6*PEua}nwSZa;-V*y(NsO7%5 +vfl^g+fzt6O&#gddjB+SYs;_zrl<78AH7{@pnRkJGSWKgTjmu5dP&8=IPD6hDu)$HwZX1Xs&ZJNRI|TAsrJGZN>vUkl#Z`%ZYz{(b6lZRo8 +t-|&dZPrUB4CtUU2F5q`VAQSXB?|_0mK6h|2>?dj)QtvU;ojtZKdJ>VQD$*kL9x>bB_^P`c?DP&#&)35>dh4hp4 +Xhnc{rTj-!rI(C=|jJk~-W&)!oO%xb4X`;ZWsi=E1VPKpEjGD%Ws|k#nG?ie~q^Sg>CQT(6HI*R@jGD +%0+zE`DG}&O(q{#-OCQUXNH4S=9VAQ192css@X7;HK{(ps7dt!Mo +m@6fYPy{OkmVhbqpx2YLY?e*kL9xYEsdGQPbEzCNOFmAB-k2Y8qe6OkmVBc9;o_nnv$$0;481|G=n8- +9IpD8lRLVFltgi5R96%DS=UwI)Y%-q!u6;HQmQ)!Kg`1KQL<6#s)^s+StITdD2-526WI<>8za&jGDF6 +fl>3|+yq9=jjLORk&c(tilDOW>p~=HLK{rs9EIzM$OuTz^GY!5EwO +&uYM;mYSyL%M$Oukz^Hlj+9oh+)-DA`&Dy2Fs9C!d7&VVwY6hd`@deQgM$Hjp07?fdXE16WpMz#FYHm +6PlpcBsl#Wm1GZYGB4d9s>mfItG-k(gCGa$A +HqYq0C@ZscL#d>DWJJFsh7#nZc+sKB3HDRMAxjqsp#hK&dV=7*!6P7D~tdF@sTMYz8wJRmNs8gHdH{1 +~VA7XrjQVMH2-^EpF+bN*7HO7`3QL4@NDT7cgoWB%HyhWvts7j9LcxW-w|Q3wZ{kmch9hj9M0X3!rpR +YzCv2MQ4H1vG!*$YEi*}QHy2{j9SK0pTVeQEcF?TTE#zLOKs3l~BfYQ)Gp;QF}MlD* +|VAK*i?Wt4_rWuTqhiL|*fV#FiPg68H|!WX$GU@NSeVYS(0WjN}i+{jFPEn2BYLEn!za9ie@ +lMzM>h7lCfw8qvR}_!6;daW-vtFiL)&8H|#lX9lC>;F-ZFS$JkJY8?=t!6 +=z}W-v;wo*9git!DeWZFv?CHFv?aPFscrS&tR0zJ7AREJ7ARUJ7ARkJ7AOzJYbX^JYbY9J +YbYOJOzxhi3W_4tEGTZvb7X2O1_o?M#;!hz$iIQ3K%78Ndcqe9VuXx%pL`dk~5=#Q8Ho_FiQ4@0!GQ+ +P{1hJ8wwaDH$wrV{ZTvM~z^FF%^#Vqz6<@$8wc-mHrB-|aqtuEoV3b<%1&mTFzJO6`#TPJ2t@r{)sTE(qD7E4X7 +^PNx0i&8G8;ok2IWVee=D;X5>kAmAW_V?;e!?s)~9lO*5M#&PefKjppEMSx@0 +Sg!<2fzYGso}qXQR?q6V3a!V3mA2bEoT9v)QVrgD7E4jFiNfX1&liGdI^+{4P^nN)SF+xsQaYTE*Q`; +Rt)I0r_#IX1B|+>KESBE>I00rt3JReSppU?N|t~HjFKf_0i)yqSimUt_ZKiq{rv@uQh$E|qtxGDz^MB +`;{ryh;lF@U_rb~qjJn&X4W-&0z$iHY7BETH|7P!N7R?C!;nw0G5+cn;Zbk$*4^ZfaPS=CI`TBGHR0pU|FG5)38FRreTFrO~VSMnuZlh$0 +w9!g;K5k6-u@CS18rmuTZMBU!hcMze1_jeuYx4{R*Yy6UtJdRGUGC(kf#%8)>lI4JcClWebZi&v6-o~s6iUaRv+ET~?>Z=yj*l$s6-w_qD3p#3Wlc~zZbMlUl#Y)q>&d81&HD9Z +)TU(`S}o0|3O$*4`u`t@Ygre^(`p>!;uHACrGKx>B +5u{_ocrHg(8N*A3LN*A3LN*5giN=GHHHz?gS0Hvc~)*F;=(-?r#vE{5cC{;<_pj7vR+@Mr9eB7W^cYN +HSRJVNGpj2f!L8)%?n4olgLRlv$9gX&Ng3?{bIF+jNzMhQQ)OlY|Ms4c6uP386HQLvcQJWg=>&d7-Fw +Sx^YE$QZJsGvB(Y~IH+SF)YPeyHOw68OiYO-f2)y&OMI`*J-hSF8XfYMdRfYQ-uUkj9uU1}{*I_{BJ3 +zUv~B-R3@V;@@!l#YFDEl@i4v9&AeB5E!NI{R&2@d%uEFH&qZArDpvKMyWTyf>G+tuV9oq?<*LkM*9jzsRh1 +*QEGv&V3bbsHa8S1?LV@)eA_jrLOoqi&=9RKX +~9%_|tCu6YHc)HSbQ)KtbjvS5_j=oO4o8@+;2YNJ;$N^SHCMyZWn!6>!SD;TA&c?F}?HLqZly5<#(Qj +@%bQPZNcK0ECOcS1@WGA6Y6Gr6zd=qtqm?V3eBV6^tq>DKJW1^9n|(YhJ-9bH3Y_#3erbT&8x2}K(_j-f@IHmAV8TDL9Sq#GeNF^nNvNkpqX<$uE3d-J+9!HdhmS&nswjg6+}}PzK +=k&?wq`WY3jrG5op%ElUGnpo%nPG)>c;wxVE}l0Jhch4zjIYr$F24bqcnvUZ;SYQaSnvG<)R&Z))225 +op%^&{qI%^}YTe-0JlX#8t0%Fs^!?0&>+g2Fg{}7%*2|E#O>rwE%S0)dJF0R|`;AT`gc;^_2(gs;@j~ +SG`VwyXtic-c`>IfLFaLLA>fU2;@DdA%J<#CAb25n>B-ajv2TDd(IiSf_n}cxB`3*7Px|ZjtRH|eU1g +Vf_=^fxB`B@5&jDLh36Fb^PTTk@XvR;Ujabh*?t89eJA@B2=uM&S1`~wre6U;-RH$74>Hs4N<*o!`*$^-{}hdqKX`iLqM9P~~1h`#6}sts_ +k4IfxS_{FB~e?t1jruKhA{KcmJe?tDnCIdi10LCTGdQ?Aeg+)ey>EbnyY~%naQ7|&4({F)z`@m3~2z2 +3pW-Rm73+@Hg2pxJ8~9NfK@!NJ{Y5FFgS2EoDIYY-gVH)#e3cdtrtaQCVN2X}ooMm)y0d!2%VyVof=x +O<&~gS*!$IJk$849#A-;GnVw5>hg@-D?>f+`X2;!QCqt9NfKf!NJ{Y5FFgS;=sY(s|g(3y>`IC-D?LN +JiIQzL3te#0y8$59TE~VHn|-VA~QDG9TGA#Hu)VALNhk`8xm48`bgGD!H8eAV8myK=EcW>W>q+%GdB4 +k60$S4!&!mgpqvm1=^2}>5DD=ao4gPS`5ApgF-YLx@f^?u&5m0F2M^~hfrEzwm%zcpiA&(%QFUZ+@Ti +J<0tb)rCx1ea#wKS)LXyTNYehno#wKq?LYBs+@PvdgjZNtZ327Re;u8|$G&bcYB;;xI5xom=P_~VPM2 +$_pjf6;zO~#FcOpQ&>jf7B*P1cQsREwt+uf@G9K3rKfP;6h0&wu|RR9j&T`l0Cycr2e +8=K4-2~it;M5_QClwTtuY-78JQpmtTSvV5nHa2-U67n`SnK%*xH#WIA5)wE1h-&`iU|fBjPY%Y_*ZJg +NADJ{#F`{#w9E_{4{K>(%`Z}K+jH|En$-z)MLqhaMTz#ES4u;Ga3E>-Y_5QO!v-h6`n!W!l(Cpo2g=X +(ID>QqzS)o~pXBqVc$T +m%Wx9FZJ@cZFu>;9a4)Ss^rQ$3{Fy$V!lq&k@OKc?p{D{+&~^>;(xC9U*@~LPkf(V2}{f5xTcOA*Cba +IY@}<2w4geaymkOfP|oqkRc!;sUu_nNQmkPHT)B@Izs*Ygs_fKLq8#{Bh#48sh~P9)6G>?@z +4+1Ky}%~}P>>Sp|*NLc1P%r_Jr +_`xcSOY(Cq6xL9?&(1kJwA6Eyo8PSEVNGeNW0&IHX~DHAk%T};sIbumM;=ztuLxIG6(o|-3L=aYjm`8 +uB*jLFye9A88taX3sk~IC;f^gOe)(9GqMU;Nav+00$?pIB-y{_k?_pQ13k<;3FolN^o#;MS+8pD+(N( +Tv6cQQ_N?b!aa%S04wOwf`U>BxJit +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 +xxjmD$JV^BXFEvADsrQs~0nC5Y^81Wli19iIR5 +@+M6JyL7OKcPgT#;SAALZ}$BHayImqWI@{a4n13m-NE+#HeIls=i9;3XHkdVbx|brH-!> +Y*~mcBp5Z52ceB*qb-q?#*@g?M;_xnIiJqM}z6z|9nK6jYeTjNl~^H_GKZ$vSEPX7JZ&Q#J#&85;5M1 ++To2j;&3nY#(At;DYC89d_wm3nKWc3hs+UDuESxD{mz;-tUlIHD&=Lb_S{D{Wk26%&lu;*pG2+F$!ap +Y8;l!`My7;whwuT`y3B^>0rGrt42MHJT6k@VN@lP^%ri)V0qkAdZc%AnN0VR$D +(y`~~}?(JK)Q{SF^KzHaufhg-ae9>IO|ANUBZzJBTL=5kT7W`MiI*`!X9C0kira!GRKTrL$0B0&jjiqHX|745Iz0YEgK=^oI^ +Wqo^ZE`$aLGd=zC^wSMUfuB7K|4~03y*fEnZ%z)6PA`tsPjAi+|D;CdKHGVwE^jk+R^~VPDqX6>VxFn +IQg4gD6f0Y@;Y}bUuK`PWpSUCs#vHxAk)o1&FX5F-e({-FIJ +WNTHY6B`^5=X?~1Y;pOsl!XLEJ^*h-XJrDY@Q{?To9TdUo}J*B_(7SeCyrsRhGN!&EB80vT`HJ?CXBFjl_v^vEEJVMt>L0`)1* +uQ~FUYT{Oym<$llwgQatouUfIU&iC%b33P@&I9RFcOs%VIv0hG`1UFaxa&r0l?ER%WIQ^i0IXFK*IKB +Mvy_@Si?XJ4`b&~SCdk4X}a#oe;s(y5eI{|Nx&JSO^6$d|^yg9l2&}e^ra(Q}maiNaS&eef>cW{1ra` +^tu!MS?({`}q9#nHY}7g^T3xN&C4$>idN6M0uSPtLPC&6ibY`Ue-@$|<;^Ss^=sGDwd?ya{v;B!mw40Q!J}q4cF5L3teBneNFN>m_sGo|e +Zl=CHaBCx@b@W`@NGtXJ!i|jmQAejQpGYdtc6JtJai{9X``nr3qSmC&8;6XEx?JBc9m3wPoVGhXe%x` +Jm+4KqN|kv&yG=_~W&g3xRx@XFdfhB&>|U+!uALX1O<6j-RkO@Nsm$(6m&q%a(RtlwV7u +AaV{uo%aM4)o{Q2HY8|l-TOZV*8TK%AQcU-2c-Dsk^!}KTr1&991GQTKa?@c=Moz-zW(tTS0JnoNfn( +YT|J3?RS-1ajy%y;KW{}n%zemmPwF#T8EpIHAy_m^UEDTW|+0_h+FNo?Gk|MkN0wZr{;4g=YzZj1F?_{xuYF +%3oJ_w!>~=!J<){1cd0zia +*Am=xWLKEc!9bPXIz_vh`0rI|;B7G9fZ-ZGabKFIfgCWq4d_M$YoOFxKYR#a)Gf%6@^&l+O(u%JJsKjBb|EuI4Y1O|h*JVqE!J|~xAEZAg%4Z4?MgU)d#Y0gMK2m|Z +ufM~J)WOA1k03*9B-0yetAPht+o +M6Cff4O*A){{v0B}Mx__W-&z77$<5>pIm-})m6Bm#Eq*EKX5Q7VJZN+H%1@-}B^_#Lpum%(udP?W=8lB(Uh?985!+9D$|Uj}#ge`zB}*h%JHfos23m*0K;UTDw_3Qumn?tiMsvK* +S+77}#=L5=?0D`YV_?)U#nAa!9S~ +g@Da=Hs7)F!v43a|(4lzQwo$z9cYGY(c`LX+bJg~?HlTky8NeL{MS!5#^#FOnQ&lVa#Qc~=gU0T%r;A +8@)_Axegj=@S`6=r1wcVUt+W$DKg-OrImjd>}2N&J{Y{;+@nNfIC#YsDe)%t(($v_P+g$YLU3qT&6Qq +(19!VSUr$$!OQdT*so%9v#SjBl5k6jjQz~v#en)t_&YbKr31T1|(z#rkkF4KjTY!tTG?svtk|kiER)M +#=lAei4QR@vP5Ec%|fsJEl8g&Kc7l`9VnW1cAFLG#I +P-hD2eJo$Hfl2Cl*V-W0Gx74-R2Nn68S`-X1i$2;lR@O~O0i@{8#$=@Jp`M@Az>SEI6F6u1#0+8%!RV +7@akQ!KsW=xW+?TeiOj#H?k8eN1ino|<_F7%%zD}}76$gTbgZ|MY)%m9X3F-9Ghj6 +Cf@oXBFQea{&Ggp~kdewxp6#0nQlhL@jYzHBnJP}{<|7uKi!Qmge>ZJ9GR&U9mj$dvh=fR6+!!ZSm4U +;8?<>KXjB{zB{%SfG)tSlfeK8VNOm=|GaD&QXu67|?~%SoD#*7(rRcYtoGo8YYGD=dgU#&?YgTAPoi~ +Vf{-;HOyDid|6N=^UM5VU&nx|Aq~e4BOLoT#C%YuhPZDBe-JzogwFsBSf(&|NB(jHo=56qd4X+Y1dzb +UY9C`P2N^sp0Dx{B@FX6&>e@cS1Oe161V1u!5Eb5Gbi~YEedXo8rn~t +?KPeE^xc)tehg9nBq(2|WrA6s7|nA7-iXSak5u^PO`SekBjA~6B|7VISPu8?-U<NFm8PvShg}e;9WL`Z-{R@f{%QW#N_|Ug$%%iSU;NBylK#!^p62}nENCXNkjK~Qin +$U5@~KhbK}DjH^orKA}%pV8~gwGFa^+Fj9{=~!!m@(G%$zd1#*#v$r=ELh-DE(QJ5Ez*n;IXD|~1^KJ +r3#V)-6K0y^LL?!w?AR9F&WM~yrm2^hq_5SF|K0D!j=BxJ1VMf35J2JZ!rFZKYz691I;{`VgNG8y?X2 +Vy`&lxffau(bd@GPZ?%EqEa4Ni1+i#5w}WtWmTfIT0Yr3ayy=5sW9}TA>`4XhA=tnXx~gl2O+BFCJEm +jG@JhFOg4sud3D*Fd7X0lnS{khQde +u#u_0FO&w~Li1P$|t6@3PJL6ksT@2GmG9i%WjQx6p^*>nw#cEEUSoaMCH}>_X!9;irZv-O0s2K<};w1 +6UW53*Bq_B<*J;T=MlNzKd8Xm!pTDS<^lK3j=K8X@BfsjCYVyrbhal*Ei)-ui6ZzfRmhoT8>4@+45On +g6Mz7xD--!lXo`J)^IX0qSDpsyHfq;UiLM&LIh3dC&;yTrcE8|RGl{D~j^*!Qy$u3+@YsEoqLT!)#f0 +Yb9GXg_eq7f5MEIwM0O*C98?lmCBh(U%`|YXM-QHSL3+h>pO+nqkI8lnBU~2I57^uqKBNDyh~FE+HWX +l`x|tQTU#C1Y0%iZCE=OgOU-z61x#>9iQI$L_XBXA*fjF>%cXCg85o(5p=@XOdC?q`0m2^BGEl17Iq{ +ek=RHc@{Mh>`XfgfKxqWfvQWj43|WUj;gI#hiV?NoH!1+}7rRKr9Pwtg<--bSA;X|XO=4={!;Dc +>X;#X&EFj#%TJ`jr??iGQ1Bk&u0=0I85fPar(XSv$h*_kcVs!~6v_vtFDvcvABmIteJ`B>%Ei`G}C@8 +3?(j;DtQmq)M8&OfLh)W5XjFV9Xdr++#<`^Aks*X_{J>Dl{NuczlnZ>E>8&yOx%pS^kMuIeaiFTXwb_ +t3S?#go&Mw{EMK2bTxljCiNLKF=0vI?Y#kJ)Q1W*>bU`p8u#$i&fUC+5BmS_osDHr^{)XE#2aXU2~(; +D!sd3W-r>;iGIvi^_83V@rq4cW!c}G_-tL4&1;~q*Na8-HrA?nLv8zh)?r$)XkLQr{F=_3#uJeCkf|m(&8uubt%?VA>; +AiI-Ywj$tD4~^X3ajU<^`?YCV#`|Haaw~t?ovgp7&+;IWN{#t1c*dvglsLyI7_-jgc<2jdqviI-4}_0 +nTR43wPUB9ybU{S92GM)oi(L->Q6@Rv_y-%T~_HdA1E(1fzvBuSLV}(FAU|GB +nwR2E+u;`tA_Bm3@f&s-%K61U!IDY!Fo@Ke!dXY0|yi019rRo+}l(MVd#2|8!L;?nYz!)MNv9W&a(XhK +MtW=@{Z;`+~$r{a`i`mq=&XP=7 +jZsIgo)3#h)^05p&7aJrvE10Hw%aZEhi1iI>+#*N$Zm#|F(@$<5a$XVoJa{j%>A(&5hXml)3Doypc>K +}oq1hm>8C9k4;AO*s0{vM?vFwDTz%~R3W~W3J7g?$?cW3EI;NXut73g~JDsO>Iu!BiqF4@I>Iiepy`c +sQws1Ii<}LDhle)tWi)E44FFX$JUWxwa^@biF9KkkhmM&-O<`w*E5aS57Ru4t_sp{CLeN#Oq?>H8M9b +2eA^k5xCJeQ%3uJ+U)_+CN3QRnHqrlWwa>`h1OUF)&-9r8`@H)%@Vl?c!C=C+L5e`Xz?%qDl8dA>&f0J%-nhT~wu6{q4W@(vJ_GBz-*ihwr|#<{O$U3k4{qu^-!bxM}D+=4uLEjsI +W*I?4&4BD&`iUHh9QFB=}`~TgJ6mrA3Y@nvZa$PL?4f?wEt6~?A#O+mOGD0EZe7J`9MDv%YOw>O9KQH00008031s8R +&z>e++Q640CJcC04V?f0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXJU11XJK+_VQy`2WMynFaCz-r>6#ox +cKxrXC<}W48<@(hrK@Diwj>w^TgzAi<3)D6q%K4at*&-=2_(z-6CjphFgwFK4C~CmVD^2R@9QVXnn%! ++I3p@f#;vFfJ8x%1Wp;Jy59lZ=DsE)t$y4Xvh`eKCc(%4aSifQU?*7`!aN~y4clI_``lA~*Pl^BA?2p +zrhNt=)wZYl-;l`+TVz72*wSVx!sDCK_=M(+Wk>N^zb(>Z}ok(qx~~I*>2Cl+YaA+;P@>EjxHZQaP;QoBgbyM>2Pg-?c$zV{HGmvd9hZzs&;k%Y6$=gt +~1eQYhSHCK~J9Vt>}Mf1j#={PZBuP@KXfV-9%55-WwWzhO}PN@Ux_KQ^U_`xJCN@1!+w>d7i*^4ZlD- +>1y~zG7>Vtmq;gV4ZloUcQpJ8fl2FMl1|7BzDin?0se}>WPq<}I3!>BI%!R&>J1Vl`N}uRNJuAd5tw} +C+oTgRC%+~z8TW4pOh)os0+Xxr4q1d`fbSBR^!+~RgiP!Q8YX>wNYGBQzN3#c+|}sEWLoPQ{)F@qX!u +hy+Zz3h^g-ayNgpi@e?eO7L4Qfmwr>0t=_Aze*90b`{)WI!4S!1}RiodLi>}e{Nf#uR-)nd&LC2Rgsw +aAUAGuf>y`OZf*Vy<061ToA~Ty-e~QEywP_y@H(-Oj0sA0t^t~A54S1Tofg0ou*dTAf)8q}*AaB41c>~Tw-hd7A25gWwV1v8?Pm?#$Y4QeYkT>9 +I@&@@#lQ+<5@&=lXya5~J4LBQl12)JTutDB{eULZcT;wfS_u>rc+NnFRQ8(`EY}6g5Q#V>0)Q#2#bpt +l28=V-`jn>(y8*n!2M&H?}8?CcZH(DFi4cMS=zy@^#HmDn4X;3#>XQOVw26Y2As2i|B-T2B})Q!HUsT +-(4-T207>IQ01H(-Oh0q4=(=pz$#qp?BVfDP(yq*FIqPg6GOUN6qD>o!z3E~Y`Q1*zEUFt_WK-Qd%fyN5ZlqH;Mq*GmV1v35Wj^XoEE7tj?x@? +RVPa9;Ji`Q?%#peQ=Q2!qsvDi;qHc@ZZJ}-_h6(!4M%@^9ChAUiyFF4jOLe1gK3!mes)C{i|TffrbOdRs@p={Xq+ici7%XAd7vdtX;IzjY07l!wxlWZ8zx|{Y=#No;>!a +8XG>H1RNXD@brY&{N8PyeKD=%Vb@RM#Cx!`H&(SaeoU5|iLfvS+7?s@?!^B^j5?@$&ni6o1G$qUH1|# +KA-8`?m0M%`wZk}O+zVoSWZI}>FD=JOtM0J

    *lF$UYe5Ub@L1p3w2vmcL8Zimg;7uDP5>;7u1a}^i +g5L@w$O#GE8Mo$Jn`f8+_CeiF3=`ae*}QHZbr)cmq*s`r>rB)Qp3hd-o +vylpW}|L=qlf*JWj0JK6((S>T!snY((b2pLfwL%sW2&zVFEal*UhR +hLC<-p+hUkl(v%*(ZU=SUtO^rsSJ_!xaxALbLfuX(OxzeI?S#4s?`-1$Dks#9PUcwGT>y1kR5!1}#EI +(m>2*6%-8||}SKX{Mr3>mV&2GvasJcsE9LP&k`Ya9<40CaYV2Y~i_Gy?DK;1mU#OFqMC#u_GnC#Frr9 +Z>O1$8^A>t=0)cc8i*q$x{J-Q}t4ZfMm_m}F<1VZuvO@~E4arYt>m^Xj?_NK<-L-7csbJ?|{)cA&ah) +Xh=dV6WmUOn8O~;A~#Eg}MRfGfec!frK(jwk5|x-4@l&qi(>(SD2J%OAe2^aT^z3VUkYWKs}rsh^~u1 +v75IgC*A7?I;WEZ;fwp&k^?x`87635-jf4$aUkJ_Dot4)!^D!N4r%VdB&4worEgUbmCtKqrQYMR +i*Y6Q5~H7u1c$d3IB#8z%Gjx-EtY>s1RZ>IS_1vp5M_3=~Wwk|47iIrK}^ +SaBErgUPMIH7Kf>h?+9EU%kI-9U@3FmYm-0G?NxGTkuQ6%{5t)$Jrr+0toBa{n&kMtEMDvH-6eU+Lov +lhSX5w@^1PO_}a>Thf&NR5x!+PI{WsLfyPHrG>iF)0FAOftI>%bdjYvFg;Ca@wx%e@l^{vubXF>Skjb +$^HrE=!-U+ZC3{N_U>_Ud%d;g1aPhk-G4A3G6BpFY+LE(SUN@_*J6(0Nw&ZXO6N~ERQFnQ~Zk}P{hPr +i{lH8F+9s0^s-A<^Rr@8?b|AI3Mbz^|l8{sE^ir7tA8tP`L?s8D~PBlylpzfAF!-U*=B|ERXJgVD?*N +wij876>pscs8(SE}2`TXJ~R%`!}Q)D1X?>c;4*Ltks#F-&}>DOMp?Rc4C-Vs2gzgs +s+_ac?^^JznhY$y1f}D4ye2Is+(t+pc5~uTUVHno5{QCUNGuL>x#M+ykn_*{;Jyrb@M7r(hU=!#l9uS +Cv{_Zi$dM{EjjeASwQNx7$#1wKy*-@0YQaf`i6u> +m*13uU(Mc}VZ8^ilXK|pVuG>-^XsIyaQMb?HK)@cT8|d7q8))ILT3{I_>8cxT=SAIsOH18=i!TmrYp< +K!2i}jLvZ!ueg$a+kEvnlIbvyC8E!1sM-Ig?^g}QgM>b6ifW-3#K3G4VN3w5K9OleA<>h@=tSg4z0m; +lXG*Uh7Dbh0a{yQL3(B@4bN)$N43d4`Ek>UN^Kd4`FFx_Mi2D(cR)C5NZFS=0?U7j>s^giqg+W1;T!l +LL1qb)yp>)a|o4Q2QlhW!sN137DcASH84XH;=gi`>?v5FgM^zbWi@+H&dbvB-2}k0UOK>I8%WM;7o57 +wj5ys*kEqJ*^V#)Jk8udGi52$k1$E!2M;vU5hj+?rvMww4cK6Azy@;zHkcc*!Q6m-FgN7tb+qB)NK*ntTSINwSnoPn|Jz@MRc=HpGv20%Mm8&ehG)VK~uR74n#SMj~B +vQsGE2C6b9&ny7gX4vRJnvx_Nd<#oT3PZd|m5X6|&m1YKlvx>=&z!rUy;ZDDSn=yt%|>2`?&(akFjv@ +kc|Y@!>j4dwCBD&M5o9CC +XtZs{60@%YVa#%&(tojmfMcqzz!Sj-oJimnZo&~^O{E}8e-DK@len~~$yOX*-mIivPFIgPbU4UQ0%Th +Wy@zu#Ia>9hU$s%!AU&3Q<%XXadFt=qpj!)*cY=Za6+`FQ_q$=tzBXgJDFLCm6GdF&T-bqQ8L*PvRuejF!$iG{i?s@utXDVMq~_lZv`4)jcQbW*t2>|171 +Yz{H}u9c;)+_qx-moAow$9(6l0Om^yCN^NzMOIFpFl%Bb9`&G=XI&rff$6|H6$WmI)d-W)~EmpU;t(5 +*mwRM#_r1E9%CymgvktzzdtBacFX^`AD0ycFI(f$eZzHAU_!5ii_DbE_Fd^|*s=K1@-AUaR)s3 +Drm6!02FL7a*SoXj>IKIR|c}cp}%_}eQN!@7eg +H7j@=ogJdELC@UO~oQj(ZIf>Lw9Y)Ll{c?xb#u>ULq6Skja(3=@mj?N4=c3=Sh@x^Y^-W)XmuhZ&BTxs_t~^cA~m@)a}zSv8ZmZ)Sc{tr(>+ByQ1#h +N!^w-rG>g#s@o%VTfAISdvsNz5 +jy6ECS2Rm|H6bCw~>$VgJT6W}E4ln_|W}|LPUAGg}-O_1F@~sthSJb^Q)D1L~>IRxeb%S>EsBWP1Q{4 +`V13^7G3==dit?K4cw@<^Qsi~WEUr~2O-3vqA7S)};58h&!uy#{gsGD`*t3`G5&YohWDbo!Td|{3QUs +-kCJk`xRd&;7^c@-v33==2CfkARsH|?i7@wKAvg`sYX>UOaao@JO=Doj|^J$J*zLfzh8ki(;H%i&WN> +gE*(T6R6To>46QI-74b-_|0@R0L0=Rg?#6sPG^SvM^F-($w +k#NP`6?a$Mt){i&?uxr711t@9-@9keRq+hOQ*hhbO8<_*T7RW>`p(`)@ARm@u~{44*&EeX1}n9-;i%R +>KiC}A25Ys^MsKh-SUXc2_0Nyw=i@LB^)@yJy)*qE9`BFNZLCQ+zQCIo&Yl{s)~;DUw|07Tt~VMC*RE +CF4*Q$3-&6h7q3CQ_yJxtuB0newTf4s2m4At6{LpZ1v=MishbG2-2!E>`>8-De0o~d=wc5XC^V)rTZa +HymxzlNNms`sRZ##VRf#bIvIJ$i3#|Mrt-+FBM*zp^0I$qmfyC|nY{2Fex@I0#5CzBIQqrn6Xr_peNH +m1?W1Z_^E%?a9?Mq3lKJ&m>}=+ZR0G(kJlXlH_UDLPUy$k3V!TvMPC*(n7Zp`BK6gLbi@KqEBuY!8gs +?ojY_Z~-QGI=Vp3a4;QSpr$zJPQz-B!|96`s7Vf|V+_ldhb4yU6G)I^8VQ3hQF8&UQ +YY(%MMJ2awHvmF{yDs9v-qEz$UFrrlR-H=f#C!waW2EqPFVNHVVRalE)S1GJbus>GV62bmNVI6|~Kw( +{t?Y(;M=I0^)K;BfYM +HhIf~hqs4>$n^7HAMmtLV^H(7Nxwm(t0T3Z!f4Ulc~y(!VN<-rLIxqxbf|DJ+hot; +V9*xEsgORuiC@xGNTunsq$$>TwutH3KWa;xO9k3-G+F$6>V9mB7QUE{yR&UD`7M#d@l%Pu~eJj-#s@4 +uFXjg|+fifWp(QEATFWVo|B+R)L9CrN(_0Py09)T%|+-#IY=?t2qQFmQ|oWybe$VgKznFfN?OmHy{Ya +qra=-+XNyzudRpi#v7>Z%z(4^Z4Bpp6Rv#R>y&{0Bg~!Y%@&OYA= +Z(lvH3K)T5O3m|=hoIJmTbr5#Ql{|UA1JxtV|8DZo?m+f5>SPjP9J)uo@E!9I;|<^;nTi;10&kGni18 +NiCYg{JZvz*R){`t~X9>6n7Tgx&9pEC~dJ=D^3tT*H>N?&YaPh>c>v$nIr3$F)cyaGZB~aJ#;{KCrps +wS^Jt!4HUB`?0m#QF0;_YJor7{STc)OT?sSbi9-Y(`}Duf`3w~P6gDj`VX?PC6=QV5cGyO@8e7J?++F +6LhIV`y9YHEd2I>MH&bl(!|G~2N=iHH0;qpXp +t5!;)?)9L>SUb0ON?7n7)?*iij{FuK*P3ZnRXUXdom>6SMRxK#}S;4ADS{k_LwK8bGlI@kOr#6gg*1$ +QuAfMEIgN0mczE@$t6+iiq$Ggp-%9N9QJ1@=yt@6~dRm1VbR2uK>gv +E14TVNg6A4c=6cR-R2uC!OB>`%7;fIFOfB<+Ip!{{HK*gb3!5|)+M}&nCT?gbl}FOSQ$R&f;K}jRK +xI@2>lvVNSS?(VX93Ea2ys0JRET3VO-3N&!f2ldDlQdRb^HQQajiftW5uAMR2krw@k>DEPcXQ`F9Vf7 +!Z3@k03|;qw?H{l*2MT#pj0G}V;a48PrC1Vc0A$l=-DSA12CHiIbYV@n-$%b6UmD*xzJL6{`11I{@k8T> +$B&GEHhy&c*!c1B6Y+FiyJyesw;a9k*zG5l<6k&I<%}z^a>grXTw;|oUOD3etDNx(RypGnsB*^f*sPp +!1y;`ZRXLpT#Q9CkKKXzLCnaW|e7@tBzH$kkkbJ&_)bR65TH=Z2d*u?$9{GgFEqdh=ycPM7$8x-K35J +h+&f_{|v#s9&m7%GL*uw4cf4bZl@cTfg+(y{)LP;!P8gPFJDbZ0aw>|NzI<5-&Ts>B;9V)Es}0`VgYS^12oM7l74q$0V +O$)?vw=tyS_VR0l}J=mbaNg5Ncy4g&-|&Gld}Z#!L!92#%Q)g0#HN6oRz8%@l%A9cBtaTHa;~VPbh3D +FkVGn<)fod7CK&>3Ewd1nGF2DFkVFn<)foc$+B%X?U9{1nGF2DFo?wn<)fod7CK&X?dF|1ZjDjDFo?x +n<)h8dC#N}gaDaIAqWLBlR^**WG00$u^fORg&-uzObQ{SKl_ptg3ur{DFmTGW>N@b&vBAMkb9iX6oQZ +-W(q+n5Hp1!6Z2*YA?(hk5Ty1nQwTC0Z>A6$WV1O^2vT*JDFo?zn<)gLIA&4^Qg4_k1fe#}6oPcU6^0 +aoG`-Cff{+1QY-O0 +0;maO7>PsLtEjW7XSdXfB^s{0001RX>c!Jc4cm4Z*nhVXkl_>WppoWVQyz#gP@;b(H#)*p83&x%DA-V#nu +P*M8`?g8#w4q!{phh!+sv6jK7^kURMj>(OX{cL3aY_+T)&Z_vM3+3al|=se(Wtn~*6&RysZ*8Jgtt+V +RCw*2AdpnujMRC*UT`-5TSbZ_JQx_`%&p?@g+>(l=5cz?}bUs>5(sU56*zrWQR_8#!VKe-1h$9nhs>s +P}6b`DnV*;vP)ss}44{PW$Y-OABZM~>XpId=Prqn+a?4<9*JS*>iZRKou?!e-l*%HGO8e_td(bZ<+mo +_Da~jMY9^uQQq +L_ZzGe*7uui2iYNhi^v|RgsE)zK4tsCTC*$1WqbV@8>m?Qob|!>;|nIUWAG)DSutO+Yc*ECW_!&Vf5VP?to|lexP|73|B3NErusMSQLg` +i(xa}Fqm!K@c#qDikI6r<5IN4)l3doEr%_K(TTOgyOYCa*x?1`uma=uO|GWio=i%^~2b`X*gWV<}mum!(kA23JwG1Ne-ind>l +sW6o+f3a9E*k`zF#^4qFae4o7_~TP`7R7;=)sP^a+2*&GIpa&Z`4BsmO(PUVNu_1rmJi*pHvw1wp`PM +j2nA*VQuUzSsG7=5QW3^~PN$SDp(PH`A=io=jo97Z|$IE+qG9EP0YFys`6A*VPDImKbf%faE<`(Yg5Y +5XuOZY~ZN;D>?BB!{7L#TpUK@68tc_F2N6@>v`wH=sC}GI-3ut^WoZr!wgd9a~R;t$6>(_3miu4sW>e +7VRSM>4x{gU92Wer9)|@#EO1zOivyjM;fK-pGH@8CwFC|qkV{w&=i_kfhZ&8`=dh4V6yk>k4nv-b!-5 +}%Z2d6FMR8d0!`U3x%O$ip3|QvlFm|s54ntm6Ka8Hs;4u15aTw1L^W_qdQ~7ZGoQ`3~d=Bg75`rIwT* +h-cn-AyaFk0v1Ft9U~A4VtBa2S2$nzx2yQ$jv0wFv*{IDK}1wT9o4r9FSe2MW$#j2_EC9?hS0>0L)mrH<^bI&CdNw#kSiTNBZ^Eq81 +xrD%B<8ujIdQ;^RbKtP>oKB0wuz!n{59@Kbyj;Qz4wsor=y6zUzJx-?_D#fCSPlaK`TVeuOO(msGINP +SI9!MyM&DD-TPyQ9T{edcc}|y|OBmyawK%NhhjsE{Ee>br60ou}d`^c=mhqe}&W9Nq7M8<$epr}4Y>p +qs4$jaI>&=(I4o;O13mit@W#q%lGL*AFfT7z2q1B!g3h$qH$R8!$K}m2#1B|bOMJ3KP+%q$R+eR4 +7rT=IA+e_T{~|rd%nbO;ILjU(VlRaUDfjX!-jKsQT?#MVRQVjz+t_7xDY>#){Etb3z@f;&0(l!a(LE$ +81fAB;UYNf#T;grular$va#p5-VYbTVaUsnOPIo8sLRV?!4E^8YMq~$!|Xa;SPl#GCG_6 +o5d5&fVPXF89Nyy)I1G9I?{Nt8C4~1l^f(N8?(>IdK3_t}C9oexuD4deb2`2EIACRGIDc3#AD(=jj$e +@Gb9fH91X|DVIo+bpm(cUWdh1IF`7k<3aTs#0T%yGJ5+&xtCC-=7;xJ0gI>=P-X*kHdQJaR?k1=B*XthqF0ch#$`8aEX4{lw87$@6!qEUKWx|2 +plfN56ACuuuE*&I4t<#IdE9WB?JzaIbTBHFl1xbm(b&I5%VP=&(05{^)!B1$R*0-aQ1V$>|CM%4h!qR +>v6acKdi^$?D@mBc>XZEmShfRf3JB#IjomU%z?v#A2vRhDCE87+0P#~<~@!Qa|waN+4-;*hjnrZt$Y} +b7i`{|z+oYmi1T4~(U|XtA(yfKurOaj;IQzV4t-Cx4*VRR(+TTK==ou6a;jVctrzS$o#DBJRz9r7VW{ +(+KMZ-n=1X|-cS70KVLpfT)`8da!;s5Z2VUT?Ieu8kB?LbVdH(a(is0~K&RZ+Q50{opWc%R)IIK5cVh +$V@*1d$B;&8m~CA$oEH;0XXPKV-+{T@dlepq-;C*%^lm&1B~*bELAFkeF8aG8EsFCW(P!|`)EcD|d>V +aW4ee^}r!))Md^k%HuH9De_^+Q{=;X95!bCVJGG=JF$!5uxkv5_5AQ0IIQP~ +A(z2n$h$F@5IBqnQ2D;c0Xf%v3CQ_4jMgQ5j{|b9?{Ppb{CmxilN^ScYrcfQVYE(h7;=ikkZ0$Iop}B +*JA;?a4_gjf4(H&oFkeELx2E-7B!RmsYhap +enhtbDWxkM2h7UoN6aTt9pkRJv@^KlrhXP8UG^VZloY5lO}@Gj(VA%3`sTtaw{!}{ULXy|fSSYJYq!) +RRwhbI_jC!dXnEru5i!+NiAXnn4^h%GPy_+f#=LM#D!n%A1$IG122j^(iBu&EptUgMZOhanr +vVZjeWURFOW*GudLKn9(GENDBJk|USPokbTMkEku+^LMy~Tmn^X4!b=i_kpN0AE +PaJC-?=;qB~V`2#>ev5-2f?dsFn@d;@Px_E^3BeCTHZ&fFJWVcP1c#yKdy7MuwkB}6kX%CRZMxVFv$3 +|bB`k(5hNC{pjU|eRhYNX1ht@NCN~eY4B4!VxXH)HPEw;mKRCl)>wj4H@!*;fWojv?pI9%qp=>!hzy~ +UCJZMymd!)*Ah9kv)Y6~mCHTH`0%4wv{cT_G6Ovco0LmdKtwy!>DpBTS39Ti5CLcuNLt-&(F>Em$^-=Bzk!J6PwO--Sa>F`v)`Sm) +W``2l9|$ee4Htr8y}1&TRDu_8QwhsqQ#mZ85|HhOnk#b(hoR1QX$i<>gu{?ac%`{H!7!`R+F^@fQ!%W +!!q4odtQl^HwZ2QIh2hestj#_gF4GPR3&2k>%<7Rb>{<+443oTDQi&qma3NFHvfZ$NVc`vqSz|cc4GZ +CLc^EeS4UU+@Y|pJ7wj4HDu2$YJzh>Iy&gIG11>wH&q_HkHGAxda@Y{SZf`?Aa38?{H*u80r)p20~}}Ar2vzK^)z2&gw@Gj)AkV^=DxWtu*wdPBpk9n^xv54 +~}1V5}dU!o8W$FFhRupG7=-qjoy{IIYBJX+`S!+N;{wm6L+E-{zL_QTn^gdraY73NDoo@*}g(8|i*@c +4#@@}7+~|GwUazg9VSp*!fF8~TH-%J4#WSXt|>RW|y=ihsGcHLUbDD#Jmyx6#`;Um5zBhta&nHm{q@Q%o0m4u4KH*gd!oBDmJ$2;BU7bVUyZuz>?vtI +9rw$)ERavcUM}wg5?VdLtm@}8F)$!0cN!1yvZc=r}YAvbO#%evO*2k)sRK2m?F%`Xo#J5Ql>F>lLybCL3 +WchIyA~|vPOr7*-ailhsN1WR_V|{yU8k@Hp!_fyZa^MJ+V7FpV%qPM){eD3`}T~liz;h(3tcM?({3e=*YO9W@jCvHG+xJT +r13iTlg8^fKpL;(JETQ*(5-_`)_R+1bf$V$rqOBYIZUH-)N`2z3e=cJXQx+Z8l9TaTXWFpy!0AOqm$B +WGL6nij~|bNq_N|%?~jN*{CNB^Y5aJslE#n6pOD6n$DfkMkH?>p7S_?C-MgJ6H6^l2H>5jAQ;&YCM4L +mTg=Mr!I!sbnMY}bYju0x9GpN!X^}D30AEr)YtQ{pyJ;klko_voqbuV`4-`+`@`Ups?IoAH1H1$zdhq +Sv$3#({TcgIKyi)hi_9Vbbd0EdR;1ZiOrExLG564}Edn(eXleUhRYsJFi$EvkY3=_%5}8d|i0(LQ2pPK#!sfdC5@jqw&!)d4 +jh{__Pa40vJEZZe`yWUP%V^TUAs)BGGMaSK5sTaEK#+vHUNtPEMQ6ksw6Kgu@`q`7CWWIyXBcjG)v$^ +-?Z|m(VHGVJsSD7;DjGCWJ!tA+xU`Xfgs6@N9mxBksX9noho%alowZ~FSc0k?u8?@mqXkjHDbqG76Zuw1WcL|!hG^!*%05LkVXbc~OK~cwqO1=zDT^>~uuR +v7SheOBxpCR&dYa1dzx&8$rKf4}+$WO0-g~;z7XD&B!1|;t8-#+{vWOjEy(ckdNVDX##w^v_)@8UQ2| +9%Rpn`rzp!}=QdnSLE2zy5Y!hsrO&oj0KJD{$vcsQeP#!8zXG*Wk|EP`UTnc?T+YKRXodI89buTym +4&w08arZTW3$2N$+75Y75zba2CHCW`w2DlhKatItACRENu~nW*j~sEO)6hMK63f+0tF3b#.Z>? +4DegFds3xy1H+oWol3qts6{}(I-+&mFRL7Rygs2V@&b_xFh9!BaFxOQkq=jL62Vz)~hpoR0vBiv6@Sj +kX4{>qq2m-D$BKR4AB-o9d2+DsSqPn0`v(wxt`a?}0LR7yuTP(O2v->p{A58E?2i2hiJw7K=N)OELsRu&+h0Ib<>0`52{HN|Na9xz!+Oy0YiR1ML +&I+%snf{(A45oeUF9_B*dp_F>+CVuHE61q)TcGv$YWqL*CDE7lbZYB +Dt}Q=J#lj*cYz%ue!9wAG$1|>F)XJ^V?O#fh^ihG{scsI-=(2M8XU#7E~>l%(M#P2A6m%@QIDTIeB@Y +VwQ{<*aem#up!@)Uv;u){N!)FyK(+f_k8%5M+d +%tKdI`Ub%y;;f3W5cIv2Z}tN&Mso9wM~QSHL&xZSbaPaGZZ?6}eJ%4Y9ecfGUO-|7u}5BQyd%A!}R2i +h&S6*50+bieO!cDh^VdcDrNKU6XE>UX>ATmJZOyX%`5x@Z02>Ym_w@M!Q@@Obbe!Slfj!Ow#igO`GrgI9uAgV%!BgExXVgSUdWgLi^=gZF~>gAalagO7rbgI@-}3O)%w4SpSb +7JMFj5queZ6?`3h6Z~d$b@YSL!=oRLu8kfUT_62u^yuiZ(G#N|k8Xs+b?eH?ou^NBS}m{LY1(+(#@iJ +eZ`*j=#@kG@@iu8T-nQ}fShDfQuSi|y;Qvze=k+<# +P6r-of!T+X?XnLK^cp76)K)PpeBb}z;X=WQIE&hiNyI1lB_3t8vL0pFK->o6 +W6=iUk!l0+v1kMFr4Ph!3SIT%@UV;hs*C+i%`p782fn*F3jbeFO9KQH00008031s8R$MqzrP>w%0F-| +L044wc0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXJ}<&a%FdIZ)9a`E^vA6o!OV%#(Blx=db8cNhl=}jY9 +8CCW*LMbj-yer7#QQPLl(X9Syt3Jx!7HL^+I-lV@wOwaeNiD>;cI@3AePGd?FTekb1fml%cqF7Tmk6gJnoNfiPBfFR7|Lq2|o$2IqFl~&k?@Xq%# +)Z-N>UMDK_AEFa{q==lc4o2_Y;SBl&}bfQd}FdZnvI?gqCfdZ8>dH41>3iy{})FaPmH(mC+}$EY;biL +x7#>%^4R&47YC;wJ^R?;%()XMPd7FjdmD}DryaH1Ycw8c93CEy1&H3ms@jQEF;}lJRV3)1;bF|^l)orG>5_Qb_?I%YzVQodycFNkOpSH`?wBH%4B5ivkRhzBk(=Oc_dh7$+$zSaMi1pn|EPe}gtbmPx%(;mNRi5)u}+$)%nq=be&pRBGr5z>KVdTK`=_bwvm^N#Yn_hC-J +i3O^;7v5tdn%8?((5Z^PFsA$*bbk+%IVQ`55~{ +2uF>$uF_itdo~n>r{P(HD-0c${I8IH8x7A`Z{aOx_*PrOIqQZ>;u#DCj36@gB|o+OlA}CHj`N=@36kv +P`}Gsv-x_DwN6jf@O>t;YCd3{bklM^Ol8)`N33xQvhWA&3QHS*%+7?g^m}*M8PZM(ckd3HvR0S1XVcK +?u=Z>o+CA2ujcvT4RuX?c5%#3*jWvqE#bO%A6pH5w!bv9O| +p@EpPiqL_)Gh2;h23enGMx3yLe{f{#Y|+`>SEL#OU6A6xA}@U)pDT20lBV*(N@Fd1h;Uws6dL%#KyZ> +^1k<2~(H!*@?a&vlCrmb_dMnyfpOL`ONlnne7|+?EGvb-)DQd%+Ak7gbijppY51ER~@q*vln8vEuY;2 +vl$ufFuSNcdwFKNXONEB^yBhu$87pBXZDJ+5edP)`xsaeW-p&-JD=^CO&{odwqrImuDj1p){QXQwbSI +LLRunjqjZIrSYw$Vox+fWz6H +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 +}KSAT{XR8!6(0;Z`(I;7{l8lb8R7s=lD^=2H`%0DMfSO8`G~P|6N*eEGTqP}EYmnAt+V7FpV%j0n+Dv +S`kcph%{cuACboE_+!#|9S@Vn>v)7TUdIvAcpYCMEv +|!DNhfQo&onwy+aA;CG;Ir}(K*`onFb0pnMP-4yTvp*HRD};(CEBucbG;eWxLBXIwRYBK8}*c=Hu|65 +PSH1{3&UCJ~m0?^YLe-@%i|3()fJ*1!++oo&H>Ul%%MPKHb5NkrY+YrB=sDii+sb{p-&C28_rF6cAAPFi&QJ(5n7B#)m8KSNS<{C&D +a&yo}!e~+Ydg!Jh6yL1@eAW1qnpAO@%NQ(;Sb>`A}lA;2-)an9BQ2`yQ{Be@x@q2WzPmm@Jgh%cEnzX +2Z9>M-1NzzUU(*A}tX_P%G^l$0@BTbN?vi^=Veir>bY5Xj@bcsZM8vO%l{51L|Y5cMtkj5|Te0kILv|b3@@pWpuK?e+n-uqeX*4{e-Rffcd#>Mm_P-!Y?UNbm3?%j +D4a#UPPO=5(+t+#tn--0U3^E!~x$ug;P515G&o +B&HH^Fo#0+aRSArz{iUQP)EE#hz{-W{<~1+oz=sc^6bZu<*Dh@SnR(KRaS?qX&)!IbO?e5=a;D^bEajGCsIVNZ-)MG5j~gxHcT`|3HmlkA8 +7^N%tUlMbQj|)Ee4Jr@u!d;qe;hv@KZ>a(WHq*^eLpz!0;jX^rg|jtRVLErPFBA1S0hGy?Ck= +;`!2Sbd>L@@}=9rS%DbT_u`4dLH!D9JW)_ThZ;{5s`@olNslJ=8{UB`%YsPZsxNIviz-00>c^1-CN=y +wsIo5Hzrs(TO6p@;!cU>f!r;Ne&!Ec6;6K72LX9h<8p0nzm6f%WyNMsC4J~zSVjH*F}Z$gvRD4P@gcxy8b@-2w691QQ<5T#dCw +k7(p-@pgG3sK&)Fca@Vl;<5zu=gRxw__4NfG7(>%MT&SUqwj!2wHrzB9ZP@zVsOwwvVC3zf&pqY@cTg +OqCM^9$dN+F(*JT@|^3izjzXV!EA8c(K8#lQRfEm8tZmcckBId68d;8$A^SJA>iwmC){*Wo8kAvx5Br>cfxnW_rmwX55f<_k +HQ~>ABUfWpN5}BPmV^x|58vp?Fiva*B0001RX>c!Jc4cm4Z*nhVXkl_> +WppoWVQyz=b#7;2a%o|1ZEs{{Y%Xwl?VWFz9LHJ3-|JHhGGH5Qr>c7X3IxcKBPo$qMzUfEhGnE3OB1b +TmfevoMVKQ8^Ct%a@o@-=;}9GI!6zid$H4*P@M34@mA{2P30>XwR96qTaX+c)o}QWBH@2=ywf$6g|N7 +3Y>YA7L$G01M!@Xy=?+!*g4PO*H +;FUi{qWa?y+N!HG&h3=f?-b$?)zV{F6G-xG=mm*u5YAzdX^nI@+Z_i4%>j!Hs^@?%27jTW3#QK7VR!` +@*TMv)dOhoq6s;<7DH(u}1i#x+fYB8jZ&qkDq!x5=azJ&8y9@R~f6%CTgo`)zePf)`^CS)ia42DBJcq +r-!89Pdh#IY!7Fh9=f*eIY&*}o_G2UY}?N`ZQHi(XPw_Bt$M*}o78sEQIp!XoE|#1?IlM|e%teo8d&w +R({G|)anz1gUvO$me%n>2-(++?=d^8E^>-ar*?vFooOyfV`-v!%Zm&5_+g82qv`r3o$5Cz5fzv@!!^= ++7KTRk>7Pj)am<&&X_u_-*;rE?+=_#WFmj)w06q*$Qi2SPMW>p6rY@g*?Y14 +>Qm8wG+iIe!&QS=d4pI&5Gx2`0YNMvhy?_(WPn&g5K9PR0YNMwh!q5}fFPC-#1ev7dV^R%5DNri1wkw +zhy?_(Kp+kvhy?_(fFKqK#410C1p={zAQlM30)bdT5X<}^76`-wf;fO677)Y&f>=Tj3l4}$&Ie+W=Ri +#I9EeGt12M^SAXXT}B+r4EI++78$#Wnkc@D%R&w-faIS@+>Vv^G!)*O8>k5QEj;le?T9We*Q{*IUfV( +f?o!x2jch_NH)fLJgbu`Ch9*b#F;%y7hF$siUG#1erx$PZ%di2Xq>h$(0;FC*5xdoYi?@+a&3qlxN*7(3!}qY0JY5tj<$rAHH+1!7egh$|mWWPrFj(S%*T=74Q6Am%vYqE +<}^2x7qiF0I +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 +$(n3}87jJBGq(u}s6tI|Bmg1IWqcn5P;n( ++>zDvi}|7%gzLUocwJ(T*Ffm}Op$B)PNg>c$EVeS>_Xipl=t>agW= +GO76Msw?U%4lvKPaDmx;~As5b$rTbQ61*tWG>cdhhEammD&=HW-il~bTo5~wv?k01p-GiS7)o~Xy(#v +wH(b{m(iDgkY+B*R>#rI71?sn#|fi3=i~8TGwgBC$FCdBJs&5H=AMt=Fq(Tle$!~~`S>lP={mY8Yu^s +bXr_IAJFJ3OV@!QJETY*;Ir_Gqq*f_A-w8`-rM-M7tf1LT8TpQmJ-aCv-_eufy_ALTgojT@Z~S{l&*r +pK=DnkjKK)L1N9Ui-lx^?ml@6_xXYYhZ-|VCedpA7#W;^B9yW!DyOpU*7r10pQ=D3V|@9LvBlCkbx9i +p1GKdvyCi7?o?cZV_0!&*K>MfTH +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 +Yt088_syj2kiw)qUJSR!;hLl{ipIlf_9t< +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 +}zm2Y8uxksK&=K&?5DY)H_m +dp+)K)sdphxfO;!dVqk9tugsor{PH%zw_-eI(>F67v*~-E$C(&S-wboirf=qDX4Ch6b<;QVBcthCp&z +sB8^7$$u5Ts=X4^OO1+(v)my?@~-@KgM?EF?}(QN%@v}m?|Gg>rTzhC4*D@N=0ZI+GJ?;G5SZM1&h;G +S!v_4_8G)LXxE8JEHA{l3YQSoGd+t?kX#ciRpzQx<6bQ^s4d7~00_rkF2RNfZkl3OHoKYYio1zDtQ6R2v(FD$+ +Jl(?V3FlcDW>Yv*U9&5kd;cjrvFk +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 +Z95O_<P@6p7=5PfcVi(K> +WZ1;z#!Z@uPh}{J;a^$9Mwb2VRW$(S1Ptz{?Rox(SFMctHG^oq+h!e?a_*HXwfB0rBIy0r7*{0^$cA5 +I^vO#EB@JIx_kM<>GYs|L8k}T4R{|+TS)Mub-??;6AAwAjQBYP%N9RwOF +;a%Eyai*tL=mcel781nhO%Y(&CqhUvhfTO-aG8wfF_Wk8a9Y{9306-Io;nlEp7LJzC;NxM?hYE%9reo +>+n(cuA)RctOFhBYwb(C4S4bMEvZ^$8dTC;s<=fogRt!C5s<;L8k|JG2#at5I-KeM8uE&7fSr-rKIAI +Mf|{vIX!?25T(<2Z+;7Ta|7PI&{rRw)~1>%?Xc2g5Su6sg=Ka#~SSv|3 +cA9xyzUm*Tid%H^_{#aHI`YERP5p6{*ekrM^YQ!JM;!mykvl;O->Z}#N>t}_CU#a-<5Eb0ptr+nG4u~ +IkImM6J35XxL#4n}sOT>@Wc0 +!0>srUh}W;Ul}^{hDY3u*jlUefAODt;~T$Fh2W7qog(d;AjdOKJRQU**l+4$JD{R48xm){4K9#IIER6 +7koH|0t^`7V!fwwz-SuB^5vLdEy70Nb#p8eo$LQ6u&_HfU80LOz|_ytF0c_Pfh%8m^JY?7DN2ND^2{8 +$GQNGZtb@D2YvPYU{E0n&%V9+Pyr)|6H%=t ++*NVSZ{O(>I;{aDp{4t3?@xk2=tI@`OQ4_!GXMKrZTd^S)@kctqRTF;&J^q^bSIO#Oil0$ZZS}Z*jv# +(8=V}uFswjR;b1CAlS{}c$Mw^!SrIWh?@yE*QS=Q$6ik#f7mg3J@aZW}(@v1UoRVAv*yy}V{ah0sqqb +%7V20i8}O1qwDsyV$$2b>St0#5I2B}D!VD&7i9KV+MCB-ih|FUZJNW>pY@e9OX +t#bTrRO&@yAm9kq&UhD$=I?4h#B +OO{+&)jz6)-pE2TRlyQucyFyuJsa8)-{EcH(=hPBEZcCc7%v!~-Ez2wrzohsDt4C7&=%yg?OI8p1FIb +j2amj|nAK;RRU$T18zNF&U*6K-pa#te$IJJ6GD}Huzmr+B!te#~RXiql#jo}FfuD%19? +9dE6o0HQF9I*9_|g7EWc4K8++|5Ui~{0)hehK3SbMv`6Y)O!PsIC}wt`>Wl`MYgJ1m0Wmn{BR-(k@Te +oS+@y-$^U@32VU-vS=+KJbEjyDK61Ggh&IJ?qCHej%wx +>+}Gx2=S*D{IQaHB;pqYzvT2t<@jR}zhv<%iC)^}KPc7BUJ)5oaMwxqpXE%Bp$K>S#33s(Hvq#lX*BPI1nPLDRJ2l!$?z!i!3r7!Mk_jVisE0A#jhp)idp;;@e5WDdMQc#u`GV&-m +cc-mxv#DH7Yhpd%I{~FsWxnEPlc20l_a;@!N-#h@U;9b;SnP&-xPo$=ci1W^)2xuf5$!#1Fh+Hm8)-B +Po7~_$9@^BE&CPJxe0~7W)7fe-`!GoPyO;XLC-8AMuv7dL-hP4(_6#G+$m!eSRyB;+L!*G+*$+T}kmP +t)9dlzeN18&TmPZyOPxt>-?71>d~h03m!k37bE`EHQHDjKYQk?r}(AK-Blret>RC7ehY9#6h9v7N+^D +b_+u&lYMtNGDt-*7WI2Ax>d|`qlH%7Ae`3Wi5dV@kciU`pmpxm@Ab#cMZf*6%wR)6UJi1M>@9~t3+EQrzh6AU0gR!i8eGZmc}2;>5 +9&H-Gw709x<^*0cn-k1jDvf_hNj>&yA>wBb%Moe(lEp6&f2`V^X +kSq9qkTn)UlRNkBYr83Uz^PtOYkd+Ul9D-bGx|eg3oV7%I1u8eoG>LZ8oQ5@yDvvBN4yk^u$Wzk8^%Y +BL37xnP;sa(cAqb|X1GlHx}XB-5YONk^GUu|6Z^f~CQWHN*>S3#MeLa4xo`CrAEC$4 +n_K7xkmqh%4D^C1Mt4G+}jYa&xOD6RIPec5Y;*Ui9z)K$A(h|R<_@#5ZpuCmz_)}Xw>?Z8d%=s|Wor*6K-3{1{I$t4B!V*IGT2#~-U;gGBtwte(VHPpoSEsk3?{k6$8w$?B1aKa +%2CmS{^%{5i|&VXN&3k6%grc!n0N_*W&3AM;a?_$9?3iTEYOAB*@So!d>E&MA5Psfk}u{1rRD6{}!_r +1+(R4Ztg&)e|S3GcobALOpC%r9Zw^C-odH_)pmJtw?G7k@j|Do!gaoKT;ZhV!6KhmS6w^|kn`M*P4RTay`Z#Vvk8@B>bh#xD^++OKAz9^iEve@ekGI6Z(Xk;b3 +1q#m|R;wgT~>Ct9$VmNC?{921&Qv8t)?n;V3RvN!_a91M!I0tvNd%If2uO)tEr5-7pQ#!aSIX!Di{IR +k*wTgeGiQle=hmS6YV_5vkG=AWTtRD1VlK8brJ-BYcq#iBtONw84ek+#MqgDJ`;ujRZ(&~w&__Y-qw8 +UR4{xw$oN{c@=@y~dl-S%S~-$MH|ye|oU>G)RFwsvFjzE<#K9@2bhT@w6Kr5^NOX^UUl+ST$t+Amh{O +Xqgil=qh<_?5@EswMbaEQ_Dr-y@PaC8tLq{#8%r#5mXML+cXpqnm1%=2TYdiRJXfI=3qw-x7!)&1=D5 +CE{OcrzdB7yX-!uPwI)K_$A`6n&MxU#Sc7<;+JZ3O2n^K{K_o;#1_A#_<@(K&8Z}QN%7ajf2^b)>D+E +wr$y6iT#dEA^Z(;+KwZ#j4 +aJ9p6e@sVA}GZ?nB!c3!Oex=m|_+)=}aZQOI)K>597AJmt10Fs)|J +6(5UsuJyB;wa*b5@M_CB?s<#IHTSRTFd|`qk +v4agm3mTd?#8OkDOf%A=5EvyZPlvOBYFIZYjd{PXIR*L#@-r-w;!j+Z8LMF>6+b4Y +BGveniXU)I{2JodZtk8a#h=ac`1!mYLHxkWrE^MIJ-`cQ^`QTXTRjr-FX`Z}HmgS>eo67i%Hv1-N|b0 +zeSS;G>Zz@sb+CE>S0kNsR+O2~PrR(2SQQ)A)#H~GzeN0KUy%3(#UCr36YWc8^#CuY_#>rrO2ogUiVd +~ZQxpI6su8n#nBr&iaEt?7k{Aiyjol~%S>U7SU_@ +`HmsQ3pn;%D(5<1;KmsUC^=Qy<`3b>i3N@dHou85VR?4UZpivCUmHuSiypQt_jkn)qwtk3{^f*#WM(x +Y#pP(CWc$S!_Dzx+;Dx@hhz!zzbIV67ego9?9cJ^EBVzl01Gb@k?1fLOK4L_-o>yUNs)^cV-8;`1q@r +#}9nX6hH9#09ORXFA#s#6hH7ftEVRZB`N;d0WLnycpkqtt0xxmW0(~ue(3;L;&e{!=5ED^U)tPFZ1u$ +2+?5o+K>YRQ?ovOs9x0E%TEssq&dJ9UkN2hXTd|UQQae4%D$XhKex&nT+Pz)v`7J4%Q+s|(;C*FP=F~ +OXw7jn@)uYYkRDOm9-531uV%2!RuF8B2-e-EBUAX3b*G~oYzLxiudVg8xcBPyiCGSVd>Crm;v2uC@hd +*%^|ElwTtP*V}swi`dW%2VX=!svM(^J>xJUWX%aW#IaHm9~4zt-r9MEsG??E)`I{Hd$)D{FJsMVXgcn +{%a!zr&m!-V>YVdTTc&@dK~7b```AxZc{Wi67KkmWyze3Vrt@d{nW(ohFKGTqb7deeNFuCpVd+P=x0X!ubw*fn0czrl)kv +LHF{~hGumq0x-;A#-kOZ|4;qs@!%1Unyw%v*ois-G#|M+fc&9PhAC7m%JGUE?(fx`0y;+$ThWq>D;qB +4Ku8t=6_IDg?X6)d>-J84HjmP)y?cAE&8&1Z%J5Ts-cSi@V-?(nZL^y@kmZ8TQK_>oM$CJl1E}uX=1S!%m+$J$){ktli`OS;-jogvWRszveL>$FF;g$MK}ccpOi8jK +^`-V?2(JdCbM(N!2gb_JCo2rFNPO^UKs#iX_ah(N4}VVu2RJ{OWW^7YXxAv(sUiUzd*Z3G<7x(_@%lk +sW?N&UuX8k2Ak<27({hZ+eX1j}4FU`|(>I`qwIzqFq5n0>wV{WYHTY-!D`zNe~>d(7_R^!+39oX6}AUDLlDpZA!FW8i=Kf`{yOW8V+&cRl99@WcB +(kGU}VQ|zM0To{8XcFAKljLe5|*<&`0%n#*?r*{{I@9z^Hb7A=Ye&1s@jDhd(s>e(i)a;svOc(<{0oO +fbqsaWtc+q1vip)>wA9&10G4P}NLyy@g2L88yJj +PempL>iy<(nSkPx)VX%mmW)WAVH^Fmd#J7@m^{CXAl{A-(;YHjK>wbc;X}N6%yQ>TBA&k@#6piIi4&Jc(DdLv0^P&z=kXN+O)LW+^CwBJm{0~jl>3C +4P-tyFAj~c>nuot8kT0-@1o9R3Hw5w}_9}sVjr}cw{8e(}evcM`d({&c+_>K-`QzU8#0Lf^{o`Kt#0d +r`0p#BH^wb)>MYs(x!*%;@!Yvo{0e1+tQPPSwc$aV+Xa+IS?-6cer8R8uKH)Z8T8IW85N^ZGX4f4O?! +ui-1IbRO2J+c7(39tO;8{QP@HthG&!&eSK&K4y+4Ru#J9Us_dImK8P9fx&hXGB$RS5$Ob3n6ig+d>*G +oZ=0TA@GdoaWxig?!eWCf`Yh9FsYq$#=3L$7Bv@@||?ZF$n{jd?z3B*(ho9orGv%G6yvIPDZpaX#<*k +CnZ{#v;j@NlM}63Tr~MkQnY512H|hxZO!6^^0)D}rtx0h-5Gh*MC;qaOU$ggXyNbkpCZ%-+UgPfX@YH +>Z9+dosEe{s@IMf2g6!dXpC#1ZPy#c)MMF29jL_Ulns%7+mOD*Di;qmu+$tJ+IluzVou0wNa_ +HGNw{oTv`l7ij(N8l>u4rzh3{4t&qPf*EX!!*KO=w-9uMujMC(thvYVR8Yew|Pg+5kbkL8x7lcvueKB +-q7kDnS=tCe*~%!BoCYs0pr%Ir|EsHafI@hfot;H}r0Et5>EeA70Q2YcgN!|lzz-GlLD{K{x^-x}T<&9j5N+cLD^8ofLk?QISZZj +HyA+oOr~vNt|H+&&mh|L<^n@6Pb%XtHtINF<|&jP@}?$A}uEV2oZd;>0KsBRh=7FnYp>2cr~>EHE0ty +ztH2-Mq@pd)vIE%^TUge$Bhqyjjg_)Vwpz3(~v|&8yG6=gdpZyu!@;%DkP-tH``}%sa-sP|VxIyeiCl +!Mp?v;~RcAWNw(-(6r%X!@!1a4YwL1HLPhU((s`nKf`o}eGJtYUNIzM7{kzmp#t;Vn}^&y(&hm+Ppf$ +}&2wlTI`e>;hsiuS<}oqPgn0nWYBx*UtYfoi%?dTk(JVc)%*^e2;?(~GP)h>@6aWAK2ml;P_Erp3qb= +AQ004}10RSfe003}la4%nWWo~3|axY_OVRB?;bT4dSZfA6La%*XGXl-v~Wo#~RdF`F)mm9}*#lO#Afl +x^#B@$g#jg<)#Q8y2iymxDN^wj;?=xq9*ua0IHCp)9vt*u8|$*I=!lY{YW{L(1>H+8CYVSHz_dq4eWd8&1NZ{1k3F2S`srEz}+7wf3+h=cV}pUT|KT-eq#3-g4BARc||^V8yZX(tOBYblyzZ^Sa{1xe=g^5ItAtzWB!(NCiyKnf7^Mrb0+UOHRj_n|Im4Leu5 +9)aISQI><8~SZ<(v_Ixo(T@zLwfJLc7VWDfo66WRZ1wjM5{m5X8JjbYU&hGnA|mJAF_ZwyNYhGlgOD+ +Y!Y#IW$iuz(mA2*ZMbVSz9#8pNMz1u?7;h84uHtd3#jiQ%MC469f$%yYxFU|2#7Cv~{t0b$t1 +<%VN8UN;MlEYHk=~SXm4^U<`?22{9}h#c;y +Fu=K{T*aQqmn+-z@<7`+~$8b^|!wJN&@WilpHY~j{tRRL(4Q{v=43oU_Y`6|LtQmN?jKFdXONe0!F)S +Gv=48VPVpuXTj6(?yhH)q%A%+#iFb*YfHY_2ACB!f%lu*?%EFgv@#IS@ImI%WFVp#gRVdaZq0Wl1-;V +_{@1XFa<-wpFZ2^A2-bZjp-j6(^`MY5OF)X|>EEpIT5W^x2h99yiI!31i#xQonFqD99n1SJD8`kQ;Fu~6Y!#p +<}dBd7!)!{O#j+bwk^F5xTTa1|%D`mq1VwjN)dt(?+(J?TL-LOCy4%0UbLkWyw(I|!m2g5|Ujh><_!L +Yy>Cb@`VX|rJmN+B_vtQm$?1Q=GU$1rxo2?N6k!mxxGP9TO8h~WfbIDr_(eZz?-hB=)QFqB9Th7*M0g +n{A28^gF$qK+xLcrZ+sdewcyZQHQs;wK=66$8T(Vi;$`F}Pv1W^S0Vd;_~-4u)aFS|B$ZC>w?t=5$I_ +&xRRObfMgE;|*&eJ0(g&36g#KhIyS57{khj5)Np%oe~@ji$>kBgc#=Z4aeYyal=}pZWvF|DPK1nXio` +@VeE$Co)S14_U;?5?uG@zu!0y4HANSB-*8fg8?GaisKpK2P{Kh<^PLiSiY}BJ_Mf7|oe~@j$I!6GaKj +OFN-&mh2nL3s8&*njy32g +97@8{Tf%8^f`7N-$Q@2?mA*!m#kfaKxPw6f=ataL7)Hl2C$x>$8}-1jBv8u!D(Mc34|CH|*ax%)u}YB +?4i1b9Yz^(>JWv3BxKBhHF{AQHvW6xQdRfv)A&CHeuKS0vE%fR?%TMEW9zy$%g&iaJ+rP-k}6;SYxcB +i@*&-414ztZ-5)FA(SA>MZ0_>;1nIp4JURLo%7L;1;e4-Fvc(rCH(t_Lt)rIlvuB9xJeA-Y#3rVOy4l +XFz%Fyc)#J2P@)z$%$uSMxO}5zijL)m^{4!B`9r=r%QtYR1Sgb;VfjV`eZ&5p5^(tj#;}4IR@E_#mv2 +aj;U+sJ6vA-z{f2R;1jew07?u#jc#1CaP6=KpL2@-WTnB~)#xTiCiL=Z|~H@v2u5+xWeal@=^nAbO4;)d-Mo%6vh?;FMqYyP1GXQNAh4 +0E#K#M=#H4C79Tjll4Fg%YB=8(#Gk9S$Wz^$o|;utu+5eWwJ*a2=sU*EXy4p`;Fzy +@14QmWH90Ved`}i7+gyW4PIDc(dGa9aD5A%QskV*v`>mv?DD1t#8m4fd4b~D!Va5h)FdD{<61Z(RK@|4gU=5pLyuq4cP&i>wST;}LlD1)ztC?YHd +TXvx0-IrFG3Xk9XT}qdWUx49n^mX6$nr=odjDhM^f&2*dvUYMe}hgW(mJVczPE +5;M%pBrt|+*M03@eCXPBhGM!x+QZ4NHh&|7aMu4J(LYPBffU$FPJL#+d|;hT%S +!5@J|F4C8(^RUN}PlL+I6aWo9uhJD?zgc!z|1a2F~ZkV&(a4l}QBpT*r5+!c9WGyqvKEHv)bHkJvFJ% +(8QNsOvY|K8F3Szj~el?C8#uyIehH)t2?S^sNFvAUF3^PIr91Y`80n-l7)Hb1nS^4PVT@tCcw@7o;aK`4^!rYR-+k=@|B3ywR* +17O}cv!N4$_q4WRk4LC!`!El&H2^>m53|9{&IMFb6!<-qq$lY)>7_K9fuuJINTb3CO$4g<{t`=&74); +m;n_*5S;omjPpm3meHJnMTRlC~CqhSt(BblJ%^-1tHlqjJvFB-;u61A9NyXU)ecW#auj-hMVfAL1MeG +;-dhH)n0-6!E44Re;z`R;NVCX)zchH)mL*3k?{6AjlgLnjEs&V9H!7{-|d#|_6YL)YvYItGS0ZkUlt1 +nL^bZa7T48pbem!_}i<4u%B-!~TmmRuB!7kqyx(!CJgg#~M1D3_EvRNDAY2wPqgXC +?IfgkCbdh7210WmBPhVj}BjA7rk8+ +d{a?7#7|b77)XVgJDADy8Rkx$$k65T4=$yMCmLCK4r?7t}5yJ!>&Lm_Y3VU~}VG1)c +2~6R&$|M*RZn9~ZLt(tR8m90H+9X!cG>j=+N7Jy~PQtn1u_VJdl4#ZoKYYosce9#zGR&cHqzmXUg;&0 +G!=J)<>Bb7Ya4i&WzD)wp&kcye&b8f~M8baoUA$g60t$O~NpMzfcvJYH^1=y&!Z;Y_c;R(TB%*0nvuz +U2W#s<)5eLKm&1#%B35;RkZHDpu9LBK!0=j0K)fB>Tqs?lZb7aF$~u+!#0Ts_Er;dyWv_g36fXct +=6#4jy?%J-iIF>?noLXLScB_LWxlON#JZaP`jGiFkV6zq*DUB;ZWQ9;3agmgc8KWB@B~e^>V{>?B;%wnHtk7Eurh$ZGGG!JPwD=`9>WMN03Sgh +8-4&!+}x>0XZxnhlMAH1;Y-*R6-yQ3&ddoIgI!9@lPd0+;+H@RD$G{hr_mG%^j?G91gXmL?{m9 +EhYS0)-Z?hBpqk7VeE$)9QIzzEEpWdYndU3u^+}94wDY!oqZsOVJrbT%t?p+{cz(PF7d;)aG1BH1dGG +Gbhu=*VY}zMJ18MJth_mlbBR!X7{|jBa@aqYSThcL=MtF1c!xFbJtZ)QVLZ&>aF|?z5f5Vyhw532W*u +F~T!Pg)TnmTo4r^}p&F2z$i?vX>gbd_|aV`K-8ssqc!;E~GkxNwPu +-Fg|ufPwJ+}s+Dl6gA9^U_i}J5T4V63GRki-7@@NxHWb8Tx~+db@_cr1Q61`a=bei-(xZGs=h?ZXT|yy{#6`(e&vy3O~)MAnu2VHSs +zykEjO!*UKw$YDHB$Kf!}hdKQc91i1U9FoCdJWq%FCH(t`@iGqoc{&D%Imu2ki)otxP-$5#SlNi!P{G+WS*{s!>s<{5)M`Veo=zeTGjfSgei(C@ +<%bD#A^b3p!#qD+(l0^8t;AuLA8y-x*gbg2{$a`R!<==^oLoXMIIJLt{c{QIhnvkM7#x<6!`}VFob_~ +g>tV+B5;&J&^bf;)82e$&;p+2r3_mOw9On4p#^>pXtRdDlm-MZb%+r0)#_=$tZ4Gl6#}eM#{J>bk+YU3P>8iJ_VLOc5B +{)Bb6t^8N;V{n*m&6iv*x`~`qNIHoZ}TJVGLDZb#lsv9HyaOgVhQYr738q+<}fE7#vB%q!~U^^gdAqX +!<=>r7!UimOGw0FJWVGchhZ$?9S>taTs@Z9jCeR?yF^JmT++5yOFYbKmnh-z$76|Cx3(ThZ{>6VuJ7% +PUKsC2WwRXlkt-Z;tHF{-yFl&wXTC?eJyf@yv)tZf7nPq>U7I}6!osNgMMxV +Gcn%$f3WpX-F2lwyZnC!M5+rPJWb9Qey8&CEgH;0{!4zlCk80}8| +}2?O%Icwnm+Hd^lz<;!~K1ILf3{jc1MpLJbr5H{MF0b{eEY#J=nf>{mOIaub$gJd+yAY?Q55}FJF23n +JcZ+t;1{(^exfpEC%NDuL!Xi8d+53LRCdoE!3o_CJVJ)RND)+Q&c+(wOdrX3$<5NdkeK+RQn5c;Hu^` +Dhs6c~n8D&+ +hQJP^^#p@@{IICin(hRgJRw)NYUaHbOtJG4JX0+8(m1eZnQkCX$l`K_h#yeT6(u{ZFR@pL|TjI|d&8_ +c*(cI!5F`8T1&l}Ax>lcjX*7S=;a|$}~=!q@DlYQM|=Ck6K^0?95I)2G$ZXLgDG`Ef?jONzyq|w|uP8 +!Xv;}b@6>o7NK+r2R6PVKmLnA^1D)?x0^j#~#&z^%jFogKFhb8B|oI?R39aqBQQWyh_<+>sr(j#EZ+> +-ZJJ9=DEPHJV$;X`{Jy{F>3+I)2?~ZXKUAny#bxGpAi`g?j}@-%YD%_X>8ttG^fz3SPdeYZw%ad@n7b +Q*`k?Z5z7<3*So%Xm<+!y_cSUCn=csUV8f7qI2(Qr`Ijm_Fj7S?Lon__w+R=8ung#_U&%Lt@qNiZx=f +``svxX`vsrgPtU$<4*wfQ(r4dZNXEDKwJS6Q8Pnd^maLeZ^wYEN6zzInkG*+E}x(8Kd4$&%S +F8|64}VXK%*K825o5dsCxv?F0Aj`E8>W*!y`Sy0_2o7|p$XzF;)>W3X*B_haz8M$5kr8vYLShoJaHVW +96HQ#?K8gtkn@tVW7F4WI{{&|kC6pVHG!=o-vTdyBNJhJ|*Uw9axuBZV%(T+$aw(NYkI= +;-W&SpXnX*4lk1n(RY)1i&sd~MHJhoW%ej9ejAX5=lCIs?(OvZB)a$0t0cNN)E|&oe17-ns%JAVeL;G +kOidQ{_6AlbSCjerUf=3uYqFrT*Ry&;y1vtTU8}cA*WW#Q_I&ys()IV9Ufb$j(lxqziPd|g>#q(yW%W +Mk`r7rR)d!^OdV6`jL(+A<-Mn6Mli7EWZeA~a(6TQw-Mn7pWUdW{+LuF%=(z8Zs-G1kzE5IS7medjNzLk_ar`e*^; +Ju#hM$qDuNwKfqYp^cSB;+5M<0@^OQVPG(SI9tkUhj{6#s`*T^c=%kN%fbT^c=m=YL45zG{NhKO$8>2 +x;!}OC+YH4b0ij|Cq$IGJ^m7Pe{~P%)I~nPf5(`qJ#b!srrdXZ*O8NweThsA^kb2X;}j^F7v-2F|BGq +ul!3Aby4Jj=6^-1zF=fm=YLJAu8LmzHzexoCFoqgLaM%Al8XIXQnhC^r}f}<67}UG-!%U_qh`}k(p<# +(-;=8ABJm$c)K`lf`1~J9)rFC}ng0{1X<-B=%J`HvE&~$(nM7R|8I}3Jkeby+)&47~`g)N=oc|lCSz$ +C@Uo&dvVd%78BQdS3y%gao?P3Th6xAthWBOF<8ziPx^=YvGoy4>%dM3}mPGVXWJ)kJHRNBUn`w4>NK2H+P(DY&%Z^Y{)V;m>px2S7P2$*Zo^gfAcO?|5ArzB?2Wx6DWtV+8OGL7?}k(d@mPH+AJiJ8AN;)f*a>tu$6s?UsvDV}2 +EEG|yJshB@cnfmG$%3Cj9e)^dUt<$Zmn`}>}JEQ6L-QoV}|1a+?9&h`uK84ft$_r;MJ-ayF#m +i>*_s2JfyW9JdgYj(q(rA0CgX`1cz`?9e+MWKmFW=i!11T=Y}_K?u=fzb$k5co!z^8ll|$z?A}ZFzc~NW{LAyN%)dJS ++WfWooAbBkZ_nSGe=z^>!Rrs+c<|1HcRzalqc_qaczo;s08mQ<1QY-O00;maO7>QuKO_ju1^@sA6#xJ +u0001RX>c!Jc4cm4Z*nhVXkl_>WppoWVRUJ3F>rEkVr6nJaCx0rYjfJj68)}U(G|Wx7PAQA;3W5MEtV +mnE=FF!*-E)wlq?2&%0j~(4bHN^eoyO-0oyE9$kKG5KK&Xo?Mh|;ht7Ln2O}B|oZe{Cqw}Hb{ErUkR; +&t59|XBt-pkMn$We1aGNMcMw+sT0u0#1GbOee2;OR&hnhPU*qcr(YZCIIwK`4!c+J$%$fm#VoYC&d?Y +3PrHiF|J*u(VvRL+N`)sxZQ%UMU?vz%X4Yoviy>ct*_WZWCMFrSde}T5Uk}V5sWUsMT!RFtJy?LERvr +G3!P&7Lm|TVxC0esL*J6w?=%`sP-8vM3pi6%arr+G_DRoCb=+EwW+#OASe1R@X0 +VxWcSdzc)zH%qM28t_0 +mSRrkz9i=8F< +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 +`!jbba=X6lfbq4KjV8~pd& +|lHOH;qRMNz3KRu}mYdT*rq$y+_vz{{X|}#`So*=}{w~b23|p7W1bvJZ9^04X1ht$osPoq%|1mU_vNA +CMUK{#!TyzG4-kUMCZIFXRZ@?)@&8H-h2PUM@S*$((wKuHW=Sh&4%J~-9Z+xS$8GrK>XwYC4_8 +XQP=|U@o14|lwoE8IvP|mulo&pFWNH4xrlro=g-oIgA?Gfb4_o&Wp%&z`b3akfhZNF2ZpCMdEH;Vjk@ +rTxt{?8^BP;j;E_zLDxEo$v@>tjeo0`sv<%DJ*pzYxoFbEZWhR2A^C|UV*v9gIuU8BVZ<3kL(2!|~bgP~znDVstV6!LI)NVtO^4Ovw55n4FNC +lkxQ8>~?fACO5a^o9oH&n2-sjaTBw~6g6_v#0xOFbfG2ZG%zgN=T-j!x7UXYwCCi(c%pEdO=`gtMGSa +F9@kslL)&%k!}>yzO@n?S)`B>0&?L{E1T|_Tq;Yh#@Z2RihMvN5?)?BBo26ksSPr}hX25PEdza3_+z +HFQCEoYZ|krm0Hu7HH}+q +H^n>1I?P(9Un*nPI;GaS%v!h9T9;YtmRjpEYrRryJ!Y*}YOT+#^(EGLyY-p1KDX9sig%Fd%$nXWl`(6 +2skH&KHYl|=VAckSHBGdG%wX0GZcV6(WXzheD3i^YwOOgP8M8JkwPrGFW~nukSu;zm&6%}%skJ$?HZQ +eCnKfE!jWTPr)Y^hsTS%;_p^6!Up76sF?+ho?q%Xw1=kahnz8*JINs}q~M^O^trz|VKO;STu6}4aKvI +I#N)5+cCaKCBsb?Qpgz1MEO{U$Y-+wQ~tj@_UW-FaZ4@!e>6bq7E+8nUM#aX8R9smTL!d3SmJc{uu5; +D@2$f5ZB}Gi}57?*e0H({~?9>}s1hb77c3&XC)Ul0%=LE;E_NMIH?A&ZbVrWa_dbsbege;N7Wp-+k9S +`X6)pXE%e+06YIMA@u&G?qBB7)pCz6bKz>a3omu;wTp9Ko)jV+Y +V75q>ZNfv0>1*@Z6i!e{6>4@Eo$;_LYra$ZmB{7jy+Tn0*k7WVc<{_L-6qSO!<0)DHu||-lSq+65xws +UMz +pOopOd62!+*E+NxvxhR*!8jfs6a3_mg%f**+t!;egc;76?mKSe`) +zY2Z|gP41RABhaZk4%Q(MQSy#$Di6o@3Y5e+5lshZ +26YUf^(eQptoM`U41y1zaICi36uYW%|#XdAl$ixrQTRw2G+0Cu+;WqLEcWu2Jb?5 +DP@_v(xCk=qjGV}B*gM~+IAk3EzyAGsz`KK4n%eB_Mc^lr3ey->F~KwCHGeg@6-mi0TreB^LM`PkF&v +&LJ_#qbUx9#kWy?Za=;m|E(mB}i)v(lkL@N08PPr1b=8eL^;$VS29;hS3U!(Js%NHI=n5yFlCV$!J +)HFh~@PsYgHS7dUcfCW~c}aLA}gK%^pH(nb9cWguuNGpB2_R8jY&ba=&QW6lt_|rJaxRF-{RdTN3Ewy +S91B>xcU|6Ny=^Uli^O`xQyJFIRyKs{K^x%2a~qnAX0WwzXCp(;83N@@sQ{mr*l`8%W0pBd3_R_J(WQ +;+k;EkbGW#KZ-;a%Mh-WPSY>7hH*_I!?-4sAzYKlFs{jD2-hSsjB7F(!ZnEuC +3C0HkyuJh1f_Lf9g`a1{=a@x?Dln=KL1VJnTCuEIqrET65iKpbjP-)9S11TI_1!t|`A<$zfz8$8o!5s +Kj1CBEgDY~=-BcIDG~xJJanqyJe^$6OP`G3>Pud9Guxn{34o@=U|!N}decVv996_fVcfHN*8(h-WzW; +er%ixT421we4dvaicT%#v)w(!KdN%2CULhyiJ(?I3c;RC?q3W)D6}o+6^~ugS1KCTg0@&N@SpxYht9G +JXnk1?(4+_Q|$!){)aNHME17W!=9M7m1Ek>2MR9Ja!f1v0D_rTBEw88lOd*Us6T;Sp+m83zSxQ75dYu +sH*{KIAJ7b!KvD~@7v +`2tZe7NCyp!c9{5bn(ch4C*vtMc*O>Sf)ARRE!}Xy{u*wAYu<}(V_(VDWl+?tG*pY8D*F1VGix5L_YnU;TbS*DKj3Kdx8AHvFb|f;y7!qrkF=R5t7 +!ny~44DiuhD3%LLncFvA(3ImkjW5ZNMx8XWU{}`Z1W-+_VzLv^7axL_VzLv^7axL_VzLv^7axL_VzN_ +;eFMv6Moe$?d_u;5Bz=R+jd>0l195h(x?_BjmjV?R|6p=jW&=3f9okknx5-huSlL*kKA}$k-Th>N ++Nq(t{^Kz_=MlY?C2B1C&|iB`&*G*vZPafp1fFw@JS-W_#~6%@aZroUg4!>_4G2c7@sn^11v-M)MA}N +tN33Aqgre%R73yZzP7r&e`5J*nqr;fZlgy#LJ^6tIjkr~FZMHt@>?lqp9X<0hCFSX1;c+;QqeT`gStf +V^r!>;l4{Y6se`=K1P$wuW%^L@MshMd=x0sS6>Y~ic9$0Fs7mL+Td1QeovojnzW7k_lwDQn9(b#Cb*2 +0AJ$ZwZaz+0=QE4{6sp@H~N@sxd4=^uEj^mV2GDzva&%jv43A9%~@x}tCUJaN#=A1a=5pelm{Z< +T?r3|{Sds@`&jsu%~}a)z!LJ3mkLPd`(Y*@3svOjl;LpRHF}Q@&xUih0njNE)WDn3-=c@EBpiL^?bo( +aufp@6aWAK2ml;P_Er|0ik;;E005E! +001EX003}la4%nWWo~3|axY_OVRB?;bT4vcb9HQVWNBk`E^v8mP{B$AF%Z4)S3K~dAia1{7Cg13ir^O +MMMNYfligr86OycD|K6l)w^W?dFz?O0_eKZqkw$M^3)6cJ3A@+r`eXU9UOqiOZ?4h!WY`H?RYspK+{ +VEdyTA7|hm+Rrq^1AKcC=a@7}AOuvx_*`RHm0Rel>+FMNYEHH|qHnZ!v}U8JFy|QJF@6aWAK2ml;P_Euc&qVQ1&0000P001Tc003}la4%nWWo~3|axY_OVRB?; +bT4yaV`yP=b7gdJa&KZ~axQRrwOIRa<2Dlh-G9ZPK>?@rx=z|0u-@CnIgXMTb?m^8>*j)-K+CjEgciM +&l&t&L-$&|g$?5ih6_AI>nc;9A-^}Rbr2e5x=VmaX;h^t~rVd>W$Nk^w2<=JZgk~E~V=dOgXOjAA$w> +rsr~VXDGMfA1h3f!2-iGObhqUA&_d=z~18KXFN*MSe6d=3eFI=h}*Q8by)`$lEh=+m4b{tFFZR87&g+ +loOUiD6C`vSpquXMcbY0g5vq{ZG!tRBU*k+s|7s7*-C{wbYzI%g13OWvlQlr%B40Zn+o^$TCdH|Z-s) +M63ge$C*tixr|frl09v$h8(*dPmSOq)^fQKHMnZQcO2{{4lA^zRK=vEtD7tCY55Lncf@gt~BQqs8#q1 +%|FmyMdUG`G+&A!J|C6}iTTT4lm`D+EyZeYmLh+N`{gj?X&c>L}Ckfr6voF{&4rsFrGr`JxRDrr=0Ct6XZ +8tlJKqA4V;62AP^UQMflNzQxx!3BwLUGTKZ!!yB*JG)Ehm}AHB(>H<~?s04-dBT{t+FB(^&#AQ-pO%n +$ca90Kl~N&glcz01LHFnciCUk_#@XF8?p@q~JG-zYf^tb4_QK(2k0Yy=#1J97{onGTRQ}rD7c99!Kag0Fufi6+YJu26cvid%DY<`J$O^CB +qKh*SG5=Y@1yitJixos)OQm#+E>#d3(z_mbJLhL-op)!ycFu_AQ>+|&$QfOIBlw&&8Y_*Y3HLjJYr$( +Kx2}W-O@@e%7LC}JFK5wCBG|?@z?f_qP(tR#yzK;+c3Lf9xkN@Ei&Gxn+r@;C`wH65{62jfCO6IR4wl +1s~IyY3V(#UOh%XVFBgGb@R0{Hb*;&Zp=v?58FIHoox^_X;bDggSuaM!|WmsV1-&{8~ezH?dN3E@f}! +V*E37D`FG$>eUs7CelVJbLlizRl8Ga`|cR?tbXF)4_in`bhuyEnd8IozZxHbL&o=p*y>sIMdtl@CpQH +o%7#_5N7T33;L6Z7Y$3dAfXh` +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 +UbZg5*-=XAJBH5)p$(I7sRUR8V +L7)6%z50@L7&<4%_`o6%tP>ud6X*(M8V#ysa>Vi!~|mJfxtu{e +X8yaP=@=)_Y;*0SKw{0UwF$IyC5XAi8k?LHTMSC!Jrceu^O^K_8KLqGWCJ+ly-;O;}0anM4z#ZU_&8R +G>F44GN3JdnL78&wF8621AG}+)?nd0+@LKgjk{RCjEP12kRdTr6B`pMK +;jBOhxOA7|D8d%PBxSkCxSgozq(jNB!Y)T7>jhIa$ml6j^83|O!T6j-$E>bjqnKzka`jdA-ixZls +2aG0b;M;_WRdY{dd=WfVGV)=N=d@M*nb#T((+)6cOlT&oC{lnmIaajsfO7J#R;3*(#rLhkq;_Vox1#p<|*k)&*?c@;3V?0l}Rlb#)bzvpNrU2#Ef9*Z4zt^KNlYxHMM}b5e +lYydoj~rOpfU*PgrcwOU?CluB1KP`jB6XA_PlY{URum*IqS-L|4 +((1EK@un?SP`{q$G&b)S~SK4)|EkxvEx){>O2Km|t0Ukl?rE`gq<_C)K@of1{U8kZRLyxpRMoApm8W& +3ivW1_dU!YzL;E?+dtSW+aQhLg(?Q#;)${{9N`IA(~lAock9ecT*4j&KB};x<|~_d*?2!pt0HSuo~uFh>*Tp{DI3>P{7md +5R!RnAjqRf%UjiINeL}odYNi&O`LagTvn&Th`J#^j0=UD7IUynNK(IwtZq^o{KjM@Gn37JG|GZl$ade +acOdI)J3-un59r_h8N6=erPsfr^}t@bV~i|Rqrj9jyoTpAU62P_3c$kP8}PG&Pdtpd$L?FM())454_t +BUhb#Pjl^zHkT+7Qq!pkh$$Y)+IQ+Kx +(DAE{dNLT=gF-Q*5Kuy6oM9V=x*!Xtf+sJ!KZP!QdG3%%lQDbz9^s#AZg;E^aLI(Kw{Zf=*e +6nW+m`QEO_(mmkrwEhNAO9KQH00008031s8R!S>wIo1yV0024w04M+e0B~t=FJE?LZe(wAFJow7a%5$ +6FLiEdc4cyNVQge&bY)|7Z*nehdDR>JciPDDcmEYz{H_PDpaY!b9MZei#^BJy*w5gXrb!+w(gLc5M75 +F$cfJ1Yo!QmLN?Kva<@H_lau<7dW_EYJXLfUXs{hDk?|LvI!$G$<8u!TM@V5ICDShd=4|_iu#-d#9{$61J5TWfEp(;g@J1aHh^8RC+2t?<`Zv00u5<^AF+U&b +i-h1y$)U5q=D_Z9DemTo-cj@!sO2L<+$lH8Ze8@cYO_B@31Re7xgBZS;g|B>9;&eFHnq(NYZ0SP>Ew+mLDDzveNMuSXAL$T% +E@Tr-#Xu>4&(cWe`ohqlRF&IsjXgJXP^va*jG8Alr-eGkYB_P-&_hIw2Y#SbH-ZM5RmB8qi5E2+`|_Y +dOUAYu(Ry(12Y%a1V)Eeq0^3C*TkX(DfNiY&>J6s<9J&2dX1|5s6=o14mn+&YVA`~=avpY(Lj^{4Lc>yJ +5=o?}$i0cJ)vh{7y9Z=7Lbb(4L-#S=@Y1GNf764KA(E$;R0ljZ8fOOySJiksZJsu$F%?02#+pSi!(K> +6k2zeO8NZChvqpJg*&*@2}QaQQttk7Y=3Kw|h+HgMHd*XPmVtkVi~}cadOh3At;UC$(nc7j+{l-%4;dOV(ZnMsVh)dV9l2fb;aVOx~Bhxefw-d@c?*4) +RZ%$sh|u11stG7x#ZM~ZwZSo<6l9r3m-NU>^4X@8Xbal)yb_eN$S**o8YS?q!D@Y +rSFBCjqlBYQxRGhX2vYI#+f@YlSR=&X8@TSf>(+F2JR*d#sN5kIvG-T8PX-|+Yb1KIzcShu$YZ;xtU# +{$4%WD;9YFDl?5G&u?*Onn(#Muvw%0$yvNZj=-lKQcHCTc$3Pi*p59nXFAN +r~S7+@k=) +?~UKy4zB>TX|$VS^6lXI?ey~fq&L0lO?ur4gqa_}WDV0>Z)}HE=amm1Kc6=nA3yi|pDJ?c-nd%|UH#Z +RJNx&4eyK&U?*^m8$iGg=55~7sM7z1T1K?kh(^hQmHO|jpzHYQC9a4E`yOy`*jaK_*yHeLcwR2ESE!4 +{#R7(r>DhKsS3-x^t>P!oDo`ZU+g?gQXdZC4Co#nv3kHCHv|A$nYa?lOPj#fdi;hpcki#6Ne8)h0?NM +^Q6!}FKlow{_*cmou^;m|pActioS8j3Cv=s>(#(*S~+j52MKzwIs`UvylOWQ1QaVm&o3yomLYx&YVR`1mg5^x)5=xlZ#Wpv+RIzF&w6tGNYJ+Cj?1 +N9k!(Au0!UY=Kx}#I*=m^*cxg4NJgH^I+-mPQwVv}$c0X&3+*IP`$InbeFCCLBu68PA4U933@Jg*F3v +k5bNEnL_QR(vp7ewrCGusoOG+)$Sr82_T+hy?9v|kLMl(0`g+*G|qrHITT~n=~QUZw3b_TMfr4Vy +E10!52MpVfYc2a(zT7=B0`50AecB(0H5h6Ir4I+zY_+tVIS-j6?u~(b +T>V$hDYw}!YM_eW%NkR;9WU*-3P$2(1zQHyG6hGm<4iOX(yY$%%y11qL@^|PP{jqH*%vHbW8D +Rd{%Ur7fO&jHTZcNk)N^M%SQ%7eas`SxKdzycg(y(ML?NysO0+slHAg4Wc$p_-j3mfaU>t-MQ9^zYT$ +aPwTiJbj#wI585laU!(9nHEC8LRQ37f#BIQDyj6%l2`qE4GgFt^pyUa%WM=uE3 +o5g?|8*KWeMHhb6s2?_)NgD$q$-ZjJp`jLXy#Q+=MW#x#i8@=llTHJRJ*;kk)OH1C4`=!ow}n<0AH^2 +KzDg_+mAy!Kg?$H=EyT)|X{>c1i|OU5#!I4& ++0K5KTT;M%9cn?`!1{vtbhcF~6Vpe6-$N&OUz&OwGLay5DlgmqT*(XS}ah@z$0L?l4!n}~W5 +(Pvme%=@lt}Asta3(;s^66g!rUZ?OhSaZ_5$2TeBF7Bypu=9B6b3JQH7%R^ebVodW)uGiPMx*u#Ib|G +VGZV5Hg&a3JB?5Px8F|@=k{_R)}Gi}kt8bl_}a?H*GlC;#>^`pKlgjseE9ge*~I@UdJc#q#2o038!zf +4bVD9OlH!>GxMa`AdkHuYsh+)PwQFCbLZ@VMdv)89=}yukiu?@^H`p1I>5nXs4KkLVP8P&}d0sF7-oP +rg)qM5hRYRPkfxG=(C@IQ9%0SAa-_y$?QYxX7&&s0RdU5vuBMaQ^??M);!^pXc{Z4|&9z^UO$X@rLI0 +i%k$FL9nImdvVk3$@TCa+X7Y>egk@S?2zAzk)UtPG<Ssk;T0|Rq0#DmQZ>b8p94&b#3ixgd5=o +EF0&-M*}xHal#|KJY{<5yp@4@}h{>p$_&9yyc5HEm_YrFQty()NYFw_KOC+b>jTurVgVD8K_wqzU?Uq +QXK&^lKFuIx!CM5zpBFEFN9+#Wga5}`1Yl$p@Knhi@eGONiobYIuBpnaOW=Y8-`|>|F56up~%tSPVjyIE1QZdYLvZB1TC;_-?8_cLjS}Ceb +(T3qftcw@K>J`P&X@$M +a8UwI2<-O!Z_XHTfxO=`&^b9l~{lcZyhE${6pCJK@V!#kwhbBdxBe=5+5bqYm~;zm(Jj@an_?I+dg2^ +UrnT!C850rjrtkNFF}(d}poz;ZB^g1wT-GA$Fzr)i(|uL^KeqUKL7Y@#v@D>H3le43@V*9xd~I@Eeja6RTV>c^b%K!)-)3y +RONzDfj?enD|4`PUTqt?B2f4zOu7OW<@=zSLEt7M11J_{CROg-P9(OPpwVh)~gg)N?|=tum$+#-71WQ +1aeY0YSe|)i3y?|*M#hJerrCBsK$d(TSqlsrHp +6+O{Po4#_ZE)T#NVj>zp^pcK}aJt1u{~BuSbKujMUISmm*$dm0HGxi*ibqzPvdK#_U0*z+poxfjSdAb +BuJSq(`BiMS?H5sE~MFd}_7xStQz3^M +qxN~IQS<^kOJvdalIwj5heD^HD|EtnPK*;gVfA#3Q#S~T)F>0(^^XvhHeN2#Pnk?|gQ-&-sgBvVgpi2 +s18S|fi>Uyoh&E+0x7gZhU3o@RX^!-z|_6{HSO&D!g5jn6a~D3)VYiju>~C0@NxkB(o_#?cw76!zF|S +u~3%DK7(5f_2S5aVYU7@rly2sDzBYM=9s)UU2*>-*EB`&-(Chc*(7p`W;m=<&gH*I~s(;t1JA9s)8SL +cu7ux-;u2QBDQ4&dN|`UXos;bgK{|YQpRa&i~j;pO9KQH00008031s8RszNx2vGAWpXZXdF@&MZ{j!>|Gj_3yH=-#9ZCu9R&$-}==ud_+3n +D((A%5qjUp2quxes9c1qdP{qOgl69OSgq22Ckb-J_?V88eA`|f9FZ?E`)^VX+M7p^)Nt!}Rc=U3MkKS +BxZ-VXl3g$hh429Z%=MORO71mFjzRRI5Fk8C6bvt<3T&>+PiWZ@j}s~>U>TKQ(iLjD2fDguuM5b~kWF +&+nDfCa+?6(avc4TV3ap(q&g5X_i^;o(Gs^6igL-8;DATI1X&9`KM!xQPZ*c*uMuJRWEcOv9AM^q3D} +Ft>bd5~P<10&Rux%m@{H04{Kz)_&xn#t~@NoyBSiVhvOX6=q2O5Y&_yt0?pwBtz*Iob^HzEHxd12rTS +aO;N2e0-~ZbAtekrM4J1NtRVu@!cU$4_t$rQIO~3apU!S?&$|6DACT6J70&WU9wUj#R0;$}twI){e(P3JH2p;W=h>WeH(gMI+vL!e9zW}(2?F)Hs}L|OW`2A#mG* +Wfz`iCFL;(FHwZZwnux+fu2p2Ioo}BK>@Zyp5*gH1?gth68Zd!;!KFTHVVnQ)q9;57h+Bd@4{Ybeakc +s;W_ty8xx!iRbIyn1z~~X{ZKhoP_QI2YcMy*ujL52NC8(LO?T!+cOx9J3Bj`WLm>rzwI0!He;?z1_RR +$Ey`@nDUYl>d?7i7zLkNZ55F +8Xp(536p9e#M6#xeZVwC)9OwAFwNRe&o}<0UQn;Fte4*YW3k5fVV`3~!ZNKbc?#~dLN +{1Q=4?~}P&O9t5nikPi9tYf~-10e>B&DYUUkrI*$OTiXogRg@1^nFUx|r*?Jr^_Ey=?Vc7yZt47fzws +NLFNM%O_L;VaT`!Ldp!n;!jiVQC%XE52sHV(eiimVLRSSm4mf&rG{tbN)>FFbatb->i^T{yJ7dLinQ>7poV{;+g>T^~OOrTp6Pc +?iRd9ASbLxrlx}UPdKSwMEszLJqHA{eTz@!+uk@2150l~JJ)chGDxtZv&xdqZ;vkb`>p*HTAN#E6&z- +ojFx>F`X7YnxaxmzylR?KB9ha3wSdNqxRcwj>~EV%yQvG9LaZ^{fy@i(l%=vOmOgCN=1+<;B^G8V8gT +808{?6K0?rLrvN3)@txOCowgZlW-NU7X&h`Q1$ras!0i1VQ$D4ua-4LOd@8%`YML$Y?B*#%>8}f?F$X +1U4FWirII|OfOk5irA>k>KFmpygh)UdZU^HMsxjY;ARF +mA2TWLKqTx!dI*((UVp`JeOrZ|HWp+3mJAzufJsHR!F~UMciDdh1ibUY^~Jpi%-4dpesQ%x& +)*X?>Wk=dz;=yz__WsubW32DqoXypV)dPrFCJJDBzI>awlf?WPmSb(efz^{wDC!q`I9H3A@xi#<>mX7 +5`Pe7N;)=Xs!t9Mcu=2-2QkItHLI&|bU?ojVkrt0Lw&MwM4D09{Au;PLJuCS?HoGzBg)|9W-ANUQ)IR +NTF|Ehji<}^@YmCL0_!z?#i8~x7uK4~l2b-MjQ9o(4xiDW`Md^)>l!r6G;m&{flM_hj8*42AFFhhd3~ +%BcP3U>g4H=*3s&d&*80?%|tytT*j+i9fX +HYpFkBjtq!3wWE$rmrbN$}S@PHu3V^CpgyTRP5pk>m2Hn;o}th1cGqyu@(@wa@2#n3OpxP%fS8o +$sIj?(3_!oT=-V6xRz^DY4NCfq#zk_umw3`iSCd-i3fG#b5!Q8ucR_!METvnn&weAnA+)%0RbtM-KzEO7cFEUS7p7iIBi!!8eB9zR<2uu +e-moZ^mkCXp+;!NIY_grrRnIo4wHI?uygN&1<&WaPgMy3(=_Gtw(>Qq-f=DJ#&QA%amNQZbuv6>26D# +!>#7B5H)Npd)n&Ge*sWS0|XQR000O897^_9|3CYAWpXZXd97A$Z{kJ}{?4x$C0`&VZpi7Xy?yv8xZSW +b0uBqxz@w`0q%roO5=jW#%c(5O*4$P(_+wpC9n7O0h;hos?&N&1d3a(^p#z_hz5mR6aGVwP{Q(_6Zh6 +rs|XBRr8x7r24+gilHwbYu+=5}6f@fkCcvMmOO5>`Nk>FagRj!5Xs@@m00L+Pefdxy~l4WoS$WVh8uqgCK +@VbALCS@y0WMNcFB&DE4qTi6%9TXymh;WcJW~zcmAv6#k|12ctXCh`vVN5xXu^q!&Q<g_ +lc%+<4>}HX#QWjzIj75|y3Pi!y*wm&`YGR1^H4&HygfG>-1Io~EYQIvc&;r-iU{|e1?1PZdCED=EX>L +to4@no0;xyzg(>f_Z(`gKhm#`bu9{)fqN@Fp4V4sPGk +bP=VQZy%RFvik6OfI)=6q&NZ}(Fkj?Pw*QrVtlFu4i+c{q2+_N>$CL@80Kv{tOTEsl67@J@j1*dcD97cM;a0q)_-`rIiUF- +;&08Q!5V>?)cjJ-GY|j^MOPG>^*hGIe{_KCaieFryYAM2hz(TJE+8AEbsTM3}9@Qf$Mk?Ur}}HI~~`t +qeclxyw3D^0fPyNa_C#$B&@8*fXftBIG2a4H3L34G&3mE;*d#I=Q?#dk-ije4Uf^k3i0v<`YWeGP;jP +RMXJJS3CQMc~_O$9G>FO67c(7YLLyTh|J~NgX~@A*$HKmP>2KZIQ>gkzHZcO<>4J@r{1?V+p;~+_1dK +x^>@|2XKXoc5YFwRj1~UmzI>?kH1HAVL$xRF(iw--;D4y@2YB3%i(}e>wrgCgD3_9QUG8B@dAA2&@8S +A5yP@A&+@J1Y(CHkO*z;<&IJN_O6il7RFNf`vNhKS>6Bbh*QA4D%`%kVHjFv$dJb5<0%*Ovs*uzb4m^ +K@Kz+wNTB&i^}DVy_@z0mTk-QFH`-&W{X_@&LaPQIvDy>%%sE{+je$u;+Zb%p@6 +aWAK2ml;P_Ew(pokO_*008s=0015U003}la4%nWWo~3|axY_OVRB?;bT4*ga&u{KZZ2?nO^>lo#4r#< +dw<2q)m>vjL30ukLQv3v1c)|rl1;KY+Z%b;2lw|xr$eHgnOD5=-n-9*6@Gi)K8s47cAX}PBgnJ_G|j%04ClJU*9aDkGw)kKmamJyff%0XMd#^D%e(%{@7Hd~|~@DvLkQ!E +z@yD^r~|HX$nM^0goymx-{c3pS%=sMiP--X+7(>0+gKj@;=Y!w7UrO&00002000000000Z0001RX>c!Jc4cm4Z*nhVXkl_>WppoNY-ulFUukY>bYEXCaCrj&P)h>@6aWAK2 +ml;P_ExC1HmB +-Mm7%iTbXac@dsf+*8;SGN*e*CR010Awib9@fDw&0j#R*Hg)~qICvqo>NYuG5WWBLb^vhRXHA*B&6ah +Z3A>VQn6v66BcuacHh+*i<>-C}p_OdSY-YzfRy?=)vZVS1tOIhF<0^Y{&2lW9U0d8|CPn0j>w^8(|gj +)Abpihm_JCqj-kgjuCqEE7JS_h@k68{( +z*qFZk*ILS5Z)o<6be#cEVVcWmzw3Ye{Qdg=k?CI^92d!G}(OW)-5u@LQihLeb^S2S&+S*krKdZhdgV +-Y>kY<`u@uIs+*%?QY|R_Ln;bcxEoP|(-lm36cl0Bjs;E5VHLs(1Moq5La24IAM+_6RZ#doW+(d6W +p+2Wku(qIHG8B<`%i@=^+OfUeT2#~I-c5gr4b4fKJ`S&MuqHotq7Xsrf{%+-tD^ +WZ9!^pN5%z)L3vbkDKQr2R2Ps(m~4kA6bIQJkW#)~3^&DBMG@W(HwKIq&Sewfk1d=R&BDMayX@fEpXT +#kLJTVD>8VWo9L8Mk~#k>ozxWow8WV2O=yoXlIrjXFSUMcFElWr#X2u*`n?{Chkcfs!^ZkOGrQ^2Pqm*;*l$oeuA$nSXpG2 +uM5M@|&N^heLrkoAk|a2Y$I}6N>Oyfs6T5-XT_&&gHwR)Twt{$bH{{!cahw$Rv;~vMS(SHu@;LlO9 +UH6+%xg=75s`MbKXa<;O7N#Z9hBWA3OQAm&^t;M?{{^CdRYdZyn0hiF{-cHsFPtosVpbc~NA&(Z_?CA +BNp*pl2&old_L=@P3Qsf239HqrImwB_9N}AsJvQN&?KVjyRT75+>?=1W4gchp-UvEw0R%S+n_3t40l* +vhPM4JIM5ovKR*Sx-Cm#x)Jv+-Yu71d!BfBjnf5lT_aUYh6mA$!(ih@hNx#69PXzDGi_Z{3P-n4+<;>rJ=zI%h~XNE&jLGz`1$tca` +^$=ULu?FaG&s8749c%#p{RA_f#KpgB0m?&OixlRNQpXtqC{Hm>3B^Vb8JRD9H;lb!_GtnB|f*|EfnR? +jK@>v}+1s%v9kxL(hck+%0l~yujd7`7QdfmiioZAB(dWi=YzTUod4(m+KNQ!hTx@DPBsmjOI?3v5;gx +gyzvdP)h>@6aWAK2ml;P_ErD@0006200000001Ze003}la4%nWWo~3|axY_OVRB?;bT4gXbYWy+bYU- +FUukY>bYEXCaCrj&P)h>@6aWAK2ml;P_Et9qQrImK008(j001cf003}la4%nWWo~3|axY_OVRB?;bT4 +gXbYWy+bYU-SVQy!2VP|D?E^v9xTia6;+17vOuh<_x9H=rju+)OQ$=hFK +}?mD!E?-6j9`&2;T34c%+az;r`KM4t>0ezx7NO-w6wIO3 +Cm27kr~AJ1w}?2!*?i52bPc`;UMz&AVCpPSO{Vc$s)t@EZ>0w@QB(4k-jTwfp0i`q({beAx3P$a$N>dr20lxokKhh%#cN0L%I~EX!b>BOv!gTmmOpNv=SrA~GxR3|CUJ2eqE6KUIxtgF$ +q*({`TWQQ5br8V^;TEiWl432=-gp%W?Ns!I_3f!^~VWwPc24($qOBas2q##Sn^8&|VkjEHz9jH^*AI2 +TgF&?9|z+PI*opzt*S^sE%BavFm-IMoOeavMzt+k0 +DL3DSKRRm)sBcVOdUxtf>7(bS?9WephK{hw&|0ZQbt59P*`Y~hskAS78!#}o)3jVPI^#}?~A+87U7*G +P!83<)LB*2JKTvHu6@Pess>$BG7THVcdvOY;>MA;XiJmFY>4!(`xAj=^8OB*FB7_lMDbn=0ohJ_Ija0W`>{F;iW0$MS$S0kuJRnbs%$Q*vC+zXk;VpIra$Hi +WIzFl%;#K@%w(&{K$OM4Jx@(_P7uNC3{C~nm41W%wcS%JDJ1KGy-d_gt<;a0`UI4 +qUf4p2-xt88Ia^7kWyu*WzgmG(J=M-E|>k3G4OIZa6-w6+LOo5)*fqU0egRPx +T02M{A{4KI+M=Ja;TvuEl|h?HKmML>M{9i>@m!~*n`ethmF$-1oP0|E`{U}Bio4-lyZWl +d>3G-1ZC`iB8r%&$u%H^!}o8G8Q#u +)5k-V5fmScnejsSnc%4S1NL)W^TB<8cRqlE(jN ++$uBJ4xoVcHOka(DQlz5zYl6abUmUy0ck$9PSm3W=qGa;kJ|;sg&8Pm%+P_sL%9@0rhjSWP@mjwROM- +?OyI<<5VlM=-~TiUh@Bk??T|d4-T4?<9o0Fg}on@m~6D4~~s?6BDTG5m}Cd*!6_kx^7KbH>_#vrgh8e +wPvi_){r%4&07oB9qX>OXx+1xtYz!I^}w369$JsA$JP_;srABoX}z*uTW_otYt?#dty%A^_pvGKgY_{ +sV@0iXYs30veYU<>KgX`bdSiXD{@7w{AT}5qiVep`Vpn71v5DAZ?Arf-Dn1lo*$U|T5?cgqE3s=nsti +6{0o9+Oo0Wp$P`D08+-5W~GM9wpIOfV`#j_+?v}a*?pf4FV`G3jpuP>}cL +CsG8+X9mMjY^7fd@4>MOC(_>Kk{jrKc|iZ&8(wW$pU|&q&-4ZDl`*2N8FR+6@ +km=Y-e{kVFIulYu1{*C`n)z_3~STItg&P~)aH%X+Fj#wafps{Oc$@cqB(`(nS4a*86MVUMIcEDcwrJ` +c8Q4-Y?-J0SlpMQgEImwDz|{^v8HN|v>|O)8!YbrQ9+d0AkO#u7#71tCtgax({FDI{8RjXsD02rY4?6 +xU(^P)8SPGS=QAsm>f?+OktGaOO92uh#+}80u-|*(fVthW&%r#;_j`M5u9|PnHS?YM-uz&GG*vTduA3 +X?C-bxU#r%2m%4Y9o|7PFjz~}o<{ +k5{xoF-qm&|4J0sMVvJ~AJhPt2$0GjqrsF-OfYbKIOXx8WXhX>$Us`B-hvLub8U+-g3yscnxU=%yt+@ +#X)WINM2Jd3euA=SjH-@fIxZMTT7JN8@*)M^RVBd#W#!0_FI7?eB^tv +yoTaO`;FH|ZE_J=><;atNLA2XRM;y_gPAS?SW=JG5UM>jsJCa7fNa_$bS76Lo0`FMQkCzb@(qDIieie +1=31{zEBLv)8r5}Gt8^x>dB1&PzeNX +9a7(k0^yO_}5RP`!Q~(x!{dj3uD63)?MAj?rZa9KtW<43tC +Rt+@(5=tKm7>95b{%va;B@tn?CMjxcJK8W=>{WgtK{Y_8K#5dNA7j*J(3pJn|WTCF`MHC6*kCh70X5_AIpiW76;@t +IT;+#txlrf4{clwnS+BaZ5aUalr{>``ghZFin(@A4619=MY-W1@|usV4FfWNrdsek13Phs8|%Amdj%v +-3b%ytQR;T`VWE#96xjqc6foo_t$r?wsktyyct-h3Rjw;#t`8<69!Ey!!u)9lt`Y +}(m;jNP)-*eu%8+0WHc(hk_+s6zq(UC*Xf!rtXF1Nk8Q4VaV5GcGYqdR=M +*~>)h8KK<0h|nftk2^}K^6?)r|GF3s9vP}a@_z0+`+C}${BLtILtZzjv%*&c$ +{hcB96#>t2rP2|xlJ~?4K}W2GfL_Ju~<%N;e;-x*xr3gz-z=M?}Yvb9%yL~og*#nmAu&mNubB_0RNROS@^@bdI)mda$)jmyp^r-&sJP)OpMoc40CNUO!I7v%N-?qWO +-#yzM7i+*~aGywnn7sLa|UtNqB~Wdw<5WFz +w5niEmYwUfr@Ry^%f>-?AuO*s>`7(dOC{f3VdX=c-M4ce&BvG#s^*T|fhV)LTTIA?j_S&JuNwsPjZ! +AnF~W-X-cHQST9TiKxp&y-(B!M14rqM?`&0)F(uJO4MgWeNNODM14urS44eH)Hg(3A?hko-x76=sPBm +So~R#)`jM#XL{*6zCF;*4dWA%LNwkkd`$=?wL*F2O&`@fe`(rL3aqd?=ONUihbQt#7vO!vm7h;(6k!i7<%Cy|5HY|G7QF7c# +lE)cLsJr(oS=-Jt{eOGMPXCiW1rh_C+K$O9QJ!&{B#k*p)Cl3F4Ft~ditR~hic0qgm=FzNB%*#?0;G +5`e#oqUA`TuqbDHR7*t&j7u@`1srfYBuK(pt+jr-S(?DJ5w~aTx)5>ofQvn~}0S_)dxLootP)h>@6aW +AK2ml;P_Ewc%k4VM<000UB001BW003}la4%nWWo~3|axY_VY;SU5ZDB88UukY>bYEXCaCuFQF;Bxl42 +Adm6_yyfgj3rfHU=7s03ntjF`lf{X-zNZ%D&L%-*XkM#Psw&J%7G|Mh=tmc9-Ez66PHyctOpPCRolFw +TD&v1odqbaWsO+9VMd*j0oOeoApP#hMpsN*Q*TRIdNu;T(&$ML^GU81snQHy<{g*6bB5MPNja2mP5~{ +aOAX+qlHeANu-MvlkwH}EL#4ru-jMA<|&rajB29)wpog&US3Zg3;L9=GjcA3A5vpUA;1I7=Kjv#&z$= +OP)h>@6aWAK2ml;P_Eu8at%iyN007zv000~S003}la4%nWWo~3|axY_VY;SU5ZDB8AZgXiaaCx;>!II +iI5WV{=R5b@fEz8*8B$Y{V0OQP%FpvVKCaLU}OJg@!8zXxqv4p?hmh8b8;#B4k9{}~!d);omwz(pHmL +CM$B#L~+fJ`TTFk1#>%~I%EwryLhgh{f^;#~@40 +~`cZAjxpHoRBD?f<_7iiLw}jDkHgITrs}ENSX-~LVU|OO=Z_w0^E>9sr=^p8hCflzOfu)M!T8VT1@&ni4D@lMRUdm(%ZmwXONme_s7JIdQEA!&uKr{r`(ir_*LddeX~(YC7u +MA%-8L2Wl#S=q)M*V4MWD63d5F!bX~^vbwyMHMDCu90v=op_)7pO6sb~zJ?-={?-Ld!L_>VHeFA}JSc +yF387GWOMe)d~Vz}CaPK-BF#v?dU>zv4$0_YY_;=uyDP+%7Vs;t-6+XdJ`*#PJ>ZrBO1 +mP%-MUa?@^V`=KTN9osv#X1R3MI94%MR_cjr#hJraM5BZ9wU|j9$lZ+ZTJ~#h%WYBaK?ST|dB`keRqV +!G}-JLId}tunS{wCG-2h?U2LI=?6nM!>E_ +v&GN237wb`{YNIKZcyeL`(svB72*$OeM8Gw`?IH+fb)aW}FTr#=f2;xhGRH%3CgmC6es~+qR>M +=^l>z)O!`T_*wE-UQCaa(hyeZ3F2CF*o)-uQyStWo^c0Fio%0zm=!Aw(}_&m>qg1BRbN)JGe)+gDzm` +5Dgn2NZV@#*CDZe@BE2A_@mTc-lBS4G$WZUvZL9T~j}D0*cO1p22r9)eN}0j~neUTF-0R~4XpRWV*yf +a%pS`J0*-Ml|~N3tsS=yx=u?!E5q@*W?AS$qQbS7rZ7fcuijLey>>@o21LDaUi2ahph$hKu +_c#ahXwXNcPPzKAFL)-cvP)h>@6aWAK2ml;P_EuDTtYomjhFf#S2BS1Q +o?U=BWOJEq^Z0SC*>^JKdd*YzmghPVTXu4E{A$9^uHLX$<9WghC +0G(iB2{9lgV7OT$ER8tIA8M4h~ki+^`8xRm|+u8C-uOb3ntZGah|1S66zQ +z(f0Uwz#mmPjRY6zA4p3${!LDe%4`@%Sb2{r;j6c6Q|c8L>F_J$egYStA=@XQi8zEGD$}G%d|b8pG2gGMr|+{&@aAJj59@|EKo +(XW?aGjQWknRVm#8|7Cz!k=McS&=OWb%T>i3UE15H%Bm~8^&f|wd3(&!6Fb<-cklj7?ca|a%k6eo-(~`*|C#<Os_>ba2Y}q=1HZ3)=k2&l$w_E +zJN6w0y?c-IB>ju6dDJw97f|D7jvPDJY`lYXbx+oT{wYxQ-QtU`J;lL7oVQ+su4Psi74htIf;pspNfn +66Q4eB*Dj3BA+Ia+`Rl(0hu4mRJ}Yt`QxjTKmGX+FQ3-i@lp +zv>aj%~Kgs;l7^h||zQo!A*6Tvi)NAoYC-DQ@@W(i^CPOO1eB-*otc_t7KF8d(+Ye$hc#}FW1i*nA?=&v7o(8p?`WM299BPnW=J)pMu{Fp}Xn2okKfj&~x5 +*&a60ohV)BMV-|;-!=seUT9pVS-|^=xvwO}mq=t#gUZFS$a9%Df$V7C@I=+a3ApJLYYZFM*#8wW9?0L +0i!%`=QiVJ3A&V@d1?UBBP4 +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 +6sveb1m@g%{bNny|L~IE-PJP&gTpyw#7j%JxX +BOAjtX-qHm!shS+ls@vkQ*PgDl#1fl%WvD?Z%h{k5(BtwCpCP8>m5sJDIL4ZuB69VHUd +^hxpgIy3)(=I7LWNVYd%FW6(NbA%tDL=g@E}L{SG&E1i4s{zNDnK3y)%WoI +0H*aW<;+VJGY>MGl?|6Rj~gghuD`O9RAW7ZTWz@!XzC02dkAtV&&)2=BMp6H-#!8wb52mvHD++QHcCr +Cb(R>^qHED)7(Ig`r}HcU_HCrlcB;3jAk+ck=Q+AzfmgY%nAT+qmE|qq0^Zw*N_))Y87Fle%+C&2-OVYSm;PLn0hMi4d-g!e!!heGK#fUp8B +6^2fxn2Pc%KG@Q(gdRC>!o0ic_zBt)9J4S@Sag%wZmg}6tfG9#&zz<|P{DEcvTpIS%WJ+^cd*-0U$2# +;uI4#V!j@mQ2wzt%l$Q}Ev;(xQD?FIk<-Wvb_9{>OVaA|NaUv_0~WN&gWV{dG4a$#*@FL!BfbY*gFE^vA6SzB)!M-+bNSDXe +ZhJ;YC(=>`iBpVZl)`kdh6F;q%-N9_L?4X%hV=Ak^y=N}F%q$l}5?6gFFYN4``{kQ6P=+?0FIjXu74R +EPd@=PC_~LtOJ?@EB538OQZ@wMR_pf7 +X;1H;sP&+84to7st*=fmI=#^;u76SMo6hBB|FhhGlgYc$^uO*fbSRb>56946e{gkr3C;(NzHc<33}G| +_LGDFOJ&pa~>n)>c5^9$Q-HVT-4V-V0bF8c35oYfUqjWLoU-!-p^IKP~5o0m0oEZ@|Tltdb-t(d)5}s +G#B%WBAm&>|`6n+{D)TNSIzaXMb6Ha3?3>YEFSvr{z)=eg~q6vnh^ZxayT3?(B!J=_02zNzttTi9^c* +W6B-K^M~P)1O@ekm7Q=%mXzom_08<1(c=p<3mXW#}eASx6WN3S^eXzK{(kBj5P~QIZvX4Hg8(6nkO;V +oI{qDrt2~+>qk7FIFM~S@|5W&m0~IDI`=t5YzD(wG%&>0!7KJW=TVxf=M@VV}=gQeTMeMOT-1NT-#6% +^p3Cvi-aHvjF<2M1NZZp9hI_e#5#kjd^9&Cyk3Z8tV&Eas)HY^oZ9d~M9LB?d+^dq5xjur8+=o-k^v9 +4n(9i2TQ@bh^W&7P)vGBNwF%F$x!rA3B^AB@{yn^|ZlKC)B$HCfprCHz^#Fx8R%2QwGop-+V`DN+P&8 +H-YxQWdX8V4PA*ll0ffYsF+Sx`Mk|jfA43dw^mKrF+)(1b9=gi7b^}@0=()_YwB;RU7ew<#l8+db)oS +iasiv6~T#5AkWq0^{ng|gRGZ+raEDyAqWCFs$1#^){gdmHCk0##Gj2cKlziQa6ivnPw(hm1;uohkvGAn84rHV7V*aPvgVRn3@L2iM72X^enE5U3=04yGG%@dT6xPb +Y!ngKvqE{44cE_s%uRQXE=+t8oQ!ch6eB{P2&&;Y2q_|tCQ8Jb0UX&xgyx5bfO-$276?0?j>SOZlffT +#lBV0u`5U`77@#6YYHu9ICopJE6rN-sR20P4KuaNI +5o##lw3IzLtlx12jGLk0Cz8%UNy;9hO=#hS1zOPV_@(IwFC_Xp<{?5sw0A1n6IdHkbw=AQ4EBFk8Ocw +vh|WyY=(qbz?ri`P3+&%xu^PrmX3w0%GZ(G-lBgCr;%eg2z +n6d?1Zvc{jhBzvu|7E!$GQEC+MYc;n^R#!;6k0|2_Yc~9m+jV0mL|HR@cBjjuP^eP%q{G0H805*$(qA +<$nvypAf1XIDPdfXnreLZGq{>;N%c%4uG-mvPQ@1e`x!`(B@o-L?rUdvwF6`WbH<(Xf;)-R8kO?_~V# +(cQ`;Z8W7IWgUTc{La=7E4EggghTmM70AWO4k@7u%9(fo9QCa_mQ~{heIsZ#Xe)9Hr|Du^#LD%KFh5= +Xjdadt^t}3DpcvExUDGd*Xxzjs6yX<&>bO)pB(@SsE8C-RH`0#1aZ+C{nZtr5nY?5%Om01ry-&^Io4N +U@6aWAK2 +ml;P_E!DIPZ3Q3002t>001Tc003}la4%nWWo~3|axY_VY;SU5ZDB8TWpi|MFJE72ZfSI1UoLQYQ&w=! +FQ_caOwTA$@XF6iEXhdBQ}9SED#=N$R4_6yG}cpa3U*O2)^*NFEGQiMV_qh0ssIP3jhEo0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAbY* +jNb1z|Tb7^06Wpi{caCxm(U2mH(6n*DcT&WL9qzpmBI<-zv1&$f+0>c=B@z9^ld +{~hP+ZNeuX~KbJ%vvRM18Gb+$Be`N#$5a!BFWt#5?eXQwo%N;0Wv^~*Didfi2%)b7GWL4>5jy`^8>ao +j^^}H9$6OSOPcbKib3F7wqWNc@&-Xr +lWw2P|#p@O1PXe~4X|#lA3`i{mXd-4vNc=Ls2m1UIFSxDM7<1T>C;}QsnIviB09gSMPiS{wjTmeb{6= +WX1a6n0?G`VA@S>7z&K85zkfZY>^yHxa|peeXG&R^_M~Vd{?xxZ4cBnfm^uAe=W7p8O!Ve +=HciX2u|R@C&@xjKAyO_>+0RpnPnm44?Yt5Esq($J_C|?CF!qR%iaaAY4j<=KG-x4e+&mm57&47w~V6 +E3e9zzf$WN=wAYCS@+)HQ0i9`JgZ+pPzRokSgW~Nyp;HZ +Pp{UXuI?uo!il;oH6O~Pl6D{BE??|+SA1B(Ymsk>Ny?RL%;W*J=y_EYA%0zqh5-R*jqP= +?Q6h%+8S1*~uA0^tWPxOAPTB5!GnrKzOGSRMMpm#;2UB^K9%1pbCfdi^T?K%cls7kf#7SA5cpJ1QY-O00;maO7>P3YWLnZ2><}LDF6U20001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAbY*jN +b1z|Tb7^#McWG`jGGBCMb963ndDU83bK5u)e%G%+*$B|!8Px@8d*%wd5 +%nK)>P!3(_?Pg7gVetX=Ki`-2Pvonzk7 +pKgCY`{>!wTv({=V{dsJbVXybiJfHr)_A7vZKjUed_JoTn&YrClp4{i@ +FINk|?rJbg|BPWI7Utew;N3G|Tq{{_P;B5JJevsB4ilQ5)KGXNDSiplkH7-PTk(m%X* +EW}FiE-K|pvy3`cf%QN&ab0RG1hSviXZ#Xq1d=5rwTYD?Uk!&epgrAD17Nat(lx<6=q|0umViUDr=IM +XR25MVA4QYxaTyCMFGeSy4RvGMF3^)lq0Ua=fI9e<*dgq;F=$D}tp^(g&Sh$V>k|lj+I@B_8Rd2Pem| +Oj7Mz(pP1MV8JUMm%9OsJ`4MW*_1IAr8{wd$gLLRs*#TYnX-r&98_u|+WGUg +BH1?iwxFM&OTC-~P=udNsU=a={#rF^>aO5e3H00G}vM96J)}jN`z^`ltXRl5>4JMO|g3-1vIxtnz{sf +pln3=xT>wtsEOG11OQIb^z7lI>VcHdYTwm$oAWx=pjk?&9)N($?@9>vhpe2GKT;K5^Z;@;;b$1h!SmE +&IVG~W2s`L~0at!pnb_nRx;bOj|2xnC-NQ1=4|#`^)vTyY*gaL_@_51^=aXDwYV9OPFE*}X#jo~|>@+ +M$07Z+28R5UMh{rOci>dLarJ18j3|i2HTp#lhbPQ@Z#!WKpGPe>YU8s*J1F@|PNlxu%!uxcb-wN3W5S +iAH6h8R>%TkwFejm1SWD8Yse5Nw60hnk0=UlcVDwGjaCVLGYJOH-xf2nvBPjqoc|3v8e0Ap@T*v2aN^ +8k%Nwpzfo~-I7L?5uWgAdMJc$ym8`j13=`6Yzca!~fQ>Uhk+ss-bHUIsq_zQ)fX%F4PpZEPYEb +JiqgvZ543{cI9-h@MjlLayiMV5c0K8^z>S%Hr+ufQKa4@DQoCgPv*n*dSooEM2YFt_U{sX;geFw_k#E$Ml#5i7TcoX_iU_pKf9?e-Uk{B;Ql8ly&5kaJ(B}FmiYtcRk*ytM0z_nvc{hePG==?%k-P?Gg^w=VXoet5l*So|nq{S@ +XNv?!W9-r)fE#@6aWAK2ml;P_EuwfBWdOZ00 +31Q001oj003}la4%nWWo~3|axY_VY;SU5ZDB8TWpi|MFKKRRbZKF1X>(;?bY*jNE^v9>S>JElHV}T-U +vYCDEDx&ICfyza7+98OSc>%rnsj+63W1jCm@7?cB$dSf{f?AmQL<<|U4soHiXsv3j&~pLJ|3APIG4p* +vD>AA*HRF(Bm#aT%5b`d +d9&3aQV5#I&KZ7OcP_)@g#v!`xTf5Aq^0~xzWVw&*=g;+Xp0~eS5nRj3@01t-n+75bFz6Sb4~`K2-iS&h;GeBDmBTg9lsUub05Mc0(^^$>%V +ma9^1mPxe|ve-huh%9{20Kx@~kq%qS>AW|Zy9WOgcJxMm|c8q6a4z=Ue0_sr+V<6Ls7$clJ8kt&K+k`d19wYOwF?n&`~QZSd<;{-Ta&E^EY&rZQ&eta6=&{Vr;4AwsF>;fk8`st>!S59Z7m#b%|UA!hMd=nP5bTHaVI<1UTZkUm&v-dpGAbzq6>Fwd@UPL3bXAqQr|#a +|`iF{dKltd-_Slo?UCIzzV&Hf_gy)I+MDUVOIy#v5P8pA$I1ouIwvL3`f<{By?)_N?o}|7iYx+WmO>w +fG%>Qc!ITON+q&8+tBP&vF~I;_ElbNi~AK(7sHUvsv^R{;QRr>SgGM)Y~qJBh +GRJn#Ztdnd3DNd~&{4XV&NK}po&yIKo#S2C61|JM}32!|j4hbK~FrCN;nZ|Q*SQW|AgL)X);1Z6RyugN+*k-A +q;rHO|o_TI15PBckt?D+d^I#HTnP!>2WMvslr!dYk`?s7d8&`#8e?jm522e`_1QY-O00;maO7>RR7i +?(j0RR9>2LJ#m0001RX>c!Jc4cm4Z*nhVZ)|UJVQpbAbY*jNb1!LgVRUqPUvy=2bS`jttyRHl<1i4t> +njF&s12#vZEl4e+O*4dS=vGjr6-{#i6A~%gUZE7$`*1R`wW;Ejyn5(MM{NLKbA0?Sx +GYP+$wgMYC|M7F0!PVj#re|}(YJ(v75~aZj7)1DcJHNSG+(5wvW`viO(iTi(NTF2;wdB^KvCtjlZarr +nTQV+5Ym{Y78gA7qm(%m!a$z;H@=>#@LOp>?XOXK%Z_$Bj%Z2H!t7f@ox}1Q{SYw;Kk7fR1!bDCw= +;yWWO^| +`^Fmkw%aFltlr@)k`~(c!&%WD4bkJW10ekbV3^5q=&+R0B^k?7JhE2Dv_&+32fnj*3~uJ%-d1TN-=*0 +Ee=yUIo~ZARCh_gQOF{@QfKtgyq!eZ|IHlD8z$iU!)8;p>72W_)O9KQH00008031s8RzS!y@qhsU05= +2x03!eZ0B~t=FJE?LZe(wAFJo_PZ*pO6VJ~!Lb98erb#!TLb1rasol;v*gD@0+=T|iN!jegxdowXn+0 +15iGs4Sa4C&x7nv|BbMdjbyauL|(H1>gTzRT(PnsbIco|l5`QiUEk!z#rLEwE4&N_2TKnY!rCpP}iwM +{ywmQ4#@@Fh&vpJubcZ%AcczP;jk8@C-$qDfm>BY!S(FE>w$TnBg6WT19xv`brSCTdu99mZfZexwI@R +qF73!0-OcG#%cAVD+}opLxPCJN|lZTnlz|60#qRw3Pb_JE-TLd)94;ksXN{5#W6lE8P32lpT@`agQ9C +qxCX4D`d_2pP)UHsd!%t5zePY!aRlL3Pgn)%-4#j|^FnFAem}P^1|$g4k-DhJPHVWTXCH4o9p245aP| +f`wD$%$9m@y_!}JgN!ln$vA2Nnb*$9T7!>pbBRNg^{W0?nSe$AbiQHn+8v?-+v?41bCUhU_Nx43K)a{V3|i1`9W0LUz0{W8XtY+mhCpZ%NqkdIg#}RP)h>@6aWAK2ml;P_ExU-2 +ayf~004as001fg003}la4%nWWo~3|axY_VY;SU5ZDB8TWpi|MFL!BfbY*gFUvy=2bS`jth(Muo`U6#_GZVI3Jd=6CJgta{1`4Qb|IeeX7_mNpuKPZXjaA +~OXrzoyf?Q6^TJyLy!DSV~S>I&;%n(%2LA8Qdo54XqByH?mK@lEywR4olYBw|xq-6GtLuFz`4))J}XK +crWr}n}bYvSF9STaCk@p4!Ux~cp@t0G9W7os?en<@V^APq)8#7zP=zwhSBZ2lv74tb|~$3zj +u1(d}L0kycpej!;$ZUz;0t~o5#L^sWm_9*p~}~U|cVCy_{~TVRstOx7m_BD>W+08m_2wDRNiH;>GFH* +l_wZUom}NHZ1UAdzdN=YsBFRyu;M`fe_bDtTz^`zCgVan|qtmzW0e(YGZ-7&Qd<%%W@^&gr&6UJ`+oN +s%@R7`Hi=*RYz+!*E2OccFna1bRAc(8PS7$T5fYl*GmTP_j4?RHDqj_+se|tI7&;mOVaA|NaUv_0~WN&gWWNCABY- +wUIUtei%X>?y-E^v8;QNeD)FbuutD=cxKoz{wV(lk}#GR8C{1QTVuR-tuEwl=9;v%%lbEoI_1Ut+&JK +R+iU2yOz%TyAU`!-0$7u|w2IjbP@Q6Pa?);LUu9CU;Q~O`-@sjMXPd^rvY;p)E~@w#6LS0q+ssPP}&( +5?An#CWIGvu(@UQvC +dD{LD*ym1p#T6K0001RX>c!Jc4cm4Z*nhWX>)XJX<{#9Z*6d4bS`jt?S1Qd8#j{Ze?0}38ZVm;)wb-J +T(raNII=v^j$?T(Imxb~VOs2_*io~a>5F8JH{Z9fv9EWY4?f3V_V)Mo#c{D(m+8%-7QyjIJb8Th^Z@?(OnjT>(OR5GKc%Y>n!QYCNnRzfs0& +dq67hOnFN$287xVf)DiiUdX!1C!Q}_)&B&CR8yu2>c>!vQ?+fA7y%OtN6)_IbMm#4=kug*`x`duxeJQ +l}iuP)x4e)aa^?9Dm;2<`UfWw8{~>Ab0%GMP?Ax?B|{G{3Hjtf`YJf8X1azZaGIR3_?EwXXK|>T-RwC +*V*0SY><3yIHcT#VP%AQkF$|B*ea0mC?;IIudyS=-(wJb%XX|B3>1F0%Oe)W(bcenCmpn=f&mYEAdD1 +w7);i;~Z#_-<+N)B-D2vfxb-Z^(v`gsOzXo_@^;Fu9J5)J%ndXo&qD27BF{`P+z23a)Aw_O3dLi^)lx +^onAL-R;M}86WYixmD%LD$mi+J>!_@djTQ0{zOU$eJ8V;C^ponPzK`)!leeFLD$<-jRI4nlgHO8Zz)ct$TV~~I=KT1tP12C`{EQ!3!hU`6%}XibdL;FWJvj`VuE%GFZD-gG;DUm_g1)f&LG7K+$aUdKcoE9n!v}wqNr*^#`ncwFle6+@! +!j%70OS1^(Sl$-(WIV!;v^R_)^#nhGQ`_+k^nj0DY4c*HPBuWjq3LY0-tbBfj>^+ZU|?uzxq_StjAES +gt@j2E)Gw;lt6N@SooewsFHg?9(@5R!dJVHFaZ8|}q5TVd*ZYQ?5wqAZ8u%n|@}O=VY7JX6#vB(mZdK! +Z7%MRmfo^|`z~dS{k_9CjcC-$q%(9}RPWdVQ~To2GGIAp%p@mvPRTj&WK>@22-4aNB4d~)^*k)fn@7lpN9BBmUH4_r1MX=I +X-uL@b#}4v(%{fSO3 +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 +QFY8}?rOWKb~Dh*1!`g5>KnE)twbi^6ZK;J36 +vDV@QzQzPM~6?YbkMCz5e8GtS{w|lWD#|ohykgm0WunXG3`A+fnHw0ll@$XFu7nr3jg2`2TiNu;PcP_ +@J0JgJtXD$g9+LhU&A@D0UbDy0K*;>jlo@et_aq$)sevfOkbR(Zq8nR#)OyKWu!Oi(O5O|02H_4WRKG +PlxC?GMU%COLb)l)UC396l$Tf)O*ujlnngDxcQ6EMzgEpN&j09C|={20{XcO` +&;GHvNZbx|7W^i%2IqfexP0y@j+UAk@%aV8pE5LMa{9?AWUEUjuT{aFiy4*m<)(9 +kg>Qg;|+EU3yOieVZyc1+XC9&@gI5H4iGbR)o*C)lpx86GXmb$bnubpehn_mQyzDi^C{b@2Gfr%#dMb +LdZ5ZUn;+~6ZPK`B>TRSB}1)V2j0 +V7J52R**Ic>Q5OCQpqf +HU_vk!oK8dARC?X!K44bn8;CI_O2C5`x^kL;wl1C3LrrjExpMLeVLC0!X;l}iz|ljU8RDN@Eoz2N6fS +3W4$w|(T$i1I&wz0~9NK~RJk8@N%TM6wu3mih#dE1`Dgjm#o%xeg)?X&HG+7i|`ha%IB1WxyXkcF#e( +JMDtmjZ5Rt>C{XXnSKr{sHM>7^{kppiYmuv}O%Kq1gA+dwR*GSHsTH{}m?PShDhe#-~)c={d@!oOvO5 +C>}c0n*E~qH1R!Il4Rj>AaOhxn0=Z?6C(MzW;^tr0@Ts{ACz&xmy5_#u`#L_sQD8&;{7R*%DEk50lpU +2~l7`#|H)hy{TW>w^tIa1w$lm7gNVylEARmV!L>fYlloFS1wR+y$pRxZF)EfJq1QC(^+L +DV=(Oo%Di^!UL_$+Ms8!`pviCZ;=WxqTo2x{J$eS-t&9!uw1^yu_rDC3nCO^cqnqw0BL3|nN9nv(qTU +)fVi_l&{y{6vzVfbL#S}T(6>4mFc%FWywX7r+LoSHy64E=xk^vK?|bM2{(zf?HX)qmQ7yN|Kb(`UO)8%R*xs +E3#1CV~NM>S=AT%?g@qKj{!{Zngz)7j_Tw4C~{uA4_bEk^HC_4fn+hti>tvJ1lVnl>Slt@!(7GkI{1V +Pa>&jp%cjC!6_A5bN0y>yBmS}P3koFU6F9~1n)=)o{q)urPwt&HwO~6N9!QMRlo1Gi?oB6ZsXu?WQKK +CcoC)fH__@N5)d6&-|)^ZKwIfGXjwSwh~<&SWd>z3Yk&}UXq;Dc*mi3F#JRv863f-)_CcMKQ4V!748z +b(-VcYi_CSA#0zy6;a+^>d7_ia7ZJT>yu%zsw7I_OC#*m%yT!lapZ%KLLsTwB0M6dqlEw)*e)3V8PnT +Ms#?@lYK(c{C*zWp@yMdYZNtjrqK$ld(|XW +2b^Rsgo?`|ZZf?4WrFOZt#pe5w3)6N4ZFCvkm6#t1q`*=2!nH<8-Z|>jZmT->E^_#J(V10{cx}BiQ4XU<0829um5rD?v5}PFhs79b}U~*=CAXaOEy~PV%1jb +xg4#5Qiv@3X*Cih0V0yA=Sn@~oZtO_n=Xuw*RoYmpXQ;5x@nzK;gHLjZLES*tiXJ%wwbfqX@%LB)P&$ +`kvA{e52h$rbd3qe5Jx>}xIg-KuoOO8=0S6LfKsC2X6h(5qNsVnG)NlMkSwNem2(hi;a^t=2{|bZyEhv`OhGA7HMf;d+gFnp_J>KD%gH&fgC4 +IT2+s6x{4PP|xvLi-wTrHd7K=EcTN**l@37e$4Mw5P_&r=AfzrnhtXO^8GJYZM%IDW%tnv;Mnp6`V?u#%tJjbM!(b*<0Rij@1<0`g +{i$CQfVg@i&SLRezU(5an$w;K``Wr6wO1jq^jzz|lxfuuK}9l+;~|s9LDA6<9i4z~poRLpyG|t#Sw(^ +p5O8lhp*(CSjI^F8Ml8BEqt1No5BznDuNUo(Ry_{ZFoUJ8~eCud)g9@cm;DEs~k(R2%AFg7=5NjC7pd +kyf6+?{JerKNC+HUk}OOQzB@Ekj%ABP0O%kOx{XkKx2v7)Oiyl6@lAoR(_Ix2z|SOS_V0f&Cu@os*5E;~zP4t#im(#D+A_ZlGqjQ$-3gMUDYEZ0fnHAWqOH32P96{S)h|jhV +5L0ab}mG4dbU_luU&+0-7$R0=6<{8nD-%k;+z)c%TmMZQr7gyPWB_J4uyarI2-ROe3LATyTsgzjY!Qe +K@8H;;1w(!@y0?9eI&Io>G}q6p&WK@+QhQfq(ae~n%|vTuL@*UwSijUuuB|MY`lt866qndcxaKtq+1G ++2?|-M1K0oe@-+jO)|($09^(@=-!ZzrcQR6;m5llM2y97@Q%%a6V0VguIOTg{g523N5@7mWj<>O-QAdIn-!e`TsmL$iEOe%F7&K~s5FV6qieroI&^^XPF>wz&mZug +Psdbnic5L5Uaj%o;MW`yaASA~){Ra$RZUv6vP|jjskFsXE|kP^1 +~+tyqyfr^{uay{J*U=KFa=o%TQdV@ZwzD<++F<@(_~TEW+w1d>t1Jabp27L1K((6rZOz@WNCg|a +V{$^n(K@TsPI}3%4|7+>1-ek-)Sm%n~#Wt8cv56cv2w;KPbr(`?4!}tBCU){9IW5NZ*Q6O#nZj3uh}l +-hc%|yrUasHwAETu^gEoPe45rT2x`g!7deysS+{Z=nWmzE)zV>bou(t$+u(i>g4;2vG~i$zg>l!(^Ks +!l6Xs+N=mAfFeZH{#Cdv?M|i6^BIt0}@qD|S=0jn?I=rY;m+G~527y8>mhe;TTzaQ6;4mH?xwF<1Rpg +Y{XJnXT#pm+{+F(oGo8vaYqp^69^i~gUQ~k#Mdn6(S7eLWd +>W)osA5v +Oq=Vw7H~wE{3G5u#0aHxc=%R2v@(I@kyz$`pG@Ij7F9}8zz6j{zC65YTeRSS)he*O%qXeO^3e$dO}2H +z)*a$e$$9xiab7p{a=rzl*p3k^uzr2zGX6QG{gLx{iVwI&sbb_m=M`JY2BU(N2b$MX8dCTALn`_#DUz +aG1~FG{hiJ1TOK@X4bx$?7vD(j|8^+?q$?uy~Frsy<4MLw{-ek-l^W+`##A2KZta|z~$94a1Bm9+xLH +F4`!O9Gh&n0sx+gijUCq=SZe({*4lFUO}=72F7-?X6039(gog{<*LA!>K|q$~Y$0D63Q<<77~b6zF!r +db+oav&5o=u*2(?54U)- +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 +cX>*GBzME&tV +;s@S-LJ}}qO;iCVK+Pz^2u3*yMK-=4y8ir!K;`2Be)3x(y^-32hx9nY1i9ui?V&?*OpyPoL-jKMp0p; +^3Q*v?Hf7Pnh`>Y=?RBy4vc-nVT|zN6)5kdED0qpUyP~aesX%KAGm|XAJEV_IR_UT;)JFo0P_rl5$iS +VTi9f%o#I2}KzHpUXHq&>jgYV}B>m0-nkiPRBS%%ES&q9 +F6kQZBV;!70pUL3}}Y5J&|Lp}>05t-|OeP)|jY!`50#8hqClxMz*^E0F@QKKr(z0Fx7o!-ew1HafEfWm=Ne` +!)>SdL=#0cB6rN#W*6CqI@Y+JRB9In*H4alKg`Jk4EiE5APaZw|L~0KCTkx0KQ>ZtqOJFxsm3 +vC?Pk>IEkjmOFN)Sik3_8Ha_ +P5gA^YFaW=d>)5(k4rRCr=2)9n4az+IbUSKtB553RXHgL@G;F|dT?G~!?rV;uxJlJW^*j&%b?cP()D1 +CgZAx!P2HxgJ6mJX{mUybyJ#$4pqJk3J?frhH_whod{zF0(CR-70|fRXuyfNk2EaLgfk=!7NTPAbZ2N +qz45)uu^^QEas2n?Dv^%#u&MUE|0x^1#jEtwp`H0K}Oq%Fc20(=!@$TvP_QMjFni@@kNwt!$NL@l94^ +53+)W-%=Q5;dYD@vp_RQ-C2n<(p~#LtK(_;X$DGS| +q5wyS+#eg%p|SUb@uNwpmf#~P23we%H|T^XnCmzshLD&}$R#;9x-X?;Mi^m0?rWtnQLsGUkL%N9n}iV +m0!>uBUaubXVuw1S0|Es1EH$YsU-8n}d5D6jf8Z8voa#>EBthd`XcD{c?{=mEhG6ZvG2q616=VpOwH{ +K-+Ckn1YSy{hI;*uKnv_^MFbQa56oop2}O6r}qeY(uHX^#Od^+QRWl7mB^K;@#3+@{1B@|9JkH>$n*( +Vk2$R%G$qOT|8`C${ns{mfuoN^zjwa}828sTOBkMb(N)VKg +@h1U=e!V?=d-Ua3UjyIROYa<1q-^?t2Ikk~W_MT)EC +d}0#Fz@5=~1V!foJb;P37xR{-n!BPr7lA9s$=@a_vW{gZ>34lcJ0wtE|At2tV9ul$SM-Kq=R3V@=zWb +^`y0ruTF^1sycTm(NW@4bWqyw6${$tE0fh0{nS}((prD+?Kelf_p9k^z<*k%I*q#;~bgKq7hx4_a40K +;#M#;sZRECQ#zYYrvcAwDC!K$NOM0|74rzwcim>Mo9vM){pgteXQ9O(xAqlhkaA(F;Dml$+7cqyxU3Q +vGwT`8${ItqXb(6R$2D3fyjM$2p~(#*t1LG*EcetCQ6FPZ+7UkN1P^*cq#*~x>uW?f8SsWaxSNhDh#m +*tce78>ppH=1*sGM%r#7stc-GmN>1#kzJ2* +{pX_)UpOP3DBAh8-hISy6u&ad8jz(XK7~cL>IZoTND?xIlEX=<*0HfYoRPMQlgL;^pVR3f;pS<$ +6p#_M=c-V+ai{gml++6f0#T$_oLp_J^F6>pig>vt*gNbt)5vW!d@B{uh!Hv&7Y`f`6BJ0~Lb3w5T6X8 +*M&Z38jkA(U-4$C>{8pQ;XR$;P2703jeiBjS9TBno6XP7D9};^2>JM~bGv`2V)mi%Ea#Mn((wD&E7Xr +i8L_Oc?Kt6k1?*&B@qUV-;+}O@d-P}>+-KAh+Eg0Yt0?aIcBlMjT7@T?TUREr7g9i!_AA7w+4Ni1+Xr +cTJNN$=+kT2EI4Hb5ADPLUZ09P|8F*lDDaLAPmUb##Mj11*Czk +K29C4B9$QP*NUfaIjdkWr9*TXv1*w4?e;ueRFr4FxJ!HFI*bd73$WTa;I#3;YE +1N!<5s(aBHz{xJrfmK^SwEk%K68ahL_Zhg6fZUcC12ljx<(cS>jp*`7>Cg=7H7F*R6i`k~Fx*+Vw>U_ +rm#`NjmRP>l8IVoHL$dD@)DMu<1D7z5ts{QQycQ0vTDCTiDq1e%LdR|N~2EumtbWjn +C&RfL^N-hLjj#ps@~&^EAU?Q~;*K?2Ns>u8M7E_FPaY)RtR~IswetH87Aw$eHqa+jf~I^NB;TPJC>g*$F^(Mx>t}NYBPq?;DG{NHT`(C(FHPD5m!ndgrFRZnq +U=)tJ?gIUiK6_E0);SiXJi@CP+Hw}MR||hM7VMvCxdAXT09OkOf-dFSd{4UL><<3?1_isEYHBn`KlS~VWfu@hMv^fI@r=E(*SXP?@FQ#a +iN>q(#3hFdw^2q-Z9r?%nLO*gR+x1ZXAUDXbsW;?mFOPi&X3Nb0RxSHLdc?l>REjJY?X;n8SQ&vL_^c +?ucDvnhMwNV0O^D}bUQE6aYA)hlkt?I*s><894Q}M*_tVUNb9vQMK*Hm`I?i1`!#j!9=X9xb$YQJNBe +GN((J9PVNg$L75-G!p9W$y<79Y6Koe%e(0M6)~7rH){Y$FJj{0qVJ*m@y8#f>^@pG3&GZ8 +O%b#hb(M1IdO=kAyxCM7N_e;>M{4Ivt*dTQpob>Xp{LkNL}j(xHp)A#_AThPC3eEPs1v1}k +OV4xa#2uAdBr*9NrrR-L&jc)!GBPm?GVwX0?HRd3&Ivs{+(glLBa&OobB)+brODUL0K=Gcy&S+a)Qk%o*4CqW5#HNA}=+hcQ%0|=+t2l6HW$AKww0_Es_cvaHs+eT4D&vAPQr +S%o}BFI4|uHDGy-sfcYpA+^IT2Td|U0JoljS6uERfQZ6W!OF_mRaWK5^DZ@USt;SvMrHMSKi8}ny2KP +hVO{et^Z<92w+2_RbmzL6wb;>BD{cn9Vn^yTHo`EWLPg7J2k36I5IRb0xD@2Sqp@;S{Q=UV)#UghKps +)_z#Q08(Khg2`7h!;kH7>PN&Q27OvctItFiG42O+^|3SXUw0KUh4_0dq{1Hb+CAjvmZ`kZq9Ep!Osef +{e|dYU0ygP1jkKJZVbN{_-n~-re)jt8p$Hhh7T^FC{7Z*ujT;z){zQRKC*O!0fU+^FN_VqXF+iLN(jB6eS_x0yrVB{~ylPPuvbZKpe@uK +5T>Gfsy>g77!5lX2RLkgZc2Cm{W}lw +*ZtcW}judoWz)Wsk@IhYq=Ov=DC{GFTN>1PU;yhwxTzHVOksHWUH3Y$|lw6CLI!xo>y7Hn*n}8DxgLf +m);yPw<-Gx2{|mQy@dvaH5gAs&%MdX)wyYr`DPLGETsJ(w%5c-|M*EUf}m5;)~L6Z+Y`|G0uK8MVEiE +6tl~3z7jR&KpJt0@w7!^UXLyT^#DiEx4h`)Wf=*-e$qYZ$U@-0PGmbqyNPQyNmlQvIh+{6BA-L#;)e- +|Y2=`GOtS}sVChZE22}hPZ1D4v(E?l@5?*i|mpqM#S#d5<)j++VS37;Y%t1-On6(KqL|BC#aenf>00g +C`82LDYGRsXxavI^WAZoWq?WWGykI})p!S#!4I;oW9k|!n=Gw&QBr{jodXYA8y7MqGs?|yW@=yTltI;cWPFY$)=R5_Sn%r5@f +q5r%BT2CA;*YZr0uSjGK(t3R;2*AqsIt$dUwo+~vhQjc2#4}pPn@OR)d!hc<(Idg&II-Vm;tGPJbxnf +Nt|TKfqwCcaq|$lxqVEXSZ?<|to%s_lsy&sVd}AEm06GmSC89mYgwqwOBSFY4}(en*!+ +Z3_dlSK86qUaM$y`SHi+eyuH(Gl>51O%NEdUh2X)kk{on<7S-KWEHwI*wAzL +G2Bp(fV#$mhT+&4uWdLZiteyE0sEv(m3TjqQH7r+-kj41=Z1URV8glD#@Oq#$U#esJ2drIN~Cb4N)bY +>{(0S!!`4m+*TRIy-24mhcBQKhVy0R*IAUImj4*l(3!4o*1kHRYZ3I`b&Jc6G!f@}SRbdpZSE-OaCns +Xtjdl|dYG-(Ds^8;b&L8+j4I$S0Bk(Tz8uF>i!kLp2o!oZweroO`qeu7HeBq2!d=>*~Lk +HjP9iXx(DXI~5p+>hn(P<S(9a-YGpexy3?F1xst`c~uVADJVYj1dekm@R!bN6^*?A2hQsM +ktzJ;s;%yzJEJU3c2R+oqgR@*@>hZ$C~>b`biu6h%ta|f6NdDIbA?Z(kEC^B(nUUqOp@>n`Rqq6%P46 +eMh3{jXv;0&KfjA=%kETZG%dYT6z+Ko6}q$g=*jChAI^?>Q{wdP3yy)gMk%Y6ElTliEpdzOgKTUn^wK +6ytr#ED6?CK49Wo|}d(v5l1X=wy=|RnauqmVLOq6R%wY|dzB^|jJt+Uf;Hiv_8sSOs>0PO;jw|HQKWw +&;zvNQjN3Z`@?g<5o6ydXS5Yk+Hd?{wD1vNF1o8Jf5piJ^$~R?NGloYd`h)^6&-oWvw#Iv;ZgRBiH^ZQc$u6X3AXYpMO +e)9kc1CM0<&u$l*r_M|XB5N@;JWZ^h^QCql``v7XA2lJJyog(&1!<##ni8ixHMN_L?1=rmoQDZ05q`- +o`OfxbQHslZ1;PKrQCIdtSC6nV1N$A?#aQh%FG?igEF4jWpSjPEbkx@R!T?9luXOlA!-6M%i6ux>(ti +bVADb~jK2aIfZlwFx#hZ!A|PnxDCn!CXmdVp#+^fFn|$;r3g&M_Sh{M#fG>OIaD4Ox%tP0uDLE_Pms+ +DUQro3>Rs~1hU +N}aMu6v>ZJJ_-qXV8c27_`oIoC+5pDzCjG=O_d2Pm2dz|XjA^Dxf@x`ma(C&Zl@}pFe2u~t44C69uem +hB;l!PJHS)S46xU#KNRb0Y(&9mobq{2Y$0My=t5SOYVU08Si-+6UmpO +_|dK*-6OwI&t-=dH4offtunN)V0iPgH_j+M<|V3nN=N}Fb9C~$R}VcN2kU%8svZkIBgwmMnbXmD}_5} +WKYN1WpLawPd22c2id91$uLTVOOf*hY&wmx1gW+=w8En)OdYI5~M+OjppOOhUl&PlP<4sMFAt)!Dnzv3K;?qkxsSTBQuPnlJ +oqdL?_yz;kuKdIkj+`T0C)#0Jm`O)2!U7Npp2J>SJQC8lE)Mc$KR7z1BGc%pXZ6U>OV;_V +H6XM^4@NwF>^C(fnsAuys3Wm}NX!{NR$;Ulx}SyVQZgwMY2$-n7|Z+dxv*~K8w0nSH#1&sMN;C_#CG3 +__m+h5{yG>2g2X+)1a4QWP0<$d>jq21of|6M#E_F +Z^IHK7AGJd?aR^4*{)qX_@AAJTpTc!h?D=sg*f01u~+0Lc|+7{vvhG>R=5aYdPZ7qWw{hkmQ=E2 +6$vPhCsG!lLgq;@mqW%PI@1~c2nJ`HHNps~{y6O&x1an;%VA +L*Zd|A<8>ar;?T%E97=?RL!cRc_?Y1@%tn84Mj{YleeN6vY^{?HtaPD~j8(5Z|2h|>YTA`jMJsI +=viFl>gBahUU~%Gn*=A){=Yyg63j(Tk_~#l?}#FfZh^+k0h$C$y3Q-E`@ltB?J+G#FswGEltif_iqE# +*Ca=X+V0%A;kMl4x-NXXJ2Ol1@2g{rz4aO`_%;UXd(jPZrHy~#B@s~Oi +rHmKK{&bRk=AXW&WLK-+ZQ_)>%$)c+!k*k^PpH6^ye>2SSYcYl*jO=tVkK8dIEU7{ +fdJ?*6nRECl$hN@3@#@T^!x3(%bKi-zxZ7%JbLwD_(y4I#W>ixZ(#$D+}9`3Wj%FF`!gJk4QD-XD!sa +Yu<Ai=OYf$=2Vuq>g60ikSK}E>Odv^hWL>mFMN&8IM0bO%GpOnWyG7%C-TignuaBQT1&alSz3s1?d +fK#CPeDf(Eqc?Rq8^L~fvU%x405VYwi6Kb1M%j4RtK&kx$XBkZngWQl{ty*%4J#~>cAC&Q@1TY@W7Qe +gLp4$q7JB+ODk-L@Ow>)wu*ZxOn)XWc)BgXa*Yr;YU1MJ?SFiCgtvphaFmurn;l9oisp=@Yz;J-bd4? +_7zcw86A1vOFnuNP4cuXc1t({9cMB=FZ1~_>tnjq{}{k-SHa3K^Tj9(nM!fLo={mg7bL|?TEvEXOZ(~ibYG213=z +37RUv80!X9LKpXer%uX2!aDxrrsw&yG|DeQ?fMSb#o&T@;!X!jy@Oyy_W3utnMwvtgI1aD_oJI;UZ2D +yuja``#7z45DY7zJN)8Ip^9N!zD!m_1lbG)r6H#Z(=Wn>CK-G7-Ban~O2&MBJ9l?e^l$KDpeIbJtf&3 +4y<)aQ1Ih;Xnu#bSE#b4MI605qptNC62b9ea9MTWLZ%X(U^gRM_HBTnyBZWF~-U#8sHw6Agh^-wQW;W +q^iMeP&0Lq*J@SC@xgWF(nFMCJkGv-@#CvA(9Y{crEZk%RCc1jm20(sgRD!Z8wkK)LFf(q!}sV;^*XNu%0Og +K5IW8^^PvRH&LO%RwYvpWvVtoxlA6{PkkYq;PH7)u=q3BeSTf5nX;FK>e^ +>-+z-U%>Lq?8xE}v2p)Nb2$9}sObOqqN3vw`9Z*lCW<4PoSmsw>?1GngD#V72LF3dWVCEbInW2AnDH6 +1nD>un_K50X5zUEM(O>JlUSwMS(TDepb-Lr|o?{5lR*SD=2uAhUk09P{T1wBEB|u!DWsNack@KQ-L{* +HU*1MIrZzLNSPp`$jPL$^k$i$aNBcO2Oxi5My0e@2YgI{;q=}1g#JwIeAMl5vuK+QuUDsA^+LhA41KE +%g1hB56dX{ad-k-IFFvE|E`dD1PeV0)-z +Yp`{+{M6a^D12osSMcrZiFZG-=s=z=hH*9E{z0q_x7#s#h-<{Nq$Xl91zjH^t9xH`bnPJN7{vsl9zet +SVT(jzK%C+2q{uf~La;J#m;HOU$0r1wa+e?LHxk9Gr|EB}144$d43--{;^ +jiZG5z9Tn253aPZu9>j8 +4&P%$8t1S>xQBAZQ74Tx~_U_{19%YpoFU$xqN6~dnOP3wopzF8f-dtR?2m*85LFx1RkC-w3wC16aknv +y_h^;0-F?_kCD`AUTI!w4I&uEva5}aeb-a2{zoP9u?YD(loo`J15^%obiA`a0cos|92hh#J@4AFtJLr +gX9aQcCl5;*&AN9-}*X6uozqJ4|8SaD2#o@tk6y)$N-g*~1jB%j+I{}{>e?a==~;m7t2 +#0om|f$K-k!~G=NN>&rOQUm9rNUpcTdzu#a-S*H+<)z^rQY(kSR$zOT=yt`qWxiJMy$*E8_$BViwwMgx)`ss@aC=CbTQ9^vRzmg2zK{ +&bQIc(hGfZqYm^!tMG^+E!9$FO+^-*9BPIWoTzYY^QR`*$&a3x6^QH1!n&uZLIj8huDQEqOZe|4)`2V +os3M%d8a3|6vcHnK@WyCk#`L-#rGE(!e^?vfD58h5JZyBT(pJj!5{PhfZyhX3b2qZp04w!QNwmorxY-R1%?Ak&k)|#f97!b58h0x20ChkWzRI&h +MpyQGO4>mq^^&M>E;VN4GFC`eNRR+N4=U0<<*L3qi~ZL+kM>L4_jGkLR6GCt_+xl|i9S2Y6)ZaFo7tj +KbOrxI^Aa%&rf5xjH796^y96Oq#ueG~Hy_m8YX(6UfYdRxZbi%M_wN-N=B!nIsg5y^&|KE3zID@p)RqWrT}dfOVNW_y|LaH?bpx9;!!>ZcPz2xqra+kK}*2h! +-%YRY%jVahAr!b8(*|GcJfEKC4BU!jQ%}m%?tnj_*XoXHYh}F25Ihm48^;8(jJItZ~j{QT-Y=+4#ENg +Y|}j8)Yvb_*`NILiMnmYlU<_vd%!Mq1xE8p_UO4);ZeH$<<-2Y8a{2jpkl!^6F)8MY?y2ubRm*7jv_& +3*2(Wgzy8bl513(r{80tnAz5UYN+uf6RFz_~JRNX^d +DKFy1&uA;%$Y>F8OT=S{Rzq7#7SMZASQfvM~^HJ|>JJ%PXG#fE*)o*{0 +TBozS~a&qC&Ots?m46$a}Q97An4fcFm_{9*!>(scapsFHW8Pk8dGffChp>000&Sb_vHdbD=9d!z|$Z2 +{`E>MY0>jcj7oC)^mu+}%(U)NfqKGI3wSL&VMwR7fVSKDvJ|BT`){dEPP4KFo8bQG +NPU+9WVoPvhQxqoK8jbh3xCd71yU2 +~+lJUjWepkc)M190nvOR^_Q?JvC?E#K$1-xWN{iTYXiMf;}SZ*BJuP9|##Eq>fk&WJ%H{04-q;~AUl2 +BPS)-e?HbLT(6Q4&qj`cR|TEJ=41L??DyDT#B>~d393(E+h{rnQ6K!Hf_m|;2RcRjVmKGDNMK5)6RhU*afTGgIP +*q(CBi`*O{<;dmWG@};{;W8TX+^Kwl-k9jIobPLWRO~ +N|v_yP8=NF)(#r+Xqd%08!7aiF4ca0(>pyO!fl($b;RTTB4&5mTEcE0$yuC}`m6$V4YN1maEZ_?oqO} +d#x7i;kW@k2pbf=**2R{Yb~ZY32*8`~`}ISC=9tWv8XG#r2oG&Rd&tzG3DVMG)we3BbI_iH +SN*z21`gK7m4OR#%K)fMVdL8LSl-8Jz@;4Bzt&TX<0htRC-5_mKM-b~kx9oPfi(XK34sC1h-oxF|p=4 +0Shqta@6L?l{=+E#il6gKFg9(^{((MgMu=9;$*#d<uLId`0z@&T*)#jOq7K( +PzV&;n9-9|nbB+iE__jq$J6@i;e|UHUD&ke=MQEL3Fd-0ONvCu$J#4e!V58!Ou6kp#Wb +RbaCaqio7D<~ZcZ|8kme+pZ!tRiE#AR--BcMuOOlx +p6_r)>d`R)FjO4Nyx11QY-O00;maO7>PNk{{Xe6aWBXQ2+oO0001RX>c!Jc4cm4Z*nhWX>)XJX<{#FZ +e(S6E^vA6Tzik(xV8U(J_T>mK=Q6fd2GArbvqYGv$Nd+ve{rVX>XARwk*-Mc4SGVq;cGf``!CHhonS3 +>~S`^7u&@OK}MFy!}H>Kk<>$R{>8b7@;J%XGf`Ko^WW2xvxjF7#f!Yyt7N^Yg#Th9o;`W`mH11Ng?sT +P{4ps4w0N0BGAm^)s$5hXDPHfZO`eH2`KsE5N{VmuI*Y?9!86=QB|;39RVrE5RgPb4CFNFT6~THVrFe +Pu;_}s-%b@yDi7<=BiyvOyTwnd^?adF@Z|EV~oh92MSC!a=^Bi?Fhd{O@jVUjHd9ljwO}ZN3AaQmLlmTK=P!Wi=J_`gK^AyIjTJ +uho=s8C~8d?OVIeXa5j`?E7*Kg4@s +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 +hNk8T=hcb0zRzpam$(jG +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 +yvKvgBcv#&4J3Z0Jg)c7x +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 +a7!m~MY5)VmN$1sR2hL02gL%Q(EHQl^`G7 +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 +M7MMQhrzEP38z;WBuKKVVOOXLyvp|1Y +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 +w7GP{;p`CEoMnPqToh1V$W;RV$?`xgl5u8Rl`7 +lOboRI)A6e0HgEYIzuKif;+exM>_JdGljFDQB*uVIVBP;hA(0P +*XpqEM`wEf7-PekOkyDLl#(iB$sJYwD-mjBqfky>NQGNGv+$5vGd&Nncg5$t+M=^%Gz{1thLj_u^mvH +TL@H;)-KmiYzr~s>2j=!to8tE#1zp~yLB1RMAEPTzM(?8)0TVEIRCLvJ6fcWI$Sj@aTgzhqFkonzz~o +6J0R3`&PoZJLcqs*aZQJJQ)_RO@-Xko4-W7>B?u8D@}QSSQ~ge=)XYp8L(M>4ZK@OHKxsS}r?#Hz`v$ +`~Q|qV{(=#z3M{~v#%rQ|Oy4KQp2qqh?B&LG)@uPk@!~`zq3vtK$R_j?^CsZM!98rxExEf8O_U3Xf$} +~oIM1>@X1nP_40K`4JWgw?ErOTu&&u5B=&NPtN^1|%G*>y=!p#kj4(72y0#I-=hR+}wgw%ySOT0+81 +b;V)(z5(^?qcnOK`a33%SkfBmG3xp|rhRh|O3S^mA9w`^T)^EHz_$a_bYdOG$nPdq1rAcU^GzS4#7E{ +~Gz{2G82gn4)3M;Q${99ldRuh4Yyn_lVCLCeXJiH^JSs;4FXLx}OC67XYHBiVTB~*Mi5DdO#0>DmE;{ +{ZDi!fz8&qY3p<~+K^27>LJHMISG<|J8^mN9q69d~Tl0(NBB)^*D|7gCJVumU~Z)qhd@qPfWTFY|I!H +mE};RNxsP>pGdR>l;Qr0xW=^fxN>KKV6SB +J5Ao=^uuUK1XspR6=T|6G$Z=AdWrLU)pWyJ +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 +>u~Rnja1>{wdPkbYPQ +&enTUKQCtS^6!f;5sC}DQ=4LuFzvj$``A}1*^Qn92U1po~7$4r-3HgI0~y8+Nl=A^YQ-*Dgcm+W$t=l8)~2J+zo*5^7Yu2>4qVNF3M1Z6R2$gs +hu&p*TI*Ib|g6b4}K@2(l_&~Ee*1&}X*K>YgfXhsbVzmIq0DZHr|?NdNL3V$pD{`2FHzl1}(HT=`pBf +$34=ezN%!`bVXC(tZX6dwyFLLwi*Ho||6NAL2aL17q<27&z(o~#xi4(_qlOIFXTjCjM-@N0H|S5|3_E +x#%kY`g>+hkqQbKqOcCw=oGr4}{m*oE0^LX$;~|cc1^(^AHO*){XupvxAl|a1&-A6R6)y*tL0?q~mXn +U*q3zFX}R94XZss-c{vomNG))m`k%-(d*5@@z=m^L@)zLN3Rwh?V(zD(HPG^`wv@_HwoxA_&;9={g>= +uteVqz!$lmUSoN>uKiIsH?d1}Q=6apF`m6Wc;<38SK7hh5l3cBt$ryYt&MAKG){uUVxF&3hEEspp56j7ISYid0 +j5e`-l2^GMi%}84FO7omJt|(L-em+W(~Z@CyGCUaZnrhKHr%P;?F)eHk!HZJ^?}+dtwYmG0eOfpMt;O +p_iXy+FD4fCtNoi+g!Kq;js1R&p)+W--Bb2&5fNieg&3MDBJ2;8FTz3FyTPUgV(Qh%bGRO(0n#oEn!J +mWY|~!_u6jhc&~J*|Gg%>|Gl1q|Gl0tOn>(M>G1*hRkp=gg<(i8+K=_q{eAdPv=yEGee3*_;npu9{1( +D*;Sd_3r0FihiT!idWIUDx=)-08LJ>80t})obeOrKs%of_ +)T0w@;B@z{wAXy8CvJ+?H7yBq=!=G~EEb&KjqfHaLuORl=b$Q;D}`xUTVi1lDXe&}gl7UM1H^zPey_ +Bbh7WF0ytyUxIj;Hzf10okA*QOIFbOlw2YT-x^&)a&oahfxk}bn1?c=8+Koh0uk3RRvZ_IKgHD$@AoX +B2K3M^5YC<>^8{5+tChnSuadlG1A2;m(G5Ny$dM^xB0TCs%wqzQeNjgSj<_JQO>}k+Z2Qg8*GF%^I|2 +?qDhoEW5t@U*%nAb&9Cwl|k!nbXA;)G}f+ca0Gf96!jkfNH@5K?{T=b9HEF;bk=g2|Ga1~pWx8NraI8 +$9_6|58p_OK3`>K+vnDH_;3VmASYB2O-ps=-JBpfAIC0uPfoF2w;7K9{@4@ODYJBKr8knVd}`=k4F7o@NxFu^CN(1@-bNE)uJKyvrjBDuRElDnHDsl}H-a{6nLoNkEZbYmn9 +Au5pk^w%Q!>4r#t`e-Dln=QA1^1FT81KGoEby&b=+Z};aQ!lu|2dE{NU+HRw17`Ot>jU>l*FQRSPvE7NPM|uqW@JXJ7gIEVYt&$vlKNYyFrSX-sB69 +E=qWa!-RJYUaZ0DQ?zQj|R;CI>z=!UwZq1qFCyW&!vSQOoiRXZpRmh~Q=w9xl0)5afq51rsPzzG%2xW +W;d235+c$bJI)O1)k4$#HVk@ou~;WYyP*8-R? +F9QhjNJvzaH0*&ron#CUhaZrxL8BUtXa`Sd=Z9VDXYJx#$QwG-4x&bx5dhRtnx#-;>QD7!B4*sQ`Cje +V3F`x?-@!8&V8DN?pSc0+>)yu%&$xEBk>q;XM|@tbS8*05PpZgqDKJijb;GM8mya(s=Q%EAmT{E*tvl +1a9370+$yKD$EGav+Jdl){D~esx*paW#PS399ug>m!_mO`Z(vGE%J-SkhYl^%6c1l2FpOD(N0qhJU`o +TmEOYP|>qf2$$wj_3q~9R8+xT;8zlDV{eWyD-)>`Fh5jKE0G)s#6pkA^$2(7u;i>B7-IW1W)h=nxkhN +0MvCgq4hei~!8nflsH%{EgXoT-Gfty)=B(d_`%!0tJv1F6$%5>Tkm`N~wQ99BKKC}F+9O)qMUQli5{9 +t1D|w*xMS#{s}~(=6+~XV32L?j}o$%uUMb>RHNepDo$4#{Z0WKuA2>&eGjK4B~^+)8i>AKiJei6He&l +PSBvJq9G`>WuDAgv^Cxu1zYjfaF5=TRZhR40@bmH!N&prZHj;qBys;>|Ga%#LX!^L(Sw(r1ZZ2+t%R=a7KUWZ=SMSM +Gg-@XXvx_GM{opnNQM7`5*-o2igBs8(X@Z9Y6?9J@x^h7daWW?9;{WnL4FW$a1LFh2M9Y^m7;3JSXhb +Jfe6u7*=;Uj$b>hSgKoY`>-|72;G|w%L@>&T-e_}D#jt!$C9$QX3j<`FNjMx@68cF!22( +Y764*+9?)`5;3##xayaU9hwzZ?+>_A$~n3dD59Ujiuq%RLF<`0a;cjL?qhogr8 +SQ2{##VYC9nmm+(?pMz=3?jh3`4?~2xYeAu@$*JP5WFO}Fs)nU8JX4(1Bo;wWy8euz)GWnx&j_Z39>XB&Qf+DHY4@DfOh{i*=0r;P>x!J)OE2d;K{#>xE;wmAyFn(-?z4_}2b&NpHp-=u}VTwBHVGe>i5 +Un+}ElA!v1~K6XO(QOjjsCT#zl)j)rWRmiD-&AE@;+>c7_m?moNgd^fRJ2|N4BzPs(YIW0J^_9rZKU^daMmA-gI9q%hNj_L+nX=K%To8*zn+AoP!-2V`gFYL7>#;>+F&*Lt7}w^GJ +2>GW25OO9bTh%#Ub(i~XTE6O7OGV7wsg4Ue8%7l&HBp;pd2EcQRMHxJ(*2MxD{nX^l_g(`oiGE2qd!8 +XUx(m~6rTmmQGM`Wp+FGm3i9_x`YNokC!%GG7!DhUW|}0 +ryJ;glVxrtMx2C$NuVAiDVS}*2{I+L@$pfIyLOJ~SR=&|2YCHJuniVu1ARd(*@X)Hx1;9|GaEFK*n1- +RFPaS%UOiar7;AcdDhCyJmx#6)_YCE=diIT)Cs7xM8ruu +iMj8T5?ju+ZO=dI`o>6pp|_CSt051m67I0j110!b&KY+Q!>eQk+C0a)3nf(?l={fp&-1=@NRbngn#fD +)qRZ1YX>SCjVg_z-OO-E`!@l6n0RmN}1kc0fAMZV4T~I06zm#a+_p%a*^wq5&*sC%j6zYJR^GxooyLG +t}Wa()D5Oi{~~35?Tmr#b30MMf_@RDY&2Gl6hE&c=fw=%Y~luS2g4Sv0O}@N#^Pwur)IyS;u%W}$pV^ +Ef!SEp-aSIpN{@Q_pIT6j_uJVYUI +F!3SHinm{1@${kuP8u75V!6h4(|D|KfqJHIP&;{kqoBbS^>~n7xi2YRulrZi`3qP}{W<(IqYmO3Wt}0 +mY|JZ|;)ns!4qvdyE!>ftE +L$%XW>mwCms_1nF^TFg?gML&Tvyk*%GiL=TaYWcD|!8PH<9dyTFPFZf~Fx7y@e(s**g9f~=-CyG(O!4IX@G~uY<{D?C85kvkx+E0%iN(d20|Q&6;sog1U##vTghX83WsMqK0{ +Id2y%lgD1gFIXFL4a3c=~w!z18O&YQ=-xK&FphFksRPv&BQ{Aiz0bBeq={Qk|1SIk!oo7eJea>O&WfK ++s+#$Q@|W-eMg<7LA&>!2*iCfEU(UJ>(RACH3Tps9y!GH@u3)CUmIPe;B-U0Qlc^4m~EdQJbvl(6gqN +dzl@#u0oJ&Bb| +9N9>YZJ$oLOe(_BqS-?i&0Y$V!oEQ`$>l?Pdvv*@8;)QG+59`nJw@YBTNwrTBOI+B<MJ#!eV*219*mm&!_u +mKgH6}1CD~0KdtVp0uk+wTb!Y&gSM^i~$BQy$x0^oc;vP?di3(EsF?RyJ`dpuuQ+);FKFYlXauP}iyB +$&IT0vXAd*umBig2t3C#M@$E{OsHY#ZPrY*}}O#i7GjQCp>wMf-9nFi}9^=ee1R+7-85&AK&!~uJ!(F +i6LxKoS$MzOudhg9}32J(3x|D$jIBV^hsBElujD#@?;_g-%Sp?80vGK>2Ad#fa@Kzt@au!>n!x&#Ll+ +LUOg|UM%G$zE>T7loB(G!=Y_UWx>oFyeP;n +avCzA{Sw)m>oRoCLWCf?!qivzS$Z^_KIpVq?l?nkRVV*4!H>d8mfzHn_{+`hE#oY`n-m02FE(WfL|Du +0h1bDB{erD4H59vE1`P6(9Z}=4NL@GE4L!=R$^nLTO4VrtX%HrPRR7Bp}=c3bcG +gYj2N{+5*~-W)z-Kv{k(ovc-rcO1arv?z`(Loj`iyUk1!j6R=O@fg}l&d>yY?raT&p?5=)rm@h{l-e! +!h55)$N%QAnI5%?OkIY{PMF1VE*ObuEQ9!(v@GI7gcF#jLl$Di-1B#Tq)t~h&ogzD(*fS_0C;G<0}ekYQP76#!NtJFOV2cACgz`?)B*kPzbR*#OM;k69pZQ*uL|X3P +AI~#PUlifqrl_M?DXK}!RY~2j~pGm!AhZUd5>v-6TGK29DMiHZ1y_#wo_L)@s_V=Umm>p!QWIq44un4 +opKWT_tf;AtYQ+OB;!FFY# +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 +O?}TR!Cn`KJms~7XYfT-jKh3+UCGsG +nIH&P!<;eLFTrT#Y3D#ccle@Inla`ozAElM=q45Lg-vgYfZNRzTEN>SCv8QY3Fp@+$eD=}j)@%w0mI) +c}(t+FxDy`^VSlH`03_D@Hn5pe?5yCN41K4Z471g~LT?sp<*xe%#HkuKv(u@6EOhiWZoj)?xB&PT|Xi +Vb*H=CV$bNQrDSW2nwG$~7eTksErpgWnZ01rBu(ia|Jh7eCCI5-w!M +5MJM3#(^lBn4iQYEV9nJ_M +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 +4ZlSb$Vt|A&I`e2)$bW_L7H6?u5et3^R +WDF@f*EX$tsp#{aWsX=8jnvfM=2nqhp5Xe8-oSq?BMwM_dYv~V57xy#SjM!*DCZ;4wpQJ1)^w6yBk78 +%i~-~h%yHTJP04RI6QVF#CDqic*4%=+V%is9HEy{F(MwY|NEc+Vr~^c2L`zF)0@c!dwqH}xj8*&=i{5 +3@jG_?>*>2Ib`3;*|MYnL=dq{4ZbdT6EC2Vu_rkk=dwSl4<`B4N&)%GQinel-(7w?+0Jgb+kQkuPwg$ +M0J~_j4s=ENf4T@oCj~G4Xz9}ISRRsVY&e&Yckw~f{05prOKwd})W47qeVvYw*LAHgB8K6Q?k4zsMR1 +%~ZXB7LHi|7|I%7B%hS-Pp6>mJ?Qe?(&LP|4E|$0ux_;Qr8FEpiGdU|S%mAsvxKguZO;iq5^{Dv)Ldg +j}3+fI!%&`Zk?D)q(P^lLoc0>(Fq=#MC&7nPf?RXw=6MzmG)Frg{vB39lXcX1Z9_Divpqu$Ehzd2M9gI095#7VgD{ +B+>c9b4b+^EKSZF8mhi3iN2O=MyN78bb#0A;SgTq@G|SJwn?;Xf(<52sbWbD>c9967s2ELwty4O$RWa8?nh9Zf5O*)Dq!8$6gu~@@ItXeU+Z}>?3#C5% +AJI%-l{+2|GL6e<70^I*fkYo5`;PbV+2?Npi46c2EFHp?T`*u3TRk~7X^=AI$hz!Etqe6`X6RPxU=Dx +c2)7*BNx^FULz-`J0}U0|{LpJsWHDeBb2a&A*s-OKCG`m4o`D!BXmxa0T7Ua^v2p%W%|tt!^Hl9h|Jd +nU%S>A>q$$NplW?UN%i}u%p^!QkyuN(@?)7;3=JaMf9ba9({ +?%!p%wX2l1l4^gLGQ5*5Kp?{AAh;Ve_RMI+!hGW`*`x>=T10Z_35Z?9CS-rA61P*K5%VNuQ#gh+UOI& +g-;3wWOE6)txfGo-3)DlYM`?l3kPxZ +^=|-u*Zcb44rd2kv)bdg85W;J7Ei&ThUo;w>@@4niAT>KGGWK5L*8BRMbC}b~7MNN6ur;_dS|AP>%># +r&k=lr7#9UxT`@|8i-G{HV0~;u8T?JS>0* +=PzV8jOjRK&sYb6iS<9aaLb`NCj8Ib$Ce@KT2`BrE)0m*;7mUyN8l0SrIo8tGaIw +I>C;r+>syhg$ZGAtTiM2-RVZy}q8jvcgX{3}pKAZ?{I`oInw$gF_Yp`KK$&#ddL55sBKW&=+C@C~z_>M%r8zS$dwZO +skv{@=fKfm)2sRhpE1Y-ZJkV;APfpWEqY>o^h{5$$wGf0|+BH9Jlr&GHvkzZ{cHohJ|wm8?(2{4=qS#o?f>OTb`-3)G@~nv2wem?X`(-hbrpGB&AsLFlTO&4rM +aLM9iylA+KSc&=#0SC8u5?$HO;BTh^)EszAlfbpW$V4!UFkuXP})NMU`}>y2sS%j_#(ZTMA;U{j{SbLy=(KO8QMjBpXCwSyLIC@E-` +q{`f$w9MP6JEf(nhU8gh(XlE2@w22tLR6(rX*v_z{VdXjn*V^4q1*%(|sOktDZG2d7*>Jgvx~|uDx(!n7)fIa6ms +EF2SMFMKot)y16N`p`Xh`}ODuvX9ZNeKcs?Ie(_-VicV$rbbBZRJRMjrW@$bP0DuyI`psH%ecsMfDNW-qCPRpN9Kk5QVw;3Ss4y>SX`v +gmC-u`yt@aVl;hw1XTF(`^LuyodR5re(~HMT^`R*bypRphe5V>5HIuVZCCZyZ$yl*VNF_xIX1Mq5I|X +!E+)FT?E#@MXf9}rblD^EqH2*?1=$>9ZFH8wEKj0BVk<{@8!S0f=^4a54IuOS(-Qph7F)>gc=>+|fcP +fEP81EqnmQM`jKpkOE-7$DMhr* +?EqiUsg>NM)%MO=HzP|;E8ILu-B*>pL8>SfR;$$7e`j}O7}%sn+=hl?wl`R8qN +8nQ+-nB8}DrldF}J13CX#>y;w+sP+G$a4ilrnze8Wuoq>haU4pH$Vydh(WrCPJrSFNVpd^x*I!z-h4S +OEa;U8o({&L^kw%@`vAe8e67oh#PRR}%0{Kt%DZcqVGN{3Nuvd|Clf_-%C;wh)7<`K~&S0mO#& +btN4v`ZEPW?YnO9KQH00008031s8R)k7<66(AF004dg02=@R0B~t=FJE?LZe(wAF +Jx(RbZlv2FLX09E@gOS?7e$@RMoXOe&&(nBusJ!NFcl;28#wYGN7bGU=Sw6N^o#whKNagU>v8^VmJrz +N+9uMEQiBbd#_sUExl6et=9HiY~^JICk*DHqKL1wphin|k3(xHAsI->`K`6inMne+x4+--^Zow*`SBs +=vCrCT@4fcgYp=EUUTZ3Df1I;$9A||;P2;$Ioc_;3lx5MQ#c9yiA=F{N?l?7!WeOzY&#rV*wrj_ZJzp +X+HcCtU3C*JV%vpUoVX#+m4Q^3EMK5z%JuGy(lwjRc6Wse9^1|5oRkxViXnr-|$KegiQhCT?FQ$31(R +<0k$Snm;X=hW8EB^A6KLhQCI>$*k<<5t~ +(8BIFQEYrnsk!$MK*4+co)K+LScNhIOGfCe%mfPCX&e}$ndAI{Z3cmi{?7I3U&6r@F59=0t9KiYyOEs +yJRacV`s;|QCZ&2jBfy(H^DE2(dINuO6IOX|atHegBbj5JF6_xx`t>6pzZNv+`h4lP{P?-35BMXp)Ed +6uzdqbWxyB2L(kNouB(m&|G+Ty9d`d{J|FQE`9#9ksQl3Ngs1X88Ppr=iTSyWgP&I-P(-sqa_nyVx9P +kfYt%Dm>8~cora*u_>CS1SybLK6rm|630EGxLI2NfTqcZ3zg-k6nDbeT5nP669Ab&pzr9w0V{B +P(Bx(RHJ0PNY8NZfFi(NARUE5!6-6!XL@@1{%5eSrXPyI;>fhs=4#H5e`dAT+7scJJLOC#Q`zkLj;>* +ja2p>>N>SpuC;#)Tq@gY=8?Q%q%y~2}`z^l*t0POoL)80r;80a@h^pNW>Xx#Ysy=XO +O$Hf@u=`@0UN}SiN4-YuFe+w&vY2M5ne1k%OIpzqiBZVP`LBTCF-_Uq2)ORcfIR(v+&M_-(2|s)x*uN +Rabj)o17k30DYksR^iV>x2j)`t=1OYk1KVEuK@W+V>;ITIWbHqud!?`?t77ad#n-=U@&{-CdP6)$Mw} ++I+!lG>LcgC{lvGJc8pYD}g5_`2va31v=~b;ImK5i&z$a&>!GNASZNtfEzsQSC{KlBm&=0e3k1 +QkZuaQ6Q0-X0EwIsFBpQ-GZdwii-3L~%Ns{5>1>hSk6Ro)Wr*$rtWk~HVpO-DH;Xp7TGw3(*Yx$5?+5 +@VLbb*>PHTWC?Ni{qHGwto7|ir&c{V7)5pfX@Lz!CM61^4U<%C&E?{V`MNeG&d8Q@zke5;BQIKnTh#e +(X-58&Sw_AclB>Kyf*@3yDO%~t2Tb$+iekeTb^!eWM%9RofJ&pjBfwgJn*px~XKt}RmgiUw2*A$*Z24G&M8-(9`}}NAHj0ej!?=O0FCdpj3OsBlzIQ3W_)ldUg5z--S~lPgS<^(jb3kaq`OBFQn#^# +Q2QaZ$XgUkh(b*+5{T1%m96OBnrcO+35t?uoRcE_^eBNM>_F?d>+5y*YAcgiJ3_&)XYI7B^37eFx%f! +nuPdVhNtaSE?X(d(NQikI=AyD1@&IBa6yQQok7d)$dDBs%;Y?~OG+Ks6RWM*enGCPht-Tjgk;hgRSKE +S8a71-Oy#T>a$6EnTqN01HBJC2uB^^117zF!lwfb`l&UM!=eDuIa!N=#rP6tU76D2=C9WepY9AS1m#5 +UPH^5@Kh8h7e$+I9?+fCrlVCpVPos7VQ1jKe@m3~DD +X@JsAj$I}@n_huwZ#eSVr}**EGZ9p&L7l_g7fmJe$@NPq(bU9%6hh!vhF@bEQC|{TPS&ewbarjr(N71 +)&Q6nrPD`hSExsv7cS$0`-Ht*EpW{gIWbinALKpkXCrm#Albac&*qe?Y&fAR-P$6?|NxJl<@!>P$gUCA~wMsgC^|L#HgS@>Rf!yo`+ypJit!VrbXAhX1JuK2gU0 +W+Vr%G2q7J1%Oukb`9P@avo`Z;{n@j%sD%yQHW6$}c2$Fs53-_1y>JyUAshbK=J^OFc*+TTS8?jrOys +2sNG3asJ$WDWBPbDSD_RWfk|6r)2+U#f1KQVd#C^-4o*6lV+-8_=;@o)x;eR-Q9ev<3^}X~C&-#9Fz` +!)~x9`>-|iKCo0S@Nv8_yv7_KiN*av_=e(?-3Y1c7zaB^v;c!mrvggxeX7VSyH5a2Ji9f7_s=0wW@hz +Cd~vjgw|Bz5R8=9?X_c*~VhFN`E-ijRUA9ohv%y^9K1q>;jIlVpLQ?f^uKbFEJM6BS^AQ?@$$eLKmxqrVgK2Uxr62!y|e0*8L}+BNIaM`7-hLE@N6Ea78g%9A1+8XwlYgJy3m}^7 +r(%GUz?hc9;eatyvSznf4(M-wP8PkiH7wM`{%C5-v><+zT~(q;)`&Y(FgUdQ{`BCK?ZvE~ +XS|Nf5C2jqu9$Hg5Ab7}`&BjnpFs!(EJD57PB +~Gb;nNsM217UZUCxDeZKiOtn(X&V!nyw!{kq4IC?!2GGuan_V=)|%dq71WM +h}1rsqTR14>7%9oHc=iuN8Uzr@`yj%Ldt3yxs61Tj_gD?Hf|Nn-ib(=BB-EbJZ@D}~yZ@oM>MB}Xj}C +`+wsjx#$@w15*wso4crf{jtWM#^AMI{_|TEweh)rcZ~DV^qkL`p&an2ja0pYL9D;S<02m*O;LYQ#?!M +0kg}BA3;+;WaV@MoU+4w>MwEIg{HUk2^xmac=nTmRA+n*7SKK*zx4^q{+ +M$mOI3MV|_Ltxh?ype|cZ+`b-$cY(0C3&e64&ghUl0+Z7zIRcZSR$&(x)q;{Rzt-6$M&omkp@qE`P$% +YtmbkY|f6wr+$L141>vJh&gZyF^=1jw!ZNgso-%`}vP~Xp0iy3M~LcVLwg_@NHt>x0&pldmw^bqh9wz +Lr&LOef~?V6HmXvdF&QoRlpHOEH>jX{K*B +GU?lJ;_O4)R6i**MHyVmrIccIVqoASO_C=GFyBj#|1R3n}0sd2ggOL8U^DNOs7GXU4s)@BBV)I1Z~wN +X|K)!#>n(vOk+Et4%%!ii;YGVdr;6(`1?&EfBx)k-$};GgU%TW-EvEkRv>ZGqnSxayGM0NDkH +bqtvWrSWUmSCYPnIu?>z-Zg1%6DB^XjkS$P +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 +YPrQat!7QJ6zXv!BrlsnB#!S~6RKXscC2$j +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 +x=uX~m}rq<#!K+wPl_a<CeHtViU0=$PG$ +9=k;>yzt-W53q{-!dT5YRK$4fJNq_1<~XjNK@>zbJPW0XBe +3lBhNaeq_=7EF*2d6rDJ|HuBAyjqsG&!z969STSTlj~G;ajmYo0$2i*_AxEiHAEgcMmz-xj4S#Vjm*MM`(tc*!AYrTCLacq*B`&KC?KEH=Hv|t`~6qPb^W(c) +vQY2$b$kGyEPO>w1k`p~luE-Dm{J*A#h3kUKA+CshUpl#t)lY9OOrYlY!ZtwvW4ao7T52<#<1hgTWD* +2gw#qzj7VO*{n;Z@Hk@Tp#Jw=^tw3lX()|GEMA8vu-jDJBo|TIjN(# +bHr+uBZB&%8M*sVj5?0ps4VYK(o!wA^)$=kwI$1WX{3jJM>B{%8HgSqS5nVQxws1e{c)}FNwQ?RLAU8 +=xGh~4Z*qV#+&OrRcM=s6O?JR2QZaZFbb@G6-6z-!ALu=SdwrGofR10f#p>vJtqpido_qGyBJ%$YThH +!88+ZxXjuD_R-Ka;rFp?7GsdS<0X@DTTIGlq +cC*rWOheyaw1zzVGw~K!n3HtC6h&~+8X~}FrWP=8j7IS_DKTkeQ$8@E$#_su@#)*Dm+;#B3k%UzOiHd +%=SApC=aDF!C;GzQ0B$K{5<{A5c4xR7_N99yC92QsSR@#59=+H=h6DqK1#A|)e}jwZ!8gH{IWXvAx|oeXO>oXssg +jxCNtqM(kc%k+KA{7)ESjfrLmf;%dRNagjU9m}B|knf6nSVuOFE~!m+pHP>q73O*$4hd_tJC2+)IH{p +~$8Y7;KS^=V+CbTH#4$(DD+4alFv^)3$CDDCiiELd1DVCg#8+@L!-l@A&p!ffKYkP&M{Z##bb+_7g?@hCC1$h8(PX>hfA%_#KW`G +pDAm^I?YjN0F6HIU0VM|nHXuV^*)}sg0|X4L7wDw!4ED#DjB~xBjU9O@d8RiTqeMM2M^{rbeC&+?3g| +K$&K7>5se#t9cy(U5+@$2FOY@5oHz`Z4&c02P{1jm7lNHGb8u1FbtpG|zW`9Vnu*v5z(#|=Iw9_niPE +p@&KA%Pbbe6B4 +fV-RVp%Ubxz+()Dg3~~pCZQ~~LW|s1>8N;2NF-AjDxF&+2tufwqd_66qlx9BvNRa|D +tFZTbC4DK>?R?8K-Cd;z%-cJkW?o0yeK-s#JA5-_uV~!VE2hE?6-@giV~iby0DlIdU|y#XTS#jFbnhm +EyQ^DMvljdlZL+{P}>g+^$yH@W&ATO;44^v8RquNgI!(7~x%@bNqVs(7Q~jusfUUEQ%WgsIk-N?%M&= +Q5Ois$?Q8vlJgF`l^%J67!O!+1uVHr@U2zQSV38oGacpjZ8#0N%1O%-J*u#ENzOC`b`$XYExanY^c)Ck)|S7Z +gba0Oci&GM)j+N^Xfuivm*Hdt`CnT6VgE#E^mx56&`U=^lim@2x%i_)zPp#_0$S+Z)3Z|-VXNMra%aN1IR@2<^Lep>IWp1`;+hSR`0B9Wh5lztD<<7RX`QZg7j +7o!{e&AD!B`Yog{o~)$-1Z>tw_^k=ZFsGduE6jF)L}p!bgfOdmW#O!^;(v=zr~WRW^Ap{wk%0ci%)Y_ +b%CvfAD)GN()0*poA0JmSCni8_=Qj*j4b*{86K<3Q#16oyRebwc-mGIR9=l1xx26fppio8D5sx_!Htl +cw~lCP-;lmA_9!VcE@4l5T#ysi&7-04x}2MZJtJHV`#Wdg@*vwfTG;c3a8SY5P`i}PzJ3Gw34;;F|80 +S@O|n`#;x1L_S#%vVY1+aqw_TS8_TI+Kt)o?8%WXN+7NW_Qe7j;{QAd1KZ^tu1)2-y`@SJ{_7c`)vs; ++k#ib}60bp^R0L9;QWTtu3cjEwsPo&}LBPN6RjOl!D>@L$iPp5{IU(n$!ZWZ8GeWc{v=b+kL9!jsLG2 +q03Hj46({08fmlmH#9ulwB1`;TFndL?6 +74jdxZ89)Lrx|0a3r)TO&p#Dh)8jlP#4#u>YW9>;t2FfwVGiy~&2ZK%lkrw-RR8^^d!L({;3(WYjwv^ +;N-G<(6u^_4}iSG%a+wtMvQ(Wwh0oobCi46?TV${g{05;{#zOPLe*W25Mit9bxMc(W`GQidi7WwAy{} +pd`J;b5gJ|W_Q+4MUGnrquqrv>(US;yXs{M`*D%*+1$Tr&1Wd@MWPnkw6@NHvxv5$ceiB +7ttL5Ul6us(=1$(yj5j;n-jF}HG{?+h`k5C2ah4AE6~aLQHBq=)jSy}<3vDi++NEZI+9PJm4@2w09I% +6p;;SQf`Ebo40OG2&p!ZUhvzJ%p}SH+IfNN2`N}E^)M +KPB~gtDxqzV!`Ym2wED%PE=~?3*?_iNh{8m--9*pbM9JMm;oV5dSPb2)4j#J5&8ocIaI<=Y{FM-%j~z +@sTVuaVJ)2_xO>S2BjNBXhaq5#frowZ>`J|f_MMy;d7p#kOKnSlM#Mny#7-P4SPZU0)Pt?ITbe|~tG( +Qs^ldxs6Sq9oGhNEQ$+B`x_G>ByqLUs{C!tysBvD_psZ#W+i7d4z;E#^0zUoV6{;_e|zlN)N?`X33%RWnR~r7x#3|GI#)%_M&5>0-ZcO-*Fg|7b%^H>LPOUo9bzd$tP+~a +@P5D0G!O6J7n-ieyQDi>&D|h0U4i!%Lepei?B0$1a2fS&ID{k2BkVckVXfDYIkq)~d{-$>Rl_*$!o+W +Ed<9l_pzOMnm<2nAUMow4?iQ_YH`GuA86@!}G4#sbzUEXQDY66|{!7T+k +2R>wF*ckzW-ySNE&>88?jLKjemfma+yvsnn}r21;rB4eu%)(2i{%b<$BS!lx6Vg2LiqeNK0p&+ps9Xs?h!p0AaghM#QJ!i>tPo7b$jh;czs5|8lezmG}Q`hvf%~$D~?cI1>nlR| +@QOHq-dlbpV^g$ZM=B1@5PN-daX}XgXCM2DtI)^$*(XWsU%@w8}X)zr9C>U($S(2~FKIlAycRV~64@x +5&&fh29qbE^6`Ag^-eQ5CBNOFbzs!CNtko2n>^Cd`k;%Jb=`z|ECtEjx)Sf1`(mCQcOyQ<-W;a$}hcym}gbP0jy`ru__60iDMP@r|wvV?eNB$smqzsP-bN}4fngrtLp8Bl48-Xkpxib+F~kp#pmBt3+d!8)h?YWA{Kl%5uZ +N9y>w9e#WQYdm;=hCi+*uOXICmoK7iv82#z5L^x=jyoDKbe8$FqNUtJv^kK3KbTT$GGJ02tTw*tKf>A +V-s+C_x8$k5=PC5$#{nwp4D8al!3D!7F`Q3m8WfNvVP41KB*Y1IR$;i=mRm5_w +ODI*mM%(@P#WkfoR85t9p%52WStR^K9$K*;iZQ@@b@%)lc)8g6*IVY>SI57!PphEvjwjVu`S~jen_KzUXPZ?oi?_uarqo=Thx1T6U)P{dj +%0dh6$GjZ3|=U;(`mQ4OI`?wU@s##IEh!uUne0?;mQ{K5?;KyWar&SqhAu`Nh8$rETg9|Hx|X85m-wNhk4?9QNz-jMm~O&ewB0;vl+8QvHhhHX_Px2byj(&Se=+}LNK^*je4&))Mhr1xhJUwIrGXn>)`TLTgEXaN<-j}l +9LOYQSBT0|GSNjI-x4&j#AUfxO_>Qo5tU~UFx+k+jeuc_z3b64cx((JkKNOmNLD4KKE$5U2=ulWfIfQ +K+bPFpP%;J!+r(suS%EnR&*LNeC!k(t$qmUlto0+v*ccI4L8O5kFaw0?cLAGvnO?=`T!dvVbLWdJWC_ +_ObIw`yb*8 +Tf8+qw8a4mZ83kfG}3ZzFtkPNzlQ|1_{or<7LW0IP=mzv(zsfAvw4;@3Y3Pypcb+38R0DG>rDM?Dx5{ +^mSiA{vSc8O(qtfuS;;^aMae)GQ?fbQ)@q} +^aFt!{hd&;SkkDrs$>Pw^NEXD^Dv{U-ArL+=7|7zlU?7W7yP!NaJe0*J7lpED=LRWvfcxf97U +XM=VmR$JGPa_rP!`nn>dJoI`(9`|hnCjye-g?<6CN9x3T2T&p)62*=%FmGD!3$+#Q`If#fhYO_9=$40 +MqPAtT)RLnz}KTMRPKi1v2E&SQbZzNTuPiEMC@KsPXpCVp-Hq9ums}NAmv|%VKa${7bPclKf%BvN+oJ +jj=3ln=~wz#b3zmK5|Jci!U$eu`C`yyRGozSQel`V!3w@iDThQRTg@YeK1kC)HaZ%c5xsJODd3srImy +lRl9d+APdBwmEt1ZLVE_iSU*u0CRA^K>;v5N90k(jKFL2MbivKewoSYds-Ug$oF2R){E}{7?foPA#3E +`iub%JwhTs*6VZkdbhItiD2CrC{3SL2-o(x`b$Ov3P%^w!H!avl!+MWzt@#my@l?q%z==>K2uE2_-eR +X^Q*x{;7oa&c(|Wfyy>S&`|54-8%C&Mfh(|N-Ll$vQQ!&$9TK=Aj +MGrekET^9DNltEz7LLVaiad<(&>X{)kH^s6TB8V@JWf9B&2eB-udU`C2JAU +_nCzgfYF3Pyau&^$TWkC(Pgk)!4x-^yrN+U9{@PWOe;&ex8l`5&3Dvb)zMjSm#NY_PMfQ^pE9z2UWDC +!HKx>HDu3?XDX`;F@EMFA|r3R+#^o4DVrF7Ee=i~9@wxwg8vZSeOr{Cxs{AHcViZ@pS&2j0wZL}KYCI +#3)r$KkXnLYLehcUwOr+Wb6mxB=fKTbkm2wOj?0nSg?rUPJT$=3KK&?{6u7^4eK +*2Comjt^+1JdY1N;8IC{ +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

    !M_ +UwY&&8VBcg%`U{3<$aGR$4hY`TClMmchK#zcagFmQKkI$yTro4Op^UH7+#?hA#7hpuIOo_2G_NJF&1K +vTwiIjz2{uf=zYu#Jm}gj&2CUGK0ofQ%*aJ@a}N#vs7G1zh)`=p`A4oeVGE61aa=B0&)wn*JxvrFT%I +q#$hSO}|Y8{j43cj6QZ96#VV%lZOIi +2XSzE!J6i(A1?M|`B*3llPo@!3M>t!RABujRj(luT1(h%`(vgbAzr$wSdhbup`&a_HFIj##+fp%Lu?*DakWt& +Y3xDrBExdXY{t0c%RX8`?#vtm_kB|$NK0?C9KR!kCiB={V1UgUI~@8NXXtsLK=P +P<07GHUJ1o{B{a50LW3_$=$uJgVw)pmQ(dkf+DWoBW0<4s0gF#Qj?{Gcf}Gsp|N+OaYgN&2eYV-+y=)4?WJWMU7fJP>C`y{Uf#kv(!oSNjceAb~f6YHxf?h`Pm3;+P=gTpSah%tz>>rsFbf+QWqsTebKkb}K6+9(1w;eCk%16A)Dk(HI!lWRhh+; +L2o~t40TY?wLOkbKMq?}k@uel9<)WZAJb70C|o-1KE*@Db-tMLSZ{D)>L-Rq +&?PC-jTeO53d1MnFA9QmxC0Lv;FW+UWk6j5b^O-&gHPQ75z<;daZW{vj3OvO}dklqv +#9Q(LyXINF7apww+$!QLzIeg@t5PJu)PV6#io#qhNh;Xss8#yO5C51YEss*r<_Fafos*ey^8&@q&L$H +!Nm7G_`$ZF2(X;5n&RS`Q*7lk?U(k{|%RaEV}i1B*vVf*(}+wYt#jVOX@ziL~%J?x7wh`lOxPIDdR*m +aR}>TEBhiJ2e98yI?o$cpcdqjimF5ML(B+t@K1CVcuxGV9VYU0L&eGbnYI>(lTpHg*;)Hfw1a*n~S +O-XV4bGt#D{BKB00cG8=Mnx2)Nd~)^bk<4N*~MDe%nHj1^w~*`5g$lzE|%q(%FsG6^mhf&g%C>Z7AYy +|HVx8}rITXYcSvjOJ!Ohlp9Dq`T+q{-3wkzjfdO35Rd7L26BqOZ7Z3|z4X$|Q*j2n12dIa8*Ztfbm)C +vd?Uxnbk+RQiZ&ql>CFimfsr^1N13~$K5^z9IQH-6TFCj$?;O`V?N*hw7ABxn%I^`*>io8||>y3OAR) +{F97RBTi0;6YZ#gwY3)Lh_;C4H@QelhgM>!dTn43uhw86{Sb9#F;nI`B94czm&#Fv<)rNSvzDiCIzv{0CdQo1mcr8HqqlO_vuhBQ%_ +v!!vuoF|PEW~MY$nAy@mVdhD_g;^+FCrq297v?f4K$v$*JWod9H7qzuXXuT;h7T#ycfty-*V5<0x)#= +h!ivu`(!0Wny|dDr!ulYre;3wAVcjgOPr&++ux^HRov?0!)gi1xlkhTOt%P;4u%fe)<_jxix|AlY&;l +tXswiV=U%EwjV7@3t2rDMzQmC*VgSD5iLdr(xh4j!O1!d@dkX*te2-Xr|?Fy@1Sc75B6;^Bul+uOO0P8ei4S_XYS +VLjGMOX*J8X>IVu!aija9Dc@D=z$&t`XL;um%XL3D(A3SYu&5Bdl?-ewVADoQSt0!Xp{h4}^6ZtUHBu +2CUnJbvCRo23?HF3mI2mqNR`YeJyWFII^cB&QT)^ovtmF69W9u13E^#pRUj5^VHKR$PwCEUUz*-nKc*g;fjk_>f$8BmH+N{dXKyKJId_@=L>boW{Mb6*^ay>yY +nm{C4CFS +V~@8^D|Jbku0AfsW(8zI%B{nU>snNCkVt#MYBpO0Vm?(vOKClc3+BHU8xRYbI#QCu-JA@S$YOC;B*c` +#ScB#P@p=r#kh76`?ea-9C;zJ_z-+C)9d53{^T1+@pbSxpx}hlkqXZeu7;DZxg&q@B+bR&=9-sgfsS@ +6J$zcN@SiQ^Awr2WY&^dM`j(F4P-Wu*+^z%g%+RInQyIcgIXFKMC%B;5`?~i?^(LJ>HDhJ14D1SOuga +)p7t&gDh@Slg>6`4#hsCjN*#nW)j`LLXP;`MeAm8-eCt1>k{#>jKH7$;&z&nL0AHWNMq&ja){L((h)1R|)pM=~Xuqd +x)ATp>%rTtS>3hJcXf60%Eg7C3RDHvnTiQqmQ=aA>=&^pJNz!1fIjski6zrA8e3i~bjTlc({#q< +waO-aF^GDnBnn%d9sZU{Sv}YkZj5G4YEy^P+osX@8H*p2(W6BbgXxZm?V?#~WU|(#cb!>uF3^{xX=R{ +sxAoMbeSyA7y1B-xB0qThV6BOd7;9AZu0oyiLEu_m=Fv}hL>y7-P<*Sco2xq42Ol*1%I5%VWVgpiGdJ +QB5e3BYO-!ZH0dEJ28}Z|w&X>-19hT;Z-BpD;m%n?8tJ)#yZ8tk4e_Nk8+cna`QqPXH{)IHfeq%du+K +39RH>@58B7q@tkyRrHoc0icI(A0Ac{h2SsgVLTsP7bs@8Z`zZ!d#T$jQwR7})58njk>igf=#ayd +fpGmS@z;$9cZZ;urDxT<}tjn!6tGWI7-eqPb%eQiZd5V_tWTq6}%+t4cRlUya&H2gvlk5lKu?dOrPw`$V-luuqv&H)i^?lPkvf+q9cCwr +z+-9RG;K!9D$<=MFvQ3Qah_JSC$*6Q#T@BDjUdC;MY04Wa_D^=NNIEtp7fV!Aay7~PFs^kwXKv8g+pS +6pV$8tY5gUPv(Ja{pCCdv6{Gii(3UN2iP<-^Vj}D*B;mJn`df*l$Cb}o^WelF;+?wb9qdA_rvaFBMqk +FNNw6{bZzTJ=~??NDs#w~ML^uf9OFI=BwImR%XKaG+m+v|v`@52t^yN^@bo(4(y{6hn~A0sL$xt$b2T +2j(9w0lk+Gl~O)vLeWj>_L&!g(67tUB-JXY4jkoVUZY1ej)Ez&T{&=4|-wc5wE**6@8eVd&lh^@OkapdDL#^R4W^;I|}__bA- +fnC#AW=#dU$Hnf#kS +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 +oY3_TMh2R-7CJ;$`t6;P#=B+9 +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 +SvjbI6GT=2#2z7hCdeo{XC1Ww9>K${P +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 +KHn4rm~qcXR=I_1A(gYHDg&-RU3Lx9 +2<*vGC_4R^R@c0a+{vw$%e_|RPb=vKTZ#qz8??esQz^`FZd>EU>r?BPxcJ?6Oz_#+2*vI^kDo(mo9#nmrZ8%@BiRAs{8|>zc<0*~A6Cftl)D(e{ZYm@yv+DZdl +^6Ul~;TN#UDxW6Dj_DiocBFucP>zDgG-Ie>=tBL-8rk4aX?{Ns3?Vi9eW9xRp}Kp%m_>6rQ3Kc2NpnQ +wp`6Is0iCXLVCJJ9j&0^&2=l{}N{x4slQX>nZ+C6n`AWpGxr;Q2ZqnzntPfMDd@d_^(p@ofQ87#Xm;z +-Cpr^N(pqM_}5eXJ`{fd#UD)ZZ=v`zDE{pfe=Ws-n&R)E_(#3sH-FOQ$J;3;W_de|TYm^jg(_$MUAm=nfP^5&T6apR +-Y2O~iL{(bu>{_#ns=!EE)*cgfryoL-83%ez~3CV<{1ofG4eeiYZLx#vHg!JuW=r((*9Ha#_Dn<$@J|vCrQf4jfOHfC{A0{X@d*h@=A_=u0+9c}8%6r# +lVTIhNwG;2Zs^fX2>|~=p*JNmIsF)sg<5LqV-Y|pKau`0V-gi{k~tws5Fv6<%b)O1j~!+L3JH`(j|mg +Hbm>9?JpSn;{nJfD&6L3;^1ori1c5?NkAIBbPd~a-xH%y2pmzQmP3Jhm5GW=kj3Y*B@{b-hB0Qph#*RJ#CiusUBX&(-P5vk!VlY#O&YdQw$0Ut260b4lo +xc3U1$B;0il%am_wq*ivBI0&M@7UKp27TzqO`IFSboAb)z27Sr6 +<1~<{{A0#*#jQZAW4RJGuElun%HtGuJU4afR52b|X_@F5dpxu37FM2PW)E6p*sH6}?8S#yvQc|!OhIx +k?o-ZEzmdlb%gDU{{`=V@k37O2d+af`apOj|dGls5R(R!=SHyVm%{Si^V}*ZIKEocN@y3fZR@k*`7yI +zT55?Hv#5Z5DZ@&44oj7rVx!rDd>eMOr)0xv^Z1D5XKeLM$FR~5woV`Tvhc0-@*`YZ2GKxAnYM1L5P) +E0%I=XwPqkEcl=C870d^?-M_p;mhVYY!EV=wWO)PL7{#itH2Ihf*8XS;qd#UDxWO%y+Y;?JV^w^RJPD +gI*=|7D85kK#A=bN?Bq{AZl<|LQoUhav-d^ynczfpr(FsXc=G4;?xbnx=agdh`hH(dWkAL7h6?Kz!D{ +Z)pGi1N#r{9HbxAk=}ds={Im7h3y>FduZ6uFxIp0jiEz(wIAA<0(9!w@rIs#`iBnf&_47A#lc_*y>X~ +c7Z^%$23^ysV~^nLZXDV{r)%HN&o6M0Uf)CO-{Zz!9dzyCFf^!lw*XB*-=TPVwev&z*9QA^p|=kG+P7 +;LM(wLl|Lc8wk}pN+Memef;U;K*ojE%)2p05IJE& +6M`!XP|0T=bULhluUjJQ2ijMLByFkGeI)-wXVdT>m?s-}A`>_+l$Yx8A*bqfh}jPC1}myLKd5gic~AD +WQUdB!$?{p_cd`_4q3323}=&lq_)~s