S/&      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~       !"#$%None<=DIR  &'     see src/Data/LICENSE experimentalnon-portable (GHC Extensions)NoneB12-bit unsigned integer type!narrowings represented as primop ( in GHC.count leading zeroscount trailing zeros the number of set bits) !"#$%&'()*+  ) !"#$%&'()*+None<=DIRNone. Taken from Data.ByteString.Internal". The same warnings apply here.:I think that this function can be improved. Right now, it always allocates enough space for a fifteen-character text rendering of an IP address. I think that it should be possible to do more of the math upfront and allocate less space.I^This does not do an endOfInput check because it is reused in the range parser implementation.JThis is sort of a misnomer. It takes Word32 to make dotDecimalParser probably perform better. This is mostly for internal use.CAt some point, it would be worth revisiting the decision to use * here. Using +A would probably give better performance on a 64-bit processor.NdAll the words given as argument should be range restricted from 0 to 255. This is not checked.OGiven the size of the mask, return the total number of ips in the subnet. This only works for IPv4 addresses because an IPv6 subnet can have up to 2^128 addresses.:./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg:./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg:./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUWVY\^[X]_Z`abcdefg:./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgNone -5<=DIRT h3The format expected by the mac address parser. The , taken by some of these constructors is the ascii value of the character to be used as the separator. This is typically a colon, a hyphen, or a space character. All decoding functions are case insensitive.iTwo-character groups, FA:2B:40:09:8C:11jThree-character groups, 24B-F0A-025-829kFour-character groups, A220.0745.CAC7lNo separator,  24AF4B5B0780qA 48-bit MAC address.tThe length should be between 0 and 32. These bounds are inclusive. This expectation is not in any way enforced by this library because it does not cause errors. A mask length greater than 32 will be treated as if it were 32.x A 32-bit  address or a 128-bit {8 address. Internally, this is just represented as an {' address. The functions provided in Net.IP& help simulate pattern matching on it.{.A 128-bit Internet Protocol version 6 address.-A 32-bit Internet Protocol version 4 address.:hijklmnopqrstuvwxyz{|}~-./0123456789:hijklmnopqrstuvwxyz{|}~{|}~xyztuvwqrsmnophijkl!hijklmnopqrstuvwxyz{|}~345-6.7/8091:2NoneIf the address is an  address, return the address.If the address is an {N address, and if it is not an IPv4-mapped IPv6 address, return the address.None Create an ~ address from four octets. The first argument is the most significant octet. The last argument is the least significant. Since the ; and < instances for N are not generally usefully, this function is the recommened way to create  addresses. For example:fromOctets 192 168 1 1IPv4 {getIPv4 = 3232235777} Convert an  address into a quadruple of octets. The first element in the quadruple is the most significant octet. The last element is the least significant octet.&The IP address representing any host: 0.0.0.0The loopback IP address:  127.0.0.1The broadcast IP address: 255.255.255.255Checks to see if the Y address belongs to a private network. The three private networks that are checked are  10.0.0.0/8,  172.16.0.0/12, and 192.168.0.0/16.Checks to see if the W address belongs to a reserved network. This includes the three private networks that S checks along with several other ranges that are not used on the public Internet.Checks to see if the  address is publicly routable.public x == not (reserved x)None Checks to see if an  address belongs in the t.let ip = fromOctets 10 10 1 92/contains (IPv4Range (fromOctets 10 0 0 0) 8) ipTrue1contains (IPv4Range (fromOctets 10 11 0 0) 16) ipFalse/Typically, element-testing functions are written to take the element as the first argument and the set as the second argument. This is intentionally written the other way for better performance when iterating over a collection. For example, you might test elements in a list for membership like this:,let r = IPv4Range (fromOctets 10 10 10 6) 31JmapM_ (print . contains r) (take 5 $ iterate succ $ fromOctets 10 10 10 5)FalseTrueTrueFalseFalseThe implementation of  ensures that (with GHC), the bitmask creation and range normalization only occur once in the above example. They are reused as the list is iterated.5This is provided to mirror the interface provided by Data.Set. It behaves just like  but with flipped arguments.member ip r == contains r ip The inclusive lower bound of an t\. This is conventionally understood to be the broadcast address of a subnet. For example:@I.print $ lowerInclusive $ IPv4Range (fromOctets 10 10 1 160) 25 10.10.1.128*Note that the lower bound of a normalized t( is simply the ip address of the range:/lowerInclusive r == ipv4RangeBase (normalize r) Convert an t into a list of the  addresses that are in it. >>> let r = IPv4Range (fromOctets 192 168 1 8) 30 >>> mapM_ I.print (toList r) 192.168.1.8 192.168.1.9 192.168.1.10 192.168.1.11'The RFC1918 24-bit block. Subnet mask:  10.0.0.0/8'The RFC1918 20-bit block. Subnet mask:  172.16.0.0/12'The RFC1918 16-bit block. Subnet mask: 192.168.0.0/16 Normalize an t(. The first result of this is that the  inside the tH is changed so that the insignificant bits are zeroed out. For example:<prRange $ normalize $ IPv4Range (fromOctets 192 168 1 19) 24192.168.1.0/24=prRange $ normalize $ IPv4Range (fromOctets 192 168 1 163) 28192.168.1.160/28`The second effect of this is that the mask length is lowered to be 32 or smaller. Working with ts that have not been normalized does not cause any issues for this library, although other applications may reject such ranges (especially those with a mask length above 32). Note that  is idempotent, that is:(normalize r == (normalize . normalize) r-This only exists for doctests. Do not use it. None(This exists mostly for testing purposes.== None(This exists mostly for testing purposes. None'This should be rewritten to not create Text as an intermediate step.This should also be rewritten>?@>?@ None None NoneAThis is an internal data type used as the result after parsing an ipv6 address. The first field indicates the index at which a double colon occurs. The second is the length of the third. The third is a reversed list of the 16s that comprise the ipv6 address.BCDEAFGHIJKLMBCDEAFGHIJKLMNone5INoneThis is slower that just pattern matching on the Text data constructor. However, it will work with GHCJS. This should only be used in places where we know that it will only be evaluated once.kThis length is not the character length. It is the length of Word16s required by a UTF16 representation. None%&OTCharacters outside the basic multilingual plane are not handled correctly by this function. They will not cause a program to crash; instead, the character will have the upper bits masked out.NOPQ   NOPQNoneRSTUV  WXYZ[\]^_`abcdefg     RSTUV  WXYZ[\]^_`abcdefgNoneOT\,A character in the basic multilingual plane.  h  i(Default, used when index is out of rangeTexts to index intojk        h  ijkNone%&OTl Taken from Data.ByteString.Internal". The same warnings apply here.mnopqrstul  mnopqrstulNone!!Make a bytestring builder from a q+ address using a colon as the separator." Parser for a q6 address using with a colon as the separator (i.e. FA:43:B2:C0:0F:99).# Parser for a q% address using the provided settings.vYParse a single hexidecimal character. This will skip at most one character to do this.wKind of a confusing type signature. The Word8 that stands alone represented an ascii-encoded value. The others actually describes the numbers that would be decoded from this value.xyz{ !"#$|}~vw%  !"#$% % !"#$xyz{ !"#$|}~vw% !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~         !"#$%&'()*+! , z - . / 0 1 2 . 3 4 5 6 7 8 9:;<=>>?@ABCDEFGHIJKLMNOPQRSYTD:;=<QUV>>?@GEFDJHWBALMOPNQRXip-0.9.1-DXQTKTDTpKiCjOr4fOYqiBData.Word.Synthetic.Word48Data.Word.Synthetic.Word12 Net.Internal Net.TypesNet.IPNet.IPv4Net.IPv4.RangeNet.IPv4.Range.Text Net.IPv4.TextNet.IPv4.ByteString.Char8Net.IPv4.StringNet.IPv6 Net.IPv6.TextNet.Mac!Data.Text.Builder.Common.InternalData.Text.Builder.Fixed Net.Mac.TextData.Text.Builder.VariableData.ByteString.Builder.FixedNet.Mac.ByteString.Char8Data.Word.SyntheticWord48W48V_Word48 MV_Word48 narrow48WordpopCnt48word48UpperWord16word48LowerWord32word48FromUpperLower$fVectorVectorWord48$fMVectorMVectorWord48 $fUnboxWord48D:R:VectorWord480D:R:MVectorsWord480$fFiniteBitsWord48 $fBitsWord48 $fReadWord48 $fIxWord48$fBoundedWord48$fIntegralWord48 $fEnumWord48 $fRealWord48 $fNumWord48 $fShowWord48 $fEqWord48 $fOrdWord48$fHashableWord48Word12W12# narrow12Word#clz12#ctz12# popCnt12#$fFiniteBitsWord12 $fBitsWord12 $fReadWord12 $fIxWord12$fBoundedWord12$fIntegralWord12 $fEnumWord12 $fRealWord12 $fNumWord12 $fShowWord12 $fDataWord12 $fEqWord12 $fOrdWord12c2weitherToAesonParserattoparsecParseJSON stripDecimaldecodeIPv4TextReaderdecodeIPv4TextEitheripOctetSizeErrorMsg rightToMaybetoDotDecimalTexttoDotDecimalBuilderrangeToDotDecimalTextrangeToDotDecimalBuildertoTextPreAllocatedtoTextPreallocatedPartTwo putAndCountputMacword48AsOctetsmacToTextDefaultmacToTextPreAllocatedmacToTextPartTwozeroi2wfromDotDecimalText'fromDotDecimalTextrangeFromDotDecimalText'rangeFromDotDecimalTextdotDecimalRangeParserdotDecimalParser fromOctets' fromOctetsV6 fromWord16sV6fromWord16Word64fromOctetsWord64 countAddrswordSuccessorswordSuccessorsMmaskp24p20p16mask4mask8mask10mask12mask15mask16mask20mask24mask28mask32 macTextParserunsafeWord48FromOctets macFromText macFromText' twoDigitsthreeDigitsWord8 twoHexDigitstwoHexDigitsLower MacGroupingMacGroupingPairsMacGroupingTriplesMacGroupingQuadruplesMacGroupingNoSeparatorMacCodecmacCodecGroupingmacCodecUpperCaseMacgetMac IPv4Range ipv4RangeBaseipv4RangeLengthIPgetIPIPv6ipv6Aipv6BIPv4getIPv4$fVectorVectorIPv4Range$fMVectorMVectorIPv4Range$fUnboxIPv4Range$fVectorVectorIPv4$fMVectorMVectorIPv4 $fUnboxIPv4$fFromJSONIPv4Range$fToJSONIPv4Range$fFromJSONIPv4 $fToJSONIPv4$fHashableIPv4Range $fFromJSONMac$fFromJSONKeyIPv4$fToJSONKeyIPv4$fFromJSONKeyMac$fToJSONKeyMac $fToJSONMac $fHashableMac$fEqIPv4 $fOrdIPv4 $fShowIPv4 $fReadIPv4 $fEnumIPv4 $fBoundedIPv4$fHashableIPv4 $fGenericIPv4 $fPrimIPv4 $fBitsIPv4$fFiniteBitsIPv4$fEqIPv6 $fOrdIPv6 $fShowIPv6 $fReadIPv6$fEqIP$fOrdIP$fShowIP$fReadIP $fEqIPv4Range$fOrdIPv4Range$fShowIPv4Range$fReadIPv4Range$fGenericIPv4Range$fEqMac$fOrdMac $fShowMac $fReadMac $fGenericMac$fEqMacGrouping$fOrdMacGrouping$fShowMacGrouping$fReadMacGrouping$fGenericMacGrouping $fEqMacCodec $fOrdMacCodec$fShowMacCodec$fReadMacCodec$fGenericMacCodeccase_ipv4ipv6 fromOctetstoOctetsanyloopback broadcastprivatereservedpubliccontainsmemberlowerInclusiveupperInclusivetoList toGenerator private24 private20 private16 normalizeprRangeencode decodeEitherdecodebuilderparserprintreader fromWord16s toWord16s$fShowS$fReadSportableTextArrayportableTextLengthportableUntext writeString charUtf16SizehexValuesWord12UpperhexValuesWord12LowerhexValuesWord8UpperhexValuesWord8LowertwoDecimalDigitsthreeDecimalDigitsBuilderfromTextcontramapBuilderrunword8HexFixedUpperword8HexFixedLowercharBmpword12HexFixedUpperword12HexFixedLower$fMonoidBuilder encodeWithdecodeEitherWith decodeWith parserWith contramap staticCharBmpword8fromByteStringchar8 decodeLenient parserLenient&vector-0.11.0.0-HhutbadagxHIONIkSRJEugData.Vector.Unboxed.BaseMVectorVectorghc-primGHC.Primand# word12TypebaseGHC.WordWord32 GHC.TypesWordWord8V_MacMV_Mac V_IPv4Range MV_IPv4RangeV_IPv4MV_IPv4macFromOctets' mkIPv4RangeD:R:VectorMac0D:R:MVectorsMac0D:R:VectorIPv4Range0D:R:MVectorsIPv4Range0D:R:VectorIPv40D:R:MVectorsIPv40GHC.ShowShowGHC.ReadReadtoBSPreAllocated threeDigitsSResResWordResColonResDone sDoubleColonsTotal sRevWordstoIPv6times16 alreadySet restrictTo16 BuilderStaticBuilderFunctionword8HexFixedGeneralword12HexFixedGeneralPairpairSeppairMacwithCasedBuilderdefCodecw8ToCharparserQuadruples parserPairs parserTriplesparserNoSeparator parseTwoHextryParseCharHex parseOneHex parseCharHexwithCasedBuilderTriplefixedBuilderTriplesfixedBuilderNoSeparatorfixedBuilderQuadruplesfixedBuilderPairsword8Atword12Atvector asciiZeroparseOneHexLenienttryParseWord8Hex parseWord8Hex