a
    6­^i¢m  ã                   @   sä  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlm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Zd dlZd dlZd dlmZ d dl m!Z! d "d¡ d	d
„ Z#ej$r`d dl%Z$ej& 'dd¡Z(e(dur0e)de(ƒ e$j*j+e(dde$j*j+e(ddgZ,e,d  gZ-n.e)dƒ e$j*j+dde$j*j+ddgZ,e,d  gZ-ng Z,g Z-g a.da/i Z0g Z1G dd„ de2ƒZ3e1 4e3¡ G dd„ de2ƒZ5e1 4e5¡ G dd„ de2ƒZ6e1 4e6¡ dd„ Z7dd„ Z8g a9g a:i Z;i Z<dd„ Z=g Z>dd„ Z?d d!„ Z@ej$re> 4e@¡ d"d#„ ZAejBs4ej& 'd$d%¡r>e> 4eA¡ d&d'„ ZCe> 4eC¡ d(d)„ ZDe> 4eD¡ dad+d,„ZEG d-d.„ d.e2ƒZFeZGd/ej&v r”d0d1„ ZGg ZHd2d3„ ZId4d5„ ZJeH 4eJ¡ d6d7„ ZKeH 4eK¡ d8d9„ ZLej$rÞeH 4eL¡ d:d;„ ZMeH 4eM¡ d<d=„ ZNejBsej& 'd$d%¡reH 4eN¡ d>d?„ ZOdbd@dA„ZPdcdBdC„ZQdDdE„ ZRdFdG„ ZSdHdI„ ZTeUƒ ZVdJdK„ ZWG dLdM„ dMe2ƒZXg ZYdNdO„ ZZdPdQ„ Z[dRdS„ Z\e]ƒ a^i Z_da`d*aae b¡ Zcej2 ddT¡ZedUdV„ ZfdddWdX„ZgdYdZ„ Zhd[d\„ Zid]d^„ Zjd_d`„ ZkdS )eé    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicode)ÚOptionalN)Úloads)ÚDownloadNeededÚ úutf-8c                 C   sP   t j tjj| ¡} t j | ¡}zt j |¡s6t  |¡ W n t	yJ   Y n0 | S )z×
    Returns the path to `fn` relative to the gamedir. If any of the directories
    leading to `fn` do not exist, tries to create them.

    This always returns a path, but the path may or may not be writable.
    )
ÚosÚpathÚjoinÚrenpyÚconfigÚgamedirÚdirnameÚexistsÚmakedirsÚ	Exception)ÚfnÚdn© r$   ú2C:\Users\PahaGest\Downloads\Selene\renpy\loader.pyÚget_path/   s    r&   ZANDROID_EXPANSIONzUsing expansion filezassets/x-game/)ÚapkÚprefixzassets/x-renpy/x-common/zNot using expansion file.©r(   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv3ArchiveHandlerz2
    Archive handler handling RPAv3 archives.
    ú.rpac                   C   s   dgS ©Nr+   r$   r$   r$   r$   r%   Úget_supported_extensionsw   s    z,RPAv3ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   RPA-3.0 r$   r$   r$   r$   r%   Úget_supported_headers{   s    z)RPAv3ArchiveHandler.get_supported_headersc                    s°   |   d¡}t|dd… dƒ}t|dd… dƒ‰ |  |¡ tt |   ¡ ¡ƒ}dd„ ‰| ¡ D ]P}t|| d	 ƒd
krŽ‡ fdd„|| D ƒ||< qZ‡ ‡fdd„|| D ƒ||< qZ|S )Né(   é   é   é   é   é!   c                 S   s    | sdS t | tƒs|  d¡} | S )Nó    úlatin-1)Ú
isinstanceÚbytesÚencode)Úsr$   r$   r%   Ústart_to_bytes‡   s
    

z6RPAv3ArchiveHandler.read_index.<locals>.start_to_bytesr   é   c                    s    g | ]\}}|ˆ A |ˆ A f‘qS r$   r$   )Ú.0ÚoffsetÚdlen)Úkeyr$   r%   Ú
<listcomp>•   r5   z2RPAv3ArchiveHandler.read_index.<locals>.<listcomp>c                    s(   g | ] \}}}|ˆ A |ˆ A ˆ|ƒf‘qS r$   r$   )r=   r>   r?   Ústart©r@   r;   r$   r%   rA   —   r5   )ÚreadÚintÚseekr   ÚzlibÚ
decompressÚkeysÚlen)ÚinfileÚlr>   ÚindexÚkr$   rC   r%   Ú
read_index   s    

