diff --git a/sdk/storage/azure-storage-blob/CHANGELOG.md b/sdk/storage/azure-storage-blob/CHANGELOG.md index 37bcb49eb308..40c2be5a7f7f 100644 --- a/sdk/storage/azure-storage-blob/CHANGELOG.md +++ b/sdk/storage/azure-storage-blob/CHANGELOG.md @@ -1,5 +1,7 @@ # Release History +## 12.9.0b1 (Unreleased) + ## 12.8.1 (2021-04-20) **Fixes** - Fixed retry on large block upload @@ -13,7 +15,6 @@ - Added retry for blob download (#17974, #10572) - Fixed encryption algorithm hardcoded setting (#17835) - ## 12.8.0 (2021-03-01) **Stable release of preview features** - Added `ContainerClient.exists()` method diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py index dff7e12276c2..eed3bbde964c 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py @@ -15,6 +15,8 @@ # pylint: disable=unused-import,ungrouped-imports from typing import Any + from azure.core.pipeline.transport import HttpRequest, HttpResponse + from ._configuration import AzureBlobStorageConfiguration from .operations import ServiceOperations from .operations import ContainerOperations @@ -77,6 +79,24 @@ def __init__( self.block_blob = BlockBlobOperations( self._client, self._config, self._serialize, self._deserialize) + def _send_request(self, http_request, **kwargs): + # type: (HttpRequest, Any) -> HttpResponse + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.HttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + def close(self): # type: () -> None self._client.close() diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py index fb74f9ee4f8b..0e0d578e8aa6 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py @@ -38,7 +38,7 @@ def __init__( super(AzureBlobStorageConfiguration, self).__init__(**kwargs) self.url = url - self.version = "2020-06-12" + self.version = "2020-08-04" kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py index b53703478e99..77935aaf1e03 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py @@ -9,6 +9,7 @@ from typing import Any from azure.core import AsyncPipelineClient +from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest from msrest import Deserializer, Serializer from ._configuration import AzureBlobStorageConfiguration @@ -72,6 +73,23 @@ def __init__( self.block_blob = BlockBlobOperations( self._client, self._config, self._serialize, self._deserialize) + async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + async def close(self) -> None: await self._client.close() diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py index 1924efa17196..c230fe87c2d9 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py @@ -33,7 +33,7 @@ def __init__( super(AzureBlobStorageConfiguration, self).__init__(**kwargs) self.url = url - self.version = "2020-06-12" + self.version = "2020-08-04" kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py index 934b7207a81f..2c0c852b66f1 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- import datetime -from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar +from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union import warnings from azure.core.exceptions import ClientAuthenticationError, HttpResponseError, ResourceExistsError, ResourceNotFoundError, map_error @@ -47,6 +47,9 @@ async def create( metadata: Optional[str] = None, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -75,6 +78,13 @@ async def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -191,6 +201,12 @@ async def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -199,7 +215,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -368,7 +384,7 @@ async def append_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -568,7 +584,7 @@ async def append_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -682,7 +698,7 @@ async def seal( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py index 0f296df8c98c..56e32017b0e6 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py @@ -176,7 +176,7 @@ async def download( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -220,6 +220,9 @@ async def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if response.status_code == 206: @@ -263,6 +266,9 @@ async def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if cls: @@ -388,7 +394,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -438,6 +444,9 @@ async def get_properties( response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) if cls: return cls(pipeline_response, None, response_headers) @@ -568,7 +577,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -691,7 +700,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -798,7 +807,7 @@ async def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -989,7 +998,7 @@ async def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1060,7 +1069,7 @@ async def undelete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1137,7 +1146,7 @@ async def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1268,7 +1277,7 @@ async def set_http_headers( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1285,6 +1294,237 @@ async def set_http_headers( set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + async def set_immutability_policy( + self, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, + **kwargs + ) -> None: + """The Set Immutability Policy operation sets the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param modified_access_conditions: Parameter group. + :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + + _if_unmodified_since = None + if modified_access_conditions is not None: + _if_unmodified_since = modified_access_conditions.if_unmodified_since + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.set_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + if _if_unmodified_since is not None: + header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + async def delete_immutability_policy( + self, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """The Delete Immutability Policy operation deletes the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.delete_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + async def set_legal_hold( + self, + legal_hold: bool, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """The Set Legal Hold operation sets a legal hold on the blob. + + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "legalhold" + accept = "application/xml" + + # Construct URL + url = self.set_legal_hold.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + async def set_metadata( self, timeout: Optional[int] = None, @@ -1408,7 +1648,7 @@ async def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1524,7 +1764,7 @@ async def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1627,7 +1867,7 @@ async def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1729,7 +1969,7 @@ async def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1838,7 +2078,7 @@ async def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1948,7 +2188,7 @@ async def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2087,7 +2327,7 @@ async def create_snapshot( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2116,6 +2356,9 @@ async def start_copy_from_url( request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, seal_blob: Optional[bool] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None, modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, @@ -2153,6 +2396,13 @@ async def start_copy_from_url( :param seal_blob: Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. :type seal_blob: bool + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2247,6 +2497,12 @@ async def start_copy_from_url( header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') if seal_blob is not None: header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2255,7 +2511,7 @@ async def start_copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2283,6 +2539,9 @@ async def copy_from_url( request_id_parameter: Optional[str] = None, source_content_md5: Optional[bytearray] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None, modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, @@ -2318,6 +2577,13 @@ async def copy_from_url( :type source_content_md5: bytearray :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2408,6 +2674,12 @@ async def copy_from_url( header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2416,7 +2688,7 @@ async def copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2508,7 +2780,7 @@ async def abort_copy_from_url( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2622,7 +2894,7 @@ async def set_tier( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2684,7 +2956,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2824,7 +3096,7 @@ async def query( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2991,7 +3263,7 @@ async def get_tags( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3107,7 +3379,7 @@ async def set_tags( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py index e90eacd48c9e..a08b8e8124d9 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py @@ -50,6 +50,9 @@ async def upload( tier: Optional[Union[str, "_models.AccessTierOptional"]] = None, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -89,6 +92,13 @@ async def upload( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -210,6 +220,12 @@ async def upload( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -221,7 +237,7 @@ async def upload( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -459,7 +475,7 @@ async def put_blob_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -596,7 +612,7 @@ async def stage_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -754,7 +770,7 @@ async def stage_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -783,6 +799,9 @@ async def commit_block_list( tier: Optional[Union[str, "_models.AccessTierOptional"]] = None, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -825,6 +844,13 @@ async def commit_block_list( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -947,6 +973,12 @@ async def commit_block_list( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -959,7 +991,7 @@ async def commit_block_list( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1067,7 +1099,7 @@ async def get_block_list( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py index 904fea36f6a3..bec837429209 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py @@ -125,7 +125,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -205,7 +205,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -224,6 +224,7 @@ async def get_properties( response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold')) response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope')) response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override')) + response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled')) if cls: return cls(pipeline_response, None, response_headers) @@ -306,7 +307,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -404,7 +405,7 @@ async def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -486,7 +487,7 @@ async def get_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -601,7 +602,7 @@ async def set_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -685,7 +686,7 @@ async def restore( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -765,7 +766,7 @@ async def rename( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -852,7 +853,7 @@ async def submit_batch( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -953,7 +954,7 @@ async def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1046,7 +1047,7 @@ async def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1138,7 +1139,7 @@ async def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1238,7 +1239,7 @@ async def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1337,7 +1338,7 @@ async def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1442,7 +1443,7 @@ async def list_blob_flat_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1554,7 +1555,7 @@ async def list_blob_hierarchy_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1614,7 +1615,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py index 338ff69e3adc..bd18d797d8bd 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py @@ -177,7 +177,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -375,7 +375,7 @@ async def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -488,7 +488,7 @@ async def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -612,7 +612,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -719,7 +719,7 @@ async def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py index da920b5fdc67..691c608c0915 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py @@ -50,6 +50,9 @@ async def create( blob_sequence_number: Optional[int] = 0, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -87,6 +90,13 @@ async def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -208,6 +218,12 @@ async def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -216,7 +232,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -394,7 +410,7 @@ async def upload_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -554,7 +570,7 @@ async def clear_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -753,7 +769,7 @@ async def upload_pages_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -876,7 +892,7 @@ async def get_page_ranges( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1015,7 +1031,7 @@ async def get_page_ranges_diff( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1150,7 +1166,7 @@ async def resize( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1267,7 +1283,7 @@ async def update_sequence_number( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1374,7 +1390,7 @@ async def copy_incremental( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py index 91a064680562..f293d00b5b8b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py @@ -104,7 +104,7 @@ async def set_properties( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -174,7 +174,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -247,7 +247,7 @@ async def get_statistics( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -350,7 +350,7 @@ async def list_containers_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -430,7 +430,7 @@ async def get_user_delegation_key( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -489,7 +489,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -577,7 +577,7 @@ async def submit_batch( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -674,7 +674,7 @@ async def filter_blobs( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py index 3d33d25bb90f..3efc69e63929 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py @@ -31,7 +31,7 @@ from ._models_py3 import CpkInfo from ._models_py3 import CpkScopeInfo from ._models_py3 import DataLakeStorageError - from ._models_py3 import DataLakeStorageErrorAutoGenerated + from ._models_py3 import DataLakeStorageErrorError from ._models_py3 import DelimitedTextConfiguration from ._models_py3 import DirectoryHttpHeaders from ._models_py3 import FilterBlobItem @@ -85,7 +85,7 @@ from ._models import CpkInfo # type: ignore from ._models import CpkScopeInfo # type: ignore from ._models import DataLakeStorageError # type: ignore - from ._models import DataLakeStorageErrorAutoGenerated # type: ignore + from ._models import DataLakeStorageErrorError # type: ignore from ._models import DelimitedTextConfiguration # type: ignore from ._models import DirectoryHttpHeaders # type: ignore from ._models import FilterBlobItem # type: ignore @@ -122,6 +122,7 @@ AccountKind, ArchiveStatus, BlobExpiryOptions, + BlobImmutabilityPolicyMode, BlobType, BlockListType, CopyStatusType, @@ -168,7 +169,7 @@ 'CpkInfo', 'CpkScopeInfo', 'DataLakeStorageError', - 'DataLakeStorageErrorAutoGenerated', + 'DataLakeStorageErrorError', 'DelimitedTextConfiguration', 'DirectoryHttpHeaders', 'FilterBlobItem', @@ -203,6 +204,7 @@ 'AccountKind', 'ArchiveStatus', 'BlobExpiryOptions', + 'BlobImmutabilityPolicyMode', 'BlobType', 'BlockListType', 'CopyStatusType', diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py index 5d03a102b866..456b148b93f8 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py @@ -97,6 +97,12 @@ class BlobExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): RELATIVE_TO_NOW = "RelativeToNow" ABSOLUTE = "Absolute" +class BlobImmutabilityPolicyMode(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): + + UNLOCKED = "Unlocked" + LOCKED = "Locked" + MUTABLE = "Mutable" + class BlobType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): BLOCK_BLOB = "BlockBlob" @@ -161,6 +167,8 @@ class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): UNCOMMITTEDBLOBS = "uncommittedblobs" VERSIONS = "versions" TAGS = "tags" + IMMUTABILITYPOLICY = "immutabilitypolicy" + LEGALHOLD = "legalhold" class ListContainersIncludeType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): @@ -198,6 +206,7 @@ class QueryFormatType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): DELIMITED = "delimited" JSON = "json" ARROW = "arrow" + PARQUET = "parquet" class RehydratePriority(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): """If an object is in rehydrate pending state then this header is returned with priority of diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py index fadcdd561759..b23282f35437 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py @@ -437,6 +437,12 @@ class BlobPropertiesInternal(msrest.serialization.Model): :type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority :param last_accessed_on: :type last_accessed_on: ~datetime.datetime + :param immutability_policy_expires_on: + :type immutability_policy_expires_on: ~datetime.datetime + :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable". + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: + :type legal_hold: bool """ _validation = { @@ -482,6 +488,9 @@ class BlobPropertiesInternal(msrest.serialization.Model): 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, 'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'}, 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'}, + 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'}, + 'legal_hold': {'key': 'LegalHold', 'type': 'bool'}, } _xml_map = { 'name': 'Properties' @@ -529,6 +538,9 @@ def __init__( self.is_sealed = kwargs.get('is_sealed', None) self.rehydrate_priority = kwargs.get('rehydrate_priority', None) self.last_accessed_on = kwargs.get('last_accessed_on', None) + self.immutability_policy_expires_on = kwargs.get('immutability_policy_expires_on', None) + self.immutability_policy_mode = kwargs.get('immutability_policy_mode', None) + self.legal_hold = kwargs.get('legal_hold', None) class BlobTag(msrest.serialization.Model): @@ -600,7 +612,7 @@ class Block(msrest.serialization.Model): :param name: Required. The base64 encoded block ID. :type name: str :param size: Required. The block size in bytes. - :type size: int + :type size: long """ _validation = { @@ -610,7 +622,7 @@ class Block(msrest.serialization.Model): _attribute_map = { 'name': {'key': 'Name', 'type': 'str'}, - 'size': {'key': 'Size', 'type': 'int'}, + 'size': {'key': 'Size', 'type': 'long'}, } def __init__( @@ -809,6 +821,9 @@ class ContainerProperties(msrest.serialization.Model): :type deleted_time: ~datetime.datetime :param remaining_retention_days: :type remaining_retention_days: int + :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this + container. + :type is_version_level_worm_enabled: bool """ _validation = { @@ -829,6 +844,7 @@ class ContainerProperties(msrest.serialization.Model): 'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'}, 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'}, } def __init__( @@ -848,6 +864,7 @@ def __init__( self.prevent_encryption_scope_override = kwargs.get('prevent_encryption_scope_override', None) self.deleted_time = kwargs.get('deleted_time', None) self.remaining_retention_days = kwargs.get('remaining_retention_days', None) + self.is_version_level_worm_enabled = kwargs.get('is_version_level_worm_enabled', None) class CorsRule(msrest.serialization.Model): @@ -961,12 +978,11 @@ class DataLakeStorageError(msrest.serialization.Model): """DataLakeStorageError. :param data_lake_storage_error_details: The service error response object. - :type data_lake_storage_error_details: - ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated + :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError """ _attribute_map = { - 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'}, + 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'}, } def __init__( @@ -977,7 +993,7 @@ def __init__( self.data_lake_storage_error_details = kwargs.get('data_lake_storage_error_details', None) -class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model): +class DataLakeStorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -995,7 +1011,7 @@ def __init__( self, **kwargs ): - super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs) + super(DataLakeStorageErrorError, self).__init__(**kwargs) self.code = kwargs.get('code', None) self.message = kwargs.get('message', None) @@ -1617,7 +1633,7 @@ class QueryFormat(msrest.serialization.Model): """QueryFormat. :param type: The quick query format type. Possible values include: "delimited", "json", - "arrow". + "arrow", "parquet". :type type: str or ~azure.storage.blob.models.QueryFormatType :param delimited_text_configuration: delimited text configuration. :type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration @@ -1625,6 +1641,8 @@ class QueryFormat(msrest.serialization.Model): :type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration :param arrow_configuration: arrow configuration. :type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration + :param parquet_text_configuration: Any object. + :type parquet_text_configuration: object """ _attribute_map = { @@ -1632,6 +1650,7 @@ class QueryFormat(msrest.serialization.Model): 'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'}, 'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'}, 'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'}, + 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'}, } def __init__( @@ -1643,6 +1662,7 @@ def __init__( self.delimited_text_configuration = kwargs.get('delimited_text_configuration', None) self.json_text_configuration = kwargs.get('json_text_configuration', None) self.arrow_configuration = kwargs.get('arrow_configuration', None) + self.parquet_text_configuration = kwargs.get('parquet_text_configuration', None) class QueryRequest(msrest.serialization.Model): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py index 2ed0d23fd172..27eb38626f74 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py @@ -483,6 +483,12 @@ class BlobPropertiesInternal(msrest.serialization.Model): :type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority :param last_accessed_on: :type last_accessed_on: ~datetime.datetime + :param immutability_policy_expires_on: + :type immutability_policy_expires_on: ~datetime.datetime + :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable". + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: + :type legal_hold: bool """ _validation = { @@ -528,6 +534,9 @@ class BlobPropertiesInternal(msrest.serialization.Model): 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, 'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'}, 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'}, + 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'}, + 'legal_hold': {'key': 'LegalHold', 'type': 'bool'}, } _xml_map = { 'name': 'Properties' @@ -573,6 +582,9 @@ def __init__( is_sealed: Optional[bool] = None, rehydrate_priority: Optional[Union[str, "RehydratePriority"]] = None, last_accessed_on: Optional[datetime.datetime] = None, + immutability_policy_expires_on: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, **kwargs ): super(BlobPropertiesInternal, self).__init__(**kwargs) @@ -613,6 +625,9 @@ def __init__( self.is_sealed = is_sealed self.rehydrate_priority = rehydrate_priority self.last_accessed_on = last_accessed_on + self.immutability_policy_expires_on = immutability_policy_expires_on + self.immutability_policy_mode = immutability_policy_mode + self.legal_hold = legal_hold class BlobTag(msrest.serialization.Model): @@ -689,7 +704,7 @@ class Block(msrest.serialization.Model): :param name: Required. The base64 encoded block ID. :type name: str :param size: Required. The block size in bytes. - :type size: int + :type size: long """ _validation = { @@ -699,7 +714,7 @@ class Block(msrest.serialization.Model): _attribute_map = { 'name': {'key': 'Name', 'type': 'str'}, - 'size': {'key': 'Size', 'type': 'int'}, + 'size': {'key': 'Size', 'type': 'long'}, } def __init__( @@ -920,6 +935,9 @@ class ContainerProperties(msrest.serialization.Model): :type deleted_time: ~datetime.datetime :param remaining_retention_days: :type remaining_retention_days: int + :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this + container. + :type is_version_level_worm_enabled: bool """ _validation = { @@ -940,6 +958,7 @@ class ContainerProperties(msrest.serialization.Model): 'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'}, 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'}, } def __init__( @@ -957,6 +976,7 @@ def __init__( prevent_encryption_scope_override: Optional[bool] = None, deleted_time: Optional[datetime.datetime] = None, remaining_retention_days: Optional[int] = None, + is_version_level_worm_enabled: Optional[bool] = None, **kwargs ): super(ContainerProperties, self).__init__(**kwargs) @@ -972,6 +992,7 @@ def __init__( self.prevent_encryption_scope_override = prevent_encryption_scope_override self.deleted_time = deleted_time self.remaining_retention_days = remaining_retention_days + self.is_version_level_worm_enabled = is_version_level_worm_enabled class CorsRule(msrest.serialization.Model): @@ -1097,25 +1118,24 @@ class DataLakeStorageError(msrest.serialization.Model): """DataLakeStorageError. :param data_lake_storage_error_details: The service error response object. - :type data_lake_storage_error_details: - ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated + :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError """ _attribute_map = { - 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'}, + 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'}, } def __init__( self, *, - data_lake_storage_error_details: Optional["DataLakeStorageErrorAutoGenerated"] = None, + data_lake_storage_error_details: Optional["DataLakeStorageErrorError"] = None, **kwargs ): super(DataLakeStorageError, self).__init__(**kwargs) self.data_lake_storage_error_details = data_lake_storage_error_details -class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model): +class DataLakeStorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -1136,7 +1156,7 @@ def __init__( message: Optional[str] = None, **kwargs ): - super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs) + super(DataLakeStorageErrorError, self).__init__(**kwargs) self.code = code self.message = message @@ -1836,7 +1856,7 @@ class QueryFormat(msrest.serialization.Model): """QueryFormat. :param type: The quick query format type. Possible values include: "delimited", "json", - "arrow". + "arrow", "parquet". :type type: str or ~azure.storage.blob.models.QueryFormatType :param delimited_text_configuration: delimited text configuration. :type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration @@ -1844,6 +1864,8 @@ class QueryFormat(msrest.serialization.Model): :type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration :param arrow_configuration: arrow configuration. :type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration + :param parquet_text_configuration: Any object. + :type parquet_text_configuration: object """ _attribute_map = { @@ -1851,6 +1873,7 @@ class QueryFormat(msrest.serialization.Model): 'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'}, 'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'}, 'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'}, + 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'}, } def __init__( @@ -1860,6 +1883,7 @@ def __init__( delimited_text_configuration: Optional["DelimitedTextConfiguration"] = None, json_text_configuration: Optional["JsonTextConfiguration"] = None, arrow_configuration: Optional["ArrowConfiguration"] = None, + parquet_text_configuration: Optional[object] = None, **kwargs ): super(QueryFormat, self).__init__(**kwargs) @@ -1867,6 +1891,7 @@ def __init__( self.delimited_text_configuration = delimited_text_configuration self.json_text_configuration = json_text_configuration self.arrow_configuration = arrow_configuration + self.parquet_text_configuration = parquet_text_configuration class QueryRequest(msrest.serialization.Model): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py index 0825fcf791bb..e44a8900f5b3 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: # pylint: disable=unused-import,ungrouped-imports - from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar + from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union T = TypeVar('T') ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] @@ -51,6 +51,9 @@ def create( metadata=None, # type: Optional[str] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -80,6 +83,13 @@ def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -196,6 +206,12 @@ def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -204,7 +220,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -374,7 +390,7 @@ def append_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -575,7 +591,7 @@ def append_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -690,7 +706,7 @@ def seal( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py index a72d4dcd94c8..22fa229cb28f 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py @@ -181,7 +181,7 @@ def download( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -225,6 +225,9 @@ def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if response.status_code == 206: @@ -268,6 +271,9 @@ def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if cls: @@ -394,7 +400,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -444,6 +450,9 @@ def get_properties( response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) if cls: return cls(pipeline_response, None, response_headers) @@ -575,7 +584,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -699,7 +708,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -807,7 +816,7 @@ def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -999,7 +1008,7 @@ def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1071,7 +1080,7 @@ def undelete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1149,7 +1158,7 @@ def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1281,7 +1290,7 @@ def set_http_headers( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1298,6 +1307,240 @@ def set_http_headers( set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + def set_immutability_policy( + self, + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] + **kwargs # type: Any + ): + # type: (...) -> None + """The Set Immutability Policy operation sets the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param modified_access_conditions: Parameter group. + :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + + _if_unmodified_since = None + if modified_access_conditions is not None: + _if_unmodified_since = modified_access_conditions.if_unmodified_since + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.set_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + if _if_unmodified_since is not None: + header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + def delete_immutability_policy( + self, + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """The Delete Immutability Policy operation deletes the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.delete_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + def set_legal_hold( + self, + legal_hold, # type: bool + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """The Set Legal Hold operation sets a legal hold on the blob. + + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "legalhold" + accept = "application/xml" + + # Construct URL + url = self.set_legal_hold.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + def set_metadata( self, timeout=None, # type: Optional[int] @@ -1422,7 +1665,7 @@ def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1539,7 +1782,7 @@ def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1643,7 +1886,7 @@ def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1746,7 +1989,7 @@ def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1856,7 +2099,7 @@ def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1967,7 +2210,7 @@ def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2107,7 +2350,7 @@ def create_snapshot( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2136,6 +2379,9 @@ def start_copy_from_url( request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] seal_blob=None, # type: Optional[bool] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"] modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] @@ -2174,6 +2420,13 @@ def start_copy_from_url( :param seal_blob: Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. :type seal_blob: bool + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2268,6 +2521,12 @@ def start_copy_from_url( header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') if seal_blob is not None: header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2276,7 +2535,7 @@ def start_copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2304,6 +2563,9 @@ def copy_from_url( request_id_parameter=None, # type: Optional[str] source_content_md5=None, # type: Optional[bytearray] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"] modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] @@ -2340,6 +2602,13 @@ def copy_from_url( :type source_content_md5: bytearray :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2430,6 +2699,12 @@ def copy_from_url( header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2438,7 +2713,7 @@ def copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2531,7 +2806,7 @@ def abort_copy_from_url( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2646,7 +2921,7 @@ def set_tier( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2709,7 +2984,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2850,7 +3125,7 @@ def query( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3018,7 +3293,7 @@ def get_tags( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3135,7 +3410,7 @@ def set_tags( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py index f9804ce9b7d1..79a11324a198 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py @@ -54,6 +54,9 @@ def upload( tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -94,6 +97,13 @@ def upload( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -215,6 +225,12 @@ def upload( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -226,7 +242,7 @@ def upload( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -465,7 +481,7 @@ def put_blob_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -603,7 +619,7 @@ def stage_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -762,7 +778,7 @@ def stage_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -791,6 +807,9 @@ def commit_block_list( tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -834,6 +853,13 @@ def commit_block_list( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -956,6 +982,12 @@ def commit_block_list( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -968,7 +1000,7 @@ def commit_block_list( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1077,7 +1109,7 @@ def get_block_list( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py index 32197532ef36..f01bbc4393fe 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py @@ -130,7 +130,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -211,7 +211,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -230,6 +230,7 @@ def get_properties( response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold')) response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope')) response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override')) + response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled')) if cls: return cls(pipeline_response, None, response_headers) @@ -313,7 +314,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -412,7 +413,7 @@ def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -495,7 +496,7 @@ def get_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -611,7 +612,7 @@ def set_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -696,7 +697,7 @@ def restore( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -777,7 +778,7 @@ def rename( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -865,7 +866,7 @@ def submit_batch( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -967,7 +968,7 @@ def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1061,7 +1062,7 @@ def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1154,7 +1155,7 @@ def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1255,7 +1256,7 @@ def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1355,7 +1356,7 @@ def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1461,7 +1462,7 @@ def list_blob_flat_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1574,7 +1575,7 @@ def list_blob_hierarchy_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1635,7 +1636,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py index f025757048df..5ecabc18b75b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py @@ -182,7 +182,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -381,7 +381,7 @@ def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -495,7 +495,7 @@ def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -620,7 +620,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -728,7 +728,7 @@ def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py index ea4b17c056b7..d05a3307c69d 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py @@ -54,6 +54,9 @@ def create( blob_sequence_number=0, # type: Optional[int] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -92,6 +95,13 @@ def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -213,6 +223,12 @@ def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -221,7 +237,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -400,7 +416,7 @@ def upload_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -561,7 +577,7 @@ def clear_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -761,7 +777,7 @@ def upload_pages_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -885,7 +901,7 @@ def get_page_ranges( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1025,7 +1041,7 @@ def get_page_ranges_diff( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1161,7 +1177,7 @@ def resize( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1279,7 +1295,7 @@ def update_sequence_number( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1387,7 +1403,7 @@ def copy_incremental( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py index 72f7a73fdf50..4a0d8b3bb38a 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py @@ -109,7 +109,7 @@ def set_properties( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -180,7 +180,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -254,7 +254,7 @@ def get_statistics( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -358,7 +358,7 @@ def list_containers_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -439,7 +439,7 @@ def get_user_delegation_key( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -499,7 +499,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -588,7 +588,7 @@ def submit_batch( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -686,7 +686,7 @@ def filter_blobs( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py index 00a53dc68bfb..1ddde2e46c5c 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py @@ -1003,7 +1003,7 @@ def _from_generated(cls, generated): return None -class DelimitedJsonDialect(object): +class DelimitedJsonDialect(DictMixin): """Defines the input or output JSON serialization for a blob data query. :keyword str delimiter: The line separator character, default value is '\n' @@ -1013,7 +1013,7 @@ def __init__(self, **kwargs): self.delimiter = kwargs.pop('delimiter', '\n') -class DelimitedTextDialect(object): +class DelimitedTextDialect(DictMixin): """Defines the input or output delimited (CSV) serialization for a blob query request. :keyword str delimiter: diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py index eb51d987b9ac..3164337308c3 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py @@ -123,7 +123,6 @@ def records(self): yield record - class QuickQueryStreamer(object): """ File-like streaming iterator. diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py index 57f748af1e20..8f6f265dce52 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py @@ -37,7 +37,8 @@ '2019-12-12', '2020-02-10', '2020-04-08', - '2020-06-12' + '2020-06-12', + '2020-08-04' ] diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py index a30b2bac14a0..b21fcd5488bb 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.8.1" +VERSION = "12.9.0b1" diff --git a/sdk/storage/azure-storage-blob/setup.py b/sdk/storage/azure-storage-blob/setup.py index 33d725aaccd0..490bc490cca0 100644 --- a/sdk/storage/azure-storage-blob/setup.py +++ b/sdk/storage/azure-storage-blob/setup.py @@ -95,7 +95,7 @@ ]), install_requires=[ "azure-core<2.0.0,>=1.10.0", - "msrest>=0.6.18", + "msrest>=0.6.21", "cryptography>=2.1.4" ], extras_require={ diff --git a/sdk/storage/azure-storage-blob/swagger/README.md b/sdk/storage/azure-storage-blob/swagger/README.md index 1c90942a9bcb..67a3daeb9167 100644 --- a/sdk/storage/azure-storage-blob/swagger/README.md +++ b/sdk/storage/azure-storage-blob/swagger/README.md @@ -16,7 +16,7 @@ autorest --v3 --python ### Settings ``` yaml -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-06-12/blob.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-08-04/blob.json output-folder: ../azure/storage/blob/_generated namespace: azure.storage.blob no-namespace-folders: true diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml index bb28feabbf00..7d7ac1159c42 100644 --- a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml @@ -16,25 +16,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:15 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:19 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -48,30 +46,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:25 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsefalse" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:27 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK @@ -91,25 +87,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:46 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:49 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -123,30 +117,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:49 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsetrueindex.htmlerrors/error/404error.html" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:50 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml new file mode 100644 index 000000000000..c2a2eab4511c --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml @@ -0,0 +1,1594 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:03:14 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df?restype=container + response: + body: + string: "\uFEFFContainerAlreadyExistsThe + specified container already exists.\nRequestId:95663fec-c01e-0005-03f5-2c3b70000000\nTime:2021-04-09T04:03:15.4909578Z" + headers: + content-length: + - '230' + content-type: + - application/xml + date: + - Fri, 09 Apr 2021 04:03:14 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - ContainerAlreadyExists + x-ms-version: + - '2020-08-04' + status: + code: 409 + message: The specified container already exists. +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/octet-stream + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-date: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df + response: + body: + string: '' + headers: + content-md5: + - z1EKaBGYeFFPXcMBK90K+w== + date: + - Fri, 09 Apr 2021 04:03:14 GMT + etag: + - '"0x8D8FB0C66E66383"' + last-modified: + - Fri, 09 Apr 2021 04:03:15 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-content-crc64: + - f7IDcRFZujI= + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +- request: + body: ' + + SQLselect * from blobstorage + where id < 1;parquet + ' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '293' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: POST + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query + response: + body: + string: !!binary | + T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi + OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh + dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll + ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg + ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg + ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t + Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk + b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i + LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg + ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig + cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg + YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y + aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz + IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK + ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg + ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg + Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg + ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg + ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi + ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv + Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg + ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w + cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0 + aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz + U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt + YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg + ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg + ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz + IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg + Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu + ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl + LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs + ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw + ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh + bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgBeCQoEJjNiRJDCzm420C7q + AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwpeCQoEJjNiRJDCzm420C7qAg4Ewu4EruMJ + XgkKBCYzYkSQws5uNtAu6gIIBq7jCV4JCgQmM2JEkMLObjbQLuo= + headers: + accept-ranges: + - bytes + content-type: + - avro/binary + date: + - Fri, 09 Apr 2021 04:03:15 GMT + etag: + - '"0x8D8FB0C66E66383"' + last-modified: + - Fri, 09 Apr 2021 04:03:15 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml new file mode 100644 index 000000000000..2899b4154d62 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml @@ -0,0 +1,1496 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:19:09 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860?restype=container + response: + body: + string: '' + headers: + date: + - Fri, 09 Apr 2021 04:19:09 GMT + etag: + - '"0x8D8FB0E9FF3E60A"' + last-modified: + - Fri, 09 Apr 2021 04:19:10 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/octet-stream + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-date: + - Fri, 09 Apr 2021 04:19:10 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860/csvfilecdb31860 + response: + body: + string: '' + headers: + content-md5: + - z1EKaBGYeFFPXcMBK90K+w== + date: + - Fri, 09 Apr 2021 04:19:10 GMT + etag: + - '"0x8D8FB0EA01A1F5E"' + last-modified: + - Fri, 09 Apr 2021 04:19:10 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-content-crc64: + - f7IDcRFZujI= + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet b/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet new file mode 100644 index 000000000000..8eff6678085d Binary files /dev/null and b/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet differ diff --git a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md index 27ca17e21916..76a25521d857 100644 --- a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md @@ -1,5 +1,7 @@ # Release History +## 12.4.0b1 (unreleased) + ## 12.3.1 (2021-04-20) **Fixes** - Fixed `recursive=True` on file deletion @@ -11,7 +13,6 @@ **New Features** - Added `get_account_information()` API - ## 12.3.0 (2021-03-01) **Stable release of preview features** - Added support for `DatalakeServiceClient.undelete_filesystem()` diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py index 02a7559f5b27..459c4c07b44a 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py @@ -36,6 +36,12 @@ AccessControlChangeCounters, AccessControlChangeFailure, AccessControlChanges, + AnalyticsLogging, + Metrics, + RetentionPolicy, + StaticWebsite, + CorsRule, + DeletedPathProperties ) from ._shared_access_signature import generate_account_sas, generate_file_system_sas, generate_directory_sas, \ @@ -87,5 +93,11 @@ 'DataLakeFileQueryError', 'ArrowDialect', 'ArrowType', - 'DataLakeFileQueryError' + 'DataLakeFileQueryError', + 'AnalyticsLogging', + 'Metrics', + 'RetentionPolicy', + 'StaticWebsite', + 'CorsRule', + 'DeletedPathProperties' ] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index f9e625c75119..5aa17894baf0 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Any +from typing import Optional, Dict, Any try: from urllib.parse import urlparse @@ -15,6 +15,7 @@ from azure.storage.blob import BlobServiceClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str +from ._deserialize import get_datalake_service_properties from ._file_system_client import FileSystemClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_file_client import DataLakeFileClient @@ -462,7 +463,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -492,3 +493,64 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def set_service_properties(self, **kwargs): + # type: (**Any) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + :keyword analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :keyword hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :keyword minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :keyword cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :keyword str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :keyword delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :keyword static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access + + def get_service_properties(self, **kwargs): + # type: (**Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py index dfcaf8ef5dde..18ec80fd44f7 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py @@ -12,7 +12,8 @@ from azure.core.pipeline.policies import ContentDecodePolicy from azure.core.exceptions import HttpResponseError, DecodeError, ResourceModifiedError, ClientAuthenticationError, \ ResourceNotFoundError, ResourceExistsError -from ._models import FileProperties, DirectoryProperties, LeaseProperties, PathProperties +from ._models import FileProperties, DirectoryProperties, LeaseProperties, DeletedPathProperties, StaticWebsite, \ + RetentionPolicy, Metrics, AnalyticsLogging, PathProperties # pylint: disable=protected-access from ._shared.models import StorageErrorCode if TYPE_CHECKING: @@ -48,6 +49,34 @@ def deserialize_path_properties(path_list): return [PathProperties._from_generated(path) for path in path_list] # pylint: disable=protected-access +def get_deleted_path_properties_from_generated_code(generated): + deleted_path = DeletedPathProperties() + deleted_path.name = generated.name + deleted_path.deleted_time = generated.properties.deleted_time + deleted_path.remaining_retention_days = generated.properties.remaining_retention_days + deleted_path.deletion_id = generated.deletion_id + return deleted_path + + +def is_file_path(_, __, headers): + if headers['x-ms-resource-type'] == "file": + return True + return False + + +def get_datalake_service_properties(datalake_properties): + datalake_properties["analytics_logging"] = AnalyticsLogging._from_generated( # pylint: disable=protected-access + datalake_properties["analytics_logging"]) + datalake_properties["hour_metrics"] = Metrics._from_generated(datalake_properties["hour_metrics"]) # pylint: disable=protected-access + datalake_properties["minute_metrics"] = Metrics._from_generated( # pylint: disable=protected-access + datalake_properties["minute_metrics"]) + datalake_properties["delete_retention_policy"] = RetentionPolicy._from_generated( # pylint: disable=protected-access + datalake_properties["delete_retention_policy"]) + datalake_properties["static_website"] = StaticWebsite._from_generated( # pylint: disable=protected-access + datalake_properties["static_website"]) + return datalake_properties + + def from_blob_properties(blob_properties): file_props = FileProperties() file_props.name = blob_properties.name @@ -64,6 +93,7 @@ def from_blob_properties(blob_properties): file_props.content_settings = blob_properties.content_settings return file_props + def normalize_headers(headers): normalized = {} for key, value in headers.items(): diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index 7c2b4aac5ae4..03aa9c71e8aa 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -3,26 +3,32 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Optional, Any +import functools +from typing import Optional, Any, Union + try: - from urllib.parse import urlparse, quote + from urllib.parse import urlparse, quote, unquote except ImportError: from urlparse import urlparse # type: ignore - from urllib2 import quote # type: ignore - + from urllib2 import quote, unquote # type: ignore import six + from azure.core.pipeline import Pipeline +from azure.core.exceptions import HttpResponseError from azure.core.paging import ItemPaged from azure.storage.blob import ContainerClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str from ._serialize import convert_dfs_url_to_blob_url -from ._models import LocationMode, FileSystemProperties, PublicAccess, FileProperties, DirectoryProperties +from ._list_paths_helper import DeletedPathPropertiesPaged +from ._models import LocationMode, FileSystemProperties, PublicAccess, DeletedPathProperties, FileProperties, \ + DirectoryProperties from ._data_lake_file_client import DataLakeFileClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_lease import DataLakeLeaseClient from ._generated import AzureDataLakeStorageRESTAPI -from ._deserialize import deserialize_path_properties +from ._generated.models import ListBlobsIncludeItem +from ._deserialize import deserialize_path_properties, process_storage_error, is_file_path class FileSystemClient(StorageAccountHostsMixin): @@ -99,6 +105,9 @@ def __init__( # ADLS doesn't support secondary endpoint, make sure it's empty self._hosts[LocationMode.SECONDARY] = "" self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) def _format_url(self, hostname): file_system_name = self.file_system_name @@ -741,6 +750,53 @@ def delete_file(self, file, # type: Union[FileProperties, str] file_client.delete_file(**kwargs) return file_client + def _undelete_path_options(self, deleted_path_name, deletion_id): + quoted_path = quote(unquote(deleted_path_name.strip('/'))) + + url_and_token = self.url.replace('.dfs.', '.blob.').split('?') + try: + url = url_and_token[0] + '/' + quoted_path + url_and_token[1] + except IndexError: + url = url_and_token[0] + '/' + quoted_path + + undelete_source = quoted_path + '?deletionid={}'.format(deletion_id) if deletion_id else None + + return quoted_path, url, undelete_source + + def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the path (file or directory) to restore. + :param str deletion_id: + Specifies the version of the deleted path to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id) + + pipeline = Pipeline( + transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -802,7 +858,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -827,3 +883,35 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def list_deleted_paths(self, **kwargs): + # type: (Any) -> ItemPaged[DeletedPathProperties] + """Returns a generator to list the deleted (file or directory) paths under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword str path_prefix: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of DeletedPathProperties. + :rtype: + ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + path_prefix = kwargs.pop('path_prefix', None) + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return ItemPaged( + command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py index efb21f39026f..fbd0a7916e69 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py @@ -15,6 +15,8 @@ # pylint: disable=unused-import,ungrouped-imports from typing import Any + from azure.core.pipeline.transport import HttpRequest, HttpResponse + from ._configuration import AzureDataLakeStorageRESTAPIConfiguration from .operations import ServiceOperations from .operations import FileSystemOperations @@ -57,6 +59,24 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + def _send_request(self, http_request, **kwargs): + # type: (HttpRequest, Any) -> HttpResponse + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.HttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + def close(self): # type: () -> None self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py index e3dd7f17f1fd..3bfff366da7c 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py @@ -39,7 +39,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py index 662a749523a6..efeeeb3b5361 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py @@ -9,6 +9,7 @@ from typing import Any from azure.core import AsyncPipelineClient +from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest from msrest import Deserializer, Serializer from ._configuration import AzureDataLakeStorageRESTAPIConfiguration @@ -52,6 +53,23 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + async def close(self) -> None: await self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py index e23526fd6f27..82234727a630 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py @@ -34,7 +34,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py index b6732e350f3b..d4e206a6d054 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- import datetime -from typing import Any, AsyncIterable, Callable, Dict, Generic, Optional, TypeVar +from typing import Any, AsyncIterable, Callable, Dict, Generic, List, Optional, TypeVar, Union import warnings from azure.core.async_paging import AsyncItemPaged, AsyncList @@ -108,7 +108,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -206,7 +206,7 @@ async def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -276,7 +276,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -370,7 +370,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -443,8 +443,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -456,7 +458,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -502,7 +505,7 @@ async def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -512,3 +515,117 @@ async def get_next(cont_token=None): get_next, extract_data ) list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + async def list_blob_hierarchy_segment( + self, + prefix: Optional[str] = None, + delimiter: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + include: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] = None, + showonly: Optional[str] = "deleted", + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> "_models.ListBlobsHierarchySegmentResponse": + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py index b090bc10952e..7cec5890e122 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py @@ -239,7 +239,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -284,10 +284,10 @@ async def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -499,7 +499,7 @@ async def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -654,7 +654,7 @@ async def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -787,7 +787,7 @@ async def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -947,7 +947,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1080,7 +1080,7 @@ async def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1088,6 +1088,7 @@ async def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1203,7 +1204,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1313,7 +1314,7 @@ async def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1481,7 +1482,7 @@ async def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1599,7 +1600,7 @@ async def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1680,7 +1681,7 @@ async def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,3 +1696,78 @@ async def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + async def undelete( + self, + timeout: Optional[int] = None, + undelete_source: Optional[str] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py index b229c1208668..f8ae878a37c3 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py @@ -136,7 +136,7 @@ async def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py index 769623c0eee9..fc4548f39b19 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py @@ -8,9 +8,14 @@ try: from ._models_py3 import AclFailedEntry + from ._models_py3 import BlobHierarchyListSegment + from ._models_py3 import BlobItemInternal + from ._models_py3 import BlobPrefix + from ._models_py3 import BlobPropertiesInternal from ._models_py3 import FileSystem from ._models_py3 import FileSystemList from ._models_py3 import LeaseAccessConditions + from ._models_py3 import ListBlobsHierarchySegmentResponse from ._models_py3 import ModifiedAccessConditions from ._models_py3 import Path from ._models_py3 import PathHTTPHeaders @@ -18,12 +23,17 @@ from ._models_py3 import SetAccessControlRecursiveResponse from ._models_py3 import SourceModifiedAccessConditions from ._models_py3 import StorageError - from ._models_py3 import StorageErrorAutoGenerated + from ._models_py3 import StorageErrorError except (SyntaxError, ImportError): from ._models import AclFailedEntry # type: ignore + from ._models import BlobHierarchyListSegment # type: ignore + from ._models import BlobItemInternal # type: ignore + from ._models import BlobPrefix # type: ignore + from ._models import BlobPropertiesInternal # type: ignore from ._models import FileSystem # type: ignore from ._models import FileSystemList # type: ignore from ._models import LeaseAccessConditions # type: ignore + from ._models import ListBlobsHierarchySegmentResponse # type: ignore from ._models import ModifiedAccessConditions # type: ignore from ._models import Path # type: ignore from ._models import PathHTTPHeaders # type: ignore @@ -31,9 +41,10 @@ from ._models import SetAccessControlRecursiveResponse # type: ignore from ._models import SourceModifiedAccessConditions # type: ignore from ._models import StorageError # type: ignore - from ._models import StorageErrorAutoGenerated # type: ignore + from ._models import StorageErrorError # type: ignore from ._azure_data_lake_storage_restapi_enums import ( + ListBlobsIncludeItem, PathExpiryOptions, PathGetPropertiesAction, PathLeaseAction, @@ -45,9 +56,14 @@ __all__ = [ 'AclFailedEntry', + 'BlobHierarchyListSegment', + 'BlobItemInternal', + 'BlobPrefix', + 'BlobPropertiesInternal', 'FileSystem', 'FileSystemList', 'LeaseAccessConditions', + 'ListBlobsHierarchySegmentResponse', 'ModifiedAccessConditions', 'Path', 'PathHTTPHeaders', @@ -55,7 +71,8 @@ 'SetAccessControlRecursiveResponse', 'SourceModifiedAccessConditions', 'StorageError', - 'StorageErrorAutoGenerated', + 'StorageErrorError', + 'ListBlobsIncludeItem', 'PathExpiryOptions', 'PathGetPropertiesAction', 'PathLeaseAction', diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py index e9fe9d71a62c..804050e9e0d0 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py @@ -26,6 +26,16 @@ def __getattr__(cls, name): raise AttributeError(name) +class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): + + COPY = "copy" + DELETED = "deleted" + METADATA = "metadata" + SNAPSHOTS = "snapshots" + UNCOMMITTEDBLOBS = "uncommittedblobs" + VERSIONS = "versions" + TAGS = "tags" + class PathExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): NEVER_EXPIRE = "NeverExpire" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py index 099e37c53bb2..237617a48a13 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py @@ -37,6 +37,263 @@ def __init__( self.error_message = kwargs.get('error_message', None) +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = kwargs.get('blob_prefixes', None) + self.blob_items = kwargs['blob_items'] + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = kwargs['name'] + self.deleted = kwargs['deleted'] + self.snapshot = kwargs['snapshot'] + self.version_id = kwargs.get('version_id', None) + self.is_current_version = kwargs.get('is_current_version', None) + self.properties = kwargs['properties'] + self.deletion_id = kwargs.get('deletion_id', None) + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = kwargs['name'] + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = kwargs.get('creation_time', None) + self.last_modified = kwargs['last_modified'] + self.etag = kwargs['etag'] + self.content_length = kwargs.get('content_length', None) + self.content_type = kwargs.get('content_type', None) + self.content_encoding = kwargs.get('content_encoding', None) + self.content_language = kwargs.get('content_language', None) + self.content_md5 = kwargs.get('content_md5', None) + self.content_disposition = kwargs.get('content_disposition', None) + self.cache_control = kwargs.get('cache_control', None) + self.blob_sequence_number = kwargs.get('blob_sequence_number', None) + self.copy_id = kwargs.get('copy_id', None) + self.copy_source = kwargs.get('copy_source', None) + self.copy_progress = kwargs.get('copy_progress', None) + self.copy_completion_time = kwargs.get('copy_completion_time', None) + self.copy_status_description = kwargs.get('copy_status_description', None) + self.server_encrypted = kwargs.get('server_encrypted', None) + self.incremental_copy = kwargs.get('incremental_copy', None) + self.destination_snapshot = kwargs.get('destination_snapshot', None) + self.deleted_time = kwargs.get('deleted_time', None) + self.remaining_retention_days = kwargs.get('remaining_retention_days', None) + self.access_tier_inferred = kwargs.get('access_tier_inferred', None) + self.customer_provided_key_sha256 = kwargs.get('customer_provided_key_sha256', None) + self.encryption_scope = kwargs.get('encryption_scope', None) + self.access_tier_change_time = kwargs.get('access_tier_change_time', None) + self.tag_count = kwargs.get('tag_count', None) + self.expires_on = kwargs.get('expires_on', None) + self.is_sealed = kwargs.get('is_sealed', None) + self.last_accessed_on = kwargs.get('last_accessed_on', None) + self.delete_time = kwargs.get('delete_time', None) + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -103,6 +360,64 @@ def __init__( self.lease_id = kwargs.get('lease_id', None) +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = kwargs['service_endpoint'] + self.container_name = kwargs['container_name'] + self.prefix = kwargs.get('prefix', None) + self.marker = kwargs.get('marker', None) + self.max_results = kwargs.get('max_results', None) + self.delimiter = kwargs.get('delimiter', None) + self.segment = kwargs['segment'] + self.next_marker = kwargs.get('next_marker', None) + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -319,11 +634,11 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( @@ -334,7 +649,7 @@ def __init__( self.error = kwargs.get('error', None) -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -352,6 +667,6 @@ def __init__( self, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = kwargs.get('code', None) self.message = kwargs.get('message', None) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py index 337388d8d2f6..bbe361c5b9bb 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py @@ -44,6 +44,307 @@ def __init__( self.error_message = error_message +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + *, + blob_items: List["BlobItemInternal"], + blob_prefixes: Optional[List["BlobPrefix"]] = None, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = blob_prefixes + self.blob_items = blob_items + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + *, + name: str, + deleted: bool, + snapshot: str, + properties: "BlobPropertiesInternal", + version_id: Optional[str] = None, + is_current_version: Optional[bool] = None, + deletion_id: Optional[str] = None, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = name + self.deleted = deleted + self.snapshot = snapshot + self.version_id = version_id + self.is_current_version = is_current_version + self.properties = properties + self.deletion_id = deletion_id + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + *, + name: str, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = name + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + *, + last_modified: datetime.datetime, + etag: str, + creation_time: Optional[datetime.datetime] = None, + content_length: Optional[int] = None, + content_type: Optional[str] = None, + content_encoding: Optional[str] = None, + content_language: Optional[str] = None, + content_md5: Optional[bytearray] = None, + content_disposition: Optional[str] = None, + cache_control: Optional[str] = None, + blob_sequence_number: Optional[int] = None, + copy_id: Optional[str] = None, + copy_source: Optional[str] = None, + copy_progress: Optional[str] = None, + copy_completion_time: Optional[datetime.datetime] = None, + copy_status_description: Optional[str] = None, + server_encrypted: Optional[bool] = None, + incremental_copy: Optional[bool] = None, + destination_snapshot: Optional[str] = None, + deleted_time: Optional[datetime.datetime] = None, + remaining_retention_days: Optional[int] = None, + access_tier_inferred: Optional[bool] = None, + customer_provided_key_sha256: Optional[str] = None, + encryption_scope: Optional[str] = None, + access_tier_change_time: Optional[datetime.datetime] = None, + tag_count: Optional[int] = None, + expires_on: Optional[datetime.datetime] = None, + is_sealed: Optional[bool] = None, + last_accessed_on: Optional[datetime.datetime] = None, + delete_time: Optional[datetime.datetime] = None, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = creation_time + self.last_modified = last_modified + self.etag = etag + self.content_length = content_length + self.content_type = content_type + self.content_encoding = content_encoding + self.content_language = content_language + self.content_md5 = content_md5 + self.content_disposition = content_disposition + self.cache_control = cache_control + self.blob_sequence_number = blob_sequence_number + self.copy_id = copy_id + self.copy_source = copy_source + self.copy_progress = copy_progress + self.copy_completion_time = copy_completion_time + self.copy_status_description = copy_status_description + self.server_encrypted = server_encrypted + self.incremental_copy = incremental_copy + self.destination_snapshot = destination_snapshot + self.deleted_time = deleted_time + self.remaining_retention_days = remaining_retention_days + self.access_tier_inferred = access_tier_inferred + self.customer_provided_key_sha256 = customer_provided_key_sha256 + self.encryption_scope = encryption_scope + self.access_tier_change_time = access_tier_change_time + self.tag_count = tag_count + self.expires_on = expires_on + self.is_sealed = is_sealed + self.last_accessed_on = last_accessed_on + self.delete_time = delete_time + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -118,6 +419,73 @@ def __init__( self.lease_id = lease_id +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + *, + service_endpoint: str, + container_name: str, + segment: "BlobHierarchyListSegment", + prefix: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + delimiter: Optional[str] = None, + next_marker: Optional[str] = None, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = service_endpoint + self.container_name = container_name + self.prefix = prefix + self.marker = marker + self.max_results = max_results + self.delimiter = delimiter + self.segment = segment + self.next_marker = next_marker + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -368,24 +736,24 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( self, *, - error: Optional["StorageErrorAutoGenerated"] = None, + error: Optional["StorageErrorError"] = None, **kwargs ): super(StorageError, self).__init__(**kwargs) self.error = error -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -406,6 +774,6 @@ def __init__( message: Optional[str] = None, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = code self.message = message diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py index 3726a2dd3cf1..991890ac4e2b 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py @@ -18,7 +18,7 @@ if TYPE_CHECKING: # pylint: disable=unused-import,ungrouped-imports - from typing import Any, Callable, Dict, Generic, Iterable, Optional, TypeVar + from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, TypeVar, Union T = TypeVar('T') ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] @@ -113,7 +113,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -172,7 +172,7 @@ def set_properties( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -212,7 +212,7 @@ def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -283,7 +283,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -340,7 +340,7 @@ def delete( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -378,7 +378,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -452,8 +452,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -465,7 +467,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -512,7 +515,7 @@ def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -521,4 +524,120 @@ def get_next(cont_token=None): return ItemPaged( get_next, extract_data ) + list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + def list_blob_hierarchy_segment( + self, + prefix=None, # type: Optional[str] + delimiter=None, # type: Optional[str] + marker=None, # type: Optional[str] + max_results=None, # type: Optional[int] + include=None, # type: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] + showonly="deleted", # type: Optional[str] + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> "_models.ListBlobsHierarchySegmentResponse" + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py index bd527947cf31..5517c96888bd 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py @@ -244,7 +244,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -290,10 +290,10 @@ def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -505,7 +505,7 @@ def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -661,7 +661,7 @@ def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -795,7 +795,7 @@ def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -956,7 +956,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1090,7 +1090,7 @@ def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1098,6 +1098,7 @@ def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1214,7 +1215,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1325,7 +1326,7 @@ def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1494,7 +1495,7 @@ def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1613,7 +1614,7 @@ def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,7 +1696,7 @@ def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1710,3 +1711,79 @@ def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + def undelete( + self, + timeout=None, # type: Optional[int] + undelete_source=None, # type: Optional[str] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py index c5a9555cf0d1..2db3801abff8 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py @@ -141,7 +141,7 @@ def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py new file mode 100644 index 000000000000..543e1e115780 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py @@ -0,0 +1,108 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.core.paging import PageIterator +from azure.core.exceptions import HttpResponseError +from ._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from ._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix +from ._shared.models import DictMixin +from ._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(PageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + def _get_next_cb(self, continuation_token): + try: + return self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index b99f9aa09d78..f0204b02fc8d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -18,6 +18,8 @@ from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON from azure.storage.blob import ArrowDialect as BlobArrowDialect from azure.storage.blob._models import ContainerPropertiesPaged +from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \ + RetentionPolicy as GenRetentionPolicy, StaticWebsite as GenStaticWebsite, CorsRule as GenCorsRule from ._shared.models import DictMixin @@ -827,3 +829,203 @@ def __init__(self, batch_counters, aggregate_counters, batch_failures, continuat self.aggregate_counters = aggregate_counters self.batch_failures = batch_failures self.continuation = continuation + + +class DeletedPathProperties(DictMixin): + """ + Properties populated for a deleted path. + + :ivar str name: + The name of the file in the path. + :ivar ~datetime.datetime deleted_time: + A datetime object representing the time at which the path was deleted. + :ivar int remaining_retention_days: + The number of days that the path will be retained before being permanently deleted by the service. + :ivar str deletion_id: + The id associated with the deleted path. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('name') + self.deleted_time = None + self.remaining_retention_days = None + self.deletion_id = None + + +class AnalyticsLogging(GenLogging): + """Azure Analytics Logging settings. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword bool delete: + Indicates whether all delete requests should be logged. The default value is `False`. + :keyword bool read: + Indicates whether all read requests should be logged. The default value is `False`. + :keyword bool write: + Indicates whether all write requests should be logged. The default value is `False`. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.delete = kwargs.get('delete', False) + self.read = kwargs.get('read', False) + self.write = kwargs.get('write', False) + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + delete=generated.delete, + read=generated.read, + write=generated.write, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class Metrics(GenMetrics): + """A summary of request statistics grouped by API in hour or minute aggregates. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword bool enabled: + Indicates whether metrics are enabled for the Datalake service. + The default value is `False`. + :keyword bool include_apis: + Indicates whether metrics should generate summary statistics for called API operations. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.enabled = kwargs.get('enabled', False) + self.include_apis = kwargs.get('include_apis') + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + enabled=generated.enabled, + include_apis=generated.include_apis, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class RetentionPolicy(GenRetentionPolicy): + """The retention policy which determines how long the associated data should + persist. + + :param bool enabled: + Indicates whether a retention policy is enabled for the storage service. + The default value is False. + :param int days: + Indicates the number of days that metrics or logging or + soft-deleted data should be retained. All data older than this value will + be deleted. If enabled=True, the number of days must be specified. + """ + + def __init__(self, enabled=False, days=None): + super(RetentionPolicy, self).__init__(enabled=enabled, days=days, allow_permanent_delete=None) + if self.enabled and (self.days is None): + raise ValueError("If policy is enabled, 'days' must be specified.") + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + days=generated.days, + ) + + +class StaticWebsite(GenStaticWebsite): + """The properties that enable an account to host a static website. + + :keyword bool enabled: + Indicates whether this account is hosting a static website. + The default value is `False`. + :keyword str index_document: + The default name of the index page under each directory. + :keyword str error_document404_path: + The absolute path of the custom 404 page. + :keyword str default_index_document_path: + Absolute path of the default index page. + """ + + def __init__(self, **kwargs): + self.enabled = kwargs.get('enabled', False) + if self.enabled: + self.index_document = kwargs.get('index_document') + self.error_document404_path = kwargs.get('error_document404_path') + self.default_index_document_path = kwargs.get('default_index_document_path') + else: + self.index_document = None + self.error_document404_path = None + self.default_index_document_path = None + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + index_document=generated.index_document, + error_document404_path=generated.error_document404_path, + default_index_document_path=generated.default_index_document_path + ) + + +class CorsRule(GenCorsRule): + """CORS is an HTTP feature that enables a web application running under one + domain to access resources in another domain. Web browsers implement a + security restriction known as same-origin policy that prevents a web page + from calling APIs in a different domain; CORS provides a secure way to + allow one domain (the origin domain) to call APIs in another domain. + + :param list(str) allowed_origins: + A list of origin domains that will be allowed via CORS, or "*" to allow + all domains. The list of must contain at least one entry. Limited to 64 + origin domains. Each allowed origin can have up to 256 characters. + :param list(str) allowed_methods: + A list of HTTP methods that are allowed to be executed by the origin. + The list of must contain at least one entry. For Azure Storage, + permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT. + :keyword list(str) allowed_headers: + Defaults to an empty list. A list of headers allowed to be part of + the cross-origin request. Limited to 64 defined headers and 2 prefixed + headers. Each header can be up to 256 characters. + :keyword list(str) exposed_headers: + Defaults to an empty list. A list of response headers to expose to CORS + clients. Limited to 64 defined headers and two prefixed headers. Each + header can be up to 256 characters. + :keyword int max_age_in_seconds: + The number of seconds that the client/browser should cache a + preflight response. + """ + + def __init__(self, allowed_origins, allowed_methods, **kwargs): + self.allowed_origins = ','.join(allowed_origins) + self.allowed_methods = ','.join(allowed_methods) + self.allowed_headers = ','.join(kwargs.get('allowed_headers', [])) + self.exposed_headers = ','.join(kwargs.get('exposed_headers', [])) + self.max_age_in_seconds = kwargs.get('max_age_in_seconds', 0) + + @classmethod + def _from_generated(cls, generated): + return cls( + [generated.allowed_origins], + [generated.allowed_methods], + allowed_headers=[generated.allowed_headers], + exposed_headers=[generated.exposed_headers], + max_age_in_seconds=generated.max_age_in_seconds, + ) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py index 7b022845a780..8f0f58869fe3 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py @@ -3,7 +3,8 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Any, Dict +from datetime import datetime +from typing import Any, Dict, Union try: from urllib.parse import urlparse, quote @@ -212,12 +213,13 @@ def _delete_path_options(**kwargs): options = { 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions, + 'cls': return_response_headers, 'timeout': kwargs.pop('timeout', None)} options.update(kwargs) return options def _delete(self, **kwargs): - # type: (bool, **Any) -> None + # type: (**Any) -> Dict[Union[datetime, str]] """ Marks the specified path for deletion. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py index 5df2f5c9a625..be60b3878f66 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py @@ -80,7 +80,7 @@ def return_headers_and_deserialized(response, deserialized, response_headers): def return_context_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument - return response.location_mode, deserialized + return response.http_response.location_mode, deserialized def process_storage_error(storage_error): diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py index bf23efa97489..85a0126d5fa7 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.3.1" +VERSION = "12.4.0b1" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py index c545b0a464e6..da01081e2342 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py @@ -4,13 +4,14 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Any +from typing import Optional, Any, Dict from azure.core.paging import ItemPaged from azure.core.pipeline import AsyncPipeline from azure.storage.blob.aio import BlobServiceClient from .._generated.aio import AzureDataLakeStorageRESTAPI +from .._deserialize import get_datalake_service_properties from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from ._file_system_client_async import FileSystemClient from .._data_lake_service_client import DataLakeServiceClient as DataLakeServiceClientBase @@ -441,3 +442,64 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + async def set_service_properties(self, **kwargs): + # type: (**Any) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :keyword hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :keyword minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :keyword cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :keyword str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :keyword delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :keyword static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return await self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access + + async def get_service_properties(self, **kwargs): + # type: (**Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = await self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index 108fc1817046..98fc89eadb2d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -5,11 +5,12 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method - +import functools from typing import ( # pylint: disable=unused-import Union, Optional, Any, Dict, TYPE_CHECKING ) +from azure.core.exceptions import HttpResponseError from azure.core.tracing.decorator import distributed_trace from azure.core.pipeline import AsyncPipeline @@ -17,6 +18,8 @@ from azure.core.tracing.decorator_async import distributed_trace_async from azure.storage.blob.aio import ContainerClient +from .._deserialize import process_storage_error, is_file_path +from .._generated.models import ListBlobsIncludeItem from ._data_lake_file_client_async import DataLakeFileClient from ._data_lake_directory_client_async import DataLakeDirectoryClient @@ -26,7 +29,9 @@ from .._generated.aio import AzureDataLakeStorageRESTAPI from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from .._shared.policies_async import ExponentialRetry -from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties +from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties, DeletedPathProperties +from ._list_paths_helper import DeletedPathPropertiesPaged + if TYPE_CHECKING: from datetime import datetime @@ -90,6 +95,9 @@ def __init__( _hosts=self._container_client._hosts,# pylint: disable=protected-access **kwargs) # type: ignore # pylint: disable=protected-access self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) self._loop = kwargs.get('loop', None) async def __aexit__(self, *args): @@ -701,6 +709,42 @@ async def delete_file(self, file, # type: Union[FileProperties, str] await file_client.delete_file(**kwargs) return file_client + @distributed_trace_async + async def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the name of the deleted container to restore. + :param str deletion_id: + Specifies the version of the deleted container to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient + or azure.storage.file.datalake.aio.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id) + + pipeline = AsyncPipeline( + transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = await path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -788,3 +832,36 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function, loop=self._loop) + + @distributed_trace + def list_deleted_paths(self, **kwargs): + # type: (Any) -> AsyncItemPaged[DeletedPathProperties] + """Returns a generator to list the deleted (file or directory) paths under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword str path_prefix: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of DeletedPathProperties. + :rtype: + ~azure.core.paging.AsyncItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + path_prefix = kwargs.pop('path_prefix', None) + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return AsyncItemPaged( + command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py new file mode 100644 index 000000000000..03831a5ecc5c --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py @@ -0,0 +1,111 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=too-few-public-methods, too-many-instance-attributes +# pylint: disable=super-init-not-called, too-many-lines +from azure.core.exceptions import HttpResponseError +from azure.core.async_paging import AsyncPageIterator + +from .._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from .._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix + +from .._shared.models import DictMixin +from .._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(AsyncPageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + async def _get_next_cb(self, continuation_token): + try: + return await self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + async def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py index 43537ec532cc..80c43d77704d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py @@ -4,7 +4,8 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Any, Dict +from datetime import datetime +from typing import Any, Dict, Union from azure.core.exceptions import AzureError, HttpResponseError from azure.storage.blob.aio import BlobClient @@ -133,7 +134,7 @@ async def _create(self, resource_type, content_settings=None, metadata=None, **k process_storage_error(error) async def _delete(self, **kwargs): - # type: (bool, **Any) -> None + # type: (**Any) -> Dict[Union[datetime, str]] """ Marks the specified path for deletion. diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py index 5eac7ecac02e..c56745603eb0 100644 --- a/sdk/storage/azure-storage-file-datalake/setup.py +++ b/sdk/storage/azure-storage-file-datalake/setup.py @@ -73,7 +73,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python', classifiers=[ - "Development Status :: 5 - Production/Stable", + "Development Status :: 4 - Beta", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', @@ -94,7 +94,7 @@ ]), install_requires=[ "azure-core<2.0.0,>=1.10.0", - "msrest>=0.6.18", + "msrest>=0.6.21", "azure-storage-blob<13.0.0,>=12.8.0b1" ], extras_require={ diff --git a/sdk/storage/azure-storage-file-datalake/swagger/README.md b/sdk/storage/azure-storage-file-datalake/swagger/README.md index 21473ab91013..47cf1a3b4c8c 100644 --- a/sdk/storage/azure-storage-file-datalake/swagger/README.md +++ b/sdk/storage/azure-storage-file-datalake/swagger/README.md @@ -16,7 +16,7 @@ autorest --v3 --python ### Settings ``` yaml -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-02-10/DataLakeStorage.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-06-12/DataLakeStorage.json output-folder: ../azure/storage/filedatalake/_generated namespace: azure.storage.filedatalake no-namespace-folders: true @@ -25,4 +25,14 @@ enable-xml: true vanilla: true clear-output-folder: true python: true +``` + +### Remove x-ms-pageable +Currently breaking the latest version of autorest.python +``` yaml +directive: +- from: swagger-document + where: $["x-ms-paths"]["/{filesystem}?restype=container&comp=list&hierarchy"].get + transform: > + delete $["x-ms-pageable"]; ``` \ No newline at end of file diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..1fb5e9cd683e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 729c5ec3-3b15-11eb-9ec2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:06 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc9118b-001e-0002-7e22-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7427eda6-3b15-11eb-a943-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:09 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc9119b-001e-0002-0422-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..35d7dfd52efe --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + false' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - effd0504-3b15-11eb-8192-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:37 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeaa9-301e-0019-5322-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f0fef9fb-3b15-11eb-ad49-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:38 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeab3-301e-0019-5422-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml new file mode 100644 index 000000000000..d08cfd54f5aa --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0efbba3d-3b16-11eb-91ab-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc91467-001e-0002-6622-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0fbe3818-3b16-11eb-98bd-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc91470-001e-0002-6722-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml new file mode 100644 index 000000000000..e1a232c8d7c0 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b4c21f7e-3b15-11eb-b652-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:29:57 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d48-f01e-0006-0522-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b759c331-3b15-11eb-83de-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:02 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d5c-f01e-0006-0622-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..03b761e3a8ac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + true2' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bb297712-3b15-11eb-904d-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:08 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6dffa-501e-0020-1722-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bd3db8fc-3b15-11eb-9090-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:12 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6e009-501e-0020-1922-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..9ef4605e7ce2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7bc7f418-90e4-11eb-92b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:16 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:20 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c3b37-b01e-004e-6ff1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7ecf48c9-90e4-11eb-aab6-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:21 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c835b-b01e-004e-80f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7eecfdbb-90e4-11eb-8a9c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c85fd-b01e-004e-68f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f078f9f-90e4-11eb-8aa7-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c88d8-b01e-004e-63f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f20830d-90e4-11eb-9a0e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8b63-b01e-004e-38f1-246328000000\nTime:2021-03-29T23:14:22.4739476Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8b63-b01e-004e-38f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f39264f-90e4-11eb-945f-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c8c4b-b01e-004e-37f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f52df63-90e4-11eb-ba7e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8e3f-b01e-004e-3df1-246328000000\nTime:2021-03-29T23:14:22.7931726Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8e3f-b01e-004e-3df1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f698642-90e4-11eb-8c0a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:22 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c9076-b01e-004e-61f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..75808cd7d66e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 1.0truefalsetrue5' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '268' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3249dac5-a7c6-11eb-b681-c8348e5fffbf + x-ms-date: + - Wed, 28 Apr 2021 02:05:25 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 28 Apr 2021 02:05:24 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 80857b38-d01e-0044-6ed2-3bf560000000 + x-ms-version: + - '2020-08-04' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 32788c99-a7c6-11eb-8724-c8348e5fffbf + x-ms-date: + - Wed, 28 Apr 2021 02:05:25 GMT + x-ms-version: + - '2020-08-04' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html" + headers: + Content-Type: + - application/xml + Date: + - Wed, 28 Apr 2021 02:05:24 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 80857bb9-d01e-0044-5bd2-3bf560000000 + x-ms-version: + - '2020-08-04' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml new file mode 100644 index 000000000000..4f69cca733c9 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - fd342ca3-3b15-11eb-be73-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:59 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fae-301e-0009-6622-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ff7f0ed3-3b15-11eb-ac57-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:03 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fc6-301e-0009-6b22-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..7d4ec434b6d4 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '271' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9317b341-9bea-11eb-a813-c8348e5fffbf + x-ms-date: + - Mon, 12 Apr 2021 23:55:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 12 Apr 2021 23:55:35 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 626fe6f9-301e-007f-0ef7-2f823b000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 937a9045-9bea-11eb-8deb-c8348e5fffbf + x-ms-date: + - Mon, 12 Apr 2021 23:55:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Mon, 12 Apr 2021 23:55:35 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 626fe723-301e-007f-2ef7-2f823b000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f8112bd067cc --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - eb84d3a1-3b15-11eb-91d5-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5ec-601e-002b-2a22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ec154eb8-3b15-11eb-83fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5f6-601e-002b-2b22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..f02927dae495 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,165 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f83e45bf-3b15-11eb-a7b4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f42-301e-0044-6722-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8ce4139-3b15-11eb-8843-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4b-301e-0044-6822-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8f1cedf-3b15-11eb-800b-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4c-301e-0044-6922-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f919f048-3b15-11eb-a5be-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4e-301e-0044-6a22-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..17b6be66734e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2b702a60-3b29-11eb-8248-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:17 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f55-601e-0014-6a35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2e19cdd4-3b29-11eb-9267-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:21 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f62-601e-0014-6c35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..cdfc6d52c1b2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + false' + headers: + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c58a66e-3b29-11eb-87d4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:12 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56a1-801e-0033-0c36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4d32116c-3b29-11eb-9b17-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:13 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56ac-801e-0033-0d36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml new file mode 100644 index 000000000000..5a9e9e5d720e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65643618-3b29-11eb-93a7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:54 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 0cbd8b49-e01e-0047-6236-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65d59905-3b29-11eb-a3ec-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:55 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0cbd8b52-e01e-0047-6336-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml new file mode 100644 index 000000000000..34270046cbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 39a10d94-3b29-11eb-a3e0-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56a2-901e-0000-2c35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3a0a8d22-3b29-11eb-8570-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56ab-901e-0000-2d35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..bcc584167493 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + true2' + headers: + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3de166a3-3b29-11eb-8840-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:48 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e5f-101e-0031-0d35-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3e4f40cc-3b29-11eb-8857-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:49 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e6f-101e-0031-0e36-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..67249600dbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,266 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cb39e77a-90e4-11eb-be24-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:30 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74caa7ec-c01e-008f-1bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce837ad8-90e4-11eb-81b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0890-c01e-008f-0bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce930b3b-90e4-11eb-9c87-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74cb0b17-c01e-008f-61f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cea473bc-90e4-11eb-aeda-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0dd8-c01e-008f-4af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ceb5f122-90e4-11eb-947a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb106a-c01e-008f-20f1-24c4ca000000\nTime:2021-03-29T23:16:36.0596298Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb106a-c01e-008f-20f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ced91740-90e4-11eb-a356-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb15dd-c01e-008f-6ff1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cee74e3a-90e4-11eb-b89c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb1805-c01e-008f-0af1-24c4ca000000\nTime:2021-03-29T23:16:36.2485211Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb1805-c01e-008f-0af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cef4e47f-90e4-11eb-8aa2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb1a42-c01e-008f-33f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..f1e279a11dc7 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: ' + + 1.0truefalsetrue5' + headers: + Accept: + - application/xml + Content-Length: + - '268' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2b37dee6-a7c6-11eb-9248-c8348e5fffbf + x-ms-date: + - Wed, 28 Apr 2021 02:05:13 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 28 Apr 2021 02:05:12 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 59421d43-b01e-006d-32d2-3bcb14000000 + x-ms-version: '2020-08-04' + status: + code: 202 + message: Accepted + url: https://seannse.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2b50bdfa-a7c6-11eb-a412-c8348e5fffbf + x-ms-date: + - Wed, 28 Apr 2021 02:05:13 GMT + x-ms-version: + - '2020-08-04' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html" + headers: + Content-Type: application/xml + Date: Wed, 28 Apr 2021 02:05:12 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 59421dd9-b01e-006d-03d2-3bcb14000000 + x-ms-version: '2020-08-04' + status: + code: 200 + message: OK + url: https://seannse.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml new file mode 100644 index 000000000000..a314afd7f16a --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 56586676-3b29-11eb-aad2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:31 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f4860f9-b01e-0028-2436-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5859625e-3b29-11eb-bd70-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:32 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:32 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f486112-b01e-0028-2a36-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..2a6875525392 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - application/xml + Content-Length: + - '271' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - d49b9a00-9bea-11eb-a75f-c8348e5fffbf + x-ms-date: + - Mon, 12 Apr 2021 23:57:25 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 12 Apr 2021 23:57:24 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: e94c6acf-d01e-0083-73f7-2f53c2000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - d4d6805a-9bea-11eb-a347-c8348e5fffbf + x-ms-date: + - Mon, 12 Apr 2021 23:57:26 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Mon, 12 Apr 2021 23:57:24 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: e94c6af5-d01e-0083-10f7-2f53c2000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f7b9352d25c8 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46cd3bc1-3b29-11eb-9562-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:03 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd4f-201e-0048-4136-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 48cf4185-3b29-11eb-a7fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:06 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd68-201e-0048-4736-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..a13ee293de3f --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,127 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 507611e3-3b29-11eb-babe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:19 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7b1-501e-000f-0836-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5294966f-3b29-11eb-83d6-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7ba-501e-000f-0936-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52b6143b-3b29-11eb-9fa2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bd-501e-000f-0a36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52d33ecf-3b29-11eb-90d7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bf-501e-000f-0b36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..abbdbad93587 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -0,0 +1,866 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 457ffd25-98f0-11eb-9fc4-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:49 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A02C1AD"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:49 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b52dee7e-101e-009c-0afd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 45d4da20-98f0-11eb-afc7-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:49 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A5A5964"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b746f-101f-0078-37fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 462a2bb0-98f0-11eb-9d86-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A72A2E9"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7472-101f-0078-39fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 464282da-98f0-11eb-9c07-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142A8C7CE5"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7473-101f-0078-3afd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 465c2557-98f0-11eb-92ef-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AA2FDB0"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7474-101f-0078-3bfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4672e1bc-98f0-11eb-b0af-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142ABAEC16"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7475-101f-0078-3cfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 468a6276-98f0-11eb-9b56-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AD2BBC1"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7476-101f-0078-3dfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46a2a43b-98f0-11eb-a4be-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AED8B91"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7477-101f-0078-3efd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46bce3aa-98f0-11eb-bf33-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179314769963' + x-ms-request-id: + - fe4b7478-101f-0078-3ffd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46fafd7d-98f0-11eb-bf7b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179316566740' + x-ms-request-id: + - fe4b7479-101f-0078-40fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47228501-98f0-11eb-b30e-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179319150091' + x-ms-request-id: + - fe4b747a-101f-0078-41fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 474350f0-98f0-11eb-a754-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179321356419' + x-ms-request-id: + - fe4b747b-101f-0078-42fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4766de88-98f0-11eb-8ce6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179324953375' + x-ms-request-id: + - fe4b747d-101f-0078-43fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4797b48c-98f0-11eb-b1e5-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179328345615' + x-ms-request-id: + - fe4b747e-101f-0078-44fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47ca0d47-98f0-11eb-9707-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&showonly=deleted + response: + body: + string: "\uFEFFdir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df022-101e-009c-72fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47f11ece-98f0-11eb-8583-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&prefix=dir3%2F&showonly=deleted + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df043-101e-009c-0ffd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 480765c7-98f0-11eb-8bf6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&maxResults=2&showonly=deleted + response: + body: + string: "\uFEFF2dir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT42!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df058-101e-009c-22fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 482a7ccc-98f0-11eb-ba28-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&marker=2%21248%21MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--&maxResults=4&showonly=deleted + response: + body: + string: "\uFEFF2!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df06e-101e-009c-36fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..cde1fb719f4b --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,288 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0b4cc4a6-96fb-11eb-96f3-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:53 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:53 GMT + ETag: + - '"0x8D8F91EEFE08F2A"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0e483e20-e01e-0098-1107-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0bbbbba2-96fb-11eb-a4b1-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:54 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 352a134d-a01f-006d-2407-2bf9eb000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0c2cb5b8-96fb-11eb-8594-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132622026556759923' + x-ms-request-id: + - 352a134e-a01f-006d-2507-2bf9eb000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0ca24d8b-96fb-11eb-a718-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 0e48407d-e01e-0098-0307-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0cba7db5-96fb-11eb-a7cf-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-undelete-source: + - dir10?deletionid=132622026556759923 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-request-id: + - 0e4840aa-e01e-0098-2607-2b6dc1000000 + x-ms-resource-type: + - directory + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0d03eeec-96fb-11eb-aed8-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:56 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-meta-hdi_isfolder: + - 'true' + x-ms-owner: + - $superuser + x-ms-permissions: + - rwxr-x--- + x-ms-request-id: + - 0e48411c-e01e-0098-0707-2b6dc1000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..41ff2d4cd98d --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -0,0 +1,286 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 22edf54b-98f0-11eb-b813-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:51 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:51 GMT + ETag: + - '"0x8D8FB140784D2B9"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5a438fc7-b01e-003c-6efc-2c6467000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 235ac06a-98f0-11eb-a682-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:51 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + ETag: + - '"0x8D8FB1407FD32D0"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d806c18e-101f-009c-29fc-2ce0c6000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 23cc6ec8-98f0-11eb-acac-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624178727549652' + x-ms-request-id: + - d806c18f-101f-009c-2afc-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 23fa5cb0-98f0-11eb-b2c8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 5a43929f-b01e-003c-16fc-2c6467000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 241229e1-98f0-11eb-9ef6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132624178727549652 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-request-id: + - 5a439303-b01e-003c-51fc-2c6467000000 + x-ms-resource-type: + - file + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2438c4bb-98f0-11eb-80b5-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:53 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + ETag: + - '"0x8D8FB1407FD32D0"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-owner: + - $superuser + x-ms-permissions: + - rw-r----- + x-ms-request-id: + - 5a439389-b01e-003c-20fc-2c6467000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..5be0f0b32c74 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -0,0 +1,651 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65f0c226-98f0-11eb-aa01-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:43 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144A5B1290"' + Last-Modified: Fri, 09 Apr 2021 04:59:43 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0e6d5285-301e-0040-04fd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 662ce0fb-98f0-11eb-8215-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:43 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AAA44AB"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c881-a01f-000f-53fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 667a2c76-98f0-11eb-9627-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AB9BF70"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c884-a01f-000f-56fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66898e41-98f0-11eb-a713-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AC81FE4"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c885-a01f-000f-57fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6697d38e-98f0-11eb-b5cc-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AD659D9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c886-a01f-000f-58fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66a618df-98f0-11eb-a9fc-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AE4E3A9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c887-a01f-000f-59fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66b4b5fb-98f0-11eb-995e-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AF4B2F5"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c888-a01f-000f-5afd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66c49340-98f0-11eb-b1d8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144B0738B7"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c889-a01f-000f-5bfd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66d77f1e-98f0-11eb-b8bb-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0 + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179854239734' + x-ms-request-id: f659c88a-a01f-000f-5cfd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67229b2e-98f0-11eb-90b2-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1 + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179855451954' + x-ms-request-id: f659c88c-a01f-000f-5dfd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67349e3d-98f0-11eb-b7db-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179856631159' + x-ms-request-id: f659c88d-a01f-000f-5efd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6746f037-98f0-11eb-8a74-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179857809934' + x-ms-request-id: f659c88e-a01f-000f-5ffd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6762b5d6-98f0-11eb-914b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3 + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179859739548' + x-ms-request-id: f659c890-a01f-000f-60fd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67768b7e-98f0-11eb-8eb6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179861674259' + x-ms-request-id: f659c891-a01f-000f-61fd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67958534-98f0-11eb-8045-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted + response: + body: + string: "\uFEFFdir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5e14-301e-0040-4cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67b4cd06-98f0-11eb-883c-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5f1f-301e-0040-5cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67c3ca83-98f0-11eb-a7d8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted + response: + body: + string: "\uFEFF2dir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT42!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5f7c-301e-0040-0cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67df68ca-98f0-11eb-abf0-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted + response: + body: + string: "\uFEFF2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:46 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d6057-301e-0040-02fd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..63537346b811 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,205 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 778aae3a-96fc-11eb-b381-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:04 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205BF6672C"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 2409aea0-f01e-0002-7309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.blob.core.windows.net/fs95ee172e?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 77d37713-96fc-11eb-bb22-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: bb03cba3-b01f-0071-0109-2bab8b000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 781d9f73-96fc-11eb-ad5d-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132622032658022074' + x-ms-request-id: bb03cba4-b01f-0071-0209-2bab8b000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 784f84d5-96fc-11eb-95d9-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 2409b039-f01e-0002-5309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 785cf27c-96fc-11eb-a11b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-undelete-source: + - dir10?deletionid=132622032658022074 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-request-id: b6ad0801-d01e-0015-3709-2b5a13000000 + x-ms-resource-type: directory + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 78b191b7-96fc-11eb-9a2b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Tue, 06 Apr 2021 17:21:06 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-meta-hdi_isfolder: 'true' + x-ms-owner: $superuser + x-ms-permissions: rwxr-x--- + x-ms-request-id: b6ad0824-d01e-0015-4f09-2b5a13000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..be3e34c508b0 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -0,0 +1,204 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf00e1e8-98f0-11eb-825f-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:12 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3743269"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 5445d712-a01e-0089-70fd-2cf775000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/fsace1178f?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf46a2a3-98f0-11eb-b2be-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 5b30cf1e-501f-0056-59fd-2cbc4f000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf932777-98f0-11eb-8522-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87 + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624181341072359' + x-ms-request-id: 5b30cf1f-501f-0056-5afd-2cbc4f000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87 +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bfc19095-98f0-11eb-930b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: Fri, 09 Apr 2021 05:02:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 5445d81a-a01e-0089-6ffd-2cf775000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bfcf9a42-98f0-11eb-87b3-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132624181341072359 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT + x-ms-request-id: 3d9dd391-401e-0065-3ffd-2ce3e4000000 + x-ms-resource-type: file + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c01723e1-98f0-11eb-a5e9-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Fri, 09 Apr 2021 05:02:14 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-owner: $superuser + x-ms-permissions: rw-r----- + x-ms-request-id: 3d9dd3a3-401e-0065-4bfd-2ce3e4000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml new file mode 100644 index 000000000000..227c3694ab89 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml @@ -0,0 +1,1643 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 60cf3f29-996d-11eb-a886-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:21 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:21 GMT + ETag: + - '"0x8D8FB9145645382"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:22 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b503-101f-0007-357a-2d398a000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6137edf4-996d-11eb-b015-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:22 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=append&position=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:21 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b504-101f-0007-367a-2d398a000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + If-Match: + - '"0x8D8FB9145645382"' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 615e1394-996d-11eb-915d-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:22 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=flush&position=80087&close=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:22 GMT + ETag: + - '"0x8D8FB9145A3D919"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:23 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b505-101f-0007-377a-2d398a000000 + x-ms-request-server-encrypted: + - 'false' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + SQLselect * from blobstorage + where id < 1;parquet + ' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '293' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 617433b5-996d-11eb-a99a-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:23 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: POST + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query + response: + body: + string: !!binary | + T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi + OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh + dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll + ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg + ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg + ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t + Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk + b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i + LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg + ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig + cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg + YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y + aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz + IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK + ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg + ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg + Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg + ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg + ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi + ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv + Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg + ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w + cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0 + aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz + U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt + YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg + ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg + ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz + IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg + Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu + ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl + LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs + ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw + ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh + bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgDTcqc2iYsPRaCt87a9W16y + AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwrTcqc2iYsPRaCt87a9W16yAg4Ewu4EruMJ + 03KnNomLD0WgrfO2vVtesgIIBq7jCdNypzaJiw9FoK3ztr1bXrI= + headers: + Accept-Ranges: + - bytes + Content-Type: + - avro/binary + Date: + - Fri, 09 Apr 2021 19:54:23 GMT + ETag: + - '"0x8D8FB9145A3D919"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 6f7f6af3-e01e-0012-6f7a-2dfb13000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml new file mode 100644 index 000000000000..c408d32ecffa --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml @@ -0,0 +1,1542 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66737680-996d-11eb-a17f-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:31 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + ETag: + - '"0x8D8FB914AE5DEAD"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:31 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce30-501f-000b-7c7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66b6659e-996d-11eb-9ac2-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:31 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=append&position=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce31-501f-000b-7d7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + If-Match: + - '"0x8D8FB914AE5DEAD"' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66dabc17-996d-11eb-bb26-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:32 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=flush&position=80087&close=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + ETag: + - '"0x8D8FB914B1C8907"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:32 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce32-501f-000b-7e7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'false' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet b/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet new file mode 100644 index 000000000000..8eff6678085d Binary files /dev/null and b/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet differ diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py new file mode 100644 index 000000000000..080c121e4971 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -0,0 +1,323 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake import DataLakeServiceClient +from testcase import ( + StorageTestCase, + DataLakePreparer) + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def _setUp(self, account_name, account_key): + url = self._get_account_url(account_name) + self.dsc = DataLakeServiceClient(url, account_key) + self.config = self.dsc._config + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + @DataLakePreparer() + def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Act + resp = self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + self.assertIsNone(resp) + props = self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @DataLakePreparer() + def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + with self.assertRaises(ValueError): + self.dsc.set_service_properties() + + @DataLakePreparer() + def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Act + self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @DataLakePreparer() + def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @DataLakePreparer() + def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal( + received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal( + received_props['delete_retention_policy'], delete_retention_policy) + + @DataLakePreparer() + def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @DataLakePreparer() + def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @DataLakePreparer() + def test_set_static_website_props_dont_impact_other_props( + self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @DataLakePreparer() + def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + logging = AnalyticsLogging(read=True, write=True, delete=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @DataLakePreparer() + def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + hour_metrics = Metrics( + include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @DataLakePreparer() + def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + minute_metrics = Metrics(enabled=True, include_apis=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @DataLakePreparer() + def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py new file mode 100644 index 000000000000..a5227fb090fc --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import asyncio +import unittest + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake.aio import DataLakeServiceClient +from asynctestcase import StorageTestCase +from testcase import DataLakePreparer + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def _setUp(self, account_name, account_key): + url = self._get_account_url(account_name) + self.dsc = DataLakeServiceClient(url, credential=account_key, logging_enable=True) + self.config = self.dsc._config + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + @DataLakePreparer() + async def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Act + await self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + props = await self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @DataLakePreparer() + async def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + with self.assertRaises(ValueError): + await self.dsc.set_service_properties() + + @DataLakePreparer() + async def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Act + await self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = await self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @DataLakePreparer() + async def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @DataLakePreparer() + async def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @DataLakePreparer() + async def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @DataLakePreparer() + async def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @DataLakePreparer() + async def test_set_static_website_props_dont_impact_other_props(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + await self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + await self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @DataLakePreparer() + async def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @DataLakePreparer() + async def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + hour_metrics = Metrics( + include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @DataLakePreparer() + async def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + minute_metrics = Metrics( + enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @DataLakePreparer() + async def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + await self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py index 9378ee0b954c..95afd9d4a3c4 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py @@ -187,9 +187,7 @@ def test_delete_directory(self, datalake_storage_account_name, datalake_storage_ directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) directory_client.create_directory(metadata=metadata) - response = directory_client.delete_directory() - # Assert - self.assertIsNone(response) + directory_client.delete_directory() @DataLakePreparer() def test_delete_directory_with_if_modified_since(self, datalake_storage_account_name, datalake_storage_account_key): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py index 131d98f13818..6a2845d39e8c 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py @@ -208,9 +208,7 @@ async def test_delete_directory_async(self, datalake_storage_account_name, datal directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) await directory_client.create_directory(metadata=metadata) - response = await directory_client.delete_directory() - # Assert - self.assertIsNone(response) + await directory_client.delete_directory() @DataLakePreparer() async def test_delete_directory_with_if_modified_since_async(self, datalake_storage_account_name, datalake_storage_account_key): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index 3fd8b20f0a3f..1137f5754e96 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -21,6 +21,8 @@ # ------------------------------------------------------------------------------ from azure.storage.filedatalake import AccessPolicy, FileSystemSasPermissions +from azure.storage.filedatalake._list_paths_helper import DirectoryPrefix +from azure.storage.filedatalake._models import DeletedPathProperties TEST_FILE_SYSTEM_PREFIX = 'filesystem' # ------------------------------------------------------------------------------ @@ -412,6 +414,50 @@ def test_list_paths(self, datalake_storage_account_name, datalake_storage_accoun self.assertEqual(len(paths), 6) self.assertTrue(isinstance(paths[0].last_modified, datetime)) + @DataLakePreparer() + def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key): + if not self.is_playback(): + return + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Arrange + file_system = self._create_file_system() + file0 = file_system.create_file("file0") + file1 = file_system.create_file("file1") + + dir1 = file_system.create_directory("dir1") + dir2 = file_system.create_directory("dir2") + dir3 = file_system.create_directory("dir3") + file_in_dir3 = dir3.create_file("file_in_dir3") + file_in_subdir = dir3.create_file("subdir/file_in_subdir") + + file0.delete_file() + file1.delete_file() + dir1.delete_directory() + dir2.delete_directory() + file_in_dir3.delete_file() + file_in_subdir.delete_file() + deleted_paths = list(file_system.list_deleted_paths()) + dir3_paths = list(file_system.list_deleted_paths(path_prefix="dir3/")) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page() + paths1 = list(next(paths_generator1)) + + paths_generator2 = file_system.list_deleted_paths(max_results=4).by_page( + continuation_token=paths_generator1.continuation_token) + paths2 = list(next(paths_generator2)) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + @DataLakePreparer() def test_list_paths_which_are_all_files(self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) @@ -556,6 +602,35 @@ def test_file_system_sessions_closes_properly(self, datalake_storage_account_nam with fs_client.get_directory_client("file2") as f_client: f_client.create_directory() + @DataLakePreparer() + def test_undelete_dir_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs") + dir_path = 'dir10' + dir_client = file_system_client.create_directory(dir_path) + resp = dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = file_system_client._undelete_path(dir_path, resp['deletion_id']) + resp = restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + + @DataLakePreparer() + def test_undelete_file_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs1") + file_path = 'dir10/fileŇ' + dir_client = file_system_client.create_file(file_path) + resp = dir_client.delete_file() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = file_system_client._undelete_path(file_path, resp['deletion_id']) + resp = restored_file_client.get_file_properties() + self.assertIsNotNone(resp) # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index 3788d1ec7377..2b31480e2662 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -18,8 +18,8 @@ from azure.core.pipeline.transport import AioHttpTransport from multidict import CIMultiDict, CIMultiDictProxy -from azure.storage.filedatalake import AccessPolicy, generate_directory_sas, DirectorySasPermissions, \ - generate_file_system_sas, generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import AccessPolicy, DirectorySasPermissions, generate_file_system_sas from azure.storage.filedatalake.aio import DataLakeServiceClient, DataLakeDirectoryClient, FileSystemClient from azure.storage.filedatalake import PublicAccess from asynctestcase import ( @@ -105,7 +105,8 @@ async def test_file_system_exists(self, datalake_storage_account_name, datalake_ self.assertFalse(await file_system_client2.exists()) @DataLakePreparer() - async def test_create_file_system_with_metadata_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_create_file_system_with_metadata_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange metadata = {'hello': 'world', 'number': '42'} @@ -141,7 +142,8 @@ async def test_list_file_systems_async(self, datalake_storage_account_name, data self.assertIsNotNone(file_systems[0].has_legal_hold) @DataLakePreparer() - async def test_delete_file_system_with_existing_file_system_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_delete_file_system_with_existing_file_system_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -174,7 +176,8 @@ async def test_rename_file_system(self, datalake_storage_account_name, datalake_ self.assertEqual(new_name, props.name) @DataLakePreparer() - async def test_rename_file_system_with_file_system_client(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_rename_file_system_with_file_system_client( + self, datalake_storage_account_name, datalake_storage_account_key): pytest.skip("Feature not yet enabled. Make sure to record this test once enabled.") self._setUp(datalake_storage_account_name, datalake_storage_account_key) old_name1 = self._get_file_system_reference(prefix="oldcontainer1") @@ -196,7 +199,8 @@ async def test_rename_file_system_with_file_system_client(self, datalake_storage self.assertEqual(new_name, new_file_system_props.name) @DataLakePreparer() - async def test_rename_file_system_with_source_lease(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_rename_file_system_with_source_lease( + self, datalake_storage_account_name, datalake_storage_account_key): if not self.is_playback(): return self._setUp(datalake_storage_account_name, datalake_storage_account_key) @@ -313,7 +317,8 @@ async def test_restore_file_system_with_sas(self, datalake_storage_account_name, self.assertIsNotNone(props) @DataLakePreparer() - async def test_delete_none_existing_file_system_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_delete_none_existing_file_system_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) fake_file_system_client = self.dsc.get_file_system_client("fakeclient") @@ -322,7 +327,8 @@ async def test_delete_none_existing_file_system_async(self, datalake_storage_acc await fake_file_system_client.delete_file_system(match_condition=MatchConditions.IfMissing) @DataLakePreparer() - async def test_list_file_systems_with_include_metadata_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_file_systems_with_include_metadata_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -351,7 +357,8 @@ async def test_set_file_system_acl_async(self, datalake_storage_account_name, da expiry=datetime.utcnow() + timedelta(hours=1), start=datetime.utcnow()) signed_identifier1 = {'testid': access_policy} - response = await file_system.set_file_system_access_policy(signed_identifier1, public_access=PublicAccess.FileSystem) + response = await file_system.set_file_system_access_policy( + signed_identifier1, public_access=PublicAccess.FileSystem) self.assertIsNotNone(response.get('etag')) self.assertIsNotNone(response.get('last_modified')) @@ -387,7 +394,8 @@ async def test_list_file_systems_by_page_async(self, datalake_storage_account_na self.assertGreaterEqual(len(file_systems), 3) @DataLakePreparer() - async def test_list_file_systems_with_public_access_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_file_systems_with_public_access_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system_name = self._get_file_system_reference() @@ -428,7 +436,8 @@ async def test_get_file_system_properties_async(self, datalake_storage_account_n self.assertIsNotNone(props.has_legal_hold) @DataLakePreparer() - async def test_service_client_session_closes_after_filesystem_creation(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_service_client_session_closes_after_filesystem_creation( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange dsc2 = DataLakeServiceClient(self.dsc.url, credential=datalake_storage_account_key) @@ -454,7 +463,8 @@ async def test_list_paths_async(self, datalake_storage_account_name, datalake_st self.assertEqual(len(paths), 6) @DataLakePreparer() - async def test_list_paths_which_are_all_files_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_paths_which_are_all_files_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -468,7 +478,8 @@ async def test_list_paths_which_are_all_files_async(self, datalake_storage_accou self.assertEqual(len(paths), 6) @DataLakePreparer() - async def test_list_paths_with_max_per_page_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_paths_with_max_per_page_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -490,7 +501,8 @@ async def test_list_paths_with_max_per_page_async(self, datalake_storage_account self.assertEqual(len(paths2), 4) @DataLakePreparer() - async def test_list_paths_under_specific_path_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_paths_under_specific_path_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -563,7 +575,60 @@ async def test_list_paths_pages_correctly(self, datalake_storage_account_name, d self.assertEqual(len(paths2), 6) @DataLakePreparer() - async def test_create_directory_from_file_system_client_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key): + if not self.is_playback(): + return + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + # Arrange + file_system = await self._create_file_system() + file0 = await file_system.create_file("file0") + file1 = await file_system.create_file("file1") + + dir1 = await file_system.create_directory("dir1") + dir2 = await file_system.create_directory("dir2") + dir3 = await file_system.create_directory("dir3") + file_in_dir3 = await dir3.create_file("file_in_dir3") + file_in_subdir = await dir3.create_file("subdir/file_in_subdir") + + await file0.delete_file() + await file1.delete_file() + await dir1.delete_directory() + await dir2.delete_directory() + await file_in_dir3.delete_file() + await file_in_subdir.delete_file() + deleted_paths = [] + async for path in file_system.list_deleted_paths(): + deleted_paths.append(path) + dir3_paths = [] + async for path in file_system.list_deleted_paths(path_prefix="dir3/"): + dir3_paths.append(path) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page() + paths1 = [] + async for path in await paths_generator1.__anext__(): + paths1.append(path) + + paths_generator2 = file_system.list_deleted_paths(max_results=4) \ + .by_page(continuation_token=paths_generator1.continuation_token) + paths2 = [] + async for path in await paths_generator2.__anext__(): + paths2.append(path) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + + @DataLakePreparer() + async def test_create_directory_from_file_system_client_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -577,7 +642,8 @@ async def test_create_directory_from_file_system_client_async(self, datalake_sto self.assertEqual(paths[0].name, "dir1") @DataLakePreparer() - async def test_create_file_from_file_system_client_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_create_file_from_file_system_client_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system() @@ -604,7 +670,8 @@ async def test_get_root_directory_client_async(self, datalake_storage_account_na @pytest.mark.live_test_only @DataLakePreparer() - async def test_get_access_control_using_delegation_sas_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_get_access_control_using_delegation_sas_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) url = self._get_account_url(datalake_storage_account_name) @@ -627,7 +694,8 @@ async def test_get_access_control_using_delegation_sas_async(self, datalake_stor dsc.account_name, file_system_name, delegation_key, - permission=FileSystemSasPermissions(read=True, execute=True, manage_access_control=True, manage_ownership=True), + permission=FileSystemSasPermissions( + read=True, execute=True, manage_access_control=True, manage_ownership=True), expiry=datetime.utcnow() + timedelta(hours=1), agent_object_id=random_guid ) @@ -639,7 +707,8 @@ async def test_get_access_control_using_delegation_sas_async(self, datalake_stor @pytest.mark.live_test_only @DataLakePreparer() - async def test_list_paths_using_file_sys_delegation_sas_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_list_paths_using_file_sys_delegation_sas_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) url = self._get_account_url(datalake_storage_account_name) token_credential = self.generate_oauth_token() @@ -671,7 +740,8 @@ async def test_list_paths_using_file_sys_delegation_sas_async(self, datalake_sto self.assertEqual(0, 0) @DataLakePreparer() - async def test_file_system_sessions_closes_properly_async(self, datalake_storage_account_name, datalake_storage_account_key): + async def test_file_system_sessions_closes_properly_async( + self, datalake_storage_account_name, datalake_storage_account_key): self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system_client = await self._create_file_system("fs") @@ -685,6 +755,36 @@ async def test_file_system_sessions_closes_properly_async(self, datalake_storage async with fs_client.get_directory_client("file2") as f_client: await f_client.create_directory() + @DataLakePreparer() + async def test_undelete_dir_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + dir_path = 'dir10' + dir_client = await file_system_client.create_directory(dir_path) + resp = await dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = await file_system_client._undelete_path(dir_path, resp['deletion_id']) + resp = await restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + + @DataLakePreparer() + async def test_undelete_file_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + file_path = 'dir10/fileŇ' + dir_client = await file_system_client.create_file(file_path) + resp = await dir_client.delete_file() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = await file_system_client._undelete_path(file_path, resp['deletion_id']) + resp = await restored_file_client.get_file_properties() + self.assertIsNotNone(resp) + # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-file-share/CHANGELOG.md b/sdk/storage/azure-storage-file-share/CHANGELOG.md index 9032c610351d..9478bc9d6ccc 100644 --- a/sdk/storage/azure-storage-file-share/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-share/CHANGELOG.md @@ -1,12 +1,13 @@ # Release History +## 12.5.0b1 (Unreleased) + ## 12.4.2 (2021-04-20) **Fixes** - Make `AccountName`, `AccountKey` etc. in conn_str case insensitive - Fixed `downloader.chunks()` return chunks in different size (#9419, #15648) - Fixed unclosed `ThreadPoolExecutor` (#8955) - ## 12.4.1 (2021-01-20) **Fixes** - Fixed msrest dependency issue (#16250) diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py index 61b1d9061978..7c38145c68c4 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py @@ -7,7 +7,7 @@ import uuid from typing import ( # pylint: disable=unused-import - Optional, Any, TypeVar, TYPE_CHECKING + Union, Optional, Any, TypeVar, TYPE_CHECKING ) from azure.core.tracing.decorator import distributed_trace @@ -25,7 +25,7 @@ class ShareLeaseClient(object): """Creates a new ShareLeaseClient. - This client provides lease operations on a ShareFileClient. + This client provides lease operations on a ShareClient or ShareFileClient. :ivar str id: The ID of the lease currently being maintained. This will be `None` if no @@ -38,8 +38,9 @@ class ShareLeaseClient(object): This will be `None` if no lease has yet been acquired or modified. :param client: - The client of the file to lease. - :type client: ~azure.storage.fileshare.ShareFileClient + The client of the file or share to lease. + :type client: ~azure.storage.fileshare.ShareFileClient or + ~azure.storage.fileshare.ShareClient :param str lease_id: A string representing the lease ID of an existing lease. This value does not need to be specified in order to acquire a new lease, or break one. @@ -47,7 +48,7 @@ class ShareLeaseClient(object): def __init__( self, client, lease_id=None ): # pylint: disable=missing-client-constructor-parameter-credential,missing-client-constructor-parameter-kwargs - # type: (ShareFileClient, Optional[str]) -> None + # type: (Union[ShareFileClient, ShareClient], Optional[str]) -> None self.id = lease_id or str(uuid.uuid4()) self.last_modified = None self.etag = None @@ -70,14 +71,20 @@ def __exit__(self, *args): def acquire(self, **kwargs): # type: (**Any) -> None """Requests a new lease. This operation establishes and manages a lock on a - file for write and delete operations. If the file does not have an active lease, - the File service creates a lease on the file. If the file has an active lease, + file or share for write and delete operations. If the file or share does not have an active lease, + the File or Share service creates a lease on the file or share. If the file has an active lease, you can only request a new lease using the active lease ID. - If the file does not have an active lease, the File service creates a + If the file or share does not have an active lease, the File or Share service creates a lease on the file and returns a new lease ID. + :keyword int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be + between 15 and 60 seconds. A share lease duration cannot be changed + using renew or change. Default is -1 (infinite share lease). + :keyword int timeout: The timeout parameter is expressed in seconds. :rtype: None @@ -99,7 +106,7 @@ def acquire(self, **kwargs): self.etag = response.get('etag') # type: str @distributed_trace - def _renew(self, **kwargs): + def renew(self, **kwargs): # type: (Any) -> None """Renews the share lease. @@ -134,8 +141,8 @@ def _renew(self, **kwargs): def release(self, **kwargs): # type: (Any) -> None """Releases the lease. The lease may be released if the lease ID specified on the request matches - that associated with the file. Releasing the lease allows another client to immediately acquire - the lease for the or file as soon as the release is complete. + that associated with the share or file. Releasing the lease allows another client to immediately acquire + the lease for the share or file as soon as the release is complete. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -162,7 +169,7 @@ def change(self, proposed_lease_id, **kwargs): a new lease ID in x-ms-proposed-lease-id. :param str proposed_lease_id: - Proposed lease ID, in a GUID string format. The File service will raise an error + Proposed lease ID, in a GUID string format. The File or Share service will raise an error (Invalid request) if the proposed lease ID is not in the correct format. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -186,7 +193,7 @@ def change(self, proposed_lease_id, **kwargs): @distributed_trace def break_lease(self, **kwargs): # type: (Any) -> int - """Force breaks the lease if the file has an active lease. Any authorized request can break the lease; + """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease; the request is not required to specify a matching lease ID. An infinite lease breaks immediately. Once a lease is broken, it cannot be changed. Any authorized request can break the lease; @@ -194,6 +201,19 @@ def break_lease(self, **kwargs): When a lease is successfully broken, the response indicates the interval in seconds until a new lease can be acquired. + :keyword int lease_break_period: + This is the proposed duration of seconds that the share lease + should continue before it is broken, between 0 and 60 seconds. This + break period is only used if it is shorter than the time remaining + on the share lease. If longer, the time remaining on the share lease is used. + A new share lease will not be available before the break period has + expired, but the share lease may be held for longer than the break + period. If this header does not appear with a break + operation, a fixed-duration share lease breaks after the remaining share lease + period elapses, and an infinite share lease breaks immediately. + + .. versionadded:: 12.6.0 + :keyword int timeout: The timeout parameter is expressed in seconds. :return: Approximate time remaining in the lease period, in seconds. diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py index afb4457cb6b0..2b37a56d807c 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py @@ -31,7 +31,7 @@ DeleteSnapshotsOptionType, SharePermission) from ._deserialize import deserialize_share_properties, deserialize_permission_key, deserialize_permission -from ._serialize import get_api_version +from ._serialize import get_api_version, get_access_conditions from ._directory_client import ShareDirectoryClient from ._file_client import ShareFileClient from ._lease import ShareLeaseClient @@ -269,21 +269,21 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode) @distributed_trace - def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): - # type: (int, Optional[str], **Any) -> ShareLeaseClient + def acquire_lease(self, **kwargs): + # type: (**Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share Service creates a lease on the share and returns a new lease. - .. versionadded:: 12.6.0 + .. versionadded:: 12.5.0 - :param int lease_duration: + :kwarg int lease_duration: Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. Default is -1 (infinite lease). - :param str lease_id: + :kwarg str lease_id: Proposed lease ID, in a GUID string format. The Share Service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. @@ -301,7 +301,8 @@ def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): :dedent: 8 :caption: Acquiring a lease on a share. """ - kwargs['lease_duration'] = lease_duration + kwargs['lease_duration'] = kwargs.pop('lease_duration', -1) + lease_id = kwargs.pop('lease_id', None) lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore lease.acquire(**kwargs) return lease @@ -321,7 +322,7 @@ def create_share(self, **kwargs): Possible values: 'TransactionOptimized', 'Hot', 'Cool' :paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword int timeout: The timeout parameter is expressed in seconds. @@ -427,6 +428,13 @@ def delete_share( :param bool delete_snapshots: Indicates if snapshots are to be deleted. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :keyword int timeout: The timeout parameter is expressed in seconds. @@ -439,6 +447,7 @@ def delete_share( :dedent: 12 :caption: Deletes the share and any snapshots. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) delete_include = None if delete_snapshots: @@ -447,6 +456,7 @@ def delete_share( self._client.share.delete( timeout=timeout, sharesnapshot=self.snapshot, + lease_access_conditions=access_conditions, delete_snapshots=delete_include, **kwargs) except HttpResponseError as error: @@ -461,6 +471,13 @@ def get_share_properties(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: The share properties. :rtype: ~azure.storage.fileshare.ShareProperties @@ -473,12 +490,14 @@ def get_share_properties(self, **kwargs): :dedent: 12 :caption: Gets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: props = self._client.share.get_properties( timeout=timeout, sharesnapshot=self.snapshot, cls=deserialize_share_properties, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -496,6 +515,13 @@ def set_share_quota(self, quota, **kwargs): Must be greater than 0, and less than or equal to 5TB. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -508,12 +534,14 @@ def set_share_quota(self, quota, **kwargs): :dedent: 12 :caption: Sets the share quota. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: return self._client.share.set_properties( # type: ignore timeout=timeout, quota=quota, access_tier=None, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -524,7 +552,7 @@ def set_share_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] """Sets the share properties. - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword access_tier: Specifies the access tier of the share. @@ -539,6 +567,9 @@ def set_share_properties(self, **kwargs): Root squash to set on the share. Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash'. :paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -551,6 +582,7 @@ def set_share_properties(self, **kwargs): :dedent: 12 :caption: Sets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) access_tier = kwargs.pop('access_tier', None) quota = kwargs.pop('quota', None) @@ -563,6 +595,7 @@ def set_share_properties(self, **kwargs): quota=quota, access_tier=access_tier, root_squash=root_squash, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -582,6 +615,13 @@ def set_share_metadata(self, metadata, **kwargs): :type metadata: dict(str, str) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -594,6 +634,7 @@ def set_share_metadata(self, metadata, **kwargs): :dedent: 12 :caption: Sets the share metadata. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) headers = kwargs.pop('headers', {}) headers.update(add_metadata_headers(metadata)) @@ -602,6 +643,7 @@ def set_share_metadata(self, metadata, **kwargs): timeout=timeout, cls=return_response_headers, headers=headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -614,14 +656,23 @@ def get_share_access_policy(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Access policy information in a dict. :rtype: dict[str, Any] """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: response, identifiers = self._client.share.get_access_policy( timeout=timeout, cls=return_headers_and_deserialized, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -644,9 +695,17 @@ def set_share_access_policy(self, signed_identifiers, **kwargs): :type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) if len(signed_identifiers) > 5: raise ValueError( @@ -664,6 +723,7 @@ def set_share_access_policy(self, signed_identifiers, **kwargs): share_acl=signed_identifiers or None, timeout=timeout, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -678,13 +738,22 @@ def get_share_stats(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :return: The approximate size of the data (in bytes) stored on the share. :rtype: int """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: stats = self._client.share.get_statistics( timeout=timeout, + lease_access_conditions=access_conditions, **kwargs) return stats.share_usage_bytes # type: ignore except HttpResponseError as error: diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py index 91cf474e0d6f..bfd3230dfa42 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.4.2" +VERSION = "12.5.0b1" diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py index 82c1550ac2df..0d99845ce901 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py @@ -5,7 +5,7 @@ # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method from typing import ( # pylint: disable=unused-import - Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple, + Union, Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple, TypeVar, TYPE_CHECKING ) @@ -25,7 +25,7 @@ class ShareLeaseClient(LeaseClientBase): """Creates a new ShareLeaseClient. - This client provides lease operations on a ShareFileClient. + This client provides lease operations on a ShareClient or ShareFileClient. :ivar str id: The ID of the lease currently being maintained. This will be `None` if no @@ -38,8 +38,9 @@ class ShareLeaseClient(LeaseClientBase): This will be `None` if no lease has yet been acquired or modified. :param client: - The client of the file to lease. - :type client: ~azure.storage.fileshare.ShareFileClient + The client of the file or share to lease. + :type client: ~azure.storage.fileshare.ShareFileClient or + ~azure.storage.fileshare.ShareClient :param str lease_id: A string representing the lease ID of an existing lease. This value does not need to be specified in order to acquire a new lease, or break one. @@ -61,14 +62,20 @@ async def __aexit__(self, *args): async def acquire(self, **kwargs): # type: (**Any) -> None """Requests a new lease. This operation establishes and manages a lock on a - file for write and delete operations. If the file does not have an active lease, - the File service creates a lease on the file. If the file has an active lease, + file or share for write and delete operations. If the file or share does not have an active lease, + the File or Share service creates a lease on the file or share. If the file has an active lease, you can only request a new lease using the active lease ID. - If the file does not have an active lease, the File service creates a + If the file or share does not have an active lease, the File or Share service creates a lease on the file and returns a new lease ID. + :keyword int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be + between 15 and 60 seconds. A share lease duration cannot be changed + using renew or change. Default is -1 (infinite share lease). + :keyword int timeout: The timeout parameter is expressed in seconds. :rtype: None @@ -90,7 +97,7 @@ async def acquire(self, **kwargs): self.etag = response.get('etag') # type: str @distributed_trace_async - async def _renew(self, **kwargs): + async def renew(self, **kwargs): # type: (Any) -> None """Renews the share lease. @@ -125,8 +132,8 @@ async def _renew(self, **kwargs): async def release(self, **kwargs): # type: (Any) -> None """Releases the lease. The lease may be released if the lease ID specified on the request matches - that associated with the file. Releasing the lease allows another client to immediately acquire - the lease for the file as soon as the release is complete. + that associated with the share or file. Releasing the lease allows another client to immediately acquire + the lease for the share or file as soon as the release is complete. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -153,7 +160,7 @@ async def change(self, proposed_lease_id, **kwargs): a new lease ID in x-ms-proposed-lease-id. :param str proposed_lease_id: - Proposed lease ID, in a GUID string format. The File service raises an error + Proposed lease ID, in a GUID string format. The File or Share service raises an error (Invalid request) if the proposed lease ID is not in the correct format. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -177,7 +184,7 @@ async def change(self, proposed_lease_id, **kwargs): @distributed_trace_async async def break_lease(self, **kwargs): # type: (Any) -> int - """Force breaks the lease if the file has an active lease. Any authorized request can break the lease; + """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease; the request is not required to specify a matching lease ID. An infinite lease breaks immediately. Once a lease is broken, it cannot be changed. Any authorized request can break the lease; @@ -185,6 +192,19 @@ async def break_lease(self, **kwargs): When a lease is successfully broken, the response indicates the interval in seconds until a new lease can be acquired. + :keyword int lease_break_period: + This is the proposed duration of seconds that the share lease + should continue before it is broken, between 0 and 60 seconds. This + break period is only used if it is shorter than the time remaining + on the share lease. If longer, the time remaining on the share lease is used. + A new share lease will not be available before the break period has + expired, but the share lease may be held for longer than the break + period. If this header does not appear with a break + operation, a fixed-duration share lease breaks after the remaining share lease + period elapses, and an infinite share lease breaks immediately. + + .. versionadded:: 12.5.0 + :keyword int timeout: The timeout parameter is expressed in seconds. :return: Approximate time remaining in the lease period, in seconds. diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py index 5ceae138861e..05fc93b88473 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py @@ -24,7 +24,7 @@ SignedIdentifier, DeleteSnapshotsOptionType) from .._deserialize import deserialize_share_properties, deserialize_permission -from .._serialize import get_api_version +from .._serialize import get_api_version, get_access_conditions from .._share_client import ShareClient as ShareClientBase from ._directory_client_async import ShareDirectoryClient from ._file_client_async import ShareFileClient @@ -130,21 +130,21 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode, loop=self._loop) @distributed_trace_async() - async def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): - # type: (int, Optional[str], **Any) -> ShareLeaseClient + async def acquire_lease(self, **kwargs): + # type: (**Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share Service creates a lease on the share and returns a new lease. - .. versionadded:: 12.6.0 + .. versionadded:: 12.5.0 - :param int lease_duration: + :keyword int lease_duration: Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. Default is -1 (infinite lease). - :param str lease_id: + :keyword str lease_id: Proposed lease ID, in a GUID string format. The Share Service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. @@ -162,7 +162,8 @@ async def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): :dedent: 8 :caption: Acquiring a lease on a share. """ - kwargs['lease_duration'] = lease_duration + kwargs['lease_duration'] = kwargs.pop('lease_duration', -1) + lease_id = kwargs.pop('lease_id', None) lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore await lease.acquire(**kwargs) return lease @@ -182,7 +183,7 @@ async def create_share(self, **kwargs): Possible values: 'TransactionOptimized', 'Hot', 'Cool' :paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword int timeout: The timeout parameter is expressed in seconds. @@ -290,6 +291,13 @@ async def delete_share( Indicates if snapshots are to be deleted. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + .. admonition:: Example: .. literalinclude:: ../samples/file_samples_share_async.py @@ -299,6 +307,7 @@ async def delete_share( :dedent: 16 :caption: Deletes the share and any snapshots. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) delete_include = None if delete_snapshots: @@ -308,6 +317,7 @@ async def delete_share( timeout=timeout, sharesnapshot=self.snapshot, delete_snapshots=delete_include, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -321,6 +331,13 @@ async def get_share_properties(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: The share properties. :rtype: ~azure.storage.fileshare.ShareProperties @@ -333,12 +350,14 @@ async def get_share_properties(self, **kwargs): :dedent: 16 :caption: Gets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: props = await self._client.share.get_properties( timeout=timeout, sharesnapshot=self.snapshot, cls=deserialize_share_properties, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -356,6 +375,13 @@ async def set_share_quota(self, quota, **kwargs): Must be greater than 0, and less than or equal to 5TB. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -368,6 +394,7 @@ async def set_share_quota(self, quota, **kwargs): :dedent: 16 :caption: Sets the share quota. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: return await self._client.share.set_properties( # type: ignore @@ -375,6 +402,7 @@ async def set_share_quota(self, quota, **kwargs): quota=quota, access_tier=None, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -383,7 +411,7 @@ async def set_share_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] """Sets the share properties. - .. versionadded:: 12.6.0 + .. versionadded:: 12.3.0 :keyword access_tier: Specifies the access tier of the share. @@ -398,6 +426,9 @@ async def set_share_properties(self, **kwargs): Root squash to set on the share. Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash' :paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -410,6 +441,7 @@ async def set_share_properties(self, **kwargs): :dedent: 16 :caption: Sets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) access_tier = kwargs.pop('access_tier', None) quota = kwargs.pop('quota', None) @@ -422,6 +454,7 @@ async def set_share_properties(self, **kwargs): quota=quota, access_tier=access_tier, root_squash=root_squash, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -441,6 +474,13 @@ async def set_share_metadata(self, metadata, **kwargs): :type metadata: dict(str, str) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -453,6 +493,7 @@ async def set_share_metadata(self, metadata, **kwargs): :dedent: 16 :caption: Sets the share metadata. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) headers = kwargs.pop('headers', {}) headers.update(add_metadata_headers(metadata)) @@ -461,6 +502,7 @@ async def set_share_metadata(self, metadata, **kwargs): timeout=timeout, cls=return_response_headers, headers=headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -473,14 +515,23 @@ async def get_share_access_policy(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Access policy information in a dict. :rtype: dict[str, Any] """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: response, identifiers = await self._client.share.get_access_policy( timeout=timeout, cls=return_headers_and_deserialized, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -503,9 +554,17 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs): :type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) if len(signed_identifiers) > 5: raise ValueError( @@ -524,6 +583,7 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs): share_acl=signed_identifiers or None, timeout=timeout, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -538,13 +598,22 @@ async def get_share_stats(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :return: The approximate size of the data (in bytes) stored on the share. :rtype: int """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: stats = await self._client.share.get_statistics( timeout=timeout, + lease_access_conditions=access_conditions, **kwargs) return stats.share_usage_bytes # type: ignore except HttpResponseError as error: diff --git a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py index 5693e8613090..866e70daa2a5 100644 --- a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py +++ b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py @@ -143,6 +143,21 @@ def get_directory_or_file_client(self): # Get the file client to interact with a specific file my_file = share.get_file_client("dir1/myfile") + def acquire_share_lease(self): + # Instantiate the ShareClient from a connection string + from azure.storage.fileshare import ShareClient + share = ShareClient.from_connection_string(self.connection_string, "sharesamples") + + # Create the share + share.create_share() + + # [START acquire_and_release_lease_on_share] + share.create_directory("mydir") + lease = share.acquire_lease() + share.get_share_properties(lease=lease) + share.delete_share(lease=lease) + # [END acquire_and_release_lease_on_share] + if __name__ == '__main__': sample = ShareSamples() @@ -151,3 +166,4 @@ def get_directory_or_file_client(self): sample.set_share_properties() sample.list_directories_and_files() sample.get_directory_or_file_client() + sample.acquire_share_lease() diff --git a/sdk/storage/azure-storage-file-share/setup.py b/sdk/storage/azure-storage-file-share/setup.py index a2cea96e1294..df38d0044dea 100644 --- a/sdk/storage/azure-storage-file-share/setup.py +++ b/sdk/storage/azure-storage-file-share/setup.py @@ -59,7 +59,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file-share', classifiers=[ - "Development Status :: 5 - Production/Stable", + "Development Status :: 4 - Beta", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', diff --git a/sdk/storage/azure-storage-file-share/tests/test_share.py b/sdk/storage/azure-storage-file-share/tests/test_share.py index 2587ff91b893..93450b6a59ee 100644 --- a/sdk/storage/azure-storage-file-share/tests/test_share.py +++ b/sdk/storage/azure-storage-file-share/tests/test_share.py @@ -186,7 +186,6 @@ def test_undelete_share(self, resource_group, location, storage_account, storage props = restored_share_client.get_share_properties() self.assertIsNotNone(props) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -196,7 +195,6 @@ def test_lease_share_acquire_and_release(self, resource_group, location, storage lease.release() # Assert - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -234,7 +232,6 @@ def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_ share_lease.release() self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -254,7 +251,6 @@ def test_lease_share_renew(self, resource_group, location, storage_account, stor self.sleep(10) share_client.delete_share() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -269,7 +265,6 @@ def test_lease_share_with_duration(self, resource_group, location, storage_accou self.sleep(15) share_client.acquire_lease() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -282,7 +277,6 @@ def test_lease_share_twice(self, resource_group, location, storage_account, stor lease2 = share_client.acquire_lease(lease_id=lease.id) self.assertEqual(lease.id, lease2.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -295,7 +289,6 @@ def test_lease_share_with_proposed_lease_id(self, resource_group, location, stor # Assert self.assertEqual(proposed_lease_id, lease.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -315,7 +308,6 @@ def test_lease_share_change_lease_id(self, resource_group, location, storage_acc self.assertNotEqual(lease_id1, lease_id) self.assertEqual(lease_id2, lease_id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -330,7 +322,6 @@ def test_set_share_metadata_with_lease_id(self, resource_group, location, storag md = share_client.get_share_properties().metadata self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -345,7 +336,6 @@ def test_get_share_metadata_with_lease_id(self, resource_group, location, storag # Assert self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -365,7 +355,6 @@ def test_get_share_properties_with_lease_id(self, resource_group, location, stor self.assertEqual(props.lease.state, 'leased') self.assertEqual(props.lease.status, 'locked') - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -379,7 +368,6 @@ def test_get_share_acl_with_lease_id(self, resource_group, location, storage_acc self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -399,7 +387,6 @@ def test_set_share_acl_with_lease_id(self, resource_group, location, storage_acc self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -414,7 +401,6 @@ def test_lease_share_break_period(self, resource_group, location, storage_accoun with self.assertRaises(HttpResponseError): share_client.delete_share(lease=lease) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -649,7 +635,6 @@ def test_list_shares_no_options_for_premium_account(self, resource_group, locati self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time) self._delete_shares() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) diff --git a/sdk/storage/azure-storage-file-share/tests/test_share_async.py b/sdk/storage/azure-storage-file-share/tests/test_share_async.py index d9ff6b973d7d..e6f9ec6ba6b3 100644 --- a/sdk/storage/azure-storage-file-share/tests/test_share_async.py +++ b/sdk/storage/azure-storage-file-share/tests/test_share_async.py @@ -203,7 +203,6 @@ async def test_undelete_share(self, resource_group, location, storage_account, s self.assertIsNotNone(props) break - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key): @@ -214,7 +213,6 @@ async def test_lease_share_acquire_and_release(self, resource_group, location, s await lease.release() # Assert - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key): @@ -253,7 +251,6 @@ async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, st await share_lease.release() await self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key): @@ -274,7 +271,6 @@ async def test_lease_share_renew(self, resource_group, location, storage_account self.sleep(10) await share_client.delete_share() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key): @@ -290,7 +286,6 @@ async def test_lease_share_with_duration(self, resource_group, location, storage self.sleep(15) await share_client.acquire_lease() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key): @@ -304,7 +299,6 @@ async def test_lease_share_twice(self, resource_group, location, storage_account lease2 = await share_client.acquire_lease(lease_id=lease.id) self.assertEqual(lease.id, lease2.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -318,7 +312,6 @@ async def test_lease_share_with_proposed_lease_id(self, resource_group, location # Assert self.assertEqual(proposed_lease_id, lease.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -339,7 +332,6 @@ async def test_lease_share_change_lease_id(self, resource_group, location, stora self.assertNotEqual(lease_id1, lease_id) self.assertEqual(lease_id2, lease_id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -356,7 +348,6 @@ async def test_set_share_metadata_with_lease_id(self, resource_group, location, md = props.metadata self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -373,7 +364,6 @@ async def test_get_share_metadata_with_lease_id(self, resource_group, location, # Assert self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -394,7 +384,6 @@ async def test_get_share_properties_with_lease_id(self, resource_group, location self.assertEqual(props.lease.state, 'leased') self.assertEqual(props.lease.status, 'locked') - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -409,7 +398,6 @@ async def test_get_share_acl_with_lease_id(self, resource_group, location, stora self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -430,7 +418,6 @@ async def test_set_share_acl_with_lease_id(self, resource_group, location, stora self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key): @@ -446,7 +433,6 @@ async def test_lease_share_break_period(self, resource_group, location, storage_ with self.assertRaises(HttpResponseError): await share_client.delete_share(lease=lease) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -705,7 +691,6 @@ async def test_list_shares_no_options_for_premium_account_async(self, resource_g self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time) await self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key): diff --git a/shared_requirements.txt b/shared_requirements.txt index 7f9c1514c5bc..768fe319ac94 100644 --- a/shared_requirements.txt +++ b/shared_requirements.txt @@ -148,14 +148,14 @@ pyjwt>=1.7.1 #override azure-ai-formrecognizer msrest>=0.6.21 #override azure-ai-formrecognizer azure-core<2.0.0,>=1.8.2 #override azure-storage-blob azure-core<2.0.0,>=1.10.0 -#override azure-storage-blob msrest>=0.6.18 +#override azure-storage-blob msrest>=0.6.21 #override azure-storage-blob-changefeed azure-storage-blob>=12.5.0,<13.0.0 #override azure-storage-queue azure-core<2.0.0,>=1.10.0 #override azure-storage-queue msrest>=0.6.18 #override azure-storage-file-share msrest>=0.6.18 #override azure-storage-file-share azure-core<2.0.0,>=1.10.0 #override azure-storage-file-datalake azure-core<2.0.0,>=1.10.0 -#override azure-storage-file-datalake msrest>=0.6.18 +#override azure-storage-file-datalake msrest>=0.6.21 #override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.8.0b1 #override azure-security-attestation msrest>=0.6.0 #override azure-security-attestation azure-core<2.0.0,>=1.8.2 @@ -271,4 +271,4 @@ opentelemetry-sdk<2.0.0,>=1.0.0 #override azure-mgmt-elastic msrest>=0.6.21 #override azure-mgmt-confidentialledger msrest>=0.6.21 #override azure-mgmt-mixedreality msrest>=0.6.21 -#override azure-mgmt-extendedlocation msrest>=0.6.21 +#override azure-mgmt-extendedlocation msrest>=0.6.21 \ No newline at end of file