Ë
    z�hØý  ã                  ó`  — U d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl!m#Z# d dl!m$Z$ d dl!m%Z% d dl!m&Z& d dl!m'Z' d dl!m(Z( d dl!m)Z) d d l!m*Z* d d!l!m+Z+ d d"l!m,Z, d d#l!m-Z- d d$l!m.Z. d d%l!m/Z/ d d&l!m0Z0 d d'l!m1Z1 d d(l!m2Z2 d d)l!m3Z3 d d*l!m4Z4 d d+l!m5Z5 d d,l!m6Z6 d d-l!m7Z7 d d.l!m8Z8 d d/l!m9Z9 d d0l!m:Z: d d1l;m<Z< d d2l;m=Z= d d3l;m>Z> e�r·d d4l?m@Z@ d d5lmAZB d dlCZDd dlEZFd d6lGmHZH d d7lGmIZI d d8lGmJZJ d d9lGmKZK d d:lGmLZL d d;lGmMZM d d<lNmOZO d d=lNmPZP d d>lNmQZQ d d?lNmRZR d d@lNmSZS d dAlNmTZT d dBlNmUZU d dClVmWZW d dDlXmYZY d dElXmZZZ d dFl[m\Z\ d dGl[m]Z] d dHl^m_Z_ d dIl^m`Z` d dJlambZb d dKlcmdZd d dLlemfZf d dMlemgZg d dNlemhZh d dOlemiZi d dPlemjZj d dQlemkZk d dRlemlZl d dSlemmZm d dTlemnZn d dUlemoZo d dVlempZp d dWlemqZq d dXlemrZr d dYlemsZs d dZlemtZt d d[lemuZu  ed\ee`e   e_e   ede   f   ¬]«      Zv ed^«      Zw ed_«      Zx ed`«      Zy eda«      Zz edbdc¬]«      Z{ eJdd«      Z| ede«      Z} edf«      Z~ edg«      Z G dh„ die«      Z€ G dj„ dke«      Z� G dl„ dme«      Z‚ G dn„ doe«      Zƒ G dp„ dqe«      Z„ G dr„ dseƒe„e«      Z… G dt„ due‚e…e«      Z† G dv„ dwe«      Z‡ edxdy¬z«      Zˆ ed{dy¬z«      Z‰ ed|du¬]«      ZŠd}Z‹d~eŒd<   d€Z�d~eŒd�<    G d‚„ dƒeeˆ   «      ZŽ G d„„ d…ee‰   «      Z� G d†„ d‡e«      Z� G dˆ„ d‰e«      Z‘e‘�j$                  dŠe‘�j&                  dŠe‘�j(                  d‹e‘�j*                  dŒe‘�j,                  d�e‘�j.                  d�e‘�j0                  dŽe‘�j2                  d�e‘�j4                  d�e‘�j6                  d‘e‘�j8                  d’iZ�d“eŒd”<   	 	 	 	 	 	 dãd•„Zždäd–„ZŸdåd—„Z dæd˜„Z¡dçd™„Z¢dèdš„Z£déd›„Z¤e	 	 	 	 	 	 dêdœ„«       Z¥e	 	 	 	 	 	 dëd�„«       Z¥e	 	 	 	 	 	 dìdž„«       Z¥e	 	 	 	 	 	 dídŸ„«       Z¥e	 	 	 	 	 	 dîd „«       Z¥e	 	 	 	 	 	 dïd¡„«       Z¥e	 	 	 	 	 	 dðd¢„«       Z¥dñd£„Z¥dòd¤„Z¦	 	 	 	 	 	 dód¥„Z§dôd¦„Z¨	 dõdd§œ	 	 	 	 	 	 	 död¨„Z©d÷d©„Zªdødª„Z«	 	 	 	 	 	 dùd«„Z¬	 	 	 	 	 	 	 	 dúd¬„Z­dûd­„Z®düd®„Z¯	 	 	 	 	 	 dýd¯„Z°dýd°„Z±	 	 	 	 	 	 	 	 dþd±„Z²dÿd²„Z³�d d³„Z´	 	 	 	 �dd´„Zµ	 	 	 	 �ddµ„Z¶�dd¶„Z·�dd·„Z¸�dd¸„Z¹	 	 	 	 �dd¹„Zº�ddº„Z»�dd»„Z¼�d	d¼„Z½�d
d½„Z¾	 	 	 	 	 	 	 	 	 	 �dd¾„Z¿d¿dÀdÁœ	 	 	 	 	 �ddÂ„ZÀ	 	 	 	 	 	 �ddÃ„ZÁ�ddÄ„ZÂ�ddÅ„ZÃ�ddÆ„ZÄ	 	 	 	 	 	 �ddÇ„ZÅ	 	 	 	 	 	 	 	 	 	 �ddÈ„ZÆ�ddÉ„ZÇ�ddÊ„ZÈ�ddË„ZÉ�ddÌ„ZÊ	 	 	 	 �ddÍ„ZË	 	 	 	 �ddÎ„ZÌ	 	 	 	 �ddÏ„ZÍ	 	 	 	 �ddÐ„ZÎ	 	 	 	 �ddÑ„ZÏ�ddÒ„ZÐ�ddÓ„ZÑ�ddÔ„ZÒ�ddÕ„ZÓ	 	 	 	 	 	 	 	 �ddÖ„ZÔ�d d×„ZÕ�d!dØ„ZÖer"d dl×Z×e×�j°                  dÙk\  rd dÚlmÙZÙ nd dÚlGmÙZÙ n�d"dÛ„ZÙ G dÜ„ dÝ«      ZÚ�d#dÞ„ZÛ G dß„ dà«      ZÜ	 	 	 	 	 	 �d$dá„ZÝ	 	 	 	 �d%dâ„ZÞy(&  é    )ÚannotationsN)Útimezone)ÚEnum)Úauto©Úwraps)Ú	find_spec)Úgetattr_static)Úgetdoc)Ú	token_hex)ÚTYPE_CHECKING)ÚAny)ÚCallable)Ú	Container)ÚIterable)ÚLiteral)ÚProtocol)ÚSequence)ÚTypeVar)ÚUnion)Úcast)Úoverload)Úwarn)Úget_cudf)Úget_dask)Úget_dask_dataframe)Ú
get_duckdb)Úget_ibis)Ú	get_modin)Ú
get_pandas)Ú
get_polars)Úget_pyarrow)Úget_pyspark)Úget_pyspark_connect)Úget_pyspark_sql)Úget_sqlframe)Úis_cudf_series)Úis_modin_series)Úis_narwhals_series)Úis_narwhals_series_int)Úis_numpy_array_1d)Úis_numpy_array_1d_int)Úis_pandas_dataframe)Úis_pandas_like_dataframe)Úis_pandas_like_series)Úis_pandas_series)Úis_polars_series)Úis_pyarrow_chunked_array)ÚColumnNotFoundError)ÚDuplicateError)ÚInvalidOperationError)Ú
ModuleType)ÚAbstractSet)ÚConcatenate)ÚLiteralString)Ú	ParamSpec)ÚSelf)Ú	TypeAlias)ÚTypeIs)ÚCompliantExpr)ÚCompliantExprT)ÚCompliantFrameT)ÚCompliantSeriesOrNativeExprT_co)ÚCompliantSeriesT)ÚNativeFrameT_co)ÚNativeSeriesT_co)Ú	EvalNames)ÚEagerAllowedImplementation©Ú	Namespace)ÚArrowStreamExportable)ÚIntoArrowTable©Ú	DataFrame©Ú	LazyFrame©ÚDType©ÚSeries)ÚCompliantDataFrame)ÚCompliantLazyFrame)ÚCompliantSeries)ÚDataFrameLike)ÚDTypes)ÚIntoSeriesT)ÚMultiIndexSelector)ÚSingleIndexSelector)ÚSizedMultiIndexSelector)ÚSizeUnit)ÚSupportsNativeNamespace)ÚTimeUnit)Ú_1DArray)Ú_SliceIndex)Ú
_SliceName)Ú
_SliceNoneÚFrameOrSeriesT)ÚboundÚ_TÚ_T1Ú_T2Ú_T3Ú_FnzCallable[..., Any]ÚPÚRÚR1ÚR2c                  ó   — e Zd ZU ded<   y)Ú_SupportsVersionÚstrÚ__version__N©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úL/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/narwhals/utils.pyro   ro   s   s   … ØÔrx   ro   c                  ó   — e Zd Zddd„Zy)Ú_SupportsGetNc                ó   — y ©Nrw   )ÚselfÚinstanceÚowners      ry   Ú__get__z_SupportsGet.__get__w   s   � rx   r}   )r   r   r€   ú
Any | NoneÚreturnr   )rs   rt   ru   r�   rw   rx   ry   r{   r{   v   s   „ ÝQrx   r{   c                  ó   — e Zd ZU ded<   y)Ú_StoresImplementationÚImplementationÚ_implementationNrr   rw   rx   ry   r…   r…   y   s   … Ø'Ó'ØMrx   r…   c                  ó   — e Zd ZU ded<   y)Ú_StoresBackendVersionútuple[int, ...]Ú_backend_versionNrr   rw   rx   ry   r‰   r‰   }   s   … Ø)Ó)Ø1rx   r‰   c                  ó   — e Zd ZU ded<   y)Ú_StoresVersionÚVersionÚ_versionNrr   rw   rx   ry   r�   r�   �   s   … ØÓØ0rx   r�   c                  ó   — e Zd ZdZy)Ú_LimitedContextzRProvides 2 attributes.

        - `_backend_version`
        - `_version`
        N©rs   rt   ru   Ú__doc__rw   rx   ry   r‘   r‘   …   s   „ ò	rx   r‘   c                  ó   — e Zd ZdZy)Ú_FullContextznProvides 3 attributes.

        - `_implementation`
        - `_backend_version`
        - `_version`
        Nr’   rw   rx   ry   r•   r•   Œ   s   „ ò	rx   r•   c                  ó   — e Zd Zedd„«       Zy)Ú_StoresColumnsc                 ó   — y r}   rw   ©r~   s    ry   Úcolumnsz_StoresColumns.columns•   s   € Ø,/rx   N)rƒ   úSequence[str])rs   rt   ru   Úpropertyrš   rw   rx   ry   r—   r—   ”   s   „ Ø	Ú/ó 
Ù/rx   r—   Ú
NativeT_coT)Ú	covariantÚCompliantT_coÚ	_ContextTz&Callable[Concatenate[_ContextT, P], R]r<   Ú_Methodz Callable[Concatenate[_T, P], R2]Ú_Constructorc                  ó"   — e Zd ZdZedd„«       Zy)Ú_StoresNativez’Provides access to a native object.

    Native objects have types like:

    >>> from pandas import Series
    >>> from pyarrow import Table
    c                 ó   — y)zReturn the native object.Nrw   r™   s    ry   Únativez_StoresNative.native©   ó   € ð 	rx   N)rƒ   r�   )rs   rt   ru   r“   rœ   r¦   rw   rx   ry   r¤   r¤       ó   „ ñð òó ñrx   r¤   c                  ó"   — e Zd ZdZedd„«       Zy)Ú_StoresCompliantzÓProvides access to a compliant object.

    Compliant objects have types like:

    >>> from narwhals._pandas_like.series import PandasLikeSeries
    >>> from narwhals._arrow.dataframe import ArrowDataFrame
    c                 ó   — y)zReturn the compliant object.Nrw   r™   s    ry   Ú	compliantz_StoresCompliant.compliant¸   r§   rx   N)rƒ   rŸ   )rs   rt   ru   r“   rœ   r¬   rw   rx   ry   rª   rª   ¯   r¨   rx   rª   c                  óL   — e Zd Z e«       Z e«       Zedd„«       Zedd„«       Zy)rŽ   c                óF   — | t         j                  u rddlm} |S ddlm} |S )Nr   rG   )rŽ   ÚMAINÚnarwhals._namespacerH   Únarwhals.stable.v1._namespace)r~   rH   s     ry   Ú	namespacezVersion.namespaceÂ   s    € à”7—<‘<ÑÝ5àÐÝ;àÐrx   c                óF   — | t         j                  u rddlm} |S ddlm} |S )Nr   )Údtypes)rŽ   r¯   Únarwhalsr´   Únarwhals.stable.v1)r~   r´   Ú	v1_dtypess      ry   r´   zVersion.dtypesÌ   s   € à”7—<‘<ÑÝ'àˆMÝ:àÐrx   N)rƒ   ztype[Namespace[Any]])rƒ   rW   )	rs   rt   ru   r   ÚV1r¯   rœ   r²   r´   rw   rx   ry   rŽ   rŽ   ¾   s6   „ Ù	‹€BÙ‹6€Dàòó ðð òó ñrx   rŽ   c                  ó´  — e Zd ZdZ e«       Z	  e«       Z	  e«       Z	  e«       Z	  e«       Z		  e«       Z
	  e«       Z	  e«       Z	  e«       Z	  e«       Z	  e«       Z	  e«       Z	 e	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 dd„«       Zdd„Zdd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z!dd„Z"e#dd„«       Z$dd„Z%y)r†   z?Implementation of native object (pandas, Polars, PyArrow, ...).c                óV  — t        «       t        j                  t        «       t        j                  t        «       t        j                  t        «       t        j                  t        «       t        j                  t        «       t        j                  t        «       t        j                  t        «       t        j                   t#        «       t        j$                  t'        «       t        j(                  t+        «       t        j,                  i}|j/                  |t        j0                  «      S )z¼Instantiate Implementation object from a native namespace module.

        Arguments:
            native_namespace: Native namespace.

        Returns:
            Implementation.
        )r    r†   ÚPANDASr   ÚMODINr   ÚCUDFr"   ÚPYARROWr%   ÚPYSPARKr!   ÚPOLARSr   ÚDASKr   ÚDUCKDBr   ÚIBISr&   ÚSQLFRAMEr$   ÚPYSPARK_CONNECTÚgetÚUNKNOWN)ÚclsÚnative_namespaceÚmappings      ry   Úfrom_native_namespacez$Implementation.from_native_namespaceô   s·   € ô ‹Lœ.×/Ñ/Ü‹Kœ×-Ñ-Ü‹Jœ×+Ñ+Ü‹Mœ>×1Ñ1ÜÓœ~×5Ñ5Ü‹Lœ.×/Ñ/ÜÓ ¤.×"5Ñ"5Ü‹Lœ.×/Ñ/Ü‹Jœ×+Ñ+Ü‹NœN×3Ñ3ÜÓ!¤>×#AÑ#Að
ˆð �{‰{Ð+¬^×-CÑ-CÓDÐDrx   c                ó’  — t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  dœ}|j                  |t         j                  «      S )zÌInstantiate Implementation object from a native namespace module.

        Arguments:
            backend_name: Name of backend, expressed as string.

        Returns:
            Implementation.
        )ÚpandasÚmodinÚcudfÚpyarrowÚpysparkÚpolarsÚdaskÚduckdbÚibisÚsqlframeÚpyspark_connect)r†   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   )rÈ   Úbackend_namerÊ   s      ry   Úfrom_stringzImplementation.from_string  s‡   € ô %×+Ñ+Ü#×)Ñ)Ü"×'Ñ'Ü%×-Ñ-Ü%×-Ñ-Ü$×+Ñ+Ü"×'Ñ'Ü$×+Ñ+Ü"×'Ñ'Ü&×/Ñ/Ü-×=Ñ=ñ
ˆð �{‰{˜<¬×)?Ñ)?Ó@Ð@rx   c                óŠ   — t        |t        «      r| j                  |«      S t        |t        «      r|S | j	                  |«      S )zÐInstantiate from native namespace module, string, or Implementation.

        Arguments:
            backend: Backend to instantiate Implementation from.

        Returns:
            Implementation.
        )Ú
isinstancerp   rÙ   r†   rË   )rÈ   Úbackends     ry   Úfrom_backendzImplementation.from_backend*  sL   € ô ˜'¤3Ô'ð �O‰O˜GÓ$ð	
ô ˜'¤>Ô2ð ð	
ð
 ×*Ñ*¨7Ó3ð	
rx   c                óL  — | t         j                  u rddl}|S | t         j                  u rddl}|j                  S | t         j
                  u rddl}|S | t         j                  u rddl}|S | t         j                  u rddl
}|j                  S | t         j                  u rddl}|S | t         j                  u rddl}|j                   S | t         j"                  u rddl}|S | t         j&                  u rddl}	|	S | t         j*                  u rddl
}|j                  S d}
t-        |
«      ‚)zyReturn the native namespace module corresponding to Implementation.

        Returns:
            Native module.
        r   NzNot supported Implementation)r†   r»   rÍ   r¼   Úmodin.pandasr½   rÏ   r¾   rÐ   r¿   Úpyspark.sqlÚsqlrÀ   rÒ   rÁ   Údask.dataframeÚ	dataframerÂ   rÔ   rÄ   rÖ   rÅ   ÚAssertionError)r~   ÚpdrÎ   rÏ   ÚparÑ   ÚplrÓ   rÔ   rÖ   Úmsgs              ry   Úto_native_namespacez"Implementation.to_native_namespace>  s  € ð ”>×(Ñ(Ñ(ÛàˆIØ”>×'Ñ'Ñ'Ûà—<‘<ÐØ”>×&Ñ&Ñ&ÛàˆKØ”>×)Ñ)Ñ)Û àˆIØ”>×)Ñ)Ñ)Ûà—;‘;ÐØ”>×(Ñ(Ñ(ÛàˆIØ”>×&Ñ&Ñ&Û!à—>‘>Ð!à”>×(Ñ(Ñ(ÛàˆMà”>×*Ñ*Ñ*ÛàˆOà”>×1Ñ1Ñ1Ûà—;‘;Ðà,ˆÜ˜SÓ!Ð!rx   c                ó&   — | t         j                  u S )a^  Return whether implementation is pandas.

        Returns:
            Boolean.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_pandas()
            True
        )r†   r»   r™   s    ry   Ú	is_pandaszImplementation.is_pandass  ó   € ð ”~×,Ñ,Ð,Ð,rx   c                ód   — | t         j                  t         j                  t         j                  hv S )as  Return whether implementation is pandas, Modin, or cuDF.

        Returns:
            Boolean.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_pandas_like()
            True
        )r†   r»   r¼   r½   r™   s    ry   Úis_pandas_likezImplementation.is_pandas_likeƒ  s1   € ð Ü×!Ñ!Ü× Ñ Ü×Ñð
ð 
ð 	
rx   c                ód   — | t         j                  t         j                  t         j                  hv S )ap  Return whether implementation is pyspark or sqlframe.

        Returns:
            Boolean.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_spark_like()
            False
        )r†   r¿   rÄ   rÅ   r™   s    ry   Úis_spark_likezImplementation.is_spark_like—  s1   € ð Ü×"Ñ"Ü×#Ñ#Ü×*Ñ*ð
ð 
ð 	
rx   c                ó&   — | t         j                  u S )a^  Return whether implementation is Polars.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_polars()
            True
        )r†   rÀ   r™   s    ry   Ú	is_polarszImplementation.is_polars«  rì   rx   c                ó&   — | t         j                  u S )a[  Return whether implementation is cuDF.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_cudf()
            False
        )r†   r½   r™   s    ry   Úis_cudfzImplementation.is_cudf»  ó   € ð ”~×*Ñ*Ð*Ð*rx   c                ó&   — | t         j                  u S )a]  Return whether implementation is Modin.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_modin()
            False
        )r†   r¼   r™   s    ry   Úis_modinzImplementation.is_modinË  s   € ð ”~×+Ñ+Ð+Ð+rx   c                ó&   — | t         j                  u S )aa  Return whether implementation is PySpark.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_pyspark()
            False
        )r†   r¿   r™   s    ry   Ú
is_pysparkzImplementation.is_pysparkÛ  ó   € ð ”~×-Ñ-Ð-Ð-rx   c                ó&   — | t         j                  u S )ai  Return whether implementation is PySpark.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_pyspark_connect()
            False
        )r†   rÅ   r™   s    ry   Úis_pyspark_connectz!Implementation.is_pyspark_connectë  s   € ð ”~×5Ñ5Ð5Ð5rx   c                ó&   — | t         j                  u S )aa  Return whether implementation is PyArrow.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_pyarrow()
            False
        )r†   r¾   r™   s    ry   Ú
is_pyarrowzImplementation.is_pyarrowû  rú   rx   c                ó&   — | t         j                  u S )a[  Return whether implementation is Dask.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_dask()
            False
        )r†   rÁ   r™   s    ry   Úis_daskzImplementation.is_dask  rõ   rx   c                ó&   — | t         j                  u S )a_  Return whether implementation is DuckDB.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_duckdb()
            False
        )r†   rÂ   r™   s    ry   Ú	is_duckdbzImplementation.is_duckdb  rì   rx   c                ó&   — | t         j                  u S )a[  Return whether implementation is Ibis.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_ibis()
            False
        )r†   rÃ   r™   s    ry   Úis_ibiszImplementation.is_ibis+  rõ   rx   c                ó&   — | t         j                  u S )ac  Return whether implementation is SQLFrame.

        Returns:
            Boolean.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.implementation.is_sqlframe()
            False
        )r†   rÄ   r™   s    ry   Úis_sqlframezImplementation.is_sqlframe;  s   € ð ”~×.Ñ.Ð.Ð.rx   c                óp  — t         j                  dt         j                  dt         j                  dt         j                  dt         j
                  dt         j                  dt         j                  dt         j                  dt         j                  d	t         j                  d
t         j                  di}||    S )zHFriendly name for errors.

        Returns:
            String.
        ÚPandasÚPolarsÚDaskÚIbisÚModinÚcuDFÚPyArrowÚPySparkÚDuckDBÚSQLFramezPySpark Connect)r†   r»   rÀ   rÁ   rÃ   r¼   r½   r¾   r¿   rÂ   rÄ   rÅ   )r~   rÊ   s     ry   Ú_aliaszImplementation._aliasK  s‘   € ô ×!Ñ! 8Ü×!Ñ! 8Ü×Ñ Ü×Ñ Ü× Ñ  'Ü×Ñ Ü×"Ñ" IÜ×"Ñ" IÜ×!Ñ! 8Ü×#Ñ# ZÜ×*Ñ*Ð,=ð8
ˆð �t‰}Ðrx   c                ó®  — | j                  «       }| t        j                  t        j                  t        j                  t        j
                  hvr|}t        |«      S | t        j                  t        j                  hv rt        «       }t        |«      S | t        j                  u rt        «       }t        |«      S dd l}|j                  }t        |«      S ©Nr   )ré   r†   r¿   rÅ   rÁ   rÄ   r#   r   Úsqlframe._versionr�   Úparse_version)r~   r¦   Úinto_versionrÖ   s       ry   r‹   zImplementation._backend_versiona  sÃ   € Ø×)Ñ)Ó+ˆàÜ×"Ñ"Ü×*Ñ*Ü×ÑÜ×#Ñ#ð	
ñ 
ð "ˆLô ˜\Ó*Ð*ð ”n×,Ñ,¬n×.LÑ.LÐMÑMÜ&›=ˆLô ˜\Ó*Ð*ð ”^×(Ñ(Ñ(Ü#›:ˆLô
 ˜\Ó*Ð*ó %à#×,Ñ,ˆLÜ˜\Ó*Ð*rx   N)rÈ   ú
type[Self]rÉ   r6   rƒ   r†   )rÈ   r  rØ   rp   rƒ   r†   )rÈ   r  rÜ   z!str | Implementation | ModuleTyperƒ   r†   )rƒ   r6   )rƒ   Úbool)rƒ   r9   )rƒ   rŠ   )&rs   rt   ru   r“   r   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÇ   ÚclassmethodrË   rÙ   rÝ   ré   rë   rî   rð   rò   rô   r÷   rù   rü   rþ   r   r  r  r  rœ   r  r‹   rw   rx   ry   r†   r†   ×   si  „ ÙIá‹V€FØ Ù‹F€EØÙ‹6€DØÙ‹f€GØ!Ù‹f€GØ!Ù‹V€FØ Ù‹6€DØÙ‹V€FØ Ù‹6€DØÙ‹v€HØ"Ù“f€OØ)á‹f€GØ!àðEØðEØ+5ðEà	òEó ðEð4 ðAØðAØ'*ðAà	òAó ðAð4 ð
Øð
Ø"Cð
à	ò
ó ð
ó&3"ój-ó 
ó(
ó(-ó +ó ,ó .ó 6ó .ó +ó -ó +ó /ð  òó ðô*+rx   r†   )r   é   é   )é   é
   )é   )r  é   )r   é   r  )iè  é   )é   )é   )r  é   r   z%dict[Implementation, tuple[int, ...]]ÚMIN_VERSIONSc                óL   — |t         |    x}k  rd| › d|› d|› �}t        |«      ‚y )NzMinimum version of z supported by Narwhals is z	, found: )r&  Ú
ValueError)ÚimplementationÚbackend_versionÚmin_versionrè   s       ry   Úvalidate_backend_versionr,  …  sC   € ð ¬°nÑ)EÐE˜+ÒFØ# NÐ#3Ð3MÈkÈ]ÐZcÐdsÐctÐuˆÜ˜‹oÐð Grx   c                óD   — | j                  |«      r| t        |«      d  S | S r}   )Ú
startswithÚlen)ÚtextÚprefixs     ry   Úremove_prefixr2  �  s$   € Ø‡��vÔØ”C˜“K�MÐ"Ð"Ø€Krx   c                óF   — | j                  |«      r| d t        |«        S | S r}   )Úendswithr/  )r0  Úsuffixs     ry   Úremove_suffixr6  “  s&   € Ø‡}�}�VÔØ�N”s˜6“{�lÐ#Ð#Ø€Krx   c                ób   — t        t        | «      dk(  rt        | d   «      r	| d   «      S | «      S )Nr#  r   )Úlistr/  Ú_is_iterable)Úargss    ry   Úflattenr;  ™  s.   € ÜœC ›I¨šN¬|¸DÀ¹GÔ/D��Q‘ÓPÐPÈ4ÓPÐPrx   c                ó8   — t        | t        t        f«      s| fS | S r}   )rÛ   r8  Útuple)Úargs    ry   Útupleifyr?  �  s   € Ü�cœD¤%˜=Ô)ØˆvˆØ€Jrx   c                ó~  — ddl m} t        | «      st        | «      rdt	        | «      › d�}t        |«      ‚t        «       x}�Rt        | |j                  |j                  |j                  |j                  f«      rdt	        | «      › d�}t        |«      ‚t        | t        «      xr t        | t        t        |f«       S )Nr   rQ   z(Expected Narwhals class or scalar, got: z2. Perhaps you forgot a `nw.from_native` somewhere?z`.

