§
    7xÅjû[  ã                   ón  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZ dd	lmZmZmZmZmZmZmZ  ej        e¦  «        Z ej        d
¦  «        Z ej        d¦  «        Z ej        d¦  «        ZdZ h d£Z! e¦   «         Z" e¦   «         Z# G d„ d¦  «        Z$e$Z% G d„ d¦  «        Z& G d„ de¦  «        Z' G d„ de&¦  «        Z( G d„ de&¦  «        Z) G d„ de&¦  «        Z* G d„ d¦  «        Z+ G d„ de¦  «        Z, G d„ d ¦  «        Z- G d!„ d"¦  «        Z. G d#„ d$¦  «        Z/dS )%a|  
NOTE: All classes and functions in this module are considered private and are
subject to abrupt breaking changes. Please do not use them directly.

To view the raw JSON that the objects in this module represent, please
go to any `endpoint-rule-set.json` file in /botocore/data/<service>/<api version>/
or you can look at the test files in /tests/unit/data/endpoints/valid-rules/
é    N)ÚEnum)Ú	Formatter)Ú
NamedTuple)Ú
xform_name)ÚIPV4_REÚquoteÚurlparse)ÚEndpointResolutionError)Ú	ArnParserÚInvalidArnExceptionÚis_valid_ipv4_endpoint_urlÚis_valid_ipv6_endpoint_urlÚlru_cache_weakrefÚnormalize_url_pathÚpercent_encodez\{[a-zA-Z#]+\}z(\w*)\[(\d+)\]z^(?!-)[a-zA-Z\d-]{1,63}(?<!-)$éd   >   ÚKeyÚPrefixÚ
CopySourcec                   óœ   — 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„ 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 )ÚRuleSetStandardLibraryz5Rule actions to be performed by the EndpointProvider.c                 ó   — || _         d S ©N)Úpartitions_data)Úselfr   s     úKC:\Projects\Historical\venv\Lib\site-packages\botocore/endpoint_provider.pyÚ__init__zRuleSetStandardLibrary.__init__=   s   € Ø.ˆÔÐÐó    c                 ó4   — t          |t          ¦  «        od|v S )zgDetermine if an object is a function object.

        :type argument: Any
        :rtype: bool
        Úfn©Ú
isinstanceÚdict©r   Úarguments     r   Úis_funczRuleSetStandardLibrary.is_func@   s   € õ ˜(¥DÑ)Ô)Ð>¨d°hÐ.>Ð>r   c                 ó4   — t          |t          ¦  «        od|v S )zhDetermine if an object is a reference object.

        :type argument: Any
        :rtype: bool
        Úrefr!   r$   s     r   Úis_refzRuleSetStandardLibrary.is_refH   s   € õ ˜(¥DÑ)Ô)Ð?¨e°xÐ.?Ð?r   c                 ód   — t          |t          ¦  «        ot                               |¦  «        duS )zlDetermine if an object contains a template string.

        :type argument: Any
        :rtpe: bool
        N)r"   ÚstrÚTEMPLATE_STRING_REÚsearchr$   s     r   Úis_templatez"RuleSetStandardLibrary.is_templateP   s2   € õ �x¥Ñ%Ô%ð @Ý"×)Ò)¨(Ñ3Ô3¸4Ð?ð	
r   c                 ó¸   — d}t                                |¦  «        D ]<\  }}}}|�.|}|                     d¦  «        }|D ]
}	||	         }Œ||› |› �z  }Œ7||z  }Œ=|S )z‡Resolve and inject values into a template string.

        :type value: str
        :type scope_vars: dict
        :rtype: str
        Ú Nú#)ÚSTRING_FORMATTERÚparseÚsplit)
r   ÚvalueÚ
scope_varsÚresultÚliteralÚ	referenceÚ_Útemplate_valueÚtemplate_paramsÚparams
             r   Úresolve_template_stringz.RuleSetStandardLibrary.resolve_template_string[   sŽ   € ð ˆÝ(8×(>Ò(>¸uÑ(EÔ(Eð 	"ð 	"Ñ$ˆG�Y  1ØÐ$Ø!+�Ø"+§/¢/°#Ñ"6Ô"6�Ø,ð ;ð ;�EØ%3°EÔ%:�N�NØ˜WÐ6 nÐ6Ð6Ñ6��à˜'Ñ!��Øˆr   c                 ó  — |                       |¦  «        r|                      ||¦  «        S |                      |¦  «        r|                     |d         ¦  «        S |                      |¦  «        r|                      ||¦  «        S |S )z{Return evaluated value based on type.

        :type value: Any
        :type scope_vars: dict
        :rtype: Any
        r(   )r&   Úcall_functionr)   Úgetr.   r>   )r   r5   r6   s      r   Úresolve_valuez$RuleSetStandardLibrary.resolve_valuen   sŒ   € ð �<Š<˜ÑÔð 	CØ×%Ò% e¨ZÑ8Ô8Ð8Ø�[Š[˜ÑÔð 	CØ—>’> %¨¤,Ñ/Ô/Ð/Ø×Ò˜eÑ$Ô$ð 	CØ×/Ò/°°zÑBÔBÐBàˆr   c                 ód   — t          |¦  «        › }|dk    rd|› �}|                     dd¦  «        S )zPNormalize function names.

        :type value: str
        :rtype: str
        Únotr:   ú.)r   Úreplace)r   r5   Únormalized_names      r   Úconvert_func_namez(RuleSetStandardLibrary.convert_func_name~   sB   € õ (¨Ñ.Ô.Ð0ˆØ˜eÒ#Ð#Ø3 /Ð3Ð3ˆOØ×&Ò& s¨CÑ0Ô0Ð0r   c                 óæ   ‡ ‡— ˆˆ fd„|d         D ¦   «         }‰                       |d         ¦  «        }t          ‰ |¦  «        } ||Ž }d|v r%|d         }|‰v rt          d|› d�¬¦  «        ‚|‰|<   |S )zÁCall the function with the resolved arguments and assign to `scope_vars`
        when applicable.

        :type func_signature: dict
        :type scope_vars: dict
        :rtype: Any
        c                 ó<   •— g | ]}‰                      |‰¦  «        ‘ŒS © ©rB   )Ú.0Úargr6   r   s     €€r   ú
