code: public IPv6AddressSection maskNetwork(IPv6AddressSection mask, int networkPrefixLength) throws IncompatibleAddressException, PrefixLenException, SizeMismatchException {
  		checkMaskSectionCount(mask);
  		if(getNetwork().getPrefixConfiguration().allPrefixedAddressesAreSubnets()) {
  			return getSubnetSegments(
  					this,
  					cacheBits(networkPrefixLength),
  					getAddressCreator(),
  					true,
  					this::getSegment,
  					i -> mask.getSegment(i).getSegmentValue(),
  					false);
  		}
  		IPv6AddressSection hostMask = getNetwork().getHostMaskSection(networkPrefixLength);
  		return getSubnetSegments(
  				this,
  				cacheBits(networkPrefixLength),
  				getAddressCreator(),
  				true, 
  				this::getSegment, 
  				i -> {
  					int val1 = mask.getSegment(i).getSegmentValue();
  					int val2 = hostMask.getSegment(i).getSegmentValue();
  					return val1 | val2;
  				},
  				false
  		);
  	}
docs: Applies the given mask to the network section of the address as indicated by the given prefix length.
  Useful for subnetting.  Once you have zeroed a section of the network you can insert bits
  using {@link #bitwiseOr(IPv6AddressSection)} or {@link #replace(int, IPv6AddressSection)}
  
  @param mask
  @param networkPrefixLength
  @return
  @throws IncompatibleAddressException