<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    .e                     @   s   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ erd dlmZmZmZmZmZ d dlmZ erd d	lmZ nd d
lmZ dZdddgZG dd deZG dd deZdS )    )absolute_importN)	iteritemsiterkeys
itervalues)HashMismatchHashMissingInstallationError)read_chunks)MYPY_CHECK_RUNNING)DictListBinaryIONoReturnIterator)PY3)_Hash)_hashZsha256Zsha384Zsha512c                   @   s^   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdS )HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc                 C   s   |dkri n|| _ dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)_allowed)selfhashes r   >/usr/lib/python3.8/site-packages/pip/_internal/utils/hashes.py__init__,   s    zHashes.__init__c                 C   s   t dd | j D S )Nc                 s   s   | ]}t |V  qd S N)len).0Zdigestsr   r   r   	<genexpr>7   s     z&Hashes.digest_count.<locals>.<genexpr>)sumr   valuesr   r   r   r   digest_count4   s    zHashes.digest_countc                 C   s   || j |g kS )z/Return whether the given hex digest is allowed.)r   get)r   	hash_nameZ
hex_digestr   r   r   is_hash_allowed9   s    zHashes.is_hash_allowedc              
   C   s   i }t | jD ]<}zt|||< W q ttfk
rH   td| Y qX q|D ]}t|D ]}|| q\qPt	|D ] \}}|
 | j| krv dS qv| | dS )zCheck good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: %sN)r   r   hashlibnew
ValueError	TypeErrorr   r   updater   	hexdigest_raise)r   Zchunksgotsr#   chunkhashZgotr   r   r   check_against_chunksA   s    zHashes.check_against_chunksc                 C   s   t | j|d S r   )r   r   r   r,   r   r   r   r+   Y   s    zHashes._raisec                 C   s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r/   r	   )r   filer   r   r   check_against_file]   s    zHashes.check_against_filec              
   C   s,   t |d}| |W  5 Q R  S Q R X d S )Nrb)openr2   )r   pathr1   r   r   r   check_against_pathf   s    zHashes.check_against_pathc                 C   s
   t | jS )z,Return whether I know any known-good hashes.)boolr   r    r   r   r   __nonzero__k   s    zHashes.__nonzero__c                 C   s   |   S r   )r8   r    r   r   r   __bool__p   s    zHashes.__bool__)N)__name__
__module____qualname____doc__r   propertyr!   r$   r/   r+   r2   r6   r8   r9   r   r   r   r   r   '   s   

	r   c                       s(   e Zd ZdZ fddZdd Z  ZS )MissingHasheszA workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    c                    s   t t| jtg id dS )z!Don't offer the ``hashes`` kwarg.)r   N)superr?   r   FAVORITE_HASHr    	__class__r   r   r   |   s    zMissingHashes.__init__c                 C   s   t |t  d S r   )r   rA   r*   r0   r   r   r   r+      s    zMissingHashes._raise)r:   r;   r<   r=   r   r+   __classcell__r   r   rB   r   r?   u   s   r?   )Z
__future__r   r%   Zpip._vendor.sixr   r   r   Zpip._internal.exceptionsr   r   r   Zpip._internal.utils.miscr	   Zpip._internal.utils.typingr
   typingr   r   r   r   r   r   r   r   rA   ZSTRONG_HASHESobjectr   r?   r   r   r   r   <module>   s   
N