Hint: Perhaps you
- forgot a `nw.from_native` somewhere?
- used `pl.col` instead of `nw.col`?)Únarwhals.seriesrR   r-   r0   ÚtypeÚ	TypeErrorr!   rÛ   ÚExprrL   rN   r   rp   Úbytes)r>  rR   rè   rç   s       ry   r9  r9  £  s°   € Ý&ä˜3ÔÔ#3°CÔ#8Ø8¼¸c»¸ÐCuÐvˆÜ˜‹nÐÜ‹lÐˆÐ'¬JØˆb�i‰i˜Ÿ™ "§,¡,°·±Ð=ô-ð 7´t¸C³y°kð B3ð 3ð 	ô ˜‹nÐä�cœ8Ó$ÒR¬Z¸¼cÄ5È&Ð=QÓ-RÐ)RÐRrx   c                ó®   — t        | t        «      r| n| j                  }t        j                  dd|«      }t        d„ |j                  d«      D «       «      S )zÂSimple version parser; split into a tuple of ints for comparison.

    Arguments:
        version: Version string, or object with one, to parse.

    Returns:
        Parsed version number.
    z(\D?dev.*$)Ú c              3  ó\   K  — | ]$  }t        t        j                  d d|«      «      –— Œ& y­w)z\DrG  N)ÚintÚreÚsub)Ú.0Úvs     ry   ú	<genexpr>z parse_version.<locals>.<genexpr>Å  s"   è ø€ ÒK¨q””R—V‘V˜E 2 qÓ)×*ÑKùs   ‚*,ú.)rÛ   rp   rq   rJ  rK  r=  Úsplit)ÚversionÚversion_strs     ry   r  r  ·  sH   € ô (¨´Ô5‘'¸7×;NÑ;N€KÜ—&‘&˜¨¨[Ó9€KÜÑK°K×4EÑ4EÀcÓ4JÔKÓKÐKrx   c                 ó   — y r}   rw   ©Ú
