+
    2j              
         R t ^ RIHt ^ RIt^ RIHtHt ^ RIHt ^ RI	H
t
Ht ^ RIHt ^ RIHtHtHt ^RIHt ^R	IHt ^R
IHt ^RIHt ^RIHt ^RIHt ^RIHtH t H!t!H"t"H#t# ^RI$H%t%H&t&H't'H(t( ^RI)H*t* ]'       d3   ^ RI+H,t, ^RI-H.t. ^RI/H0t0 ^RIH1t1 ^RI2H3t3 ^RI4H5t5H6t6 ^RI)H7t7 ^RI8H9t9 ]:];]<]3,          ];]<];]<]3,          3,          ];]<R,          ]=]:]<]>]<,          ]<3,          ,          3,          3,          t?]P                  ! ]A4      tBRtCR R ltDR R ltER R ltFR  R! ltGR" R# ltHR$ R% ltIR& R' ltJR( R) ltKRjR* R+ lltLRjR, R- lltMR. R/ ltNR0 R1 ltOR2 R3 ltPR4 R5 ltQR6 R7 ltRR8 R9 ltSR: R; ltTR< R= ltUR> R? ltVR@ RA ltWRB RC ltXRDRE/RF RG lltYRH RI ltZRJ RK lt[RL RM lt\RN RO lt]RP RQ lt^RR RS lt_RT RU lt`RV RW ltaRX RY ltbRZ R[ ltcR\ R] ltdR^ R_ lteR` Ra ltfRb Rc ltgRd Re lthRf Rg ltiRh Ri ltjR# )kaJ  Metadata fetching, parsing, and dep classification for the provider.

Owns the bulk of ``get_dependencies``'s implementation: fetching
wheel METADATA / sdist PKG-INFO via the coordinator, parsing it
into a :class:`~nab_python.metadata.WheelMetadata`, and classifying
each ``Requires-Dist`` entry into base deps vs per-extra deps.
)annotationsN)TYPE_CHECKING	TypeGuard)urlsplit)	SdistFile	WheelFile)RangeOutcome)UnreadableLocalIndexErrorUnsupportedWheelErrorread_wheel_metadata)EMPTY_MEMBERSHIP_SETS)admit_vcs_url)VersionRange)SpecifierSet)canonicalize_name)InvalidVersion)DEPENDENCY_FIELDSWheelMetadataintern_versionmetadata_deps_are_staticparse_metadata)InvalidProjectRequirementErrorparse_project_requirementparse_requirementsrequire_string_list)python_axis_accepts)Sequence)Marker)Requirement)Version)InMemoryIndex)DistFileProvider)TagSet)ResolveTargetz=offline mode skipped a metadata fetch with no cached metadatac          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )   providerr"   versionslist[tuple[Version, DistFile]]packagestrversionr   returnztuple[str, bool] )formats   "q/home/user/billing-ledger-validation/.venv/lib/python3.14/site-packages/nab_python/_provider/metadata_resolver.py__annotate__r1   B   sA     L LL,L L 	L
 L    c           
        ^RI Hp V P                  V4      w   rV\        V4      pV P                  P
                  p\        WV P                  V P                  4      p	\        V	\        4      '       d"   V	P                  ;'       g    V	P                  p
MRp
VP                  WgV
4      w  rVe   W3# V	f   RV RV R2pV! V4      h\        W	Wg4      w  rpVf5   \        V	4      '       d$   \!        WWyP                  V	P"                  4      w  rVe   W3# \%        W4      pVe   \'        WVV4      w  rVe   W3# \)        V VVVVV
VR7      h)a^  Get metadata text and whether it came from an sdist.

Returns ``(metadata_text, from_sdist)``. ``from_sdist`` is
``True`` when the text was extracted from a source-distribution
``PKG-INFO`` rather than a wheel ``METADATA``: needed because
only sdist values are subject to the :pep:`643` Dynamic
guarantees and may need a ``pyproject.toml`` fallback.
MetadataErrorNzVersion z of z not found in listing)sdistmetadata_urlunreadable_wheel)r'   r5   split_and_normalizer+   coordinatorindexpick_dist_for_metadata
wheel_tagstarget
isinstancer   r7   urlget_metadata_with_origin_read_direct_wheel_metadata_is_bare_remote_wheel_read_range_metadatahashes
find_sdistfetch_sdist_metadata_ladder_failure)r'   r(   r*   r,   r5   _
normalizedver_strr;   distr7   text
from_sdistmsgmetadata_textr8   r6   s   &&&&             r0   resolve_metadatarQ   B   ss    )33G<Aq'lG  &&E
 "8..D
 $	""((44DHH55j<XD!!|	gY.CDC  2M
3/M/ !6t!<!<$8'88T[[%
!  **x)E$8'5%
!  **
!) r2   c               8    V ^8  d   QhRRRRRRRRRR	R
RRRRR/# )r&   r'   r"   r*   r+   rJ   r,   r   r6   SdistFile | Noner7   
str | Noner8   z UnreadableLocalIndexError | Noner-   	Exceptionr.   )r/   s   "r0   r1   r1      sX     - --- - 	- - - 7- -r2   c               8   ^RI Hp Ve   V# V P                  P                  p\	        V4      p	Ve   VP
                  MTp
VP                  W)V
4      '       d   \        p\        WW4       MVe   RpM\        WV4      '       d   RpMRpRV RV RV 2pV! V4      # )a;  Return the error for a version no rung of the ladder could answer.

An unreadable local wheel takes precedence, and is deliberately not a
:class:`~nab_python.provider.MetadataError`: look-ahead treats those as a
rejection, so the version would be dropped and an older release pinned
instead of the resolve failing.
r4   z:no PEP 658 metadata and the sdist has no readable PKG-INFOz^no PEP 658 metadata and the sdist was filtered by requires-python, dist-policy, or upload-timez*no PEP 658 metadata and no sdist availablezNo metadata for ==z: )
r'   r5   r:   r;   r+   r@   is_offline_metadata_miss_OFFLINE_METADATA_MISS_report_offline_skip_index_published_sdist)r'   r*   rJ   r,   r6   r7   r8   r5   r;   rK   last_urlreasonrO   s   &&&&$$$      r0   rH   rH      s    $ )#  &&E'lG "-uyy<H%%j8DD'UA		M	7	;	;< 	
 >WIRy6(
;Cr2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r;   r    rJ   r+   r,   r   r-   boolr.   )r/   s   "r0   r1   r1      s,      &)4;	r2   c                    V P                  V4      ;'       g    R F9  p\        V\        4      '       g   K   \        VP                  4      V8X  d    R# K;  	  R#   \
         d     KM  i ; i)zWhether the index served an sdist for ``version``.

