grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026B ©[òûGI|·ã@s€dZddlZdZdZGdd„deƒZGdd„deƒZd d „Zd7}|d|j kr„Pq„WdS)Nz1first and last must be IP addresses, not networksz%%s and %s are not of the same versionz*last IP address must be greater than firstrézunknown IP versionr%) Ú isinstanceÚ _BaseAddressÚ TypeErrorÚversionr rrÚ_max_prefixlenr(r/r2r0Ú _ALL_ONES)r+r,r-Zip_bitsZ first_intZlast_intZnbitsÚnetrrr Úsummarize_address_rangeÊs0         r;ccs˜t|ƒ}i}xL|rX| ¡}| ¡}| |¡}|dkr>|||<q||kr||=| |¡qWd}x4t| ¡ƒD]$}|dk r†|j|jkr†ql|V|}qlWdS)N)ÚlistÚpopÚsupernetÚgetÚappendÚsortedÚvaluesÚbroadcast_address)r)Zto_mergeÚsubnetsr:r>Zexistingr,rrr Ú_collapse_addresses_internals$   rEc Cs8g}g}g}xä|D]Ü}t|tƒrT|rH|dj|jkrHtd||dfƒ‚| |¡q|j|jkr¼|rˆ|dj|jkrˆtd||dfƒ‚y| |j¡Wqîtk r¸| |j ¡YqîXq|rä|dj|jkrätd||dfƒ‚| |¡qWt t |ƒƒ}|�r,x&t |ƒD]\}}|  t||ƒ¡�qWt||ƒS)Néÿÿÿÿz%%s and %s are not of the same version)r4r5Ú_versionr6r@Ú _prefixlenr8r-ÚAttributeErrorÚnetwork_addressrAÚsetr.Úextendr;rE)r)ZaddrsZipsZnetsr-r+r,rrr Úcollapse_addresses2s4     rMcCs(t|tƒr| ¡St|tƒr$| ¡StS)N)r4Ú _BaseNetworkÚ_get_networks_keyr5Ú_get_address_keyÚNotImplemented)Úobjrrr Úget_mixed_type_keyhs   rSc@s eZdZdZedd„ƒZedd„ƒZedd„ƒZedd „ƒZd d „Z d d „Z e dd„ƒZ e dd„ƒZ e dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZdd„ZdS)Ú_IPAddressBasercCs| ¡S)N)Ú_explode_shorthand_ip_string)Úselfrrr Úexploded‡sz_IPAddressBase.explodedcCst|ƒS)N)r )rVrrr Ú compressedŒsz_IPAddressBase.compressedcCs| ¡S)N)Ú_reverse_pointer)rVrrr Úreverse_pointer‘s z_IPAddressBase.reverse_pointercCsdt|ƒf}t|ƒ‚dS)Nz%200s has no version specified)ÚtypeÚNotImplementedError)rVÚmsgrrr r7œsz_IPAddressBase.versioncCsF|dkrd}t|||jfƒ‚||jkrBd}t|||j|jfƒ‚dS)Nrz-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)rrGr9r8)rVrr]rrr Ú_check_int_address¡s  z!_IPAddressBase._check_int_addresscCs.t|ƒ}||kr*d}t|||||jfƒ‚dS)Nz6%r (len %d != %d) is not permitted as an IPv%d address)r"rrG)rVrZ expected_lenZ address_lenr]rrr Ú_check_packed_addressªs z$_IPAddressBase._check_packed_addresscCs|j|j|?AS)N)r9)ÚclsÚ prefixlenrrr Ú_ip_int_from_prefix±s z"_IPAddressBase._ip_int_from_prefixc Cs\t||jƒ}|j|}||?}d|>d}||krX|jd}| |d¡}d}t||ƒ‚|S)Nr%érz&Netmask pattern %r mixes zeroes & ones)r2r8rr ) r`Úip_intZtrailing_zeroesraZ leading_onesZall_onesZbyteslenZdetailsr]rrr Ú_prefix_from_ip_int¾s      z"_IPAddressBase._prefix_from_ip_intcCsd|}t|ƒd‚dS)Nz%r is not a valid netmask)r )r`Z netmask_strr]rrr Ú_report_invalid_netmask×sz&_IPAddressBase._report_invalid_netmaskcCshtj |¡s| |¡y t|ƒ}Wntk r@| |¡YnXd|krX|jksdn| |¡|S)Nr)Ú_BaseV4Ú_DECIMAL_DIGITSÚ issupersetrfÚintr r8)r`Z prefixlen_strrarrr Ú_prefix_from_prefix_stringÜs    z)_IPAddressBase._prefix_from_prefix_stringcCs†y| |¡}Wntk r,| |¡YnXy | |¡Stk rLYnX||jN}y | |¡Stk r€| |¡YnXdS)N)Ú_ip_int_from_stringrrfrer r9)r`Úip_strrdrrr Ú_prefix_from_ip_stringõs   z%_IPAddressBase._prefix_from_ip_stringcCsHt|ttfƒr||jfSt|tƒs*t|ƒ}t|ƒdkr:|S|d|jfS)Nr%r)r4Úbytesrjr8Útupler$r")r`rrrr Ú_split_addr_prefixs    z!_IPAddressBase._split_addr_prefixcCs|jt|ƒffS)N)Ú __class__r )rVrrr Ú __reduce__/sz_IPAddressBase.__reduce__N)rrrÚ __slots__ÚpropertyrWrXrZr7r^r_Ú classmethodrbrerfrkrnrqrsrrrr rT�s        " rTc@s`eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dS)r5rcCs|jS)N)r()rVrrr Ú__int__>sz_BaseAddress.__int__cCs2y|j|jko|j|jkStk r,tSXdS)N)r(rGrIrQ)rVÚotherrrr Ú__eq__As   z_BaseAddress.__eq__cCsFt|tƒstS|j|jkr*td||fƒ‚|j|jkrB|j|jkSdS)Nz%%s and %s are not of the same versionF)r4r5rQrGr6r()rVrxrrr Ú__lt__Hs     z_BaseAddress.__lt__cCs t|tƒstS| t|ƒ|¡S)N)r4rjrQrr)rVrxrrr Ú__add__Ts z_BaseAddress.__add__cCs t|tƒstS| t|ƒ|¡S)N)r4rjrQrr)rVrxrrr Ú__sub__Ys z_BaseAddress.__sub__cCsd|jjt|ƒfS)Nz%s(%r))rrrr )rVrrr Ú__repr__^sz_BaseAddress.__repr__cCst| |j¡ƒS)N)r Ú_string_from_ip_intr()rVrrr Ú__str__asz_BaseAddress.__str__cCsttt|jƒƒƒS)N)ÚhashÚhexrjr()rVrrr Ú__hash__dsz_BaseAddress.__hash__cCs |j|fS)N)rG)rVrrr rPgsz_BaseAddress._get_address_keycCs|j|jffS)N)rrr()rVrrr rsjsz_BaseAddress.__reduce__N)rrrrtrwryrzr{r|r}rr‚rPrsrrrr r53s  r5c@s`eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z edd„ƒZedd„ƒZedd„ƒZedd„ƒZedd „ƒZed!d"„ƒZed#d$„ƒZed%d&„ƒZd'd(„Zd)d*„Zd+d,„ZdGd/d0„ZdHd1d2„Zed3d4„ƒZed5d6„ƒZd7d8„Zd9d:„Z ed;d<„ƒZ!ed=d>„ƒZ"ed?d@„ƒZ#edAdB„ƒZ$edCdD„ƒZ%edEdF„ƒZ&d.S)IrNcCs i|_dS)N)Ú_cache)rVrrrr Ú__init__wsz_BaseNetwork.__init__cCsd|jjt|ƒfS)Nz%s(%r))rrrr )rVrrr r}zsz_BaseNetwork.__repr__cCsd|j|jfS)Nz%s/%d)rJra)rVrrr r}sz_BaseNetwork.__str__ccs<t|jƒ}t|jƒ}x"t|d|ƒD]}| |¡Vq$WdS)Nr%)rjrJrCÚrangeÚ_address_class)rVÚnetworkÚ broadcastÚxrrr Úhosts€s  z_BaseNetwork.hostsccs<t|jƒ}t|jƒ}x"t||dƒD]}| |¡Vq$WdS)Nr%)rjrJrCr…r†)rVr‡rˆr‰rrr Ú__iter__Œs  z_BaseNetwork.__iter__cCslt|jƒ}t|jƒ}|dkr>|||kr0tdƒ‚| ||¡S|d7}|||krZtdƒ‚| ||¡SdS)Nrzaddress out of ranger%)rjrJrCÚ IndexErrorr†)rVÚnr‡rˆrrr Ú __getitem__’s    z_BaseNetwork.__getitem__cCs^t|tƒstS|j|jkr*td||fƒ‚|j|jkrB|j|jkS|j|jkrZ|j|jkSdS)Nz%%s and %s are not of the same versionF)r4rNrQrGr6rJÚnetmask)rVrxrrr rzŸs       z_BaseNetwork.__lt__cCsFy,|j|jko,|j|jko,t|jƒt|jƒkStk r@tSXdS)N)rGrJrjr�rIrQ)rVrxrrr ry«s   z_BaseNetwork.__eq__cCstt|jƒt|jƒAƒS)N)r€rjrJr�)rVrrr r‚³sz_BaseNetwork.__hash__cCsL|j|jkrdSt|tƒrdSt|jƒt|jƒkoBt|jƒkSSdS)NF)rGr4rNrjrJr(rC)rVrxrrr Ú __contains__¶s   z_BaseNetwork.__contains__cCs(|j|kp&|j|kp&|j|kp&|j|kS)N)rJrC)rVrxrrr ÚoverlapsÃs   z_BaseNetwork.overlapscCs<|j d¡}|dkr8| t|jƒt|jƒB¡}||jd<|S)NrC)rƒr?r†rjrJÚhostmask)rVr‰rrr rCÊs    z_BaseNetwork.broadcast_addresscCs8|j d¡}|dkr4| t|jƒ|jA¡}||jd<|S)Nr’)rƒr?r†rjr�r9)rVr‰rrr r’Ós   z_BaseNetwork.hostmaskcCsd|j|jfS)Nz%s/%d)rJrH)rVrrr Úwith_prefixlenÛsz_BaseNetwork.with_prefixlencCsd|j|jfS)Nz%s/%s)rJr�)rVrrr Ú with_netmaskßsz_BaseNetwork.with_netmaskcCsd|j|jfS)Nz%s/%s)rJr’)rVrrr Ú with_hostmaskãsz_BaseNetwork.with_hostmaskcCst|jƒt|jƒdS)Nr%)rjrCrJ)rVrrr Ú num_addressesçsz_BaseNetwork.num_addressescCsdt|ƒf}t|ƒ‚dS)Nz%%200s has no associated address class)r[r\)rVr]rrr r†ìsz_BaseNetwork._address_classcCs|jS)N)rH)rVrrr raôsz_BaseNetwork.prefixlenccs|j|jkstd||fƒ‚t|tƒs2td|ƒ‚| |¡sLtd||fƒ‚||krXdS| d|j|jf¡}|  ¡\}}xb||krÜ||krÜ| |¡rª|V|  ¡\}}q|| |¡rÈ|V|  ¡\}}q|t d|||fƒ‚q|W||krî|Vn"||krþ|Vnt d|||fƒ‚dS)Nz%%s and %s are not of the same versionz%s is not a network objectz%s not contained in %sz%s/%sz3Error performing exclusion: s1: %s s2: %s other: %s) rGr6r4rNÚ subnet_ofr rrrJrarDÚAssertionError)rVrxÚs1Ús2rrr Úaddress_excludeøs6$          z_BaseNetwork.address_excludecCs`|j|jkrtd||fƒ‚|j|jkr,dS|j|jkr 0z0prefix length diff %d is invalid for netblock %s) rHr8r rjrJrCr’r…rr) rVÚprefixlen_diffÚ new_prefixÚ new_prefixlenÚstartÚendÚstepZnew_addrZcurrentrrr rD}s,       z_BaseNetwork.subnetscCsˆ|jdkr|S|dk rB||jkr(tdƒ‚|dkr8tdƒ‚|j|}|j|}|dkrftd|j|fƒ‚| t|jƒt|jƒ|>@|f¡S)Nrznew prefix must be shorterr%z(cannot set prefixlen_diff and new_prefixz;current prefixlen is %d, cannot have a prefixlen_diff of %d)rHr rarrrjrJr�)rVr�ržrŸrrr r>²s     z_BaseNetwork.supernetcCs|jjo|jjS)N)rJÚ is_multicastrC)rVrrr r£Ûs z_BaseNetwork.is_multicastcCsfy8|j|jkr"t|›d|›d�ƒ‚|j|jko8|j|jkStk r`td|›d|›�ƒ‚YnXdS)Nz and z are not of the same versionz*Unable to test subnet containment between )rGr6rJrCrI)ÚaÚbrrr Ú _is_subnet_ofçs   z_BaseNetwork._is_subnet_ofcCs | ||¡S)N)r¦)rVrxrrr r—ósz_BaseNetwork.subnet_ofcCs | ||¡S)N)r¦)rVrxrrr Ú supernet_of÷sz_BaseNetwork.supernet_ofcCs|jjo|jjS)N)rJÚ is_reservedrC)rVrrr r¨ûs z_BaseNetwork.is_reservedcCs|jjo|jjS)N)rJÚ is_link_localrC)rVrrr r©sz_BaseNetwork.is_link_localcCs|jjo|jjS)N)rJÚ is_privaterC)rVrrr rªs z_BaseNetwork.is_privatecCs|j S)N)rª)rVrrr Ú is_globals z_BaseNetwork.is_globalcCs|jjo|jjS)N)rJÚis_unspecifiedrC)rVrrr r¬)s z_BaseNetwork.is_unspecifiedcCs|jjo|jjS)N)rJÚ is_loopbackrC)rVrrr r­5s z_BaseNetwork.is_loopback)r%N)r%N)'rrrr„r}rrŠr‹rŽrzryr‚r�r‘rurCr’r“r”r•r–r†rar›rœrOrDr>r£Ú staticmethodr¦r—r§r¨r©rªr«r¬r­rrrr rNnsD            K0 5 )  rNc @s²eZdZdZdZdedZedƒZedddd d d d d dh ƒZ eZ iZ dd„Z e dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZdd„Zdd„Zdd„Zedd „ƒZed!d"„ƒZd#S)$rgrrrr%Ú 0123456789éÿéþéüéøéðéàéÀrrcCst|ƒS)N)r )rVrrr rUYsz$_BaseV4._explode_shorthand_ip_stringcCs�||jkr†t|tƒr<|}d|kr.|jksjn| |¡n.y| |¡}Wntk rh| |¡}YnXt|  |¡ƒ}||f|j|<|j|S)Nr) Ú_netmask_cacher4rjr8rfrkr rnr rb)r`Úargrar�rrr Ú _make_netmask\s   z_BaseV4._make_netmaskc Cs||s tdƒ‚| d¡}t|ƒdkr.td|ƒ‚yt t|j|ƒd¡Stk rv}ztd||fƒd‚Wdd}~XYnXdS)NzAddress cannot be emptyÚ.rzExpected 4 octets in %rrz%s in %r)rr!r"rjÚ from_bytesÚmapÚ _parse_octetr )r`rmZoctetsÚexcrrr rlvs   z_BaseV4._ip_int_from_stringcCsŠ|s tdƒ‚|j |¡s(d}t||ƒ‚t|ƒdkrDd}t||ƒ‚t|dƒ}|dkrr|ddkrrd }t||ƒ‚|d kr†td |ƒ‚|S) NzEmpty octet not permittedz#Only decimal digits permitted in %réz$At most 3 characters permitted in %ré érÚ0z3Ambiguous (octal/decimal) value in %r not permittedr°zOctet %d (> 255) not permitted)r rhrir"rj)r`Z octet_strr]Z octet_intrrr r½�s       z_BaseV4._parse_octetcCsd tt| dd¡ƒ¡S)Nrºrr)Újoinr¼r r)r`rdrrr r~µs z_BaseV4._string_from_ip_intcCsÂ| d¡}t|ƒdkr†y$x|D]}t|ƒ|jkrdSqWWntk rNdSXx0t|ƒD]$\}}|dkrZ|||dkrZdSqZWdSy t|ƒ}Wntk r¦dSXd|ko¼|jkSS)NrºrFrr%T)r!r"rjÚ_valid_mask_octetsr Ú enumerater8)rVr�Úmaskr‰ÚidxÚyrrr Ú_is_valid_netmaskÂs"     z_BaseV4._is_valid_netmaskcsh| d¡}y‡fdd„tt|ƒDƒ}Wntk r:dSXt|ƒt|ƒkrPdS|d|dkrddSdS)Nrºcsg|]}|ˆjkr|‘qSr)rÄ)Ú.0r‰)rVrr ú ísz(_BaseV4._is_hostmask..FrrFT)r!r¼rjr r")rVrmr1Úpartsr)rVr Ú _is_hostmaskás z_BaseV4._is_hostmaskcCs&t|ƒ d¡ddd…}d |¡dS)NrºrFz .in-addr.arpa)r r!rÃ)rVZreverse_octetsrrr rYösz_BaseV4._reverse_pointercCs|jS)N)r8)rVrrr Ú max_prefixlenÿsz_BaseV4.max_prefixlencCs|jS)N)rG)rVrrr r7sz_BaseV4.versionN)rrrrtrGÚ IPV4LENGTHr9Ú frozensetrhrÄr8r·rUrvr¹rlr½r~rÉrÍrYrurÎr7rrrr rgBs"     %  rgc@sˆeZdZdZdd„Zedd„ƒZedd„ƒZee  ¡dd „ƒƒZ ee  ¡d d „ƒƒZ ed d „ƒZ edd„ƒZ edd„ƒZedd„ƒZdS)r )r(Ú __weakref__cCsrt|tƒr| |¡||_dSt|tƒrF| |d¡t |d¡|_dSt|ƒ}d|krbtd|ƒ‚|  |¡|_dS)NrrrzUnexpected '/' in %r) r4rjr^r(ror_r»r rrl)rVrÚaddr_strrrr r„s     zIPv4Address.__init__cCs t|jƒS)N)rr()rVrrr Úpacked1szIPv4Address.packedcCs ||jjkS)N)Ú _constantsÚ_reserved_network)rVrrr r¨6s zIPv4Address.is_reservedcst‡fdd„ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÊr:)rVrr ú Ksz)IPv4Address.is_private..)ÚanyrÔÚ_private_networks)rVr)rVr rªAs zIPv4Address.is_privatecCs||jjko|j S)N)rÔÚ_public_networkrª)rVrrr r«MszIPv4Address.is_globalcCs ||jjkS)N)rÔÚ_multicast_network)rVrrr r£Rs zIPv4Address.is_multicastcCs ||jjkS)N)rÔÚ_unspecified_address)rVrrr r¬]s zIPv4Address.is_unspecifiedcCs ||jjkS)N)rÔÚ_loopback_network)rVrrr r­hszIPv4Address.is_loopbackcCs ||jjkS)N)rÔÚ_linklocal_network)rVrrr r©rszIPv4Address.is_link_localN)rrrrtr„rurÓr¨Ú functoolsÚ lru_cacherªr«r£r¬r­r©rrrr r s#    r c@sjeZdZdd„Zdd„Zdd„Zdd„Zd d „Zej Z e d d „ƒZ e d d„ƒZ e dd„ƒZ e dd„ƒZdS)rcCsN| |¡\}}t ||¡t||fdd�|_|jj|_|jj|_|jj|_dS)NF)r)rqr r„rr‡r�r’rH)rVrr#rÆrrr r„s    zIPv4Interface.__init__cCsd| |j¡|jjfS)Nz%s/%d)r~r(r‡ra)rVrrr rˆs zIPv4Interface.__str__cCsBt ||¡}|r|tkr|Sy |j|jkStk r<dSXdS)NF)r ryrQr‡rI)rVrxÚ address_equalrrr ryŒs   zIPv4Interface.__eq__cCsNt ||¡}|tkrtSy|j|jkp4|j|jko4|Stk rHdSXdS)NF)r rzrQr‡rI)rVrxÚ address_lessrrr rz˜s  zIPv4Interface.__lt__cCst|j|jt|jjƒfƒS)N)r€r(rHrjr‡rJ)rVrrr r‚¤szIPv4Interface.__hash__cCs t|jƒS)N)r r()rVrrr r-©szIPv4Interface.ipcCsd| |j¡|jfS)Nz%s/%s)r~r(rH)rVrrr r“­s zIPv4Interface.with_prefixlencCsd| |j¡|jfS)Nz%s/%s)r~r(r�)rVrrr r”²s zIPv4Interface.with_netmaskcCsd| |j¡|jfS)Nz%s/%s)r~r(r’)rVrrr r•·s zIPv4Interface.with_hostmaskN)rrrr„rryrzr‚rTrsrur-r“r”r•rrrr r}s      rc@s.eZdZeZddd„Zee ¡dd„ƒƒZ dS)rTcCs”t ||¡| |¡\}}t|ƒ|_| |¡\|_|_t|jƒ}|t|jƒ@|krx|rdt d|ƒ‚nt|t|jƒ@ƒ|_|j|j dkr�|j |_ dS)Nz%s has host bits setr%) rNr„rqr rJr¹r�rHrjr r8r‹rŠ)rVrrr#rÆrÓrrr r„Ìs$   zIPv4Network.__init__cCs&|jtdƒko|jtdƒk o$|j S)Nz 100.64.0.0/10)rJrrCrª)rVrrr r«s zIPv4Network.is_globalN)T) rrrr r†r„rurÞrßr«rrrr r½s  4rc@s”eZdZedƒZedƒZedƒZedƒZedƒedƒedƒedƒedƒedƒed ƒed ƒed ƒed ƒed ƒedƒedƒedƒgZedƒZ e dƒZ dS)Ú_IPv4Constantsz169.254.0.0/16z 127.0.0.0/8z 224.0.0.0/4z 100.64.0.0/10z 0.0.0.0/8z 10.0.0.0/8z 172.16.0.0/12z 192.0.0.0/29z192.0.0.170/31z 192.0.2.0/24z192.168.0.0/16z 198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z 240.0.0.0/4z255.255.255.255/32z0.0.0.0N) rrrrrÝrÜrÚrÙrØrÕr rÛrrrr râs( râc@sšeZdZdZdZdedZdZedƒZ eZ iZ e dd„ƒZ e d d „ƒZe d d „ƒZe d d„ƒZe ddd„ƒZdd„Zdd„Zedd„ƒZedd„ƒZdS)Ú_BaseV6rr3rr%rcZ0123456789ABCDEFabcdefcCsl||jkrbt|tƒr<|}d|kr.|jksFn| |¡n | |¡}t| |¡ƒ}||f|j|<|j|S)Nr)r·r4rjr8rfrkr rb)r`r¸rar�rrr r¹Es    z_BaseV6._make_netmaskc Csæ|s tdƒ‚| d¡}d}t|ƒ|kr:d||f}t|ƒ‚d|dkr¶yt| ¡ƒj}Wn4tk rŒ}ztd||fƒd‚Wdd}~XYnX| d|d ?d @¡| d|d @¡|jd }t|ƒ|kräd |d |f}t|ƒ‚d}x@td t|ƒd ƒD]*} || sü|dk �r"d |}t|ƒ‚| }qüW|dk �rÌ|} t|ƒ|d } |d�sp| d 8} | �rpd}t||ƒ‚|d�s˜| d 8} | �r˜d}t||ƒ‚|j| | } | d k�r6d}t||jd |fƒ‚njt|ƒ|jk�ròd}t||j|fƒ‚|d�s d}t||ƒ‚|d�s&d}t||ƒ‚t|ƒ} d} d} ytd} x,t| ƒD] } | d K} | |  || ¡O} �qFW| d | K} x0t| dƒD] } | d K} | |  || ¡O} �q„W| St k �rà}ztd||fƒd‚Wdd}~XYnXdS)NzAddress cannot be emptyú:r¿z At least %d parts expected in %rrºrFz%s in %rz%xriÿÿr%z!At most %d colons permitted in %rz At most one '::' permitted in %rrz0Leading ':' only permitted as part of '::' in %rz1Trailing ':' only permitted as part of '::' in %rz/Expected at most %d other parts with '::' in %rz,Exactly %d parts expected without '::' in %r) rr!r"r r=r(r@Ú _HEXTET_COUNTr…Ú _parse_hextetr )r`rmrÌZ _min_partsr]Zipv4_intr¾Z _max_partsZ skip_indexÚiZparts_hiZparts_loZ parts_skippedrdrrr rlYs„    $              z_BaseV6._ip_int_from_stringcCs>|j |¡std|ƒ‚t|ƒdkr4d}t||ƒ‚t|dƒS)NzOnly hex digits permitted in %rrz$At most 4 characters permitted in %rr)Ú _HEX_DIGITSrir r"rj)r`Z hextet_strr]rrr ræÁs     z_BaseV6._parse_hextetc Cs¦d}d}d}d}xJt|ƒD]>\}}|dkrP|d7}|dkr>|}||krX|}|}qd}d}qW|dkr¢||}|t|ƒkr‚|dg7}dg|||…<|dkr¢dg|}|S)NrFrrÂr%Ú)rÅr") r`ÚhextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenÚindexZhextetZbest_doublecolon_endrrr Ú_compress_hextetsÛs.   z_BaseV6._compress_hextetsNcsZ|dkrt|jƒ}||jkr$tdƒ‚d|‰‡fdd„tdddƒDƒ}| |¡}d |¡S) NzIPv6 address is too largez%032xcs&g|]}dtˆ||d…dƒ‘qS)z%xrr)rj)rÊr‰)Úhex_strrr rË sz/_BaseV6._string_from_ip_int..rrrrä)rjr(r9r r…rìrÃ)r`rdrêr)rír r~ s   z_BaseV6._string_from_ip_intcsŒt|tƒrt|jƒ}nt|tƒr,t|jƒ}nt|ƒ}| |¡}d|‰‡fdd„tdddƒDƒ}t|ttfƒr‚dd  |¡|j fSd  |¡S) Nz%032xcsg|]}ˆ||d…‘qS)rr)rÊr‰)rírr rË8sz8_BaseV6._explode_shorthand_ip_string..rrrz%s/%drä) r4rr rJrr-rlr…rNrÃrH)rVrmrdrÌr)rír rU%s     z$_BaseV6._explode_shorthand_ip_stringcCs&|jddd… dd¡}d |¡dS)NrFrärérºz .ip6.arpa)rWÚreplacerÃ)rVZ reverse_charsrrr rY=sz_BaseV6._reverse_pointercCs|jS)N)r8)rVrrr rÎFsz_BaseV6.max_prefixlencCs|jS)N)rG)rVrrr r7Jsz_BaseV6.version)N)rrrrtrGÚ IPV6LENGTHr9rårÐrèr8r·rvr¹rlrærìr~rUrYrurÎr7rrrr rã1s"    h  0  rãc@s°eZdZdZdd„Zedd„ƒZedd„ƒZedd „ƒZed d „ƒZ ed d „ƒZ ee   ¡dd„ƒƒZ edd„ƒZedd„ƒZedd„ƒZedd„ƒZedd„ƒZedd„ƒZdS)r )r(rÑcCsrt|tƒr| |¡||_dSt|tƒrF| |d¡t |d¡|_dSt|ƒ}d|krbtd|ƒ‚|  |¡|_dS)NrrrzUnexpected '/' in %r) r4rjr^r(ror_r»r rrl)rVrrÒrrr r„Us     zIPv6Address.__init__cCs t|jƒS)N)rr()rVrrr rÓyszIPv6Address.packedcCs ||jjkS)N)rÔrÚ)rVrrr r£~s zIPv6Address.is_multicastcst‡fdd„ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÊr‰)rVrr rÖ’sz*IPv6Address.is_reserved..)r×rÔÚ_reserved_networks)rVr)rVr r¨‰s zIPv6Address.is_reservedcCs ||jjkS)N)rÔrÝ)rVrrr r©”szIPv6Address.is_link_localcCs ||jjkS)N)rÔÚ_sitelocal_network)rVrrr Ú is_site_localžs zIPv6Address.is_site_localcst‡fdd„ˆjjDƒƒS)Nc3s|]}ˆ|kVqdS)Nr)rÊr:)rVrr rÖ¶sz)IPv6Address.is_private..)r×rÔrØ)rVr)rVr rª¬s zIPv6Address.is_privatecCs|j S)N)rª)rVrrr r«¸s zIPv6Address.is_globalcCs |jdkS)Nr)r()rVrrr r¬Ãs zIPv6Address.is_unspecifiedcCs |jdkS)Nr%)r()rVrrr r­Îs zIPv6Address.is_loopbackcCs |jd?dkrdSt|jd@ƒS)Nriÿÿlÿÿ)r(r )rVrrr Ú ipv4_mappedÙs zIPv6Address.ipv4_mappedcCs4|jd?dkrdSt|jd?d@ƒt|jd@ƒfS)Né`i é@lÿÿ)r(r )rVrrr Úteredoæs zIPv6Address.teredocCs$|jd?dkrdSt|jd?d@ƒS)Népi éPlÿÿ)r(r )rVrrr Ú sixtofourõs zIPv6Address.sixtofourN)rrrrtr„rurÓr£r¨r©ròrÞrßrªr«r¬r­rórörùrrrr r Os$   r c@s‚eZdZdd„Zdd„Zdd„Zdd„Zd d „Zej Z e d d „ƒZ e d d„ƒZ e dd„ƒZ e dd„ƒZe dd„ƒZe dd„ƒZdS)rcCsN| |¡\}}t ||¡t||fdd�|_|jj|_|jj|_|jj|_dS)NF)r)rqr r„rr‡r�r’rH)rVrr#rÆrrr r„s    zIPv6Interface.__init__cCsd| |j¡|jjfS)Nz%s/%d)r~r(r‡ra)rVrrr rs zIPv6Interface.__str__cCsBt ||¡}|r|tkr|Sy |j|jkStk r<dSXdS)NF)r ryrQr‡rI)rVrxràrrr rys   zIPv6Interface.__eq__cCsNt ||¡}|tkrtSy|j|jkp4|j|jko4|Stk rHdSXdS)NF)r rzrQr‡rI)rVrxrárrr rzs  zIPv6Interface.__lt__cCst|j|jt|jjƒfƒS)N)r€r(rHrjr‡rJ)rVrrr r‚*szIPv6Interface.__hash__cCs t|jƒS)N)r r()rVrrr r-/szIPv6Interface.ipcCsd| |j¡|jfS)Nz%s/%s)r~r(rH)rVrrr r“3s zIPv6Interface.with_prefixlencCsd| |j¡|jfS)Nz%s/%s)r~r(r�)rVrrr r”8s zIPv6Interface.with_netmaskcCsd| |j¡|jfS)Nz%s/%s)r~r(r’)rVrrr r•=s zIPv6Interface.with_hostmaskcCs|jdko|jjS)Nr)r(r‡r¬)rVrrr r¬BszIPv6Interface.is_unspecifiedcCs|jdko|jjS)Nr%)r(r‡r­)rVrrr r­FszIPv6Interface.is_loopbackN)rrrr„rryrzr‚rTrsrur-r“r”r•r¬r­rrrr rs        rc@s.eZdZeZd dd„Zdd„Zedd„ƒZdS) rTcCs”t ||¡| |¡\}}t|ƒ|_| |¡\|_|_t|jƒ}|t|jƒ@|krx|rdt d|ƒ‚nt|t|jƒ@ƒ|_|j|j dkr�|j |_ dS)Nz%s has host bits setr%) rNr„rqr rJr¹r�rHrjr r8r‹rŠ)rVrrr#rÆrÓrrr r„[s   zIPv6Network.__init__ccs@t|jƒ}t|jƒ}x&t|d|dƒD]}| |¡Vq(WdS)Nr%)rjrJrCr…r†)rVr‡rˆr‰rrr rŠŠs  zIPv6Network.hostscCs|jjo|jjS)N)rJròrC)rVrrr rò–s zIPv6Network.is_site_localN)T) rrrr r†r„rŠruròrrrr rKs / rc@sÂeZdZedƒZedƒZedƒedƒedƒedƒedƒedƒed ƒed ƒed ƒedƒg Zed ƒed ƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒedƒgZedƒZdS)Ú_IPv6Constantsz fe80::/10zff00::/8z::1/128z::/128z ::ffff:0:0/96z100::/64z 2001::/23z 2001:2::/48z 2001:db8::/32z 2001:10::/28zfc00::/7z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z fec0::/10N) rrrrrÝrÚrØrðrñrrrr rú¦s*         rú)T)"Ú __version__rÞrÏrïr rr rrrrrr$r.r2r;rErMrSrTÚtotal_orderingr5rNrgr rrrârÔrãr rrrúrrrr Ú sT #7163:VGu@R 5H[!