Ë
    ëÿæiÄH  ã                   ó¶  — 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Zd dlm	Z	 d dl
mZmZ ddlmZ ddlmZ ddlmZmZ  ej(                  e«      Zerd dlZe	 G d„ d	«      «       Ze	 G d
„ d«      «       Ze	 G d„ d«      «       Zeddddefd„«       Zdddedz  fd„Zdddeddfd„Zddddeddfd„Zdddefd„Z ddddedefd„Z!de"fd„Z#ddede$eeef   fd„Z%y)é    N)Ú	dataclass)ÚTYPE_CHECKINGÚLiteralé   )Ú	constants)Úwhoami)ÚexperimentalÚ	get_tokenc                   ó–   — e Zd ZU dZeed<   eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed	<   dZ
eed
      dz  ed<   y)ÚOAuthOrgInfoa!  
    Information about an organization linked to a user logged in with OAuth.

    Attributes:
        sub (`str`):
            Unique identifier for the org. OpenID Connect field.
        name (`str`):
            The org's full name. OpenID Connect field.
        preferred_username (`str`):
            The org's username. OpenID Connect field.
        picture (`str`):
            The org's profile picture URL. OpenID Connect field.
        plan (`str`, *optional*):
            The org's plan (e.g., "enterprise", "team"). Hugging Face field.
        can_pay (`Optional[bool]`, *optional*):
            Whether the org has a payment method set up. Hugging Face field.
        role_in_org (`Optional[str]`, *optional*):
            The user's role in the org. Hugging Face field.
        security_restrictions (`Optional[list[Literal["ip", "token-policy", "mfa", "sso"]]]`, *optional*):
            Array of security restrictions that the user hasn't completed for this org. Possible values: "ip", "token-policy", "mfa", "sso". Hugging Face field.
    ÚsubÚnameÚpreferred_usernameÚpictureNÚplanÚcan_payÚrole_in_org)Úipztoken-policyÚmfaÚssoÚsecurity_restrictions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r   Úboolr   r   Úlistr   © ó    úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/huggingface_hub/_oauth.pyr   r      sc   … ñð, 
ƒHØ
ƒIØÓØƒLØ€Dˆ#�‰*ÓØ€GˆT�D‰[ÓØ"€K��t‘Ó"ØVZÐ˜4 Ð(JÑ KÑLÈtÑSÔZr!   r   c                   ó¤   — e Zd ZU dZeed<   eed<   eed<   edz  ed<   edz  ed<   eed<   eed	<   edz  ed
<   eed<   edz  ed<   ee   dz  ed<   y)ÚOAuthUserInfoa½  
    Information about a user logged in with OAuth.

    Attributes:
        sub (`str`):
            Unique identifier for the user, even in case of rename. OpenID Connect field.
        name (`str`):
            The user's full name. OpenID Connect field.
        preferred_username (`str`):
            The user's username. OpenID Connect field.
        email_verified (`Optional[bool]`, *optional*):
            Indicates if the user's email is verified. OpenID Connect field.
        email (`Optional[str]`, *optional*):
            The user's email address. OpenID Connect field.
        picture (`str`):
            The user's profile picture URL. OpenID Connect field.
        profile (`str`):
            The user's profile URL. OpenID Connect field.
        website (`Optional[str]`, *optional*):
            The user's website URL. OpenID Connect field.
        is_pro (`bool`):
            Whether the user is a pro user. Hugging Face field.
        can_pay (`Optional[bool]`, *optional*):
            Whether the user has a payment method set up. Hugging Face field.
        orgs (`Optional[list[OrgInfo]]`, *optional*):
            List of organizations the user is part of. Hugging Face field.
    r   r   r   NÚemail_verifiedÚemailr   ÚprofileÚwebsiteÚis_pror   Úorgs)	r   r   r   r   r   r   r   r   r   r    r!   r"   r$   r$   8   s`   … ñð8 