<listcomp>z8RuleSetStandardLibrary.call_function.<locals>.<listcomp>‘   s9   ø€ ð 
ð 
ð 
àð ×Ò˜s JÑ/Ô/ð
ð 
ð 
r   Úargvr    ÚassignzAssignment z= already exists in scoped variables and cannot be overwritten©Úmsg)rH   Úgetattrr
   )r   Úfunc_signaturer6   Ú	func_argsÚ	func_nameÚfuncr7   rQ   s   ` `     r   r@   z$RuleSetStandardLibrary.call_function‰   sÍ   øø€ ð
ð 
ð 
ð 
ð 
à% fÔ-ð
ñ 
ô 
ˆ	ð ×*Ò*¨>¸$Ô+?Ñ@Ô@ˆ	Ý�t˜YÑ'Ô'ˆØ��yÐ!ˆØ�~Ð%Ð%Ø# HÔ-ˆFØ˜Ð#Ð#Ý-ðA fð Að Að Aðñ ô ð ð "(ˆJ�vÑØˆr   c                 ó
   — |duS )zYEvaluates whether a value is set.

        :type value: Any
        :rytpe: bool
        NrK   ©r   r5   s     r   Úis_setzRuleSetStandardLibrary.is_set¢   s   € ð ˜DÐ Ð r   c                 ó<  — |                      d¦  «        D ]…}t                               |¦  «        }|�_|                     ¦   «         \  }}t	          |¦  «        }|r|                     |¦  «        }|�|t          |¦  «        k    r dS ||         c S ||         }Œ†|S )aq  Find an attribute within a value given a path string. The path can contain
        the name of the attribute and an index in brackets. A period separating attribute
        names indicates the one to the right is nested. The index will always occur at
        the end of the path.

        :type value: dict or tuple
        :type path: str
        :rtype: Any
        rE   N)r4   ÚGET_ATTR_REr-   ÚgroupsÚintrA   Úlen)r   r5   ÚpathÚpartÚmatchÚnameÚindexs          r   Úget_attrzRuleSetStandardLibrary.get_attrª   s¥   € ð —J’J˜s‘O”Oð 	$ð 	$ˆDÝ×&Ò& tÑ,Ô,ˆEØÐ Ø#Ÿlšl™nœn‘��eÝ˜E™
œ
�Øð ,Ø!ŸIšI d™OœO�EØ�= E­S°©Z¬ZÒ$7Ð$7Ø˜4˜4Ø˜U”|Ð#Ð#Ð#à˜dœ��Øˆr   c                 ó,   — |d         }|d         |d<   |S )NÚoutputsÚidrd   rK   )r   Ú	partitionÚoutputs      r   Úformat_partition_outputz.RuleSetStandardLibrary.format_partition_outputÂ   s   € Ø˜9Ô%ˆØ" 4œˆˆv‰Øˆr   c                 óT   — t          j        |d         |¦  «        d u}||d         v p|S )NÚregionRegexÚregions)Úrerc   )r   Úregionrj   Úmatches_regexs       r   Úis_partition_matchz)RuleSetStandardLibrary.is_partition_matchÇ   s2   € Ýœ ¨=Ô!9¸6ÑBÔBÈ$ÐNˆØ˜ 9Ô-Ð-Ð>°Ð>r   c                 ó¾   — | j         d         }|�2|D ]/}|                      ||¦  «        r|                      |¦  «        c S Œ0|d         }|                      |¦  «        S )zbMatch a region string to an AWS partition.

        :type value: str
        :rtype: dict
        Ú
partitionsNr   )r   rs   rl   )r   r5   ru   rj   Úaws_partitions        r   rv   z$RuleSetStandardLibrary.aws_partitionË   s€   € ð Ô)¨,Ô7ˆ
àÐØ'ð Cð C�	Ø×*Ò*¨5°)Ñ<Ô<ð CØ×7Ò7¸	ÑBÔBÐBÐBÐBðCð # 1œˆØ×+Ò+¨MÑ:Ô:Ð:r   c                 ó�  — |�|                      d¦  «        sdS 	 t                               |¦  «        }n# t          $ r Y dS w xY wt	          |d         |d         |d         f¦  «        sdS |                     d¦  «        |d<   |                     d¦  «        }|                     dd	¦  «                             d	¦  «        |d
<   |S )zeParse and validate string for ARN components.

        :type value: str
        :rtype: dict
        Nzarn:rj   ÚserviceÚresourceÚaccountÚ	accountIdú:ú/Ú