The ladder only sees the post-filter listing, where an sdist the filter
dropped and one that was never published both read as absent.
TFr.   )get_listingr?   r   r   r,   r   )r;   rJ   r,   rL   s   &&& r0   r[   r[      sk     !!*-333$	**	dll+w6 7	 4   		s   AA*)A*c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r&   r;   r    rJ   r+   r*   r,   r   r-   Noner.   )r/   s   "r0   r1   r1      s;     Q QQ&)Q47QBIQ	Qr2   c                    V P                  V4      '       d   \        P                  RV\        4       \        P	                  RW#\        4       R# )a  Report a release skipped for want of cached metadata.

The resolver drops the version and can still succeed on an older one, so
the drop has to be visible.  A cold cache drops as many releases as the
listing holds, hence one warning per package and an info line per release.
zSkipping releases of %s: %szSkipping %s==%s: %sN)claim_offline_metadata_warningloggerwarningrY   info)r;   rJ   r*   r,   s   &&&&r0   rZ   rZ      s9     ++J774g?UV
KK%w9OPr2   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r&   r'   r"   rL   DistFile | Noner*   r+   r,   r-   z9tuple[str | None, bool, UnreadableLocalIndexError | None]r.   )r/   s   "r0   r1   r1      s4         - 8; FI > r2   c                   V P                   P                  p\        V\        4      '       dw   VP                  ;peg   V P                   P                  W#WQP                  4      pVP                  4        VP                  W#V4      pVe   VhVP                  W#V4      w  rWR3# \        V\        4      '       d(   VP                  e    \        VP                  4      RR3# R#   \         d    Ru # \         d   p
RRT
3u Rp
?
# Rp
?
ii ; i)a  Rungs 2 and 3: a PEP 658 sidecar read, then a local wheel read.

Returns ``(metadata_text, from_sdist, unreadable)``; ``from_sdist`` is
always ``False`` since both sources are wheel METADATA.  A recorded sidecar
integrity error is re-raised and fails the resolve; a contradictory local
``.dist-info`` reads back as ``None`` and the ladder steps on.  A wheel
that cannot be opened comes back as ``unreadable`` rather than raising, so
the version's own sdist still gets a turn; the caller raises it when no
later rung answers.
NF)NFN)r:   r;   r?   r   r7   request_metadatametadata_hashwaitget_metadata_errorrA   
local_pathr   r
   r	   )r'   rL   r*   r,   r;   r@   eventintegrity_errorrM   rN   excs   &&&&       r0   rB   rB      s      &&E$	""t/@/@(@'M$$55c#5#5
 	

227SI&!! 99'CP%%$	""t'B	$&t7DD  % 	%$$( 	$##	$s*   C" "D
1D
:D
;D?D
D
c                    V ^8  d   QhRRRR/# )r&   rL   rj   r-   zTypeGuard[WheelFile]r.   )r/   s   "r0   r1   r1     s       4H r2   c                    \        V \        4      ;'       dO    V P                  RJ ;'       d9    V P                  RJ ;'       d#    \	        V P
                  4      P                  R9   # )zWhether ``dist`` is a sidecar-less remote wheel eligible for rung 4.

A bare wheel has no PEP 658 sidecar (``metadata_url`` is ``None``) and no
local path, and is served over ``http``/``https`` so its bytes can be read
with ranged requests.
N)httphttps)r?   r   r7   rp   r   r@   scheme)rL   s   &r0   rC   rC     se     	4# 	; 	;%	; 	;OOt#	; 	; TXX%%)::	r2   c               0    V ^8  d   QhRRRRRRRRRRR	R
/# )r&   r'   r"   r*   r+   r,   	wheel_urlwheel_hashesztuple[tuple[str, str], ...]r-   tuple[str | None, bool]r.   )r/   s   "r0   r1   r1     sL     G GGG G 	G
 .G Gr2   c                    V P                   P                  WW44      pVP                  4        V P                   P                  pVP	                  WV4      pVe   Vh\        WW#4       VP                  WV4      # )a  Run rung 4 for one bare wheel and return ``(metadata_text, from_sdist)``.

Blocks on the coordinator's range read, re-raises a recorded metadata
error (a malformed-UTF-8 blob, an unserveable wheel URL, a full-body wheel
failing its published hash) so the resolve fails, and otherwise records the
outcome counter and reads the wheel's slot.  ``wheel_hashes`` are the
wheel's published digests, verified against a full-body read.  ``from_sdist``
is ``False``: recovered wheel METADATA is authoritative.
)r:   request_range_metadatarn   r;   ro   _record_range_outcomerA   )r'   r*   r,   rz   r{   rq   r;   rr   s   &&&&&   r0   rD   rD     sv        77)E 
JJL  &&E..wKO"(W@))'IFFr2   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r&   r'   r"   r*   r+   r,   rz   r-   rc   r.   )r/   s   "r0   r1   r1   0  s4     9 99!$9/29?B9	9r2   c                   V P                   P                  P                  WV4      pVf   R# V\        P                  J d&   V P
                  ;P                  ^,          un        R# V\        P                  J d&   V P
                  ;P                  ^,          un        R# V\        P                  J d&   V P
                  ;P                  ^,          un
        R# V P
                  ;P                  ^,          un        R# )a  Bump the :class:`ProviderStats` counter for a range read's outcome.

