
    MiBC                        S r SSKrSSKrSSKrSSKJrJr  SSKJrJ	r	J
r
Jr   SSKJr   " S S\R                  5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      rSS jr\\\	4   rg! \ a	    SSKJr   N\f = f)z
resolvers.py
---------------

Provides a common interface to load assets referenced by name
like MTL files, texture images, etc. Assets can be from ZIP
archives, web assets, or a local file path.
    N   )cachingutil)DictMappingOptionalUnion)urlparsec                   
   \ rS rSrSr\R                  S 5       r\R                  S 5       r\R                  S\	4S j5       r
\R                  S\	4S j5       r\R                  S	 5       rS
\	4S jrS
\	4S jrS
\	S\4S jrSrg)Resolver   z
The base class for resolvers.
c                     [        S5      e)NzUse a resolver subclass!NotImplementedError)selfargskwargss      k/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/trimesh/resolvers.py__init__Resolver.__init__       !"<==    c                     [        5       eNr   r   keys     r   getResolver.get#   s    !##r   namec                     [        S5      eNz`write` not implemented!r   r   r   datas      r   writeResolver.write'   r   r   	namespacec                     [        S5      e)Nz`namespaced` not implemented!r   r   r&   s     r   
namespacedResolver.namespaced+   s    !"ABBr   c                     [        S5      e)Nz`keys` not implemented!r   r   s    r   keysResolver.keys/   s    !";<<r   r   c                 $    U R                  U5      $ r   )r   r   s     r   __getitem__Resolver.__getitem__3   s    xx}r   c                 $    U R                  X5      $ r   )r$   r   r   values      r   __setitem__Resolver.__setitem__6   s    zz#%%r   returnc                 &    XR                  5       ;   $ r   )r-   r   s     r   __contains__Resolver.__contains__9   s    iik!!r    N)__name__
__module____qualname____firstlineno____doc__abcabstractmethodr   r   strr$   r)   r-   r0   r5   boolr9   __static_attributes__r;   r   r   r   r      s     	> > 	$ $ 	># > > 	CC C C 	= =s &s &" " "r   r   c                   h    \ rS rSrSrS\4S jrS rS\SS 4S jrS	\4S
 jr	S	\S\
\\4   4S jrSrg)FilePathResolver=   z6
Resolve files from a source path on the file system.
sourcec                 $   [         R                  R                  [         R                  R                  [	        U5      5      5      nX l        [         R                  R                  U5      (       a  X l        O)[         R                  R                  U5      nUS   U l        [         R                  R                  U R                  5      (       d  [        SU R                   S35      eXl
        [         R                  R                  U5      U l        g)zt
Resolve files based on a source path.

Parameters
------------
source : str
  File path where mesh was loaded from
r   zpath `z `not a directory!N)ospath
expanduserabspathrC   cleanisdirparentsplit
ValueError	file_pathbasename	file_name)r   rI   rO   rR   s       r   r   FilePathResolver.__init__B   s     ""277??3v;#?@
77==K GGMM%(E(DK ww}}T[[))vdkk]2DEFF))&1r   c              #     #    U R                   n[        R                  " U R                   5       HT  u  p#nUR                  U5      (       a  U[	        U5      S nU H$  n[        R
                  R                  X%5      v   M&     MV     g7f)zo
List all files available to be loaded.

Yields
-----------
name : str
  Name of a file which can be accessed.
N)rQ   rK   walk
startswithlenrL   join)r   rQ   rL   _namesr   s         r   r-   FilePathResolver.keys^   sg       ggdkk2NDUv&&CKM*ggll4..  3s   BBr&   r7   c                 h    [        [        R                  R                  U R                  U5      5      $ )z
Return a resolver which changes the root of the
resolver by an added namespace.

Parameters
-------------
namespace : str
  Probably a subdirectory

Returns
--------------
resolver : FilePathResolver
  Resolver with root directory changed.
)rG   rK   rL   r\   rQ   r(   s     r   r)   FilePathResolver.namespacedp   s"      T[[) DEEr   r   c                    [         R                  R                  U R                  UR	                  5       5      n[         R                  R                  U5      (       dG  [         R                  R                  U R                  UR	                  5       R                  S5      5      n[         R                  R                  U5      (       dJ  [         R                  R                  U R                  [         R                  R                  U5      S   5      n[        US5       nUR                  5       nSSS5        U$ ! , (       d  f       W$ = f)z
Get an asset.

Parameters
-------------
name : str
  Name of the asset

