'Instantiate a new IPv6 Network object.
Args:
address: A string or integer representing the IPv6 network or the IP
and prefix/netmask.
\'2001:4860::/128\'
\'2001:4860:0000:0000:0000:0000:0000:0000/128\'
\'2001:4860::\'
are all functionally the same in IPv6.  That is to say,
failing to provide a subnetmask will create an object with
a mask of /128.
Additionally, an integer can be passed, so
IPv6Network(\'2001:4860::\') ==
IPv6Network(42541956101370907050197289607612071936L).
or, more generally
IPv6Network(IPv6Network(\'2001:4860::\')._ip) ==
IPv6Network(\'2001:4860::\')
strict: A boolean. If true, ensure that we have been passed
A true network address, eg, 192.168.1.0/24 and not an
IP address on a network, eg, 192.168.1.1/24.
Raises:
AddressValueError: If address isn\'t a valid IPv6 address.
NetmaskValueError: If the netmask isn\'t valid for
an IPv6 address.
ValueError: If strict was True and a network address was not
supplied.'

def __init__(self, address, strict=False):

    _BaseNet.__init__(self, address)
    _BaseV6.__init__(self, address)
    if isinstance(address, (int, long, Bytes)):
        self.ip = IPv6Address(address)
        self._ip = self.ip._ip
        self._prefixlen = self._max_prefixlen
        self.netmask = IPv6Address(self._ALL_ONES)
        return
    addr = str(address).split('/')
    if (len(addr) > 2):
        raise AddressValueError(address)
    self._ip = self._ip_int_from_string(addr[0])
    self.ip = IPv6Address(self._ip)
    if (len(addr) == 2):
        self._prefixlen = self._prefix_from_prefix_string(addr[1])
    else:
        self._prefixlen = self._max_prefixlen
    self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
    if strict:
        if (self.ip != self.network):
            raise ValueError(('%s    has    host    bits    set' % self.ip))
    if (self._prefixlen == (self._max_prefixlen - 1)):
        self.iterhosts = self.__iter__