The mechanical outcome is discovered in nab-index and recorded on the
index; the provider owns tier accounting.  A read that recorded no outcome
(a refused or offline-missed request) leaves every counter untouched.
N)r:   r;   get_range_outcomer   PARTIALstatswheel_metadata_range_fetched	FULL_BODYwheel_metadata_range_full_bodyUNSUPPORTED wheel_metadata_range_unsupportedwheel_metadata_range_missing)r'   r*   r,   rz   outcomes   &&&& r0   r   r   0  s     ""((::7YWG,&&&33q83	L**	*55:5	L,,	,771<733q83r2   c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r&   r(   "Sequence[tuple[Version, DistFile]]r,   r   tagsTagSet | Noner>   ResolveTarget | Noner-   rj   r.   )r/   s   "r0   r1   r1   F  s:     = =0== = !	=
 =r2   c                t    V  UUu. uF  w  rEWA8X  g   K  VNK  	  pppV'       d   \        WbV4      # R# u uppi )zLPick the dist whose metadata answers for ``version``. See :func:`pick_dist`.N)	pick_dist)r(   r,   r   r>   vddistss   &&&&   r0   r<   r<   F  s9     $4841q|QQ8E4-29U&)<< 5s   
44c               (    V ^8  d   QhRRRRRRRR/# )	r&   r   zSequence[DistFile]r   r   r>   r   r-   r!   r.   )r/   s   "r0   r1   r1   Q  s6     (O (O(O
(O !(O 	(Or2   c                X   \        V 4      ^8X  d
   V ^ ,          # V  Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV'       g
   V ^ ,          # Vf   \        W$4      pRpMVP	                  \        VR R7      4      pT;'       g    \        R V 4       V^ ,          4      # u upi )at  Pick the dist of one version whose metadata answers for the target.

``dists`` are the artifacts of a single version, and must be non-empty.

Sibling wheels of one version can declare different dependencies, so
the wheel the ``tags`` rank most specific wins: :pep:`425` is what an
installer picks by, so that wheel's METADATA is the one the pin has to
satisfy.  ``tags`` is ``None`` when there is no tag axis to rank by,
either because nothing said which machine the resolve is for or because
a marker overlay moved the target off its tags.  ``target`` still names
the Python, so wheels built for another interpreter drop out
(:func:`_python_axis_narrowed`): reading a release's dependencies out of a
wheel the target could never install is the unsoundness
:func:`check_sibling_metadata_divergence` guards against, one layer
earlier.

Among the wheels that remain the cheapest metadata source wins: a wheel
with a :pep:`658` ``metadata_url``, then any wheel.  Only a version
publishing no wheel is read from its sdist, which lets
:attr:`~nab_python.provider.DistPolicy.SDIST_INSTALL` keep wheels in the
listing purely as a metadata source.
Nc                $    V P                   '       * # Nhas_metadata)ws   &r0   <lambda>pick_dist.<locals>.<lambda>x  s    q~~;Mr2   )keyc              3  L   "   T F  qP                   '       g   K  Vx  K  	  R # 5ir   r   ).0r   s   & r0   	<genexpr>pick_dist.<locals>.<genexpr>y  s     BA>>aas   $
$)lenr?   r   _python_axis_narrowedpicksortednext)r   r   r>   r   wheels	installeds   &&&   r0   r   r   Q  s    6 5zQQx;A*Q	":aaF;Qx|&v6	 IIfV1MNO	NNBBF1INN <s
   B'B'c               $    V ^8  d   QhRRRRRR/# )r&   metadatar   trust_unverifiedr_   r-   r.   )r/   s   "r0   r1   r1   |  s$     2 22262	2r2   c               r    V'       d!   \        \        V P                  ,          4      # \        V 4      '       * # )a}  Whether an sdist's PKG-INFO deps must route through the dynamic path.

By default deps are trusted only when :pep:`643` static
(Metadata-Version 2.2+, no Dynamic dependency field), so a pre-2.2
PKG-INFO routes through the dynamic path. With ``trust_unverified``
set (the opt-out) a pre-2.2 PKG-INFO is trusted, so only an explicit
Dynamic dependency field forces the dynamic path.
)r_   r   dynamicr   )r   r   s   &$r0   _sdist_deps_need_dynamicr   |  s,     %(8(8899'111r2   c               (    V ^8  d   QhRRRRRRRR/# r&   r'   r"   	cache_keytuple[str, Version]r   r   r-   r.   )r/   s   "r0   r1   r1     s0     4% 4%4%"4% 4% 	4%r2   c                <   ^RI HpHp ^RIHp Vw  rg\        V4      p\        V4      p	V P                  P                  p
V
P                  W4      pVe   V# \        WWr4      pVe   V
P                  WV4       V# V P                  WV P                  V4      4      pWP                  J d   V! WV4      pV
P                  WV4       V# V P                  ;P                   ^,          un        V RV RVP                  P"                   RVP"                   R2pV! V4      h)a  Reconcile a dynamic-deps sdist.

First the bundled ``pyproject.toml`` is consulted; when its
``[project]`` table statically declares ``dependencies`` and
``optional-dependencies``, those replace the dynamic PKG-INFO
values.  When that fallback yields nothing and the effective
:class:`~nab_python.provider.BuildPolicy` is
:attr:`~nab_python.provider.BuildPolicy.BUILD_REMOTE`, the sdist is
fetched, extracted, and handed to a PEP 517 backend by
:func:`nab_python._provider.build_remote.build_remote_sdist`.  Any
other effective policy raises
:class:`~nab_python.provider.UnsupportedSdistError`; the resolver
skips the version via
:func:`nab_python._provider.lookahead.look_ahead_ok` and surfaces the
accumulated reasons if no candidate ultimately works.
)BuildPolicyUnsupportedSdistError)build_remote_sdistrW   zg sdist has dynamic dependencies and no static pyproject.toml fallback; building requires build-policy 'z' but the effective policy is '')r'   r   r   build_remoter   r   r+   r:   r;   get_resolved_sdist_metadataaugment_from_pyprojectstore_resolved_sdist_metadataeffective_build_policyserving_indexBUILD_REMOTEr   excluded_by_build_policyvalue)r'   r   r   r   r   r   r*   r,   	canonicalversion_strr;   cached	augmented	effectivebuiltrO   s   &&&             r0   resolve_dynamic_sdistr     s'   , >0 G!'*Ig,K  &&E..yFF&x'LI++IIN//H229=I ,,,"8g>++IEJNN++q0+)2gY %%++, -__Q	    
$$r2   c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r&   r'   r"   r*   r+   r,   r   r   r   r-   WheelMetadata | Noner.   )r/   s   "r0   r1   r1     s:     1 111 1 	1
 1r2   c           
     H   ^RI Hp ^RI Hp V P                  P                  P                  V\        V4      4      pVe	   V! V4      MRpVf   R# \        VP                  R. 4      R4      pVP                  R/ 4      p	\        V	\        4      '       g   Rp