resourceId)Ú
startswithÚ
ARN_PARSERÚ	parse_arnr   ÚallÚpoprF   r4   )r   r5   Úarn_dictry   s       r   Úaws_parse_arnz$RuleSetStandardLibrary.aws_parse_arnÜ   sä   € ð ˆ= × 0Ò 0°Ñ 8Ô 8ˆ=Ø�4ð	Ý!×+Ò+¨EÑ2Ô2ˆHˆHøÝ"ð 	ð 	ð 	Ø�4�4ð	øøøõ Ø�kÔ" H¨YÔ$7¸À*Ô9MÐNñ
ô 
ð 	ð �4à (§¢¨YÑ 7Ô 7ˆ�Ñà—<’< 
Ñ+Ô+ˆØ!)×!1Ò!1°#°sÑ!;Ô!;×!AÒ!AÀ#Ñ!FÔ!Fˆ�Ñàˆs   ›6 ¶
AÁAc                 óâ   ‡ — |�|du r|                      d¦  «        dk    rdS |du r.t          ˆ fd„|                     d¦  «        D ¦   «         ¦  «        S t                               |¦  «        duS )züEvaluates whether a value is a valid host label per
        RFC 1123. If allow_subdomains is True, split on `.` and validate
        each component separately.

        :type value: str
        :type allow_subdomains: bool
        :rtype: bool
        NFrE   r   Tc              3   óD   •K  — | ]}‰                      |d ¦  «        V — ŒdS )FN)Úis_valid_host_label)rM   Úlabelr   s     €r   ú	<genexpr>z=RuleSetStandardLibrary.is_valid_host_label.<locals>.<genexpr>  sG   øè è € ð ð àð ×(Ò(¨°Ñ6Ô6ðð ð ð ð ð r   )Úcountr‚   r4   ÚVALID_HOST_LABEL_RErc   ©r   r5   Úallow_subdomainss   `  r   rˆ   z*RuleSetStandardLibrary.is_valid_host_label÷   sš   ø€ ð ˆ=Ð,°Ð5Ð5¸%¿+º+ÀcÑ:JÔ:JÈQÒ:NÐ:NØ�5à˜tÐ#Ð#Ýð ð ð ð à"Ÿ[š[¨Ñ-Ô-ðñ ô ñ ô ð õ
 #×(Ò(¨Ñ/Ô/°tÐ;Ð;r   c                 óª   — t          d„ ||fD ¦   «         ¦  «        s3dt          |¦  «        › dt          |¦  «        › d�}t          |¬¦  «        ‚||k    S )z|Evaluates two string values for equality.

        :type value1: str
        :type value2: str
        :rtype: bool
        c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   )r"   r+   ©rM   Úvals     r   rŠ   z7RuleSetStandardLibrary.string_equals.<locals>.<genexpr>  s,   è è € ÐDÐD¨C•:˜c¥3Ñ'Ô'ÐDÐDÐDÐDÐDÐDr   z!Both values must be strings, not ú and rE   rR   ©r‚   Útyper
   ©r   Úvalue1Úvalue2rS   s       r   Ústring_equalsz$RuleSetStandardLibrary.string_equals  sh   € õ ÐDÐD°F¸FÐ3CÐDÑDÔDÑDÔDð 	3ØXµd¸6±l´lÐXÐXÍÈfÉÌÐXÐXÐXˆCÝ)¨cÐ2Ñ2Ô2Ð2Ø˜ÒÐr   c                 ó(   — |€dS t          |¦  «        S )zcPerform percent-encoding on an input string.

        :type value: str
        :rytpe: str
        N)r   rZ   s     r   Ú
uri_encodez!RuleSetStandardLibrary.uri_encode  s   € ð ˆ=Ø�4å˜eÑ$Ô$Ð$r   c                 óv  — |€dS t          |¦  «        }	 |j         n# t          $ r Y dS w xY w|j        }|j        }|dvst          |¦  «        dk    rdS |j        }t          t          |¦  «        ¦  «        }| 	                    d¦  «        s|› d�}||j
        ||t          |¦  «        pt          |¦  «        dœS )z[Parse a URL string into components.

        :type value: str
        :rtype: dict
        N)ÚhttpsÚhttpr   r}   )ÚschemeÚ	authorityra   ÚnormalizedPathÚisIp)r	   ÚportÚ
ValueErrorrŸ   Úqueryr`   ra   r   r   ÚendswithÚnetlocr   r   )r   r5   Úurl_componentsrŸ   r¥   ra   Únormalized_paths          r   Ú	parse_urlz RuleSetStandardLibrary.parse_url"  sü   € ð ˆ=Ø�4å! %™œˆð	ð ÔÐÐøÝð 	ð 	ð 	Ø�4�4ð	øøøð  Ô&ˆØÔ$ˆàÐ*Ð*Ð*­c°%©j¬j¸1ªn¨nØ�4àÔ"ˆÝÕ 2°4Ñ 8Ô 8Ñ9Ô9ˆØ×'Ò'¨Ñ,Ô,ð 	4Ø!0Ð3Ð3Ð3ˆOð Ø'Ô.ØØ-Ý.¨uÑ5Ô5ð 1Ý)¨%Ñ0Ô0ð
ð 
ð 	
s   • �
+ª+c                 ó¦   — t          d„ ||fD ¦   «         ¦  «        s3dt          |¦  «        › dt          |¦  «        › d�}t          |¬¦  «        ‚||u S )zEvaluates two boolean values for equality.

        :type value1: bool
        :type value2: bool
        :rtype: bool
        c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   )r"   Úboolr‘   s     r   rŠ   z8RuleSetStandardLibrary.boolean_equals.<locals>.<genexpr>N  s,   è è € ÐEÐE¨S•:˜c¥4Ñ(Ô(ÐEÐEÐEÐEÐEÐEr   z"Both arguments must be bools, not r“   rE   rR   r”   r–   s       r   Úboolean_equalsz%RuleSetStandardLibrary.boolean_equalsG  sh   € õ ÐEÐE°V¸VÐ4DÐEÑEÔEÑEÔEð 	3ØYµt¸F±|´|ÐYÐYÍ$ÈvÉ,Ì,ÐYÐYÐYˆCÝ)¨cÐ2Ñ2Ô2Ð2Ø˜ÐÐr   c                 óT   — 	 |                      d¦  «         dS # t          $ r Y dS w xY w)zmEvaluates if a string only contains ASCII characters.

        :type value: str
        :rtype: bool
        ÚasciiTF)ÚencodeÚUnicodeEncodeErrorrZ   s     r   Úis_asciizRuleSetStandardLibrary.is_asciiS  s@   € ð	Ø�LŠL˜Ñ!Ô!Ð!Ø�4øÝ!ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚ ™
