From 76391275fc36b99f67ef34f70260bfa831ea6c16 Mon Sep 17 00:00:00 2001 From: lym0302 Date: Thu, 17 Feb 2022 14:48:46 +0800 Subject: [PATCH 1/2] move dir, test=doc --- .../server}/setup.py | 0 paddlespeech/server/speechserving/README.md | 25 ++++++++++++++++++ .../server}/speechserving/__init__.py | 0 .../server/speechserving/bin}/main.py | 5 ++-- .../speechserving/bin/paddlespeech-client.py | 0 .../speechserving/bin/paddlespeech-server.py | 0 paddlespeech/server/speechserving/bin/path.sh | 3 +++ .../speechserving/conf/application.yaml | 2 +- .../server}/speechserving/conf/asr/asr.yaml | 0 .../server}/speechserving/conf/tts/tts.yaml | 0 .../speechserving/conf/tts/tts_pd.yaml | 0 .../server}/speechserving/engine/__init__.py | 0 .../engine/asr/python/asr_engine.py | 0 .../speechserving/engine/base_engine.py | 0 .../speechserving/engine/engine_factory.py | 0 .../engine/tts/paddleinference/tts_engine.py | 3 ++- .../engine/tts/python/tts_engine.py | 3 ++- .../server}/speechserving/restful/__init__.py | 0 .../server}/speechserving/restful/api.py | 0 .../server}/speechserving/restful/asr_api.py | 0 .../server}/speechserving/restful/request.py | 0 .../server}/speechserving/restful/response.py | 0 .../server}/speechserving/restful/tts_api.py | 0 paddlespeech/server/speechserving/tts.wav | Bin 0 -> 57044 bytes .../server}/speechserving/utils/__init__.py | 0 .../speechserving/utils/audio_process.py | 0 .../server}/speechserving/utils/config.py | 0 .../server}/speechserving/utils/errors.py | 0 .../server}/speechserving/utils/exception.py | 0 .../server}/speechserving/utils/log.py | 0 .../speechserving/utils/paddle_predictor.py | 0 .../server}/speechserving/utils/util.py | 0 .../server}/tests/16_audio.wav | Bin .../server}/tests/http_client.py | 0 .../server}/tests/tts/test_client.py | 0 speechserving/speechserving/bin/main.py | 13 --------- 36 files changed, 35 insertions(+), 19 deletions(-) rename {speechserving => paddlespeech/server}/setup.py (100%) create mode 100644 paddlespeech/server/speechserving/README.md rename {speechserving => paddlespeech/server}/speechserving/__init__.py (100%) rename {speechserving/speechserving => paddlespeech/server/speechserving/bin}/main.py (99%) rename {speechserving => paddlespeech/server}/speechserving/bin/paddlespeech-client.py (100%) rename {speechserving => paddlespeech/server}/speechserving/bin/paddlespeech-server.py (100%) create mode 100644 paddlespeech/server/speechserving/bin/path.sh rename {speechserving => paddlespeech/server}/speechserving/conf/application.yaml (95%) rename {speechserving => paddlespeech/server}/speechserving/conf/asr/asr.yaml (100%) rename {speechserving => paddlespeech/server}/speechserving/conf/tts/tts.yaml (100%) rename {speechserving => paddlespeech/server}/speechserving/conf/tts/tts_pd.yaml (100%) rename {speechserving => paddlespeech/server}/speechserving/engine/__init__.py (100%) rename {speechserving => paddlespeech/server}/speechserving/engine/asr/python/asr_engine.py (100%) rename {speechserving => paddlespeech/server}/speechserving/engine/base_engine.py (100%) rename {speechserving => paddlespeech/server}/speechserving/engine/engine_factory.py (100%) rename {speechserving => paddlespeech/server}/speechserving/engine/tts/paddleinference/tts_engine.py (99%) rename {speechserving => paddlespeech/server}/speechserving/engine/tts/python/tts_engine.py (98%) rename {speechserving => paddlespeech/server}/speechserving/restful/__init__.py (100%) rename {speechserving => paddlespeech/server}/speechserving/restful/api.py (100%) rename {speechserving => paddlespeech/server}/speechserving/restful/asr_api.py (100%) rename {speechserving => paddlespeech/server}/speechserving/restful/request.py (100%) rename {speechserving => paddlespeech/server}/speechserving/restful/response.py (100%) rename {speechserving => paddlespeech/server}/speechserving/restful/tts_api.py (100%) create mode 100644 paddlespeech/server/speechserving/tts.wav rename {speechserving => paddlespeech/server}/speechserving/utils/__init__.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/audio_process.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/config.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/errors.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/exception.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/log.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/paddle_predictor.py (100%) rename {speechserving => paddlespeech/server}/speechserving/utils/util.py (100%) rename {speechserving => paddlespeech/server}/tests/16_audio.wav (100%) rename {speechserving => paddlespeech/server}/tests/http_client.py (100%) rename {speechserving => paddlespeech/server}/tests/tts/test_client.py (100%) delete mode 100644 speechserving/speechserving/bin/main.py diff --git a/speechserving/setup.py b/paddlespeech/server/setup.py similarity index 100% rename from speechserving/setup.py rename to paddlespeech/server/setup.py diff --git a/paddlespeech/server/speechserving/README.md b/paddlespeech/server/speechserving/README.md new file mode 100644 index 00000000000..d3cf2cc6a1a --- /dev/null +++ b/paddlespeech/server/speechserving/README.md @@ -0,0 +1,25 @@ +# PaddleSpeech Server + +## The environment variables +The path.sh contains the environment variable. +```bash +source ./bin/path.sh +``` + +## Add engine_backend on conf/application.yaml +``` +engine_backend: + asr: 'conf/asr/asr.yaml' + [server name]: [conf yaml file] +``` +Currently supporting asr and tts services. + +## Start service(command line todo) +```bash +python ./bin/main.py +``` + +## Client access +Refer to `../tests` + + diff --git a/speechserving/speechserving/__init__.py b/paddlespeech/server/speechserving/__init__.py similarity index 100% rename from speechserving/speechserving/__init__.py rename to paddlespeech/server/speechserving/__init__.py diff --git a/speechserving/speechserving/main.py b/paddlespeech/server/speechserving/bin/main.py similarity index 99% rename from speechserving/speechserving/main.py rename to paddlespeech/server/speechserving/bin/main.py index 6d4891c7dcb..2a016cdde20 100644 --- a/speechserving/speechserving/main.py +++ b/paddlespeech/server/speechserving/bin/main.py @@ -12,13 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. import argparse - import uvicorn import yaml -from engine.engine_factory import EngineFactory from fastapi import FastAPI -from restful.api import setup_router +from engine.engine_factory import EngineFactory +from restful.api import setup_router from utils.config import get_config from utils.log import logger diff --git a/speechserving/speechserving/bin/paddlespeech-client.py b/paddlespeech/server/speechserving/bin/paddlespeech-client.py similarity index 100% rename from speechserving/speechserving/bin/paddlespeech-client.py rename to paddlespeech/server/speechserving/bin/paddlespeech-client.py diff --git a/speechserving/speechserving/bin/paddlespeech-server.py b/paddlespeech/server/speechserving/bin/paddlespeech-server.py similarity index 100% rename from speechserving/speechserving/bin/paddlespeech-server.py rename to paddlespeech/server/speechserving/bin/paddlespeech-server.py diff --git a/paddlespeech/server/speechserving/bin/path.sh b/paddlespeech/server/speechserving/bin/path.sh new file mode 100644 index 00000000000..99278378463 --- /dev/null +++ b/paddlespeech/server/speechserving/bin/path.sh @@ -0,0 +1,3 @@ +export MAIN_ROOT=`realpath ${PWD}/../` +export PYTHONIOENCODING=UTF-8 +export PYTHONPATH=${MAIN_ROOT}:${PYTHONPATH} diff --git a/speechserving/speechserving/conf/application.yaml b/paddlespeech/server/speechserving/conf/application.yaml similarity index 95% rename from speechserving/speechserving/conf/application.yaml rename to paddlespeech/server/speechserving/conf/application.yaml index c8d71f2f6ad..9fb67ae588f 100644 --- a/speechserving/speechserving/conf/application.yaml +++ b/paddlespeech/server/speechserving/conf/application.yaml @@ -12,6 +12,6 @@ port: 8090 # add engine type (Options: asr, tts) and config file here. engine_backend: - asr: 'conf/asr/asr.yaml' + #asr: 'conf/asr/asr.yaml' tts: 'conf/tts/tts.yaml' diff --git a/speechserving/speechserving/conf/asr/asr.yaml b/paddlespeech/server/speechserving/conf/asr/asr.yaml similarity index 100% rename from speechserving/speechserving/conf/asr/asr.yaml rename to paddlespeech/server/speechserving/conf/asr/asr.yaml diff --git a/speechserving/speechserving/conf/tts/tts.yaml b/paddlespeech/server/speechserving/conf/tts/tts.yaml similarity index 100% rename from speechserving/speechserving/conf/tts/tts.yaml rename to paddlespeech/server/speechserving/conf/tts/tts.yaml diff --git a/speechserving/speechserving/conf/tts/tts_pd.yaml b/paddlespeech/server/speechserving/conf/tts/tts_pd.yaml similarity index 100% rename from speechserving/speechserving/conf/tts/tts_pd.yaml rename to paddlespeech/server/speechserving/conf/tts/tts_pd.yaml diff --git a/speechserving/speechserving/engine/__init__.py b/paddlespeech/server/speechserving/engine/__init__.py similarity index 100% rename from speechserving/speechserving/engine/__init__.py rename to paddlespeech/server/speechserving/engine/__init__.py diff --git a/speechserving/speechserving/engine/asr/python/asr_engine.py b/paddlespeech/server/speechserving/engine/asr/python/asr_engine.py similarity index 100% rename from speechserving/speechserving/engine/asr/python/asr_engine.py rename to paddlespeech/server/speechserving/engine/asr/python/asr_engine.py diff --git a/speechserving/speechserving/engine/base_engine.py b/paddlespeech/server/speechserving/engine/base_engine.py similarity index 100% rename from speechserving/speechserving/engine/base_engine.py rename to paddlespeech/server/speechserving/engine/base_engine.py diff --git a/speechserving/speechserving/engine/engine_factory.py b/paddlespeech/server/speechserving/engine/engine_factory.py similarity index 100% rename from speechserving/speechserving/engine/engine_factory.py rename to paddlespeech/server/speechserving/engine/engine_factory.py diff --git a/speechserving/speechserving/engine/tts/paddleinference/tts_engine.py b/paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py similarity index 99% rename from speechserving/speechserving/engine/tts/paddleinference/tts_engine.py rename to paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py index 2ab8bcb45bb..003c99f983e 100644 --- a/speechserving/speechserving/engine/tts/paddleinference/tts_engine.py +++ b/paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py @@ -339,7 +339,7 @@ def __init__(self): """ super(TTSEngine, self).__init__() - def init(self, config_file: str): + def init(self, config_file: str) -> bool: self.executor = TTSServerExecutor() self.config_file = config_file self.config = get_config(config_file) @@ -361,6 +361,7 @@ def init(self, config_file: str): voc_predictor_conf=self.config.voc_predictor_conf, ) logger.info("Initialize TTS server engine successfully.") + return True def postprocess(self, wav, diff --git a/speechserving/speechserving/engine/tts/python/tts_engine.py b/paddlespeech/server/speechserving/engine/tts/python/tts_engine.py similarity index 98% rename from speechserving/speechserving/engine/tts/python/tts_engine.py rename to paddlespeech/server/speechserving/engine/tts/python/tts_engine.py index 32a0dca32d1..f6336ba38d9 100644 --- a/speechserving/speechserving/engine/tts/python/tts_engine.py +++ b/paddlespeech/server/speechserving/engine/tts/python/tts_engine.py @@ -48,7 +48,7 @@ def __init__(self, name=None): """ super(TTSEngine, self).__init__() - def init(self, config_file: str): + def init(self, config_file: str) -> bool: self.executor = TTSServerExecutor() self.config_file = config_file self.config = get_config(config_file) @@ -68,6 +68,7 @@ def init(self, config_file: str): lang=self.config.lang) logger.info("Initialize TTS server engine successfully.") + return True def postprocess(self, wav, diff --git a/speechserving/speechserving/restful/__init__.py b/paddlespeech/server/speechserving/restful/__init__.py similarity index 100% rename from speechserving/speechserving/restful/__init__.py rename to paddlespeech/server/speechserving/restful/__init__.py diff --git a/speechserving/speechserving/restful/api.py b/paddlespeech/server/speechserving/restful/api.py similarity index 100% rename from speechserving/speechserving/restful/api.py rename to paddlespeech/server/speechserving/restful/api.py diff --git a/speechserving/speechserving/restful/asr_api.py b/paddlespeech/server/speechserving/restful/asr_api.py similarity index 100% rename from speechserving/speechserving/restful/asr_api.py rename to paddlespeech/server/speechserving/restful/asr_api.py diff --git a/speechserving/speechserving/restful/request.py b/paddlespeech/server/speechserving/restful/request.py similarity index 100% rename from speechserving/speechserving/restful/request.py rename to paddlespeech/server/speechserving/restful/request.py diff --git a/speechserving/speechserving/restful/response.py b/paddlespeech/server/speechserving/restful/response.py similarity index 100% rename from speechserving/speechserving/restful/response.py rename to paddlespeech/server/speechserving/restful/response.py diff --git a/speechserving/speechserving/restful/tts_api.py b/paddlespeech/server/speechserving/restful/tts_api.py similarity index 100% rename from speechserving/speechserving/restful/tts_api.py rename to paddlespeech/server/speechserving/restful/tts_api.py diff --git a/paddlespeech/server/speechserving/tts.wav b/paddlespeech/server/speechserving/tts.wav new file mode 100644 index 0000000000000000000000000000000000000000..90c1b3544dd2ba4557bb88ed8fb8d50ff43b09e5 GIT binary patch literal 57044 zcmagG1(e*j7dI+1%y?iSn+-EFGd9f3%*@m|JoXc-k6K|zNEBPfJX2%#2&KU<8p=|^owLp0_2AEn0G z4Lv9rarAJbb2QJ$$xaz**Z(<;lyN6|Hd5aIJ^ydbMk?B-!4==nz8hRICtL(B-t^2R;MaxCw=#$wTjGm+QWv7j+>=q23MxV%T z>)*PfeEs*@NJZ<&ekxi|RA&E`W>o4?9WZo5{Hfj9DdQ@7@Bcf_E|+Z)hE*6g5&UVF zQL8ZQG#a8QBQ`WP+g77C97NU>`e{|+pVnp6XtbHFxBpFvs9e+n4I4D9Fo2HiHjKIr zTl?42jM3x2A!=hr3B#UzD9*N_Y+8)^jC8c-Xl{0#ZR`K`Dr$exKK+~iHTT>qvJ_5&K^)AeRNj8hw#uQ-=(M9NkR7q+W`IKOZIe03Th^+%o*bbi4 zyXZHy7TRewmwH+$t4x$vNEsq4u8&NNd=IY=bCI!;A(4BLVd5omr!-zJgT&rQYpGX& z-N1Tm9$uZ;Kn|iLsxd7vbC^ZUKg=oS0JEK0%#>x`(GzJeHGry4?Io`g6NngMBA$ee z!a`sn@*s}DUtqf4Uf-{E)h4Q!l>$m9*&)^zyNd@RBg4zWZ6cS$x5Bj|t0Frho5g8T zmgJCw3aho!55Znw74`-HLhL42Q$6T)bbls^xz4Ce3sz?`m_+spmD0WCl(EDKZh_nN3KRo^P><<-(hu^nn>TI55ha7YX%g;$0Kg)c-N zgfE3n(s;=&PL`f3Sz2#xoB9<(d@ zbz{FVPnh0JQP#>epnoSWlUJywi|FNPN?Wt6u(5v4rxwgcO(!x>|gG09O~`A z=UN`v9J%ct;usalp^gZb39S>)$~CZQBnJyZnm)yvnFZ`pUf{#rXJMMPkuc8m!F5MG|y)DGkJnqm%cgSkyZ% z>5Su=vO+56o91!&hiQKkP~9ob&`%Rpnf=^Dx*Cm{W?08rgBHcQ-VzcdTXGC*&E)5@ z40qd<-?W{0rHzJtiSan6FO&<(1C+62$)KjNsERR$Sp8WFd#~MY^r-c6YC;NZVGlXPD zRVcinIm1+3NU*LnmlH;nZh7ixii>?aRDC9=yFgGZ+l6k{@&5%@;8iHe@|QZQ&2| z74sh9yyb^2Vq0ko+Pd0$n!lThSg)JwGj+&PWEFBgQ4X^54%wl)m5mW+@L}+3V7qsq ztBY$(#!0I1; zGEeGHpe)`MbBb$mvvn0K0)iQ4&d;AWm$I%Bx(M4Xr-ea69#sDj6JS2F<#-#POm74& zw6fSXyqLaM0^*YhE0zr}_OI{^cB;-m#;;i~!dam@DKFE$DCO}7%FsxbxR`h)yySi* z8d5Wa6+%I-h)^VEnPsObMfhSJV8g7H%q5w-Oes?}<{&O%F~AJp>Nz#Ld_R&WB8C

