a
    PҚh                     @   s   d Z ddlZddlZddlmZmZ ddlZddlZe	dZ
eedddZe	dZe	d	Ze	d
Zdeeef eedddZdZeedddZeeef edddZdS )zIPv6 helper functions.    N)ListUnionz0+([0-9a-f]+))addressreturnc                 C   s  t | dkrtdt| }g }d}t |}||k rz|||d   }t|}|durf|d}|| |d7 }q.d}d}d}	d}
t	d	D ]B}|| d
kr|
r|}||	 }||kr|	}|}d}
q|
s|}	d}
q|
rd	}||	 }||kr|	}|}|dkr|dkrZ|dks,|dkrZ|d dkrZ|dkr<d}nd}|t
j| dd  }n,d|d| d d||| d  }n
d|}|S )zConvert an IPv6 address in binary form to text form.

    *address*, a ``bytes``, the IPv6 address in binary form.

    Raises ``ValueError`` if the address isn't 16 bytes long.
    Returns a ``str``.
       z IPv6 addresses are 16 bytes longr      N   F   0T      Zffffz::z::ffff:   :)len
ValueErrorbinasciihexlifydecode_leading_zeromatchgroupappendrangednsipv4	inet_ntoajoin)r   hexchunksilchunkmZ
best_startZbest_lenstartZlast_was_zeroendZcurrent_lenprefixZthex r'   C/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/dns/ipv6.pyr      sb    	





,

r   s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$F)textignore_scoper   c              	   C   sb  t | ts|  }n| }|rP|d}t|}|dkr@|d }n|dkrPtjj|dkrbtjjnH|dr|dstjjn*|	dr|	dstjjn|dkrd}t
|}|durtj|d}|d	  d
|d d|d	 dd
|d d|d d }t|}|dur4|d	d }n t|}|durT|dd }|d}t|}|dkrxtjjd}g }	|D ]}
|
dkr|rtjjd}tdd| d	 D ]}|	d qn>t|
}|dkrtjj|dkrdd|  |
 }
|	|
 q|dk r$|s$tjjd|	}zt|W S  tjtfy\   tjjY n0 dS )a+  Convert an IPv6 address in text form to binary form.

    *text*, a ``str`` or ``bytes``, the IPv6 address in textual form.

    *ignore_scope*, a ``bool``.  If ``True``, a scope will be ignored.
    If ``False``, the default, it is an error for a scope to be present.

    Returns a ``bytes``.
       %   r          :s   ::s   0::Nr   r   02x   r	   r
   FTs   0000r      0)
isinstancebytesencodesplitr   r   	exceptionSyntaxErrorendswith
startswith
_v4_endingr   r   	inet_atonr   r   _colon_colon_start_colon_colon_endr   r   r   r   	unhexlifyError	TypeError)r)   r*   Zbtextpartsr!   r#   br   Z
seen_empty	canonicalc_lcr'   r'   r(   r;   h   sn    








<









r;   s             c                 C   s
   |  tS )zIs the specified address a mapped IPv4 address?

    *address*, a ``bytes`` is an IPv6 address in binary form.

    Returns a ``bool``.
    )r9   _mapped_prefix)r   r'   r'   r(   	is_mapped   s    rH   )r)   r   c                 C   s   t jt j| S )a  Verify that *address* is a valid text form IPv6 address and return its
    canonical text form.  Addresses with scopes are rejected.

    *text*, a ``str`` or ``bytes``, the IPv6 address in textual form.

    Raises ``dns.exception.SyntaxError`` if the text is not valid.
    )r   Zipv6r   r;   )r)   r'   r'   r(   canonicalize   s    rI   )F)__doc__r   retypingr   r   Zdns.exceptionr   Zdns.ipv4compiler   r3   strr   r:   r<   r=   boolr;   rG   rH   rI   r'   r'   r'   r(   <module>   s   
E


[