\        V
4      h\        \        V4      4      p\        W4      pV P                  ;P                   ^,          un        V! VP"                  VP$                  VP&                  VVVP(                  VP*                  R7      # )	aB  Replace dynamic deps with statically-declared pyproject deps.

Returns the augmented metadata, or ``None`` if pyproject.toml
is missing, unparseable, or itself marks deps dynamic via
``[project].dynamic``.

Raises :class:`InvalidProjectRequirementError` when ``dependencies``
or ``optional-dependencies`` is present but structurally wrong (not
an array of strings / not a table), rather than silently dropping the
declared dependencies.  ``get_dependencies`` catches it and rejects the
candidate version.  A well-typed entry that is not valid PEP 508 is
dropped with a warning.
)r   )load_static_projectNdependencies[project].dependencieszoptional-dependenciesz/[project].optional-dependencies must be a tablenamer,   requires_pythonrequires_distprovides_extrametadata_versionr   )r   r   r   r:   r;   get_sdist_pyprojectr+   r   getr?   dictr   listparse_pyproject_depsextend_with_extrasr   sdist_pyproject_fallbacksr   r,   r   r   r   )r'   r*   r,   r   _WheelMetadatar   rM   projectdepsoptionalrO   r   r   s   &&&&         r0   r   r     s    * ;.%%99'3w<PD+/+;!$'GNB')AD {{2B7Hh%%?,S11-d34M'@NNN,,1,]]   00#%!22   r2   c               $    V ^8  d   QhRRRRRR/# )r&   r   list[Requirement]r   r   r-   	list[str]r.   )r/   s   "r0   r1   r1     s"      &7 4 I r2   c                   aa . pVP                  4        FC  w  opRS: 2oVP                  S4       V P                  VV3R l\        VS4       4       4       KE  	  V# )a  Append extras-gated requirements and return Provides-Extra names.

A per-extra value that is not an array of strings, or a per-extra entry
that is not valid PEP 508, raises :class:`InvalidProjectRequirementError`,
so the version is rejected rather than resolved with the entry dropped.
z&[project].optional-dependencies extra c              3  @   <"   T F  p\        VSSR 7      x  K  	  R# 5i))extraN)r   )r   dep_str
extra_namesources   & r0   r   %extend_with_extras.<locals>.<genexpr>  s$      
B &gvZHHBs   )itemsappendextendr   )r   r   r   
extra_depsr   r   s   &&  @@r0   r   r     sd     !#N"*.."2
J9*Hj) 
.z6B
 	
 #3 r2   c                    V ^8  d   QhRRRR/# )r&   r   r   r-   r   r.   )r/   s   "r0   r1   r1   	  s     > >t >(9 >r2   c                    \        V R4      # )a5  Parse a ``project.dependencies`` list, raising on a malformed entry.

Entries are already validated as strings by :func:`require_string_list`;
a string that is not valid PEP 508 raises
:class:`InvalidProjectRequirementError`, so the whole version is rejected
rather than resolved with the dependency dropped.
r   )r   )r   s   &r0   r   r   	  s     d$<==r2   c               $    V ^8  d   QhRRRRRR/# )r&   r(   r)   r,   r   r-   rS   r.   )r/   s   "r0   r1   r1     s&      , r2   c                `    V  F'  w  r#W!8X  g   K  \        V\        4      '       g   K%  Vu # 	  R# )z.Find an sdist for a specific version, or None.N)r?   r   )r(   r,   r   r   s   &&  r0   rF   rF     s+    
 <Jq)44H  r2   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r&   r'   r"   r*   r+   r,   r6   r   r-   r|   r.   )r/   s   "r0   r1   r1     s;     Q QQ!$Q/2Q;DQQr2   c                j   V P                   P                  WVP                  VP                  4      pVP	                  4        V P
                  ;P                  ^,          un        V P                   P                  P                  W4      pVe   VhV P                   P                  P                  W4      # )a  Block until the coordinator returns sdist PKG-INFO text.

Returns ``(metadata_text, from_sdist)``: the origin comes back with the
text, so text that landed in the version-level slot from somewhere other
than the sdist is not put through the :pep:`643` gate as if it were the
sdist's own PKG-INFO.

The archive is verified against ``sdist.hashes`` before its PKG-INFO is
read. A hash mismatch is recorded as an integrity error and re-raised here.
)
r:   request_sdistr@   rE   rn   r   sdist_pkg_info_fetchedr;   ro   rA   )r'   r*   r,   r6   rq   rr   s   &&&&  r0   rG   rG     s       ..%))U\\E 
JJLNN))Q.)**00CCGUO"%%>>wPPr2   c               (    V ^8  d   QhRRRRRRRR/# 	r&   r'   r"   reqr   provided_extrasset[str]r-   zset[str] | Noner.   )r/   s   "r0   r1   r1   7  s0     " ""	" " 	"r2   c                    VP                   pVf   \        4       # \        V4      p\        WV4      '       d   \        4       # R\	        WV4      9  d   R# \        WWB4      pT;'       g    R# )zClassify a requirement by which extras it belongs to.

