a Z^"c@sdZddlZdZdZGdddeZGdddeZd d Zd7}|d|j krqqdS)Nz1first and last must be IP addresses, not networks%%s and %s are not of the same versionz*last IP address must be greater than firstrzunknown IP versionr*) isinstance _BaseAddress TypeErrorversionrrr_max_prefixlenr+r1r3r2 _ALL_ONES)r-r.r/Zip_bitsZ first_intZlast_intZnbitsnetrrr summarize_address_ranges6      r=ccst|}i}|rV|}|}||}|dur<|||<q ||kr ||=||q d}t|D]$}|dur|j|jkrqf|V|}qfdSN)ZlistpopsupernetZgetappendsortedZvaluesbroadcast_address)r,Zto_mergesubnetsr<r@Zexistingr.rrr _collapse_addresses_internals$    rEc Cs.g}g}g}|D]}t|trR|rF|dj|jkrFtd||df||q|j|jkr|r|dj|jkrtd||dfz||jWqty||j Yq0q|r|dj|jkrtd||df||qt t |}|r"t |D]\}}| t||qt||S)Nr4)r6r7_versionr8rA _prefixlenr:r/AttributeErrornetwork_addressrBZsetr0Zextendr=rE)r,ZaddrsZipsZnetsr/r-r.rrr collapse_addresses2s:      rKcCs(t|tr|St|tr$|StSr>)r6 _BaseNetwork_get_networks_keyr7_get_address_keyNotImplemented)Zobjrrr get_mixed_type_keyhs   rPc@seZdZdZeddZeddZeddZedd Zd d Z d d Z e ddZ e ddZ e ddZe ddZe ddZe ddZddZdS)_IPAddressBasercC|Sr>)_explode_shorthand_ip_stringselfrrr explodedz_IPAddressBase.explodedcCt|Sr>r$rTrrr compressedrWz_IPAddressBase.compressedcCrRr>)_reverse_pointerrTrrr reverse_pointer z_IPAddressBase.reverse_pointercCdt|f}t|dS)Nz%200s has no version specifiedZtypeZNotImplementedErrorrUmsgrrr r9sz_IPAddressBase.versioncCsF|dkrd}t|||jf||jkrBd}t|||j|jfdS)Nrz-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)rrGr;r:)rUrrarrr _check_int_addresss  z!_IPAddressBase._check_int_addresscCs.t|}||kr*d}t|||||jfdS)Nz6%r (len %d != %d) is not permitted as an IPv%d address)r&rrG)rUrZ expected_lenZ address_lenrarrr _check_packed_addresss z$_IPAddressBase._check_packed_addresscCs|j|j|?ASr>)r;)cls prefixlenrrr _ip_int_from_prefix 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)r3r:rr) rdip_intZtrailing_zeroesreZ leading_onesZall_onesZbyteslenZdetailsrarrr _prefix_from_ip_ints      z"_IPAddressBase._prefix_from_ip_intcCsd|}t|ddS)Nz%r is not a valid netmask)r )rdZ netmask_strrarrr _report_invalid_netmasksz&_IPAddressBase._report_invalid_netmaskcCsj|r|s||z t|}WntyB||Yn0d|krZ|jksfn|||SNr)isasciiisdigitrkintrr:)rdZ prefixlen_strrerrr _prefix_from_prefix_strings    z)_IPAddressBase._prefix_from_prefix_stringcCsz||}Wnty*||Yn0z ||WStyJYn0||jN}z ||WSty~||Yn0dSr>)_ip_int_from_stringrrkrjrr;)rdip_strrirrr _prefix_from_ip_strings      z%_IPAddressBase._prefix_from_ip_stringcCsHt|ttfr||jfSt|ts*t|}t|dkr:|S|d|jfS)Nr*r)r6bytesror:Ztupler(r&)rdrrrr _split_addr_prefixs    z!_IPAddressBase._split_addr_prefixcCs|jt|ffSr>) __class__r$rTrrr __reduce__/z_IPAddressBase.__reduce__N)rrr __slots__propertyrVrZr\r9rbrc classmethodrfrjrkrprsrurwrrrr rQs0          ! rQcspeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ fddZZS)r7rcC|jSr>r+rTrrr __int__@rxz_BaseAddress.__int__cCs6z|j|jko|j|jkWSty0tYS0dSr>)r+rGrIrOrUotherrrr __eq__Cs    z_BaseAddress.__eq__cCsFt|tstS|j|jkr*td||f|j|jkrB|j|jkSdSNr4F)r6r7rOrGr8r+rrrr __lt__Js    z_BaseAddress.__lt__cCs t|tstS|t||Sr>r6rorOrvrrrr __add__V z_BaseAddress.__add__cCs t|tstS|t||Sr>rrrrr __sub__[rz_BaseAddress.__sub__cCd|jjt|fSNz%s(%r)rvrr$rTrrr __repr__`rxz_BaseAddress.__repr__cCst||jSr>)r$_string_from_ip_intr+rTrrr __str__crxz_BaseAddress.__str__cCsttt|jSr>)hashZhexror+rTrrr __hash__frxz_BaseAddress.__hash__cCs |j|fSr>rGrTrrr rNirxz_BaseAddress._get_address_keycCs|j|jffSr>)rvr+rTrrr rwlrxz_BaseAddress.__reduce__cs|r|ddkrtt||Stdur8ddl}|dat|}|sRt|S|\}}}|dkr||j dkrxd}nd}|dkr|j }n |j d}|r||dd 7}|r|d 7}tt ||d |||S) NrFZsrz(#?)(_?)([xbnX])nrbxr*r#0) Zformatr$_address_fmt_rereZcompileZ fullmatchsuper __format__ZgroupsrGr:ro)rUZfmtrZmZ alternateZgroupingZfmt_baseZpadlenrvrr ros*     z_BaseAddress.__format__)rrrryr~rrrrrrrrNrwr __classcell__rrrr r75s  r7c@s\eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ e jddZe jddZeddZeddZeddZedd Zed!d"Zed#d$Zd%d&Zd'd(Zd)d*ZdEd-d.ZdFd/d0Zed1d2Zed3d4Zd5d6Z d7d8Z!ed9d:Z"ed;d<Z#ed=d>Z$ed?d@Z%edAdBZ&edCdDZ'd,S)GrLcCrrrrTrrr rrxz_BaseNetwork.__repr__cCd|j|jfSN%s/%d)rJrerTrrr rrxz_BaseNetwork.__str__ccs8t|j}t|j}t|d|D]}||Vq"dSr)rorJrCrange_address_classrUnetwork broadcastrrrr hostss  z_BaseNetwork.hostsccs8t|j}t|j}t||dD]}||Vq"dSr)rrrrr __iter__s  z_BaseNetwork.__iter__cCslt|j}t|j}|dkr>|||kr0td|||S|d7}|||krZtd|||SdS)Nrzaddress out of ranger*)rorJrCZ IndexErrorr)rUrrrrrr __getitem__s    z_BaseNetwork.__getitem__cCs^t|tstS|j|jkr*td||f|j|jkrB|j|jkS|j|jkrZ|j|jkSdSr)r6rLrOrGr8rJnetmaskrrrr rs      z_BaseNetwork.__lt__cCsJz.|j|jko,|j|jko,t|jt|jkWStyDtYS0dSr>)rGrJrorrIrOrrrr rs   z_BaseNetwork.__eq__cCstt|jt|jASr>)rrorJrrTrrr rrxz_BaseNetwork.__hash__cCs8|j|jkrdSt|trdS|j|jj@|jjkSdSNF)rGr6rLr+rrJrrrr __contains__s   z_BaseNetwork.__contains__cCs(|j|vp&|j|vp&|j|vp&|j|vSr>)rJrCrrrr overlapss    z_BaseNetwork.overlapscCs|t|jt|jBSr>)rrorJhostmaskrTrrr rCs z_BaseNetwork.broadcast_addresscCs|t|j|jASr>)rrorr;rTrrr rz_BaseNetwork.hostmaskcCrr)rJrHrTrrr with_prefixlenrz_BaseNetwork.with_prefixlencCrN%s/%s)rJrrTrrr with_netmaskrz_BaseNetwork.with_netmaskcCrr)rJrrTrrr with_hostmask rz_BaseNetwork.with_hostmaskcCst|jt|jdSr))rorCrJrTrrr num_addresses rWz_BaseNetwork.num_addressescCr^)Nz%%200s has no associated address classr_r`rrr rsz_BaseNetwork._address_classcCr|r>)rHrTrrr rerz_BaseNetwork.prefixlenccs|j|jkstd||ft|ts2td|||sLtd||f||krXdS|d|j|jf}| \}}||kr||kr||r|V| \}}qz||r|V| \}}qzt d|||fqz||kr|Vn"||kr|Vnt d|||fdS)Nr4z%s is not a network objectz%s not contained in %srz3Error performing exclusion: s1: %s s2: %s other: %s) rGr8r6rL subnet_ofrrvrJrerDZAssertionError)rUrZs1Zs2rrr address_excludes>$        z_BaseNetwork.address_excludecCs`|j|jkrtd||f|j|jkr,dS|j|jkr)rGrJrrTrrr rMz_BaseNetwork._get_networks_keyr*Nc cs|j|jkr|VdS|durJ||jkr0td|dkr@td||j}|dkrZtd|j|}||jkr~td||ft|j}t|jd}t|jd|?}t|||D]}|||f}|VqdS)Nznew prefix must be longerr*(cannot set prefixlen_diff and new_prefixrzprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s) rHr:rrorJrCrrrv) rUprefixlen_diff new_prefix new_prefixlenZstartZendZstepZnew_addrZcurrentrrr rDs0      z_BaseNetwork.subnetscCs|jdkr|S|durB||jkr(td|dkr8td|j|}|j|}|dkrftd|j|f|t|jt|j|>@|fS)Nrznew prefix must be shorterr*rz;current prefixlen is %d, cannot have a prefixlen_diff of %d)rHrrervrorJr)rUrrrrrr r@s&    z_BaseNetwork.supernetcC|jjo|jjSr>)rJ is_multicastrCrTrrr r z_BaseNetwork.is_multicastcCsfz:|j|jkr"t|d|d|j|jko8|j|jkWSty`td|d|Yn0dS)Nz and z are not of the same versionz*Unable to test subnet containment between )rGr8rJrCrI)Zarrrr _is_subnet_of s    z_BaseNetwork._is_subnet_ofcCs |||Sr>rrrrr rrz_BaseNetwork.subnet_ofcCs |||Sr>rrrrr supernet_ofrz_BaseNetwork.supernet_ofcCrr>)rJ is_reservedrCrTrrr r!rz_BaseNetwork.is_reservedcCrr>)rJ is_link_localrCrTrrr r-sz_BaseNetwork.is_link_localcCrr>)rJ is_privaterCrTrrr r8rz_BaseNetwork.is_privatecC|j Sr>rrTrrr is_globalDr]z_BaseNetwork.is_globalcCrr>)rJis_unspecifiedrCrTrrr rOrz_BaseNetwork.is_unspecifiedcCrr>)rJ is_loopbackrCrTrrr r[rz_BaseNetwork.is_loopbackr*Nr)(rrrrrrrrrrrrr functoolscached_propertyrCrrzrrrrrrerrrMrDr@r staticmethodrrrrrrrrrrrrr rLsb            K0 5 )       rLc@seZdZdZdZdedZeZiZddZ e ddZ e d d Z e d d Z e d dZddZeddZeddZdS)_BaseV4rrr#r*cCrXr>rYrTrrr rSzrxz$_BaseV4._explode_shorthand_ip_stringcCs||jvrt|tr<|}d|kr.|jkshn||n,z||}Wntyf||}Yn0t| |}||f|j|<|j|Srl) _netmask_cacher6ror:rkrpr rsr rfrdZargrerrrr _make_netmask}s    z_BaseV4._make_netmaskc Cs|s td|d}t|dkr.td|ztt|j|dWStyz}ztd||fdWYd}~n d}~00dS)NAddress cannot be empty.rzExpected 4 octets in %rr%s in %r)rr%r&ro from_bytesmap _parse_octetr)rdrrZoctetsexcrrr rqs   z_BaseV4._ip_int_from_stringcCsj|s td|r|s,d}t||t|dkrHd}t||t|d}|dkrftd||S)NzEmpty octet not permittedz#Only decimal digits permitted in %rz$At most 3 characters permitted in %ri izOctet %d (> 255) not permitted)rrmrnr&ro)rdZ octet_strraZ octet_intrrr rs     z_BaseV4._parse_octetcCsdtt|ddS)Nrrr)joinrr$r)rdrirrr rrgz_BaseV4._string_from_ip_intcCs&t|dddd}d|dS)NrrFz .in-addr.arpa)r$r%r)rUZreverse_octetsrrr r[z_BaseV4._reverse_pointercCr|r>r:rTrrr max_prefixlenrz_BaseV4.max_prefixlencCr|r>rrTrrr r9rz_BaseV4.versionN)rrrryrG IPV4LENGTHr;r:rrSr{rrqrrr[rzrr9rrrr rgs&        rc@seZdZdZddZeddZeddZee dd Z ee d d Z ed d Z eddZ eddZeddZdS)r )r+ __weakref__cCsrt|tr||||_dSt|trF||dt|d|_dSt|}d|vrbtd|| ||_dS)Nrrr"Unexpected '/' in %r) r6rorbr+rtrcrr$rrqrUrZaddr_strrrr __init__s     zIPv4Address.__init__cC t|jSr>)rr+rTrrr packedrWzIPv4Address.packedcC ||jjvSr>) _constants_reserved_networkrTrrr rr]zIPv4Address.is_reservedctfddjjDS)Nc3|]}|vVqdSr>r.0r<rTrr 2z)IPv4Address.is_private..anyr_private_networksrTrrTr r( zIPv4Address.is_privatecCs||jjvo|j Sr>)r_public_networkrrTrrr r4rWzIPv4Address.is_globalcCrr>r_multicast_networkrTrrr r9r]zIPv4Address.is_multicastcCs ||jjkSr>)r_unspecified_addressrTrrr rDr]zIPv4Address.is_unspecifiedcCrr>)r_loopback_networkrTrrr rOrzIPv4Address.is_loopbackcCrr>r_linklocal_networkrTrrr rYrzIPv4Address.is_link_localN)rrrryrrzrrr lru_cacherrrrrrrrrr r s(#       r c@sxeZdZddZejddZddZddZd d Z d d Z e j Z e d dZe ddZe ddZe ddZdS)rcCD||\}}t||t||fdd|_|jj|_|jj|_dSNF)r)rur rrrrrHrUrr'maskrrr rf   zIPv4Interface.__init__cC|jjSr>rrrTrrr rnrzIPv4Interface.hostmaskcCd||j|jfSrrr+rHrTrrr rrs zIPv4Interface.__str__cCDt||}|tus|s|Sz|j|jkWSty>YdS0dSr)r rrOrrIrUrZ address_equalrrr rv   zIPv4Interface.__eq__cCsPt||}|turtSz|j|jkp4|j|jko4|WStyJYdS0dSr)r rrOrrIrUrZ address_lessrrr r   zIPv4Interface.__lt__cC|j|jAt|jjASr>r+rHrorrJrTrrr rrxzIPv4Interface.__hash__cCrr>)r r+rTrrr r/rzIPv4Interface.ipcCrrrrTrrr r zIPv4Interface.with_prefixlencCrrrr+rrTrrr rr zIPv4Interface.with_netmaskcCrrrr+rrTrrr rr zIPv4Interface.with_hostmaskN)rrrrrrrrrrrrQrwrzr/rrrrrrr rds       rc@s.eZdZeZdddZeeddZ dS)rTc||\}t|_||\|_|_t|j}|t|j@|krl|rXtd|nt|t|j@|_|j|jdkr|j |_ n|j|jkrfdd|_ dS)N%s has host bits setr*c tgSr>)r rr'rr rz&IPv4Network.__init__..) rur rJrrrHrorr:rrrUrrrrrrr rs#    zIPv4Network.__init__cCs&|jtdvo|jtdv o$|j S)N 100.64.0.0/10)rJrrCrrTrrr rs  zIPv4Network.is_globalNT) rrrr rrrzrrrrrrr rs   4rc@seZdZedZedZedZedZededededededed ed ed ed ed edededgZedZ e dZ dS)_IPv4Constantsz169.254.0.0/16z 127.0.0.0/8z 224.0.0.0/4rz 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) rrrrrrrrrrr rrrrr rs*rc@seZdZdZdZdedZdZedZ eZ iZ e ddZ e d d Ze d d Ze d dZe dddZddZddZeddZeddZeddZdS)_BaseV6rr5r#r*rhZ0123456789ABCDEFabcdefcCsl||jvrbt|tr<|}d|kr.|jksFn||n ||}t||}||f|j|<|j|Srl)rr6ror:rkrprrfrrrr r/s    z_BaseV6._make_netmaskc Cs|s td|d}d}t||kr:d||f}t|d|dvrzt|j}Wn6ty}ztd||fdWYd}~n d}~00|d|d ?d @|d|d @|jd }t||krd |d |f}t|d}td t|d D]*} || s|dur"d |}t|| }q|dur|} t||d } |dsn| d 8} | rnd}t|||ds| d 8} | rd}t|||j| | } | d kr4d}t||jd |fnjt||jkrd}t||j|f|ds d}t|||ds$d}t||t|} d} d} znd} t| D] } | d K} | | || O} qB| d | K} t| dD] } | d K} | | || O} q|| WSt y}ztd||fdWYd}~n d}~00dS)Nr:rz At least %d parts expected in %rrrFr%xr 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+rA _HEXTET_COUNTr _parse_hextetr)rdrrpartsZ _min_partsraZipv4_intrZ _max_partsZ skip_indexZiZparts_hiZparts_loZ parts_skippedrirrr rqCs    (               z_BaseV6._ip_int_from_stringcCs>|j|std|t|dkr4d}t||t|dS)NzOnly hex digits permitted in %rrz$At most 4 characters permitted in %rr ) _HEX_DIGITSZ issupersetrr&ro)rdZ hextet_strrarrr rs     z_BaseV6._parse_hextetc Csd}d}d}d}t|D]>\}}|dkrN|d7}|dkr<|}||krV|}|}qd}d}q|dkr||}|t|kr~|dg7}dg|||<|dkrdg|}|S)NrFrrr*)Z enumerater&) rdhextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenZindexZhextetZbest_doublecolon_endrrr _compress_hextetss0   z_BaseV6._compress_hextetsNcsZ|durt|j}||jkr$tdd|fddtdddD}||}d|S) NzIPv6 address is too large%032xcs&g|]}dt||ddqS)rrr )rorrZhex_strrr rz/_BaseV6._string_from_ip_int..rrrr)ror+r;rrrr)rdrirrr"r rs   z_BaseV6._string_from_ip_intcst|trt|j}nt|tr,t|j}nt|}||}d|fddtdddD}t|ttfrdd ||j fSd |S) Nr csg|]}||dqS)rrr!r"rr r#"rz8_BaseV6._explode_shorthand_ip_string..rrrrr) r6rr$rJrr/rqrrLrrH)rUrrrirrr"r rSs     z$_BaseV6._explode_shorthand_ip_stringcCs&|jddddd}d|dS)NrFrrrz .ip6.arpa)rVZreplacer)rUZ reverse_charsrrr r['rz_BaseV6._reverse_pointercCs:|d\}}}|sd}n|r&d|vr2td|||fS)N%zInvalid IPv6 address: "%r")Z partitionr)rrr'Zsepscope_idrrr _split_scope_id0s   z_BaseV6._split_scope_idcCr|r>rrTrrr rDrz_BaseV6.max_prefixlencCr|r>rrTrrr r9Hrz_BaseV6.versionr>)rrrryrG IPV6LENGTHr;rZ frozensetrr:rr{rrqrrrrSr[rr&rzrr9rrrr rs2    g  /    rcseZdZdZddZfddZddZfdd Zed d Z ed d Z eddZ eddZ eddZ eddZeeddZeddZeddZeddZeddZed d!Zed"d#ZZS)$r)r+ _scope_idrcCst|tr$||||_d|_dSt|trR||dt|d|_d|_dSt|}d|vrnt d|| |\}|_| ||_dS)Nr rr"r) r6rorbr+r(rtrcrr$rr&rqrrrr rSs     zIPv6Address.__init__cs"t}|jr|d|jS|S)Nr$)rrr()rUrrrrr r{s zIPv6Address.__str__cCst|j|jfSr>)rr+r(rTrrr rrxzIPv6Address.__hash__cs2t|}|turtS|s dS|jt|ddkS)NFr()rrrOr(Zgetattrrrrr rs  zIPv6Address.__eq__cCr|r>)r(rTrrr r%rzIPv6Address.scope_idcCrr>)r!r+rTrrr rrWzIPv6Address.packedcCrr>rrTrrr rr]zIPv6Address.is_multicastcr)Nc3rr>rr!rTrr rrz*IPv6Address.is_reserved..)rr_reserved_networksrTrrTr rr]zIPv6Address.is_reservedcCrr>rrTrrr rrzIPv6Address.is_link_localcCrr>)r_sitelocal_networkrTrrr is_site_locals zIPv6Address.is_site_localcr)Nc3rr>rrrTrr rrz)IPv6Address.is_private..rrTrrTr rrzIPv6Address.is_privatecCrr>rrTrrr rr]zIPv6Address.is_globalcC |jdkSrlr}rTrrr rr]zIPv6Address.is_unspecifiedcCr,r)r}rTrrr rr]zIPv6Address.is_loopbackcCs |jd?dkrdSt|jd@S)Nrrr+r rTrrr ipv4_mapped zIPv6Address.ipv4_mappedcCs4|jd?dkrdSt|jd?d@t|jd@fS)Ni`i i@r-r.rTrrr teredos zIPv6Address.teredocCs$|jd?dkrdSt|jd?d@S)Nipi iPr-r.rTrrr sixtofourr0zIPv6Address.sixtofour)rrrryrrrrrzr%rrrrr+rrrrrrr/r1r2rrrrr rMs@(              rcseZdZddZejddZfddZddZd d Z d d Z e j Z e d dZe ddZe ddZe ddZe ddZe ddZZS)rcCrr)rurrrrrrHrrrr r"rzIPv6Interface.__init__cCrr>rrTrrr r*rzIPv6Interface.hostmaskcsdt|jfSr)rrrHrTrrr r.s zIPv6Interface.__str__cCrr)rrrOrrIrrrr r2rzIPv6Interface.__eq__cCsPt||}|tur|Sz|j|jkp4|j|jko4|WStyJYdS0dSr)rrrOrrIrrrr r>rzIPv6Interface.__lt__cCrr>rrTrrr rJrxzIPv6Interface.__hash__cCrr>)rr+rTrrr r/OrzIPv6Interface.ipcCrrrrTrrr rSr zIPv6Interface.with_prefixlencCrrr rTrrr rXr zIPv6Interface.with_netmaskcCrrr rTrrr r]r zIPv6Interface.with_hostmaskcC|jdko|jjSrl)r+rrrTrrr rbrzIPv6Interface.is_unspecifiedcCr3r))r+rrrTrrr rfrzIPv6Interface.is_loopback)rrrrrrrrrrrrQrwrzr/rrrrrrrrrr r s(         rc@s.eZdZeZd ddZddZeddZdS) rTcr )Nr r*crr>)rrrrr rrz&IPv6Network.__init__..) rurrJrrrHrorr:rrrrrr r{s    zIPv6Network.__init__ccs<t|j}t|j}t|d|dD]}||Vq&dSr)rrrrr rs  zIPv6Network.hostscCrr>)rJr+rCrTrrr r+s zIPv6Network.is_site_localNr) rrrrrrrrzr+rrrr rks  0 rc@seZdZedZedZededededededed ed ed edg Zed ed edededededededededededededgZedZdS)_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) rrrrrrrr)r*rrrr r4s.        r4r)#Z __version__rrr'rrr rrrrr!r(r0r3r=rErKrPrQrZtotal_orderingr7rLrr rrrrrrrrr4rrrr Z sV #7163kH uCR4TK\!