
    m&phb              	          S r SSKrSSKrSSKrSSKJrJrJrJrJ	r	J
r
JrJr  SSKJr  SSKJr  \\\4   r\" S\S9r\\\/\4   rS	\S
\4S jr " S S\5      r " S S\R2                  S9r " S S\5      r\R8                  " S5      rS	\S
\\   4S jrS\\   S
\4S jrS\S
\4S jr S\\   S\\   S
\
\\   \\   4   4S jr! " S S\5      r"g)z
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
    N)CallableIterableIteratorListOptionalTupleTypeVarUnion   )canonicalize_version)VersionUnparsedVersionVar)boundversionreturnc                 F    [        U [        5      (       d  [        U 5      n U $ N)
isinstancer   )r   s    V/var/www/html/venv/lib/python3.13/site-packages/wheel/vendored/packaging/specifiers.py_coerce_versionr      s    gw'''"N    c                       \ rS rSrSrSrg)InvalidSpecifier   z
Raised when attempting to create a :class:`Specifier` with a specifier
string that is invalid.

>>> Specifier("lolwat")
Traceback (most recent call last):
    ...
packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r   r   r   r   r      s    r   r   c            	          \ rS rSr\R
                  S\4S j5       r\R
                  S\4S j5       r	\R
                  S\
S\4S j5       r\\R
                  S\\   4S j5       5       r\R                   S\SS	4S
 j5       r\R
                  SS\S\\   S\4S jj5       r\R
                   SS\\   S\\   S\\   4S jj5       rSrg	)BaseSpecifier*   r   c                     g)zv
Returns the str representation of this Specifier-like object. This
should be representative of the Specifier itself.
Nr   selfs    r   __str__BaseSpecifier.__str__+       r   c                     g)z6
Returns a hash value for this Specifier-like object.
Nr   r&   s    r   __hash__BaseSpecifier.__hash__2   r*   r   otherc                     g)z
Returns a boolean representing whether or not the two Specifier-like
objects are equal.

:param other: The other object to check against.
Nr   r'   r.   s     r   __eq__BaseSpecifier.__eq__8   r*   r   c                     g)zWhether or not pre-releases as a whole are allowed.

This can be set to either ``True`` or ``False`` to explicitly enable or disable
prereleases or it can be set to ``None`` (the default) to use default semantics.
Nr   r&   s    r   prereleasesBaseSpecifier.prereleasesA   r*   r   valueNc                     g)zASetter for :attr:`prereleases`.

:param value: The value to set.
Nr   r'   r6   s     r   r4   r5   J   r*   r   itemr4   c                     g)zB
Determines if the given item is contained within this specifier.
Nr   )r'   r9   r4   s      r   containsBaseSpecifier.containsQ   r*   r   iterablec                     g)z}
Takes an iterable of items and filters them so that only items which
are contained within this specifier are allowed in it.
Nr   )r'   r=   r4   s      r   filterBaseSpecifier.filterW   r*   r   r   r   )r   r   r   r   abcabstractmethodstrr(   intr,   objectboolr1   propertyr   r4   setterr;   r   r   r   r?   r!   r   r   r   r#   r#   *   s7      	#  
 	F t   Xd^     $   	S x~   
 	TX !34CKD>	$	% r   r#   )	metaclassc            	          \ rS rSrSrSrSr\R                  " S\-   \-   S-   \R                  \R                  -  5      rSSS	S
SSSSS.rS2S\S\\   SS4S jjr\S\4S j5       r\R&                  S\SS4S j5       r\S\4S j5       r\S\4S j5       rS\4S jrS\4S jr\S\\\4   4S j5       rS\4S jrS\S\4S jrS \S\4S! jrS"\ S\S\4S# jr!S"\ S\S\4S$ jr"S"\ S\S\4S% jr#S"\ S\S\4S& jr$S"\ S\S\4S' jr%S"\ S(\S\4S) jr&S"\ S(\S\4S* jr'S"\ S\S\4S+ jr(S,\)\\ 4   S\4S- jr* S3S,\+S\\   S\4S. jjr, S3S/\-\.   S\\   S\/\.   4S0 jjr0S1r1g)4	Specifiera   a+  This class abstracts handling of version specifiers.

.. tip::

    It is generally not required to instantiate this manually. You should instead
    prefer to work with :class:`SpecifierSet` instead, which can parse
    comma-separated version specifiers (which is what package metadata contains).
z8
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        a  
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s;)]*  # The arbitrary version can be just about anything,
                          # we match everything except for whitespace, a
                          # semi-colon for marker support, and a closing paren
                          # since versions can be enclosed in them.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release

                # You cannot use a wild card and a pre-release, post-release, a dev or
                # local version together so group them with a | and make them optional.
                (?:
                    \.\*  # Wild card syntax of .*
                    |
                    (?:                                  # pre release
                        [-_\.]?
                        (alpha|beta|preview|pre|a|b|c|rc)
                        [-_\.]?
                        [0-9]*
                    )?
                    (?:                                  # post release
                        (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                    )?
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        z^\s*z\s*$
compatibleequal	not_equalless_than_equalgreater_than_equal	less_thangreater_than	arbitrary)~===z!=<=>=<>===Nspecr4   r   c                     U R                   R                  U5      nU(       d  [        SU S35      eUR                  S5      R	                  5       UR                  S5      R	                  5       4U l        X l        g)a  Initialize a Specifier instance.

:param spec:
    The string representation of a specifier which will be parsed and
    normalized before use.
:param prereleases:
    This tells the specifier if it should accept prerelease versions if
    applicable or not. The default of ``None`` will autodetect it from the
    given specifiers.
:raises InvalidSpecifier:
    If the given specifier is invalid (i.e. bad syntax).
zInvalid specifier: ''operatorr   N)_regexsearchr   groupstrip_spec_prereleases)r'   r\   r4   matchs       r   __init__Specifier.__init__   sm     ""4("%9$q#ABB KK
#))+KK	"((*'

 (r   c                     U R                   b  U R                   $ U R                  u  pUS;   a<  US:X  a  UR                  S5      (       a  US S n[        U5      R                  (       a  gg)N)rV   rX   rW   rU   r[   rV   .*TF)re   rd   endswithr   is_prerelease)r'   r_   r   s      r   r4   Specifier.prereleases   sn     ($$$
 !JJ66 4G$4$4T$:$:!#2, w--r   r6   c                     Xl         g r   re   r8   s     r   r4   rn         !r   c                      U R                   S   $ )zHThe operator of this specifier.

>>> Specifier("==1.2.3").operator
'=='
r   rd   r&   s    r   r_   Specifier.operator       zz!}r   c                      U R                   S   $ )zIThe version of this specifier.

>>> Specifier("==1.2.3").version
'1.2.3'
r   rs   r&   s    r   r   Specifier.version  ru   r   c                     U R                   b  SU R                  < 3OSnSU R                  R                   S[	        U 5      < U S3$ )a  A representation of the Specifier that shows all internal state.

>>> Specifier('>=1.0.0')
<Specifier('>=1.0.0')>
>>> Specifier('>=1.0.0', prereleases=False)
<Specifier('>=1.0.0', prereleases=False)>
>>> Specifier('>=1.0.0', prereleases=True)
<Specifier('>=1.0.0', prereleases=True)>
, prereleases= rY   ()>)re   r4   	__class__r   rC   r'   pres     r   __repr__Specifier.__repr__$  sU       , T--01 	 4>>**+1SYM#bAAr   c                 4    SR                   " U R                  6 $ )zA string representation of the Specifier that can be round-tripped.

>>> str(Specifier('>=1.0.0'))
'>=1.0.0'
>>> str(Specifier('>=1.0.0', prereleases=False))
'>=1.0.0'
z{}{})formatrd   r&   s    r   r(   Specifier.__str__6  s     }}djj))r   c                 r    [        U R                  S   U R                  S   S:g  S9nU R                  S   U4$ )Nr   r   rU   strip_trailing_zero)r   rd   )r'   canonical_versions     r   _canonical_specSpecifier._canonical_spec@  s>    0JJqM!%A$!6
 zz!}///r   c                 ,    [        U R                  5      $ r   )hashr   r&   s    r   r,   Specifier.__hash__H  s    D(())r   r.   c                    [        U[        5      (       a   U R                  [        U5      5      nO [        XR                  5      (       d  [        $ U R
                  UR
                  :H  $ ! [         a	    [        s $ f = f)a  Whether or not the two Specifier-like objects are equal.

:param other: The other object to check against.

The value of :attr:`prereleases` is ignored.

>>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
True
>>> (Specifier("==1.2.3", prereleases=False) ==
...  Specifier("==1.2.3", prereleases=True))
True
>>> Specifier("==1.2.3") == "==1.2.3"
True
>>> Specifier("==1.2.3") == Specifier("==1.2.4")
False
>>> Specifier("==1.2.3") == Specifier("~=1.2.3")
False
)r   rC   r}   r   NotImplementedr   r0   s     r   r1   Specifier.__eq__K  sm    & eS!!&s5z2 E>>22!!##u'<'<<< $ &%%&s   A+ +A>=A>opc                 >    [        U SU R                  U    35      nU$ )N	_compare_)getattr
_operators)r'   r   operator_callables      r   _get_operatorSpecifier._get_operatorh  s+    .5Idoob123/
 ! r   prospectivec           
          [        [        [        R                  " [        [        U5      5      5      S S 5      nUS-  nU R                  S5      " X5      =(       a    U R                  S5      " X5      $ )Nrj   rX   rV   )_version_joinlist	itertools	takewhile_is_not_suffix_version_splitr   )r'   r   r\   prefixs       r   _compare_compatibleSpecifier._compare_compatiblen  sn     $$^^D5IJKCRP

 	$!!$': 
t?Q?QRV?W@
 	
r   c                 D   UR                  S5      (       aV  [        UR                  SS9n[        US S SS9n[        U5      n[        U5      n[	        Xe5      u  pxUS [        U5       n	X:H  $ [        U5      n
U
R                  (       d  [        UR                  5      nX:H  $ )Nrj   Fr   rk   )rl   r   publicr   _pad_versionlenr   local)r'   r   r\   normalized_prospectivenormalized_spec
split_specsplit_prospectivepadded_prospective_shortened_prospectivespec_versions              r   _compare_equalSpecifier._compare_equal  s    ==%9""&" 349RWXO (8J
 !//E F %11B$O!
 %77HZ$I!(66 #4=L
  %%%k&8&89..r   c                 .    U R                  X5      (       + $ r   )r   r'   r   r\   s      r   _compare_not_equalSpecifier._compare_not_equal  s    &&{999r   c                 D    [        UR                  5      [        U5      :*  $ r   r   r   r   s      r   _compare_less_than_equal"Specifier._compare_less_than_equal       {))*gdm;;r   c                 D    [        UR                  5      [        U5      :  $ r   r   r   s      r   _compare_greater_than_equal%Specifier._compare_greater_than_equal  r   r   spec_strc                     [        U5      nX:  d  gUR                  (       d>  UR                  (       a-  [        UR                  5      [        UR                  5      :X  a  ggNFT)r   rm   base_versionr'   r   r   r\   s       r   _compare_less_thanSpecifier._compare_less_than  sR     x 
 ! !!k&?&?{//0GD<M<M4NN
 r   c                 8   [        U5      nX:  d  gUR                  (       d>  UR                  (       a-  [        UR                  5      [        UR                  5      :X  a  gUR                  b-  [        UR                  5      [        UR                  5      :X  a  ggr   )r   is_postreleaser   r   r   s       r   _compare_greater_thanSpecifier._compare_greater_than  s     x 
 ! ""{'A'A{//0GD<M<M4NN ({//0GD<M<M4NN
 r   c                 h    [        U5      R                  5       [        U5      R                  5       :H  $ r   )rC   lowerr   s      r   _compare_arbitrarySpecifier._compare_arbitrary  s&    ;%%'3t9??+<<<r   r9   c                 $    U R                  U5      $ )a  Return whether or not the item is contained in this specifier.

:param item: The item to check for.

This is used for the ``in`` operator and behaves the same as
:meth:`contains` with no ``prereleases`` argument passed.

>>> "1.2.3" in Specifier(">=1.2.3")
True
>>> Version("1.2.3") in Specifier(">=1.2.3")
True
>>> "1.0.0" in Specifier(">=1.2.3")
False
>>> "1.3.0a1" in Specifier(">=1.2.3")
False
>>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
True
r;   r'   r9   s     r   __contains__Specifier.__contains__      & }}T""r   c                     Uc  U R                   n[        U5      nUR                  (       a  U(       d  gU R                  U R                  5      nU" X0R
                  5      $ )a  Return whether or not the item is contained in this specifier.

:param item:
    The item to check for, which can be a version string or a
    :class:`Version` instance.
:param prereleases:
    Whether or not to match prereleases with this Specifier. If set to
    ``None`` (the default), it uses :attr:`prereleases` to determine
    whether or not prereleases are allowed.

>>> Specifier(">=1.2.3").contains("1.2.3")
True
>>> Specifier(">=1.2.3").contains(Version("1.2.3"))
True
>>> Specifier(">=1.2.3").contains("1.0.0")
False
>>> Specifier(">=1.2.3").contains("1.3.0a1")
False
>>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1")
True
>>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True)
True
F)r4   r   rm   r   r_   r   )r'   r9   r4   normalized_itemr   s        r   r;   Specifier.contains  sW    8 **K *$/
 (( /3.@.@.O ,,??r   r=   c              #   @  #    Sn/ nSUb  UOS0nU Hj  n[        U5      nU R                  " U40 UD6(       d  M(  UR                  (       a+  U(       d$  U R                  (       d  UR	                  U5        Md  SnUv   Ml     U(       d  U(       a  U H  nUv   M	     ggg7f)a  Filter items in the given iterable, that match the specifier.

:param iterable:
    An iterable that can contain version strings and :class:`Version` instances.
    The items in the iterable will be filtered according to the specifier.
:param prereleases:
    Whether or not to allow prereleases in the returned iterator. If set to
    ``None`` (the default), it will be intelligently decide whether to allow
    prereleases or not (based on the :attr:`prereleases` attribute, and
    whether the only versions matching are prereleases).

This method is smarter than just ``filter(Specifier().contains, [...])``
because it implements the rule from :pep:`440` that a prerelease item
SHOULD be accepted if no other versions match the given specifier.

>>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
['1.3']
>>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
['1.2.3', '1.3', <Version('1.4')>]
>>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
['1.5a1']
>>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
>>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']
Fr4   NT)r   r;   rm   r4   append)r'   r=   r4   yieldedfound_prereleaseskwr   parsed_versions           r   r?   Specifier.filter5  s     < K,C[N  G,W5N}}^2r22 "//4#3#3%,,W5 #G!M  ( ,, - -ws   4BA$B)re   rd   rz   Nr   )2r   r   r   r   r    _operator_regex_str_version_regex_strrecompileVERBOSE
IGNORECASEr`   r   rC   r   rF   rg   rG   r4   rH   r_   r   r   r(   r   r   rD   r,   rE   r1   CallableOperatorr   r   r   r   r   r   r   r   r   r   r
   r   UnparsedVersionr;   r   r   r   r?   r!   r   r   r   rK   rK   a   s   \| ZZ%%(::WD


R]]"F "	J(S (HTN (d (4 T  . " "$ " " #     B# B$* * 0sCx 0 0*# *=F =t =:! !(8 !
w 
c 
d 
(&/' &/ &/ &/P:g :S :T :<G <3 <4 <<w <c <d <g   0 C D <=g =S =T =#sG|!4 # #, DH,@#,@2:4.,@	,@^ UY; !34;CKD>;	$	%; ;r   rK   z^([0-9]+)((?:a|b|c|rc)[0-9]+)$c                 2   / nU R                  S5      u  p#nUR                  U=(       d    S5        UR                  S5       HQ  n[        R	                  U5      nU(       a!  UR                  UR                  5       5        M@  UR                  U5        MS     U$ )a  Split version into components.

The split components are intended for version comparison. The logic does
not attempt to retain the original version string, so joining the
components back with :func:`_version_join` may not produce the original
version string.
!0.)
rpartitionr   split_prefix_regexra   extendgroups)r   resultepochr   restr9   rf   s          r   r   r   v  sw     F'',NEd
MM%,3

3$$T*MM%,,.)MM$   Mr   
componentsc                 4    U tpU SSR                  U5       3$ )zJoin split version components into a version string.

This function assumes the input came from :func:`_version_split`, where the
first component must be the epoch (either empty or numeric), and all other
components numeric.
r   r   )join)r   r   r   s      r   r   r     s%     LEWAchhtn%&&r   segmentc                 8   ^  [        U 4S jS 5       5      (       + $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )
startswith).0r   r   s     r   	<genexpr>!_is_not_suffix.<locals>.<genexpr>  s#      1Pv6""1Ps   !)devabrcpost)any)r   s   `r   r   r     s"     1P   r   leftrightc                    / / p2UR                  [        [        R                  " S U 5      5      5        UR                  [        [        R                  " S U5      5      5        UR                  U [	        US   5      S  5        UR                  U[	        US   5      S  5        UR                  SS/[        S[	        US   5      [	        US   5      -
  5      -  5        UR                  SS/[        S[	        US   5      [	        US   5      -
  5      -  5        [        [        R                  R                  U5      5      [        [        R                  R                  U5      5      4$ )Nc                 "    U R                  5       $ r   isdigitxs    r   <lambda>_pad_version.<locals>.<lambda>  s
    r   c                 "    U R                  5       $ r   r  r
  s    r   r  r    s
    !))+r   r   r   r   )	r   r   r   r   r   insertmaxchainfrom_iterable)r  r  
left_splitright_splits       r   r   r     s3    " d9../DdKLMtI//0EuMNO d3z!}-/01uSQ0234 a#QKN(;c*Q->P(P!QQRq3%#aZ]);c+a.>Q)Q"RRS 	Y__**:67Y__**;78 r   c            	       p   \ rS rSrSr SS\S\\   SS4S jjr\	S\\   4S j5       r
\
R                  S	\SS4S
 j5       r
S\4S jrS\4S jrS\4S jrS\S \4   SS 4S jrS\S\4S jrS\4S jrS\\   4S jrS\S\4S jr  SS\S\\   S\\   S\4S jjr SS\\   S\\   S\\   4S jjrSrg)SpecifierSeti  zThis class abstracts handling of a set of version specifiers.

It can be passed a single specifier (``>=3.0``), a comma-separated list of
specifiers (``>=3.0,!=3.1``), or no specifier at all.
N
specifiersr4   r   c                     UR                  S5       Vs/ s H)  o3R                  5       (       d  M  UR                  5       PM+     nn[        [        [        U5      5      U l        X l        gs  snf )a  Initialize a SpecifierSet instance.

:param specifiers:
    The string representation of a specifier or a comma-separated list of
    specifiers which will be parsed and normalized before use.
:param prereleases:
    This tells the SpecifierSet if it should accept prerelease versions if
    applicable or not. The default of ``None`` will autodetect it from the
    given specifiers.

:raises InvalidSpecifier:
    If the given ``specifiers`` are not parseable than this exception will be
    raised.
,N)r   rc   	frozensetmaprK   _specsre   )r'   r  r4   ssplit_specifierss        r   rg   SpecifierSet.__init__  sX    ( 0:/?/?/DR/D!	IAGGI/DR  I/? @A ( Ss
   A+A+c                     U R                   b  U R                   $ U R                  (       d  g [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7fr   r4   r   r  s     r   r   +SpecifierSet.prereleases.<locals>.<genexpr>  s     6+Q==+   )re   r  r  r&   s    r   r4   SpecifierSet.prereleases  s?     ($$$
 {{ 6$++666r   r6   c                     Xl         g r   rp   r8   s     r   r4   r&    rq   r   c                 d    U R                   b  SU R                  < 3OSnS[        U 5      < U S3$ )a  A representation of the specifier set that shows all internal state.

Note that the ordering of the individual specifiers within the set may not
match the input string.

>>> SpecifierSet('>=1.0.0,!=2.0.0')
<SpecifierSet('!=2.0.0,>=1.0.0')>
>>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
<SpecifierSet('!=2.0.0,>=1.0.0', prereleases=False)>
>>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
<SpecifierSet('!=2.0.0,>=1.0.0', prereleases=True)>
ry   rz   z<SpecifierSet(r|   )re   r4   rC   r~   s     r   r   SpecifierSet.__repr__  sD       , T--01 	  D	}SE44r   c                 X    SR                  [        S U R                   5       5      5      $ )a6  A string representation of the specifier set that can be round-tripped.

Note that the ordering of the individual specifiers within the set may not
match the input string.

>>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
'!=1.0.1,>=1.0.0'
>>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
'!=1.0.1,>=1.0.0'
r  c              3   8   #    U  H  n[        U5      v   M     g 7fr   )rC   r#  s     r   r   'SpecifierSet.__str__.<locals>.<genexpr>  s     ;{!s1vv{r%  )r   sortedr  r&   s    r   r(   SpecifierSet.__str__   s"     xx;t{{;;<<r   c                 ,    [        U R                  5      $ r   )r   r  r&   s    r   r,   SpecifierSet.__hash__  s    DKK  r   r.   c                     [        U[        5      (       a  [        U5      nO[        U[        5      (       d  [        $ [        5       n[	        U R
                  UR
                  -  5      Ul        U R                  c   UR                  b  UR                  Ul        U$ U R                  b   UR                  c  U R                  Ul        U$ U R                  UR                  :X  a  U R                  Ul        U$ [        S5      e)aR  Return a SpecifierSet which is a combination of the two sets.

:param other: The other object to combine with.

>>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
<SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
>>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
<SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
zFCannot combine SpecifierSets with True and False prerelease overrides.)r   rC   r  r   r  r  re   
ValueError)r'   r.   	specifiers      r   __and__SpecifierSet.__and__  s     eS!! 'EE<00!! N	$T[[5<<%?@	$););)G%*%7%7I"  *u/A/A/I%)%6%6I"  %"4"44%)%6%6I"   r   c                     [        U[        [        45      (       a  [        [        U5      5      nO[        U[        5      (       d  [        $ U R
                  UR
                  :H  $ )a1  Whether or not the two SpecifierSet-like objects are equal.

:param other: The other object to check against.

The value of :attr:`prereleases` is ignored.

>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
...  SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
True
>>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
True
>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
False
)r   rC   rK   r  r   r  r0   s     r   r1   SpecifierSet.__eq__0  sJ    & ec9-.. U,EE<00!!{{ell**r   c                 ,    [        U R                  5      $ )z7Returns the number of specifiers in this specifier set.)r   r  r&   s    r   __len__SpecifierSet.__len__J  s    4;;r   c                 ,    [        U R                  5      $ )z
Returns an iterator over all the underlying :class:`Specifier` instances
in this specifier set.

>>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
[<Specifier('!=1.0.1')>, <Specifier('>=1.0.0')>]
)iterr  r&   s    r   __iter__SpecifierSet.__iter__N  s     DKK  r   r9   c                 $    U R                  U5      $ )a  Return whether or not the item is contained in this specifier.

:param item: The item to check for.

This is used for the ``in`` operator and behaves the same as
:meth:`contains` with no ``prereleases`` argument passed.

>>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
False
>>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
False
>>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
True
r   r   s     r   r   SpecifierSet.__contains__X  r   r   	installedc                 0  ^^ [        T[        5      (       d  [        T5      mTc  U R                  mT(       d  TR                  (       a  gU(       a&  TR                  (       a  [        TR                  5      m[        UU4S jU R                   5       5      $ )a  Return whether or not the item is contained in this SpecifierSet.

:param item:
    The item to check for, which can be a version string or a
    :class:`Version` instance.
:param prereleases:
    Whether or not to match prereleases with this SpecifierSet. If set to
    ``None`` (the default), it uses :attr:`prereleases` to determine
    whether or not prereleases are allowed.

>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1")
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
True
Fc              3   B   >#    U  H  oR                  TTS 9v   M     g7f)r"  Nr   )r   r  r9   r4   s     r   r   (SpecifierSet.contains.<locals>.<genexpr>  s     Rk::d:<ks   )r   r   r4   rm   r   allr  )r'   r9   r4   rA  s    `` r   r;   SpecifierSet.containsm  sp    < $((4=D
 **K t11++4,,-D RdkkRRRr   r=   c                    Uc  U R                   nU R                  (       a7  U R                   H  nUR                  U[        U5      S9nM     [	        U5      $ / n/ nU HS  n[        U5      nUR                  (       a#  U(       d  U(       d  UR                  U5        M@  MB  UR                  U5        MU     U(       d  U(       a  Uc  [	        U5      $ [	        U5      $ )a.  Filter items in the given iterable, that match the specifiers in this set.

:param iterable:
    An iterable that can contain version strings and :class:`Version` instances.
    The items in the iterable will be filtered according to the specifier.
:param prereleases:
    Whether or not to allow prereleases in the returned iterator. If set to
    ``None`` (the default), it will be intelligently decide whether to allow
    prereleases or not (based on the :attr:`prereleases` attribute, and
    whether the only versions matching are prereleases).

This method is smarter than just ``filter(SpecifierSet(...).contains, [...])``
because it implements the rule from :pep:`440` that a prerelease item
SHOULD be accepted if no other versions match the given specifier.

>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
['1.3']
>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
['1.3', <Version('1.4')>]
>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
[]
>>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
>>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']

An "empty" SpecifierSet will filter items based on the presence of prerelease
versions in the set.

>>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
['1.3']
>>> list(SpecifierSet("").filter(["1.5a1"]))
['1.5a1']
>>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']
>>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
r"  )r4   r  r?   rF   r<  r   rm   r   )r'   r=   r4   r\   filteredr   r9   r   s           r   r?   SpecifierSet.filter  s    X **K
 ;;;;xT+=N;O $>!
 24H:< !0!6 "//#)006 $ OOD) !  1k6I-..>!r   )re   r  r   )NNr   )r   r   r   r   r    rC   r   rF   rg   rG   r4   rH   r   r(   rD   r,   r
   r4  rE   r1   r9  r   rK   r=  r   r   r;   r   r   r?   r!   r   r   r   r  r    sz    CG((19$(	(: 7Xd^ 7 7  " "$ " "5# 5*= =!# !U>3#67 N @+F +t +4   !(9- !# #T #0 '+$(	7S7S d^7S D>	7S
 
7St UYM" !34M"CKD>M"	$	%M" M"r   r  )#r    rA   r   r   typingr   r   r   r   r   r   r	   r
   utilsr   r   r   rC   r   r   rF   r   r   r2  r   ABCMetar#   rK   r   r   r   r   r   r   r  r   r   r   <module>rM     s'     	 V V V ' %1I WcND01 _  	z 	4ckk 4nO Od 

<=C DI ,'d3i 'C 'C D tCy c uT#YS	=Q7R *A"= A"r   