obj_or_clsÚcls_or_tuples     ry   Úisinstance_or_issubclassrW  È  s   € ð rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  Î  s   € ð  rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  Ô  s   € ð "rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  Ú  s   € ð +.rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  à  s   € ð %(rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  æ  s   € ð 7:rx   c                 ó   — y r}   rw   rT  s     ry   rW  rW  ì  s   € ð rx   c                ó–   — ddl m} t        | |«      rt        | |«      S t        | |«      xs t        | t        «      xr t	        | |«      S )Nr   rO   )Únarwhals.dtypesrP   rÛ   rB  Ú
issubclass)rU  rV  rP   s      ry   rW  rW  ò  sF   € Ý%ä�*˜eÔ$Ü˜* lÓ3Ð3Ü�j ,Ó/ò Ü�:œtÓ$ÒM¬°JÀÓ)Mðrx   c                óÈ   ‡‡— ddl mŠ ddl mŠ t        ˆfd„| D «       «      st        ˆfd„| D «       «      ry d| D �cg c]  }t	        |«      ‘Œ c}› �}t        |«      ‚c c}w )Nr   rK   rM   c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr}   ©rÛ   )rL  ÚitemrL   s     €ry   rN  z$validate_laziness.<locals>.<genexpr>   s   øè ø€ Ò
9¨4Œ:�d˜I×&Ñ
9ùó   ƒc              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr}   rc  )rL  rd  rN   s     €ry   rN  z$validate_laziness.<locals>.<genexpr>  s   øè ø€ Ò:¨DŒJ�t˜Y×'Ñ:ùre  zGThe items to concatenate should either all be eager, or all lazy, got: )Únarwhals.dataframerL   rN   ÚallrB  rC  )Úitemsrd  rè   rL   rN   s      @@ry   Úvalidate_lazinessrj  ü  sZ   ù€ Ý,Ý,ä
Ó
9°5Ô
9Ô9ÜÓ:°EÔ:Ô:àØSÐlqÖTrÐdhÔUYÐZ^ÕU_ÒTrÐSsÐ
t€CÜ
�C‹.Ðùò Uss   ½Ac                óæ  — ddl m} ddlm} dd„}t	        d| «      }t	        d|«      }t        t        |dd«      |«      rÌt        t        |dd«      |«      rµ ||j                  j                  j                  «        ||j                  j                  j                  «       |j                  |j                  j                  |j                  j                  j                  |j                  j                  j                     «      «      S t        t        |dd«      |«      rÌt        t        |dd«      |«      rµ ||j                  j                  j                  «        ||j                  j                  j                  «       |j                  |j                  j                  |j                  j                  j                  |j                  j                  j                     «      «      S t        t        |dd«      |«      rÌt        t        |dd«      |«      rµ ||j                  j                  j                  «        ||j                  j                  j                  «       |j                  |j                  j                  |j                  j                  j                  |j                  j                  j                     «      «      S t        t        |dd«      |«      rÌt        t        |dd«      |«      rµ ||j                  j                  j                  «        ||j                  j                  j                  «       |j                  |j                  j                  |j                  j                  j                  |j                  j                  j                     «      «      S t        |«      t        |«      k7  r%d	t        |«      › d
t        |«      › �}t        |«      ‚| S )aÖ  Align `lhs` to the Index of `rhs`, if they're both pandas-like.

    Arguments:
        lhs: Dataframe or Series.
        rhs: Dataframe or Series to align with.

    Returns:
        Same type as input.

    Notes:
        This is only really intended for backwards-compatibility purposes,
        for example if your library already aligns indices for users.
        If you're designing a new library, we highly encourage you to not
        rely on the Index.
        For non-pandas-like inputs, this only checks that `lhs` and `rhs`
        are the same length.

    Examples:
        >>> import pandas as pd
        >>> import polars as pl
        >>> import narwhals as nw
        >>> df_pd = pd.DataFrame({"a": [1, 2]}, index=[3, 4])
        >>> s_pd = pd.Series([6, 7], index=[4, 3])
        >>> df = nw.from_native(df_pd)
        >>> s = nw.from_native(s_pd, series_only=True)
        >>> nw.to_native(nw.maybe_align_index(df, s))
           a
        4  2
        3  1
    r   )ÚPandasLikeDataFrame)ÚPandasLikeSeriesr   c                ó6   — | j                   sd}t        |«      ‚y )Nz'given index doesn't have a unique index)Ú	is_uniquer(  )Úindexrè   s     ry   Ú_validate_indexz*maybe_align_index.<locals>._validate_index,  s   € Ø�ŠØ;ˆCÜ˜S“/Ð!ð rx   Ú_compliant_frameNÚ_compliant_seriesz6Expected `lhs` and `rhs` to have the same length, got z and )rp  r   rƒ   ÚNone)Únarwhals._pandas_like.dataframerl  Únarwhals._pandas_like.seriesrm  r   rÛ   Úgetattrrr  r¦   rp  Ú_with_compliantÚ_with_nativeÚlocrs  r/  r(  )ÚlhsÚrhsrl  rm  rq  Úlhs_anyÚrhs_anyrè   s           ry   Úmaybe_align_indexr    sJ  € õB DÝ=ó"ô
 �5˜#Ó€GÜ�5˜#Ó€GÜÜ�Ð+¨TÓ2Ð4Gôä
”W˜WÐ&8¸$Ó?ÐATÔ
UÙ˜×0Ñ0×7Ñ7×=Ñ=Ô>Ù˜×0Ñ0×7Ñ7×=Ñ=Ô>Ø×&Ñ&Ø×$Ñ$×1Ñ1Ø×(Ñ(×/Ñ/×3Ñ3°G×4LÑ4L×4SÑ4S×4YÑ4YÑZóó
ð 	
ô
 Ü�Ð+¨TÓ2Ð4Gôä
”W˜WÐ&9¸4Ó@ÐBRÔ
SÙ˜×0Ñ0×7Ñ7×=Ñ=Ô>Ù˜×1Ñ1×8Ñ8×>Ñ>Ô?Ø×&Ñ&Ø×$Ñ$×1Ñ1Ø×(Ñ(×/Ñ/×3Ñ3Ø×-Ñ-×4Ñ4×:Ñ:ñóó
ð 	
ô Ü�Ð,¨dÓ3Ð5Eôä
”W˜WÐ&8¸$Ó?ÐATÔ
UÙ˜×1Ñ1×8Ñ8×>Ñ>Ô?Ù˜×0Ñ0×7Ñ7×=Ñ=Ô>Ø×&Ñ&Ø×%Ñ%×2Ñ2Ø×)Ñ)×0Ñ0×4Ñ4Ø×,Ñ,×3Ñ3×9Ñ9ñóó
ð 	
ô Ü�Ð,¨dÓ3Ð5Eôä
”W˜WÐ&9¸4Ó@ÐBRÔ
SÙ˜×1Ñ1×8Ñ8×>Ñ>Ô?Ù˜×1Ñ1×8Ñ8×>Ñ>Ô?Ø×&Ñ&Ø×%Ñ%×2Ñ2Ø×)Ñ)×0Ñ0×4Ñ4Ø×-Ñ-×4Ñ4×:Ñ:ñóó
ð 	
ô ˆ7ƒ|”s˜7“|Ò#ØFÄsÈ7Ã|ÀnÐTYÔZ]Ð^eÓZfÐYgÐhˆÜ˜‹oÐØ€Jrx   c                ó€   — t        d| «      }|j                  «       }t        |«      st        |«      r|j                  S y)a¼  Get the index of a DataFrame or a Series, if it's pandas-like.

    Arguments:
        obj: Dataframe or Series.

    Returns:
        Same type as input.

    Notes:
        This is only really intended for backwards-compatibility purposes,
        for example if your library already aligns indices for users.
        If you're designing a new library, we highly encourage you to not
        rely on the Index.
        For non-pandas-like inputs, this returns `None`.

    Examples:
        >>> import pandas as pd
        >>> import polars as pl
        >>> import narwhals as nw
        >>> df_pd = pd.DataFrame({"a": [1, 2], "b": [4, 5]})
        >>> df = nw.from_native(df_pd)
        >>> nw.maybe_get_index(df)
        RangeIndex(start=0, stop=2, step=1)
        >>> series_pd = pd.Series([1, 2])
        >>> series = nw.from_native(series_pd, series_only=True)
        >>> nw.maybe_get_index(series)
        RangeIndex(start=0, stop=2, step=1)
    r   N)r   Ú	to_nativer.   r/   rp  )ÚobjÚobj_anyÚ
