§
    }ŠtjöM  ã                   ó4  — U d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZ d	d
lmZ d	dlmZ d	dlmZmZ dZdZdededdfd„Zda e
¦   «         Zda edz  e!d<    ej"        e#¦  «        Z$dedz  fd„Z%dedz  fd„Z&dedz  fd„Z'dedz  fd„Z( G d„ de¦  «        Z) e
¦   «         Z*da+e)dz  e!d<   dZ,dedz  fd„Z- G d„ de¦  «        Z. e
¦   «         Z/da0e.dz  e!d <   d!Z1dZ2da3dedz  fd"„Z4d#edefd$„Z5d%eddfd&„Z6d'e7eef         de8dz  fd(„Z9de7eef         fd)„Z:de7ee7eef         f         fd*„Z;d+e7ee7eef         f         ddfd,„Z<d-ededz  fd.„Z=ddd/œd#ed-ed0edz  d1e8dz  ddf
d2„Z>d#edz  dedz  fd3„Z?dS )4zVContains a helper to get the token from machine (env variable, secret or config file).é    N)ÚPath)ÚLock)Ú	TypedDicté   )Ú	constants)ÚDeviceCodeErrorÚOAuthErrorCodeÚ	OIDCErroré   )ÚWeakFileLock)Úrefresh_access_token)Úis_colab_enterpriseÚis_google_colabi€  iÀ  ÚpathÚcontentÚreturnc                 ó
  — | j                              ddt          ¬¦  «         t          j        t          | ¦  «        t          j        t          j        z  t          j        z  t          ¦  «        }t          j
        |d¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   	 |                      t          ¦  «         | j                              t          ¦  «         dS # t          t          f$ r Y dS w xY w)ziWrite content to file, restricting both the file and its parent directory to owner-only on POSIX systems.T)ÚparentsÚexist_okÚmodeÚwN)ÚparentÚmkdirÚ_SECRET_DIR_MODEÚosÚopenÚstrÚO_WRONLYÚO_CREATÚO_TRUNCÚ_SECRET_FILE_MODEÚfdopenÚwriteÚchmodÚOSErrorÚNotImplementedError)r   r   ÚfdÚfs       úY/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/huggingface_hub/utils/_auth.pyÚ_write_secretr*   %   s  € à„K×Ò˜d¨TÕ8HÐÑIÔIÐIÝ	Œ•�T‘”�BœK­"¬*Ñ4µr´zÑAÕCTÑ	UÔ	U€BÝ	Œ�2�sÑ	Ô	ð ˜qØ	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðØ�
Š
Õ$Ñ%Ô%Ð%ØŒ×ÒÕ*Ñ+Ô+Ð+Ð+Ð+øÝÕ(Ð)ð ð ð àˆˆðøøøs$   ÂB&Â&B*Â-B*Â29C- Ã-DÄDFÚ_GOOGLE_COLAB_SECRETc                  ór   — t          ¦   «         p)t          ¦   «         pt          ¦   «         pt          ¦   «         S )a]  
    Get token if user is logged in.

    Note: in most cases, you should use [`huggingface_hub.utils.build_hf_headers`] instead. This method is only useful
          if you want to retrieve the token for other purposes than sending an HTTP request.

    If `HF_OIDC_RESOURCE` is set (Trusted Publishers, typically in CI), a short-lived token obtained via OIDC token
    exchange takes precedence. Otherwise the token is retrieved from the `HF_TOKEN` environment variable, then from the
    token file in the Hugging Face home folder. Returns None if user is not logged in. To log in, use [`login`] or
    `hf auth login`.

    OAuth tokens obtained with the browser-based login come with a refresh token: when such a token is close to
    expiry, it is transparently refreshed and persisted before being returned.

    Note: if `HF_OIDC_RESOURCE` is set but the OIDC token exchange fails, this raises instead of returning `None`,
    opting into OIDC is explicit, so a failure surfaces as a clear error rather than a silent fallback.

    Returns:
        `str` or `None`: The token, `None` if it doesn't exist.
    )Ú_get_token_from_oidcÚ_get_token_from_environmentÚ_get_token_from_file_refreshedÚ_get_token_from_google_colab© ó    r)   Ú	get_tokenr3   :   s>   € õ, 	ÑÔð 	*Ý&Ñ(Ô(ð	*å)Ñ+Ô+ð	*õ (Ñ)Ô)ð	r2   c                  óh  — t          ¦   «         rt          ¦   «         rdS t          5  t          rt          cddd¦  «         S 	 ddlm}  ddlm} n# t          $ r Y ddd¦  «         dS w xY w	 |  
                    d¦  «        }t          |¦  «        an�# | j        $ r t          j        d¦  «         daY n_| j        $ r t                                d¦  «         daY n8|$ r1}t          j        dt%          |¦  «        › d	�¦  «         daY d}~nd}~ww xY wd