Returns None if the marker doesn't match the environment.
Returns an empty set if the requirement is a base dep (no extra gating).
Returns a set of normalized extra names if extra-gated.
Nr   )markersetidmarker_matches_basemarker_textmarker_matched_extras)r'   r   r   r   	marker_idmatched_extrass   &&&   r0   classify_requirementr  7  sb     ZZF~u6
I8Y77uk(I>>*8YXN!!T!r2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r'   r"   r   r   r  intr-   r_   r.   )r/   s   "r0   r1   r1   N  s(      ( F s t r2   c                    V P                   P                  V4      pVfM   V P                  P                  V4       VP	                  / V P
                  C\        C4      pW0P                   V&   V# )a  Evaluate ``marker`` against the env without ``extra`` set, cached.

Every dependency marker the resolve reads passes through here, so this
is where it is recorded for the lock's ``environments`` declaration.
Recording on the cache miss keeps each distinct marker once.
)marker_base_cacher   consulted_markersaddevaluateenvironmentr   )r'   r   r  results   &&& r0   r   r   N  sf     ''++I6F~""&&v.!RH$8$8!R<Q!RS06""9-Mr2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r'   r"   r   r   r  r  r-   r+   r.   )r/   s   "r0   r1   r1   ]  s(      ( F s s r2   c                v    V P                   P                  V4      pVf   \        V4      pW0P                   V&   V# )z<Return ``str(marker)``, cached. Walks the AST on big graphs.)marker_text_cacher   r+   )r'   r   r  rM   s   &&& r0   r  r  ]  s9    %%)))4D|6{04""9-Kr2   c          
     ,    V ^8  d   QhRRRRRRRRR	R/# )
r&   r'   r"   r   r   r  r  r   r   r-   r.   )r/   s   "r0   r1   r1   f  s:        	
 r2   c                4   V P                   P                  V4      pVf   / ;q@P                   V&   V P                  p\        4       pV FL  pVP                  V4      pVf   WuR&   VP	                  V4      pWV&   V'       g   K;  VP                  V4       KN  	  V# )z9Return the extras for which the marker evaluates to True.r   )marker_extra_cacher   env_with_extrar   r  r  )	r'   r   r  r   
per_markerenvmatchedr   r  s	   &&&&     r0   r  r  f  s     ,,00;J>@@
00;

!
!CG%

+>%L__S)F%+z"6KK
# & Nr2   rN   Fc          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r&   r'   r"   r   r   rP   r+   rN   r_   r-   rc   r.   )r/   s   "r0   r1   r1   }  s:     7< 7<7<"7< 7<
 7< 
7<r2   c          
        Vw  rE\        V4      pV P                  P                  P                  WFV4      pVf2   \	        V4      pV P                  P                  P                  WFWr4       \        W4       V'       d?   \        VV P                  WEV P                  V4      4      R7      '       d   \        WV4      p\        WV4       \        WV4       R# )a  Parse metadata text and pre-compute per-extra deps.

Evaluates markers once for all extras, then caches the base
deps and a per-extra mapping so that get_extra_dependencies
can do a dict lookup instead of re-iterating requires_dist.

When ``from_sdist`` is set and the PKG-INFO deps are not trusted as
final (not :pep:`643` static, or a Dynamic dependency field under
the dist-policy ``trust-unverified-deps`` opt-out), attempts the
``pyproject.toml`` fallback before raising
:class:`UnsupportedSdistError` under :class:`BuildPolicy.NEVER`.

The parsed :class:`WheelMetadata` is shared via the
:class:`~nab_python.fetch.InMemoryIndex` so that universal-mode
resolves only run :func:`parse_metadata` once per
``(package, version)`` regardless of how many tuples ask for it.  The
cache is keyed on ``metadata_text`` as well, so a tuple holding another
artifact's text for that version parses it itself.
Per-tuple classification (marker evaluation, extras admission)
still runs locally in :func:`cache_deps_from_metadata`.  The
sdist-dynamic-deps reconciliation in
:func:`resolve_dynamic_sdist` returns a new dataclass cached in a
separate coordinator slot, so it too is reused across tuples while
the shared raw parse stays unreconciled.
N)r   )r+   r:   r;   get_parsed_metadatar   store_parsed_metadata_reject_foreign_metadatar   effective_trust_unverifiedr   r   _reject_incompatible_pythoncache_deps_from_metadata)r'   r   rP   rN   r*   r,   r   r   s   &&&$    r0   parse_and_cache_metadatar!  }  s    @ !Gg,K##))==mH !-0""88(	
 Y1.!<<h44W=
  )hGX>X(;r2   c               $    V ^8  d   QhRRRRRR/# )r&   r   r   r   r   r-   r_   r.   )r/   s   "r0   r1   r1     s)     W W"W.;W	Wr2   c                h    V w  r#\        VP                  4      V8H  ;'       d    VP                  V8H  # )zCWhether ``metadata`` claims the release the artifact was served as.)r   r   r,   )r   r   r*   r,   s   &&  r0   _declares_served_releaser$    s3     !GX]]+w6VV8;K;Kw;VVr2   c               $    V ^8  d   QhRRRRRR/# )r&   r   r   r   r   r-   rc   r.   )r/   s   "r0   r1   r1     s$     $ $"$.;$	$r2   c                    ^RI Hp \        W4      '       d   R# V w  r4V RV RVP                   RVP                   RV RV 2pV! V4      h)a  Reject an index candidate whose METADATA declares a different release.

Nothing binds a :pep:`658` sidecar or an artifact's own METADATA fields
to the project and version it was served under.  Checked ahead of the
sdist reconciliation so a contradicting sdist is never built.
)ForeignMetadataErrorN z metadata declares rW   z, not )r'   r'  r$  r   r,   )r   r   r'  r*   r,   rO   s   &&    r0   r  r    sg     0	44 G)1WI MM?"X--.fWIRy	J  s
##r2   c               (    V ^8  d   QhRRRRRRRR/# 	r&   r'   r"   r   r   r   r   r-   rc   r.   )r/   s   "r0   r1   r1     s,     !' !'!'#6!'BO!'	!'r2   c           	     $   ^RI Hp V P                  pVf   R# Vw  rVV P                  WV4      pVe   \	        V4      MVP
                  pVe   VP                  V4      '       d   R# V RV RV RVP                   RVP                   2	p	V! V	4      h)a  Reject an index candidate whose METADATA Requires-Python excludes the target.

The listing gate (:func:`nab_python._provider.listing.excluded_by_python`)
reads the optional Simple-API ``requires-python`` hint, so a version whose
listing omits it reaches here unfiltered.  The wheel's own METADATA (or the
sdist's PKG-INFO) carries the authoritative field; a per-package override
still replaces it, matching the listing gate.  Raised before the deps are
cached so no partial state survives the rejection.
)IncompatiblePythonErrorNr(  z requires Python z	 but the z resolve targets Python )	r'   r,  r>   effective_requires_pythonr   r   admits_requires_pythonlabelpython_full_version)
r'   r   r   r,  r>   r*   r,   override_rpspecrO   s
   &&&       r0   r  r    s     3__F~ G44WFK " 	[!%% 	
 |v44T:: )1WI.tf 5LL>1&2L2L1M	O  "#
