Ë
    rR hÍ  ã                  óä   — U 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ZdZ e	d„ ej                  ej                  j                  fD «       «      Zded<   dd„Zdd	„Z	 d	 	 	 	 	 	 	 dd
„Zdd„Zdd„Zy)é    )ÚannotationsNÚ>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789i@B c              #  ó2   K  — | ]  }|€Œ|dk7  sŒ|–— Œ y ­w)Nú/© )Ú.0Úseps     úI/var/www/timesheet/venv/lib/python3.12/site-packages/werkzeug/security.pyú	<genexpr>r      s   è ø€ ò Ø¨s©À3È#Ã:„Cñùs   ‚Š�z	list[str]Ú_os_alt_sepsc                ód   — | dk  rt        d«      ‚dj                  d„ t        | «      D «       «      S )zAGenerate a random string of SALT_CHARS with specified ``length``.r   zSalt length must be at least 1.Ú c              3  óN   K  — | ]  }t        j                  t        «      –— Œ y ­w©N)ÚsecretsÚchoiceÚ
SALT_CHARS)r   Ú_s     r
   r   zgen_salt.<locals>.<genexpr>   s   è ø€ ÒE°!”7—>‘>¤*×-ÑEùs   ‚#%)Ú
ValueErrorÚjoinÚrange)Úlengths    r
   Úgen_saltr      s.   € à�‚{ÜÐ:Ó;Ð;à�7‰7ÑE´u¸V³}ÔEÓEÐEó    c                ó~  — | j                  d«      ^} }|j                  «       }|j                  «       }| dk(  r]|sd}d}d}n	 t        t        |«      \  }}}d|z  |z  |z  }	t        j                  ||||||	¬«      j                  «       d	|› d|› d|› �fS | d
k(  r|t        |«      }
|
dk(  r	d}t        }n5|
dk(  r|d   }t        }n$|
dk(  r|d   }t        |d   «      }nt	        d«      ‚t        j                  ||||«      j                  «       d|› d|› �fS t	        d| › d�«      ‚# t        $ r t	        d«      d ‚w xY w)Nú:Úscrypti €  é   é   z'scrypt' takes 3 arguments.é„   )ÚsaltÚnÚrÚpÚmaxmemzscrypt:Úpbkdf2r   Úsha256é   z'pbkdf2' takes 2 arguments.zpbkdf2:zInvalid hash method 'z'.)ÚsplitÚencodeÚmapÚintr   Úhashlibr   ÚhexÚlenÚDEFAULT_PBKDF2_ITERATIONSÚpbkdf2_hmac)Úmethodr!   ÚpasswordÚargsÚ
salt_bytesÚpassword_bytesr"   r#   r$   r%   Úlen_argsÚ	hash_nameÚ
iterationss                r
   Ú_hash_internalr:      s„  € Ø—L‘L Ó%€M€FˆTØ—‘“€JØ—_‘_Ó&€Nà�ÒÙØˆAØˆAØ‰AðJÜœc 4›.‘��1�að �q‘˜1‘˜q‘ˆä�N‰NØ Z°1¸¸QÀvôç‰c‹eØ�a�S˜˜!˜˜A˜a˜SÐ!ð	