at          cddd¦  «         S # 1 swxY w Y   dS )zãGet token from Google Colab secrets vault using `google.colab.userdata.get(...)`.

    Token is read from the vault only once per session and then stored in a global variable to avoid re-requesting
    access to the vault.
    Nr   )Úuserdata)ÚErrorÚHF_TOKENz¥
Access to the secret `HF_TOKEN` has not been granted on this notebook.
You will not be requested again.
Please restart the session if you want to be prompted again.z¯The secret `HF_TOKEN` does not exist in your Colab secrets. Run `huggingface_hub.login()` to authenticate (recommended but still optional to access public models or datasets).z@
Error while fetching `HF_TOKEN` secret value from your vault: 'z'.T)r   r   Ú_GOOGLE_COLAB_SECRET_LOCKÚ_IS_GOOGLE_COLAB_CHECKEDr+   Úgoogle.colabr5   Úgoogle.colab.errorsr6   ÚImportErrorÚgetÚ_clean_tokenÚNotebookAccessErrorÚwarningsÚwarnÚSecretNotFoundErrorÚloggerÚinfor   )r5   Ú
ColabErrorÚtokenÚes       r)   r0   r0   W   sE  € õ ÑÔð Õ 3Ñ 5Ô 5ð Øˆtõ 
#ð ($ð ($õ $ð 	(Ý'ð($ð ($ð ($ð ($ñ ($ô ($ð ($ð ($ð	Ø-Ð-Ð-Ð-Ð-Ð-Ø?Ð?Ð?Ð?Ð?Ð?Ð?øÝð 	ð 	ð 	Øð($ð ($ð ($ñ ($ô ($ð ($ð ($ð ($ð	øøøð	(Ø—L’L Ñ,Ô,ˆEÝ#/°Ñ#6Ô#6Ð Ð øØÔ+ð 	(ð 	(ð 	(õ ŒMðQñô ð ð
 $(Ð Ð Ð ØÔ+ð 	(ð 	(ð 	(õ �KŠKðfñô ð ð $(Ð Ð Ð Øð 	(ð 	(ð 	(åŒMÐhÕ^aÐbcÑ^dÔ^dÐhÐhÐhÑiÔiÐiØ#'Ð Ð Ð Ð Ð Ð øøøøð	(øøøð
 $(Ð Ý#ðQ($ð ($ð ($ð ($ñ ($ô ($ð ($ð ($ð ($ð ($ð ($ð ($øøøð ($ð ($ð ($ð ($ð ($ð ($sw   ¦D'ÁAÁD'Á
A(ÁD'Á'A(Á(D'Á,$BÂD'Â DÂ1D'Â3%DÃD'ÃDÃ'D
ÄD'Ä
DÄD'Ä'D+Ä.D+c                  ó˜   — t          t          j                             d¦  «        pt          j                             d¦  «        ¦  «        S )Nr7   ÚHUGGING_FACE_HUB_TOKEN)r>   r   Úenvironr=   r1   r2   r)   r.   r.   ‘   s2   € å�œ
Ÿš zÑ2Ô2Ð^µb´j·n²nÐE]Ñ6^Ô6^Ñ_Ô_Ð_r2   c                  ó–   — 	 t          t          t          j        ¦  «                             ¦   «         ¦  «        S # t
          $ r Y d S w xY w)N)r>   r   r   ÚHF_TOKEN_PATHÚ	read_textÚFileNotFoundErrorr1   r2   r)   Ú_get_token_from_filerO   –   sN   € ðÝ�D¥Ô!8Ñ9Ô9×CÒCÑEÔEÑFÔFÐFøÝð ð ð Øˆtˆtðøøøs   ‚7: º
AÁAc                   ó.   — e Zd ZU eed<   eed<   eed<   dS )Ú_OidcTokenCacheÚresourcerF   Ú
expires_atN©Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__Úfloatr1   r2   r)   rQ   rQ   �   s0   € € € € € € Ø€M€M�MØ€J€J�JØÐÐÑÐÐr2   rQ   Ú_OIDC_TOKEN_CACHEi,  c                  óz  — t           j                             d¦  «        } | sdS ddlm}m} t          5  t          j        ¦   «         }t          �;t          d         | k    r*|t          d         k     rt          d         cddd¦  «         S t           j                             d¦  «        pd}|€ |¦   «         €t          d	¦  «        ‚ || |¬
¦  «        }|d         }t          |                     dd¦  «        ¦  «        }|�dnt          }| ||t          ||z
  d¦  «        z   dœa	|cddd¦  «         S # 1 swxY w Y   dS )aë  Get a short-lived OIDC token in CI (Trusted Publishers).

    Enabled by setting `HF_OIDC_RESOURCE`, which scopes the token to a repo or user.
    The ID token is read from `HF_OIDC_ID_TOKEN` if available, or minted from a supported CI provider (e.g. GitHub Actions).

    Returns `None` when OIDC is not enabled.
    If enabled, any failure is raised explicitly rather than falling back silently.

    See `huggingface_hub._oidc` and https://huggingface.co/docs/hub/trusted-publishers.
    ÚHF_OIDC_RESOURCENr   )Údetect_providerÚ
