h&m^`      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh i j k l m n o p q r s t u v w x y z { | } ~                                           !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""""############################################$' Safe-Inferred"6 W   Safe-Inferred */debian*The function we want to pass a FilePath todebian%The text that the file should containdebianThe function's return value// Safe-Inferred5 X0101 Safe-Inferred"8o2debianThis type is wrapped around values before we pretty print them so we can write our own Pretty instances for common types without polluting the name space of clients of this package with instances they don't want.23456782345678 Safe-Inferred"= >debian> filepath+ is a simple wrapper function that parses filepath using pControl?debian?  sourceName handle -  sourceName! is only used for error reporting@debianparseControlFromString  sourceName text -  sourceName! is only used for error reportingAdebianA fieldName paragraph looks up a F in a I. N.B.$ trailing and leading whitespace is not stripped.BdebianStrip the trailing and leading space and tab characters from a string. Folded whitespace is not unfolded. This should probably be moved to someplace more general purpose.CdebianProtect field value text so the parser doesn't split it into multiple fields or paragraphs. This must modify all field text to enforce two conditions: (1) All lines other than the initial one must begin with a space or a tab, and (2) the trailing white space must not contain newlines. This is called before pretty printing to prevent the parser from misinterpreting field text as multiple fields or paragraphs.EdebianNOTE: we do not strip the leading or trailing whitespace in the name or valueGdebianLines beginning with #MdebianThis can usually be used as the implementation of protectFieldTextUdebian5Move selected fields to the beginning of a paragraph.Vdebian5Run a command and parse its output as a control file.Wdebianlook up the md5sum file in a paragraph Tries several different variations: MD5Sum: Md5Sum: MD5sum:ZdebianThis may have bad performance issues (dsf: Whoever wrote this comment should have explained why.)=BA>?@DCEFGHIJKLMNOPQRSTUVWJKLHIEFG=BA>?@DCNOPQRSTUVWM Safe-Inferredgg  Safe-Inferred-ldebianA parser for debian control file. This parser handles control files that end without a newline as well as ones that have several blank lines at the end. It is very liberal and does not attempt validate the fields in any way. All trailing, leading, and folded whitespace is preserved in the field values. See B.debianWe are liberal in that we allow *any* field to have folded white space, even though the specific restricts that to a few fields.debianWe go with the assumption that 'blank lines' mean lines that consist of entirely of zero or more whitespace characters.=BA>?@DCEFGHIJKNOPQRSTUhijklJKHIEFGjikh=BA>?@DClNOPQRSTU  Safe-Inferred=BA>?@DCEFGHIJKLNOPQRSTUnopJKLHIEFGpon=BA>?@DCNOPQRSTU  Safe-Inferred"zdebianparseFromFile p filePath runs a string parser p on the input read from filePath using . Returns either a  ParseError () or a value of type a ().  main = do{ result <- parseFromFile numbers "digits.txt" ; case result of Left err -> print err Right xs -> print (sum xs) }=BA>?@DCEFGHIJKLNOPQRSTUxyz{|}JKLHIEFGyxz=BA>?@DCNOPQRSTU{|}  Safe-Inferred"debianparseFromFile p filePath runs a string parser p on the input read from filePath using . Returns either a  ParseError () or a value of type a ().  main = do{ result <- parseFromFile numbers "digits.txt" ; case result of Left err -> print err Right xs -> print (sum xs) }=BA>?@DCEFGHIJKLNOPQRSTUJKLHIEFG=BA>?@DCNOPQRSTU  Safe-Inferred"debianparseFromFile p filePath runs a string parser p on the input read from filePath using . Returns either a  ParseError () or a value of type a ().  main = do{ result <- parseFromFile numbers "digits.txt" ; case result of Left err -> print err Right xs -> print (sum xs) }=BA>?@DCEFGHIJKLNOPQRSTUJKLHIEFG=BA>?@DCNOPQRSTU Safe-Inferred6 debianA package's subsection is only evident in its control information, packages from different subsections all reside in the same index.debianA section of a repository such as main, contrib, non-free, restricted. The indexes for a section are located below the distribution directory.debian$Parse the value that appears in the Section= field of a .changes file. (Does this need to be unesacped?)   Safe-Inferred! Safe-Inferred6!K Safe-Inferred! Safe-Inferred"%&56$debianA wrapper around a String containing a known parsable URI. Not absolutely safe, because you could say read "URI' "bogus string"" :: URI'. But enough to save me from myself.debianparseURI with MonadErrordebianConservative appending of absolute and relative URIs. There may be other cases that can be implemented, lets see if they turn up.debian3Append a list of URI @@ > appendURIs (parseURI " http://host.com") (parseURIRelative "/bar")debianUsing the bogus Show instance of URI here. If it ever gets fixed this will stop working. Worth noting that show will obscure any password info embedded in the URI, so that's nice./  /   Safe-Inferred'3debianwithMethod - run |methodPath| bracketed with openMethod/closeMethod. |f| gets the open handle.debianwhichMethodBinary - find the method executable associated with a URI throws an exception on failuredebianfetch a single item, show console output see also: getLastModifieddebianset of callbacks which do nothing. suitable for non-interactive usage. In the case authorization is required, no credentials will be supplied and the download should abort.== Safe-Inferred(N Safe-Inferred(~ Safe-Inferred"+%debianquoteWords - similar to words, but with special handling of double-quotes and brackets.The handling double quotes and [] is supposed to match: apt-0.6.44.2/apt-pkg/contrib/strutl.cc:ParseQuoteWord() The behaviour can be defined as:Break the string into space seperated words ignoring spaces that appear between "" or []. Strip trailing and leading white space around words. Strip out double quotes, but leave the square brackets intact.debianparseSourceLine -- parses a source line the argument must be a non-empty, valid source line with comments stripped see: &&% Safe-Inferred6+  Safe-Inferred.>debianWe have to do this wackiness because ~ is less than the empty stringdebianConvert a string to a debian version number. May throw an exception if the string is unparsable -- but I am not sure if that can currently happen. Are there any invalid version strings? Perhaps ones with underscore, or something?debianSplit a DebianVersion into its three components: epoch, version, revision. It is not safe to use the parsed version number for this because you will lose information, such as leading zeros.   Safe-Inferred. Safe-Inferred.& Safe-Inferred.   Safe-Inferred"61^debian parse a debian relation (i.e. the value of a Depends field). Return a parsec error or a value of type debianThis needs to be indented for use in a control file: intercalate "n " . lines . showdebian:Check if a version number satisfies a version requirement.debianThe sort order is based on version number first, then on the kind of relation, sorting in the order , <= , ==, >= ,debianWrap 2 around type synonyms that might overlap with the `Pretty [a]` instance. Safe-Inferred2wdebianIgnore the ! if it is present, we already know this list has at least one, and the rest are implicit. Safe-Inferred2 Safe-Inferred3W' Safe-Inferred3$$ Safe-Inferred%&68debianErrors that control files might throw, with source file name and line number generated by template haskell.debian=Class of things that contain a validated Debian control file.debianOpaque (constructor not exported) type to hold a validated Debian Control FiledebianValidate and return a control file in an opaque wrapper. May throw a ControlFileError. Currently we only verify that it has a Source field in the first paragraph and one or more subsequent paragraphs each with a Package field, and no syntax errors in the build dependencies (though they may be absent.)debian-Comment paragraphs are rare, but they happen.debianVersion of fieldValue that may throw a ControlFileError. We only use this internally on fields that we already validated.debianThis could access fields we haven't validated, so it can return an error. Additionally, the field might be absent, in which case it returns Nothing.debianApply a function to the text from a named field in a control file paragraph. Safe-Inferred"9D<=BA>?@DCEFGHIJKLNOPQRSTUhijkl?@DClNOPQRSTU Safe-Inferred6:$ Safe-Inferred"F+debian6Some target whose build dependencies are all satisfieddebian1The targets that are waiting for the ready targetdebian-The rest of the targets that need to be builtdebianGiven a source package name and a binary package name, return False if the binary package should be ignored hwen deciding whether to build the source package. This is used to prevent build dependency cycles from triggering unnecessary rebuilds. (This is a replacement for the RelaxInfo type, which we temporarily rename OldRelaxInfo.)debianSpecifies build dependencies that should be ignored during the build decision. If the pair is (BINARY, Nothing) it means the binary package BINARY should always be ignored when deciding whether to build. If the pair is (BINARY, Just SOURCE) it means that binary package BINARY should be ignored when deiciding whether to build package SOURCE.debian?This type describes the build dependencies of a source package.debiansource package namedebiandependency relationsdebian:binary dependency names (is this a function of relations?)debian>Set containing all binary package names mentioned in relationsdebianSet containing binaryNamesdebianReturn the dependency info for a source package with the given dependency relaxation. |According to debian policy, only the first paragraph in debian/control can be a source package http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfilesdebiansource package namedebiandependency relationsdebian:binary dependency names (is this a function of relations?)debianRemove any dependencies that are designated "relaxed" by relaxInfo.debianGiven an ordering function representing the dependencies on a list of packages, return a ReadyTarget triple: One ready package, the packages that depend on the ready package directly or indirectly, and all the other packages.debian%Find a cycle in a graph that involvesdebian!All the paths from root to a leafdebianRemove any packages which can't be built given that a package has failed.debianGiven a list of packages, sort them according to their apparant build dependencies so that the first element doesn't depend on any of the other packages.debianBuild a graph with the list of packages as its nodes and the build dependencies as its edges.debianThis is a nice start. It ignores circular build depends and takes a pretty simplistic approach to  build depends. However, I think this should work pretty nicely in practice.debian7Return the dependency info for a list of control files.debianOne example of how to tie the below functions together. In this case fp is the path to a directory that contains a bunch of checked out source packages. The code will automatically look for debian/control. It returns a list with the packages in the order they should be built.  Safe-Inferred"6R debianfunction-type for a function that downloads a file The timestamp is optional. If the local file is as new or newer than the remote copy, the download may be skipped.:A good choice might be a partially parameterized call to debianPackage indexes on the server are uncompressed or compressed with gzip or bzip2. We do not know what will exist on the server until we actually look. This type is used to mark the compression status of what was actually found.debian"update - similar to apt-get updatedebiandownload possibly compressed files NOTE: index uri must not include the .bz2 or .gz extensiondebianexamine a DebSource line, and calculate for each section: - the URI to the uncompressed index file - the basename that apt-get would name the downloaded index FIXME: ExactPath dist will fail with error at runtime :(debianreturn a tuple for the section - the URI to the uncompressed index file - the basename that apt-get uses for the downloaded index FIXME: support for Release and Release.gpgdebian'Parse a possibly compressed index file.debian'parse an index possibly compressed filedebianA release file contains a list of indexes (Packages/Sources). Each Package or Source index may appear multiple times because it may be compressed several different ways. This function will return an assoc list where the key is the name of the uncompressed package index name and the value is the list of (file, compression) which decompress to the key.debianThe release file contains the checksums for the uncompressed package indexes, even if the uncompressed package indexes are not stored on the server. This function returns the list of files that actually exist.debian=make a FileTuple for a file found on the local disk returns  if the file does not exist.debianfind the Contents-* files. These are not listed in the Release filedebian*function that will do actually downloadingdebian6download indexes to the directory (must already exist)debianbinary architecturedebian sources.listdebian,(basename of index file, compression status)debian&function that will do the actual fetchdebian:remote URI of package index, without .bz2 or .gz extensiondebian>name to save downloaded file as, without .bz2 or .gz extensiondebian6(downloaded file name + extension, compression status)debianwhich binary architecturedebianline from sources.listdebian:(remote uri, local name, deb source for just this section)debiando we want Packages or Sourcesdebian+The binary architecture to use for Packagesdebian&base URI as it appears in sources.listdebian7the release (e.g., unstable, testing, stable, sid, etc)debian*the section (main, contrib, non-free, etc)debian5(uri to index file, basename for the downloaded file)debianA release file! Safe-InferredWdebian+A changelog is a series of ChangeLogEntriesdebian"The parser here never returns thisdebian5An entry in the list of files generated by the build.debianA file generated by dpkg-buildpackage describing the result of a package builddebian=The full pathname of the directory holding the .changes file.debian3The package name parsed from the .changes file namedebian5The version number parsed from the .changes file namedebian+The Distribution field of the .changes filedebian3The architecture parsed from the .changes file namedebian!The contents of the .changes filedebian3The value of the Changes field of the .changes filedebian'The parsed value of the Files attributedebianShow just the top line of a changelog entry (for debugging output.)debianParse the entries of a debian changelog and verify they are all valid.debian:Parse a Debian Changelog and return a lazy list of entriesdebianParse a single changelog entry, returning the entry and the remaining text.debianParse the changelog information that shows up in the .changes file, i.e. a changelog entry with no signature.$$" Safe-InferredZdebian creates a map from a package name to all the versions of that package NOTE: Provides are not included in the map NOTE: the sort order is random -- this is perhaps a bug see also: debian finds packages that Provide other packages and adds them to the PackageNameMap. They will be adde to the end of the list, so that real packages have 'higher priority' than virtual packages. NOTE: Does not check for duplication or multiple usedebiandebian returns all the packages that satisfy the specified relation TODO: Add architecture check# Safe-Inferred]debianconflicting packages and relations that require non-existant packagesdebian TODO addProvides -- see DQL.ExecdebianJAS: deal with Provides/ (can a package provide more than one package?)debianearliestInconsistency does what it sounds like the 'reverse as' is because the vars are order high to low, but we want to find the lowest numbered (aka, eariest) inconsistency ??debianbj - backjumping labeler?@ABCDDEFFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~  r t o   o r t        r t o     r t o     r t o    b%bbcd                            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!b!c!d!!!!!!!!!!!!!!"""""############################################$  %%%%%%%%%     !"debian-4.0.5-JmtQhlfFzK1f5K3Elmhr0 Debian.Pretty Debian.URI Debian.TH Debian.ArchDebian.Extra.Files Debian.LocDebian.Control.Common Debian.DebDebian.Control.StringDebian.Control.ByteStringDebian.Control.TextLazyDebian.Control.TextDebian.Control.BuilderDebian.ReleaseDebian.Codename Debian.TimeDebian.Apt.Methods Debian.UTF8Debian.VendorURIDebian.SourcesDebian.Version.CommonDebian.Version.ByteStringDebian.Version.StringDebian.Relation.CommonDebian.Relation.StringDebian.Relation.TextDebian.Relation.ByteStringDebian.Control.PolicyDebian.ControlDebian.Util.FakeChangesDebian.GenBuildDepsDebian.Apt.IndexDebian.ChangesDebian.Apt.PackageDebian.Apt.DependenciesDebian.Version.TextDebian.Version.InternalDebian.VersionDebian.Relation Cabal-3.6.3.0Distribution.Pretty prettyShow*network-uri-2.6.4.2-HOWkOsJ6iQ9LdZ2sAMVHdr Network.URI uriToStringparseAbsoluteURIparseRelativeReferenceparseURIReferenceparseURInullURI uriFragmenturiQueryuriPath uriAuthority uriSchemeURIuriPort uriRegName uriUserInfoURIAuthtemplate-haskellLanguage.Haskell.TH.SyntaxLocArchSourceAllBinaryArchCPU ArchCPUAnyArchOS ArchOSAny prettyArch parseArch$fEqArch $fOrdArch $fReadArch $fShowArch $fDataArch $fEqArchCPU $fOrdArchCPU $fReadArchCPU $fShowArchCPU $fDataArchCPU $fEqArchOS $fOrdArchOS $fReadArchOS $fShowArchOS $fDataArchOSwithTemporaryFile__LOC__mapExnPPunPP prettyTextppPrintppShowppText $fPrettyPP $fPrettyPP0 $fPrettyPP1 $fFunctorPPControlFunctionsparseControlFromFileparseControlFromHandle parseControllookupPstripWSprotectFieldTextasStringField'FieldComment Paragraph' ParagraphControl'Control unControlprotectFieldText' mergeControls fieldValue removeField prependFields appendFields renameField modifyField raiseFieldsparseControlFromCmd md5sumField$fPrettyField'$fPrettyParagraph'$fPrettyControl' $fEqControl' $fOrdControl'$fReadControl'$fShowControl'$fEqParagraph'$fOrdParagraph'$fReadParagraph'$fShowParagraph' $fEqField' $fOrdField' $fReadField' $fShowField'fields ControlParserpControl$fControlFunctions[]$fControlFunctionsByteString$fMonadPlusParser $fMonadParser$fAlternativeParser$fApplicativeParser$fFunctorParser $fShowResult decodeControldecodeParagraph decodeField$fControlFunctionsText$fControlFunctionsBuilder SubSectionsectionsubSectionNameSection sectionName sectionName'sectionNameOfSubSection parseSection parseSection'$fReadSubSection$fShowSubSection$fEqSubSection$fOrdSubSection $fReadSection $fShowSection $fEqSection $fOrdSectionhere $fPretty[] $fPrettyLocCodename parseCodenamecodename$fPrettyCodename $fEqCodename $fOrdCodename$fReadCodename$fShowCodename$fDataCodenamerfc822DateFormat'epochTimeToUTCTimeformatTimeRFC822parseTimeRFC822getCurrentLocalRFC822Time HasURIError fromURIError HasParseErrorfromParseErrorURI'URIError URIParseErrorURIAppendErroruriAuthorityLensuriFragmentLens uriPathLens uriQueryLens uriSchemeLensshowURI parseURI'parseURIReference'parseAbsoluteURI'parseRelativeReference'parseURIUnsafe appendURI appendURIs parentURIprop_append_singletonprop_print_parsereadURI'fromURI'toURI' uriToString'$fOrdParseError$fHasParseErrorParseError$fHasURIErrorURIError $fReadURI' $fShowURI'$fEqURI' $fOrdURI' $fEqURIError $fOrdURIError$fShowURIErrorFetchCallbackslogCBstatusCB uriStartCB uriDoneCB uriFailureCBgeneralFailureCBauthorizationRequiredCBmediaFailureCBdebugCB ConfigItemHeaderCommand URIAcquire ConfigurationAuthorizationCredentials MediaChangedStatus CapabilitiesLogMsgURIStartURIDone URIFailureGeneralFailureAuthorizationRequired MediaFailureversionsingleInstancepreScanpipeline sendConfig needsCleanup localOnlyurisize lastModified resumePointfilenamehashesimsHitmessageDriveMediaPasswordUserSiteMessage withMethodURIwithMethodPathwhichMethodPath recvStatus sendCommand openMethod closeMethod simpleFetchfetchemptyFetchCallbackscliFetchCallbacksgetLastModified $fShowCommand $fEqCommand $fShowStatus $fEqStatus $fShowHashes $fEqHashesdecodereadFile VendorURI _vendorURI$fShowVendorURI $fEqVendorURI$fOrdVendorURI vendorURIparseVendorURI DebSource _sourceType_sourceOptions _sourceUri _sourceDistSourceOpOpSetOpAddOpDel SourceOption SourceTypeDebDebSrc quoteWords stripLine sourceLinesparseSourceLine parseOptionspOptionspOptionpOpparseSourceLine'parseSourcesListtestQuoteWordstestSourcesListtestSourcesList2validSourcesListStrvalidSourcesListvalidSourcesListExpected_invalidSourcesListStr1testSourcesListParsesourcesListTests$fPrettySourceType$fPrettySourceOp$fPrettySourceOption$fPrettyDebSource $fEqDebSource$fOrdDebSource$fShowDebSource$fEqSourceOption$fOrdSourceOption$fShowSourceOption $fEqSourceOp $fOrdSourceOp$fShowSourceOp$fEqSourceType$fOrdSourceType$fShowSourceType sourceDist sourceOptions sourceType sourceUri DebianVersionParseDebianVersionparseDebianVersionprettyDebianVersionparseDebianVersion'parseDVevrepochrevisionbuildDebianVersion $fOrdNumeric $fEqNumeric$fOrdNonNumeric$fEqNonNumeric$fShowDebianVersion$fOrdDebianVersion$fEqDebianVersion$fParseDebianVersionByteString$fReadDebianVersion$fParseDebianVersion[] VersionReqSLTLTEEEQGRESGRArchitectureReqArchOnly ArchExceptParseRelationsparseRelationsPkgNamepkgNameFromString BinPkgName unBinPkgName SrcPkgName unSrcPkgNameRelationRel OrRelation AndRelation RelationsprettyRelationsprettyOrRelationprettyRelationprettyArchitectureReqprettyVersionReqcheckVersionReq$fPkgNameSrcPkgName$fPkgNameBinPkgName $fPrettyPP2$fOrdVersionReq $fPrettyPP3 $fOrdRelation $fPrettyPP4 $fPrettyPP5 $fEqRelation$fReadRelation$fShowRelation$fEqVersionReq$fReadVersionReq$fShowVersionReq$fEqArchitectureReq$fOrdArchitectureReq$fReadArchitectureReq$fShowArchitectureReq$fReadBinPkgName$fShowBinPkgName$fEqBinPkgName$fOrdBinPkgName$fDataBinPkgName$fReadSrcPkgName$fShowSrcPkgName$fEqSrcPkgName$fOrdSrcPkgName$fDataSrcPkgName RelParser pRelations$fParseRelations[]$fParseRelationsText$fParseRelationsByteStringControlFileError NoParagraphsNoBinaryParagraphs MissingFieldParseRelationsErrorParseControlErrorIOErrorlocsctlfield parseErrorioErrorHasDebianControl debianControl DebianControlunDebianControlvalidateDebianControlunsafeDebianControlparseDebianControlparseDebianControlFromFiledebianPackageParagraphsdebianSourceParagraphdebianBinaryParagraphsdebianPackageNamesdebianSourcePackageNamedebianBinaryPackageNamesdebianBuildDepsIndepdebianBuildDepsdebianRelations$fShowDebianControl$fHasDebianControlDebianControl$fHasControlDebianControl$fHasControlControl'$fEqControlFileError$fExceptionControlFileError$fShowControlFileError packParagraph packField formatControlformatParagraph formatField fakeChanges $fReadError $fShowError $fEqError $fDataError BuildableInfo CycleInfo readyTargets allBlockeddepPairs ReadyTargetreadywaitingother RelaxInfoDepInfo sourceName relations binaryNamesdepSetbinSetbuildDependencies sourceName' relations' binaryNames' relaxDeps buildable failPackage orderSource compareSourcegenDepsgetSourceOrder $fEqDepInfo$fShowOldRelaxInfo $fShowDepInfo FileTupleSizeFetcher CheckSumsmd5sumsha1sha256 CompressionBZ2GZ UncompressedupdatecontrolFromIndexcontrolFromIndex' findIndexesindexesInReleasetupleFromFilePathfindContentsFiles$fReadCheckSums$fShowCheckSums $fEqCheckSums$fReadCompression$fShowCompression$fEqCompression$fOrdCompression$fEnumCompression$fBoundedCompression ChangeLogChangeLogEntryEntry WhiteSpace logPackage logVersionlogDists logUrgency logCommentslogWhologDateChangedFileSpecchangedFileMD5sumchangedFileSHA1sumchangedFileSHA256sumchangedFileSizechangedFileSectionchangedFilePrioritychangedFileName ChangesFileChanges changeDir changePackage changeVersion changeRelease changeArch changeInfo changeEntry changeFileschangesFileNameparseChangeLog parseEntries parseEntry parseChanges $fEqChangeLog$fReadChangeLog$fShowChangeLog$fEqChangesFile$fReadChangesFile$fShowChangesFile$fEqChangeLogEntry$fReadChangeLogEntry$fShowChangeLogEntry$fEqChangedFileSpec$fReadChangedFileSpec$fShowChangedFileSpecPackageNameMappackageNameMap addProvides findProvideslookupPackageByRelLabeler ConflictSetCSPpnm depFunction conflictspackageVersionState Remaining MissingDepCompletecomplete controlCSPtestCSPdepF sidPackages gutsyPackagestestpackageVersionParagraphconflict conflict'mkTreelabelinitTreemapTreefoldTree zipTreesWithpruneleavesinhTree distrTree mkSearchTreeearliestInconsistency isConflict solutionssearchbtbjunionCScombine$fParseDebianVersionTextpFieldpBlanksbase System.IO Data.EitherLeftRightFound SimulatedunFoundNumeric NonNumericcompareNonNumericparseArchExceptremoveCommentParagraphs fieldValue' mapFieldValue OldRelaxInfo allCycles treePaths buildGraph Data.Foldableor fetchIndex indexURIscalcPath groupIndexes filterExists GHC.MaybeNothing _showHeader