U
    ÒZjñ|  ã                   @   s  d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZm Z  e !e"¡Z#d
Z$di iZ%G dd„ dƒZ&G dd„ de&ƒZ'G dd„ de(eƒZ)G dd„ dƒZ*dS )zÛResolves regions and endpoints.

This module implements endpoint resolution, including resolving endpoints for a
given service and region and resolving the available endpoints for a service
in a specific AWS partition.
é    N)ÚEnum)ÚUNSIGNEDÚ
xform_name)ÚAUTH_TYPE_MAPSÚHAS_CRT©ÚCRT_SUPPORTED_AUTH_TYPES)ÚEndpointProvider)ÚEndpointProviderErrorÚEndpointVariantErrorÚInvalidHostLabelErrorÚMissingDependencyExceptionÚNoRegionErrorÚParamValidationErrorÚ$UnknownEndpointResolutionBuiltInNameÚUnknownRegionErrorÚUnknownSignatureVersionErrorÚ*UnsupportedS3AccesspointConfigurationErrorÚUnsupportedS3ConfigurationErrorÚUnsupportedS3ControlArnErrorÚ&UnsupportedS3ControlConfigurationError)Úensure_booleanÚinstance_cachez{service}.{region}.{dnsSuffix}Ú	endpointsc                   @   s,   e Zd ZdZddd„Zdd„ Zdd	d
„ZdS )ÚBaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.Nc                 C   s   t ‚dS )a7  Resolves an endpoint for a service and region combination.

        :type service_name: string
        :param service_name: Name of the service to resolve an endpoint for
            (e.g., s3)

        :type region_name: string
        :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
            if no region is provided, the first found partition-wide endpoint
            will be used if available.

        :rtype: dict
        :return: Returns a dict containing the following keys:
            - partition: (string, required) Resolved partition name
            - endpointName: (string, required) Resolved endpoint name
            - hostname: (string, required) Hostname to use for this endpoint
            - sslCommonName: (string) sslCommonName to use for this endpoint.
            - credentialScope: (dict) Signature version 4 credential scope
              - region: (string) region name override when signing.
              - service: (string) service name override when signing.
            - signatureVersions: (list<string>) A list of possible signature
              versions, including s3, v4, v2, and s3v4
            - protocols: (list<string>) A list of supported protocols
              (e.g., http, https)
            - ...: Other keys may be included as well based on the metadata
        N©ÚNotImplementedError)ÚselfÚservice_nameÚregion_name© r    úS/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/botocore/regions.pyÚconstruct_endpoint5   s    z'BaseEndpointResolver.construct_endpointc                 C   s   t ‚dS )z�Lists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        Nr   ©r   r    r    r!   Úget_available_partitionsR   s    z-BaseEndpointResolver.get_available_partitionsÚawsFc                 C   s   t ‚dS )aÒ  Lists the endpoint names of a particular partition.

        :type service_name: string
        :param service_name: Name of a service to list endpoint for (e.g., s3)

        :type partition_name: string
        :param partition_name: Name of the partition to limit endpoints to.
            (e.g., aws for the public AWS endpoints, aws-cn for AWS China
            endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.

        :type allow_non_regional: bool
        :param allow_non_regional: Set to True to include endpoints that are
             not regional endpoints (e.g., s3-external-1,
             fips-us-gov-west-1, etc).
        :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
        Nr   )r   r   Úpartition_nameÚallow_non_regionalr    r    r!   Úget_available_endpointsY   s    z,BaseEndpointResolver.get_available_endpoints)N)r%   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r$   r(   r    r    r    r!   r   2   s   
   ÿr   c                   @   sœ   e Zd ZdZddgZd%dd„Zd&dd	„Zd
d„ Zd'dd„Zd(dd„Z	d)dd„Z
dd„ Zd*dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )+ÚEndpointResolverz7Resolves endpoints based on partition endpoint metadatazaws-isoz	aws-iso-bFc                 C   s    d|krt dƒ‚|| _|| _dS )a  
        :type endpoint_data: dict
        :param endpoint_data: A dict of partition data.

        :type uses_builtin_data: boolean
        :param uses_builtin_data: Whether the endpoint data originates in the
            package's data directory.
        Ú