&&r2   c               (    V ^8  d   QhRRRRRRRR/# r   r.   )r/   s   "r0   r1   r1     s0     , ,,", , 	,r2   c           
        Vw  r4V P                  W44      w  rVpVf   Vf   Vf   V# Ve   \        V4      MVP                  pVe   \        V4      M\        VP                  4      p	Ve   \        V4      p
MVe   . p
M\        VP
                  4      p
\        VP                  VP                  VV	V
VP                  VP                  R7      # )an  Apply the per-package metadata override, or return ``metadata`` as is.

A fresh record rather than a mutation: the raw parse is shared across
tuples via ``store_parsed_metadata``, so mutating would leak one tuple's
override into another.  A replaced dep list strips extra-gated lines, so an
unset provides-extra declares none rather than keep now-incoherent extras.
r   )effective_metadata_overrider   r   r   r   r   r   r   r,   r   r   )r'   r   r   r*   r,   override_depsr1  override_per   r   r   s   &&&        r0   effective_metadatar8    s     !G.6.R.R/+M !49L " 	[!%%  $ 	]((() 
 k*		"h556]]  '#%!22   r2   c               (    V ^8  d   QhRRRRRRRR/# r*  r.   )r/   s   "r0   r1   r1   )  s6     +B +B+B"+B +B 
	+Br2   c                d   \        WV4      pV^ ,          pW P                  V&   VP                   Uu0 uF  p\        V4      kK  	  pp/ pV Uu/ uF  qD/ bK  	  pp/ pVP                   F  p	\        W	V4      p
V
f   K  V	P                  ea   \        WV
4      '       d   \        W	V	P                  4       M5V
 F/  pVP                  V. 4      P                  WP                  34       K1  	  K  \        WWg4       K  	  W`P                  V&   WpP                  V&   WP                  V&   R# u upi u upi )a  Populate ``deps_cache`` + ``extra_deps_map`` from a parsed metadata.

Shared by the wheel/sdist path (which calls
:func:`parse_and_cache_metadata` after parsing METADATA text), the
local-source path (which already has a :class:`WheelMetadata` from
:func:`nab_python.build_backend.extract_static_metadata`), and the
skip-fetch branch of
:meth:`nab_python.provider.Provider.get_dependencies` (which hands in a
bare :class:`WheelMetadata` for a complete ``dependencies`` override).
N)r8  metadata_cacher   r   r   r  r@   _url_dep_is_activerefuse_url_dep
setdefaultr   add_classified_dep
deps_cacheextra_deps_mapdeferred_url_extras)r'   r   r   r*   er   	base_depsrA  rB  r   
req_extrasr   s   &&&         r0   r   r   )  s6    "(x@H lG)1I&?G?V?V W?V!!21!5?VO W)+I&:&!2  : EG%%)(I
77!(Z@@xcgg6",J'22:rBIIgg #- 3IF & &/	")7I&.A  +- !X:s   D(D-c               (    V ^8  d   QhRRRRRRRR/# )	r&   r'   r"   r*   r+   rE  r   r-   r_   r.   )r/   s   "r0   r1   r1   W  s/     	Q 	Q 	QC 	QX 	QRV 	Qr2   c                   a a V'       g   R# \         ;QJ d     VV 3R lV 4       F  '       g   K   R# 	  R# ! VV 3R lV 4       4      # )zWhether a direct-URL dep must be refused at base-metadata time.

A base dep (no extra gating) is always active. An extra-gated dep is active
only when the user requested one of its extras at the root; otherwise its
refusal defers to the per-extra path.
Tc              3  F   <"   T F  pSV3SP                   9   x  K  	  R # 5ir   )root_extras)r   r   r*   r'   s   & r0   r   %_url_dep_is_active.<locals>.<genexpr>`  s!     PZE8#7#77Zs   !F)any)r'   r*   rE  s   ff&r0   r<  r<  W  s4     3PZP33P3P3PZPPPr2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r'   r"   r   r   r@   r+   r-   rc   r.   )r/   s   "r0   r1   r1   c  s(     # #X #K #c #d #r2   c                f    \        W P                  4       RVP                   RV 2p\        V4      h)zBRefuse a direct-URL requirement, or raise ``NotImplementedError``.zHVCS dependency admitted by policy but resolver path is not implemented: z @ )r   
vcs_configr   NotImplementedError)r'   r   r@   rO   s   &&& r0   r=  r=  c  s;    #**+
#cU	,  c
""r2   c               (    V ^8  d   QhRRRRRRRR/# r   r.   )r/   s   "r0   r1   r1   m  s0      	  	r2   c                   VP                   pVf   \        4       # VP                  / V P                  C\        C4      '       d   \        4       # R\        V4      9  d   R# \        V P                  4      p\        4       pV F1  pWdR&   VP                  V4      '       g   K   VP                  V4       K3  	  T;'       g    R# )a  Classify like :func:`classify_requirement`, recording nothing.

These markers come from wheels :func:`target_dep_signature` parses but
never keeps in ``metadata_cache``.  The id-keyed marker caches would be
unsound here: a collected marker's ``id`` can alias a later live marker.
``consulted_markers`` would leak a never-installed sibling's clauses into
the lock's ``environments``.  So each marker is evaluated directly.
Nr   )	r   r   r  r  r   r+   r   r  r  )r'   r   r   r   r  r  r   s   &&&    r0   _classify_requirement_uncachedrR  m  s     ZZF~uH(..H2GHIIuc&k!
x&&
'CG%
!G??3KK
# & ??dr2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r'   r"   r   r   r   r   r-   TargetDepSignaturer.   )r/   s   "r0   r1   r1     s0     .4 .4.4".4 .4 	.4r2   c                   \        WV4      pVP                   Uu0 uF  p\        V4      kK  	  pp/ pV Uu/ uF  q3/ bK  	  pp/ pVP                   F  p\	        WV4      p	V	f   K  VP
                  eu   \        VP                  4      \        VP                  4      VP
                  3p
T	;'       g    R0 F,  pVP                  V\        4       4      P                  V
4       K.  	  K  \        WWV4       K  	  WVV3# u upi u upi )a   Project ``metadata`` to a target-effective dependency signature.

Returns ``(base_deps, extra_deps_map, url_buckets)``, compared with ``!=``
to tell two wheels of one version apart by the dependencies they impose on
this target rather than by raw text.  Each requirement is classified the way
the resolver classifies deps, so a marker both wheels evaluate the same
folds away, and ranges go through :func:`add_classified_dep`, so ordering,
whitespace, and specifier spelling normalize equal.  It records nothing into
the marker caches or ``consulted_markers``: see
:func:`_classify_requirement_uncached`.