ƒHØ
ƒIØÓØ˜4‘KÓØ�‰:ÓØƒLØƒLØ�4‰ZÓØƒLØ�D‰[ÓØ
ˆ|Ñ
˜tÑ
#Ô#r!   r$   c                   ó^   — e Zd ZU dZeed<   ej                  ed<   eed<   edz  ed<   eed<   y)Ú	OAuthInfoaá  
    Information about the OAuth login.

    Attributes:
        access_token (`str`):
            The access token.
        access_token_expires_at (`datetime.datetime`):
            The expiration date of the access token.
        user_info ([`OAuthUserInfo`]):
            The user information.
        state (`str`, *optional*):
            State passed to the OAuth provider in the original request to the OAuth provider.
        scope (`str`):
            Granted scope.
    Úaccess_tokenÚaccess_token_expires_atÚ	user_infoNÚstateÚscope)r   r   r   r   r   r   Údatetimer$   r    r!   r"   r,   r,   c   s0   … ñð  ÓØ%×.Ñ.Ó.ØÓØ�‰:ÓØ„Jr!   r,   Úappzfastapi.FastAPIÚroute_prefixc                 óØ  — 	 ddl m} t        j                  xs ddz   }| j                  |t        j                  |j                  «       «      j                  «       dd¬	«       |j                  d
«      }t        j                  d«      �#t        j                  d«       t        | |¬«       yt        j                  d«       t!        | |¬«       y# t        $ r}t        d«      |‚d}~ww xY w)a•  
    Add OAuth endpoints to a FastAPI app to enable OAuth login with Hugging Face.

    How to use:
    - Call this method on your FastAPI app to add the OAuth endpoints.
    - Inside your route handlers, call `parse_huggingface_oauth(request)` to retrieve the OAuth info.
    - If user is logged in, an [`OAuthInfo`] object is returned with the user's info. If not, `None` is returned.
    - In your app, make sure to add links to `/oauth/huggingface/login` and `/oauth/huggingface/logout` for the user to log in and out.

    Example:
    ```py
    from huggingface_hub import attach_huggingface_oauth, parse_huggingface_oauth

    # Create a FastAPI app
    app = FastAPI()

    # Add OAuth endpoints to the FastAPI app
    attach_huggingface_oauth(app)

    # Add a route that greets the user if they are logged in
    @app.get("/")
    def greet_json(request: Request):
        # Retrieve the OAuth info from the request
        oauth_info = parse_huggingface_oauth(request)  # e.g. OAuthInfo dataclass
        if oauth_info is None:
            return {"msg": "Not logged in!"}
        return {"msg": f"Hello, {oauth_info.user_info.preferred_username}!"}
    ```
    r   )ÚSessionMiddlewarezÎCannot initialize OAuth to due a missing library. Please run `pip install huggingface_hub[oauth]` or add `huggingface_hub[oauth]` to your requirements.txt file in order to install the required dependencies.NÚ z-v1ÚnoneT)Ú
secret_keyÚ	same_siteÚ
https_onlyÚ/ÚSPACE_IDz3OAuth is enabled in the Space. Adding OAuth routes.©r4   z:App is not running in a Space. Adding mocked OAuth routes.)Ústarlette.middleware.sessionsr6   ÚImportErrorr   ÚOAUTH_CLIENT_SECRETÚadd_middlewareÚhashlibÚsha256ÚencodeÚ	hexdigestÚstripÚosÚgetenvÚloggerÚinfoÚ_add_oauth_routesÚ_add_mocked_oauth_routes)r3   r4   r6   ÚeÚsession_secrets        r"   Úattach_huggingface_oauthrP   |   sÕ   € ðJÝCô  ×3Ñ3Ò9°r¸UÑB€NØ×ÑØÜ—>‘> .×"7Ñ"7Ó"9Ó:×DÑDÓFØØð	 ô ð  ×%Ñ% cÓ*€LÜ	‡y�y�ÓÐ(Ü�‰ÐIÔJÜ˜#¨LÖ9ä�‰ÐPÔQÜ  °<Ö@øô3 ò Üðtó
ð ð	ûðús   ‚C Ã	C)ÃC$Ã$C)Úrequestzfastapi.RequestÚreturnc                 óH  — d| j                   vrt        j                  d«       yt        j                  d«       | j                   d   }|j                  di «      }|j                  dg «      }|r™|D �cg c]�  }t	        |j                  d«      |j                  d«      |j                  d	«      |j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      ¬«      ‘Œ� c}nd}t        |j                  d«      |j                  d«      |j                  d	«      |j                  d«      |j                  d«      |j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      |¬«      }t        |j                  d«      t        j                  j                  |j                  d«      «      ||j                  d«      |j                  d«      ¬«      S c c}w )a”  
    Returns the information from a logged-in user as a [`OAuthInfo`] object.

    For flexibility and future-proofing, this method is very lax in its parsing and does not raise errors.
    Missing fields are set to `None` without a warning.

    Return `None`, if the user is not logged in (no info in session cookie).

    See [`attach_huggingface_oauth`] for an example on how to use this method.
    Ú
