Ë
    ±Œjý"  ã                  ó”   — d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
Zd dlmZmZmZmZ  G d„ d«      Z G d„ d	eeee«      Zy)
é    )ÚannotationsN)ÚCounterÚdefaultdict)Úfloor)ÚMovingWindowSupportÚSlidingWindowCounterSupportÚStorageÚTimestampedSlidingWindowc                  ó   — e Zd Zdd„Zy)ÚEntryc                ó^   — t        j                   «       | _        | j                  |z   | _        y ©N)ÚtimeÚatimeÚexpiry)Úselfr   s     ú_/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/limits/storage/memory.pyÚ__init__zEntry.__init__   s   € Ü—Y‘Y“[ˆŒ
Ø—j‘j 6Ñ)ˆ�ó    N)r   ÚfloatÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__r   © r   r   r   r      s   „ ô*r   r   c                  ó  ‡ — e Zd ZdZdgZddˆ fd„Zdd„Zdd„Zdd„Zdd„Z	e
	 	 dd„«       Zddd	„Zddd
„Zdd„Zd d„Zdd!d„Zd"d„Zd#d„Z	 d	 	 	 	 	 	 	 	 	 d!d„Z	 	 	 	 	 	 	 	 	 	 d$d„Z	 	 	 	 	 	 d%d„Zd&d„Zd'd„Zd(d„Zˆ xZS ))ÚMemoryStoragezÀ
    rate limit storage using :class:`collections.Counter`
    as an in memory storage for fixed and sliding window strategies,
    and a simple list to implement moving window strategy.

    Úmemoryc                ó  •— t        «       | _        t        t        j                  «      | _        i | _        i | _        t        j                  d| j                  «      | _
        | j                  j                  «        t        ‰| �4  |fd|i|¤Ž y )Nç{®Gáz„?Úwrap_exceptions)r   Ústorager   Ú	threadingÚRLockÚlocksÚexpirationsÚeventsÚTimerÚ_MemoryStorage__expire_eventsÚtimerÚstartÚsuperr   )r   Úurir"   Ú_Ú	__class__s       €r   r   zMemoryStorage.__init__$   sj   ø€ Ü3:³9ˆŒÜ8CÄIÇOÁOÓ8TˆŒ