``cache_key`` is the release the wheel was served as, not whatever the
wheel declares for itself.  The per-package override is applied first, so a
``provides-extra`` override is compared in the same view the resolver pins
from.  A complete ``dependencies`` override takes the skip-fetch path in
:meth:`nab_python.provider.Provider.get_dependencies` and never reaches
here.  ``Requires-Python`` is left out: it gates admission, not the
dependency edges a lock records.

Unlike :func:`cache_deps_from_metadata` this never raises: a direct-URL dep
is bucketed instead of routed through :func:`refuse_url_dep`, since the pick
already refused its own URL deps, so a sibling's URL dep is a divergence to
report.
N)r8  r   r   r   rR  r@   r   	frozensetextrasr>  r   r  r?  )r'   r   r   rC  r   rD  rA  url_bucketsr   rE  entryr   s   &&&         r0   target_dep_signaturerZ    s   : "(x@H?G?V?V W?V!!21!5?VO W)+I&:&!2  : KMK%%3H?S
77&sxx0)CJJ2GQE!++dV+&&sCE266u= ,3IF & {33! !X:s
   C=Dc          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r&   r'   r"   r(   r   r*   r+   r,   r   r-   rc   r.   )r/   s   "r0   r1   r1     sA     F2 F2F20F2 F2 	F2
 
F2r2   c                   ^RI Hp V P                  p\        WWPP                  4      p\        V\        4      '       g   R# V P                  V4      w   rx\        V4      p	V P                  P                  p
\        WW4      pVf   R# V UUu. uF'  w  rW8X  g   K  \        V\        4      '       g   K%  VNK)  	  pppVf   \        V P                  V4      p\        V4      ^8:  d   R# Vf   RMVP                  VP                  4      pW3pRpV F  pVVJ g   \!        W_VP                  4      '       g   K'  \#        W
WV4      pVf   K:  Vf   \%        V V\'        V4      4      p\%        V VV4      pVV8X  d   Kj  \)        VV4      pV RV RVP                   RVP                   RRP+                  V4       R2
pV! V4      h	  R# u uppi )	ai  Crash when a resident tie sibling's target deps diverge from the pick's.

nab reads one version's dependencies from the wheel the target's tags rank
most preferred and treats it as authoritative.  Two wheels the target's own
rules cannot rank against each other (a tie) can still declare different
target-effective dependencies, so pinning from one silently disagrees with
an install of the other.

Only siblings already resident in the shared index are compared; this never
fetches.  On the first tie sibling whose projection differs from the pick's,
a :class:`~nab_python.provider.SiblingMetadataDivergenceError` is raised.  It
is deliberately not a :class:`~nab_python.provider.MetadataError`, which
:meth:`~nab_python.provider.Provider._look_ahead_ok` would turn into a
dropped candidate: dropping would silently remove a version an installer can
legitimately install.
)SiblingMetadataDivergenceErrorNr(  z has tie-ranked wheels z and z6 that declare different dependencies for this target (z, zY). Pin the dependencies with a per-package dependencies override to resolve this version.)r'   r]  r=   r<   r>   r?   r   r9   r+   r:   r;   _resident_wheel_textr   r   
wheel_rankfilename_wheels_tie_tie_sibling_metadatarZ  r   _divergent_dep_labelsjoin)r'   r(   r*   r,   r]  r   r   rI   rJ   rK   r;   	pick_textr   r   r   pick_keysig_keypick_sigsiblingsibling_metadatasibling_siglabelsrO   s   &&&&                   r0   !check_sibling_metadata_divergencerm    s   . :D!(T??KDdI&&33G<Aq'lG  &&E$UFI$RHDAaAy9QaaHFR|&x?
6{a|t)GH#G*.Hd?+dg>N>N"O"O0Z'
 #+'>)#<H +8W>NO("&x=iq	!8 H  ! "		&)* +JK 	 -S11-  Ss   
GG4Gc               0    V ^8  d   QhRRRRRRRRR	R
RR/# )r&   r'   r"   r;   r    r*   r+   r,   r   ri  r   r-   r   r.   )r/   s   "r0   r1   r1     sD     ' ''' ' 	'
 ' 'r2   c                V   \        W\        V4      V4      pVf   R#  \        V4      p\	        Y#3T4      '       g   R# T P
                  pT P                  Y#4      pTe   \        T4      MTP                  p	Te   T	e   TP                  T	4      '       g   R# T#   \         d     R# i ; i)a7  Parse a resident tie sibling's own METADATA, or None to skip it.

Skipped when the text is not resident, does not parse, declares a
different release, or its effective Requires-Python excludes the target.
Tags rank by :pep:`425` and say nothing about the Python floor, so a tie
sibling can still declare a Requires-Python an installer would reject for
this target, and a sibling declaring another release is no candidate for
this one at all; comparing either would false-crash a version an installer
resolves fine.  A per-package override wins over the parsed floor.
N)
r^  r+   r   
ValueErrorr$  r>   r-  r   r   r.  )
r'   r;   r*   r,   ri  rM   r   r>   r1  r2  s
   &&&&&     r0   rb  rb    s    "  GgFD|!$' $W$6AA__F44WFK " 	[!%% 	 	--d33O#  s   B B('B(c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r&   r;   r    r*   r+   r,   wheelr   r-   rT   r.   )r/   s   "r0   r1   r1   .  s4     ( ((#&(14(=F((r2   c                    \        V4      '       d   VP                  pMVP                  e   VP                  pMR# V P                  WV4      w  rVV'       d   R# T# )a&  Return a wheel's own resident METADATA text, or None if not in hand.

Reads only the slot the wheel's text would occupy: a bare remote wheel's
own URL (rung 4), else its sidecar URL.  A local wheel keeps no text in the
index and reads back None.  Sdist-origin text never stands in for a wheel.
N)rC   r@   r7   rA   )r;   r*   r,   rr  r@   rM   rN   s   &&&&   r0   r^  r^  .  sT     U##ii				'  55gLD4'4'r2   c               (    V ^8  d   QhRRRRRRRR/# )	r&   r   r   rf  z"tuple[int, tuple[int, str]] | Nonesibling_filenamer+   r-   r_   r.   )r/   s   "r0   r1   r1   A  s0     ? ?
?0? ? 
	?r2   c                P    V f   R# V P                  V4      pVRJ;'       d    W18H  # )a  Whether a sibling wheel ties the pick under the target's install rules.

