+
    2j                      a  0 t $ R t^ RIHt ^ RIt^ RIHtHtHtH	t	 ^ RI
HtHtHt ^ RIHt ^RIHtHtHt ^RIHt ^RIHtHt ^R	IHt ^R
IHtHt ^RIH t H!t! ^RIH"t"H#t#H$t$H%t% ]'       d   ^RI&H't' ^RIH(t( . ROt)]. ]]*]+3,          3,          t,RRRRRRRRR/R RRRRRR!RR/R"RR#RR$RR%RR/R&RR#RR$RRRR/R'RR(RR)RR*RR+/R,RR(RR)RR-RR+/R.RRRRRR/RR/R0RRRRRR1RR//t-R2].R&   R3R4R5R6R3/R7R4R8R6R7//t/R2].R&   Rt0R9].R:&   R3R;R7R</t1R=].R>&   R;t2R?t3^t4^t5Rt6R9].R&   ]7! 0 Rm4      t8RB].R&   ]7! R@RA04      t9RB].R&   RC RD lt:Rt;R9].RE&   Rt<RFt=]P|                  ! RG]= RH]= RI24      t?RJ RK lt@RL RM ltARN RO ltBRP RQ ltC]7! 0 Rm4      tD]7! 0 Rm4      tE]E]7! RR04      ,
          tFRRRVRVRRRWRSRSRWRTRTRURU/tGR=].RX&    ! RY R]H4      tIRZ R[ ltJR\ R] ltKR^ R_ ltLR` Ra ltMRb Rc ltNRd Re ltORf Rg ltPRh Ri ltQ]3Rj Rk lltRRl Rm ltSRn Ro ltT]! RpRq7       ! Rr R4      4       tURRs Rt lltV] ! Ru R4      4       tWRv Rw ltXRx Ry ltYRz R{ ltZR| R} lt[R~ R lt\R# )a  The environments one resolve runs against.

A :class:`ResolveTarget` is a complete PEP 508 marker environment plus
the wheel tags that environment accepts.  A resolve runs against a list
of them: the host interpreter alone, the one target
``[tool.nab.environment]`` declares, or one per (python, platform,
implementation) point a :class:`Matrix` expands to.  They all feed the
same provider, so the resolver has a single notion of "the environment
we are resolving for".

A declared target synthesizes its markers from the platform and
implementation it names, never from the interpreter running nab: a
matrix that models linux/3.11 must answer the same way on a macOS host.
A host target takes them from ``packaging.markers.default_environment``
untouched, and says so through :attr:`ResolveTarget.host_faithful`,
which is what tells a caller whether running a build backend here would
report metadata for the target or for someone else.
)annotationsN)CallableIterableMappingSequence)	dataclassfieldreplace)TYPE_CHECKING)EMPTY_MEMBERSHIP_SETSMARKER_VARIABLE_FOR_KINDUnevaluableMarkerError)tags)Markerdefault_environment)variable_names)InvalidSpecifierSpecifierSet)InvalidVersionVersion)FREE_THREADED_MIN_PYTHONPlatformSpecTagSetsupports_free_threading)VersionRange)
TagsSourceIMPLEMENTATION_MARKERSKNOWN_PYTHON_MINORSPEP508_MARKER_VARIABLESPLATFORM_MARKERSUNBOUNDABLE_MARKER_VARIABLESMatrixNonIntervalMarkerErrorResolveTargetlinux_x86_64sys_platformlinuxplatform_systemLinuxplatform_machinex86_64os_nameposixlinux_aarch64aarch64macos_arm64darwinDarwinarm64macos_x86_64windows_amd64win32WindowsAMD64ntwindows_arm64ARM64
linux_i686i686linux_armv7larmv7lzdict[str, dict[str, str]]cpythonplatform_python_implementationCPythonimplementation_namepypyPyPytuple[str, ...]_TAG_AXIS_MARKERSpyppdict[str, str]_IMPLEMENTATION_PREFIXhostplatform_releaseplatform_versionfrozenset[str]c                    V ^8  d   QhRRRR/#    targetr#   returnrN    )formats   "\/home/user/billing-ledger-validation/.venv/lib/python3.14/site-packages/nab_python/target.py__annotate__rW      s     E E- EN E    c                L    V P                   R8X  d   \        # \        R0,          # )a  Return the variables the lock cannot bound for ``target``.

Always the kernel axes.  On a non-CPython target ``implementation_version``
joins them: :func:`declared_environment` sets it to the target's Python
level, but a released PyPy reports its own release (7.3.x) there, so a
clause bounded on the synthetic value would refuse the very interpreter
the lock was resolved for.  CPython's ``implementation_version`` is its
Python micro, so it stays declarable by constraint.
r?   implementation_version)implementationr    rR   s   &rV   unboundable_variablesr]      s'     	)++'+C*DDDrX   _ALWAYS_DECLAREDz)"[^"]*"|\'[^\']*\'|[A-Za-z_][A-Za-z0-9_]*z(?P<lhs>z9)\s*(?P<op>===|==|!=|<=|>=|~=|<|>|not\s+in|in)\s*(?P<rhs>)c                    V ^8  d   QhRRRR/# )rQ   marker_textstrrS   rN   rT   )rU   s   "rV   rW   rW   	  s     A A# A. ArX   c                .    \        V 4      \        ,          # )a  Return the PEP 508 environment variables ``marker_text`` names.

Parses the marker and reads the variables its operands name, keeping
only the PEP 508 environment variables: the set variables ``extra`` /
``extras`` / ``dependency_groups`` are not lock-environment axes (a lock
cannot pin them), so they drop out.  A quoted name on the right of a
variable comparison (``sys_platform == "python_version"``) is a value the
marker compares against, not a variable it reads, and is not returned; but
packaging reads the right operand of a literal-only comparison
(``"3.9" == "python_version"``) as an environment key, so that name is
returned.  The result is an
over-approximation of semantic support: a tautology such as
``python_version >= "0"`` still reports ``python_version``.
Over-declaring narrows the lock, which is the safe direction to be
wrong in.

Every call site passes a serialised :class:`Marker`; an input that is not
a valid marker raises :class:`InvalidMarker`.
)r   r   )ra   s   &rV   marker_variablesrd   	  s    ( +&)@@@rX   c               $    V ^8  d   QhRRRRRR/# )rQ   rR   r#   	consultedIterable[Marker]rS   rb   rT   )rU   s   "rV   rW   rW      s#     2! 2!M 2!>N 2!SV 2!rX   c                   \        V Uu0 uF  p\        V4      kK  	  up4      p\        4       pV F  pV\        V4      ,          pK  	  \	        \
        4      pV P                  '       d   VP                  R4       V\        V4      ,
          \        V 4      ,
          p. VO\        V\        \        4      ,
          4      OpV U	u. uF  q RV P                  V	,           R2NK  	  p
p	V
P                  V P                  4       RV9   d4   V P                  R8X  d#   V
P                  R V P                   4       4       RP                  V
4      # u upi u up	i )a  Render the PEP 751 ``environments`` marker for ``target``.

Declares :data:`_ALWAYS_DECLARED`, ``implementation_name`` when the
target names a non-default interpreter (see
:attr:`ResolveTarget.declares_implementation`), and every variable the
``consulted`` markers named.  The resolve dropped every dependency whose
marker was False here, so a lock that let an installer answer one of
those variables differently would miss deps; the declaration refuses it.

Most variables are declared by value (a ``platform_system`` marker pins
the OS).  The :data:`_BY_CONSTRAINT` variables (``python_full_version``,
and ``implementation_version`` on CPython) are not, since pinning the
micro release would refuse the interpreters the resolve ran for.  A minor
target is a micro interval: a consulted marker that splits it (see
:func:`micro_boundary_points`) leaves each slice its
:attr:`~ResolveTarget.micro_clauses` bounds and the row emits those,
while an unsplit minor emits none and stays a plain ``python_version``
row.  On CPython ``implementation_version`` tracks ``python_full_version``,
so a marker consulting it gets the same bounds mirrored onto its name.

The variables :func:`unboundable_variables` names are dropped: the kernel
axes always, and ``implementation_version`` on a non-CPython target (its
value there is the Python level, not the interpreter's release), so a dep
gated on that axis may be missed at install.
rB    == ""rZ   r?   c              3  F   "   T F  pVP                  R R4      x  K  	  R# 5i)python_full_versionrZ   N)r	   ).0clauses   & rV   	<genexpr>*environment_declaration.<locals>.<genexpr>N  s'      
. NN02JKK.s   ! and )sortedrb   setrd   listr^   declares_implementationappendr]   _BY_CONSTRAINT
marker_envextendmicro_clausesr[   join)rR   rf   markertexts	variablestextalwaysby_valuenamesnameclausess   &&         rV   environment_declarationr      s.   4 i8iFCKi89E%I%d++	  "#F%%%+,3v;&)>v)FFH>f>vh^)<<=>EDIJEDuV..t45Q7EGJ NN6''(9,1F1F)1S 
 ..
 	
 <<  1 9 Ks   E!Ec                    V ^8  d   QhRRRR/# )rQ   rR   r#   rS   rb   rT   )rU   s   "rV   rW   rW   U  s     ! !- !C !rX   c                N   \         \        \        4      ,          p\        V P                  P                  4       4       UUu. uF  w  r#W!9  g   K  V RV R2NK  	  pppV P                  '       g    VP                  RV P                   R24       RP                  V4      # u uppi )aL  Render the environment a target resolved for, on its whole declared range.

Pins every boundable environment axis to the target's value. A minor
interval leaves the micro release open, so python_version pins the whole
minor; a whole target (host, or a python-patches micro pin) adds the
concrete python_full_version it resolved at.
ri   rj   zpython_full_version == "rq   )
r    rs   rw   rr   rx   itemsis_minor_intervalrv   rl   r{   )rR   skipr   valuer   s   &    rV   declared_range_markerr   U  s     (#n*==D "&"3"3"9"9";<<KD 	4&eWA<  
 ###1&2L2L1MQOP<<  s   
B!B!c                    V ^8  d   QhRRRR/# )rQ   atomzre.Match[str]rS   tuple[str, str, str]rT   )rU   s   "rV   rW   rW   h  s     * * **> *rX   c                r    V P                  RRR4      w  rpVRP                  VP                  4       4      V3# )zEReturn one clause's operands and its operator, whitespace normalized.lhsoprhs )groupr{   split)r   r   r   r   s   &   rV   _clause_partsr   h  s4    ::eT51LCS$c))rX   <>===!=>z<=_MIRRORED_OPERATORc                      ] tR tRtRtRtR# )r"   i  a  A consulted version marker cannot tile a minor interval.

A minor target stands for every micro of its minor, and each consulted
``python_full_version`` (or, on CPython, ``implementation_version``)
comparison has to partition that interval so every real interpreter reads
it the same way its slice does.  A membership (``in``/``not in``), a
verbatim ``===``, a non-version string comparison, a comparison against
another variable, a pre- or post-release version literal that would carve
a slice off a real micro, or a literal PEP 440 refuses under the operator
it is written with (``< "3.12.*"``, ``~= "3"``) cannot be tiled, so the
resolve stops loudly rather than pin the whole minor to one synthetic
answer.
rT   N)__name__
__module____qualname____firstlineno____doc____static_attributes__rT   rX   rV   r"   r"     s    rX   c               $    V ^8  d   QhRRRRRR/# )rQ   partsr   rR   r#   rS   r"   rT   )rU   s   "rV   rW   rW     s$      )6rX   c                P    V w  r#p\        RV RV RV RVP                   R2	4      # )zABuild the crash for a clause that cannot tile ``target``'s minor.zconsulted marker clause r   z cannot tile the z minor interval: no micro boundary the lock can render comes from a python_full_version membership, a verbatim ===, a comparison against a variable, a pre- or post-release comparison, or a literal the operator cannot spell as a version bound)r"   label)r   rR   r   r   r   s   &&   rV   _non_intervalr     sG     LCS!
"3%qAcU 3LL> E	E rX   c               $    V ^8  d   QhRRRRRR/# )rQ   rR   r#   pointszSequence[Version]rS   list[ResolveTarget]rT   )rU   s   "rV   rW   rW     s$     ! !!#4!!rX   c           	        V'       g   V .# \        V P                   R24      pV.VOpR.VOp. VORNp. p\        W4VRR7       Fv  w  rxp	. p
Ve   V
P                  R\	        V4       R24       V	e   V
P                  RV	 R24       VP                  V P                  \        V4      \        V
4      4      4       Kx  	  V# )a  Partition ``target``'s minor into one slice per micro interval.

``points`` are the in-minor releases the micro line is cut at (see
:func:`micro_boundary_points`), sorted ascending.  They partition
``[{minor}.0, inf)`` into intervals; each interval becomes ``target``
moved onto its lower-bound release, carrying the python_full_version
bounds that fence it off (see :meth:`ResolveTarget.with_micro_slice`).
Every marker answers unambiguously at an interval's lower bound, so that
release is where the slice resolves.  Each slice declares its own
environment row and pins, so a marker that genuinely splits the micros is
honoured per slice rather than lifted onto the whole minor.

Returns ``[target]`` unchanged when ``points`` is empty: nothing cut the
minor, so the whole minor resolves at once.
.0NT)strictzpython_full_version >= "rj   zpython_full_version < ")r   python_versionziprv   _dev0with_micro_slicerb   tuple)rR   r   floorrepslowersuppersslicesreplowhighr   s   &&         rV   slices_from_pointsr     s    $ xv,,-R01EFD$(?6?F#2V?T?F"$FdF4@$?NN5eCj\CDNN4TF!<=f--c#hgGH A MrX   c                    V ^8  d   QhRRRR/# )rQ   versionr   rS   rb   rT   )rU   s   "rV   rW   rW     s     
+ 
+7 
+s 
+rX   c                0    \        \        V  R24      4      # )a  Return the ``.dev0`` boundary form of a release ``version``.

The canonical disjoint and exhaustive split pair at a boundary ``X`` is
``< "X"`` on the lower side and ``>= "X.dev0"`` on the upper: a verbatim
``< "X"`` / ``>= "X"`` pair leaves a gap at prereleases of ``X`` (packaging
carries a ``< X`` upper as ``X.dev0``), so the ``>=`` lower edge is snapped
to ``X.dev0`` to meet the adjacent ``< "X"`` exactly.  The suffix is a
syntactic form on a packaging-parsed version, validated by re-parsing.
z.dev0)rb   r   )r   s   &rV   r   r     s     w'%()**rX   c                    V ^8  d   QhRRRR/# rP   rT   )rU   s   "rV   rW   rW     s     
. 
.} 
. 
.rX   c                V    V P                   R8X  d   \        RR04      # \        R04      # )aR  Return the version variables whose comparisons split ``target``.

Always ``python_full_version``.  On CPython ``implementation_version``
tracks it, so a comparison on it mints the same boundary; on other
implementations its value is synthetic (:func:`unboundable_variables`), so
it is never split and its markers stay a known limitation.
r?   rl   rZ   )r[   	frozensetr\   s   &rV   _scanned_version_variablesr     s3     	)/1IJKK+,--rX   c               $    V ^8  d   QhRRRRRR/# )rQ   rR   r#   rf   rg   rS   zlist[Version]rT   )rU   s   "rV   rW   rW     s$     * **&6**rX   c                   V P                   '       g   . # \        V P                  4      P                  R\         p\        V P                   R24      p\        V 4      p\        4       p\        V\        R7       FM  p\        P                  \        V4      4       F(  pVP                  \        \        V4      WBW04      4       K*  	  KO  	  \        V4      # )a
  Return the in-minor releases ``consulted`` cuts ``target``'s minor at.

A minor target stands for every micro of its minor (its
``python_full_version`` is the synthesized ``{minor}.0`` floor).  A
consulted marker comparing ``python_full_version`` against a literal inside
the minor (``python_full_version < "3.10.2"``) needs different package sets
on each side, so the release it flips at is a point the micro line is split
on (see :func:`slices_from_points`).  On CPython ``implementation_version``
tracks ``python_full_version``, so a comparison on it mints the same
boundary.

The per-operator boundary comes from the edges of the range's
:meth:`~packaging.ranges.VersionRange.release_intervals`:
``<``/``>=`` at the literal, ``<=``/``>`` at the release just after it, and
``==``/``!=``/``~=``/``== V.*`` at each edge of the region they name.  A
boundary outside the minor or at its floor cuts nothing.

An operator that cannot tile the interval raises
:class:`NonIntervalMarkerError` (see there); with the whole-minor pin gone,
an untileable marker stops the resolve loudly.  A whole target (a host, or
a python-patches pin) is not an interval and is never cut.

Markers are scanned in text order, so the clause a crash names is the same
every run even when ``consulted`` is unordered.
Nr   )key)r   r   r   release_PYTHON_VERSION_PARTSr   rs   rr   rb   _MARKER_CLAUSE_REfinditerupdate_clause_boundary_pointsr   )rR   rf   minor_releaser   scannedr   r|   r   s   &&      rV   micro_boundary_pointsr     s    8 ###	F112::;Q<QRMv,,-R01E(0G5F,%..s6{;DMM'!$' < - &>rX   c               0    V ^8  d   QhRRRRRRRRR	R
RR/# )rQ   r   r   r   rN   r   tuple[int, ...]r   r   rR   r#   rS   zset[Version]rT   )rU   s   "rV   rW   rW     sD     ' ''' #' 	'
 ' 'rX   c                   \        WV4      pVf   \        4       # Vw  rgpVP                  '       d   V\        9   g   VP                  '       d3   V\
        9   d(   \        WV4      '       d   \        W4      h\        4       # VP                  4       P                  \        4      p	V	 U
UUu0 uF+  w  rW3 F  pVf   K	  \        WV4      '       g   K  VkK!  	  K-  	  uppp
# u uppp
i )a(  Return the in-minor release boundaries one clause cuts the minor at.

Empty when the clause names no scanned version variable, or its boundaries
fall outside the minor or at its floor.  Raises
:class:`NonIntervalMarkerError` when the clause names a scanned variable
but cannot tile the interval.
)_clause_interval_literalrs   is_prerelease_AT_LITERAL_OPERATORSis_postrelease_POST_AT_LITERAL_OPERATORS	_in_minorr   to_rangerelease_intervals_PYTHON_FULL_VERSION_PARTS)r   r   r   r   rR   parsedr   	specifierr   	intervalslowerupperedges   &&&&&        rV   r   r     s     &ef=F~u#B7"(="=2)C#C WU33..u""$667QRI &%LEND 	 !*$u E 	" 	%  s   *C =C 
C c               (    V ^8  d   QhRRRRRRRR/# )rQ   pointr   r   r   r   rS   boolrT   )rU   s   "rV   rW   rW   D  s)      W _ W QU rX   c                    V P                   VP                   8H  ;'       d#    V P                  R\         V8H  ;'       d    W8  # )zWhether ``point`` is an interior micro of the minor above its floor.

An epoch sorts above every version of a lower one, so a boundary with a
different epoch is outside the minor whatever its release says:
``1!3.12.4`` is not in ``[3.12.0, 3.13.0)``.
N)epochr   r   )r   r   r   s   &&&rV   r   r   D  sG     	u{{" 	 	MM001]B	 	MrX   c               (    V ^8  d   QhRRRRRRRR/# )	rQ   r   r   r   rN   rR   r#   rS   z(tuple[str, SpecifierSet, Version] | NonerT   )rU   s   "rV   rW   rW   R  s,     '" '"'"*8'"BO'"-'"rX   c                   V w  r4pW19   d   TpM1WQ9   d*   Tp\         P                  V4      pVf   \        W4      hTpMR# V\        9   g   VP	                  R4      '       g   \        W4      hVP                  R4      pVP                  R4      p	 \        V	4      p
\        V V 24      pYKT
3#   \        \        3 d    \        Y4      Rhi ; i)a)  Return ``(op, specifier, version)`` for a version-boundary clause.

``None`` when the clause names no scanned version variable.  Raises
:class:`NonIntervalMarkerError` when it names one but cannot tile an
interval.  A literal-first clause has an ordered or symmetric operator
mirrored back to variable-on-left form; ``~=``/``===`` and the membership
operators cannot be mirrored, so a literal-first one of those is untileable.

The specifier is built here rather than by the caller because PEP 508
accepts literals PEP 440 refuses under the operator they are written with.
A ``.*`` suffix is a specifier only under ``==``/``!=``, and ``~=`` needs
two release components, so ``< "3.12.*"`` and ``~= "3"`` are valid markers
with no specifier form; building it is what tells them from the clauses
that have one.
Nrj   z.*)r   getr   _NON_INTERVAL_OPERATORS
startswithstripremovesuffixr   r   r   r   )r   r   rR   r   r   r   literalmirroredrawbaser   r   s   &&&         rV   r   r   R  s    $ LCS
~	%))"-..	$$G,>,>s,C,CE**
--
CD!D5$- B4u.	 '!! ,- 5E*45s   B. .Cc                    V ^8  d   QhRRRR/# )rQ   
env_sourceEnvironmentSourcerS   rI   rT   )rU   s   "rV   rW   rW   |  s      	Y 	Y!	Y	YrX   c                    V ! 4       P                  4        UUu/ uF  w  r\        V\        4      '       g   K  WbK!  	  upp# u uppi )zReturn the host's PEP 508 marker environment as a plain string dict.

``default_environment`` returns a TypedDict whose ``.items()`` view
widens the values to ``object``, so rebuild it as ``dict[str, str]``
the callers can overlay onto.
)r   
isinstancerb   )r   r   r   s   &  rV   host_environmentr   |  s9     *4););)=X)=:3ESVAWJCJ)=XXXs
   AAc                    V ^8  d   QhRRRR/# )rQ   r   rb   rS   rI   rT   )rU   s   "rV   rW   rW     s     B BC BN BrX   c                    \        V 4      pTP                  pRP                  R . TO^ N5R\          4       4      p\        T4      \        8  d   T pMrTP                  '       d   TP                   R2MRpRP                  R . TO^ N^ N5R\          4       4      p\        T4      \        TP                  4      R pT T T 2pR	TR
T/#   \         d    RT : R2p\        T4      Rhi ; i)a  Map an explicit Python version to its PEP 508 marker keys.

``python_version`` is padded to two components and
``python_full_version`` to three so patch-precision markers evaluate
the same here as in the universal matrix. Raises ``InvalidVersion``
if the input is not a version.
zpython_version z is not a valid versionN.c              3  8   "   T F  p\        V4      x  K  	  R # 5iNrb   rm   parts   & rV   ro   *python_axis_environment.<locals>.<genexpr>  s     Q+P4SYY+P   ! c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & rV   ro   r    s      
"O$CII"Or  r   rl   )
r   r   r   r{   r   lenr   r   rb   base_version)	r   r   msgr   minorfullr   paddedsuffixs	   &        rV   python_axis_environmentr    s   ,( nnGHHQ=W=a=9O:O+PQQE
7|11 '-lll6<<." 
"2G"2Q"2"23N4N"O
 
 VS!4!4578)e%:DAA!  ,11HIS!t+,s   C C+c               $    V ^8  d   QhRRRRRR/# )rQ   environmentrI   overlayMapping[str, str]rS   NonerT   )rU   s   "rV   rW   rW     s$      *;	rX   c                &   VP                  R4      ;'       g    VP                  R4      pVf   V P                  V4       R# \        V4      pV P                  R4      R8X  d   VR,          V R&   V P                  V4       V P                  V4       R# )aw  Merge ``overlay`` into ``environment``, keeping the python axis in sync.

When the overlay moves only ``python_version`` (or only
``python_full_version``) the untouched key would keep the host patch
level and the two would describe different interpreters. Re-derive both
from whichever axis key the overlay supplies (``python_full_version``
wins when both are present), so an overlay of ``python_version`` ``3.8``
yields ``python_full_version`` ``3.8.0`` like the universal matrix. On
CPython ``implementation_version`` equals ``python_full_version``, so move
it with the axis; other implementations version separately and keep their
host value unless the overlay sets it. Non-axis keys the overlay sets are
kept verbatim; the ``python_version``/``python_full_version`` pair is always
the derived one, so a patch-precision ``python_version`` (e.g. ``3.10.5``)
normalizes to major.minor.
rl   r   NrB   r?   rZ   )r   r   r  )r  r  sourceaxiss   &&  rV   apply_python_axis_overlayr    s    $ [[./PP7;;?O3PF~7#"6*D,-:045J0K,-wtrX   T)frozenc                     ] tR tRt$ RtR]R&   ]! RR7      tR]R&   ]! RR7      tR	]R
&   ]! RR7      t	R]R&   RFt
R]R&   ]! RRR7      tR]R&   ]! RRR7      tR]R&   ]! RRR7      tR]R&   ]! RRR7      tR]R&   ]! RFRR7      tR]R&   R R lt]R R l4       t]R R l4       t]R R  l4       t]R! R" l4       t]R# R$ l4       tR% R& lt]R' R( l4       t]R) R* l4       t]R+ R, l4       tR- R. lt]R/ R0 l4       t]R1 R2 l4       t]R3 R4 l4       tR5 R6 ltR7 R8 lt R9 R: lt!]"R;]#R<]$PJ                  /R= R> ll4       t&]"R;]#R<]$PJ                  /R? R@ ll4       t']"RARBRCRRR/RD RE ll4       t(RFt)R# )Gr#   i  a+  One environment a resolve runs against: markers, wheel tags, a name.

``label`` names the target (``host``, ``py312-linux_x86_64``) and is
the key a universal lock records its pins under, so it carries every
axis that makes one target differ from another, including the
conflict-fork ``selection``.

``selection`` is the conflict-fork this target belongs to: the
``(kind, name)`` members (``kind`` is ``"extra"`` or ``"group"``)
active in this fork's resolve, empty for an unforked one.  When set,
it adds a ``'name' in extras`` / ``'name' in dependency_groups``
clause to :attr:`marker_string`; the lockfile emitter builds the
per-package marker from the members themselves, keeping only the sets
the package varies over and negating their co-members.

``platform_spec`` is set on a declared (matrix) target and names the
tag knobs it was expanded from; a host target has none.
``multi_implementation`` says the matrix models more than one
implementation, which pins ``implementation_name`` on
:attr:`environment_marker_string` so the CPython and PyPy entries
for one python/platform stay mutually exclusive.

``tags_faithful`` says :attr:`tags` still describes the machine
:attr:`marker_env` does.  Only :meth:`with_marker_overrides` can
break that, and a provider given such a target filters no wheel by
tag: see there.
rb   r   F)comparer  rx   r   r   r   host_faithfultuple[tuple[str, str], ...]	selectionN)defaultr  zPlatformSpec | Noneplatform_specmulti_implementationTtags_faithfulconcrete_microrE   rz   c                   V ^8  d   QhRR/# )rQ   rS   r  rT   )rU   s   "rV   rW   ResolveTarget.__annotate__  s     + +t +rX   c                     \        V P                  4       R#   \         d1   pRT P                  : RT P                  : R2p\	        T4      ThRp?ii ; i)a  Reject a python the resolve cannot compare Requires-Python against.

Every candidate's ``Requires-Python`` is tested against this target,
so an unparseable version has to fail here, naming itself, rather than
as an ``InvalidVersion`` raised per candidate deep in the listing.
ztarget z names python_full_version z , which is not a PEP 440 versionN)r   rl   r   r   
ValueError)selfexcr  s   &  rV   __post_init__ResolveTarget.__post_init__  s]    	+D,,- 	+$** (,,//OQ  S/s*	+s    A+AAc                   V ^8  d   QhRR/# rQ   rS   rb   rT   )rU   s   "rV   rW   r#    s     1 1 1rX   c                (    V P                   R,          # )z=The PEP 508 ``python_version``: the target's ``major.minor``.r   rx   r&  s   &rV   r   ResolveTarget.python_version  s     /00rX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#    s     6 6S 6rX   c                (    V P                   R,          # )z?The PEP 508 ``python_full_version``: the target's full release.rl   r-  r.  s   &rV   rl   !ResolveTarget.python_full_version
       455rX   c                   V ^8  d   QhRR/# )rQ   rS   r   rT   )rU   s   "rV   rW   r#    s     	G 	G 	GrX   c                R    \        \        V P                  4      P                  4      # )a  The release a ``Requires-Python`` specifier is compared against.

``python_full_version`` is the PEP 508 marker value, so on a release
candidate it carries the ``rc``.  A specifier admits no prerelease
unless it names one, so comparing that value directly would exclude
every distribution requiring the very release the interpreter is a
candidate for.  pip compares ``sys.version_info``, and so does this.
)r   rl   r  r.  s   &rV   python_releaseResolveTarget.python_release  s      wt778EEFFrX   c                   V ^8  d   QhRR/# rQ   rS   r   rT   )rU   s   "rV   rW   r#    s     F F4 FrX   c                    V P                   '       g   V P                  '       d   R# V P                  '       d   R# V P                  V P                   R28H  # )a  Whether this target is a bare minor resolved as a micro interval.

A host reports a real interpreter and a python-patches pin names a
concrete micro; both are whole and resolve at one point.  A bare minor
synthesizes ``{minor}.0`` and stands for every real micro of the minor,
so the micro line can be split on it and Requires-Python is answered
against the whole minor, not the synthetic floor.  A slice off that
minor carries ``micro_clauses`` and still stands for every interpreter
its bounds admit, so it too is an interval answering Requires-Python at
the same whole minor.

A pinned ``X.Y.0`` reads as the synthetic floor by string alone, so the
concrete-micro flag, not the value, decides: a python-patches pin is
whole even when its micro is ``.0``.
FTr   )r  r!  rz   rl   r   r.  s   &rV   r   ResolveTarget.is_minor_interval  sL    " !4!4!4''d.A.A-B"+EEErX   c                   V ^8  d   QhRR/# )rQ   rS   r   rT   )rU   s   "rV   rW   r#  3  s     V V\ VrX   c                    \        V P                  4      P                  pV^ ,          V^,          r2\        RV RV RV RV^,            R2	4      P	                  4       # )z<The ``[X.Y.0, X.(Y+1).0)`` range this target's minor covers.r   r   z.0,<r   )r   r   r   r   r   )r&  r   majorr	  s   &   rV   minor_rangeResolveTarget.minor_range2  s\     $--.66qz71:ubqtE7!EAI;bIJSSUUrX   c                    V ^8  d   QhRRRR/# )rQ   specr   rS   r   rT   )rU   s   "rV   rW   r#  9  s     + +< +D +rX   c                    V P                   '       d9   VP                  4       P                  V P                  4      P                  '       * # V P
                  V9   # )a  Whether a candidate's ``Requires-Python`` admits this target.

A whole target (host or a concrete micro) is admitted when its single
release satisfies ``spec``.  A minor interval is admitted when ``spec``
overlaps the whole minor, so a micro floor like ``>= "3.13.2"`` admits
the 3.13 minor instead of excluding it at the synthetic ``.0`` floor.
The test is range overlap, not a scalar ``in``: ``>= "3.13.2"`` would
exclude both ``3.13`` and ``3.13.0``.
)r   r   intersectionr?  is_emptyr6  )r&  rB  s   &&rV   admits_requires_python$ResolveTarget.admits_requires_python9  sG     !!!}}33D4D4DENNNN""d**rX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#  H  s     6 6 6rX   c                (    V P                   R,          # )z@The target's interpreter implementation (``cpython``, ``pypy``).rB   r-  r.  s   &rV   r[   ResolveTarget.implementationG  r3  rX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#  M  s     / / /rX   c                ,    \        V P                  4      # )zThe conflict fork this target belongs to, as a label slug.

``extra-cpu``, ``group-black22.group-isort5``, empty when
unforked.  It is the tail of :attr:`label` without the leading
separator.
)_selection_slugr  r.  s   &rV   selection_slugResolveTarget.selection_slugL  s     t~~..rX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#  W  s     . .S .rX   c                V    V P                   f   \        # V P                   P                  # )z@The matrix platform this target names, or ``host`` for the host.)r  _HOST_PLATFORM_LABELplatform_idr.  s   &rV   rS  ResolveTarget.platform_idV  s(     %''!!---rX   c                   V ^8  d   QhRR/# )rQ   rS   zdict[str, str | frozenset[str]]rT   )rU   s   "rV   rW   r#  ]  s     < <%D <rX   c                *    / V P                   C\        C# )a  Return the marker env seeded with the empty membership sets.

``extras`` and ``dependency_groups`` are defined only when
consuming a lockfile, so a dependency marker that tests one
evaluates False here rather than raising (see
:data:`~nab_python._conflict_kind.EMPTY_MEMBERSHIP_SETS`).
)rx   r   r.  s   &rV   env_with_membership!ResolveTarget.env_with_membership]  s     <$//;%:;;rX   c                   V ^8  d   QhRR/# r9  rT   )rU   s   "rV   rW   r#  h  s     M M MrX   c                H    V P                   ;'       g    V P                  R8g  # )a:  Whether the interpreter is an axis this target has to name.

CPython alone is the default, so a lone CPython target leaves the
axis open.  A matrix modelling more than one implementation, or a
target on any other interpreter, has to say which one it is, or its
markers would also select the interpreter it is not.
r?   )r  r[   r.  s   &rV   ru   %ResolveTarget.declares_implementationg  s#     ((LLD,?,?9,LLrX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#  s  s      3 rX   c                    V P                   pRV P                   RVR,           RVR,           R2pV P                  '       d   VRV P                   R2,          pV P                   F  pVRV 2,          pK  	  V# )	aP  Return the PEP 508 marker for this target's environment only.

Combines ``python_version``, ``sys_platform`` and
``platform_machine``, plus ``implementation_name`` when
:attr:`declares_implementation`.  It carries no conflict-fork
``selection``, so it selects this target's platform/Python point,
not which extras or groups are active.
zpython_version == "z" and sys_platform == "r%   z" and platform_machine == "r)   rj   z and implementation_name == "rq   )rx   r   ru   r[   rz   )r&  envr|   rn   s   &   rV   environment_marker_string'ResolveTarget.environment_marker_stringr  s     oo!$"5"5!6 7%%(%8$9 :)),-?)@(AD 	
 '''5d6I6I5J!LLF((FfX&&F )rX   c                   V ^8  d   QhRR/# r+  rT   )rU   s   "rV   rW   r#    s      s rX   c                    V P                   p\        V P                  4       F!  w  r#\        V,          pVRV RV 2,          pK#  	  V# )a  Return :attr:`environment_marker_string` plus a bare membership clause.

Each ``(kind, name)`` member of :attr:`selection` adds
``'name' in extras`` / ``'name' in dependency_groups`` in sorted
order.  The clause is bare: it names the members this fork
selects, not the co-members it excludes.  The lockfile emitter
derives the mutually-exclusive per-package marker, which also
negates the co-members of the conflict sets that forbid
co-selection, from the target's environment and selection.
z and "z" in )r_  rr   r  r   )r&  r|   kindr   variables   &    rV   marker_stringResolveTarget.marker_string  sL     // 0JD/5HtfE(44F 1 rX   c                    V ^8  d   QhRRRR/# )rQ   	overridesr  rS   r#   rT   )rU   s   "rV   rW   r#    s     "
 "
/@ "
] "
rX   c                4  a a V'       g   S # \        S P                  4      o\        SV4       \        ;QJ d$    VV 3R l\         4       F  '       g   K   RM	  RM! VV 3R l\         4       4      p\        S SRS P                  ;'       d    V'       * R7      # )a@  Return this target with ``overrides`` merged into its marker env.

The python axis is re-derived when the overlay moves it, so
``python_version`` and ``python_full_version`` never describe two
different interpreters.  The tag set does not move with it: an
overlay names no runs-on libc or macOS, so it cannot rebuild the
wheel-tag axis.  The result is no longer
host-faithful; a build backend run under it reports the host's
metadata, not the impersonated target's.

An overlay that moves a marker the tag set encodes (the python
version, the implementation, or the machine) leaves the tags
describing one machine and the markers another, so the result is
not :attr:`tags_faithful` and a provider filters no wheel by tag
under it: filtering by a tag set the markers disown would drop
wheels the impersonated target installs and admit ones it cannot.
Overlaying a value the target already has moves nothing and keeps
the tags faithful.  ``[tool.nab.environment]`` and ``--python``
do not come through here; they rebuild the tag axis (see
:meth:`for_declared` and :meth:`for_host_python`).
c              3  ~   <"   T F2  pSP                  V4      SP                  P                  V4      8g  x  K4  	  R # 5ir   )r   rx   )rm   r   r^  r&  s   & rV   ro   6ResolveTarget.with_marker_overrides.<locals>.<genexpr>  s1      
CT4CGGDMT__0066CTs   :=TF)rx   r  r   )dictrx   r  anyrF   r	   r   )r&  rh  movedr^  s   f& @rV   with_marker_overrides#ResolveTarget.with_marker_overrides  s|    , K4??#!#y1 
CT
 
CT
 
 ,,::U	
 	
rX   c                    V ^8  d   QhRRRR/# )rQ   r  r  rS   r#   rT   )rU   s   "rV   rW   r#    s     
 
(C 
 
rX   c                    V P                   pV P                  '       d#   VR\        \        V P                  4      4      )  p\	        V V\        V4      ,           VR7      # )a  Return this target under a conflict fork's active members.

The label gains one ``kind-name`` clause per member, joined by
``.`` in sorted order, so the forks of one target stay distinct:
``py311-linux_x86_64-group-black22.group-isort5``.  The ``.``
separator and the ``kind`` prefix keep it unambiguous, since
canonical member names are ``[a-z0-9-]`` only: two selections
that differ in how their names split on ``-`` (or an extra and a
group of the same name) cannot collide onto one label and
silently overwrite each other's pins.
N)r   r  )r   r  r  _selection_suffixr	   )r&  r  r   s   && rV   with_selectionResolveTarget.with_selection  sV     zz>>>A30@AABD*955
 	
rX   c               $    V ^8  d   QhRRRRRR/# )rQ   rl   rb   r   rE   rS   r#   rT   )rU   s   "rV   rW   r#    s$     
 
#&
1@
	
rX   c                    \        V P                  4      p\        VRV/4       VP                  RR4      p\        V V P                   RV 2VVR7      # )aC  Return this target moved onto one micro slice of its minor.

``python_full_version`` is the representative release the slice
resolves at (its lower bound), and ``clauses`` are the
python_full_version bounds that fence the slice off from the others,
appended to :attr:`environment_marker_string`.  The label gains a
``-pfXYZ`` suffix so each slice pins under its own key.  The python
axis is re-derived, so ``python_version`` stays the minor and only
the micro (and, on CPython, ``implementation_version``) moves; the
wheel tags do not move with the micro, so they stay faithful.
rl   r   r  z-pf)r   rx   rz   )rl  rx   r  r	   r   )r&  rl   r   r^  compacts   &&&  rV   r   ResolveTarget.with_micro_slice  s]     4??#!#(=?R'ST%--c26ZZLG9-!	
 	
rX   r   tags_sourcec               $    V ^8  d   QhRRRRRR/# )rQ   r   r   rz  r   rS   r#   rT   )rU   s   "rV   rW   r#    s*     
 
 &
  	

 

rX   c               ^    V ! \         \        V4      \        P                  ! VR7      RR7      # )zReturn the target the running interpreter is.

Both sources are injected so a caller can model an interpreter
other than the one running, and so tests do not have to resolve
against whatever machine they happen to be on.
rz  T)r   rx   r   r  )rR  r   r   for_host)clsr   rz  s   &$$rV   r~  ResolveTarget.for_host  s+     &'
3[9	
 	
rX   c               (    V ^8  d   QhRRRRRRRR/# )	rQ   pythonrb   r   r   rz  r   rS   r#   rT   )rU   s   "rV   rW   r#     s2     
 

 &	

  
 

rX   c                  \        V4      p\        V\        V4      4       V ! \        VR,          VR,          4      R\         2,           V\
        P                  ! WR7      R\        \        V4      P                  4      \        8  R7      # )a  Return the host with its interpreter moved to ``python``.

The machine stays the host: its markers and platform tags carry
over, and only the python axis (``python_version``,
``python_full_version``, and the tags' interpreter/abi) moves.
This is what pip's ``--python-version`` targets.

A bare minor ("3.10") resolves as a micro interval off its ``.0``
floor; a named patch level ("3.10.5", "3.13.0") is one concrete
micro resolved whole, so an ``X.Y.0`` pin is not the synthetic floor.
r   rB   -r}  F)r   rx   r   r  r!  )r   r  r  _python_labelrR  r   for_host_pythonr  r   r   r   )r  r  r   rz  r^  s   &&$$ rV   r  ResolveTarget.for_host_python  s~    & z*!#'>v'FG$4 5s;P7QR&'()''Hwv667;UU
 	
rX   r[   r?   rl   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )rQ   r   rb   rB  r   r[   rl   
str | Noner  r   rS   r#   rT   )rU   s   "rV   rW   r#    sH     
 
 
 	

 
 (
 #
 

rX   c          
         V ! \        W4      RVP                   2,           \        WW44      \        P                  ! VVVR7      RVVVRJR7      # )a  Return a target declared as (python, platform, implementation).

A bare minor resolves as a micro interval: its ``python_full_version``
floor is ``{minor}.0`` and a consulted ``python_full_version`` marker
splits it at the boundary it names.  Passing ``python_full_version``
pins the target to one concrete deployment micro and resolves it whole,
the manual single-point alternative to splitting.
r  )r   rB  r[   FN)r   rx   r   r  r  r  r!  )r  r   declared_environmentr   for_spec)r  r   rB  r[   rl   r  s   &$$$$$rV   for_declaredResolveTarget.for_declared  s`    $ ?Adjj\BRR+n --
  !5.d:
 	