oidc_loginrR   rS   rF   ÚHF_OIDC_ID_TOKENzçHF_OIDC_RESOURCE is set but no OIDC id token is available: not running in a supported CI provider (github) and HF_OIDC_ID_TOKEN is not set. Set HF_OIDC_ID_TOKEN to the id token minted by your CI provider, or unset HF_OIDC_RESOURCE.)rR   Úsubject_tokenÚaccess_tokenÚ
expires_ini  r   )rR   rF   rS   )r   rJ   r=   Ú_oidcr]   r^   Ú_OIDC_TOKEN_LOCKÚtimeÚ	monotonicrZ   r
   ÚintÚ_OIDC_REFRESH_MARGINÚmax)	rR   r]   r^   Únowr`   ÚresultrF   rb   Úmargins	            r)   r-   r-   ª   sÎ  € õ Œz�~Š~Ð0Ñ1Ô1€HØð Øˆtà3Ð3Ð3Ð3Ð3Ð3Ð3Ð3õ 
ð ð ÝŒnÑÔˆåÐ)Ý! *Ô-°Ò9Ð9ØÕ'¨Ô5Ò5Ð5å$ WÔ-ðð ð ð ñ ô ð ð õ œ
ŸšÐ'9Ñ:Ô:ÐB¸dˆØÐ  _ _Ñ%6Ô%6Ð%>ÝðOñô ð ð � X¸]ÐKÑKÔKˆØ�~Ô&ˆÝ˜Ÿš L°$Ñ7Ô7Ñ8Ô8ˆ
ð $Ð/��Õ5Iˆà ØØ¥ J°Ñ$7¸Ñ ;Ô ;Ñ;ð
ð 
Ðð
 ð=ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ³A	D0Â	BD0Ä0D4Ä7D4c                   ó.   — e Zd ZU eed<   eed<   eed<   dS )Ú_OAuthRefreshCacheÚ
file_tokenÚresolved_tokenÚ
recheck_atNrT   r1   r2   r)   rn   rn   Ý   s3   € € € € € € Ø€O€O�OØÐÐÑØÐÐÑÐÐr2   rn   Ú_OAUTH_REFRESH_CACHEi€Q c                  óD   — t          ¦   «         } | €dS t          | ¦  «        S )zSGet the token from `HF_TOKEN_PATH`, transparently refreshing it if close to expiry.N)rO   Ú_refresh_oauth_token_if_needed©rF   s    r)   r/   r/   ì   s%   € å Ñ"Ô"€EØ€}ØˆtÝ)¨%Ñ0Ô0Ð0r2   rF   c           	      óÆ  ‡ — t           5  t          j        ¦   «         }t          }|�,|d         ‰ k    r ||d         k     r|d         cddd¦  «         S t          ˆ fd„t	          ¦   «                              ¦   «         D ¦   «         di f¦  «        \  }}|                     d¦  «        }t          |¦  «        }|�|�|€@t          ¦   «         }|�|‰ k    r|cddd¦  «         S ‰ ‰ |t          z   dœa‰ cddd¦  «         S |t          z
  |k    r‰ ‰ |t          z
  dœa‰ cddd¦  «         S 	 t          t          j        dz   d	¬
¦  «        5  t	          ¦   «                              |i ¦  «        }|                     d¦  «        ‰ k    r'|                     d¦  «        p‰ }t          |¦  «        }	nÁt          |¦  «        }
|
d         }d|
v r%t          |¦  «        t          |
d         ¦  «        z   nd}	t!          |||
                     d¦  «        p||	¬¦  «         t          ¦   «         ‰ k    r't#          t%          t          j        ¦  «        |¦  «         t(                               d|› d�¦  «         ddd¦  «         n# 1 swxY w Y   n # t,          $ r“}t/          |t0          ¦  «        rC|j        t4          j        k    r.t(                               d|› d�¦  «         t;          d¦  «        }nt=          d|› d�¦  «         |t          z   }‰ ‰ |dœa‰ cY d}~cddd¦  «         S d}~ww xY w||t?          |t          z   |	r
|	t          z
  nd¦  «        dœa|cddd¦  «         S # 1 swxY w Y   dS )a“  Refresh an OAuth access token if it is close to expiry. Best-effort: never raises.

    OAuth tokens obtained with the browser-based login are stored with a `refresh_token` and an
    `expires_at` timestamp (see `_save_token`). When the active token is one of them and about to
    expire, exchange the refresh token for a new access token and persist it. Any other token is
    returned unchanged.
    Nro   rq   rp   c              3   óX   •K  — | ]$\  }}|                      d ¦  «        ‰k    ¯||fV — Œ%dS )Úhf_tokenN©r=   )Ú.0ÚnameÚfieldsrF   s      €r)   ú	<genexpr>z1_refresh_oauth_token_if_needed.<locals>.<genexpr>  sF   øè è € ÐvÐv¡  fÐV\×V`ÒV`ÐakÑVlÔVlÐpuÒVuÐVuˆd�Fˆ^ÐVuÐVuÐVuÐVuÐvÐvr2   Úrefresh_token)ro   rp   rq   z.locké   )Útimeoutrx   ra   rb   )rF   Ú
token_namer~   rS   zAccess token `z` has been refreshed.z�Your Hugging Face access token has expired and could not be refreshed (session expired or revoked). Run `hf auth login` to re-authenticate. (ú)Úinfz2Could not refresh your Hugging Face access token: z. Will retry later.r   ) Ú_OAUTH_REFRESH_LOCKre   rr   ÚnextÚ_read_stored_tokens_fullÚitemsr=   Ú_parse_expires_atrO   Ú_OAUTH_RECHECK_INTERVALÚ_OAUTH_REFRESH_MARGINr   r   ÚHF_STORED_TOKENS_PATHr   rg   Ú_save_tokenr*   r   rL   rC   rD   Ú	ExceptionÚ
isinstancer   Ú
error_coder	   ÚINVALID_GRANTÚwarningrY   Ú_warn_refresh_failure_onceri   )rF   rj   Úcacher�   r|   r~   rS   Úcurrent_file_tokenÚ	new_tokenÚnew_expires_atÚresponserG   rq   s   `            r)   rt   rt   ô   sZ  ø€ õ 
ð Wð WÝŒi‰kŒkˆÝ$ˆØÐ  |Ô!4¸Ò!=Ð!=À#ÈÈlÔH[ÒB[ÐB[ØÐ)Ô*ð	Wð Wð Wð Wñ Wô Wð Wð Wõ "ØvÐvÐvÐvÕ0HÑ0JÔ0J×0PÒ0PÑ0RÔ0RÐvÑvÔvØ�2ˆJñ
ô 
Ñˆ
�Fð Ÿ
š
 ?Ñ3Ô3ˆÝ& vÑ.Ô.ˆ