'¦'c                 óJ  — t          |t          ¦  «        s#dt          |¦  «        › d�}t          |¬¦  «        ‚||k    s(t	          |¦  «        |k     s|                      |¦  «        sdS |du r.t	          |¦  «        |z
  }t	          |¦  «        |z
  }|||…         S |||…         S )a  Computes a substring given the start index and end index. If `reverse` is
        True, slice the string from the end instead.

        :type value: str
        :type start: int
        :type end: int
        :type reverse: bool
        :rtype: str
        zInput must be a string, not rE   rR   NT)r"   r+   r•   r
   r`   r³   )r   r5   ÚstartÚstopÚreverserS   Úr_startÚr_stops           r   Ú	substringz RuleSetStandardLibrary.substring_  s³   € õ ˜%¥Ñ%Ô%ð 	3Ø?µ°e±´Ð?Ð?Ð?ˆCÝ)¨cÐ2Ñ2Ô2Ð2Ø�DŠ=ˆ=�C ™JœJ¨Ò-Ð-°T·]²]À5Ñ5IÔ5IÐ-Ø�4à�dˆ?ˆ?Ý˜%‘j”j 4Ñ'ˆGÝ˜‘Z”Z %Ñ'ˆFØ˜ ˜Ô(Ð(à�U˜4�ZÔ Ð r   c                 ó   — | S )zpA function implementation of the logical operator `not`.

        :type value: Any
        :rtype: bool
        rK   rZ   s     r   Ú_notzRuleSetStandardLibrary._notv  s   € ð ˆyÐr   c                 ó¶   — |�?t          |¦  «        dk     s,|                     ¦   «         |k    st          j        |¦  «        �dS |                      ||¬¦  «        S )a  Evaluates whether a value is a valid bucket name for virtual host
        style bucket URLs. To pass, the value must meet the following criteria:
        1. is_valid_host_label(value) is True
        2. length between 3 and 63 characters (inclusive)
        3. does not contain uppercase characters
        4. is not formatted as an IP address

        If allow_subdomains is True, split on `.` and validate
        each component separately.

        :type value: str
        :type allow_subdomains: bool
        :rtype: bool
        Né   F)rŽ   )r`   Úlowerr   rc   rˆ   r�   s      r   Ú!aws_is_virtual_hostable_s3_bucketz8RuleSetStandardLibrary.aws_is_virtual_hostable_s3_bucket~  sc   € ð  ˆMÝ�5‰zŒz˜AŠ~ˆ~Ø�{Š{‰}Œ} Ò%Ð%ÝŒ}˜UÑ#Ô#Ð/à�5à×'Ò'ØÐ$4ð (ñ 
ô 
ð 	
r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r)   r.   r>   rB   rH   r@   r[   rf   rl   rs   rv   r…   rˆ   r™   r›   rª   r®   r³   rº   r¼   rÀ   rK   r   r   r   r   :   sw  € € € € € Ø?Ð?ð/ð /ð /ð?ð ?ð ?ð@ð @ð @ð	
ð 	
ð 	
ðð ð ð&ð ð ð 	1ð 	1ð 	1ðð ð ð2!ð !ð !ðð ð ð0ð ð ð
?ð ?ð ?ð;ð ;ð ;ð"ð ð ð6<ð <ð <ð(
 ð 
 ð 
 ð	%ð 	%ð 	%ð#
ð #
ð #
ðJ
 ð 
 ð 
 ð
ð 
ð 
ð!ð !ð !ð.ð ð ð
ð 
ð 
ð 
ð 
r   r   c                   ó&   — e Zd ZdZdd„Zd„ Zd„ ZdS )ÚBaseRulez-Base interface for individual endpoint rules.Nc                 ó"   — || _         || _        d S r   )Ú
conditionsÚdocumentation)r   rÈ   rÉ   s      r   r   zBaseRule.__init__¢  s   € Ø$ˆŒØ*ˆÔÐÐr   c                 ó   — t          ¦   «         ‚r   )ÚNotImplementedError)r   r6   Úrule_libs      r   ÚevaluatezBaseRule.evaluate¦  s   € Ý!Ñ#Ô#Ð#r   c                 óX   — | j         D ]!}|                     ||¦  «        }|du s|€ dS Œ"dS )z›Determine if all conditions in a rule are met.

        :type scope_vars: dict
        :type rule_lib: RuleSetStandardLibrary
        :rtype: bool
        FNT)rÈ   r@   )r   r6   rÌ   rU   r7   s        r   Úevaluate_conditionszBaseRule.evaluate_conditions©  sH   € ð #œoð 	ð 	ˆNØ×+Ò+¨N¸JÑGÔGˆFØ˜ˆˆ & .Ø�u�uð #1àˆtr   r   )rÁ   rÂ   rÃ   rÄ   r   rÍ   rÏ   rK   r   r   rÆ   rÆ   Ÿ  sL   € € € € € Ø7Ð7ð+ð +ð +ð +ð$ð $ð $ðð ð ð ð r   rÆ   c                   ó2   — e Zd ZU dZeed<   eed<   eed<   dS )ÚRuleSetEndpointz.A resolved endpoint object returned by a rule.ÚurlÚ