Ø-/ˆÔØ.0ˆŒÜ&/§o¡o°d¸D×<PÑ<PÓ&QˆŒ
Ø�
‰
×ÑÔÜ‰Ñ˜ÑC¨oÐCÀÓCr   c                óF   — | j                   j                  «       }|d= |d= |S )Nr+   r&   )Ú__dict__Úcopy©r   Ústates     r   Ú__getstate__zMemoryStorage.__getstate__-   s'   € Ø—‘×"Ñ"Ó$ˆØ�'ˆNØ�'ˆNØˆr   c                óô   — | j                   j                  |«       t        t        j                  «      | _        t        j                  d| j                  «      | _        | j                  j                  «        y ©Nr!   )
r2   Úupdater   r$   r%   r&   r)   r*   r+   r,   r4   s     r   Ú__setstate__zMemoryStorage.__setstate__3   sL   € Ø�‰×Ñ˜UÔ#Ü ¤§¡Ó1ˆŒ
Ü—_‘_ T¨4×+?Ñ+?Ó@ˆŒ
Ø�
‰
×ÑÕr   c                ó"  — t        | j                  j                  «       «      D ]»  }| j                  |   5  | j                  j	                  |g «      x}rKt        j                  |t        j                  «        d„ ¬«      }| j                  |   d | | j                  |<   | j                  j	                  |d «      s| j                  j                  |d «       d d d «       Œ½ t        | j                  j                  «       «      D ]{  }| j                  |   t        j                  «       k  sŒ(| j                  j                  |d «       | j                  j                  |d «       | j                  j                  |d «       Œ} y # 1 sw Y   �ŒjxY w)Nc                ó   — | j                    S r   )r   )Úevents    r   Ú<lambda>z/MemoryStorage.__expire_events.<locals>.<lambda>>   s
   € ÀÇÁÁr   ©Úkey)Úlistr(   Úkeysr&   ÚgetÚbisectÚbisect_leftr   Úpopr'   r#   )r   r@   r(   Úoldests       r   Ú__expire_eventszMemoryStorage.__expire_events9   s+  € Ü˜Ÿ™×(Ñ(Ó*Ö+ˆCØ—‘˜C“Ø!Ÿ[™[Ÿ_™_¨S°"Ó5Ð5�6Ð5Ü#×/Ñ/Ø¤§¡£ Ñ2Mô�Fð (,§{¡{°3Ñ'7¸¸Ð'@�D—K‘K Ñ$Ø—{‘{—‘ s¨DÔ1Ø—J‘J—N‘N 3¨Ô-÷ !�ð ,ô ˜×(Ñ(×-Ñ-Ó/Ö0ˆCØ×Ñ Ñ$¬¯	©	«Ó3Ø—‘× Ñ   dÔ+Ø× Ñ ×$Ñ$ S¨$Ô/Ø—
‘
—‘˜s DÕ)ñ	 1÷ !‘ús   ¶B"FÆF	c                ó¸   — | j                   j                  «       s@t        j                  d| j                  «      | _         | j                   j                  «        y y r8   )r+   Úis_aliver$   r)   r*   r,   ©r   s    r   Ú__schedule_expiryzMemoryStorage.__schedule_expiryI   s?   € Ø�z‰z×"Ñ"Ô$Ü"Ÿ™¨¨t×/CÑ/CÓDˆDŒJØ�J‰J×ÑÕð %r   c                ó   — t         S r   )Ú
ValueErrorrK   s    r   Úbase_exceptionszMemoryStorage.base_exceptionsN   s
   € ô Ðr   c                ó^  — | j                  |«       | j                  «        | j                  |   5  | j                  |xx   |z  cc<   | j                  |   |k(  r$t	        j                  «       |z   | j
                  |<   ddd«       | j                  j                  |d«      S # 1 sw Y   Œ%xY w)zá
        increments the counter for a given rate limit key

        :param key: the key to increment
        :param expiry: amount in seconds for the key to expire in
        :param amount: the number to increment by
        Nr   )rC   Ú_MemoryStorage__schedule_expiryr&   r#   r   r'   )r   r@   r   Úamounts       r   ÚincrzMemoryStorage.incrT   sŒ   € ð 	�‰�ŒØ×ÑÔ Ø�Z‰Z˜‹_Ø�L‰L˜Ó Ñ'ÓØ�|‰|˜CÑ  FÒ*Ü(,¯	©	«°fÑ(<�× Ñ  Ñ%÷ ð �|‰|×Ñ  QÓ'Ð'÷	 ˆ_ús   ±AB#Â#B,c                ó  — | j                  |«       | j                  «        | j                  |   5  t        | j                  |   |z
  d«      | j                  |<   ddd«       | j                  j                  |d«      S # 1 sw Y   Œ%xY w)zŸ
        decrements the counter for a given rate limit key

        :param key: the key to decrement
        :param amount: the number to decrement by
        r   N)rC   rQ   r&   Úmaxr#   )r   r@   rR   s      r   ÚdecrzMemoryStorage.decrd   so   € ð 	�‰�ŒØ×ÑÔ Ø�Z‰Z˜‹_Ü # D§L¡L°Ñ$5¸Ñ$>ÀÓ BˆD�L‰L˜Ñ÷ ð �|‰|×Ñ  QÓ'Ð'÷ ˆ_ús   ±*A?Á?Bc                óD  — | j                   j                  |d«      t        j                  «       k  rT| j                  j	                  |d«       | j                   j	                  |d«       | j
                  j	                  |d«       | j                  j                  |d«      S )zB
        :param key: the key to get the counter value for
        r   N)r'   rC   r   r#   rF   r&   ©r   r@   s     r   rC   zMemoryStorage.getr   sx   € ð
 ×Ñ×Ñ  QÓ'¬4¯9©9«;Ò6Ø�L‰L×Ñ˜S $Ô'Ø×Ñ× Ñ   dÔ+Ø�J‰J�N‰N˜3 Ô%à�|‰|×Ñ  QÓ'Ð'r   c                óä   — | j                   j                  |d«       | j                  j                  |d«       | j                  j                  |d«       | j                  j                  |d«       y)z>
        :param key: the key to clear rate limits for
        N)r#   rF   r'   r(   r&   rX   s     r   ÚclearzMemoryStorage.clear~   sR   € ð 	�‰×Ñ˜˜dÔ#Ø×Ñ×Ñ˜S $Ô'Ø�‰�‰˜˜TÔ"Ø�
‰
�‰�s˜DÕ!r   c                ó¢  — ||kD  ry| j                  «        | j                  |   5  | j                  j                  |g «       t	        j                  «       }	 | j                  |   ||z
     }|r|j                  ||z
  k\  r
	 ddd«       yt        |«      g|z  | j                  |   dd 	 ddd«       y# t
        $ r d}Y ŒTw xY w# 1 sw Y   yxY w)zÖ
        :param key: rate limit key to acquire an entry in
        :param limit: amount of entries allowed
        :param expiry: expiry of the entry
        :param amount: the number of entries to acquire
        FNr   T)rQ   r&   r(   Ú
setdefaultr   Ú
IndexErrorr   r   )r   r@   Úlimitr   rR   Ú	timestampÚentrys          r   Úacquire_entryzMemoryStorage.acquire_entry‡   sÉ   € ð �EŠ>Øà×ÑÔ Ø�Z‰Z˜‹_Ø�K‰K×"Ñ" 3¨Ô+ÜŸ	™	›ˆIðØŸ™ CÑ(¨°©Ñ8�ñ ˜Ÿ™¨	°FÑ(:Ò:Ø÷ ˆ_ô ).¨f« ¸Ñ'?�—‘˜CÑ   !Ð$Ø÷ ˆ_øô
 ò Ø’ðú÷ ˆ_ús5   ¦1CÁB4Á-CÂ CÂ4CÂ?CÃCÃCÃCc                ó^   — | j                   j                  |t        j                  «       «      S )z;
        :param key: the key to get the expiry for
        )r'   rC   r   rX   s     r   Ú