native_objs      ry   Úmaybe_get_indexr…  g  s=   € ô: �5˜#Ó€GØ×"Ñ"Ó$€JÜ 
Ô+Ô/DÀZÔ/PØ×ÑÐØrx   )rp  c               ó€  — ddl m} t        d| «      }|j                  «       }|�|�d}t        |«      ‚|s|€d}t        |«      ‚|�.t	        |«      r|D �cg c]  } ||d¬«      ‘Œ c}n	 ||d¬«      }n|}t        |«      r9|j                  |j                  j                  |j                  |«      «      «      S t        |«      rsddlm	}	 |rd	}t        |«      ‚ |	||| j                  j                  | j                  j                  ¬
«      }|j                  |j                  j                  |«      «      S |S c c}w )aÙ  Set the index of a DataFrame or a Series, if it's pandas-like.

    Arguments:
        obj: object for which maybe set the index (can be either a Narwhals `DataFrame`
            or `Series`).
        column_names: name or list of names of the columns to set as index.
            For dataframes, only one of `column_names` and `index` can be specified but
            not both. If `column_names` is passed and `df` is a Series, then a
            `ValueError` is raised.
        index: series or list of series to set as index.

    Returns:
        Same type as input.

    Raises:
        ValueError: If one of the following condition happens:

            - none of `column_names` and `index` are provided
            - both `column_names` and `index` are provided
            - `column_names` is provided and `df` is a Series

    Notes:
        This is only really intended for backwards-compatibility purposes, for example if
        your library already aligns indices for users.
        If you're designing a new library, we highly encourage you to not
        rely on the Index.

        For non-pandas-like inputs, this is a no-op.

    Examples:
        >>> import pandas as pd
        >>> import polars as pl
        >>> import narwhals as nw
        >>> df_pd = pd.DataFrame({"a": [1, 2], "b": [4, 5]})
        >>> df = nw.from_native(df_pd)
        >>> nw.to_native(nw.maybe_set_index(df, "b"))  # doctest: +NORMALIZE_WHITESPACE
           a
        b
        4  1
        5  2
    r   )r�  r   z8Only one of `column_names` or `index` should be providedz3Either `column_names` or `index` should be providedT)Úpass_through)Ú	set_indexz/Cannot set index using column names on a Series)r)  r*  )Únarwhals.translater�  r   r(  r9  r.   rx  rr  ry  rˆ  r/   Únarwhals._pandas_like.utilsrs  r‡   r‹   )
r‚  Úcolumn_namesrp  r�  Údf_anyr„  rè   ÚidxÚkeysrˆ  s
             ry   Úmaybe_set_indexr�  ‹  sF  € õ^ -ä�%˜Ó€FØ×!Ñ!Ó#€JàÐ EÐ$5ØHˆÜ˜‹oÐá˜E˜MØCˆÜ˜‹oÐàÐô ˜EÔ"ð ;@Ö@°3‰Y�s¨Ö.Ó@á˜5¨tÔ4ñ 	ð ˆä 
Ô+Ø×%Ñ%Ø×#Ñ#×0Ñ0°×1EÑ1EÀdÓ1KÓLó
ð 	
ô 
˜zÔ	*Ý9áØCˆCÜ˜S“/Ð!áØØØ×0Ñ0×@Ñ@Ø×1Ñ1×BÑBô	
ˆ
ð ×%Ñ% f×&>Ñ&>×&KÑ&KÈJÓ&WÓXÐXàˆùò5 As   ÁD;c                óÊ  — t        d| «      }|j                  «       }t        |«      rX|j                  «       }t	        ||«      r|S |j                  |j                  j                  |j                  d¬«      «      «      S t        |«      rX|j                  «       }t	        ||«      r|S |j                  |j                  j                  |j                  d¬«      «      «      S |S )aý  Reset the index to the default integer index of a DataFrame or a Series, if it's pandas-like.

    Arguments:
        obj: Dataframe or Series.

    Returns:
        Same type as input.

    Notes:
        This is only really intended for backwards-compatibility purposes,
        for example if your library already resets the index for users.
        If you're designing a new library, we highly encourage you to not
        rely on the Index.
        For non-pandas-like inputs, this is a no-op.

    Examples:
        >>> import pandas as pd
        >>> import polars as pl
        >>> import narwhals as nw
        >>> df_pd = pd.DataFrame({"a": [1, 2], "b": [4, 5]}, index=([6, 7]))
        >>> df = nw.from_native(df_pd)
        >>> nw.to_native(nw.maybe_reset_index(df))
           a  b
        0  1  4
        1  2  5
        >>> series_pd = pd.Series([1, 2])
        >>> series = nw.from_native(series_pd, series_only=True)
        >>> nw.maybe_get_index(series)
        RangeIndex(start=0, stop=2, step=1)
    r   T)Údrop)r   r�  r.   Ú__native_namespace__Ú_has_default_indexrx  rr  ry  Úreset_indexr/   rs  )r‚  rƒ  r„  rÉ   s       ry   Úmaybe_reset_indexr•  æ  sß   € ô> �5˜#Ó€GØ×"Ñ"Ó$€JÜ 
Ô+Ø"×7Ñ7Ó9ÐÜ˜jÐ*:Ô;ØˆNØ×&Ñ&Ø×$Ñ$×1Ñ1°*×2HÑ2HÈdÐ2HÓ2SÓTó
ð 	
ô ˜ZÔ(Ø"×7Ñ7Ó9ÐÜ˜jÐ*:Ô;ØˆNØ×&Ñ&Ø×%Ñ%×2Ñ2°:×3IÑ3IÈtÐ3IÓ3TÓUó
ð 	
ð €Nrx   c                ó.   — t        | |j                  «      S r}   )rÛ   Ú
RangeIndex)r‚  rÉ   s     ry   Ú_is_range_indexr˜    s   € Ü�cÐ+×6Ñ6Ó7Ð7rx   c                óª   — | j                   }t        ||«      xr: |j                  dk(  xr) |j                  t	        |«      k(  xr |j
                  dk(  S )Nr   r#  )rp  r˜  ÚstartÚstopr/  Ústep)Únative_frame_or_seriesrÉ   rp  s      ry   r“  r“    sW   € ð #×(Ñ(€Eä˜Ð/Ó0ò 	Ø�K‰K˜1Ñò	à�J‰Jœ#˜e›*Ñ$ò	ð �J‰J˜!‰Oð	rx   c           	     óR  — t        d| «      }|j                  «       }t        |«      r:|j                  |j                  j                   |j                  |i |¤Ž«      «      S t        |«      r:|j                  |j                  j                   |j                  |i |¤Ž«      «      S |S )aW  Convert columns or series to the best possible dtypes using dtypes supporting ``pd.NA``, if df is pandas-like.

    Arguments:
        obj: DataFrame or Series.
        *args: Additional arguments which gets passed through.
        **kwargs: Additional arguments which gets passed through.

    Returns:
        Same type as input.

    Notes:
        For non-pandas-like inputs, this is a no-op.
        Also, `args` and `kwargs` just get passed down to the underlying library as-is.

    Examples:
        >>> import pandas as pd
        >>> import polars as pl
        >>> import narwhals as nw
        >>> import numpy as np
        >>> df_pd = pd.DataFrame(
        ...     {
        ...         "a": pd.Series([1, 2, 3], dtype=np.dtype("int32")),
        ...         "b": pd.Series([True, False, np.nan], dtype=np.dtype("O")),
        ...     }
        ... )
        >>> df = nw.from_native(df_pd)
        >>> nw.to_native(
        ...     nw.maybe_convert_dtypes(df)
        ... ).dtypes  # doctest: +NORMALIZE_WHITESPACE
        a             Int32
        b           boolean
        dtype: object
    r   )	r   r�  r.   rx  rr  ry  Úconvert_dtypesr/   rs  )r‚  r:  Úkwargsrƒ  r„  s        ry   Úmaybe_convert_dtypesr¡  )  s°   € ôH �5˜#Ó€GØ×"Ñ"Ó$€JÜ 
Ô+Ø×&Ñ&Ø×$Ñ$×1Ñ1Ø)�
×)Ñ)¨4Ð:°6Ñ:óó
ð 	
ô
 ˜ZÔ(Ø×&Ñ&Ø×%Ñ%×2Ñ2Ø)�
×)Ñ)¨4Ð:°6Ñ:óó
ð 	
ð
 €Nrx   c                óv   — |dv r| S |dv r| dz  S |dv r| dz  S |dv r| dz  S |dv r| d	z  S d
|›�}t        |«      ‚)zÍScale size in bytes to other size units (eg: "kb", "mb", "gb", "tb").

    Arguments:
        sz: original size in bytes
        unit: size unit to convert into

    Returns:
        Integer or float.
    >   ÚbrE  >   ÚkbÚ	kilobytesi   >   ÚmbÚ	megabytesi   >   ÚgbÚ	gigabytesi   @>   ÚtbÚ	terabytesl        z9`unit` must be one of {'b', 'kb', 'mb', 'gb', 'tb'}, got )r(  )ÚszÚunitrè   s      ry   Úscale_bytesr®  ^  ss   € ð ˆ~ÑØˆ	Ø	Ð$Ñ	$Ø�D‰yÐØ	Ð$Ñ	$Ø�G‰|ÐØ	Ð$Ñ	$Ø�G‰|ÐØ	Ð$Ñ	$Ø�G‰|ÐàKÈDÈ8ÐTˆÜ˜‹oÐrx   c                ó  — ddl m} | j                  j                  j                  }| j                  }t        ||«      r9t        | j                  |j                  «      r|j                  j                  d   S | j                  |j                  k(  ry| j                  |j                  k7  ry| j                  «       }t        |«      r|j                  j                  dk(  S t        |«      rt        |j                   j"                  «      S t%        |«      r|j                   j"                  S t'        |«      r|j                   j"                  S t)        |«      r0ddlm}  ||j.                  «      xr |j.                  j"                  S y)a  Return whether indices of categories are semantically meaningful.

    This is a convenience function to accessing what would otherwise be
    the `is_ordered` property from the DataFrame Interchange Protocol,
    see https://data-apis.org/dataframe-protocol/latest/API.html.

    - For Polars:
      - Enums are always ordered.
      - Categoricals are ordered if `dtype.ordering == "physical"`.
    - For pandas-like APIs:
      - Categoricals are ordered if `dtype.cat.ordered == True`.
    - For PyArrow table:
      - Categoricals are ordered if `dtype.type.ordered == True`.

    Arguments:
        series: Input Series.

    Returns:
        Whether the Series is an ordered categorical.

    Examples:
        >>> import narwhals as nw
        >>> import pandas as pd
        >>> import polars as pl
        >>> data = ["x", "y"]
        >>> s_pd = pd.Series(data, dtype=pd.CategoricalDtype(ordered=True))
        >>> s_pl = pl.Series(data, dtype=pl.Categorical(ordering="physical"))

        Let's define a library-agnostic function:

        >>> @nw.narwhalify
        ... def func(s):
        ...     return nw.is_ordered_categorical(s)

        Then, we can pass any supported library to `func`:

        >>> func(s_pd)
        True
        >>> func(s_pl)
        True
    r   )ÚInterchangeSeriesÚ