partitionsz%Missing "partitions" in endpoint dataN)Ú
ValueErrorÚ_endpoint_dataÚuses_builtin_data)r   Úendpoint_datar1   r    r    r!   Ú__init__t   s    	zEndpointResolver.__init__r%   c                 C   sB   | j d D ]2}|d |krq
|d }||kr.q
|| d   S d S )Nr.   Ú	partitionÚservicesr   )r0   )r   r   r&   r4   r5   r    r    r!   Úget_service_endpoints_data‚   s    z+EndpointResolver.get_service_endpoints_datac                 C   s&   g }| j d D ]}| |d ¡ q|S )Nr.   r4   )r0   Úappend)r   Úresultr4   r    r    r!   r$   ‹   s    z)EndpointResolver.get_available_partitionsNc                 C   s”   g }| j d D ]€}|d |kr q|d }||kr2q|| d }|D ]J}	|	|d k}
|rz|
rz|  ||	 |¡}|rŒ| |	¡ qB|s‚|
rB| |	¡ qBq|S )Nr.   r4   r5   r   Úregions)r0   Ú_retrieve_variant_datar7   )r   r   r&   r'   Úendpoint_variant_tagsr8   r4   r5   Zservice_endpointsÚendpoint_nameZis_regional_endpointZvariant_datar    r    r!   r(   ‘   s(     ÿz(EndpointResolver.get_available_endpointsc                 C   s\   | j d D ]L}|d |kr
|rJ|  | d¡|¡}|rVd|krV|d   S q
|d   S q
d S )Nr.   r4   ÚdefaultsÚ	dnsSuffix)r0   r:   Úget)r   r&   r;   r4   Úvariantr    r    r!   Úget_partition_dns_suffix­   s     ÿz)EndpointResolver.get_partition_dns_suffixc           	      C   s®   |dkr|r|d krd}|d k	rhd }| j d D ]}|d |kr.|}q.|d k	rd|  |||||d¡}|S d S | j d D ]6}|rŠ|d | jkrŠqr|  |||||¡}|rr|  S qrd S )NÚs3z	us-east-1r.   r4   T)r0   Ú_endpoint_for_partitionÚ!_UNSUPPORTED_DUALSTACK_PARTITIONS)	r   r   r   r&   Úuse_dualstack_endpointÚuse_fips_endpointZvalid_partitionr4   r8   r    r    r!   r"   ¼   sN    	ÿþýúÿÿûz#EndpointResolver.construct_endpointc                 C   s8   | j d D ]}|  ||¡r
|d   S q
t|dd�‚d S )Nr.   r4   z,No partition found for provided region_name.)r   Ú	error_msg)r0   Ú_region_matchr   )r   r   r4   r    r    r!   Úget_partition_for_regionî   s    þz)EndpointResolver.get_partition_for_regionc                 C   sö   |d }|r,|| j kr,d| }tdg|d�‚|d  |t¡}	|d kr\d|	krV|	d }ntƒ ‚|||	|||dœ}
||	d kr†| jf |
ŽS |  ||¡s–|rò|	 d¡}|	 d	d
¡}|rØ|sØt d|||¡ ||
d< | jf |
ŽS t d||¡ | jf |
ŽS d S )Nr4   z@Dualstack endpoints are currently not supported for %s partitionÚ	dualstack©ÚtagsrG   r5   ZpartitionEndpoint)r4   r   Úservice_datar<   rE   rF   r   ZisRegionalizedTz'Using partition endpoint for %s, %s: %sr<   z*Creating a regex based endpoint for %s, %s)	rD   r   r?   ÚDEFAULT_SERVICE_DATAr   Ú_resolverH   ÚLOGÚdebug)r   r4   r   r   rE   rF   Zforce_partitionr&   rG   rM   Zresolve_kwargsZpartition_endpointZis_regionalizedr    r    r!   rC   ÷   sZ    	ÿþÿÿ ÿ
ú

