
    gjj              
          U d Z ddlZddlZddlmZmZ ddlmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ d	 ej                                        D             Zeeef         ed
<    ej        d          Z eej                                                  Zee         ed<    eh d          Zee         ed<    eddh          Zee         ed<    ed           G d d                      Z ed           G d d                      Zdede fdZ!ej"        d.dededz  defd            Z#dedz  de$edz  ef         fdZ%dedz  dee         fdZ&d.dededz  de fdZ'd edefd!Z(d.d"ededz  defd#Z)d$edefd%Z*d&ed'ede$eedz  e dz  f         fd(Z+d)ed'ede$ej,        ef         fd*Z-d)ed+ej,        d'edefd,Z.d)ed+ej,        d'edefd-Z/dS )/a  Centralized parser for Hugging Face Hub URIs ('hf://...') and mount specifications.

A HF URI is a URI-like string that identifies a location on the Hugging Face
Hub: a model/dataset/space/kernel repository, a bucket, optionally a revision,
and optionally a path inside the repo or bucket.

Canonical syntax:

```
hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]
```

For convenience, [`parse_hf_uri`] also accepts Hugging Face **web URLs** (the
ones you copy-paste from your browser), e.g.
'https://huggingface.co/datasets/my-org/my-dataset/blob/main/train.csv'. They are
normalized to the canonical 'hf://' form before parsing. Only unambiguous URLs
(repository / bucket pages and file/folder viewer routes) are accepted; any other
route is rejected rather than guessed.

A HF mount wraps a HF URI with a local mount path and an optional ':ro'/':rw'
flag (used by Spaces and Jobs volumes):

```
hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]:<MOUNT_PATH>[:ro|:rw]
```

See 'docs/source/en/package_reference/hf_uris.md' for the full grammar and examples.
    N)	dataclassfield)quoteunquoteurlsplit)	constants)
HfUriErrorHFValidationError   )validate_repo_idc                     i | ]\  }}||	S  r   ).0kvs      b/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/huggingface_hub/utils/_hf_uris.py
<dictcomp>r   8   s    "["["[DAq1a"["["[    _TYPE_TO_PREFIXz ^refs/(?:convert/[\w.-]+|pr/\d+)_VALID_URI_TYPES>   rawblobtreeblameresolve_URL_REPO_LOCATION_ACTIONSr   r   _URL_BUCKET_LOCATION_ACTIONST)frozenc                       e Zd ZU dZej        ed<   eed<   dZedz  ed<   dZ	eed<    e
dddd	          Zedz  ed
<   ddZedefd            Zedefd            ZdefdZddedz  defdZdS )HfUria  Parsed representation of a Hugging Face Hub URI ('hf://...').

    Attributes:
        type (`str`):
            One of 'model', 'dataset', 'space', 'kernel' or 'bucket'.
        id (`str`):
            The repository id ('namespace/name', e.g. 'my-org/my-model') for repo URIs, or the bucket id ('namespace/name') for bucket URIs.
        revision (`str`, *optional*):
            The revision specified after '@' in the URI, URL-decoded. 'None' if no revision was specified, or for bucket URIs (which
            never carry a revision). Special refs like 'refs/pr/10' and 'refs/convert/parquet' are preserved as-is.
        path_in_repo (`str`):
            The path inside the repo or bucket. Empty string if the URI points at the root.
    typeidNrevision path_in_repoFreprhashcomparedefault_rawreturnc           	         | j         pd}| j        t          vr/t          |d| j         dt	          t                     d          | j        r| j                            d          dk    rt          |d| j         d	          | j        d
k    rG	 t          | j                   n1# t          $ r$}t          |t          |                    |d }~ww xY w| j
        | j
        st          |d          | j        d
k    r| j
        t          |d          | j        r=| j                            d          s	d| j        v rt          |d| j         d          d S d S )Nr$   zInvalid type 'z'. Must be one of .urimsg/r   z"Id must be 'namespace/name', got ''.bucketz%Revision must not be an empty string.z&Bucket URIs do not support a revision.//z+Path must not contain empty segments (got 'z').)r+   r!   r   r	   sortedr"   countr   r
   strr#   r%   
