
                             d Z ddlZddlZddlZddlZddlmZmZm	Z	  ej                  d      Zd Z ej                  d      Z ej                  d      Z ej                  d	      Zd
 ZdZd Zy)zIPv6 helper functions.    N   )xrangebinary_typemaybe_decodez0+([0-9a-f]+)c                    t        |       dk7  rt        d      t        j                  |       }g }d}t        |      }||k  rUt	        |||dz          }t
        j                  |      }||j                  d      }|j                  |       |dz  }||k  rUd}d}d}	d}
t        d	      D ]'  }||   d
k7  r|
s|}||	z
  }||kD  r|	}|}d}
!|
r$|}	d}
) |
rd	}||	z
  }||kD  r|	}|}|dkD  ry|dk(  rC|dk(  s|dk(  r9|d   dk(  r1|dk(  rd}nd}|t        j                  j                  | dd       z   }|S dj                  |d|       dz   dj                  |||z   d       z   }|S dj                  |      }|S )zConvert an IPv6 address in binary form to text form.

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

    Raises ``ValueError`` if the address isn't 16 bytes long.
    Returns a ``text``.
       z IPv6 addresses are 16 bytes longr      Nr   F   0T      ffffz::z::ffff:   :)len
ValueErrorbinasciihexlifyr   _leading_zeromatchgroupappendr   dnsipv4	inet_ntoajoin)addresshexchunksilchunkm
best_startbest_lenstartlast_was_zeroendcurrent_lenprefixs                 lib/third_party/dns/ipv6.pyr   r      s    7|r;<<


7
#CF	ACA
a%SQU^, &yGGAJEe	Q a% JHEMAY!9!Ek)!&J*H %E M  Ek!J"H!|?MMfQi611}"388--gbcl;;C J	 ((6+:./$6((6*x"7"89:;C J hhvJ    s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$c                    t        | t              s| j                         } | dk(  rd} t        j	                  |       }|t        t        j                  j                  |j                  d                  }dj                  |j                  d      j                         |d   |d   |d   |d         j                         } t        j	                  |       }|| dd } nt        j	                  |       }|| dd	 } | j                  d
      }t        |      }|dkD  rt        j                   j"                  d}g }|D ]  }|dk(  rG|rt        j                   j"                  d}t%        dd|z
  dz         D ]  }|j'                  d        Ot        |      }	|	dkD  rt        j                   j"                  |	dk7  rdd|	z
  z  |z   }|j'                  |        |dk  r|st        j                   j"                  dj)                  |      } 	 t+        j,                  |       S # t*        j.                  t0        f$ r t        j                   j"                  w xY w)zConvert an IPv6 address in text form to binary form.

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

    Returns a ``binary``.
    s   ::s   0::N   z{}:{:02x}{:02x}:{:02x}{:02x}r   r      r
      :r   Fr-   Ts   0000r	      0)
isinstancer   encode
_v4_endingr   	bytearrayr   r   	inet_atonr   formatdecode_colon_colon_start_colon_colon_endsplitr   	exceptionSyntaxErrorr   r   r   r   	unhexlifyError	TypeError)
textr$   br    r"   
seen_empty	canonicalcr!   lcs
             r,   r7   r7   d   s     dK({{}u} 	A9chh((45/66qwwqz7H7H7J78tQqT1Q478t=>Dfh 	 	  &A9ABx""4(y9D ZZFFA1umm'''JI8mm///JAq1uqy)  ) * QBAvmm///QwQV_)Q  	1uZmm'''88ID
(!!$''NNI& (mm'''(s   H   4Is             c                 ,    | j                  t              S )zIs the specified address a mapped IPv4 address?

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

    Returns a ``bool``.
    )
startswith_mapped_prefix)r   s    r,   	is_mappedrK      s     n--r-   )__doc__rer   dns.exceptionr   dns.ipv4_compatr   r   r   compiler   r   r5   r:   r;   r7   rJ   rK    r-   r,   <module>rS      s|   $  	    6 6

+,AF RZZ67
RZZ) 2::i( E(N ,.r-   