rX   rT   )*r   r   r   r   r   __annotations__r   rx   r   r  r  r  r  r   r!  rz   r(  propertyr   rl   r6  r   r?  rF  r[   rN  rS  rW  ru   r_  re  ro  rt  r   classmethodr   ptagssys_tagsr~  r  r  r   rT   rX   rV   r#   r#     s/   8 J$)%$8J!8'D&'.M4.-/I*/).tU)KM&K!&ue!D$De<M4<
 !>ND> &+2u%EM?E+  1 1 6 6 	G 	G F F, V V+ 6 6 / / . .< M M  *  ""
H
*
0 
 )<
 #(..	
 
& 
 )<	

 #(..
 
: 

 (
 +/
 &+
 
rX   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
rQ   r   rb   rB  r   r[   rl   r  rS   rI   rT   )rU   s   "rV   rW   rW   @  s:      
  $	
 rX   c                    T;'       g    V  R2p/ \         VP                  ,          C\        V,          CRV RVRVRVP                  RVP                  /C# )a  Build a complete PEP 508 marker environment for a declared target.

Combines the platform's OS/arch markers and the implementation's
interpreter-identity markers with the python-axis values derived from
``python_version``.  ``platform_release`` and ``platform_version``
come from the :class:`~nab_python.tags.PlatformSpec`; both default to
``""`` so kernel-conditioned markers evaluate False unless the user
declares a target kernel or OS version.

``implementation_version`` is set to the Python version for every
implementation; for non-CPython this is the interpreter's Python
level, not its own release (PyPy 7.3.x), so the rare
``implementation_version`` marker on PyPy may misevaluate during the
resolve.  The lock does not carry the synthetic value: see
:func:`unboundable_variables`.
r   r   rl   rZ   rL   rM   )r   rS  r   rL   rM   )r   rB  r[   rl   r
  s   &&&& rV   r  r  @  so    , 77^$4B"7D
4++
,
 
0 	.t $D11D11 rX   c                  f    ] tR tRt$ RtR]R&   R]R&   RtR]R&   R	tR
]R&   RtR]R&   R R lt	Rt
R	# )r!   ib  a  The declared set of targets a resolve covers.