startswith)selfr0   es      r   __post_init__zHfUri.__post_init__d   s   io2 9,,,*s49*s*sX^_oXpXp*s*s*stttt w 	\$'--,,11*Ztw*Z*Z*Z[[[[9  = ))))$ = = = Sc!ff5551<= =$T]$*QRRRR9  T]%>*RSSSS  	t ++C00 tDD<M4M4M S.r\`\m.r.r.rssss	t 	t4M4Ms   B' '
C1CCc                     | j         dk    S )z$True if this URI points at a bucket.r4   r!   r:   s    r   	is_bucketzHfUri.is_bucket        yH$$r   c                     | j         dk    S )zJTrue if this URI points at a repository (model, dataset, space or kernel).r4   r>   r?   s    r   is_repozHfUri.is_repo   rA   r   c                 r   t           j        t          | j                 d| j        g}| j        S| j        }d|v r0t                              |          |                    dd          }|	                    d|            | j
        r|	                    d| j
                    d                    |          S )zRender the URI as a canonical 'hf://' string.

        The type prefix is always written explicitly (e.g. 'hf://models/my-org/my-model').
        r2   N%2F@r$   )r   HF_PROTOCOLr   r!   r"   r#   _SPECIAL_REFS_REVISION_REGEX	fullmatchreplaceappendr%   join)r:   partsr#   s      r   to_urizHfUri.to_uri   s    
 &1?493MsTXT[\=$ }Hh#?#I#I(#S#S#[#++C77LLX((( 	2LL0T.00111wwu~~r   endpointc                    |pt           j                            d          }t          | j        d          }| j        dk    r| d| j         }|r|d| z  }|S | j        dk    r| d| j         n| dt          | j                  d| j         }| j        }|4d|v r0t          
                    |          |                    dd          }|r|d	|pt           j         d| z  }n
||d| z  }|S )
a  Render the URI as a Hugging Face **web URL** (the kind you open in a browser).

        This is the inverse of parsing a URL with [`parse_hf_uri`]. The returned URL points at:

        - the repository / bucket landing page when no path or revision is set;
        - the folder viewer ('/tree/<revision>') when only a revision is set;
        - the file viewer ('/blob/<revision>/<path>') for repository files (revision defaults to 'main');
        - the tree route ('/tree/<path>') for bucket files (buckets are not versioned).

        Args:
            endpoint (`str`, *optional*):
                Base endpoint to use. Defaults to 'constants.ENDPOINT' (i.e. 'https://huggingface.co').

        Returns:
            `str`: the web URL.

        Example:
            ```py
            >>> from huggingface_hub import parse_hf_uri
            >>> parse_hf_uri("hf://datasets/my-org/my-dataset@v1/train.csv").to_url()
            'https://huggingface.co/datasets/my-org/my-dataset/blob/v1/train.csv'
            ```
        r2   )safer4   z	/buckets/z/tree/modelNrE   z/blob/)r   ENDPOINTrstripr   r%   r!   r"   r   r#   rH   rI   rJ   DEFAULT_REVISION)r:   rO   basepathurlr#   s         r   to_urlzHfUri.to_url   sL   0 .I.66s;; T&S1119  --DG--C '&J &*Y'%9%9!!!!!$?o?oY]YbIc?o?ofjfm?o?o= C8OO8T8^8^_g8h8h8p''U33H 	'KHB	(BKKTKKKCC!&H&&&C
r   r,   NN)__name__
__module____qualname____doc__r   	HfUriType__annotations__r8   r#   r%   r   r+   r<   propertyboolr@   rC   rN   rY   r   r   r   r    r    N   s1          
GGGHcDjL#u%eUDQQQD#*QQQt t t t6 %4 % % % X% % % % % X%    $. .sTz .S . . . . . .r   r    c                   ~    e Zd ZU dZeed<   eed<   dZedz  ed<    e	dddd          Z
edz  ed<   dd
Zd	efdZdS )HfMountaF  A HF URI paired with a local mount path and optional read-only flag.

    Used by Spaces and Jobs to describe volume mounts. The full syntax is:

    ```
    hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]:<MOUNT_PATH>[:ro|:rw]
    ```

    Attributes:
        source ([`HfUri`]):
            The parsed HF URI identifying the Hub resource to mount.
        mount_path (`str`):
            The local mount path (always starts with '/').
        read_only (`bool`, *optional*):
            True if the mount ends with ':ro', False if it ends with ':rw', 'None' if no flag was provided.
    source