propertiesÚheadersN)rÁ   rÂ   rÃ   rÄ   r+   Ú__annotations__r#   rK   r   r   rÑ   rÑ   ·  s4   € € € € € € Ø8Ð8à	€H€H�HØÐÐÑØ€M€M�M€M€Mr   rÑ   c                   ó0   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚEndpointRulec                 óH   •—  t          ¦   «         j        di |¤Ž || _        d S ©NrK   )Úsuperr   Úendpoint)r   rÛ   ÚkwargsÚ	__class__s      €r   r   zEndpointRule.__init__À  s+   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ø ˆŒˆˆr   c                 ó$  — |                       ||¦  «        ry|                     | j        d         |¦  «        }|                      | j                             di ¦  «        ||¦  «        }|                      ||¦  «        }t          |||¬¦  «        S dS )z…Determine if conditions are met to provide a valid endpoint.

        :type scope_vars: dict
        :rtype: RuleSetEndpoint
        rÒ   rÓ   )rÒ   rÓ   rÔ   N)rÏ   rB   rÛ   Úresolve_propertiesrA   Úresolve_headersrÑ   )r   r6   rÌ   rÒ   rÓ   rÔ   s         r   rÍ   zEndpointRule.evaluateÄ  s¤   € ð ×#Ò# J°Ñ9Ô9ð 
	Ø×(Ò(¨¬°uÔ)=¸zÑJÔJˆCØ×0Ò0Ø”×!Ò! ,°Ñ3Ô3ØØñô ˆJð
 ×*Ò*¨:°xÑ@Ô@ˆGÝ"Ø J¸ðñ ô ð ð ˆtr   c                 ó  ‡ ‡‡— t          |t          ¦  «        rˆˆˆ fd„|D ¦   «         S t          |t          ¦  «        r"ˆˆˆ fd„|                     ¦   «         D ¦   «         S ‰                     |¦  «        r‰                     |‰¦  «        S |S )zÕTraverse `properties` attribute, resolving any template strings.

        :type properties: dict/list/str
        :type scope_vars: dict
        :type rule_lib: RuleSetStandardLibrary
        :rtype: dict
        c                 ó>   •— g | ]}‰                      |‰‰¦  «        ‘ŒS rK   ©rß   )rM   ÚproprÌ   r6   r   s     €€€r   rO   z3EndpointRule.resolve_properties.<locals>.<listcomp>á  s;   ø€ ð ð ð àð ×'Ò'¨¨j¸(ÑCÔCðð ð r   c                 óF   •— i | ]\  }}|‰                      |‰‰¦  «        “ŒS rK   rã   )rM   Úkeyr5   rÌ   r6   r   s      €€€r   ú
<dictcomp>z3EndpointRule.resolve_properties.<locals>.<dictcomp>æ  sA   ø€ ð ð ð á�C˜ð �T×,Ò,¨U°JÀÑIÔIðð ð r   )r"   Úlistr#   Úitemsr.   r>   )r   rÓ   r6   rÌ   s   ` ``r   rß   zEndpointRule.resolve_propertiesØ  sÚ   øøø€ õ �j¥$Ñ'Ô'ð 	Lðð ð ð ð ð à&ðñ ô ð õ ˜
¥DÑ)Ô)ð 	Lðð ð ð ð ð à",×"2Ò"2Ñ"4Ô"4ðñ ô ð ð ×!Ò! *Ñ-Ô-ð 	LØ×3Ò3°JÀ
ÑKÔKÐKàÐr   c                 óœ   ‡‡— i }| j                              di ¦  «        }|                     ¦   «         D ]\  }}ˆˆfd„|D ¦   «         ||<   Œ|S )z¤Iterate through headers attribute resolving all values.

        :type scope_vars: dict
        :type rule_lib: RuleSetStandardLibrary
        :rtype: dict
        rÔ   c                 ó<   •— g | ]}‰                      |‰¦  «        ‘ŒS rK   rL   )rM   ÚitemrÌ   r6   s     €€r   rO   z0EndpointRule.resolve_headers.<locals>.<listcomp>ú  s6   ø€ ð (ð (ð (Ø=A�×&Ò& t¨ZÑ8Ô8ð(ð (ð (r   )rÛ   rA   ré   )r   r6   rÌ   Úresolved_headersrÔ   ÚheaderÚvaluess    ``    r   rà   zEndpointRule.resolve_headersï  s|   øø€ ð ÐØ”-×#Ò# I¨rÑ2Ô2ˆà%Ÿmšm™oœoð 	ð 	‰NˆF�Fð(ð (ð (ð (ð (ØEKð(ñ (ô (Ð˜VÑ$Ð$ð  Ðr   )rÁ   rÂ   rÃ   r   rÍ   rß   rà   Ú__classcell__©rÝ   s   @r   r×   r×   ¿  se   ø€ € € € € ð!ð !ð !ð !ð !ðð ð ð(ð ð ð. ð  ð  ð  ð  ð  ð  r   r×   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú	ErrorRulec                 óH   •—  t          ¦   «         j        di |¤Ž || _        d S rÙ   )rÚ   r   Úerror)r   rõ   rÜ   rÝ   s      €r   r   zErrorRule.__init__  s+   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ØˆŒ
ˆ
ˆ
r   c                 óˆ   — |                       ||¦  «        r+|                     | j        |¦  «        }t          |¬¦  «        ‚dS )z»If an error rule's conditions are met, raise an error rule.

        :type scope_vars: dict
        :type rule_lib: RuleSetStandardLibrary
        :rtype: EndpointResolutionError
        rR   N)rÏ   rB   rõ   r
   )r   r6   rÌ   rõ   s       r   rÍ   zErrorRule.evaluate  sI   € ð ×#Ò# J°Ñ9Ô9ð 	5Ø×*Ò*¨4¬:°zÑBÔBˆEÝ)¨eÐ4Ñ4Ô4Ð4Øˆtr   )rÁ   rÂ   rÃ   r   rÍ   rð   rñ   s   @r   ró   ró      sG   ø€ € € € € ðð ð ð ð ð
