From b72a9d9c08312972475db61b857308c7fbbc0a75 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Thu, 27 Jun 2019 21:59:02 +0530 Subject: [PATCH 01/11] initial commit for refactor --- MANIFEST.in | 5 - README.md | 135 ---- deepaffects/__init__.py | 36 - deepaffects/api_client.py | 621 ------------------ deepaffects/apis/__init__.py | 9 - deepaffects/apis/denoise_api.py | 248 ------- deepaffects/apis/diarize_api.py | 249 ------- deepaffects/apis/diarize_api_v2.py | 145 ---- deepaffects/apis/ellipsis_api.py | 249 ------- deepaffects/apis/emotion_api.py | 253 ------- deepaffects/apis/featurize_api.py | 250 ------- deepaffects/configuration.py | 220 ------- deepaffects/models/__init__.py | 22 - deepaffects/models/async_response.py | 150 ----- deepaffects/models/audio.py | 222 ------- deepaffects/models/audio_features.py | 169 ----- deepaffects/models/diarize_audio.py | 311 --------- deepaffects/models/diarize_segment.py | 167 ----- deepaffects/models/emotion_score.py | 144 ---- deepaffects/realtime/__init__.py | 0 deepaffects/realtime/api.py | 58 -- .../realtime/deepaffects_realtime_pb2.py | 405 ------------ .../realtime/deepaffects_realtime_pb2_grpc.py | 83 --- deepaffects/realtime/types.py | 25 - deepaffects/realtime/util.py | 200 ------ deepaffects/rest.py | 297 --------- docs/AsyncResponse.md | 11 - docs/Audio.md | 13 - docs/DenoiseApi.md | 113 ---- docs/DiarizeApi.md | 114 ---- docs/DiarizeApiV2.md | 60 -- docs/DiarizeAudio.md | 14 - docs/EllipsisApi.md | 59 -- docs/EmotionApi.md | 116 ---- docs/EmotionScore.md | 16 - docs/FeaturizeApi.md | 116 ---- examples/diarize_emotion_example.py | 67 -- examples/emotion_identify_example.py | 62 -- examples/playlist_chunk_generator.py | 53 -- examples/speaker_identify_example.py | 51 -- ...cker_based_earnings_call_identification.py | 54 -- requirements.txt | 12 - setup.py | 40 -- test-requirements.txt | 5 - test/__init__.py | 0 test/data/clean.wav | Bin 107066 -> 0 bytes test/data/happy.mp3 | Bin 46437 -> 0 bytes test/data/noisy.wav | Bin 107066 -> 0 bytes test/data/reconstructed.wav | Bin 105274 -> 0 bytes test/test_async_response.py | 40 -- test/test_audio.py | 40 -- test/test_base_setup.py | 28 - test/test_denoise_api.py | 53 -- test/test_diarize_api.py | 40 -- test/test_diarize_api_v2.py | 49 -- test/test_diarize_audio.py | 40 -- test/test_emotion_api.py | 59 -- test/test_emotion_score.py | 40 -- test/test_featurize_api.py | 42 -- 59 files changed, 6080 deletions(-) delete mode 100644 MANIFEST.in delete mode 100644 README.md delete mode 100644 deepaffects/__init__.py delete mode 100644 deepaffects/api_client.py delete mode 100644 deepaffects/apis/__init__.py delete mode 100644 deepaffects/apis/denoise_api.py delete mode 100644 deepaffects/apis/diarize_api.py delete mode 100644 deepaffects/apis/diarize_api_v2.py delete mode 100644 deepaffects/apis/ellipsis_api.py delete mode 100644 deepaffects/apis/emotion_api.py delete mode 100644 deepaffects/apis/featurize_api.py delete mode 100644 deepaffects/configuration.py delete mode 100644 deepaffects/models/__init__.py delete mode 100644 deepaffects/models/async_response.py delete mode 100644 deepaffects/models/audio.py delete mode 100644 deepaffects/models/audio_features.py delete mode 100644 deepaffects/models/diarize_audio.py delete mode 100644 deepaffects/models/diarize_segment.py delete mode 100644 deepaffects/models/emotion_score.py delete mode 100644 deepaffects/realtime/__init__.py delete mode 100644 deepaffects/realtime/api.py delete mode 100644 deepaffects/realtime/deepaffects_realtime_pb2.py delete mode 100644 deepaffects/realtime/deepaffects_realtime_pb2_grpc.py delete mode 100644 deepaffects/realtime/types.py delete mode 100644 deepaffects/realtime/util.py delete mode 100644 deepaffects/rest.py delete mode 100644 docs/AsyncResponse.md delete mode 100644 docs/Audio.md delete mode 100644 docs/DenoiseApi.md delete mode 100644 docs/DiarizeApi.md delete mode 100644 docs/DiarizeApiV2.md delete mode 100644 docs/DiarizeAudio.md delete mode 100644 docs/EllipsisApi.md delete mode 100644 docs/EmotionApi.md delete mode 100644 docs/EmotionScore.md delete mode 100644 docs/FeaturizeApi.md delete mode 100644 examples/diarize_emotion_example.py delete mode 100644 examples/emotion_identify_example.py delete mode 100644 examples/playlist_chunk_generator.py delete mode 100644 examples/speaker_identify_example.py delete mode 100644 examples/ticker_based_earnings_call_identification.py delete mode 100644 requirements.txt delete mode 100644 setup.py delete mode 100644 test-requirements.txt delete mode 100644 test/__init__.py delete mode 100644 test/data/clean.wav delete mode 100644 test/data/happy.mp3 delete mode 100644 test/data/noisy.wav delete mode 100644 test/data/reconstructed.wav delete mode 100644 test/test_async_response.py delete mode 100644 test/test_audio.py delete mode 100644 test/test_base_setup.py delete mode 100644 test/test_denoise_api.py delete mode 100644 test/test_diarize_api.py delete mode 100644 test/test_diarize_api_v2.py delete mode 100644 test/test_diarize_audio.py delete mode 100644 test/test_emotion_api.py delete mode 100644 test/test_emotion_score.py delete mode 100644 test/test_featurize_api.py diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 07e9f0a..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,5 +0,0 @@ -include README.md -include LICENSE -include docs/*.md -include test/data/*.wav -include test/data/*.mp3 diff --git a/README.md b/README.md deleted file mode 100644 index f04fe88..0000000 --- a/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# deepaffects-python - -[![Build Status](https://travis-ci.org/SEERNET/deepaffects-python.svg?branch=master)](https://travis-ci.org/SEERNET/deepaffects-python) -[![PyPI version](https://badge.fury.io/py/deepaffects.svg)](https://badge.fury.io/py/deepaffects) - -Python client library for DeepAffects APIs - -## Requirements. - -Python 2.7 and 3.3+ - -pymediainfo >= 2.1.9, this is a wrapper library around [mediainfo](https://mediaarea.net/en/MediaInfo), which we use to -extract the sampling rate and codec information from audio files. - -## Installation - -### pip install - -The python package can be installed directly from pip using: - -```bash -pip install deepaffects - -``` -### pip install from github - -The python package is hosted on Github, you can install directly from Github - -```sh -pip install git+https://github.com/SEERNET/deepaffects-python.git -``` -(you may need to run `pip` with root permission: `sudo pip install git+https://github.com/SEERNET/deepaffects-python.git`) - -Then import the package: -```python -import deepaffects -``` - -### Setuptools - -Install via [Setuptools](http://pypi.python.org/pypi/setuptools). - -```sh -python setup.py install --user -``` -(or `sudo python setup.py install` to install the package for all users) - -Then import the package: -```python -import deepaffects -``` - -## Documentation for Authorization - -DeepAffects API authenticates all the api requests via API Key. - -For API key registration and setup, checkout our [quickstart guide](https://developers.deepaffects.com/docs/#quickstart-guide) - -### UserSecurity - -- **Type**: API key -- **API key parameter name**: apikey -- **Location**: URL query string - - -## Getting Started - -Please follow the [installation](#installation) instruction and execute the following python code: - - -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' -# create an instance of the API class -api_instance = deepaffects.DenoiseApi() -body = deepaffects.Audio.from_file('/path/to/file') # Audio | Audio object that needs to be denoised. -webhook = 'webhook_example' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # Denoise an audio file - api_response = api_instance.async_denoise_audio(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling DenoiseApi->async_denoise_audio: %s\n" % e) - -``` - -## Documentation for API Endpoints - -All URIs are relative to *https://localhost* - -Class | Method | HTTP request | Description ------------------ | --------------------------------------- | ------------- | ------------- -*DenoiseApi* | [async_denoise_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DenoiseApi.md#async_denoise_audio) | **POST** /api/v1/async/denoise | Denoise an audio file -*DenoiseApi* | [sync_denoise_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DenoiseApi.md#sync_denoise_audio) | **POST** /api/v1/sync/denoise | Denoise an audio file -*DiarizeApiV2* | [async_diarize_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DiarizeApiV2.md#async_diarize_audio) | **POST** /api/v2/async/diarize | Diarize an audio file -*DiarizeApi* | [async_diarize_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DiarizeApi.md#async_diarize_audio) | **POST** /api/v1/async/diarize | Diarize an audio file (Legacy) -*DiarizeApi* | [sync_diarize_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DiarizeApi.md#sync_diarize_audio) | **POST** /api/v1/sync/diarize | Diarize an audio file (Legacy) -*EmotionApi* | [async_recognise_emotion](https://github.com/SEERNET/deepaffects-python/blob/master/docs/EmotionApi.md#async_recognise_emotion) | **POST** /api/v1/async/recognise_emotion | Find emotion in an audio file -*EmotionApi* | [sync_recognise_emotion](https://github.com/SEERNET/deepaffects-python/blob/master/docs/EmotionApi.md#sync_recognise_emotion) | **POST** /api/v1/sync/recognise_emotion | Find emotion in an audio file -*FeaturizeApi* | [async_featurize_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/FeaturizeApi.md#async_featurize_audio) | **POST** /api/v1/async/featurize | featurize an audio file -*FeaturizeApi* | [sync_featurize_audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/FeaturizeApi.md#sync_featurize_audio) | **POST** /api/v1/sync/featurize | featurize an audio file - - -## Documentation For Models - - - [AsyncResponse](https://github.com/SEERNET/deepaffects-python/blob/master/docs/AsyncResponse.md) - - [Audio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/Audio.md) - - [DiarizeAudio](https://github.com/SEERNET/deepaffects-python/blob/master/docs/DiarizeAudio.md) - - [EmotionScore](https://github.com/SEERNET/deepaffects-python/blob/master/docs/EmotionScore.md) - - - - -## UserSecurity - -- **Type**: API key -- **API key parameter name**: apikey -- **Location**: URL query string - - -## About -[DeepAffects](https://www.deepaffects.com/dashboard) is an emotional intelligence analysis engine that measures the effect emotional intelligence -has on team dynamics, and provides emotional analytics that serve as the basis of insights to improve -project management, performance and satisfaction across organizations, projects, and teams. To watch DeepAffects in action: check out DeepAffects [Atlassian JIRA addon](https://marketplace.atlassian.com/plugins/com.deepaffects.teams.jira/cloud/overview) and our [Github addon](https://teams.deepaffects.com/). - - - diff --git a/deepaffects/__init__.py b/deepaffects/__init__.py deleted file mode 100644 index 87e529b..0000000 --- a/deepaffects/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: 0.1.0 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -# import models into sdk package -from .models.async_response import AsyncResponse -from .models.audio import Audio -from .models.diarize_audio import DiarizeAudio -from .models.emotion_score import EmotionScore -from .models.diarize_segment import DiarizeSegment - -# import apis into sdk package -from .apis.denoise_api import DenoiseApi -from .apis.diarize_api import DiarizeApi -from .apis.emotion_api import EmotionApi -from .apis.featurize_api import FeaturizeApi -from .apis.ellipsis_api import EllipsisAPI -from .apis.diarize_api_v2 import DiarizeApiV2 - -# import ApiClient -from .api_client import ApiClient - -from .configuration import Configuration - -configuration = Configuration() diff --git a/deepaffects/api_client.py b/deepaffects/api_client.py deleted file mode 100644 index 479c7f4..0000000 --- a/deepaffects/api_client.py +++ /dev/null @@ -1,621 +0,0 @@ -# coding: utf-8 -""" - DeepAffects - - OpenAPI spec version: v1 -""" - -from __future__ import absolute_import - -import os -import re -import json -import mimetypes -import tempfile -import threading - -from datetime import date, datetime - -# python 2 and python 3 compatibility library -from six import PY3, integer_types, iteritems, text_type -from six.moves.urllib.parse import quote - -from . import models -from .configuration import Configuration -from .rest import ApiException, RESTClientObject - - -class ApiClient(object): - """ - Generic API client for Swagger client library builds. - - Swagger generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the Swagger - templates. - - :param host: The base path for the server to call. - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to the API. - """ - - PRIMITIVE_TYPES = (float, bool, bytes, text_type) + integer_types - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int if PY3 else long, - 'float': float, - 'str': str, - 'bool': bool, - 'date': date, - 'datetime': datetime, - 'object': object, - } - - def __init__(self, host=None, header_name=None, header_value=None, cookie=None): - """ - Constructor of the class. - """ - self.rest_client = RESTClientObject() - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - if host is None: - self.host = Configuration().host - else: - self.host = host - self.cookie = cookie - # Set default User-Agent. - self.user_agent = 'Swagger-Codegen/1.0.0/python' - - @property - def user_agent(self): - """ - Gets user agent. - """ - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - """ - Sets user agent. - """ - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - self.default_headers[header_name] = header_value - - def __call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_type=None, auth_settings=None, callback=None, - _return_http_data_only=None, collection_formats=None, _preload_content=True, - _request_timeout=None): - - # header parameters - header_params = header_params or {} - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) - for k, v in path_params: - resource_path = resource_path.replace( - '{%s}' % k, quote(str(v), safe='')) # no safe chars, encode everything - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - - # post parameters - if post_params or files: - post_params = self.prepare_post_parameters(post_params, files) - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - - # auth setting - self.update_params_for_auth(header_params, query_params, auth_settings) - - # body - if body: - body = self.sanitize_for_serialization(body) - - # request url - url = self.host + resource_path - - # perform request and return response - response_data = self.request(method, url, - query_params=query_params, - headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout) - - self.last_response = response_data - - return_data = response_data - if _preload_content: - # deserialize response data - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None - - if callback: - if _return_http_data_only: - callback(return_data) - else: - callback((return_data, response_data.status, response_data.getheaders())) - elif _return_http_data_only: - return (return_data) - else: - return (return_data, response_data.status, response_data.getheaders()) - - def sanitize_for_serialization(self, obj): - """ - Builds a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is swagger model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime, date)): - return obj.isoformat() - - if isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `swagger_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in iteritems(obj.swagger_types) - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in iteritems(obj_dict)} - - def deserialize(self, response, response_type): - """ - Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - # handle file downloading - # save response body into a tmp file and return the instance - if response_type == "file": - return self.__deserialize_file(response) - - # fetch data from response object - try: - data = json.loads(response.data) - except ValueError: - data = response.data - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """ - Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match('list\[(.*)\]', klass).group(1) - return [self.__deserialize(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match('dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.__deserialize(v, sub_kls) - for k, v in iteritems(data)} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(models, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == date: - return self.__deserialize_date(data) - elif klass == datetime: - return self.__deserialize_datatime(data) - else: - return self.__deserialize_model(data, klass) - - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_type=None, auth_settings=None, callback=None, - _return_http_data_only=None, collection_formats=None, _preload_content=True, - _request_timeout=None): - """ - Makes the HTTP request (synchronous) and return the deserialized data. - To make an async request, define a function for callback. - - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param callback function: Callback function for asynchronous request. - If provide this parameter, - the request will be called asynchronously. - :param _return_http_data_only: response data without head status code and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will be returned without - reading/decoding response data. Default is True. - :param _request_timeout: timeout setting for this request. If one number provided, it will be total request - timeout. It can also be a pair (tuple) of (connection, read) timeouts. - :return: - If provide parameter callback, - the request will be called asynchronously. - The method will return the request thread. - If parameter callback is None, - then the method will return the response directly. - """ - if callback is None: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_type, auth_settings, callback, - _return_http_data_only, collection_formats, _preload_content, _request_timeout) - else: - thread = threading.Thread(target=self.__call_api, - args=(resource_path, method, - path_params, query_params, - header_params, body, - post_params, files, - response_type, auth_settings, - callback, _return_http_data_only, - collection_formats, _preload_content, _request_timeout)) - thread.start() - return thread - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, _request_timeout=None): - """ - Makes the HTTP request using RESTClient. - """ - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - else: - raise ValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) - - def parameters_to_tuples(self, params, collection_formats): - """ - Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in iteritems(params) if isinstance(params, dict) else params: - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def prepare_post_parameters(self, post_params=None, files=None): - """ - Builds form parameters. - - :param post_params: Normal form parameters. - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if post_params: - params = post_params - - if files: - for k, v in iteritems(files): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = mimetypes.\ - guess_type(filename)[0] or 'application/octet-stream' - params.append(tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts): - """ - Returns `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return - - accepts = [x.lower() for x in accepts] - - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) - - def select_header_content_type(self, content_types): - """ - Returns `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] - - def update_params_for_auth(self, headers, querys, auth_settings): - """ - Updates header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - """ - config = Configuration() - - if not auth_settings: - return - - for auth in auth_settings: - auth_setting = config.auth_settings().get(auth) - if auth_setting: - if not auth_setting['value']: - continue - elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) - else: - raise ValueError( - 'Authentication token must be in `query` or `header`' - ) - - def __deserialize_file(self, response): - """ - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - :param response: RESTResponse. - :return: file path. - """ - config = Configuration() - - fd, path = tempfile.mkstemp(dir=config.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - filename = re.\ - search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition).\ - group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "w") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """ - Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return unicode(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """ - Return a original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """ - Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - from dateutil.parser import parse - return parse(string).date() - except ImportError: - return string - except ValueError: - raise ApiException( - status=0, - reason="Failed to parse `{0}` into a date object".format(string) - ) - - def __deserialize_datatime(self, string): - """ - Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - from dateutil.parser import parse - return parse(string) - except ImportError: - return string - except ValueError: - raise ApiException( - status=0, - reason=( - "Failed to parse `{0}` into a datetime object" - .format(string) - ) - ) - - def __deserialize_model(self, data, klass): - """ - Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - instance = klass() - - if not instance.swagger_types: - return data - - for attr, attr_type in iteritems(instance.swagger_types): - if data is not None \ - and instance.attribute_map[attr] in data \ - and isinstance(data, (list, dict)): - value = data[instance.attribute_map[attr]] - setattr(instance, attr, self.__deserialize(value, attr_type)) - - return instance diff --git a/deepaffects/apis/__init__.py b/deepaffects/apis/__init__.py deleted file mode 100644 index cbd0dfc..0000000 --- a/deepaffects/apis/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import absolute_import - -# import apis into api package -from .denoise_api import DenoiseApi -from .diarize_api import DiarizeApi -from .emotion_api import EmotionApi -from .featurize_api import FeaturizeApi -from .ellipsis_api import EllipsisAPI -from .diarize_api_v2 import DiarizeApiV2 diff --git a/deepaffects/apis/denoise_api.py b/deepaffects/apis/denoise_api.py deleted file mode 100644 index 6199e1e..0000000 --- a/deepaffects/apis/denoise_api.py +++ /dev/null @@ -1,248 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class DenoiseApi(object): - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_denoise_audio(self, body, webhook, **kwargs): - """ - Denoise an audio file asynchronously - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_denoise_audio(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be denoised. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_denoise_audio_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_denoise_audio_with_http_info(body, webhook, **kwargs) - return data - - def async_denoise_audio_with_http_info(self, body, webhook, **kwargs): - """ - Denoise an audio file asynchronously - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_denoise_audio_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be denoised. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_denoise_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_denoise_audio`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_denoise_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/async/denoise'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - - def sync_denoise_audio(self, body, **kwargs): - """ - Denoise an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_denoise_audio(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be denoised. (required) - :return: Audio - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.sync_denoise_audio_with_http_info(body, **kwargs) - else: - (data) = self.sync_denoise_audio_with_http_info(body, **kwargs) - return data - - def sync_denoise_audio_with_http_info(self, body, **kwargs): - """ - Denoise an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_denoise_audio_with_http_info(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be denoised. (required) - :return: Audio - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method sync_denoise_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `sync_denoise_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/sync/denoise'.replace('{format}', 'json') - path_params = {} - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='Audio', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/deepaffects/apis/diarize_api.py b/deepaffects/apis/diarize_api.py deleted file mode 100644 index 4cc5ab4..0000000 --- a/deepaffects/apis/diarize_api.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class DiarizeApi(object): - - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_diarize_audio(self, body, webhook, **kwargs): - """ - Diarize an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_diarize_audio(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_diarize_audio_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_diarize_audio_with_http_info(body, webhook, **kwargs) - return data - - def async_diarize_audio_with_http_info(self, body, webhook, **kwargs): - """ - Diarize an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_diarize_audio_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_diarize_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_diarize_audio`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_diarize_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/async/diarize'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - - def sync_diarize_audio(self, body, **kwargs): - """ - Diarize an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_diarize_audio(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :return: list[Audio] - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.sync_diarize_audio_with_http_info(body, **kwargs) - else: - (data) = self.sync_diarize_audio_with_http_info(body, **kwargs) - return data - - def sync_diarize_audio_with_http_info(self, body, **kwargs): - """ - Diarize an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_diarize_audio_with_http_info(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :return: list[Audio] - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method sync_diarize_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `sync_diarize_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/sync/diarize'.replace('{format}', 'json') - path_params = {} - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='list[Audio]', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/deepaffects/apis/diarize_api_v2.py b/deepaffects/apis/diarize_api_v2.py deleted file mode 100644 index 45bfc31..0000000 --- a/deepaffects/apis/diarize_api_v2.py +++ /dev/null @@ -1,145 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class DiarizeApiV2(object): - - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_diarize_audio(self, body, webhook, **kwargs): - """ - Diarize an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_diarize_audio(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_diarize_audio_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_diarize_audio_with_http_info(body, webhook, **kwargs) - return data - - def async_diarize_audio_with_http_info(self, body, webhook, **kwargs): - """ - Diarize an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_diarize_audio_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param DiarizeAudio body: Audio object that needs to be diarized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_diarize_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_diarize_audio`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_diarize_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v2/async/diarize'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - diff --git a/deepaffects/apis/ellipsis_api.py b/deepaffects/apis/ellipsis_api.py deleted file mode 100644 index 378bcff..0000000 --- a/deepaffects/apis/ellipsis_api.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class EllipsisAPI(object): - - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_is_depressed(self, body, webhook, **kwargs): - """ - Detect whether the person in audio clip is depressed - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_is_depressed(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object to predict depression. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_is_depressed_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_is_depressed_with_http_info(body, webhook, **kwargs) - return data - - def async_is_depressed_with_http_info(self, body, webhook, **kwargs): - """ - Detect whether the person in audio clip is depressed - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_is_depressed_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object to predict depression. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_is_depressed" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_is_depressed`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_is_depressed`") - - - collection_formats = {} - - resource_path = '/audio/custom/ellipsis/api/v1/async/is_depressed'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - - def sync_is_depressed(self, body, **kwargs): - """ - Detect whether the person in audio clip is depressed - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_is_depressed(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object to predict depression. (required) - :return: boolean - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.sync_is_depressed_with_http_info(body, **kwargs) - else: - (data) = self.sync_is_depressed_with_http_info(body, **kwargs) - return data - - def sync_is_depressed_with_http_info(self, body, **kwargs): - """ - Detect whether the person in audio clip is depressed - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_is_depressed_with_http_info(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object to predict depression. (required) - :return: boolean - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method sync_is_depressed" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `sync_is_depressed`") - - - collection_formats = {} - - resource_path = '/audio/custom/ellipsis/api/v1/sync/is_depressed'.replace('{format}', 'json') - path_params = {} - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='bool', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/deepaffects/apis/emotion_api.py b/deepaffects/apis/emotion_api.py deleted file mode 100644 index e4fb875..0000000 --- a/deepaffects/apis/emotion_api.py +++ /dev/null @@ -1,253 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class EmotionApi(object): - - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_recognise_emotion(self, body, webhook, **kwargs): - """ - Find emotion in an audio file - Extract emotion from an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_recognise_emotion(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_recognise_emotion_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_recognise_emotion_with_http_info(body, webhook, **kwargs) - return data - - def async_recognise_emotion_with_http_info(self, body, webhook, **kwargs): - """ - Find emotion in an audio file - Extract emotion from an audio file. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_recognise_emotion_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_recognise_emotion" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_recognise_emotion`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_recognise_emotion`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/async/recognise_emotion'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - - def sync_recognise_emotion(self, body, **kwargs): - """ - Find emotion in an audio file - Extract emotion from an audio file. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_recognise_emotion(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :return: list[EmotionScore] - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.sync_recognise_emotion_with_http_info(body, **kwargs) - else: - (data) = self.sync_recognise_emotion_with_http_info(body, **kwargs) - return data - - def sync_recognise_emotion_with_http_info(self, body, **kwargs): - """ - Find emotion in an audio file - Extract emotion from an audio file. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_recognise_emotion_with_http_info(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :return: list[EmotionScore] - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method sync_recognise_emotion" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `sync_recognise_emotion`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/sync/recognise_emotion'.replace('{format}', 'json') - path_params = {} - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='list[EmotionScore]', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/deepaffects/apis/featurize_api.py b/deepaffects/apis/featurize_api.py deleted file mode 100644 index 184ba02..0000000 --- a/deepaffects/apis/featurize_api.py +++ /dev/null @@ -1,250 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -# python 2 and python 3 compatibility library -from six import iteritems - -from ..api_client import ApiClient -from ..configuration import Configuration - - -class FeaturizeApi(object): - - def __init__(self, api_client=None): - config = Configuration() - if api_client: - self.api_client = api_client - else: - if not config.api_client: - config.api_client = ApiClient() - self.api_client = config.api_client - - def async_featurize_audio(self, body, webhook, **kwargs): - """ - Extract paralinguistic feature from an audio file asynchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_featurize_audio(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.async_featurize_audio_with_http_info(body, webhook, **kwargs) - else: - (data) = self.async_featurize_audio_with_http_info(body, webhook, **kwargs) - return data - - def async_featurize_audio_with_http_info(self, body, webhook, **kwargs): - """ - featurize an audio file - Extract paralinguistic feature from an audio file. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.async_featurize_audio_with_http_info(body, webhook, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :param str webhook: The webhook url where result from async resource is posted (required) - :param str request_id: Unique identifier for the request - :return: AsyncResponse - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body', 'webhook', 'request_id'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method async_featurize_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `async_featurize_audio`") - # verify the required parameter 'webhook' is set - if ('webhook' not in params) or (params['webhook'] is None): - raise ValueError("Missing the required parameter `webhook` when calling `async_featurize_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/async/featurize'.replace('{format}', 'json') - path_params = {} - - query_params = {} - if 'webhook' in params: - query_params['webhook'] = params['webhook'] - if 'request_id' in params: - query_params['request_id'] = params['request_id'] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AsyncResponse', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) - - def sync_featurize_audio(self, body, **kwargs): - """ - Extract paralinguistic feature from an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_featurize_audio(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :return: AudioFeatures - If the method is called asynchronously, - returns the request thread. - """ - kwargs['_return_http_data_only'] = True - if kwargs.get('callback'): - return self.sync_featurize_audio_with_http_info(body, **kwargs) - else: - (data) = self.sync_featurize_audio_with_http_info(body, **kwargs) - return data - - def sync_featurize_audio_with_http_info(self, body, **kwargs): - """ - Extract paralinguistic feature from an audio file synchronously. - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please define a `callback` function - to be invoked when receiving the response. - >>> def callback_function(response): - >>> pprint(response) - >>> - >>> thread = api.sync_featurize_audio_with_http_info(body, callback=callback_function) - - :param callback function: The callback function - for asynchronous request. (optional) - :param Audio body: Audio object that needs to be featurized. (required) - :return: AudioFeatures - If the method is called asynchronously, - returns the request thread. - """ - - all_params = ['body'] - all_params.append('callback') - all_params.append('_return_http_data_only') - all_params.append('_preload_content') - all_params.append('_request_timeout') - - params = locals() - for key, val in iteritems(params['kwargs']): - if key not in all_params: - raise TypeError( - "Got an unexpected keyword argument '%s'" - " to method sync_featurize_audio" % key - ) - params[key] = val - del params['kwargs'] - # verify the required parameter 'body' is set - if ('body' not in params) or (params['body'] is None): - raise ValueError("Missing the required parameter `body` when calling `sync_featurize_audio`") - - - collection_formats = {} - - resource_path = '/audio/generic/api/v1/sync/featurize'.replace('{format}', 'json') - path_params = {} - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'body' in params: - body_params = params['body'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json']) - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json']) - - # Authentication setting - auth_settings = ['UserSecurity'] - - return self.api_client.call_api(resource_path, 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_type='AudioFeatures', - auth_settings=auth_settings, - callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only'), - _preload_content=params.get('_preload_content', True), - _request_timeout=params.get('_request_timeout'), - collection_formats=collection_formats) diff --git a/deepaffects/configuration.py b/deepaffects/configuration.py deleted file mode 100644 index 22119db..0000000 --- a/deepaffects/configuration.py +++ /dev/null @@ -1,220 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: 0.1.0 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import urllib3 - -import sys -import logging - -from six import iteritems -from six.moves import http_client as httplib - - -def singleton(cls, *args, **kw): - instances = {} - - def _singleton(): - if cls not in instances: - instances[cls] = cls(*args, **kw) - return instances[cls] - return _singleton - - -@singleton -class Configuration(object): - def __init__(self): - """ - Constructor - """ - # Default Base url - self.host = "https://proxy.api.deepaffects.com" - # Default api client - self.api_client = None - # Temp file folder for downloading files - self.temp_folder_path = None - - # Authentication Settings - # dict to store API key(s) - self.api_key = {} - # dict to store API prefix (e.g. Bearer) - self.api_key_prefix = {} - # Username for HTTP basic authentication - self.username = "" - # Password for HTTP basic authentication - self.password = "" - - # Logging Settings - self.logger = {} - self.logger["package_logger"] = logging.getLogger("swagger_client") - self.logger["urllib3_logger"] = logging.getLogger("urllib3") - # Log format - self.logger_format = '%(asctime)s %(levelname)s %(message)s' - # Log stream handler - self.logger_stream_handler = None - # Log file handler - self.logger_file_handler = None - # Debug file location - self.logger_file = None - # Debug switch - self.debug = False - - # SSL/TLS verification - # Set this to false to skip verifying SSL certificate when calling API from https server. - self.verify_ssl = True - # Set this to customize the certificate file to verify the peer. - self.ssl_ca_cert = None - # client certificate file - self.cert_file = None - # client key file - self.key_file = None - - @property - def logger_file(self): - """ - Gets the logger_file. - """ - return self.__logger_file - - @logger_file.setter - def logger_file(self, value): - """ - Sets the logger_file. - - If the logger_file is None, then add stream handler and remove file handler. - Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - self.__logger_file = value - if self.__logger_file: - # If set logging file, - # then add file handler and remove stream handler. - self.logger_file_handler = logging.FileHandler(self.__logger_file) - self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in iteritems(self.logger): - logger.addHandler(self.logger_file_handler) - if self.logger_stream_handler: - logger.removeHandler(self.logger_stream_handler) - else: - # If not set logging file, - # then add stream handler and remove file handler. - self.logger_stream_handler = logging.StreamHandler() - self.logger_stream_handler.setFormatter(self.logger_formatter) - for _, logger in iteritems(self.logger): - logger.addHandler(self.logger_stream_handler) - if self.logger_file_handler: - logger.removeHandler(self.logger_file_handler) - - @property - def debug(self): - """ - Gets the debug status. - """ - return self.__debug - - @debug.setter - def debug(self, value): - """ - Sets the debug status. - - :param value: The debug status, True or False. - :type: bool - """ - self.__debug = value - if self.__debug: - # if debug status is True, turn on debug logging - for _, logger in iteritems(self.logger): - logger.setLevel(logging.DEBUG) - # turn on httplib debug - httplib.HTTPConnection.debuglevel = 1 - else: - # if debug status is False, turn off debug logging, - # setting log level to default `logging.WARNING` - for _, logger in iteritems(self.logger): - logger.setLevel(logging.WARNING) - # turn off httplib debug - httplib.HTTPConnection.debuglevel = 0 - - @property - def logger_format(self): - """ - Gets the logger_format. - """ - return self.__logger_format - - @logger_format.setter - def logger_format(self, value): - """ - Sets the logger_format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - self.__logger_format = value - self.logger_formatter = logging.Formatter(self.__logger_format) - - def get_api_key_with_prefix(self, identifier): - """ - Gets API key (with prefix if set). - - :param identifier: The identifier of apiKey. - :return: The token for api key authentication. - """ - if self.api_key.get(identifier) and self.api_key_prefix.get(identifier): - return self.api_key_prefix[identifier] + ' ' + self.api_key[identifier] - elif self.api_key.get(identifier): - return self.api_key[identifier] - - def get_basic_auth_token(self): - """ - Gets HTTP basic authentication header (string). - - :return: The token for basic HTTP authentication. - """ - return urllib3.util.make_headers(basic_auth=self.username + ':' + self.password)\ - .get('authorization') - - def auth_settings(self): - """ - Gets Auth Settings dict for api client. - - :return: The Auth Settings information dict. - """ - return { - 'UserSecurity': - { - 'type': 'api_key', - 'in': 'query', - 'key': 'apikey', - 'value': self.get_api_key_with_prefix('apikey') - }, - - } - - def to_debug_report(self): - """ - Gets the essential information for debugging. - - :return: The report for debugging. - """ - return "Python SDK Debug Report:\n"\ - "OS: {env}\n"\ - "Python Version: {pyversion}\n"\ - "Version of the API: 0.1.0\n"\ - "SDK Package Version: 1.0.0".\ - format(env=sys.platform, pyversion=sys.version) diff --git a/deepaffects/models/__init__.py b/deepaffects/models/__init__.py deleted file mode 100644 index 60d9780..0000000 --- a/deepaffects/models/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: 0.1.0 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -# import models into model package -from .async_response import AsyncResponse -from .audio import Audio -from .diarize_audio import DiarizeAudio -from .emotion_score import EmotionScore -from .audio_features import AudioFeatures -from .diarize_segment import DiarizeSegment diff --git a/deepaffects/models/async_response.py b/deepaffects/models/async_response.py deleted file mode 100644 index 16a1607..0000000 --- a/deepaffects/models/async_response.py +++ /dev/null @@ -1,150 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - -from pprint import pformat - -from six import iteritems -import json - - -class AsyncResponse(object): - """ - NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually. - """ - def __init__(self, request_id=None, api=None): - """ - AsyncResponse - a model defined in Swagger - - :param dict swaggerTypes: The key is attribute name - and the value is attribute type. - :param dict attributeMap: The key is attribute name - and the value is json key in definition. - """ - self.swagger_types = { - 'request_id': 'str', - 'api': 'str' - } - - self.attribute_map = { - 'request_id': 'request_id', - 'api': 'api' - } - - self._request_id = request_id - self._api = api - - @property - def request_id(self): - """ - Gets the request_id of this AsyncResponse. - Unique identifier for the api call - - :return: The request_id of this AsyncResponse. - :rtype: str - """ - return self._request_id - - @request_id.setter - def request_id(self, request_id): - """ - Sets the request_id of this AsyncResponse. - Unique identifier for the api call - - :param request_id: The request_id of this AsyncResponse. - :type: str - """ - if request_id is None: - raise ValueError("Invalid value for `request_id`, must not be `None`") - - self._request_id = request_id - - @property - def api(self): - """ - Gets the api of this AsyncResponse. - API hit - - :return: The api of this AsyncResponse. - :rtype: str - """ - return self._api - - @api.setter - def api(self, api): - """ - Sets the api of this AsyncResponse. - API hit - - :param api: The api of this AsyncResponse. - :type: str - """ - if api is None: - raise ValueError("Invalid value for `api`, must not be `None`") - - self._api = api - - def to_dict(self): - """ - Returns the model properties as a dict - """ - result = {} - - for attr, _ in iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """ - Returns the string representation of the model - """ - return pformat(self.to_dict()) - - def __repr__(self): - """ - For `print` and `pprint` - """ - return self.to_str() - - def __eq__(self, other): - """ - Returns true if both objects are equal - """ - if not isinstance(other, AsyncResponse): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """ - Returns true if both objects are not equal - """ - return not self == other - - @staticmethod - def from_json(content_str): - content = json.loads(content_str) - async_response = AsyncResponse(api=content["api"], request_id=content["request_id"]) - return async_response - diff --git a/deepaffects/models/audio.py b/deepaffects/models/audio.py deleted file mode 100644 index ae816f9..0000000 --- a/deepaffects/models/audio.py +++ /dev/null @@ -1,222 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" -try: - import StringIO as SIO -except ImportError: - import io as SIO -import base64 -import json -from pprint import pformat - -from pymediainfo import MediaInfo -from six import iteritems - -class Audio(object): - def __init__(self, encoding=None, sample_rate=None, language_code='en-US', content=None): - """ - Audio - a model defined in Swagger - - :param dict swaggerTypes: The key is attribute name - and the value is attribute type. - :param dict attributeMap: The key is attribute name - and the value is json key in definition. - """ - self.swagger_types = { - 'encoding': 'str', - 'sample_rate': 'str', - 'language_code': 'str', - 'content': 'str' - } - - self.attribute_map = { - 'encoding': 'encoding', - 'sample_rate': 'sampleRate', - 'language_code': 'languageCode', - 'content': 'content' - } - - self._encoding = encoding - self._sample_rate = sample_rate - self._language_code = language_code - self._content = content - - @property - def encoding(self): - """ - Gets the encoding of this Audio. - Encoding of audio file like MP3, WAV etc. - - :return: The encoding of this Audio. - :rtype: str - """ - return self._encoding - - @encoding.setter - def encoding(self, encoding): - """ - Sets the encoding of this Audio. - Encoding of audio file like MP3, WAV etc. - - :param encoding: The encoding of this Audio. - :type: str - """ - if encoding is None: - raise ValueError("Invalid value for `encoding`, must not be `None`") - - self._encoding = encoding - - @property - def sample_rate(self): - """ - Gets the sample_rate of this Audio. - Sample rate of the audio file. - - :return: The sample_rate of this Audio. - :rtype: str - """ - return self._sample_rate - - @sample_rate.setter - def sample_rate(self, sample_rate): - """ - Sets the sample_rate of this Audio. - Sample rate of the audio file. - - :param sample_rate: The sample_rate of this Audio. - :type: int - """ - if sample_rate is None: - raise ValueError("Invalid value for `sample_rate`, must not be `None`") - - self._sample_rate = sample_rate - - @property - def language_code(self): - """ - Gets the language_code of this Audio. - Language spoken in the audio file. - - :return: The language_code of this Audio. - :rtype: str - """ - return self._language_code - - @language_code.setter - def language_code(self, language_code): - """ - Sets the language_code of this Audio. - Language spoken in the audio file. - - :param language_code: The language_code of this Audio. - :type: str - """ - if language_code is None: - raise ValueError("Invalid value for `language_code`, must not be `None`") - - self._language_code = language_code - - @property - def content(self): - """ - Gets the content of this Audio. - base64 encoding of the audio file. - - :return: The content of this Audio. - :rtype: str - """ - return self._content - - @content.setter - def content(self, content): - """ - Sets the content of this Audio. - base64 encoding of the audio file. - - :param content: The content of this Audio. - :type: str - """ - if content is None: - raise ValueError("Invalid value for `content`, must not be `None`") - - self._content = content - - def to_dict(self): - """ - Returns the model properties as a dict - """ - result = {} - - for attr, _ in iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """ - Returns the string representation of the model - """ - return pformat(self.to_dict()) - - def __repr__(self): - """ - For `print` and `pprint` - """ - return self.to_str() - - def __eq__(self, other): - """ - Returns true if both objects are equal - """ - if not isinstance(other, Audio): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """ - Returns true if both objects are not equal - """ - return not self == other - - @staticmethod - def from_file(file_name, language_code='en-US'): - media_info = MediaInfo.parse(file_name) - codec = media_info.tracks[0].__dict__['codec'] - sampling_rate = media_info.tracks[1].__dict__['sampling_rate'] - fout = SIO.StringIO() - with open(file_name, 'rb') as fin: - audio_content = fin.read() - audio = Audio(encoding=codec, sample_rate=sampling_rate, language_code=language_code, - content=base64.b64encode(audio_content).decode('utf-8')) - fout.close() - return audio - - @staticmethod - def from_json(content_str): - content = json.loads(content_str) - audio = Audio(encoding=content['encoding'], sample_rate=content['sample_rate'], - language_code=content['language_code'], content=content['content']) - return audio - - def to_file(self, file_name): - base64.decode(SIO.StringIO(self.content), output=open(file_name, 'wb')) \ No newline at end of file diff --git a/deepaffects/models/audio_features.py b/deepaffects/models/audio_features.py deleted file mode 100644 index 7b46c7f..0000000 --- a/deepaffects/models/audio_features.py +++ /dev/null @@ -1,169 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs # noqa: E501 - - OpenAPI spec version: 0.1.0 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - -import pprint -import re # noqa: F401 - -import six - - -class AudioFeatures(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'mfccs': 'list[list[float]]', - 'zcr': 'list[float]', - 'energy': 'list[float]' - } - - attribute_map = { - 'mfccs': 'mfccs', - 'zcr': 'zcr', - 'energy': 'energy' - } - - def __init__(self, mfccs=None, zcr=None, energy=None): # noqa: E501 - """AudioFeatures - a model defined in Swagger""" # noqa: E501 - - self._mfccs = None - self._zcr = None - self._energy = None - self.discriminator = None - - - @property - def mfccs(self): - """Gets the mfccs of this AudioFeatures. # noqa: E501 - - mel frequency cepstral coefficients # noqa: E501 - - :return: The mfccs of this AudioFeatures. # noqa: E501 - :rtype: list[list[float]] - """ - return self._mfccs - - @mfccs.setter - def mfccs(self, mfccs): - """Sets the mfccs of this AudioFeatures. - - mel frequency cepstral coefficients # noqa: E501 - - :param mfccs: The mfccs of this AudioFeatures. # noqa: E501 - :type: list[list[float]] - """ - if mfccs is None: - raise ValueError("Invalid value for `mfccs`, must not be `None`") # noqa: E501 - - self._mfccs = mfccs - - @property - def zcr(self): - """Gets the zcr of this AudioFeatures. # noqa: E501 - - zero crossing rate # noqa: E501 - - :return: The zcr of this AudioFeatures. # noqa: E501 - :rtype: list[float] - """ - return self._zcr - - @zcr.setter - def zcr(self, zcr): - """Sets the zcr of this AudioFeatures. - - zero crossing rate # noqa: E501 - - :param zcr: The zcr of this AudioFeatures. # noqa: E501 - :type: list[float] - """ - if zcr is None: - raise ValueError("Invalid value for `zcr`, must not be `None`") # noqa: E501 - - self._zcr = zcr - - @property - def energy(self): - """Gets the energy of this AudioFeatures. # noqa: E501 - - energy # noqa: E501 - - :return: The energy of this AudioFeatures. # noqa: E501 - :rtype: list[float] - """ - return self._energy - - @energy.setter - def energy(self, energy): - """Sets the energy of this AudioFeatures. - - energy # noqa: E501 - - :param energy: The energy of this AudioFeatures. # noqa: E501 - :type: list[float] - """ - if energy is None: - raise ValueError("Invalid value for `energy`, must not be `None`") # noqa: E501 - - self._energy = energy - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AudioFeatures): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """Returns true if both objects are not equal""" - return not self == other diff --git a/deepaffects/models/diarize_audio.py b/deepaffects/models/diarize_audio.py deleted file mode 100644 index 1cdade3..0000000 --- a/deepaffects/models/diarize_audio.py +++ /dev/null @@ -1,311 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - -""" - - -try: - import StringIO as SIO -except ImportError: - import io as SIO -import base64 -import json -from pprint import pformat - -from pymediainfo import MediaInfo -from six import iteritems - - -class DiarizeAudio(object): - - def __init__(self, encoding=None, sample_rate=None, language_code='en-US', content=None, speakers=-1, - merge_segments=True, audio_type="default"): - """ - DiarizeAudio - a model defined in Swagger - - :param dict swaggerTypes: The key is attribute name - and the value is attribute type. - :param dict attributeMap: The key is attribute name - and the value is json key in definition. - """ - self.swagger_types = { - 'encoding': 'str', - 'sample_rate': 'int', - 'language_code': 'str', - 'content': 'str', - 'speakers': 'int', - 'audio_type': 'str', - 'merge_segments': 'bool' - } - - self.attribute_map = { - 'encoding': 'encoding', - 'sample_rate': 'sampleRate', - 'language_code': 'languageCode', - 'content': 'content', - 'speakers': 'speakers', - 'audio_type': 'audioType', - 'merge_segments': 'vad' - } - - self._encoding = encoding - self._sample_rate = sample_rate - self._language_code = language_code - self._content = content - self._speakers = speakers - self._merge_segments = merge_segments - self._audio_type = audio_type - - @property - def encoding(self): - """ - Gets the encoding of this DiarizeAudio. - Encoding of audio file like MP3, WAV etc. - - :return: The encoding of this DiarizeAudio. - :rtype: str - """ - return self._encoding - - @encoding.setter - def encoding(self, encoding): - """ - Sets the encoding of this DiarizeAudio. - Encoding of audio file like MP3, WAV etc. - - :param encoding: The encoding of this DiarizeAudio. - :type: str - """ - if encoding is None: - raise ValueError("Invalid value for `encoding`, must not be `None`") - - self._encoding = encoding - - @property - def sample_rate(self): - """ - Gets the sample_rate of this DiarizeAudio. - Sample rate of the audio file. - - :return: The sample_rate of this DiarizeAudio. - :rtype: int - """ - return self._sample_rate - - @sample_rate.setter - def sample_rate(self, sample_rate): - """ - Sets the sample_rate of this DiarizeAudio. - Sample rate of the audio file. - - :param sample_rate: The sample_rate of this DiarizeAudio. - :type: int - """ - if sample_rate is None: - raise ValueError("Invalid value for `sample_rate`, must not be `None`") - - self._sample_rate = sample_rate - - @property - def language_code(self): - """ - Gets the language_code of this DiarizeAudio. - Language spoken in the audio file. - - :return: The language_code of this DiarizeAudio. - :rtype: str - """ - return self._language_code - - @language_code.setter - def language_code(self, language_code): - """ - Sets the language_code of this DiarizeAudio. - Language spoken in the audio file. - - :param language_code: The language_code of this DiarizeAudio. - :type: str - """ - if language_code is None: - raise ValueError("Invalid value for `language_code`, must not be `None`") - - self._language_code = language_code - - @property - def content(self): - """ - Gets the content of this DiarizeAudio. - base64 encoding of the audio file. - - :return: The content of this DiarizeAudio. - :rtype: str - """ - return self._content - - @content.setter - def content(self, content): - """ - Sets the content of this DiarizeAudio. - base64 encoding of the audio file. - - :param content: The content of this DiarizeAudio. - :type: str - """ - if content is None: - raise ValueError("Invalid value for `content`, must not be `None`") - - self._content = content - - @property - def speakers(self): - """ - Gets the speakers of this DiarizeAudio. - Number of speakers in the file (-1 for unknown speakers) - - :return: The speakers of this DiarizeAudio. - :rtype: int - """ - return self._speakers - - @speakers.setter - def speakers(self, speakers): - """ - Sets the speakers of this DiarizeAudio. - Number of speakers in the file (-1 for unknown speakers) - - :param speakers: The speakers of this DiarizeAudio. - :type: int - """ - if speakers is None: - raise ValueError("Invalid value for `speakers`, must not be `None`") - - self._speakers = speakers - - @property - def audio_type(self): - """ - Gets the corresponding type of audio file - example: meeting, call-center, default - - :return: The audio_type of this DiarizeAudio. - :rtype: str - """ - return self._audio_type - - @audio_type.setter - def audio_type(self, audio_type): - """ - Sets the audio_type of this DiarizeAudio. - Corresponding type of audio file like meeting, call-center, default - - :param encoding: The audio_type of this DiarizeAudio. - :type: str - """ - if audio_type is None: - raise ValueError("Invalid value for `audio_type`, must not be `None`") - - self._audio_type = audio_type - - @property - def merge_segments(self): - """ - Whether the consecutive segments of same speaker should be merged - - :return: The merge_segments of this DiarizeAudio. - :rtype: bool - """ - return self._merge_segments - - @merge_segments.setter - def merge_segments(self, merge_segments): - """ - Sets the merge_segments of this DiarizeAudio. - Whether the consecutive segments of same speaker should be merged - - :param encoding: The merge_segments of this DiarizeAudio. - :type: str - """ - if merge_segments is None: - raise ValueError("Invalid value for `merge_segments`, must not be `None`") - - self._merge_segments = merge_segments - - def to_dict(self): - """ - Returns the model properties as a dict - """ - result = {} - - for attr, _ in iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """ - Returns the string representation of the model - """ - return pformat(self.to_dict()) - - def __repr__(self): - """ - For `print` and `pprint` - """ - return self.to_str() - - def __eq__(self, other): - """ - Returns true if both objects are equal - """ - if not isinstance(other, DiarizeAudio): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """ - Returns true if both objects are not equal - """ - return not self == other - - @staticmethod - def from_file(file_name, language_code='en-US', speakers=-1, merge_segments=True, audio_type='default'): - media_info = MediaInfo.parse(file_name) - codec = media_info.tracks[0].__dict__['codec'] - sampling_rate = media_info.tracks[1].__dict__['sampling_rate'] - fout = SIO.StringIO() - with open(file_name, 'rb') as fin: - audio_content = fin.read() - audio = DiarizeAudio(encoding=codec, sample_rate=sampling_rate, language_code=language_code, - content=base64.b64encode(audio_content).decode('utf-8'), speakers=speakers, - merge_segments=merge_segments, audio_type=audio_type) - fout.close() - return audio - - @staticmethod - def from_json(content_str): - content = json.loads(content_str) - audio = DiarizeAudio(encoding=content['encoding'], sample_rate=content['sample_rate'], - language_code=content['language_code'], content=content['content'], - speakers=content['speakers'], merge_segments=content['merge_segments'], - audio_type=content['audio_type']) - return audio diff --git a/deepaffects/models/diarize_segment.py b/deepaffects/models/diarize_segment.py deleted file mode 100644 index 7a6e32c..0000000 --- a/deepaffects/models/diarize_segment.py +++ /dev/null @@ -1,167 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - -""" - - -from pprint import pformat -from six import iteritems - -class DiarizeSegment(object): - - def __init__(self, start=None, end=None, speaker_id=None): - """ - DiarizeSegment - a model defined in Swagger - - :param dict swaggerTypes: The key is attribute name - and the value is attribute type. - :param dict attributeMap: The key is attribute name - and the value is json key in definition. - """ - self.swagger_types = { - 'start': 'float', - 'end': 'float', - 'speaker_id': 'int' - } - - self.attribute_map = { - 'start': 'start', - 'end': 'end', - 'speaker_id': 'speakerId' - } - - self._start = start - self._end = end - self._speaker_id = speaker_id - - @property - def start(self): - """ - Gets the start of this DiarizeSegment. - start of the corresponding diarized segment. - - :return: The encoding of this DiarizeSegment. - :rtype: float - """ - return self._start - - @start.setter - def start(self, start): - """ - Sets the start of this DiarizeSegment. - start of the corresponding diarized segment. - - :param start: The start of this DiarizeSegment. - :type: float - """ - if start is None: - raise ValueError("Invalid value for `start`, must not be `None`") - - self._start = start - - @property - def end(self): - """ - Gets the end of this DiarizeSegment. - end of the corresponding diarized segment. - - :return: The end of this DiarizeSegment. - :rtype: float - """ - return self._end - - @end.setter - def end(self, end): - """ - Sets the end of this DiarizeSegment. - end of the corresponding diarized segment. - - :param end: The end of this DiarizeSegment. - :type: float - """ - if end is None: - raise ValueError("Invalid value for `end`, must not be `None`") - - self._end = end - - @property - def speaker_id(self): - """ - Gets the speaker_id of this DiarizeSegment. - Unique identifier of the speaker speaking in the segment - - :return: The speaker_id of this DiarizeSegment. - :rtype: int - """ - return self._speaker_id - - @speaker_id.setter - def speaker_id(self, speaker_id): - """ - Sets the speaker_id of this DiarizeSegment. - Unique identifier of the speaker speaking in the segment - - :param speaker_id: The speaker_id of this DiarizeSegment. - :type: sinttr - """ - if speaker_id is None: - raise ValueError("Invalid value for `speaker_id`, must not be `None`") - - self._speaker_id = speaker_id - - def to_dict(self): - """ - Returns the model properties as a dict - """ - result = {} - - for attr, _ in iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """ - Returns the string representation of the model - """ - return pformat(self.to_dict()) - - def __repr__(self): - """ - For `print` and `pprint` - """ - return self.to_str() - - def __eq__(self, other): - """ - Returns true if both objects are equal - """ - if not isinstance(other, DiarizeSegment): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """ - Returns true if both objects are not equal - """ - return not self == other diff --git a/deepaffects/models/emotion_score.py b/deepaffects/models/emotion_score.py deleted file mode 100644 index ef16594..0000000 --- a/deepaffects/models/emotion_score.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects audio APIs -""" - -from pprint import pformat -from six import iteritems -import re - - -class EmotionScore(object): - """NOTE: This class is auto generated by the swagger code generator program. - - Do not edit the class manually. - """ - - """ - Attributes: - swagger_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - swagger_types = { - 'emotion': 'str', - 'score': 'float' - } - - attribute_map = { - 'emotion': 'emotion', - 'score': 'score' - } - - def __init__(self, emotion=None, score=None): # noqa: E501 - """EmotionScore - a model defined in Swagger""" # noqa: E501 - - self._emotion = None - self._score = None - self.discriminator = None - - self.emotion = emotion - self.score = score - - @property - def emotion(self): - """Gets the emotion of this EmotionScore. # noqa: E501 - - Type of emotion like Happy, Sad, Surprised etc. # noqa: E501 - - :return: The emotion of this EmotionScore. # noqa: E501 - :rtype: str - """ - return self._emotion - - @emotion.setter - def emotion(self, emotion): - """Sets the emotion of this EmotionScore. - - Type of emotion like Happy, Sad, Surprised etc. # noqa: E501 - - :param emotion: The emotion of this EmotionScore. # noqa: E501 - :type: str - """ - - self._emotion = emotion - - @property - def score(self): - """Gets the score of this EmotionScore. # noqa: E501 - - Probability score or confidence of the corresponding emotion. # noqa: E501 - - :return: The score of this EmotionScore. # noqa: E501 - :rtype: float - """ - return self._score - - @score.setter - def score(self, score): - """Sets the score of this EmotionScore. - - Probability score or confidence of the corresponding emotion. # noqa: E501 - - :param score: The score of this EmotionScore. # noqa: E501 - :type: float - """ - - self._score = score - - def to_dict(self): - """ - Returns the model properties as a dict - """ - result = {} - - for attr, _ in iteritems(self.swagger_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """ - Returns the string representation of the model - """ - return pformat(self.to_dict()) - - def __repr__(self): - """ - For `print` and `pprint` - """ - return self.to_str() - - def __eq__(self, other): - """ - Returns true if both objects are equal - """ - if not isinstance(other, EmotionScore): - return False - - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - """ - Returns true if both objects are not equal - """ - return not self == other diff --git a/deepaffects/realtime/__init__.py b/deepaffects/realtime/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deepaffects/realtime/api.py b/deepaffects/realtime/api.py deleted file mode 100644 index fb99cf2..0000000 --- a/deepaffects/realtime/api.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import print_function - -import random -import time -import grpc -import os -import io -import sys -import pydub -import base64 -from pydub import AudioSegment - -import deepaffects.realtime.deepaffects_realtime_pb2_grpc as deepaffects_grpc -import deepaffects.realtime.deepaffects_realtime_pb2 as deepaffects_types - - -configuration = { - "TIMEOUT_SECONDS" = 2000, - "API_KEY" = "" -} - - -def get_deepaffects_client(): - channel = grpc.insecure_channel('realtime.deepaffects.com:80') - stub = deepaffects_grpc.DeepAffectsRealtimeStub(channel) - return stub - - -# def generate_chunks(): -# # split sound in 5-second slices and export -# audio_clip = AudioSegment.from_file("modi_video.mp4") -# for i, chunk in enumerate(audio_clip[::1000]): -# time.sleep(1) -# chunk_name = "chunk.wav" -# with open(chunk_name, "wb") as f: -# chunk.export(f, format="wav") -# base64_chunk = encode_to_base64(chunk_name) -# os.remove(chunk_name) -# print("Sending chunk %s" % (i)) -# yield make_input_audio_segment(i, base64_chunk) - - -# def identify_speaker(stub): -# responses = stub.GetSpeaker(generate_chunks()) -# for response in responses: -# print("Received message %s at %s" % (response.id, -# response.speaker)) - - -# def run(): -# channel = grpc.insecure_channel('localhost:50051') -# stub = audio_stream_pb2_grpc.DeepAffectsApiStub(channel) -# print("-------------- Realtime Api --------------") -# get_speaker(stub) - - -# if __name__ == '__main__': -# run() diff --git a/deepaffects/realtime/deepaffects_realtime_pb2.py b/deepaffects/realtime/deepaffects_realtime_pb2.py deleted file mode 100644 index 6cbc5c8..0000000 --- a/deepaffects/realtime/deepaffects_realtime_pb2.py +++ /dev/null @@ -1,405 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: deepaffects-realtime.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -from google.protobuf import descriptor_pb2 -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='deepaffects-realtime.proto', - package='deepaffectsrealtime', - syntax='proto3', - serialized_pb=_b('\n\x1a\x64\x65\x65paffects-realtime.proto\x12\x13\x64\x65\x65paffectsrealtime\"\xb3\x01\n\x0cSegmentChunk\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x10\n\x08\x65ncoding\x18\x03 \x01(\t\x12\x14\n\x0clanguageCode\x18\x04 \x01(\t\x12\x12\n\nsampleRate\x18\x05 \x01(\x05\x12\x12\n\nspeakerIds\x18\x06 \x03(\t\x12\x15\n\rsegmentOffset\x18\x07 \x01(\x01\x12\x10\n\x08\x64uration\x18\x08 \x01(\x01\x12\r\n\x05\x45rror\x18\t \x01(\t\"y\n\x0eSegmentSpeaker\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x12\n\nspeaker_id\x18\x02 \x01(\t\x12\r\n\x05start\x18\x03 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x04 \x01(\x01\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\x1c\n\x14identification_score\x18\x06 \x01(\x02\"o\n\x0eSegmentEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\x15\n\remotion_score\x18\x06 \x01(\x01\"\xa8\x01\n\x15SegmentDiarizeEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\x12\n\nspeaker_id\x18\x05 \x01(\t\x12\r\n\x05\x45rror\x18\x06 \x01(\t\x12\x15\n\remotion_score\x18\x07 \x01(\x01\x12\x1c\n\x14identification_score\x18\x08 \x01(\x01\x32\xbe\x02\n\x13\x44\x65\x65pAffectsRealtime\x12_\n\x0fIdentifySpeaker\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentSpeaker\"\x00(\x01\x30\x01\x12_\n\x0fIdentifyEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentEmotion\"\x00(\x01\x30\x01\x12\x65\n\x0e\x44iarizeEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a*.deepaffectsrealtime.SegmentDiarizeEmotion\"\x00(\x01\x30\x01\x42;\n\x1cio.grpc.examples.deepaffectsB\x13\x44\x65\x65paffectsRealtimeP\x01\xa2\x02\x03\x44RIb\x06proto3') -) - - - - -_SEGMENTCHUNK = _descriptor.Descriptor( - name='SegmentChunk', - full_name='deepaffectsrealtime.SegmentChunk', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentChunk.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='content', full_name='deepaffectsrealtime.SegmentChunk.content', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='encoding', full_name='deepaffectsrealtime.SegmentChunk.encoding', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='languageCode', full_name='deepaffectsrealtime.SegmentChunk.languageCode', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sampleRate', full_name='deepaffectsrealtime.SegmentChunk.sampleRate', index=4, - number=5, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speakerIds', full_name='deepaffectsrealtime.SegmentChunk.speakerIds', index=5, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='segmentOffset', full_name='deepaffectsrealtime.SegmentChunk.segmentOffset', index=6, - number=7, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='duration', full_name='deepaffectsrealtime.SegmentChunk.duration', index=7, - number=8, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentChunk.Error', index=8, - number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=52, - serialized_end=231, -) - - -_SEGMENTSPEAKER = _descriptor.Descriptor( - name='SegmentSpeaker', - full_name='deepaffectsrealtime.SegmentSpeaker', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentSpeaker.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speaker_id', full_name='deepaffectsrealtime.SegmentSpeaker.speaker_id', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentSpeaker.start', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentSpeaker.end', index=3, - number=4, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentSpeaker.Error', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='identification_score', full_name='deepaffectsrealtime.SegmentSpeaker.identification_score', index=5, - number=6, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=233, - serialized_end=354, -) - - -_SEGMENTEMOTION = _descriptor.Descriptor( - name='SegmentEmotion', - full_name='deepaffectsrealtime.SegmentEmotion', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentEmotion.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentEmotion.start', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentEmotion.end', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion', full_name='deepaffectsrealtime.SegmentEmotion.emotion', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentEmotion.Error', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion_score', full_name='deepaffectsrealtime.SegmentEmotion.emotion_score', index=5, - number=6, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=356, - serialized_end=467, -) - - -_SEGMENTDIARIZEEMOTION = _descriptor.Descriptor( - name='SegmentDiarizeEmotion', - full_name='deepaffectsrealtime.SegmentDiarizeEmotion', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.start', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.end', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.emotion', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speaker_id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.speaker_id', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.Error', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion_score', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.emotion_score', index=6, - number=7, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='identification_score', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.identification_score', index=7, - number=8, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=470, - serialized_end=638, -) - -DESCRIPTOR.message_types_by_name['SegmentChunk'] = _SEGMENTCHUNK -DESCRIPTOR.message_types_by_name['SegmentSpeaker'] = _SEGMENTSPEAKER -DESCRIPTOR.message_types_by_name['SegmentEmotion'] = _SEGMENTEMOTION -DESCRIPTOR.message_types_by_name['SegmentDiarizeEmotion'] = _SEGMENTDIARIZEEMOTION -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -SegmentChunk = _reflection.GeneratedProtocolMessageType('SegmentChunk', (_message.Message,), dict( - DESCRIPTOR = _SEGMENTCHUNK, - __module__ = 'deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentChunk) - )) -_sym_db.RegisterMessage(SegmentChunk) - -SegmentSpeaker = _reflection.GeneratedProtocolMessageType('SegmentSpeaker', (_message.Message,), dict( - DESCRIPTOR = _SEGMENTSPEAKER, - __module__ = 'deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentSpeaker) - )) -_sym_db.RegisterMessage(SegmentSpeaker) - -SegmentEmotion = _reflection.GeneratedProtocolMessageType('SegmentEmotion', (_message.Message,), dict( - DESCRIPTOR = _SEGMENTEMOTION, - __module__ = 'deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentEmotion) - )) -_sym_db.RegisterMessage(SegmentEmotion) - -SegmentDiarizeEmotion = _reflection.GeneratedProtocolMessageType('SegmentDiarizeEmotion', (_message.Message,), dict( - DESCRIPTOR = _SEGMENTDIARIZEEMOTION, - __module__ = 'deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentDiarizeEmotion) - )) -_sym_db.RegisterMessage(SegmentDiarizeEmotion) - - -DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\034io.grpc.examples.deepaffectsB\023DeepaffectsRealtimeP\001\242\002\003DRI')) - -_DEEPAFFECTSREALTIME = _descriptor.ServiceDescriptor( - name='DeepAffectsRealtime', - full_name='deepaffectsrealtime.DeepAffectsRealtime', - file=DESCRIPTOR, - index=0, - options=None, - serialized_start=641, - serialized_end=959, - methods=[ - _descriptor.MethodDescriptor( - name='IdentifySpeaker', - full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifySpeaker', - index=0, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTSPEAKER, - options=None, - ), - _descriptor.MethodDescriptor( - name='IdentifyEmotion', - full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifyEmotion', - index=1, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTEMOTION, - options=None, - ), - _descriptor.MethodDescriptor( - name='DiarizeEmotion', - full_name='deepaffectsrealtime.DeepAffectsRealtime.DiarizeEmotion', - index=2, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTDIARIZEEMOTION, - options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_DEEPAFFECTSREALTIME) - -DESCRIPTOR.services_by_name['DeepAffectsRealtime'] = _DEEPAFFECTSREALTIME - -# @@protoc_insertion_point(module_scope) diff --git a/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py b/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py deleted file mode 100644 index 6d25999..0000000 --- a/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py +++ /dev/null @@ -1,83 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -import deepaffects.realtime.deepaffects_realtime_pb2 as deepaffects__realtime__pb2 - - -class DeepAffectsRealtimeStub(object): - """Interface exported by the server. - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.IdentifySpeaker = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/IdentifySpeaker', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentSpeaker.FromString, - ) - self.IdentifyEmotion = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/IdentifyEmotion', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentEmotion.FromString, - ) - self.DiarizeEmotion = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/DiarizeEmotion', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.FromString, - ) - - -class DeepAffectsRealtimeServicer(object): - """Interface exported by the server. - """ - - def IdentifySpeaker(self, request_iterator, context): - """A Bidirectional streaming RPC. - - Accepts a stream of SegmentChunk sent while a route is being traversed, - while receiving other SegmentSpeaker (e.g. from other users). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def IdentifyEmotion(self, request_iterator, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def DiarizeEmotion(self, request_iterator, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_DeepAffectsRealtimeServicer_to_server(servicer, server): - rpc_method_handlers = { - 'IdentifySpeaker': grpc.stream_stream_rpc_method_handler( - servicer.IdentifySpeaker, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentSpeaker.SerializeToString, - ), - 'IdentifyEmotion': grpc.stream_stream_rpc_method_handler( - servicer.IdentifyEmotion, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentEmotion.SerializeToString, - ), - 'DiarizeEmotion': grpc.stream_stream_rpc_method_handler( - servicer.DiarizeEmotion, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'deepaffectsrealtime.DeepAffectsRealtime', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) diff --git a/deepaffects/realtime/types.py b/deepaffects/realtime/types.py deleted file mode 100644 index de7c93e..0000000 --- a/deepaffects/realtime/types.py +++ /dev/null @@ -1,25 +0,0 @@ -from deepaffects.realtime.deepaffects_realtime_pb2 import SegmentChunk - - -def segment_chunk(content, encoding="wav", languageCode="en-US", sampleRate=8000, segmentOffset=0, duration=0): - """segment_chunk. - - Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - duration: in seconds, - segmentOffset: offset of the segment in complete audio stream - """ - - if duration < 3: - raise ValueError('Chunk duration should be greater than 3 sec.') - - return SegmentChunk( - content=content, - encoding=encoding, - languageCode=languageCode, - sampleRate=sampleRate, - duration=duration, - segmentOffset=segmentOffset) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py deleted file mode 100644 index ac6ddee..0000000 --- a/deepaffects/realtime/util.py +++ /dev/null @@ -1,200 +0,0 @@ -from __future__ import print_function -import random -import time -import grpc -import os -import uuid -import io -import sys -import m3u8 -import pydub -import requests -import base64 -import uuid -from pydub import AudioSegment -from pytube.request import get -from pytube.compat import urlopen -from pytube import YouTube - -import deepaffects.realtime.deepaffects_realtime_pb2_grpc as deepaffects_grpc -import deepaffects.realtime.deepaffects_realtime_pb2 as deepaffects_types -from deepaffects.realtime.types import segment_chunk - -MAX_MESSAGE_LENGTH = 1000000000 - -def encode_to_base64(file): - with open(file, "rb") as f1: - return base64.b64encode(f1.read()).decode('utf-8') - - -def get_segment_chunk_from_pydub_chunk(chunk, offset, i): - base64_chunk = pydub_segment_to_base64(chunk,i) - print("Sending chunk %s - with size :- %s sec" % (i, len(chunk) / 1000)) - audio_segments = segment_chunk( - encoding="wav", - languageCode="en-US", - sampleRate=chunk.frame_rate, - content=base64_chunk, - duration=len(chunk) / 1000, - segmentOffset=offset) - offset = (offset + len(chunk) / 1000) - return audio_segments, offset - - -def pydub_segment_to_base64(chunk,i): - chunk_file = "chunk-{}-{}.wav".format(i, str(uuid.uuid4())) - chunk.export(chunk_file, format="wav") - base64_chunk = encode_to_base64(chunk_file) - try: - os.remove(chunk_file) - except: - pass - return base64_chunk - - -def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): - channel = grpc.insecure_channel(host_url, options=[('grpc.max_send_message_length', MAX_MESSAGE_LENGTH), ('grpc.max_receive_message_length', MAX_MESSAGE_LENGTH)]) - stub = deepaffects_grpc.DeepAffectsRealtimeStub(channel) - return stub - - -def chunk_generator_from_playlist(file_path=None, out_file_name=None, buffer_size=30000, download_audio=True): - chunk = None - try: - offset = 0 - last_processed = -1 - endlist = False - # for playlists with m3u8 extensions - m3u8_obj_outer = m3u8.load(file_path) - base_uri = m3u8_obj_outer.base_uri - base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] - audio_stream_url = base_uri + base_audio - chunk_index = 1 - index = 0 - unsent_segment = False - while endlist is not True: - try: - m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: - for i, segment in enumerate(m3u8_obj.data['segments']): - response = urlopen(base_uri + segment['uri']) - buff = response.read() - new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - - if (chunk_index == 1) and (last_processed == -1): - chunk = new_chunk - else: - chunk = chunk + new_chunk - - offset_in_milliseconds = offset * 1000 - if (len(chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - chunk_index = chunk_index + 1 - last_processed = m3u8_obj.media_sequence - - if m3u8_obj.data['is_endlist'] == True: - endlist = True - else: - time.sleep(2) - except Exception as e: - print(e) - endlist = True - - if (len(chunk) - (offset * 1000)) > 0: - segment_chunk = chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - - except Exception as e: - print(e) - finally: - if download_audio and (out_file_name is not None) and (chunk is not None): - dir_path = "./output" - if not os.path.exists(dir_path): - os.makedirs(dir_path) - chunk.export(dir_path + out_file_name + "-audio-out.wav", format="wav") - - - -def chunk_generator_from_file(file_path, buffer_size=30000): - # Implement this generator function to yield Audio segments - # To generate Audio Segments use segment_chunk - # from deepaffects.realtime.types import segment_chunk - # yield segment_chunk(Args) - """segment_chunk. - - Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - segmentOffset: offset of the segment in complete audio stream - """ - - """ - Sample implementation which reads audio from a file and splits it into - segments more than 3 sec - AudioSegment and yields base64 encoded audio segment objects asynchronously - """ - audio_clip = AudioSegment.from_file(file_path) - offset = None - buffer_chunk = None - index = 0 - for i, chunk in enumerate(audio_clip[::buffer_size]): - if offset is None: - offset = 0 - if i == 0: - buffer_chunk = chunk - else: - buffer_chunk = buffer_chunk + chunk - offset_in_milliseconds = offset * 1000 - if ((len(buffer_chunk) - (offset_in_milliseconds)) > buffer_size): - segment_chunk = buffer_chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - - if ((len(buffer_chunk) - (offset * 1000)) != 0): - segment_chunk = buffer_chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - - - -def chunk_generator_from_url(file_path, is_youtube_url=False, buffer_size=30000, chunk_size=15 * 8192): - if is_youtube_url: - yt = YouTube(file_path) - stream = yt.streams.filter(only_audio=True).first() - download_url = stream.url - else: - download_url = file_path - offset = None - buffer_chunk = None - index = 0 - for i, chunk in enumerate(get(url=download_url, streaming=True, chunk_size=chunk_size)): - if offset is None: - offset = 0 - if i == 0: - buffer_chunk_raw = chunk - else: - buffer_chunk_raw = buffer_chunk_raw + chunk - - buffer_chunk = AudioSegment.from_file(io.BytesIO( - buffer_chunk_raw)) - - offset_in_milliseconds = offset * 1000 - if (len(buffer_chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = buffer_chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - if (len(buffer_chunk) - (offset * 1000)) != 0: - segment_chunk = buffer_chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment diff --git a/deepaffects/rest.py b/deepaffects/rest.py deleted file mode 100644 index 9a73fbf..0000000 --- a/deepaffects/rest.py +++ /dev/null @@ -1,297 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: 0.1.0 - - Generated by: https://github.com/swagger-api/swagger-codegen.git -""" - - -from __future__ import absolute_import - -import io -import json -import ssl -import certifi -import logging -import re - -# python 2 and python 3 compatibility library -from six import PY3 -from six.moves.urllib.parse import urlencode - -from .configuration import Configuration - -try: - import urllib3 -except ImportError: - raise ImportError('Swagger python client requires urllib3.') - - -logger = logging.getLogger(__name__) - - -class RESTResponse(io.IOBase): - - def __init__(self, resp): - self.urllib3_response = resp - self.status = resp.status - self.reason = resp.reason - self.data = resp.data - - def getheaders(self): - """ - Returns a dictionary of the response headers. - """ - return self.urllib3_response.getheaders() - - def getheader(self, name, default=None): - """ - Returns a given response header. - """ - return self.urllib3_response.getheader(name, default) - - -class RESTClientObject(object): - - def __init__(self, pools_size=4, maxsize=4): - # urllib3.PoolManager will pass all kw parameters to connectionpool - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 - # maxsize is the number of requests to host that are allowed in parallel - # ca_certs vs cert_file vs key_file - # http://stackoverflow.com/a/23957365/2985775 - - # cert_reqs - if Configuration().verify_ssl: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - - # ca_certs - if Configuration().ssl_ca_cert: - ca_certs = Configuration().ssl_ca_cert - else: - # if not set certificate file, use Mozilla's root certificates. - ca_certs = certifi.where() - - # cert_file - cert_file = Configuration().cert_file - - # key file - key_file = Configuration().key_file - - # https pool manager - self.pool_manager = urllib3.PoolManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - cert_file=cert_file, - key_file=key_file - ) - - def request(self, method, url, query_params=None, headers=None, - body=None, post_params=None, _preload_content=True, _request_timeout=None): - """ - :param method: http request method - :param url: http request url - :param query_params: query parameters in the url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _preload_content: if False, the urllib3.HTTPResponse object will be returned without - reading/decoding response data. Default is True. - :param _request_timeout: timeout setting for this request. If one number provided, it will be total request - timeout. It can also be a pair (tuple) of (connection, read) timeouts. - """ - method = method.upper() - assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH', 'OPTIONS'] - - if post_params and body: - raise ValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - timeout = None - if _request_timeout: - if isinstance(_request_timeout, (int, ) if PY3 else (int, long)): - timeout = urllib3.Timeout(total=_request_timeout) - elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2: - timeout = urllib3.Timeout(connect=_request_timeout[0], read=_request_timeout[1]) - - if 'Content-Type' not in headers: - headers['Content-Type'] = 'application/json' - - try: - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - if query_params: - url += '?' + urlencode(query_params) - if re.search('json', headers['Content-Type'], re.IGNORECASE): - request_body = None - if body: - request_body = json.dumps(body) - r = self.pool_manager.request(method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'application/x-www-form-urlencoded': - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=False, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'multipart/form-data': - # must del headers['Content-Type'], or the correct Content-Type - # which generated by urllib3 will be overwritten. - del headers['Content-Type'] - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=True, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - # Pass a `string` parameter directly in the body to support - # other content types than Json when `body` argument is provided - # in serialized form - elif isinstance(body, str): - request_body = body - r = self.pool_manager.request(method, url, - body=request_body, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided arguments. - Please check that your arguments match declared content type.""" - raise ApiException(status=0, reason=msg) - # For `GET`, `HEAD` - else: - r = self.pool_manager.request(method, url, - fields=query_params, - preload_content=_preload_content, - timeout=timeout, - headers=headers) - except urllib3.exceptions.SSLError as e: - msg = "{0}\n{1}".format(type(e).__name__, str(e)) - raise ApiException(status=0, reason=msg) - - if _preload_content: - r = RESTResponse(r) - - # In the python 3, the response.data is bytes. - # we need to decode it to string. - if PY3: - r.data = r.data.decode('utf8') - - # log response body - logger.debug("response body: %s", r.data) - - if r.status not in range(200, 206): - raise ApiException(http_resp=r) - - return r - - def GET(self, url, headers=None, query_params=None, _preload_content=True, _request_timeout=None): - return self.request("GET", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def HEAD(self, url, headers=None, query_params=None, _preload_content=True, _request_timeout=None): - return self.request("HEAD", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def OPTIONS(self, url, headers=None, query_params=None, post_params=None, body=None, _preload_content=True, - _request_timeout=None): - return self.request("OPTIONS", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def DELETE(self, url, headers=None, query_params=None, body=None, _preload_content=True, _request_timeout=None): - return self.request("DELETE", url, - headers=headers, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def POST(self, url, headers=None, query_params=None, post_params=None, body=None, _preload_content=True, - _request_timeout=None): - return self.request("POST", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PUT(self, url, headers=None, query_params=None, post_params=None, body=None, _preload_content=True, - _request_timeout=None): - return self.request("PUT", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PATCH(self, url, headers=None, query_params=None, post_params=None, body=None, _preload_content=True, - _request_timeout=None): - return self.request("PATCH", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - -class ApiException(Exception): - - def __init__(self, status=None, reason=None, http_resp=None): - if http_resp: - self.status = http_resp.status - self.reason = http_resp.reason - self.body = http_resp.data - self.headers = http_resp.getheaders() - else: - self.status = status - self.reason = reason - self.body = None - self.headers = None - - def __str__(self): - """ - Custom error messages for exception - """ - error_message = "({0})\n"\ - "Reason: {1}\n".format(self.status, self.reason) - if self.headers: - error_message += "HTTP response headers: {0}\n".format(self.headers) - - if self.body: - error_message += "HTTP response body: {0}\n".format(self.body) - - return error_message diff --git a/docs/AsyncResponse.md b/docs/AsyncResponse.md deleted file mode 100644 index 9fd38f5..0000000 --- a/docs/AsyncResponse.md +++ /dev/null @@ -1,11 +0,0 @@ -# AsyncResponse - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**request_id** | **str** | Unique identifier for the api call | -**api** | **str** | API hit | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/docs/Audio.md b/docs/Audio.md deleted file mode 100644 index 3889982..0000000 --- a/docs/Audio.md +++ /dev/null @@ -1,13 +0,0 @@ -# Audio - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**encoding** | **str** | Encoding of audio file like MP3, WAV etc. | -**sample_rate** | **int** | Sample rate of the audio file. | -**language_code** | **str** | Language spoken in the audio file. | [default to 'en-US'] -**content** | **str** | base64 encoding of the audio file. | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/docs/DenoiseApi.md b/docs/DenoiseApi.md deleted file mode 100644 index c326b33..0000000 --- a/docs/DenoiseApi.md +++ /dev/null @@ -1,113 +0,0 @@ -# deepaffects.DenoiseApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**async_denoise_audio**](DenoiseApi.md#async_denoise_audio) | **POST** /api/v1/async/denoise | Denoise an audio file -[**sync_denoise_audio**](DenoiseApi.md#sync_denoise_audio) | **POST** /api/v1/sync/denoise | Denoise an audio file - - -# **async_denoise_audio** -> AsyncResponse async_denoise_audio(body, webhook, request_id=request_id) - -Denoise an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.DenoiseApi() -body = deepaffects.Audio.from_file(file_name="/path/to/file") # Audio | Audio object that needs to be denoised. -webhook = 'webhook_example' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # Denoise an audio file - api_response = api_instance.async_denoise_audio(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling DenoiseApi->async_denoise_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be denoised. | - **webhook** | **str**| The webhook url where result from async resource is posted | - **request_id** | **str**| Unique identifier for the request | [optional] - -### Return type - -[**AsyncResponse**](AsyncResponse.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **sync_denoise_audio** -> Audio sync_denoise_audio(body) - -Denoise an audio file - - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.DenoiseApi() -body = deepaffects.Audio.from_file(file_name="/path/to/file") # Audio | Audio object that needs to be denoised. - -try: - # Denoise an audio file - api_response = api_instance.sync_denoise_audio(body) - pprint(api_response) -except ApiException as e: - print("Exception when calling DenoiseApi->sync_denoise_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be denoised. | - -### Return type - -[**Audio**](Audio.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/docs/DiarizeApi.md b/docs/DiarizeApi.md deleted file mode 100644 index 0e63b02..0000000 --- a/docs/DiarizeApi.md +++ /dev/null @@ -1,114 +0,0 @@ -# deepaffects.DiarizeApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**async_diarize_audio**](DiarizeApi.md#async_diarize_audio) | **POST** /api/v1/async/diarize | Diarize an audio file -[**sync_diarize_audio**](DiarizeApi.md#sync_diarize_audio) | **POST** /api/v1/sync/diarize | Diarize an audio file - - -# **async_diarize_audio** -> AsyncResponse async_diarize_audio(body, webhook, request_id=request_id) - -Diarize an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.DiarizeApi() -body = deepaffects.DiarizeAudio.from_file(file_name="/path/to/file") # Audio | Audio object that needs to be diarized. -webhook = 'https://your_webhook.url' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # Diarize an audio file - api_response = api_instance.async_diarize_audio(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling DiarizeApi->async_diarize_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**DiarizeAudio**](DiarizeAudio.md)| Audio object that needs to be diarized. | - **webhook** | **str**| The webhook url where result from async resource is posted | - **request_id** | **str**| Unique identifier for the request | [optional] - -### Return type - -[**AsyncResponse**](AsyncResponse.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **sync_diarize_audio** -> list[Audio] sync_diarize_audio(body) - -Diarize an audio file - -Diarize an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.DiarizeApi() -body = deepaffects.DiarizeAudio.from_file(file_name="/path/to/file") # Audio | Audio object that needs to be diarized. - -try: - # Diarize an audio file - api_response = api_instance.sync_diarize_audio(body) - pprint(api_response) -except ApiException as e: - print("Exception when calling DiarizeApi->sync_diarize_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**DiarizeAudio**](DiarizeAudio.md)| Audio object that needs to be diarized. | - -### Return type - -[**list[Audio]**](Audio.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/docs/DiarizeApiV2.md b/docs/DiarizeApiV2.md deleted file mode 100644 index 067c2d2..0000000 --- a/docs/DiarizeApiV2.md +++ /dev/null @@ -1,60 +0,0 @@ -# deepaffects.DiarizeApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**async_diarize_audio**](DiarizeApiV2.md#async_diarize_audio) | **POST** /api/v1/async/diarize | Diarize an audio file - - -# **async_diarize_audio** -> AsyncResponse async_diarize_audio(body, webhook, request_id=request_id) - -Diarize an audio file. - -### Example -```python -from __future__ import print_function -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.DiarizeApiV2() -body = deepaffects.DiarizeAudio.from_file(file_name="/path/to/file") # DiarizeAudio | audio object that needs to be diarized. -webhook = 'https://your_webhook.url' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # Diarize an audio file - api_response = api_instance.async_diarize_audio(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling DiarizeApi->async_diarize_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**DiarizeAudio**](DiarizeAudio.md)| Audio object that needs to be diarized. | - **webhook** | **str**| The webhook url where result from async resource is posted | - **request_id** | **str**| Unique identifier for the request | [optional] - -### Return type - -[**AsyncResponse**](AsyncResponse.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/DiarizeAudio.md b/docs/DiarizeAudio.md deleted file mode 100644 index 86d3a8c..0000000 --- a/docs/DiarizeAudio.md +++ /dev/null @@ -1,14 +0,0 @@ -# DiarizeAudio - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**encoding** | **str** | Encoding of audio file like MP3, WAV etc. | -**sample_rate** | **int** | Sample rate of the audio file. | -**language_code** | **str** | Language spoken in the audio file. | [default to 'en-US'] -**content** | **str** | base64 encoding of the audio file. | -**speakers** | **int** | Number of speakers in the file (-1 for unknown speakers) | [default to -1] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/docs/EllipsisApi.md b/docs/EllipsisApi.md deleted file mode 100644 index 7c500c7..0000000 --- a/docs/EllipsisApi.md +++ /dev/null @@ -1,59 +0,0 @@ -# deepaffects.EllipsisApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**is_depressed**](EllipsisApi.md#is_depressed) | **POST** /api/v1/audio/ellipsis/is_depressed | Find if a person is depressed from audio. - - -# **is_depressed** -> bool is_depressed(body) - -Find if a person is depressed from audio. - - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.EllipsisAPI() -body = deepaffects.Audio.from_file(file_name="/path/to/file") # Audio | Audio object to predict depression. - -try: - # Find if a person is depressed from audio. - api_response = api_instance.sync_is_depressed(body) - pprint(api_response) -except ApiException as e: - print("Exception when calling EllipsisApi->is_depressed: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be featurized. | - -### Return type - -**bool** - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/docs/EmotionApi.md b/docs/EmotionApi.md deleted file mode 100644 index 5805fc2..0000000 --- a/docs/EmotionApi.md +++ /dev/null @@ -1,116 +0,0 @@ -# deepaffects.EmotionApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**async_recognise_emotion**](EmotionApi.md#async_recognise_emotion) | **POST** /api/v1/async/recognise_emotion | Find emotion in an audio file -[**sync_recognise_emotion**](EmotionApi.md#sync_recognise_emotion) | **POST** /api/v1/sync/recognise_emotion | Find emotion in an audio file - - -# **async_recognise_emotion** -> AsyncResponse async_recognise_emotion(body, webhook, request_id=request_id) - -Find emotion in an audio file - -Extract emotion from an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.EmotionApi() -body = deepaffects.Audio.from_file(file_name="/path/to/file") # Audio | Audio object to extract emotions from. -webhook = 'https://your_webhook.url' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # Find emotion in an audio file - api_response = api_instance.async_recognise_emotion(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling EmotionApi->async_recognise_emotion: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be featurized. | - **webhook** | **str**| The webhook url where result from async resource is posted | - **request_id** | **str**| Unique identifier for the request | [optional] - -### Return type - -[**AsyncResponse**](AsyncResponse.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **sync_recognise_emotion** -> list[EmotionScore] sync_recognise_emotion(body) - -Find emotion in an audio file - -Extract emotion from an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.EmotionApi() -body = deepaffects.Audio.from_file(file_name="/path/to/file") # Audio | Audio object to extract emotions from. - -try: - # Find emotion in an audio file - api_response = api_instance.sync_recognise_emotion(body) - pprint(api_response) -except ApiException as e: - print("Exception when calling EmotionApi->sync_recognise_emotion: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be featurized. | - -### Return type - -[**list[EmotionScore]**](EmotionScore.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/docs/EmotionScore.md b/docs/EmotionScore.md deleted file mode 100644 index 9e84225..0000000 --- a/docs/EmotionScore.md +++ /dev/null @@ -1,16 +0,0 @@ -# EmotionScore - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**happy** | **float** | Probability of happy emotion | [optional] -**angry** | **float** | Probability of angry emotion | [optional] -**sad** | **float** | Probability of sad emotion | [optional] -**disgust** | **float** | Probability of disgust emotion | [optional] -**pleasant** | **float** | Probability of pleasant emotion | [optional] -**neutral** | **float** | Probability of neutral emotion | [optional] -**fear** | **float** | Probability of fear emotion | [optional] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/docs/FeaturizeApi.md b/docs/FeaturizeApi.md deleted file mode 100644 index e3786c2..0000000 --- a/docs/FeaturizeApi.md +++ /dev/null @@ -1,116 +0,0 @@ -# deepaffects.FeaturizeApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**async_featurize_audio**](FeaturizeApi.md#async_featurize_audio) | **POST** /api/v1/async/featurize | featurize an audio file -[**sync_featurize_audio**](FeaturizeApi.md#sync_featurize_audio) | **POST** /api/v1/sync/featurize | featurize an audio file - - -# **async_featurize_audio** -> AsyncResponse async_featurize_audio(body, webhook, request_id=request_id) - -featurize an audio file - -Extract paralinguistic feature from an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.FeaturizeApi() -body = deepaffects.Audio.from_file('/path/to/file') # Audio | Audio object that needs to be featurized. -webhook = 'webhook_example' # str | The webhook url where result from async resource is posted -request_id = 'request_id_example' # str | Unique identifier for the request (optional) - -try: - # featurize an audio file - api_response = api_instance.async_featurize_audio(body, webhook, request_id=request_id) - pprint(api_response) -except ApiException as e: - print("Exception when calling FeaturizeApi->async_featurize_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be featurized. | - **webhook** | **str**| The webhook url where result from async resource is posted | - **request_id** | **str**| Unique identifier for the request | [optional] - -### Return type - -[**AsyncResponse**](AsyncResponse.md) - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **sync_featurize_audio** -> list[list[float]] sync_featurize_audio(body) - -featurize an audio file - -Extract paralinguistic feature from an audio file. - -### Example -```python -from __future__ import print_function -import time -import deepaffects -from deepaffects.rest import ApiException -from pprint import pprint - -# Configure API key authorization: UserSecurity -deepaffects.configuration.api_key['apikey'] = 'YOUR_API_KEY' - -# create an instance of the API class -api_instance = deepaffects.FeaturizeApi() -body = deepaffects.Audio.from_file('/path/to/file') # Audio | Audio object that needs to be featurized. - -try: - # featurize an audio file - api_response = api_instance.sync_featurize_audio(body) - pprint(api_response) -except ApiException as e: - print("Exception when calling FeaturizeApi->sync_featurize_audio: %s\n" % e) -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **body** | [**Audio**](Audio.md)| Audio object that needs to be featurized. | - -### Return type - -**list[list[float]]** - -### Authorization - -[UserSecurity](../README.md#UserSecurity) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/examples/diarize_emotion_example.py b/examples/diarize_emotion_example.py deleted file mode 100644 index 03a055f..0000000 --- a/examples/diarize_emotion_example.py +++ /dev/null @@ -1,67 +0,0 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url - -TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "FILE_PATH" -is_youtube_url = False -languageCode = "en-Us" -sampleRate = "16000" -encoding = "wav" -speakerIds = "list of userids for for speaker verification seperated by ','" -verbose = "True" -# DeepAffects realtime Api client -client = get_deepaffects_client() - -metadata = [ - ('apikey', apikey), - ('encoding', encoding), - ('speakerids', speakerIds), - ('samplerate', sampleRate), - ('languagecode', languageCode), - ('verbose', verbose) -] - -# Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously -# from deepaffects.realtime.types import segment_chunk -# yield segment_chunk(Args) -"""segment_chunk. - -Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - segmentOffset: offset of the segment in complete audio stream -""" - -""" -Sample implementation which reads audio from a file and splits it into -segments more than 3 sec -AudioSegment and yields base64 encoded audio segment objects asynchronously -""" - -"""Stream audio from url or youtube. - -responses = client.DiarizeEmotion( - chunk_generator_from_url(file_path, is_youtube_url=is_youtube_url), TIMEOUT_SECONDS, metadata=metadata) -""" - -"""Stream audio from local file. -""" -responses = client.DiarizeEmotion( - chunk_generator_from_file(file_path), TIMEOUT_SECONDS, metadata=metadata) - - -# responses is the iterator for all the response values -for response in responses: - print("Received message") - print(response) - -"""Response. - response = { - userId: userId of the speaker identified in the segment, - emotion: Emotion identified in the segment, - start: start of the segment, - end: end of the segment - } -""" diff --git a/examples/emotion_identify_example.py b/examples/emotion_identify_example.py deleted file mode 100644 index cd4e114..0000000 --- a/examples/emotion_identify_example.py +++ /dev/null @@ -1,62 +0,0 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url - -TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "FILE_PATH" -is_youtube_url = False -languageCode = "en-Us" -sampleRate = "16000" -encoding = "wav" - -# DeepAffects realtime Api client -client = get_deepaffects_client() - -metadata = [ - ('apikey', apikey), - ('encoding', encoding), - ('samplerate', sampleRate), - ('languagecode', languageCode) -] - -# Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously -# from deepaffects.realtime.types import segment_chunk -# yield segment_chunk(Args) -"""segment_chunk. - -Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - segmentOffset: offset of the segment in complete audio stream -""" - -""" -Sample implementation which reads audio from a file and splits it into -segments more than 3 sec -AudioSegment and yields base64 encoded audio segment objects asynchronously -""" - -"""Stream audio from url or youtube. - -responses = client.IdentifyEmotion( - chunk_generator_from_url(file_path, is_youtube_url=is_youtube_url), TIMEOUT_SECONDS, metadata=metadata) -""" - -"""Stream audio from local file. -""" -responses = client.IdentifyEmotion( - chunk_generator_from_file(file_path), TIMEOUT_SECONDS, metadata=metadata) - -# responses is the iterator for all the response values -for response in responses: - print("Received message") - print(response) - -"""Response. - response = { - emotion: Emotion identified in the segment, - start: start of the segment, - end: end of the segment - } -""" diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py deleted file mode 100644 index ff8bbd6..0000000 --- a/examples/playlist_chunk_generator.py +++ /dev/null @@ -1,53 +0,0 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url, chunk_generator_from_playlist - -TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "PLAYLIST_PATH" -speakerIds = "list of userids for for speaker verification seperated by ','" -verbose = "True" - -# DeepAffects realtime Api client -client = get_deepaffects_client() - -metadata = [ - ('apikey', apikey), - ('speakerids', speakerIds), - ('verbose', verbose) -] - -# Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously -# from deepaffects.realtime.types import segment_chunk -# yield segment_chunk(Args) -"""segment_chunk. - -Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - segmentOffset: offset of the segment in complete audio stream -""" - -""" -Sample implementation which reads audio from a file and splits it into -segments more than 3 sec -AudioSegment and yields base64 encoded audio segment objects asynchronously -""" - -"""Stream audio from earningcast. -""" -responses = client.DiarizeEmotion( - chunk_generator_from_playlist(file_path), TIMEOUT_SECONDS, metadata=metadata) - -# responses is the iterator for all the response values -for response in responses: - print("Received message") - print(response) - -"""Response. - response = { - emotion: Emotion identified in the segment, - start: start of the segment, - end: end of the segment - } -""" diff --git a/examples/speaker_identify_example.py b/examples/speaker_identify_example.py deleted file mode 100644 index fcfd6da..0000000 --- a/examples/speaker_identify_example.py +++ /dev/null @@ -1,51 +0,0 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url - -TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "FILE_PATH" -is_youtube_url = False -languageCode = "en-Us" -sampleRate = "16000" -encoding = "wav" -apiVersion = "v2" -speakerIds = "list of userids for for speaker verification seperated by ','" -verbose = "True" - -# DeepAffects realtime Api client -client = get_deepaffects_client() - -# chunk_generator() is a generator function which yields audio segment object asynchronously -metadata = [ - ('apikey', apikey), - ('speakerids', speakerIds), - ('encoding', encoding), - ('samplerate', sampleRate), - ('languagecode', languageCode), - ('apiversion', apiVersion), - ('verbose', verbose) -] - -"""Stream audio from url or youtube. - -responses = client.IdentifySpeaker( - chunk_generator_from_url(file_path, is_youtube_url=is_youtube_url), TIMEOUT_SECONDS, metadata=metadata) -""" - -"""Stream audio from local file. -""" -responses = client.IdentifySpeaker( - chunk_generator_from_file(file_path), TIMEOUT_SECONDS, metadata=metadata) - -# responses is the iterator for all the response values -for response in responses: - print("Received message") - print(response) - -"""Response. - - response = { - userId: userId of the speaker identified in the segment, - start: start of the segment, - end: end of the segment - } -""" diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py deleted file mode 100644 index 8356ac4..0000000 --- a/examples/ticker_based_earnings_call_identification.py +++ /dev/null @@ -1,54 +0,0 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url, chunk_generator_from_playlist - -TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "PLAYLIST_PATH" -ticker = "TICKER_SYMBOL" -out_file_name = "OUT_FILE_NAME" -verbose = "True" - -metadata = [ - ('apikey', apikey), - ('ticker', ticker), - ('verbose', verbose) -] - -# Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously -# from deepaffects.realtime.types import segment_chunk -# yield segment_chunk(Args) -"""segment_chunk. - -Args: - encoding : Audio Encoding, - languageCode: language code , - sampleRate: sample rate of audio , - content: base64 encoded audio, - segmentOffset: offset of the segment in complete audio stream -""" - -""" -Sample implementation which reads audio from a file and splits it into -segments more than 3 sec -AudioSegment and yields base64 encoded audio segment objects asynchronously -""" - -"""Stream audio from earningcast. -""" -# DeepAffects realtime Api client -client = get_deepaffects_client() - -responses = client.DiarizeEmotion( - chunk_generator_from_playlist(out_file_name=out_file_name, file_path=file_path), TIMEOUT_SECONDS, metadata=metadata) - -# responses is the iterator for all the response values -for response in responses: - print("Received message") - print(response) - -"""Response. - response = { - emotion: Emotion identified in the segment, - start: start of the segment, - end: end of the segment - } -""" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 65b6dc9..0000000 --- a/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -certifi >= 14.05.14 -python_dateutil >= 2.5.3 -setuptools >= 21.0.0 -urllib3 >= 1.15.1 -pymediainfo >= 2.1.9 -pydub==0.22.1 -six==1.11.0 -grpcio==1.13.0 -protobuf==3.6.0 -pytube==9.2.2 -m3u8==0.3.6 -requests==2.19.1 \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index 8dfb393..0000000 --- a/setup.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - - -from setuptools import setup, find_packages -import os - -NAME = "deepaffects" -VERSION = "1.4.1" -# To install the library, run the following -# -# python setup.py install -# -# prerequisite: setuptools -# http://pypi.python.org/pypi/setuptools - -REQUIRES = ["urllib3 >= 1.15", "six >= 1.10", "certifi", "python-dateutil", "pymediainfo >= 2.1.9", "grpcio==1.13.0", - "protobuf==3.6.0", "pydub==0.22.1", "pytube==9.2.2"] - - -def readme(): - with open(os.path.join(os.path.dirname(__file__), 'README.md')) as readme: - return readme.read() - -setup( - name=NAME, - version=VERSION, - description="Python bindings for DeepAffects APIs", - author_email="support@seernet.io", - url="https://github.com/SEERNET/deepaffects-python", - author="Sushant Hiray, Venkatesh Duppada", - setup_requires=[ - "six >= 1.3.0", - "pillow >= 2.8.1" - ], - install_requires=REQUIRES, - packages=find_packages(), - include_package_data=True, - long_description=readme(), - long_description_content_type="text/markdown" -) diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 2702246..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -coverage>=4.0.3 -nose>=1.3.7 -pluggy>=0.3.1 -py>=1.4.31 -randomize>=0.13 diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/data/clean.wav b/test/data/clean.wav deleted file mode 100644 index 9e6db223981b65046787ac13994be3098ccbf5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107066 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

#C}-`?K_c2EX_y4Mp|6J54q^=dZ5b|u?V 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 diff --git a/test/data/happy.mp3 b/test/data/happy.mp3 deleted file mode 100644 index d70580b041127af3b2c30c30dda3fbaa8441648f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46437 zcmeF&_gB(?{6G8`Q$$2WRKO9qLR`2Co8TU3I8!qPw`u0c(k39HsTFRtES$M2GfT|| z&RmtVJ=Dy~Y)>2SF8f^d`CdO<|G;(5#X0cebvTFf|U0p19asLV-UwT_106 zhvlOZ06w#3%Wng?0Kf%007oh+ zD&z2YjTJgN28M>lG)v3XYc_0PIygA9Hf{3u3kcZC2@j8ojg3!ANlDvx@L;+~lzlia zuTXOA*vZPu+WMxZ=JRcBm#%ho^$iS++?trUeecnu>AAV*uim`*@Of$J=kGr)S#ERK zpEj@hbMo(|_wUICx@mi|&A+q%|M>rvE3hms96*2S+ia^MZ}kBH6iEO8BIdbcO|Bg0 z0f5!=eVH%KN=q%|z?F-Ryp-EgMBT!6%GD4)8X zn!1Vm4mysO%e*~2dRSk~ULALNVFLhmx2`^{SZ;>hzOVY&x6c4PX)a;dE)fdI;*lX&^goo$}6q&EpXGH4Ci`OWm^33fw$&z#pSo~a>F`Ar}mc;eMIQ7qnvv%GT zszC#524vH+Tf@(!O&X^>mA6N$$lvH7of5vm#$CiBbcbbn+_P=Ux~~WioFbJflEg^=DYPTpUULo?D5^rR>oPzz-U#3!sC1+FYs1l;5hYdoFqHFXsX`vDJFrYi(q@o+Zb24) z{djU@1frmsQiaj%&4Yxk14BDYaZWZMK834Zt`Y%%d9O>L2R99~N8CKaBuDDislF(f zCcOuEKy|YvnMJ_e#^G3E65;ocmhc4d($4^U%e3)#f5jOLMroai+9CTZjwwTc|EsC& z29>EDrv)~u+MTKVAYil&P9xzpiV09M9OL`!z_AZcFEu>Tt>hlDwKs!6mHquchNnH~ zG|T8oTH3e&Q@OOZu=jX2)otg}%n9Gy8TYnrs!A(X;&$qS(zh3x{ zU6H3DXme6!Mz4+0E;pTRHh)&z<#}j#CDFO3?u5H%E`yPq#u6z7i)f+Bz2T)*h%*-R z`az!oTt{8vM08?5_G)aE!4YCuRjsK3e4{oFlPS69as*5qRmN;n%K=r>aiBQ7VZaH1 z=;BZMMuxKWqH{-b)0IJXku0ki4E*xWZJ96ziIaC2jd#A6pHb~{pu0M96<7yh4)lPP z*x`DsRhxw8@Dw4!U#E24)3B}&Q;}c*!Y44(VH?fbgP`rP8=&JWr9+u)i#d;mmIR0X-;l9Zy7rzJBj^1$W zVX`h3*4Ns5s?z3hiB`h{cQnplJ$9HZRaQK`iwUhyf~%{pVGDcg*&ZY?SiQ;_hUZY) zBBLF{GAl*3?ZM&vek+{1olXG`Wj+^1wNS`VXI~c`vc=blqj#RmEtUup5SqhdtmAbr z>>zh}f5-(1mfE*CKixa|kDP8_7&UiCu=8JXl&Xf>I4Vb%6KJWv32TegkPz~wZIc7F zp2Pb)4%u?Ti3TDX^I}4rx(1||jLVZC!YS&s9w<_gmY(|^JBR=%gfc`P>6ugvw!OCo zE98#FC7h#)rAc8N5S*>EV${S#jlQ!#y9=q)vf1r7q=k$tnj0n|p zL5%unO^sU3zIP}{G4!!gzr{=YI zPde;=8y%YcHApnEHdPH-3ZgA+ZM2%u$F#jZyWZo0t!qu3$4-%N6TM+zTC4`J0S*m? z)YO&-n^ox(N!u9YexxgyL{R48>8{y$2`G`@Wq>l}^i&R1R`n;5D0|RM^Oh<{_f@Ul zy80Glx|q#Y*JTba)mg-M2@?ak>u#P|gNNVMZf!sykx>W&4Nf{#4o5}qfC;t`yeZjW zG?hdLBzWCi z%}pfeK2qNMu+zHj0eQ~RcN674M}e4gXw5@;y-*>jwBy}YM&G+z`s;4%9R9{0RzEBc zB?)`SNA_{<_>a6ZCb5R)p|&C`M5vB|6@}Z?mFsaxn5CAbNl@g=zhv}+()l7sJowlU zvXabcmLfqI%u`)=$2O{{ZVRdVhQIE2zA?gz%_zRDK2#fJ9j8B~^23AP-j_NO)>il$XJ1ux9jU*7U&2>! zTKv85aklFCcY|b#^E3j+jx&PRV-hb!?F$CT0(qv1L+j%ByuILu+g3u-&i*_PIhiY_1hth!yzAtG>@7vyOuq!zwe z)g^0_q=i%2R1;z~3IyVGP3VX)TAE6cc~S57Gprfh0sV{Z8D42a0BP^E-m??a(ypiy zszg8Zi%Flto6cj6b$6$o)(~Re_^el}jy>|~RKQr#m4uPnLl2WQP$2}U?ba2iQp$WD z(Bt1gFLVaX#pX6__-S!!zSm;#nJYmdnfU$wX0#Qw;LM)D`aR{%_DP{VJwx5r0(Nf0 z{cQ>wCb6J+*~)G^O`wivHLarJ3Z-+mAJM7O*1VZ-B|k!kpycHRLX^BN-AYOjsA=NX zD6i=@0cuoGDB3K|TuRUN|Af~Jclbk&lfJYzV5o}t@L$TU42U(zjXJQL+g7~gfrXGk zdZrvIewuKuG)KPFUqW0&ed6?rXr=(wywaOZ^0os_uHMn>paOM3PnnjGM+$!xXZYfxtu(#cRklAR9?Dl|wk(a^HBU`6hFi^NK)OTuBsq$BE#`0+Ss!N8dvRzbp$ z%$ffF1I-CEj^GZB*HXu(>}%_$fo4?HDB5V6tT?~xp}xp&=xlkzc2BCxOAY`#PhXw1 z2Egzl9n|^rsO}d*NKfbNBWp3~Beynn(~k(xuW5hbSFhCCdc=IJ-REMXPt~to@$#E> z4{KN9U94w*wlLV9lUZRg543_VQQWv*kMD<+TqpFla*D^)R6auS&I{Me?yn9hFfGY2 z9pqtr)|+uun=j1bFfW+mdOf61Xl4nUO%?~MH^n>PyXHx5+MZT$e5)76~x^e zeQK55k=$6P*BB6|y1nWQ>mmnAapa&M%GMU8m+hUgc1HLbJIy z9f>}0KR^t9m|K_My!a)pebpZNNPWNH`R7JzTcw^DI-XZY_GPqJM%)XRG`~z<6S=*7 zR}b0_8#_itXh&La3P$V;MAQb2xZxZ zxQw+U&8d(|C)F?I9zRl>UHfmAaQ7AO69dSCxv65!z+bgS?{BDh>j- z2pq-IujkuUIzk}&GKM1>$FHR}hlcmJWN*7uixwgi%!~Bl=JwtoMcQb>%y~Nyjmt|+ z+{Svyo@8d(j4ePZ^!3M;vrr z;cNZ%inFtC$524rvrj2r^?7aKSF-CW!qs_r_&THl_Ks6^?Cp`mlKs`-|poJ zS|Se02 z`egoaL@re`hk3NfKc(F)HD>HUg}cQ{la$g|eaPa=NaNaDKlCHbdNmXxM~JIy<`=K# zo^GO>65l7z_)0}*zT4w|w7zTn^dxjRGH7TbKmbX1?R#94o@N#FX@!SYMSiwCGy}ZS z3*`u=0s)o3&RqEZ=0?pqem0(M@lh2{o3W2%DrXS+l_S%IT_ddbmtR3yeRm%wq2u%h zqYfLNGa5mN3mF4~!|Q%(US&Xy8DKC(li-S&;#bh1KBZoz13iR>j$*Sia93V7AvH42 z*_U||T*Cp?mI95sad8%D5>ylu4?*y#nrwfmSG~nMSYNuZWM8*xaQ&{?3C74X*WKC? zlejh$rlkZf>*uWVSt zL_X|zpfQ&_&1kJ)sMW8!s!_JGo-tY=!eiy-11XZ97FJkws6EmOyr`2v^T|^6&fwXJ zyQ-l2@C|xlPv^sJxw01q)Qn0R^bfhs=}WFbL&+Mqr2oiqw;PT8A97-uZF(Uq$kzZ> z?caZ$r7!94c6%Hc21U_m1#k~Qf{)>gFBA81Z(vG;U*JDopB_npj=_(t+Lt`rA%77t}sjQQ)l-+g0C;Np-2m{;P$XxP{KDbz&D3&O>Rro)Zb zaDeGhlCyI{Glc+WVJO`^P&y9^kU&Qvgl{CS`5`on#js5WkwbNf3c<3xHqD_ND9C^& zRrjUgb+>M}nEF`AHLtcq5?6a$x~YVT9M{kU3JACKToeG6vphV~JnfT^1@+9EWtWhs|Q*{DH%fw%Y(YCABoX2megEbe*TTPr}_M^wfDwy})`8Z6&OCu23iZR)k ziQ(554b0{2GAx{wG}mwq+|LOk%R{C2INo$dGfcrPoD7y8cgAs)`57?yT2hgNo+rdn z7Vz4~8@4QMODrmih)L4^mE)#d#su*dr zK4_VTMyJukpfm)FlP9L!2OHtf?Fr`@=0GF&n-Jb%BO!T5f(%R#&t*kyme+Qr{>Gf3FJId5=(L)eN}v3CpA6LROl6~`G#M~Ll_I3pz@ zV61s%@DS)+t8M}w{IF@xYLF#&AT%jsr-O+T$uWH4N`cjpkF$^JyzLM_@@qCdeK`H{ zlQgv?X-ntJ1L=pNkLM^Uz23E|$+N1>XCMNJXq+lC#e2uiH15^)Z)6)&L-gcJx|-^A z98EW05ZNTv&Rxsk72BkP(+_!TIs&%Xt9%k{&OHSURx8DGOXcvGmxo~>d+{unv4bx> zqM*0@`Ixf~J@&eG7g%`xZP!hdOrSVC27qFEoeyg{W7%;TH7d1%lGx|)Gm}ZQ%rg?G z&gze&l>V&wy6!GXiOzsnx$6x8Em}vEJqZfe!MOoPHEpxriwx)GGlo2!(iWm`=?TDX zur|NwkAc00dzQNfU|ng6N79(*R6q}+G|UHY^_I4m=H%v!((T3vi6<{Omy)Jad_uAg zn<@jOu0a_FE4ui~KE-IWU-6lFza9aCf5cj#=@71~R)c24pCkh29ZWdykNq)jIMBUc); z^6U;n+264oO~ni|0EfX}R)F!OJd`dhOx@aBcX*oWe-T+Kmcn*&oxyVU9iR$`rl6WDfC z%vIMjr%=`(N24v;Tn>og zjjqo)tN4v_!)}D4dE*vX2Xbt}&;go0f@r3yRWra`2yb%Y$FmI-VFy-;NTP|0eja%b zQ>6;zz^XzBWW><$hxvKcPi0Se0P|pp#bU}sU6YUdl=TVYPA3(OwzZS={22{f6Ys4J zj9M%rh1}b2Ig~qy5)Z(SIs3?|FITGEywhAuZXBj{8pLC%CrHTT&AM4&GF61|WC9RI zeY?L72K>5ujM>K@QdZ?UlaWk_7;WCs%2QzxPPZTFN#vj$z9}Fo752aI9>g@CZVs{< zb}HsW%|4rLOWGYv`Kfax(%j2QEB5?_(_A+~BcZV=;mv1np9!_Z&d-=vtAD9-02&kz z2b3do<~S5!UZKKyTQ@Y68K(;ZP21A|$azJtO|+E|PX>o(0{#eaJTOIvgJEfpFXB1k zrIr!p+s;2S?B_*0PV#E=m15V@=)$qNDR3|o;Iri`nU$nb40Rotmd6=9Vy6s-l5jhG z_1EEzwr~0HEKAV;huntjB||UQs)rN*$mv^er^bK$-$fFRq1{M;fM*A{<;$ts&e-GJ z?Z9#nHIz&B#lfLa#sF#8t~n&n-O*xDI@h+zxwrmuf_+qBzaY9J)DWJ!miOG4@+$_dFolBw zcCXl&m_{jcO^B2uh|JmQeg}D&FL2^6B`=k)yINZ@fPM7c{aKiiIpg3yKX)F=tb*~o#F3~%c4oH=!X=~ILb<^6h~PzPc6L3%vWK!_>)p+ZyB=IC+g&86Dc=)7 z_s>r9J}Q@Xqn+`*(s8PJ2uyH0ZVzSRT^ZrsedR;aLQd@<`nKAo z92iKw+6h#yS@H~Jw z0unQ+MEnX6nMZ+DK#;U?4D`RP#v~4y1L64Zxv52#24E<2&&+4cX>}NR0Ic|)wmLeM zrv`;DM=)Kqic!r_F$Uen^tnLx7_pjQ5S2_@*Xf}!Ai+LbQ`jdo{~vPcOZx&`8y^lQ z{7pIC3lS#hk0$?84m3Krrlb=_{q&<3aWl$4fpx^+GX}Y{fqt*|3F*utrU{GudS4d8HO==vE(Kncy{M+K}C#tWx3^%7AAq++Q!l0U`P|gSfiQGJ9bmbmx5sN+}BetMiOJL?s$kR=)b|# zKbthW+CqA&Ik#TdvzbC%#Z-vU(uuUMLwn7AIKWCD$c%kSlRkwO*nlQ^p>R-6<*rqq z^N)`bVs8(ys{@I@ zryf(m04T}(oh_`$cG}G=97X5gcX4TZxOIUXadeC*4if=RSJg8{;%%Ao>WGuRO<)G^ z*~_cpO(-6bW_-u~JeYxzrS^2$-{~;EL%Q6o4uO)I(Fhns&;BjVM~+4Z%=J#L(i0oW zyF$ESSZ5XMZEo}XxYJ!66+3m}*dKBm6_)7!Lyeuc_5PAG@QpB3+8y(c93G5E7_6hs zLuSqN6(Abfxp>LTi;ia}U{GWh9KeUmgxHV!w*h+}`#(}xd^NtyS22sfG2Vv>)MnHX zKHP{E_JQQmyXzZk`_Ewbu`xf+0g0EP6pu}!zDzZ%aZYfawSF%xy| zckq{xGxudCjqf=i3Zx3bGqu(PeIT!+xqzx502l#DPl^@OB%E&;XUHLNt+sduma`=m zp`(hjFFK`Vafi<%zdTV*VvriT_*C8FhY~WixCu64S^THw{wk}4-tvqvG*boORpB0f zqykk+vd#N-Mi9;~(e}A0C___aT{v+T^G-@@o)+_~D>Z=jEN7k~-NAj+2(&ff9Vbno zPHfD2r}F`X?wp5XeqKw+8H~Qs;1qHje`NKvoV_Dzdr!F3h!5!!7#t`L>!$c33-N%M zUZ+WXU;UD&MiAepU5@v1Ee%knSvn+1xge`^Cn*nzaJbNV<7l^hiNr?#N~X%MRB$bE zc;Kt)xU{V7dg+e^3!O_EjVsu;U#jdT3{Q0^K977Jz46U~AKx!r{V%cMTISSivk%+F zd|NV9K@@x>jAyCe|zD_9ZZN+-BLXF)*R!>U7z( zA>B8Dja-!(PP3u{@Ocw~0Z7oV>KPe(D3q6fdaHqYU+qz7Ee7HU$&4)oQ!VK*zBz|v zo{E3;hn!9N5;edTa``st-&k%eY?<7qf8;&^aJ-nF6-h)%zTA(%xG{)0JO#`VxLk0y zCv~&U1>OB*%&~R;U^x_@;B7}EZ3x-BksKgS)4)2TX~Hrda5Hh{suQ!`LV zZ#XospBJl8qnRQ&txP^P{R1I8#NMy#nGp_c3>kpCNRa-IqT ze8D;mvPK4AsO8>k0LTn%;@+e9Xwm7_ox9?FPaOR8JM+Qs=jLyJKe}@3**+l_2sLh% z$Q|Nyx`UK%crm7-29AJiUH#02YT`!&un2k3cmw=%OTJ23S|MG&OqZS2+PiaE>86VNz^8gRa z_GyM^VOHsYK_d_lh!m5Zm3B zv5X}R{O#?x@oP!)6N|?eKCOGal=5dX0Rl#kxcx;ae)E{zd!Al-~Lw1*M>-;OM&$b#J-5v99 z#)^c~bV(%pfQnfcp^J!jg4l%NO6xJX6d1|7bWXGK1%jcRDe4!mSl-DXv(nav;z{b@ zi3lUlyY@*DGm&nhqDyP-pncVP>0r~5RVhMx%jbp~czmf4cvsC&LqVmy@qqmnuRz)y zW6#~KRceZw0RR4YeW^utuOD&}py`i=SbP=w;PV`Rto~I^j=NMo>(2#6AmevH1U=Zu zw}!Qke{_7g8uDYl^JmSe-#=seXURN(2Y~P(o*|C{Chx$Rs6Gh9FcgvQiU)OT0wADv`Y~3jx0s5O#4C}WS_RoLnCXhnQax4l2pomd zMJTRxU`@+AXH?0^XWp1R1@-ABICfbn2lK;B@^Nq08CoW{AEdwW9eYsM!u+ zIcIfs4Hb}kWz(wCGQbC-rO3zKICXk@I(Fa5Q&9!?u5Ie#rKi;s)Z|4BK07jOL?yUqTk9Nr3Zb_CF7L)H!4#AwhsER+Tfz*Bmx?)I93 zavK?0@NKkr6a(o~nLrBdV$hFQ?w@jv=!&0gVX-_%4jYzfq7L2Lg5^5QEBiV2o!L60 z*`z4a_GYj2%O-;U`mQ8y37MXoq@|~hWv-1dt zk`J1@?MbBYf zBTc&6zI96|NlY1}&-F1-ju6Rm!u#OMQoV`VDr(Yhwz!Mt-@B^mArKy|nbVM))t3-Z zu)163brA38oQW{q)&b?$;;5vmUa%sbj?7{(q?M6bEH-3|7nAoAoBGW9xvG1Cj&|puz}zVS1wd#9uu5AL_=Dh}e&qtz;E(gBG>j8guO<(X#bX;VM}MZGk>Gjvb5ScA1${OGAhyy1 zRAzewe@V`A96-r1_I) zl5Lwqo<#vwmUU{MHWa+h`eYEUba!-=GLiH1cA@Q5_jwdj*I7T0ajP-b%^-jHm<}TN zf#Uw%>4%3S%%(K-18?bmpOYldJFkV6J6&9ifEK4Paf1$wCe+>9VCf7PMV=jFChbDj zIy!57YdKaSrXdWnjx5Czr|Gk&bDCkA5D-?Gv`btOCsK@v@6k(F(Cb-ow{dgKWKd(g zc4GYgGM87s>r+NH`cl6B{`U6TgLi;_1#J_kH%$RF!`q{D3U;#h~-;EIh2&c zp4ta3|M2=^PiV{&hX{vtTb<%0wo$&(O+johP`X!|RckzW9D6iNx}^sS9XoE)XoSp( z7m)%5r%BP?2CSV~@+kgAXAp*MzS;L8^If~tv*u@>24*)Wv0s(caP^g9dtw~Ya ztxv51m8$IsJ5Ic=IkqQ<L?6~`7%i`?29!&CYP-#5lgYT6@IgqeZxCFaOt+A^-LK&$X3UUmqCjJt&5Y;>u}!D z&CL|*Ey)&E$<}1UFpobwG#x}=U;DWXUmCRdTUb|I*-G?y4)^~{uI0B=E6bzzOUO}s z{p<^OB9ZZL7sj2YWek!@iW}8V|8>L{GZmv0ACMt1Mls&HD0=AsY5h=2PRdfzHN^3y z)7x(R>=;go4BFiFW4qVZJKKX^G+Fy;W?aoPC<0n-aFMN**`6nw+b$ivwefk1=yRvw zGYzT=xORK;q6Zc07LsNC&GemM+U3$U524t=9*FL}GR@g2iKr9fnh0tnA5sQG5}6H< zI&dLxoKN|38F%lFOBDH0(3>RbmLcea@ly>xQtMX?w_=Wwyw4%= z6|#AIyyFwg$TOWH)_+!?NpqKDpBIWh)?jWL-^EYZCzd}y?J;8tJwgc2-hVxpW*wS+ zYw%=y&sS@&#QEYrybr|ez_H64EnPYu|Jrl^Y;ND>-4CYT*Q%a;T=e#L-1*`_0KU8_ zRwPGekZBCLFx8#n^>VyiZxWUsRcV|9KGp>r3?&q~qsxdc{GdCm3X!1G%qPz-%&TNM ziLq)wE(rA*bLj$6sCg)7^w6*3tM2!nI2DDP4fT7mt}uNA>Hvg&L|u?I(&?GwXUeu- z{})iF=Jti~z*UaI3z4epDJsfRAy8VUeSf{Y6bW9Jcj$l>5iEfrODp!sM~uURpLcy) zzg2WTe3yRsk2#bE_Xw;X(#ew4D22(Zkj zq;{4{dGIIX;?uuT{QK-44CMb6N6Ooxj(#qO_$!VQg_${s<(t18{;lWSj=Hw+E6K|u zivGcDs|d6z@sjrn`fgv3F>B{UN_%Xa)X+d!pp`i0+64ZVwb@797Xvm-#&vMn6M1S_+Y>8tD?6#> zV9XhJ^WZNDp+~abq))B^CE{kjh4*yV)qHy9Zf_UZoSLitO?sfN(?6*|(O><6`3}#S ztW%9q(Pw%dpxjNSNX?^eiirW<^!SO7ofk~1&jwjhsc}m|- zZFV%eG!*)moS}XQQ7PHwUtJ9=^Ec4uCvX;^20p-i)V8(rh?)NI&rAIhQM#i9g9x1> zmv76(qkTF)&c4|}`PZ6G-tnjFFMglZ9o#ztuR>!hRQ zbZKQHYoej#(z~?>)g(9_4lm2!Ih4n1snWDJ^|fL#pnK_xAg};idMWbrxt8x?+Spe% zO^3OBuz_EE$T6$wO1HYsZSc7+_Zz+h%u5h6-9ZEr+Tazm;*6Tv{4 z%3StS5)N$azvd@~4^!~8`iRUlk7XgcUsuzm*hL^+dJcr)_0?!mZrSp66BZO}HDb_p zou2&1Py_pb`vz6#VGuO~Jl@>eZOmx)1MO13wf1R|`9)>CrN5r^a6T#XAH2_>2mEmSjT5q76aWv?B8FkpPtKLJmt zh$*qwSp*rJq@crjR!hKQRD&9ktC^>FF|Jf&ecx&&aIg2>>z6xZWv#yNVPyV?^(L=! ze@wKuJ;KK?Zd9p9U#I#Foeui!ZKT!a{wL)Q<$QbOIcWEAob#`)#xV7ilAYLpQ_g$s z=f(h-!#eS(CMj3OQAd%+?sm)cP$=0x**gVR!PwpY>ku3&*WY>d%gYJMN)ptGD9`EU zv>ppE<>pf`=^I0HRQajPVGs#BNf_vV*YE;)$lUZWrB<6eRaVy>Sn7GPH%3Ds6$?Om zmO7aFW_3bSYxSJB!{TKWAnTLjTo1@2bXtg<7pt0^-HW~)^ajIQZtnEB5HfY5kf>``R}utyMwUnCzeM- z`|JS;RSs`&cziFu>@Hdo43_W;R+wB7nu}mCxJ&tbkPs(h>&Yx8HH{=FMSLM!0}VmQ z1po0sx;u}zv1$Gp*F9^%%0k6*Eg-&zCtfPn+iy4N@exdI?Fo|u9|%haLwKh?e6=)k zEUfvsnn~T(nYS|H`o-K=dm<(S!)ici%a?xQ$;C6yvDreeXbwNf1>CXI_oAU&$A+!_ z2hf$v<9+VHo=|y-rc00=T3* z-z64h(h%;sP+4ym$$P|vLGS0^IGFn)UQUu5p76@~X6uVy-T>%&`fw4XVz5Pa&icsK zh8}4xl7YbuY|d-_L#{^jRq8dUacSSOF-6kyN{!Zg2h!UeMvTAY&aSB4P{F*x3mymf ztZSxKNRR>=g+j%Z`gDbpwg-P}Sl3|SC>zWyFK~OLt}57NV_JPBx8hgjsp}qJeedtP z@G`mZEn_Tabi{KHnR4kt=500N;MHqplM#zY)fVK7CRq2%&#tAOGb?Zkn(GUXQw;AA z_gq(WdA*}_$RM&Kc-u+itFMPIHbjYF@&_N_dH0gSx}irg7GCdU$O7H1*tlfqOMWKspKS3U*HLSVo7;VpVy2I z0&xaH1S1}K10lj($E4RF&4j(fLXJB#NCzSTxEhC7)eKQ_~&^t#_6Vv<`|HpBo3)I!A0j zQNCreBSfcC?mTo~#Osu=5hEwS{`TvGvSNTH$Mzdi|6%d39;{}*yzYZz-$LeRZ#+}} zwypOMxd%#L<=n5UJnS0%OU~d%6HBs~WKPY;1A620m)@>bcRQY^ct9@RRbJk2p`hf+m$&3yX7jCZQ*~c{nAp0KnrvS_{rz?f7W@)+OVZU!k#iCA4Vk&dc#V8_){iee(6C}aY@$(~Pf|nLW>>`I1bmsuqjzW=^T@q&Ymb&@?~_Qw z$lq&^R3jET&ZE;R_3g;atuW#kWO%fVFMVrqAk!ZmaJ)Wmr`S=## zA_J2}uF3)#fOPU*;7o7}j_5uIQ>dN~+gwKNPL#93d#F z8n$Teljm;==ulNz?WbS+P~8q+d!Wi}eI_h)jn~e#wF-qlC_TZ^uJO%>*Zv{*MYIGB z?sa=O@Q<9HO@yLSvhFeiE8g-x^mwDDE2Nt3f!jsK-Gp?+&b()qC+(|36_gKLxF9rb zf{uF;+y^@mD$9o1cL@+!G4@^#!H3R1S3 zqv{SitbC*ENC)dJns{S4)5%y(B2eo?GY-{_rH$|pClC8sk#GqWeAp3a*i{5zn>Ag@ z!`GJ(cp7ltQ>PwZi6ecvOVPT*LU> zD%@_C5*gA*^fb0at&uL}cW5%Vz*oIxl$BzL0{nv7(r!dPlH_RKO%<1l5}IM1-1 zAEZ}UpjOf4c15xO$cY7tZ>6A)s?cC{>c9z1WnncNd0jhzG;N^6Q?!X!KfN;N+rUJk z^qP>wK-jDd<_p7ySXqwD#9Sz8u-1QzKIu*MyHErN7O?$kMwKckuF}xH(d(IZo~I!W zrf~ApPY)Mw%+5m3wA!*eUe}k1UELu_RHj^BZRcYBA96nh-`B+04nG=@{!KYu>oAnk zZpc4!$)@TE>2|ZzDJ5;8pK5VEn~K#U=u;087~q{fF5Q#lsk?WobGg*JM0HAKka|jX z%k3AMQTHd5P{eN1?7Q4EUvR*;eL9=DlARD^jxg+3h4!T0r97l)x@j|Y_N||_;Dhn$>h^VX!=(G_ z(rB3DCDeI_lO*&!{gshtGdtoK1b%r^F|?&=a#_>?e-Cf}tcRI{#?b4D1tiQh%0zVLY$uDc4; zEeh;oJG`*2&vj11N-+khk_$8!ukR9^9FFav6Wgs;W!imvB#3uTn&Qndp3tup*Y-) z9o!*l@J}b0^Ahb4f5?3lEs^~CAf5k9&M;=Hs#5I#ZX~gr?g$49K-NlekZR*lPIj$Z zy0SL8%@;HdbF`3cjYRYl0c>6e94>}Y?dvW;J*(QMXZ6_&t^quXfpJ zGTB#VzxLrHpM(DmEwGsG4wj}iHVgq~xjRg#Kyop<;QU)nGxV%|y-exKb?_n8qGg`FT#g4`@RYsp$sb$Vl^*H-X^>ZxYiV$s!KKW1rPH3Q%|gl%zLVrsh!Y*x4@RPWb+#>Mw!(s)u&VgG(Kchuc0@v z)y7_~@vb2UVY-6WLj1;ngb!u=Rk~gZq*}*>%-904lQ(K!7ZT%vm$H0IS z!xU+nz0Ad~A%kFx;4I~AFrW(HvuwIk%MKa5>Z-_&0+&uYzQNa#i&lCjjvdJ!3g+-y zt7)4&r#FQYfA&_rdyT4pREdGHz4Rh3Sv+$DL+t^$X{a+*?>c9J(xL)eHzEf8A@>CQ z^{$`uMCsn?zbU7~H7A~&N~B<|4c(yTUB`!{*R3-Gc`#YW612C+9pppfD2IWkY35JC-ugT$%>h&Z9`&I; zMe3??@U$?HH(ASSC8rCv^SLUfpI<7&VQvbGb)@DKJ!@Cc!09SDbMaFjG%GyY@trcn zaF>w7gs2imeb(oDqJ{V+ayb;AYIC+ttGeSyjU>jrNVyE0CsYJ6G9WBoG|m0L9fu^o zzV{{BeQCS;tq#Y0J^@v*Gq4Yt`b0v9%DEL=uCX9Z4z6Uey&aAHF^s3=oexff73AbC zViZ9Tl%}Q+uR;vWb)kdGn=ahRPMO#rW?a6)n?!^eOw~**2EIv+$h3IPIz_!hI~q0dDHC~4KrzJQcom{G`!rzC|BJTs3~I9L-u<0Q z2q7d8;HH|;4AlfsiY-(rK|>V~F`;(>QL!hXLqIwKQ9~6F6a_2v+P} z55DK||IYb%&dk{#GRaIPlk&^j>t5@+)~0g4VEDVB4ZPS#iY@2{&ioIM$Uepy`^f(c zEjDEu!xo8Vo1crvVKevW9!q&_oh?rJnCuI87Lt)-Y`P~=ew$Ipq3S7Tb8|#72?oYo zI3Oa*;S&Sg5Mc-L9E;lX-?acUtGw<$)c}He?I97s>TFWSbpQNT!b-9D=e~~L3$D0eXG!tR# zCPlx^Z|Q;{ZSONy&_^0U57WZfy#cqa0R-o6+R(OS!ts5d#0g1wbEoPcRoANOWxb*P zC(sJHG_QoSToc87{M<5YmdJcch zM_|~Hhw7@Jd0}3Wy7}JU$4EU&iZ^I_NXo2unvqql->AE>3P325dvshQ61B#BC(7N0 zOcza*9FkX}%q#MDkkFu_osU}jZQT=x3-;{0<92H(;?7w`N(PPeYWvBq?(!)x${C2i zzeR`RURrZV+V~#X(l3Y-N_Vd(>%Tc?9#D)q2GT`gG@85l4dOeQZK}W+b3OK0AYbpl z1`MsmD41JpzIo@u^w&6nZd|W=@taRYzufeOET6sFDRsDJ->;h+CwJesNkjoVwuvu9 zI#663Rb6P$C|>XTxR66r2G zgrKeTVXCc?6gz=>;n&$tYZH0Ciw&!xp;Bvk6Ilvo2646!`z3ERA(od4)pIK3N6N3O z^Y`{8yCw5xhyq;f4k41$D`^~;w@Arivo*w|m6L72Q~<_1X;1xv)57b1SVvK=9bH?R{Xl&{G3xZwnpr12S=38>9YM+gWsP6Psy8SX*%t?cj?iOyC1|2X}L za=*`hm2%jX_Hg3JzsQk$_N^lqMf(@IHK92VS6=vG%<`@!$4=;O&deIU#(Xd4jM0@7 zcj%<$VRYX!(PD|f=H|)qxa1@@mtB1_c@u;p%4SzqF@5g1E00;N)g`*Io<)7j+^RPx zj?PLOJf_oCJPp1-Q}AL>ug5|d>cH=|r|Xcf*Jz?SY$2sSSB|1pX%Kq`j{qEVJH6Qp zEis*AH{pYzmz!MfZZ12~#Z{c1r>1aui76xo`DLnsGJf?EaxZZpoj@7_P=y((67Z_G zy40*)*2q{MJiW4~3W-p4&IwibG)TunsYgrYkU8n<8iIO{41z>`;d<9~)n&5+cc~O8 zr-*=Y7E@az4F$+IJW91@)Y9%>ja_e#xa=_4*f#TM`HpJvs{EyypniM3@CT(E@Upj` ztC_nn=bsPUgaT&tj6*tp+T+-&pDmHyh4&6%_w^dfjIfGiStRATZdTiYN8gVqL_{z9 zb+T?g-DK9Rtmyn}mMs*%_sHtJ5&vYWs zHTWT{FYm@F_AOIBJ!vBBkoD@yfZufCf#;WRk}nx$yI>MOwT-fAO|E&A92oY@UPg)8 zEm5#4l3djxxx1XboHA4^)G9r4y`q(p8FLrJIB7ub1W3g%sEziACH!r)-)_09R@toC zE?v1h_V{s?wMI{qdK(aR%ohR-!QnmeqeJb8FOn)`4bmUv-X(si_pqI4KNa~m%5gkY zt{x5k+hT=M-{oxIL0N-AWeqG;ani~x97Oi#xVy{2Q)~#zTd+3Dly@PcyXt3LBUJ7M zWCttlvsGD6xx2KdJgahJx2F}N`30tPM}>@^;j0Mkkc~b!qN;VKJObVgczk;IH$T(c z?7F_znS)3I&FDlP3eD_pf{2B!&ly0EA2N~_DO(@kq4SnAzYlcf_*9j<8zQJ)coj&G z*}D=#^s1TT(<(+hl)7n$S=*pV_s*fTHx=AsCJ82?;lAnTE>?{LSGlO@FS}34``|#mU*uC4VN5A!d%+G3heeYVEIX#MI>n5UCO&9Dq>Z01T*?rl26csH}3T9?Sw7X+qJ#K0y@Rr0fy5fD?5nyCG#j z2VNPPe^VOLsB1YIsip|yd)do3`S8Oac!agr-lSP-fF8se&F(c$3RF3Zl!vL{s(QQ0 zy`vt6RsfqC%`sB4pd;aelj^VzD|e=rXr;6+DqilWmk$8%jI8aUI2zH>Vm!|f-enkI zwr=U8G6zHyENKliwjTgmLNtSjV;|hSr)mpcZTT2%Rr`CxbmKsNaFO|n$GLECz%wAm zLXv3~1*oq3g&1nxL+nOjS&BYsy@f6ELEA3d@3VXZZ+8`r_=_mlQTUmG}hSNY7F-}%&EPjBkc09b0J0t$4u zj+pa!nz(Ev1#Uum)a=vde}EigGk1Wl@e7G7XQiN~Ug)?MA_>J-gk#O)K$awALFmHN zf%T$SZ~9|U)(8QGj0;c=jsQ@dOaui2yqCdk++{t5wJwAd4EW^&YNs+EpGu0q*4hO} zPM@k~7@NPiO`=6zO%cqygOVg`@Z)iofFUp(3|-5y<%+=tOq4rmfF=W?z=!W}CUSsz z7yRsH&)ABaZ%ppoXtTY6-8aB9ce@{uksiEkQ>F?G&Q3#!YmEPFtlY1`ZUbF&6Mv(e z24cU)l@kf0{~|Xf>3NKusX|Pir%6gsV}H2E;xH6qW{-svQI#hu%H|Gz>zgpoEgFlbJ0LBQ<-WIq$m>?+6`UKN({iKEQ5sQ>lh!4;L~igRf3J8 zv05Si}y66WM2M2NwMB$%aSnh!rZoF^vX zo?fCD!G+=pIDQ;p$J4CTHK5lW{z zo8tt1(#D?8k?-0+CSG}P`SGpWX5#zA-Z*c*_A9^kmcHQ^F;O^slluy;m(7pz%OC1i zjemZGuFNtwJ26-VkrP3t3S&rcnWkp2XT>`g3vN$*~P+sJ1S}cvjJ{Hb}x_8mU>2QEd#0|lFm`&_aG!WMxf9*Km5oUsu zKMNF|BaiSQFd_=w0f}K&Ne4h-HhtD_`;+138)Y#43*7p{HG#1mLb*P*T)naC2lZZl zhHkzp>-LpF9#=zmg^cuDsvkG*gAj2#Bfj%h;LT;pl1iNmS30kT%=p#H^t{OloICjC z`%VM5@IH;}NPAytDOuzjZBg_e}5t1Y=u6}+ymhJ1Cr6z{g}bub{s7h7p>%)^YSx_KiCa+ijF*6HW5Zb-E2 zKgjwy7k=-_KVWl0?W?_)^G`gEV5#*!3|w8`Lg7p_3W@!%8=!T73I6Y-e)08 z@JS?LR$&NOlZ=4)mpIS&I9kSNsYnhvn__B^a6m5EhcoFJ)wICI=}~ge?ld4!6`ip% zbVnVm9Hdj+c3gB*nh0x!D1_|om9oZ})-_)@#GXDMh4T``!8NiNkvbJe5VnkN^V+kwQhNbSVRV6ggM}Dp^728YFQ|AC!f>O%NJ_fv9R6;)W`O z!l3Fx8w3`3HtA@mbO#`*BA;Hu6A#+V1M!_pS@qZNC0PO}GKHW({RzM%vDIvdF`4ot z^DU?XX&ntBisaiJ?9{wCm5qgae~GMziy>Yygg8Ps^9KlmY-!L&v5=9&<+21Pg_NqU zC|(Dx4-^BB)4&}YXFSo}s}$RNHwNbVUFUv=&PHe-Xjt*0ye$pA+0bXcB}e6tT<$0G zYrLzC!Q8^)zsRZ8d8kMnmH4YeFDN<6yMh)!z&QzPEka6HdUX1Pa-EtbB=y`}F+{T%6ksP4n$mriTj55IzTK&CS4EPuU?pou*DxehH*SvFRnCD`%7It zDct+b(>p)U{C;!v#li#W_G4PRe!C+xSqvx|BF7z2E@VRs*^$zqAv>6FcCg4kalN~q zU5GO)bh84^L4WeeaJkYQ&bn77P)n#Qu2FSj`4Jr)w+`!jzLUcvnN2m#6S0 zC=86zz!1h636Z8|-X+e*fgwVgMcbPZQpKluE>5_ZubpIu7+rJs@*$30Oz+h|f?i&} z#*US}l~xi(UhZMJjJ&Y!C(z&EDQqA&ZX;u3h0T!J>s)7rX1!BI_nfE8njc8OP4t%< zML&I^i75h?eR~11iXfVJF(0+%uB7~bQaSFI@V))cbNBuRIknZjihGWx(Ei<5w{bV$ z?2)r!tI*(k@{bhQ)w6+_c(cQ8JxWt$CXmK;eTey%#`KYw=E`xPpNaV3(g`-H3M$`l zDfoH;D}8sU(!sU6A3sI5W;JMDwLJJ>BYPby0K#Ap_(--R5yJ;cHE(oia)>5z7WlY} zW^WfuIDXY^WPoOJkw6&&g+P6C82IjFxIUIzhw5dk?UR&L-tTgHer3$-u6b8S?(X>w z2&ExlC$+nHL8ZP^#Z`{dXCva`9^cI7hZMl*l@dB*!$37oGUo5^dmn;@8h_(;qE7 zFD%oYpl96e+;+TmEoIPSGP8}P$x14rpB6RGWsLP&`a>?ARv8~h#2agO$BN*?bf%sj z_IKD`ZIgRymwWtfJo#wF5y@qe&-<_2jlctShckO!xm)ETNrf>HAxAZDInD`+|B3$H z8?rs$^Y+F3_3;6#zsoApN9*NzY+5ofkcwnAA(jDw29qvgExU2jPgxuZ1$+!~)&SR= zX$;ZQ$z7ILU?rL6m)a&1M=gvI5Db8$yUY)}i_-0-=tK;r_C4JX>|L*Qb~tO1d}F#D zY0?In3NyZ8c; zDIgLh(>YMO2*BxVjh~l0TjB|~Vow0(Fu3)ts^Bu`IYG{w^NqJo8??@GbR9;GOmxyO zq!{4-lgcH2J@0;ZVs5_lZ;)$tR+KoZ`!~p?R27yOuN-V;j>$Q@;+7oF1q2Js&FoD_ z8koLt*}3BhA~08x=7lW64yzsBj!#N!1?E0g-C?(atsm^@`%sbj%cvr+KFy_-oO4^I zLUJ|mu-nx6*V$K;?o>5sgqn|EqPVAVK;)z)BdI|n?dIw107#zn;=mU7%?En=SK5>gb+p8Qf)X({X zxuccNGu>r00NjPd;ZU7-4ZLrq4kI;505nNPz{#0sF7RwLB%LmYKnH)Z+`AsYmLK05 zzwz}}UWn8l$@q8F(=XdXYNJKirMq8RqE$aUB$VH+Cy^H?@pd|5fvf-@l;;g0yV$x? zOw)6Tqhh+(-9*(qlf9RkXs~e;kMXUp2oSksL_c;Rz&xMoVSZO5rPfdrHghL&rpq<- zZ0YVBSv495P=oHDeoRX3r*Y}Pc1c<8+A`>(T+v@PP0Atil@rY*y!q#+8bQy45@ zR_6{UN+Q8xCs7=mt5P&mW;~=NIzivkq4E7T!wwM& zW5m$e5Yw%@<#5Iinn6X2jHz#@iW5sS73THeqthxv^qC86q~MLwPnS-W{ZfWMMmZzcB9Ig-9G1bnL>M?C!>=!($&b zoYhDk@35EDFgbEie7V>sFg*#q%|Dc>5qButz*$N>a5MA0t|Z?O^2EVS9}giu!JLQ4 z@=IEIqL~tWVvt$NQ53h^Tzhr9nUJaV1S_)1jLijY9n&~@Ktf_FM-%>3?Y$lb2+=ic z8K$#UXak^H{i)K6b+t({rY23l`umeML2>g{{6mqh9xaGbcUQfjC{bU} zRLYP0u8JCU^nmB%Q`z0&`(LRasJq&pxc$xRPlN8iAX-UzKQ80x{A@SF>k1d0g0x-} zMAH}|{9Q0sTFtxSEmz-OD!-T7`E@nYESosmXXi_ukL*Xp5ohzJz1zA#gT#848CWmK z4vf$&xAsZK(`A&?eMxfbITjv(JdcS-V4=6uqD{8}(nDU?2yMFGT#eLopCf=i{8}^J z%iS2IzfBG*qKN`ELomdq^*KfR;WbbMvct)$(U33Kb>Q9oH~PWCuq``0KfeBaJunsN zl^(p+Y0Cw>^O%(AhW&!Z(^JwvH19;pdM5rs?nlx$k$oMox!J!ubk(;9;8%~DC;z*# zHnzXC5{3?sIV{dnt$dtivh%_n>)XSfME4(=X_WImc`h*WMDpx~XNAlD5l`58BjtwK zI@d4jCv?5)$aOj6|4&}5ex2UacRya=`!-=Z(lqh5hw}EH^SiU!#Z6XHvDyAMC7x;< zt^?24i%oDJl=QOXLJaE^bR%f-!N&#@06?4qaX_LNpv<&}1jv(|%mHa0ggx0>n+a}f zxtiJG7fOM2wxq8B3l(pItTB@E)dN1HK2K8#48+jFUghCled$szLR7@FPEzJodzz!W zbi+?SKmaH0O5o564Urx48s>djLSK$Yb}(@~0IP3Ke75Sg!)h@q(<)`b$V)`?iaeQZ zy*ryOe*@uJZArPy&$;lbd$e40Fx~()smOV?gF1ABWZ+oQ{iW@knxeNPx5=Up50hG! z{Ia3!R(z6yC=-&Q1^o~q+wg6}(&+nO4YSUDyCs8GVkIptnhoCT)gV`Rx$0;_syZJmqYR zM-ol})XJb{&WnQ*>;?{a21a{(T(vI}CjvOKQ83kUguxBSB`A$T1RiISaoY07lG#qE zuotz8Ky}N7ce&@xnm&4$lMWMesa8%Ol5mZgs^YGDm!srisa5CS?p1wpU|0UvBU*c{ zwB*EIXFAsa^DQBIUhv6S56LL~3bhjT{@tR$fK*+9iYIi8<=hr;CU07BJ$dv&mFbip z;ziit;Z2J0*npHbnnAoBDkU#J@ll5#2{-Z^!r~I+G&72&qNeUIR)4UIo@virs#MU+ z)Xwelc*R;aYt9zKcBSe}>HeYgXFbvdhcQk!+8skjb`|dUwspUTIK+iniKtXarAN9LEQ@vMFn__V z6=|OgMb_sVL9vnpNI;GPFROuNnULq8{aQD{bwlq5BMsnFqm~BnV{l9^k949@QV}39 z{n8|Mll!J9vIQ5s9AY~T2-kf97ux%5jA;UOyQ-{sM=f^W`An!9)oPGzKd)M zZj|m9A_j2L28T~8=Qd-}Jxtr%%d&NwTwFRu(3-GX5_t^I7|flcrbR!oz*r?+8~?0f zFiI!49vyQuRM(A4t}gn*#HyTYXnGf_*ZvH8CxhPg`gc6aTDLZ-qs5_;PHN?Fhxb1C zG$wt2isxM88F+a2@?i1-jRsxDN9m&lZTTJasm*h;2^BE_aK;rF)3Z(^sHO=o_eX`i7yGs-ae{q#%7 z%&|Sg&#!*=ID}?RBNd z*mJL+aPgfAB<-2`-O1Oe01jIlyXlAF9jS#PnU9k9qr=E{ZbB_|MOBaxFDjar=pu`Z z{HA9d{V~L?BFTSn{{i)^SexwR=lo=c9`sbnPWK1osA*Aq$psUFDT=W*Oey4w|9FQj zbc9e6P}3%Z8oBtYkm96e8P6eUyH3qF_g=&Yr_Pqxd7D@KYDoK0D`hknKOLDR`Ukmp z5?@n}(O~yG%>PABRecP=&i@Z`p-oniAGT`V|Gp^z$l~?uO}5rNCVK9^v=tVHRda1L zJW_OZ!;1L!avRlTO|_^aUO}wq9d&!QHcdErRjN0D(Gtl^Y*>5yMC|ghgd-E>ANLSa zO(g@4!bbvPwP0C0&0ovRU(_(y0#G!F={F%pUf+|j;KKp2nVB+d*1Ux-0VxioB9sxKG<~I_57lWc=P=j4`s0i>o4X+b0?PQ^YQLAy_=>< zgaxy=2g{<*@vtJhdQOPR;G_JLgDQI3U9G0QMe2qFeQ3(jqW3)_$D5yoaeH*zYE}0A zN+u<_uV5T5ZT4#KU>|jHy-z;Ar`)L?Pm;@z#t?n6_|2;pNPcBqsm#?}X-TogJ20pk zm&D}}Ojm_XoT>TwZoRqb5!@h4_4@@#+b!W1BP)k4iN4 zDyr^hICg)(?p;)6AhDf+Hj0Bbxl~gW7B||=Hdp%H`T z9Y4MQh`09}3&J&}M!PuD`RK_sL|{vwqrxBLK8Ss-J+{+=@9;Ou zspLI|h|kabjdC)ciopfrRZRi&Qv{Of2CJ`I8Zsvt=}#EJLz*bJhv8C-_>YT&J`qEC z-;ZhdG(X8JYe+M=lhFPRP)iLOxF_Nes*|GoG;Q)^$mx7{L~9CYcv z{qWJdIJ7I2Eqa%y5l4cf)8Tj+%ym(u;sl-{3HbKr+0P3FP-4istGNWvX8Q_gG@aWL z(37MmL39a6HOVB%hR&}A+uN_$blC=kr(4aUL&#deKojtbla3V2+itchaoaIOMyz(lqFZ1rpJe76d{ldg6} z_q+GpU~L7~Cyf&719*l0^N95AQYrF-zs^UWTd^ZV--|Cu?{+kt-sEoFV0kHEf4T2` z%2kF_CaP^F#EPUDhN9182h~He%Gu{+xTMNa+vqaSq(Mt_m(r)925 z@ocLElm9WpnC-i zo?)aH_KzQgYJtnQ$7gp)msp9PXqZatas5#4o0#=TucA2r+RcE^)z6IU=8Lt$GkOls z>^4aoC^!k-xb+43pUy*2TuQbX6Ix^v@+jFJp4zW5*~huOIa$LbhGdKN%o57)0XP5~ z6)w_6WgG|XxtuvB-Mle@eO(R=iAQ)>PiR>|Q2FJ>icNTONsRrs z5*Pc5iuz`*vim9{mm6^Whn|bRg;l|6JG2HpH{RbTU^`aQT5)4#@su@j~i{NrW zA3RbGVof`bdcN7cMk5#EuSW=C?BXi#WsjAoIFTPCIYs*_%Ig!RNU^fyQSJ*U#m~+9 z`k1y}nP>Z^k!etADqKn~94Pcc?(PSjZq*xLyayTFOi-V~A%OV+G1vyEmY zbp8g*{Xk=z=|9N5I{Ve~*c}-Ee{wmEhLvyP3r50!uUIQ;!i_Bv?)*NNoHwDN5Vh>= zBja;fHCZzETJqQedIEqK^{eBL_DJl>;j`= z&dZ{Mm*Oh)6hB-x=f*Ey^bhGNbg!s?=$-|2X?}XcsPVItd9VUDLQ|(v-2Bsb8SbGQ zJ-IsS#*3=4-vJ?HDz0R`iuN@F=(z_$b_x^ZN=Wo)bBbq0@l|aLY(x>KO zK;HbN@^`2y2Sc%?jHipceIBt#%5nt}meZw{CNy)C3ZeO$f_-g^6TC*InC5bov02x% zCfQ%B9!)``xfroMR^9Estr#cvc#HBF16;`6yu+s{=WXHv)K%*A@WGC4T)G8ZQ< zy5?=E*0m0^>iF$39X8U92-I#<(xR=DTJk^4sww#b07_2!wIS?fa+S(rqZ&4L%467# z@F^NsCQNWaj%#`tN=zAse?^>dJif zy69u|x7kN;C|$<~J*zLi*P+ziI^A%~S3L0ILHBlN57td1&ri}Hy+4LD<-ZQqUC6yr z@GNrqbNl9o^^!Z(di@5VxZ_-%4LP59F%gL;(tq8&Fh$rkk->1La|2J8HMP-CsnFM7 z?p{cSaqk|RqCEQ>3(3troww7S_HTYm>w5OFsnsg3-$T~FzRLEp{W4b+{D}=2|2}Zj z$vYcb(bE7(;4@l zdFac4Xv^`Px`+O}H*ul>fM|-QNtitP^UyGE{f5JHmr2_xuKW2jwL)n4ruLe;xX}_# zl9|aQNkcfk(&89*^ervlO^uCP2?0aRJyBkAhtxw~?*CS)EX_BzSyx{g(*4RxE++S0 z+{o8K`2vkSI??5XIz+a?jd!~oT(eswmm_|dWEuHHM~+qIkWyS8b`!^l-*)o*4Cx48 zAp?cl5OQJe^)L4`zkhE%eM|Y{<2O%lz4#egpi5agdFcjw<^2*v&mrtr+B96M=r?F- z**1k+f8Q_#$b0!-A>`LVYLL&E-C>Tge^4US8gm+jh<|S$?<>Y7sr22hluighh?QD% zQXvf!hAd(71rY+UQ3mcib&hmb_e=T-9A#-J*=G!f1e0hD^Bm!V^@?1ayf2$8o4m-* zQotqhao2KA5dKLr&gR`Gm`mmdZ%hHUS5z!x@X3_@G=}qa#YtrfAw32%)+-W@0K`TY_%P!i};O6ggE6M z4G8l{yAm~uj>!m3&?oFSz`I_t(6ckBEPazCRq`hBz=}%95m}k?tN*M!D}EpKX}G^{ z|DStbhHGmCzy?LyPhl z7?iHJ5BrOYsVDHdamFW_`ur$Fa=%@i5djc71BLX{nvivg-TOaLZkUbMWA?1db$=BzU5dUXkH+0Inpt&&Pa?63;&3yH=ghZPsfc8ux)2*;3^v*y0W| zP=!LK1@Um^n(tw~Tq)8i$=3U4_PIhMCC}3`9q^8*V2S`bvhv`G*<;Mq0IQ*dHS;>Aw8*vKj_iBctg`otcwM z9>R_fOnJG0aICVwyjrCgam6Ro!kXuEpNWM8033>+5RwQNo`g`bT@u59EImdFlX!60 z0dFUig7sM75(=@5W5z-JE#q6iOni-r8qH z&!Z7;rYZ*|F)7!q$&NbN@JaSURM_J#eV-vYDaAD}sAG0A1PqrQ$cf+6!i%nb zkf(GyYg+yqAhS)51sc-`>e3MM_tx*JogJz23iRt(pZ0xYn1qw>uM7>Hxd2s6|4H;ty&U?LjUG+ z50k9H5*({jb=lVXgMT(D5hslH`Ot9P0*Th(FBPA(kZZtHK1={cG&m~j8UtUShBR}_ z4qpi|9zjk6#x@TS1Mx^Uu~D2&KWPEM(yvu-UV1nSYow&ojcu?dd_Qv*u2iz4gwe@K zvobI7#Un6CQGFnOV93`SnQp+?LQU>d8a|BbUB!O;(k-#a?%{;CM0NesbO&Z;JTNXd z1PL1DCnIRECqg@~6_dPjnTkC%ujtn6LblL`qWY(I_ii-n2|#HaRZT;q;d`jLISom9)4V63pPM zUDrR-of&xe)S2_s&Eko)kNzNc4*T_uvu)ac<#J^8{c3xT;xqrv<(>=~+-QHI@CX7T*(^3wny;MRk*g`e zS7Xn!F}yEW<4Bj3#J<7dvh*X|SYfTi5EQc3QI4<#XiRz8<&EXF%rMxpC`ZfJv$&D~ zRO&;mVdr{xL9n9)Z36uEeG0H#v7w>w^2}3mp(Lv z_pq~p*fp=I0|Q8vRf@78)QoReCyJ^>b2XG3S1Z*N!5ox4xD{j)64JZ0dkw@PL^jw% z{HZ!5is+Rv5VeSmBrqeRk;c>K#O(SH8~7!Xwz_6H*v-p!9Clv)cy=&HGt?uuLf~#Y z&^i~>88hVts;JuKbkHWOdQ)zX#(dH~az*pgl>FCBt2Wr=j*$D>`W9;XSnb}6x<2x` zKWZ?!&bw{Y4==qPq}qmlHzKEgc0F;qps_CF#OwBhNRb(bf`cyr*IZ#Tl(*4(X!^$y zj1G+_>_a-l&|eB|_9nxHVDG!?wSY1XHzR(*k167qlSd?T>$csu5M0^is!U*Q0xHf-}n|KYriX6X4M&Xks z7;BJ)4^U-SViV0e@j2$CvjXEaCyeL->M$$DQD%xCVXN*LdiazuXIefwukGwabjB@; zdE0(la=VR9fR(>7wWK3$I^os+9kvoNd_u|u>skeI{?Z@h;*j4gUHZi4hJ5~wavH0? z8}}StpAGoG4PJ4FPCURz$h}RFPb*yDXq%CeomG&~waZYFqt$_`W_OJy;N$v0v8^L3 zwnZ-=U;^|DBwev16ZV0@KGNk*cW#O()dB#T*&?EW61-$)>Q^3sfy@}VVARf#Dd#H^ znNGPN9tV;S8M{(rD&^Ak z5K*;2X9v%{4ic_K*;X$YR=!udkME_76>p|$z%<*V5-%7V$I3j*cYSzj_Jw!gp6+cQ ztS`=PKfHO$7Xe9N$FubTVLZCeIi)%2!MT8eA_e?NCrE0RAlEHYUT=r%J_#6mzJ4kzvZ$LMu+!B|>}E#RGMZ z^`44PDPmFuaYzUkxqd2BAJ0@CXtA=$8W;xbBaoqxylsU3N&#^3@Po$8;hHr|VAJp+1Geggp zEOyq{=WN_$!cCHSNwmZVVAye$iiuj+nI5Owj-ShmFgpAz-X1TXlAA!M46{=MSw}h4dokKl|K`aUYK5DF55b-A`R-jwPekG^nd6Ms z%bi`o6DVdVGnmTo$^`tPTfl*B5O@yHOBV`QndzRNIxeSfr$DLxa=zdbH}(ANv5H{9 z>+W;%s#YK;j-4C{u!pon&8%$p^$rMvFg_A5f(G_}??*E;x2~JfL)!+Kws0TLT?ndk z*%UK1ICmc%;-Pk3`4o9kLTM$TP+8x^@Kx(}qs{KcQmL+cwAcWE^d!|#b0d|ZYU76tnMY0C{ul0PMa;zDiRY~-sDRi%00Zt zplTS*IZuz-X!nt|n63Bphnm_FiIsV#UA?@D2TyL3g10xxx4!EVmr-f+^x@UhA=kEu zM78}1a)(5|i0m0`Y(L5TmpG!*P95wU$Myf0;rh1#|9IXiHr+ezx^>`a%&VlBglg~C z5|5VeqaL0xSQlMsXcPs8rqV{cg>K1nF@Ex)axztg)h2PA9LTzqZlDWlC5145Z#deB z;i!sP!n9r=(f~$VC`=L=^z+Jr7+|O|9M5#LJM0&0Ug(8E#~H$$&ChdA18JyXur# ztgLLPIQAIPD&k^j*qyZPxW$j?+)t@?5=Noug|RZ1Kyce#ObM9 z_Uu_4<=nfUwR=;Kaa}Zi&&i?3=QZu4j@MwAKX&HI6VIoP5B0evhPH+-!kkQ>!8k{~%YG_<09o z*td=TxA`DnxO4Mv|8>*Q|3*&4WKqd-3{J^ssAynMbyODk(I{HE%A}@ega<*Awxt%+ z6L4#RGzTV6N$?VO;z4T^cnEN#)TIYx@728e<(XF9YS6(leLa`^N428Fcb|2?DqqH1 zHqYj%eT1J@taYUHeoe`GxyfcsakoqB7Mbb%yz0`KGr!MIBdL<3mnMTl-_-QC3{WFd z{|^Q6x`_DyZVCR-0hr$a{gheiU#w5+fcpOR6Dll6ljQJ9DU9r7x8GY9dY@dfa^6$g z>Ww}^Zt3IAm)MFJ*C&znSB67w#I*4V_%l|J6lkgWy!NYh8V;4c+nh=LC`GkoS*j~! zawMcd1L^A*D!%#IQ1<1UlNmT^$DlVb2U{!Ma|Mo1_dKM&elwZ+xtSPTg`J$O_ftlR z6=xVML4znI{iT&d`AeJb$rp%f^fG4^ux4L}kI%htJpca3$F}zOIVR1Ch#4OMGS719 z!ZF9<880J^d*_AEwzo`k$X%46H#T4|$)#h>WwcWeBTk6{wWEea(LD9o;Q)ZAh8kA1 z%*$fu-it92nt{bTjO8b#i^)3aJ^<@!^ANK)@i-+uATS{Mne7M(zA4!S)g|1pfa>7O z@kc>k_v3q*^2o6Xy30$M{>uAOVt(N#(?fprFOicMlK}0_R>S*7I!7yX&u>jDye&wv zuAD2bdSYy`g}LRH&D;8*96?(U$R?{iR`)&Aeb@O9a$Sj^lo`WM3Vr_~r?P*)+Uqx) zZ2m=V_%L?#gx`UYoajKk7jfbijESb7?YoCa$ye3B>lGG}67|V9t`2RMOpBgwEePND zUH?`n-?z4XWct#%6yb;FsC9GK@1J^A%ASrtKQ*ml=Kc%L9~a^O^P;$mqtlS4k;tgC zy{Lp`pEJuQqADuD@`sb1lx=zk##uB(K%Xbh*XOYc z5}^s@DxvFcdtt{eOa8c!XnQkaRF1OzECo*7a%guvA*P1lQd$8*1A5>hh8hm*QeuPC z!1sL=HHhwzAWP2K6py6KNuh|OtRjsdC+IFPM_uUBWi!~8^Y&i2&h7mD_Jh(7#f!b8B$8t@|Bk!UP#=4 zDzRb?3Nb>aO-FuY=US%Uu>Rp#>NYCXN%fi-g$Q*;N;AoFG8I-WH;q&Fe2s@SyU?j| z*MI1AN@I{Pz9VX4+>;ME7IMImmO>GJ<)c#2T&-a$<}MV|EV$dnDP!Wg!>JR8;4li& zKyD8-8H_dK^1+~vgg7og$HdIpr2O*p*xwH?rq1TR=HAi0e}nRsq2Jsxp7RD*oIJC7a@>TC{Z{!#PP%>In$<#cg_Z?AVwHeNsW@i^JBt$O6{ zNW!MqdA;*B|3&WqE=v8sJR2YafC!gn29~lmKW9-gSRKrxaW%e7iq8q3pq3Z_O{c=l z#U=YencWTnwEJ$Bb=Kc&5D7BId9bn@Wj&4&;RDmiMH zobr7iqP!B!dJ}wUtG;E43WzpA7h|d}(Qd}lpHD(_{VSn|O<{1CSGwcP;^PzdX8c=b zPQ~u4YtV1=eX7-N-Fi#S>c_op1U(VS{@i}iHz_U6?HKaFE#*v4(R;^GEBJm=tf`an zg}muiyC*+?9-sL6O#l0iQ#K99l@jG+QR)_O>MKWry^AFf#jeNjrMMk=9hoAMZ{u1r z6*i{0lii0variGEDX9y?3uk38{PNC&E}5W)kHxV`By-d;C1Vk&uYz|85|7BLC<<^Q zuQ+$|3eJ~zCqV7W)#X%SNk-a;(iJddW6?m2LS$$H%u?LiK1e#|Ba6yS7Kfjkr}Y$* zw{=ms(-(nz_DQ;s=>3u}44Pl|3tAPg|17e*p{W@ba^f@9a)Dv(ak(1Xy640Jw}AhQ zL+?-htl`+--g;u~-&}4(hn3>NLmU4hmtT{h<ru09QKAmmSegCVy_Y7)s|N6btfDi&Cp@pWQClDYB0Ry5t2`wOKK)`^Y zp$dppML^U5p%>`{1f@$=1e9V6RZ2jbiXe(0h=__}LAP!X?tAb1KhK*pXYS|KnK_xs zOkP~qn=7ALzqPLQUEgJp#Uj3or$nR@-NMNn4@!v$;nOLS6GA~b-5`Atc)4}YYYOO~ zxT%p8CS=3yPWZ4b!PnmgblNEgnsRj@u6{jqUV?*V2@~sB$&Rebdi1=buV(p)c-z#3 zQBbovVm+Rvi+qUg=zc9|<-!Z4&FgAH^6Fux-!t_O=~mr(*zkVmw@YEwSC>9ouO>b_ zH0fTmI?OwKFhV+N^01zxD>xuju~744zV-6WcT?sHjWB`CY+b5)M%uS?{E3ueUeFyw z*C;{rkM&mtUxW9AuO0b*T>dcO{;z~-;Vn<{(Y*J6+`RgLswT_?5L84A^r|&f!Qs%J zSR(<*02K0$@M&-FwhIB7MmRX#hNwkTd!%{?C2AtJ zz|kBaNx2UFJm;+7u9#uE@up(IB3suL27#*Ox%GPE?XHHs*Ul03kx8?Lk16G2u9Bb59wTpbN{@;#?zu z0J$K zLX0!b+Srnl(MKfBKDa#{?lj%_a9S_=$N0|oikBw~o3xtVUwm$V_eb8t@R(z#ADz;$ z`44j2M`69;r0LbS?Jyv#sZln)?TEbsp~kSk!-R#{u3nG0 z#?ED(HE|xX#W{&sQNhZ2v^>KSYM%`8OuSLUv9&lX)iIi6b3I`tFRGI5Ee7D;JgHu& z>%xq=HT3<8mmMES>$MS)_2vuVyMwa&zM$><+0H5Bq=Gbdk!1f6$-Hn9af!_RF!PQA z@2Hz$F4Si;rayVnIPdkK%zDkbhs$^!oiD}RCS;!IrON5hj(l_}fRI|3%3Z#q+ z(j#VNHOq5^8>r2%0rXvx7H~g)EPMhw5+^KXdq=%L)s`x_sM~;=r|Z~RD@0y1LaDsJH|iFQLKb>iP~qU;P?DRJqla$i*GEx`7EQtn?0** zVLLpISiLeWC*_}6xosvRs{@WbauRm5?dmOcj|K_BZ{)tgw|KsN7iXjYJy{Gmu`s|(D3+1SI?c?OGnYiPj3os$ zzI4Sr&<67&&N;9kg<={lzDmU!P);dA%tis^B>Y6!q_h&ZnKQ;C#_r4VQOU5F)ITK+ zaC^BB;r;ps4J)u+Vi-)fDv@1b4>S}G$j!>{k6mbO!@3UV54q!u z_LkU|2cOd1e-OdU>pDL8^!D?YmKN2*c{kHSn7>)q3C&mzBe`XrtCb>V!6%l$jU?+*QWyZOHR^~6JeUDGgq!fMKl(Bn;Q zfP9IlmvE8o)yx1dYT|9Q#L*$=rscP^Q_jwFxVWB@C>Y3s3gYC93DnnWHUN*+ zb&{CiM^PP}i9LOM?C13e72Z zt0B&jUDjb2{E-E7vbrfw@P1bAvaXD$cJ? z2Prr7ddAr=dZ?TQ4|1q<=B&mhYi! zE?_TJO#?CKRbczW(P_f^syJNPxH$kxct~P{q)CU8+tdd^NcqH@tD0heC@`+~+3iUb zp?^Byjvb_W&XK&EbV=x%uyQLY52Q3auY14Hi8D)@(ugOC<@of0d^uUx5uY*=Sv)>d zBP_lEjm*<*-Mt@((WR2CdWvD5=3Nd$@<2#D1Z`x)TzP}HsxcYL=|cAaPxu_Dx{FL2MARpquCu%)(ijC0bpUl5IIhy0ONkxvk0xKPRf9i*MR3WIJhUJSJvM6(L%`N44R)r& z>$@it3cfa;mf)5D$3ZYnbZraq(-?{qe`miToT0D#;61m9;KFB+f#6Z7?{pyiOZ zxgEfUW$n=AYn>;?-!-Qrr?F5u!=SD{Dsn-Tg;UhJw5!`=Vt$W&&&=u4+QUMO2vZ)% zzUoX|yhbxCGyV(KGH(L)kd$K~T0eQu`)yaP3tjGuP#7!Pkz$8bEiHV~Xr?!{D}XTf zX)1qBqgnNJrJGNT**KNs^T0ATjuB!#B;kGWzTC(BLPj-VNc8i1x1O~E}&wE_S!&$E3VRwse%{d@6^O^d~>_& zep#jKeEu>~Eqe;^qPLsMu03`v=TbOs+S1!>Zk(l#ykPugczXEL-n}Hmn4`4)O zvn&s!QzazY6xyBA3e4j}i-!z- zUHsL|2a_N!=N;-UR?cAH)yT=Z#9jUEbWizQq%u(Lc)ctGA_WvC$43DnHtN9ELXRCg zz3nXQ*%ws6>g#Wju0ND+EM}Ch`-?grT^TpGkJHzB5iI9+W7WC7#z+XXA=j6(_Vg~x zAj~#0urs-0Oj>kI7URifN`y2aaaOM1u{HEO-L~|IX+g)e)eWaN%qokxU{z8YudgH> z-&IleH*%?4brDoEp7Os@PV@T8kE=`DMc{wE3Z~+F-KbvzA3CS0slJ3HeNLo*)D)Bl z(8kvVq~@`?!*yZGl_giM>o;vhT$_8f_LW%qPA1^&Z2swz`4h*2&P2{VpLAZnZa-Tl0IH#prwj|Xm@fV^xKRDnlbFjlW0>UKZPi_*wzs}% zoiYmbM>0Uy&!7zBRnI^Urwi^3Es9DVvInf(3Se@4q6;o4(%r|hqt)#83fWBe`1Hlj zN>+xiz9hG-w7fJtjqo^Uwwkp;l&L@J{r!|iJ$l^UkjoDVaMkKQ=P+|a2UcvowgxU3 zny~F$_j5^cGf~GLvoUWc=Ez|3PZ}6~ru8g@Q8a2Bny-f=CISIl^QXJbr0-Xwfv3T z7DqHN`j4jI-;DjO(A1k%{Y!rSZ{&U}G?8M?1eV%v_g>jUZYs-ARn<#ZwrLm8O~RIits9X z;a>(qjWQpdQ))Lu=TD9c9LFxc3M37z^;SqbJ`NbsJs%u&c7#2CM!m`N!MVe(_N9B} zP8>77bV&cjke%MW-}=FA=P*9#Lv@03oq--8Nj=GQ7wavPWWhsg!lk7RYS-|gA#K9A5^WG3Hm_> z0W&=l{iM;&<597+g_$aFHB|=WgbIWdPiPW2#@N^`OFn9Q&8HM}?@=?5UoTj82bwXh zBoahQOE(R7Mf5(GNBN2?#L~=t`!sS3rnJI)Fvr$Rr% zykB84ZkjCbhuBXL(n(9sQMF8lRflX;RV!0!G}#rj_;{Wdy)J!92xZoFLt`B3sgFu@Qb~(7Yc0?_+mVy)Bp>Eq{_joN)9!(0HjGptjdUk&7qb4KqER_ z$+R9qgk;CwI0hD|Mdu$-EJlQvHkNekyKX^rnGm2 z%8;$!6NRk%7Fpe3BWa>a22-6fULc%lxE!mKI>B>H$16FQYsx~*LZGT27+JBodjJHw zz4t+gkhi8Zi~>`qV~_-ZnY0Qrt%xI+ zR}77Oi%w9drKT8rgiKfi)}r<&<|7-uEHXtvDhB#AuDCS^Z-76!9&4m(XVNl&3|WbN zvTP$Ba7KnBQ~I^~4%tV%Ha3^P(vKzpC$OnzR!E{qD{8OUWDzB72i9*D+AM!jR8%T? zC^a6#N7WKr6?k1993lDZ-=wZz5as#FXJn)TG`cS;NTd`wu+3Q0-EAUDP``!FN*Q?u zOcq?4?lw4>I>Z!P@u_ByOC41-h}|SBle2(mXqbOOT!JVZ9zyB3<7n|5D|$}q1Hp`& zXIKym>NW$ss6Fdb-ft{#lBc;Z7+6bRuuAm)(&`j=ZjrEg)(~KNIE6NijJ|pAE&01{ z6)S??oDLBnJRaB^sgH-#|8|$Fj{hcbwrntYhWaO$)37+I)ELa#W{$l5h2*(ocQ^_h zZ}?s-2>V)<=U&n8kq=~zMdNp0mr-UyR)ZR_sy(`wZid9A8aa)V$VEs13|f(h2e7>p z3F!bNc_~-wzz!7>YV$mt1jrICFV5yl>Zmc{R23zHhXD;rMD&`H47$V0_$GaNj~opR zaZ)I>G!9Y1PYjU_NKAA*iSC$IWgYy1nJh9orM80j);$)UtN3_DRK6}imYi8p*&|V0 zO^tiAAWroQok9ho%hhLO4Ybm;%nm>uixAU0U=U;6Fciv69;@WEcxl@bUXuV+p^w|v zf2PBQhZm5?uLFU7kG!0%4fC!|S;sc`jhlbVm-Ur5_f?BZ?~o8^TLbszULE-rhHh|h zDSUx@+Fs;7&?4TcfRS|~jNDeTzQ-Dm4zCi^KABD1A*<|5S{|G@>i6ekVF%l;l)=Lf zV>5SY`FmU*j4DKMU4-#i4mxz@?v-qko~*W#Ek6?)qrSkvx+Oa$V>*)+j+^t4D|nBq zdymTs-RE^Lcq9>H8^+i!#h}>9QH2SF$G3PW1ktSm=cC@EhlST(b5Nmk(46F0`OdA0 z?>)SEQN!%yR0Tj$oRA{jWm}Y+e ze_DJ>-OeuDfeKipIxLL{Yz}IY4}-wH>GEugSpvoxLlBi><5VzM3F^U!pb=Qy>#~kV z4o-6Qie9>FBYDF`fuN@|^R*4 ziMsM7TkM^g4F)S2#bu4~jXoteb zIJ4lmkp#oSHOH-?YxnFP*%aZ%D?a5oEAZe=+me4#P(q=4ue!s6fl-%w#$_II5m4qY z05ra+h9k1p@+k0(vt>@3CaJ_}FF8rHGKEkHJ^)IShn92dVbv{kblio(oB~6Xu~hR4!TIECuD4*NU-xogoNiSZkW7IKl6% zO%WYZ01^qxymKS*ByzcK@3>;^^J}kXcLmw5FczCk#LnuHSF3Iw@I9=OGtydMbIrLu z!T+XS3y=u%)N|N7XKi>4u39bTjQ?KVZIUfox>tW*DtzC6& z@8Pk3yASHfqw?axN{oMyi>d7G`8Y+E-gq5ODJZNdk7{5Qr{4 zP9(5CQAAg}2QIw^GjLop3P*x$k~}`plTO1@_z;DsMKmBp)aoLs7qX+_E{8mE4tbkp z^f0CVk4+oluU>M84=4ajWfYi$7dz(ez-cG-BfezHS6@@xnx7vCI5@IcV0=0B-ekQ- z$1nyY(9=*-`ZOq2t}JIC%-e0Zv_657$?wgme9!o~_d`KR@jl3}YinqbLEo_;@yeT6 zD3K7B+IJM0m1chZA*)*)2?ON{3qi36z-%Lhl^(JLOP;L5YWmKj!x90w1c^p3fZaYQ zViaa*N#7xoVOp5c(W-hfA*y7rWQoT-`Ubz&OuMI>sd+#B22sm$qm#=zVo0(vWC;O; z=}sV}k|GE9B4#4qGOv@E2srAXhedF>_Yumx8`^+Qx88lcr~dz^<$& zrUFN}w_w#YaDKLAuH#p$-@e;_@;5%UD4sM1Gw>7rr}ic6ZSOkgRq9^T81kbT`fT&s z5zXyg$L!U!n|j~p!*cAa#v2kfXK&_)rL1eLe_OUqbbKKHvM6Cl;R%547s_m;+{E52 zg`qDoZ1hwz0A!&fJOnTgwK{h|_~St^Y1-hoLbD-$OZ?#dN|OQ7KT!^o?V>F1bLrnG z7d2z^xX`}=7k&dsz7-rUbhF2CsJgA_xPGdY_nE7LC2^$#M~u`YMIqf# zoU*-%S}0}x^QK?@;+5#k$U6_kZz)g#8ux&@{t6sZ%X7?{yX7gLZn>K3nkqU!ATOFf z<3&q3o9P{#sObfdn@IkWqJ{6*{BtWq?`2DwfZ;Y;G)$6RMbyG>$bG+y4k{BU8bGT>#B%cxG@#53W7c!5xV zu(M;FI{LYKQy z^QE_%s$adLX!;sz$8Huz^c#LZ-X8R^-Pq+7;{A5NFyQ~w0^9C_30qJBrhxlGNx&Ql z4wF+x`VqyfekkGYd1N~8PXSm9T3!%GE7k->BY%$b10y!_RTYQ$fHBpANMK}L$xut!gTE; zjy?Ilzrt*5R0bTKc4CoRC`5Mu(y6fDS-2gID#-?qo_s`VEZc9OEjDcaLccLR6kgkU zwNOM+VS?Rh68WIL5#KeH&agi%Y^c6ujj(d~Lhfo0>7JzkR0MUR<23mF{#i|y$tQHTpv$(Ng8t^&n=008|Gy@#64`P%U^lKhK& z?@P!plzGt}!BeFuG0!t)O8guYdA+^e5>}Vw6A^}#`|;`KZCvgk9lix6;K!2SRED=- zkNLFp{a$!gl&A^_1g;cEBQM2s6#UC7LB#@rAB)+K?ZbaZe-=$asvgS%nM1lXlj&eR zZVxl7dM0|J3T|Snb3@lm{l)?BOl2VP;%;LVls~|$8xWT`GJ^E9{*Bx_@Yk;neZ4N{ zG5=N%`5rLwU=!*;$emC<>K`sT30B_a^34NRu3HDWeXzx9Z0^u$Pu#`^_O>R@THCLs z=EWX6wh(EA8y_(+2dTU!6>Qt&f1fB)q$bt>HNRfE^Ql=NEozz z?DjKhja$%|WhP66GrK$DC0yAHijRWE-B(ZW58~8Z0vIIpX5XljZKTjmkdwH1m3c^n z7HWXzDVH9}>o8pc9&~QTgwV1gL0^hJ6Y;bAiXmDt6JkhrR)>*LSCP=HG7h795e=?4NBDfYcN8DQ1I*NPcPB?8Q{nrrB` zK&iAJgBQ_QN=yEs4xfIB3ZmfvaM&t=M=ax@smvZ=u0*OJ5K7?J_NYmNcx)5Z_~OWD z@1EE!3rqUW_Cy&FI1X&SfenPp5tw9xD;+uJanp~22*IfJ^NiWX;2nI%i!a&sEM68( zXh_!mXl5*=)gFkd4yf7a zH*z09TSuIGbxh6?{y|Rtjy<#~obqofN69(0ohg(b)Mm}Cj>x^)mwE5P8&LhU%#^{w z>f+}E^P)1RU5N-^(w3*8eB!$oL;K0O=YxWHpm%JGKb%$H*53+mSNY{H^8VN5B=^lf zj*R{%r2UVCB>#1jEC2*k8dJ0*NoyDoNY*Ogt6YJNnCKiXj4Hz^0aqi=KmfN=W;_yw@e=?{!6KbMre(B9hPq|QkVKOX zsb%x`dQO6Jd5|>;mPDIW9)^LXqNR(fcXNSarh_AsT?hNLA;U_VfOxI=ax5t1sfzEn zv-;fEri)<$B1G_1qc&H?$WwOmCI4JW0*d|0NNo0Yp5{coaN@KE=f_U{gEb#7twu{< zU=~&{fBJOr+a;Z^Bk|wX>MZY;n-$0eD%?+=dG!5y_k`G(%I1kB=g!j9=5ep5e`OVM z(0E6HEQ|(60>QFe2x@Y&+9wrKi9$JixF3R6SPFR&n6Mj86JJP>uxt)md^c#~HzYhsLB_R{Yr;M7;Z7+><3xUc(h9X0gjM}b#;ydsuU zgEVw)4!Yhr_1Be;QGRi#NgwDV7tSv^S*3Hg>F0TO&p7-2y1Q$igb3-vXYWZ*$sV?+i-Rx)>PhnKPD&q&hZJ1` zGfWbm+t>pZM${}=_F*&-b4PaY?X|-Ec-!z$^$vn+n%dJ84NSj`H=a0m>@CmQfW-2^ z%V4Huo`PQDLt-^L#IE58vY73~MGPDZrl*EGyzkN8^;>p!=Whrctz&eeOXZxPM^cou z#VjrKtcGB+t(J_k)V_=O*B7)%%~#I6YlPd&x<+S?-P5hd){{RDubi7+!$(s=XK z_S{_alCG|;PnC}SotAsl*>GF&SA0<_5>VokiAn+KbgR-w(#Hc1SWiy2eUb8xXig*Zx*G+@2B?9s_Oas2_&xES@v;`N?u zyAv5hSh4Tuf!n{MoB;NZnfcs%X3p;WkDWt31q9sP_PGg+%{V%|0#r-)!@<;Wh)IbAiPQry!_pBh z1sTEPhIwFI>;Tg`wu1V!Z7^y7A|R73!Qo>pV%4WDxWCcPhQ{l-T z88DWS20PpFU|>EDc0ZAXdm-Z>VU8%oo@gU0n{&wIib4{vmrTz4#SlMpXCnB|g_um! zCY_&rdF`gROlIAV;O%{Lp5$K<2cLIe4^uxGfMi%N&NJ4qs?B@r64uZc@z`^-EOg1|WmAo%@dRwJIjT-$!BKU*iDp zCM$#Z;mM#{xF594e4!U;yOrGj{gl3I6r&@n&Jy+Z>wNcZ z92GM=RT;A@fT#5A9XWcXh$n6~PTiPnr%>b`bAofRfRax6P} zb=61dJN_ry(=Lv4#j=R%z1pg82h?G+-Yi~L^mBSF+K{f87eqx!0qGq)O%x)IlQ}2H z(Inc%>;FQDo>d~5A8!UDBQ3-%aW`1~lZOu~G7#yy3Qh$j!A8AJpxoZXW2Pk}OuvyR zEEM3vCG+9nCw-oOj1xXk%OzsB@}R?W0vOMoPp@5`LVW_&pkdQG_%flH{F3<(QZAaq z?}Zy7c7HjH-aE-_j@(4{zVSjN^ui>%sfwGqSQu6TPcHljL{Tp|0rwxK>LM z@<1KxjWfuTFGoqy)mKzJc?vNRy-gxjrh(8x7tm@CB#LQBhL5ks6;|1Fo2D{!{s{&7 zZ}IT4RR!Ivr=z6cz(R=)(xB8T4G+?SFj>T!)|w@Q-lX%Ot*QxD3U+7}DT{;O*MnW) zHL#Gkg8IPiWl!6fczA z$2kk!(dh~!p%ZVyySs(-%;avm*Jm7C^6V?^9-IvR!;@gm)fs>b_F(4oF7#?B!XsWY z;L+=9khHl-a$n!WBCj|!3|R^L%0Iy0()pk|YX;i>JA*av^=M;W1PqLu1**<1baUwm z`pM%j@mGrGv3OB>@ZJbb{`-aB^jsKL_O5`g&Hs1>YrfNGcI$XkBM(Ek_eR)!ZW0NO zmm`6@6(J=d5uRL52B$_fFxdByKfSe|KTmuvxJ}sr*RuPoJf5_Zc9UCV%a;_Qx$_$_ z0yWs>w-Q2k@`-@{D-tCx2oh31Nld3CIT|oj^>=X+Pon(|>Aq?W=@+EIrz)OY+`N?h zST70t+?2?B)vHxTewWCl8JZ+HeFy1RRRHZ+Ll_#qPBuNA!cVGORrWt|uw>N2($f#*x)Kh2h>! z9jI_O0pTy=klCRM9oECdI%^(8nePGL@djY%U`y7{J4nR#Dnh&SZup+L4h+=igXNDo zF#0o(kny2po479cP&as*@R{W04HGNP9wPVgA6dRX62cl!LcE|J?3VgLO1s_Qd+%9T z-W&-cU)-Vf>Mp1|Yy!I5?~=5il3+XC3_d6uLuOtMY4M*=rv=}uI_j88R>-~~&A+;M z+hWT3=|+!v`=#?q$~sNrd-O3C(bmGzWOdY0Jwx}|&mptaTglL+l{${5hA{i$HXCw&R@1G9Box91}##OwjbMKLNGK$a{mPweLN|nnlv#J4& z)8x72Q{tGb1iDRP;JH1DoU2VCR~8t-x*RK5aQr{;kyilciPND-JPHDj20;R;CePHQ zh(($%7%$lX73wQNqT?9Uh?GI()MDsbYYVvrjv(8Z3wQmmgGtXd@Y2nMjlP9YB>fPg zf?mL}_!bzsmivJr$V26A&`~09?;| z2>E^*p1#@yb;4I5C$0sinNoOXzXhBf4uaB-YN#1}4Ec@^K;vsAEUG^S15juO?_qtIEI0~_nkfsEos5MFs4>V3kXK0Xe#rWV5fT^C^4VrQ`FSOFs} z8j2pDgfiC%m=SXh+*CurG20X#*(QU2?n&_28441`TR{G;H@v!83N3^EaC84Nh%hXH z?6Yq`{>unZ@n5jE;s zaHRD#)cq?0*Bca;bTz@Eec8~kGX`YyQlTL|1v)pLfHzs05OnJX=&VWr-TpWz-IE8_ z+pmI_{b`upodu@1iy-0AE|7Vs1#c9hV2R&jxcjFPT*Oa;h|g1yTJ;bDCRV{fVJ|!$ zZ5h)i2y&+epzDbg=ib`}rK{^<#rHPwjk*s}OYT9@sybNZQx3@w%fabgF3cK#8-gCx z!L;Mc!0fj@tj)X(iL(o#;BYobpR52W`z8>a`v5woTmj4Ibg&(Z!MEQs!M?^H9(>vb zqN#D9>V5_^#s`8`jWHY;bONQ5%OU)U322AtLEt|-XzZR1LqhV@@^2t5CC6^6#=!txahL0{eomOlxC`J-2$VQ(t@-7=rxI1pK>96oex-9-hwGLlAQU<7a;R59cE<~ zLGoCPJMMY`l@mU~{qJwV(B&H>Z|nojJOM5&xEBh15t1idhKTYT(5&|zPFdUo^FLMa zTJHgbUG0MSo?iIV{TAqz2XOasHDsGKz~G-Npz^8!R$M59!wb`3*5k7vxgZ;c_Fe|p z>-jL>HxWJ-Oo5G53K~_z;HA_tP=99vqTW|XYDEL_NL7cf3QdsER|h#z2a}>drmambi_Nvq=tUKruihYx(h7ONo}hWM#`_O0U^^Qkh?27+i%8(y6#|mo`S|De#(|4wGQ%|LBrGPW;UN zaAG>Wg+yBZC6&q#$hA$A$aJ^kyvwiG60k8PCP(s!#ULYwQqM`#dl&LW<{qhNsU{}s zDdf%Y6CxP%mV~g^WK!fQ;z<7ykGwe$GQ%7OUMvEI=_Zi&+YDNFZG@o-5)jxmKuQcn z;ji=pu>Y_FULRNsAv$J|+Ajt7N9Dol<`jtA8vsKt(GZ+v3HP7AC6V?cn0=6a*4B16R5PB&U0Wn^qVMt_p_NjZ2_6RtoCNr@`9gf$;NnI$XMQ61aOCAtdbx zbj22cwbFIyt~~=j+XG!BJ@KFow=W;UG341`HbKfZk&j7~LES2C_%tRq7&mbH!=wKd}}**#mqG8ml>5 zcSD}OGnkdmf+*?)Tx>SDxnG9C8++l@h9Ic4-w5kOwZLtwC6rFz0#D~GhT|GqV03pQ z^f}Cfj)h8a)>{*Fu8fezw0N>sGK0KaG6URhD8O!yB%<`_9q*bC<6la=O9jW(&{YRq z`O({y`K$8!`OQ=J^1N5%kkO^Fq%Fscm)NkDWbU62!Ou1Ur>Fxl=a<5|<(|;QUkOLk z7D2DV-mJ{j;(B;g|~CuLx+9^nqiyBVp=jCTJO60i$PEz(Xz_ z?1!`Ak4`mg_N#~Ns4Q^a6$EQ)cI5UAAAz+z^ipB*n3AT+=ZUQSvGW}h~I!agUstg!|HOSeMI9IOV@uqzPR zkO;Rm&O`gLQfNMu0%cb#;jexlMEib#-MV+d@!36iP+bEy4{D(MQysW<-GfNk#}M)Q zEzEj01U_%Sz}_8?U{Jgqs#Nop9FgQc9l?w!ITL&dG+~CW}KyX;%1zx-60X^#lHz#j~Jg*awwJ8bOpKpQp z;|)Qb&VjcQiy&>l1G*oFK*lE}$aD~c7*QeEw!fWdKAp$g8D)ScI=Ppn>PUh~Uw_w8~2{(k4QJZ|U!YOHqB@cuX8GiuE`D!%u0m(R;#DRNcQ6 zt5%s|y~=7lU|@&V!sd8&=1%;p;*aKAL-FU2zjV^^Jid0XK7WnqRQmGgL8`3Ir@`|K zaHv)oPiQ34(8v{J=LK^z9OOq-yS9)C=SFy5Zh0g(zKo~}sGB^Pzn;o);bh^!ZPJ?j zgshgTBM*YMk!*JhBKh(H+2meCvK7~p6cIworzenYFIJOz&xAPh5i5 zIw#T9L#OD=M_nc*y#hR~%@6qt?%v?9I9XtFk-wSOYpz4PY?65o(j{Q^8e#Z5R7z4T zR+3-sXUXAkb&wCWhF)t4@V=8ta#9YG#?3E@-5dbRU{lztrv_91XhK-7F~nDFfuPl! zz-+NRv?ebHu~*8Vxo8?_9M%T8OmooLv=+X-aR8+ky`*5}YNDKdnz&6gbOMv$Yn1RgE$2DL|ekZk{+%;_*D$%9My^81gHl=4#~SbT^`z7gWL)!ilS zC&pqZr;Q|(oFp9wdWmGT7$onzO3oy{Cf1*ik?cel;=cct$s+4MqUka~d>$FV%h&2) zJ2DgARm=q=A_vmnMd72ta?&ucoJ{}HK-!Go6Lo2Oa@0wT?3kNQW>rl9anDV}BFm7z z%Sz|%Ex1WM=a&+_7683x)??q8I_y02ki^IqlBte*Th@)Mida;~Ulo&0Wu7bXHPb|ST`v^)AN{6~s3AAL$GQJ# zS+XQPNg*`GijpG5q_+~R$hU^a`N8oOI6yB?Y#HJ zxA*~Yix=@AffzLCnbdz9raLbkrhQ3PCf}?T=)lu+JmF7Y`O?`^#>O*U=<~ai`B_Il z@vQEhAtk#+q031X^nV$`i5O9E6t5!{!HLAur-sB$dqs>?hRLSTQ1b0=Cpjatid0To zN+d}psWlRWz(g$w>3KcIb}@LtQqVsV1=jO}L3-UOcpiEXria-<&<$5`-LVMb6*j>Y4HsyPw1VkT!r-`@ zfKiMi6x(n>G^0t>*gh}WpF{L-?jiEWC(1?YoaeQfN6aMjOa|P~R27}5 zB=L%+B=kZCseGYCs!yfzU%9&xv6mZp>22lwKPI<%W!vP*lwl#hn(<`Xd6rK#8eh@p z$?xd5#FzBtfDGz%%*E4Lp?La98uskljqR}k=;0EEp9=VBr*s8J4tV0of+=WGrHxD8 z8RN)Ff(_5okgKpk-z$?*_M8JD|@VoQZNt$(J1!ylJm+oY@1e*o$4Q+uf0TR!bQY0dv; zlto2XtfQeeUuhK2i&~A3p*<4Xl+xV<$!hr-)#{@_L$j+89;s18M!KPP#c- z1pjsiQk&%&^x@&N{N7Q2I-oGfADV*nX=WpJ-hYzL6ZN6GC&G9(JB?}1&syqy#)+?) z;ZWs2w2wIDKO&(mOJLqcCurfWk&i|e#Ne|V!9Nvb47Zc0K_9-6Q7cV~ol14TX7FWY zOlWAD6CGO?8q)WO@3=je#`Wj(r-tyTl2bl?Ip-nWu_=WHnn)4X%m?)5LOqO|)K6De zYGA*L9Ns_RN9BGL(;-0tbg5d2GiEMB@el53WVIU${QdAv@Hw2LxDRvWw_$UMF;-sG zLcvp;@p-5QPWPIGR$9uq+J;XD5+doO^7B+!ZYCYN?8x6*RZKf<-}2v9i{eO-G**n0 z!X4A+pce3OU$`4?Teum+=IlhB9a31aWfwkJDvUzP(&!|tg9oI)($Os{IJ$olZaumT zJ#Ts9@Kr<1d(cS9-F6!0t%G70y-`)l8m}GE!kgz7W7(mr_;Hst1|*nZbGtmYwhq$Y z5$b5G*i56_51{;SfBbzW3YSM6ML!cCbo5w{uRes}H?jv;90Fu|)|fH*6OHdrq#+wW zQsZhdEDaCF3!}Gi&!iMo+IJUCE?44wZaYpJx{YYN4dq%dqgvf{l)aOI1D6qd{vdwb zABV126EHxd2!oFC@z2diXkfY@>vK2bqy!c3`r+QTD3m;Y92Ilh@bZsx+;lb^=O>-V z10!J=uab?w+qYtGQY@+&?8i6LHPF{?Ee4bmEc*6{me#k>C$7oV{Ja`k9TvtWsR8P> zUYV5bOs%>#c$2{ta~DJR|h1F{8~vh9(E5FDG{H^PsHE40hM+ zz!NDWaJ%FMLieVFYy2J0;ZK zvx?69r-M943%an;9Gy!XaQC*i)OWTt4yQ=tD|bG99U+MJ$Ky@HudgBN-VO8iWRCTD z-gObHn?mn2;3vg4t)wy#m(>ZP9 znOup-1nymz0$1jy&&7}NvxL|G;Jl+ex7k63d-HN0SK_b7`N^npJs;ut4gIVg_ zPIGl`Lb)2({dhK4|8+W7@l&63wlwB)J+!%tVXEBi4jxyTY{Yd->T=DFdR+8B4Q|+V z1{agB#0lkVaeG8&a36Iz?!TnT+`dgyxUkRDxu@onxUH`=xe5BeK~QD@7G6^1lJf;P z^ZvKceXkzk+8%%?BMP{q1F(ALZD{Yg3J0c?K#6Z1+}-pPY}j#Fbf^hDN~=Kjha-$9nGpZd4T9^B z5PctExR?}9&R!P*~}4W&Tz1K@p_xNwkUN;zQ7)-vFu$ zC7@@b5h%-!lE>MlWK?$pESsJJDw;~5_U|+t=gX;E78RUBf%NkjYq|m*C-zahfEBnMGSRR11bSRMiN#s2xO(F%4DCCM zJV{m5^-RL?Yp!5+_YQO@55wTADR{an3V$ul!0dbztdY4uRZ}@sZA(MDtppDnM59Ds z45|#dW7=7YcNZ_l@}It~PmESO;j=~Ni zal+H2NIj2N(7Or3=8yG5{YpsVyPss%=?}!~VmL{N%qLdzd8Ae;m?YeqM>KZc<7b(b z6BUVXM8l<>*CBm`n#J$p`BdyDby*Y0}vqc*W-zj_(URj&5#%+Ws=@#35e<& zC1%g3ka{m2IHhO-US;ycXz(-fcKJf!Z5>h5R~X|;i6))L;>pkOSV(!)Lp*k^CUMub zL0i9;B&ZaS(8inO@&1LRS6B)HDk_O#XeZt8VnTi6ljyvT2>Mi?5=S^d63)D(Iz~w6 zxRvo~%LqSsuMu@vvVcB6Y)LKF*HHZf0_c@1jNP50$Qdmj%MTA}qkt0~%vnOco*$&@ zVx{y{iXK(bw52MRqR3CqrP2XbRY!hC(pity>88~`dFx_sP>)^b=!j_@y}nEc^V3$) z-Ejw?t8uANe$5aS?B}Ry?swap5;y5#$eL14$~m%_|l%;LkY_%gbq4 z&r6FqN|g0K6U)@o#QUcN#A&F2NYE3ay?!=mo2kKsPru3jV{0JeEDZU8G&m%;U3 z9mwr59b<5A5VLe9lzmwM3gWsD=KYi?uc#wK+h3E$$~$C9!V*&TP>J-l-XPR%KBTRd z1=~Hb{8QzFywjq`$ea8oez0XJeR`ybzcs;|H0v)WX1N@Ri~m4^lpV%imO#e3aS)w0 zw*MA^5O{Mf6z^UG2HSSR)ND`K+C3HItcJ+e+aJjI0g37#y#drAm zT7&%5$1CXST@QJ+3*Yia9w}2tnOc6+szqdQjyd_-7e$&6NRxTuZhTAm2BJ3DN*abb z$UzPuQRN2o&KRu;&T?OZ&ut*PgWB?K8~J^w(+dv|y$e+UY`#g6r3u0j4F1LZsWAV92< ze6U_ezHCk-!;aeA3KLUK{ZSFFVHJUhYN)wbahNA)AlN9xcnQrzGntht(F7Fzbj$U*J$XTs}J=-Cm<@W8nOoO z5n+c$UZ_kfKcH?L*6mA0&1Em~Q_g2}Tu4zNN1HvJCCr?!GkEk^6zaz6rl?EWT*oa7 z?u*<{Fg&5e-E^A3b!?F1hA*|k35|&+zYnY3o1ereuBrw%KFLV+Yy=yua&OCfqHd5BgXAH|9#ztHIRWTsy>pT&G# z%pN7UvY|y5xWaQEIZ*6^bd0b1JR@A3Wi6Qfd<2)*7;r;kvK)rDg4La^@LV8}u)O1B z+PVWc-ftW;m>!N5!+TMGx(Fkz7EcxF;yC3b+ zTB_)%|2=dX=|i#WEofU}&%FKDGPiZBSYePDD;JkSVU~w~r&v%mVJS{@X%W1fF$Ze& zmASqL@|?=ebMSD16rl(>{Nsb^p|Gt<+(RnBR*2 zYQoH|LXr*r+QYJS{8`@9olGZFk8PAfT)JPG-JW<76IS^`NRS#mo62Z%AcYBI+?L44 zR30llLS$P`@Y?LBV_R4{mQEVM)a@g<<%a-^zhl7KThtg7N;0cMM(pKI1s0Z6gG$q$ zpuJxO*1H7ZG@}FP);6ZCOM9`)NuL25GYJXXvQB;&+qfZ$-8>q@zRAn6t(#}CrxjK# ze#0B8woihX94^KdFz1y}C%7Q+mU^h)9Y9s>@of2V1twK<7w_$_!MMiHxO)5`wp~{od#)kdJ7FeU z6CO6U9#KraFq+9uabOozzT%MR0yYx#53iNz5kqlZ{J>JMYugGiPoD&ftutv#RvP&i z9!2heDAok{qyGDHv|iqWhT#g#OLzgpWwPvijwln*S-|YG`f+4^67~lOu&nQA@d~Y{ zozMNTZ$>U2wM#+K_mZqfeKOm#Z#q-CvW>0k^kOk4N0?UXM5gFphAnTWGwp}#P(9BT zQjNs$uXip#ZQ__dTPj4FRKD@;GAF@>P0mzqyEAt6dtjgNO^o2T;|fJZMz#_r=%mQp zcsk6~-JFS~wqelw&*)^K%+`5C;Jd0Z?Qf8Sod=HNe6wmi9jMO4qkiM&DLhvBBa|t< z+s;gC!r12~Wfm9k7i$igvtPeeux2dJ(DGRPw`l@zL^L1lvK46juU{tY@HY5+w~oe) zu>$cUYtj4g1B^ENfIq#Zm|2!0GduJHGfg#FnvpVV+jt#SEJty0+#oWK*(lU~0__GK zp+~?8)HwPD@2ZNh`5V9B@{$$IWUU#KJnh61vLaa6!8~l(T7%AWmN2OSE1pnCAL*Ui zg2$>wVe_$U$OxW`d5@CFP@oM2y3fNf@6A|Kl#Ip}&+$*nbNsz>CL3O%&1&N0Sn3C0 zz8OkPXXY2YGC_;^&J$s0stR$Yi6ApL{u_U`jG~kkVFvT(Fu@&0O!H_U`}W?E>5M-~qcVHpOFw&7|KQ|fd>A}$!(T~~Oz4Lq>#YAtuNtn!6JAN! zD|MWoGENaa7I>nA?OJML!(p6wG#rU;Crb zP!=|Rip12C{pfkW1ND+0VQudXEL}gIX&#ei$3+>w`*9p~=WIt)?;I23)>&|J_!GW4r;n5K)9BJ3(`Zxp|y)xh;{JJgqKh`?RR`#J0qGSH31X5kJH#? zEBN=`PonFth4G4v6<}JX1pN6T1!kvyk*72KdAWz%$XWmK&}lN8WQc5Z1Dx@``hTJ^%yyw(-?Hu1gELppzD&; zNttsAnYc{>{Q4$BgP#le@KcPe%a9;OMn`zNYbxj))oJKl<&1T;@o4)n9beopMTO%J zkO~yyzw9eGJ@FFC`=w%s+!f55QHH}+XRtlt3HF})j*lE7@yF2??9dZnP8(`*uf8~w zcl?i8>u9k>pOx8N{Dgax!g1k}iCFyi7v0%%oA>A3C(@meNsQNf5I{j(b}Y7#ZFoVt3^fAlv2JD@W-H%D8?idfEKfq8_oq;9+)3=QF2p8x z#K_`2?7ngUC6-m7efl%3o}7pC9=*p-=YCup(Sj3xG~v+aa`Yg_QL=ju?cbb5Hr}o! zRdQo}H=A0ZCHq0A$QHmgeatUo4hEC1k?7f1NbOk9#8%vimrCjuI`%s9ogX>U+?FHs z;DcQ>YVRBV1sORL5ftXhOp)e&6Wdkg7@JCa7VF}a@yDwiXN8Tikb@ZTLKpYggrSYf zd6eAmh7$@+(d*S_Z07x<>f%p{b8`TsZpwhI0Rv<8xd;~;cMIIEUV-eJCBTByVOOvS z48ENK8dg)rycLu9#Yz@rd7TO=nkkEm^`_%SXMKG0a4jYcf1p1_3h2J9`Iu+17@O~w zp-Fi=8r_J&rYqxF7tvr<83JsyeV&yW)5DmlKU8P)j&tmC=n5vD zxq$VS8L~}^*U)HT7PS{GMm=09o3UwR1?l|MkUV+GW%DTNyA zf)#MMh; zVVqkw1Ue0a`}TF*WoL12>hoI=?Gyrg*b!s5E>R-kaEmst%%NKsD*|=6Kyt#eh}Mb4 zAT1mVCZXwI_;bvEAUftfP#%Qs`X^vsy*mUib^*@dMP)#zH%<-o!;il+Xnnjn8Y=o? zhAR*6jB+@4eHmsb5##bPmUZ`_9=9oK9T)GH&BDu5d2s z*)onCy#Y=-ibSbf0_J(lH90e@lWIF?LBX9}P%OO%Xni7xca_7c#xD>&<`dM4_X1Dx zK`2`H3RHrAlCUft;y(O_T9XpA=+$MnbEYucT}fE9Xb26{WSN!CJLHW{V|D3=z%{6E&*SPs5#o5(ha@a0hOAk|U^&JQduA<%QFk7)8=m-n;Zyn|C=zqd6ylL%=P>JV zD{eU_!6aU7VWlnkpCkT!@QHJ;#kXO1M1% z(s(;*5i7}aXMq#G@&vXe`v}|Y@5o92 zD&(AW-oc%RHk@E^2DdarhI2pIh4y_%S?WzA7Q!FTB0EADc`}O5Dk~x5KsLO(coVAE z$a79R{y~kB6NsIT!$?;Nc0v9*<{cDa8>-dV))}u*XSX#LmR!W$NxyN?1W(r7VaOUw zb=bFZ7v`OEjfren#c~23a(lTeT-cebptSusXSFngyU;uf?yZhsyB!NzTevujY*1zm z>hWy3fHCUx6*%tUFOZZPfg}k*&T!m+T+pg67}WcN+X7@+<#jWZFTRIA!$;8lR~hQ* z{^K|Pdcs>Bm5)+IR%}l6OOzP=f$QE_uyqTI*kkdFSoBcIbjjc?uK4!|EZkkpS?lI; zMc4aC@WgcXW^pAeYR|=i+s|;|{xKGDE1hiB@#X%Mn{fxC7IGsC^|(_R)?D@qL2h08 zZ%lSnXE$e#$4#wOs3_co`=))NLEd2yBN7VP-&a$PC&eNaWZ0|eCTutQunzw+_Ws;4 z_Qw4mx4Uwj>F)zmxHZD3IQ@$yTyAX-%n~}uItIS69%qgf%q&OGk_0AUl#8YM&Yaj` z5AKhpIp_aZjuT0f;JmFLLr29U+*fbSDxyAP^tT3VeDD}^-lpM-S;M5I{Uq4FcBM7~ zk1_MnEcR5-g>8|DV3lqetTv&O`MwP0l*F`6m)fu8!uL9GHAix|!@s9+QakKec9Lv$ zedK-iWkv~h+C{VMhg;d-@L@>tTE{sKTXS3AD{!`BK4piu4RGyIF7BOnj9F(}vRPw$ za%8PMTlM)K8m*mxHDk4NRP86?Bwvdbesh>|*IqU~_BuOSd!9*z3s*19i)05IwM`{s zhq&9_0k3-msWmnmpWjd_mi8R|1D#2ccoW(qaQqm*a585g=sFI+>%GptQ7nBL`_?rU&m#|pXVsDqrD+%RquRj;mN+SOX| z)7Z5tjx~5)ViSaygJIe!&Rs5*v!;8v;Qxfc*Jgn9Cq5v43*woF@C7FRdk`}k@^GK; zYbr*AtF8)b9sinUA6bubO^S4IVJSE@E#z)_uQTx#S7XmsnlRb> zVa)ya9p+e6!~S{*R!`MM_HO(V(_c+ire@b|xUzwCPBQ5#_xpM~>Gv0@78AFxPCi<} zVCq#mcqNR@m@S1rn<}^~uiCks)I9Fd?sRx`|1nB5XVQYEEiBNfjU@-}XL?<&RD1S+ z)WP!vO>9<%UH?gO=IMdZ6KKMG+t#z9zA*OHw4Oyy|H=+7dd`})Cs#Kp1aOahLQNxc zDd)Ij2Dhv&i)(Kgo0nI@;su?nW0MwCyTvx)yKFUeUsdGl2 zO6>HcvGpF)Pp*+qSk;6(OzrItG|!PGKNXGewXFh%P<3cK@&f#Kk6>=?G1jdY%I0wA zSkInL=8*J>Wn`&V%dM~CC4N`aJCaqb5_OTxXRU+?HVV-`lh9@u2_L;Z@UzBKkg~j*=j@T z47D)Fsh)3mghKI`7sNa9APe|+oaxR_U|s7=+3?G+?CG*M?6~oN)k?SX;nb^0)7;nH z+{ZaL;aN{2=TJC_Gg)?l`6#+p`)_foJ}^O>1*LhR_o_fvy+?uj)7j0HcRb?CUd-k0 z+@8)#HMX(?Ulo{`WE&e6A7=5Vrm;(fYryw$SXIychqU)fIdK_j0QY7-j$d_-Imw@8 z4cl{=(vntY_obKV%ZgQ7<;hlO&QdkCy&7PeT|bA*|0TzHua4kag&$LmYZIy;P7AGG zJ6)^#y+taOiZf)DduOpvHYuEg(r50;%k$jwV`1cSc{~$3u!h}U>%m^07q0$n+rTvK zCSYcE1eh$ep#A56RQ0H>fZx-7q1Vod9f-Nes%NCI8mmH9tnr2Ib?9MQ`zKTv#EKk**iPePthH9CdQ*2IE6{jGTE|&|{p6Fp65FMaDEA6xj(Ps2 z!W`MOt0$PWSsY9JevY||zh%YaU$Hz}SF{GyU(g1h?4=xtrTIaALOt zm{X-ib?W|Y)nWc){6^WCNPFyMLqF=_!*mf-i|wOao_8GQxOO~B>(5}{o|faXL)ENP za$Gg}KASBF*M@~DM*N8%&y#PP;^6rYac))6Z+^z+cy?r6GJCS|Gz-qSs`p1c;o@+Q!t4e8LNYCS|88f)vA>v}?D*I&Do^c}7a=rlm7HDKqCq$}MC6BY%d;_*DX$GT~lktv6 z7(jy>cXPZoS$)`vMOQd5UyWFnpu$pWPQz|+@t+)eu$?q^K`w{i6ZPWPh_ zxAEO``f}n}PP<>q3|wZj;f^u7tSHA?KX?-pHwjMh+9K}e85K&Oh)gS2ZlosTA*IU*e}!3lx50j}DkI zb>Bzqi@qQ0b28+@n$K`XFA6wC-7{QtyDg^>>d2Y6Xe0k)It!6l&yt$Pu5Wf^>SJ7T zotYVV*Z&i;3@38R3tm#_n~U!C)v}o>%x||lGx^)jG@fd*?ZUF$kj4Sdqy9K|L@166 zb~(=l4ea5DD-AF$dpZ+eGJ^S`t67`I7S{9P1MXP&fLwO21*a?fA#biG-;{a0h2_Z!Xv1tjrXo8EcNx zWuu?0*g2_s7XM!n!a*6XrE(>gsB)TXotDH!p2*?0TAtw?cwfoOLvLwtyFCBBxDGoL zH-~AyyM!qcwSm(H}-U%=V##Y`m| zuW_;BV69@TioFebYhGH#%pt+s7M>3)9*_|OUorn5PB zjXIz(9b#Ror&(5xGyd*uP z%zVXMR_eKe`Gt>XxvH-*U4h5mhzYT-=i`|dXUa5hYO~d=<5+%%50kKqVrqALX~m~v zZf}zYr<-EVDa|hAw01jj^iV4J=8fPGY+`X1FHod0oNc{dz+9^5vh@5R)T+uu*%=$C z!#z9bIi$$#{V2;#Qm}K=`wA$B8j%SnRG_dx1$w@0 zq?)spa0T}Y0}H$H@ztkj)HIV_cHO{y18m1+h9p~%nTiG4h1fQ8KDzw~Cj+FCY%aSD zcQ%y3-a{+ke!Uksn1p~<=N=e%zZ@*=pOfVa$HCm44zTc*BQ$;A2UpD!!O39kh&u~~ z0Sq*xTS0Nx2hibthgul{Zpuwjj%$?TEQaJc?}swnxL-2du{9E$k(wCyW}!Ie6!Zn+ z(>j3u&(N91Q`Lo0+&o1{h0IAvicGot*`z2!(Ig=$lH^4y&B#1uZbHfsLMRevZ$n6; zkfhQ;DHKVQ2J)Uy_nY5!?%C(;{j9bAEBF)eD!hS6*~ic(dmB9W6tFq?0>9=kB&J%IpAzrq#eT55XZlchLPC3)-D2 zaQ;Oy=F;pW)T4SD>f;1jaNA!K^(R8hWDO$K@0#@lS#mC*t5y*cI@8b`45WlOT@GoD933 zgL3D5xOo012y*4ZC%sc(QQ!>ElRcrSXAivZ^M+%M4iK5H3R*r3;JK;;%-?$kOsOx} zNCd)lheSvpMyC?k)V*|1H+1I z;8@)Tc!-?f{EQpCmTH)jJH_|L%kRJc;bJybie& zMUZgkI@sU53^}`^A;T&G8saJ;)a?<}f4B|pa+Pqt<|(XGehnu-b-;vtGpvm2f$$#_ zP?tUkhQ&?LncD@kI4_}3xEa!C7_c5E(7gQ?XayC)$ir(8y|o&xFEA3g8;-z)wmI-@GKJ?V+kjN=fTvGafTn;He4G0h znVGR{f`DxhHE9RDc`EQbRux=#+CkkfKloc71`>6V(Bg0jRHv@Nr=uxgq7x1hB59yG zbP3W9MnTWSaY!F>g;F^is483!YKKg~`Z_>JyB^G5APCie(Y*RX4d1#prHckX+B0?Q8Vb`&-tJ+GLGU3o}#jrAtd4Q32l`8i(J-9LGa@R zaB;CP_-q%3dPyM&pXLUcBz|~&U=FMek_Nv&itssw7pk0Yp|N?bsK;y;JaL{uZo4Q- zJ;ntOtXZw%$7Z-Y8=%zO0G?cDbI~8RLXJ2GnyhTWW{D$YY&3(|vX7{4Z96(V!UtD} zbf8IP0<|l8Tp670KR2*+)9f{(-wHUnh^rFBkFeauTW&Ap{&0ff5fk__t_TKq22sKK%c!pO z5Sl8-h!Nk7v@qY^Y$bQA#bF+54~wPDO2i>E#G~KkNjrjsL;ihZ|w* zGXS9%7GPv#4HC!fL1Ab$>$6-2r#`7c&V^@4@Iwygbi<_@_l6fWR#kB|8>Me>xP4QR zZ`%m^bzKa$2-l*>OB>KAw4kze6s3tsuAK7ZX2ODonC>0?qB1^|o8Hd7g z=Ge&$rmx{~P0sfVoYG4_k=k7~2-uJYXFQ|8c*9OOaLo&3>`p@7&3^Rk!xhwWp9hq> zmjK5m95UEvmCugjFvlYUqHM2#Q|nIf)UpvvXo_Ix|!Y)WFY-zE^9pZfn5(Ey}Al)|6T-JtuAgW%xrSJ8SnRQ0;OO)|6L)wXPseeyxo62^3&%N+-aox%>!ov>yq!af(Yu!^k=-gHS4OFkZg zv4a=DH?leA3^8pBi2tn3b$G%@hz&1vsJ|LpyLbZT=N!Ere@>D zyr=N3YCX%c*Z}u_WP^smT{yIx%^gZ^V*c9AA~w8h7}ulb;CF`Ag*iu24xbU6k4b?> zZgFr_@&)A`RiLh=11Dbaz|cKG5DS%rDTOKIzoir{nXsric20!!d3lkpNpDgn;YMa0 zSdZA@8RGS`kgOw(MD5pSg2p>`f`S`TGovgv6&Rf z-b$45q61a=ia^oWcSiKdSrT5HL6G%!V$bDB{2YgfTHSAwsn$lK>@CQigh57kU^ZEz zQG&X@enx@yN{kuTK4x!X79(*ym~b1K6EdYt=JRF~b>ViR-ZDkfK#tDaVaT2{k5CsO zPkR3@rswV7kmpL(OhrHnIW_MS6Zqd_G;`mF(QuI>%;HPP_0n2S-{~SoBE*F0mRBGf zcWfcW(ji1wJC}6g>qNJriHxskCn_Z+#7^QDiDhqG549fh<;_bXyiJHI2IP@B>9a}R zoX5-#?s_J6ScG);ATr*NOrj#|i5Q0YCo{-~p=|uYG0+P=yf@c1!V#)?=$5g9FkQJVmWS{UVa@om+9J011Mn+$V zu(K+S&zvC@N$*I$!FO^heGyq?vbx6mmNao%_nT3(OJL-*7m;j@B z@ud)@RtJ{7M`1jq5#rp#fU9q}aZGqHI@lD$SP~DSec?7SUaCTGeGH(CChPl@I7~}@ z^U0gGEaMt;-U8SbPkg8uDPh%@N?!9L&@{xXH9= z#gMV7>%{D_1SyZuA{NUd7_I&KjM)5Qvgh^_nkjb5GjPkU9wLcDnm`@)BIM5V1LWhXWOBsp0y&lUo2cDdN2`47XrS8?`tI;@IGMW-xXP9SX6&(C zasZC}TMq3i!_da-hfjPK!>#krgK2*@cw8(*v8g3QTC<)=|I8x$?2i)9UB5}}%H=fA zLy~U1Q$d_oOOmf|3ZSXM46KjZf$WL-xMIf>_$#OYuf_s^_lzMb4yhp5=dsy6tuA7` zR*wFjrAWQ3d}v`qI_)}_N=+rVQoAd0HE-jkh}!r7XSxyLpyj6c{mCe3D3HeYXS-tK z(JNr}>JL&ne-`n@$deG6r$i$32N54zMxPg{(Fr9}+QuxQ4{dUYy@oL9oPC~fD{7M$ zH)SEDQx%Rx@WY3Lv7q8s2C~Z(VeXG8Cfd=Bm%ele@XNPQQByfOH}KoNT0F*{WE4jLRO5T4KJ^u7>y!$)G3MUo27AW>nyzdj1s;T zrijn%y908MZ`5=NZX+kcSRc_ZE_xqn)1DA1D&cQMhpPhU2s`7OFC;?>wlBfDrM}?L zFOGwET*E0i4X=AChpoKB@sa2x9JhBICgVB4*Yh3;mtJ6$w$_n4At4$nF^?*bm62Jq z#i*^k2)*df&BO`EL1M2ycv%iWW&1+BMvDup3B3i2gVT_6?-5khXnZdaWEK z=u*6n&X~B+HhmNNtZyHEKP#MySs$j%nHf^RGJ5L#ijl@Ic7J#&3>V#v#7|$pfp7b@ z@#cXoSWZ3+uITtMH_a2sp|U>mUUC6-+UrWA$HM6QB%oCurnK9^k`A1#CKV%>7`j-S zJm;OPaWry-dDAQ4`6D+p&-Xc}$#M-dX%a;|0#{JY^S*Ss_hD+y>H_xHOR4RXi!@yz zkNPE+&{s#UQLX!awBzp}XSzUwgqN%*k~c&#e}fuU7yZuJPg$nfjY;61Cxd!DuacEN zMCf3MAr+E2Lc@DfsQIIG>XEUJ{(c`qc_oWzozGGFO#c;8{(hQd)Y-sT1s57x{RFKl z`T#=#W@uR86ln}!OzOFLDAx~fD(}wzPk&C)_q)@mgHRm3as4_CSaO4o+s4wF7yIZb z5UDP^xrtM}te%M&k;41~80Yt&0~OmMP%2TvBiD67sos~V@@yijBUtZ6-7+d&bb?m= zzCxEO`qI2ruC)AvKOGSlp|7MWNk!f-LKfB#gVnlBRbLU}UmF4|pCULG!v{U9Cy@1R z9nu{qKxg}kQ{CrgbX@5qjcs$H9bSj&=Vj;UbZsKt-ycsM1oO$Rk}}3%&1>@Jf;m{u z=fgemj}hW!I3uCw;ETQilCqmkoCRx1`#f=~xLT2lb^k|u_ry^(&sDUcM2+Si@uB95 zwp3!42%Wq68?pLZ%9NILGK%T4BsHZJp4)vy$5!PsR}@Q7w3|3Nl_5gq4{=fVY7IIX zxr3%xdDHZdN%XCL2A%UZnyQ*6Q0W8mw0rdpW-#h2dG)-BDR7`5Zy*9yVYh3H?#Dp? zeGAa5a6m<84>I9Zw@FU76={5Xl-wVZr$Lf)>G0KI!hFSaSWbtoSkFVTIP1Oe86h39 zkH}o@qs09<4~O4xF(;`08I#^|43*ozL9tQ~8Tt8pN&D(F@~gC!tTXH*qia7AtBfHs zI82CNUloZQc)@Jh)X&bV_QA>xx9)t?jfEEm5im8g6GXXp!HLb$putCA)qzidew4!Q zg()!8(*a+lazXQF1n9i2hKb4hFw=bj(mWiYBuWJQ-XDk7j5qKJabdj(1w0Y2jKkln z;Kn~oaCwC^RuB`%JOvB!js1Gq{fa)m(rAM9b1_bttB-{rFT%gArLkeJ1nwCT#%;il z4_nQ`Mz4f1{`ms7kh`$83fOq3O*tvT-i219+#5rYncI_9-eoI4Mm2Z&S;RP_5T7tL~`#6QJq3D;uM>Nm7 z4UM&DaRNs8I3D+v(8Qi}bYS6I^lG*=ycrdPrnDv$Uh^FJx(^{A`D^I@8()>a1g zXgQ~~JO!n?+(wgkw2@@|bdAEXPc^=20VpuO81?5}LbpUZ(Uh@n=#K;&Xq#rZYhTazLl#)z@!z*u)o@+w_w z1{5QZd%Fl{-hmq^cU2hhzsdp2*t2kb`vsuJ6(Aw-0PMyqLF&jEXc2J(Mn46TaxX*6 zr4Tl9aS*tQJs@0GAJn>L5E7FCg-74fW>q(Ir#&83ofC!Z#d1)-SPyi*xx<&QCXiV@ zA0nlVAUfwLlxR4EM!z|9NBKfR*IA$imto*x6o}UBfc)Kxa7HWy89bFiv19cpWXC@w zw0bL=osi0LygY^cxVAu7fICd-_=36jL3m%345b$?!?2Mr?2s3PXdxGrXUT(xv=1T) zlS~v}uoyYmB%sFviqLXg02GcFq5$=IkT+xk!#Q&SKI(#Cj6cW}y2G*ZjUaqG9CkHb zgrydd(5|-`+TJgKibFS0Q}#IL>9P*g-(&_0n`9xhvJd%-mvD|t<}xj_ z5ZY)ek6M?+quh*@@Tzk+h)XVojS1^ui}N1%0SCdg*b8Q?RY2;N1S&t_%~;=1U=*_Z zYwAC(XBb5Fu(VHV~iPVB6cK>Slx*ueos%6KNlj2&v_rRtwWkL6!$Za z{=H-l%$h@XofRP&;%Ar~H(?b0D8jf5{bdfH8)AZcBbbM?#K_6@gi-hNVEo?%60tko zlO-lP}Tt={IQOwI=jWt`23?Qp5}WXu4Mz-X!lvp5A?&%kL$T zMW_Q~_2C_}CZ(tq-PMk$03y-2mz1fi0x)$u%vtU&HTa-9!5oG;a3kvLKr~@wy zx+%i>ZNl*Pi3Ef;pM$cgau^=o1nFUtEFaGt@*2g#^C`<(y`lt#QhT69%miAOnn7Hm z8%#^GbG9e8;Mbu98(Dts;50wjnu-GV2ZHu?zTlkPz;KE;o1t%YO(>ot06+SMP*47O zbZT8W;_8m%a9w`F{AvthKAa6h=CS!G>2y4Dd87fW1_PmL%mYRQ1K^HYGMu?r4ndl= zpmOjGbg(lJd+Z9bN}&*b)d`f}&4sEJ)9Bg2Alj)c2#M2+p>xt2)b+HWZoM+B$^459 z-Yh_a@k%vP@4s;Thox8!j6THtng>Q(CBQBjK>E~Sh&9RuRL0JqV?CgF=LRVA*$!1R zE)Xv43Of!(!wRLVEH^I}P6eNb=-YJ={jwP5_NPMWtf#;~Yc|$PW8a&xAEEc-7l?P^ z!A~yn;BtFG9NQs{`CrN7fafxJYDx)1j1*Stnu3E#{P^rC73{68gG)~=$Ai2aOyvyl z(`U-~KmR#c&~hp6N@Qmj-kMmrXEs(`A&J|$C2$ni4>*-9h{Ji8W4_ylxUX3e2P_g{ z-x+hTF6+k>XJ-v-R_ zn)@5^$u4hf^Y<9eYV^mZ>fU(s_Jde3;sCBbw+kmFZo`_Z%<=n=9L(QghHVRt@$cYe zxS+%sNBNuKjDHvxY+r{rKU#}rFB;-^4-N3C`77|!k4tdXHyu3Ow+bJ+Vv6sVaPX^N z=J>a}CEj{^HBRkZi66Qd;y4{MTyDG?7iDW=S-$yL#YGaAhR?r8mGQbTGkoZ{DV~$8hBu$rW<%>%xJYp;>zlL260d?hvEEuP%MCXX(IT`aUqX)%5k zun1QVDdGI~1z2{e48A@tg(DQ$>$r3_P8b)$pQm`SAIT)1 z9niP>IZVY4039C!mzZ~;8vT-Ga=m0Zicg_~WdaCg-G_jL;oo zuRRAQ_MC%L`Bx#?;0~(;HN!9edKikUhoHVz(B9Py_WSBVG>bxb4gs0jccJG^H=wh< z@T`aZTgNK^%A7c>S>Vn4&=>CYf!_7#N53zo0b4nxiD3WQE;Q^N zjI5U>FfyAvjDL%sW%RVN(FeP=F!Ew849x$7G&(jxzKaYz2Dwg|dBA zcU3Uue)1pHHn64bQC@Ux|6VG;-jklx-b?k1_E8;yAR6TrPnWtJqLJELs6%`_{W6w7 zN$q(mb}E_fIT%Cp3^Hj_Vl2&k6+-n`k7`QIG3wCZPs?0=X6yOOO00*hx$S*}a82n}?7Tr58?f)A%Sk8WLhbPb@d3QLpvr z;?3$*yIY<;2TIacH|ojz)w@Y_$bMq=MTw}-vtgVw?5f3{@E|`%0dY1i;p855;>H|IzFKdGLn@8%m4RYV5D_MFN?Xx#gB3_-ZzXxxd65L}6eZMc z4tR(6K>OBfaOlBHpvBv%SeRuW`jmF^*VcqaU_^y9|HNz6YiSBfvPl1oeo` zFspby*cvVZXSbVB&ifiHql)2>IRyz1Zd`ph9o*Az!P5?H*xw-uu9u!;SCei`=~;Yq zRxOUrD#H^y@^HjhJpL7P7adu76N$ZN-)B1-(6GUM6cCsPPpZZtF+U1l=}W_MFE-%1 z@8@vEP!V>>O~zL@#N)YdTyWS41MGPv1Q#V(;H_JD@Uaamv8tpRmj0)K<0S2HF|Rld zwK2p~Pq*SV4hyjNNNBK+Dg3^tCS)D(CQ;gc*Fqb`ni^(W*~aBf1uA z|E|H-w+paBVjen{(}iq+&6mU!fW#`6rTan%Yu;1E0Vitk(S5x*!u=u+j;h3_7izJz zOEC@-DZryjPWXeX5GDpuIL9&+TW_?$i_(2?+<+&(*%pEyNMFR!X_nZn&>kPo3Bipw z9C56?4i?%aj=h6Bko=7bXdQI|1NR6pStexSZ6Im#o_@zwTHGe7vmRpRWEE~PD#C4d zEl|&Lc3u9T5n`kab;D2u zR$ZMzG{yr7YYAe;$2FObRRdU6W46hGpjX)JaxWe}cM1OzSdWkW(ZYMq@X{mhF|^`Q zH1Sf9L?k;F3SAart>r6mSZM(+IrbU%duHQ|EIYjJ;C!5L?JC%YBty>$ZkBN#K{~v; zkS)&wJU7%D$IbP@I-c9HmCbzIXuk~WM85@(pTALvvJlg$V?-v_?<1c#MKTKW7-CiZ zfM~nRk@&!sME%PMHndkaQGGFtw-@ANkDXfh535xT=bi)kz;(2{ppllgDbogjCG?+z zIPNg>$C>i>xZ5ELOA9^4NuSQ*^4MIs801X&_;{$0>sewkHo;^nCXgdz*(fYY4G#w& z!u)%~u);kK?rPctJjo&u-D_PFRq9USbs2Kv=tm;t`;;WzjU;L#4~S;F5cO%fO_pzv zr0zd2Vdp=JCa36g{QUiHe19kt-Ez52h6X}OiqT1WYjBWq_a#v=mlz`bc>zA77lw;h z8Q@3}S#0z95FY57h3#*v5aZVysQ@T0N#zXE3vsZqq}?0W&~L3V)N`VXP9;@RM=lAP#V3r%H~HYe)dILAG6X7E zR&xIC1w`)sH&VClEPYq`fL7V2P=#IJ$dHpD`jV3cuMV@k9obND6lI@P=M7M+pC~<1 z6h_MxW2wuw&D6|KfI6i}(y$0M8ro|>^Taf0V4*Et#mAu`(y7#kqe`o0%5Yxm5T3Ux z1P|IDX4z~hw7;sHUe`~d8A`dd@>M;Xr5G+TsxRT9K{r|06)74~3k-pl;aDkN`~Y0~0zC#Z*BGA(Tg zr77POsnC}DB=Of*qU~)&e^la%>kZdgxE{ z_eIl}xlYs{Pm=&|Mc|XQ#`QJ3aoqhOcr7Q*j0&}rTVw^5iL#-}M}Zc-olCWw(@28v zFJ>%$1u1TOL4qF{(p!e!G*Ci=Mpv$-HQtgS_>bF!XTGFKq-_?Kt6~@<)g;;={(yG9 zJVU?50PPl7L!H$ONZDGzw|Fz~Uhh2Y-fD-}f1F3wa@T18mV>@ zG?Z3i)mQYAJSkhOI;*KAgE2k#8^?zBv-5u`^Rsn2{|55^}aRI{IuOP!E2J7 z+SyC;+y$UD&=V(kWMR#h*YIHrJ8YwDO#UmdrNQjlc)!?~c3tA5VX99UZ`Vj@(~-tW zYY*WOuKie;c7S8+975g2XxzXW+8QfG7d($ATdEfm%|20L{&_8_cwbGrZwk<}+tsL% z{z}>%q)43;w$SOf;`n2MtVzI68Iv{hBe1^BXEJr6hgy7_phsm6QfrY>vS~vVndcw} ziAEc+#eXrl>d$%nIYto=tm39u9$uhKKs?p)+eXRVKEe~s#|Ree0quSp=BCP%B2Ndnt#>g$? zqWMnNw86lRmT317J})f4I;QB+$$(U0Y<#V1_%conz=KlwY+$w9L)h&ozf3fGNCR?oKupev1>R|5N zOk$Q(M7bX`baP=8U3OB6&g{9s^s>Inmu4TJBVz(WQe;YvEUG=H;whSEjeZGnBsz-QO z{B4cRGBzi0U%7T>Cx7kvK35vQu8b^tV^5+rPJz1md|bX|9==|}jm>wPvb?Tr+G;yM z{VrF~lEITSME^bEGLJ${S_n!*<|5;{5y zD%t+eA4Y!tg`wDD2+@fGm#s#ih6+iCm@V~m*-y3NP3dq47mZrn%KYUsB$-{RRK_`w z?pn<5?F}4h=}sBCA!h--;xn7Bd=!s2jw_j<86K0li!TFXnnwG=#cCIM^VK$6c+tN# zTqGLZsJ1&^2zk7laaQCme8rF5FD$x*nCv~YO{AHA{+>bO59`o?K3?)YCom-~m0GIDu$ja^#B}ms&D4LMa7sM|jFl}QwOJDKgBOwi zrWC2h=e=~zHzO+8{+94Lh7b)@OI9w{p-pUVX{0WN-g+NITRtwLxl2~lxP~?4sP+?_ zvUs71&sZb2^z$X-eRVX%VRo(fruX!no;ej$3?N!<^-Rl=f1o-)5~qrt!Rf3HeEHHs z;v*AGqnmC~eZ5FJF7Sg)=*2RT%r20WehVSH`+)gd1hQ94(8!qz;*g<7M_-H53R@?# zeTf&d-T4#=5N0_fY<9wr<$9EET1R`F$H|(hdGvI)CP**jH`)45$0S|;E|zsmCIRnm zQ^%*=wTX9I={7!fs;6&BnnyoZCur(pp&bSIoBUQK?0LZ0T6$BDquH!?+=bR2 zNFtj*oT`yNv;n@@@nHKz34B7M6uzju<7^JeC8G01=wYEcBCJ%)%*xayI+MT1uJYA1 zy(Ne$Swz!Sp=PviNQxeg<)J;tqp)?ShDnk59Fr6EPa#z%g!;UGOKq1_85Ww~P5|G=nofuZ!B2C-+ ziSv?da_m?#8T&L%G#b}XRc~i%BXx)ldU(=;j~nRyg&U~Tz2#W4PSZqp^-`0Wgq_$W zM2AM(U7`?CNjv>7(iUz%nsp86Mm=>BBN2gRmcC{)(`A^)Oakl1yhP5)wj@dAIr;nU zHNpF9h~UwkggZJ2rh^=@*jpd0yiXFh`US%KtLq?D;{p1lT7ojVWto((+sNSyuZc(8 zccRlai|YAu(Jn4g_8dOO6x{oT1+BK2?E0>3lCek@CwpZP>5kd7ca=3gxnl#}dUp-| zEA*W>-+l~-zdyj?WDp;uiTG$FH&zK_b*9lBsBKpUaUJBMyp8=tv~3aby7?H4(`@m_ zE$UcmXA-=R)P%`UMOf{?!trza#lgr2j!G|Pa@*R0zwvcl5s?gXUtLSL278xx3gH30FiI(hFtQ>V5y6SeLwB$jg zRNFzWHhR&Dy`glg052WiG7OUYs{N5nm(n3_3EsDSCV(dA`60d)@63>&`fn7%9 zu%y9RZ1mFse=D2;Iz0-Ow%i-_Ff19a`7 zH8fDjlD*dhA$Q3LSh9ZF#Ly@>y~qTASQv$S+21m&>2rJCaI# ziTJY2QNK;IVUWuWzI0dCyo`w>yE~l7kw}aNMK+T6`FIBwn_3(smN{Q=`~BHbN)`E{_G*M zuk8*bu-?YQYTH>B>us_~rHCA}5hVde8pO%zDdGJhMAH|4Au7I(WD!>yvvSu~Qat*V zM23GPpFTvAy_?dB#e8Y%b!H9Con=IeQ#o|!^3BvSs-GknD`MeSfmrXy5J(EgpvO89 zaMdapO6FZBd|Osi_x{!Nu=5mo5`UQ-sNGLWv(FR%Rhs11js1{SF$}-M9l=#joV>Xt zNCY1&VGKoLnA}_2iCG}aXWQCA_)TL-P^}Wt`+AgY-}acWp?Y#@br^9+aYV@TJJBf9 zq$=44bgs}+DlMu-Z|;?#T@QJPs-7F@vwX#en-h?rYF&-F?qeqR(oMoYp+bccH`5*) z_H6ymfR-Lrpj|BI?4c$PC6=r=OMW>Cq>7}1i6)PSlSov4JQ)yACWUXV5Yw=?WW-N_ zcFxkEH#zK_&`y{R9oD2rQ#drmQj<2c%h6BE)ajHLP?w!sskGfDy7l`?dZSa7E}Gp( ztQOgkwzrFkc$7OysXa*E*M<;%`$r_Z8qzEq9=ye~i<>pzq2YiEf0$WJn{rGwlSR3ycJRw3tLH#9To&$OQsLE5s8P}95! z3YN7nuBQ75kN64_ZXr+HNdQ@6o=LcK!$|OVYa;&b2P1T(jM><8j!8qyYCK17BNuHE zxVG;WQZ-gXp=@WxgxeA{6TX|NoIS;4+}9v}BibZ~XFl1cra}S}b`zgj-Yl;$lF@zr z7`|kTDgxw+h{bXRz$+`%Yo1!7Xis>$>4M;6>j{A z0&%W05V-6#>kmE-6E{zQQmz9uju?W9^J>5+H$tPJ1#GEX4YQ0kf%DdFkn+TvV|CWk^^A;jT}K2i!62V6y>_V4|Y~RKlKs z>#`2Elc5#rLYu&;@D7N*tbuQzsv&7Z6^tmbo=u?=5Z!hIEKPHu+2kCktxkfvxU+C^ zRUGWC4Fjuz{~&6b?W$>B2X^Z>z}R7y>#DO0BvQP=V~Zy^sqKa3%zwaYC*Zim5;W4R zz)Z#-ny;IIM4K+G%Q1rD3kHzUr3JqIQt)N{ILi6kkIHr5A}gg9q*arIS{HbttZ_di zkeq^K#LAGSV;P!kszkv@YtRdxY?P1@hl*DuqchgmQTJ1}CnW0=+BC`q^=IcmzPJL& zCa6H@$YKZ$1rV-B@MVn_w7u1VJ?xrt&sqoj)+5-GEeC>SqA=hg1x~D=z-H_{QiGf5 zc102TE>?jQ9rBTWZWVesT7?+zIMny*H)qdjUry|$mBBexKxgG^#>5|+}CJ1|0uFd`GVxe2r4g%L#9d_QJ6;v%IMvVT(?(o z#C{9b^d|5yk+)_ulR0ykf*5`l`m~v|<;Zd*p1vKenej$~@eXK6#TDfrKZyRjorJRI zWTKY(0kjh-!niN%DX3Zp%VyTWvwzzmB>NOtKZ=KvJ#7Ej^-vJl83o$*vG8g%71mj1 zvYwY*Xs;@Vc>hYs$f*YH9tOU!UgUhAdMITY;Y?#2+;QrJL+a1KrN@iY%B!P?hF`xcNr$<=7DQ-CCJG>V&_q;_S5l_?Y-=Wp5{>qzW)K1 zKOKZcf8VhL#~vuWc8~4vWqo0A7v^oNh7jK}(41WeDb8geu6GlzhqL$W=W;+^40yZV z2c3hB(DmjPy!?9ul(tlYgmf9W*WQGj#|_~ByOZtvdIEVmPoOdVAykY}xXNDv;Wj0( zdQBA=RJVcMtzM{F`V`s^Jcc~hi>8{>0>&kez{2VoDF5hXpUtdx>N5-*{|rN`!Bc3v z*#Sqn2Ow_xE1Wd=3DKO7FdFp{B8MNthiBa|qcjWWq^jam3G=Z)Ra|I9&&V z-x|PiTRB{`$YFhSY=;@E@0?K01_!p!?8n_KI6rU>-0Y*_=kOUeHy8t14aul@T$iqOe476|lgSLu}p`^uMQQsnA z5N6py?+%P0kEIi6bHZ$pG*p7f-9J$2q0dN9LlDe<^TS}W0OWxnY~lTi%vkPYu-Pqi z^hg7Gqs9yEe#>EwzC3)6;Q<~Q4S1%Dp|D#Vd?NZ#nxZ`9>#D;6Sw1k9lZCFEYuRV4 zBQ$@rgIx`KVeoG(f>Emg=9d`-?U)|$p8f!7yrZy3ZxDQAeuBUBTwGYAiM_Wi z!h8H#kBOBS7F;nG|9&iqqdyDbu`j&%9ES_1mi>S&^S**|bw3Ozw!*iWde~xK0dDL% zm{3lEzSGH2EEx?wzr(;gBM#KIM#2@d!{F5&0X^H(V3d6iR`rL2#riW4Y`7ozFYSQM z{{o=dI~KnDiG>NB!yt3P8yqZsAh7=sOb)Gr@!nyid$Iu~Z7f3XNTiW1V#+<|7ryg*go zKcR2UY3RkkdDLBJhKwERk@s!^*m!XR=??Cfc3)t4@!z%B`aJ(-MoF0S%i}BVKeSA zEDOvMth!53W7k)XrC(i*(?C4BA7%=2@1w!IW&(L1<%g0-UQot8jWlZgICcyEt9kap z3oSjf0V(-pBOwVb2saId0Otr8xsd{zHwz)q|13xh9)Sy{E8$_Y3Dk`p0y-xGg1p1n z_3jC(7NO8np9Ej;$H5ZzH$Kgi3<0|C!0p8DNB@h4;Fp&{^Vvo45xNL%oyS2Y^&||7 zIstELIH*)#gH|?=-z)P7ww-H&i=Quo(`tX1T;u?=rrx8F0|L-u!38BpHo+7B!*C(? z2FwUuhj;C3L0we|K$H*SR5ydSQ4Z^KZ2c}#PgWkFB=)%J>tmmQ6*CSXS9dB};w{1ltgOh0IX)OqLw}SJ2 z(QrE95e#q5gVbVYD39}p%@gU+T5%E#QggwD?ea@s&w(?FC*fyw0vP6mgKuCo%(htp zW+LfOJDmsKQ2-5=9`GY|2{c++gR0g`UvsFJfguW)C4?BV3apGW5{z97G+0^rfk4;q^6`td+McpSRMGPnyt zId>;S+ZD5{%WCLvI|JX>-Gi>F8Mq#)VOtwL99KUVxA)D#?O#psh_y9N&UC;LmzLsR z75ccZ(-2>9H^R3}7vVmz!cX3t;P0+F*jnHxXoWriHMu5mnHdkr<^nv7WUs^5tnV`- z7dmFogFE>N$fRhLnKn`&{1?{}_4xgy^l1UHE2tzATT93_)lRb5VUoyRdP*v+ZjvFL z>qH}!k47*8biD2Zxh`{;EDStN!Z_^y{Q3j3qFjiEJd&ho3nl5VY#G`mGD+Iid1wJ6 zM6-GosoPO?x-n%gz4mh!6<@PZWAf@$1j5PfybgD#J8qt?AvG_cl^{!yPxooj}P zZ&)#@mT)J|hhH(g6JNME~kSP?*nR=R0OvSUo`g_`)v8}29omM zfpJA0nELN$J;Jr1GhGN_Cw`-$?r&^*%~j%u>Khsd*N z*3xa<9+Jm|WtP;H@w%aaV`sT3Zx%75@2i;QN}EtzWs=2G@7Z-m^w!h-&0ZKl$s<-+~mlp`Q##6 zB?B6{Gokt1E@)J`0g1g2AWi)=Oa^6xXVXP!SI>f5r3oM%TLq~G(_r&w0rn1EjinXV z;}>(>alPUW+*-2}FZq{>&nBkeTd9dybR-R5%g$x<5GSxNCmL&&TjKyvA@KM?f z^(hDn8c)EBF#+uJR2)a%cnfI`eE8<5O(PeX3cWn0znaVFoiXM#7qp`I4-b*Q<^bYtqnxU?b4+97Ofpd0%J>GTF+Leu z+%v2G;|eg}xk*8ToVO`v$PlDhJ`c-3as3El>|W~P?j+FsC zxRU=JB#!Jk=J21Hqy!0(zs6d`>|PWx)`=k%xfcmZs3i@9EK`5tDQOjYK>|t>$lAnm z5_kMLNwX^_scx3!*==FcJIK1(O8p6uw}`hmSB{yAVLHm~Lp7KcwR$-oY7nOM<37O#=c#RtmrFuI_%fiK-lU^6ewyypBTQv89}8&4uQPY^PbC&A}a5ZjWCGZ^FeVR^wP9YfK*^93r&{cW1I0{xvfA z>>ojVdHokC-1!zB|MwTpe3iooO$Na5P&fE+KfqrpK73JC2Mc%TVrOG5yzGn&ex9v| z-G}wC#jZJc*i{e@b@5{FAa!h;rh~0gEO5B18MgIbjIDle#m%oh@cRu8IC&16N!h83 z_a9Wlybne2#9dL`(WZjO*=+gLF$#t|KBI-JPB3U7iAha-!t|=GC4w@sq+TJAxYYnz z9Z5h-@=@Lo73A&^vB3XzG=hB);Y)+4Joc z`KbAccw2rXyPs=PnRHXCFeFL^dW7iq5+&-mMTJ_v{y<_PQ;2gvd+*4eBInM?&^I2V zWbK!3(jxJQFbOwFkwz)`>*GW|9u^_(9aW5$vmA4Aa)P@qMvk-?Iuj)}=M{h9BqQ4B zZE-aAIaGz-YmJp;0O*8__%^xT&qq@q8&+x_DOQjgq>kKJtiMM zkCRquHM*dRJxABrOqbttrY0-RsK81=YBiWfBDrxyXrzb~R+W=KDhEjaf4QVmp^Ds? z3?L1rSuDf<8yb52j`KKaiko&!h+KOrO?bymNLfP~8Ty(-WOKYpiT613YMvpv)#XOK zLc+;)yJVs#S3nL<94EdjFR)(IA=1%ulLX|}kzcpENyEu!WFoGFyto`l467}PZ_Rba zHhn3R#C&HXy?>d{2V}_OX>%guo=v0;FOVNU3P||R0%AA}B<8#XQMaB$76(TYy_Iex zzhDj-wBsWHR^;?zU$ROfgCLC;Bz|@uc|vcK6GrEVMrbuz_OF^$|A`{0t4&C$=`1pQ zUXP@_4`Ak2^>9nyKeQN5XhYG#&1g`en`i85u=~}WJFejv>Wv>)(IP! zh%djm($|+Wzy0}`PEU8V5wAz~%u3YMaf`EPdn{ve=P@(*egR=4J&a`Qapu8i*4N>- ziL_tXOiI=4NoeOTqPabTbQ_frvDVwJIGZ?qI!%6s{YRG9*OP-4xx~t#iCAC$ zNb+3&A=^RRazIsL;Obn31u^VKfyNJBiO(a1JyO?s> zPn=`Z3`gWEFXAz=Lh-N9AjJ=(=O{O>N|E?NLRmt^Y%XO^s;OR{*XjECZW$hoG*q1-u;D)%3$| zmK*&9UTgP){ldR&u80q(?-0U6RWopjx+s1-Er55;dLb(v$>&rcFQ=n=a$;zXWximUX@BsKl(Nz<*9Ou@tvlxVI6 z0jHOPW?d#2{7ZzgjXU7rJWHswT@7hxEkS4J4p46i2Q9@6a0odC1fmXTwL90rg;26l@Ahgy$CJP`tDfyz&O&l+y&%Jm$r#T7>Y@yHa?TwgOgBl)yJ0 z&cvQ(GC1mYAlK^8~#G0f-LrWE{#(%zQUd3EikI|0;*!#pmI$r z#C@!Rc84KA`<_D8%Nvkzn{_^542L{tgU8!kr2Jl!%`DGth}C?}+|PK(NFK~%{tJ+1 z3xu7b06{e!DL&&Lma4^3Iez%{1U*dge;lBn$t8Rn6+#}ei z^b$(sCgEtwPl)jAh76_=I{rKW%dj%27L0}5(aq4!Ck_Q)>X3nQido24U$mi%i!^-> zaJ=PW&}h3He6cr&{p~gA@~yY%i7i1nS^JrNI?;^bg?Em z7({gs0ngrzu<_DUWVDdwzbDGCz~rm$g#8l=gJK+3#c^tW~nM3gAQe(y!_-OB^qk9dQ3*dmD0I>V9MD1hER z{mNMy%f}V{UCf;_*nuv(FM>&XT}W|thIh5B_tmeJql6|KMomZ zD3K&<@17%rD{qnIE8i2lsGsCfJ`eT1C&sdZd1!Lf6dBVIqF0}fk%vj$56hR^kE4kxvzlOBkz&PZE=p;F+1dX;4|mm$x8G_ zs1n)E@}EMgX_44c*I8q_Y{j^{!9@ZviKj|u;Rm)RmJcC zBZ3=}|A3(xAJ+U&9OFt^Y_?MppJUIuKc)*}lT;z>*)NWxc_p#fpc@W!J;m(^nEae-AeDh%iTIy6 zG*~B@yS`Wle{WL2cEz&z*+wl~d)xqzURr}!tB*s&5&>c}q)jS5bBMNY2hr`4r%9XE zQ`t64${*WGz^j>j+4hu#tS}%vKja&J`tE~4m#fgg5oYJMZ&CU?Gl;ZvX}IU9LrSiW z6SetHw8?xswP3l^7QM0b@17HMBK17o6mpU3iHgz+qs8ES=n0C}W|G1GgpnP()Gn>aV0JgL#9i8zk-{5(TfyeX%R=P%G1>*}bJ0Yl}s-J;pw zQd!=J60>UR5J+GpmUDRyj<4s(qKmZg;lpo0#_9r@t*=b=BEOP#cde=O?MzBcs_5Z& zSLn{tXo@e{(7Gj#RJu!?YH2=UoZFHhg*3zPI&Ra9%|pqdM}rlFz)Q^aoIOH9GfbQ zw+lW8-A&^#IWh?cOk>b@pHlK&MUm#R*;gC07Vm0+vLF!Pom=TjVxZXmyWyS(CdeDsD`x{ zeR4;Nt_YE$<0ndp>M#PFz>9sCsN&&~e;~DZ9QEaQDh{NPW5TP$d*yFV>d z%cdUVxfEArv0aQ5sxEwv`szkgZC7CVC$q3tdp{iCAdNkDt;645@4+UU4Y3*Ul9h;; z-jqL2sysEQ1e+U=_*_X(u%%e5U{^Y@M46iIT1ti8M~K+zP;_woJRD5E3jSJY;PEg8 z>aWxRY8pln+(t6rT!ki|UPJq8k|_FKO+U2O(2OS+sr>mInsxUi4SchX>SmNdXpsz7 zXFaQ1?OAWiFFQQF$q}#lHxt*M+d?v=c3p~tdK5%g#lYFc&Je#zhf(_QlQ?FXQTAQgh*LRUXFMb-e)Q)Da$)cN+(kQ=I7}b~CLs85j8b8a8>Z@=;<)I($ ziIl-v1v+@`h6F4dmxissx#117JmI}V7(o#ROw0OXq-%R9Wq##St<8S)sD?4iy%eRJ zT==PY-APg+9|;$0_^>zr0n(MfK{H1RM;nUa$INQF9N(Kg&eoE8>X~E+M5uA~bT;jsD%7L8E&Q(PlY!`oY?lO0fN6NIe>U(z zrki~6zC&O~1zBqsLjOKw=kO z+mCLgN-URNTSS@qiOwW)cD^ule+#7E$%f$ehfs0sHK^4lfPFzAlV(~(zF2jW;PXbb zsw$q^mgG~5o4K^6=NQdBluJ`QPSV}HS=6^{fca{oggM@2@K?MBg0^kM-R_|{J3}A; z9Q6Vh?_EUs#|qZ7T1?iR3#PrUrSz6}JblQx(oKmTw7u7rb^p$z5qI2(gsKGa_sj$J z#t0~yR}SJ^ufk^=d2lEiW+wlYk#);Qh}#xK%{yY~xI{7St16~99ohfQb~dk1GikX( z9NncQ%yIlHfwe|*;dJ3GKnk01@S^Q_@k3=CYhVW*S~leS7Jiax=0`r3*wGu_8MIR_ zmc4vnttp#BgSPG@i3wK`emI5TqcN0PX2Xlg5|EdDgxXA|ShxL2((m<} zB-R_y=9F;SdAX1_Dx9Vz3o>by$Z0yO;39<`dDQH@3dy`iK)CELdfa6WJdJ92Fwh+5 zvUB?Pv85KFKM3hyJ<@q*46!H-peU5}$3$jQbUc#EY>uXdld*JabQP8CzE4<7DUW82tNgLHtiPN8>pYt5~*yh_?-l==(5j ze7LIG+}|7t+cV`PAxp22C|gqxU`HXz$}y^pAckk>S%I#_^&gAp9BQv1^(Wk*0{o zEnYD(d>4q;$(i)1p^fXUHhqEjY3*o~AYA(D=@DdMD`!4KfR+ z)O`=Nt_J!`=s%Ki?l7~-b(k|_?IqMxWD0M__k#2pWq33@ndzE5L(EQ$5dAYo)WdQ= zJ>*(Q1K#D)mEo*|XJH17=PRVQHki__2QMI>O#r2V3XoaCg_@wbc;@-}__NkbZ1=nY zovAk@QI{8zLCTOY!_BnAA(qbWh^AI92Wjn#02;P<7d^Jkj)v`gLF}B$7@@XKiz#!$ z8A~Zf(-VuJ#gPYWrM5D@u@{Iu+YMp7OsQh$4tmxvmu@V|qidgL(@ud5$`@Ejqf`#j zjB8dTYbXXiKa_{EqF2Gh$_Y>u5yuWb!nj<@0H(&~5&LFqvgb)EQD3b=ak)PoU%8Lw zF5gM32dt^vuohA@OcykolsX&x# zD@X{-%k$D*PE*SKXlI2FeZh67hF9Du&$K<26t7fm4UKo;7$EA@N`^>Px z>h@w7`HO;}_bjBH?9OR==t0t0Z-k7dF;%|fK&xJw(8IPm^zX6xRG{}C={c%OW=itG z;fWpapn5M1r6$1Dt|*9dTmd0>bx~Ifhvk1ZkuBarG*e(P#hbU#J{33m#$p$(20xa; z8%$FSUXUAO?A)z392Q>60gLZLa5_vG=ik-C1si7L;)9Ve`Zyk0d0C+wnWvaVr|yu9 z1{vx!s7n`(&Z4I@|B~~%pGdSsBY7M9iTSvBHIQ-!MmqZ;ZR1-Q-82D{o4-KSr5kK! zQ3D*APu!#ztlQMSob384LQ~&q(KAA3^p82F`jM^__bi}Of&aK~S^#`ic7T8TMd+FS z3(`k~FxN!_bB&9jF8EV@!=`G+t5}?!U*07lF52{bh#d_U+DN}NVVdpDcBzRrjf$8e zr6p3OVX{VwyPhXA{Npn@p_B4s@hG3w=0mk4oi@(TsO$mVSw7HjJfH1K9QHvoanG_-SHTC(!hI* z$v*mtyLL?m*HASJIdE#ZefBYAZ&nS7TmP6Gwo#-9t${{#ZJ{ycQFJ0ZlKL;$PV*K! z)4I2-=v?`Ebn5dM8THO0cZ_97)C&!k!M&S=`K=>edk&CWsF~Dm`AvM!>QIgNb@c7e zozy=lik|$OPKQ??qjSE-QC_{BRMp}kX*xNV7@w3Np(*>B5XavflS_+G1dk;A^%dw!!jFGGhe=~1%{YpHG18hUjdqI21t$b*z6R4+n_R;IloS?7{S zfX@u_*FA&@YtH1xb%t@jMx`+yQyfWQY&DtK&O^(jG^p(}bE@yPmWu!MrA<1~)G#NA z8kO#%2Ge3RR&D_)5RYWWSBG8iZK!77VkXP&F0*;28A-9Z zM1(ZDi2Gqt8s?!&Cvz02;u&$;QYlV-Ka7!C%PHAE5=>mO8kqgp+PI9hHm7|e7HQbN zMpwglkeKfSW-vdAIFB_GwcFpxjqBoco}3Xib6H094PDsI%Nm+g=s;KbDN!r$<>dV{ z38rg{2x=I)k0Psez(`{W_$>4UWt(nv7&bG?U!+N1UocsxLr6~DFd-kMX?VCcO}(p5 z_3dU;$=OQuWTgnbn(>Sn_EwN>{ac8FRwq+rQ^@cRJ27V`61bU8D$GOD!>CS%l7<+T zol(S|Ma~qV*2eNw*nU1$UA=^U*J69|6N_lgDINNeIkRc3rV~~5?5ewHL9B^ zM=$d0kcQ?vR9-s+=)$_X51W^ev!xkC@-)jOC>bPL>XXDMOq90lQlz7Qq-lYj02Pk= zLw?_XL4NUYNt8=EsVr9@U4QBsg{oW3i%c#P*L;zQVp-^gEeA^K-Pih5^A(diLB_8ek}?D`!=3ilNEGZK8ixpI|8~ zl7H8YaNoudx&3)0;MaeokiUm?TYMxQ+y4@&Pcvv;gcvqL<^q>Silye5O!XHseRIdsV~O&X?RMt_c8 zA+rJnnW6SZ^Uk{C=;u8I7ABiPds!jq1M6+7WoK3k=7Nc@1(aIJ!g<{@X!7GPj@80D zj74EHlefE}Aty$?Az*BXo9LI$A(M51{eFT>!e?zeGFEHeP z2G48DVOew{96q=eRK?AJuR|23MIWQF{9N>Fs1l`Ay++&8d7y8HEFAY;1{WXi1mTec zP$@VK-|C7$eBC*?%+7tZLkKY0H(BoTO51$$zodtB|Mm~ zh-2y%aPJFQoOnkX|49+U>&^&b^Ot-$IBXgu1Eyf$$s|;`@!$>WQxJ!yV8a9tZeVji zh0@Y^*h7(J<|$!SM+I!7DTn8dO5yR_5?DD)5?dUV!TAG{xVcgiTM9^Ho@X*x$3+$+ zPf2{eMj9)J%Hx`^${2~w!FAaG&VDm#=AaA;XYGYeDJt5etb*@Cq9tE>2l)u_-|pnyg-#RYLZxNYhm$j42AlkX33-8uo{cRz#8*cfb(7=~H%gRbOv2v_(5@;3*e>CPMQ^ZfvRrh{Od{u1)ezk)99H?Z7l0CooTLS_FW zP+Q#xg=XC#G~+g$)o6vcgRN|jpcQT{Wqphi%^R}Jw%6Ei_^ zK@xntX9|&j^q}5*K8zopMn)g2kdiu&WK+ z@Gd#dFY6Ibz@=mLC98+I7Ax%;W%*L(e&7YBODv7)yt{)jS!BS3=6&FfoPi z__eQLiPl;3^By$~O%;w772CgZK1^;!^7ttF-gt*oIW*C5bY3%eWAr@6IVPEr-_pU% zEs`WROcxV-k!9qWts_ATSCCzi`XsSjoivb{BunNpvu!EslfGKXq^uAly&aCkD9wX( z`RyS+C-S*HhG9^?E(TIx9|ygFYFHa~2fD29f?dxgkPdcXJMen2dg(F{@)n1+DGc%$ zxr0(7`cO^R9C%h>4KnNu&!%V#WW9=pi))X;_~#?gCg}z_Eo)#~?*^!KS_%8F$U)nd zX4H2-4vCm9M!D;F5WdC7i5;tGSQw{*`0rdp%Ut-Oe1RZ5*((XEylU*e!5n^_@@4&J zvw>gWBT|$dM*J4(Xsx3(nppgR6Lo~cy__V(X&sb6idPLSY@gS&Yk0e#Wz%m$B6pWlC!nF-7BsOxAG~X5f<>v)tL433#)a3C)ycUif=+r!IML z*XAu`ep%Qvx_7FXCo+M|m(xGEDdL;K$d(^N)(8wWjzb>HSp7D}j}6!Vg2BCAU_4#` z?@ts$wKo@LNf*ODCLQ|k6+mTaE!0$YL0{4UsQcZAtb*rkuIxA5Xyn1CJv!*_zFJ@2OwPfEDy zaoBKy%`djZfRo!1NZt?*iXS53&#rigJ{bqWU!y=WFA{>5Im2@=6)0w(G5vq*kZhwp zx?^LH(zW4MF z7qtVW#rr`{dN*uh`~1(?=S}Cp8pups2+ez~AtTBL+;*$M3#-MDdtfe%F6M)x(m61E zQx!B@CBSD~8`7{5yKk8fNxBALI)5Ro_^J=*%jU89gCX?(-3g=`l7=p8_#!dqb%>0`8#F~yHWO(lB0bh5mg-!KQ@IZGL+$>xMUc1*rkDU=P-I|cIb}?KHGKR;k zmSE_;0)p`(I3QvGQL_=KrRYMxpdHx$UIc%f1YvZY1e9HQhnnx)Kn=@zp)9Z$$-g^_ zRhcPC-03AvQ!8TZV`i!?JOJGVF(4TmVgDz)PQ?Y9xAI0AVO>r{54tx<23*u zDs12ZcQdG4c)^>0Zs6^<64W;6fROE9bUvs6l`BkgcJFE7bZ<~V^vP26%wR2IWHr!= z1$`U?&l1k#ZQ7iB8J*@8_T>#xA|-4i;$cJn2exbWjLqj-vdj@RMc% zbv^^L&LzW5o@j7q8S9V!e|CL21snwnVP|Ou5Q%hncOf6f-=~9IUk=<*JOxI+1+a+i zyTw1x1~;KBkT6LD(FlJKa@S*>h`dlNA`FXy=0Tj63F}GIg2Cm|ps=?O?P@DVIpb$h zefUG9$&8~jJe^4LQYMn^_eQf`a$tNQ9nP*wfsvd-X#G_H;X#Mst#c@hI!8mup-oVl z5y19(Ho?;X1t^)X3-c$9;7__7?EGK^WnBRKH_n6eDcW$QNdc7AmV# z&PMz1OQZh91}INJ1a%kv=45WrLUVb~a@H>Ew_r(2=!LBqij^tlM7FwcHoY;hs9JZG zYridmsjaGEl=LT<>S}qSF871!_kF}vPW3WAzuz(Ka^IQh`!AU#qjk)*??WbM#{*_N zZ#H9|Qpq%Z7+^wTq8MTATgb;1f%oVp=nhMQO>AFz?12xs8~Q=Als$a8W&}|q+u`p< z512xZV3iUHfeI-QZW0f|uXCU%7q29j>8)1B#0a-c}AD zFR?lB-b3&`$O(F#*TIwuJAYx>l{Go1pj_)LeEpIG1x2j0ap^h8o<7CC?i7fd6u_&A zM4&sfp-HwIa_sr=8Y5x+`iLU#QBuIJ?|5+H7GAvR8V?q89|hMF-{Ir0aTxdS1Fho& z;NABO2247kbLL}6w!R0h?5JtW`W7%(y#;*+jd1(fJ-DXO22E2em$OdSA zp6~#N0!uItHHKM-)!6Gn5t1&8Lf)sJ$VYnuc~lOgyuY`R&%smNpH4nV^i-X2TUdY~3 zgbwh>vuN`s^h&N9WsK%z+IlOulI-Gk=>jqabX+Xn!$b3et_Z z8>~K}xq_CEEqM?MALhU|=i`v(76*47BcOBI6WUGfS+A-WINv(}S6lY6-Pj=5|6d@4 zg?qwfg&hzjxD7f?eL!$oI^>F-hqX&Dv3bNY7~56`HX~=@*W(=cB9#N;!jVuL;RSat z?gLdBKWNHyV?Ag-uy`@s>E~YoZ}|}fge-=zFY7>MaX29D061Oh2sflWVWRsatTXQh z<&+UPqRWR}*wh1hH4{68&crh=^WpbCV=#4-eb1A=0P%YP{x+{blU+X)pL+_#{Taxa z4#D!OF=)4X2g5J`5{c~B;{HO%eleV|S`2?x7sj&v!w|9iJ~Yg`21(v|5c)C|672F} zAIgSH(mCLDKLesa?gi5lKd3(y1ufO_P~MRMv5|WrD|pW z2o62Ui?1e+L45W*cuw!J9oJjn-Fg%97neiH_G0$4a1N5$&q^iBxYgDzfPNO_IPoMC z(7G~~`CATM%UB2DU?wz89A@2*0Wkf`6@E+1huvp*p;PT2x<0!TS;7-E*!LNg&+S7& zUEOG^?Isdn-G2YvGf-$iA2K~ThCr_kz2D-(zFr5FkLt1w{S;6#EX)_(4-YE*VMrwa zsz&!gif#aC7R14@OE|c1SqD93ir{*u4c(MnfnY=yt?!mVX|ZoPp*I$yNXzvoJLDTj z?SrL7LB~AqV%ds@RSQ0GLN*E^(NZClI zf+(A*dth<~=87DLcU!WcPb2{r-C*6iDY1~z697({$slt#oAm`|fPh9OjI*<`@hhwc zO1lhvli0qt5z9>coeJAf90Y9+fsVsYaQUby=pRypm3$gtIgj=6naqY5$_p#LiGrrh z6w*cyS%xeRm`AeS;t)QVKU9TKXg9j|b2WHQr^3Ofr7VZyHoW!kfU?w^a6IG|curn{ zX!btVd>&ZdEfSj3*F(=_Gn<*@>)w#G`kw`Osjt5ONTT zM;%8hkd;{ik_~f2foo0C)Q@lI*V!FlbU6W%`_Dqt;~TKBnS#1&J*3xg!Qsm}uoXQC zHQU)P>%uG$ax8!gXHSCoyF;Lt6b7o=#~`aT2GkT1fw_MUKCZq9g$m_hX4(w=nUGSG1>rxE;OOoQc)BP9 z#vOCPBmV@bN#}tH4+E+tZ@^;h4{(|-if<5>2mO0Co?vIS8(A*CtTUTi>6gN#Y$na( z7rU<*=EVn$1#tPje;|@G1(i`e*wl9lB){6x$csFNY&yMX*;qFD_v_ zxZZcZLgJ1=D4*zq%DQ&wXZO&_EC=k7+%4FbbPLuhHNw%AHJ~L(;6X|&To$|w2QGC& z_5Fv?`R@fNKjXuOJTkc9pfaBSPYeI`)yEnV2DtKq5&rc|8xOo!#V2IcF^{bZw*D-M zyQkUnkFS#0I*%!Bux;KjC8Kft|o3XaYZ!5V%u@wF?wIM87X z!2BJUMD)RX)lT>l+XMxFYavst0Zyn~f>w`m@ceNRP+=e!rLR-0h%kSTsY@CxX`W^g+B27LU4@N<(P zwlCKNeLI`r?wfb;YukJ1@uyJfc?o8GyAS(qzp*^W3Gkch2Yw!wCw_1mLI^)@w*CyV z7ds*O=Y8-Nd;rNdjnL)E@=s2(`BpD3l!@MgeChk3a_c^f{pbhr&_D30fDZ?i{DV^| zd^k{21fLrh!)jbn%&=!WuVEGrv7CojZkvbgYUkn=Gd1v#gC<_%JP*(3RmA~Y<#D{1 zEY|uV%JQYBq4@0t2*kew)sW|~OY{-wjI@ETKo zly&z)vk1$5lO-@?8-?>;H=*P~D=2YWV1*IO?FqjO?ur#Kp>YWoR+O-N(+c=q&3fY< zu0iUvt1zNQ;6P0)h%bH!&y%~LI;{id4s=1C_ha~b_c3f1?uDEsFCgvwAhfYui!rGY z@bVah;bmRmeY%;w?n=PYCJ(ms=YpSh8ub2&1$Vj!-rn8{8v=qsUM`OP`6F;fU?1D( z-3=zqc3>KB3Zr{CFnxIuTS%b*<~2+_1K?EOdI)-N z4c#XkAUoFuiW8kcsUZlwE=Gf-Y%nYi-U>ZucEN|GA;7P71f-J_!2eTX8i|pwbkI*bR8Z~HGw4m zeRzo5L2~v0Oue0kP#TP=dkw1rq_7CWouD&lepd0cmM7QU6CiG?(@akZch zK3ryq!z&hHMb=^rExQbGueC8YDK^A$m8N)xHp@@Ornp+t6kp$Oi6i$|;=N_2_=%b^ zR&QE_|1_FmtNvv;?KB5JPhE@`f40UVQ#Ls7mpN|zV}|!H;o#pwM!3#e7tgz9f~75& z;7$iU{7c;ci|QC+?XHD*SGo}{?>5E*`DS=Z-WJF0HNyipj4o#&=4dD4E@&*byXB{?o@(*;6-?-z%oqi zS%%5neAwfA0wx;SVt8Tz$V(joCdvzT#puF%dlj}rAq#un@WNdlb2#wU1q#QkfvmTN zY%8`uE-eRFr$u2*NEU2|ob0=1>49BnAP_kU1#&c$lmM+bvk;$uT4FspG(uEC4E^7oO z=l`JNZ#kT(u7#o%1b8nt!p#FsP+fBqQbZnrP{Bi((b5IFQqSN9eGi)}hQS%Xf#{+k zkiI$uIlcpM-em}Sr+%<(fnTi4@dvwpVrQ^jJlJ^|56-+i1MgzbhbLal#7eAdM!0nb zR*e_LTXxUDnJlM9e}NEwrpk-2?-Iay0#f)#ohW`)D}Xm0nTd4`#IV_BUaZRYaB{y$ z;GZicaK%v(9CcC{|6C}H=kN(&vxPIT)&)U)K1T$%REgmYvjy>p{xqm%yayicS9nuD z1eOJZ(ChsYwk?_fd*Ld`8~q2tdsv@PfE7BqYz2{StmS^z<3fFqDBkTX46a|Jh-3de za>mRTb{}W=IQunjGh7rd3ST^UDoC-v`X_Nc9+2p&vFR{PU z%}i$-k@w~4Y=7049Gt5_u*gZ~!O7XAD>j~#g@=*6_8G*!OOSXS+(Ld?`;lY;brK>X zNQ~VK$l>gR#OLcV@@2${e0`%sF7BC0ETWZ&Q(P>Gyq!;k{-lsSz1s;6PbYC26+}F* zm}GxXA`eg@iL!Ae+wK{VJ%2uvwBz@P@W2-Gq}Y!LY)d72`>v2phJ=*rv2I|SmBh7| zOYD7~l8ht8#NlQxk(p-sv#HHw_)`^m8heFA`zo0EuMTO@gVo0nuJ)-cSAKoY=2 z6M+n4^491-=IX9Nra{A%%sj=Y> zNjwWR$tT8>cq!c=r_~5~Hk3>F$FqsKLJm<@NhY&q2a$H`7$OM%#$#Af8jF(~(om-D6qaxac$`ncK93BP{(BZZ z>k@FUj*y@I5{V7A2e7T-Fn;I^!e+Kp<<@pIe6#}>CT$V&q^mJF zLfG9aFT?DN<@oQU26ngT;?rbR{HHz`3r_#xXM6kd_AR!&y`f);pI4=5x4bi#HTxb{ zmNW#UtwzE4pCjRGuLG#4&WDUs5umXt7VL!?-<=&(Kq_Lqz;rQ&U;S3FvsV&Q``&Wn z=NZD0Kx_DP!Wfo?s0(ZnL#SPC2<DLLNkZ;$eNoV=$i73ffD$A^hcAShMR1#3|H6qA+_? zJ)Qxmy$fue)WP)nEY5yys{PN0!Q!?Ly8Pb@F?`tE7J=9IhJTuk z^r|G-zA8D^*k;HYHkq(a0Bx~$JF5tjKkTwx!=ZkoF{P8*jJ01s*{ELu!I}6UwbpeUw-CX2Pu~_TN zH9nwoBraUK3O{xwV%6k}xL!R2o228gEN3_B^+n+lmv9UkG7sAa#&g%C9zoQ-N3dz* zNsuiU&X2}5z%M9-jGd$5d7guK;s*tcJS0NHWA=Ev=rDdA{u-SRzr;m;aTvj@Q0BHS zwx0ONI|dCDPk*2WV}p*v%(Mfr$VMA_f|P}G;20=B_<>Wk|7HJJK?w(~+l5(*hp~Op zZtOdej!E6OaV~!wJGUj`k`y20F3rFlTZ6Fe@L(*_F97d6TQ+OLaF$+F1C{f?K+M#^ zY<7MRToBIS2}O6grPrePFTV=-KdrO)hwDwS{Z2AYjah|Y^UYKcvDM zrr&_PKsE3lAI7JwzsuX-Qxbn4MSRqM`*8E;_1NaF!uy*wbF5DqK0BCz;o42YGwlgH z^U-85ONLENDux{cFT>UY7lirUA}Go|!D;YW{F_lT@on2))Jr>nFJEWiI>{2$kWIrw zjx*8i+XT#NnSUVEo`_5b{Qpb-?bSuW?h4>2r2kl(!$5> zJb*5XH({N=Ircy@j&u2h7YrZZc{c|Pus_T{^}Eam9ooy!oxX^Zm?wA-x4nn#u_<7( zy_Ks}8w3l=l_74I8rS!>XI*b(_fPA3!UQN&^TPIxCWEg zr=m?$8Riz;@9qApb<6O$BUNwHOKG-aX=VKD|N1h(0tlZox$!g3DQEEZGYgzTOcW zP1_L$IH=N7En^DGT1XA=BWUfsEi`-CDtZ;Lj)Fs0k$mMW!r&=Xm+nR$+s){~ z*93fUBqa|)s&>ciMiJmlO zgEj>O7?I7U$uuKs2q}fe;+=T``0CPbtndLouWLPAySag@P>8T>_#0LXtcO3>oB#zfSVu}xjE8-IOSX`GPMHy?gsP>K` z_52$_XQ!D`!e?V*v*c)PXCL0llA@3o!)dqRXn!1}$4&`*^NsRj;jzFo?24bt=2_>1 z&g!m``4)FY@iT3>>Lvg9i8mY2>@W%T0Fsd)$%%nhewj;hCZB@tpM(yhB6a@f4kCmGkmZWv1EY*?=~qFrYyU|Ei7?`T){U# z%3TF>jB4@x#WuX}QX=p+o?~Xj5SnwjAGf`W#xv@&_%qrXbDb~qNoJ~`w{0M^a=r?b zJ`R>cGHj_yh8xRVcxcJPYYT6o-@%u7TKK)i_Bc{=q6>Xv#(ARod{)X76@#*Fs|G0C>H>kgpTcZeCs|&c_nhJP$KPS-CSOwKKwDI?p zcZv5}>Oo1OGc0wHg08e)PJi?qPCxcFUzW57*RQL=W5I){|F1r|?{lK(yQfn~5|I8E zKjKb}AT7yH;>!Yi>B6RAxSB75ka9^jODPTHlg`5%AxBldY(JPe8bRSzYkuA1ap<>Z zHNIH$5TBSTQoyhQ6ej#HH~6hYZx#%sx>a}4WXD zEI4X=jdKb%;=Jx<@P6Y%@XX<44E*m4UOJ;ru49JLYbOJW`!SPLH16Vv?<(BmAX$8C zGEL+uWWeHgHo}v8xgh1x3*|2b-h@pls2A=AO{X;By=cmZ-fiSJpSg-YW`FV1sn6&w zoFi`TktG(^g-iccVq@BMl$QO*8y5c&mF{mU345vqQ8PBd^u*^}?XYZ7@q#3A&mM0a zWqTP_?)^a3vjQXT-xMG~Wd*L!v$k~#!5zuj?$rNy7DV1*bp+_C|^uYzl)N2&^SxC`On?Lxb^)8n2NAcsl z-8kTwKPvTGV0FM6tT}TO!_JrC?~}dw=ddPCcp#$CUmRsWnN5MxdNejY2OSeTaAQR| zs_q)VudO`KAAL6te_k}@OjT96tfg-Jf#{RP7Ju*a3XlA-&0sZ#>J;Psn{6mH^A-NS zHju3KwdoWLA)TaQ6n0UbKJxeRK(8_K4v+W{r7`F<=dajy1&Z^(MWU}&5-Jaf7v?D+ z(7;52`bTTgjD^$b%j{*;J9sTcy^Enu4esP$twx)`cdEON@{#xL|0~uH=^$`CUG~j#Vkt7#wMf*Mhl^j`2`#1X2kC{Mq;7Bn&lc*+O z1Wo_0Oy(n{XnIs7uD*BtbUErZhfdUNS}7rarAZj9IDwokLE~j zqa&89=+j#*N{i8;PgjL*_oHk0HX#Vb_Q!B{jgK(b8H%3a>bR{&5x0geLaV(=IBxP8 z%nNV92{NiApFETttw)jR9cwBdYe@T@v?E0bpYa=*Xveb`m6&cYf$0}^otH+_j#1k)Bj2-)!B%XL)HNOHahMjt8hS{|@dO*MMyW z18IDsELC+$(3PJ}2or8&Kb*$W&5P0Wunu1Ns*Yw3{rqFOc3$~}8Me*afIGJeGcIBF zBU{mgH6MTAmAQlH$N_x{+NDLo1`n{H>>T#|NyOh1CGg?<2Vz}cbv`|4XOa02J1*s1 z1{W#h8f%?ziqs<4^M9^1@i%h=(eFYohKwme35#-!sdCJld z_U;I>jC_WMRvBnkk&L#)aQ)$>{F}uaMI&YNxYixj+{)669RB^vsSf(V4LOp@jR_jS zrL0rqr_8P5+p{!LW^u6K(M`sgVfM zspC=`OFSd=9!o-(Vc-ydv~IP>2Q4ai<*_i!oRZ1k!E2)F(>+C@&VAxHVrzcs)aDZH z1|>db>OB5T^JDSUD?_>5gzH?WXuW+%*QJst7Sp-y0z+rsvm{a0sPiJ&8OQyzmr z0vA}=^VQr2&(%ecrz_-t1(teL{$t=*mcdQI3G&M9983^;`zivTTw>Hwko4XSMRSWl z%DEDT;1x(YauvY(16U=uKvvlc$lO{B6`fDu^zx4o=kyWY-spzKL!_CEqYTSWmSA)L z>jC4CAMnBJA7~8{?#{y8>!I%`Hh+wn;MSeMjy^JHPiw5%Zr4eyCexKYjGDpr`8%=s zEtAzMPxHSBS5AZspL z%rcu+FlmiIw%A||i`>19Js%mt+)i#|GFq#dQo<^xFlQ;tT)vojRLo`9Kf1F`muIr> zLLZj8btd!3o6H*b3l6Zu96RGSo!P~T*y`E9WS-kF)AeImMYIu9{3XNmWMrA_J{jiv zN|{yNP-8EBhco#eHMYS^n}se^VRp+jS-p)GQ)*XdQ|gDYf)Dac7-`Df8Okt2ETc>Kv+TBJor6w&_)}qdYU@q&JDbFhW zhp_BKJ=SqmpAGfVW^c}@v*$uqU-GmTyZAuhwFr#C2Lamb=1U!RKXC+e9k0WZ=Zt1M zUzxBmq{j+I=(9QdMzS?h25iht9p)#n4)WC0*yH;K?3nO1bXJ!w2pK8t+{UmI4=h%Cb+6VY08x*pwDsHua=|;J6>dYQ~!}nNvorZNUg; zQLN1tFIQ)i7YqKXYzN&ubqE@ zzdf;u?-@A))24c3TImYB%`d@IWvj6_eLZeDxe&cP$K$j}TTB)&5WIoMuw60@Yj>W( zj?LF`V&XGYQ22#UUUgz`R3|2dN|8&50&y*J#GUz#%4L7>>yIBuf8Jojv{(4E@;$2P zwBbUJk0`TRj`B-1NX|!%w6`iy(KHz<5&TN3f7Qu(&k%ayqC&7uU0?!_pkecjXhha1 za+@cjh(>49S;I&{I0qWvnLtJgmSiPwPj&tqvky`e-(`w(zbTrGIE*y3y7hfk@!rRf3C?{%Z9Z%)S z#`JW(9%c1vlS!-@#daH$=R9-zy-k<4=;>1UbakpcAx-IHzT@&cZ}F^fw=ng&hi!LC zFuFP$_dQI(Z}w5B)V2qG;v;e5{Sb6g-i$d{9Z=(gI+mSk;m1YZ=Sv4~6?QQX#b*b+ z7pGS%@JVBv#A?|!q8yCj_Ag7}R=*igLaDCe6g6E=UnP^1U0lK)8fU{T+53+(u#yD> zAw#WI=L1d6&ceM1;9=-^2z2IJ6OR8mEJP z?;4>8x)r?c{0Ho<(0z@(0H!vlAWiTKcr+XYCE1lQ`{Pik{FTJ*e|elcG~Ah6xS&A% z#&Z{+Ip_s%J!Z$DL!7Y90q5VGj#-jx1P(?Be%%_4 z&yQ@uOCdqnId2|v+x+n9f(63+-Uajfbn&^tU~KjqhI;)H_|r`rBjQG2%29nB?!KLm zsgV{LZXCzu#NFi-r0#J(>pybR7gutdwiR=`VGeixrw@1Si9NTc^Mok(xC|GuW0%;a zbQ4#&;}qxo_z`Dj)W^k*)dH1Y=CEnDDJbMjhbyULA?o&Efp_zrt6MDxb4@HEZ0cgj zuAc|1gO@?Yw$0FSdmiLFgn`?Jo$&eg9!RN;1o>zC!Rqq~Xi_~6Kk|;j=kf7yMXC^5 z&sM=m@EYy~zJac=7GZYv2;?SQ5%$W06R9{C_HQVM0`4_zaccwRU0niucOYB2 zUz**SEX#U6OEAS3a?I+MBD=gx=xEm~vQcqzEUHU^?LRz_ncB;;0`I}>(W^o1uCOy+ z)jXKh3jL_$XnFRxRGA%%Rbq>SB-!TC((Fd2JR2K7jGf*+i>>wxe`-PQDWmP1m5imDOR@V4-}n#3%QZaVD8ZgLFqzgtEwMl ze0t!L(_eW0>pNIoZvsB$C4l4)@K$eyRp&lJLCkwtk}o)EX0}86wnm6(7F?b-&%i6@ z6||*2gI5t6T6s2F=yiRvQDuLNby?YR zJ@(*+A#;;5X9sQ?v!bb^Si?OnmNZVEo$(ySR-PHdwl*6wyQTWfRIJTRxsiu(S1Hh;84HwiQ4gO2?A!daRsQ68WhtggU;T;7l&rN~YMYhm#&jE}|Jiswi$nw87 z2GxlcFxlG+V8%>Hed!Mk@rmGTln$B;(qQVYOsGkyfJ;fz8ygcl}(l=6AV?>r7in___s{{yMVGokrRA}Bq$ z0Lh^@!RT)uRF+?dQ!|R;&e%*CQ*;!De%cLv3nC$2F%l%wf}m>RWH|Ip$Tga;hW1-q z;Q6ry5YKjkv7_*JuxbU|)}IS5!4{D5VuHYS90^l31-FKdGTh(!jWZos#d$~E<6Mq9 zbKhpf2!4k{oW$6ZT&&+rPFiLNXKi4|<+=6Rm0XbGZfYJ9_lWbwHR6H1q3;Xv*B>+a z3w^Turm>YJ6Nk;^i#y)fMSZv_`VbMuy-4Fk-$G+-r-}F4$%Xfe99Efey*@*^2{vI| z)VoA(yGE|aD&Afs_|>_x${pOR;_IRbXHl$|m?R3CLE>uNS0$H98^z@=k42+Rp9(#C zFV6qSJT6>MnhSpUnX5V;z$v+Bh+=GtMc1|$iX{J=#Ffvk=d6cHi9QYO5Pg$yS=o?p8`QgoZ&C31H-$On9N;+*vd@TH#{`8#vB@nL%x@#lvZ zaS{91h-dU1;6|MH5Ix*GmXjW9#<|Qi90EN!orp|V**CZnVX zb5_2!oE!BNC;YsCS6}le zsTqaq76zckrzG616pE3dAsDiEGbX;>h3WSXqp8^{%yu7(eytX`<;isP`(uP%)n9qJ z>mB^PAD8%~kZeBbNxFE3`9tvtn=yDWiW5g?I*I=l+lV)G>2h^rdqm|+_HdOmc5=mm z>qS#};8Js6bE>1)h^9ANb6-X*w-b%h;cRa;awa(^1YeOWH@u*j3y2s2qo3>+*+@n#aNZ&HuqfyG5X|WfI7bn+xq@T)_E-3wV0jL2=7jyi?Kb+i|R&JBgckW90Krkv0dO0)aLtD2Stb8>EI=;?^v=gpEju${j1VD#6y;ui`d?LB-Wx$p^7grBddB-m;>ccpDAgg*2F1Hmbk8$B1IQ{%z> z<1xtBSpat$rC`A4%bdy|IbOCh8r@kcI$h4hGLPT*u1kvQ=PJ{oxFkG!z!jd#IS4ct z2DcLgVxRJ8)+9Vb`rX*^vaq>Aj z|8T?bNr!QNvp;ujOdZ6IErDs;THx%G!A+l3z>StYB|f!C;B8FQr>d38)S==;w+nVt zVBmI|;xL0+<0sRe`Ob9Zy}Xm9@#&BT|{#&8H#wl1TG)7{8u#Ate>U`|dmbcmM`W_Nv)P*K}l zTpexCpOHVsNj``LyLYZ&xZ@nhj-BPIgdUaC*mKz6FF~EFtSB#*cMpb}ugjq{ zCJ<~rL%^ae66_Lep)?b@bBeBL*;jG=uUFsl8 z-&%m;aAj*J|+Iir;xfuMfo`$YbPEd63xA^vq z!5GO6!sg{An0Z-n&QEE?9M*{ui?zsN-FIB~A|02MSBjq;Oom!xOQ4hlh`+7C^kuHX zkpr3#Ssn;V|C9JsO;d01YP%S|yf7Fih(Z{FjLD)OgMPGTSxR-02+x;e>RH>MQFX>{Sz z6k1rd0A7>sKN|JLlD8fmdl#j^Lp35&VUhfW`{&q>YNBRoB!#(1d#Hrjb$${|U`b%ggsyZuQ+cp6DQNrACzCDoGr@*hqpsjJ{}Y&z?}@MW z$@51|h|}37aLVUsz-gm4v1+vqUq8@Xye?NAjo$D$<;h#@s{Dz@i{IsoY5wBx*lE2Ki)77ly5ex$wl{_Em0ivEU6aD!`Btc>n}X?^Ycb-|2V6Tu zmAXE=P;$yl3f?=N{sb%*@(t@qLfE}_sg`0*brN1o@y3c*UwPl&M6tw<$DF3}K)C;S z1ivom7T?(XoR1?D{I~WjUb26OCKpDKUxq0?Ef`5F(+p``s{yUfQ6X&aM~wm@xAQX| zgYWFY5Z_g}qgVx_W5v89m&bF?ANjUz3-Hjl6PWih7w0U0jg!|6rb7ZJ_`pd6+8%F6 zC)`aacSSi?Js*!(+hX|8--qnfS4wls+NN{c4oiUCnelMMEQiZl>{GJeN|nF5HuN<7vmwING-rC$`n2PJ_Ti^i4*;Rp+wZsZns zdvf8edd25YSd?VOEAqP|0h48N@I&}Be79PbcKZ&aBU|-phSyly_Ifgn9j8vhfeH6` zjm3%6*YHcP3>T;QwuzTWUbK%+xXQ&eS#TlMf5ht0%GV|Nqk-fh4CamruVE3+DQUwo z4FV@-+)xVe9ztDV-!L}43P&s7z^skJ|D%70a4$C(x2gW+*Iq@zk*g8+sfUTj6b+T)n-dm67b6kw3z6SS}Tj!Hj!ah-2J2DuKT zx2p%yoOhqGXkQX4+?|ZwugZCg>08A=j~);?tkWslKVn$P$4`^^r(I9^$1jKA_rd0< zU_1`%l&x@Ew7`D*xlfn_C1HwxI!-Q3#Z6mwoxV}{zkD9BX*PFlm!|j*(ZxNAv zSVx1nm+p(ZM|X=OHGYZ9L(9b0S=#*P-U9x@h~K=&Y&GP&_3(iANNn{UirpFoys={| zpRrgTyMOeGzh33J;^AK4WOM|+?972H=@*5*)=4<}Y9CbhFNB`89^m32IJdKe=l231 zn7(xm-26TU5)5y1F=OX*iCWp*^Un$pS>*=4agpHPcM0AmJb}#o8t8ve3sqgOz?Q3p zp82mJ`o$9npD%_B=6Ud9dM*@fJ0bX!QsDf91dzQP0b4WzU>Y5Tz=2nUnaKedX0Z>h zEGU9?M_S>Xtt2z5RAI)Cwb+bZ+HBs|p)BxdKN!dU2I7{C0cPTNO=--l9|MYzj9($ zj?>sH!4vg#{&Z&8?!*T8h}g~%f=Z zf4iG~zymC*cptkka~C_mJd{Ou2eX3}8<}&;W~P5-8`InwAu#KOkMWzB@zp?>|x+r9-%^~xNkP&%8HA9Z7)YEG0zMw*8|oM zUI-C~X2Od3o={u10&Hy~;lt$35OCiG#@4Ar?pa|rmF5RgfpZ`=L&(CvDCcI(`N5r) zQiI{1MsQ@PBebrc2_Le9fSUF}YjCQ^!P%Af5pw?gfeP=hf>WdcR`+&7_u_U4&8r4=pIT`5_ye^jvP`l? zj&Y&#%sqP;lc*laUhgqv@4}6l>1#{ox@aQv7dl$rRpx9^hXvbYYR2>u^x4m@5iBTa z82ezX!0xV;VW&sRvw|{NmRQyUV>@ZDkKZPFY%jwrZ=UI->M>q-hw#7p_e;$$*uEX;!1(3cp8$JmRpOx-K zknr{fr20Jov~C1_(=V{!y+OFU6WES94@v5&V0?84%=_aCcU+A?F<~Se->3%`%cNmR zObvJN&n51c`d)6`u+`jD&)eMOLb@E~m%a-`}0enK<9$a+kVrV=RhF?$sXPEd^d6g%H;yLtgiNi4GLs(^#hp{{BFmGlDE}8TR9~wPFiLHfrUSa=#w^wgw~(PV`GBMMeZ-2nPjJBP5_B;TZ$^{vvh zE$KHlhQGi_ivqOs{}11;GseBEWYB7@5c}^sg51m}m=!*dR%hyvyN@}|FtQ}aK_(Pw zq(-@0C8%c5cl0$GNXr8TQ@)Qfo%yX!^EYXdTw*UyyTGGcxD(zF?G`^hIE?cwRp1YO zcEvk(H}FoN0^KM!CbNrU$j@OoE^g=KaQxOt=x_UFvQ^L?|>>-QE62{|b2E^|?-{tw>WH`waiBQp+_*IqXZ4!y+H3f?YQ2j32ScHGo8cT5^(xi`^^E-mhh2NneDGT-uY8Ulq9mmSW8g%Ws z70K9-5Hi=V(6l)mr~0U4!|17a)$K6m@6X4urMY6emL=R1E~26q0X)>j9#6K{NHNa z_i-?7`8JlSa&4&cSSxa}RebY{Sh%=Df+^?r!9Jsju(C#&ucjMQ(}5M#s=S;mcTAw@ z5gm9)?F{yrAHj)(?&6DsLPpKK9s3*0@$B$myybtAPrW{wPjcwvlf(C-R@`+|xBeh> zy}sg_uTL=dcLiQkeyK!xwJpKGng$h>+ZkI8H79*3;R{0`cI9ZQYb4JkVI$L@r zu(rEqxKU=pO^mpb!2N#n8O}@i(w1>|RvBWh?vvI&n396MeApB@cUjO|; zJI7z5)&m{To;Q9pe0B5I8^qG*rv=&@D`lfI7U*G4As zZI=Z$H>zSsmL0#}`XLuNk%QseR3WmVQ~cXrgkSd`!`W#SsPIJSr>I5Xx}BytM@JR6 z>{rJa`6alB_F~qv5L{gEh7+vk;hBfKa6sN;9AKnGSL`h)<)}6Nj+sUiRt=*{PfLD) zQ4LH~oX))U7cj@DztHG63C&h;G&lDc#ipO2iiUNxF-?Ko|fb&Kj&}{D}*h7FnqabCsi8>5WGudDn!|N3f!+Zw~Vh6S`pcC^u%o zrm#lJggt2unA5peVEbOD7psd%4tG<0hz#vNJp&_dNAqDTg82Jug?sa_Z8+uTcAxai>->>O`qi?O_K>=(D9Vfi3)^HW~MYR*SsXn+S6eUv6fE8@_jtpePkfAuDJ` zEBaI@+_DB2l%2=Zv(1A#@v7wF;v*?e#A8jl5puu3I?C&+%tTd=ztQv0}fk zCGwWW3#lOGJW0wHQrz8WT3B6=bx)+Y=Fqv&+r0piHCsgc9AEJb3FZ86gCo4G(KvLI z5_)I8e{ubD!Skarnr7Elqipd!zSd(7Xq`!eh7Ss$KgJIIpLOE8t!h*^P==PQD#TZA zUiin}6-|F8U~@=4ej27k`R_(i3STXvw=695($^TWI=)6FK)N&5$ybJL?v^5X!U7lD!Va+obvOq`0jDc zYPyCmzDiIan$UhV;l?t-n*x+QDP*rDeIKe-qN-uTC@z-CMDJv?%gW&1>rqrNvw$jF z?oz(*Ng|z~}P8Y;Mnc(1$H>rD8U(ld%vt)N5mG(g<8BeF2rEf1&ecVQ$;_ z9v3#%@$xyl0M8V|qi;!2b*P?u_0$@_&Llkgq73_{UdHAJdvTYJ4Qg%iN2|$4vC45P zN?(dZDf@JESaA=}A8kV8p~H!ONua*-Jl5gJGx5QPY}DR^EMt9>_`bqnO8%2aM_3FM zYVF4}%M2Ng-OIe1z1b>Z|810I28~nodDUx1oaETSFlE4PzU@&iW)33UbM^!toqI_n z6Y~%%r&=&&FH?5#d=+fW9VC{N6?o;zsua-Ei#6UmaZ&AA`yG=sLDe;r^LTQVzrF4( z8vOSYPyQ0-KZOd^rl3N8GP49{l@+_)aGqHyUuO|!LF{pV7ymUsgJ@_4xd)_D{PUYZdZiG-=Nq8&X_mMyF?$3eWUr{$l_&b6PqMe|ZG=__YXr*z^2~#Tpp3$PSH-mZ65tA^ctGi5q=waCpc8 z++X$(dv1P1?G-XKBIr4;YySf+moKpoN|nsBG=aU}X$t?udnjb`Z93~GIB5bOVUctb z+-cszq-RWHv8(bSrr{k|xK@GJ*tCGJxt>?zxN-*4fIn!Z^h)4(xASrhvq0kGKvuWj ziYZ>I1(#GQ?sS3&DoIvgX-O;QG#AnY0LBmR>^fFI@_g5PEn)yYWroe(v3;A_%{H7qnfv zxwnepqSVJq;^eK*d3(hpn96@Z44MGv9E&rx_YzDexRJc&>K=Y}3^0446`=(n^J zNleqBfUk-~x0-Ql#7Qs~$Ffa(FR>ZxBU!`(bIxR33MHJXqfY4yloupLdU|fKm6}lZiyWH%i-wa6l$dXWF5Byu4(sPX<2Mal zkBeL1^MRJbL?g8haP^8R;+yl0@r#W%E~Si>y4)aY=zL42i?33pq%Mi?Xu?5bOD1h<#Au_f z;EV4n);pldufE}m&r2`jU} z2O525+#8(&oHNUkYQ4QkaeX(&>V3D3e5(qhLsR*XhwmTQqHEt1hN*jtJto3hid8`)2Y`1)T1|&_h4o$?T$Zt{^&ETeyt07 z$A-YFMQcQ1*X)JPL@6Gt(55RNl&LQ*osSHB4U@gJSm197cI%NVYF$|M-jF^mDaBR)O@L4*NjCpUGe`;Z3(_O7%pMIENzPnUi99Y| z`UsnnD)H;N!Kl+X&@QJsnzNH_7yXWQ?x zj&L{BhYeI13Yoq@uI`e3%-Zl&)GS8F-Lm`CllW_L)mO>?! z3L#`@pwc|56d^<*B&lQyMW}?cpSKc zSSP+4>pMjjBLzJ1eB~Q_8NZ#$PDv$y&AyO=UFGC^=S1>JavJAhJ5Li$?CH*yP3X1p z597;w4dvEq#34hM#GYD4;^U1-|8g^^wManq#83F1y@wTc)s~`bd*Ir9N%C^{Cn#Ka z7ZRFJL!RnEIB+Qz-gA!FOJ{qSfqFfVl-voi=N7|*erd?fnQtj}rjFI$lEC(d3i7sS zHr~*pt!UTS?;%BQkh*kO})2hckj7V#1eb-1v2v8TR`MS{gq%Hr^BN{^vHp zq7+c<2!`cq4j{H8kvXwOgRgEU!Ia8fU}*kP-j-9ftk#nq$QDImz%@IpW<;>|{Q|sF z%AM6Kig9B33mpHC;|PC9BB@KtNSIs@3G$bK@y+w;u=63>@KA>?7--~N?G7l{`ITv~ zVPT5C40(~RMGEewgNMvY+|o3PA{~D*U%wI!9i{Q7_`x!Zo%_pcI!1YJMe z#(Q}1G)BLAfEJ5t@#6VcD1Yx2Uf!64ns;>ZB9q70;pWOn0Td+-+_?PX3)Jl##;eZ-Y4x&+)ODU5wHy+ljiX<2;8{Daxhp~E7-V2V+*{}t^CPeB zY$RiPPoQlm1z#sv(vvT2>AiLb8r*M3bzg|nlX<#WAn6P(6)#~$ekugT1~YAnpI99( z_tq{N!I?i4sj{*RHNDb-Z~Ma0HckjDO*+}Kif3%B=vlVtq#_!}$D(`VGkkww93AT< zsac>3H7(bp(q-n<=$jo)G+sn^efp2)z15`4qfF^(i4h#q)r8o0ibULO5((Jg0~M#v zVY!Df)s0(C2gLkoZ@wRm?bD@!2QK4`g>QIHavPy{%n%CQ2TO1HO~i`yix_%jA{Fy8 zr7^c{=-g;Mx@609bnQHVSF{}QMx_mIOIpF*8ME4pi0Ba z)Ye;%w){4y8_%oJ@&ZxX9Vbeq=S`wbQ#~L_xD&Mw8xr;;5AN!}W;ez^KwH@# zD0^9j9?H<7gKJ)+uz4yQBfb0{#cPw=`X{bY}xO~FW)58T|>fjjJy zImeMYYX59!lMYm|rM|grR!=3XD%8M^7^>q%tAqIF%xSd!o{68TD)3S1M>Ib(icyJ; z*x_1)f1ngMeXqtXx36Jy*jYyV`~(vJ+JO8BnM^M9C4j~eExsuXvOd2;@WaYsl-(#u zPX}J*SQk54&G1>Ud&MdcH5P;I)Fs!F*cYRk_M*s87P^>I{2h^tuRmSEzqPgaMB)$5 zoiTz3*2dz*hOg9%0e$NvpnSqbcHm7kPCCYUJ350gy0e{C-CD;l z+b~>iExLwT`s4?5Q&JP!w>2=S`t$fy&W#9U5Q z@A+Llulb4l*0B1|wb{=qdo3HEiSs9%OK1PFx7l3zXr9fA*G!6sD-$mf&N}5Nas2}| z6xJ$ajW$Oy=N-?(Pwh@9|0zJii{HY*luT$hKMZxsznB=E6yB4u_vOnq1Il%@W;1`6 zO2GV!+EDUy6BIaPgKX_ps9b#xF5ZcO<|`>sKAOO>|9rsW@qGBkn!s)m6VUy-0FH;K z0qpwBY~Z&uio5PG<7d;Dl1Lw>dg2|X+ieZB9kPRuJA;`tg9GgTJShwme9kWDSKw>a zt>EpdxyyW3J^%|R)WVPvmqi@=29Nk>IVhcZ8J4h#5IT|q$8;k>@~IDm>+OME#X*oA?h6}BjbX)vIwoXa24kN5 znF-nbm1*n#$oN$V!S0`~@a^GMxTJamnk<7MK5r@fR@Da6UO8|~HsZK~-XLUn3F>V= zfe+Ue_tv}*Uin;Z8QBiPlYT(V$x$#;YlWE8)gZjT24ap?fXS>h_-}g#@L8t_*q!RFMyZ%w?OJ+DJ-=tgT?LVAhjwA-mCh8)qPor?@|Yn!9ZHqOvpVq z$jo(UVjL}0LFA(y2oM#xcX1k1dwB!gog6Y7@D;UEoB(I{xh6Cu9(BP+iHTQha|8$642-Wi_2j$85LnqCN*~| zV=GX{`(rYfiOF2U2--PwKBmPu|8oRR5{}?FVbPe-nv74j=5Y6q7jfZ|P;@_h5^bWL zP`$XD)%y9EbzdZmdT;;35jR_W_-q0?36`=QvohJkMyc%55<}jMUT&_~RnO#F^Y|`@ z`22kep3KuUF_>Q4#V8q^W}4h5LWSx)NKsb@Hy+1~*O7tShn(PY2j^r|;2d`IEjizu z4OlE#2Fsl}2E$4e5Zz62c_qt1!{m6(VNp0_11= zDCj%XLCLRL$ZoC&=jR+}SsYc_$k#Q?NCom3HIp);U! zEDLJiWx}iU*>F?l608vkQ0KS7<&p{g}sB)3%y`0#W`gDbV1&= zGD!WH2}Q5gKy$Yjm@f)|ZFOg1zhE|`&dP`60q*&nkAMKj(2-8v1KQ0gurH+=k~UVu z>etDTINc6BO~;sDeq+pV@(}OiipgNQ#{)in-wYnJHbH5?Rya4q5;F4-gN3#{OwcT2 z*zM}D+Ruxbv~e=?v(S!R@vWRKzx0yrSbUNVE?>(;Tg(R0#V&AD-w|xNEE=v`LFQ!* z*fJ&t`wO=-S}!V@zQItQ2gzn~EdMb5q2HM!GX@yJW%5wp*1)SW*vq&czt7Z5&0*}n zT7giiJnZ!yX6l0H!_|xvu+2UVF5S2TXI3Rb#->Y9(|;P$Tf#u_L_8E7Nr27s!T}d$ z!gF#80z(1;E*1bQm<}1l~f}Q8%JUF^a-S3K^+(jm%#DFXgH;v1OwXk;B9jlT(2a8cGPw- z*jNRF`S}nYlnXDn-G+^>rLd6Wt6APHg*(+b(7dG#^roMIwsY|?y>CBQ=P!X7od8~u zGhmbNM$q@%3SZJv!Tp9A7&xwlffa7x!*Q*ZOlTyIF?aa$24yl zWRKbnvo_81u}jhg6CIKvK95~sCzm}du zqvlflG{*+}b3<^7`Bu!--j5AEJ8;vpSX3EkLGQRQ)KaR!Q;S0I`rl+UeU^)3?$1#6 z`YY_L8AQ7u-Dv*o8>)LwqI5?;KC%0Zw#^@Lu1+Hs_5MZM?k<#@`VTAa$x@?j9eCgS zDF!dTj%RZ-kke!0h{YJLO6$hrv9CCkEkGYF?ndR8GSuv5H+Fq*!eFH@IADDbKfAxe z=+WEg*HnWYA0Og9u0OXpy#Z^Q$5FIQl!h#vMq9s1)7Zk_c*V4?)K!e)$iqmsV+-$EmjuuX>ct{fQhSNFRY7vTxopu-?Vu4;+DeTu|39K;r z&h8kp#^pgj*bN_M;I<2jIBAbP>TeC@vP@$vR6CEtmv!;9tsY*fG{xDulBls@4l>_r z_`?A?Y-idd{`fg(et=#sGcJ6d5p12nlxuxvHa$7PgzS_DAMtZc`-9n#OyAW;5)|fu_U8D6u|tI7A_0trW8@(CVoM1CHsA4ie7g~lc z(N?5;m+RBxXSHdq_k8*%kf8_nF;ov3T4AV1-*{`$8CNvuSNWMV$xfaQ-TECeg^NLe%~5SG=b?juDal`02C&ojd<4s&TxqlFP5rt5lGtUFA3! ze+IFL>-9}=s6nUvyJ%_`hJL!9IQC{8y8gR>DPIA%>j$B*9G|V)Ws9Z{oUlsJMk1($H5mq^T!m&Rsc$`k8Gm@K8^J^ald7r|kH!`r- z;~bu~PsR<~(($KXEIw9<#M-;LXrgfv_1!LFg?utv+9lx!j&G+el!vaG_2?RZ2R+~2 z#eumcn6tGAm-H3my|N0FcD{+~3)-+euo|sI-eWPmMGLkRfqx%GEN?S_=Lu5#AIj8&>ux)oR-s=%YS83K zljue6%(aEv-*~!q2A4sI(4eat6o~?zxLAjt^wg$HR~ynZG5^u=K0~VEr%T^h=+n^W zhP0B)yQ+WiXjroy6_;E^`+OHs%bvCLt&{}~GGu7T90RKRz>wnpE^y`nMQ9dRik15=W_A>VB3;D%&P9eYSAy4LdNm% zrUvX;)Q`qxojB?;gmsr2aPY_%oN%fEV=Zeiu%;8+Q;RWmM;phxyN5f4N zprDi}>aJRha?1_S%*z%(A4|Y1a)`+TWr|M-0Pq@8Y zuZfuWXbNg2ePxq$qgbCWkJx}8_u2G+2JG0WM0W3(C0qTvi`6%~#cEtU%SJn$Vw=u< z=ZlU#;rI00@=Hfg@wdd+@TMIyQoj^@WH|TY4gt7*$_gy5+QQ5qVX*zyMz~eF2}YM2f$maE@Q<>G{W=L?k+K+? zL;b+j-VpFP)@gX$6c?bt(3xVFP2gify5Iea6 z)X$%W8OQDbHOhqTE8{^h>jLC-B|?=!4unkS++4Fc7hP;R1e|Gxo_n{zQ|LJ)8Q%oO z+X>JTdk*{$xpVA~ z1?Cici-0#t5~!OeS)m`Ei9&)c(x-Mn;cWHY1tmUJ?Avijs<8l>kz7rhvVO=2^bNb zh92jGF;pQG^NqAoCukjxf0M@qj>99e?I5dk#R$9XJ<&G*G)gX8i+{;+R1XQpb@mbH z^X(AUUGc)B^3j+}4x_`S1k5%*jJM9m;;YO>xcc#FG?H72f&*C?Ahs1NxxYEy?SgtC zQ_*u&7fqcmvq=-}&_eJKJ6tP?H4h{$4WAA2mL*Cu|Ma4nWiXv5IpZGJnTuks9*JOL z1158xkORykNng&Z@tC>gSi=-ed(PO(tYX~xN|39Z#;9gY1j*Y4OwrkYygJ=;Ou)=F z?D*^ZjB{CAxsCl!rXzkWvnSb-uX76dTb52>BR{?8n+I31iB}fzT-o2eOwmgAQOiB% zeW(<_Jm@H|!NrL^*SCPr#<%lsEt(S2}`DS66uqT6& zJMf(sEgK5z0q!uaxCbJxXMn@kXgD@80=(Z`hMt8FK)vMGO|}w*MSFvbqe@ zUKD~-KrOg@j)!W+BA6Q%4W(21pz?VJ*l?MA$9NX!e0u=evSaXM!$pu&e+E8BGr{o% z$Fof<0=*p{AYyM3H)Hxhx!7Zf>&*bs<}i3Ervwpw_rXK$HvG$thK#9CVPI+*L}%1P z$lzUQ`Wyl!HHV?;v=tl`-4Ddq7q%2$V@_|h1-G6*%#uwPxc8(C{_gC6QSMzTZVQHw zi>|`Ur{Qo)E)&L8bzxIT5Crm0gZQ!p@UamCv15^zz&T?7AW76JuwKyyJP^e#+>#v@TsIsGPNxm3WM*XLlMX+E@?8-hvpHn5bN1A845 zKvPGKWoke2ByUGEZCT3DF;>KUiFJXvvUphGFa=)PdcakCQ)rng4Xdlg8QQ^T)F-`U z0=_N-@tEzLqxLG~T)F@)qL(3@CrHw+OOUCL<;m&Ye?c@&j)Wc)CM`m;q;iug(bHBU z-Pgs4kB~6=uv&@C-Xl$%Cru-r@e-u{nmqaDB1zn0bcjzPLo|8+kvp+-$f&&vk*ocW zXquRik*$kJknda~B5FwLvuBc=x%%YydRwCO&z6*~Fd-tnlEmWuR5ItRDp}<(%Q;;d z;o^iUs6WvNr6W%uGwCr%mOOy#PG#UCcL%a%pF-aA5(u3b0QbNRj8a2jfs-AyEpUM) zUt&Pi`4*Jr-r=&T9N6C(4PRGZglf}gprzXg$2lH@7RiD&eL0|hryBm$J_a-KG6?c3 zfY(mpKr>Ik=f^qV&o72zsq0{5cLSEX6hYpkYVhOky3!Q6PIPqzl*&GXU$eTwD@B|% zZI&TpCh|ma@pSTCl`v5*HnLa;RY{nO>wqc8_b2{XT{y z$9fU@aKVkd74RiFvt5bb-&G{t!I=~ets$dX-bC-aKaq9aK}41ONLu;^vZ8J`sn{Ao z?A(0`RaiwfDz74Qb)87<;WcE1@N!Zuxr#{ntR>YlYsiN0?&M^S7n#mwv%*6T#7@eF zmDtV5>L>Z2Bx9Rc$jc3hQChlPdPC~;IM~;a2)(sO!0FazZeNdcvYwKL zFJHAlaWDx-q(p;x<7w{sFTujQm!P9J3~uL~ z1RcXvSbO{&=-Y?D`OYx#D@cLK{4Cfnn+cEBUxm221>n|{4YmA>VEr%!T+@;v!YB&5 zssll%@hDX9<9=^Y9PE8~0+wt0Li~I;NIqo`ZC4n0? zUm$-mud~OHX??MeF^OBiB+#4FEbUfLTl=0>v2!1BMm;@Q@`396g6~^Pa^6oMOUg}2%3Vt`RbGeK?j3`K zfD~A|od?VRXo66@D`fQ_2CID>yCvi>3~kT`)$!NN{OMv)t*{GPMAAS)zZTBVrZ6z$ z2^1{&3egHr;n$fPU|Ssr$!ENv{NhnYef`RE>!>KcO4&}{k6Vt+zSd97!IVEt)95bd z`p2dG^wXpKwBAR&aqB`RU*;hb?vucntXv7Z+e+YdO+RcB6(HY#k3iSoTu3RK4au=0 zOv28^th2xt*6&Fk-!hqHD&{ML{y_z()_KQN2`GX7Cq3x(@dmvO!SHiNFgS8|;$un` zP*I%@OWM{$nZguUdOn(&9jD9$PW{X4dfd!w5**^$Y<$fNXgz9~Jfy-Vx_#xl<34_? zi>uk!kIwL8Jsg;r+3T6?pg+7{U#IaR#Y`-x`MNWoZ;3*kkq5~3?E;f@N1!9R zkSHhsySe`V6@eDUyio{t&YK8hes`D)7HZ6;U!lB&Z~J+r<|~*oxgjPe#uS?SO+j}5 zWQe}~hN<}$!${?BX4I41wzSlqS*Du8GqRLsN3Ts}l|~wPAI|kMbG9!6lSA8}`}9Ug<7tEBNFkG2Z^wf^ zU$*pjC+ml_AJBIy}>9|=z!A>_ppUdqdbeCF6PL!E@sJ7GsbJyO4cP>3NLl6 zL}`UZxKmaS>9YUOk?YKOFREnk9gBkH%F~IKhy!umzLH2=a=E%HH?QCI$0Dn0wBK+G z+j0SqRsy5FY=jv+n9RJ7*5*aez02FM^)e%4Iu~d|1ji=|hK6WW==rvoY3R~mANeUD zqdXh$QcX;CpMdFFKiQY<<*ePJW$fHz6Uzi_Rx``D=P=?H3z<}#8ouY5EVgU80#3fM z25$w0;oYUDus9?U-@MDg-fNY(o6AEz*+39mKbe$Pnv?DmQ^*7TNU)yafIU-$XwBp) zH2K6gth}-h_2hSz*PZ#pyI=mZthL0OAM$31*Ztofrai2O$!?MX)p`4vo7*q5#~(Xk zOojy}d^ABZDP`OiZHY_Xhoi@#dlrN&Yotp4$`OR zrW(+k@((Dm@(w$vLkhBgszU$S0Y+;dG7&%SGR_kw!O|A)Y~aUvmKzutxaq=Jx2|Mo z8P%|Ga~u1z^cHX1vCB-A^$7ENlMraOih-g}A0ybH1h3ysg_WBNnalMT_}5>Tu?bcJ z*m*)7*KacC&ZBE^THID79S5;JhGWq)*2vx!f?xm1knOD=#ItKNseG(M8bzkT#%mAp z*j!zjsH98vhFefE_c$vSy9G}4#DLk=H6Thwpz>$|bMM?1=KGs8#`WX?ui;1?TiO_g z`r#go2O!TL?mX^NdJlVf$}*IlPF_{c}n556<~YV}r3JT!><)e~uyi40Y!mZE>RTtJs75vcp~4i>)p2gch@K>54FXxME{ z9nFqYjcxm>+oJzy%A^czQm*Ciy?2MVTQZIn++&VW_aZSaGzqtH`6X+48YjQ3#OtY_ zaI@P4>eTWQ$4)7td-O$1%cpzUs?I}Lu%;c;bXDk*vI!IvGSFMb0RQY3$FW3$tG^Xu z!>_Mc75WjqYgjyD6pF%L;#l`Z45vP~M*FB5M*YhaQqq5fh-{A}POt1qTh$!cCfAP< zMT_W@*ZTB;7Pl9DG6mFMYmiHCr;?PQ7ce+;1NiT{$~a~ArOCXF+}fJ2fDhO04JD&)b2OT6o+Wuiu?wa z-TjqaHg^j9O!G9)ZPhUU(iTya6Y|I9E=SO^d?PLp5=Z+7v5->CBL)+8kd4>uiBvC_ z5uMjS_Lc+BW^$Qu>nIo{`r!MJ^k|WEj8{nN~7%bYW53{aM2ifmhu)JY_ z(Yu++NRM1+xYaYp!nB`puCjtke@_VCHwU~Lelk+DpV^Qyh08SOLs_N~jQ)Mie14nB zt9)F+mkf*Hn+xq>2D&<#Q%A%=A-R$9JhYt|JJMCk$XLMnI7`xPkV^bE-5|==F{Cl* zGn{ywj*UV8(Rbyl^z2DntRAZaX09VqXLA|Gfvx`eqQiYZ0+NtWI_b*FwdZCp4tn!2Si95V5r%x*1{88`lO7GLaDL z^o!}PngETVyWro8bj}x<3HLt*!kyy^u;M{8C$Hji1jR*=nIJ+`MuN#o-!wA(JDC_4 zttE30dw|K4d`v(00|ytUqED6}oP4HAwElXL^dTEkVk1rbNdZ&~F9q`(3!&(gGYG2> zGZ_JwcuQ}USrWOayvSL*;hyjW5+E`Jr_1+%t<`&edSNQY?!S%e3nfs=$(c9GR`60* zEaZ1?S%LRQUtp^8Tl5Yo#ZZYmc<*gF7L(_AeTO*RK_}C`H&S%Bz7#4J4nXx<2Qtl< zlcHho3vvHpZeLS!Af#Bnw1~gq1qE-H|pK9!}S%b2A(#1^aQ-9c^ z=nV}VgUhZrlzpb2#tMp-@q4s88ELB(u>Xf4Xv(WISwAPR`XAC*sY*A#<5W#Pn!jWQ zT(o#m7&Rl9`cYpwgb4^HC*r znu6qfQz!iV`VI0qwv?pUcF^1s2WI@gFn!2?7%T}O4FR#l>AX8RD%k}xt97B&^b;?y zmgk;Cd~FXC?%wF5-j9Mb><;q6;wdog`84k|35Bwn3)-dG>w8KejXLBtOou zmt%+8aK3Do(LYqe9&OXbr-t*eW4kr#{8Yij!@6h{aR^Q1&f{9~YgkC$Vc;}ry5PtZ zYQXWl$6p8|n=*xr`0gdbb%b;Xc`yodJ!q0rG1bgSrLm!wG%$84{+(+C!Wsa!aZmVt zhC^&Jmp3U+%feSTzGE&shl)RPqiV`#bV}0$bUiQ`cTOr{YnNy8KK%47KQ<7Kk57uw zgRX?$dg4tR7g|x(reXAqyUB5CBQSgaMZEio+sEB*O?NI_NZp@sT-mbO^kbzAeHkTB zog0nmriEhkq0=OQ<2Gb98$fp^H8w*!(}PBQM0e^w*1qWtP)|tyigsq%%#3Z$qI#5j20e zhW9X4f=##o!xuYpi4D-<<6w?H4HWmHdV`y2hx>oDOSBM`|1-xvyuofeTf}(LR8}YN zF>WtaqHg!CXo%`6+PhAgUinpmRR#sPbW1F{G?t>|VK`6x&k}OKQyXPPkI}OmQ|Nvf7wX0BN5Z2E%<8Ty zP}NloCEIf#+v_q&-+#vh_bf$xHi)59Rp{}wQFNEoK@AfZ@Dr?r@fpQXG-L|b+~WEB zbqd)}x_|h7ofd5R@+WMO*&~)+5y!r&Uc&$6ljN@}6U+jsOmP{Er;IbcqC%Mw8~ezcBdWD*Er(O5^+2&;i9C90zO- z4%+-?@<(pLCjWX!efS6H($`Qb7RoGgjKn{wZ*Wvxn4Z{ChCdgtV~fl7FvHS(=ELYO z=8SY43>0RAwD%(B_>O86SO1Ti&oH4;8PCz+{S^F@)6e#oFGcx@$=HBZ=x*N3Wyx=G z+HF}nd3YLCDwCwOS9?%9L4f{Txf$y@U;W%K`$^M6AF}v!1{iYh-ofyA`g$mu`n5Sx z!$V@!C~r14clk5Pccr=SDSrrEn8V0frC_6hDlKn!q}Nln(C5>`maJpGEw%JOc zOZxyTG?ANq=ri0|C_sfTsM5HO*>uMDnKb>CI&Bb~LY1Yba*XKz=mGm>)OFViI(>8n zz5CIImX2||JAJc-RM_kb?H*2ZfveE{ui++fjyEZni>Bo!ts zE#6!}W9yTsZSpSqSab@l(<#KnzdYQRw~;M>>4T!XIPTGQC#u;ROf!Z;>4F0ebZUz- z-IwwK;}m1@`PC3~?k>Ui$?v(mNRlea8qzJV4CqH0ZE7AdgF5R;(17vZn3*a^O*ED1 z3L9lAxqlKh`XEmm>ojP5of+-zH>8DO`m}o^*HJz;4RaREB4a{6WM-5axxQ`<8-K!u zx}1rk`<>U*yieA&e2FN{Jz#|^kGAskRAXUPz$2LNk;14eWODDE0$s$;rxU_W=;dk= zTKS?0m&pcW=Il5&@#tPw+d~9*b-Li+{CvFL+JwVvTX9C?Z|vgOIF7sCU`R$g3U__M zdr@z(z~>Y0Ui}6oa$3=PsWkOg)S*%njOnkH`t(xGT)LZ=g^jDe!l%)7B=sRf{HNQ% z^Dms|;kyrQ=yRpA5{`7OtR>wZ*pBbJbg{%+9Bgdz;PR^3@am5uwg}bWv{TCT?{N*9 zbqG{E1O?&WrRC5v>aX0jShw4Fn%HKx*9ll#nW)_{0#)FCzV zgFxED!7{{pB;RDtOOHkcM#kIx@U&`kfi z^k9KGl@m9iP7bqa%7PI*=yw_Qk8}K`*j#K+DnToimmDwX6OJOkMV1l0_hS}iKB&^)|0z;Y4;8w9=Ny{6cOF%=n@8)1ENMW;5{_?n4ZHWBfmH3! zusoTCEym$&bd4yt6K6`xg1FvylnbqjSw{O~6zHA6Ts(3$)>8GWAp{?kU?ML~;m+26 z9D{<7Q{H{R>*?GsW}pncQuYTmtvQaVV;oO#!+dCQ4P}+?t;6u{hnO|=8V`BD#0H1o z7=B?g)qXOF$`3Np_1Ggk9{3a+-v7q<2F|yZG>H}nh;ZMdGW5tMQCdB50B7G8V;5hT zP6}4eBj0<(iQ~6)X8WZ~3{UJpt#5*~QcaDvcbL-nA_@9HHXXAMFK4&TmxGKgX-w1x zL3Xnu$LL}|vRZctmN>$vHNpBvbDSA@bIfC zSgNoadv>K_9M}2Rbh(d4Ij>NvpbqQW5i2t8;p)NytlE-;X2&j|L)s49v1dAt?UKXV z4Ih{$GX-+w!DJE<_&b-d}vg@#Bs{FktqASkX9vc(y!!3u1|6y!8xvEr2a*JbL&W9K5z>0PU2#_pY)3DBCE>+NXUsDWFTYX?yDDm-E~M~^s-m=N^{AU^kW$*`b08JCtNFHO08%u0<|*DNQ6 zJOk3PMv%DdQX`#KIz*v)I{BHcN`g2>P2q(ZBujJ}X?-G3ET>5jtoZ~UE6M@8?n7=* zJ{Za;!2)jQ=(|O~ezCO_ZdoP6D4+F`Z{owK?30hCzOlgC5$`Py`Lb;eAlpk5Njr-U;mxxUQcnK0%Z-;39<={cYO zES4=+kwowI6-csIpq<2Gbk<&sN43{s&3s=RKFHwx1vYq8-v&RwoQns;jd8~$MO@J` z$abW5@f!<9c%9YqSbh8gMz_V_w4Nx;TM~^05@A?=@e*3iI*Lu){$*Z{Ddq%tW8%^T zEaKa7{oxF@9ZkfFRVT48b0@Bml11qS%HVVj!Rb7=C+8IcQsEZRBrgmv&;R2k zOnuMl^q$0Ls%bdQ4-)ci)Lke@={sq$%F&6^3dxqk>(?L_4fj?HRaO+wqv|o>b zwqaigkF$V!Pj&d?*}x<&n^G>bRT0mfnv9oR%2{ox0Jg8=@kb4*)7>Wz* zm*Td|9{9-h3W97aUb@+i1$CX679~k}UK&)-d^*(^lAz09j^gN$JX)82hd)8uM1#vI zQ$8BN(FI&Ht7(v*tr~*vXB6pM4RbpA>wnbCSdiWxO-AL^WV{|0iIwHjC>`{Yr*!o) z}n_reAUP=ubYYGzkg%v4t?4-M~}vx7N#Q+NAM~~tI%%{LFby??CZd( zu-^AFIK(+Yt$Qrbp*Whg8@j_j+cA?J-gAKM`Y#&?WBYJ=B#UXDYw_Z+6?)yz!|~JE z=)YDAmBlWw<@o}bq#TQ5O?>Rgq1b5g5|>Y(NYg%X+@R1Yv~Z^cHOLU8^y_iXfAJV< zdKt2C_eAnwnHN|&mdQOz$pbl|oYl{Wf|OS#_BwtO`d*)+hmSsSx) ze&V1Sd>Br3DuR7b2>-+2G`0?7_$z)VveDag(c!u)?tSTu6ZVOt$G#|jR@oQcw?#5c z+@)8{rxHIfxfKtYSqEV}b_zI8?P9bGt}+phGkJ&Hqu3AX|5)FNvgm!~GkbhXIC~>Y zo-rB`CW`~2Nug&VQMX@57CI}D5Pxx^a{V88&0Pz+p_#1a1}RL85aMf(9)>>ITF_Ex z1FJpVASxtHDq5^bRK-%V_lydWzt#(Gt6zZDkp?&`oex@Rn_+ilEPS6lndBT$AZg*A z@E}b9gfk+b@#_<~wl@`y;uHwyK7&4O+6)c~X5biNz?7`g;5>rd-d@ra^#5wl4#$MB z+D98%lbf6$O5qUExp$JpCmWI}skvaXGYW3yror;7z}(UaL;nv?@blqn+~}@?gU2Q@ z2kXL^#*?PZ`K4nB!RWnYTE;GtU9x)~oRv?$W5=7oSX6!O|@Rw@sV1u$MSh2evsJONi3vV}K z!T1wgs#Ad}>sWMu#_f~c;+z-97m-gKt2;OTi^Qzy=LmtBYqZi zn&1o?d|?2kO&(*5*-Z@3&c}#;Uz7{o!KQcJVux2A#-ESUv9~W9lSDY~vd>MhAvG~nMvn7QKEV!Vzj*N59Xg6#Ga@>7{6Ja)^9bWO7G055(fdPQrtzi z@lMc7asE^#&xu|*y^2a*HK0Adf@r_L7bZ^4>6^6#D?xJ*QT)dA9jc-(eR1$=z1Mhs&VHfDm|=3wJQ>I;iWlL%gvnDmoB7s zvmL2kw>ym(a-*Ny-6%iIk*ae)-=6b;HQSZK-D&%R_9;uYMamu1w2xr6V->198&dW4 z{uH|Q(|oVhG&x}gHF_&ZV;E>51nR3CFWq}^rLvNA_y1Bhhs0d z%bsjChP|_dIL7!dG(J0qZ?BHy@~AFcIk5>N$LsLou4nkVyanUu{lo$@?tU|GGW~GJ zfV!wIrNb9C&?})EY0$*=H0h8J%{;o6`UihRlly{@ns*E~nFz5n?cz}XTMUi|B%(`` zJk>e8o{AnmL`$Ff(cL+A-2J5iwJe@Y8&#C(G;4AC`r#d}kLrU*&C;=A(RZx;p+Fl; zrc!w$BU&W0j_Q2gMm;sR(?-}zk2iSJpm!_jWDCM^g67ktHD+}4SxxG3RGa!$aa~@m zWz_k@8v1w4i+1pK(1nM#(93GBbmC?wTH9((6Dy0bcxVR%W^&z3ILvt0&d0yoO>xG) zg_!C;h$-J~sd|nVO<3tbMZ)#yX&WKhf3X$u>vPNty^VQul+if!U%BzIpX?>mMD$5Y z$A*?rv@YI^*$Xt$`pZEq73{|`EkRo5#-i-J)p+q~5^iYV_6hRR@k7mB_H(l{Yv}5Y zXnhm&g)6cDODlfX9>wz$zM{3~SJXWA8}rTHW1G!7w*8eTnQUZ2nnzk;%STgqB0LZ7 zJ#vJ=ohq!{vKv?*Ho)zze!6r9>9_K9@VAt8m;IdT2N#hmi`n+CY+QWnlTo{5V_PU5zg=Wy&_4OZs&ptGP9y^<$Ro2T@m^y_x~`)3r% zOi^l5^BzkoC?1=5AE!BeLs#92RJTi`2iO3PO|UOT1$RZSMM0Sg_U9>cR?~JL-V=O+ z+g&oT_q{3}3^T&U$!BnH;3_=vJDIhVuwl)Es z3??$T_b1%`xPru#n~_5MS}<+j3enzspik*Fb9(g*OqiUEhCyes$j%fyhb`Fp@@mHT zpdpCYD!^-*C7{gZP0fxO5Syg}WeZ+d<_TKywn(q%O}lcQ-T2V}1w70+o;|_Ov)tKu zCX1P45zE_tTLXVquf~VPv26GHrR+!N`DlDJ4!i$5f?to>q3TUvOs~Jl%~^Lb&i^IH z7<`3^zw+_OgQMI$?uB19mm~jlZuvFK1h{UF@G5R53};+pU0&#-$_^_G{~t%^;tu84 zg<+y3N`(-G5Rz0BX0JCYC8dy5I-w{fztTyfoDxDR6iE>Z5z>L#Yln~yBq2&CNfbp% zQsjHD?;l|1x@O+ld#&fW?~*9=vMs}rlX-_pOggU0(!-G}C(^rx8m7PWN6?R?fU3kS zpnLir7roZbr2hU^IP`QUE-^JmZLJ^FW%Lcf%bEzH6*U*ho9lMf0>x`C7ItvigE>`w{kl(jW~(zLRjH> z0$yfkL%thVs2rufFX#Iw#9+qN&8G~el)C}l85)KKE9znTC3#^#-2&DNO?(v(|FeKLj z;rfuujy zv^xDZk+E~8&(>eY%wI21?XVE{4yR(|w>nf?REHI2iD)`vH5$&IkG2l;aK)94xPDYD z2Cck{A$PLz#nQXjmD$4I!P>ElpUtNA+=FFHfvaCKo}0OD6CBXYA<~NTp#5Mk*&|X# z$23RcS3x8`i;JWiKh1{Mb7Els(kPgs6AG@h9J;TJ;l}$&axA&P?V`v`Ta80pGwR zhwr$CH^cCHQI6$EaF-m#xu`U8?&5DH&c0zTw@uENlTw<;>6GbnsTT}5qn7zxcGX-? zN?n)p?9|}ml{7h{Ee4!ki#eyfcNxd_FXEc{Gg(OMa?bhhDsGYF3eHlOA0D4ep7(^tGJM7EG*`_4=v?J>|Dwf&0WFy-LvF;oB1UzvgkOzh-g& zdZ+X5$!Xl7PpTZup3LuZ<+y#~+eCsWeRqMIiSYpZN1-SLEz&OsF_*;ZV_$pE^IVc=XwtA{|ge%`l5+aZ}!u) zquWUF(+5TBH)UvG#dy=y+>Int{X8i$b|+7M?VFB@4X{{Gd0^ z>EPXuTBLqB589oFVHw{su5FBiHa|FUe5PyfiD3T>S^UgKV{VKn#+6Cp>svplU9|{G zKhnq23vOtf^0N2?F zNb`RyIBr=a*Y$c87hstUqT$a-wgM#z1EzF>raB^VLc6UBIP`cN?7J<-=|7yyZRJ^h z!H3)7y;KkME`AT+i!Xu0xF+&slRB9#DNU}v(}7~KTo`+(5vCq{1!VhYNSZu>Q(h#; ziHH1wy65>29<>45RVKkH88wieu@&N9?}nXg{{z9#0N+_*~fa1&)Xf);dFJCiYllfIxkedKLgR!v3lvkrz*9pKiV?Xd3eQSj{84YCcM@QxgXKAR9|QwfE#qes9}VJEz~wFw+{S%ZPR z8ML=A0;l^+A$yf0sQo?w7Z(S?)HxxLvVnIz-rfTn=ea{kzy^r_y#|72*n>&)N;qV) z5nO)n0bPfEpt#{M>_|EUM>hpPn^Y7e_@4(~heX&bdmgUdJPUQ=39zRt4Wjc?A#K7H zaLK#^KVDpff+rVXx)+~c-j@iO+KDjo=>>?s6bHIWNznZ&6;wYbK|#)W$dJ7VKH6!Z z^ye}djK2ssMKNCA_Bwhh0?iWe0m`s*C>X3==^a@-bj`c<(YB`aF^PTfd& z$wq<{2Gs}}^iu_S*?Wabu4eS-)j%3v*G!K}$l>S@hPXSI!`|J?v2&^mR?2QhtbBP+Vek5nEy|qT#g&EZ1Jh zd#&ZrLz4flz4pbfv8(at`YoLH<#(L>==lAMsC78?7X}IZ=5&5uQ z9mb!z4dq!|xugHZbLPilaCHJrx>4Nldo7^0TUh1B2DFe7#|ENS{=qrl zSm<_M1)&MA) zl(yu7woW$CeP`j?y-?7ri3OimS71B;Jasla1=~V+K1tg(I6Sim9QNFUPx6Hz{wNR1 zZStW*^fpwVy$eT^a-h8|0}ezMz{bu>sOtFu&3<1&qW29flX?L0?gcQtFB7;8xsZ79 zIvDZaH;>#fn07W2a;h#t^!uw2Rh0-W1EFAb!UL{&Y=9r5_)b)_HLMNeKyRNiRBxUQ z#@Fp&&kSRjvUUvUIX@)Dp*zSj{|-T~yO*HNGf*HqIY}UX{%=veO1?1hg9*LR5=|$_ ze4$QGbI|jw3;Jkp=7E9&?BQ8)2YXgxVdf#M$PU0F-jiZL9C4a@0PY-{g-XL^80^Pz zul6m>^SsIDcgrv-q!N#J72@nCmr%KkcWK?_XCDnYI4L;;Go!;$M{gpApBJGIpSBjI z@qPLwUo7yATnf)EeTY-GRN&Vm`Dps?Bo0rQhvNsI(1P}SD!O$(*8e$+jytPRDY6fp zR*SOHZ-&uh?EqTnwBWMILiAm7A7AyBpugN7^luj7-MZcQ_|I`cQCkc*?ol0Aa59o} z%vU$&)haqPNa1%*Oa5kX+22fJ*Okk?YT0W5;>n8 z@O+H5`+9^Z?Fw!62#;d!!`?^9P*4~E@pmQRai0P8|7d|t;%l*SuR6ZAxK5{dl@$F~ z6jPKKkVrcs`e;b+4?1@FO}g>QeX6y6I*!{KjBO7uqNiIj4s%)P<8vS9b#$Nu`;F~N zukeRUGAiv2!I32=(N`l8YXWcM;qH3uD}RS8e}BR=_P;RcdoRC>{>abxc~*FOC2ra+ zL@_P?=C=DWYV>sA;}K#kIZ%>WHcK%}TS=zS)r)3fuW?OYJ<_H(STJq?uMUc_%9F$B zc86zPPvH6Te+O{KB?lWw2(o5o-6?Vz)suI+=t*2+83B&0cW{MiQDAA(1yB(?DxG%!>8sCH`>gDl> zCx3S5r@xkmKVU=ib+q{~6?5DgD97hq2b)CM$2}{U&W}SZG=3d3|7XH}d#yp+ZOgf4 zl^D+Emno;Ubuu<+#j-VT8<@(~6y6W5!HVlQpkw?fcs+g@XlYtdbq5C=H;G}?S^+x{ z;>>neEn{L-op~I~LNlHV-l}TA_gt%SCrYy3Zxh&o!|kXp;*E+|)?##VKHlwljhFRD zG0PdM%%gT1>qypPI@65U(L;*NukkB(?x?|sk-xEujAt2p7O|f{mDz0XZm7Z=+{duX z9JlK(49d7M!}1SI<3}lz>o;KLXE#!J{kyz#whPo3?}pvh#iZcNHNm%4xo90}#OCzc zu*D^&jK0dogXRKAb-Dp#115uCPzU{4z|j0a2g>eGz#&<4)R?##%Qbjcj`4h~mFhQcP)E1!k^2g{~^0NVfC5u?Az7H*YtqE#AT0-a4@FVM=VcEd^GE zoZ-^>AW%c_H@LQ1oq2aZVmr%gSV^T1Q=Aot-zy?PbGkT3{H{Ul@w+7b;3e9ENg(Wzpq5GLG60!0e$R;lXQIFe2r1UaI#DBsKHpg+{+$VlE zyDZduA%_0q7f|Eh6-+u5i-(0VcqVrf<~+MX*ZTxet5t(EH|;tmR%o*IUN)>C$Ar00 zQf1|~d`2X&8nj~0aYKs|xw84=xTl#iti`j8$;^Dfd<|UKQD%t=cNpBeK9Nh#<2$K4 zQUozsX83;a2ks13VU|zEvWTHBT={7SPFN}mVY5tNSC5u3VaW<~HGGPiV*GgP{V8hw zs*tSP{z{-Q_=W2KyM$vbUgIt00$ipLgQ7Ez;z7+0x}N7|imFJ`17=FttCxTh8-Af{ z_GHbxaGaiAynvjd~d&Ai^UFLj-wnJ&#Q5K?km&MDvFyr;dFlVR~jybR5 z+6VMGZ*m=e{+bVRv&-nnd5zelBF5f-lw7lrL3r0+p@lWi zv8zr&qw5WHiP}y5Lx5=&Nj!o)g5+1MEc z_yvV7u*&wf~`#A8R+&UsP|+B`N(%&4_|A7%ZtLm zI=Yym4WdSCBF=o(PF>%QBP#bgN%p`NLBolKIQ~K?o{~?*2fJ_L{@DrWIIx&!I}Fli zCd=px9Eam8ZeYx=F-%`kh0V>K%941djHl;Bt|_5_D?W3dt6c5Qy{WRqwy_tO-TPEl zwq285+mK8=Bj<6&#yhzCt?FFW`5c)2XCbV$Q>PMcOOcC>z~fU3u=>6>N*~w_86jUG z(fb>GogWJ?yB1P)?MQs0vJY#QNMq&{LpqvsHT@iUj@rC7M#CHd=E*o>-h?RZDh|dP zZ5O;RrHfj{YpCO;*Obo7#I+J*+2;#-%$H|DyIuH)7gk^5XO5S+E^#53^WBScc{TzA zrd(qGZZM|3WjFi!*A)-m`2cBw3%JI=5?oVOAgplgCoh&vLha7Gm=w@~adZNU$^U?f z*%frkd;z%py9id&Hejb?fy?9ua7n^%lvHfMZzKxahUTN8W+3iR$;Xjqcd?SsytVV0 zGK2n6?5pcA4$Z8=#b4uaz@QLsm5yZ>{LI)RIZsA)yqQD!Mz(Y2OBzzKfm4}tk-KK> z$W{KwpVu%W1q&Uv6cxY zOyj8@vlD%WYTw?_7T0EyWqyiCweP_YYZ*q~Xt9mq6WO%Nm)M$^kE`mRV82HzpB3uF zTf^ea&sUb!`75%OKB{bE#%R_W#<0IXpXW^eLOY_%$`?7a?6B=@&T%I;E;I>$9$(Hy zCuVW7FT%K)7v@0a^SWwG6LEG3kGvsQPobooL!pzI9IrB{U>Ln@f7 zSAebdifr>YYqn>4D0@y%GqLB+%;?Apv3%w55PWl(-M*lWPd%2imWBhQ*j)n&4w?yOWR zh}{(nXY2mCv+_sjq|AH|_nriC#tYj(rbUOyy}uJ}u_?d?Gy;p#~P4 zgo4d;bSW7#561?*$J>9Wvh#y(tj05(H7r}hCOmG%z|%c6Nnr$}#!e+C)M62oe&Wwd z!+7Rl3pT_gqnO(j9A1%+iV|_SqbMBvOJXohG#S6nsYb`zceqXN27kXigbCh9@O%u< ztc{jr&xV$q$HC5Y zh!j!bY#xbma|T9m=L6otnLI`CbRJLLGNMuc>L8NOX*m2ih$QKk@ts6I*BKzqr7sPI zCFh@$Hwo?n|MXcVCifeNpZGt zJ64&$iQSPLzMuRbHkd!f%C`5|AXbd;lo~*G%r&mt?Fpx}CWYJc^CEvwUC4SjhO^fW zwrtbI3RH=n2ad8Wpq~e>T{{{qwjWKv6MUm~k^BcA2PQ?9#92jr- z3c*|7K!5Xez7HTPoH%|IdKxcA6E!hB(=-{iLacapunaC)T2EcZchQZ?nt1zdF6Ov@ z#tqE{xKOwS`;PIx!)=Q(WzrL@2$bM=#FN?AW6fB1`42eqXUGYoGr7jEYq_RJdRTcP zgms8TG6ScTEc$sZKD!h|A{_Zl*n(I%s`(eptN((B(J|QQeOlN~oA9*bG?r>rgHr0z zG(5%y(mmQBzL%d}|62_sWyIl6YZ$Tp&zM-NPa_GsQ|YseIkfG`I&!$XiinNANkn%m z3BF4y;G^S)Sj6Xae3uA>;wnpva(*<^)gAG;Z#CaV923X;w{oe(j3wNrPx+jZOCh(p z;waZU`5t-8pPOBZ3|LptU-X?l1s!E0K(Azq9Vy@W?iKL4aceZy z%R^-e68c?sJ95XH~z;#o%(xdB(N&nFqp!G%uESD~V!1f)m)p{&kdLT|*I;yEps2Y~n zJ*Ssn#M5fae)`L29(GF{!*!eeah&{AOt1>1x#nW{@gt`)saP47Vjhb%`|naU;ZL&h?PutGA<5ZJ zNdSL`VDjj~0bJJ7h4+#4UpwavcBJ>{RhWp_k4quRRynG!u}TNO&RUR=bK_7t=anTRoe zr@`B?Qry`?>Rd}-J>S8<00VEA^BkL}B>blsDg5<|>c}icovP9Fukjer{Ja9ZK5(#| z+#@4*H{nqG z8p?@bf~G#)eVhW}iOb>FVJ#?}5(Mg+x5PQo{R6cMsu1WbyPmfe1%MS8Rao5Ab zjZOCid#ekH?_5(D(o}}DYj%R7#dg$ZxiLNcJA-e?wNTrBeg`|`g1U7oSe0~%zHX4l zw)3mdI^7D53+AH9r%%F#^PbXYk9NcPfi;}l@c=I4&w4I*{|K&f-d>ofIstahpG>as z*#-IEZO8)LaGfac0(iBipv+5$~Mk zBsr~+wro^Fm)A{&ktdpn-G>#VwZcN^^g@oBSjP)hwpI!s+iGEi<8_1^PcUy%5vs{P zK@W#77+NgN^v{i9M_u}G_mxI;5&q%xbk}j6b0&OL(Bz&+PvQLkD}k1){0>5Xh!mAO z)3DMO3>BNhZun`i*&~G*(RCPirm=W8}@DOLT&!{D^y06eN>#z`aEVZ|JO!roA(Olr}q*U?bW80(uIP6175_iJb^qD z)rL_+iXd2@CG`oUc!AZE@OX_KUxcY(Mco|twsxRigP(0>~BWVF~2aKjACwlerx!g zG|OG4!8S+gGO>H=>}`WOGhC+5KL3$n2S1KsQft(h`xKs&n5)Gy8Vhlu!7)r8cNlX+ zO@;UR14zu|$A#7NUI>ZrUb<{;4=wnjfp?-#qsQu4+f_?*CIDyaArXJwud?UVN&d~}?=KTjgCv#}b z(nz6)?jW&I7K5Y%ABfXOS#Uk^m1j%Ac1@j*PyrFw`%_#z>3x>kIA|BLe zyfeM`?izLLnt%sWp3~aFD|GX#u?QBg>6+^~bYnw1P1t{lTA210NgW?0SbJrW;O?#z zL9~^>V2z9>S>7y8%su*x#M&MRoxNWOsrY6ZXx}a@n`1BBxqYTdyWcl~-aH)w(|iPj z5pBY@;+w)4i%mqKbwBueorbE1IiQ-}0eKf*^6ZosVCeG$5}p2lTlWA|TaDrtnuu{y zr6ah+$Ku=?IZ^Il&k(Fhd;>pc@-wL07h$S$5Ug0f7c8#afY+iA;P|dP@F>0$Y({^B zy}zHs_og>+^ajt(`d0($(>_3d>l^USdxG{?wG*yQ4>Ly&lelrIuG9sZbL_Z4d{l8aIfd~!QJ`Yurp~CcU44&^E)ZU z(RgWY!WIc`j>G`S<#s|#?i;vq@eycU$N-pq8jP03L0}Z0@hK01ucqEmd|@>t_0I>L zE@Rm3U%p8_!G)wK_>bu@leVvxl!I0wH2j zEX0m-2XP5sAR>YATErUix4A&;zpaq8Y6Wzyump|k8W5lUoVdz8Cf+(3#GtT&RNk&9 zV|*B~Js}GTw)5e=-aPP%*Ms%{X2Z=IeQ=*?2CnaBLe!OcFwbm0h~AkDc62lppB~M_ zWcrEJpF6~R`8~47mG?5-$RpZ6CX-6H@nq22hisD7hojTh!M_8`Vbhl^{(nTQV(S144_?B4SFhu$nN=%$*VJo#N(Si&vm#b zu-7>+C>@z?x;WN^2H(h_2L!Ka%=K?{l#e>T6kXz~I>w@Gk1nno zC5J1vj>RH}-*m8A4bw+f(c@Y!RH>wk*4yl(ap$^)TCTgP=baGYnp;gm?bz|OHM3T* zQtGro-tMOGqRTE?bmbKt`!bKdT+l=PyA^pRsSaLrTZX<{Epg!)OFZ*wIT|-HS|GPT zVAdx>^R*0!-^6Mndhad?>@o!XC%P~);59k@QUk0S7K53iI!vh?56V^@M0`ySk;(EU zZ|Nyg-gr)sb}O46xOIX)Zn+{H+b2fKe*H8J(EKE@ZK@}EwYDVgtuoQht0D8^8EJ0d z&*pPR!|{wuq*UY#d7t)*$f*Sp)1lu2J6a-;RJ|_@+y}tAb1qJWV4m`6a|LgM;6E7EjK}6rwW%;l|Arxcxi~4E5sRU}pkYO!k2|zAv{% z&L4gswFWPR1+d1NgEyYzA;GbQ=c8wlWebwXUwuY=Rwt7wE1JnRi%}r^?l(EFqX(J) znS=H>W009{1$D3WKumfh{9Qf{67GtCf6WzQe)AGh&`Bk_Yu*WZ6q^M$1!{u1c6q{k zZiE&T3u&ug9_^LAAqcgNBdz)&WJ>2$2(jQhee+g;O~NTyH}w>>pS6d@@wO1SWg+N< z%fNo2DoCtV0KHB3h-OD}k)%$!(9&utwNTtcHP7l%>DF&FY5~uG(I12APrp&I%SdPH zGMe7=gyv4qpuQVoX>f2DReVuI|K<$vjw=fX()-?%c!NnOtg74F&Qv1Gi zdg$b1>b3bi9dj*~dRcv@swAA|?e7<|$!R2YPy$Xhj)svpLZJC!0%Tr{frZ|su+Uuy zy63Y%dyuaPT+DDrTHgd^Xf?G9c2T~4OYtSypJ{}2o%EZ7Wu#-GWKLV-qePNyQa<~|G4A!V`go4&#^8QmR z@!5WmT=%$R`W1(YT+fvVH$>kQ-t|?X6Qo>)C)bal+79bz!cq-7Zt4Z1nz#f?t>%H@ z@?>~%`ZY9uD1pU?UqOyw07^pdLS#|~XuDW9xOJ)#>TVc?GdvVfc9bHrK@n8QNTp9+m(#(SlngBo z2HQivAlLd5qMJr?U;A6ZFIJqhF&oX9WtYQ1MJ1>t+=JLOKUnW;0b%2&Lhp-U^83Vd zf%>}rLZy}GsK}5vZ8)88@?Fu5Ecy3@ME5H|%z9&RciImjx6gvryGU5_;To)2%Ck?_ z$G}LQ)!B1*J!Ct}!JyA=a&4U+nO*UyNVM>&u*EikGQ)FpZtn>y{c$<9T3$dGD`nH> z>t|?a)G6ZUY7g&LE5ZO54|@&Y!D8tG(09HEC4C>k^++PfyF|m_$SjBvnt=_UK}m=i z3A+Z&Nou=1?XHuhi%%5`_cpx~&bpyXrzr(czY}U??d_AKX!~jSF+CirJ}Cj$Q2{5_ zV?ZJ@o#Y(n&m7NM$?${A^rY-$qQPgsHa+)7n?)LEe##QPKPRJ#pFh_0d7)oJC|0T+ zLc2c)PfTD;IC(qLd(N{p@k)ykH#uaS?6K72=-q$5@*B7(0y`P{*JO-^4w^ zxafztV|yj;{9KE5cX{@HP#!M0sECI{hv{YBM^wK0J!u;#CGX~!3wkSc!TQEK(peWy zT^p_oHQFL533I{(-E}zo$9}Zk#LsZUa&cS8RjgiGfVN|JZbWMgYOeOisn<0zw^te) zH}d^8#jo^M$OycaJQ=lfUeN2yr(nzFo%l}F74yrZ@QqgqHk`;qv3Wwg{-+MboFCx9 zIptXHUWSV`FX8a=L^O%z_ce!;a9~v;dYkR1j^^hD1=S~oRca0pIv5C>_V<%hp&LO; z=>(|7=Mt0DXJqD&8shNKmxeUA(t;z|bW@-XK1U<;D4U6U?3K~%X*HF6p(NCEJxbhl zipXMtJgob-47%mE@i|f-Xn5la?rVAP)JR46_3kV&s7)0_J1Wx06V6ll86$Zv%51DT z3uwK}5Jzs|J6NA}G3hnmdH&Q(;}?#{wNsVx<()a0QJ_M1wwQv=p!>$tba%@S``cZ3ylPO)NTtac8@~tm>9kf{z?-~GI)XY zO(88ZCd|K|DCSH9(XESMlj|w454r-9H6d`jJPh3XWBCjn|6L4dAd;ujNcy9kBE7mq z>Mxr}6E@V-q?CU8rs6*B)BZ_UUYvyZpE%xqs*jS*i*fUN6CC|h9i__8kQTuW(ohyj zR{u$YxALjrn`i{7J-j2(epNFpm!A;WFa^I4LM{NAe0`#7!{F&iUK#aK!04|MSTg3`<1qIgX$hR*In&7_ZL7k3AzEPRT= zC8A8^`)`c1mSSsa^;rHqV`emQ5gRaB&mzZe<$aCrOxtKTn{xU;rZ>2Yd5+o28ay4? zMGI$k{;?aY@7lsXPPb>{)=pr)Kg8Lvp91UFc!Aq2uj8DsQEYg{PfYw#kGA!b+1tN* zEVERVT?=2x%HKP)VdBEHCEb|V!kuid*>*PXrwfaExSnI5g=l%GKY- z1(Sl&sy6~tqZZJX%%#N3WivLey-$Z#ZG}b?GB78q6knVBU={EGkht~_-*y(^=TBYu zWa9w(wdLWEaxDgIe~!}q>HMDPCSEVPjqZI{u^{&`>U|GIGfq^XV94iB+jLWkNdg3uyKIyR|*?#oQ3=X>tbJ>q}pOI0IW7qts# zsDz-d@o6-ic?R=)k7L+nAAEJk37rNkaOA#O=y=2!t12er{+c~l{U{UFct&RCOfd}9 z@F#WU?*+Y0-H{y1o4DL~E1<1~h4 z3uWRw3(wfBMaPjF@RX_|8t?MKiW1(xcX}2U2d~7~n8g@2vWEU!kU*z=45H$RhIn9T zJ??xfiUr!z5L6ij!`ulN8S@lwP5lm~ITt{0nI-ssJqzAV5+GvTY0@y&fh34s6vWrn zQT_TG)N%@?BH{O_Y`r&qc2<|BE!syMmy3XY_Ftl?dy7~tc7b<&Hjsab0TdE&J!5c5(qgKjZHX}tw&CX+H>p+Q7usH;fjfuvsrsBi%CeK`Lyf~i zay69SC&$w@0gGr)`4D}lJ0IIJ#lTQJ00wG}z}D;*bm;WJs(?rk8Q}=7sTW{J)fnh8 z)DU!qZzT1bm5D>TmeBK?nNYOxEIn{Ug6g^r6?sXe)4?rv^nCPbQhiVow3iwHyx9$U zZO*X9LJv;aD}&f?8PIjDCV_cMB+2Hlz?s+x_Gj?UTsH~y@@%AMCS=i%Vn^wIy+wSE z{+lr6a;>nW{-Ut${*dtQuLngd-PDDW8$QzqPZdy3m`H~ctzlL0aR>=r0JXnw!_3wm zP=1sEn|u6$#}&cw_aLy3oCKRQ=0R(-CRF5JBJUf+i9>-nskILw9!l**^zt>bN410W z=z2ll>k!E0`x_aPM7i>aUg)ei2Z7=Dpu4!3_q7+vJ4h65CFY2*Ev4zWfQPiz*|FKTae4G(o74dW7zqnM}QZs3P~x z4(YMO{M`GS&_8rLyxg2isxQbuU{^Cx*&6ViUi- z=$6@`$Vpb9moA@8+wlpH8uerLP9dhQx`7_$49|F+#@i##;%5646l@E@cgCS;z3Ubl zTU?x0PNBtP|!#iieNTWEY32ujXONL4Fr$ znTqDQP3SDqjh~a-arFLg=ujcW9MuMKk4qlvRHxx(#}w?8m&9GaN6 zEX~`E=R^~5nc;0*a_Sk5UfqHgkN@BnYYFyEMvUe2yn+1JA90UzHCiprMY-$OPz5tF z_XWQf;n@aCH^;GHL*7lLtH=_pXE0x5o`p4$eFYa@2OY{Hi*t(eyA zje1*^P!~EWY)C?r^cJ)$c!tj5pRjnV5sOW-Vp<=ySV`S97Q(Y#jTC3F)YkEAkD3^p z=g^8`&wt?8re6H}S%fXwF3;?5|(zrUf}k^6Xt7NN)SE;L?Jgx>F8qQWPBFXUsybSq7m#kGwry5F4z7h5yg z9xEo>V$3FWDl><~DGax1vz(*Kto8CtrWPWq#Vqx2|-{5Oj|+q#Oig}5`b;|JM5H=h$53THV^f$Ysb zTXyF661INU3Km+W#p=%d!k6{`@Wu}bHhu%|@tgPt2kic$*SAKjZuy1Ep)(m+tFx0| z$Fc1jb=cw6hU~+-G0f=wFy_tvfNFz6EKJSE+dkKDe)LIv&2#fKtpA|C?jV-+i7-hm zMP?B-fqCkSvF|QoY$e|-7_QVnU*0osDHjL6vzCMZ=rF$9b_=>%)u4agb2`CyCvI32 zjxBHbzo(OmA`8=T$E_`xll8Xn@C0+>J-nKTWcQMFn|;C2H~^AL_%mtOOi(!_2hQjS zlpKRiCk13r=N6iF;tlCDoevNHZXm|%i^v(b2zZ*D3?Wydp?Jp$*pcE5(ai_pRs#Qf zHMgAXkXsj3Ce*)`A zYT=K`8Q?T9iW4ch4#y*RfYj^@F#n4zH2pk)*YciYlGtA?I@N)_$_-dpTa0}kCCI85 zpnplYX;NT}&_Aw~YMOgfE%`ly&jHo6(2+k^Rqn>F#sMmQ^d;4McM)CtKVXM_GKOz4 z!gsQ1SeIRf+q{lpw#gsr-DHe*`+|8Vc@lo^k%IA_f=67vZ+} zbZj!+h6By~8DaHDIwP;SNI69bwq2PCMkn*g_gCJeacUNMeg3^5U|F4M!4WmOup~k7 zb@C_}=qWAQA3FlKB#Y3apYIXBU8w@Dr$uPTV#ua~X^`tT7fyfwP83ItB*WEC!sb;1 z;-~OVP^Fzl^#aD>nQOV!LjN2MANhqU0l%+Hp+cFVdjhIAK-vzrf_=IIr{LcKcay3h zP4X>R#3h1Qz+ZvqjR3mw);W4EZ!CSY`kx@`(ix&K_ZeB=xeeS_3Spi^Ce&KFgX+@& zkhA1FY2WukK;P855Xn6~ZYNimA>2+k$)gofIK2cyX zIEpw~M-q$VKZ4!1rNZ_uZ5kf1i(cPRPgjhQM4i%E7{#-_G!vfCJR==CZ?q=0I}}%R zuxuia=25_ z{Ypqm)ONz(yioY*z7pQ?I~|kYweVc97DhKkz&j^9P*bcIG~6-}M0z|X(hF-zhty-C z7K)t9U}aG^IIQo4;_ao7y!$qky}A#;u7Q!)YDkDshpzf{ z@aRb}=qm)kBj{gmX!3};+Su{Yl ze~KoWMoUaf7VH&v?mtP2TR3PM@__XVoMGX~{m|^#3-#Q5?yW$FlcHkW=D@FTdgOOl zvR4Rk9j?$7IUBCETSJyXJZ!#n8_aIsftZgs;fKg8(68t7rl&u{xoagLT5uEox!#35 zha|{JcZCEkdst@U2Fu#FfMx4^p076@$Q)_N?va953nW1&^)o4`EG6=)6~t!IXQIGe zB3a*03VLi`3QfgAgl6gv+h=gDkHYO|Yv6;d7E#|UF1)T0DyaBynHWBMMUG~Tfx8WQ5M6o%oUH!W(3!Yn z)pcRq7(xgkLT1TS#%JFvDpFC>M01)nX;Pu|QuH+`Nt2`rWei1lj*uZrLgkh4rl^S0 zB&714e_&tNv-dgAzSlbU`rWap(hk8A-?^AlV2CvnRnT>%h~+5FVyV$#?9t#!7FBBs;j8tpS|+1u^c@#4zEkT`QSWsS8qMld!+z zByxJ~Fnz}t7P~HoC8hQY9tu-AtEj)6!>U^D&V*A!l{$MiJa;7XHI`%ULov+H`85mw z@qp>*>#+DmQ3bInZwt)jGKDpF`h_WyeFe2q?*wj*{GPuKV>b<>SiY7X>ziC5@F{B% zSSw6mPkmksg6o6wSjQYeyQQz7coGSNhf0O&w;Z_S*>T*2>hYY**#dzQ{9rPBBHD+Ekn{(uG&UXZEh;HCuk}DO>pFBilYp9m@Ai@F!q0W-ecf_Ofuy znXwz&A_Rz@p~3g@`P#30h@JlL6Kgs0fz4SZWR-cRSYv@93w)X`kk~58;wxa7q5Jj#o(XO_;ad> zRl1h4Whxpd+~9zaHM025^Jvc)pJnL|3m7Nw#de77X6hd$SV#XdLDcLlLHxUHf!EdX zoO#(nPC2hw*ycM`uwQcq>vp)#ysOJt>yph(Q(vD&ZZ(FI;559WH)FP?170;6LNZQ) z&k6m^p4=>Ar!O@ziRUFOIqNx#UMP(vDx=^YDGR@=DiA+60V%^a7*bV$)7d^Y)l(6h z;`lul*TwcjJ#6Eq7p#1sh1JJpvjfi4n0B?6z`x(cv1_v&lbkS@T|Z&Y8k~+4e2BK= z&TsYRlv1NOzOLgMHhOT8xvm9zV^;_yhBmMZ<0KKiPXllLv@m!h6gDl@coE&nzmG}S zvC|V_M%L&W(1PhWbLa;$gijkX;5P3bjGGg2zJ<^H zekQ=-Go$hNy#*%bFTmg}R?V%x$+o$$tliJq{vN>SQ--E=rI9y(n zfKFc5$Gp!)pY1tpJiQHaasjySbPT(Zz(fA3(Wcr2FQa>?N;rhW@76;@Iv(2{UZKi% z5bAX@^u$h^u6tNfp1_{=tJ_eB3?rr3sbsp8Xzc+j8nn=$+fStF!@b||G97?I^%zRX zHl?T4#uSlaKzX(XWbwy{PSSW1nXOB6d?%8*j2Zoqn?NChR`fyEiZ<;rr-`P96usJz zXvmn%rs>h9{xP&LbQBdiNYh&0PgGnWL%x9ur29pgR9nT##pD(K)ZWK(mon%c{Q#|? zVHArEB53kAy!g|Jd9mN1@m7NF@W0{hehD&+|B1^N{$h?moJ5tSh#Qh2r=@bVXQmvf zG>@VkfvVKS=SQXooZXHB}$XX1>u7SH>9KLTX!kNTWY(M3WTX#kI^X+FjUrmu=;e^Xu zwxQ7IK5D`{u)FLDs?<4T396v{;URV!3$gX?CHSXr#+wXl{PWlc@!SdYEaK0oC=?a{ zW#X1f3s$MT#X3GaZd}4GWRE$5nH#5}Aa)|$qm{7Jewd{>cCp0s@7Vta#9(o^jG5fB zU_OuP1(SoXFxi>Bjz}nE)1;$Vl6W1n+%OW2p5~AXT8XIkok%<}6Ezu=p|0(UlWYN6 z=7z%Uzc_?X%Eh_n2e|m86j2xRQT93;VTBjbwKoz0Js0s&kbv&QD@cipLEGtcRHzlf zMduN=mN%hwp9IFlJgRzIZlSWf5_0M^`q#{Y(a~TK!L%-BdR54NdswPEdfg1EWOpgwT zkEfiG6DjSI9ZeBo)G=uasW!M$j+F~lKAKMb!&9g^aw0WlX;9urDNaNb5uT5&g8*LUI1{ck9X{tiE%UR*xh1FyMnv9P!n4#VXb za4bS|%}rP;T!)BqJO(o_A-D4k{*6e-*YDMsr_zn9rqZrIOrmN%t*ja1~JP zyJ=Ll+?l?rSW%arE)}Jz&_{PAQrxIYvfV1wlgP6J{B>!Zoemjc6!m-k=I21aqBHIj zGHd!Vcz771GydYj#sRqA8c8cH#!!E=CPj=gr0;bGbZM3*WroO;eu+G(ILJ`-RsI=? z7)jQ;KAN;0;q}W7 z8gmw7=bhtNR3DF`F)?Vq6NU8oi70Qoj}x*Fkfd6MJuPL>oR*3q`6vuDY~VAI=fi89 z2b^~k{0JvbzMT`G-+;6)+yn&z#PYE5(}6_@J=Sxw2WD9d&W}2 zOfgky1s;s{hIkYIz31XGxF*ks^-l+0qiDj}ND=)}{C~@XjTrZ9C8n=7gZ>AeG1V;z zg>O=j^Dw~Irs*j0cSM@qRK9<`9EmRiv7jIv9z0XL>-tfwwv0l?z(t(Sjm1t?-tSYj z7h%_V&Lr>cX#K2_(+!_`I)Px2MvRAmm+S5CM;dl41} z_+y1V&n$Ys0Bt{wadPQM^hrn{U;iWfR{1X*T+zqgK9@y@n<*xGEr8pF9r(IuD-wg| zBU64B_MDsv-AQxdw0Z@Gwt2v5q#5@38N)|vAxuKN5&x9Ix6293MCT*iVi!!;@Y%52 z!%^%KiSax$aIfZZY*$&1TgleYD&uu?kO1B({zwtKg#D4{kl1||F^cEWa3~ykEvv9a z*&ZRBCFUpU@n@%ldd?JW1rGd~dEmw8Bk0?o3fT!22)8eR)ca&yU7U?K4>NFmI2RY| zg}5wIi9DA&kZ3is{&@>z7ERX6-bNA$1*>@Pr);3Vsp;p>XG9ZFV3&2dKhIA z%i+4%0?E9N)Uz}~jOc7!^jiqCN*$3#a#^F?;klc&-s(P}&|WLl?c9rJ-dc21D&qrt4|LB9gs+q|iZ4iU;7iAdRioqvK6zgl{upr6_>6;HB zgy-7%gj~dd-pgPKXVLg$Cic{SWZ4N7%*M8wk!%;UEV04lrh_ftxBn?LIn9_R7g^a`jb2DOesD0f?jb4T}MG2h!TNezd_o`cxbxfG_$4G>%{3i;q4 z?2pPDc3F_g*4o`>4kF^bw~E)?sgp3LTMxx;#@MlVE+pi=FxgH4y{>PWew`H7`dJ}J z$_pjWmf~>6S`>bFLo5F*Z*pFS*0$9+XR{K%S61SY@;V$SUjdPO8*%mM|L`&`3Lk2= zA$N-h?!K@<#wk^N>CpoxI}4lK=OJsz7T%Z*_s+SfYH&iV$wZz5WrDQ*hOixBgp#@m zSU=AM&HN1Wtd>bQcwHafl}0$=F$F<0c^0^LI3luc;LJc44qPn3Z?8Hi?r4InM;+EX zyuh_N&kz|@g_)LB=-N|?j?7F<`JRAp=We0yXEMwhvrxZ1pZAm%!0c23nwtwzlllfj{uUU!24|B}uwOnwYx+74MO!vyEcpHs=e%*8YH@`B&JccR-=74f0++NEa6; z{b`bPp?V0{)ZV~w@Fj{*y~B!+y$GE54Xe~Tk*)m^fp>c0ep-}g$;r?hSsC(|kRe;1 zh3f+aN^(#m)jwlM_kt4bvm8Yy3l-^Qni^IAG@!K`jHoR{orXO}Q|=R9r?jZj&6%TV zR-zh>U9U^_q5AZ2x&fUuGo+61#*{5?N-B8<6x_zo9B1oN`Z{y!2%Jo2?Pe5oh1U-J zI*T-aW5LW`L^Ss!rrb;Qieth?`c<`!gTlQN$hS@cURE zBgA3uJ`{bc(XHKprFQ?J*SHrXZGQ+}(~wt#3TGxW=J2?+O}YGocogjE31)@z0j?NcWF|Z1;JH z)@NYFfyYScuSVR!ecsnrfUT5={k{b_vHmd>y=ovxDuM3UT>Mf@g2(aOI6LM6Iu91& z?dfFXp1O>NpBEwCa{{~KBVeEyfEGzNq}5H~`B8z8MKs>UA4QGzKExUyM0u)TI+Ba=8UfoS{ut&C;a1zaMqY-+2FJ zAI5ooLp9fp#)uBM%5=ls^%w31h|g09y>aa zYE3lOg63>BAafgisx;Q63DMeg)_Ob@G#F9RHA6bc*I1hV=JYGxgjC0=l2xq?Eu5rC z+HaJ|DT~+8a&M8WU616IA8^&>D^_#g;j!u)R`XeOj<(Hsu)7{dwO^r!dy2@bDJaN3 zjrxbjkUez;?vB%f?1@i&4Kd72R+h2nuZ}Uxj{9s`?jzRha)^l>ek-`jd)DPDR&%1u z#0$@RiWgpa7tNXdJ1pEDbUa@!PKn7@*swcGmDt*-OOB}7m>gw>T_5=j^);?oWn_V0LUp{* z)kko<8GnD0jzupNs9K`2xX$DyBL$a{Ybwazy%-X<4G z$4jxk{W&cEZO3uFcPJ|Qgg5ft*x>vOLYFEet!zcWOHtxvIP!;aI*y2-Wfq>{3Yn`DiQiW)}9^2 diff --git a/test/data/reconstructed.wav b/test/data/reconstructed.wav deleted file mode 100644 index fb3c9ecd56be4ae9a06fbbb66026cdb11f5af834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105274 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 FDWy-GIggR?`bk@s) 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 5) - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_diarize_api.py b/test/test_diarize_api.py deleted file mode 100644 index 1e91cb9..0000000 --- a/test/test_diarize_api.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -import os -import sys -import unittest - -import deepaffects -from deepaffects.rest import ApiException -from deepaffects.apis.diarize_api import DiarizeApi - - -class TestDiarizeApi(unittest.TestCase): - """ DiarizeApi unit test stubs """ - - def setUp(self): - self.api = deepaffects.apis.diarize_api.DiarizeApi() - - def tearDown(self): - pass - - def test_async_diarize_audio(self): - """ - Test case for diarize_audio - - Diarize an audio file - """ - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_diarize_api_v2.py b/test/test_diarize_api_v2.py deleted file mode 100644 index 2425bdb..0000000 --- a/test/test_diarize_api_v2.py +++ /dev/null @@ -1,49 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -import os -import sys -import unittest - -import deepaffects -from deepaffects import Audio -from deepaffects.rest import ApiException -from deepaffects.apis.diarize_api_v2 import DiarizeApiV2 -from .test_base_setup import DIR -import uuid - - -class TestDiarizeApiV2(unittest.TestCase): - """ DiarizeApiV2 unit test stubs """ - - def setUp(self): - deepaffects.configuration.api_key['apikey'] = os.environ['DEEPAFFECTS_API_KEY'] - self.webhook_url = os.environ["DEEPAFFECTS_API_WEBHOOK"] - self.api = deepaffects.apis.diarize_api_v2.DiarizeApiV2() - self.request_id = str(uuid.uuid4()) - - def tearDown(self): - pass - - def test_async_diarize_audio(self): - """ - Test case for diarize_audio - - Diarize an audio file - """ - test_conversation_audio = os.path.normpath(os.path.join(DIR, "data/happy.mp3")) - body = Audio.from_file(file_name=test_conversation_audio) - - api_response = self.api.async_diarize_audio(body=body, webhook=self.webhook_url, request_id=self.request_id) - self.assertTrue(api_response.request_id, self.request_id) - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_diarize_audio.py b/test/test_diarize_audio.py deleted file mode 100644 index c5e7794..0000000 --- a/test/test_diarize_audio.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -import os -import sys -import unittest - -import deepaffects -from deepaffects.rest import ApiException -from deepaffects.models.diarize_audio import DiarizeAudio - - -class TestDiarizeAudio(unittest.TestCase): - """ DiarizeAudio unit test stubs """ - - def setUp(self): - pass - - def tearDown(self): - pass - - def testDiarizeAudio(self): - """ - Test DiarizeAudio - """ - model = deepaffects.models.diarize_audio.DiarizeAudio() - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_emotion_api.py b/test/test_emotion_api.py deleted file mode 100644 index 932f283..0000000 --- a/test/test_emotion_api.py +++ /dev/null @@ -1,59 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: v1 -""" - -from __future__ import absolute_import - -import os -import sys -import unittest - -from deepaffects import Audio - -import deepaffects -from deepaffects.rest import ApiException -from deepaffects.apis.emotion_api import EmotionApi -from deepaffects.models.emotion_score import EmotionScore -from .test_base_setup import DIR, AudioTest - - -class TestEmotionApi(unittest.TestCase): - """ EmotionApi unit test stubs """ - - def setUp(self): - deepaffects.configuration.api_key['apikey'] = os.environ['DEEPAFFECTS_API_KEY'] - self.api = deepaffects.apis.emotion_api.EmotionApi() - - def tearDown(self): - pass - - def test_async_recognise_emotion(self): - """ - Test case for async_recognise_emotion - - Find emotion in an audio file - """ - pass - - def test_sync_recognise_emotion(self): - """ - Test case for sync_recognise_emotion - - Find emotion in an audio file - """ - test_happy_audio = os.path.normpath(os.path.join(DIR, "data/happy.mp3")) - body = Audio.from_file(file_name=test_happy_audio) - api_response = self.api.sync_recognise_emotion(body=body) - for obj in api_response: - if obj.emotion == 'Happy': - assert obj.score > 0.8 - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_emotion_score.py b/test/test_emotion_score.py deleted file mode 100644 index 3778a9e..0000000 --- a/test/test_emotion_score.py +++ /dev/null @@ -1,40 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -import os -import sys -import unittest - -import deepaffects -from deepaffects.rest import ApiException -from deepaffects.models.emotion_score import EmotionScore - - -class TestEmotionScore(unittest.TestCase): - """ EmotionScore unit test stubs """ - - def setUp(self): - pass - - def tearDown(self): - pass - - def testEmotionScore(self): - """ - Test EmotionScore - """ - model = deepaffects.models.emotion_score.EmotionScore() - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_featurize_api.py b/test/test_featurize_api.py deleted file mode 100644 index 8a41d98..0000000 --- a/test/test_featurize_api.py +++ /dev/null @@ -1,42 +0,0 @@ -# coding: utf-8 - -""" - DeepAffects - - OpenAPI Specification of DeepAffects APIs - - OpenAPI spec version: v1 -""" - - -from __future__ import absolute_import - -import os -import sys -import unittest - -import deepaffects -from deepaffects.rest import ApiException -from deepaffects.apis.featurize_api import FeaturizeApi - - -class TestFeaturizeApi(unittest.TestCase): - """ FeaturizeApi unit test stubs """ - - def setUp(self): - self.api = deepaffects.apis.featurize_api.FeaturizeApi() - - def tearDown(self): - pass - - def test_async_featurize_audio(self): - """ - Test case for featurize_audio - - featurize an audio file - """ - pass - - -if __name__ == '__main__': - unittest.main() From f4e5be857b121fe8e230b4df7855b379341b7adb Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 31 Jul 2019 17:17:59 +0530 Subject: [PATCH 02/11] add client for text emotion recognition --- deepaffects/__init__.py | 1 + deepaffects/text_emotion_recognition.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 deepaffects/__init__.py create mode 100644 deepaffects/text_emotion_recognition.py diff --git a/deepaffects/__init__.py b/deepaffects/__init__.py new file mode 100644 index 0000000..effe9df --- /dev/null +++ b/deepaffects/__init__.py @@ -0,0 +1 @@ +from .text_emotion_recognition import EmotionApi \ No newline at end of file diff --git a/deepaffects/text_emotion_recognition.py b/deepaffects/text_emotion_recognition.py new file mode 100644 index 0000000..d3707f1 --- /dev/null +++ b/deepaffects/text_emotion_recognition.py @@ -0,0 +1,19 @@ +import logging +import requests + +class EmotionApi(): + URL = 'https://proxy.api.deepaffects.com/text/generic/api/latest/sync/text_recognise_emotion?apikey=' + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + EmotionApi.URL = EmotionApi.URL + api_key + + def sync_text_recognise_emotion(self, texts): + if not isinstance(texts, list): + logging.warn('Batching multiple texts is much faster than running one by one.') + + output = requests.post(url=EmotionApi.URL, json={'content': texts}).json() + + return output + From 65aa88fd1f921843d96fd3f1c3b9194b43a14452 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 31 Jul 2019 18:37:44 +0530 Subject: [PATCH 03/11] send apikey through params --- deepaffects/text_emotion_recognition.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/deepaffects/text_emotion_recognition.py b/deepaffects/text_emotion_recognition.py index d3707f1..12e5d8e 100644 --- a/deepaffects/text_emotion_recognition.py +++ b/deepaffects/text_emotion_recognition.py @@ -2,18 +2,23 @@ import requests class EmotionApi(): - URL = 'https://proxy.api.deepaffects.com/text/generic/api/latest/sync/text_recognise_emotion?apikey=' + URL = 'https://proxy.api.deepaffects.com/text/generic/api/latest/sync/text_recognise_emotion' + API_KEY = None def __init__(self, api_key): if not api_key: logging.error('"' + str(api_key) + '" is an invalid API key') - EmotionApi.URL = EmotionApi.URL + api_key + EmotionApi.API_KEY = api_key def sync_text_recognise_emotion(self, texts): if not isinstance(texts, list): logging.warn('Batching multiple texts is much faster than running one by one.') - output = requests.post(url=EmotionApi.URL, json={'content': texts}).json() + output = requests.post( + url=EmotionApi.URL, + json={'content': texts}, + params={'apikey': EmotionApi.API_KEY} + ).json() return output From d0161e9205ad5513a7dfc862433f3744f10cc40d Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 31 Jul 2019 18:40:47 +0530 Subject: [PATCH 04/11] add punctuation api --- deepaffects/__init__.py | 3 ++- deepaffects/smart_punctuation.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 deepaffects/smart_punctuation.py diff --git a/deepaffects/__init__.py b/deepaffects/__init__.py index effe9df..a5e29a9 100644 --- a/deepaffects/__init__.py +++ b/deepaffects/__init__.py @@ -1 +1,2 @@ -from .text_emotion_recognition import EmotionApi \ No newline at end of file +from .text_emotion_recognition import EmotionApi +from .smart_punctuation import PunctApi \ No newline at end of file diff --git a/deepaffects/smart_punctuation.py b/deepaffects/smart_punctuation.py new file mode 100644 index 0000000..2e84cf1 --- /dev/null +++ b/deepaffects/smart_punctuation.py @@ -0,0 +1,20 @@ +import logging +import requests + +class PunctApi(): + URL = 'https://proxy.api.deepaffects.com/text/generic/api/v1/async/punctuate' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + PunctApi.API_KEY = api_key + + def async_text_punctuate(self, texts): + if not isinstance(texts, list): + logging.warn('Batching multiple texts is much faster than running one by one.') + texts = [texts] + + output = requests.post(url=PunctApi.URL, json={'texts': texts}, params={'apikey': PunctApi.API_KEY}).json() + + return output \ No newline at end of file From 582f6c9b7d5e1a9b8afe4b2b5cd1acb1c9b661a8 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 31 Jul 2019 18:54:38 +0530 Subject: [PATCH 05/11] add optional webhook and request_id params for punct appi --- deepaffects/smart_punctuation.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/deepaffects/smart_punctuation.py b/deepaffects/smart_punctuation.py index 2e84cf1..419fc25 100644 --- a/deepaffects/smart_punctuation.py +++ b/deepaffects/smart_punctuation.py @@ -10,11 +10,20 @@ def __init__(self, api_key): PunctApi.API_KEY = api_key - def async_text_punctuate(self, texts): + def async_text_punctuate(self, texts, webhook=None, request_id=None): if not isinstance(texts, list): logging.warn('Batching multiple texts is much faster than running one by one.') texts = [texts] - output = requests.post(url=PunctApi.URL, json={'texts': texts}, params={'apikey': PunctApi.API_KEY}).json() + if not webhook: + logging.warn('Consider using webhooks for async requests.') + + params = {'apikey': PunctApi.API_KEY} + if webhook: + params['webhook'] = webhook + if request_id: + params['request_id'] = request_id + + output = requests.post(url=PunctApi.URL, json={'texts': texts}, params=params).json() return output \ No newline at end of file From da5780d11e63258067bf0dcd663f9890ecb63639 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 21 Aug 2019 15:40:14 +0530 Subject: [PATCH 06/11] add speaker_diarization api --- deepaffects/speaker_diarization.py | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 deepaffects/speaker_diarization.py diff --git a/deepaffects/speaker_diarization.py b/deepaffects/speaker_diarization.py new file mode 100644 index 0000000..fddd759 --- /dev/null +++ b/deepaffects/speaker_diarization.py @@ -0,0 +1,85 @@ +import logging +import requests +import base64 + +PYAV = False +# try: +# import av +# PYAV = True +# except Exception as ex: +# logging.warn('Install https://github.com/mikeboers/PyAV for ease of use.') + +allowed_values = { + 'audioType': {'callcenter', 'meeting', 'earningscalls', 'interview', 'media-broadcast'} +} + +class DiarizationApi(): + URL = 'https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarize' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + DiarizationApi.API_KEY = api_key + + def async_audio_diarize( + self, + audio_file_path=None, url=None, + encoding=None, sampleRate=None, + languageCode='en-US', separateSpeakerPerChannel=False, + speakerCount=-1, audioType='callcenter', + speakerIds=[], doVad=False, source=None, + webhook=None, request_id=None + ): + if not (audio_file_path or url): + logging.error("One of audio_file_path or url must be supplied.") + + if audio_file_path and url: + logging.error("Only one of audio_file_path and url must be supplied. Both cannot be true at the same time.") + + if not webhook: + logging.warn('Consider using webhooks for async requests.') + + if audioType not in allowed_values['audioType']: + logging.warn("The supplied audioType '" + str(audioType) + "' is not valid. Defaulting to audioType=callcenter") + audioType = 'callcenter' + + params = {'apikey': DiarizationApi.API_KEY} + if webhook: + params['webhook'] = webhook + if request_id: + params['request_id'] = request_id + + if not PYAV: + if not encoding: + logging.error("Encoding is not valid") + if not sampleRate: + logging.error("sampleRate is not valid") + + else: + pass + + request_json = {} + if audio_file_path: + content = open(audio_file_path, 'rb').read() + content = base64.b64encode(content).decode('utf-8') + request_json['content'] = content + + elif url: + request_json['url'] = url + + request_json['encoding'] = encoding + request_json['sampleRate'] = sampleRate + request_json['languageCode'] = languageCode + request_json['separateSpeakerPerChannel'] = separateSpeakerPerChannel + request_json['speakerCount'] = speakerCount + request_json['audioType'] = audioType + request_json['speakerIds'] = speakerIds + request_json['doVad'] = doVad + + if source: + request_json['source'] = source + + output = requests.post(url=DiarizationApi.URL, json=request_json, params=params).json() + + return output \ No newline at end of file From be962498dbd854ee12618bed8653ddbb79fa2b11 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Wed, 21 Aug 2019 16:02:33 +0530 Subject: [PATCH 07/11] add vad client --- deepaffects/voice_activity_detection.py | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 deepaffects/voice_activity_detection.py diff --git a/deepaffects/voice_activity_detection.py b/deepaffects/voice_activity_detection.py new file mode 100644 index 0000000..b631e5b --- /dev/null +++ b/deepaffects/voice_activity_detection.py @@ -0,0 +1,68 @@ +import logging +import requests +import base64 + +PYAV = False +# try: +# import av +# PYAV = True +# except Exception as ex: +# logging.warn('Install https://github.com/mikeboers/PyAV for ease of use.') + +class VADApi(): + URL = 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/vad' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + VADApi.API_KEY = api_key + + def async_voice_activity_detect( + self, + audio_file_path=None, url=None, + encoding=None, sampleRate=None, + languageCode='en-US', minNonSpeechDuration=0, + webhook=None, request_id=None + ): + if not (audio_file_path or url): + logging.error("One of audio_file_path or url must be supplied.") + + if audio_file_path and url: + logging.error("Only one of audio_file_path and url must be supplied. Both cannot be true at the same time.") + + if not webhook: + logging.warn('Consider using webhooks for async requests.') + + params = {'apikey': VADApi.API_KEY} + if webhook: + params['webhook'] = webhook + if request_id: + params['request_id'] = request_id + + if not PYAV: + if not encoding: + logging.error("Encoding is not valid") + if not sampleRate: + logging.error("sampleRate is not valid") + + else: + pass + + request_json = {} + if audio_file_path: + content = open(audio_file_path, 'rb').read() + content = base64.b64encode(content).decode('utf-8') + request_json['content'] = content + + elif url: + request_json['url'] = url + + request_json['encoding'] = encoding + request_json['sampleRate'] = sampleRate + request_json['languageCode'] = languageCode + request_json['minNonSpeechDuration'] = minNonSpeechDuration + + output = requests.post(url=VADApi.URL, json=request_json, params=params).json() + + return output \ No newline at end of file From b1135a8d76e6eda43620616e999aeac0cba09aaa Mon Sep 17 00:00:00 2001 From: Praneeth Date: Mon, 30 Sep 2019 12:47:31 +0530 Subject: [PATCH 08/11] add asr client --- deepaffects/asr.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 deepaffects/asr.py diff --git a/deepaffects/asr.py b/deepaffects/asr.py new file mode 100644 index 0000000..7afac75 --- /dev/null +++ b/deepaffects/asr.py @@ -0,0 +1,85 @@ +import logging +import requests +import base64 + +PYAV = False +# try: +# import av +# PYAV = True +# except Exception as ex: +# logging.warn('Install https://github.com/mikeboers/PyAV for ease of use.') + +allowed_values = { + 'audioType': {'callcenter', 'meeting', 'earningscalls', 'interview', 'media-broadcast'} +} + +class AsrApi(): + URL = 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + AsrApi.API_KEY = api_key + + def async_asr( + self, + audio_file_path=None, url=None, + encoding=None, sampleRate=None, + languageCode='en-US', separateSpeakerPerChannel=False, + speakerCount=-1, audioType='callcenter', + enablePunctuation=True, enableSpeakerDiarization=False, source=None, + webhook=None, request_id=None + ): + if not (audio_file_path or url): + logging.error("One of audio_file_path or url must be supplied.") + + if audio_file_path and url: + logging.error("Only one of audio_file_path and url must be supplied. Both cannot be true at the same time.") + + if not webhook: + logging.warn('Consider using webhooks for async requests.') + + if audioType not in allowed_values['audioType']: + logging.warn("The supplied audioType '" + str(audioType) + "' is not valid. Defaulting to audioType=callcenter") + audioType = 'callcenter' + + params = {'apikey': AsrApi.API_KEY} + if webhook: + params['webhook'] = webhook + if request_id: + params['request_id'] = request_id + + if not PYAV: + if not encoding: + logging.error("Encoding is not valid") + if not sampleRate: + logging.error("sampleRate is not valid") + + else: + pass + + request_json = {} + if audio_file_path: + content = open(audio_file_path, 'rb').read() + content = base64.b64encode(content).decode('utf-8') + request_json['content'] = content + + elif url: + request_json['url'] = url + + request_json['encoding'] = encoding + request_json['sampleRate'] = sampleRate + request_json['languageCode'] = languageCode + request_json['separateSpeakerPerChannel'] = separateSpeakerPerChannel + request_json['speakerCount'] = speakerCount + request_json['audioType'] = audioType + request_json['enablePunctuation'] = enablePunctuation + request_json['enableSpeakerDiarization'] = enableSpeakerDiarization + + if source: + request_json['source'] = source + + output = requests.post(url=AsrApi.URL, json=request_json, params=params).json() + + return output \ No newline at end of file From 9281654c29087c8af179cf8aa4e8edd71230c2a8 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Mon, 30 Sep 2019 13:08:34 +0530 Subject: [PATCH 09/11] remove speakerCount param from asr client --- deepaffects/asr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepaffects/asr.py b/deepaffects/asr.py index 7afac75..708aa29 100644 --- a/deepaffects/asr.py +++ b/deepaffects/asr.py @@ -27,7 +27,7 @@ def async_asr( audio_file_path=None, url=None, encoding=None, sampleRate=None, languageCode='en-US', separateSpeakerPerChannel=False, - speakerCount=-1, audioType='callcenter', + audioType='callcenter', enablePunctuation=True, enableSpeakerDiarization=False, source=None, webhook=None, request_id=None ): From 52ba5a5c4d33d6398b0d93235a3bb38c591ce645 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Mon, 30 Sep 2019 13:13:09 +0530 Subject: [PATCH 10/11] add interaction_analytics api client --- deepaffects/interaction_analytics.py | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 deepaffects/interaction_analytics.py diff --git a/deepaffects/interaction_analytics.py b/deepaffects/interaction_analytics.py new file mode 100644 index 0000000..00fb39e --- /dev/null +++ b/deepaffects/interaction_analytics.py @@ -0,0 +1,84 @@ +import logging +import requests +import base64 + +PYAV = False +# try: +# import av +# PYAV = True +# except Exception as ex: +# logging.warn('Install https://github.com/mikeboers/PyAV for ease of use.') + +allowed_values = { + 'audioType': {'callcenter', 'meeting', 'earningscalls', 'interview', 'media-broadcast'} +} + +class AnalyticsApi(): + URL = 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/analytics/interaction' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + AnalyticsApi.API_KEY = api_key + + def async_analytics( + self, + audio_file_path=None, url=None, + encoding=None, sampleRate=None, + languageCode='en-US', separateSpeakerPerChannel=False, + speakerCount=-1, audioType='callcenter', + metrics=['all'], source=None, + webhook=None, request_id=None + ): + if not (audio_file_path or url): + logging.error("One of audio_file_path or url must be supplied.") + + if audio_file_path and url: + logging.error("Only one of audio_file_path and url must be supplied. Both cannot be true at the same time.") + + if not webhook: + logging.warn('Consider using webhooks for async requests.') + + if audioType not in allowed_values['audioType']: + logging.warn("The supplied audioType '" + str(audioType) + "' is not valid. Defaulting to audioType=callcenter") + audioType = 'callcenter' + + params = {'apikey': AnalyticsApi.API_KEY} + if webhook: + params['webhook'] = webhook + if request_id: + params['request_id'] = request_id + + if not PYAV: + if not encoding: + logging.error("Encoding is not valid") + if not sampleRate: + logging.error("sampleRate is not valid") + + else: + pass + + request_json = {} + if audio_file_path: + content = open(audio_file_path, 'rb').read() + content = base64.b64encode(content).decode('utf-8') + request_json['content'] = content + + elif url: + request_json['url'] = url + + request_json['encoding'] = encoding + request_json['sampleRate'] = sampleRate + request_json['languageCode'] = languageCode + request_json['separateSpeakerPerChannel'] = separateSpeakerPerChannel + request_json['speakerCount'] = speakerCount + request_json['audioType'] = audioType + request_json['metrics'] = metrics + + if source: + request_json['source'] = source + + output = requests.post(url=AnalyticsApi.URL, json=request_json, params=params).json() + + return output \ No newline at end of file From 65a65798f7f2946a954c307591a28bae49f600d7 Mon Sep 17 00:00:00 2001 From: Praneeth Date: Mon, 30 Sep 2019 13:30:59 +0530 Subject: [PATCH 11/11] add speaker enrollment client --- deepaffects/speaker_enrollment.py | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 deepaffects/speaker_enrollment.py diff --git a/deepaffects/speaker_enrollment.py b/deepaffects/speaker_enrollment.py new file mode 100644 index 0000000..08a1bd7 --- /dev/null +++ b/deepaffects/speaker_enrollment.py @@ -0,0 +1,53 @@ +import logging +import requests +import base64 + +PYAV = False +# try: +# import av +# PYAV = True +# except Exception as ex: +# logging.warn('Install https://github.com/mikeboers/PyAV for ease of use.') + +allowed_values = { + 'speaker_id': set('1234567890_qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM') +} + +class SpeakerEnroll(): + URL = 'https://proxy.api.deepaffects.com/audio/generic/api/v2/sync/diarization/enroll' + API_KEY = None + def __init__(self, api_key): + if not api_key: + logging.error('"' + str(api_key) + '" is an invalid API key') + + SpeakerEnroll.API_KEY = api_key + + def enroll_speaker( + self, + audio_file_path=None, + encoding=None, sampleRate=None, + languageCode='en-US', + speakerId=None + ): + if not (audio_file_path and speakerId): + logging.error("audio_file_path must be supplied.") + + if [c for c in speakerId if c not in allowed_values['speaker_id']]: + logging.error("Only english alphabet, numbers and _ are allowed in speakerId") + + params = {'apikey': SpeakerEnroll.API_KEY} + + request_json = {} + if audio_file_path: + content = open(audio_file_path, 'rb').read() + content = base64.b64encode(content).decode('utf-8') + request_json['content'] = content + + request_json['encoding'] = encoding + request_json['sampleRate'] = sampleRate + request_json['languageCode'] = languageCode + request_json['speakerId'] = speakerId + + output = requests.post(url=SpeakerEnroll.URL, json=request_json, params=params).json() + + return output \ No newline at end of file