mount_pathN	read_onlyFr&   r+   r,   c                     | j         pd}| j                            d          r| j        dk    rt          |d| j         d          d S )Nr$   r2   zEMount path must be a non-empty absolute path starting with '/', got 'r3   r/   )r+   rg   r9   r	   )r:   r   s     r   r<   zHfMount.__post_init__   sf    io2))#.. 	$/S2H2Ho\`\kooo    3I2Hr   c                     | j                                         d| j        g}| j        |                    | j        rdnd           d                    |          S )zqRender the mount as a canonical 'hf://' string.

        Example: 'hf://models/my-org/my-model:/data:ro'
        :N:ro:rwr$   )rf   rN   rg   rh   rK   rL   )r:   rM   s     r   rN   zHfMount.to_uri   sU    
 ##%%sDO<>%LL$.;e<<<wwu~~r   rZ   )r\   r]   r^   r_   r    ra   r8   rh   rc   r   r+   r<   rN   r   r   r   re   re      s          " MMMOOO!Itd{!!!u%eUDQQQD#*QQQ         r   re   r0   r,   c                 H    	 t          |            dS # t          $ r Y dS w xY w)zVCheck if a string is a valid HF URI ('hf://...') or a recognized Hugging Face web URL.TF)parse_hf_urir	   )r0   s    r   	is_hf_urirp      s<    St   uus    
!!rO   c                    | }|                      t          j                  rB| t          t          j                  d         }|st	          | dt          j         d          nNt          | |          rt          | |          }n+t	          | dt          j         dt          j         d          t          ||          \  }}|d	k    rt          |||          S t          |||          S )
a  Parse a Hugging Face Hub URI ('hf://...') or a Hugging Face web URL.

    A HF URI is a URI-like string identifying a location on the Hugging Face Hub. The full grammar is:

    ```
    hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]
    ```

    For convenience, Hugging Face **web URLs** (the ones you copy-paste from the website) are also
    accepted and normalized to the canonical 'hf://' form, e.g.
    'https://huggingface.co/datasets/my-org/my-dataset/blob/main/train.csv'. Only unambiguous URLs
    (repository / bucket pages and file/folder viewer routes) are accepted; any other route is rejected.

    See 'docs/source/en/package_reference/hf_uris.md' for the full specification.

    Args:
        uri (`str`):
            The URI to parse. Must start with 'hf://', or be a Hugging Face URL (e.g. 'https://huggingface.co/...').
        endpoint (`str`, *optional*):
            A custom Hub endpoint (e.g. a self-hosted or proxied Hub like 'https://hub.my-company.com' or
            'http://localhost:8080/hf'). When provided, web URLs on that endpoint are recognized in addition to
            the default Hugging Face hosts. Has no effect on 'hf://' URIs.

    Returns:
        [`HfUri`]: the parsed URI.

    Raises:
        [`HfUriError`]:
            If the URI is malformed (missing prefix, invalid type, missing id, unsupported URL route, etc.).

    Examples:
        ```py
        >>> from huggingface_hub.utils import parse_hf_uri
        >>> parse_hf_uri("hf://my-org/my-model")
        HfUri(type='model', id='my-org/my-model', revision=None, path_in_repo='')
        >>> parse_hf_uri("hf://datasets/my-org/my-dataset@refs/pr/3/train.json")
        HfUri(type='dataset', id='my-org/my-dataset', revision='refs/pr/3', path_in_repo='train.json')
        >>> parse_hf_uri("https://huggingface.co/datasets/my-org/my-dataset/blob/main/train.csv")
        HfUri(type='dataset', id='my-org/my-dataset', revision='main', path_in_repo='train.csv')
        ```
    NEmpty body after 'r3   )rO   Must start with 'zQ' or be a Hugging Face URL (e.g. 'https://huggingface.co/...'). Expected format: z#[<TYPE>/]<ID>[@<REVISION>][/<PATH>]r   r4   )