Expands a python range, a platform list, and an implementation list
into a finite list of :class:`ResolveTarget`.  Every PEP 508 variable
any marker on the dep graph names has a value in every target;
``Requires-Python`` filtering happens elsewhere.

``python_order``: ``"asc"`` (default, oldest first) or ``"desc"``.
Combined with cross-target alignment in the resolver this selects
between ``fork-strategy=fewest`` (asc: the oldest-Python pin
propagates forward, so the lowest common version wins) and
``fork-strategy=requires-python`` (desc: the newest-Python pin
propagates, so older Pythons diverge only when the new version is
incompatible).

``python_patches``: optional ``{minor: full_version}`` mapping that pins a
matrix minor to one concrete deployment micro and resolves it whole,
instead of as a micro interval split at each consulted boundary.  Use it to
resolve a minor as the single patch release you deploy.  Example:
``python_patches={"3.11": "3.11.4", "3.12": "3.12.1"}``.

``implementations``: the interpreter implementations to model
(``"cpython"``, ``"pypy"``).  Each multiplies the target count;
markers and wheel tags resolve per implementation.
rb   r  ztuple[PlatformSpec, ...]	platformsascpython_orderNzdict[str, str] | Nonepython_patchesrE   implementationsc                   V ^8  d   QhRR/# )rQ   rS   r   rT   )rU   s   "rV   rW   Matrix.__annotate__  s     ?
 ?