üýz(EndpointResolver._endpoint_for_partitionc                 C   s0   ||d krdS d|kr,t  |d ¡ |¡S dS )Nr9   TZregionRegexF)ÚreÚcompileÚmatch)r   r4   r   r    r    r!   rH   8  s
    zEndpointResolver._region_matchc                 C   s>   |  dg ¡}|D ](}t|d ƒt|ƒkr| ¡ }|  S qd S )NÚvariantsrL   )r?   ÚsetÚcopy)r   r2   rL   rU   r@   r8   r    r    r!   r:   ?  s
    z'EndpointResolver._retrieve_variant_datac                 C   s$   g }|r|  d¡ |r |  d¡ |S )NrJ   Zfips)r7   )r   rE   rF   rL   r    r    r!   Ú_create_tag_listF  s    

z!EndpointResolver._create_tag_listc                 C   s4   i }|||fD ] }|   ||¡}|r|  ||¡ q|S ©N)r:   Ú_merge_keys)r   rL   r2   Úservice_defaultsÚpartition_defaultsr8   rU   r@   r    r    r!   Ú_resolve_variantN  s    z!EndpointResolver._resolve_variantc                 C   s$  |  di ¡  |i ¡}|  d¡r,t d| ¡ |  di ¡}|  di ¡}	|  ||¡}
|
r–|  |
|||	¡}|i krˆd|› d|› �}t|
|d�‚|  ||¡ n|}d|kr®|d |d< |d	 |d	< ||d
< |  ||¡ |  |	|¡ |  ||d |||d ¡|d< d|k�r |  ||d |||d ¡|d< |S )Nr   Ú
deprecatedz5Client is configured with the deprecated endpoint: %sr=   zEndpoint does not exist for z in region rK   r>   r4   ZendpointNameÚhostnameZsslCommonName)r?   rP   ÚwarningrX   r]   r   rZ   Ú_expand_template)r   r4   r   rM   r<   rE   rF   r2   r[   r\   rL   r8   rG   r    r    r!   rO   X  s`    	 ÿ
ÿÿ   ÿÿû
ûzEndpointResolver._resolvec                 C   s"   |D ]}||kr|| ||< qd S rY   r    )r   Ú	from_datar8   Úkeyr    r    r!   rZ   š  s    zEndpointResolver._merge_keysc                 C   s   |j |||d�S )N)ZserviceÚregionr>   )Úformat)r   r4   Útemplater   r<   r>   r    r    r!   ra   Ÿ  s
      ÿz!EndpointResolver._expand_template)F)r%   )r%   FN)N)NNFF)F)r)   r*   r+   r,   rD   r3   r6   r$   r(   rA   r"   rI   rC   rH   r:   rX   r]   rO   rZ   ra   r    r    r    r!   r-   o   s4   

		   û
 ÿ
    ú
2 ù
A
Br-   c                   @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )ÚEndpointResolverBuiltinszAWS::RegionzAWS::UseFIPSzAWS::UseDualStackzAWS::STS::UseGlobalEndpointzAWS::S3::UseGlobalEndpointzAWS::S3::AcceleratezAWS::S3::ForcePathStylezAWS::S3::UseArnRegionzAWS::S3Control::UseArnRegionz'AWS::S3::DisableMultiRegionAccessPointszSDK::EndpointN)r)   r*   r+   Z
AWS_REGIONZAWS_USE_FIPSZAWS_USE_DUALSTACKZAWS_STS_USE_GLOBAL_ENDPOINTZAWS_S3_USE_GLOBAL_ENDPOINTZAWS_S3_ACCELERATEZAWS_S3_FORCE_PATH_STYLEZAWS_S3_USE_ARN_REGIONZAWS_S3CONTROL_USE_ARN_REGIONZAWS_S3_DISABLE_MRAPZSDK_ENDPOINTr    r    r    r!   rg   §  s   rg   c                   @   sž   e Zd ZdZd$dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdS )%ÚEndpointRulesetResolverz5Resolves endpoints using a service's endpoint rulesetTNc	           	      C   sH   t ||d�| _| jjj| _|| _|| _|| _|| _|| _	|| _
i | _d S )N)Zruleset_dataÚpartition_data)r	   Ú	_providerZrulesetÚ
parametersÚ_param_definitionsÚ_service_modelÚ	_builtinsÚ_client_contextÚ_event_emitterÚ_use_sslÚ_requested_auth_schemeZ_instance_cache)	r   Zendpoint_ruleset_datari   Zservice_modelÚbuiltinsZclient_contextZevent_emitterZuse_sslZrequested_auth_schemer    r    r!   r3   É  s    þz EndpointRulesetResolver.__init__c              
   C   sæ   |dkri }|dkri }|   |||¡}t d| ¡ z| jjf |Ž}W n@ tk
r† } z"|  ||¡}|dkrp‚ n||‚W 5 d}~X Y nX t d|j ¡ | jsÆ|j 	d¡rÆ|j
d|jdd… › �d�}|j
dd	„ |j ¡ D ƒd
�}|S )zAInvokes the provider with params defined in the service's rulesetNz-Calling endpoint provider with parameters: %szEndpoint provider result: %szhttps://zhttp://é   )Úurlc                 S   s   i | ]\}}||d  “qS )r   r    )Ú.0rc   Úvalr    r    r!   Ú
<dictcomp>  s     z>EndpointRulesetResolver.construct_endpoint.<locals>.<dictcomp>)Úheaders)Ú_get_provider_paramsrP   rQ   rj   Zresolve_endpointr
   Ú#ruleset_error_to_botocore_exceptionru   rq   Ú
startswithÚ_replacery   Úitems)r   Úoperation_modelÚ	call_argsÚrequest_contextÚprovider_paramsZprovider_resultÚexZbotocore_exceptionr    r    r!   r"   á  sF      ÿÿÿ ÿÿÿÿz*EndpointRulesetResolver.construct_endpointc           	      C   sl   i }|   |||¡}| j ¡ D ]J\}}| j|||d�}|dkrV|jdk	rV| j|j|d�}|dk	r|||< q|S )a…  Resolve a value for each parameter defined in the service's ruleset

        The resolution order for parameter values is:
        1. Operation-specific static context values from the service definition
        2. Operation-specific dynamic context values from API parameters
        3. Client-specific context parameters
        4. Built-in values such as region, FIPS usage, ...
        )Ú
param_namer   r€   N)Úbuiltin_namers   )Ú_get_customized_builtinsrl   r~   Ú_resolve_param_from_contextÚbuiltinÚ_resolve_param_as_builtin)	r   r   r€   r�   r‚   Úcustomized_builtinsr„   Z	param_defZ	param_valr    r    r!   rz     s(      ÿýþ
z,EndpointRulesetResolver._get_provider_paramsc                 C   s<   |   ||¡}|d k	r|S |  |||¡}|d k	r2|S |  |¡S rY   )Ú&_resolve_param_as_static_context_paramÚ'_resolve_param_as_dynamic_context_paramÚ&_resolve_param_as_client_context_param)r   r„   r   r€   ZstaticZdynamicr    r    r!   r‡   4  s     ÿ  ÿz3EndpointRulesetResolver._resolve_param_from_contextc                 C   s   |   |¡}| |¡S rY   )Ú_get_static_context_paramsr?   )r   r„   r   Zstatic_ctx_paramsr    r    r!   r‹   C  s    
z>EndpointRulesetResolver._resolve_param_as_static_context_paramc                 C   s(   |   |¡}||kr$|| }| |¡S d S rY   )Ú_get_dynamic_context_paramsr?   )r   r„   r   r€   Zdynamic_ctx_paramsÚmember_namer    r    r!   rŒ   I  s    
z?EndpointRulesetResolver._resolve_param_as_dynamic_context_paramc                 C   s(   |   ¡ }||kr$|| }| j |¡S d S rY   )Ú_get_client_context_paramsro   r?   )r   r„   Zclient_ctx_paramsZclient_ctx_varnamer    r    r!   r�   Q  s    z>EndpointRulesetResolver._resolve_param_as_client_context_paramc                 C   s"   |t j ¡ krt|d�‚| |¡S )N©Úname)rg   Ú__members__Úvaluesr   r?   )r   r…   rs   r    r    r!   r‰   W  s    
z1EndpointRulesetResolver._resolve_param_as_builtinc                 C   s   dd„ |j D ƒS )z=Mapping of param names to static param value for an operationc                 S   s   i | ]}|j |j“qS r    )r“   Úvalue©rv   Úparamr    r    r!   rx   _  s   ÿ zFEndpointRulesetResolver._get_static_context_params.<locals>.<dictcomp>)Zstatic_context_parameters©r   r   r    r    r!   rŽ   \  s    þz2EndpointRulesetResolver._get_static_context_paramsc                 C   s   dd„ |j D ƒS )z7Mapping of param names to member names for an operationc                 S   s   i | ]}|j |j“qS r    )r“   r�   r—   r    r    r!   rx   g  s   ÿ zGEndpointRulesetResolver._get_dynamic_context_params.<locals>.<dictcomp>)Zcontext_parametersr™   r    r    r!   r�   d  s    þz3EndpointRulesetResolver._get_dynamic_context_paramsc                 C   s   dd„ | j jD ƒS )z7Mapping of param names to client configuration variablec                 S   s   i | ]}|j t|j ƒ“qS r    )r“   r   r—   r    r    r!   rx   o  s   ÿ zFEndpointRulesetResolver._get_client_context_params.<locals>.<dictcomp>)rm   Zclient_context_parametersr#   r    r    r!   r‘   l  s    þz2EndpointRulesetResolver._get_client_context_paramsc                 C   s6   | j j ¡ }t | j¡}| jjd| ||||d� |S )Nzbefore-endpoint-resolution.%s)rs   ÚmodelÚparamsÚcontext)rm   Ú
service_idZ	hyphenizerW   rn   rp   Úemit)r   r   r€   r�   r�   rŠ   r    r    r!   r†   t  s    ûz0EndpointRulesetResolver._get_customized_builtinsc                    sÀ  t |tƒrt|ƒdkrtdƒ‚t dd dd„ |D ƒ¡ˆ j¡ ˆ jtkrPdi fS ‡ fdd„|D ƒ}ˆ jd	k	rªzt	‡ fd
d„|D ƒƒ\}}W n t
k
r¦   d	i f Y S X n~zt	dd„ |D ƒƒ\}}W nb t
k
�r&   d}dd„ |D ƒ}t�s tdd„ |D ƒƒ}|�rtdd�‚ntd |¡d�‚Y nX i }d|k�rD|d |d< n,d|k�rpt|d ƒdk�rp|d d |d< d|k�rŠ|j|d d� d|k�r¤t|d ƒ|d< t d|d ||¡ ||fS )að  Convert an Endpoint's authSchemes property to a signing_context dict

        :type auth_schemes: list
        :param auth_schemes: A list of dictionaries taken from the
            ``authSchemes`` property of an Endpoint object returned by
            ``EndpointProvider``.

        :rtype: str, dict
        :return: Tuple of auth type string (to be used in
            ``request_context['auth_type']``) and signing context dict (for use
            in ``request_context['signing']``).
        r   z&auth_schemes must be a non-empty list.z_Selecting from endpoint provider's list of auth schemes: %s. User selected auth scheme is: "%s"z, c                 S   s   g | ]}d |  d¡› d �‘qS )ú"r“   )r?   ©rv   Úsr    r    r!   Ú
<listcomp>–  s     zGEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<listcomp>Únonec                    s"   g | ]}|d ˆ   |d  ¡i–‘qS r’   )Ú_strip_sig_prefix©rv   Úschemer#   r    r!   r¢   �  s   ÿNc                 3   s*   | ]"}ˆ   ˆ j|d  ¡rˆ j|fV  qdS ©r“   N)Ú._does_botocore_authname_match_ruleset_authnamerr   r    r#   r    r!   Ú	<genexpr>¦  s    ÿþzFEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<genexpr>c                 s   s&   | ]}|d  t kr|d  |fV  qdS r§   )r   r    r    r    r!   r©   ´  s   þFc                 S   s   g | ]}|d  ‘qS r’   r    r    r    r    r!   r¢   ¾  s     c                 s   s   | ]}|t kV  qd S rY   r   r¥   r    r    r!   r©   À  s   ÿzbThis operation requires an additional dependency. Use pip install botocore[crt] before proceeding.©Úmsg)Zsignature_versionZsigningRegionrd   ZsigningRegionSetZsigningName)Zsigning_nameZdisableDoubleEncodingz?Selected auth type "%s" as "%s" with signing context params: %sr“   )Ú
isinstanceÚlistÚlenÚ	TypeErrorrP   rQ   Újoinrr   r   ÚnextÚStopIterationr   Úanyr   r   Úupdater   )r   Zauth_schemesr“   r¦   Zfixable_with_crtZauth_type_optionsZsigning_contextr    r#   r!   Úauth_schemes_to_signing_ctxƒ  sp    ü

þ
þþþÿÿ



ÿüz3EndpointRulesetResolver.auth_schemes_to_signing_ctxc                 C   s   |  d¡r|dd… S |S )z6Normalize auth type names by removing any "sig" prefixÚsigé   N)r|   )r   Z	auth_namer    r    r!   r¤   ä  s    z)EndpointRulesetResolver._strip_sig_prefixc                 C   s>   |   |¡}| d¡d }|dkr6| d¡r6|dd… }||kS )a\  
        Whether a valid string provided as signature_version parameter for
        client construction refers to the same auth methods as a string
        returned by the endpoint ruleset provider. This accounts for:

        * The ruleset prefixes auth names with "sig"
        * The s3 and s3control rulesets don't distinguish between v4[a] and
          s3v4[a] signers
        * The v2, v3, and HMAC v1 based signers (s3, s3-*) are botocore legacy
          features and do not exist in the rulesets
        * Only characters up to the first dash are considered

        Example matches:
        * v4, sigv4
        * v4, v4
        * s3v4, sigv4
        * s3v7, sigv7 (hypothetical example)
        * s3v4a, sigv4a
        * s3v4-query, sigv4

        Example mismatches:
        * v4a, sigv4
        * s3, sigv4
        * s3-presign-post, sigv4
        ú-r   rB   é   N)r¤   Úsplitr|   )r   ZbotonameZrsnamer    r    r!   r¨   è  s
    
zFEndpointRulesetResolver._does_botocore_authname_match_ruleset_authnamec                 C   sF  |j  d¡}|dkrdS | d¡rXz| d¡d }W n tk
rL   |}Y nX t|d�S | jj}|dkrà|dksx|d	kr‚t|d
�S | d¡s¾| d¡s¾| d¡s¾| d¡s¾| d¡s¾| d¡rÈt	|d
�S | 
¡  d¡ràt|d�S |dk�rB| d¡�r| d¡}t||d�S | d¡�s$| d¡�r.t|d
�S |dk�rBt|d�S dS )z„Attempts to translate ruleset errors to pre-existing botocore
        exception types by string matching exception strings.
        r«   NzInvalid region in ARN: ú`é   )ÚlabelrB   z/S3 Object Lambda does not support S3 Acceleratez#Accelerate cannot be used with FIPSrª   zS3 Outposts does not supportzS3 MRAP does not supportz!S3 Object Lambda does not supportzAccess Points do not supportzInvalid configuration:z#Client was configured for partitionzinvalid arn:)ÚreportZ	s3controlzInvalid ARN:ZBucket)Úarnr«   z!AccountId is required but not set)Úkwargsr?   r|   rº   Ú
IndexErrorr   rm   r   r   r   Úlowerr   r   r   )r   Zruleset_exceptionr›   r«   r½   r   r¿   r    r    r!   r{     sT    


ÿþ
ÿþýüûú



ÿ


z;EndpointRulesetResolver.ruleset_error_to_botocore_exception)TN)r)   r*   r+   r,   r3   r"   rz   r‡   r‹   rŒ   r�   r‰   r   rŽ   r�   r‘   r†   rµ   r¤   r¨   r{   r    r    r    r!   rh   Æ  s,   
  ÷
2!


a rh   )+r,   rW   ÚloggingrR   Úenumr   Zbotocorer   r   Zbotocore.authr   r   Zbotocore.crtr   Zbotocore.endpoint_providerr	   Zbotocore.exceptionsr
   r   r   r   r   r   r   r   r   r   r   r   r   Zbotocore.utilsr   r   Ú	getLoggerr)   rP   ZDEFAULT_URI_TEMPLATErN   r   r-   Ústrrg   rh   r    r    r    r!   Ú<module>   s&   <
=  :