r9   r   rG   lenr	   _looks_like_hf_url_url_to_uri_body_split_type_parse_bucket_body_parse_repo_body)r0   rO   r   bodytype_locations         r   ro   ro      s$   V C
~~i+,, 
3y,--//0 	RS"Py7L"P"P"PQQQ	R	C(	3	3	3 
h777[	 5 [ [ ) 5[ [ [
 
 	
 "$C000OE8!(Es;;;;He5555r   c                     | dS t          d| v r| nd| z             }|j        r|j                                        nd}||j                            d          fS )a  Return the lowercased host and stripped path prefix of a custom Hub 'endpoint'.

    E.g. 'https://hub.my-company.com' -> ('hub.my-company.com', '') and a self-hosted
    'http://localhost:8080/hf' -> ('localhost', 'hf'). Returns '(None, "")' when 'endpoint' is None.
    N)Nr$   ://r5   r2   )r   hostnamelowerrW   strip)rO   parsedhosts      r   _endpoint_host_and_pathr   @  sh     x%8"3"3hhIIF&,o?6?  """4D""3''''r   c                 b    t          |           \  }}|rt          j        |hz  nt          j        S )z^The set of hosts whose web URLs can be parsed: the default Hugging Face hosts plus 'endpoint'.)r   r   HF_URL_HOSTS)rO   r   _s      r   _recognized_hostsr   N  s0    %h//GD!.2N9!TF**	8NNr   c                     |                                                      d          rdS t          fdt          |          D                       S )zNReturn True if 'uri' looks like a (possibly scheme-less) Hugging Face web URL.)zhttp://zhttps://Tc              3   T   K   | ]"}|k    p                     |d z             V  #dS )r2   N)r9   )r   r   lowereds     r   	<genexpr>z%_looks_like_hf_url.<locals>.<genexpr>Z  s>      iiTw$@'"4"4TCZ"@"@iiiiiir   )r   r9   anyr   )r0   rO   r   s     @r   rv   rv   T  sY    iikkG122 tiiiiM^_gMhMhiiiiiir   segmentc                 H    t          |                               dd          S )aw  Percent-decode a single URL path segment (e.g. 'file%20name.txt' -> 'file name.txt').

    A decoded '/' is re-encoded as '%2F' so the segment stays atomic when the normalized body is
    re-split by the shared parser. This decodes ordinary path characters (spaces, '#', ...) that
    browsers encode, while keeping '%2F'-encoded revisions (e.g. 'feature%2Ffoo') intact.
    r2   rE   )r   rJ   )r   s    r   _decode_url_path_segmentr   ]  s"     7##C///r   rX   c                 D   | }t          d| v r| nd| z             }|j        pd                                }|t          |          vrt	          |d|p|  d          |j        }t          |          \  }}|r@||k    r:d|z   }||k    s|                    |dz             r|t          |          d         }d	 |	                    d          D             }	|	st	          |d
|  d          d}
|	d         t          j        v r|	d         }
|	dd         }	t          |	          dk     rt	          |d|  d          |	d          d|	d          }|	dd         }|
dk    rZ|sd| S |^}}|t          vrt	          |d|  d| d          d                    d |D                       }|rd| d| nd| S |
r|
 dnd}|s| | S |^}}|t          vrt	          |d|  d| d          |s| | S d                    d |D                       }| | d| S )a  Normalize a Hugging Face web URL into the body of a 'hf://' URI (everything after 'hf://').

    The returned string is fed back into the regular URI parsing logic, so all validation
    (repo id, revision, empty path segments, ...) is shared with the canonical 'hf://' path.
    Only unambiguous URLs are accepted: any unrecognized route raises [`HfUriError`]. When 'endpoint'
    is provided, URLs on that custom Hub host are recognized too (and its path prefix is stripped).
    r   r5   r$   zUnrecognized host 'zC'. Expected a Hugging Face URL (e.g. 'https://huggingface.co/...').r/   r2   Nc                     g | ]}||S r   r   r   r   s     r   