ð 
ð 
ð 
ð 
ð 
ð 
r   ró   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚTreeRulezœA tree rule is non-terminal meaning it will never be returned to a provider.
    Additionally this means it has no attributes that need to be resolved.
    c                 ó\   •—  t          ¦   «         j        di |¤Ž d„ |D ¦   «         | _        d S )Nc                 ó0   — g | ]}t          j        d i |¤Ž‘ŒS ©rK   ©ÚRuleCreatorÚcreate©rM   Úrules     r   rO   z%TreeRule.__init__.<locals>.<listcomp>  ó)   € ÐCÐCÐC°T•kÔ(Ð0Ð0¨4Ð0Ð0ÐCÐCÐCr   rK   )rÚ   r   Úrules)r   r  rÜ   rÝ   s      €r   r   zTreeRule.__init__  s9   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ØCÐC¸UÐCÑCÔCˆŒ
ˆ
ˆ
r   c                 ó¢   — |                       ||¦  «        r8| j        D ]0}|                     |                     ¦   «         |¦  «        }|r|c S Œ1dS )zñIf a tree rule's conditions are met, iterate its sub-rules
        and return first result found.

        :type scope_vars: dict
        :type rule_lib: RuleSetStandardLibrary
        :rtype: RuleSetEndpoint/EndpointResolutionError
        N)rÏ   r  rÍ   Úcopy)r   r6   rÌ   r   Úrule_results        r   rÍ   zTreeRule.evaluate  sh   € ð ×#Ò# J°Ñ9Ô9ð 	'Øœ
ð 'ð '�à"Ÿmšm¨J¯OªOÑ,=Ô,=¸xÑHÔH�Øð 'Ø&Ð&Ð&Ð&ð'àˆtr   )rÁ   rÂ   rÃ   rÄ   r   rÍ   rð   rñ   s   @r   rø   rø     sV   ø€ € € € € ðð ðDð Dð Dð Dð Dðð ð ð ð ð ð r   rø   c                   ó0   — e Zd ZeZeZeZe	d„ ¦   «         Z
dS )rý   c                 ó¢   — |                      d¦  «        }	 t          | |¦  «        } |di |¤ŽS # t          $ r t          d|› d�¬¦  «        ‚w xY w)z_Create a rule instance from metadata.

        :rtype: TreeRule/EndpointRule/ErrorRule
        r•   zUnknown rule type: z1. A rule must be of type tree, endpoint or error.rR   NrK   )rƒ   rT   ÚAttributeErrorr
   )ÚclsrÜ   Ú	rule_typeÚ
rule_classs       r   rþ   zRuleCreator.create1  s‹   € ð —J’J˜vÑ&Ô&ˆ	ð	(Ý   iÑ0Ô0ˆJð �:Ð'Ð' Ð'Ð'Ð'øõ ð 	ð 	ð 	Ý)ð6¨)ð 6ð 6ð 6ðñ ô ð ð	øøøs	   —/ ¯AN)rÁ   rÂ   rÃ   r×   rÛ   ró   rõ   rø   ÚtreeÚclassmethodrþ   rK   r   r   rý   rý   ,  s<   € € € € € Ø€HØ€EØ€Dàð(ð (ñ „[ð(ð (ð (r   rý   c                   ó   — e Zd ZdZeZeZeZ	dS )ÚParameterTypez8Translation from `type` attribute to native Python type.N)
rÁ   rÂ   rÃ   rÄ   r+   Ústringr­   ÚbooleanÚtupleÚstringarrayrK   r   r   r  r  C  s#   € € € € € ØBÐBà€FØ€GØ€K€K€Kr   r  c                   ó0   — e Zd ZdZ	 	 	 	 	 dd„Zd„ Zd„ ZdS )ÚParameterDefinitionz9The spec of an individual parameter defined in a RuleSet.Nc                 ó  — || _         	 t          t          |                     ¦   «         ¦  «        j        | _        n"# t          $ r t          d|› d�¬¦  «        ‚w xY w|| _        || _	        || _
        || _        || _        d S )NzUnknown parameter type: z>. A parameter must be of type string, boolean, or stringarray.rR   )rd   rT   r  r¿   r5   Úparameter_typer  r
   rÉ   ÚbuiltinÚdefaultÚrequiredÚ