ØÐ Ð!6¸*Ð:Lõ "6Ñ!7Ô!7ÐØ!Ð-Ð2DÈÒ2MÐ2MØ)ð#Wð Wð Wð Wñ Wô Wð Wð Wð( $Ø"'Ø!Õ$;Ñ;ð$ð $Ð ð
 ð1Wð Wð Wð Wñ Wô Wð Wð Wð4 Õ-Ñ-°Ò3Ð3à#Ø"'Ø(Õ+@Ñ@ð$ð $Ð ð
 ðAWð Wð Wð Wñ Wô Wð Wð WðD)	õ �iÔ=ÀÑGÐQSÐTÑTÔTð Tð Tå1Ñ3Ô3×7Ò7¸
ÀBÑGÔG�Ø—:’:˜jÑ)Ô)¨UÒ2Ð2à &§
¢
¨:Ñ 6Ô 6Ð ?¸%�IÝ%6°vÑ%>Ô%>�N�Nå3°MÑBÔB�HØ (¨Ô 8�IØO[Ð_gÐOgÐOg¥S¨¡X¤Xµ°H¸\Ô4JÑ0KÔ0KÑ%KÐ%KÐmq�NÝØ'Ø#-à&.§l¢l°?Ñ&CÔ&CÐ&TÀ}Ø#1ðñ ô ð õ ,Ñ-Ô-°Ò6Ð6Ý%¥d­9Ô+BÑ&CÔ&CÀYÑOÔOÐOÝ—K’KÐ R°Ð RÐ RÐ RÑSÔSÐSð+Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tøøõ, ð 	ð 	ð 	Ý˜!�_Ñ-Ô-ð ;°!´,Å.ÔB^Ò2^Ð2^õ —’ðcØ^_ðcð cð cñô ð õ # 5™\œ\�
�
õ +Ð+vÐ`aÐ+vÐ+vÐ+vÑwÔwÐwØ Õ#:Ñ:�
à27È5Ð`jÐ#kÐ#kÐ ØˆLˆLˆLˆLˆLðWWð Wð Wð Wñ Wô Wð Wð Wøøøøðv	øøøð& $Ø'õ ØÕ-Ñ-Ø:HÐO�Õ!6Ñ6Ð6Èañô ð	 
ð 	 
Ðð ðoWð Wð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð Wð Wsz   ‰<MÁB MÃMÃ;MÄ&J ÅD$I4É(J É4I8	É8J É;I8	É<J É?MÊ 
LÊ
A<LÌLÌMÌLÌ,MÍMÍMÚmessagec                 óP   — t           st                               | ¦  «         da d S d S )NT)Ú_OAUTH_REFRESH_WARNEDrC   r‘   )r˜   s    r)   r’   r’   W  s2   € å ð %Ý�Š�wÑÔÐØ $ÐÐÐð%ð %r2   r|   c                 ó^   — 	 t          | d         ¦  «        S # t          t          f$ r Y dS w xY w)zVParse the `expires_at` field of a stored-tokens section, `None` if missing or corrupt.rS   N)rg   ÚKeyErrorÚ
ValueError)r|   s    r)   rˆ   rˆ   ^  sA   € ðÝ�6˜,Ô'Ñ(Ô(Ð(øÝ•jÐ!ð ð ð Øˆtˆtðøøøs   ‚ —,«,c                  óV   — d„ t          ¦   «                              ¦   «         D ¦   «         S )aA  
    Returns the parsed INI file containing the access tokens.
    The file is located at `HF_STORED_TOKENS_PATH`, defaulting to `~/.cache/huggingface/stored_tokens`.
    If the file does not exist, an empty dictionary is returned.

    Returns: `dict[str, str]`
        Key is the token name and value is the token.
    c                 óB   — i | ]\  }}||                      d d¦  «        “ŒS )rx   Ú ry   )rz   r�   r|   s      r)   ú