zRPAv3ArchiveHandler.read_indexN©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úarchive_extensionÚstaticmethodr-   r.   rO   r$   r$   r$   r%   r*   p   s   

r*   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv2ArchiveHandlerz2
    Archive handler handling RPAv2 archives.
    r+   c                   C   s   dgS r,   r$   r$   r$   r$   r%   r-   ¦   s    z,RPAv2ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   RPA-2.0 r$   r$   r$   r$   r%   r.   ª   s    z)RPAv2ArchiveHandler.get_supported_headersc                 C   s<   |   d¡}t|dd … dƒ}|  |¡ tt |   ¡ ¡ƒ}|S )Nr1   r0   r2   )rD   rE   rF   r   rG   rH   )rK   rL   r>   rM   r$   r$   r%   rO   ®   s
    

zRPAv2ArchiveHandler.read_indexNrP   r$   r$   r$   r%   rW   Ÿ   s   

rW   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv1ArchiveHandlerz2
    Archive handler handling RPAv1 archives.
    r+   c                   C   s   dgS )Nz.rpir$   r$   r$   r$   r%   r-   Â   s    z,RPAv1ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   xœr$   r$   r$   r$   r%   r.   Æ   s    z)RPAv1ArchiveHandler.get_supported_headersc                 C   s   t t |  ¡ ¡ƒS ©N)r   rG   rH   rD   )rK   r$   r$   r%   rO   Ê   s    zRPAv1ArchiveHandler.read_indexNrP   r$   r$   r$   r%   rX   »   s   

rX   c               
   C   sÈ  t tjjkrdS tjjdd… a t ¡  tƒ  g ad} tD ]&}| ¡ D ]}t	|ƒ}|| krF|} qFq:g }tD ]$}| 
¡ D ]}||vrv| |¡ qvqjtjjD ]ä}|D ]Ú}d}d}zt|| ƒ}t|dƒ}W n tyÜ   Y q Y n0 |† | | ¡}	tD ]f}d}
| ¡ D ]F}|	 |¡r| dd¡ | |¡}t ||j |f¡ d}
 qJq|
dkrò qZqòW d  ƒ q 1 sp0    Y  q q˜tƒ D ]\}}|tt d| ¡ ¡< q„tD ]}|tt d| ¡ ¡< q¨dS )zQ
    Loads in the indexes for the archive files. Also updates the lower_map.
    Nr   ÚrbFTÚNFC)Úold_config_archivesr   r   ÚarchivesÚ	lower_mapÚclearÚcleardirfilesÚarchive_handlersr.   rJ   r-   ÚappendÚtransfnr   r!   rD   Ú
startswithrF   rO   rU   ÚlistdirfilesÚunicodedataÚ	normalizeÚlowerÚremote_files)Zmax_header_lengthÚhandlerÚheaderZ
header_lenZarchive_extensionsÚextr(   r"   ÚfZfile_headerZarchive_handledrM   Údirr$   r$   r%   Úindex_archivesÒ   sV    	



,ro   c              	   C   s®   g }t j | ¡stjjs|S t  | ¡D ]‚}|d dkr8q&ztj |¡}W n t	y^   Y q&Y n0 t j 
| d | ¡ržt| d | ƒD ]}| |d | ¡ q„q&| |¡ q&|S )Nr   Ú.ú/)r   r   r   r   r   Ú	developerÚlistdirÚexportsÚfsdecoder!   ÚisdirÚwalkdirrb   )rn   ÚrvÚir"   r$   r$   r%   rw     s    
rw   c                   C   s   g a g adS )z;
    Clears the lists above when the game has changed.
    N)Ú