<listcomp>z$_url_to_uri_body.<locals>.<listcomp>  s    BBBG'BBBBr   z0Missing repository or bucket identifier in URL 'r3   r   r      zCannot parse URL 'z{': expected a '<namespace>/<name>' repository or bucket. User/organization pages and single-segment URLs are not supported.bucketszbuckets/zCannot parse bucket URL 'z': unsupported '/z	/' route.c              3   4   K   | ]}t          |          V  d S r[   r   r   s     r   r   z#_url_to_uri_body.<locals>.<genexpr>  s+      NNg099NNNNNNr   zl/' route. Only repository pages and file/folder viewer routes (blob, resolve, raw, tree, ...) can be parsed.c              3   4   K   | ]}t          |          V  d S r[   r   r   s     r   r   z#_url_to_uri_body.<locals>.<genexpr>  s+      MMW/88MMMMMMr   rF   )r   r   r   r   r	   rW   r   r9   ru   splitr   HF_URI_TYPE_PREFIXESr   rL   r   )rX   rO   r   r   r   rW   endpoint_hostendpoint_pathprefixsegmentstype_prefixrepo_idrestactiontaildecodeds                   r   rw   rw   g  sT    CUc\\cctcz::FO!r((**D$X....vdkcvvv
 
 
 	
 ;D $;8#D#D M= '..}$6>>T__Vc\::>F&DBBtzz#BBBH bS&`Y\&`&`&`aaaa #K{i444qkABB< 8}}qUS U U U
 
 
 	
 !,,x{,,GABB<Di 	('g'''555*mc*m*m\b*m*m*mnnnnxxNNNNNNN.2L*'**D***8L78L8LL"-52F $#'###MFT///uS u u6 u u u
 
 
 	
  $#'###
 hhMMMMMMMG)g)))))r   	mount_strc                    |                      t          j                  st          | dt          j         d          | }| t	          t          j                  d         }|st          |dt          j         d          t          ||          \  }}}|t          |d          t          j        |z   }	 t          |          }n)# t          $ r}t          ||j                  |d}~ww xY wt          ||||          S )	a  Parse a HF mount specification ('hf://...:<MOUNT_PATH>[:ro|:rw]').

    A mount specification is a HF URI followed by a local mount path and an optional read-only/read-write flag.
    The full grammar is:

    ```
    hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]:<MOUNT_PATH>[:ro|:rw]
    ```

    See 'docs/source/en/package_reference/hf_uris.md' for the full specification.

    Args:
        mount_str (`str`):
            The mount string to parse. Must start with 'hf://' and contain a ':<MOUNT_PATH>' segment.

    Returns:
        [`HfMount`]: the parsed mount.

    Raises:
        [`HfUriError`]:
            If the mount string is malformed (missing mount path, invalid URI, etc.).

    Examples:
        ```py
        >>> from huggingface_hub.utils import parse_hf_mount
        >>> parse_hf_mount("hf://my-org/my-model:/data:ro")
        HfMount(source=HfUri(type='model', id='my-org/my-model', revision=None, path_in_repo=''), mount_path='/data', read_only=True)
        >>> parse_hf_mount("hf://buckets/my-org/my-bucket/sub/dir:/mnt:rw")
        HfMount(source=HfUri(type='bucket', id='my-org/my-bucket', revision=None, path_in_repo='sub/dir'), mount_path='/mnt', read_only=False)
        ```
    rs   r3   r/   Nrr   rt   zKMissing mount path. Expected ':<MOUNT_PATH>' (e.g. 'hf://org/model:/data').)rf   rg   rh   r+   )	r9   r   rG   r	   ru   _split_mountro   r1   re   )	r   r   r{   r}   rg   rh   uri_strrf   r;   s	            r   parse_hf_mountr     s<   @ 	 566 
=I$9===
 
 
 	

 CS.//112D VS&T9;P&T&T&TUUUU&24S&A&A&A#Hj)S&stttt #h.G4g&& 4 4 4Sae,,,!34 &Z9SVWWWWs   ;C 
C1C,,C1r{   r   c                ~   |                      d          rd|                     d          } }n/|                      d          rd|                     d          } }nd}|                     d          }|dk    r|t          |d	          | ddfS | d|         }| |d
z   d         }|st          |d	          |||fS )zSplit the ':<MOUNT_PATH>[:ro|:rw]' suffix from 'body'.

    Returns '(location, mount_path, read_only)' where 'mount_path' is 'None' if no mount segment is present.
    rl   Trm   FNz:/zb':ro'/':rw' suffix is only valid when a mount path is provided (e.g. 'hf://...:/<MOUNT_PATH>:ro').r/   r   z#Missing location before mount path.)endswithremovesuffixrfindr	   )r{   r   rh   idxr}   rg   s         r   r   r     s    
 }}U  1 1% 8 84			u		 !2!25!9!94			 **T

C
byy x    T4DSDzHcAgiiJ MS&KLLLLZ**r   r}   c          	          |                      d          }|dk    rs| t          j        v r$t          |d|  dt          j         |  d          t
                              |           x}!t          |dt          j         | d	          d
| fS | d|         }| |dz   d         }|t          j        v rt          j        |         |fS t
                              |          x}t          |d| d| d          d