oauth_infozNo OAuth info in session.Nz Parsing OAuth info from session.Úuserinfor*   r   r   r   r   r   ÚcanPayÚ	roleInOrgÚsecurityRestrictions)r   r   r   r   r   r   r   r   r%   r&   r'   r(   ÚisPro)r   r   r   r%   r&   r   r'   r(   r)   r   r*   r-   Ú
expires_atr0   r1   )r-   r.   r/   r0   r1   )	ÚsessionrJ   ÚdebugÚgetr   r$   r,   r2   Úfromtimestamp)rQ   Ú
oauth_dataÚ	user_dataÚ	orgs_dataÚorgr*   r/   s          r"   Úparse_huggingface_oauthrc   ¿   sÐ  € ð ˜7Ÿ?™?Ñ*Ü�‰Ð0Ô1Øä
‡L�LÐ3Ô4Ø—‘ Ñ.€JØ—‘˜z¨2Ó.€IØ—‘˜f bÓ)€Iñ  ñ !ó	
ñ !�ô Ø—G‘G˜E“NØ—W‘W˜V“_Ø#&§7¡7Ð+?Ó#@ØŸ™ 	Ó*Ø—W‘W˜V“_ØŸ™ Ó)ØŸG™G KÓ0Ø&)§g¡gÐ.DÓ&Eö	ð !ò	
ð ð 	ô$ Ø�M‰M˜%Ó Ø�]‰]˜6Ó"Ø$Ÿ=™=Ð)=Ó>Ø —}‘}Ð%5Ó6Ø�m‰m˜GÓ$Ø—‘˜iÓ(Ø—‘˜iÓ(Ø—‘˜iÓ(Ø�}‰}˜WÓ%Ø—‘˜hÓ'Øô€Iô Ø—^‘^ NÓ3Ü (× 1Ñ 1× ?Ñ ?À
ÇÁÈ|Ó@\Ó ]ØØ�n‰n˜WÓ%Ø�n‰n˜WÓ%ôð ùò?	
s   Á3BHc                 ó�  ‡‡‡‡— 	 ddl }ddlmŠ ddlm} ddlmŠ d}t        j                  €t        |j                  d«      «      ‚t        j                  €t        |j                  d	«      «      ‚t        j                  €t        |j                  d
«      «      ‚t        j                  €t        |j                  d«      «      ‚ |«       Š‰j                  dt        j                  t        j                  dt        j                  it        j                  dz   ¬«       t!        |«      \  Š}}| j#                  ‰«      d|j$                  d‰fˆfd„«       }| j#                  |«      d|j$                  d‰fˆˆˆˆfd„«       }	| j#                  |«      d|j$                  d‰fˆfd„«       }
y# t        $ r}t        d«      |‚d}~ww xY w)zIAdd OAuth routes to the FastAPI app (login, callback handler and logout).r   N)ÚMismatchingStateError)ÚOAuth©ÚRedirectResponseú Cannot initialize OAuth to due a missing library. Please run `pip install huggingface_hub[oauth]` or add `huggingface_hub[oauth]` to your requirements.txt file.z›OAuth is required but '{}' environment variable is not set. Make sure you've enabled OAuth in your Space by setting `hf_oauth: true` in the Space metadata.ÚOAUTH_CLIENT_IDrA   ÚOAUTH_SCOPESÚOPENID_PROVIDER_URLÚhuggingfacer1   z!/.well-known/openid-configuration)r   Ú	client_idÚclient_secretÚclient_kwargsÚserver_metadata_urlrQ   rR   c              “   ón   •K  — t        | «      }‰j                  j                  | |«      ƒ d{  –—† S 7 Œ­w)z)Endpoint that redirects to HF OAuth page.N)Ú_generate_redirect_urirm   Úauthorize_redirect)rQ   Úredirect_uriÚoauths     €r"   Úoauth_loginz&_add_oauth_routes.<locals>.oauth_login$  s2   øè ø€ ô .¨gÓ6ˆØ×&Ñ&×9Ñ9¸'À<ÓP×PÐPÐPús   ƒ+5®3¯5c              “   óŽ  •K  — 	 ‰j                   j                  | «      ƒ d{  –—† }t        j                  d«       || j                   d<    ‰	t#        | «      «      S 7 Œ9# ‰$ rÞ t        | j                  j	                  dd«      «      }| j                  j	                  d«      }d|dz   i}|r||d<   ‰
› dt
        j                  j                  |«      › �}|t        j                  kD  rNt        j                  j	                  d«      }|€t        d«      d‚d	|j                  d