With no tag axis nothing ranks the wheels that :func:`_python_axis_narrowed`
left standing, so each of them is a real ambiguity.  Otherwise a sibling
ties only when its :meth:`~nab_python.tags.TagSet.wheel_rank` key equals
the pick's and is not None; a sibling the pick ranks strictly below is
never installed and is exempt.
NT)r_  )r   rf  ru  sibling_keys   &&& r0   ra  ra  A  s1     |//"23Kd">>{'>>r2   c               $    V ^8  d   QhRRRRRR/# )r&   r>   r   r   zlist[WheelFile]r-   r.   )r/   s   "r0   r1   r1   T  s$       *9r2   c                    V f   V# V Uu. uF8  p\        V P                  V P                  VP                  4      '       g   K6  VNK:  	  ppT;'       g    T# u upi )a  Keep the wheels the target's Python axis admits, all of them if none.

A marker overlay cannot rebuild the platform tags, but the target still
names a Python: whichever ``python_version`` and ``implementation_name``
the overlay leaves in force.  A wheel built for another interpreter is a
choice no installer on that Python makes, so it neither answers for the
version's dependencies nor ties the wheel that does.  The
``Requires-Python`` guard in :func:`_tie_sibling_metadata` cannot do this
work: a release publishing one wheel per interpreter declares one
``Requires-Python`` spanning them all, so it admits every sibling.

Admitting nothing decides nothing, so every wheel stands: the pick keeps
its listing-order fallback, and the tie set keeps the pick's siblings
rather than disarming the divergence check over a pick this target cannot
install either.  Without a target nothing has said which Python the
resolve is for, so again every wheel stands.
)r   python_versionimplementationr`  )r>   r   rr  admitteds   &&  r0   r   r   T  sf    ( ~ E!!6#8#8%..
 	   vs   3AAc               $    V ^8  d   QhRRRRRR/# )r&   rh  rT  rk  r-   r   r.   )r/   s   "r0   r1   r1   t  s$     
 
 
/A

r2   c                   aa \        V 4      o\        V4      o\        VV3R lSP                  4       SP                  4       ,           4       4      # )z;Return sorted labels for the signature entries that differ.c              3  v   <"   T F.  pSP                  V4      SP                  V4      8w  g   K*  Vx  K0  	  R # 5ir   )r   )r   r/  	pick_flatsibling_flats   & r0   r   (_divergent_dep_labels.<locals>.<genexpr>z  s6      ;E==<#3#3E#:: 	;s   '9
9)_flatten_signaturer   keys)rh  rk  r  r  s   &&@@r0   rc  rc  t  sH     #8,I%k2L ^^%(9(9(;;  r2   c                    V ^8  d   QhRRRR/# )r&   	signaturerT  r-   zdict[str, object]r.   )r/   s   "r0   r1   r1     s      "4 9J r2   c                    V w  rp/ pVP                  4        F  w  rVWdRV 2&   K  	  VP                  4        F  w  rxWRV 2&   K  	  VP                  4        F  w  rWRV	 2&   K  	  V# )zFlatten a target-dep signature to labelled values for a diff.

Base deps, per-extra dep maps, and URL buckets each become one entry.
zbase:zextra:zurl:)r   )r  rD  rA  rX  flatr   rngr   r   r   entriess   &          r0   r  r    s    
 .7*I{ D__&	"uTF^ '%++-!%veW .#))+$tC5\ ,Kr2   c          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r&   r   r   rE  r   rD  zdict[str, VersionRange]rA  z"dict[str, dict[str, VersionRange]]r-   rc   r.   )r/   s   "r0   r1   r1     sA     !W !W	!W!W '!W 7	!W
 
!Wr2   c                   ^RI Hp \        V P                  4      pV P                  '       d   V P                  P                  4       M\        P                  ! RR7      pV P                  pV'       gb   VP                  V\        P                  ! 4       4      V,          W%&   \        V4       F"  p\        P                  ! RR7      W$! WX4      &   K$  	  R# V Fj  p	W9,          p
V
P                  V\        P                  ! 4       4      V,          W&   \        V4       F"  p\        P                  ! RR7      W! WX4      &   K$  	  Kl  	  R# )zAdd a classified requirement to the appropriate dep set.

A name appearing on several ``Requires-Dist`` lines is intersected
into one range.
)
join_extraF)admit_arbitraryN)r'   r  r   r   	specifierto_ranger   fullrW  r   r   )r   rE  rD  rA  r  r   vi
dep_extrasrer   edepss   &&&&       r0   r?  r?    s     &SXX&D
 === 	 u5 
 ::J#--l.?.?.ABRG	$B.:.?.?PU.VIj*+ % %J".E))D,*;*;*=>CEKZ(.:.?.?PU.Vj*+ ) %r2   r   )k__doc__
__future__r   loggingtypingr   r   urllib.parser   nab_index.clientr   r   nab_index.lazy_wheelr   nab_index.local_indexr	   r
   r   _conflict_kindr   _vcs_admissionr   _vendor.packaging.rangesr   _vendor.packaging.specifiersr   _vendor.packaging.utilsr   _vendor.packaging.versionr   r   r   r   r   r   r   requirements_filer   r   r   r   r   r   collections.abcr   _vendor.packaging.markersr   _vendor.packaging.requirementsr   r   fetchr    r'   r!   r"   r#   r>   r$   tupler   r+   r   rV  rT  	getLogger__name__rf   rY   rQ   rH   r[   rZ   rB   rC   rD   r   r<   r   r   r   r   r   r   rF   rG   r  r   r  r  r!  r$  r  r  r8  r   r<  r=  rR  rZ  rm  rb  r^  ra  r   rc  r  r?  r.   r2   r0   <module>r     s   #  + ! 1 -  3 * 3 7 7 6   '(2<3%-&l	d3$%	%&tSsIcNC789	9:<  
		8	$X L^-`&Q FG89,=(OV2 4%n1h$>Q0"..7<
 7<tW$.!'H,^+B\	Q#:.4bF2R'T(&?&@
 !Wr2   