Returns
------------
data : bytes
  Loaded data from asset
/rbN)
rK   rL   r\   rQ   stripexistslstriprR   openread)r   r   rL   fr#   s        r   r   FilePathResolver.get   s     ww||DKK6ww~~d##77<<TZZ\-@-@-EFDww~~d##77<<RWW]]4-@-DED$668D  s   D99
Er#   c                     [        [        R                  R                  U R                  UR                  5       5      S5       n[        R                  " X2S9  SSS5        g! , (       d  f       g= f)z
Write an asset to a file path.

Parameters
-----------
name : str
  Name of the file to write
data : str or bytes
  Data to write to the file
wb)file_objstuffN)ri   rK   rL   r\   rQ   rf   r   write_encoded)r   r   r#   rk   s       r   r$   FilePathResolver.write   sD     "'',,t{{DJJL94@A6 A@@s   A!!
A/)rO   rV   rT   rQ   N)r<   r=   r>   r?   r@   rC   r   r-   r)   r   r	   bytesr$   rE   r;   r   r   rG   rG   =   sW    2s 28/$FC F,> F" 07# 7U3:%6 7r   rG   c                       \ rS rSrSrSS\\   S\\   4S jjrS r	S\S	S4S
 jr
S\S	\4S jrS\S	S 4S jrS	\4S jrSrg)ZipResolver   z%
Resolve files inside a ZIP archive.
Narchiver&   c                     Xl         [        U[        5      (       a(  UR                  5       R	                  S5      S-   U l        gSU l        g)a#  
Resolve files inside a ZIP archive as loaded by
trimesh.util.decompress

Parameters
-------------
archive : dict
  Contains resources as file object
namespace : None or str
  If passed will only show keys that start
  with this value and this substring must be
  removed for any get calls.
rc   N)rw   
isinstancerC   rf   rstripr&   )r   rw   r&   s      r   r   ZipResolver.__init__   s;     i%%&__.55c:S@DN!DNr   c                 4   U R                   bm  U R                   n[        U5      nU R                  R                  5        Vs/ s H0  nUR	                  U5      (       d  M  [        U5      U:  d  M,  X2S PM2     sn$ U R                  R                  5       $ s  snf )zt
Get the available keys in the current archive.

Returns
-----------
keys : iterable
  Keys in the current archive.
N)r&   r[   rw   r-   rZ   )r   r&   lengthks       r   r-   ZipResolver.keys   s     >>%I^F **,,A<<	* /21v '
, 
 ||  ""s   BB0Br   r7   c                 H    U R                   c  0 U l         X R                   U'   g)z
Store a value in the current archive.

Parameters
-----------
key : hashable
  Key to store data under.
value : str, bytes, file-like
  Value to store.
N)rw   r3   s      r   r$   ZipResolver.write   s!     <<DL!Sr   r   c                 d   Uc  g[        US5      (       a  UR                  S5      nU R                  nX;  a%  [        XR                  5       H  nX2;   d  M
  Un  O   X!   n[        U[        [        45      (       a  U$ UR                  S5        UR                  5       nUR                  S5        U$ )z
Get an asset from the ZIP archive.

Parameters
-------------
name : str
  Name of the asset

Returns
-------------
data : bytes
  Loaded data from asset
Ndecodeutf-8r   )
hasattrr   rw   nearby_namesr&   ry   rs   rC   seekrj   )r   r   rw   optionobjr#   s         r   r   ZipResolver.get   s     <4"";;w'D,, &t^^<$ "D = mcE3<((J 	xxzr   c                 *    [        U R                  US9$ )$  
Return a "sub-resolver" with a root namespace.

Parameters
-------------
namespace : str
  The root of the key to clip off, i.e. if
  this resolver has key `a/b/c` you can get
  'a/b/c' with resolver.namespaced('a/b').get('c')

Returns
-----------
resolver : Resolver
  Namespaced resolver.
rw   r&   )ru   rw   r(   s     r   r)   ZipResolver.namespaced  s      4<<9EEr   c                 B    [         R                  " U R                  5      $ )z
Export the contents of the current archive as
a ZIP file.

Returns
------------
compressed : bytes
  Compressed data in ZIP format.
)r   compressrw   r,   s    r   exportZipResolver.export(  s     }}T\\**r   r   )NN)r<   r=   r>   r?   r@   r   r   rC   r   r-   r$   rs   r   r)   r   rE   r;   r   r   ru   ru      sp    " "(3- "(#," " ", , ,\FC FM F$
+ 
+r   ru   c                   d    \ rS rSrSrS\4S jrS\S\4S jrS\4S jr	S	\SS 4S
 jr
S rS rSrg)WebResolveri5  z#
Resolve assets from a remote URL.
urlc                    [        US5      (       a  UR                  S5      n[        U5      nUR                  R	                  S5       Vs/ s H  n[        U5      S:  d  M  UPM     nn[        U5      S:X  a  SnO/SUS   ;   a  SR                  USS 5      nOSR                  U5      nXl        SR                  S	 UR                  S
-   UR                  R                  S5      UR                  S5      4 5       5      S-   U l        SU R                  [        UR                  5      S-   S ;  d   eU R                  R                  S5      (       d   eUR	                  S5      S   U l        gs  snf )z
Resolve assets from a base URL.

Parameters
--------------
url : str
  Location where a mesh was stored or
  directory where mesh was stored
r   r   rc   r    .rd   Nc              3   H   #    U  H  n[        U5      S :  d  M  Uv   M     g7f)r   N)r[   ).0is     r   	<genexpr>'WebResolver.__init__.<locals>.<genexpr>\  s$      ZAq6A: Zs   "	"z:/z//   )r   r   r
   rL   rR   r[   r\   r   schemenetlocrf   base_urlendswithrV   )r   r   parsedr   rR   rL   s         r   r   WebResolver.__init__:  sT    3!!**W%C #"KK--c2A2qc!fqj2A u:?DE"I88E#2J'D 88E?D  HH  --$.0C0CC0H$**UX/Z 
  	 4==V]]);a)?)ABBBB}}%%c****3+? Bs   E0"E0r   r7   c                 0   SSK nUR                  5       nU R                  U-   nUR                  USS9nUR                  S:  a8  UR                  S5      (       a  USS nUR                  U R                  U-   SS9nUR                  5         UR                  $ )zq