oB)7G}r)L5|EeL{1SVw%iGs9$I+>BVYc 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 aGxEMi-j&GjMe^h#&-{P7k;pnV{{I2`)twRm literal 0 HcmV?d00001 diff --git a/speechserving/speechserving/utils/__init__.py b/paddlespeech/server/speechserving/utils/__init__.py similarity index 100% rename from speechserving/speechserving/utils/__init__.py rename to paddlespeech/server/speechserving/utils/__init__.py diff --git a/speechserving/speechserving/utils/audio_process.py b/paddlespeech/server/speechserving/utils/audio_process.py similarity index 100% rename from speechserving/speechserving/utils/audio_process.py rename to paddlespeech/server/speechserving/utils/audio_process.py diff --git a/speechserving/speechserving/utils/config.py b/paddlespeech/server/speechserving/utils/config.py similarity index 100% rename from speechserving/speechserving/utils/config.py rename to paddlespeech/server/speechserving/utils/config.py diff --git a/speechserving/speechserving/utils/errors.py b/paddlespeech/server/speechserving/utils/errors.py similarity index 100% rename from speechserving/speechserving/utils/errors.py rename to paddlespeech/server/speechserving/utils/errors.py diff --git a/speechserving/speechserving/utils/exception.py b/paddlespeech/server/speechserving/utils/exception.py similarity index 100% rename from speechserving/speechserving/utils/exception.py rename to paddlespeech/server/speechserving/utils/exception.py diff --git a/speechserving/speechserving/utils/log.py b/paddlespeech/server/speechserving/utils/log.py similarity index 100% rename from speechserving/speechserving/utils/log.py rename to paddlespeech/server/speechserving/utils/log.py diff --git a/speechserving/speechserving/utils/paddle_predictor.py b/paddlespeech/server/speechserving/utils/paddle_predictor.py similarity index 100% rename from speechserving/speechserving/utils/paddle_predictor.py rename to paddlespeech/server/speechserving/utils/paddle_predictor.py diff --git a/speechserving/speechserving/utils/util.py b/paddlespeech/server/speechserving/utils/util.py similarity index 100% rename from speechserving/speechserving/utils/util.py rename to paddlespeech/server/speechserving/utils/util.py diff --git a/speechserving/tests/16_audio.wav b/paddlespeech/server/tests/16_audio.wav similarity index 100% rename from speechserving/tests/16_audio.wav rename to paddlespeech/server/tests/16_audio.wav diff --git a/speechserving/tests/http_client.py b/paddlespeech/server/tests/http_client.py similarity index 100% rename from speechserving/tests/http_client.py rename to paddlespeech/server/tests/http_client.py diff --git a/speechserving/tests/tts/test_client.py b/paddlespeech/server/tests/tts/test_client.py similarity index 100% rename from speechserving/tests/tts/test_client.py rename to paddlespeech/server/tests/tts/test_client.py diff --git a/speechserving/speechserving/bin/main.py b/speechserving/speechserving/bin/main.py deleted file mode 100644 index 97043fd7ba6..00000000000 --- a/speechserving/speechserving/bin/main.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. From 07158b2f1206146239b9652f7dd9a35d59451bab Mon Sep 17 00:00:00 2001 From: lym0302 Date: Thu, 17 Feb 2022 16:01:53 +0800 Subject: [PATCH 2/2] move dir, test=doc --- .../server/{speechserving => }/__init__.py | 0 .../server/{speechserving => }/bin/main.py | 8 +++--- .../bin/paddlespeech-client.py | 0 .../bin/paddlespeech-server.py | 0 .../{speechserving => }/conf/application.yaml | 4 +-- .../{speechserving => }/conf/asr/asr.yaml | 0 .../{speechserving => }/conf/tts/tts.yaml | 0 .../{speechserving => }/conf/tts/tts_pd.yaml | 0 .../{speechserving => }/engine/__init__.py | 0 .../engine/asr/python/asr_engine.py | 4 +-- .../{speechserving => }/engine/base_engine.py | 0 .../engine/engine_factory.py | 5 ++-- .../engine/tts/paddleinference/tts_engine.py | 14 +++++----- .../engine/tts/python/tts_engine.py | 10 +++---- .../{speechserving => }/restful/__init__.py | 0 .../server/{speechserving => }/restful/api.py | 4 +-- .../{speechserving => }/restful/asr_api.py | 15 +++++------ .../{speechserving => }/restful/request.py | 0 .../{speechserving => }/restful/response.py | 0 .../{speechserving => }/restful/tts_api.py | 16 +++++------ paddlespeech/server/setup.py | 13 --------- paddlespeech/server/speechserving/README.md | 25 ------------------ paddlespeech/server/speechserving/bin/path.sh | 3 --- paddlespeech/server/speechserving/tts.wav | Bin 57044 -> 0 bytes paddlespeech/server/tests/tts/test_client.py | 9 +------ .../{speechserving => }/utils/__init__.py | 0 .../utils/audio_process.py | 0 .../{speechserving => }/utils/config.py | 0 .../{speechserving => }/utils/errors.py | 0 .../{speechserving => }/utils/exception.py | 2 +- .../server/{speechserving => }/utils/log.py | 0 .../utils/paddle_predictor.py | 0 .../server/{speechserving => }/utils/util.py | 0 33 files changed, 42 insertions(+), 90 deletions(-) rename paddlespeech/server/{speechserving => }/__init__.py (100%) rename paddlespeech/server/{speechserving => }/bin/main.py (89%) rename paddlespeech/server/{speechserving => }/bin/paddlespeech-client.py (100%) rename paddlespeech/server/{speechserving => }/bin/paddlespeech-server.py (100%) rename paddlespeech/server/{speechserving => }/conf/application.yaml (90%) rename paddlespeech/server/{speechserving => }/conf/asr/asr.yaml (100%) rename paddlespeech/server/{speechserving => }/conf/tts/tts.yaml (100%) rename paddlespeech/server/{speechserving => }/conf/tts/tts_pd.yaml (100%) rename paddlespeech/server/{speechserving => }/engine/__init__.py (100%) rename paddlespeech/server/{speechserving => }/engine/asr/python/asr_engine.py (98%) rename paddlespeech/server/{speechserving => }/engine/base_engine.py (100%) rename paddlespeech/server/{speechserving => }/engine/engine_factory.py (80%) rename paddlespeech/server/{speechserving => }/engine/tts/paddleinference/tts_engine.py (97%) rename paddlespeech/server/{speechserving => }/engine/tts/python/tts_engine.py (95%) rename paddlespeech/server/{speechserving => }/restful/__init__.py (100%) rename paddlespeech/server/{speechserving => }/restful/api.py (87%) rename paddlespeech/server/{speechserving => }/restful/asr_api.py (82%) rename paddlespeech/server/{speechserving => }/restful/request.py (100%) rename paddlespeech/server/{speechserving => }/restful/response.py (100%) rename paddlespeech/server/{speechserving => }/restful/tts_api.py (84%) delete mode 100644 paddlespeech/server/setup.py delete mode 100644 paddlespeech/server/speechserving/README.md delete mode 100644 paddlespeech/server/speechserving/bin/path.sh delete mode 100644 paddlespeech/server/speechserving/tts.wav rename paddlespeech/server/{speechserving => }/utils/__init__.py (100%) rename paddlespeech/server/{speechserving => }/utils/audio_process.py (100%) rename paddlespeech/server/{speechserving => }/utils/config.py (100%) rename paddlespeech/server/{speechserving => }/utils/errors.py (100%) rename paddlespeech/server/{speechserving => }/utils/exception.py (94%) rename paddlespeech/server/{speechserving => }/utils/log.py (100%) rename paddlespeech/server/{speechserving => }/utils/paddle_predictor.py (100%) rename paddlespeech/server/{speechserving => }/utils/util.py (100%) diff --git a/paddlespeech/server/speechserving/__init__.py b/paddlespeech/server/__init__.py similarity index 100% rename from paddlespeech/server/speechserving/__init__.py rename to paddlespeech/server/__init__.py diff --git a/paddlespeech/server/speechserving/bin/main.py b/paddlespeech/server/bin/main.py similarity index 89% rename from paddlespeech/server/speechserving/bin/main.py rename to paddlespeech/server/bin/main.py index 2a016cdde20..af51f3f2e7e 100644 --- a/paddlespeech/server/speechserving/bin/main.py +++ b/paddlespeech/server/bin/main.py @@ -16,10 +16,10 @@ import yaml from fastapi import FastAPI -from engine.engine_factory import EngineFactory -from restful.api import setup_router -from utils.config import get_config -from utils.log import logger +from paddlespeech.server.engine.engine_factory import EngineFactory +from paddlespeech.server.restful.api import setup_router +from paddlespeech.server.utils.config import get_config +from paddlespeech.server.utils.log import logger app = FastAPI( title="PaddleSpeech Serving API", description="Api", version="0.0.1") diff --git a/paddlespeech/server/speechserving/bin/paddlespeech-client.py b/paddlespeech/server/bin/paddlespeech-client.py similarity index 100% rename from paddlespeech/server/speechserving/bin/paddlespeech-client.py rename to paddlespeech/server/bin/paddlespeech-client.py diff --git a/paddlespeech/server/speechserving/bin/paddlespeech-server.py b/paddlespeech/server/bin/paddlespeech-server.py similarity index 100% rename from paddlespeech/server/speechserving/bin/paddlespeech-server.py rename to paddlespeech/server/bin/paddlespeech-server.py diff --git a/paddlespeech/server/speechserving/conf/application.yaml b/paddlespeech/server/conf/application.yaml similarity index 90% rename from paddlespeech/server/speechserving/conf/application.yaml rename to paddlespeech/server/conf/application.yaml index 9fb67ae588f..67cc3b34be7 100644 --- a/paddlespeech/server/speechserving/conf/application.yaml +++ b/paddlespeech/server/conf/application.yaml @@ -12,6 +12,6 @@ port: 8090 # add engine type (Options: asr, tts) and config file here. engine_backend: - #asr: 'conf/asr/asr.yaml' - tts: 'conf/tts/tts.yaml' + asr: 'conf/asr/asr.yaml' + tts: 'conf/tts/tts_pd.yaml' diff --git a/paddlespeech/server/speechserving/conf/asr/asr.yaml b/paddlespeech/server/conf/asr/asr.yaml similarity index 100% rename from paddlespeech/server/speechserving/conf/asr/asr.yaml rename to paddlespeech/server/conf/asr/asr.yaml diff --git a/paddlespeech/server/speechserving/conf/tts/tts.yaml b/paddlespeech/server/conf/tts/tts.yaml similarity index 100% rename from paddlespeech/server/speechserving/conf/tts/tts.yaml rename to paddlespeech/server/conf/tts/tts.yaml diff --git a/paddlespeech/server/speechserving/conf/tts/tts_pd.yaml b/paddlespeech/server/conf/tts/tts_pd.yaml similarity index 100% rename from paddlespeech/server/speechserving/conf/tts/tts_pd.yaml rename to paddlespeech/server/conf/tts/tts_pd.yaml diff --git a/paddlespeech/server/speechserving/engine/__init__.py b/paddlespeech/server/engine/__init__.py similarity index 100% rename from paddlespeech/server/speechserving/engine/__init__.py rename to paddlespeech/server/engine/__init__.py diff --git a/paddlespeech/server/speechserving/engine/asr/python/asr_engine.py b/paddlespeech/server/engine/asr/python/asr_engine.py similarity index 98% rename from paddlespeech/server/speechserving/engine/asr/python/asr_engine.py rename to paddlespeech/server/engine/asr/python/asr_engine.py index a18f906a39e..b11549832a3 100644 --- a/paddlespeech/server/speechserving/engine/asr/python/asr_engine.py +++ b/paddlespeech/server/engine/asr/python/asr_engine.py @@ -20,7 +20,6 @@ import librosa import paddle import soundfile -from engine.base_engine import BaseEngine from paddlespeech.cli.asr.infer import ASRExecutor from paddlespeech.cli.log import logger @@ -28,7 +27,8 @@ from paddlespeech.s2t.transform.transformation import Transformation from paddlespeech.s2t.utils.dynamic_import import dynamic_import from paddlespeech.s2t.utils.utility import UpdateConfig -from utils.config import get_config +from paddlespeech.server.engine.base_engine import BaseEngine +from paddlespeech.server.utils.config import get_config __all__ = ['ASREngine'] diff --git a/paddlespeech/server/speechserving/engine/base_engine.py b/paddlespeech/server/engine/base_engine.py similarity index 100% rename from paddlespeech/server/speechserving/engine/base_engine.py rename to paddlespeech/server/engine/base_engine.py diff --git a/paddlespeech/server/speechserving/engine/engine_factory.py b/paddlespeech/server/engine/engine_factory.py similarity index 80% rename from paddlespeech/server/speechserving/engine/engine_factory.py rename to paddlespeech/server/engine/engine_factory.py index bc0c45656e1..79319fd9566 100644 --- a/paddlespeech/server/speechserving/engine/engine_factory.py +++ b/paddlespeech/server/engine/engine_factory.py @@ -13,8 +13,9 @@ # limitations under the License. from typing import Text -from engine.asr.python.asr_engine import ASREngine -from engine.tts.python.tts_engine import TTSEngine +from paddlespeech.server.engine.asr.python.asr_engine import ASREngine +#from paddlespeech.server.engine.tts.python.tts_engine import TTSEngine +from paddlespeech.server.engine.tts.paddleinference.tts_engine import TTSEngine __all__ = ['EngineFactory'] diff --git a/paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py b/paddlespeech/server/engine/tts/paddleinference/tts_engine.py similarity index 97% rename from paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py rename to paddlespeech/server/engine/tts/paddleinference/tts_engine.py index 003c99f983e..fbaf372b424 100644 --- a/paddlespeech/server/speechserving/engine/tts/paddleinference/tts_engine.py +++ b/paddlespeech/server/engine/tts/paddleinference/tts_engine.py @@ -20,7 +20,6 @@ import numpy as np import paddle import soundfile as sf -from engine.base_engine import BaseEngine from scipy.io import wavfile from paddlespeech.cli.log import logger @@ -29,12 +28,13 @@ from paddlespeech.cli.utils import MODEL_HOME from paddlespeech.t2s.frontend import English from paddlespeech.t2s.frontend.zh_frontend import Frontend -from utils.audio_process import change_speed -from utils.config import get_config -from utils.errors import ErrorCode -from utils.exception import ServerBaseException -from utils.paddle_predictor import init_predictor -from utils.paddle_predictor import run_model +from paddlespeech.server.engine.base_engine import BaseEngine +from paddlespeech.server.utils.audio_process import change_speed +from paddlespeech.server.utils.config import get_config +from paddlespeech.server.utils.errors import ErrorCode +from paddlespeech.server.utils.exception import ServerBaseException +from paddlespeech.server.utils.paddle_predictor import init_predictor +from paddlespeech.server.utils.paddle_predictor import run_model __all__ = ['TTSEngine'] diff --git a/paddlespeech/server/speechserving/engine/tts/python/tts_engine.py b/paddlespeech/server/engine/tts/python/tts_engine.py similarity index 95% rename from paddlespeech/server/speechserving/engine/tts/python/tts_engine.py rename to paddlespeech/server/engine/tts/python/tts_engine.py index f6336ba38d9..b323551b19a 100644 --- a/paddlespeech/server/speechserving/engine/tts/python/tts_engine.py +++ b/paddlespeech/server/engine/tts/python/tts_engine.py @@ -17,15 +17,15 @@ import librosa import numpy as np import soundfile as sf -from engine.base_engine import BaseEngine from scipy.io import wavfile from paddlespeech.cli.log import logger from paddlespeech.cli.tts.infer import TTSExecutor -from utils.audio_process import change_speed -from utils.config import get_config -from utils.errors import ErrorCode -from utils.exception import ServerBaseException +from paddlespeech.server.utils.audio_process import change_speed +from paddlespeech.server.engine.base_engine import BaseEngine +from paddlespeech.server.utils.config import get_config +from paddlespeech.server.utils.errors import ErrorCode +from paddlespeech.server.utils.exception import ServerBaseException __all__ = ['TTSEngine'] diff --git a/paddlespeech/server/speechserving/restful/__init__.py b/paddlespeech/server/restful/__init__.py similarity index 100% rename from paddlespeech/server/speechserving/restful/__init__.py rename to paddlespeech/server/restful/__init__.py diff --git a/paddlespeech/server/speechserving/restful/api.py b/paddlespeech/server/restful/api.py similarity index 87% rename from paddlespeech/server/speechserving/restful/api.py rename to paddlespeech/server/restful/api.py index bdff935ac97..9ce5cad0ef7 100644 --- a/paddlespeech/server/speechserving/restful/api.py +++ b/paddlespeech/server/restful/api.py @@ -15,8 +15,8 @@ from fastapi import APIRouter -from .asr_api import router as asr_router -from .tts_api import router as tts_router +from paddlespeech.server.restful.asr_api import router as asr_router +from paddlespeech.server.restful.tts_api import router as tts_router _router = APIRouter() diff --git a/paddlespeech/server/speechserving/restful/asr_api.py b/paddlespeech/server/restful/asr_api.py similarity index 82% rename from paddlespeech/server/speechserving/restful/asr_api.py rename to paddlespeech/server/restful/asr_api.py index c63cd76c2ef..fcdb2f41fa4 100644 --- a/paddlespeech/server/speechserving/restful/asr_api.py +++ b/paddlespeech/server/restful/asr_api.py @@ -14,16 +14,15 @@ import base64 import traceback from typing import Union - -from engine.asr.python.asr_engine import ASREngine from fastapi import APIRouter -from .request import ASRRequest -from .response import ASRResponse -from .response import ErrorResponse -from utils.errors import ErrorCode -from utils.errors import failed_response -from utils.exception import ServerBaseException +from paddlespeech.server.engine.asr.python.asr_engine import ASREngine +from paddlespeech.server.restful.request import ASRRequest +from paddlespeech.server.restful.response import ASRResponse +from paddlespeech.server.restful.response import ErrorResponse +from paddlespeech.server.utils.errors import ErrorCode +from paddlespeech.server.utils.errors import failed_response +from paddlespeech.server.utils.exception import ServerBaseException router = APIRouter() diff --git a/paddlespeech/server/speechserving/restful/request.py b/paddlespeech/server/restful/request.py similarity index 100% rename from paddlespeech/server/speechserving/restful/request.py rename to paddlespeech/server/restful/request.py diff --git a/paddlespeech/server/speechserving/restful/response.py b/paddlespeech/server/restful/response.py similarity index 100% rename from paddlespeech/server/speechserving/restful/response.py rename to paddlespeech/server/restful/response.py diff --git a/paddlespeech/server/speechserving/restful/tts_api.py b/paddlespeech/server/restful/tts_api.py similarity index 84% rename from paddlespeech/server/speechserving/restful/tts_api.py rename to paddlespeech/server/restful/tts_api.py index a160e31dc1a..36c4be628ac 100644 --- a/paddlespeech/server/speechserving/restful/tts_api.py +++ b/paddlespeech/server/restful/tts_api.py @@ -13,16 +13,16 @@ # limitations under the License. import traceback from typing import Union - -from engine.tts.python.tts_engine import TTSEngine from fastapi import APIRouter -from .request import TTSRequest -from .response import ErrorResponse -from .response import TTSResponse -from utils.errors import ErrorCode -from utils.errors import failed_response -from utils.exception import ServerBaseException +#from paddlespeech.server.engine.tts.python.tts_engine import TTSEngine +from paddlespeech.server.engine.tts.paddleinference.tts_engine import TTSEngine +from paddlespeech.server.restful.request import TTSRequest +from paddlespeech.server.restful.response import ErrorResponse +from paddlespeech.server.restful.response import TTSResponse +from paddlespeech.server.utils.errors import ErrorCode +from paddlespeech.server.utils.errors import failed_response +from paddlespeech.server.utils.exception import ServerBaseException router = APIRouter() diff --git a/paddlespeech/server/setup.py b/paddlespeech/server/setup.py deleted file mode 100644 index 97043fd7ba6..00000000000 --- a/paddlespeech/server/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/paddlespeech/server/speechserving/README.md b/paddlespeech/server/speechserving/README.md deleted file mode 100644 index d3cf2cc6a1a..00000000000 --- a/paddlespeech/server/speechserving/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# PaddleSpeech Server - -## The environment variables -The path.sh contains the environment variable. -```bash -source ./bin/path.sh -``` - -## Add engine_backend on conf/application.yaml -``` -engine_backend: - asr: 'conf/asr/asr.yaml' - [server name]: [conf yaml file] -``` -Currently supporting asr and tts services. - -## Start service(command line todo) -```bash -python ./bin/main.py -``` - -## Client access -Refer to `../tests` - - diff --git a/paddlespeech/server/speechserving/bin/path.sh b/paddlespeech/server/speechserving/bin/path.sh deleted file mode 100644 index 99278378463..00000000000 --- a/paddlespeech/server/speechserving/bin/path.sh +++ /dev/null @@ -1,3 +0,0 @@ -export MAIN_ROOT=`realpath ${PWD}/../` -export PYTHONIOENCODING=UTF-8 -export PYTHONPATH=${MAIN_ROOT}:${PYTHONPATH} diff --git a/paddlespeech/server/speechserving/tts.wav b/paddlespeech/server/speechserving/tts.wav deleted file mode 100644 index 90c1b3544dd2ba4557bb88ed8fb8d50ff43b09e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57044 zcmagG1(e*j7dI+1%y?iSn+-EFGd9f3%*@m|JoXc-k6K|zNEBPfJX2%#2&KU<8p=|^owLp0_2AEn0G z4Lv9rarAJbb2QJ$$xaz**Z(<;lyN6|Hd5aIJ^ydbMk?B-!4==nz8hRICtL(B-t^2R;MaxCw=#$wTjGm+QWv7j+>=q23MxV%T z>)*PfeEs*@NJZ<&ekxi|RA&E`W>o4?9WZo5{Hfj9DdQ@7@Bcf_E|+Z)hE*6g5&UVF zQL8ZQG#a8QBQ`WP+g77C97NU>`e{|+pVnp6XtbHFxBpFvs9e+n4I4D9Fo2HiHjKIr zTl?42jM3x2A!=hr3B#UzD9*N_Y+8)^jC8c-Xl{0#ZR`K`Dr$exKK+~iHTT>qvJ_5&K^)AeRNj8hw#uQ-=(M9NkR7q+W`IKOZIe03Th^+%o*bbi4 zyXZHy7TRewmwH+$t4x$vNEsq4u8&NNd=IY=bCI!;A(4BLVd5omr!-zJgT&rQYpGX& z-N1Tm9$uZ;Kn|iLsxd7vbC^ZUKg=oS0JEK0%#>x`(GzJeHGry4?Io`g6NngMBA$ee z!a`sn@*s}DUtqf4Uf-{E)h4Q!l>$m9*&)^zyNd@RBg4zWZ6cS$x5Bj|t0Frho5g8T zmgJCw3aho!55Znw74`-HLhL42Q$6T)bbls^xz4Ce3sz?`m_+spmD0WCl(EDKZh_nN3KRo^P><<-(hu^nn>TI55ha7YX%g;$0Kg)c-N zgfE3n(s;=&PL`f3Sz2#xoB9<(d@ zbz{FVPnh0JQP#>epnoSWlUJywi|FNPN?Wt6u(5v4rxwgcO(!x>|gG09O~`A z=UN`v9J%ct;usalp^gZb39S>)$~CZQBnJyZnm)yvnFZ`pUf{#rXJMMPkuc8m!F5MG|y)DGkJnqm%cgSkyZ% z>5Su=vO+56o91!&hiQKkP~9ob&`%Rpnf=^Dx*Cm{W?08rgBHcQ-VzcdTXGC*&E)5@ z40qd<-?W{0rHzJtiSan6FO&<(1C+62$)KjNsERR$Sp8WFd#~MY^r-c6YC;NZVGlXPD zRVcinIm1+3NU*LnmlH;nZh7ixii>?aRDC9=yFgGZ+l6k{@&5%@;8iHe@|QZQ&2| z74sh9yyb^2Vq0ko+Pd0$n!lThSg)JwGj+&PWEFBgQ4X^54%wl)m5mW+@L}+3V7qsq ztBY$(#!0I1; zGEeGHpe)`MbBb$mvvn0K0)iQ4&d;AWm$I%Bx(M4Xr-ea69#sDj6JS2F<#-#POm74& zw6fSXyqLaM0^*YhE0zr}_OI{^cB;-m#;;i~!dam@DKFE$DCO}7%FsxbxR`h)yySi* z8d5Wa6+%I-h)^VEnPsObMfhSJV8g7H%q5w-Oes?}<{&O%F~AJp>Nz#Ld_R&WB8C

oB)7G}r)L5|EeL{1SVw%iGs9$I+>BVYc zhxIJAlR8(?rPkpY!H|ExcY%A8i*;N}tL@w$u?OB~6!o4~Ug$6NT(BM{(yQ5(48@72 zW`c{~%N-D2#0;?C5vH0;n}0#pT*IUgbBO>YP%$`w{nYbnd+nC&4$lld4!rkn_x|EO z>Ufv#OI_}xq$=LDtcHO~`Ubo&7@=!;3Es}cbEabbJUzvMaSmB&`p*>=MD_l3*g_7oyrb^sLN+H^k-|@C^r`}q3E5&3b z@>lR{;I*%)C&}e@l*!nUmgG4t*6}rQ4hS*oSI`|F3^x-?xiB4|8=8Z{T(iPGH8rv; zwrA$%LVJrJ(foz|i)q6+h$?8j9ga2B%c`ofP3a|73FY@q^vv-*bO#;3q`A^Q_^(F( z^cL~G4j)rz<6W`5*j+lF%VZibpSg0DtwL9Rqp7ELnU%1#5n2h*w1u0(9ARG5#mF4k zHh2LnhO^Xb@)K!ZWOeX^Z-a+)_i<%pWTo`+tdQ#jKe^Wh&MV)+7$of^q8+=5olGxh z8Vf(nIZS&^y@e2x-aes|;N**P&DjUcNhY1R4-SAJC<@Q2eUax-LcS4R8x*}Iy%$j3 z6*5yYdLV}?%~LgysEks7Xv07!ask_iDL~I+tD8z&yr!c}L1BQkhbhx^+x*6yygc{de`N(oKF6;X@n!n)gr7Atc#AmFXNrK`<0RFd80GyQ$07mhzME z^`Ot6>}%$^*qNWk#k)^kC0G8{Y~~f0yhm83>2F26u~< z)OX6C@I5|?NvDSs1L%reJ?0ekjh?~wWv8(<_!Imi4zj;1fw#dE;p3rKKC^Fic(k-Sz>5u`3mijl`8Fd4bEJ+viivNS(Ji+to!V1xfkAU0IW zKQXdXIjxR@&(WLpqJ9(%#W#>P8c?&z4%BCABlUsoNnc^}F-s|tImC=7OB4O6+)Q1Z z1bx9#G`AsZf1%IoJ}Rk9k>5+>KR&S~^ zrCVZ$P>t}cz_g%CqsaEy74;)L1?uU)!Pd+S?i`tjJBXtMh7HE56Se8-)MES^UV|u4 z%)oEpNqA*E9jwz>y|#W@o2gaSH|Z6XD*8s`>9eqk_DO3X9S~FGUV0dO)qBD&cnPer zzFB370(2qrJ+>F_hIiym#a0 zz!}>#}|uF2R?Qal}<@EcUxz zNx!ER(MFNi$bUc+SP@?cri(Y^dDwQ)7+Vas5PR?ptpq*;K7@(tcKHsd440ztnOIB| z(yr>~K_SA7FTx25z{XONd_Wnki{K7^fb2n5qFRA&x>Ji++bQ>yDc~4h5g&yy8=S}D^=ja>wg!E*bOu|AlX!ltJ7@)l>gzR^{8gv%8sHG@h?gY_l5aq7VkH=+ z{G}{Zn}dqF2Hkj1q7!}qXYjwU#=rwKtQ@=p9)q6x9rcdZ6R(I>#&=U$luowNXRC{p zy9y?sRdjHT%t7cNh|K{Lv|-W@eJRLWhAu$m!;^K7c2pg#4c0%y`@~di7j^{83D?3_S^;f{7EsL$UaThek(p{1tiM~U z3+?&O>;ST~R$YG!c3}nZHsoopDqoAfOi5%LvL7sd5D)6H2cJ+sxF>?_l5`=uP_xGCm=#9VnrsCdBR+Yl@Y3$aIef1Ee|ZhRhl zB0q&b1qZ3PTwm=7o8f1eo?JIBAOC~tM&U#P{uG|nP5MwhAN;0r>RKs7dM>GvNumidkeD(+ZuJ$p6oZoc`22IX?udypSPmohr09du0e*(8mLi~E%LA>p5d zJvlC$i{Y2iSKGIX>4yZ#V##*;v9q{m}4pF~9l zh8u;J`5Dgy59yel);6hC%BigQ$Pjw9HGjct#q$4B#gmpLH z&$BoGkvzV{&(>i~5j`_fBRDO5S6iuX!q0N0P47(|={|I4Y996%+ykHCzaU92AS#mE zupIgzrN3N4JQ8+<4u&R&lKsd0Ej43iq9z+pR0JxOrpIw+Mnj09$Xf&=nir_Z?Zn;?(#)x7v2!d z2bW8O zEmL+T@BT61Yv6ksX}sx1{Db0GYVNIGyjZuG1Nxx!^Uqp8IQMkdmqqSp)SblTCH^UM ztJwU!Rjq!#g0HBvL}oGf>0m6JPq#83v@WtdGB=_R5>wIGaS%UF{v?8QGyV&%Dp;rZ_uN)@1?BE*ntF7iBsj4m%f#Mw;kZ~{53P`ra#MS>x)rd zkugFsYfo!Wp*1^*Y>OAitB@Jg4E6z6mTgFN#VhCuN)0(qZl|_|g-DIg%Uakvlnzzt zR`9jY?dtDxxHDZ9d@gsAtE{7a`Y%7q|9BX-uzO;A6**P?d5!DEJH^k!eoY_u!gp`; zXNt zp2}tLZ%r%ti*yc5Qy6(%B#(GpZVARvNlXp?Fz;kq;FlCUG{`s3?Q*_zF7Y=Dqz2vv z%|5HEXxg2m-Jh2@&4gl^kZ(tYO*PM!KA*Du(Rx%@cuSMD5Bfv61g>b0O1??X2+eKl7XLi`TKk6%<9 zDd&|v$~}Dw(TbVO#;|U>IPpZgBpwT`4oLn-fq5Y+Rte@vpH@r5syeQClF-%EH46HObw<)``q3?(jbJ zJn*&-mQ~jhy_q#kM|KB22^`fNYH@8XEK4+J1ye3FFppxN5oUdWG%D;4v<|fvP3i$` zIDL=1XWGFR;oq~nh{qrUvk9|-Oo=Z+?eUdP&;0TAoBP}Q%&(DkSPS#_ zxHmZl=2#e0oqL1Dse8r5(5`SJwG^mLq>+1>?({+I3R0cIatHY$dN0-?8Z#NJ%K6wt zsxAIjCB+8eioq4Z5n?TE8|Ix2Zx%I3^ML6W9SbdG058WhW$uVPMf>^@8gP0$HeaT|n_xw_^1 zmh)zOFPoFPFZT6rb{@#6g+`ATVGq2<(AJDtF1~h54cd22z zoMlp6)m$fYJ&HST?aGeTo(1cmZ!n*us=GyKy}E)Z#|JIBV;aX)wbmDwvFFLpSV4V= zzFl7kccOWKb66vAK#$cv$-hXnxGU@mB_ZGGYT$;??wjI!7#J(s@cGOx-kN8`T1UXDi$h{r(@n}xw=}4fsBCY>Yi5Q+n8iuR_}nMkaTw&AJ;B!gMFuf zF?}Jf$l+3vvC>(^1CJ4B=~UWI-NqeowOUiUDXx=ys12cyD9m=?pYenE#_XSDWiV95 z$eZj2yB88B>;(9qnRiQ|{q)M<3E)Sp1)}~8SZ^`aNIa~ruus5Ki zzDv)e{jEHgUE)CLj+7*omp@2AJ|ks>$>0)SZqFnqoe7ta#uO5+|&A_Ih-Hl5+;S6 z$$X2S?cgkrfkn6$uv-+b29X*Ti#3LZF#rZfcu! zv-7jJW`qOzS;f55a?&zPD8|hpJAq7Xi#ATXpclp}5ap;VRCn?@o&gSP9pz8r4(Xm; zMLh*+vJ_L6eakx8*K}U+7d@D?&M}8%0Vlyx=NX7=? zPS6UUh-vy}y@7gM&X62pUO6ajmk8yMtV-?0QQ_Z%RegVWM!Hvflwf~lId+Sg9n(H> zQ$p*U1#&9ZPZXtf4Ylx$%_x@s)ltn;C-g)^TJD7~a!46X(* z@T!#Ir~OJSL~pq&N?xgmMd{Z*XrDPh-^)t#h`K;7gEEw4w zj0yDirTSV2{bGGM8ehUoF>=g~*ims6Y_GUHSPf-exS{u@%j#+CKNo5uHwMM1GHeR_ znJvf;q&DJbz(iOZ&8AEOI9`qj5ES_YKZF$kU$n1EUFCsNQEjK4g~jl@#CEa?Rhfzq zb@7d0DC+ZhEmJ$Azk?6K2y7f~Cobdp@uS#iY#P`B8-RL%Lq}dv1k8kA^_lup?Kf?N zwqDz!}nR3pV3(>D5e5wBD!F8_79XD>zM?qEIp= z<7noozg8dq01#V)??&rnkFj#taG)X#M?5G6hJa)sU@71-m;gvH19I@A{uRMM>Y%8#{|p3bkpV1fUjPgqX&$16h&a*C$ygk7y`9R{H%-lU(5W@-Wx3#Em1#X8pTFH6SSzj zL3y;rZ2XI{I&WYz3R2^0*vvunYB_Qa^o$N?aVGm7G5 zj5vx_ilSx=TB4FSsEMKx3}k{)#`r~1Y*FbLwHat1<9-w&WjvkT2csW`E=B9jj@AER zn6l|ZN`voS=*Q~#|y%Asr|Rg`jrV@8fq_TSj3DLdDwBRgdGE&Do3cQpPl z&c~2UG(>Z=QEyRnN)&q&#j!-OEKyC1;#Q(qo~UdMG?@_$TBG==XdI=@$jzqozd6x- zgVt<1qt8eAZ*bqxVnZJc`{9rk8v%V1{S1Z`2|sPh^7Cxu@;_~e{HYsJ?J)Rm=z`I1 zRE7ozb%b{L1iztRSauq+?ew2G69Z`y#UUDqL<2$NLK^M=snv!y8zFkm#y>@oKL*yx zi*y~Lenxp8)u|}1E?XLgT#d95NBbVtgebbr(4;6%?Pua=WY8Ub+Tf63jZtYud2hr~ zN&PpDN-8=&Was}^df77kzmZ7UC9}`Q-R$&#QCrbm1D%yE`F~Md@=uzh9FO)P+NY?V z8*z5ZxNGz}`-i6bk({DGLt4?Y#ZR8cz zMCV)xFDxM(*AsXjVYDv7XUI0wAq6U;5-mXo&=0f)mC?JsB0_9wC|~)hr8=^{EL1KT z+45_I>T;kK1mr_>N2_SPL4VK*A-iZq`!je6o`I*}O@teZMSep+FcAz#Gbgn`VN_EF zYR!1B6$E8KJ1`DCH4gb6y+9R2qlW6dfDmL4(9_9iOt7Q=6i4(n0@cye0}*bl52A1+ zqO2Jxhe9mKLe{eto`t6&TC0RK=m<)JhF}nA4Z5O|Ye7%Y20d2}<;k!t;-D4S5yh1e z&oJ--wX_)SfCrGTvlsH<7lcaN4`lESoCa4AJ}n>Ej@Ca~!ZNTAybC*lt$;!}t(I6G zED5Ybd^`@TL9c#GkLVtRfqD-|Aa6+p4UjjLf{<5GVH_IyWMuT@oyc zxV;F4k%&eQ;&MCK1xjqQ z5Os&aec%Ew!EdN1Zul##4wH4io`BX7hry??5tt8t2k}@TjK*S-H+>e#CkZ`W5*C3k zbyY8dY7}8rgw=C^MyNFv%}3k>Bfu-T6V`$$dX^ps_d^Q^gVER@*aPeY)*V}oc;6Go zz*YJT{ZIXp-Vb?`jZiQC1mBVWIR*7<2;x&y&;Xr#gJFn6&k+`J861SDdy8md!6wAn zOQ^gE?tKW2HH+t`sL%LQOOao&;V|1??vNi&|M;xSp7wO9d zB)z9d1{Yufq+w-|uih4ESz%;NY48^6`wXPHPmo>IKyv5^HiA9KI+`E}bKn-blZq@d zKPp`e(N+!hH8=9XEl9_&BCC**TpJ+Wya0B9(MVTVbpHU7)>kC^5TdUS(*Al#U)mwQ ze1zvwTicP|S44Jk0z5%|a)1v=XJ(^Pbx@sup%OdLyCVeaAYB@WxLXc!V>6QNbl4r; zNr6?sQSb^h$8uvi(F)xO)b?wn?e(D<=7t*(Zqo(xf^Nv(NRW<@pcm0Ie;}Lpq36be zV~EcJ;@~Z0DGk75*coX>L+IBzI0aeK9VD#@NWTVwy{Ob$L{UW~D+e5p^x*{JTpFsS zCU}6XwK3R+xOp7Tf+JvgG!m^v^eIRu%A?UZFVag9@v=7R4}{fFs|!F4&;yMY^^p}1 zLV7|V+g^ffs3e$*tf4vxqGx2d1wKa7I*&#-9U5b47^PMsE7<`jp^@SRl0ptR2KI(` z(AO>0o%(fzMjC*4641|~H@_Qp2W7B#7>8%#kBApUCR!mKMlxh&ay~hp>`bPTwW!zR zPLyg$T*Nwof^e$#MJcBAk{3xX@s`+M+!_gn$A4ZP9W{o%yFit>^<@v zEtsd6xAVn>otDP@XDW@9@gFdvPlxA_j=co;;S+VBQc2nvxbMF1;4|2y<6jnkz~6rT zTqE^mCKdin&xp;Ht6rWL`Ca*~iOXXO3%A(W%yi01c4oSpZkp1$9b9K_8Xd%oVoUHQ zXeMSiQImF3`-nAY9&e-kCKU0mcYVz~o!a4hwNJmkdi(O=S3GT_qk~o@=C?eT^JNq~ zRK%M9kNC!xn(RojJNcOS6_=&wt#H zdwxE3tnZ^TC$3@1_odGkn_XmUfw}S9xW1$X?~P^PufPJm6&n3-tM#QX>S=ntsfT&F z%@=<+raj-CSxw#0yU7P-t2|qp8mSWK=ggh5_Veu5HJ{XebmRSBt^tufN?pGs(_$XEsb% z0&A3a+EV-*F^r7k%3FT1ZL;^Xzp`X9yTEHzSC*&`)rrc?@MNFc`8oYWYFyIEPwT&h zoljjgGg|wf<1X`t_*;qA9K&s$gem53rs5`yUr7xicG5GL5A+b~44HW zEOV_lIhlIEZ4=sBcUTTGHOM}68@3Joo?L}r)0d+0>zbabI;6s(SWk*$eAdXUeVKKV z`lc6E^5NxzeViA>lT1_-a{2f zxRr_Ur53Aq(iQc-G&WK#c+WS-qdPY^VA_?efXtDt#UZXr;pTKD^BMLUxsfQ&JmK!~ zYfYC-Da>YK3p0p^{6c;{K1idgsZq@e5ZI= z(&1oiKKhP%f!@1c^kc9Mb`KmtE+-t`?+9=pBMx!WTeax-mH#9K^!rN*ehsd{ zp0l}W2e1=+*$`ioAI$%5I=~I5FL0X>Zt;k4-ZYfXL$Bk`bKB?>_;$Dr&c~T+sfR+NIb%xFfX&zuji>9jY#7V(=KC8Eh>v7i3%)421YTl$h?$^@(pfjt4 z4}cT@1e_+^YI+mRM1}= z9Qobf)pyKma@ENCn%+L+kL2X~-*LJPCa zYRt}@H{$=a^|8*f1?(x-c=IrJF~yLRiM7}uO^GZF<`2yCKXA>=+?IYUBQE9Xx5Zf_ zLtDM=(#ATU$Y^2{Zc{etqnXC$zs!xyC58NGUYv}*ma{Cf#dKSP*miNf?6u5gx$R7K z`aE$S8>V-cxp1rCt$@uVIBI4*$~c(%?EBjEtNx3iyq^&j;9E++g!#^D$eOgv&Wj+YZ>5#23lI z#rwlt{CTE1ITUNFFP6L!Eiymw$@wB{Z`OiLHD!0wE{Ent$nMlK?#0q$g%C%G z%k@iSb5>#6vLE85g~vs@LXGLZ--tJkF5(%W#R zx1#f;2~iuSLw9d8Gi(7$fHFvJV^?|U#T*53wjf4;@g_8Slh%iabIm` zVt$Q}Pk0#@Z?9x2C44bW;ug`%h_PU?>PIu`OgOLixJz)k9ADEfCFgQf^Ipx$NNMM| zADSk%4rKg!!6DytJEHy_ePFLWpzIKP8fp?B26^Sjupn)a|_4J z?wDQ)SdJwzMQs&rePS#zqs;RdGizn$l5enI_5KK3O(F!^M^As}FIjD}CV67qj}eCvd~v8C*t?8{Qo9~JD%b`}%EVOF}>bJ0h zL|rPEX@*dN|7^Nz-xuF0_RpBAF?397%sG2sD<+IJS^G^HLcsdru zevZ*%y2U<P|Qte?mGL7eX6#;wxEK#T>Cuv^KJivyY6qYny6L=l%bu*PM@!=h|{E<{WKB*#0Hh7x-M?uJ)4hMQ#LU zdA>L=xLzVJuxZ+}v{}xw-ZdVJJIga7h_Jw-FLF!ELs-cv)F@^ox6i!RQqUG}uNiaI zUfG7(&)U9OlFfrmJJ`yMn{GwbC!E-?=xaU$eNX)Yr@~zDrv6PksZG|~Xo4(821^Oj zijdEH!U^1tVDT{L%8{Akp5(6`m>XOW42H%jkCjf+N9`Xn$gDu9?v-pO^KOgXddM={ zQp=WVX=K`Ox@Lm>Yql7*8LvYmAm34f<3R?NidHd45k1KrBt@rE0csM{jZP&tAS$M7 z)wSl4qy9w4$;^6&rzn#AQ-LNV?m!PG4qbvO0U7 zzE5hPFD#&I+EsCnZ=&Nsy5LC*mT`|s&Y8a6IoH+D-Nr)(%<@#RY+z&LF?h%1~0 z=`kjU@KC5PjIt(Ka7$NHVb;uVG3DUKP-Drt_z*mT@z^&o8n+Q`@hp4+^&9;cJqj%r z4P}!!ncYQIAb-Ou!oJ#LwRITx#%FCz>+9|vZ14IbseHx>r^A)Qb=b2fI0Eg<1A*#N zEU|)n$2wS=``et`+R(hwY`2cIRTY+S_n3xUE`Aa6o_)jzgac@e<^wt+KYA$MoH#^4 zDnc)&)0mye4=m1QFjuGvqzE@_7PN1sNu-9SRi>0u!d*4^yUUfFn7Pqa%Kgll;_-&= zsfSc+aFBG6xWj#8D{(yEQ25pI%G}JfK=9bA38&bu%z1V?dzpDg9>wny&C!?78+|+$ zM;s=KpTP0VuUA#;I(L|I}V zaR!@@W?7122k^B-GVz9JPK}|r(kb*Q<{m3D$+SS$##+Pq>M{ADI5PZ?=cyx*`Z>L{ zSN5*YY@YF#Tk<^c%<$-;p4xd(Lg^s)CJu9x_#QlFPOwg}iRMP8&B6+63riB`M!O0| zvty`E#7LqCni0_8TD>bkI4iVzz8fI7fzvV|W^x_jw2g;x(~?STa7A>_(0xNRpvy(=wTh z_<-icrm4-uv~cgpxj-v7owXz_hwG&8w!28y6L*;aa)^Ah0|itbVR^@@o3Wy7Oa41I z$5h!e-~Q5qn{SyrS<{gRJCQ5TcIS4}e-P~moU#xTu*PVA%tEXy_8CmTniG$SCPWAH zowbiFN!}q^;my%H{5ENCWO2k6{>7W(oS*R^bDFn|@3phPbGko&;F3SaKUi!5n}b!_ zL47Y3&*k8+aGB=a*0Q$qLU&V!aNF|1e2zQJ#&I9m5)@CQA}?bF(HXeVKAu5%W3*bY zU_q1{z;EM+2%TI;bi+Esw)!>YP-JsxN$5|17x(0hxf$=h)_~@k;#}ynp*>^c{iI04 zi(s4{(%upuxx)M&ZkCC)`m9Za*`}N3^OokqHSRIfjoZS`ptcbQiPB^@wC~_O?1s4e z2GhYF{5N7J@rc-k_a$Uv5AgzgL_6MA$pa$4g+~R)Aphe?dP~<;e{A=3ifRIBl!>d!2Drnf8y34|oyluzA?U&-)34lGb^(`0j zY$z_{_3?XHV`3$-fM`I(6Z42$L_>ToJglu#K8v1k`S4qRD^I@6gITTpH3Iq2POaho zWHj?7`g4m}+CKQVQdiAG#4`=pm&_Dy6T;_zMZ2dGg(lW zGuww%z&7A}$xPxB))6PjByt-u1$W`C$=t+kxJaFje1Pu=`E%EQ!1F!R?l|sC@wY+q zV!Y2Bx)|{Khl=MB=KrkRNTu*P^gLz*(}mSc4~38X8h*3ciFPGc6V6abcHO*|{?%;pm z?c+3i^7`|I()=w$3uTkuPkk-@r8gv&(f`nE*!kQl^9ECSG(MRu6NC%Mj*|Jhd<(V) zd!IQ%&!PS#W|Q^E+GtjBF?obcM(@C`5VM`c_X-Z#URwM1%%zr~;<2LJR^Gok2Z z;jD+gL)T{alg|k|IfiEF2wsS+O6H`lqrL7LUX+X{+G%LFjPzCRjP_z~2tIR=&h3Hc zp%VdzYp#ckneuPq zjKDYFR_(l$KQd4{F4xwZs@>%xN)!BvmV_?>)#UC}SMwTrjhZj=H$TfFQfp{IGJzQS zN6c-ki}Z}s;2eDxdN0jZlZollAZ&r%0b1#Mp{&`ocK9B)ywX)XFTK(Jkw59BnEcYJ z&<06_y_I3)6zp8&to%TkM3=-GY9+N?ika}KCj3vbxm*vs!G1vKxs7rvk!8ITmf(D` z0v>09_)UFJcpNTLd&mqqpcmC)6HSebt{^MxTe*#?^TbvKKtJb zQrvWEo2O3r6q;?d#GZjE%ILr@K*6q-ilCD6hf*)Hn0m)8z;nBG`vA2=s0G2m&h|d? zZ=u5Q3)&-dis)&nb?f1b>`06xxhSmocWx+wkUe?O8H4|Ok0o~ z!4*;Og}boV=${nEJ3DcO$ryDSHcjJcR!)LV<$l6Wm`A#xUSpo%#l&_>H`pL{GnnuF zDDI>)u$I^_*n*Ye5uV&peuNwdl8)E|+jXdUeitbx_WJ7W3u4)k25xHMC{ z1*h5{X#mFhVgn@-Zd&&T^LgW7AAYiMTn_pAX+wq6CYOisgkt8fJ&6yIgv@dF3&J?9 zKxC7ABeKNY#r94Sv;$df@oUz`{M-oiZ=xR2g^8w~xyYZ`F6N+1Di6t^oUTb!;m|FF z{)djTbYmdo>`F7C4C5L*VuY0i+BzXwIM{xmh*Tk@DA_W7YJp>#Qmsl%xr z2KKU^Ailuj!DhiGY-xHwovzmiufa>>bG6R2P9CAMX34#dg z&J z$p`+yp&M{%!Zsb~l=_z+m@?%>{4kI&G?%DH$QV_ID8~P0)Ot8g8XO<^Cco2HPtt zI}{7YB&W>xZHXOAuAqlNhp#*st4-4WF{jgtG}3vFHpiaV*UOw&2i62K+*|%#>q#%? zM@OoQg+T){g=i~W_D=S+;8IMId3JbGrlz;F54Mi;y%EQ&hu9f>t*oO$POf!uhFn3t zWgf@4$+mnloH00x9h1Rq%Ik-0#YI7Pn$tel1o z^_|o<@q_7Q7%Oj;|0Yh$ZOu7VPRdCY!(UTVeJ*maX+pS!yc4{k(z(W==HdMamAV$| zAftbM0h_g3WD$IZ{yumeT(tIQ3;8-rjrbRMf5q$!TSvsLj~w*u(dyX$!Mlg=1V=Cl z+Dh(>?ifN+pE$!&6>z+c3q*j>QuDj&`g)(YLUV!@f(U~^E<>Ap^%5jGH0)UbPz ze#x?u%}_5(kx)q~)okWU&<(W{uBBKjyglzBe-F==AaeqH5_nIo#B-Q!a^diKnU^Le zE;VKPTL-#@T=a>UGWfl~RedCQte<5riIvIf!au(2id}C=o;4STll6@r77E-h(+;e& z^D#U?eI`#Z{ro+l$sDV7#;-XJ!FsV}xntT@_XG75K9jjaR@B#^f7tj#n#zyD-ph}P z_Mne)CbXDp&zGli>Meuo)JLEyvysV*ZI+gcL#b8zGpvpJovOt*_1}vWCMO9&wy^Ju z<1M`)j^uUGmwsH?7r&gmA#c#9Dhzl;HBy|!ba+VdS;vY_Z&zk4QHAV8Uklupf+Wjd zqb`IF`$n=~V|#~P?wRBd%V;b<;MVf7c03<`C!9lFFO-5A>H)H~R29Ca&Z?KSPWrXbK8S-?ke zeQ$s6_^f4PSa5eJ?k>TLI}|OnNO39d?(R-;DA3a4UR;ZNNQi9KZTx-G-~VMl32egd z%-*>(bM86M^F5n&pYVq4G_OXxQwJ;sRJ)pw3^i`EpUoj$fUNR+qgCv?Ej3LhSjFGR zl5DHMO$wg_$KjSy6z`OqG@y6W2bA-;n)gnmL1N zM=#7_5Rt+333?N*xr%9FRx%BkYjEc}5bF%5_UccRc(su^TR$cbkJN_4dZkh=bSyYp zEo&6kCPkM92gonXFJ!hcQCY6uGCtGAxeV?vwg_@5v8-PhB<^PiGP{_WY;ATZvxh0q zen%%kzj28;=^%6nF3j3kRJ`w+iorqS)(KVqqvl>}3|)r3LwBVrlXuKD{yTm;bCbRR zB1LoI0al%7X$up}MCirjzPSvF-^t1?xm9#*ct{}2yFau_PV_114ZJ0y`$JRwAH9t{ zKZXYCHuZh@T-2ksq+WC1*k8zJX18!xTw>{OeJ%D8&Y=c$+tN+43#T{{(d;64`~F~B zfl#yz3?&o!{ygSHV=x@?0;y@9*B2YL$wPWH9Klbi*|fnVv+bEP^mV2v*Nz*;eqz2b z>#&y_$OGyywa~n(wNnbo=c4ye)qdgK7EF~t_&;Qn@q7e9=CuEs_jk|3;2O1?(ggn4 zAJwC#m+8mcBnC5xzbe#~hDnpewqik$lx&tUQg`7Ea)a-<Uj z#i-84XY&f3z|5qQj6nt=%bD8DW2%Q4L-Mk1xX;W}5=R$gYj7g>FN9+?NiljXeGk>k z^;#Pca|Fd6nG>ApKN?JzL!o1t=d+fFEzw*4Ebl>&N(+MKm99q5&Gb^1qglH`1!4?r-}`D|c= zce1y<_k4JR_G`3L@O)&twvVdKR3JOd0NtLKg}=qA!el;K_$Ypra-+WD!_;!qu`J$8iU)qL08rU_i{8K-Q6bWC$4vRo1`cBiTrD(_QJUWHmWPPC#=r z70Q}@`g(1ZHcfpbH;WFA><#S*J&@N#_j-0^>!J10hQWjW9{#z$U}%DRO*s)^BR{Bq z(v+P73fM9FB6mg%O1$`(+sdz$I$4t}YlPMOKB1D-MEX@Y#*O3{-jA_!urFwlIm*1I z2Z5w;l)NGb$R22C29kpGJ$MBNKml`u`b^3Yt69!SL>;1x5yoisk{d?rN1MuGv`6q& zc&u^~ITA~Fv|G_f83})7GgRa+fQ!R2J>XPeXdm;E&M-$Bdr{r{M&`haFxEJ4 zSp99 z-)Pgdulgjms&I&%!N&7GVXbAnWt50o0P?J3;8V&Jk4il(^@Vu&nUaNM{tFwSSCf(S zPG%duk_woUs2 zEFe9!XwYVe>|j>orgJTsX;6r5CAsK&B-^}fGNck+hLkaX1S{bXRok4U(Q0!w7TJcv zvKlTP{wdrpyf8EYRj0hcmA-C)l_4s8AW|$E3QZ1wQI;F^L9SS7W>Dq1)*|RqLM+z% z-=tcWG|PDF66;3GL}`FHM%W|#D7NOm&}(TsR{rgoSL89Zf!xAOE=qqO$@FL@M8}aV z#NchA@9JhGs3W5#qeY?%!_i=w$mwWGV5~=XclKQj%nDx$P50IG4Gi5=HfihBQEG-U zgDH&6O)V}(=xk|Z^;>pG^`ud@y7tc2X3~BBkx_T=r{gZi>>crGw zyE2c7NYCJ0`~fBx-HoxaFPIU;qBm0OX}@bTqF(J)3(X+z}m^W(Z0%B%#tj15+wc#cY&@> zHqd>MDI7_bnY~OO=}Oz^%8Zpg#LC=Dwh`zNZuU5{jSM%=Dfg6~YTjt)z*ToYR~x?^ zIqYX#TeB!v2ltvl#XwPCiO?Elh9W42)|D*aW?0JF_KJ!)!`=%uzZZ@cuz*-&&R7>n zm&CXHX}-Bom2Rv5X%wP%8-0yB`c=IEt`YaB>EsyQiK`&w=l#qS$sQ;A{(q z*(Rscxi#jNe0N4x#P!}=G5b=+IM?*d=(i`XT%LN~nR03BlbM%UBy5w8 z+1ENp#sUwKz{aLHBaR1_4VENpY4JW^mJiVvq1yDrD|=WyrN*cS)ef3ytfyv>r%V?? z6fNS9Qo7Vfnk9||Gj9y@$vmUAS3IFs{+HQ~jGmdqRWH4Bnvj0sTb+!4t{3j1p?Z2j z@|v%My#KbCNpV-=Ys9T`c8w|F=w!PnPT{|BXV`g+6Zf})xGEnvr|Gw~KKk!kNIPnt z1%+b+R54q`;o=GLcgq!PUdtNsCy^57F-xd|MyAp_(k?LElgIU4W{Hei-?o3HQ;U7u zlpdeyb(`T%T3c$faNIG$dDnR`?oIqIXE$)Jrc2fM+)M)f3UP@*I?~0MHjITSMmM0H za1ZW)cJ=_>hUv)!*nGl1Y}F%9v)HZMrBSH4v=L^oKa&n-OD$1O3@!If^K<~+i~(_@ zXKH~oI=x#)pX{N*{qj-$EwkOy&M`4&l+%cP<;-huV|g!1LLufX^@wO>I`p}9=}XKL z+zojq#Pp(VWIX+e;h9TxTTbQ^1&25p*Q2x0!?d*gC<*X4&tz^<&-L*N3kKXt?_77R z>qADV^k{0Qw9)Bm`hm>lzJrll@^XU_s#Q&W;OdaQ-Z008C_GTEew_FL&xwIHIqS>65?9U%AO{rjfnC) zuI^#qUQfyFl3Di5xb&H6?bFw0-pc&jZHA_UthkS!D2=k*wVZM6a+bD_#FcELREVoi z-=>Gsg{Xa~HrJ+8@HyW>JvNYC#;#}oV$Y#+*Ny!Qp?WKRE1xPPON*q2(h=#C)Ja?n zH~4O*4l3pE)qK%b!R`Lb-mTe(vpQxC$Xxx6q^D;M%T98~1;a`{{iAt~A7MRbscYTp z*x*=Xxg?g70(?3>1NV*zWQy6CstRvq8+tqQj%7K*Z2{lO&eh{;z(L4y5$-U5j^Bc4 zafGx)JRp7(XA3N-a~0^(W?gNRJS_4uxYIYz^QXI5cA2ainO`!lW!83C+{JwD!>p37 z>Etp$R?L=`flv6Gb*-fntS7A3!TMv;u=&VM{;>F(@L5R^@55L-X9$7=eOKXf$HG_s8gjK`>6SD{k09LeDm=ZXvvY2aZ zUL5BMJS|k_+w)a~O#W|f5-0I{U>IA@wc>kW#gIqnDL93@{5t+1H<0bf*y%WGlYT&r z$gLtbf};Z^{eriryL0wVSJ2hTz2EbXuY0I!bhmO*e?y(5LH%M?t~lSFtHw3p{$Ou2 zlbAegX?8zTlwet zn=^T^)dH-_9AiFU>&4lA>@%=q7jq^m#aaBn{4|VlD+MX?7qCW(GPIgxW&rBX_#==yN;(7r%%e}C^#PrSFKx2!j}e^&4h za84J=xwHe?W_^a)4N<^F>N2T?eBYm#>jl_xY!Tcm`tfi00m413F&c^^#dtAAND-z9 z@Aw1!1JGT0z7KzwU&S{E+x8n@hriBk12gIs^NzOA`>7=JnVzg|RXWL~qr<{SgR25x zeG9zbyfu6wZ!UjkATbmP?TT!ddngvQqt+O#h*3sIvk%nrcgZXIA+waN&ZTe*`2=AS zh_Zq>Mf?RMxGmyYahj+JdBj+8n9xD^QAidn!VOT|{>42ggF6Ymw3lhe^o1Dvv3bNO zqE82Tsf4^TB7{!{N#Km{gzu2=2VWiku0Z~vH#j?d0c723VB3~Z&#BwBBl-bjfjNh| zPCWEgW)6FR>xG%s1Y_Wb@@c;KR*aRNh+#1#F2snm7YmED_*IAsmoYB0uqQ+Kk6dZ4 zKby>Sqvw&v)LY}YK1nO79+$^POQKd62ESvxzm@-#udaV!U{RoGuwAG?_&sQ|TcVrf zdCFq-xOQ7lgxitlwFPwR+OK$vUc_nWBHuwy0L+LG(bRLU?JgX22eB`D^(%`kx1a zfy7|-P?2z(aB4U{dMVmN9;dv9?m0sr2CwvfM2z=AuWg2zc!|&E#|n(tT0AVOVtZ+@ zR7>hAwUyGvOX3Z2zt|fUr}E-kVUUoDvtlK;hy8+@&ue1h?y=kGhq;hTT`RYYCPprY zl7iy{M*~Fz5Bv`UJ%UYwAA>JK&BF`AzeZ+8W8|PbTV1Vf)pf*AMWBuUMxSCzKn35B zJHe%M19(ZOD2x!if-1Zho(ShrcdH}txcWThXYxZZ51(*dk!$G2?q-5;An$^IraJYL zImh@@HxL!oRYxi3`V44;>k7a7`7>!n>DcRMh%f^%XsLWbQju1 z=8@9mDjX&pR8!5(*Ty7do3Dd}7}fTIDIKfj2lLsgwbw>yv!D!eX)$_BeTjZe7mNFR!O2SdG8@`J)I2_87YN$lFCDTb4teFRpH>3smneIw%aJ?lzeUa1#A<}Og zGK#`Ka)laivStIA$T;xj${4i`hn}kU*B@wOG?%hft{II)ddLmH?oCqag8eMZr{pFe zhP{kFmha26lu4>zS*!L|OKMhKG8UQlsm}C5;vW~`+(iS zPUb3N^}LO{!2OCVHGRF89 zYFjvu{Z8D-gwqLQ6CdZgko!Td<GR?8Tno1<02 z<-~(|KIZwHU^*LHLdY6rQ$JIi$=~ovJOQDqv;N-LOp3B&P$8<#wqbXXOue8wDm2~Q z9nOZhw5ngad|LhPySEKKU-Yn~du*Nje-%kA@x17|JOi9B?J@Qp)-3kDa@V^$BP%tO z^5?gr0lzU&XldK-DD7+(Up8S-{Kh(z9;E7NN`Lnvv`~V)(Qf`5` z#kwlyigSmvy`zY9o+)bf)(WfTl*!RY{=%8QPpdw*PZ7Ti|Dxeh`)k4M8WbJZsBpPb zJxa|i_Di06w$993qal@mjBGT!Z@MkDLK^E@9Xdxpx0gz&k?U2$_=L*|J!6;HH`6Hkx%lHNCQbBH}T{oYT+E7zK&#!lo+xZW<+Gb93C1(x!);mrA$bKmC z>0ahHX+hD8rJ9#wi}uSsSlnS$RI4jXjjCFVw_{q~)IT$y2QrO!wy}BMCl$>*H*T*r z&hpXvQoKzs(bq>;`8n6+?8@O-qX&Q7MmrAJCpxy-Vy$%@g`MqeXPHO(9PKhP5Zlx) z#s@l?JI0=57h|p{^hYyYnH<=h{q^gRFRwDYWVzG3q_z8G`)GXW79N`SV+FJPky399 zK6iW|Z$ExP^Q4IzHX8LNp=WFwu_<48Tv<@8+Xi?TNc4`_9T@iE6^ zM>w~~tZ>qChn;6_hxqq;xA1A-V$T6zb9jGlv#G*E%TD`mj*gCGTO2H*BT2G)IP}){ z!d)$UZgy?gRK(V8vwur(|K-Yu-XCMXx=FW6%j3Z@u z@2ei)em5G$#uZ#sqDS#d1>}S@>kuBb5jLtcbk|H>my(j+!+$~B#ZPv$i!B-ZEvBur zYH|AfmaFLR)f?>ZWVYXd|bJNCkgqSx5am)qM97}9Hh*~l*K5!HwNQTW3W7jrw&m3wPqs$(WwL@yNSAIuj@2pP^+i&SeyW(!B9zxW%mqZJwTZ2X z{a#FF{Jn&Yju4Y5b8wg}aR>cF!ylBL)LnKZU)gdqHZFIGyrU9d+Zf@qnWP?*pM;V_ z7s5}1=YsjdoEk^d^m1c`Y!4mvIMO?(-2Jfk-QZ6L-~XFw6xq_MV6EJFirSxZef8sJ zTeBqyQL%xoDb%YYUvinR6P6{V<_qUun((ueI6}51R_R#O$-=7U#mb z@!6=S|1DPxZt>~<1#)roA~-F#NkgNwoDr1#+uU`sLaDnyc6xW@-J|!@zvjtxrtR@Y z?+ZlikN8*AR8p6HqYVo$^gm2(_ey?0Jvt(GRo?~JSrjf{BZIpE2qgtEYAJIoe$6v(qY zG0A>J>?F1l)A@b;4aQ2*%A3Fkf7{S+>J+LBnD#y7ud){9!W`rdt}dC?!WLn+Bi5D;aE8Gh!YVXQ z8qfD2|0+v^AAMQD3+fzFnx13s&|eza^l_oI^|rNEZ}kf6{J9+;v$$8BQkvs2lkj7W&FQ7x;LK-BO7n$4cLgKd^e%9CYEZX9`t^`+Mv z=e^=->g$e3_EI1cZo!Uru-3fXYx*Gh4Lu_MprM?DC+fZ4L=PH;z;?dMU*HOJEwH}1 z$1UV~vODN@_#bQ0f5Q)&?Id`#%fROvM_wS~@s;c*3*qQZBPS5^WKsvI&2XEXTQ z_%S2!t6JcyJ%FF@glBUoXgt-(_oM+HH9?+fLw-Vp)D`aJS#a-)aBxT9V?`$cBiV=r zGkA<%PIqbBw9?w|>S(pS+C=?Mm6f*&qgGdks0UQP+Fm;c&g5AAi~h5b1;5!`IQST3 z`d`DHod-_jQRE_VV?PVgo#=7&5_&bg2bC)i?L(gEALQKLqGoZQ-bRn7C)2;8?$d>? zK^K4}KZD%IC)z}2B70Q>j@ZNaT&v;4tpgY8esetXm8Hx~<9B1YQN+mBf7d7I&Gp>+ zH|?x8PwTI>)jHrMkDjNli{6=1b zHa_e3@OZ7i*I$Aw^htN?QJoleqcGUgUBRoJV;l!1Uk9Nn8UEbU=0{VaD#OjZ0511u z@O9@0ako7gjathAa+X{nx3G6F$y0I@@!o0VR=1Kl8@E4B)OM59i&j-vL z2l3w^44j8w`wsqf1oLMV^6yK`Nq8R+c;N_dVAe9fGpm@@@ppZ=-rK;zKMHF0`PkYi z_&vXZXCNRduL(kPKlr2P<4EtKj=~#$1JvdFi0dDLdzACI3#a*2IL?n_ly`vuuoMct z5&y9cT4H9Dq4I#i5P`4z4X8-B{$nW|!)!TX9s>d4EL_tUP+z!aUd7`!_VynBS59ZP zkN@@7`3O2d4in`wp1s5418RKl@hk;D%LL`e4~M-0-?;+{p}aU-iozXU9*@dcJ=MTh z6?nQU;Ae%g7YXo03sBo;;JsgCD>t#_KXGOp!-(yI6Mw(C58wA;&(2`vE@FS~VwQXX z&B24!3e&Tez}e_K0%=SMK&f5FFo3!nZ8=4OujTL#lY!af&-6TTuoM>SNw z>%-mN0N(EU7}r|ZkBZn;8XSnjA7q4twW+JeeH&Qx2o!e^ibfMp6!kBZvAV;8W%NJBO*1LnO)BO3t4g z;#E!`z5n%!%J}ay32H57 z#c~iRx&NB|M9f` zM;40UXF05$9D)~x`IPfn4LqYkLnD;mjG=OVXX1>=dHB)aO2u_Fi1S!Ax8oIS@!Jh} z&3!Y5P|56S>g|l4yhFk^F+iB~yaz-m-BSvu-2o&q6e54oh z6G`NI`Y(Dbvj^GKW^kDtrz@jIo{wZuv&m-=8}>sB^WGeY8M}%4!)y*#O95&ds0*z? zaw&<5@m#&6z5+c}?kPLufpP|VQT-g*8FfV-N8U%LB3nq*L)u}~)(TQ}NK3MiUIVvL zZEgr(OdKVxuuQcsv0btKWQ(=^VO?t3CiW2ebN!j)h%d&NK@dmEgI9gr%sDd^TqF9M zKBKzv9DTl8X_eGplo+{nq;|M<@T`BKf4r}>x1jHL|5tybU`Dv6d{psjqs)8M5IP&R zfRmh?e<~aiH%g-Qq-~A8jH6dfYK-Y9=^*yn)*r;HTyMrroi@T6t!+>{tNYah+8BMk z@wa)NDu=t)HTa%B;aX47n_{s(Qah$3MTdkZ1b*<#-a;O4_Eb--SNCl8Hwu-Ef~==^ zH5-%PX_hU>`M6TZ!c~&8rQO!n_A~Yr$FrD{&Ym&397*9u(h=5vXT@-JGgh}AF&*#1EKASzvliORt``rH% z+>{+qAz5yAK({R$j-{P1ijGz#Bw0Fdb=Z&EUpN;0_n9BqH`&HmItwG&HuQb7h0bV$ z)OU(QJ*K8=aYik38Y<7l=-=oCs3q+tHd2Y&V9eJgt*i0`j)}1UmhY2yzx!Rb=1%uK z^z`$;4PJ_TlrL-f%mnh5Zom%b8uLel8Dcy5Vx9o{7qVY>jEdPC6LsvhH?!4%+kZ66 z(;Lho`hCQ2&y|Ae6;;!q+CtU&KAB5@p+C{HpeLzCHd1lsOZ||Rq0El%ghus(kMjNG zDd8^f_IP;jcwZlP#b{Tup0i!G&vtxvoQx?IbI4xY zcGV&aN7!j}B`T!X(&nlI)J1AFt-t;p^E(fzNT?;tED8h5p1b+}w9 zB8F=FoA`=&hq$w|r{na$TEpMmLD$c5<5#fEzNA@?JO&*Qea-+N|zxA^h|uZM@r4b&_89r-qyh^-U22IpA+l&%VExlv3iA?W>b(ddUxeU))PSx+q{pU6P^47Pp{ z5q1&uZ|Otk;=Y(*e$ao_6vZKDgy*31*&*L0ugg=_yTmui|5xCT(80(UIX`mEm-J$& zfwU)!>B8)3u843+Y--tKJ!%WtO4uLUo>@0rzCderfcwVGrU#RBL}VPUTUV$MsG1C2 zf$jqb$11undV{#h64H!pz`eK~sQgjwvRYK>99Y#a#pu$A(*vNt2B9vAkaY4MTX$lX>xjZL^OZJEJPc0@)eU6^9|V2DYoW2> z`{A*X(NRI(C^u5_sbTf0*38&!KF0lE9lII?<#ytIv4$i_9&v%VS-8jdJWViD;gD1_zp6c%s{Ph0Jc2}E}qMXTGOB_yo>%Gch%P*xqgdQib=Vm{GJF%m85c=`=$M!V6&rY;GC3N;IN*85oHMUC>t zDm_y_rd`pBV}-}z>hL#o38&O~>N9-(q~=yFSm}*NH%AE?jHq@KP^Y~ zpGFP(D}595%7?m`haSdsg+{OuQx|8opSHqj_&csGnREh<{Et`xJ|iX3=_MO@wNKOz z>arO}{S2B^2dpd-u*MjURj17;tDo2QU{$$AG*(!O{A&X>9&u|`sw-BEJB{Ut>ehk-)fkb%JHu!6 zGHM`tA7!q<);}7Bv4)b&6X5wDHHM&T<4SWVKE*4<`Pa;`i2CEPLVRtOL+r4e@>1`q zMr1NYV+A;hJR`~2KNaq|e)KUY;aXx9dyp&#sq1HOdwYO;)*12P6LYB94(mLLYK@-- z(aGe9?$cUpf2awnCu&hDVm3%xXQifg(Wn9K&UVCq|Gh`Mf)mRRe`gHRI$Xu`Wh3YV+s?r!7^+CZz z-=gprQ__=yje>QQN@jg#6H^J%^iU=dm6YDxGXAL4Q96Ylo9iuc4#U1d`WG6A34AVL z1Gk=@VGc3+V10c=TcK@7yjM%p;fyItrb0v9K+UC$l9T0Ak^BBk&yTKw*#(q(bc1kv z*BXCKwJm+0zeTUrYm*9GUE#HOO`2o%+r~+~#VPhrad+cS#?*zfufMoRx-O04+mo5b zG5wZy3ORKCP^GDYoRbf9h<{j{pe*+_#h6D|T~{RpD0{Ya=ps&|E7ngh{}ET#W*5&`q7L3MUE0O9AxlY!QR&U5q1n+p>88Hc9AJKL^wAzFXTZIGs%#7Y z>@N$aaY48We-1_H+o8oNKe#e=hB-v`YDYp9G($*{o zFUnj*6*(_u*MHGh=zkj*%#+3oZL)R**Y4ulO=Uu4WT3MDxo3|jlvN>nnL6D3(e>`@ zsnAo@LW>&HBKJcRnJJdM0uN2cV*a$HK74M9vq79-KPoo1Ib!cRTUoZT&FKalBkkuZ z1Mpf-pJ&`aR;RIEP>Z0WS8Mf=xJGh(4Z?q|{-Cz5MHj%+pycP;A z4ep^;%OKuEcVjcSyOL(xVxJo`(D}&zQ5tW18v8bOj|CQ7W{EJ^(up5n7Sdh%Cd8y? zjJfD0d`JB%*HIg(ucLi~gM9fsWxNMGqg+!$x_-sy_`1zIl}aQI?Ra=wpoRIXb)fJo z&9S$*X5z2*wT}0W^UnS;4J|`#Z{iNd)v^uZqwGLoy){!PN3GUaW2L#1+F^9kVi1SV zL?yS8(m47@pr5z0w~A+s_b->|8?F_W|M<2jQ`XMW^$a4930#nSO3kF&Om0TxF7m`S z#Zku5!70S{wJx^wjGdmq#f%f?ap!oemA77?&ufygh5CjF>!n^+ZK2GOi^yl9RilH0 zeLWMG zyzD@Dja)ygPFl&xY^sRSP-%waQjlF|JI7w2rm`FO>(T|p&BbHpJIltrxAM+4iI?Ka zqsL;b2*sp*i15|OW3(jA;c5R>_bYC>nEV4Of-56kf^$6Qpj+DFUg8?y^+z`bil=RJ z4bnQAUDXGX4j?kDl9r1Nk&Db`hYMA0dmLvSzs1yYIvtfAALGn~jv~y%+WKb}dHj_is2kf+clrz&=#AZ6$=IWVv*YVEMz+$&MoYie7nGEU-JBdYy zIJ2W(Lm2@6{|}L_;j+P|p6@f;x!z~(aD@?t%4r8uO9i(m_oLIoS^f`!7&3y-Lme_D zCWi9}A8fzbmO8x73Nbfq$KxL5&YzHNzhq_X2V(wqzLom0qu9Ira>hWH#3uR)WttL! zrlfp$mH(6LerDh7+F8#$S;4vPNnd+r-41_=JP6GS*7gmJ{6+ss=IPzc*H}6C6Fpc- zJ#u_=ijGr`4hiRSFN!;A`@^0V^VnJ3ktHqTHliDbk6nT~{y^h`+E7uW1)@ztE&W?u z^;{EO^RvJClKnk0Q`7o-ZiIX|+U@;y{Rfqr)D)wS{-+sF*X7QN4K3Yln_>#bl(S!n zvE-_lYp(Mz`(Vdu^pg0|UR9hZtPq?>pI#8h%rLbvD3AO_U1 zJ{LQSr^HA6Mz#hs0vi09<_M#m)=r%RD$YWXka7iU23H4LgvN%B`yNAK-z&U1k`P%G znIE06Bx<9zPg*;~gG;C&P(MRYfbUiMW>CbVj&gAFLv3|BA`#sx=84kUAYt$jm(NE1c)C+JpTTn0c zN#+!zD)K_f`V(!aanu;6Wos?bQ|}+$Zd}lQ)n*zE^)=wq$@(miJzF5Z95&}t-Qmw@ zz+}@C5F_^iGvPW{3{*`w^AP9KNVXIE9n+sgLA|wuI=j%kr*~0jBMvyP&Q{Mw8$@P= z)`hadQFJy=3I~EmLwh6s=xHTM-J}lE648&%K-Z!DtesmZwy_MhZN(8W>?<7eKpWfd z81C3;n{GKF`NfCmGy4xZIaQ;EnCpyl`WZD==@C5|ZXDi)WAP$%*MGp1XIdFbKwazU#+Fm;7PV{Zgu_|!=vHA3HxE&G~04( zvecfx!dxYJ=)?4WocU$6QfgDJk^VxWV@l3zBZsR8AMb{RRBlIR$3QOoK1!Pz~S(~pvxfjY<(YNa_zJ%HXLkzoGdHs4EE z`}BWY-v^UJ^#VWnulhfShwFRI_9THD%fA;kO1o^7hcgf z-cvnueQN3_Z%P4Awb1^cGq@)-NcPah#Z0L(s9LohvChXaU*bO{PK~W(?<2lJuhqqT zGiE)J^knq#xF*lWd00W8Yn;S+QiS!gMZ}MmeSp^gg8u83t+On}kn_5QOxiJHlr~1O zhdX7hB%jCeEPhJDgoK?5-5ra?Leih; zQ~i~%MXc!A5-Zn4kNJ0qs}qbnYANF&S;+>m4lgUL5MreX)|Iw^Wi)8554k>2)?H&9 zj70246zkb#+FboBv~By;C(#wbe*QG?pFY7~*B#7AN>BNED}Adnn(r!X<#y2XIK^JW zX^q{GaNW7olFHTwm3AIELQT;JM_&bpL?%Lic*1;5X23TSp|^4o%Q#1jqq8*#{YfeQ zXROFe3O};(==0dZG)Os|y#icFC25`di!@}Ku^iiy9%tTFmqq6Ww?X4oA9TpH^fReV zKd=4VFr$uM&EC@9(|XgAWX`~?fTyNWiozv{IrF4D^sbgN(ifAKHIqZ!r`5L1ImBs#xMjW}Uw=BoR-NF*| zQOXbJn}giYp2%OKG0~qwCq2Jp9ZClYW5uZPQA{BGeHp^bz zS;n#7R@#0}h*MvCj%QW&_J~eVo2reqUbxaxQS*6k^r+!Oml_tm);?#W2mlCtwXPcUOO#{_FCSCMTk_L44BpZyu>ndx`k!-ImllBs5S zZXG9n@%Gc9g^h;JKuaSe-5?}osui*+l?gSroPNvLOF6 zD#Mm>Hhps19~tP~n`=_iw|IN}!PpEjg=%Rmr`L%c*yHjPUnKhnZ}GsS$TYIiYK_@p zeZmjrg1jkg6qX4)`PEEGDzMh~p3 zKPwOQDAkd<&fe#K6hh)^>45ZHYGvs!ZbJ{^mRcA*pr67+Bkka16O|=Vd&D2?AMEJA z?AhzC@2Z$}A%n|^x;|@7;#cSD=`5OHjeEq8Hk;^=NGIW6=C-yhayw8ua4=woms9gB z%^gK-_r)1}eYO(ao-oWxWW{_`e=SF~SxQ}~?;zW_S;8c+mzvQ#;Cvs((ymi(wT8NW;Vn@K4x2*yIVc5jJ`N(-bbl zDtu2kHEJNb3*hYDjOyWS+tS+jqj7z)t6(D{2DlMB&)B0CvGXpWu1 zBrzT7$54axrWTkPaFu@2CaI&9o#+5wBXS^g8vV zJ58UWe})5PA^Qlr>U_{=-e4!P0p>3Al*dy#CdUkX$fs9UYAF}wr_ndjk?1{KTDcHu5$&hcQdg0Qjx=rK`{usB1C z>Wz$z#t^z5ds1x(C)yykBvS)~st_C?x3#_cclvo^rDp1B`U7RJwt}g{#_1&^l3s`} z#Qvi%P|E4u;Ulev^F0^+gfyWvRG61Cf6$+hW!^~Dh3j|%+XZ8FOz&ad!}ujCs=&u*Av2+rZcKcrbv84$8uh6>tc9F3&nr_vb)RH(1X-#jbQjsAys=bo zVBBG9(pRajs$?{zFM^wsg4*6=Edx}=bosN^h*?eY8bkGFikteCJ%vazua=Az&n)dH zS?RZgYdlQ=v`+AQK%Ap)Ag_dtECUX z?0=3J{Fd56T+h{u{I35>PXhmN3Fv*@%wE(k?h3`~Com`Kq3>-jt`PbZ9M^w9#q|$r zCAG-dZ62V%k@|WYtt*wA?MhmzTj8wm(XaV8;ZaI{u{gEDxI<~m9C{bIsDDL{JVxzE zO^4!jJKx(_9|iw`8A&~+PODE1hxi9|9}W(h=_ih7@@i$3>gE#AF8ZN@P*opDNnAcM z(%^NsA@cLdYjuithxtP&OtPb!&{I#AJnq$rcawniqqc=E6&N|nDM_F5w3>{eFR0LE8yQCvh6eG zGk2)Z^mBu#UG$q=UQ!=U@tJx(whUKA|2evgG3d5N2la_LMtIK+lp%vEPzLU0HW;tf z8)O~R%Uop4$NXzSuhDwzZ#ge~1GS+aY{Ps{pVkQVw_eV4a1!&@d=Rx8Nnj<$>o?Wu z>}`+*|J9IdhfgSu8exJYuje&Bk||U_!)Z34o`50wLairX(a&@9gd)_l$ULeiIYU;c zCCx^HPHyRsBT%vkz3E)kTk{B91<%MTP|DX)OX!)@J}nk|?bQZxJUvyvXY`?-Gcyng zv||?<`?R`-lU_?ic9Gr|nv_*c6?(6}iO%_4sI_oKsgCMqLm_F*TiT-bRL9ayKnjmn zDwEO7R4P@EA&Zemcbb*xEzD`lf?9P6L>j}GUFLPeG&hm^Mpb<;QvD8>B^ zr5Yz}|2GNyHPO2Py8ZK7JJdlc#5@9+l|ZGA}xQ!9cmhy9I7Au%iA^kX67(o ze)%~vRPQ4s`c3IUNz6t@76eNxekw=?zgVKSJoXxvj<~aR6}{YEY(rpaQqVZ3omNM| ztMvl?GJ9zZu7TY^x=ChfZZ1E8FV7z5`&b58a!XT0r%;6}36%(gyU1}vl79ikx~H$O zx32qKR>$<(Y2933gG?wkkPvDe_R3pKCwWZ|l%`m&@Jslb;;)vCjutUa>rC;em?XT0 zKX4g(UA|xrP)D??T7Gjfb;?|W+F>=^GpD1;)>&o`yul(@1WwiOgju2=4#LtxW$qX~ z8tS=@<}U35x=7~^R`w-$_qt=Vm5eGG=RDU!=vIo46`q4e%2fUGjn22FB5QD0o_PDQp(_rT5{C8^r9TCz0(`qWM}|ihA7;xGt`T zCj_tg-2r=OOE4kyDbzM}E>tSAKJsI9wOUuNu2)2dr-f!Ga)I6ruFZTt$j{*m@Rj-9 zaR1g2-ogbu6uyx#H0$57)7T+wJRE6%BeuB+YUyy+#tnxj^ATKnHQAGh*BH7H8G`XC zWO%g4>TOW+&La*?j--Z*hU1|Nl1Mk+@iM?>;skgm$;^^A6=Ko)?4 zG>kFeMSlm6?pp30H-Wze=W-*yFz@7(;6JR3{kaZL>_HHXc%ihAUr@k=n9dhR^go?F z#ayBfk^R&OM5HtI30gs9Yqv%VN83d?fj zmxwLJ*Frhr2Ywj03S`-t^dc~A3!AduQwuAxN+Y>Kv`=J7xL+tcxFC2V@K?YQtQ%Y$ zj1L_Ol?W5W#5bb4+zolf+MrNm8XM4wwh`1O2jCBn!|WQ5Q5ejZf=jjydjEElHcBq3 z3i{X=wB)fok)}#{rOoi{_7nE zcSNv5@Vj6yFlnv_#~{Z)FMK9)EIL8%r!-K@X?gWB=>7E4^iVg*B6=XxfGx!Nxo04- z8p3fgpVUcOg8n%7r1R2d`0|OA3a@T9#)T4o<==8Hwj`T}sS9R9Nop#bspla;eT%sI zvwT0A9r1>Xg~wqQ+JjF5pWzVxK6pD=K6ESeC)P5JqhqiKvyqwIgg(em&1`fp_JHhE zhAYSG{ATnidMTEXe#W+MOOKH+m?-6kKX-$ePdo?r?gzMsu5bd^kzI~1ypIVX$<$H@G&qF!*n*+1vqe$BB?XGGYO(wzJ-Q9K3#bI%G zcXwOdc3Irr-5nNZfnD6)ki)pv&H{eSdt0wj}ZnV#;d`#$G7SpPMA9S4W-L)#=< zX4^?zBW@@ql&R2Ueiw!Pg<-wzS!A4df~__yOMT!Vej zA6OX35Ih`g6{;IAj$forP1OM4hL zLS;hTg0};+0wn{{fxLkl*zXW1JoeD1(6jIkZMlBTI1G|XDsv+5c|1KQo{)CS>y#?$ zb@dnQ`*WMqUcp}6p589okAtzE+jdTEu6~0b`H@^qo`CC494$!)kX^zXj35iJ-=Is| ziL*}8t7-kiJFw?HgXw}-1M36(14jcS*e`e!)ua63ADE3U*XI~B%qiAiY#lTUuShbe z1)s3?UWx}K^6wxsjkF!I-9}pUd)s5%8QUMW`d~sFR@UTBw;10%sfWQwo= zSDlmA3$T~^7@Lslyg>ULZV|p2>Jmx_9t@5QcENTW4PFWcgT7$85W}aAg~QqbV>UFT zhuBQ0hF6gG^gfN1isR1qt6C4&m=@rTyhVCPb7#C`1K1z%pxM{iHmfa_x^g9HKWIn4 z2%UKiHVfmXTV?~?t8L&2dG!l=qE<|663!L=BNQKe7#tDY9H{B<9jFuB6HtSn!WXsD z=u(xpY?!5Sz5rQiTWN2pH=Ith?Y*2WUH4sk+*94JU2|Q!bGO51Pq81h9Z(7=qTGOP zK$>Erb-;`@-x?`K5p$a9GmBVH&GY6cGrMtFZ=j1>R~YAM)q*ck{mv zWz?=~SB){yXI*9o_(%|J28rFJBg$Qn!Y{hhdA!j@JzG52qSv4UH_utXS;Ns!U8UTY zn~IbS;%%*ZIG^uo4Yl)HMx(7Enq{o@)?}+R`Z14<62^CJKdL#OL$iY`0!O?Byo3Em zd_}!k12@78!%iLA11J&xKz3Yz=tf3KFXb(84$gJ=i_Yuudro^=c@mR3ZdM0&+o^&KBF2L7g<~8T(ue3$_Gku3~&vdZN&}6E@N2s;>u$mS#3=sFH zg)av?1nzlPrM>sn^3_k9?|T=@7^)ve|InOm=7tWx0MA0Mi+{^Ym5TPIuAAsLjrP3s zKQ z>RGQ)`)r^kgx&4>(X?&uKK&9 zgnN0^+vsFZMbGx=6H#4U$L)n}rPZNw7jX;S0sV3&c-dA$b(`5-W*mdQdZ^LHYz(zr z0bvZegiA3(aY1@4?hnX*`fClotA^cQ@Nu!}$_n z0KZB0iKuC|XNRb5VDC=^*C`Y=)OEv=(N4MKI4mB;)~zim9lo$xeUDmZC=)VZc%d^rmDw&fsiaP(?>8&O(i)CT+d(oz;C zuTBl7D9P2*K4VNVI+V?PZTiguLS^zNzfGP=)s+=$O-E*&>53-+|8eE$kFG{gYzfL= zsQG!Ros5INb&ya3*Du3*0CGZ{kqy4LgVs`h4Z8NuB2xFHflw!vlzN~Bz6;9eTjmqv zfYujkYvTKyQXy$g@_>|D$1&@0YM7%v`?+nAJe>`~pg$Ae0G*Jk60c zxY<3#@znN7sf9YOwRERoMg{=xv!CD)a&NKepF z872M&O>TDKI=C16jH+5fa00xjGn0EI)=xf{JSAyj%HRHs!D^v-dQY>HnTORAjvy6K z7dNR(&|x&)wLJ|yIXn}iPq|Z_U+tA_pk7GtkPSJU)&+U6Bj&6BLb3VX_{ZpGzQp}_ zI#%tou1L?%!VPK(nhPwf2l_uuUsvnHX=20X7pqCI@b$aZ+-z`G8&_&Wnh~) zL3Ai7bY!>9!$wZHB#)p^dXQZap5oqg0=2_jPzx`IX1A(55qIA7AQnzTA6_v%4-7^$d z+ZwJp4#{!YwoUmLM3kL!d1)w)h9b0J3(Q$YnqJMgV$QRQV_dcy_4-vbfnF39Fea;k zRIvmEms)ChWtTLE4iI`-4fRgwOLOnX)P&^xiP1?%QjFwZllOXe_?!6~1UJHSG7AjE zU)VsNUAn36vafK(Lftbjx>NLJcR$xXhi|TRfOXJW z$c#R+OWzv`1n&BlrY*pEx-cnA%9-TUmdzr!q_gTDjw7yR zuFCHEQJ>s(+?LDcI`4e#?C6+h^CL58wD^%U;7_g0IR9Ii@67y`XuY@Uu*x{1BXNb^ zPp^vGq!JjlzESF_v()v-X-O=UD>s;yh*ZJ1|%$~=w!nQ*7ep__>CH=jwf#ePa2aVvaF$G96kA&>RLyv3GS zkHb?#-Hnu>-9H|4(nc7SwboXIqk?7iNvwm`FWj0fq>XqzRv2We5rR{`ZaX8L6*yAT z>OzlQLmi-SYU6g)DmpV=ScaZlG2=fFgU9Ld)@6DL*|a4|F4B-6xBf!4?VXj5&$Yc5 z1{eqMiC@J_vLtZ|`>ekfDoP(r7QDqrkW0EP=%t^KF!#vlLMpKIp>i~%B$#)@2T}Q1 zK)dN0IU)5yKFAGZdK}Un(rS$POBgS#U21b$KfF)qs8qw*y*^TLHlLX1lvvU;v`xGr z9S)}_aq3#DqVY`_DgG(;(hKmb@@d}RSS!?*UqXHPM7c}6`bH*8$4Gax3)J>=1fSuM zJCX!FGZ?Eah*K{mt)bP73Oqsbk{8AgW3h6D%+>0O`J{AK2V<6G(4bZr_lbI}6x0U` zNh_8Ni(_@xhOdO*dkY_E9v64B^Smrg&u3U3aS>yz1AWK(iv>*&Im=6tf04j^mi9%G z%M`Jw@y%MUZV+Ux5-AIc{uY*B{nwbJBk4kUZq(Js$qCY*dJjE8-9m-%6(O(9V|5D` z6!R&68+VP>@-cGT$RZ3QHc~`9W}RSDsYCBiG^Mmz(n^Elafk2{n$oxE2#&;^M;3fE zmQ&u1R%WlPXe5ztA@j{u><#@UV4GM@Qio<_5_gGhgi7W~l3k23W8p3$vpS?J=2SJvV)(t=({|{x%wrDJdIz%g(rcbzc4t?` zL&6@jGF?P${2wdC|05m1d0Zk@Ba;lbFjh<_c+GooB6PO)@zt~}e}g*IT6TrzgQIdX zIbq!q1o0}HX_Z4)aJ`ikBZ?fXA1^AjAXVV2%m+GfT{shGvFpfvxhSjyEocuZ5AWw5 zxaI028T$hNUD(EZ!g~Y1ADw5_U|Hx2aW2S0t3jN-z*~_WVkT>YnI@c~DI^`6V2y$o zVjmLAk0W!vNTlY0B$|Rkl(>zalmjNI;v+>#)oqgU{d^D*?Y}d!Z#1ZI|F8ILUO>HcB&5 zcu4y2b(TZeO}EEB!j`9Xu%^H?nqt0sIwb5P5IFy zJ;N8FgEby5fNtmljUXl9t)0WBvpVQv6a|^^i8UJj&@pVJb&3^Z)!B6m6=-X()fFT8 zmF9Z%@H94`RR#@eBOIBV*%YLomxU6xKj{Dp@vpRq_)RPf3e{j~h_qTxQ`gy=t6$`7 zr~nODYp5C+g#*FDTYzp~K02CIL1N?9k5347S0md9c+Z|XIr!@pL@@E*LueV zABXSz$EQ^Y-qjqMPgmI@DB(8pO}L}S${*xI=)d<y&MjG*fgalhlP$IjBJg;?9>|_y$dXRd_}l!?}=R4z<3p zYViKI5jKI!eTkkD%ZLv^yqhI{hJ&h~P>#Jf3s}u8uA9Lqf5>;;o0J^q9ih+iXOEwf zygAS!FgmR1w@{ZV&)o3N){{y}Eu>ice$-@7Moo@BXop991~F6o`sxwq!Y% z)KNMOX2@t>11iJExax$B`sQ5JJ-_SCB1#ufxvp8Y$VurtsFHuc1GPiRY3r;skj9Fa zsZ1uY^ce9!Mb7bfUzX&e$=g8i8yV=}|M$n=UnSpCt$e^4{4aRR=hX*GUuhlMP_3X| zQ760aMXirIna-BJHs(+3qo>BEi%E7Klk-blek#utC84&_9$v?hx*ED4a_J=eGSEMC zF1%5%jK0bAoJN64`z`fTh0@MFCotT>}?M=glb z-C_3ydsAA0onnQB0_>i4HCWEy&)X|-KKxrS+CMJvcW`R>voV|1hOhqsIU^6XRkinX zmUrKEjdT5nbW_Rwx9cxQ7qu_$HnsUf<2TfE_65o$SB-NbA$9k+n_o7i%=8ca9DY+U zt%-im|CjL>^Z5e$$*7m^+p0Y})$`f)B}U8GB}3zkIWr!O9^kADb+tEYw0e#GVwq+O zy@b(3KkRFt+Sa?!yWYDy_&VGQl<2vkLDpxXJX8p0h%7}rFGg>TTIgEoTI8M%I#OnL z4`*w;-S&?>Q^;pkN0n=tmeJol`A9;Bgi7(Pf1LQdChpHrtF$HWpL`#sAJm3vLxldu zxKKg)MbvdiB}Yg1eD}Xm?W2E0|Ca7r>^s*H%)EEm>OecchNj1;d!bc|tuqdV>xO0q zss=0S{qPBj*M5ZysDgEfu0@3v%zwC|ciRTpJJ=W4Zd7z%R zmqqqul>Mx9M|Ma7xq$pmtVk}RCb`@yK!@@XRxPWgxe?d$6le=$_-nkf%HQ8UX57sUTq8Ect1&uk|z)z^^qw5pYtTw@Ew6WUr^ z1EV8SFbrd^bVOLMuajpBUyOHBCG#Lzgzt9YPs9}ciTaS;(iY0YO-+2vez*P+e=&$O z6S{zjViU_Q<Deu#dt826c!W0Uw3g+cC zNjr11G>B(n<-~aXs4!Q#7u+E?gh%%R$!ZpnH<ajp|>F;#0JJG`JEms)}RHnRAsXH5ANo*&5Y7vw%L3rUIm>cw~)^ICb!pa$~Dak zygIFBWtS_4Cn(R+oriB*H_6qg5c*#{bTNhh9{zbCncr9w;A zPkCt5Y-^J81vrU!m5w^3(Qwv%X6% zOEU*cxV%U*EAP$_IHf$YUh?r|HJ{BoNk{YsP--cmk;)FfnHL~MNfRp*9U-`IZbp&Z zW*+sswuCQ{N9z;Be^`F;S}3n=9g>r7%eVA+aSg@=cO?#Il1-^<^yAmW#;gRJK>nn& zjBP?rF}pc{D0B)lq3tNnc<=GF(EOm+e(KerGqtr1!zUK z0jh&0)*zl;t>QoI?i=dGUOG#rwzDq>hiET-WZFn;-b`G~dm7o*9r_NTrdZLmiQqSV%1!XdhZ4@Cv~vXxDED;_t27dI9Oi{v|cUGb6mC%H_w zYAx)k!P3%A@lIfxtCMf3`i=d=zS9b3Mld{5rT&H}4-F^F4ytRz#e#eRInH$GKm=^f0VR)ueN0I6p+fv@NnV-V>fp4GeAYK1S5i*&k{%|6O_Xv|W#>+^&mYNPN# zL6?_l@w6;?Zg}Lj7#HiZ7gzSX;y5j*^o!7pt>Dw?CTlU2Vu!V>>TavG^+=pz9HzzT z9bHjwo3;6`qF_Cs(?OT|LoCXkn4i=P!P?4JF(Gi$VFq_7nS^EfWx1|33M2g@&@9g- z|0xH9AOrKJW<|N5E-E?MV{^SS+~~@?Q<3i=N3Hk5TKY^IB9$gF29x_5`GtMr5;M$^ z^uziZkLB_PrSTwf?hx|h8rN6~S`QeLRIQa<7woU9>=ZEclT_Uawkzw&!+qME3gVD|U4Dw4ApGqtg@t2K?pXP;oLQ}fv z>B$*Bm^}qmv%UF5{si5MsPr{{u?{QDS}H6yCxV^6j&-8kcrJ8?#yj4qA(RnMTNBA5 zp|JUmen2O+Jne7pL~S!8G!zd7g)g!G5Cx%$)ll?+kM&J>Y+j|Sa3{|%wr6$tGE#!S zA|I?bnAJLYS#pf!AfK$KR5vGqyn3H?BGJ}KWFA#yM|ok~v6_Pe@d+Hn!PXr5z|4=? zVP&JDRML9Ln;>28C_N7ZDF48@|AzM@+l5S^ z5gnn+tw*TC54MKkZVe8b7;jaf8WI6c`Cs445Q=g>No0C%N2 zx)KA}OP-Tw<5O`(Kf3pmJ^9FhruA5hUX2% ztWd=)vl!;FvCttt+|r`5??&7x0yQAHNO{y9j1eHn6hlKzq^?YS$6CUoXHi56cp;@>YY)vla`^ z1!$G#;3vz4-{HX@A#?|Et10MPWxznngI9?#w!Y#>KZ0WNIJRyVj_D>ah?Zkn`Ts8) zF#F#QD)BzhzK(&yb@C@2?b=V`(*x8IBD|&_c%=yS$N^H66SMUg@WNsR4;Wlov8|c# zcLsdT1kRENOS+%`PmgCrex4P*;RtK00FG8!aG1)24OA6N70kHHqXSVM-zx$_RTeDi zPzO+cvYA3)D1F4*pM!UI8yuwzIKJo5&pL{2JO(P*etsC+dj#8h6#SnPAR(N>eBu=L z^8$|I4bZ9{;Qf9LqSO~`{SUla0AwmRXjcWWzH(S^Wo$=%=t^6F64f5;yOub15oTFK zP{eBCXBEK^D+Kyi4(vgMjwb$Oh^66pJj1&k;g2R#|D&EoNMIZf3oNY2qTvyt(=m*}BOEjrj&9^{fHwYb ziEz&ZR2BaB$Hem^6tVv?#3Ed^l%M++`JVUZwnfNy@37`i_*v4==SJ2Q*>eR)Q5D_` z^}(zV=AA< zPC&(IvAoE8Yb2JE;5LxjiFe6$5c$iPZQ;sXU{+;|h3Dvbo|PZVbES>6oKVps#t5yF zmR%Rk66~OG75NKOC0*PNu6BTJhEl1I`N*7Rq5p?1o`<#W2SIBGH*t1P1LNZ(6xX+f zy22cALN;T2{nlbOn0;hpa4p?{XFdUW@e;U}op2-<;P|x{_9ADl0Bs5`W=%Q|-NhYz zI@@Knw`N-zz{zTl^qv&4sYInZ^osD1Ini-lXb!ZJn1>9a>7_rBXWUi{k>0{NDCFx~ zyO5@^3e=|b&>cq0dC;GJz&Bbq;ZiJQG%|Zz7g#o2rT;)hGLhs)Pv8;D15fE6Ryr09 z3fW>DbCaeM>(f$Tm6u`Pz+^uHeeW~#ofVC=B?8LJ3Q%vZk@7+mKVf}9hds?I2{(T} zaEH<(-}pRvD6B#MyabyIie;GlpxU)Trx}kC`3?RW9L$B_{NzB5cO+Z{HK0{njHHbY zn7dy%{S1I0|E%=1r`S~fW1*eD$ zcd{U^1(|ss-WA&W?R=j=$u>Fx%FlV?J)BKF_$uaPTiAB^FXup+ED5DRb@h_wG&@-H z8tx*`K~G8He}Pl^1lOK>AdVIWNu?ZKtuoJu@qmu?PXrUG6=^JRywVbDxMf<6cw3hWFzIG81FiRSw@{mBY zA?vIj&dk=>wp_T2H|J0QLzOm_e8pCM;)I`K&oIM2%BKot$qAu234jH<3H|flthQCf zB34Em*#$U1z8Ja9z7|8jVLjOLm7v&bD(4W#fmZjxa-eEhlznDLg?`A)3QLXU!k}R6 zL6xmManV*#BTNE$XD|I7dam)fFXb27;Jw(4D(?V{2(IE-csRAv8GmanLyrPJ|0w@- z-&OCfw7>nO!uPZie2|jrxZz^%RQEe)88wMs=C!QPMnB^j)Xy7*ZsZ7*Mj8~ilcf*x zJT-{4gVDChwuZ_8u`xNu|3$T3v@SvwxEJL6yl^_lf%nyqPeEO|x4sN(?B(s4;z-$= zI5+-nT*~*WNza1MwT;Azj?U!FxH#j1jFUazFmLQ@ZqX`+`i0jT!&z7I4F0iVVsY7! zc8P`>c2#k|ay^LJ9Q~W)tQbSfaHl?0lZ@788&`fwhzG1tfhX{@|b87s$t9Dg5b zjPYg_y}Lpz76{L;Y0Ng>eotvB1rVUoqk5%GP%cRoscCV-FBsrc^kaD z1%cebbJ|w+TG&eLWDn0nCesmQjXckN+_TeTk6j_YmWnaCI5}!;p33?9W@(wJ zaE8ow(}X`Q)HC!bm`A_Qe#e+0%zLrN))jtHcu!r9L{HP0Rx!EL&5k~)CJ0&BJEK>) zr#6edM2{m;T8^}p`ABy8j{DIrTtQo~Z05hni=3If=|{aE&A%LZx8Xz6kHvnt!li_& z%H2#)@_Msf$XG7ZmgubF2;(>eyzU1GaYbl8_F$Tz$=p!e;2Ls>-+I=~7F2L)e26+6nk~8X>jsS8I1T z#(O8>&W{Y=n|!+VvEi3{UrMI_hA!eO+o-Hxb3~7UM9%FH^Ra#(^UKwO z0R~-j5O+Qqjp6+mrpi$*qW4BWj%gJ=UhP5MbOnE9*jO!eK(k1(@=JM#n4Nfp)fjig zfoeHhsLgko|AiK$#w2u(OZ!&p)2q+1UweJ;>(79ze0JCKY-yRf=YH(@n2>B)71$eg z+Pq>u;FB;fa4^g02$$vyeXsc&?PCwR+C;VT?DiaWmXnLX^C0kF*g?`775R!_o>i5f z(Dm?PP;^KrfzJbJwz~dXAecNQzE9l!Z!ru=j&9^z6OWmQUCGPZg3ofr$v;pQad8EBc z7UhoAT;3pcBY7~En2M2Z0pS|X&Mww;ZMQ!)xmv=8_>15F{@Uut?eDJ==V-gxMWK0A z%S`({mt3_x?_KE6qLy};Mu9MW9bUpec{UvDJz69EERLxrQil)fz^m@U?n_D>Jtq~F z9tdUW7p0*sr;;X3mgB@{=)PUxR|ON-&ig!peKvZ8DyJ< zqS9mWh13(oxP9_Mo1ylS4@;{+ZhVZ{UJMx5moZ|Wz;~N}fKYQWX=_6J#GG-9zt@c~ z7N0RCA^gC!33Xk8m{-n`j&f0wBZ(BDh2>39P8^e(EA^z`p@MUmuk@+N?rF=nN{^uV zeQ3Muh_;8tX~?*qAVrJik?r}yHc-*wW{nYVgOC>%yr87zLj|;WB>TdDC^u ztDc~W?vnN*Z*#l680zj5AmH7V{)MOWk$l1Cu-ldX(rc-lRG7XY9{4vUYC-#2%;+BS zr&UZEm82vWh>wb|mQXlxKw4CYYAyLwC~1i@&(_v4PmUL>L6bFCJ)pi(v#HJGZ|GA? zY!CW~lXx`s$%~XLICE<&C&h;7QhMa;QXzS|I@Oj-y(G7mk4hWhYwa%fgu8Sj$qkoP zT6m*Bd&VOg^8QJO-FS5|Fcd!UX$r{f=` zyVyxsiFravd?q}!qug3KhL=iyj^j~^TgVCT?WqKIB_RZO1x4*#X#a?TW}e7i$}4ie}gbz z49=j-=3CtrF6?jOz2F_0Ry(z6%7v6U-d_WCgDo^4n*kMYCgBa;0xl_(=u)D55m{fe zl!D;MOa@n?EIhQW#QEYoDM|W6%msIGGwLP-NHNgir(gpzlOydp55?yig*?km_(Y z{sM3H6jXXP;u)xk3p3G+s)aFhEujpmW;OU4;UKCzouT<&fX|oLi((`` zisd4c*fKC_6;u*pz(j_J3pDWn&bPv3JX8fS&<15CiF`49bOUHZUWFFH_Q#<cxK{8!hxAEC(E}mB<(CfRLXDF@F7FT_Cruhe9-br?prJ z32{UCSTdU}B02d-WT55{8!;1^gX4uN{UK;Nwva!qg0vk{i<_WQR*9roJH$LzXS#=%;$f2A>L)IvbJY-Cz-J#n262Bap=kTCcdPPoYFXT(;6^vyaMH`Dpg}MW@ju|XQ zHnZbot>wmN^enuohBZgZZ;TX&3;R)h zYlND_M|?ICpjs-$?+eRNZO$xB1n=aIo=43YmgE4xW7d=o>ON&vxVD(a=VMfw3di9( zz6V#3;Z|cdNpf4$z#8|$_uNfbi&?)Hoz_C{PL|=?u^7blO7dd; zygUNx%!Op6l}>zOCWx}RANrnERun4wr-fb6Bl+M^@?&myk6$vslWGEE*>PX+ZlfQ2 z8332(=%4o%a?teFJk%5yV7&Q|wB@x>Db8t5m8L|NwSC8V zb(S2!6=8*WNLXlzxOR6jH_;B@koF;WSfXIzGk;S!Znh(>=q-$(pIi6Q<88v4&_toN z83XmgbgHp!@LexA`idXTEwmh&&->7Q2q&_gJU3ffU@U3PdOCZIlb zgQw$1(FGc3?!_D^$r?{evYLXEH?`*T3FZ@_0r?%AG0mLITL`&GP2sF{kUxj7dIcN- zw}tK4>sCS{DMzb7>E;!Xh)s$3gXhPLIVcQ;&gO4&9Cg3V7=y0B-Cz-vaYxV*$Zg{G zV^w4wtv`+Tx?3k83D-4-o4a(s+1Ch}dBIw5igdfDY!1i@8$>VNPUkBt;3ZgKJFQf- z?N**Cwd@ydgVf^k3DJiH*;`_7;=)X747&>A;07>SI|Vxh#{{y2nX%9}#@oc_3MB>` z1X=}?f=9J3ASAD{nz9H*{RinLU$w2V{bjprFYjCdpTZsIbmtzZPCB>;J7+nj+y4Wb zYl56b3W|4lCesO~Z$YH2*AMRX{q0Nj{hDT^9rq3M7EB$TTHN?MYmZ!O{KWKpnZb;j8@@3xVw)Sm(2d4p!T&I8t*~3S?EhjE9>7Hs2(`t>zF*@$8KM1 zwR7ebnqhFZD!JNb+UneEc~X{t-}J+iTFWRR z)>m^ln?+~vtaUwcHL$&rJJT9^j&Mo%I&WBgX(OeSqpj} zt&-95r^DXv{MB{X)!cDfoh+ZDr_FVtgMl-_!Nz|=nw-sk+HuQ1KrJAbr1Qbn%Pi#K z!{O>W!kds|;sCIGs)`~lAb41Rs}Szwy=YExE^1jd*$iWRxLM#{8cX{n*f+dR%N!mX zeCtX^k)*=fZP77`?F(02+Yvg{cu%(Hs zq0v5T73UvW6QM71mG6riMK1o34vP;7=QFK2aH-@J3X84fV{!+~;0_7Zt($t+a612Y zZ;?FBub<9;QYiY@tIT4YW?XAwWNI? z{H_m?`nyI6DK2@MFviG;Yu%#o6|*i8l`r-Wj(2Kx=`fVt8`)pX&*B6XPN{3+S#gE5 zTAC?dM`B7@w#T~2_VS^$qTEcWp~T_JH%#<0_x z5!6G|jjODoxJ6C0x3GPON`EeTOF6g$vz%R|Ik-u4X)#a&7-(=+gy}en=b%`BEhLE< zko|o|zAi@76rLOW?>1U;xOuoq=t8J(=&Jq&iEvxO)uBi&k+vvhQc{%fjr2NZNyd-q zdbwLm&9oM&4U%emUB-L*w{iz5!fVvUvMObh%PZTIARWc7;vG1n-7!Y-nqnFCFjR_@ z#O6BV7ve(l8+s{?1RLo<^GFM& zkz#SW69nN(NR5w17bphqvr6djb)@f5ms%l?5w9RMVh%UJ!MbbJvGSRI{itr}$Mulb zHvB2HJzPJu)W0&VLu&i9ZmEw0sp3cXu$YC>SsVe{PfzhxfFimO+aNxL`>H2COWUam zzeg_Rl#)+wO-xHO0!A+IZgS8Rsh7M&{158uAyAn$B{S%Fq?p&1X3}V+qIE?|Ljbis zHz=$VNlo&NB+vz76)6j9XfsF=B;-_PcdT4csemYH)G=ll`}Eo1O~q>VaI;`+V7Tvn zT77SOZ#KV+cX8ZzUx*s&NR%$IJfUy?ZNcs4Ecz?1jJe@8i6iZWDs;PaK^dvc6bA^J zRmy4rmewfLly8EGHH_SXhT#T(BIKnEj+=J!0r3se`nqD)e+?;U9^|)Ck^%X~TWDUf zAGFy$X-o9wdZSmij_m^t_ANSabIm4j_l|?dv#VY~D;lm8dI}owLEi%3SpO^Ew{WZ! zcI%|g@Bpa?n(zg@HvzQ-4?4CBX>auU+K`??H*~); z;L#NPogVPl|7KOUQq7|1BRw`tn?;N^I5(Gt-C;-gS~!=+w2dIuY?eQO={bYs;%Cj@ z4aM4l*;FPd;+T*IwZ=E}cQ?~YsQ%4G9i~56TN^Qtj*OtQ&z~9O9bADXB{vv+W1u!!^;3N^ffvJk+F;sDhn!knsv{#tkR{#&8L-2&B%W|(c}hYDgj zUVjf}6WxSrP($R$cYlG-qzAIr3Zk+hBl*Dtg+x9fC;n%LawC8}iKK`{($FF*fJib| zL^%*iE&K9wiToszT=o{4f!FvNNfJxN{`l}U0loZ)@_?gaE@O70qZ$xKUnY`bmj&vG zOsJqZvBp^ZE25jo0gXgPd@uIrk^$eziAO|_;z5#IM62RPPt=JmQ}E74GzXEaG95i` z7y>Y_is&RFsa}x`GYwz8*!IX4C*xoK|5F@9^4%giZh@b_8_`5WbO@1WMDo5&Xcz?S zcO=`5L2n>pyCYd@k!ShwjQ^J_r{W4@Vhuq&BF~JhKcdk{#`+`sivbAqIsyDYqHgeE zT_%=@>LHRb7tyZ#PbtCi%8@*>H2fX;Eg5T!>{&!nA)t2T#8oz;<{;RHNCKP<`ya`y zv*CG>L^)W7e*P=6{_xMOiKLiCR2LlU`(IXDWY7Pn(g^%KLJ<{7MEyhX+mYu)R3ZP{ zcN4D?{P`*xwvb?JB3hM5x?1GbBS$-uk``GauNO(Pi);b@`gsH_d?&J%|63xjA6X(t aGxEMi-j&GjMe^h#&-{P7k;pnV{{I2`)twRm diff --git a/paddlespeech/server/tests/tts/test_client.py b/paddlespeech/server/tests/tts/test_client.py index 71fb36d977f..65f4ccfece1 100644 --- a/paddlespeech/server/tests/tts/test_client.py +++ b/paddlespeech/server/tests/tts/test_client.py @@ -23,14 +23,7 @@ import requests import soundfile - -def wav2pcm(wavfile: str, pcmfile: str, data_type=np.int16): - with open(wavfile, "rb") as f: - f.seek(0) - f.read(44) - data = np.fromfile(f, dtype=data_type) - data.tofile(pcmfile) - +from paddlespeech.server.utils.audio_process import wav2pcm # Request and response def tts_client(args): diff --git a/paddlespeech/server/speechserving/utils/__init__.py b/paddlespeech/server/utils/__init__.py similarity index 100% rename from paddlespeech/server/speechserving/utils/__init__.py rename to paddlespeech/server/utils/__init__.py diff --git a/paddlespeech/server/speechserving/utils/audio_process.py b/paddlespeech/server/utils/audio_process.py similarity index 100% rename from paddlespeech/server/speechserving/utils/audio_process.py rename to paddlespeech/server/utils/audio_process.py diff --git a/paddlespeech/server/speechserving/utils/config.py b/paddlespeech/server/utils/config.py similarity index 100% rename from paddlespeech/server/speechserving/utils/config.py rename to paddlespeech/server/utils/config.py diff --git a/paddlespeech/server/speechserving/utils/errors.py b/paddlespeech/server/utils/errors.py similarity index 100% rename from paddlespeech/server/speechserving/utils/errors.py rename to paddlespeech/server/utils/errors.py diff --git a/paddlespeech/server/speechserving/utils/exception.py b/paddlespeech/server/utils/exception.py similarity index 94% rename from paddlespeech/server/speechserving/utils/exception.py rename to paddlespeech/server/utils/exception.py index 03a6deee2b6..58ea777ca52 100644 --- a/paddlespeech/server/speechserving/utils/exception.py +++ b/paddlespeech/server/utils/exception.py @@ -13,7 +13,7 @@ # limitations under the License. import traceback -from utils.errors import ErrorMsg +from paddlespeech.server.utils.errors import ErrorMsg class ServerBaseException(Exception): diff --git a/paddlespeech/server/speechserving/utils/log.py b/paddlespeech/server/utils/log.py similarity index 100% rename from paddlespeech/server/speechserving/utils/log.py rename to paddlespeech/server/utils/log.py diff --git a/paddlespeech/server/speechserving/utils/paddle_predictor.py b/paddlespeech/server/utils/paddle_predictor.py similarity index 100% rename from paddlespeech/server/speechserving/utils/paddle_predictor.py rename to paddlespeech/server/utils/paddle_predictor.py diff --git a/paddlespeech/server/speechserving/utils/util.py b/paddlespeech/server/utils/util.py similarity index 100% rename from paddlespeech/server/speechserving/utils/util.py rename to paddlespeech/server/utils/util.py