o
    5Îhr  ã                   @   sv   g d ¢Z ddlmZ ddlmZ G dd„ deƒZeƒ ZejZej	Z	ej
Z
ejZejZejZddlmZmZmZmZ dS ))ÚStrongRandomÚgetrandbitsÚ	randrangeÚrandintÚchoiceÚshuffleÚsampleé    )ÚRandom)Úis_native_intc                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )r   Nc                 C   sX   |d u r|d u rd | _ d S |d ur|d u r|| _ d S |d u r(|d ur(|j| _ d S tdƒ‚)Nz(Cannot specify both 'rng' and 'randfunc')Ú	_randfuncÚreadÚ
ValueError)ÚselfÚrngÚrandfunc© r   úh/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/Random/random.pyÚ__init__    s   

zStrongRandom.__init__c                 C   s:   | j du rt ¡ j| _ d|> d }|t|   t|dƒ¡ƒ@ S )z%Return an integer with k random bits.Né   é   )r   r	   Únewr   Úbytes_to_longÚceil_div)r   ÚkÚmaskr   r   r   r   *   s   
zStrongRandom.getrandbitsc                 G   sò   t |ƒdkr|\}}}n$t |ƒdkr|\}}d}nt |ƒdkr'|\}d}d}n	tdt |ƒf ƒ‚t|ƒr<t|ƒr<t|ƒs@tdƒ‚|dkrHtdƒ‚t|| |ƒ}|dk rUd}|dk rbtd|||f ƒ‚|}||krs|  t|ƒ¡}||ksh|||  S )	zkrandrange([start,] stop[, step]):
        Return a randomly-selected element from range(start, stop, step).é   é   r   r   z.randrange expected at most 3 arguments, got %dz$randrange requires integer argumentsz(randrange step argument must not be zeroz%empty range for randrange(%r, %r, %r))ÚlenÚ	TypeErrorr
   r   r   r   Úsize)r   ÚargsÚstartÚstopÚstepÚnum_choicesÚrr   r   r   r   2   s4   ÿÿzStrongRandom.randrangec                 C   sH   t |ƒrt |ƒstdƒ‚|  ||d ¡}||  kr|ks"J ‚ J ‚|S )z0Return a random integer N such that a <= N <= b.z"randint requires integer argumentsr   )r
   r   r   )r   ÚaÚbÚNr   r   r   r   S   s
   zStrongRandom.randintc                 C   s&   t |ƒdkr
tdƒ‚||  t |ƒ¡ S )zrReturn a random element from a (non-empty) sequence.

        If the seqence is empty, raises IndexError.
        r   zempty sequence)r   Ú
IndexErrorr   )r   Úseqr   r   r   r   [   s   zStrongRandom.choicec                 C   sH   t t|ƒd ddƒD ]}|  d|d ¡}|| || ||< ||< q
dS )zShuffle the sequence in place.r   r   éÿÿÿÿN)Úranger   r   )r   ÚxÚiÚjr   r   r   r   d   s   þzStrongRandom.shufflec                 C   sv   t |ƒ}||krtdƒ‚g }i }t|ƒD ]$}d}|du s ||v r-|  |¡}|du s ||v s | || ¡ d||< q|S )zNReturn a k-length list of unique elements chosen from the population sequence.zsample larger than populationNr   )r   r   r,   r   Úappend)r   Ú
populationr   r$   ÚretvalÚselectedr.   r%   r   r   r   r   n   s   
ÿ
zStrongRandom.sample)NN)
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r   r   r      s    

!	
r   )r   r   Úlong_to_bytesr   N)Ú__all__ÚCryptor	   ÚCrypto.Util.py3compatr
   Úobjectr   Ú_rr   r   r   r   r   r   ÚCrypto.Util.numberr   r   r7   r   r   r   r   r   Ú<module>   s   `