game_filesÚcommon_filesr$   r$   r$   r%   r`   8  s    r`   c                  C   s&   t ƒ } dd„ }tD ]}||| ƒ qdS )z^
    Scans directories, archives, and apks and fills out game_files and
    common_files.
    c                 S   s`   t |ƒ}||v rd S | d¡r"d S | d¡r0d S | | |f¡ | |¡ dtt d| ¡ ¡< d S )Nzcache/zsaves/Tr[   )r   rd   rb   ÚaddÚloadable_cacherf   rg   rh   )r#   r"   ÚfilesÚseenr$   r$   r%   r|   P  s    


zscandirfiles.<locals>.addN)ÚsetÚscandirfiles_callbacks)r   r|   ry   r$   r$   r%   ÚscandirfilesH  s    r‚   c                 C   sV   t D ]L}|tvrt}nt}| ¡ D ],}d dd„ | d¡D ƒ¡}| d|||ƒ q"qdS )z?
    Scans apks and fills out game_files and common_files.
    rq   c                 s   s   | ]}|d d… V  qdS )r<   Nr$   ©r=   ry   r$   r$   r%   Ú	<genexpr>u  r5   z(scandirfiles_from_apk.<locals>.<genexpr>N)ÚapksÚ	game_apksr{   rz   Úlistr   Úsplit)r|   r   r'   r~   rm   r$   r$   r%   Úscandirfiles_from_apke  s    r‰   c           	      C   sÎ   t j tjjd¡}t j |¡rÊt}t|dƒŽ}| 	¡ }| 	¡ }|dks¬|dkrPq¬| 
d¡}| 
d¡}| d¡\}}|dkrŽdd„ | d	¡D ƒ}| d
|||ƒ ||dœt|< q.W d  ƒ n1 sÀ0    Y  dS )z>
    Fills out game_files from renpyweb_remote_files.txt.
    zrenpyweb_remote_files.txtÚrr   z
ú Úimagec                 S   s   g | ]}t |ƒ‘qS r$   )rE   rƒ   r$   r$   r%   rA   ’  r5   z1scandirfiles_from_remote_file.<locals>.<listcomp>ú,z/game)ÚtypeÚsizeN)r   r   r   r   r   r   r   rz   r   ÚreadlineÚrstriprˆ   ri   )	r|   r   Zindex_filenamer~   Zremote_indexrm   ÚmetadataZ
entry_typeZ
entry_sizer$   r$   r%   Úscandirfiles_from_remote_file~  s    

r“   ÚRENPY_SIMULATE_DOWNLOADFc                 C   s^   t jjD ]P}t jjr&|t jjkr&t}nt}tj t jj	|¡}t
|ƒD ]}| ||||ƒ qDqdS )zF
    Scans directories and fills out game_files and common_files.
    N)r   r   Ú
searchpathÚ	commondirr{   rz   r   r   r   Úbasedirrw   )r|   r   ry   r~   Újr$   r$   r%   Úscandirfiles_from_filesystemœ  s    r™   c                 C   s.   t }tD ] \}}|D ]}| d|||ƒ qqdS )z2
    Scans archives and fills out game_files.
    N)rz   r]   )r|   r   r~   Ú_prefixrM   r˜   r$   r$   r%   Úscandirfiles_from_archives°  s    r›   Tc                 C   s&   t ststƒ  | rt t S tt ƒS dS )z€
    Returns a list of directory, file tuples known to the system. If
    the file is in an archive, the directory is None.
    N)rz   r{   r‚   r‡   )Úcommonr$   r$   r%   re   ¿  s
    re   c                   @   s¬   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd(dd„Zdd„ Z	d)dd„Z
d*dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd„ Zd+d d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd
S ),ÚSubFileFc                 C   s<   || _ d | _|| _d| _|| _|| _| js2|| _nd | _d S ©Nr   )r"   rm   Úbaser>   ÚlengthrB   Úname)Úselfr"   rŸ   r    rB   r$   r$   r%   Ú__init__Ñ  s    zSubFile.__init__c                 C   s    t | jdƒ| _| j | j¡ d S )NrZ   )r   r"   rm   rF   rŸ   ©r¢   r$   r$   r%   r   à  s    zSubFile.openc                 C   s   | S rY   r$   r¤   r$   r$   r%   Ú	__enter__ä  s    zSubFile.__enter__c                 C   s   |   ¡  dS ©NF)Úclose)r¢   Ú_typeÚvalueÚtbr$   r$   r%   Ú__exit__ç  s    zSubFile.__exit__Nc                 C   sš   | j d u r|  ¡  | j| j }|d ur2t||ƒ}n|}| j| j| j| … }|t|ƒ8 }|  jt|ƒ7  _|rŽ| j  |¡}|  jt|ƒ7  _nd}|| S )Nr5   )rm   r   r    r>   ÚminrB   rJ   rD   )r¢   r    Ú	maxlengthZrv1Zrv2r$   r$   r%   rD   ë  s    
zSubFile.readc                 C   s   dS ©NTr$   r¤   r$   r$   r%   Úreadable  s    zSubFile.readablec                 C   sš   | j d u r|  ¡  | j| j }|d ur2t||ƒ}n|}| jt| jƒk rxd}|rt|  d¡}||7 }|dkrjqt|d8 }qJ|S | j  |¡}|  jt|ƒ7  _|S )Nr5   é   ó   
)	rm   r   r    r>   r¬   rJ   rB   rD   r   )r¢   r    r­   rx   Úcr$   r$   r%   r     s$    


zSubFile.readlinec                 C   sB   g }|   |¡}|sq>|d ur2|t|ƒ8 }|dk r2q>| |¡ q|S rž   )r   rJ   rb   )r¢   r    rx   rL   r$   r$   r%   Ú	readlines%  s    
zSubFile.readlinesc                 C   s   dS r®   r$   r¤   r$   r$   r%   Úseekable7  s    zSubFile.seekablec                 C   s   dS r¦   r$   r¤   r$   r$   r%   Úwritable:  s    zSubFile.writablec                 C   s   | S rY   r$   r¤   r$   r$   r%   Ú
xreadlines=  s    zSubFile.xreadlinesc                 C   s   | S rY   r$   r¤   r$   r$   r%   Ú__iter__@  s    zSubFile.__iter__c                 C   s   |   ¡ }|stƒ ‚|S rY   )r   ÚStopIteration)r¢   rx   r$   r$   r%   Ú__next__C  s    zSubFile.__next__c                 C   s   d S rY   r$   r¤   r$   r$   r%   ÚflushM  s    zSubFile.flushr   c                 C   s~   | j d u r|  ¡  |dkr&| j| }n|dkr8| j| }|| jkrH| j}|| _|t| jƒ }|dk rhd}| j  || j ¡ d S )Nr°   r<   r   )rm   r   r>   r    rJ   rB   rF   rŸ   )r¢   r>   Úwhencer$   r$   r%   rF   P  s    


zSubFile.seekc                 C   s   | j S rY   )r>   r¤   r$   r$   r%   Útelle  s    zSubFile.tellc                 C   s   | j d ur| j  ¡  d | _ d S rY   )rm   r§   r¤   r$   r$   r%   r§   h  s    

zSubFile.closec                 C   s   t dƒ‚d S )NzWrite not supported by SubFile)r!   )r¢   r:   r$   r$   r%   Úwritem  s    zSubFile.write)N)N)N)r   )rQ   rR   rS   Úclosedr£   r   r¥   r«   rD   r¯   r   r³   r´   rµ   r¶   r·   r¹   Únextrº   rF   r¼   r§   r½   r$   r$   r$   r%   r   Î  s(   



r   ZRENPY_FORCE_SUBFILEc                 C   s8   t | |ƒ}| dd¡ | ¡ }| dd¡ t|d|dƒS )Nr   r<   r5   )r   rF   r¼   r   )r¡   Úmoderm   r    r$   r$   r%   Ú	open_fileu  s
    
rÁ   c                 C   s>   t  t d|  ¡ ¡| ¡} tD ]}|| ƒ}|dur|  S qdS )z?
    Returns an open python file object of the given type.
    r[   N)r^   Úgetrf   rg   rh   Úfile_open_callbacks)r¡   ry   rx   r$   r$   r%   Ú	load_core‚  s    
rÄ   c                 C   s   t jjrt j | ¡S dS )z[
    Returns an open python file object of the given type from the file open callback.
    N)r   r   Úfile_open_callback©r¡   r$   r$   r%   Úload_from_file_open_callback‘  s    rÇ   c                 C   s4   t jjs0zt| ƒ}t|dƒW S  ty.   Y n0 dS )zS
    Returns an open python file object of the given type from the filesystem.
    rZ   N)r   r   Úforce_archivesrc   rÁ   r!   )r¡   r"   r$   r$   r%   Úload_from_filesystemŸ  s    rÉ   c              	   C   sL   t D ]B}d dd„ |  d¡D ƒ¡}z| |¡W   S  tyD   Y q0 qdS )zL
    Returns an open python file object of the given type from the apk.
    rq   c                 s   s   | ]}d | V  qdS ©zx-Nr$   rƒ   r$   r$   r%   r„   ·  r5   z load_from_apk.<locals>.<genexpr>N)r…   r   rˆ   r   ÚIOError)r¡   r'   Úprefixed_namer$   r$   r%   Úload_from_apk±  s    rÍ   c              	   C   sä   t D ]Ú\}}| |vrqt|ƒ}g }t||  ƒdkrr||  d }t|ƒdkrX|\}}d}n
|\}}}t||||ƒ}	nft|dƒL}
||  D ]"\}}|
 |¡ | |
 |¡¡ q†t 	d 
|¡¡}	W d  ƒ n1 sÎ0    Y  |	  S dS )zT
    Returns an open python file object of the given type from an archive file.
    r°   r   r<   r5   rZ   N)r]   rc   rJ   r   r   rF   rb   rD   ÚioÚBytesIOr   )r¡   r(   rM   ZafnÚdataÚtr>   r?   rB   rx   rm   r$   r$   r%   Úload_from_archiveÅ  s&    

.rÒ   c                 C   s*   | t v r&t| t |  d t |  d d‚dS )za
    Defer loading a file if it has not been downloaded yet but exists on the remote server.
    rŽ   r   )ÚrelpathZrtyper   N)ri   r   rÆ   r$   r$   r%   Úload_from_remote_fileî  s    rÔ   c                 C   sN   t jjrd| v rtd|  ƒ‚t jjrJ|  d¡}d|v s>d|v rJtd|  ƒ‚dS )zF
    Checks the name to see if it violates any of Ren'Py's rules.
    ú\ú*Backslash in filename, use '/' instead: %rrq   rp   z..zDFilenames may not contain relative directories like '.' and '..': %rN)r   r   Úreject_backslashr!   Úreject_relativerˆ   )r¡   rˆ   r$   r$   r%   Ú
check_nameý  s    
rÙ   c                 C   sZ   g }| rt jjj}nd}t jjD ]4}|durJ| t jjd | d | ¡ | |¡ q |S )z9
    Returns a list of prefixes to search for files.
    Nrq   )r   ÚgameÚpreferencesÚlanguager   Úsearch_prefixesrb   Útl_directory)Útlrx   rÜ   r(   r$   r$   r%   Úget_prefixes  s    rà   c                 C   s¤   t jjjr:t ¡ jdkr:t js:tj	 
dd¡s:td | ¡ƒ‚t jjrVd| v rVtd|  ƒ‚t dd| ¡ d¡} t|ƒD ] }t||  ƒ}|d urr|  S qrtd	|  ƒ‚d S )
NÚ
MainThreadr”   Fz%Refusing to open {} while predicting.rÕ   rÖ   z/+rq   úCouldn't find file '%s'.)r   ÚdisplayZpredictZ
predictingÚ	threadingÚcurrent_threadr¡   Ú
emscriptenr   ÚenvironrÂ   r!   Úformatr   r×   ÚreÚsubÚlstriprà   rÄ   rË   )r¡   rß   Úprx   r$   r$   r%   Úload#  s    

rí   c                 C   sÒ   t  t d|  ¡ ¡| ¡} | tv r(t|  S zt| ƒ dt| < W dS  tyP   Y n0 tD ]6}d 	dd„ |  
d¡D ƒ¡}||jv rVdt| <  dS qVtD ]\}}| |v r’dt| <  dS q’| tv rÆdt| < | S dt| < dS )zM
    Returns True if the name is loadable with load, False if it is not.
    r[   Trq   c                 s   s   | ]}d | V  qdS rÊ   r$   rƒ   r$   r$   r%   r„   I  r5   z loadable_core.<locals>.<genexpr>F)r^   rÂ   rf   rg   rh   r}   rc   r!   r…   r   rˆ   Úinfor]   ri   )r¡   r'   rÌ   rš   rM   r$   r$   r%   Úloadable_core7  s.    
rï   c                 C   sH   |   d¡} tjjd ur&tj | ¡r&dS tƒ D ]}t||  ƒr, dS q,dS )Nrq   TF)rë   r   r   Úloadable_callbackrà   rï   )r¡   rì   r$   r$   r%   Úloadable[  s    

rñ   c                 C   s    |   d¡} tjjr&d| v r&td|  ƒ‚t t d|  	¡ ¡| ¡} t
| tƒrR|  d¡} tjjD ]4}tj tjj|| ¡}t|ƒ tj |¡rZ|  S qZtd|  ƒ‚dS )zc
    Tries to translate the name to a file that exists in one of the
    searched directories.
    rq   rÕ   rÖ   r[   r   râ   N)rë   r   r   r×   r!   r^   rÂ   rf   rg   rh   r7   r8   Údecoder•   r   r   r   r—   Úadd_autoÚisfile)r¡   Údr"   r$   r$   r%   rc   i  s    



rc   c                 C   sf   t  | d¡}|dur|S d}z*t| ƒ}| d¡}|s6qDt ||¡}q&W n tyX   Y n0 |t | < |S )ze
    Returns the time the file m was last modified, or 0 if it
    doesn't exist or is archived.
    Nr   i   )Ú
hash_cacherÂ   rí   rD   rG   Úadler32r!   )r¡   rx   rm   rÐ   r$   r$   r%   Úget_hash‡  s    
rø   c                   @   s>   e Zd ZdZddd„Zddd„Zddd	„Zd
d„ Zdd„ ZdS )ÚRenpyImporterzk
    An importer, that tries to load modules from the places where Ren'Py
    searches for data files.
    r   c                 C   s
   || _ d S rY   r)   )r¢   r(   r$   r$   r%   r£   ®  s    zRenpyImporter.__init__Nc                 C   sx   |d u r| j }z(t|tƒs$| d¡}|| dd¡ }W n tyJ   Y d S 0 t|d ƒr`|d S t|d ƒrt|d S d S )Nr   rp   rq   z.pyz/__init__.py)r(   r7   r   rò   Úreplacer!   rñ   )r¢   Úfullnamer(   r"   r$   r$   r%   Ú	translate±  s    

zRenpyImporter.translatec                 C   s<   |d ur*|D ]}|   ||¡rt|ƒ  S q|   |¡r8| S d S rY   )rü   rù   )r¢   rû   r   ry   r$   r$   r%   Úfind_moduleÈ  s    
zRenpyImporter.find_modulec              	   C   sü   |   || j¡}t|ƒ}tj |t |¡¡}||_||_	| |_
| d¡r\|d tdƒ … g|_dD ]„}zbt|ƒ ¡  |¡}|r”|d dkr”|dd … }| d¡}| dd¡}t||d	tjjdƒ}W  qæW q` tyâ   |d
krÞ‚ Y q`0 q`t||jƒ tj| S )Nz__init__.py)r   r6   r   u   ï»¿r°   Zraw_unicode_escapeó   r5   Úexecr6   )rü   r(   r   ÚsysÚmodulesÚ
setdefaultÚtypesÚ
ModuleTyperQ   Ú__file__Ú
__loader__ÚendswithrJ   Ú__path__rí   rD   rò   r9   rú   Úcompiler   ÚpythonZold_compile_flagsr!   rÿ   Ú__dict__)r¢   rû   ÚfilenameZpynameÚmodÚencodingÚsourceÚcoder$   r$   r%   Úload_moduleÑ  s,    



zRenpyImporter.load_modulec                 C   s   t |ƒ ¡ S rY   )rí   rD   )r¢   r  r$   r$   r%   Úget_dataó  s    zRenpyImporter.get_data)r   )N)N)	rQ   rR   rS   rT   r£   rü   rý   r  r  r$   r$   r$   r%   rù   ¨  s   


	"rù   c                 C   s,   | r|   d¡s| d } tj dt| ƒ¡ dS )zÙ
    :doc: other

    Adds `path` to the list of paths searched for Python modules and packages.
    The path should be a string relative to the game directory. This must be
    called before an import statement.
    rq   r   N)r  r   Ú	meta_pathÚinsertrù   )r   r$   r$   r%   Úadd_python_directoryú  s    	r  c                   C   s"   t jtd d …< tdƒ tdƒ d S )Nzpython-packages/r   )r   r  Úmeta_backupr  r$   r$   r$   r%   Úinit_importer  s    r  c                   C   s   t tjd d …< d S rY   )r  r   r  r$   r$   r$   r%   Úquit_importer  s    r  Úauto_blacklistedc                 C   s(   zt j | ¡W S  ty"   Y dS 0 dS )zC
    Gets the mtime of fn, or None if the file does not exist.
    N)r   r   Úgetmtimer!   )r"   r$   r$   r%   Ú
auto_mtime,  s    r  c              	   C   s¨   |   dd¡} tjsdS | tv r&|s&dS tjjD ]@}|  |¡r.t tt| < W d  ƒ n1 s^0    Y   dS q.t	| ƒ}t |t| < W d  ƒ n1 sš0    Y  dS )zƒ
    Adds fn as a file we watch for changes. If it's mtime changes or the file
    starts/stops existing, we trigger a reload.
    rÕ   rq   N)
rú   r   Ú
autoreloadÚauto_mtimesr   Úautoreload_blacklistr  Ú	auto_lockr  r  )r"   ÚforceÚeÚmtimer$   r$   r%   ró   7  s    
&ró   c               	   C   s¶   t : t  d¡ tr$W d  ƒ dS tt ¡ ƒ} W d  ƒ n1 sD0    Y  | D ]\\}}|tu rdqRt|ƒ|krRt * t|ƒt| krt 	|¡ W d  ƒ qR1 s¤0    Y  qRq dS )z:
    This thread sets need_autoreload when necessary.
    g      ø?N)
r  ÚwaitÚauto_quit_flagr‡   r  Úitemsr  r  Úneeds_autoreloadr|   )r%  r"   r"  r$   r$   r%   Úauto_thread_functionQ  s    	
*r'  c                  C   s°   t r¬ttt ƒƒ} t| ƒ}t" t  | ¡ |t| < W d  ƒ n1 sD0    Y  tjsXdS tj	j
D ]>\}}t || tj¡r`tj | tj	j¡ dd¡} || ƒ  q q`tj ¡  q dS )z2
    Checks to see if autoreload is required.
    NrÕ   rq   )r&  r¿   Úiterr  r  Údiscardr  r   r  r   Úautoreload_functionsré   ÚsearchÚIr   r   rÓ   r   rú   rt   Zreload_script)r"   r"  ZregexÚfuncr$   r$   r%   Úcheck_autoreloado  s    
&r.  c                   C   s2   t ƒ atjsdS datjtdadt_	t 
¡  dS )z'
    Starts the autoreload thread.
    NF)ÚtargetT)r€   r&  r   r  r$  rä   ÚThreadr'  Úauto_threadÚdaemonrB   r$   r$   r$   r%   Ú	auto_initˆ  s    	r3  c                   C   sH   t du rdS dat t ¡  W d  ƒ n1 s20    Y  t  ¡  dS )z+
    Terminates the autoreload thread.
    NT)r1  r$  r  Ú
notify_allr   r$   r$   r$   r%   Ú	auto_quit  s    &r5  )T)T)T)F)lÚ
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Útypingr   r   r   r   r  rä   rG   ré   rÎ   rf   Úrenpy.compat.pickler   Zrenpy.webloaderr   r9   r&   ÚandroidZandroid.apkrç   rÂ   Z	expansionÚprintr'   ZAPKr…   r†   r]   r\   r^   ra   Úobjectr*   rb   rW   rX   ro   rw   rz   r{   r}   ri   r`   r   r‚   r‰   r“   ræ   r™   r›   re   r   rÁ   rÃ   rÄ   rÇ   rÉ   rÍ   rÒ   rÔ   rÙ   rà   rí   rï   rñ   rc   Údictrö   rø   rù   r  r  r  r  r€   r&  r  r1  r$  Ú	Conditionr  ÚSentinelr  r  ró   r'  r.  r3  r5  r$   r$   r$   r%   Ú<module>   sÒ   8


þþ,


A




 $



&



$!O