Get a resource from the remote site.

Parameters
-------------
name : str
  Asset name, i.e. 'quadknot.obj.mtl'
r   NTfollow_redirectsi,  ./   )httpxrf   r   r   status_coderZ   raise_for_statuscontent)r   r   r   r   responses        r   r   WebResolver.getk  s     	 zz| mmd"99S4983&t$$ABxyy!5yMH 	!!# r   c                 v    SSK nUR                  U R                  SS9nUR                  5         UR                  $ )z
Fetch the data at the full URL this resolver was
instantiated with, i.e. `https://stuff.com/hi.glb`
this will return the response.

Returns
--------
content
  The value at `self.url`
r   NTr   r   r   r   r   r   )r   r   r   s      r   get_baseWebResolver.get_base  s7     	 99TXX9=!!#r   r&   c                 .    [        U R                  U-   S9$ )z
Return a namespaced version of current resolver.

Parameters
-------------
namespace : str
  URL fragment

Returns
-----------
resolver : WebResolver
  With sub-url: `https://example.com/{namespace}`
)r   )r   r   r(   s     r   r)   WebResolver.namespaced  s     t}}y899r   c                     [        S5      e)Nz`WebResolver` is read-only!r   r3   s      r   r$   WebResolver.write  s    !"?@@r   c                     [        S5      e)Nz`WebResolver` can't list keysr   r,   s    r   r-   WebResolver.keys  s    !"ABBr   )r   rV   r   N)r<   r=   r>   r?   r@   rC   r   rs   r   r   r)   r$   r-   rE   r;   r   r   r   r   5  sS    /,C /,b     B %  $:C :M :"ACr   r   c            
       z    \ rS rSr   SS\S\\   S\\   S\\   4S jjrS rS	 r\	S