+ ?
rX   c                   V P                   R
9  d   RV P                   : 2p\        V4      hV P                   Uu. uF&  pVP                  \        9  g   K  VP                  NK(  	  ppV'       d   RV: 2p\        V4      hV P
                   Uu. uF  qD\        9  g   K  VNK  	  ppV'       d   RV: 2p\        V4      hV P                  ;'       g    / pV Uu. uF  qw\        9  g   K  VNK  	  ppV'       d   RV: R2p\        V4      h\        V P                  V P
                  \        \        V P                  4      4      R7       \        \        V P                  4      4      p	V	'       g   RV P                  : 2p\        V4      hV P                   R8X  d   V	P                  4        \        V P
                  4      ^8  p
V	 UUUu. uFR  pV P                   F?  pV P
                   F,  p\         P#                  VVVVP%                  V4      V
R	7      NK.  	  KA  	  KT  	  uppp# u upi u upi u upi u upppi )aL  Expand the matrix into concrete targets.

Validates inputs eagerly: unknown platform ids, unknown
implementations, ``python_patches`` keys that are not known
minors, an empty python range, an invalid ``python_order``, or a
free-threaded platform no interpreter build can satisfy each raise a
``ValueError`` before any work happens.
descz*python_order must be 'asc' or 'desc'; got zUnknown platform ids: zUnknown implementations: zUnknown python_patches minors: z&; keys must be major.minor like '3.11')r  r  python_versionszNo known Python versions match )r   rB  r[   rl   r  >   r  r  )r  r%  r  rS  r   r  r   r  r   check_free_threadedr   _pythons_in_ranger  rt   reverser  r#   r  r   )r&  r  sunknowniunknown_implpatchesmunknown_patchespy_versions
multi_implrG   rB  impls   &             rV   expandMatrix.expand  s9    O3>t?P?P>STCS/! ^^
#}}$44 AMM# 	 

 *7+6CS/! ++