«      z   } ‰	||z   «      cY S  ‰	|«      cY S w xY w­w)ú)Endpoint that handles the OAuth callback.NÚ_nb_redirectsr   Ú_target_urlr   Ú?Ú
SPACE_HOSTzoApp is not running in a Space (SPACE_HOST environment variable is not set). Cannot redirect to non-iframe view.úhttps://r<   z@Successfully logged in with OAuth. Storing user info in session.rT   )rm   Úauthorize_access_tokenÚintÚquery_paramsr]   ÚurllibÚparseÚ	urlencoder   ÚOAUTH_MAX_REDIRECTSrH   ÚenvironÚRuntimeErrorÚrstriprJ   r\   r[   Ú_get_redirect_target)rQ   rT   Únb_redirectsÚ
target_urlr�   ru   ÚhostÚhost_urlre   rh   Ú	login_urirv   s           €€€€r"   Úoauth_redirect_callbackz2_add_oauth_routes.<locals>.oauth_redirect_callback*  sI  øè ø€ ð	2Ø$×0Ñ0×GÑGÈÓP×PˆJô: 	�‰ÐWÔXØ(2ˆ�‰˜Ñ%ÙÔ 4°WÓ =Ó>Ð>ð? QùØ$ò 	2ä˜w×3Ñ3×7Ñ7¸ÈÓKÓLˆLØ ×-Ñ-×1Ñ1°-Ó@ˆJð 3BÀ<ÐRSÑCSÐ1TˆLÙØ.8�˜]Ñ+à'˜[¨¬&¯,©,×*@Ñ*@ÀÓ*NÐ)OÐPˆLð
 œi×;Ñ;Ò;Ü—z‘z—~‘~ lÓ3�Ø�<Ü&ð Jóàð ð &¨¯©°CÓ(8Ñ8�Ù'¨°<Ñ(?Ó@Ò@ñ $ LÓ1Ò1ð3	2üsD   ƒE…A £A¤A ¨5EÁA ÁCEÄ5EÄ7EÄ?EÅEÅEc              “   ó�   •K  — t         j                  d«       | j                  j                  dd«        ‰t	        | «      «      S ­w)zGEndpoint that logs out the user (e.g. delete info from cookie session).z7Logged out with OAuth. Removing user info from session.rT   N)rJ   r\   r[   Úpopr‰   )rQ   rh   s    €r"   Úoauth_logoutz'_add_oauth_routes.<locals>.oauth_logoutO  s;   øè ø€ ô 	�‰ÐNÔOØ�‰×Ñ˜L¨$Ô/ÙÔ 4°WÓ =Ó>Ð>ùs   ƒAA)ÚfastapiÚ'authlib.integrations.base_client.errorsre   Ú%authlib.integrations.starlette_clientrf   Úfastapi.responsesrh   r@   r   rj   Ú