get_expiryzMemoryStorage.get_expiry    s#   € ð
 ×Ñ×#Ñ# C¬¯©«Ó5Ð5r   c                óÐ   — t        j                   «       }| j                  j                  |g «      x}r1t        j                  |||z
   d„ ¬«      }||dz
     j
                  |fS |dfS )zí
        returns the starting point and the number of entries in the moving
        window

        :param key: rate limit key
        :param expiry: expiry of entry
        :return: (start of window, number of acquired entries)
        c                ó   — | j                    S r   )r   )r`   s    r   r>   z1MemoryStorage.get_moving_window.<locals>.<lambda>³   s
   € À%Ç+Á+Ár   r?   é   r   )r   r(   rC   rD   rE   r   )r   r@   r^   r   r_   r(   rG   s          r   Úget_moving_windowzMemoryStorage.get_moving_window§   so   € ô —I‘I“Kˆ	Ø—[‘[—_‘_ S¨"Ó-Ð-ˆ6Ð-Ü×'Ñ'Ø˜) fÑ,Ð-Ñ3MôˆFð ˜& 1™*Ñ%×+Ñ+¨VÐ3Ð3Ø˜!ˆ|Ðr   c                óV  — ||kD  ryt        j                   «       }| j                  |||«      \  }}| j                  ||||«      \  }}	}
}||	z  |z  |
z   }t        |«      |z   |kD  ry| j	                  |d|z  |¬«      }
||	z  |z  |
z   }t        |«      |kD  r| j                  ||«       yy)NFé   )rR   T)r   Úsliding_window_keysÚ_get_sliding_window_infor   rS   rV   )r   r@   r^   r   rR   ÚnowÚprevious_keyÚcurrent_keyÚprevious_countÚprevious_ttlÚcurrent_countr/   Úweighted_counts                r   Úacquire_sliding_window_entryz*MemoryStorage.acquire_sliding_window_entry¸   sÓ   € ð �EŠ>ØÜ�i‰i‹kˆØ$(×$<Ñ$<¸SÀ&È#Ó$NÑ!ˆ�kð ×)Ñ)¨,¸ÀVÈSÓQñ	
ØØØØà'¨,Ñ6¸Ñ?À-ÑOˆÜ�Ó  6Ñ)¨EÒ1Øð !ŸI™I k°1°v±:Àf˜IÓMˆMØ+¨lÑ:¸VÑCÀmÑSˆNÜ�^Ó$ uÒ,ð —	‘	˜+ vÔ.ØØr   c                ó¸   — | j                  |«      }| j                  |«      }|dk(  rt        d«      }nd||z
  |z  dz  z
  |z  }d||z  dz  z
  |z  |z   }||||fS )Nr   rf   )rC   r   )	r   rm   rn   r   rl   ro   rq   rp   Úcurrent_ttls	            r   rk   z&MemoryStorage._get_sliding_window_infoÙ   sz   € ð Ÿ™ ,Ó/ˆØŸ™ Ó-ˆØ˜QÒÜ  ›8‰Là 3¨¡<°6Ñ"9¸QÑ!>Ñ?À6ÑIˆLØ˜S 6™\¨QÑ.Ñ/°6Ñ9¸FÑBˆØ˜|¨]¸KÐGÐGr   c                ó~   — t        j                   «       }| j                  |||«      \  }}| j                  ||||«      S r   )r   rj   rk   ©r   r@   r   rl   rm   rn   s         r   Úget_sliding_windowz MemoryStorage.get_sliding_windowé   s@   € ô �i‰i‹kˆØ$(×$<Ñ$<¸SÀ&È#Ó$NÑ!ˆ�kØ×,Ñ,¨\¸;ÈÐPSÓTÐTr   c                óœ   — t        j                   «       }| j                  |||«      \  }}| j                  |«       | j                  |«       y r   )r   rj   rZ   rw   s         r   Úclear_sliding_windowz"MemoryStorage.clear_sliding_windowð   s>   € Ü�i‰i‹kˆØ$(×$<Ñ$<¸SÀ&È#Ó$NÑ!ˆ�kØ�
‰
�<Ô Ø�
‰
�;Õr   c                 ó   — y)z-
        check if storage is healthy
        Tr   rK   s    r   ÚcheckzMemoryStorage.checkö   s   € ð
 r   c                ó:  — t        t        | j                  «      t        | j                  «      «      }| j                  j	                  «        | j
                  j	                  «        | j                  j	                  «        | j                  j	                  «        |S r   )rU   Úlenr#   r(   rZ   r'   r&   )r   Ú	num_itemss     r   ÚresetzMemoryStorage.resetý   sh   € Üœ˜DŸL™LÓ)¬3¨t¯{©{Ó+;Ó<ˆ	Ø�‰×ÑÔØ×Ñ×ÑÔ Ø�‰×ÑÔØ�
‰
×ÑÔØÐr   )NF)r.   z
str | Noner"   Úboolr/   Ústr)r   údict[str, limits.typing.Any])r5   rƒ   r   r   )r   r   )r   z-type[Exception] | tuple[type[Exception], ...])rf   )r@   r‚   r   r   rR   Úintr   r„   )r@   r‚   rR   r„   r   r„   )r@   r‚   r   r„   )r@   r‚   r   r   )
r@   r‚   r^   r„   r   r„   rR   r„   r   r�   )r@   r‚   r   r   )r@   r‚   r^   r„   r   r„   r   ztuple[float, int])
rm   r‚   rn   r‚   r   r„   rl   r   r   útuple[int, float, int, float])r@   r‚   r   r„   r   r…   )r@   r‚   r   r„   r   r   )r   r�   )r   z
int | None)r   r   r   Ú__doc__ÚSTORAGE_SCHEMEr   r6   r:   r*   rQ   ÚpropertyrO   rS   rV   rC   rZ   ra   rc   rg   rs   rk   rx   rz   r|   r€   Ú__classcell__)r0   s   @r   r   r      s  ø„ ñð �Z€NöDóóó*ó ð
 ðà	6òó ðô
(ô (ó
(ó"ôó26óð, ðàðð ðð ð	ð
 ðð 
óðBHàðHð ðHð ð	Hð
 ðHð 
'óHð UØðUØ #ðUà	&óUó ó÷r   r   )Ú
__future__r   rD   r$   r   Úcollectionsr   r   Úmathr   Úlimits.typingÚlimitsÚlimits.storage.baser   r   r	   r
   r   r   r   r   r   Ú<module>r�      sF   ðÝ "ã Û Û ß ,Ý ã ÷ó ÷*ñ *ôkØÐ Ð"=Ð?Wõkr   