\
4S j5       rS rS rSrg)GithubResolveri  Nrepobranchcommitsavec                     Ub  SU SU S3U l         OUb  SU SU S3U l         O[        S5      eUb  [        R                  " U5      U l        gSU l        g)aV  
Get files from a remote Github repository by
downloading a zip file with the entire branch
or a specific commit.

Parameters
-------------
repo
  In the format of `owner/repo`
branch
  The remote branch you want to get files from.
commit
  The full commit hash: pass either this OR branch.
save
  A path if you want to save results locally.
Nzhttps://github.com/z	/archive/z.zipz/archive/refs/heads/z$`commit` or `branch` must be passed!)r   rS   r   	DiskCachecache)r   r   r   r   r   s        r   r   GithubResolver.__init__  sh    0 ,TF)F84HDH,TF2FvhdSDHCDD **40DJDJr   c                 6    U R                   R                  5       $ )zs
List the available files in the repository.

Returns
----------
keys : iterable
  Keys available to the resolved.
)zippedr-   r,   s    r   r-   GithubResolver.keys  s     {{!!r   c                     [        S5      er!   r   r"   s      r   r$   GithubResolver.write  s    !"<==r   r7   c           
        ^  S[         4U 4S jjn[        T S5      (       a  T R                  $ T R                  R	                  T R
                  U5      n[        [        R                  " [        R                  " U5      SS9R                  5        VVs0 s H  u  p4UR                  SS5      S   U_M     snn5      T l        T R                  $ s  snnf )zJ
- opened zip file
- locally saved zip file
- retrieve zip file and saved
r7   c                  x   > SSK n U R                  TR                  SS9nUR                  5         UR                  $ )z
Fetch the remote zip file.
r   NTr   r   )r   r   r   s     r   fetch$GithubResolver.zipped.<locals>.fetch  s6     yyDyAH%%'###r   _zipzip)	file_typerc   r   )rs   r   r   r   r   r   ru   r   
decompresswrap_as_streamitemsrR   )r   r   rawr~   vs   `    r   r   GithubResolver.zipped  s    	$u 	$ 4  99jjnnTXXu-   !OO'',%'DA Q"A%
	 yys   "C
c                 8    U R                   R                  U5      $ r   )r   r   r   s     r   r   GithubResolver.get  s    {{s##r   c                 8    U R                   R                  U5      $ )r   )r   r)   r(   s     r   r)   GithubResolver.namespaced  s      {{%%i00r   )r   r   r   )NNN)r<   r=   r>   r?   rC   r   r   r-   r$   propertyru   r   r   r)   rE   r;   r   r   r   r     su     !% $"$$ $ 	$
 sm$L	"> ! ! !F$1r   r   c              #     ^	#    S m	S S U	4S jU	4S jU	4S jS S /nUc  S
n[        5       nU H)  nU" U 5      nXS;   a  M  UR                  U5        X-   v   M+     [        R                  " US5       H]  u  pgU" U" U 5      5      nXS;   a  M  UR                  U5        X-   v   U" U" U 5      5      nXS;   a  MF  UR                  U5        X-   v   M_     SU ;   a  Ub  UR	                  S5      R                  S5      S	U R                  S5      *  nUR                  U R                  S5      S   R	                  S5      R                  S5      5        SR                  U5      v   g	g	g	7f)z
Try to find nearby variants of a specified name.

Parameters
------------
name : str
  Initial name.

Yields
-----------
nearby : str
  Name that is a lightly permutated version
  of the initial name.
c                 N    UR                  U 5      (       a  U[        U 5      S  $ U$ r   )rZ   r[   )prefixitems     r   trimnearby_names.<locals>.trim6  s'    ??6""F&&r   c                     U $ r   r;   xs    r   <lambda>nearby_names.<locals>.<lambda><  s    !r   c                 "    U R                  5       $ r   )rf   r   s    r   r   r   =  s
    !'')r   c                    > T" SU 5      $ )Nr   r;   r   r   s    r   r   r   >      $tQ-r   c                    > T" SU 5      $ )Nz.\r;   r   s    r   r   r   ?  s    $ua.r   c                    > T" SU 5      $ )N\r;   r   s    r   r   r   @  r   r   c                 F    [         R                  R                  U 5      S   $ )Nrd   )rK   rL   rR   r   s    r   r   r   A  s    "''--"2&r   c                 &    U R                  SS5      $ )Nz%20 )replacer   s    r   r   r   B  s    !))E3'r   Nr   r   z..rc   rd   )	setadd	itertoolscombinationsrf   rR   countextendr\   )
r   r&   cleanershitrk   currentabrf   r   s
            @r   r   r   %  s`    " 	 &'H 	 %CD'>!!  &&x3AdG*>!! AdG*>!! 4 t|	-$**3/0C4::d3C2CDTZZ%b)//4::3?@hhuo	 .|s   E&E)r   )r@   rA   r   rK   r   r   r   typedr   r   r   r	   urllib.parser
   ImportErrorABCr   rG   ru   r   r   r   ResolverLiker;   r   r   <module>r     s      	  1 1"% "txx  "Fj7x j7ZH+( H+V~C( ~CBl1X l1^@H Xw&'i  "!"s   A8 8BB