is_orderedTFÚphysical)Úis_dictionary)Únarwhals._interchange.seriesr°  rs  r�   r´   rÛ   ÚdtypeÚCategoricalr¦   Údescribe_categoricalr   r�  r1   Úorderingr0   r  ÚcatÚorderedr(   r'   r2   Únarwhals._arrow.utilsr³  rB  )Úseriesr°  r´   r¬   Únative_seriesr³  s         ry   Úis_ordered_categoricalr¾  w  s<  € õT ?à×%Ñ%×.Ñ.×5Ñ5€FØ×(Ñ(€IÜ�)Ð.Ô/´JØ�‰�f×(Ñ(ô5ð ×Ñ×4Ñ4°\ÑBÐBØ‡|�|�v—{‘{Ò"ØØ‡|�|�v×)Ñ)Ò)ØØ×$Ñ$Ó&€MÜ˜Ô&Ø×"Ñ"×+Ñ+¨zÑ9Ð9Ü˜Ô&Ü�M×%Ñ%×-Ñ-Ó.Ð.Ü�}Ô%Ø× Ñ ×(Ñ(Ð(Ü�mÔ$Ø× Ñ ×(Ñ(Ð(Ü Ô.Ý7á˜]×/Ñ/Ó0ÒO°]×5GÑ5G×5OÑ5OÐOàrx   c                ó:   — d}t        |d¬«       t        | |¬«      S )Nz}Use `generate_temporary_column_name` instead. `generate_unique_token` is deprecated and it will be removed in future versionsú1.13.0©r�   )Ún_bytesrš   )Úissue_deprecation_warningÚgenerate_temporary_column_name)rÂ  rš   rè   s      ry   Úgenerate_unique_tokenrÅ  ¾  s%   € ð	?ð ô ˜c¨HÕ5Ü)°'À7ÔKÐKrx   c                óf   — d}	 t        | «      }||vr|S |dz  }|dkD  rd| ›d|› �}t        |«      ‚Œ/)aù  Generates a unique column name that is not present in the given list of columns.

    It relies on [python secrets token_hex](https://docs.python.org/3/library/secrets.html#secrets.token_hex)
    function to return a string nbytes random bytes.

    Arguments:
        n_bytes: The number of bytes to generate for the token.
        columns: The list of columns to check for uniqueness.

    Returns:
        A unique token that is not present in the given list of columns.

    Raises:
        AssertionError: If a unique token cannot be generated after 100 attempts.

    Examples:
        >>> import narwhals as nw
        >>> columns = ["abc", "xyz"]
        >>> nw.generate_temporary_column_name(n_bytes=8, columns=columns) not in columns
        True
    r   r#  éd   zMInternal Error: Narwhals was not able to generate a column name with n_bytes=z and not in )r   rä   )rÂ  rš   ÚcounterÚtokenrè   s        ry   rÄ  rÄ  É  s_   € ð, €GØ
Ü˜'Ó"ˆØ˜ÑØˆLà�1‰ˆØ�SŠ=ðØ�*˜L¨¨	ð3ð ô ! Ó%Ð%ð rx   c                óø   — | j                   }t        |«      }|r/|D �cg c]	  }||vsŒ|‘Œ }}|rt        j                  ||¬«      ‚|S t        t	        |«      j                  t	        |«      «      «      }|S c c}w )N)Úmissing_columnsÚavailable_columns)rš   r8  r3   Ú'from_missing_and_available_column_namesÚsetÚintersection)Úcompliant_framerš   ÚstrictÚcolsÚto_dropÚxrË  s          ry   Úparse_columns_to_droprÕ  î  s€   € ð
 ×"Ñ"€DÜ�7‹m€GÙØ&-Ö? °¸$²š1Ð?ˆÐ?ÙÜ%×MÑMØ /À4ôð ð
 €Nô ”s˜4“y×-Ñ-¬c°'«lÓ;Ó<ˆØ€Nùò @s
   ž	A7¨A7c                óH   — t        | t        «      xr t        | t        «       S r}   )rÛ   r   rp   )Úsequences    ry   Úis_sequence_but_not_strrØ     s   € Ü�h¤Ó)ÒK´*¸XÄsÓ2KÐ.KÐKrx   c                óB   — t        | t        «      xr | t        d «      k(  S r}   )rÛ   Úslice©r‚  s    ry   Úis_slice_nonerÜ    s   € Ü�cœ5Ó!Ò8 c¬U°4«[Ñ&8Ð8rx   c                óÐ   — t        | «      xr3 t        | «      dkD  xr t        | d   t        «      xs t        | «      dk(  xs% t	        | «      xs t        | «      xs t        | «      S r  )rØ  r/  rÛ   rI  r,   r*   Úis_compliant_series_intrÛ  s    ry   Úis_sized_multi_index_selectorrß    sl   € ô
 $ CÓ(ò PÜ�c“(˜Q‘,Ò:¤:¨c°!©f´cÓ#:ÒNÄÀCÃÈAÁò	(ô ! Ó%ò		(ô
 " #Ó&ò	(ô # 3Ó'ðrx   c                óf   — t        | «      xs% t        | «      xs t        | «      xs t        | «      S r}   )rØ  r+   r)   Úis_compliant_seriesrÛ  s    ry   Úis_sequence_likerâ    s:   € ô 	  Ó$ò 	$Ü˜SÓ!ò	$ä˜cÓ"ò	$ô ˜sÓ#ð	rx   c                ó
  — t        | t        «      xrr t        | j                  t        «      xsV t        | j                  t        «      xs: t        | j
                  t        «      xr | j                  d u xr | j                  d u S r}   )rÛ   rÚ  rš  rI  r›  rœ  rÛ  s    ry   Úis_slice_indexrä  !  sh   € Ü�cœ5Ó!ò Ü�3—9‘9œcÓ"ò 	RÜ�c—h‘h¤Ó$ò	Rä�s—x‘x¤Ó%ÒP¨#¯)©)°tÐ*;ÒPÀÇÁÈDÐ@Pðrx   c                ó"   — t        | t        «      S r}   )rÛ   ÚrangerÛ  s    ry   Úis_rangerç  )  s   € Ü�cœ5Ó!Ð!rx   c                óZ   — t        t        | t        «      xr t        | t         «       «      S r}   )r  rÛ   rI  rÛ  s    ry   Úis_single_index_selectorré  -  s#   € Ü”
˜3¤Ó$ÒB¬Z¸¼TÓ-BÐ)BÓCÐCrx   c                óL   — t        | «      xs t        | «      xs t        | «      S r}   )ré  rß  rä  rÛ  s    ry   Úis_index_selectorrë  1  s+   € ô 	! Ó%ò 	Ü(¨Ó-ò	ä˜#Óðrx   c                ó^   — t        t        | t        «      xr | xr t        | d   |«      «      S r  )r  rÛ   r8  )r‚  Útps     ry   Ú
is_list_ofrî  ;  s)   € ä”
˜3¤Ó%ÒH¨#ÒH´*¸SÀ¹VÀRÓ2HÓIÐIrx   c                óx   — t        t        | «      xr% t        t        | «      d «      x}xr t	        ||«      «      S r}   )r  rØ  ÚnextÚiterrÛ   )r‚  rí  Úfirsts      ry   Úis_sequence_ofró  @  s>   € äÜ Ó$ò 	"Üœ4 ›9 dÓ+Ð+ˆUò	"ä�u˜bÓ!óð rx   c                 óp  — ddl } ddlm} ddl}t	         ||j
                  «      j                  «      }| j                  «       }d}	 |re| j                  |«      }|j                  |«      s*t        |j                  dd«      x}r#|j                  d«      r|j                  }|dz  }n	 ~|S |rŒe	 ~|S # ~w xY w)zðFind the first place in the stack that is not inside narwhals.

    Returns:
        Stacklevel.

    Taken from:
    https://github.com/pandas-dev/pandas/blob/ab89c53f48df67709a533b6a95ce3d911871a0a8/pandas/util/_exceptions.py#L30-L51
    r   N)ÚPathÚco_qualnamezsingledispatch.r#  )ÚinspectÚpathlibrõ  rµ   rp   Ú__file__ÚparentÚcurrentframeÚgetfiler.  rw  Úf_codeÚf_back)r÷  rõ  ÚnwÚpkg_dirÚframeÚnÚfnameÚqualnames           ry   Úfind_stacklevelr  I  sÀ   € ó Ýãä‘$�r—{‘{Ó#×*Ñ*Ó+€Gð × Ñ Ó"€EØ	€AðÙØ—O‘O EÓ*ˆEØ×Ñ Ô(Ü$ U§\¡\°=À$ÓGÐG�ÐGà×'Ñ'Ð(9Ô:àŸ™�Ø�Q‘‘àð Ø€Hò' ð ð Ø€Høñ ús   ÁA B2 Â+B2 Â2B5c                ó8   — t        | t        t        «       ¬«       y)zßIssue a deprecation warning.

    Arguments:
        message: The message associated with the warning.
        _version: Narwhals version when the warning was introduced. Just used for internal
            bookkeeping.
    )ÚmessageÚcategoryÚ
stacklevelN)r   ÚDeprecationWarningr  )r  r�   s     ry   rÃ  rÃ  s  s   € ô 	�Ô#5Ä/ÓBSÖTrx   c               ón   — | €|€|}|S | �|€|rd}t        |d¬«       |  }|S | €|�	 |S d}t        |«      ‚)NzÙ`strict` in `from_native` is deprecated, please use `pass_through` instead.

Note: `strict` will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rÀ  rÁ  z,Cannot pass both `strict` and `pass_through`)rÃ  r(  )rÑ  r‡  Úpass_through_defaultÚemit_deprecation_warningrè   s        ry   Úvalidate_strict_and_pass_thoughr  ~  sy   € ð €~˜,Ð.Ø+ˆð Ðð 
Ð	 Ð 4Ù#ðbð ô
 & c°HÕ=Ø!�zˆð Ðð 
ˆ˜LÐ4Øð Ðð =ˆÜ˜‹oÐrx   rG  F)Úwarn_versionÚrequiredc                ó   ‡ ‡— dˆˆ fd„}|S )a8  Decorator to transition from `native_namespace` to `backend` argument.

    Arguments:
        warn_version: Emit a deprecation warning from this version.
        required: Raise when both `native_namespace`, `backend` are `None`.

    Returns:
        Wrapped function, with `native_namespace` **removed**.
    c               ó6   •‡ — t        ‰ «      dˆ ˆˆfd„«       }|S )Nc                 óú   •— |j                  dd «      }|j                  dd «      }|�|€‰rd}t        |‰¬«       |}n2|�|�d}t        |«      ‚|€|€‰rd‰j                  › d�}t        |«      ‚||d<    ‰| i |¤ŽS )NrÜ   rÉ   z×`native_namespace` is deprecated, please use `backend` instead.