+!8N/NAA+ 	 
 -l-=>CS/!%%++&-Ng:M1M11gN1/1D E8 8  S/!nn 00!"3DKK"@A	
 ,T[[9:3DKK?CCS/!&!--.2
 "
 ",, &&!#$+KKO%/ '  - ' "
 	
O

 O,
s*   H*H*H/!H/H4-H4AH9rT   )r?   )r   r   r   r   r   r  r  r  r  r  r   rT   rX   rV   r!   r!   b  s=    4 K''L#,0N)0'3O_3?
 ?
rX   c               (    V ^8  d   QhRRRRRRRR/# )rQ   r  zSequence[PlatformSpec]r  zSequence[str]r  rS   r  rT   )rU   s   "rV   rW   rW     s2      % # #	
 
rX   c                   \         ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       g   R# V Uu. uF  q3R8w  g   K  VNK  	  ppV'       d   RV: R2p\        V4      hRP                  R	 \         4       4      pV Uu. uF  p\	        V4      '       d   K  VNK  	  ppV'       d   R
V RV: 2p\        V4      hR# u upi u upi )aV  Reject a free-threaded platform no interpreter build can satisfy.

The ``cpXYt`` ABI ships only from CPython 3.13, and the rule needs all
three axes: the platform carries the flag, and only the declaration
around it knows the implementation and the python versions.  Both
declaring surfaces (the matrix and the single environment) call this.
c              3  8   "   T F  qP                   x  K  	  R # 5ir   )free_threaded)rm   rB  s   & rV   ro   &check_free_threaded.<locals>.<genexpr>  s     8id!!ir  TFNr?   z,a free-threaded platform needs CPython, not z(; only CPython has a free-threaded buildr   c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   r   )rm   ps   & rV   ro   r    s     >%=SVV%=r  z'a free-threaded platform needs CPython z or newer, not )rm  r%  r{   r   r   )	r  r  r  r  foreignr  r   rG   too_olds	   $$$      rV   r  r    s     38i83338i888)</Q)^qq/G<:7+ F6 7 	 oHH>%=>>E+OOb3J23NrrOGO5eWOG;W 	 o	  = Ps   CCC(Cc                    V ^8  d   QhRRRR/# )rQ   rB  rb   rS   zIterable[str]rT   )rU   s   "rV   rW   rW     s     
 
C 
M 
rX   c              #  p   "   \        V 4      p\         F  p\        V R24      V9   g   K  Vx  K  	  R# 5i)zuYield the known Python minors that satisfy ``spec``.

``spec`` is a PEP 440 specifier set, e.g. ``">=3.11, <3.14"``.
r   N)r   r   r   )rB  r   r	  s   &  rV   r  r    s5     
 $F$ eWB< F*K	 %s   %6