ValueErrorÚformatrA   rk   rl   ÚregisterÚ_get_oauth_urisr]   ÚRequest)r3   r4   r“   rf   rN   ÚmsgÚcallback_uriÚ
logout_urirw   r�   r’   re   rh   rŽ   rv   s              @@@@r"   rL   rL   ü   sÂ  û€ ð	ÛÝQÝ?Ý6ð	;ð ô × Ñ Ð(Ü˜Ÿ™Ð$5Ó6Ó7Ð7Ü×$Ñ$Ð,Ü˜Ÿ™Ð$9Ó:Ó;Ð;Ü×ÑÐ%Ü˜Ÿ™ NÓ3Ó4Ð4Ü×$Ñ$Ð,Ü˜Ÿ™Ð$9Ó:Ó;Ð;ñ ‹G€EØ	‡N�NØÜ×+Ñ+Ü×3Ñ3Ø¤	× 6Ñ 6Ð7Ü%×9Ñ9Ð<_Ñ_ð ô ô +:¸,Ó*GÑ'€Iˆ|˜Zð 	‡W�WˆYÓðQ 7§?¡?ð QÐ7Gô Qó ðQð
 	‡W�Wˆ\Óð"?¨w¯©ð "?ÐCS÷ "?ó ð"?ðH 	‡W�WˆZÓð? G§O¡Oð ?Ð8Hô ?ó ñ?øô[ ò ÜðFó
ð ð	ûðús   †F+ Æ+	GÆ4G Ç Gc                 óº  ‡	‡
‡‡— 	 ddl }ddlmŠ	 ddlmŠ
 t        j                  d«       t        «       Št        |«      \  }Š}| j                  |«      d|j                  d‰	fˆ	ˆfd	„«       }| j                  ‰«      d|j                  d‰	fˆ	ˆfd
„«       }| j                  |«      d|j                  d‰	fˆ	ˆ
fd„«       }y# t
        $ r}t        d«      |‚d}~ww xY w)zÛAdd fake oauth routes if app is run locally and OAuth is enabled.

    Using OAuth will have the same behavior as in a Space but instead of authenticating with HF, a mocked user profile
    is added to the session.
    r   Nrg   )ÚURLri   zÛOAuth is not supported outside of a Space environment. To help you debug your app locally, the oauth endpoints are mocked to return your profile and token. To make it work, your machine must be logged in to Huggingface.rQ   rR   c              “   ó|   •K  — t        | «      } ‰‰dz   t        j                  j                  d|i«      z   «      S ­w)z.Fake endpoint that redirects to HF OAuth page.r|   r{   )rs   r‚   rƒ   r„   )rQ   ru   rh   r�   s     €€r"   rw   z-_add_mocked_oauth_routes.<locals>.oauth_loginp  s=   øè ø€ ô .¨gÓ6ˆÙ ¨sÑ 2´V·\±\×5KÑ5KÈ]Ð\hÐLiÓ5jÑ jÓkÐkùs   ƒ9<c              “   óL   •K  — ‰| j                   d<    ‰t        | «      «      S ­w)ry   rT   )r[   r‰   )rQ   rh   Úmocked_oauth_infos    €€r"   r�   z9_add_mocked_oauth_routes.<locals>.oauth_redirect_callbackw  s(   øè ø€ ð ):ˆ�‰˜Ñ%ÙÔ 4°WÓ =Ó>Ð>ùs   ƒ!$c              “   óœ   •K  — | j                   j                  dd«         ‰d«      j                  di | j                  ¤Ž} ‰|d¬«      S ­w)z=Endpoint that logs out the user (e.g. delete cookie session).rT   Nr<   i.  )ÚurlÚstatus_coder    )r[   r‘   Úinclude_query_paramsr�   )rQ   Ú
logout_urlrh   r    s     €€r"   r’   z._add_mocked_oauth_routes.<locals>.oauth_logout}  sI   øè ø€ ð 	�‰×Ñ˜L¨$Ô/Ø2‘S˜“X×2Ñ2ÑJ°W×5IÑ5IÑJˆ
Ù J¸CÔ@Ð@ùs   ƒA	A)r“   r–   rh   Ústarlette.datastructuresr    r@   ÚwarningsÚwarnÚ_get_mocked_oauth_inforš   r]   r›   )r3   r4   r“   rN   rŽ   rž   rw   r�   r’   rh   r    r�   r£   s            @@@@r"   rM   rM   W  s  û€ ðÛÝ6Ý0ô ‡M�Mð	xôô /Ó0Ðä*9¸,Ó*GÑ'€Iˆ|˜Zð 	‡W�WˆYÓðl 7§?¡?ð lÐ7Gõ ló ðlð 	‡W�Wˆ\Óð?¨w¯©ð ?ÐCSõ ?ó ð?ð
 	‡W�WˆZÓðA G§O¡Oð AÐ8Hõ Aó ñAøô; ò ÜðFó