ð 	
ð 
�8Ò	Ü�t“9ˆà�qŠ=Ø ˆIÜ2‰JØ˜Š]Ø˜Q™ˆIÜ2‰JØ˜Š]Ø˜Q™ˆIÜ˜T !™W›‰JäÐ:Ó;Ð;ô ×ÑØ˜>¨:°zóç‰c‹eØ�i�[  * Ð.ð	
ð 	
ô Ð0°°¸Ð;Ó<Ð<øôA ò JÜ Ð!>Ó?ÀTÐIðJús   ÁD& Ä&D<c                óL   — t        |«      }t        ||| «      \  }}|› d|› d|› �S )aD  Securely hash a password for storage. A password can be compared to a stored hash
    using :func:`check_password_hash`.

    The following methods are supported:

    -   ``scrypt``, the default. The parameters are ``n``, ``r``, and ``p``, the default
        is ``scrypt:32768:8:1``. See :func:`hashlib.scrypt`.
    -   ``pbkdf2``, less secure. The parameters are ``hash_method`` and ``iterations``,
        the default is ``pbkdf2:sha256:600000``. See :func:`hashlib.pbkdf2_hmac`.

    Default parameters may be updated to reflect current guidelines, and methods may be
    deprecated and removed if they are no longer considered secure. To migrate old
    hashes, you may generate a new hash when checking an old hash, or you may contact
    users with a link to reset their password.

    :param password: The plaintext password.
    :param method: The key derivation function and parameters.
    :param salt_length: The number of characters to generate for the salt.

    .. versionchanged:: 3.1
        The default iterations for pbkdf2 was increased to 1,000,000.

    .. versionchanged:: 2.3
        Scrypt support was added.

    .. versionchanged:: 2.3
        The default iterations for pbkdf2 was increased to 600,000.

    .. versionchanged:: 2.3
        All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
    ú$)r   r:   )r3   r2   Úsalt_lengthr!   ÚhÚactual_methods         r
   Úgenerate_password_hashr@   I   s9   € ôD �KÓ €DÜ% f¨d°HÓ=Ñ€A€}Øˆ_˜A˜d˜V 1 Q CÐ(Ð(r   c                ó–   — 	 | j                  dd«      \  }}}t        j                  t	        |||«      d   |«      S # t        $ r Y yw xY w)aA  Securely check that the given stored password hash, previously generated using
    :func:`generate_password_hash`, matches the given password.

    Methods may be deprecated and removed if they are no longer considered secure. To
    migrate old hashes, you may generate a new hash when checking an old hash, or you
    may contact users with a link to reset their password.

    :param pwhash: The hashed password.
    :param password: The plaintext password.

    .. versionchanged:: 2.3
        All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
    r<   r(   Fr   )r)   r   ÚhmacÚcompare_digestr:   )Úpwhashr3   r2   r!   Úhashvals        r
   Úcheck_password_hashrF   p   sU   € ðØ &§¡¨S°!Ó 4Ñˆ��gô ×Ñœ~¨f°d¸HÓEÀaÑHÈ'ÓRÐRøô ò Ùðús   ‚< ¼	AÁAc                óZ  ‡— | sd} | g}|D ]�  Š‰dk7  rt        j                  ‰«      Št        ˆfd„t        D «       «      sFt        j
                  j                  ‰«      s'‰j                  d«      s‰dk(  s‰j                  d«      r y|j                  ‰«       Œ� t        j                  |Ž S )a2  Safely join zero or more untrusted path components to a base
    directory to avoid escaping the base directory.

    :param directory: The trusted base directory.
    :param pathnames: The untrusted path components relative to the
        base directory.
    :return: A safe path, otherwise ``None``.
    ú.r   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   r   )r   r	   Úfilenames     €r
   r   zsafe_join.<locals>.<genexpr>›   s   øè ø€ Ò8 C��x”Ñ8ùs   ƒr   z..z../N)
Ú	posixpathÚnormpathÚanyr   ÚosÚpathÚisabsÚ
startswithÚappendr   )Ú	directoryÚ	pathnamesÚpartsrJ   s      @r
   Ú	safe_joinrV   †   s    ø€ ñ ð ˆ	àˆK€Eàò ˆØ�rŠ>Ü ×)Ñ)¨(Ó3ˆHô Ó8¬<Ô8Ô8Ü�w‰w�}‰}˜XÔ&à×"Ñ" 3Ô'Ø˜4ÒØ×"Ñ" 5Ô)áà�‰�XÕðô  �>‰>˜5Ð!Ð!r   )r   r,   ÚreturnÚstr)r2   rX   r!   rX   r3   rX   rW   ztuple[str, str])r   é   )r3   rX   r2   rX   r=   r,   rW   rX   )rD   rX   r3   rX   rW   Úbool)rS   rX   rT   rX   rW   z
str | None)Ú
__future__r   r-   rB   rN   rK   r   r   r0   Úlistr	   rO   Úaltsepr   Ú__annotations__r   r:   r@   rF   rV   r   r   r
   ú<module>r_      s”   ðÞ "ã Û Û 	Û Û àM€
Ø%Ð áñ Ø—F‘F˜BŸG™GŸN™NÐ+ôó €ˆió ó
Fó-=ðb ?Að$)Øð$)Øð$)Ø8;ð$)àó$)óNSô, "r   