<dictcomp>z%get_stored_tokens.<locals>.<dictcomp>o  s-   € ÐpÐpÐpÑ7I°zÀ6ˆJ˜Ÿ
š
 :¨rÑ2Ô2ÐpÐpÐpr2   )r†   r‡   r1   r2   r)   Úget_stored_tokensr¢   f  s,   € ð qÐpÕMeÑMgÔMg×MmÒMmÑMoÔMoÐpÑpÔpÐpr2   c                  ón  ‡— t          t          j        ¦  «        } |                      ¦   «         si S t	          j        d¬¦  «        Š	 ‰                     | ¦  «         ˆfd„‰                     ¦   «         D ¦   «         S # t          j        $ r)}t           
                    d|› �¦  «         i cY d}~S d}~ww xY w)zõRead all sections of the stored tokens INI file, with all their fields.

    Beside `hf_token`, sections for OAuth tokens also carry `refresh_token` and `expires_at`
    (unix timestamp), used by [`get_token`] to transparently refresh them.
    N©Úinterpolationc                 óV   •— i | ]%}|t          ‰                     |¦  «        ¦  «        “Œ&S r1   )Údictr‡   )rz   r�   Úconfigs     €r)   r¡   z,_read_stored_tokens_full.<locals>.<dictcomp>  s/   ø€ Ð_Ð_Ð_¸z�
�D §¢¨jÑ!9Ô!9Ñ:Ô:Ð_Ð_Ð_r2   z"Error parsing stored tokens file: )r   r   r‹   ÚexistsÚconfigparserÚConfigParserÚreadÚsectionsr6   rC   Úerror)Útokens_pathrG   r¨   s     @r)   r†   r†   r  sÈ   ø€ õ •yÔ6Ñ7Ô7€KØ×ÒÑÔð Øˆ	åÔ&°TÐ:Ñ:Ô:€FðØ�Š�KÑ Ô Ð Ø_Ð_Ð_Ð_ÈVÏ_Ê_ÑM^ÔM^Ð_Ñ_Ô_Ð_øÝÔð ð ð Ý�ŠÐ=¸!Ð=Ð=Ñ>Ô>Ð>Øˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   Á4A< Á<B4ÂB/Â)B4Â/B4Ústored_tokensc                 óÒ  — t          j        d¬¦  «        }t          |                      ¦   «         ¦  «        D ]N}|                     |¦  «         | |                              ¦   «         D ]\  }}|                     |||¦  «         ŒŒOt          j        ¦   «         }| 	                    |¦  «         t          t          t          j        ¦  «        |                     ¦   «         ¦  «         dS )zBWrite all sections and their fields to the stored tokens INI file.Nr¤   )rª   r«   ÚsortedÚkeysÚadd_sectionr‡   ÚsetÚioÚStringIOr#   r*   r   r   r‹   Úgetvalue)r°   r¨   r�   ÚkeyÚvalueÚbufs         r)   Ú_save_stored_tokens_fullr¼   …  sÖ   € åÔ&°TÐ:Ñ:Ô:€FÝ˜]×/Ò/Ñ1Ô1Ñ2Ô2ð /ð /ˆ
Ø×Ò˜:Ñ&Ô&Ð&Ø'¨
Ô3×9Ò9Ñ;Ô;ð 	/ð 	/‰JˆC�Ø�JŠJ�z 3¨Ñ.Ô.Ð.Ð.ð	/õ Œ+‰-Œ-€CØ
‡L‚L�ÑÔÐÝ•$•yÔ6Ñ7Ô7¸¿º¹¼ÑHÔHÐHÐHÐHr2   r�   c                 óT   — t          ¦   «         }| |vrdS t          ||          ¦  «        S )zÀ
    Get the token by name.

    Args:
        token_name (`str`):
            The name of the token to get.

    Returns:
        `str` or `None`: The token, `None` if it doesn't exist.

    N)r¢   r>   )r�   r°   s     r)   Ú_get_token_by_namer¾   ’  s2   € õ &Ñ'Ô'€MØ˜Ð&Ð&ØˆtÝ˜ jÔ1Ñ2Ô2Ð2r2   )r~   rS   r~   rS   c                óÜ   — t          ¦   «         }d| i}|�||d<   |�t          |¦  «        |d<   |||<   t          |¦  «         t                               d|› dt
          j        › �¦  «         dS )aÂ  
    Save the given token.

    If the stored tokens file does not exist, it will be created.
    Args:
        token (`str`):
            The token to save.
        token_name (`str`):
            The name of the token.
        refresh_token (`str`, *optional*):
            OAuth refresh token used to renew the access token when it expires.
        expires_at (`int`, *optional*):
            Unix timestamp at which the access token expires.
    rx   Nr~   rS   zThe token `z` has been saved to )r†   r   r¼   rC   rD   r   r‹   )rF   r�   r~   rS   r°   r|   s         r)   rŒ   rŒ   ¤  sƒ   € õ" -Ñ.Ô.€MØ˜%Ð €FØÐ Ø"/ˆˆÑØÐÝ" :™œˆˆ|Ñà &€M�*ÑÝ˜]Ñ+Ô+Ð+Ý