deprecated)r   rd   r  rÉ   ÚbuiltInr  r  r  s           r   r   zParameterDefinition.__init__N  s´   € ð ˆŒ	ð	Ý")Ý˜~×3Ò3Ñ5Ô5ñ#ô #äð ÔÐøõ ð 	ð 	ð 	Ý)ðO¨~ð Oð Oð Oðñ ô ð ð	øøøð
 +ˆÔØˆŒØˆŒØ ˆŒØ$ˆŒˆˆs	   ‰1; »Ac                 óZ  — t          || j        ¦  «        s!t          d| j        › d| j        › d�¬¦  «        ‚| j        �m| j        › d�}| j                             d¦  «        }| j                             d¦  «        }|r|d	|› �z  }|r	|d
|› d�z  }t                               |¦  «         dS )zwPerform base validation on parameter input.

        :type value: Any
        :raises: EndpointParametersError
        zValue (z) is the wrong type. Must be rE   rR   Nz has been deprecated.ÚmessageÚsinceú
z
Deprecated since )r"   r  r
   rd   r  rA   ÚloggerÚinfo)r   r5   Údepr_strrS   r  s        r   Úvalidate_inputz"ParameterDefinition.validate_inputh  sé   € õ ˜% Ô!4Ñ5Ô5ð 	Ý)ð8˜dœið 8ð 8Ø!%Ô!4ð8ð 8ð 8ðñ ô ð ð Œ?Ð&Øœ)Ð:Ð:Ð:ˆHØ”/×%Ò% iÑ0Ô0ˆCØ”O×'Ò'¨Ñ0Ô0ˆEØð 'Ø˜J ˜J˜JÑ&�Øð ;ØÐ:°%Ð:Ð:Ð:Ñ:�Ý�KŠK˜Ñ!Ô!Ð!àˆtr   c                 ó�   — |€.| j         �| j         S | j        rt          d| j        › �¬¦  «        ‚n|                      |¦  «         |S )z>Process input against spec, applying default if value is None.Nz)Cannot find value for required parameter rR   )r  r  r
   rd   r$  rZ   s     r   Úprocess_inputz!ParameterDefinition.process_input€  se   € àˆ=ØŒ|Ð'Ø”|Ð#ØŒ}ð Ý-ØOÀDÄIÐOÐOðñ ô ð ðð ×Ò Ñ&Ô&Ð&Øˆr   )NNNNN)rÁ   rÂ   rÃ   rÄ   r   r$  r&  rK   r   r   r  r  K  s]   € € € € € ØCÐCð ØØØØð%ð %ð %ð %ð4ð ð ð0ð ð ð ð r   r  c                   ó.   — e Zd ZdZ	 dd„Zd„ Zd„ Zd„ ZdS )ÚRuleSetz:Collection of rules to derive a routable service endpoint.Nc                 ó    — || _         |                      |¦  «        | _        d„ |D ¦   «         | _        t	          |¦  «        | _        || _        d S )Nc                 ó0   — g | ]}t          j        d i |¤Ž‘ŒS rû   rü   rÿ   s     r   rO   z$RuleSet.__init__.<locals>.<listcomp>—  r  r   )ÚversionÚ_ingest_parameter_specÚ
parametersr  r   rÌ   rÉ   )r   r+  r-  r  ru   rÉ   s         r   r   zRuleSet.__init__’  sR   € ð ˆŒØ×5Ò5°jÑAÔAˆŒØCÐC¸UÐCÑCÔCˆŒ
Ý.¨zÑ:Ô:ˆŒØ*ˆÔÐÐr   c                 ó>   — d„ |                      ¦   «         D ¦   «         S )Nc                 ó
  — i | ]€\  }}|t          ||d          |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        ¦  «        “Œ�S )r•   rÉ   r  r  r  r  )r  rA   )rM   rd   Úspecs      r   rç   z2RuleSet._ingest_parameter_spec.<locals>.<dictcomp>œ  s�   € ð 
ð 
ð 
ñ ��dð Õ%ØØ�V”Ø—’˜Ñ)Ô)Ø—’˜Ñ#Ô#Ø—’˜Ñ#Ô#Ø—’˜Ñ$Ô$Ø—’˜Ñ&Ô&ñô ð
ð 
ð 
r   )ré   )r   r-  s     r   r,  zRuleSet._ingest_parameter_spec›  s1   € ð
ð 
ð )×.Ò.Ñ0Ô0ð
ñ 
ô 
ð 	
r   c                 ó¢   — | j                              ¦   «         D ]4\  }}|                     |                     |¦  «        ¦  «        }|�|||<   Œ5dS )zYProcess each input parameter against its spec.

        :type input_params: dict
        N)r-  ré   r&  rA   )r   Úinput_paramsrd   r0  r5   s        r   Úprocess_input_parametersz RuleSet.process_input_parameters©  s\   € ð
 œ/×/Ò/Ñ1Ô1ð 	+ð 	+‰JˆD�$Ø×&Ò& |×'7Ò'7¸Ñ'=Ô'=Ñ>Ô>ˆEØÐ Ø%*�˜TÑ"øØˆtr   c                 óª   — |                       |¦  «         | j        D ]5}|                     |                     ¦   «         | j        ¦  «        }|�|c S Œ6dS )zmEvaluate input parameters against rules returning first match.

        :type input_parameters: dict
        N)r3  r  rÍ   r  rÌ   )r   Úinput_parametersr   Ú