ð ð	ûðús   †C  Ã 	CÃ	CÃCc                 óL  — d| j                   v r| j                   d   }n,dt        j                  j                  | j                   «      z   }| j	                  d«      j                  |¬«      }t        |«      }|j                  j                  d«      r|j                  dd«      }|S )Nr{   z/?r�   )r{   z	.hf.spacezhttp://r~   )
r�   r‚   rƒ   r„   Úurl_forr§   r   ÚnetlocÚendswithÚreplace)rQ   Útargetru   Úredirect_uri_as_strs       r"   rs   rs   …  s—   € Ø˜×,Ñ,Ñ,à×%Ñ% mÑ4‰ð œŸ™×.Ñ.¨w×/CÑ/CÓDÑDˆà—?‘?Ð#<Ó=×RÑRÐ_eÐRÓf€LÜ˜lÓ+ÐØ×Ñ×#Ñ# KÔ0à1×9Ñ9¸)ÀZÓPÐØÐr!   Údefault_targetc                 ó:   — | j                   j                  d|«      S )Nr{   )r�   r]   )rQ   r´   s     r"   r‰   r‰   •  s   € Ø×Ñ×#Ñ# M°>ÓBÐBr!   c                  óô   — t        «       } | €t        d«      ‚t        «       }|d   dk7  rt        d«      ‚| ddddd	t        t	        j                  «       «      dz   d
|d   |d   d|d   › �|d   ddddddddœdœS )Na  Your machine must be logged in to HF to debug an OAuth app locally. Please run `hf auth login` or set `HF_TOKEN` as environment variable with one of your access token. You can generate a new token in your settings page (https://huggingface.co/settings/tokens).ÚtypeÚuserz·Your machine is not logged in with a personal account. Please use a personal access token. You can generate a new token in your settings page (https://huggingface.co/settings/tokens).Úbeareri€p  ÚFOOBARzopenid profileÚhf_oauth__refresh_tokenÚ
0123456789Úfullnamer   zhttps://huggingface.co/Ú	avatarUrlr7   z$00000000-0000-0000-0000-000000000000iáÔdÚaaaaaaaaaaaaaaaaaaaiïÔdzhttps://huggingface.co)r   r   r   r'   r   r(   ÚaudÚ	auth_timeÚnonceÚiatÚexpÚiss)r-   Ú
token_typeÚ
expires_inÚid_tokenr1   Úrefresh_tokenrZ   rU   )r
   r—   r   r€   Útime)Útokenr¸   s     r"   r¬   r¬   ™  s»   € Ü‹K€EØ€}ÜðFó
ð 	
ô ‹8€DØˆF�|�vÒÜð9ó
ð 	
ð ØØ!ØØ!Ø2Üœ$Ÿ)™)›+Ó&¨Ñ4àØ˜Ñ$Ø"& v¡,Ø0°°f±°Ð?Ø˜KÑ(ØØ9Ø#Ø*ØØØ+ñ
ñð r!   c                 óN   — | j                  d«      } | rd| › �} | › d�| › d�| › d�fS )Nr<   z/oauth/huggingface/loginz/oauth/huggingface/callbackz/oauth/huggingface/logout)rG   r>   s    r"   rš   rš   Ä  sL   € Ø×%Ñ% cÓ*€LÙØ˜<˜.Ð)ˆàˆ.Ð0Ð1Øˆ.Ð3Ð4Øˆ.Ð1Ð2ðð r!   )r<   )&r2   rC   ÚloggingrH   rÊ   Úurllib.parser‚   rª   Údataclassesr   Útypingr   r   r7   r   Úhf_apir   Úutilsr	   r
   Ú	getLoggerr   rJ   r“   r   r$   r,   r   rP   rc   rL   rM   rs   r‰   Údictr¬   Útuplerš   r    r!   r"   Ú<module>rÖ      su  ðÛ Û Û Û 	Û Û Û Ý !ß )å Ý ß *ð 
ˆ×	Ñ	˜8Ó	$€áÛð ÷[ð [ó ð[ðB ÷'$ð '$ó ð'$ðT ÷ð ó ðð0 ñ?AÐ"3ð ?AÀ3ò ?Aó ð?AðD:Ð%6ð :¸9ÀtÑ;Kó :ðzX?Ð,ð X?¸Cð X?ÀDó X?ñv+AÐ"3ð +AÀ3ð +AÐQUó +Að\Ð$5ð ¸#ó ñ CÐ"3ð CÀSð CÐSVó Cð( ó (ñV #ð °°c¸3À°mÑ0Dô r!   