| fS )zDetect the (optional) type prefix and return '(type, remaining_location)'.

    A missing type prefix defaults to 'model'. Singular forms ('model/', 'dataset/', etc.) are explicitly rejected with a helpful error.
    r2   r   zMissing identifier after 'z'. Expected 'z/<ID>'.r/   Nz*Type prefix must be plural. Did you mean 'z/...'?rR   r   z!Type prefix must be plural, got 'z/'. Did you mean 'z/'?)findr   r   r	   rG   r   get)r}   r   	slash_idxsingular_pluralfirstr   s         r   rx   rx     sV   
 c""IBy555ppp	H]p_gppp     /228<<<OIoAVoXgooo      ZiZ EIMOO$D	...-e4d::*..u555BjUjjVejjj
 
 
 	
 Hr   r|   c                z   |                      d          } |                     dd          }t          |          dk     s|d         r|d         st          |d|  d          |d          d|d          }d|v rt          |d	          t          |          d
k    r|d         nd}t	          ||d||          S )z8Parse the body of a bucket URI: 'namespace/name[/path]'.r2   r   r   r   z)Bucket id must be 'namespace/name', got 'r3   r/   rF   z3Bucket URIs do not support a revision marker ('@').   r$   Nr!   r"   r#   r%   r+   )r   r   ru   r	   r    )r}   r|   r   rM   	bucket_idpath_in_buckets         r   ry   ry   0  s     ~~c""HNN3""E
5zzA~~U1X~U1X~S&^RZ&^&^&^____8((eAh((I
iS&[\\\\!$UqU1XXbN#   r   c                   |                      d          } | st          |d          |                     d          }|dk    s!| d|                             d          dk    rrd}|                     dd          }t          |          dk     rt          |d	|  d
          |d          d|d          }t          |          dk    r|d         nd}n| d|         }| |dz   d         }|st          |d          |                    d          dk    rt          |d	| d          t                              |          }	|	?|	                                }|t          |          d         	                    d          }n7|                    d          }
|
dk    r|}d}n|d|
         }||
dz   d         }t          |          }|st          |d          t          |||||          S )z@Parse the body of a repo URI: '<repo_id>[@<revision>][/<path>]'.r2   zMissing repository id.r/   rF   r   Nr   r   z-Repository id must be 'namespace/name', got 'z'. r   r$   z!Missing repository id before '@'.r3   zEmpty revision after '@'.r   )r   r	   r   r7   r   ru   rH   matchgroupremoveprefixr   r    )r}   r|   r   at_idxr#   rM   r   r%   rev_and_pathr   r   s              r   rz   rz   H  sH    ~~c""H @S&>????
 ]]3F ||x(..s33a77sA&&u::>>*gZb*g*g*ghhhh1X**a**#&u::>>uQxxr7F7#
- 	O*MNNNN==""*eZa*e*e*effff -22<@@{{}}H'H8EEcJJLL$))#..IB'!'

3+IMOO<8$$ 	G*EFFFF!   r   r[   )0r_   	functoolsredataclassesr   r   urllib.parser   r   r   huggingface_hubr   huggingface_hub.errorsr	   r
   _validatorsr   r   itemsr   dictr8   ra   compilerH   	frozensetvaluesr   r   r   r    re   rc   rp   	lru_cachero   tupler   r   rv   r   rw   r   r   r`   rx   ry   rz   r   r   r   <module>r      sq    :     				 ( ( ( ( ( ( ( ( 1 1 1 1 1 1 1 1 1 1 % % % % % % @ @ @ @ @ @ @ @ ) ) ) ) ) )
 #\"[I4R4X4X4Z4Z"["["[c3h [ [ [  *rz*MNN  $-9Y-K-R-R-T-T#U#U )C. U U U .7Y7b7b7b-c-c IcN c c c 09y)V9L/M/M in M M M $z z z z z z z zz $' ' ' ' ' ' ' 'T3 4     <6 <6c <6S4Z <65 <6 <6 <6 <6~(cDj (U3:s?5K ( ( ( (Od
 Oy~ O O O Oj jC j3: j j j j j0c 0c 0 0 0 0O* O*# O*t O*s O* O* O* O*d7Xc 7Xg 7X 7X 7X 7Xt+s +C +E#sTz4$;2N,O + + + +<# s uY5H#5M/N    > 
	
    0888 
	8
 8 8 8 8 8 8r   