evaluations       r   rÍ   zRuleSet.evaluate´  sh   € ð
 	×%Ò%Ð&6Ñ7Ô7Ð7Ø”Jð 	"ð 	"ˆDØŸšÐ'7×'<Ò'<Ñ'>Ô'>ÀÄÑNÔNˆJØÐ%Ø!Ð!Ð!Ð!ð &àˆtr   r   )rÁ   rÂ   rÃ   rÄ   r   r,  r3  rÍ   rK   r   r   r(  r(  �  sb   € € € € € ØDÐDð EIð+ð +ð +ð +ð
ð 
ð 
ð	ð 	ð 	ð
ð 
ð 
ð 
ð 
r   r(  c                   óJ   — e Zd ZdZdd„Zd„ Z ee¬¦  «        d„ ¦   «         ZdS )ÚEndpointProviderz<Derives endpoints from a RuleSet for given input parameters.Nc                 óZ   — t          di |¤d|i¤Ž| _        |pt          ¦   «         | _        d S )Nru   rK   )r(  ÚrulesetÚ	frozensetÚ_excluded_params)r   Úruleset_dataÚpartition_dataÚexcluded_paramss       r   r   zEndpointProvider.__init__Ä  s9   € ÝÐIÐI ÐIÐI¸.ÐIÐIÐIˆŒØ /Ð >µ9±;´;ˆÔÐÐr   c                 ó\   — | j         D ]}|                     |d ¦  «         Œ | j        di |¤ŽS rÙ   )r<  rƒ   Ú_resolve_endpoint)r   r5  r=   s      r   Úresolve_endpointz!EndpointProvider.resolve_endpointÈ  sG   € ØÔ*ð 	.ð 	.ˆEØ× Ò  ¨Ñ-Ô-Ð-Ð-Ø%ˆtÔ%Ð9Ð9Ð(8Ð9Ð9Ð9r   )Úmaxsizec                 óî   — |                      ¦   «         }| j                             |¦  «        }|€Dd                     d„ |                     ¦   «         D ¦   «         ¦  «        }t          d|› �¬¦  «        ‚|S )zpMatch input parameters to a rule.

        :type input_parameters: dict
        :rtype: RuleSetEndpoint
        Nr   c                 ó"   — g | ]\  }}|› d |› �‘ŒS )z: rK   )rM   ræ   r5   s      r   rO   z6EndpointProvider._resolve_endpoint.<locals>.<listcomp>Ø  s*   € ÐNÐNÐN¡z s¨E�CÐ"Ð"˜5Ð"Ð"ÐNÐNÐNr   z"No endpoint found for parameters:
rR   )r  r:  rÍ   Újoinré   r
   )r   r5  Úparams_for_errorrÛ   Úparam_strings        r   rA  z"EndpointProvider._resolve_endpointÍ  sŽ   € ð ,×0Ò0Ñ2Ô2ÐØ”<×(Ò(Ð)9Ñ:Ô:ˆØÐØŸ9š9ØNÐNÐ5E×5KÒ5KÑ5MÔ5MÐNÑNÔNñô ˆLõ *ØH¸,ÐHÐHðñ ô ð ð ˆr   r   )	rÁ   rÂ   rÃ   rÄ   r   rB  r   Ú
CACHE_SIZErA  rK   r   r   r8  r8  Á  sg   € € € € € ØFÐFð?ð ?ð ?ð ?ð:ð :ð :ð
 Ð˜zÐ*Ñ*Ô*ðð ñ +Ô*ðð ð r   r8  )0rÄ   Úloggingrp   Úenumr   r  r   Útypingr   Úbotocorer   Úbotocore.compatr   r   r	   Úbotocore.exceptionsr
   Úbotocore.utilsr   r   r   r   r   r   r   Ú	getLoggerrÁ   r!  Úcompiler,   r]   rŒ   rI  ÚS3_UNREFERENCED_PARAMSr€   r2   r   ÚRuleSetStandardLibaryrÆ   rÑ   r×   ró   rø   rý   r  r  r(  r8  rK   r   r   ú<module>rU     sY  ððð ð €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€à�R”ZÐ 1Ñ2Ô2Ð ØˆbŒjÐ*Ñ+Ô+€Ø �b”jØ%ñô Ð ð €
ð 9Ð8Ð8Ð ØˆY‰[Œ[€
Ø�9‘;”;Ð ð]
ð ]
ð ]
ð ]
ð ]
ñ ]
ô ]
ð ]
ðD /Ð ðð ð ð ð ñ ô ð ð0ð ð ð ð �jñ ô ð ð> ð > ð > ð > ð > �8ñ > ô > ð > ðBð ð ð ð �ñ ô ð ð$ð ð ð ð ˆxñ ô ð ð4(ð (ð (ð (ð (ñ (ô (ð (ð.ð ð ð ð �Dñ ô ð ðAð Að Að Að Añ Aô Að AðH/ð /ð /ð /ð /ñ /ô /ð /ðdð ð ð ð ñ ô ð ð ð r   