‡K‚KÐ_˜jÐ_Ð_½iÔ>]Ð_Ð_Ñ`Ô`Ð`Ð`Ð`r2   c                 ó†   — | €dS |                       dd¦  «                              dd¦  «                             ¦   «         pdS )zuClean token by removing trailing and leading spaces and newlines.

    If token is an empty string, return None.
    Núr    ú
)ÚreplaceÚstripru   s    r)   r>   r>   Á  sC   € ð
 €}ØˆtØ�=Š=˜˜rÑ"Ô"×*Ò*¨4°Ñ4Ô4×:Ò:Ñ<Ô<ÐDÀÐDr2   )@Ú__doc__rª   r¶   Úloggingr   re   r@   Úpathlibr   Ú	threadingr   Útypingr   r    r   Úerrorsr   r	   r
   Ú_fixesr   Ú_oauth_devicer   Ú_runtimer   r   r!   r   r   r*   r9   r8   r+   rX   Ú	getLoggerrU   rC   r3   r0   r.   rO   rQ   rd   rZ   rh   r-   rn   r„   rr   rŠ   r‰   rš   r/   rt   r’   r§   rg   rˆ   r¢   r†   r¼   r¾   rŒ   r>   r1   r2   r)   ú<module>rÏ      s£  ðð ]Ð \Ð \à Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð Ð ØÐ ð˜ð  sð ¨tð ð ð ð ð !Ð Ø ˜D™FœFÐ Ø#'Ð �c˜D‘jÐ 'Ð 'Ñ 'à	ˆÔ	˜8Ñ	$Ô	$€ð�3˜‘:ð ð ð ð ð:7$ c¨D¡jð 7$ð 7$ð 7$ð 7$ðt` S¨4¡Zð `ð `ð `ð `ð
˜c D™jð ð ð ð ðð ð ð ð �iñ ô ð ð �4‘6”6Ð Ø,0Ð �? TÑ)Ð 0Ð 0Ñ 0ØÐ ð0˜c D™jð 0ð 0ð 0ð 0ðfð ð ð ð ˜ñ ô ð ð �d‘f”fÐ Ø26Ð Ð(¨4Ñ/Ð 6Ð 6Ñ 6Ø!Ð ØÐ ØÐ ð1¨¨d©
ð 1ð 1ð 1ð 1ð`¨#ð `°#ð `ð `ð `ð `ðF%¨ð %°ð %ð %ð %ð %ð˜d 3¨ 8œnð °°t±ð ð ð ð ð	q˜4  S œ>ð 	qð 	qð 	qð 	qð $ s¨D°°c°¬NÐ':Ô";ð ð ð ð ð&
I¨D°°d¸3À¸8´nÐ1DÔ,Eð 
IÈ$ð 
Ið 
Ið 
Ið 
Ið3 3ð 3¨3°©:ð 3ð 3ð 3ð 3ð& AEÐ_cðað að aØðaØðaØ36¸±:ðaØRUÐX\ÑR\ðaà	ðað að að að:E˜˜d™
ð E s¨T¡zð Eð Eð Eð Eð Eð Er2   