6c               $    V ^8  d   QhRRRRRR/# )rQ   r   rb   r[   rS   rT   )rU   s   "rV   rW   rW     s!     4 4# 4s 4s 4rX   c                f    \         P                  V\        4      pW P                  RR4      ,           # )zDRender the interpreter half of a label, e.g. ``py311`` or ``pp311``.r   r  )rJ   r   _DEFAULT_IMPLEMENTATION_PREFIXr	   )r   r[   prefixs   && rV   r  r    s+    #''8VWF**3333rX   c                    V ^8  d   QhRRRR/# rQ   r  r  rS   rb   rT   )rU   s   "rV   rW   rW     s     J J: Js JrX   c                D    RP                  R \        V 4       4       4      # )z@Render a conflict-fork selection as a slug, empty when unforked.r   c              3  4   "   T F  w  rV R V 2x  K  	  R# 5i)r  NrT   )rm   rc  r   s   &  rV   ro   "_selection_slug.<locals>.<genexpr>  s     I7HtfAdV$7Hs   )r{   rr   )r  s   &rV   rM  rM    s    88Ivi7HIIIrX   c                    V ^8  d   QhRRRR/# r  rT   )rU   s   "rV   rW   rW     s     & &!< & &rX   c                6    \        V 4      pV'       d   RV 2# R# )zHRender a conflict-fork selection as a label suffix, empty when unforked.r  r  )rM  )r  slugs   & rV   rs  rs    s    9%DQtf:%2%rX   )r   r   r   r   r    r   r!   r"   r#   r   r  r  r  r   r   r   rd   r   r  r   r]   )rB   r+   r)   r@   r'   r   r%   )z3.8z3.9z3.10z3.11z3.12z3.13z3.14z3.15>   r+   r%   r   r'   r)   rL   rM   rB   rl   rZ   r@   )r   r%   r)   )rl   rZ   >   in===not in>   r   r   r   r   ~=r   )]__conditional_annotations__r   
__future__r   recollections.abcr   r   r   r   dataclassesr   r   r	   typingr
   _conflict_kindr   r   r   _vendor.packagingr   r  _vendor.packaging.markersr   r   _vendor.packaging.markersetsr   _vendor.packaging.specifiersr   r   _vendor.packaging.versionr   r   r   r   r   r   _vendor.packaging.rangesr   r   __all__rb   objectr   r   r  r   rF   rJ   r  rR  r   r   r   r   r   r    r]   r^   rw   _MARKER_OPERANDcompiler   rd   r   r   r   r   r   r   r   r%  r"   r   r   r   r   r   r   r   r   r   r  r  r#   r  r!   r  r  r  rM  rs  )r  s   @rV   <module>r     s  & # 	 A A 1 1   
 - B 8 H >  6 8 Rf!556  7H7	 7I7	 8G7	 8H7	 9G4	 9G4	 7F7	 7H7	W1/ + 1l ()y (&v	5 1 	& ?  +4T64)H  H!%      
	( _ 	 +4+  * 09+,0 n 
E$% /  C ?JJ  ! # A.2!j!&* $$;<  ""?@  3Yu5EE  $$$$& N Z  !H
+
.*Z'T'"V %8	YB:< $y
 y
 y
xD `
 `
 `
FB
4J
&rX   