Note: `native_namespace` will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rÁ  z0Can't pass both `native_namespace` and `backend`z `backend` must be specified in `z`.)ÚpoprÃ  r(  rs   )r:  ÚkwdsrÜ   rÉ   rè   Úfnr  r  s        €€€ry   Úwrapperz=deprecate_native_namespace.<locals>.decorate.<locals>.wrapper¦  s©   ø€ à—h‘h˜y¨$Ó/ˆGØ#Ÿx™xÐ(:¸DÓAÐØÐ+°°Ùðjð ô
 .¨c¸LÕIØ*‘Ø!Ð-°'Ð2EØH�Ü  “oÐ%Ø!Ð)¨g¨oÁ(Ø8¸¿¹¸ÀRÐH�Ü  “oÐ%Ø%ˆD�‰OÙ�tÐ$˜tÑ$Ð$rx   )r:  úP.argsr  úP.kwargsrƒ   rk   r   )r  r  r  r  s   ` €€ry   Údecoratez,deprecate_native_namespace.<locals>.decorate¥  s    ù€ Ü	ˆr‹ö	%ó 
ð	%ð* ˆrx   )r  úCallable[P, R]rƒ   r  rw   )r  r  r  s   `` ry   Údeprecate_native_namespacer  ˜  s   ù€ öð2 €Orx   c                ób  — | dk  rd}t        |«      ‚t        | t        «      s'| j                  j                  }d|› d�}t        |«      ‚|�_|dk  rd}t        |«      ‚t        |t        «      s'|j                  j                  }d|› d�}t        |«      ‚|| kD  rd}t        |«      ‚| |fS | }| |fS )Nr#  z+window_size must be greater or equal than 1zargument 'window_size': 'z,' object cannot be interpreted as an integerz+min_samples must be greater or equal than 1zargument 'min_samples': 'z6`min_samples` must be less or equal than `window_size`)r(  rÛ   rI  Ú	__class__rs   rC  r5   )Úwindow_sizeÚmin_samplesrè   Ú_types       ry   Ú_validate_rolling_argumentsr"  Á  sç   € ð �Q‚Ø;ˆÜ˜‹oÐä�k¤3Ô'Ø×%Ñ%×.Ñ.ˆà'¨ wð /(ð (ð 	ô ˜‹nÐàÐØ˜Š?Ø?ˆCÜ˜S“/Ð!ä˜+¤sÔ+Ø×)Ñ)×2Ñ2ˆEà+¨E¨7ð 3,ð ,ð ô ˜C“.Ð Ø˜Ò$ØJˆCÜ'¨Ó,Ð,ð ˜Ð#Ð#ð "ˆà˜Ð#Ð#rx   c           
     ó¼  — 	 t        j                  «       j                  }|j                  «       j                  «       }t        d„ |D «       «      }|dz   |k  r§t        |t        | «      «      }dd|z  › d�}|t        | «      z
  }|dd	|dz  z  › | › d	|dz  |dz  z   z  › d
�z  }|dd|z  › d
�z  }||z
  dz  }||z
  dz  ||z
  dz  z   }	|D ]$  }
|dd	|z  › |
› d	|	|z   t        |
«      z
  z  › d
�z  }Œ& |dd|z  › d�z  }|S dt        | «      z
  }dd› dd	|dz  z  › | › d	|dz  |dz  z   z  › dd› d�	S # t        $ r# t	        t        j
                  dd«      «      }Y �Œ:w xY w)NÚCOLUMNSéP   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr}   )r/  )rL  Úlines     ry   rN  z generate_repr.<locals>.<genexpr>ë  s   è ø€ Ò>¨œ3˜tŸ9Ñ>ùs   ‚é   u   â”Œu   â”€u   â”�
ú|ú z|
ú-u   â””u   â”˜é'   uu   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u   â”�
|u/   |
| Use `.to_native` to see native output |
â””)
ÚosÚget_terminal_sizerš   ÚOSErrorrI  ÚgetenvÚ
expandtabsÚ
splitlinesÚmaxr/  )ÚheaderÚnative_reprÚterminal_widthÚnative_linesÚmax_native_widthÚlengthÚoutputÚheader_extraÚstart_extraÚ	end_extrar'  Údiffs               ry   Úgenerate_reprr?  å  sõ  € ð7Ü×-Ñ-Ó/×7Ñ7ˆð ×)Ñ)Ó+×6Ñ6Ó8€LÜÑ>°Ô>Ó>Ðà˜!Ñ˜~Ò-ÜÐ%¤s¨6£{Ó3ˆØ�u˜v‘~Ð& eÐ,ˆØ¤ F£Ñ+ˆØ�A�c˜\¨QÑ.Ñ/Ð0°°¸ÀÐPQÑ@QÐT`ÐcdÑTdÑ@dÑ9eÐ8fÐfiÐjÑjˆØ�A�c˜V‘nÐ% SÐ)Ñ)ˆØÐ 0Ñ0°QÑ6ˆØÐ.Ñ.°1Ñ4¸ÐAQÑ8QÐUVÑ7VÑVˆ	Ø ò 	kˆDØ˜˜# Ñ-Ð.¨t¨f°S¸IÐHXÑ<XÔ[^Ð_cÓ[dÑ<dÑ5eÐ4fÐfiÐjÑj‰Fð	kà�C˜ ™Ð' sÐ+Ñ+ˆØˆà”�F“Ñ€Dà
ˆlˆ^ð Ø�4˜1‘9ÑÐ˜v˜h s¨d°a©i¸$À¹(Ñ.BÑ'CÐ&Dð E9àˆ,�cð	ðøô' ò 7ÜœRŸY™Y y°"Ó5Ó6‹ð7ús   ‚D/ Ä/(EÅEc                óz   — |�9t        |«      j                  | «      x}rdt        |«      › d| › �}t        |«      ‚y y )Nz
Column(s) z not found in )rÎ  Ú
differenceÚsortedr3   )rš   ÚsubsetÚmissingrè   s       ry   Úcheck_column_existsrE    sL   € ØÐ¬#¨f«+×*@Ñ*@ÀÓ*IÐI˜wÐIØœ6 '›?Ð+¨>¸'¸ÐCˆÜ! #Ó&Ð&ð  JÐrx   c                ó.  — t        t        | «      «      }t        | «      |k7  rmddlm}  || «      }|j	                  «       D ��ci c]  \  }}|dkD  sŒ||“Œ }}}dj                  d„ |j	                  «       D «       «      }d|› �}t        |«      ‚y c c}}w )Nr   )ÚCounterr#  rG  c              3  ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­w)z
- 'z' z timesNrw   )rL  ÚkrM  s      ry   rN  z0check_column_names_are_unique.<locals>.<genexpr>  s#   è ø€ ÒL±°°A˜˜a˜S  1 # VÔ,ÑLùs   ‚z"Expected unique column names, got:)r/  rÎ  ÚcollectionsrG  ri  Újoinr4   )rš   Úlen_unique_columnsrG  rÈ  rI  rM  Ú
duplicatesrè   s           ry   Úcheck_column_names_are_uniquerN  	  s‘   € ÜœS ›\Ó*ÐÜ
ˆ7ƒ|Ð)Ò)Ý'á˜'Ó"ˆØ'.§}¡}£×@™t˜q !¸!¸a»%�a˜‘dÐ@ˆ
Ñ@Ø�g‰gÑL¸×9IÑ9IÓ9KÔLÓLˆØ2°3°%Ð8ˆÜ˜SÓ!Ð!ð *ùó As   ÁBÁBc                óä   — | €h d£nt        | t        «      r| hn
t        | «      }|€d hn>t        |t        t        f«      rt        |«      hn|D �ch c]  }|�t        |«      nd ’Œ c}}||fS c c}w )N>   ÚsÚmsÚnsÚus)rÛ   rp   rÎ  r   )Ú	time_unitÚ	time_zoneÚ
time_unitsÚtzÚ
time_zoness        ry   Ú_parse_time_unit_and_time_zonerY    sŒ   € ð Ðó 	 ô �i¤Ô%ð ‰[ä�‹^ð ð Ðð 
‰ô �i¤#¤x Ô1ô �)‹nÑà<EÖF°b˜˜Œc�"Œg¨TÑ1ÒFð ð �zÐ!Ð!ùò Gs   ÁA-c                óš   — t        | |j                  «      xr4 | j                  |v xr$ | j                  |v xs d|v xr | j                  d uS )NÚ*)rÛ   ÚDatetimerT  rU  )rµ  r´   rV  rX  s       ry   Ú%dtype_matches_time_unit_and_time_zoner]  *  sW   € ô 	�5˜&Ÿ/™/Ó*ò 	
Ø�_‰_ 
Ð*ò	
ð �O‰O˜zÐ)ò CØ�zÐ!ÒA e§o¡o¸TÐ&Aðrx   c               ó   — | j                   S r}   ©rš   )r  s    ry   Úget_column_namesr`  7  s   € Ø�=‰=Ðrx   c                óJ   — | j                   D �cg c]	  }||vsŒ|‘Œ c}S c c}w r}   r_  )r  ÚnamesÚcol_names      ry   Úexclude_column_namesrd  ;  s!   € Ø%*§]¡]ÖL˜°hÀeÒ6KŠHÒLÐLùÒLs   �	 ™ c               ó   ‡ — dˆ fd„}|S )Nc               ó   •— ‰S r}   rw   )Ú_framerb  s    €ry   r  z$passthrough_column_names.<locals>.fn@  s   ø€ Øˆrx   )rg  r   rƒ   r›   rw   )rb  r  s   ` ry   Úpassthrough_column_namesrh  ?  s   ø€ õð €Irx   c                ó4   — t        «       }t        | ||«      |uS r}   )Úobjectr
   )r‚  ÚattrÚsentinels      ry   Ú_hasattr_staticrm  F  s   € Ü‹x€HÜ˜#˜t XÓ.°hÐ>Ð>rx   c                ó   — t        | d«      S )NÚ__narwhals_dataframe__©rm  rÛ  s    ry   Úis_compliant_dataframerq  K  ó   € ô ˜3Ð 8Ó9Ð9rx   c                ó   — t        | d«      S )NÚ__narwhals_lazyframe__rp  rÛ  s    ry   Úis_compliant_lazyframeru  Q  rr  rx   c                ó   — t        | d«      S )NÚ__narwhals_series__rp  rÛ  s    ry   rá  rá  W  s   € ô ˜3Ð 5Ó6Ð6rx   c                óP   — t        | «      xr | j                  j                  «       S r}   )rá  rµ  Ú
is_integerrÛ  s    ry   rÞ  rÞ  ]  s!   € ô ˜sÓ#Ò>¨¯	©	×(<Ñ(<Ó(>Ð>rx   c                ó   — t        | d«      S )NÚ__narwhals_expr__©ÚhasattrrÛ  s    ry   Úis_compliant_exprr~  c  s   € ô �3Ð+Ó,Ð,rx   c                ó    — | t         j                  t         j                  t         j                  t         j                  t         j
                  hv S r}   )r†   r»   r¼   r½   rÀ   r¾   rÛ  s    ry   Úis_eager_allowedr€  i  sA   € ØÜ×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñðð ð rx   c                ó   — t        | d«      S )Nr’  r|  rÛ  s    ry   Úhas_native_namespacer‚  s  s   € Ü�3Ð.Ó/Ð/rx   c                ó   — t        | d«      S )NÚ__dataframe__r|  rÛ  s    ry   Ú_supports_dataframe_interchanger…  w  s   € Ü�3˜Ó(Ð(rx   c                ó   — t        | d«      S )NÚ__arrow_c_stream__rp  rÛ  s    ry   Úsupports_arrow_c_streamrˆ  {  s   € Ü˜3Ð 4Ó5Ð5rx   c                óH   ‡ ‡— ˆ ˆfd„|D «       }t        t        ||«      «      S )aO  Remap join keys to avoid collisions.

    If left keys collide with the right keys, append the suffix.
    If there's no collision, let the right keys be.

    Arguments:
        left_on: Left keys.
        right_on: Right keys.
        suffix: Suffix to append to right keys.

    Returns:
        A map of old to new right keys.
    c              3  ó6   •K  — | ]  }|‰v r|› ‰› �n|–— Œ y ­wr}   rw   )rL  ÚkeyÚleft_onr5  s     €€ry   rN  z(_remap_full_join_keys.<locals>.<genexpr>�  s*   øè ø€ ò Ø8;˜C 7™Nˆ3ˆ%�ˆxÑ°Ó3ñùre  )ÚdictÚzip)rŒ  Úright_onr5  Úright_keys_suffixeds   ` ` ry   Ú_remap_full_join_keysr‘    s(   ù€ ô Ø?GôÐô ”�HÐ1Ó2Ó3Ð3rx   c               ó   — t        d«      rPddl}ddlm} |j                  } |t        |«      |¬«      }|j                  j                  | |¬«      j                  S dt        | «      j                  ›d�}t        |«      ‚)	zÛGuards `ArrowDataFrame.from_arrow` w/ safer imports.

    Arguments:
        data: Object which implements `__arrow_c_stream__`.
        context: Initialized compliant object.

    Returns:
        A PyArrow Table.
    rÐ   r   N)ÚArrowNamespace)r*  rQ  )Úcontextz@PyArrow>=14.0.0 is required for `from_arrow` for object of type rO  )r	   rÐ   Únarwhals._arrow.namespacer“  r�   r  Ú
_dataframeÚ
from_arrowr¦   rB  rs   ÚModuleNotFoundError)Údatar”  ræ   r“  rQ  rR  rè   s          ry   Ú_into_arrow_tablerš  •  sv   € ô �ÔÛå<à×"Ñ"ˆÙ¬M¸"Ó,=ÀwÔOˆØ�}‰}×'Ñ'¨°bÐ'Ó9×@Ñ@Ð@àPÔQUÐVZÓQ[×QdÑQdÐPgÐghÐiˆÜ! #Ó&Ð&rx   c               ó   — | S )aâ  Visual-only marker for unstable functionality.

    Arguments:
        fn: Function to decorate.

    Returns:
        Decorated function (unchanged).

    Examples:
        >>> from narwhals.utils import unstable
        >>> @unstable
        ... def a_work_in_progress_feature(*args):
        ...     return args
        >>>
        >>> a_work_in_progress_feature.__name__
        'a_work_in_progress_feature'
        >>> a_work_in_progress_feature(1, 2, 3)
        (1, 2, 3)
    rw   )r  s    ry   Úunstablerœ  ®  s	   € ð( €Irx   )r  é   ©Ú
deprecatedc               ó   — dd„}|S )Nc               ó   — | S r}   rw   )Úfuncs    ry   r  zdeprecated.<locals>.wrapperÑ  s   € ØˆKrx   )r¢  ri   rƒ   ri   rw   )r  r  s     ry   rŸ  rŸ  Ð  s   € ó	ð ˆrx   c                  óZ   — e Zd ZdZd	d
d„Zdd„Zdd„Z	 d		 	 	 	 	 dd„Zdd„Ze	dd„«       Z
y)Únot_implementeda½  Mark some functionality as unsupported.

    Arguments:
        alias: optional name used instead of the data model hook [`__set_name__`].

    Returns:
        An exception-raising [descriptor].

    Notes:
        - Attribute/method name *doesn't* need to be declared twice
        - Allows different behavior when looked up on the class vs instance
        - Allows us to use `isinstance(...)` instead of monkeypatching an attribute to the function

    Examples:
        >>> from narwhals.utils import not_implemented
        >>> class Thing:
        ...     def totally_ready(self) -> str:
        ...         return "I'm ready!"
        ...
        ...     not_ready_yet = not_implemented()
        >>>
        >>> thing = Thing()
        >>> thing.totally_ready()
        "I'm ready!"
        >>> thing.not_ready_yet()
        Traceback (most recent call last):
            ...
        NotImplementedError: 'not_ready_yet' is not implemented for: 'Thing'.
        ...
        >>> isinstance(Thing.not_ready_yet, not_implemented)
        True

    [`__set_name__`]: https://docs.python.org/3/reference/datamodel.html#object.__set_name__
    [descriptor]: https://docs.python.org/3/howto/descriptor.html
    Nc               ó   — || _         y r}   )r  )r~   Úaliass     ry   Ú__init__znot_implemented.__init__ü  s   € ð #(ˆ�rx   c                óf   — dt        | «      j                  › d| j                  › d| j                  › �S )Nú<z>: rO  )rB  rs   Ú_name_ownerÚ_namer™   s    ry   Ú__repr__znot_implemented.__repr__  s1   € Ø”4˜“:×&Ñ&Ð' s¨4×+;Ñ+;Ð*<¸A¸d¿j¹j¸\ÐJÐJrx   c                óP   — |j                   | _        | j                  xs || _        y r}   )rs   rª  r  r«  )r~   r€   Únames      ry   Ú__set_name__znot_implemented.__set_name__  s   € à %§¡ˆÔØŸ+™+Ò-¨ˆ�
rx   c               ód   — |€| S t        |d| j                  «      }t        | j                  |«      ‚)Nr‡   )rw  rª  Ú_not_implemented_errorr«  )r~   r   r€   Úwhos       ry   r�   znot_implemented.__get__	  s9   € ð Ðð ˆKô �hÐ 1°4×3CÑ3CÓDˆÜ$ T§Z¡Z°Ó5Ð5rx   c                ó$   — | j                  d«      S )NÚraise)r�   )r~   r:  r  s      ry   Ú__call__znot_implemented.__call__  s   € ð �|‰|˜GÓ$Ð$rx   c               ó2   —  | «       } t        |«      |«      S )a  Alt constructor, wraps with `@deprecated`.

        Arguments:
            message: **Static-only** deprecation message, emitted in an IDE.

        Returns:
            An exception-raising [descriptor].

        [descriptor]: https://docs.python.org/3/howto/descriptor.html
        rž  )rÈ   r  r‚  s      ry   rŸ  znot_implemented.deprecated  s   € ñ ‹eˆØ"Œz˜'Ó" 3Ó'Ð'rx   r}   )r¦  z
str | Nonerƒ   rt  )rƒ   rp   )r€   útype[_T]r®  rp   rƒ   rt  )r   z_T | Literal['raise'] | Noner€   ztype[_T] | Nonerƒ   r   )r:  r   r  r   rƒ   r   )r  r9   rƒ   r;   )rs   rt   ru   r“   r§  r¬  r¯  r�   rµ  r  rŸ  rw   rx   ry   r¤  r¤  ×  sU   „ ñ"ôH(ó
Kó.ð PTð6Ø4ð6Ø=Lð6à	ó6ó%ð
 ò(ó ñ(rx   r¤  c               ó(   — | ›d|›d�}t        |«      S )Nz is not implemented for: z†.

If you would like to see this functionality in `narwhals`, please open an issue at: https://github.com/narwhals-dev/narwhals/issues)ÚNotImplementedError)Úwhatr²  rè   s      ry   r±  r±  +  s,   € àˆ(Ð+¨C¨7ð 3Sð 	Sð ô
 ˜sÓ#Ð#rx   c                  ó\   — e Zd ZU dZded<   ded<   eddd„«       Zedd„«       Zdd„Z	dd	„Z
y
)Úrequiresa"  Method decorator for raising under certain constraints.

    Attributes:
        _min_version: Minimum backend version.
        _hint: Optional suggested alternative.

    Examples:
        >>> from narwhals.utils import requires, Implementation
        >>> class SomeBackend:
        ...     _implementation = Implementation.PYARROW
        ...     _backend_version = 20, 0, 0
        ...
        ...     @requires.backend_version((9000, 0, 0))
        ...     def really_complex_feature(self) -> str:
        ...         return "hello"
        >>> backend = SomeBackend()
        >>> backend.really_complex_feature()
        Traceback (most recent call last):
            ...
        NotImplementedError: `really_complex_feature` is only available in PyArrow>='9000.0.0', found version '20.0.0'.
    rŠ   Ú_min_versionrp   Ú_hintc               óD   — | j                  | «      }||_        ||_        |S )zûMethod decorator for raising below a minimum `_backend_version`.

        Arguments:
            minimum: Minimum backend version.
            hint: Optional suggested alternative.

        Returns:
            An exception-raising decorator.
        )Ú__new__r½  r¾  )rÈ   ÚminimumÚhintr‚  s       ry   r*  zrequires.backend_versionN  s&   € ð �k‰k˜#ÓˆØ"ˆÔØˆŒ	Øˆ
rx   c               ó2   — dj                  d„ | D «       «      S )NrO  c              3  ó"   K  — | ]  }|› –— Œ	 y ­wr}   rw   )rL  Úds     ry   rN  z,requires._unparse_version.<locals>.<genexpr>`  s   è ø€ Ò8 1˜1˜#›Ñ8ùs   ‚)rK  )r*  s    ry   Ú_unparse_versionzrequires._unparse_version^  s   € à�x‰xÑ8¨Ô8Ó8Ð8rx   c          	     óT  — |j                   | j                  k\  ry | j                  }|j                  j                  }| j                  | j                  «      }| j                  |j                   «      }d|› d|› d|›d|›d�	}| j                  r|› d| j                  › �}t        |«      ‚)Nú`z` is only available in z>=z, found version rO  ú
)r‹   r½  Ú_wrapped_namer‡   r  rÆ  r¾  r¹  )r~   r   ÚmethodrÜ   rÁ  Úfoundrè   s          ry   Ú_ensure_versionzrequires._ensure_versionb  s¬   € Ø×$Ñ$¨×(9Ñ(9Ò9ØØ×#Ñ#ˆØ×*Ñ*×1Ñ1ˆØ×'Ñ'¨×(9Ñ(9Ó:ˆØ×%Ñ% h×&?Ñ&?Ó@ˆØ�&�Ð0°°	¸¸G¸;ÐFVÐW\ÐV_Ð_`ÐaˆØ�:Š:Ø�E˜˜DŸJ™J˜<Ð(ˆCÜ! #Ó&Ð&rx   c               óV   ‡ ‡— ‰j                   ‰ _        t        ‰«      dˆˆ fd„«       }|S )Nc                ó>   •— ‰j                  | «        ‰| g|¢­i |¤ŽS r}   )rÍ  )r   r:  r  r  r~   s      €€ry   r  z"requires.__call__.<locals>.wrapperq  s&   ø€ à× Ñ  Ô*Ù�hÐ. Ò.¨Ñ.Ð.rx   )r   r    r:  r  r  r  rƒ   rk   )rs   rÊ  r   )r~   r  r  s   `` ry   rµ  zrequires.__call__n  s,   ù€ ØŸ[™[ˆÔä	ˆr‹õ	/ó 
ð	/ð
 ˆrx   N)rG  )rÂ  rp   rÁ  rŠ   rƒ   r;   )r*  rŠ   rƒ   rp   )r   r•   rƒ   rt  )r  ú_Method[_ContextT, P, R]rƒ   rÐ  )rs   rt   ru   r“   rv   r  r*  ÚstaticmethodrÆ  rÍ  rµ  rw   rx   ry   r¼  r¼  4  sD   … ñð, "Ó!ØƒJàóó ðð ò9ó ð9ó
'ô	rx   r¼  c                óÎ   — | j                   �|j                  | j                   «      nd }| j                  �|j                  | j                  «      dz   nd }| j                  }|||fS )Nr#  )rš  rp  r›  rœ  )Ú	str_slicerš   rš  r›  rœ  s        ry   Úconvert_str_slice_to_int_slicerÔ  z  sZ   € ð /8¯o©oÐ.IˆG�M‰M˜)Ÿ/™/Ô*Èt€EØ09·±Ð0Jˆ7�=‰=˜Ÿ™Ó(¨1Ò,ÐPT€DØ�>‰>€DØ�4˜ÐÐrx   c               ó   ‡ — dˆ fd„}|S )zÍSteal the class-level docstring from parent and attach to child `__init__`.

    Returns:
        Decorated constructor.

    Notes:
        - Passes static typing (mostly)
        - Passes at runtime
    c               óÔ   •— | j                   dk(  r+t        t        ‰«      t        «      rt        ‰«      | _        | S dt
        j                   › d| j                  ›d‰›�}t        |«      ‚)Nr§  z`@zL` is only allowed to decorate an `__init__` with a class-level doc.
Method: z	
Parent: )rs   r`  rB  r   r“   Úinherit_docru   rC  )Ú
init_childrè   Ú	tp_parents     €ry   r  zinherit_doc.<locals>.decorate�  sr   ø€ Ø×Ñ *Ò,´¼DÀ»OÌTÔ1RÜ!'¨	Ó!2ˆJÔØÐð ”[×)Ñ)Ð*ð +Ø%×2Ñ2Ð5ð 6Ø$˜-ð)ð ô
 ˜C“.Ð rx   )rØ  ú_Constructor[_T, P, R2]rƒ   rÚ  rw   )rÙ  r  s   ` ry   r×  r×  ƒ  s   ø€ õ
!ð €Orx   )r)  r†   r*  rŠ   rƒ   rt  )r0  rp   r1  rp   rƒ   rp   )r0  rp   r5  rp   rƒ   rp   )r:  r   rƒ   z	list[Any])r>  r   rƒ   r   )r>  zAny | Iterable[Any]rƒ   r  )rQ  z#str | ModuleType | _SupportsVersionrƒ   rŠ   )rU  rB  rV  r·  rƒ   zTypeIs[type[_T]])rU  úobject | typerV  r·  rƒ   zTypeIs[_T | type[_T]])rU  rB  rV  útuple[type[_T1], type[_T2]]rƒ   zTypeIs[type[_T1 | _T2]])rU  rÛ  rV  rÜ  rƒ   z#TypeIs[_T1 | _T2 | type[_T1 | _T2]])rU  rB  rV  ú&tuple[type[_T1], type[_T2], type[_T3]]rƒ   zTypeIs[type[_T1 | _T2 | _T3]])rU  rÛ  rV  rÝ  rƒ   z/TypeIs[_T1 | _T2 | _T3 | type[_T1 | _T2 | _T3]])rU  r   rV  ztuple[type, ...]rƒ   zTypeIs[Any])rU  r   rV  r   rƒ   r  )ri  zIterable[Any]rƒ   rt  )r{  rc   r|  z-Series[Any] | DataFrame[Any] | LazyFrame[Any]rƒ   rc   )r‚  z-DataFrame[Any] | LazyFrame[Any] | Series[Any]rƒ   r‚   r}   )r‚  rc   r‹  zstr | list[str] | Nonerp  z6Series[IntoSeriesT] | list[Series[IntoSeriesT]] | Nonerƒ   rc   )r‚  rc   rƒ   rc   )r‚  r   rÉ   r   rƒ   zTypeIs[pd.RangeIndex])r�  zpd.Series[Any] | pd.DataFramerÉ   r   rƒ   r  )r‚  rc   r:  r  r   z
bool | strrƒ   rc   )r¬  rI  r­  r\   rƒ   zint | float)r¼  zSeries[Any]rƒ   r  )rÂ  rI  rš   r›   rƒ   rp   )rÐ  r   rš   zIterable[str]rÑ  r  rƒ   z	list[str])r×  úSequence[_T] | Anyrƒ   úTypeIs[Sequence[_T]])r‚  r   rƒ   zTypeIs[_SliceNone])r‚  r   rƒ   zCTypeIs[SizedMultiIndexSelector[Series[Any] | CompliantSeries[Any]]])r‚  rÞ  rƒ   z-TypeIs[Sequence[_T] | Series[Any] | _1DArray])r‚  r   rƒ   zTypeIs[_SliceIndex])r‚  r   rƒ   zTypeIs[range])r‚  r   rƒ   zTypeIs[SingleIndexSelector])r‚  r   rƒ   zTTypeIs[SingleIndexSelector | MultiIndexSelector[Series[Any] | CompliantSeries[Any]]])r‚  r   rí  r·  rƒ   zTypeIs[list[_T]])r‚  r   rí  r·  rƒ   rß  )rƒ   rI  )r  rp   r�   rp   rƒ   rt  )
rÑ  úbool | Noner‡  rà  r  r  r  r  rƒ   r  )r  rp   r  r  rƒ   z*Callable[[Callable[P, R]], Callable[P, R]])r  rI  r   z
int | Nonerƒ   ztuple[int, int])r4  rp   r5  rp   rƒ   rp   )rš   r›   rC  zSequence[str] | Nonerƒ   rt  )rš   r›   rƒ   rt  )rT  z$TimeUnit | Iterable[TimeUnit] | NonerU  z7str | timezone | Iterable[str | timezone | None] | Nonerƒ   z%tuple[Set[TimeUnit], Set[str | None]])
rµ  rP   r´   rW   rV  zSet[TimeUnit]rX  zSet[str | None]rƒ   r  )r  r—   rƒ   r›   )r  r—   rb  zContainer[str]rƒ   r›   )rb  r›   rƒ   zEvalNames[Any])r‚  r   rk  rp   rƒ   r  )r‚  zKCompliantDataFrame[CompliantSeriesT, CompliantExprT, NativeFrameT_co] | Anyrƒ   zMTypeIs[CompliantDataFrame[CompliantSeriesT, CompliantExprT, NativeFrameT_co]])r‚  z9CompliantLazyFrame[CompliantExprT, NativeFrameT_co] | Anyrƒ   z;TypeIs[CompliantLazyFrame[CompliantExprT, NativeFrameT_co]])r‚  z'CompliantSeries[NativeSeriesT_co] | Anyrƒ   z)TypeIs[CompliantSeries[NativeSeriesT_co]])r‚  zECompliantExpr[CompliantFrameT, CompliantSeriesOrNativeExprT_co] | Anyrƒ   zGTypeIs[CompliantExpr[CompliantFrameT, CompliantSeriesOrNativeExprT_co]])r‚  r†   rƒ   z"TypeIs[EagerAllowedImplementation])r‚  r   rƒ   zTypeIs[SupportsNativeNamespace])r‚  r   rƒ   zTypeIs[DataFrameLike])r‚  r   rƒ   zTypeIs[ArrowStreamExportable])rŒ  r›   r�  r›   r5  rp   rƒ   zdict[str, str])r™  rJ   r”  r•   rƒ   zpa.Table)r  ri   rƒ   ri   )r  rp   rƒ   zCallable[[_Fn], _Fn])rº  rp   r²  rp   rƒ   r¹  )rÓ  ra   rš   r›   rƒ   z"tuple[int | None, int | None, Any])rÙ  zCallable[P, R1]rƒ   z<Callable[[_Constructor[_T, P, R2]], _Constructor[_T, P, R2]])ßÚ
__future__r   r-  rJ  Údatetimer   Úenumr   r   Ú	functoolsr   Úimportlib.utilr	   r÷  r
   r   Úsecretsr   Útypingr   r   r   r   r   r   r   r   r   r   r   r   Úwarningsr   Únarwhals.dependenciesr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Únarwhals.exceptionsr3   r4   r5   Útypesr6   r7   ÚSetrÍ   rå   rÐ   ræ   Útyping_extensionsr8   r9   r:   r;   r<   r=   Únarwhals._compliantr>   r?   r@   rA   rB   rC   rD   Únarwhals._compliant.typingrE   r°   rF   rH   Únarwhals._translaterI   rJ   rg  rL   rN   r_  rP   rA  rR   Únarwhals.typingrS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   re   rf   rg   rh   ri   rj   rk   rl   rm   ro   r{   r…   r‰   r�   r‘   r•   r—   r�   rŸ   r    r¡   rv   r¢   r¤   rª   rŽ   r†   r»   r¼   r½   r¾   r¿   rÅ   rÀ   rÁ   rÂ   rÃ   rÄ   r&  r,  r2  r6  r;  r?  r9  r  rW  rj  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?  rE  rN  rY  r]  r`  rd  rh  rm  rq  ru  rá  rÞ  r~  r€  r‚  r…  rˆ  r‘  rš  rœ  ÚsysÚversion_inforŸ  r¤  r±  r¼  rÔ  r×  rw   rx   ry   ú<module>rô     s  ðÞ "ã 	Û 	Ý Ý Ý Ý Ý $Ý "Ý Ý Ý  Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý å *Ý *Ý 4Ý ,Ý *Ý +Ý ,Ý ,Ý -Ý -Ý 5Ý 1Ý .Ý 0Ý 1Ý 4Ý 8Ý 3Ý 7Ý 5Ý :Ý 7Ý 2Ý 2Ý :Ý 3Ý .Ý 5âÝ Ý)ãÛÝ-Ý/Ý+Ý&Ý+Ý(å1Ý2Ý3ÝCÝ4Ý3Ý4Ý4Ý>Ý-Ý9Ý2Ý,Ý,Ý%Ý&Ý2Ý2Ý/Ý-Ý&Ý+Ý2Ý3Ý7Ý(Ý7Ý(Ý(Ý+Ý*Ý*áØ  i°¡n°iÀ±nÀfÈSÁkÐ&QÑ Rô€Nñ 
�‹€BÙ
�%‹.€CÙ
�%‹.€CÙ
�%‹.€CÙ
�%Ð3Ô
4€CÙ�#‹€AÙ�‹€AÙ	�‹€BÙ	�‹€Bô˜8ô ôR�xô RôN ô Nô2 ô 2ô1˜ô 1ôÐ/°Àô ôÐ,¨o¸xô ô0˜ô 0ñ
 �\¨TÔ2€
Ù˜°4Ô8€Ù�K ~Ô6€	Ø=€ˆÓ =Ø<€ˆiÓ <ô�H˜ZÑ(ô ô�x Ñ.ô ôˆdô ô2\+�Tô \+ð@ ×Ò˜:Ø×Ò˜*Ø×Ò˜Ø×Ò˜EØ×Ò˜FØ×"Ò" FØ×Ò˜:Ø×Ò˜Ø×Ò˜4Ø×Ò˜Ø×Ò˜Zð7€Ð3ó ðØ"ðØ5Dðà	óóóóQóóSó(Lð" 
ðØðØ$,ðàòó 
ðð
 
ð Øð Ø-5ð àò ó 
ð ð
 
ð"Øð"Ø$?ð"àò"ó 
ð"ð
 
ð.Øð.Ø-Hð.à(ò.ó 
ð.ð
 
ð(Øð(Ø$Jð(à"ò(ó 
ð(ð
 
ð:Øð:Ø-Sð:à4ò:ó 
ð:ð
 
ðØðØ#3ðàòó 
ðó
ó	ð\Ø	ð\ØKð\àó\ó~!ðL ,0ðXð EIñ	XØ	ðXà(ðXð Bð	Xð
 óXóv/ód8ð
	Ø9ð	ØMPð	à	ó	ð2Ø	ð2Ø $ð2Ø0:ð2àó2ójó2DðNLØðLØ(ðLàóLó"&ðJØðàðð ðð ó	ó$Lô9ðØ	ðàHôðØ	ðà2ôôô"ôDðØ	ðàYôôJô
ô'ôTUðØðàðð ð	ð
 #ðð 
ôð6 °ñ&Øð&Ø)-ð&à/ô&ðR!$Øð!$Ø#-ð!$àô!$ôHô<'ô	"ð"Ø3ð"àFð"ð +ô"ð*
Øð
Ø ð
Ø.;ð
ØIXð
à	ô
ôôMôô?ð
:Ø	Tð:àRô:ð:Ø	Bð:à@ô:ð7Ø	0ð7à.ô7ð?Ø	0ð?à.ô?ð-Ø	Nð-àLô-ôô0ô)ô6ð4Øð4Ø&3ð4Ø=@ð4àô4ô,'ô2ñ. Ûà
×Ò˜7Ò"ö 	6æ>ô÷Q(ñ Q(ôh$÷Cñ CðLØðØ$1ðà'ôðØðàAõrx   