diff --git a/Annex.hs b/Annex.hs
--- a/Annex.hs
+++ b/Annex.hs
@@ -42,7 +42,6 @@
 import Git.CatFile
 import Git.CheckAttr
 import Git.CheckIgnore
-import Git.SharedRepository
 import qualified Git.Hook
 import qualified Git.Queue
 import Types.Key
@@ -57,7 +56,7 @@
 import Types.UUID
 import Types.FileMatcher
 import Types.NumCopies
-import Types.LockPool
+import Types.LockCache
 import Types.MetaData
 import Types.DesktopNotify
 import Types.CleanupActions
@@ -69,6 +68,7 @@
 
 import "mtl" Control.Monad.Reader
 import Control.Concurrent
+import Control.Concurrent.Async
 import qualified Data.Map as M
 import qualified Data.Set as S
 
@@ -114,12 +114,11 @@
 	, uuidmap :: Maybe UUIDMap
 	, preferredcontentmap :: Maybe (FileMatcherMap Annex)
 	, requiredcontentmap :: Maybe (FileMatcherMap Annex)
-	, shared :: Maybe SharedRepository
 	, forcetrust :: TrustMap
 	, trustmap :: Maybe TrustMap
 	, groupmap :: Maybe GroupMap
 	, ciphers :: M.Map StorableCipher Cipher
-	, lockpool :: LockPool
+	, lockcache :: LockCache
 	, flags :: M.Map String Bool
 	, fields :: M.Map String String
 	, modmeta :: [ModMeta]
@@ -134,6 +133,7 @@
 #endif
 	, existinghooks :: M.Map Git.Hook.Hook Bool
 	, desktopnotify :: DesktopNotify
+	, workers :: [Either AnnexState (Async AnnexState)]
 	}
 
 newState :: GitConfig -> Git.Repo -> AnnexState
@@ -159,12 +159,11 @@
 	, uuidmap = Nothing
 	, preferredcontentmap = Nothing
 	, requiredcontentmap = Nothing
-	, shared = Nothing
 	, forcetrust = M.empty
 	, trustmap = Nothing
 	, groupmap = Nothing
 	, ciphers = M.empty
-	, lockpool = M.empty
+	, lockcache = M.empty
 	, flags = M.empty
 	, fields = M.empty
 	, modmeta = []
@@ -179,6 +178,7 @@
 #endif
 	, existinghooks = M.empty
 	, desktopnotify = mempty
+	, workers = []
 	}
 
 {- Makes an Annex state object for the specified git repo.
diff --git a/Annex/BranchState.hs b/Annex/BranchState.hs
--- a/Annex/BranchState.hs
+++ b/Annex/BranchState.hs
@@ -16,11 +16,9 @@
 getState :: Annex BranchState
 getState = Annex.getState Annex.branchstate
 
-setState :: BranchState -> Annex ()
-setState state = Annex.changeState $ \s -> s { Annex.branchstate = state }
-
 changeState :: (BranchState -> BranchState) -> Annex ()
-changeState changer = setState =<< changer <$> getState
+changeState changer = Annex.changeState $ \s -> 
+	s { Annex.branchstate = changer (Annex.branchstate s) }
 
 {- Runs an action to check that the index file exists, if it's not been
  - checked before in this run of git-annex. -}
diff --git a/Annex/CheckAttr.hs b/Annex/CheckAttr.hs
--- a/Annex/CheckAttr.hs
+++ b/Annex/CheckAttr.hs
@@ -7,7 +7,8 @@
 
 module Annex.CheckAttr (
 	checkAttr,
-	checkAttrHandle
+	checkAttrHandle,
+	checkAttrStop,
 ) where
 
 import Common.Annex
@@ -33,3 +34,10 @@
 		h <- inRepo $ Git.checkAttrStart annexAttrs
 		Annex.changeState $ \s -> s { Annex.checkattrhandle = Just h }
 		return h
+
+checkAttrStop :: Annex ()
+checkAttrStop = maybe noop stop =<< Annex.getState Annex.checkattrhandle
+  where
+	stop h = do
+		liftIO $ Git.checkAttrStop h
+		Annex.changeState $ \s -> s { Annex.checkattrhandle = Nothing }
diff --git a/Annex/CheckIgnore.hs b/Annex/CheckIgnore.hs
--- a/Annex/CheckIgnore.hs
+++ b/Annex/CheckIgnore.hs
@@ -8,7 +8,8 @@
 
 module Annex.CheckIgnore (
 	checkIgnored,
-	checkIgnoreHandle
+	checkIgnoreHandle,
+	checkIgnoreStop
 ) where
 
 import Common.Annex
@@ -30,3 +31,11 @@
 			warning "The installed version of git is too old for .gitignores to be honored by git-annex."
 		Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v }
 		return v
+
+checkIgnoreStop :: Annex ()
+checkIgnoreStop = maybe noop stop =<< Annex.getState Annex.checkignorehandle
+  where
+	stop (Just h) = do
+		liftIO $ Git.checkIgnoreStop h
+		Annex.changeState $ \s -> s { Annex.checkignorehandle = Nothing }
+	stop Nothing = noop
diff --git a/Annex/Concurrent.hs b/Annex/Concurrent.hs
new file mode 100644
--- /dev/null
+++ b/Annex/Concurrent.hs
@@ -0,0 +1,65 @@
+{- git-annex concurrent state
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Annex.Concurrent where
+
+import Common.Annex
+import Annex
+import Annex.CatFile
+import Annex.CheckAttr
+import Annex.CheckIgnore
+
+import qualified Data.Map as M
+
+{- Allows forking off a thread that uses a copy of the current AnnexState
+ - to run an Annex action.
+ -
+ - The returned IO action can be used to start the thread.
+ - It returns an Annex action that must be run in the original 
+ - calling context to merge the forked AnnexState back into the
+ - current AnnexState.
+ -}
+forkState :: Annex a -> Annex (IO (Annex a))
+forkState a = do
+	st <- dupState
+	return $ do
+		(ret, newst) <- run st a
+		return $ do
+			mergeState newst
+			return ret
+
+{- Returns a copy of the current AnnexState that is safe to be
+ - used when forking off a thread. 
+ -
+ - After an Annex action is run using this AnnexState, it
+ - should be merged back into the current Annex's state,
+ - by calling mergeState.
+ -}
+dupState :: Annex AnnexState
+dupState = do
+	st <- Annex.getState id
+	-- avoid sharing eg, open file handles
+	return $ st
+		{ Annex.workers = []
+		, Annex.catfilehandles = M.empty
+		, Annex.checkattrhandle = Nothing
+		, Annex.checkignorehandle = Nothing
+		}
+
+{- Merges the passed AnnexState into the current Annex state.
+ - Also shuts closes various handles in it. -}
+mergeState :: AnnexState -> Annex ()
+mergeState st = do
+	st' <- liftIO $ snd <$> run st closehandles
+	forM_ (M.toList $ Annex.cleanup st') $
+		uncurry addCleanup
+	changeState $ \s -> s { errcounter = errcounter s + errcounter st' }
+  where
+	closehandles = do
+		catFileStop
+		checkAttrStop
+		checkIgnoreStop
diff --git a/Annex/Content.hs b/Annex/Content.hs
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -41,6 +41,7 @@
 
 import Common.Annex
 import Logs.Location
+import Logs.Transfer
 import qualified Git
 import qualified Annex
 import qualified Annex.Queue
@@ -57,7 +58,7 @@
 import Annex.Link
 import Annex.Content.Direct
 import Annex.ReplaceFile
-import Utility.LockFile
+import Utility.LockPool
 import Messages.Progress
 
 {- Checks if a given key's content is currently present. -}
@@ -93,7 +94,7 @@
 {- A safer check; the key's content must not only be present, but
  - is not in the process of being removed. -}
 inAnnexSafe :: Key -> Annex (Maybe Bool)
-inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key
+inAnnexSafe key = inAnnex' (fromMaybe True) (Just False) go key
   where
 	is_locked = Nothing
 	is_unlocked = Just True
@@ -149,10 +150,14 @@
  - file from the content, since locking the actual content file
  - would interfere with the user's use of it. -}
 contentLockFile :: Key -> Annex (Maybe FilePath)
+#ifndef mingw32_HOST_OS
 contentLockFile key = ifM isDirect
 	( Just <$> calcRepo (gitAnnexContentLock key)
 	, return Nothing
 	)
+#else
+contentLockFile key = Just <$> calcRepo (gitAnnexContentLock key)
+#endif
 
 newtype ContentLock = ContentLock Key
 
@@ -163,43 +168,41 @@
 lockContent key a = do
 	contentfile <- calcRepo $ gitAnnexLocation key
 	lockfile <- contentLockFile key
-	maybe noop setuplockfile lockfile
 	bracket
 		(lock contentfile lockfile)
 		(unlock lockfile)
-		(const $ a $ ContentLock key)
+		(const $ a $ ContentLock key )
   where
 	alreadylocked = error "content is locked"
-	setuplockfile lockfile = modifyContent lockfile $
-		void $ liftIO $ tryIO $
-			writeFile lockfile ""
+	failedtolock e = error $ "failed to lock content: " ++ show e
+	trylock locker = locker `catchIO` failedtolock
 	cleanuplockfile lockfile = modifyContent lockfile $
 		void $ liftIO $ tryIO $
 			nukeFile lockfile
 #ifndef mingw32_HOST_OS
-	lock contentfile Nothing = liftIO $
-		opencontentforlock contentfile >>= dolock
-	lock _ (Just lockfile) = do
-		mode <- annexFileMode
-		liftIO $ createLockFile mode lockfile >>= dolock . Just
 	{- Since content files are stored with the write bit disabled, have
 	 - to fiddle with permissions to open for an exclusive lock. -}
-	opencontentforlock f = catchDefaultIO Nothing $ 
-		withModifiedFileMode f
-			(`unionFileModes` ownerWriteMode)
-			(openExistingLockFile f)
-	dolock Nothing = return Nothing
-	dolock (Just fd) = do
-		v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0)
-		case v of
-			Left _ -> alreadylocked
-			Right _ -> return $ Just fd
-	unlock mlockfile mfd = do
+	lock contentfile Nothing = trylock $ bracket_
+		(thawContent contentfile)
+		(freezeContent contentfile)
+		(maybe alreadylocked return 
+			=<< liftIO (tryLockExclusive Nothing contentfile))
+	lock _ (Just lockfile) = trylock $ do
+		mode <- annexFileMode
+		maybe alreadylocked return 
+			=<< modifyContent lockfile
+				(liftIO $ tryLockExclusive (Just mode) lockfile)
+	unlock mlockfile lck = do
 		maybe noop cleanuplockfile mlockfile
-		liftIO $ maybe noop closeFd mfd
+		liftIO $ dropLock lck
 #else
-	lock _ (Just lockfile) = liftIO $
-		maybe alreadylocked (return . Just) =<< lockExclusive lockfile
+	lock _ (Just lockfile) = do
+		modifyContent lockfile $
+			void $ liftIO $ tryIO $
+				writeFile lockfile ""
+		maybe alreadylocked (return . Just)
+			=<< liftIO (lockExclusive lockfile)
+	-- never reached; windows always uses a separate lock file
 	lock _ Nothing = return Nothing
 	unlock mlockfile mlockhandle = do
 		liftIO $ maybe noop dropLock mlockhandle
@@ -239,7 +242,7 @@
 	alreadythere <- liftIO $ if e
 		then getFileSize tmp
 		else return 0
-	ifM (checkDiskSpace Nothing key alreadythere)
+	ifM (checkDiskSpace Nothing key alreadythere True)
 		( do
 			-- The tmp file may not have been left writable
 			when e $ thawContent tmp
@@ -278,18 +281,34 @@
 	return res
 
 {- Checks that there is disk space available to store a given key,
- - in a destination (or the annex) printing a warning if not. -}
-checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Annex Bool
-checkDiskSpace destination key alreadythere = ifM (Annex.getState Annex.force)
+ - in a destination (or the annex) printing a warning if not. 
+ -
+ - If the destination is on the same filesystem as the annex,
+ - checks for any other running downloads, removing the amount of data still
+ - to be downloaded from the free space. This way, we avoid overcommitting
+ - when doing concurrent downloads.
+ -}
+checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Bool -> Annex Bool
+checkDiskSpace destination key alreadythere samefilesystem = ifM (Annex.getState Annex.force)
 	( return True
 	, do
-		reserve <- annexDiskReserve <$> Annex.getGitConfig
+		-- We can't get inprogress and free at the same
+		-- time, and both can be changing, so there's a
+		-- small race here. Err on the side of caution
+		-- by getting inprogress first, so if it takes
+		-- a while, we'll see any decrease in the free
+		-- disk space.
+		inprogress <- if samefilesystem
+			then sizeOfDownloadsInProgress (/= key)
+			else pure 0
 		free <- liftIO . getDiskFree =<< dir
 		case (free, fromMaybe 1 (keySize key)) of
 			(Just have, need) -> do
-				let ok = (need + reserve <= have + alreadythere)
+				reserve <- annexDiskReserve <$> Annex.getGitConfig
+				let delta = need + reserve - have - alreadythere + inprogress
+				let ok = delta <= 0
 				unless ok $
-					needmorespace (need + reserve - have - alreadythere)
+					needmorespace delta
 				return ok
 			_ -> return True
 	)
@@ -596,39 +615,39 @@
  - allow reading it, per core.sharedRepository setting. -}
 freezeContent :: FilePath -> Annex ()
 freezeContent file = unlessM crippledFileSystem $
-	liftIO . go =<< fromRepo getSharedRepository
+	withShared go
   where
-	go GroupShared = modifyFileMode file $
+	go GroupShared = liftIO $ modifyFileMode file $
 		removeModes writeModes .
 		addModes [ownerReadMode, groupReadMode]
-	go AllShared = modifyFileMode file $
+	go AllShared = liftIO $ modifyFileMode file $
 		removeModes writeModes .
 		addModes readModes
-	go _ = modifyFileMode file $
+	go _ = liftIO $ modifyFileMode file $
 		removeModes writeModes .
 		addModes [ownerReadMode]
 
 {- Adjusts read mode of annexed file per core.sharedRepository setting. -}
 chmodContent :: FilePath -> Annex ()
 chmodContent file = unlessM crippledFileSystem $
-	liftIO . go =<< fromRepo getSharedRepository
+	withShared go
   where
-	go GroupShared = modifyFileMode file $
+	go GroupShared = liftIO $ modifyFileMode file $
 		addModes [ownerReadMode, groupReadMode]
-	go AllShared = modifyFileMode file $
+	go AllShared = liftIO $ modifyFileMode file $
 		addModes readModes
-	go _ = modifyFileMode file $
+	go _ = liftIO $ modifyFileMode file $
 		addModes [ownerReadMode]
 
 {- Allows writing to an annexed file that freezeContent was called on
  - before. -}
 thawContent :: FilePath -> Annex ()
 thawContent file = unlessM crippledFileSystem $
-	liftIO . go =<< fromRepo getSharedRepository
+	withShared go
   where
-	go GroupShared = groupWriteRead file
-	go AllShared = groupWriteRead file
-	go _ = allowWrite file
+	go GroupShared = liftIO $ groupWriteRead file
+	go AllShared = liftIO $ groupWriteRead file
+	go _ = liftIO $ allowWrite file
 
 {- Finds files directly inside a directory like gitAnnexBadDir 
  - (not in subdirectories) and returns the corresponding keys. -}
diff --git a/Annex/Drop.hs b/Annex/Drop.hs
--- a/Annex/Drop.hs
+++ b/Annex/Drop.hs
@@ -42,7 +42,7 @@
  - The runner is used to run commands, and so can be either callCommand
  - or commandAction.
  -}
-handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> CommandActionRunner -> Annex ()
+handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> (CommandStart -> CommandCleanup) -> Annex ()
 handleDropsFrom locs rs reason fromhere key afile knownpresentremote runner = do
 	fs <- ifM isDirect
 		( do
diff --git a/Annex/LockFile.hs b/Annex/LockFile.hs
--- a/Annex/LockFile.hs
+++ b/Annex/LockFile.hs
@@ -8,26 +8,26 @@
 {-# LANGUAGE CPP #-}
 
 module Annex.LockFile (
-	lockFileShared,
+	lockFileCached,
 	unlockFile,
-	getLockPool,
+	getLockCache,
 	withExclusiveLock,
 	tryExclusiveLock,
 ) where
 
 import Common.Annex
 import Annex
-import Types.LockPool
+import Types.LockCache
 import qualified Git
 import Annex.Perms
-import Utility.LockFile
+import Utility.LockPool
 
 import qualified Data.Map as M
 
 {- Create a specified lock file, and takes a shared lock, which is retained
- - in the pool. -}
-lockFileShared :: FilePath -> Annex ()
-lockFileShared file = go =<< fromLockPool file
+ - in the cache. -}
+lockFileCached :: FilePath -> Annex ()
+lockFileCached file = go =<< fromLockCache file
   where
 	go (Just _) = noop -- already locked
 	go Nothing = do
@@ -37,25 +37,25 @@
 #else
 		lockhandle <- liftIO $ waitToLock $ lockShared file
 #endif
-		changeLockPool $ M.insert file lockhandle
+		changeLockCache $ M.insert file lockhandle
 
 unlockFile :: FilePath -> Annex ()
-unlockFile file = maybe noop go =<< fromLockPool file
+unlockFile file = maybe noop go =<< fromLockCache file
   where
 	go lockhandle = do
 		liftIO $ dropLock lockhandle
-		changeLockPool $ M.delete file
+		changeLockCache $ M.delete file
 
-getLockPool :: Annex LockPool
-getLockPool = getState lockpool
+getLockCache :: Annex LockCache
+getLockCache = getState lockcache
 
-fromLockPool :: FilePath -> Annex (Maybe LockHandle)
-fromLockPool file = M.lookup file <$> getLockPool
+fromLockCache :: FilePath -> Annex (Maybe LockHandle)
+fromLockCache file = M.lookup file <$> getLockCache
 
-changeLockPool :: (LockPool -> LockPool) -> Annex ()
-changeLockPool a = do
-	m <- getLockPool
-	changeState $ \s -> s { lockpool = a m }
+changeLockCache :: (LockCache -> LockCache) -> Annex ()
+changeLockCache a = do
+	m <- getLockCache
+	changeState $ \s -> s { lockcache = a m }
 
 {- Runs an action with an exclusive lock held. If the lock is already
  - held, blocks until it becomes free. -}
diff --git a/Annex/Perms.hs b/Annex/Perms.hs
--- a/Annex/Perms.hs
+++ b/Annex/Perms.hs
@@ -15,6 +15,7 @@
 	freezeContentDir,
 	thawContentDir,
 	modifyContent,
+	withShared,
 ) where
 
 import Common.Annex
@@ -26,12 +27,7 @@
 import System.Posix.Types
 
 withShared :: (SharedRepository -> Annex a) -> Annex a
-withShared a = maybe startup a =<< Annex.getState Annex.shared
-  where
-	startup = do
-		shared <- fromRepo getSharedRepository
-		Annex.changeState $ \s -> s { Annex.shared = Just shared }
-		a shared
+withShared a = a =<< coreSharedRepository <$> Annex.getGitConfig
 
 setAnnexFilePerm :: FilePath -> Annex ()
 setAnnexFilePerm = setAnnexPerm False
@@ -90,12 +86,12 @@
  -}
 freezeContentDir :: FilePath -> Annex ()
 freezeContentDir file = unlessM crippledFileSystem $
-	liftIO . go =<< fromRepo getSharedRepository
+	withShared go
   where
 	dir = parentDir file
-	go GroupShared = groupWriteRead dir
-	go AllShared = groupWriteRead dir
-	go _ = preventWrite dir
+	go GroupShared = liftIO $ groupWriteRead dir
+	go AllShared = liftIO $ groupWriteRead dir
+	go _ = liftIO $ preventWrite dir
 
 thawContentDir :: FilePath -> Annex ()
 thawContentDir file = unlessM crippledFileSystem $
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -37,7 +37,7 @@
 import Annex.Index (addGitEnv)
 #ifndef mingw32_HOST_OS
 import Annex.Perms
-import Utility.LockFile
+import Utility.LockPool
 #endif
 
 {- Generates parameters to ssh to a given host (or user@host) on a given
@@ -126,13 +126,13 @@
 	-- If the lock pool is empty, this is the first ssh of this
 	-- run. There could be stale ssh connections hanging around
 	-- from a previous git-annex run that was interrupted.
-	whenM (not . any isLock . M.keys <$> getLockPool)
+	whenM (not . any isLock . M.keys <$> getLockCache)
 		sshCleanup
 	-- Cleanup at end of this run.
 	Annex.addCleanup SshCachingCleanup sshCleanup
 
 	liftIO $ createDirectoryIfMissing True $ parentDir socketfile
-	lockFileShared $ socket2lock socketfile
+	lockFileCached $ socket2lock socketfile
 
 enumSocketFiles :: Annex [FilePath]
 enumSocketFiles = go =<< sshCacheDir
diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs
--- a/Annex/Transfer.hs
+++ b/Annex/Transfer.hs
@@ -9,6 +9,7 @@
 
 module Annex.Transfer (
 	module X,
+	noObserver,
 	upload,
 	download,
 	runTransfer,
@@ -22,18 +23,23 @@
 import Annex.Notification as X
 import Annex.Perms
 import Utility.Metered
-#ifdef mingw32_HOST_OS
-import Utility.LockFile
-#endif
+import Utility.LockPool
 
 import Control.Concurrent
 
-upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool
-upload u key f d a _witness = runTransfer (Transfer Upload u key) f d a
+type TransferAction = MeterUpdate -> Annex Bool
 
-download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool
-download u key f d a _witness = runTransfer (Transfer Download u key) f d a
+type TransferObserver = Bool -> Transfer -> TransferInfo -> Annex ()
 
+noObserver :: TransferObserver
+noObserver _ _ _ = noop
+
+upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> TransferAction -> NotifyWitness -> Annex Bool
+upload u key f d o a _witness = runTransfer (Transfer Upload u key) f d o a
+
+download :: UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> TransferAction -> NotifyWitness -> Annex Bool
+download u key f d o a _witness = runTransfer (Transfer Download u key) f d o a
+
 {- Runs a transfer action. Creates and locks the lock file while the
  - action is running, and stores info in the transfer information
  - file.
@@ -46,7 +52,7 @@
  - An upload can be run from a read-only filesystem, and in this case
  - no transfer information or lock file is used.
  -}
-runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
+runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool
 runTransfer = runTransfer' False
 
 {- Like runTransfer, but ignores any existing transfer lock file for the
@@ -54,46 +60,41 @@
  -
  - Note that this may result in confusing progress meter display in the
  - webapp, if multiple processes are writing to the transfer info file. -}
-alwaysRunTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
+alwaysRunTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool
 alwaysRunTransfer = runTransfer' True
 
-runTransfer' :: Bool -> Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool
-runTransfer' ignorelock t file shouldretry a = do
+runTransfer' :: Bool -> Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool
+runTransfer' ignorelock t file shouldretry transferobserver transferaction = do
 	info <- liftIO $ startTransferInfo file
 	(meter, tfile, metervar) <- mkProgressUpdater t info
 	mode <- annexFileMode
-	(fd, inprogress) <- liftIO $ prep tfile mode info
+	(lck, inprogress) <- liftIO $ prep tfile mode info
 	if inprogress && not ignorelock
 		then do
-			showNote "transfer already in progress"
+			showNote "transfer already in progress, or unable to take transfer lock"
 			return False
 		else do
-			ok <- retry info metervar $
-				bracketIO (return fd) (cleanup tfile) (const $ a meter)
-			unless ok $ recordFailedTransfer t info
+			ok <- retry info metervar $ transferaction meter
+			liftIO $ cleanup tfile lck
+			transferobserver ok t info
 			return ok
   where
 #ifndef mingw32_HOST_OS
 	prep tfile mode info = do
-		mfd <- catchMaybeIO $
-			openFd (transferLockFile tfile) ReadWrite (Just mode)
-				defaultFileFlags { trunc = True }
-		case mfd of
-			Nothing -> return (Nothing, False)
-			Just fd -> do
-				setFdOption fd CloseOnExec True
-				locked <- catchMaybeIO $
-					setLock fd (WriteLock, AbsoluteSeek, 0, 0)
-				if isNothing locked
-					then do
-						closeFd fd
-						return (Nothing, True)
-					else do
-						void $ tryIO $ writeTransferInfoFile info tfile
-						return (mfd, False)
+		let lck = transferLockFile tfile
+		r <- tryLockExclusive (Just mode) lck
+		case r of
+			Nothing -> return (Nothing, True)
+			Just lockhandle -> ifM (checkSaneLock lck lockhandle)
+				( do
+					void $ tryIO $ writeTransferInfoFile info tfile
+					return (Just lockhandle, False)
+				, return (Nothing, True)
+				)
 #else
 	prep tfile _mode info = do
-		v <- catchMaybeIO $ lockExclusive (transferLockFile tfile)
+		let lck = transferLockFile tfile
+		v <- catchMaybeIO $ lockExclusive lck
 		case v of
 			Nothing -> return (Nothing, False)
 			Just Nothing -> return (Nothing, True)
@@ -103,10 +104,11 @@
 #endif
 	cleanup _ Nothing = noop
 	cleanup tfile (Just lockhandle) = do
+		let lck = transferLockFile tfile
 		void $ tryIO $ removeFile tfile
 #ifndef mingw32_HOST_OS
-		void $ tryIO $ removeFile $ transferLockFile tfile
-		closeFd lockhandle
+		void $ tryIO $ removeFile lck
+		dropLock lockhandle
 #else
 		{- Windows cannot delete the lockfile until the lock
 		 - is closed. So it's possible to race with another
@@ -114,7 +116,7 @@
 		 - so ignore failure to remove.
 		 -}
 		dropLock lockhandle
-		void $ tryIO $ removeFile $ transferLockFile tfile
+		void $ tryIO $ removeFile lck
 #endif
 	retry oldinfo metervar run = do
 		v <- tryNonAsync run
diff --git a/Assistant/WebApp/DashBoard.hs b/Assistant/WebApp/DashBoard.hs
--- a/Assistant/WebApp/DashBoard.hs
+++ b/Assistant/WebApp/DashBoard.hs
@@ -132,8 +132,9 @@
 #endif
 	ifM (liftIO $ inPath cmd)
 		( do
-			let run = void $ liftIO $ forkIO $ void $
-				createProcess p
+			let run = void $ liftIO $ forkIO $ do
+				(Nothing, Nothing, Nothing, pid) <- createProcess p
+				void $ waitForProcess pid
 			run
 #ifdef mingw32_HOST_OS
 			{- On windows, if the file browser is not
diff --git a/Build/mdwn2man b/Build/mdwn2man
--- a/Build/mdwn2man
+++ b/Build/mdwn2man
@@ -43,5 +43,16 @@
 		$_=".IP\n";
 	}
 
+	if ($inNAME) {
+		# make lexgrog happy
+		s/^git-annex /git-annex-/;
+	}
+	if ($_ eq ".SH NAME\n") {
+		$inNAME=1;
+	}
+	else {
+		$inNAME=0;
+	}
+
 	print $_;
 }
diff --git a/BuildFlags.hs b/BuildFlags.hs
--- a/BuildFlags.hs
+++ b/BuildFlags.hs
@@ -84,7 +84,7 @@
 #ifdef WITH_TORRENTPARSER
 	, "TorrentParser"
 #else
-#warning Building without haskell torrent library; will instead use btshowmetainfo to parse torrent files.
+
 #endif
 #ifdef WITH_EKG
 	, "EKG"
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,36 @@
+git-annex (5.20150522) unstable; urgency=medium
+
+  * import: Refuse to import files that are within the work tree, as that
+    does not make sense and could cause data loss.
+  * drop: Now supports --all, --unused, and --key.
+  * drop: Now defaults to --all when run in a bare repository.
+    (Previously, did nothing when run in a bare repository.)
+  * get, move, copy, mirror: Concurrent transfers are now supported!
+    For example: git-annex get -J10
+    However, progress bars are not yet displayed for concurrent transfers,
+    pending an updated version of the ascii-progress library.
+  * --quiet now makes progress output by rsync, wget, etc be quiet too.
+  * Take space that will be used by other running downloads into account when
+    checking annex.diskreserve.
+  * Avoid accumulating transfer failure log files unless the assistant is
+    being used.
+  * Fix an unlikely race that could result in two transfers of the same key
+    running at once.
+  * Stale transfer lock and info files will be cleaned up automatically
+    when get/unused/info commands are run.
+  * unused: Add --used-refspec option and annex.used-refspec, which can
+    specify a set of refs to consider used, rather than the default of
+    considering all refs used.
+  * webapp: Fix zombie xdg-open process left when opening file browser.
+    Closes: #785498
+  * Safer posix fctnl locking implementation, using lock pools and STM.
+  * Build documentation with TZ=UTC for reproducible builds. See #785736.
+  * OSX: Corrected the location of trustedkeys.gpg, so the built-in
+    upgrade code will find it. Fixes OSX upgrade going forward, but
+    older versions won't upgrade themselves due to this problem.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 22 May 2015 14:20:18 -0400
+
 git-annex (5.20150508.1) unstable; urgency=medium
 
   * Now builds cleanly using ghc 7.10 (as well as ghc back to 7.6).
diff --git a/COPYRIGHT b/COPYRIGHT
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -104,7 +104,7 @@
 
 Files: static/*/bootstrap* static/*/glyphicons-halflings*
 Copyright: 2012-2014 Twitter, Inc.
-License: MIT
+License: MIT-twitter
   Copyright (c) 2011-2014 Twitter, Inc
   .
   Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/CmdLine/Action.hs b/CmdLine/Action.hs
--- a/CmdLine/Action.hs
+++ b/CmdLine/Action.hs
@@ -1,6 +1,6 @@
 {- git-annex command-line actions
  -
- - Copyright 2010-2014 Joey Hess <id@joeyh.name>
+ - Copyright 2010-2015 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -9,10 +9,15 @@
 
 import Common.Annex
 import qualified Annex
+import Annex.Concurrent
 import Types.Command
 import qualified Annex.Queue
+import Messages.Internal
+import Types.Messages
 
-type CommandActionRunner = CommandStart -> CommandCleanup
+import Control.Concurrent.Async
+import Control.Exception (throwIO)
+import Data.Either
 
 {- Runs a command, starting with the check stage, and then
  - the seek stage. Finishes by running the continutation, and 
@@ -22,6 +27,7 @@
 	mapM_ runCheck c
 	Annex.changeState $ \s -> s { Annex.errcounter = 0 }
 	seek params
+	finishCommandActions
 	cont
 	showerrcount =<< Annex.getState Annex.errcounter
   where
@@ -33,10 +39,78 @@
  - including by throwing IO errors (but other errors terminate the whole
  - command).
  - 
- - This should only be run in the seek stage. -}
-commandAction :: CommandActionRunner
-commandAction a = account =<< tryIO go
+ - When concurrency is enabled, a thread is forked off to run the action
+ - in the background, as soon as a free slot is available.
+ 
+ - This should only be run in the seek stage.
+ -}
+commandAction :: CommandStart -> Annex ()
+commandAction a = withOutputType go 
   where
+	go (ParallelOutput n) = do
+		ws <- Annex.getState Annex.workers
+		(st, ws') <- if null ws
+			then do
+				st <- dupState
+				return (st, replicate (n-1) (Left st))
+			else do
+				l <- liftIO $ drainTo (n-1) ws
+				findFreeSlot l
+		w <- liftIO $ async $ snd <$> Annex.run st run
+		Annex.changeState $ \s -> s { Annex.workers = Right w:ws' }
+	go _  =	run
+	run = void $ includeCommandAction a
+
+{- Waits for any forked off command actions to finish.
+ -
+ - Merge together the cleanup actions of all the AnnexStates used by
+ - threads, into the current Annex's state, so they'll run at shutdown.
+ -
+ - Also merge together the errcounters of the AnnexStates.
+ -}
+finishCommandActions :: Annex ()
+finishCommandActions = do
+	l <- liftIO . drainTo 0 =<< Annex.getState Annex.workers
+	forM_ (lefts l) mergeState
+
+{- Wait for Asyncs from the list to finish, replacing them with their
+ - final AnnexStates, until the list of remaining Asyncs is not larger
+ - than the specified size, then returns the new list.
+ -
+ - If the action throws an exception, it is propigated, but first
+ - all other actions are waited for, to allow for a clean shutdown.
+ -}
+drainTo
+	:: Int
+	-> [Either Annex.AnnexState (Async Annex.AnnexState)]
+	-> IO [Either Annex.AnnexState (Async Annex.AnnexState)]
+drainTo sz l
+	| null as || sz >= length as = return l
+	| otherwise = do
+		(done, ret) <- waitAnyCatch as
+		let as' = filter (/= done) as
+		case ret of
+			Left e -> do
+				void $ drainTo 0 (map Left sts ++ map Right as')
+				throwIO e
+			Right st -> do
+				drainTo sz $ map Left (st:sts) ++ map Right as'
+  where
+	(sts, as) = partitionEithers l
+
+findFreeSlot :: [Either Annex.AnnexState (Async Annex.AnnexState)] -> Annex (Annex.AnnexState, [Either Annex.AnnexState (Async Annex.AnnexState)])
+findFreeSlot = go []
+  where
+	go c [] = do
+		st <- dupState
+		return (st, c)
+	go c (Left st:rest) = return (st, c ++ rest)
+	go c (v:rest) = go (v:c) rest
+
+{- Like commandAction, but without the concurrency. -}
+includeCommandAction :: CommandStart -> CommandCleanup
+includeCommandAction a = account =<< tryIO go
+  where
 	go = do
 		Annex.Queue.flushWhenFull
 		callCommandAction a
@@ -53,7 +127,7 @@
 {- Runs a single command action through the start, perform and cleanup
  - stages, without catching errors. Useful if one command wants to run
  - part of another command. -}
-callCommandAction :: CommandActionRunner
+callCommandAction :: CommandStart -> CommandCleanup
 callCommandAction = start
   where
 	start   = stage $ maybe skip perform
diff --git a/CmdLine/GitAnnex/Options.hs b/CmdLine/GitAnnex/Options.hs
--- a/CmdLine/GitAnnex/Options.hs
+++ b/CmdLine/GitAnnex/Options.hs
@@ -138,6 +138,14 @@
 jsonOption = Option ['j'] ["json"] (NoArg (Annex.setOutput JSONOutput))
 	"enable JSON output"
 
+jobsOption :: Option
+jobsOption = Option ['J'] ["jobs"] (ReqArg set paramNumber)
+	"enable concurrent jobs"
+  where
+	set s = case readish s of
+		Nothing -> error "Bad --jobs number"
+		Just n -> Annex.setOutput (ParallelOutput n)
+
 timeLimitOption :: Option
 timeLimitOption = Option ['T'] ["time-limit"]
 	(ReqArg Limit.addTimeLimit paramTime)
diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs
--- a/CmdLine/Seek.hs
+++ b/CmdLine/Seek.hs
@@ -84,7 +84,7 @@
 			case v of
 				Nothing -> noop
 				Just k -> whenM (matcher $ MatchingKey k) $
-					void $ commandAction $ a f k
+					commandAction $ a f k
 
 withPathContents :: ((FilePath, FilePath) -> CommandStart) -> CommandSeek
 withPathContents a params = do
diff --git a/CmdLine/Usage.hs b/CmdLine/Usage.hs
--- a/CmdLine/Usage.hs
+++ b/CmdLine/Usage.hs
@@ -95,6 +95,8 @@
 paramFile = "FILE"
 paramRef :: String
 paramRef = "REF"
+paramRefSpec :: String
+paramRefSpec = "REFSPEC"
 paramGroup :: String
 paramGroup = "GROUP"
 paramExpression :: String
diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs
--- a/Command/AddUrl.hs
+++ b/Command/AddUrl.hs
@@ -223,7 +223,7 @@
 				tmp <- fromRepo $ gitAnnexTmpObjectLocation key
 				showOutput
 				ok <- Transfer.notifyTransfer Transfer.Download (Just file) $
-					Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do
+					Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ const $ do
 						liftIO $ createDirectoryIfMissing True (parentDir tmp)
 						downloadUrl [videourl] tmp
 				if ok
@@ -297,7 +297,7 @@
 			)
   where
 	runtransfer tmp =  Transfer.notifyTransfer Transfer.Download (Just file) $
-		Transfer.download u dummykey (Just file) Transfer.forwardRetry $ \p -> do
+		Transfer.download u dummykey (Just file) Transfer.forwardRetry Transfer.noObserver $ \p -> do
 			liftIO $ createDirectoryIfMissing True (parentDir tmp)
 			downloader tmp p
 
diff --git a/Command/Drop.hs b/Command/Drop.hs
--- a/Command/Drop.hs
+++ b/Command/Drop.hs
@@ -27,7 +27,7 @@
 	SectionCommon "indicate content of files not currently wanted"]
 
 dropOptions :: [Option]
-dropOptions = dropFromOption : annexedMatchingOptions ++ [autoOption]
+dropOptions = dropFromOption : annexedMatchingOptions ++ [autoOption] ++ keyOptions
 
 dropFromOption :: Option
 dropFromOption = fieldOption ['f'] "from" paramRemote "drop content from a remote"
@@ -36,23 +36,32 @@
 seek ps = do
 	from <- getOptionField dropFromOption Remote.byNameWithUUID
 	auto <- getOptionFlag autoOption
-	withFilesInGit (whenAnnexed $ start auto from) ps
+	withKeyOptions auto
+		(startKeys auto from)
+		(withFilesInGit $ whenAnnexed $ start auto from)
+		ps
 
 start :: Bool -> Maybe Remote -> FilePath -> Key -> CommandStart
-start auto from file key = checkDropAuto auto from file key $ \numcopies ->
+start auto from file key = start' auto from key (Just file)
+
+start' :: Bool -> Maybe Remote -> Key -> AssociatedFile -> CommandStart
+start' auto from key afile = checkDropAuto auto from afile key $ \numcopies ->
 	stopUnless want $
 		case from of
-			Nothing -> startLocal (Just file) numcopies key Nothing
+			Nothing -> startLocal afile numcopies key Nothing
 			Just remote -> do
 				u <- getUUID
 				if Remote.uuid remote == u
-					then startLocal (Just file) numcopies key Nothing
-					else startRemote (Just file) numcopies key remote
+					then startLocal afile numcopies key Nothing
+					else startRemote afile numcopies key remote
   where
 	want
-		| auto = wantDrop False (Remote.uuid <$> from) (Just key) (Just file)
+		| auto = wantDrop False (Remote.uuid <$> from) (Just key) afile
 		| otherwise = return True
 
+startKeys :: Bool -> Maybe Remote -> Key -> CommandStart
+startKeys auto from key = start' auto from key Nothing
+
 startLocal :: AssociatedFile -> NumCopies -> Key -> Maybe Remote -> CommandStart
 startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ do
 	showStart' "drop" key afile
@@ -154,8 +163,8 @@
 
 {- In auto mode, only runs the action if there are enough
  - copies on other semitrusted repositories. -}
-checkDropAuto :: Bool -> Maybe Remote -> FilePath -> Key -> (NumCopies -> CommandStart) -> CommandStart
-checkDropAuto auto mremote file key a = go =<< getFileNumCopies file
+checkDropAuto :: Bool -> Maybe Remote -> AssociatedFile -> Key -> (NumCopies -> CommandStart) -> CommandStart
+checkDropAuto auto mremote afile key a = go =<< maybe getNumCopies getFileNumCopies afile
   where
 	go numcopies
 		| auto = do
diff --git a/Command/Fsck.hs b/Command/Fsck.hs
--- a/Command/Fsck.hs
+++ b/Command/Fsck.hs
@@ -135,8 +135,8 @@
 		let cleanup = liftIO $ catchIO (removeFile tmp) (const noop)
 		cleanup
 		cleanup `after` a tmp
-	getfile tmp = ifM (checkDiskSpace (Just tmp) key 0)
-		( ifM (Remote.retrieveKeyFileCheap remote key tmp)
+	getfile tmp = ifM (checkDiskSpace (Just tmp) key 0 True)
+		( ifM (Remote.retrieveKeyFileCheap remote key (Just file) tmp)
 			( return (Just True)
 			, ifM (Annex.getState Annex.fast)
 				( return Nothing
diff --git a/Command/Get.hs b/Command/Get.hs
--- a/Command/Get.hs
+++ b/Command/Get.hs
@@ -21,7 +21,7 @@
 	SectionCommon "make content of annexed files available"]
 
 getOptions :: [Option]
-getOptions = fromOption : annexedMatchingOptions ++ keyOptions ++ [autoOption]
+getOptions = fromOption : autoOption : jobsOption : annexedMatchingOptions ++ keyOptions
 
 seek :: CommandSeek
 seek ps = do
@@ -90,6 +90,6 @@
 		| Remote.hasKeyCheap r =
 			either (const False) id <$> Remote.hasKey r key
 		| otherwise = return True
-	docopy r = download (Remote.uuid r) key afile noRetry $ \p -> do
+	docopy r = download (Remote.uuid r) key afile noRetry noObserver $ \p -> do
 		showAction $ "from " ++ Remote.name r
 		Remote.retrieveKeyFile r key afile dest p
diff --git a/Command/Import.hs b/Command/Import.hs
--- a/Command/Import.hs
+++ b/Command/Import.hs
@@ -9,6 +9,7 @@
 
 import Common.Annex
 import Command
+import qualified Git
 import qualified Annex
 import qualified Command.Add
 import Utility.CopyFile
@@ -62,6 +63,10 @@
 seek :: CommandSeek
 seek ps = do
 	mode <- getDuplicateMode
+	repopath <- liftIO . absPath =<< fromRepo Git.repoPath
+	inrepops <- liftIO $ filter (dirContains repopath) <$> mapM absPath ps
+	unless (null inrepops) $ do
+		error $ "cannot import files from inside the working tree (use git annex add instead): " ++ unwords inrepops
 	withPathContents (start mode) ps
 
 start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart
diff --git a/Command/Mirror.hs b/Command/Mirror.hs
--- a/Command/Mirror.hs
+++ b/Command/Mirror.hs
@@ -21,7 +21,7 @@
 	SectionCommon "mirror content of files to/from another repository"]
 
 mirrorOptions :: [Option]
-mirrorOptions = fromToOptions ++ annexedMatchingOptions ++ keyOptions
+mirrorOptions = fromToOptions ++ [jobsOption] ++ annexedMatchingOptions ++ keyOptions
 
 seek :: CommandSeek
 seek ps = do
diff --git a/Command/Move.hs b/Command/Move.hs
--- a/Command/Move.hs
+++ b/Command/Move.hs
@@ -22,7 +22,7 @@
 	SectionCommon "move content of files to/from another repository"]
 
 moveOptions :: [Option]
-moveOptions = fromToOptions ++ keyOptions ++ annexedMatchingOptions
+moveOptions = fromToOptions ++ [jobsOption] ++ keyOptions ++ annexedMatchingOptions
 
 seek :: CommandSeek
 seek ps = do
@@ -95,7 +95,7 @@
 		Right False -> do
 			showAction $ "to " ++ Remote.name dest
 			ok <- notifyTransfer Upload afile $
-				upload (Remote.uuid dest) key afile noRetry $
+				upload (Remote.uuid dest) key afile noRetry noObserver $
 					Remote.storeKey dest key afile
 			if ok
 				then do
@@ -152,7 +152,7 @@
 	)
   where
 	go = notifyTransfer Download afile $ 
-		download (Remote.uuid src) key afile noRetry $ \p -> do
+		download (Remote.uuid src) key afile noRetry noObserver $ \p -> do
 			showAction $ "from " ++ Remote.name src
 			getViaTmp key $ \t -> Remote.retrieveKeyFile src key afile t p
 	dispatch _ False = stop -- failed
diff --git a/Command/SendKey.hs b/Command/SendKey.hs
--- a/Command/SendKey.hs
+++ b/Command/SendKey.hs
@@ -44,7 +44,7 @@
 fieldTransfer direction key a = do
 	afile <- Fields.getField Fields.associatedFile
 	ok <- maybe (a $ const noop)
-		(\u -> runner (Transfer direction (toUUID u) key) afile noRetry a)
+		(\u -> runner (Transfer direction (toUUID u) key) afile noRetry noObserver a)
 		=<< Fields.getField Fields.remoteUUID
 	liftIO $ exitBool ok
   where
diff --git a/Command/Sync.hs b/Command/Sync.hs
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -389,7 +389,7 @@
 	u <- getUUID
 	let locs' = concat [[u | got], putrs, locs]
 
-	-- Using callCommandAction rather than commandAction for drops,
+	-- Using callCommandAction rather than includeCommandAction for drops,
 	-- because a failure to drop does not mean the sync failed.
 	handleDropsFrom locs' rs "unwanted" True k (Just f)
 		Nothing callCommandAction
@@ -403,7 +403,7 @@
 		( return [ get have ]
 		, return []
 		)
-	get have = commandAction $ do
+	get have = includeCommandAction $ do
 		showStart "get" f
 		next $ next $ getViaTmp k $ \dest -> getKeyFile' k (Just f) dest have
 
@@ -415,7 +415,7 @@
 		, return []
 		)
 	put dest = do
-		ok <- commandAction $ do
+		ok <- includeCommandAction $ do
 			showStart "copy" f
 			Command.Move.toStart' dest False (Just f) k
 		return (ok, if ok then Just (Remote.uuid dest) else Nothing)
diff --git a/Command/TestRemote.hs b/Command/TestRemote.hs
--- a/Command/TestRemote.hs
+++ b/Command/TestRemote.hs
@@ -171,7 +171,7 @@
 			Remote.retrieveKeyFile r k Nothing dest nullMeterUpdate
 	, check (== Right False) "retrieveKeyFileCheap" $
 		getViaTmp k $ \dest ->
-			Remote.retrieveKeyFileCheap r k dest
+			Remote.retrieveKeyFileCheap r k Nothing dest
 	]
   where
 	check checkval desc a = testCase desc $ do
diff --git a/Command/TransferKey.hs b/Command/TransferKey.hs
--- a/Command/TransferKey.hs
+++ b/Command/TransferKey.hs
@@ -42,7 +42,7 @@
 
 toPerform :: Remote -> Key -> AssociatedFile -> CommandPerform
 toPerform remote key file = go Upload file $
-	upload (uuid remote) key file forwardRetry $ \p -> do
+	upload (uuid remote) key file forwardRetry noObserver $ \p -> do
 		ok <- Remote.storeKey remote key file p
 		when ok $
 			Remote.logStatus remote key InfoPresent
@@ -50,7 +50,7 @@
 
 fromPerform :: Remote -> Key -> AssociatedFile -> CommandPerform
 fromPerform remote key file = go Upload file $
-	download (uuid remote) key file forwardRetry $ \p ->
+	download (uuid remote) key file forwardRetry noObserver $ \p ->
 		getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p
 
 go :: Direction -> AssociatedFile -> (NotifyWitness -> Annex Bool) -> CommandPerform
diff --git a/Command/TransferKeys.hs b/Command/TransferKeys.hs
--- a/Command/TransferKeys.hs
+++ b/Command/TransferKeys.hs
@@ -36,14 +36,17 @@
   where
 	runner (TransferRequest direction remote key file)
 		| direction == Upload = notifyTransfer direction file $
-			upload (Remote.uuid remote) key file forwardRetry $ \p -> do
+			upload (Remote.uuid remote) key file forwardRetry observer $ \p -> do
 				ok <- Remote.storeKey remote key file p
 				when ok $
 					Remote.logStatus remote key InfoPresent
 				return ok
 		| otherwise = notifyTransfer direction file $
-			download (Remote.uuid remote) key file forwardRetry $ \p ->
+			download (Remote.uuid remote) key file forwardRetry observer $ \p ->
 				getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p
+	
+	observer False t info = recordFailedTransfer t info
+	observer True _ _ = noop
 
 runRequests
 	:: Handle
diff --git a/Command/Unlock.hs b/Command/Unlock.hs
--- a/Command/Unlock.hs
+++ b/Command/Unlock.hs
@@ -43,7 +43,7 @@
 		)
 
 perform :: FilePath -> Key -> CommandPerform
-perform dest key = ifM (checkDiskSpace Nothing key 0)
+perform dest key = ifM (checkDiskSpace Nothing key 0 True)
 	( do
 		src <- calcRepo $ gitAnnexLocation key
 		tmpdest <- fromRepo $ gitAnnexTmpObjectLocation key
diff --git a/Command/Unused.hs b/Command/Unused.hs
--- a/Command/Unused.hs
+++ b/Command/Unused.hs
@@ -31,34 +31,43 @@
 import qualified Annex.Branch
 import Annex.CatFile
 import Types.Key
+import Types.RefSpec
 import Git.FilePath
 import Logs.View (is_branchView)
 import Utility.Bloom
 
 cmd :: [Command]
-cmd = [withOptions [unusedFromOption] $ command "unused" paramNothing seek
-	SectionMaintenance "look for unused file content"]
+cmd = [withOptions [unusedFromOption, refSpecOption] $
+	command "unused" paramNothing seek
+		SectionMaintenance "look for unused file content"]
 
 unusedFromOption :: Option
 unusedFromOption = fieldOption ['f'] "from" paramRemote "remote to check for unused content"
 
+refSpecOption :: Option
+refSpecOption = fieldOption [] "used-refspec" paramRefSpec "refs to consider used (default: all refs)"
+
 seek :: CommandSeek
 seek = withNothing start
 
 {- Finds unused content in the annex. -} 
 start :: CommandStart
 start = do
-	from <- Annex.getField $ optionName unusedFromOption
+	cfgrefspec <- fromMaybe allRefSpec . annexUsedRefSpec
+		<$> Annex.getGitConfig
+	!refspec <- maybe cfgrefspec (either error id . parseRefSpec)
+		<$> Annex.getField (optionName refSpecOption)
+	from <- Annex.getField (optionName unusedFromOption)
 	let (name, action) = case from of
-		Nothing -> (".", checkUnused)
-		Just "." -> (".", checkUnused)
-		Just "here" -> (".", checkUnused)
-		Just n -> (n, checkRemoteUnused n)
+		Nothing -> (".", checkUnused refspec)
+		Just "." -> (".", checkUnused refspec)
+		Just "here" -> (".", checkUnused refspec)
+		Just n -> (n, checkRemoteUnused n refspec)
 	showStart "unused" name
 	next action
 
-checkUnused :: CommandPerform
-checkUnused = chain 0
+checkUnused :: RefSpec -> CommandPerform
+checkUnused refspec = chain 0
 	[ check "" unusedMsg $ findunused =<< Annex.getState Annex.fast
 	, check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir False
 	, check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpObjectDir True
@@ -71,20 +80,20 @@
 		showAction "checking for unused data"
 		-- InAnnex, not InRepository because if a direct mode
 		-- file exists, it is obviously not unused.
-		excludeReferenced =<< getKeysPresent InAnnex
+		excludeReferenced refspec =<< getKeysPresent InAnnex
 	chain _ [] = next $ return True
 	chain v (a:as) = do
 		v' <- a v
 		chain v' as
 
-checkRemoteUnused :: String -> CommandPerform
-checkRemoteUnused name = go =<< fromJust <$> Remote.byNameWithUUID (Just name)
+checkRemoteUnused :: String -> RefSpec -> CommandPerform
+checkRemoteUnused name refspec = go =<< fromJust <$> Remote.byNameWithUUID (Just name)
   where
 	go r = do
 		showAction "checking for unused data"
 		_ <- check "" (remoteUnusedMsg r) (remoteunused r) 0
 		next $ return True
-	remoteunused r = excludeReferenced <=< loggedKeysFor $ Remote.uuid r
+	remoteunused r = excludeReferenced refspec <=< loggedKeysFor $ Remote.uuid r
 
 check :: FilePath -> ([(Int, Key)] -> String) -> Annex [Key] -> Int -> Annex Int
 check file msg a c = do
@@ -145,7 +154,7 @@
  - * Build a bloom filter of all keys referenced by symlinks. This 
  -   is the fastest one to build and will filter out most keys.
  - * If keys remain, build a second bloom filter of keys referenced by
- -   all branches.
+ -   branches maching the RefSpec.
  - * The list is streamed through these bloom filters lazily, so both will
  -   exist at the same time. This means that twice the memory is used,
  -   but they're relatively small, so the added complexity of using a
@@ -157,13 +166,13 @@
  -   Short-circuiting if the first filter filters all the keys handles the
  -   other common case.
  -}
-excludeReferenced :: [Key] -> Annex [Key]
-excludeReferenced ks = runfilter firstlevel ks >>= runfilter secondlevel
+excludeReferenced :: RefSpec -> [Key] -> Annex [Key]
+excludeReferenced refspec ks = runfilter firstlevel ks >>= runfilter secondlevel
   where
 	runfilter _ [] = return [] -- optimisation
 	runfilter a l = bloomFilter show l <$> genBloomFilter show a
 	firstlevel = withKeysReferencedM
-	secondlevel = withKeysReferencedInGit
+	secondlevel = withKeysReferencedInGit refspec
 
 {- Finds items in the first, smaller list, that are not
  - present in the second, larger list.
@@ -258,14 +267,15 @@
 				!v' <- a k f v
 				go v' fs
 
-withKeysReferencedInGit :: (Key -> Annex ()) -> Annex ()
-withKeysReferencedInGit a = do
+withKeysReferencedInGit :: RefSpec -> (Key -> Annex ()) -> Annex ()
+withKeysReferencedInGit refspec a = do
 	current <- inRepo Git.Branch.currentUnsafe
 	shaHead <- maybe (return Nothing) (inRepo . Git.Ref.sha) current
-	showref >>= mapM_ (withKeysReferencedInGitRef a) .
-			relevantrefs (shaHead, current)
+	usedrefs <- applyRefSpec refspec . relevantrefs (shaHead, current)
+		<$> inRepo (Git.Command.pipeReadStrict [Param "show-ref"])
+	forM_ usedrefs $
+		withKeysReferencedInGitRef a
   where
-	showref = inRepo $ Git.Command.pipeReadStrict [Param "show-ref"]
 	relevantrefs headRef = addHead headRef .
 		filter ourbranches .
 		map (separate (== ' ')) .
@@ -293,8 +303,8 @@
 	showAction $ "checking " ++ Git.Ref.describe ref
 	bare <- isBareRepo
 	(ts,clean) <- inRepo $ if bare
-			then DiffTree.diffIndex ref
-			else DiffTree.diffWorkTree ref
+		then DiffTree.diffIndex ref
+		else DiffTree.diffWorkTree ref
 	let lookAtWorkingTree = not bare && ref == Git.Ref.headRef
 	forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a
 	liftIO $ void clean
diff --git a/Database/Fsck.hs b/Database/Fsck.hs
--- a/Database/Fsck.hs
+++ b/Database/Fsck.hs
@@ -74,7 +74,7 @@
 		liftIO $ do
 			void $ tryIO $ removeDirectoryRecursive dbdir
 			rename tmpdbdir dbdir
-	lockFileShared =<< fromRepo (gitAnnexFsckDbLock u)
+	lockFileCached =<< fromRepo (gitAnnexFsckDbLock u)
 	h <- liftIO $ H.openDb db "fscked"
 	return $ FsckHandle h u
 
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -17,7 +17,7 @@
 import Utility.Percentage
 import Utility.QuickCheck
 import Utility.PID
-import Utility.LockFile
+import Utility.LockPool
 import Logs.TimeStamp
 
 import Data.Time.Clock
@@ -123,17 +123,38 @@
 	<*> pure file
 	<*> pure False
 
-{- If a transfer is still running, returns its TransferInfo. -}
+{- If a transfer is still running, returns its TransferInfo.
+ - 
+ - If no transfer is running, attempts to clean up the stale
+ - lock and info files. This can happen if a transfer process was
+ - interrupted.
+ -}
 checkTransfer :: Transfer -> Annex (Maybe TransferInfo)
 checkTransfer t = do
 	tfile <- fromRepo $ transferFile t
+	let cleanstale = do
+		void $ tryIO $ removeFile tfile
+		void $ tryIO $ removeFile $ transferLockFile tfile
 #ifndef mingw32_HOST_OS
 	liftIO $ do
-		v <- getLockStatus (transferLockFile tfile)
+		let lck = transferLockFile tfile
+		v <- getLockStatus lck
 		case v of
-			Just (pid, _) -> catchDefaultIO Nothing $
+			StatusLockedBy pid -> catchDefaultIO Nothing $
 				readTransferInfoFile (Just pid) tfile
-			Nothing -> return Nothing
+			StatusNoLockFile -> return Nothing
+			StatusUnLocked -> do
+				-- Take a non-blocking lock while deleting
+				-- the stale lock file. Ignore failure
+				-- due to permissions problems, races, etc.
+				void $ tryIO $ do
+					r <- tryLockExclusive Nothing lck
+					case r of
+						Just lockhandle -> do
+							cleanstale
+							dropLock lockhandle
+						_ -> noop
+				return Nothing
 #else
 	v <- liftIO $ lockShared $ transferLockFile tfile
 	liftIO $ case v of
@@ -141,21 +162,37 @@
 			readTransferInfoFile Nothing tfile
 		Just lockhandle -> do
 			dropLock lockhandle
-			void $ tryIO $ removeFile $ transferLockFile tfile
+			cleanstale
 			return Nothing
 #endif
 
 {- Gets all currently running transfers. -}
 getTransfers :: Annex [(Transfer, TransferInfo)]
-getTransfers = do
-	transfers <- mapMaybe parseTransferFile . concat <$> findfiles
+getTransfers = getTransfers' [Download, Upload] (const True)
+
+getTransfers' :: [Direction] -> (Key -> Bool) -> Annex [(Transfer, TransferInfo)]
+getTransfers' dirs wanted = do
+	transfers <- filter (wanted . transferKey)
+		<$> mapMaybe parseTransferFile . concat <$> findfiles
 	infos <- mapM checkTransfer transfers
 	return $ map (\(t, Just i) -> (t, i)) $
 		filter running $ zip transfers infos
   where
 	findfiles = liftIO . mapM dirContentsRecursive
-		=<< mapM (fromRepo . transferDir) [Download, Upload]
+		=<< mapM (fromRepo . transferDir) dirs
 	running (_, i) = isJust i
+
+{- Number of bytes remaining to download from matching downloads that are in
+ - progress. -}
+sizeOfDownloadsInProgress :: (Key -> Bool) -> Annex Integer
+sizeOfDownloadsInProgress wanted = sum . map remaining
+	<$> getTransfers' [Download] wanted
+  where
+	remaining (t, info) =
+		case (keySize (transferKey t), bytesComplete info) of
+			(Just sz, Just done) -> sz - done
+			(Just sz, Nothing) -> sz
+			(Nothing, _) -> 0
 
 {- Gets failed transfers for a given remote UUID. -}
 getFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)]
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -73,7 +73,7 @@
 	mkdir -p man
 
 docs: mans
-	$(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \
+	TZ=UTC $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \
 		--no-usedirs --disable-plugin=openid --plugin=sidebar \
 		--underlaydir=/dev/null --disable-plugin=shortcut \
 		--disable-plugin=smiley \
@@ -174,7 +174,7 @@
 	ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell"
 	gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE
 	cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt
-	cp standalone/trustedkeys.gpg $(OSXAPP_BASE)
+	cp standalone/trustedkeys.gpg $(OSXAPP_DEST)/Contents/MacOS
 
 	./Build/Standalone $(OSXAPP_BASE)
 
@@ -207,7 +207,7 @@
 # and not overwritten.)
 	cp -uR tmp/splices/* tmp/no-th-tree || true
 # Some additional dependencies needed by the expanded splices.
-	sed -i 's/^  Build-Depends: /  Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/no-th-tree/git-annex.cabal
+	sed -i 's/^  Build-Depends: */  Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/no-th-tree/git-annex.cabal
 # Avoid warnings due to sometimes unused imports added for the splices.
 	sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/no-th-tree/git-annex.cabal
 	sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/no-th-tree/git-annex.cabal
@@ -237,7 +237,7 @@
 # and not overwritten.)
 	cp -uR tmp/splices/* tmp/androidtree || true
 # Some additional dependencies needed by the expanded splices.
-	sed -i 's/^  Build-Depends: /  Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/androidtree/git-annex.cabal
+	sed -i 's/^  Build-Depends: */  Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/androidtree/git-annex.cabal
 # Avoid warnings due to sometimes unused imports added for the splices.
 	sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal
 	sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/androidtree/git-annex.cabal
@@ -269,7 +269,7 @@
 	@$(MAKE) tags >/dev/null 2>&1 &
 
 dist/caballog: git-annex.cabal
-	$(CABAL) configure -f"-Production" -O0
+	$(CABAL) configure -f"-Production" -O0 --enable-executable-dynamic
 	$(CABAL) build -v2 | tee $@
 
 # Hardcoded command line to make hdevtools start up and work.
diff --git a/Messages.hs b/Messages.hs
--- a/Messages.hs
+++ b/Messages.hs
@@ -19,6 +19,7 @@
 	showEndOk,
 	showEndFail,
 	showEndResult,
+	endResult,
 	toplevelWarning,
 	warning,
 	warningIO,
@@ -111,12 +112,12 @@
 showEndFail = showEndResult False
 
 showEndResult :: Bool -> Annex ()
-showEndResult ok = handleMessage (JSON.end ok) $ putStrLn msg
-  where
-	msg
-		| ok = "ok"
-		| otherwise = "failed"
+showEndResult ok = handleMessage (JSON.end ok) $ putStrLn $ endResult ok
 
+endResult :: Bool -> String
+endResult True = "ok"
+endResult False = "failed"
+
 toplevelWarning :: Bool -> String -> Annex ()
 toplevelWarning makeway s = warning' makeway ("git-annex: " ++ s)
 
@@ -191,6 +192,6 @@
 commandProgressDisabled :: Annex Bool
 commandProgressDisabled = withOutputType $ \t -> return $ case t of
 	QuietOutput -> True
-	ProgressOutput -> True
+	ParallelOutput _ -> True
 	JSONOutput -> True
 	NormalOutput -> False
diff --git a/Messages/Internal.hs b/Messages/Internal.hs
--- a/Messages/Internal.hs
+++ b/Messages/Internal.hs
@@ -17,7 +17,7 @@
   where
 	go NormalOutput = liftIO normal
 	go QuietOutput = q
-	go ProgressOutput = q
+	go (ParallelOutput _) = q
 	go JSONOutput = liftIO $ flushed json
 
 q :: Monad m => m ()
diff --git a/Messages/Progress.hs b/Messages/Progress.hs
--- a/Messages/Progress.hs
+++ b/Messages/Progress.hs
@@ -5,6 +5,8 @@
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
+{-# LANGUAGE CPP #-}
+
 module Messages.Progress where
 
 import Common
@@ -15,35 +17,98 @@
 import Types.Messages
 import Types.Key
 
+#ifdef WITH_ASCIIPROGRESS
+import System.Console.AsciiProgress
+import qualified System.Console.Terminal.Size as Terminal
+import Control.Concurrent
+#else
 import Data.Progress.Meter
 import Data.Progress.Tracker
 import Data.Quantity
+#endif
 
 {- Shows a progress meter while performing a transfer of a key.
  - The action is passed a callback to use to update the meter. -}
-metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a
-metered combinemeterupdate key a = go (keySize key)
+metered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a
+metered combinemeterupdate key af a = case keySize key of
+	Nothing -> nometer
+	Just size -> withOutputType (go $ fromInteger size)
   where
-	go (Just size) = meteredBytes combinemeterupdate size a
-	go _ = a (const noop)
+	go _ QuietOutput = nometer
+	go _ JSONOutput = nometer
+#ifdef WITH_ASCIIPROGRESS
+	go size _ = do
+		showOutput
+		liftIO $ putStrLn ""
 
-{- Shows a progress meter while performing an action on a given number
- - of bytes. -}
-meteredBytes :: Maybe MeterUpdate -> Integer -> (MeterUpdate -> Annex a) -> Annex a
-meteredBytes combinemeterupdate size a = withOutputType go
-  where
-	go NormalOutput = do
+		cols <- liftIO $ maybe 79 Terminal.width <$> Terminal.size
+		let desc = truncatepretty cols $ fromMaybe (key2file key) af
+
+		result <- liftIO newEmptyMVar
+		pg <- liftIO $ newProgressBar def
+			{ pgWidth = cols
+			, pgFormat = desc ++ " :percent :bar ETA :eta"
+			, pgTotal = size
+			, pgOnCompletion = do
+				ok <- takeMVar result
+				putStrLn $ desc ++ " " ++ endResult ok
+			}
+		r <- a $ liftIO . pupdate pg
+
+		liftIO $ do
+			-- See if the progress bar is complete or not.
+			sofar <- stCompleted <$> getProgressStats pg
+			putMVar result (sofar >= size)
+			-- May not be actually complete if the action failed,
+			-- but this just clears the progress bar.
+			complete pg
+
+		return r
+#else
+	-- Old progress bar code, not suitable for parallel output.
+	go _ (ParallelOutput _) = do
+		r <- nometer
+		liftIO $ putStrLn $ fromMaybe (key2file key) af
+		return r
+	go size NormalOutput = do
+		showOutput
 		progress <- liftIO $ newProgress "" size
 		meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1)
-		showOutput
-		r <- a $ \n -> liftIO $ do
-			setP progress $ fromBytesProcessed n
-			displayMeter stdout meter
-			maybe noop (\m -> m n) combinemeterupdate
+		r <- a $ liftIO . pupdate meter progress
 		liftIO $ clearMeter stdout meter
 		return r
-	go _ = a (const noop)
+#endif
 
+#ifdef WITH_ASCIIPROGRESS
+	pupdate pg n = do
+		let i = fromBytesProcessed n
+		sofar <- stCompleted <$> getProgressStats pg
+		when (i > sofar) $
+			tickN pg (i - sofar)
+		threadDelay 100
+#else
+	pupdate meter progress n = do
+		setP progress $ fromBytesProcessed n
+		displayMeter stdout meter
+#endif
+		maybe noop (\m -> m n) combinemeterupdate
+
+	nometer = a (const noop)
+
+#ifdef WITH_ASCIIPROGRESS
+	truncatepretty n s
+		| length s > n = take (n-2) s ++ ".."
+		| otherwise = s
+#endif
+
+{- Use when the progress meter is only desired for parallel
+ - mode; as when a command's own progress output is preferred. -}
+parallelMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a
+parallelMetered combinemeterupdate key af a = withOutputType go
+  where
+	go (ParallelOutput _) = metered combinemeterupdate key af a
+	go _ = a (fromMaybe (const noop) combinemeterupdate)
+
 {- Progress dots. -}
 showProgressDots :: Annex ()
 showProgressDots = handleMessage q $
@@ -84,5 +149,5 @@
 mkStderrEmitter :: Annex (String -> IO ())
 mkStderrEmitter = withOutputType go
   where
-	go ProgressOutput = return $ \s -> hPutStrLn stderr ("E: " ++ s)
+	go (ParallelOutput _) = return $ \s -> hPutStrLn stderr ("E: " ++ s)
 	go _ = return (hPutStrLn stderr)
diff --git a/Remote/BitTorrent.hs b/Remote/BitTorrent.hs
--- a/Remote/BitTorrent.hs
+++ b/Remote/BitTorrent.hs
@@ -93,8 +93,8 @@
 				, return False
 				)
 
-downloadKeyCheap :: Key -> FilePath -> Annex Bool
-downloadKeyCheap _ _ = return False
+downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
+downloadKeyCheap _ _ _ = return False
 
 uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool
 uploadKey _ _ _ = do
diff --git a/Remote/Bup.hs b/Remote/Bup.hs
--- a/Remote/Bup.hs
+++ b/Remote/Bup.hs
@@ -148,8 +148,8 @@
 	liftIO (hClose h >> forceSuccessProcess p pid)
 		`after` (sink =<< liftIO (L.hGetContents h))
 
-retrieveCheap :: BupRepo -> Key -> FilePath -> Annex Bool
-retrieveCheap _ _ _ = return False
+retrieveCheap :: BupRepo -> Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ _ = return False
 
 {- Cannot revert having stored a key in bup, but at least the data for the
  - key will be used for deltaing data of other keys stored later.
diff --git a/Remote/Ddar.hs b/Remote/Ddar.hs
--- a/Remote/Ddar.hs
+++ b/Remote/Ddar.hs
@@ -142,8 +142,8 @@
 	liftIO (hClose h >> forceSuccessProcess p pid)
 		`after` (sink =<< liftIO (L.hGetContents h))
 
-retrieveCheap :: Key -> FilePath -> Annex Bool
-retrieveCheap _ _ = return False
+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ = return False
 
 remove :: DdarRepo -> Remover
 remove ddarrepo key = do
diff --git a/Remote/Directory.hs b/Remote/Directory.hs
--- a/Remote/Directory.hs
+++ b/Remote/Directory.hs
@@ -118,9 +118,16 @@
 {- Check if there is enough free disk space in the remote's directory to
  - store the key. Note that the unencrypted key size is checked. -}
 prepareStore :: FilePath -> ChunkConfig -> Preparer Storer
-prepareStore d chunkconfig = checkPrepare
-	(\k -> checkDiskSpace (Just d) k 0)
+prepareStore d chunkconfig = checkPrepare checker
 	(byteStorer $ store d chunkconfig)
+  where
+	checker k = do
+		annexdir <- fromRepo gitAnnexObjectDir
+		samefilesystem <- liftIO $ catchDefaultIO False $ 
+			(\a b -> deviceID a == deviceID b)
+				<$> getFileStatus d
+				<*> getFileStatus annexdir
+		checkDiskSpace (Just d) k 0 samefilesystem
 
 store :: FilePath -> ChunkConfig -> Key -> L.ByteString -> MeterUpdate -> Annex Bool
 store d chunkconfig k b p = liftIO $ do
@@ -156,12 +163,12 @@
 retrieve d _ = simplyPrepare $ byteRetriever $ \k sink ->
 	sink =<< liftIO (L.readFile =<< getLocation d k)
 
-retrieveCheap :: FilePath -> ChunkConfig -> Key -> FilePath -> Annex Bool
+retrieveCheap :: FilePath -> ChunkConfig -> Key -> AssociatedFile -> FilePath -> Annex Bool
 -- no cheap retrieval possible for chunks
-retrieveCheap _ (UnpaddedChunks _) _ _ = return False
-retrieveCheap _ (LegacyChunks _) _ _ = return False
+retrieveCheap _ (UnpaddedChunks _) _ _ _ = return False
+retrieveCheap _ (LegacyChunks _) _ _ _ = return False
 #ifndef mingw32_HOST_OS
-retrieveCheap d NoChunks k f = liftIO $ catchBoolIO $ do
+retrieveCheap d NoChunks k _af f = liftIO $ catchBoolIO $ do
 	file <- absPath =<< getLocation d k
 	ifM (doesFileExist file)
 		( do
@@ -170,7 +177,7 @@
 		, return False
 		)
 #else
-retrieveCheap _ _ _ _ = return False
+retrieveCheap _ _ _ _ _ = return False
 #endif
 
 remove :: FilePath -> Remover
diff --git a/Remote/External.hs b/Remote/External.hs
--- a/Remote/External.hs
+++ b/Remote/External.hs
@@ -56,7 +56,7 @@
 			, name = Git.repoDescribe r
 			, storeKey = storeKeyDummy
 			, retrieveKeyFile = retreiveKeyFileDummy
-			, retrieveKeyFileCheap = \_ _ -> return False
+			, retrieveKeyFileCheap = \_ _ _ -> return False
 			, removeKey = removeKeyDummy
 			, checkPresent = checkPresentDummy
 			, checkPresentCheap = False
diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs
--- a/Remote/GCrypt.hs
+++ b/Remote/GCrypt.hs
@@ -108,7 +108,7 @@
 		, name = Git.repoDescribe r
 		, storeKey = storeKeyDummy
 		, retrieveKeyFile = retreiveKeyFileDummy
-		, retrieveKeyFileCheap = \_ _ -> return False
+		, retrieveKeyFileCheap = \_ _ _ -> return False
 		, removeKey = removeKeyDummy
 		, checkPresent = checkPresentDummy
 		, checkPresentCheap = repoCheap r
diff --git a/Remote/Git.hs b/Remote/Git.hs
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -52,6 +52,7 @@
 import Annex.Path
 import Creds
 import Annex.CatFile
+import Messages.Progress
 
 import Control.Concurrent
 import Control.Concurrent.MSampleVar
@@ -355,9 +356,11 @@
 
 {- Tries to copy a key's content from a remote's annex to a file. -}
 copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool
-copyFromRemote r key file dest _p = copyFromRemote' r key file dest
-copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool
-copyFromRemote' r key file dest
+copyFromRemote r key file dest p = parallelMetered (Just p) key file $
+	copyFromRemote' r key file dest
+
+copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool
+copyFromRemote' r key file dest meterupdate
 	| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ do
 		params <- Ssh.rsyncParams r Download
 		u <- getUUID
@@ -383,7 +386,7 @@
 					let go = copier
 #endif
 					runTransfer (Transfer Download u key)
-						file noRetry go
+						file noRetry noObserver go
 						<&&> checksuccess
 	| Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do
 		direct <- isDirect
@@ -435,7 +438,9 @@
 			send bytes
 			forever $
 				send =<< readSV v
-		let feeder = writeSV v . fromBytesProcessed
+		let feeder = \n -> do
+			meterupdate n
+			writeSV v (fromBytesProcessed n)
 		let cleanup = do
 			void $ tryIO $ killThread tid
 			tryNonAsync $
@@ -443,9 +448,9 @@
 					=<< tryTakeMVar pidv
 		bracketIO noop (const cleanup) (const $ a feeder)
 
-copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool
+copyFromRemoteCheap :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool
 #ifndef mingw32_HOST_OS
-copyFromRemoteCheap r key file
+copyFromRemoteCheap r key af file
 	| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ liftIO $ do
 		loc <- gitAnnexLocation key (repo r) $
 			fromJust $ remoteGitConfig $ gitconfig r
@@ -459,17 +464,21 @@
 			)
 	| Git.repoIsSsh (repo r) =
 		ifM (Annex.Content.preseedTmp key file)
-			( copyFromRemote' r key Nothing file
+			( parallelMetered Nothing key af $
+				copyFromRemote' r key af file
 			, return False
 			)
 	| otherwise = return False
 #else
-copyFromRemoteCheap _ _ _ = return False
+copyFromRemoteCheap _ _ _ _ = return False
 #endif
 
 {- Tries to copy a key's content to a remote's annex. -}
 copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
-copyToRemote r key file p
+copyToRemote r key file p = parallelMetered (Just p) key file $ copyToRemote' r key file
+
+copyToRemote' :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
+copyToRemote' r key file p
 	| not $ Git.repoIsUrl (repo r) =
 		guardUsable (repo r) (return False) $ commitOnCleanup r $
 			copylocal =<< Annex.Content.prepSendAnnex key
@@ -493,7 +502,7 @@
 			( return True
 			, do
 				ensureInitialized
-				runTransfer (Transfer Download u key) file noRetry $ const $
+				runTransfer (Transfer Download u key) file noRetry noObserver $ const $
 					Annex.Content.saveState True `after`
 						Annex.Content.getViaTmpChecked (liftIO checksuccessio) key
 							(\d -> rsyncOrCopyFile params object d p)
diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs
--- a/Remote/Glacier.hs
+++ b/Remote/Glacier.hs
@@ -162,8 +162,8 @@
 			showLongNote "Recommend you wait up to 4 hours, and then run this command again."
 		return ok
 
-retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool
-retrieveCheap _ _ _ = return False
+retrieveCheap :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ _ = return False
 
 remove :: Remote -> Remover
 remove r k = glacierAction r
diff --git a/Remote/Helper/Hooks.hs b/Remote/Helper/Hooks.hs
--- a/Remote/Helper/Hooks.hs
+++ b/Remote/Helper/Hooks.hs
@@ -16,7 +16,7 @@
 import Types.CleanupActions
 import qualified Annex
 import Annex.LockFile
-import Utility.LockFile
+import Utility.LockPool
 #ifndef mingw32_HOST_OS
 import Annex.Perms
 #endif
@@ -36,7 +36,7 @@
 	r' = r
 		{ storeKey = \k f p -> wrapper $ storeKey r k f p
 		, retrieveKeyFile = \k f d p -> wrapper $ retrieveKeyFile r k f d p
-		, retrieveKeyFileCheap = \k f -> wrapper $ retrieveKeyFileCheap r k f
+		, retrieveKeyFileCheap = \k af f -> wrapper $ retrieveKeyFileCheap r k af f
 		, removeKey = wrapper . removeKey r
 		, checkPresent = wrapper . checkPresent r
 		}
@@ -47,7 +47,7 @@
 runHooks r starthook stophook a = do
 	dir <- fromRepo gitAnnexRemotesDir
 	let lck = dir </> remoteid ++ ".lck"
-	whenM (notElem lck . M.keys <$> getLockPool) $ do
+	whenM (notElem lck . M.keys <$> getLockCache) $ do
 		liftIO $ createDirectoryIfMissing True dir
 		firstrun lck
 	a
@@ -62,7 +62,7 @@
 		-- of it from running the stophook. If another
 		-- instance is shutting down right now, this
 		-- will block waiting for its exclusive lock to clear.
-		lockFileShared lck
+		lockFileCached lck
 
 		-- The starthook is run even if some other git-annex
 		-- is already running, and ran it before.
diff --git a/Remote/Helper/Special.hs b/Remote/Helper/Special.hs
--- a/Remote/Helper/Special.hs
+++ b/Remote/Helper/Special.hs
@@ -157,10 +157,10 @@
 specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckpresent baser = encr
   where
 	encr = baser
-		{ storeKey = \k _f p -> cip >>= storeKeyGen k p
-		, retrieveKeyFile = \k _f d p -> cip >>= retrieveKeyFileGen k d p
-		, retrieveKeyFileCheap = \k d -> cip >>= maybe
-			(retrieveKeyFileCheap baser k d)
+		{ storeKey = \k f p -> cip >>= storeKeyGen k f p
+		, retrieveKeyFile = \k f d p -> cip >>= retrieveKeyFileGen k f d p
+		, retrieveKeyFileCheap = \k f d -> cip >>= maybe
+			(retrieveKeyFileCheap baser k f d)
 			-- retrieval of encrypted keys is never cheap
 			(\_ -> return False)
 		, removeKey = \k -> cip >>= removeKeyGen k
@@ -182,10 +182,10 @@
 	safely a = catchNonAsync a (\e -> warning (show e) >> return False)
 
 	-- chunk, then encrypt, then feed to the storer
-	storeKeyGen k p enc = safely $ preparestorer k $ safely . go
+	storeKeyGen k f p enc = safely $ preparestorer k $ safely . go
 	  where
 		go (Just storer) = sendAnnex k rollback $ \src ->
-			displayprogress p k $ \p' ->
+			displayprogress p k f $ \p' ->
 				storeChunks (uuid baser) chunkconfig k src p'
 					(storechunk enc storer)
 					(checkPresent baser)
@@ -200,10 +200,10 @@
 					storer (enck k) (ByteContent encb) p
 
 	-- call retriever to get chunks; decrypt them; stream to dest file
-	retrieveKeyFileGen k dest p enc =
+	retrieveKeyFileGen k f dest p enc =
 		safely $ prepareretriever k $ safely . go
 	  where
-		go (Just retriever) = displayprogress p k $ \p' ->
+		go (Just retriever) = displayprogress p k f $ \p' ->
 			retrieveChunks retriever (uuid baser) chunkconfig
 				enck k dest p' (sink dest enc)
 		go Nothing = return False
@@ -223,8 +223,8 @@
 
 	chunkconfig = chunkConfig cfg
 
-	displayprogress p k a
-		| displayProgress cfg = metered (Just p) k a
+	displayprogress p k f a
+		| displayProgress cfg = metered (Just p) k f a
 		| otherwise = a p
 
 {- Sink callback for retrieveChunks. Stores the file content into the
diff --git a/Remote/Hook.hs b/Remote/Hook.hs
--- a/Remote/Hook.hs
+++ b/Remote/Hook.hs
@@ -130,8 +130,8 @@
 	unlessM (runHook h "retrieve" k (Just d) $ return True) $
 		error "failed to retrieve content"
 
-retrieveCheap :: HookName -> Key -> FilePath -> Annex Bool
-retrieveCheap _ _ _ = return False
+retrieveCheap :: HookName -> Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ _ = return False
 
 remove :: HookName -> Remover
 remove h k = runHook h "remove" k Nothing $ return True
diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs
--- a/Remote/Rsync.hs
+++ b/Remote/Rsync.hs
@@ -191,8 +191,8 @@
 	unlessM (rsyncRetrieve o k f (Just p)) $
 		error "rsync failed"
 
-retrieveCheap :: RsyncOpts -> Key -> FilePath -> Annex Bool
-retrieveCheap o k f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False )
+retrieveCheap :: RsyncOpts -> Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap o k _af f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False )
 
 remove :: RsyncOpts -> Remover
 remove o k = do
diff --git a/Remote/S3.hs b/Remote/S3.hs
--- a/Remote/S3.hs
+++ b/Remote/S3.hs
@@ -238,8 +238,8 @@
 					S.hPut fh bs
 				sinkprogressfile fh meterupdate sofar'
 
-retrieveCheap :: Key -> FilePath -> Annex Bool
-retrieveCheap _ _ = return False
+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ = return False
 
 {- Internet Archive doesn't easily allow removing content.
  - While it may remove the file, there are generally other files
diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs
--- a/Remote/Tahoe.hs
+++ b/Remote/Tahoe.hs
@@ -70,7 +70,7 @@
 		, name = Git.repoDescribe r
 		, storeKey = store u hdl
 		, retrieveKeyFile = retrieve u hdl
-		, retrieveKeyFileCheap = \_ _ -> return False
+		, retrieveKeyFileCheap = \_ _ _ -> return False
 		, removeKey = remove
 		, checkPresent = checkKey u hdl
 		, checkPresentCheap = False
diff --git a/Remote/Web.hs b/Remote/Web.hs
--- a/Remote/Web.hs
+++ b/Remote/Web.hs
@@ -90,8 +90,8 @@
 #endif
 				_ -> downloadUrl [u'] dest
 
-downloadKeyCheap :: Key -> FilePath -> Annex Bool
-downloadKeyCheap _ _ = return False
+downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
+downloadKeyCheap _ _ _ = return False
 
 uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool
 uploadKey _ _ _ = do
diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs
--- a/Remote/WebDAV.hs
+++ b/Remote/WebDAV.hs
@@ -116,8 +116,8 @@
 	maybe noop (void . mkColRecursive) (locationParent dest)
 	moveDAV baseurl tmp dest
 
-retrieveCheap :: Key -> FilePath -> Annex Bool
-retrieveCheap _ _ = return False
+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
+retrieveCheap _ _ _ = return False
 
 retrieve :: ChunkConfig -> Maybe DavHandle -> Retriever
 retrieve _ Nothing = error "unable to connect"
diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs
--- a/Types/GitConfig.hs
+++ b/Types/GitConfig.hs
@@ -16,12 +16,14 @@
 import qualified Git
 import qualified Git.Config
 import qualified Git.Construct
+import Git.SharedRepository
 import Utility.DataUnits
 import Config.Cost
 import Types.Distribution
 import Types.Availability
 import Types.NumCopies
 import Types.Difference
+import Types.RefSpec
 import Utility.HumanTime
 
 {- Main git-annex settings. Each setting corresponds to a git-config key
@@ -57,8 +59,10 @@
 	, annexStartupScan :: Bool
 	, annexHardLink :: Bool
 	, coreSymlinks :: Bool
+	, coreSharedRepository :: SharedRepository
 	, gcryptId :: Maybe String
 	, annexDifferences :: Differences
+	, annexUsedRefSpec :: Maybe RefSpec
 	}
 
 extractGitConfig :: Git.Repo -> GitConfig
@@ -95,8 +99,11 @@
 	, annexStartupScan = getbool (annex "startupscan") True
 	, annexHardLink = getbool (annex "hardlink") False
 	, coreSymlinks = getbool "core.symlinks" True
+	, coreSharedRepository = getSharedRepository r
 	, gcryptId = getmaybe "core.gcrypt-id"
 	, annexDifferences = getDifferences r
+	, annexUsedRefSpec = either (const Nothing) Just . parseRefSpec 
+		=<< getmaybe (annex "used-refspec")
 	}
   where
 	getbool k d = fromMaybe d $ getmaybebool k
diff --git a/Types/LockCache.hs b/Types/LockCache.hs
new file mode 100644
--- /dev/null
+++ b/Types/LockCache.hs
@@ -0,0 +1,16 @@
+{- git-annex lock cache data types
+ - 
+ - Copyright 2014 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Types.LockCache (
+	LockCache,
+	LockHandle
+) where
+
+import qualified Data.Map as M
+import Utility.LockPool
+
+type LockCache = M.Map FilePath LockHandle
diff --git a/Types/LockPool.hs b/Types/LockPool.hs
deleted file mode 100644
--- a/Types/LockPool.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{- git-annex lock pool data types
- - 
- - Copyright 2014 Joey Hess <id@joeyh.name>
- -
- - Licensed under the GNU GPL version 3 or higher.
- -}
-
-module Types.LockPool (
-	LockPool,
-	LockHandle
-) where
-
-import qualified Data.Map as M
-import Utility.LockFile
-
-type LockPool = M.Map FilePath LockHandle
diff --git a/Types/Messages.hs b/Types/Messages.hs
--- a/Types/Messages.hs
+++ b/Types/Messages.hs
@@ -9,7 +9,7 @@
 
 import Data.Default
 
-data OutputType = NormalOutput | QuietOutput | ProgressOutput | JSONOutput
+data OutputType = NormalOutput | QuietOutput | ParallelOutput Int | JSONOutput
 
 data SideActionBlock = NoBlock | StartBlock | InBlock
 	deriving (Eq)
diff --git a/Types/RefSpec.hs b/Types/RefSpec.hs
new file mode 100644
--- /dev/null
+++ b/Types/RefSpec.hs
@@ -0,0 +1,44 @@
+{- This is not the same as git's fetch/push refspecs.
+ - 
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Types.RefSpec where
+
+import Common
+import Utility.Glob
+import Git.Types
+
+import Data.Either
+
+type RefSpec = [RefSpecPart]
+
+data RefSpecPart = AddRef Ref | AddMatching Glob | RemoveMatching Glob
+
+allRefSpec :: RefSpec
+allRefSpec = [AddMatching $ compileGlob "*" CaseSensative]
+
+parseRefSpec :: String -> Either String RefSpec
+parseRefSpec v = case partitionEithers (map mk $ split ":" v) of
+	([],refspec) -> Right refspec
+	(e:_,_) -> Left e
+  where
+	mk ('+':s)
+		| any (`elem` s) "*?" =
+			Right $ AddMatching $ compileGlob s CaseSensative
+		| otherwise = Right $ AddRef $ Ref s
+	mk ('-':s) = Right $ RemoveMatching $ compileGlob s CaseSensative
+	mk s = Left $ "bad refspec item \"" ++ s ++ "\" (expected + or - prefix)"
+
+applyRefSpec :: RefSpec -> [Ref] -> [Ref]
+applyRefSpec refspec rs = go [] refspec
+  where
+	go c [] = reverse c
+	go c (AddRef r : rest) = go (r:c) rest
+	go c (AddMatching g : rest) =
+		let add = filter (matchGlob g . fromRef) rs
+		in go (add ++ c) rest
+	go c (RemoveMatching g : rest) = 
+		go (filter (not . matchGlob g . fromRef) c) rest
diff --git a/Types/Remote.hs b/Types/Remote.hs
--- a/Types/Remote.hs
+++ b/Types/Remote.hs
@@ -68,7 +68,7 @@
 	retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a Bool,
 	-- Retrieves a key's contents to a tmp file, if it can be done cheaply.
 	-- It's ok to create a symlink or hardlink.
-	retrieveKeyFileCheap :: Key -> FilePath -> a Bool,
+	retrieveKeyFileCheap :: Key -> AssociatedFile -> FilePath -> a Bool,
 	-- removes a key's contents (succeeds if the contents are not present)
 	removeKey :: Key -> a Bool,
 	-- Checks if a key is present in the remote.
diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs
--- a/Utility/FileMode.hs
+++ b/Utility/FileMode.hs
@@ -22,15 +22,12 @@
 
 {- Applies a conversion function to a file's mode. -}
 modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()
-modifyFileMode f convert = void $ modifyFileMode' f convert
-modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode
-modifyFileMode' f convert = do
+modifyFileMode f convert = do
 	s <- getFileStatus f
 	let old = fileMode s
 	let new = convert old
 	when (new /= old) $
 		setFileMode f new
-	return old
 
 {- Adds the specified FileModes to the input mode, leaving the rest
  - unchanged. -}
@@ -40,14 +37,6 @@
 {- Removes the specified FileModes from the input mode. -}
 removeModes :: [FileMode] -> FileMode -> FileMode
 removeModes ms m = m `intersectFileModes` complement (combineModes ms)
-
-{- Runs an action after changing a file's mode, then restores the old mode. -}
-withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a
-withModifiedFileMode file convert a = bracket setup cleanup go
-  where
-	setup = modifyFileMode' file convert
-	cleanup oldmode = modifyFileMode file (const oldmode)
-	go _ = a
 
 writeModes :: [FileMode]
 writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode]
diff --git a/Utility/LockFile.hs b/Utility/LockFile.hs
--- a/Utility/LockFile.hs
+++ b/Utility/LockFile.hs
@@ -4,6 +4,9 @@
  - This module does *not* attempt to be a portability shim, it just exposes
  - the native locking of the OS.
  -
+ - Posix fcntl locks have some gotchas. So, consider using
+ - Utility.LockPool instead of using this module directly.
+ -
  - Copyright 2014 Joey Hess <id@joeyh.name>
  -
  - License: BSD-2-clause
diff --git a/Utility/LockFile/Posix.hs b/Utility/LockFile/Posix.hs
--- a/Utility/LockFile/Posix.hs
+++ b/Utility/LockFile/Posix.hs
@@ -10,12 +10,11 @@
 	lockShared,
 	lockExclusive,
 	tryLockExclusive,
-	createLockFile,
-	openExistingLockFile,
-	isLocked,
 	checkLocked,
 	getLockStatus,
+	LockStatus(..),
 	dropLock,
+	checkSaneLock,
 ) where
 
 import Utility.Exception
@@ -56,15 +55,6 @@
 	waitToSetLock l (lockreq, AbsoluteSeek, 0, 0)
 	return (LockHandle l)
 
--- Create and opens lock file; does not lock it.
-createLockFile :: FileMode -> LockFile -> IO Fd
-createLockFile filemode = openLockFile (Just filemode)
-
--- Opens an existing lock file; does not lock it, and if it does not exist,
--- returns Nothing.
-openExistingLockFile :: LockFile -> IO (Maybe Fd)
-openExistingLockFile = catchMaybeIO . openLockFile Nothing
-
 -- Close on exec flag is set so child processes do not inherit the lock.
 openLockFile :: Maybe FileMode -> LockFile -> IO Fd
 openLockFile filemode lockfile = do
@@ -72,28 +62,45 @@
 	setFdOption l CloseOnExec True
 	return l
 
--- Check if a file is locked, either exclusively, or with shared lock.
--- When the file doesn't exist, it's considered not locked.
-isLocked :: LockFile -> IO Bool
-isLocked = fromMaybe False <$$> checkLocked
-
 -- Returns Nothing when the file doesn't exist, for cases where
 -- that is different from it not being locked.
 checkLocked :: LockFile -> IO (Maybe Bool)
 checkLocked = maybe Nothing (Just . isJust) <$$> getLockStatus'
 
-getLockStatus :: LockFile -> IO (Maybe (ProcessID, FileLock))
-getLockStatus = fromMaybe Nothing <$$> getLockStatus'
+data LockStatus = StatusUnLocked | StatusLockedBy ProcessID | StatusNoLockFile
+	deriving (Eq)
 
-getLockStatus' :: LockFile -> IO (Maybe (Maybe (ProcessID, FileLock)))
+getLockStatus :: LockFile -> IO LockStatus
+getLockStatus lockfile = do
+	v <- getLockStatus' lockfile
+	return $ case v of
+		Nothing -> StatusNoLockFile
+		Just Nothing -> StatusUnLocked
+		Just (Just pid) -> StatusLockedBy pid
+
+getLockStatus' :: LockFile -> IO (Maybe (Maybe ProcessID))
 getLockStatus' lockfile = go =<< catchMaybeIO open
   where
 	open = openFd lockfile ReadOnly Nothing defaultFileFlags
 	go Nothing = return Nothing
 	go (Just h) = do
-		ret <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
+		v <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
 		closeFd h
-		return (Just ret)
+		return (Just (fmap fst v))
 
 dropLock :: LockHandle -> IO ()
 dropLock (LockHandle fd) = closeFd fd
+
+-- Checks that the lock file still exists, and is the same file that was
+-- locked to get the LockHandle.
+--
+-- This check is useful if the lock file might get deleted by something
+-- else.
+checkSaneLock :: LockFile -> LockHandle -> IO Bool
+checkSaneLock lockfile (LockHandle fd) =
+	go =<< catchMaybeIO (getFileStatus lockfile)
+  where
+	go Nothing = return False
+	go (Just st) = do
+		fdst <- getFdStatus fd
+		return $ deviceID fdst == deviceID st && fileID fdst == fileID st
diff --git a/Utility/LockFile/Windows.hs b/Utility/LockFile/Windows.hs
--- a/Utility/LockFile/Windows.hs
+++ b/Utility/LockFile/Windows.hs
@@ -22,7 +22,7 @@
 type LockHandle = HANDLE
 
 {- Tries to lock a file with a shared lock, which allows other processes to
- - also lock it shared. Fails is the file is exclusively locked. -}
+ - also lock it shared. Fails if the file is exclusively locked. -}
 lockShared :: LockFile -> IO (Maybe LockHandle)
 lockShared = openLock fILE_SHARE_READ
 
@@ -30,8 +30,8 @@
  - a shared or exclusive lock.
  -
  - Note that exclusive locking also prevents the file from being opened for
- - read or write by any other progess. So for advisory locking of a file's
- - content, a different LockFile should be used. -}
+ - read or write by any other process. So for advisory locking of a file's
+ - content, a separate LockFile should be used. -}
 lockExclusive :: LockFile -> IO (Maybe LockHandle)
 lockExclusive = openLock fILE_SHARE_NONE
 
@@ -47,7 +47,7 @@
  - much more expensive, so is not done here. Thus, the use of c_CreateFile.
  -
  - Also, passing Nothing for SECURITY_ATTRIBUTES ensures that the lock file
- - is not inheerited by any child process.
+ - is not inherited by any child process.
  -}
 openLock :: ShareMode -> LockFile -> IO (Maybe LockHandle)
 openLock sharemode f = do
@@ -65,7 +65,7 @@
 
 {- If the initial lock fails, this is a BUSY wait, and does not
  - guarentee FIFO order of waiters. In other news, Windows is a POS. -}
-waitToLock :: IO (Maybe LockHandle) -> IO LockHandle
+waitToLock :: IO (Maybe lockhandle) -> IO lockhandle
 waitToLock locker = takelock
   where
 	takelock = go =<< locker
diff --git a/Utility/LockPool.hs b/Utility/LockPool.hs
new file mode 100644
--- /dev/null
+++ b/Utility/LockPool.hs
@@ -0,0 +1,36 @@
+{- Lock pool.
+ -
+ - This avoids a problem with unix fcntl locks: They are not composition-safe.
+ -
+ - For example, if one thread is holding a lock, and another thread opens the
+ - lock file (to attempt to take or check the lock), and then closes it,
+ - the lock will be released, despite the first thread still having the
+ - lockfile open.
+ -
+ - Or, if a process is already holding an exclusive lock on a file, an
+ - re-opens it and tries to take another exclusive lock, it won't block
+ - on the first lock.
+ -
+ - To avoid these problems, this implements a lock pool. This keeps track
+ - of which lock files are being used by the process, and avoids
+ - re-opening them. Instead, if a lockfile is in use by the current
+ - process, STM is used to handle further concurrent uses of that lock
+ - file.
+ -
+ - Note that, like Utility.LockFile, this does *not* attempt to be a
+ - portability shim; the native locking of the OS is used.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.LockPool (module X) where
+
+#ifndef mingw32_HOST_OS
+import Utility.LockPool.Posix as X
+#else
+import Utility.LockPool.Windows as X
+#endif
diff --git a/Utility/LockPool/LockHandle.hs b/Utility/LockPool/LockHandle.hs
new file mode 100644
--- /dev/null
+++ b/Utility/LockPool/LockHandle.hs
@@ -0,0 +1,52 @@
+{- Handles for lock pools.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.LockPool.LockHandle where
+
+import qualified Utility.LockPool.STM as P
+#ifndef mingw32_HOST_OS
+import qualified Utility.LockFile.Posix as F
+#else
+import qualified Utility.LockFile.Windows as F
+#endif
+
+import Control.Concurrent.STM
+import Control.Exception
+
+data LockHandle = LockHandle P.LockHandle F.LockHandle
+
+dropLock :: LockHandle -> IO ()
+dropLock (LockHandle ph fh) = P.releaseLock ph (F.dropLock fh)
+
+-- Take a lock, by first updating the lock pool, and then taking the file
+-- lock. If taking the file lock fails for any reason, take care to
+-- release the lock in the lock pool.
+makeLockHandle :: STM P.LockHandle -> IO F.LockHandle -> IO LockHandle
+makeLockHandle pa fa = bracketOnError setup cleanup go
+  where
+	setup = atomically pa
+	cleanup ph = P.releaseLock ph (return ())
+	go ph = do
+		fh <- fa
+		return $ LockHandle ph fh
+
+tryMakeLockHandle :: STM (Maybe P.LockHandle) -> IO (Maybe F.LockHandle) -> IO (Maybe LockHandle)
+tryMakeLockHandle pa fa = bracketOnError setup cleanup go
+  where
+	setup = atomically pa
+	cleanup Nothing = return ()
+	cleanup (Just ph) = P.releaseLock ph (return ())
+	go Nothing = return Nothing
+	go (Just ph) = do
+		mfh <- fa
+		case mfh of
+			Nothing -> do
+				cleanup (Just ph)
+				return Nothing
+			Just fh -> return $ Just $ LockHandle ph fh
diff --git a/Utility/LockPool/Posix.hs b/Utility/LockPool/Posix.hs
new file mode 100644
--- /dev/null
+++ b/Utility/LockPool/Posix.hs
@@ -0,0 +1,61 @@
+{- Posix lock files, using lock pools.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.LockPool.Posix (
+	LockHandle,
+	lockShared,
+	lockExclusive,
+	tryLockExclusive,
+	checkLocked,
+	getLockStatus,
+	LockStatus(..),
+	dropLock,
+	checkSaneLock,
+) where
+
+import qualified Utility.LockFile.Posix as F
+import Utility.LockFile.Posix (LockStatus(..))
+import qualified Utility.LockPool.STM as P
+import Utility.LockPool.STM (LockFile, LockMode(..))
+import Utility.LockPool.LockHandle
+
+import System.IO
+import System.Posix
+import Data.Maybe
+import Control.Applicative
+import Prelude
+
+-- Takes a shared lock, blocking until the lock is available.
+lockShared :: Maybe FileMode -> LockFile -> IO LockHandle
+lockShared mode file = makeLockHandle
+	(P.waitTakeLock P.lockPool file LockShared)
+	(F.lockShared mode file)
+
+lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle
+lockExclusive mode file = makeLockHandle
+	(P.waitTakeLock P.lockPool file LockExclusive)
+	(F.lockExclusive mode file)
+
+tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)
+tryLockExclusive mode file = tryMakeLockHandle
+	(P.tryTakeLock P.lockPool file LockExclusive)
+	(F.tryLockExclusive mode file)
+
+-- Returns Nothing when the file doesn't exist, for cases where
+-- that is different from it not being locked.
+checkLocked :: LockFile -> IO (Maybe Bool)
+checkLocked file = P.getLockStatus P.lockPool file
+	(pure (Just True))
+	(F.checkLocked file)
+
+getLockStatus :: LockFile -> IO LockStatus
+getLockStatus file = P.getLockStatus P.lockPool file
+	(StatusLockedBy <$> getProcessID)
+	(F.getLockStatus file)
+
+checkSaneLock :: LockFile -> LockHandle -> IO Bool
+checkSaneLock lockfile (LockHandle _ fh) = F.checkSaneLock lockfile fh
diff --git a/Utility/LockPool/STM.hs b/Utility/LockPool/STM.hs
new file mode 100644
--- /dev/null
+++ b/Utility/LockPool/STM.hs
@@ -0,0 +1,122 @@
+{- STM implementation of lock pools.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.LockPool.STM (
+	LockPool,
+	lockPool,
+	LockFile,
+	LockMode(..),
+	LockHandle,
+	waitTakeLock,
+	tryTakeLock,
+	getLockStatus,
+	releaseLock,
+) where
+
+import System.IO.Unsafe (unsafePerformIO)
+import qualified Data.Map.Strict as M
+import Control.Concurrent.STM
+import Control.Applicative
+import Control.Exception
+import Control.Monad
+
+type LockFile = FilePath
+
+data LockMode = LockExclusive | LockShared
+	deriving (Eq)
+
+-- This TMVar is full when the handle is open, and is emptied when it's
+-- closed.
+type LockHandle = TMVar (LockPool, LockFile)
+
+type LockCount = Integer
+
+data LockStatus = LockStatus LockMode LockCount
+
+-- This TMVar is normally kept full.
+type LockPool = TMVar (M.Map LockFile LockStatus)
+
+-- A shared global variable for the lockPool. Avoids callers needing to
+-- maintain state for this implementation detail.
+lockPool :: LockPool
+lockPool = unsafePerformIO (newTMVarIO M.empty)
+{-# NOINLINE lockPool #-}
+
+-- Updates the LockPool, blocking as necessary if another thread is holding
+-- a conflicting lock.
+-- 
+-- Note that when a shared lock is held, an exclusive lock will block.
+-- While that blocking is happening, another call to this function to take
+-- the same shared lock should not be blocked on the exclusive lock.
+-- Keeping the whole Map in a TMVar accomplishes this, at the expense of
+-- sometimes retrying after unrelated changes in the map.
+waitTakeLock :: LockPool -> LockFile -> LockMode -> STM LockHandle
+waitTakeLock pool file mode = do
+	m <- takeTMVar pool
+	v <- case M.lookup file m of
+		Just (LockStatus mode' n)
+			| mode == LockShared && mode' == LockShared ->
+				return $ LockStatus mode (succ n)
+			| n > 0 -> retry -- wait for lock
+		_ -> return $ LockStatus mode 1
+	putTMVar pool (M.insert file v m)
+	newTMVar (pool, file)
+
+-- Avoids blocking if another thread is holding a conflicting lock.
+tryTakeLock :: LockPool -> LockFile -> LockMode -> STM (Maybe LockHandle)
+tryTakeLock pool file mode =
+	(Just <$> waitTakeLock pool file mode)
+		`orElse`
+	return Nothing
+
+-- Checks if a lock is being held. If it's held by the current process,
+-- runs the getdefault action; otherwise runs the checker action.
+--
+-- Note that the lock pool is left empty while the checker action is run.
+-- This allows checker actions that open/close files, and so would be in
+-- danger of conflicting with locks created at the same time this is
+-- running. With the lock pool empty, anything that attempts
+-- to take a lock will block, avoiding that race.
+getLockStatus :: LockPool -> LockFile -> IO v -> IO v -> IO v
+getLockStatus pool file getdefault checker = do
+	v <- atomically $ do
+		m <- takeTMVar pool
+		let threadlocked = case M.lookup file m of
+			Just (LockStatus _ n) | n > 0 -> True
+			_ -> False
+		if threadlocked
+			then do
+				putTMVar pool m
+				return Nothing
+			else return $ Just $ atomically $ putTMVar pool m
+	case v of
+		Nothing -> getdefault
+		Just restore -> bracket_ (return ()) restore checker
+
+-- Only runs action to close underlying lock file when this is the last
+-- user of the lock, and when the handle has not already been closed.
+--
+-- Note that the lock pool is left empty while the closelockfile action
+-- is run, to avoid race with another thread trying to open the same lock
+-- file.
+releaseLock :: LockHandle -> IO () -> IO ()
+releaseLock h closelockfile = go =<< atomically (tryTakeTMVar h)
+  where
+	go (Just (pool, file)) = do
+		(m, unused) <- atomically $ do
+			m <- takeTMVar pool
+			return $ case M.lookup file m of
+				Just (LockStatus mode n)
+					| n == 1 -> (M.delete file m, True)
+					| otherwise ->
+						(M.insert file (LockStatus mode (pred n)) m, False)
+				Nothing -> (m, True)
+		when unused
+			closelockfile
+		atomically $ putTMVar pool m
+	-- The LockHandle was already closed.
+	go Nothing = return ()
diff --git a/Utility/LockPool/Windows.hs b/Utility/LockPool/Windows.hs
new file mode 100644
--- /dev/null
+++ b/Utility/LockPool/Windows.hs
@@ -0,0 +1,49 @@
+{- Windows lock files, using lock pools.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.LockPool.Windows (
+	LockHandle,
+	lockShared,
+	lockExclusive,
+	dropLock,
+	waitToLock,
+) where
+
+import qualified Utility.LockFile.Windows as F
+import qualified Utility.LockPool.STM as P
+import Utility.LockPool.LockHandle
+import Utility.LockPool.STM (LockPool, LockFile, LockMode(..))
+import Utility.Monad
+
+import Control.Concurrent.STM
+import System.IO
+import Data.Maybe
+import Control.Applicative
+import Prelude
+
+{- Tries to lock a file with a shared lock, which allows other processes to
+ - also lock it shared. Fails if the file is exclusively locked. -}
+lockShared :: LockFile -> IO (Maybe LockHandle)
+lockShared file = tryMakeLockHandle
+	(P.tryTakeLock P.lockPool file LockShared)
+	(F.lockShared file)
+
+{- Tries to take an exclusive lock on a file. Fails if another process has
+ - a shared or exclusive lock.
+ -
+ - Note that exclusive locking also prevents the file from being opened for
+ - read or write by any other process. So for advisory locking of a file's
+ - content, a separate LockFile should be used. -}
+lockExclusive :: LockFile -> IO (Maybe LockHandle)
+lockExclusive file = tryMakeLockHandle
+	(P.tryTakeLock P.lockPool file LockExclusive)
+	(F.lockExclusive file)
+
+{- If the initial lock fails, this is a BUSY wait, and does not
+ - guarentee FIFO order of waiters. In other news, Windows is a POS. -}
+waitToLock :: IO (Maybe lockhandle) -> IO lockhandle
+waitToLock = F.waitToLock
diff --git a/c619362c3cedab65adcfdf7ac9dc3c014479cc12.patch b/c619362c3cedab65adcfdf7ac9dc3c014479cc12.patch
deleted file mode 100644
--- a/c619362c3cedab65adcfdf7ac9dc3c014479cc12.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From c619362c3cedab65adcfdf7ac9dc3c014479cc12 Mon Sep 17 00:00:00 2001
-From: Yaroslav Halchenko <debian@onerussian.com>
-Date: Mon, 11 May 2015 09:45:33 +0100
-Subject: [PATCH] ENH: make debianstandalone{,-dsc} rules
-
-Moved rules out of debian/rules and avoided need for patching it for
-standalone builds
----
- Makefile                        | 19 +++++++++++++++++++
- debian/patches/standalone-build | 24 +++---------------------
- debian/rules                    | 26 +++++++++++++++++---------
- 3 files changed, 39 insertions(+), 30 deletions(-)
-
-diff --git a/Makefile b/Makefile
-index 2bc43ed..1a94684 100644
---- a/Makefile
-+++ b/Makefile
-@@ -140,6 +140,25 @@ linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs
- 	cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST
- 	cd tmp && tar czf git-annex-standalone-$(shell dpkg --print-architecture).tar.gz git-annex.linux
- 
-+# Run this target to build git-annex-standalone*.deb
-+debianstandalone: dpkg-buildpackage-F
-+# Run this target to build git-annex-standalone*.dsc
-+debianstandalone-dsc: dpkg-buildpackage-S
-+
-+prep-standalone:
-+	$(MAKE) undo-standalone
-+	QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt push -a
-+	debian/create-standalone-changelog
-+
-+undo-standalone:
-+	test -e .git
-+	git checkout debian/changelog
-+	quilt pop -a || true
-+
-+dpkg-buildpackage%: prep-standalone
-+	umask 022; dpkg-buildpackage -rfakeroot $*
-+	$(MAKE) undo-standalone
-+
- OSXAPP_DEST=tmp/build-dmg/git-annex.app
- OSXAPP_BASE=$(OSXAPP_DEST)/Contents/MacOS/bundle
- osxapp: Build/Standalone Build/OSXMkLibs
-diff --git a/debian/patches/standalone-build b/debian/patches/standalone-build
-index 0936d10..51bfa2f 100644
---- a/debian/patches/standalone-build
-+++ b/debian/patches/standalone-build
-@@ -6,7 +6,7 @@ Last-Update: 2015-04-20
- 
- --- a/debian/control
- +++ b/debian/control
--@@ -89,15 +89,14 @@ Vcs-Git: git://git.kitenet.net/git-annex
-+@@ -87,15 +87,14 @@ Vcs-Git: git://git.kitenet.net/git-annex
-  Homepage: http://git-annex.branchable.com/
-  XS-Testsuite: autopkgtest
-  
-@@ -28,7 +28,7 @@ Last-Update: 2015-04-20
-  Recommends: 
-  	lsof,
-  	gnupg,
--@@ -112,7 +111,7 @@ Suggests:
-+@@ -110,7 +109,7 @@ Suggests:
-  	bup,
-  	tahoe-lafs,
-  	libnss-mdns,
-@@ -37,7 +37,7 @@ Last-Update: 2015-04-20
-   git-annex allows managing files with git, without checking the file
-   contents into git. While that may seem paradoxical, it is useful when
-   dealing with files larger than git can currently easily handle, whether due
--@@ -130,3 +129,7 @@ Description: manage files with git, with
-+@@ -128,3 +127,7 @@ Description: manage files with git, with
-   noticing when files are changed, and automatically committing them
-   to git and transferring them to other computers. The git-annex webapp
-   makes it easy to set up and use git-annex this way.
-@@ -57,21 +57,3 @@ Last-Update: 2015-04-20
- +++ b/debian/manpages
- @@ -0,0 +1 @@
- +debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*
----- a/debian/rules
--+++ b/debian/rules
--@@ -8,6 +8,15 @@ export RELEASE_BUILD=1
-- %:
-- 	dh $@
-- 
--+override_dh_auto_build:
--+	make linuxstandalone
--+
--+override_dh_auto_install:
--+	: # nothing to do, we just need to copy the beast, as instructed in debian/install
--+
--+override_dh_fixperms:
--+	dh_fixperms -Xld-linux
--+
-- # Run this target to build git-annex-standalone.deb
-- build-standalone:
-- 	test -e .git
-diff --git a/debian/rules b/debian/rules
-index 26f2448..927c1c9 100755
---- a/debian/rules
-+++ b/debian/rules
-@@ -2,18 +2,26 @@
- 
- export CABAL=debian/cabal-wrapper
- 
-+STANDALONE_BUILD=$(shell grep -qe '^Package: git-annex-standalone' debian/control \
-+                         && echo 1 || echo 0)
-+
- # Do use the changelog's version number, rather than making one up.
- export RELEASE_BUILD=1
- 
- %:
- 	dh $@
- 
--# Run this target to build git-annex-standalone.deb
--build-standalone:
--	test -e .git
--	git checkout debian/changelog
--	quilt pop -a || true
--	QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt push -a
--	debian/create-standalone-changelog
--	dpkg-buildpackage -rfakeroot
--	quilt pop -a
-+
-+# Standalone build logic/helpers
-+ifeq ($(STANDALONE_BUILD),1)
-+
-+override_dh_auto_build:
-+	make linuxstandalone
-+
-+override_dh_auto_install:
-+	: # nothing to do, we just need to copy the beast, as instructed in debian/install
-+
-+override_dh_fixperms:
-+	dh_fixperms -Xld-linux
-+
-+endif
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,36 @@
+git-annex (5.20150522) unstable; urgency=medium
+
+  * import: Refuse to import files that are within the work tree, as that
+    does not make sense and could cause data loss.
+  * drop: Now supports --all, --unused, and --key.
+  * drop: Now defaults to --all when run in a bare repository.
+    (Previously, did nothing when run in a bare repository.)
+  * get, move, copy, mirror: Concurrent transfers are now supported!
+    For example: git-annex get -J10
+    However, progress bars are not yet displayed for concurrent transfers,
+    pending an updated version of the ascii-progress library.
+  * --quiet now makes progress output by rsync, wget, etc be quiet too.
+  * Take space that will be used by other running downloads into account when
+    checking annex.diskreserve.
+  * Avoid accumulating transfer failure log files unless the assistant is
+    being used.
+  * Fix an unlikely race that could result in two transfers of the same key
+    running at once.
+  * Stale transfer lock and info files will be cleaned up automatically
+    when get/unused/info commands are run.
+  * unused: Add --used-refspec option and annex.used-refspec, which can
+    specify a set of refs to consider used, rather than the default of
+    considering all refs used.
+  * webapp: Fix zombie xdg-open process left when opening file browser.
+    Closes: #785498
+  * Safer posix fctnl locking implementation, using lock pools and STM.
+  * Build documentation with TZ=UTC for reproducible builds. See #785736.
+  * OSX: Corrected the location of trustedkeys.gpg, so the built-in
+    upgrade code will find it. Fixes OSX upgrade going forward, but
+    older versions won't upgrade themselves due to this problem.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 22 May 2015 14:20:18 -0400
+
 git-annex (5.20150508.1) unstable; urgency=medium
 
   * Now builds cleanly using ghc 7.10 (as well as ghc back to 7.6).
diff --git a/debian/control b/debian/control
--- a/debian/control
+++ b/debian/control
@@ -38,8 +38,7 @@
 	libghc-yesod-form-dev (>= 1.3.15) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
 	libghc-yesod-static-dev (>= 1.2.4) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
 	libghc-yesod-default-dev (>= 1.2.0) [i386 amd64 armel armhf kfreebsd-amd64 powerpc ppc64el],
-	libghc-hamlet-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
-	libghc-shakespeare-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
+	libghc-shakespeare-dev (>= 2.0.0) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
 	libghc-clientsession-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
 	libghc-warp-dev (>= 3.0.0.5) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
 	libghc-warp-tls-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
diff --git a/debian/copyright b/debian/copyright
--- a/debian/copyright
+++ b/debian/copyright
@@ -104,7 +104,7 @@
 
 Files: static/*/bootstrap* static/*/glyphicons-halflings*
 Copyright: 2012-2014 Twitter, Inc.
-License: MIT
+License: MIT-twitter
   Copyright (c) 2011-2014 Twitter, Inc
   .
   Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="comment 10"
+ date="2013-05-24T03:11:50Z"
+ content="""
+>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.
+
+;-)  Sorry for confusion, here are the details:
+
+\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so .
+Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here.
+
+I will try fresh build now
+Cheers,
+"""]]
diff --git a/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="fresh build"
+ date="2013-05-24T03:21:29Z"
+ content="""
+With fresh build got:
+
+u0_a39@android:/ $ git annex webapp
+/system/bin/sh: git: not found
+
+the PATH is /sbin:/system/bin:/system/xbin
+
+where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39)
+"""]]
diff --git a/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 12"
+ date="2013-05-24T03:26:33Z"
+ content="""
+You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH
+
+However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen.
+"""]]
diff --git a/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"
+ nickname="Franck"
+ subject="Still problems with my old N1/CM7"
+ date="2013-05-24T06:01:18Z"
+ content="""
+Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed.
+"""]]
diff --git a/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="It starts after uninstall/install"
+ date="2013-05-24T23:29:52Z"
+ content="""
+Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned).  So I have removed previous installation and reinstalled it again -- it starts now!  Thanks ;)
+"""]]
diff --git a/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment b/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="asking for ssh password in the terminal (not in web ui)"
+ date="2013-05-24T23:49:40Z"
+ content="""
+not sure if that is a known issue:  whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise  
+"""]]
diff --git a/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="Few other issues"
+ date="2013-05-25T15:35:46Z"
+ content="""
+Hi again.
+
+talking about 4.20130523-gcfe07a2 version:
+
+- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup?  I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable.  I had to switch to \"full backup\" (or whatever that name) to finally get directory synced
+
+- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g.
+
+Please make sure you have the correct access rights
+and the repository exists.
+ssh: Could not resolve hostname onerussian.com: No address associated with hostname
+fatal: Could not read from remote repository.
+
+IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity
+
+- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local).  But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc).  When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed.  Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there.  The only way to revive webui is to go back to Dashboard.  Log there says (retyping from the screen so typos might be there):
+
+error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory
+fatal: unable to fork
+
+"""]]
diff --git a/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="comment 17"
+ date="2013-05-29T02:43:29Z"
+ content="""
+joey -- any additional information could I provide to troubleshoot the issue?  original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it...
+"""]]
diff --git a/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="http://aap.liquidid.net/"
+ nickname="AAP"
+ subject="comment 18"
+ date="2013-05-30T11:23:58Z"
+ content="""
+I too get the 'link busybox: Read-only file system' message. Here is my phone info: 
+
+Phone: Samsung Galaxy Y GT-S5360 (rooted)   
+Android: 2.3.6 Gingerbread   
+BusyBox path: /system/xbin/ 
+
+
+Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns
+     
+         drwxr-x--x    1 app_97   app_97           0 May 30 12:57 /data/data/ga.androidterm/
+"""]]
diff --git a/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="Does it require the device to be rooted?"
+ date="2013-05-16T20:55:45Z"
+ content="""
+Following your news on kickstarter downloaded the .apk, and installed it.  Upn start I just got a terminal window with
+
+  link busybox: Read-only file system
+
+  [Terminal session finished]
+
+That is on Galaxy Note
+
+"""]]
diff --git a/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://afoolishmanifesto.com/"
+ nickname="frioux"
+ subject="SSH Keys - 2"
+ date="2013-07-17T22:56:37Z"
+ content="""
+@joey should I be using the nightlies to see that?  Under \"Adding a remote server using ssh\" I only see  Host name, user name, directory, and port.  Will it only be an option after I type in a password?
+"""]]
diff --git a/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.6.48"
+ subject="comment 22"
+ date="2013-07-17T23:25:21Z"
+ content="""
+@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server.
+"""]]
diff --git a/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://afoolishmanifesto.com/"
+ nickname="frioux"
+ subject="comment 23"
+ date="2013-07-18T02:01:28Z"
+ content="""
+@joey: ok, I got it to connect and it indeed sent over a key etc.  For some reason now though git-annex (on android) \"crashes\" shortly after starting.  To be clear, the web app says that the program crashed, the console is still there.  I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell.  Any ideas what I should do next?  (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :)
+"""]]
diff --git a/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://afoolishmanifesto.com/"
+ nickname="frioux"
+ subject="comment 24"
+ date="2013-07-18T11:35:06Z"
+ content="""
+ok, it eventually got the details from the remote server, but now I'm getting some other oddities.  here is some of my log that shows what I am running into
+
+Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory)
+"""]]
diff --git a/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU"
+ nickname="Frew"
+ subject="comment 25"
+ date="2013-07-18T13:14:46Z"
+ content="""
+frioux here (something messed up with myopenid or something)
+
+So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP.  It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again.  It looks like it's about a 4s repeat loop.  Any ideas what I should do next?
+"""]]
diff --git a/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.140"
+ subject="comment 26"
+ date="2013-07-18T17:07:27Z"
+ content="""
+@Frew, you should file bug reports when you have a bug.
+
+One problem you mentioned had already had a bug report filed by someone
+else:
+<http://git-annex.branchable.com/bugs/Watcher_crashed:_addWatch:_does_not_exist/> So you can post your details there.
+"""]]
diff --git a/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment
@@ -0,0 +1,34 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"
+ nickname="Nigel"
+ subject="Watcher crashed in Android on /storage/sdcard1 - bug?"
+ date="2013-07-29T11:50:46Z"
+ content="""
+In webapp UI, added on first install, the location for repository: /storage/sdcard1
+
+!warning
+
+Watcher crashed: addWatch:
+
+permission denied (Permission denied)
+
+[Restart Thread]
+
+:Performing startup scan
+
+
+In terminal Window 1:
+
+nex webapp                                         <
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+
+Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723
+"""]]
diff --git a/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Jonathan"
+ ip="63.131.117.194"
+ subject="link busybox: Read-only file system"
+ date="2013-07-29T20:08:12Z"
+ content="""
+Phone: HTC EVO 3d 4g
+Model Number: pg86100
+Android Version: 4.0.3
+"""]]
diff --git a/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 2"
+ date="2013-05-17T22:28:34Z"
+ content="""
+The Android app works on many non-rooted Android systems.
+
+The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number.
+"""]]
diff --git a/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="Follow-up information on my system"
+ date="2013-05-18T01:23:28Z"
+ content="""
+Sorry for the delay:  my android is stock Samsung-tuned Jelly beans.
+Android 4.1.2
+Baseband version N7000XXLSO
+
+not sure if that would be of any use :-/  nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by?
+
+
+"""]]
diff --git a/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs"
+ nickname="Chris"
+ subject="Not starting browser on Nexus 7, Android 4.2.2"
+ date="2013-05-19T14:04:28Z"
+ content="""
+I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: <http://hodapple.com/files/Screenshot_2013-05-19-09-49-53.png> <http://hodapple.com/files/git-annex-error.txt>
+
+In spite of that, though, the URL provided still worked.
+"""]]
diff --git a/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 5"
+ date="2013-05-19T19:46:14Z"
+ content="""
+@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]]
+"""]]
diff --git a/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 6"
+ date="2013-05-19T20:06:56Z"
+ content="""
+@yarikoptic, there is a process you can perform that will help me determine what's going on.
+
+You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\"
+
+Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run:
+
+ls -ld /data/data/ga.androidterm
+
+I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`.
+
+My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself.
+"""]]
diff --git a/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"
+ nickname="Franck"
+ subject="Link issue"
+ date="2013-05-22T12:01:38Z"
+ content="""
+Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests.
+"""]]
diff --git a/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://yarikoptic.myopenid.com/"
+ nickname="site-myopenid"
+ subject="why ln failed"
+ date="2013-05-23T13:27:39Z"
+ content="""
+Finally got to check it out:  so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\"  that lib is -> /mnt/asec/ga.androidterm-1/lib  which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10)
+"""]]
diff --git a/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment
new file mode 100644
--- /dev/null
+++ b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 9"
+ date="2013-05-23T18:44:46Z"
+ content="""
+@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.
+
+I've reworked the android app to not need any hard links. Try the current autobuild: <http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk>
+"""]]
diff --git a/doc/bare_repositories/comment_4_7cf6103709a7a2710686681a6f406214._comment b/doc/bare_repositories/comment_4_7cf6103709a7a2710686681a6f406214._comment
new file mode 100644
--- /dev/null
+++ b/doc/bare_repositories/comment_4_7cf6103709a7a2710686681a6f406214._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7"
+ nickname="Frederik Vanrenterghem"
+ subject="Convert bare repository to normal"
+ date="2015-05-19T09:17:15Z"
+ content="""
+Just wondering what the right steps are to convert a bare repository to a normal one? The comment above from 2.5 years ago includes the creation of a .git directory, which actually already exists. Have things changed in the mean time?
+"""]]
diff --git a/doc/bare_repositories/comment_5_6328134497c0de6a088087fc9cb0e59e._comment b/doc/bare_repositories/comment_5_6328134497c0de6a088087fc9cb0e59e._comment
new file mode 100644
--- /dev/null
+++ b/doc/bare_repositories/comment_5_6328134497c0de6a088087fc9cb0e59e._comment
@@ -0,0 +1,31 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ subject="comment 5"
+ date="2015-05-19T12:18:05Z"
+ content="""
+Well, no, i don't think they changed, unless i missed something: there
+shouldn't be a `.git` repository there.
+
+There are [various
+instructions](http://stackoverflow.com/questions/10637378/how-do-i-convert-a-bare-git-repository-into-a-normal-one-in-place)
+on how to do this online. They do seem to agree with the first comment
+above.
+
+Personnally, I would just `git clone` to a different repo and `git
+annex forget` the old one. Unless you have a very complex repository
+with a lot of files, this is simple enough... You could even use `git
+annex reinit` to recycle the previous uuid if that's a concern. So in
+short:
+
+   git clone repo.git repo
+   cd repo
+   git annex info --fast # find the UUID of repo.git
+   git annex move --from $UUID
+   git annex reinit $UUID
+
+Then `repo.git` can be removed if you are certain everything is
+correct in `repo`.
+
+Note that you may want to have backups of everything before you do
+anything, as usual.
+"""]]
diff --git a/doc/bare_repositories/comment_6_bf227861ec3cb2ea474c143218c68133._comment b/doc/bare_repositories/comment_6_bf227861ec3cb2ea474c143218c68133._comment
new file mode 100644
--- /dev/null
+++ b/doc/bare_repositories/comment_6_bf227861ec3cb2ea474c143218c68133._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7"
+ nickname="Frederik Vanrenterghem"
+ subject="comment 6"
+ date="2015-05-21T06:14:33Z"
+ content="""
+Thanks Anarcat. I actually was dealing with a repository in direct mode, not bare mode. Only realised after today encountering one in bare mode, and reading [[internals]]. Your method worked too, but
+
+    git annex indirect 
+
+would have been quicker I guess.
+"""]]
diff --git a/doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn b/doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn
@@ -0,0 +1,37 @@
+### Please describe the problem.
+
+git-annex assistant starts to drop files in remote repos, even when they are set to manual.
+
+### What steps will reproduce the problem?
+
+
+Create 3 repos:
+
+* A -- standard, archive
+* m1 -- standard, manual
+* m2 -- standard, manual
+
+System has 3 files annexed: file1, file2, file3. Repo "A" has all three files, m1 has none, m2 has file3.
+
+So, while in m1:
+
+    m1 $ git annex find --want-drop --in m2
+    file3
+
+file3 shouln't be dropped from m2. There is no reason to do this. m2 is set as manual, and it shouldn't be touched in any case.
+
+Now, let's get this file in m1:
+
+    m1 $ git annex get file3
+    get file3 (from m2...) ok
+    (Recording state in git...)
+    m1 $ git annex find --want-drop --in m2
+
+So when 'file3' is present in local repo, it's not going to be dropped from m2.
+
+I guess that rule 'present' works in local repo context while 'drop' acts on remote files.
+
+
+### What version of git-annex are you using? On what operating system?
+
+I'm using latest version in Debian Jessie (5.20141024) on amd64 and armhf. I've also reproduced the bug with manually compiled 5.20141105-g8d8b248 on amd64.
diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn
@@ -0,0 +1,31 @@
+The assistant from the standalone 64bit build crashes upon startup.
+
+### Version information
+
+     [0 zerodogg@firefly annexed]$ git annex version
+     git-annex version: 5.20131230-g4aa88d8
+     build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA
+     key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+     remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external
+     local repository version: 5
+     supported repository version: 5
+     upgrade supported from repository versions: 0 1 2 4
+     [0 zerodogg@firefly annexed]$ uname -a
+     Linux firefly 3.12.5-302.fc20.x86_64 #1 SMP Tue Dec 17 20:42:32 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
+     [0 zerodogg@firefly annexed]$ cat /etc/fedora-release 
+     Fedora release 20 (Heisenbug)
+     [0 zerodogg@firefly annexed]$ 
+
+### Error
+
+     [0 zerodogg@firefly annexed]$ git annex webapp
+     Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html
+     
+     (process:6045): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed
+     libgcc_s.so.1 must be installed for pthread_cancel to work
+     error: git-annex died of signal 6
+     [134 zerodogg@firefly annexed]$ ls -l /usr/lib64/libgcc_s.so.1
+     lrwxrwxrwx. 1 root root 28 2013-12-18 10:54 /usr/lib64/libgcc_s.so.1 -> libgcc_s-4.8.2-20131212.so.1
+     [0 zerodogg@firefly annexed]$ 
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/Data_loss_when_doing___96__git_annex_import_--force__96__.mdwn b/doc/bugs/Data_loss_when_doing___96__git_annex_import_--force__96__.mdwn
--- a/doc/bugs/Data_loss_when_doing___96__git_annex_import_--force__96__.mdwn
+++ b/doc/bugs/Data_loss_when_doing___96__git_annex_import_--force__96__.mdwn
@@ -57,3 +57,6 @@
 drwxr-xr-x  8 jkt jkt  119 May  8 13:55 .git
 """]]
 ...and the file is gone :(.
+
+> You should use `git annex add` in this case, not import. 
+> I've made import refuse to run in this case. [[done]] --[[Joey]]
diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn
@@ -0,0 +1,69 @@
+### Please describe the problem.
+
+[[!tag moreinfo]]
+
+I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error.
+
+### What steps will reproduce the problem?
+
+I am not really sure, I added a lot of files to the annex, almost 3TB.
+Then either git-annex status or git-annex indirect cause a similar error (see below).
+
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 4.20130501-g4a5bfb3
+local repository version: 4
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+
+Ubuntu precise
+3.2.0-26-generic
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log
+git-annex status
+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+supported remote types: git S3 bup directory rsync web webdav glacier hook
+repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 7
+	00000000-0000-0000-0000-000000000001 -- web
+ 	0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex
+ 	65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.)
+ 	96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier
+ 	b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData
+ 	c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop
+ 	fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- .
+untrusted repositories: 0
+dead repositories: 0
+transfers in progress: none
+available local disk space: 81 gigabytes (+1 megabyte reserved)
+temporary directory size: 9 megabytes (clean up with git-annex unused)
+local annex keys: 61396
+local annex size: 3 terabytes
+known annex keys: git-annex: out of memory (requested 985661440 bytes)
+
+OR
+
+git-annex indirect
+commit  git-annex: out of memory (requested 985661440 bytes)
+
+
+
+
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]]. However, if you saw this behavior,
+> you have large files checked directly into git. You may
+> want to examine your repository and use git filter-branch to clean
+> it up.
+> --[[Joey]] 
diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn
@@ -0,0 +1,20 @@
+What steps will reproduce the problem?
+
+Adding files to a local annex set up to sync to a remote S3 one
+
+
+What is the expected output? What do you see instead?
+
+It syncs, but maxes out the uplink
+
+
+What version of git-annex are you using? On what operating system?
+
+3.20121112 on Debian testing
+
+
+Please provide any additional information below.
+
+The man page lists how to configure rate limiting for rsync, not sure how to do it for this
+
+[[!tag confirmed]]
diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn
@@ -0,0 +1,23 @@
+### Please describe the problem.
+
+Creating a USB repo fails with a GPG error.
+
+### What steps will reproduce the problem?
+
+  * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127
+  * Run git-annex app to launch web interface
+  * Create local repo using web interface
+  * Try to create USB repo using web interface
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version 4.20131105-g136b030 on Mac OS 10.9 Mavericks.
+
+### Please provide any additional information below.
+
+[[!format sh """
+07/Nov/2013:06:51:07 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5)
+"""]]
+
+> [[fixed|done]]; it seems that this was a local build issue ad does not
+> affect the autobuild. --[[Joey]]
diff --git a/doc/bugs/Metadata_changes_are_not_reflected_in_a_view.mdwn b/doc/bugs/Metadata_changes_are_not_reflected_in_a_view.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Metadata_changes_are_not_reflected_in_a_view.mdwn
@@ -0,0 +1,31 @@
+### Please describe the problem.
+Changing metadata while being in an active view will not update the view.
+
+### What steps will reproduce the problem?
+(inside a repository)
+
+1. Create a file
+
+        $ uuidgen >file
+
+2. switch into a view
+
+       $ git annex view !blah
+       $ ls
+       file
+
+3. changed the metadata the view is based upon
+
+       $ git annex metadata -t blah file
+       $ ls
+       file
+
+   It would be nice/expected that the view gets updated when the metadata changes, hiding 'file' now
+  
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20141024~bpo70+1
+on debian wheezy with backports
+
+### Please provide any additional information below.
diff --git a/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://schnouki.net/"
+ nickname="Schnouki"
+ subject="comment 1"
+ date="2013-10-18T08:36:45Z"
+ content="""
+Hi Joey,
+
+It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS).
+
+Would it be possible to include this fix in your standalone builds and Debian packages?
+
+Thanks!
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://schnouki.net/"
+ nickname="Schnouki"
+ subject="comment 2"
+ date="2014-01-29T01:19:27Z"
+ content="""
+Any news about this?
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment b/doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.112"
+ subject="comment 3"
+ date="2014-08-02T23:08:44Z"
+ content="""
+hS3's author seems to have abandoned it and it has other problems. I should try to switch to a different S3 library.
+
+There is now a workaround; S3 special remotes can be configured to use [[chunking]]. A max of one chunk will then be buffered in memory at a time. 
+
+For example, to reconfigure an existing mys3 remote: `enableremote mys3 chunk=1MiB`
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment b/doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.112"
+ subject="comment 4"
+ date="2014-08-03T18:40:26Z"
+ content="""
+Beginning work on a `s3-aws` branch using the aws library instead of hS3.
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment b/doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"
+ nickname="Justin"
+ subject="comment 5"
+ date="2014-11-30T22:18:56Z"
+ content="""
+This is getting in my way, but I'm concerned about using a mostly-untested branch (and also, compiling for ARM sounds really unpleasant).  Can you elaborate on the risks here?  Can I perhaps donate developer time to get this merged into mainline?
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment b/doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2014-12-02T17:10:42Z"
+ content="""
+The s3-aws branch is well tested now.
+
+I am blocked from merging it by some dependency issues, in particular 
+<http://hackage.haskell.org/package/dbus> needs to have a small dependency
+fix. I have emailed its author a second time now to try to get that done.
+"""]]
diff --git a/doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment b/doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"
+ nickname="Justin"
+ subject="comment 7"
+ date="2014-12-06T18:15:50Z"
+ content="""
+The new version works really great for me.  I've been copying to S3 over the past few days with no issues on my raspberry pi.
+
+Thanks a ton for getting this out.
+"""]]
diff --git a/doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn b/doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn
@@ -0,0 +1,31 @@
+### Please describe the problem.
+At some point, I migrated all my WORM-backed objects to SHA1E. I then squashed my master branch to get rid of any WORM references and dropped unused objects. Recently, I noticed that the git-annex branch still has all tracking information on the old WORM keys. I tried running git-annex forget, but the old keys are not purged, even though no (local or remote) branch refers to them and no git-annex repository has the data for these keys anymore. Should such keys be purged by git-annex forget, too?
+
+### What steps will reproduce the problem?
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+git init /tmp/repo
+cd /tmp/repo
+git annex init
+echo hi > file
+git annex add --backend=WORM file
+git commit -m init
+git annex migrate
+git commit -m migrated
+git checkout --orphan tmp
+git commit -m squashed
+git branch -m master -f
+git annex unused
+git annex dropunused 1 --force
+git annex forget --drop-dead --force
+git ls-tree -r git-annex | grep WORM
+
+# End of transcript or log.
+"""]]
+
+### What version of git-annex are you using? On what operating system?
+git-annex 5.20150508
+Linux 4.0.4
+
diff --git a/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn
@@ -0,0 +1,31 @@
+~~~~
+$ git annex version
+git-annex version: 5.20140818-g10bf03a
+~~~~
+
+When repository was initially created, it used "old" hashing from http://git-annex.branchable.com/internals/hashing/ . After some operations, annex was upgraded to "new" format. However, symlinks are still in "old" format and dangling. "git annex fsck", "git annex repair", "git annex pre-commit" - none helps.
+
+~~~~
+$ ls -l pics
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22  2012 IMG_3776.JPG -> ../.git/annex/objects/KM/j6/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22  2012 renamed2.jpg -> ../.git/annex/objects/7F/z3/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22  2012 renamed.jpg -> ../.git/annex/objects/W1/vK/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+
+$ find .git/annex/objects/
+.git/annex/objects/
+.git/annex/objects/219
+.git/annex/objects/219/741
+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+.git/annex/objects/7a6
+.git/annex/objects/7a6/632
+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+.git/annex/objects/df3
+.git/annex/objects/df3/9a8
+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+~~~~
+
+> Unforunately, I cannot see through the attitude problem to a clear bug
+> report. Lacking time/energy to try to coax one out. [[done]] --[[Joey]] 
diff --git a/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn b/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn
@@ -0,0 +1,30 @@
+### Please describe the problem.
+When attempting to 'git annex get' a file that does not exist in the git repository, git-annex correctly reports "not found".  But it still returns exit code 0, incorrectly indicating success.  This is problematic for scripting.
+
+### What steps will reproduce the problem?
+See transcript
+
+### What version of git-annex are you using? On what operating system?
+git-annex 5.20140517.4 as supplied by 'git-annex' aptitude package on Ubuntu 12.04.4 LTS (32-bit) 
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+henry@commsbox:~/work/tmp$ git init test
+Initialized empty Git repository in /home/henry/work/tmp/test/.git/
+henry@commsbox:~/work/tmp$ cd test
+henry@commsbox:~/work/tmp/test$ git annex init
+init  ok
+(Recording state in git...)
+henry@commsbox:~/work/tmp/test$ git annex get nonexistent.file
+git-annex: nonexistent.file not found
+henry@commsbox:~/work/tmp/test$ echo $?
+0
+
+
+"""]]
+
+> Ok, I can find no reason why it was implemented as a warning in 
+> 5f3661238de9f31e6fed0be74fca9d5f1659278c in the bug report associated
+> with that commit. So, promoted to error. [[done]] --[[Joey]] 
diff --git a/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn
@@ -0,0 +1,95 @@
+### Please describe the problem.
+
+Building a recent git-annex with cabal with the `minimal build'
+options given in the installation instructions fails. It is probably
+just a matter of fixing the dependencies in the cabal file.
+
+### What steps will reproduce the problem?
+Compile with:
+
+cabal install git-annex-5.20140108 --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"
+
+### What version of git-annex are you using? On what operating system?
+Linux 2.6.32-5-686 i686 GNU/Linux
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+Resolving dependencies...
+[ 1 of 27] Compiling Utility.PartialPrelude ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/PartialPrelude.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/PartialPrelude.o )
+[ 2 of 27] Compiling Utility.FileSystemEncoding ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FileSystemEncoding.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FileSystemEncoding.o )
+[ 3 of 27] Compiling Utility.Applicative ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Applicative.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Applicative.o )
+[ 4 of 27] Compiling Utility.Data     ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Data.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Data.o )
+[ 5 of 27] Compiling Utility.Exception ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Exception.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Exception.o )
+[ 6 of 27] Compiling Utility.Tmp      ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Tmp.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Tmp.o )
+[ 7 of 27] Compiling Utility.Env      ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Env.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Env.o )
+[ 8 of 27] Compiling Utility.UserInfo ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/UserInfo.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/UserInfo.o )
+[ 9 of 27] Compiling Utility.OSX      ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/OSX.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/OSX.o )
+[10 of 27] Compiling Utility.Monad    ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Monad.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Monad.o )
+[11 of 27] Compiling Utility.Misc     ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Misc.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Misc.o )
+[12 of 27] Compiling Utility.Process  ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Process.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Process.o )
+[13 of 27] Compiling Utility.Path     ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Path.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Path.o )
+[14 of 27] Compiling Utility.FreeDesktop ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FreeDesktop.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FreeDesktop.o )
+[15 of 27] Compiling Assistant.Install.AutoStart ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/AutoStart.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/AutoStart.o )
+[16 of 27] Compiling Utility.SafeCommand ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/SafeCommand.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/SafeCommand.o )
+[17 of 27] Compiling Utility.ExternalSHA ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/ExternalSHA.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/ExternalSHA.o )
+[18 of 27] Compiling Utility.Directory ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Directory.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Directory.o )
+[19 of 27] Compiling Common           ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Common.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Common.o )
+[20 of 27] Compiling Git.Version      ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Git/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Git/Version.o )
+[21 of 27] Compiling Config.Files     ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Config/Files.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Config/Files.o )
+[22 of 27] Compiling Assistant.Install.Menu ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/Menu.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/Menu.o )
+[23 of 27] Compiling Build.TestConfig ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/TestConfig.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/TestConfig.o )
+[24 of 27] Compiling Build.Version    ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Version.o )
+[25 of 27] Compiling Build.Configure  ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Configure.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Configure.o )
+[26 of 27] Compiling Build.DesktopFile ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/DesktopFile.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/DesktopFile.o )
+[27 of 27] Compiling Main             ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Setup.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Main.o )
+Linking /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/setup ...
+  checking version...fatal: Not a git repository (or any of the parent directories): .git
+ 5.20140107
+  checking UPGRADE_LOCATION... not available
+  checking git... yes
+  checking git version... 1.7.2.5
+  checking cp -a... yes
+  checking cp -p... yes
+  checking cp --reflink=auto... yes
+  checking xargs -0... yes
+  checking rsync... yes
+  checking curl... no
+  checking wget... yes
+  checking bup... no
+  checking quvi... no
+  checking newquvi... no
+  checking nice... yes
+  checking ionice... yes
+  checking nocache... no
+  checking gpg... gpg
+  checking lsof... lsof
+  checking git-remote-gcrypt... not available
+  checking ssh connection caching... no
+  checking sha1... sha1sum
+  checking sha256... sha256sum
+  checking sha512... sha512sum
+  checking sha224... sha224sum
+  checking sha384... sha384sum
+Configuring git-annex-5.20140108...
+Building git-annex-5.20140108...
+Preprocessing executable 'git-annex' for git-annex-5.20140108...
+
+Remote/External.hs:29:8:
+    Could not find module `Control.Concurrent.STM'
+    It is a member of the hidden package `stm-2.4.2'.
+    Perhaps you need to add `stm' to the build-depends in your .cabal file.
+    Use -v to see a list of the files searched for.
+Failed to install git-annex-5.20140108
+cabal: Error: some packages failed to install:
+git-annex-5.20140108 failed during the building phase. The exception was:
+ExitFailure 1
+
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"
+ nickname="Yaroslav"
+ subject="git annex fix starts fixing but then spits bulk of errors"
+ date="2014-01-18T05:42:15Z"
+ content="""
+probably related:
+
+```
+fix books/Мои первые книжки/PDF/Благинина Е.А. - Лодочки (Мои первые книжки) - 1962.pdf ok
+fix books/Мои первые книжки/PDF/Благинина Е.А. - Не мешайте мне трудиться (Мои первые книжки) - 1975.pdf fatal: This operation must be run in a work tree
+ok
+(Recording state in git...)
+
+git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)
+fatal: This operation must be run in a work tree
+failed
+(Recording state in git...)
+
+git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)
+fatal: This operation must be run in a work tree
+failed
+(Recording state in git...)
+
+....
+```
+"""]]
diff --git a/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment
@@ -0,0 +1,32 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"
+ nickname="Yaroslav"
+ subject="repair seems to be also confused"
+ date="2014-01-18T05:47:02Z"
+ content="""
+[[[
+$> git annex repair                               
+Running git fsck ...
+No problems found.
+fatal: '/home/yoh/annex/.git' is outside repository
+Had to delete the .git/annex/index file as it was corrupt.
+No data was lost.
+ok
+
+$> ls
+2enjoy/   2read/    2watch/  books/  hardware/  videos/
+2listen/  2review/  abooks/  docs/   pics/
+
+$> git annex repair
+Running git fsck ...
+No problems found.
+fatal: '/home/yoh/annex/.git' is outside repository
+Had to delete the .git/annex/index file as it was corrupt.
+No data was lost.
+ok
+
+$> git annex get 2read/ISNN2010__Tang.pdf
+git-annex: Cannot mix --all or --unused with file names.
+
+]]]
+"""]]
diff --git a/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"
+ nickname="Yaroslav"
+ subject="could it be part/reason of the problem"
+ date="2014-01-18T06:05:50Z"
+ content="""
+not sure how that happened... definitely not me consciously! ;-)  some commands are complaining that \"You cannot run this command in a bare repository\" which I thought is BS since it is not BARE! but then looked into .git/config and it does have core.bare = True ... yikes!.. 
+
+This repository is also under assistant \"control\".
+
+changing to bare=False seems to start 'get'ing things, git annex repair doesn't produce obscure errors.
+
+git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink,,,  but I guess that is a fluke after many upgrades -- just dropping everything locally and getting needed context after purging .git/annex/objects .
+
+So I guess issue is resolved by discovering that repository was set to 'bare' mode somehow although it was not and seemed like working but not quite
+"""]]
diff --git a/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.43"
+ subject="comment 4"
+ date="2014-01-18T15:42:59Z"
+ content="""
+git-annex sets core.bare=true for direct mode, but it also then sets annex.direct=true and so does not treat it as a bare mode repository. If you had eg, manually tried to change annex.direct to false, and left it in bare mode, that would explain everything.
+
+> git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink
+
+That is completely normal behavior; git annex fix does not care if the content is locally present or not; it just checks that the symlinks would point to it if it were present.
+
+(Fixed the partial function in dropunused.)
+"""]]
diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn
@@ -0,0 +1,29 @@
+### Please describe the problem.
+
+This is a one-off thing, not a reproducible bug.  It was just so weird that I wanted to make a note of it in case somebody else had the same problem and it was reproducible.
+
+I have a remote on the a USB drive which I mount once in a while on /Volumes/TOSHIBAEXT which has a remote on /Volumes/TOSHIBAEXT/annex.   It's a remote which I created by hand using "git clone" a long time ago, not something the assistant set up for me.
+
+Anyway, today the assistant kept reporting that it could not sync to it.  I didn't know why, because I checked in my Finder sidebar and it showed a mounted drive called TOSHIBAEXT.  It's only when I checked with the command line that I noticed something was up!  There was now an ordinary directory at /Volumes/TOSHIBAEXT/annex.   This had apparently been created at some point when the drive was unmounted, so when it re-mounted, because there was a directory in the way, it re-mounted at "/Volumes/TOSHIBAEXT 1".  But it was displayed in the finder sidebar as just "TOSHIBAEXT" anyway because the finder hides this workaround from the user for whatever reason.
+
+Presumably git-annex assistant at some point, for some reason, created an ordinary directory where it expected to find the annex.
+
+I wonder if this may have to do with the fact that this is a non-bare, created-by-hand repo, from before I was using the assistant, not a normal bare remote that the assistant would have created for me if I'd been using the webapp.
+
+### What steps will reproduce the problem?
+
+I've only seen it once, and report the bug not as an outstanding issue but only as a heads-up that this has ever happened.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 4.20130501-gb61740e
+
+OS X lion (10.7)
+
+### Please provide any additional information below.
+
+I wasn't logging when this happened.
+
+Again, just a heads-up; I'll keep my eye open for this happening again and post more info if it does.
+
+[[!tag confirmed]]
diff --git a/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn
@@ -0,0 +1,14 @@
+Direct mode merge handles the case where there's a conflict between local and remote files, that are checked into git.
+
+However, the the local file (or directory, or symlink, whatever)
+is not checked into git, the merge will overwrite it with the remote file from git.
+
+> That's fixed; now this is detected and the local variant
+> is renamed with ".variant-local", and possibly a number to make it
+> unique.
+
+New problem: If the merge pulls in a directory, and a file exists with
+the name of the directory, locally, not annexed, the file is left alone,
+but the directory is thus not checked out, and will be deleted on commit.
+
+> [[fixed|done]]; regression test in place. --[[Joey]]
diff --git a/doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment b/doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-09T17:48:20Z"
+ content="""
+GIT_SSH is set to the full path of the binary, unless
+~/.config/git-annex/program overrides it.
+
+Finding the full path to the binary is not a trivial or error-free
+operation.
+
+Could you please follow up to this bug or close it?
+"""]]
diff --git a/doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn b/doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn
@@ -0,0 +1,33 @@
+### Please describe the problem.
+
+When using `git annex sync --content` with two archive with different cost, git annex will upload my file to the first archive, then to the second one, then it will drop it from the first one.
+
+### What steps will reproduce the problem?
+
+I've set both remote to "trusted", both in the "archive" group, both with "standard" preferred content, the remote named "hubic2" as an annex-cost of 200.0, and the remote named "hubic3" as an annex-cost of 175.0
+
+### What version of git-annex are you using? On what operating system?
+I'm using git-annex 5.20141125 on Debian Sid (upgraded today on November 7 2014).
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+$ git annex list | head
+here
+|hubic2
+||hubic3
+|||
+X__ Avatars/archer.jpg
+$ git annex sync --content
+commit  ok
+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic3...)
+ok
+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic2...)
+ok
+drop hubic3 Avatars/archer.jpg ok
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/keeps_demanding_ssh_key_even_if_all_sync__39__s_turned_down.mdwn b/doc/bugs/keeps_demanding_ssh_key_even_if_all_sync__39__s_turned_down.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/keeps_demanding_ssh_key_even_if_all_sync__39__s_turned_down.mdwn
@@ -0,0 +1,60 @@
+### Please describe the problem.
+
+May be I was simply wrong to assume that if I disable all sync'ing for all the repos, assistant wouldn't try to contact those remote hosts. But it still does
+
+In the logs, since no time stamp per each line, hard to say either recent ones just continuation of previous entries, or new ones:
+
+[[
+
+[2015-05-18 10:29:39 EDT] Watcher: Performing startup scan
+(started...) ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M
+...
+]]
+
+and in another
+
+[[
+fsck xppaut_6.11b+1.dfsg.orig.tar.gz ok
+fsck xserver-xorg-input-synaptics_1.6.2+git44-ge28575b.orig.tar.gz ok
+fsck xserver-xorg-video-intel_2.99.917.orig.tar.gz (checksum...)
+ok
+(recording state in git...)
+  ** No known copies exist of python-mne_0.8.3+dfsg.orig.tar.gz
+git-annex: fsck: 1 failed
+
+(process:3954): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+Write failed: Broken pipe^M
+
+(process:20140): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+
+(process:20178): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+git-annex: Daemon is already running.
+
+(process:29035): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+
+(process:29184): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+
+(process:30127): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+
+(process:30817): Gtk-WARNING **: Locale not supported by C library.
+    Using the fallback 'C' locale.
+Write failed: Broken pipe^M
+]]
+
+that host (vagus) is RIP (need to remove from syncs)
+btw which are falling into daemon.log.1 not .log
+
+### What version of git-annex are you using? On what operating system?
+
+5.20150509+gitga10e45d-1~ndall+1
diff --git a/doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn b/doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn
@@ -0,0 +1,18 @@
+### Please describe the problem.
+
+When the annex directory has a non-ascii character (like a tilde) on its path, local pairing fails and a couple of instances of the following message appear on the log
+
+"illegal control characters in pairing message; ignoring"
+
+### What steps will reproduce the problem?
+
+* make a new annex repo named on /home/someone/Vídeos/blah/ (notice the i with a tilde) on two computers
+* try to pair them
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20141016-g26b38fd on Arch Linux
+
+git-annex version: 5.20140717 on Ubuntu 14.10
+
+> [[done]]; see comment
diff --git a/doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn b/doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn
@@ -0,0 +1,34 @@
+### Please describe the problem.
+Doing a git annex command while passing a bad --git-dir can result in the .git directory being deleted. I've never experienced it with plain git, so I assume that it comes for annex.
+
+### What steps will reproduce the problem?
+
+[[!format sh """
+$ mkdir annex_destroyed_my_git_directory
+$ cd annex_destroyed_my_git_directory
+$ git init
+$ git annex init
+$ ls -a
+. .. .git
+$ git --git-dir=$PWD annex find
+fatal: Not a git repository: '/home/doudou/tmp/annex_destroyed_my_git_directory'
+$ ls -a
+. .. config
+"""]]
+
+### What version of git-annex are you using? On what operating system?
+dpkg -l git-annex reports 5.20141024
+
+I am running Debian sid.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn b/doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn
@@ -0,0 +1,28 @@
+### Please describe the problem.
+
+i can't find a key in the JSON output of `git annex info` for the "transfer in progress" field. is it missing on purpose? or am I missing some field?
+
+### What steps will reproduce the problem?
+
+<pre>
+git annex info
+git annex info --json
+</pre>
+
+
+### What version of git-annex are you using? On what operating system?
+5.20150406-g2a9fbec debian jessie
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+anarcat@desktop008:mp3$ git annex info  --fast --json | grep -i transfer
+anarcat@desktop008:mp3$ git annex info  --fast | grep -i transfer
+transfers in progress:
+
+# End of transcript or log.
+"""]]
+
+[[anarcat]]
diff --git a/doc/bugs/transfer_lock_file_removal_bug.mdwn b/doc/bugs/transfer_lock_file_removal_bug.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/transfer_lock_file_removal_bug.mdwn
@@ -0,0 +1,61 @@
+There's a race that can result in 2 concurrent downloads
+of the same key. This can happen because the transfer lock files get
+deleted after a transfer completes.
+
+Scenario:
+
+1. first process creates lock file, takes lock, starts download
+2. second process opens existing lock file
+3. first process finishes/fails download, so deletes lock file, and then
+   drops lock
+4. second process takes lock (exclusive, non-blocking) of deleted file!
+5. third process sees no lock file, so creates a new one, takes lock,
+   starts download
+
+Worst-case, this might result in data loss, if the two concurrent
+downloaders confuse one-another. Perhaps the second one overwrites the file
+the first was downloading, and then the first, thinking it's written the
+file, moves it into the object directory.
+
+Note that the window between 4-5 can be as long as it takes for a
+file to download. However, the window between 2-4 is very narrow indeed,
+since the second process is not blocking on the lock.
+So, this is very unlikely to happen.
+
+But, it could. Can it be prevented?
+
+Yes: The second process, after taking the lock, can check that
+the lock file exists, and has the same dev and fileno as the fd it has
+locked. If the lock file doesn't exist, or is different, then the
+second process can give up.
+
+Oh BTW, this race cannot happen on windows, since on windows, an open lock
+file cannot be deleted by another process.
+
+> [[fixed|done]]
+
+Let's also consider if this change will allow for safely expiring stale 
+lock files..
+
+Situation before with expiry would have been buggy (which is why it never
+tried to expire them):
+
+1. first process creates lock file, takes lock, is interrupted (no more
+   lock)
+2. second process wants to delete stale lock file; checks if it's locked;
+   isn't
+3. third process opens existing lock file, prepares to take lock
+4. second process deletes lock file
+5. third process takes lock
+6. third process is now doing a transfer w/o a (visible) lock
+
+But, after this bug fix, the third process checks if it's lock file
+exists after taking the lock. Since the second process deleted it,
+the third process fails with an error "transfer in progress"
+which is perhaps not accurate, but at least it stopped.
+
+For this to work though, the second process needs to actually take
+the lock, in non-blocking mode. If it succeeds, it can keep the lock
+held while deleting the lock file. This ensures that when the third process
+takes the lock, the lock file will already be deleted by the time it checks
+if it's there.
diff --git a/doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn b/doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn
@@ -0,0 +1,40 @@
+### Please describe the problem.
+
+I added a remote repository, and it successfully tested the ssh connection to the server. Nothing happens, however, once it comes to actually creating the remote repository (or merging with an existing one). It'll just sit there forever, never actually connecting to the server.
+
+A quick look in process explorer shows something of what's going on: git-annex has launched ssh, and ssh is spamming subprocesses. It's launching ssh.exe which is launching git-annex.exe (yes, on the local machine.) It exits right away, but the command line is "C:\Program Files (x86)\Git\cmd\git-annex.exe" "Please type 'yes' or 'no': ". I've no idea why it's doing that though.
+
+If I kill that parent ssh process, I get this error message in the transcript:
+
+    Could not create directory '/home/db48x/.ssh'.
+
+This seems a bit dubious; both my local computer and the remote computer have a ~/.ssh directory.
+
+In order to rule out a problem with my local computer (an ancient install of Git or cygwin/msys or something, we've tried this on fresh computers which have never had git installed; we get exactly the same problem there.
+
+### What steps will reproduce the problem?
+
+Create or connect to a repository via SSH.
+
+### What version of git-annex are you using? On what operating system?
+
+Windows 7
+
+    Version: 5.20150420-gb0ebb23
+    Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA TorrentParser
+
+### Please provide any additional information below.
+
+While this is going on, the log has is showing that it's executing the following command:
+
+[[!format sh """
+[2015-04-28 22:34:16 Pacific Daylight Time] chat: ssh ["-oNumberOfPasswordPrompts=1","-p","22","db48x@eambar.db48x.net","sh -c 'mkdir -p '\"'\"'annex'\"'\"'&&cd '\"'\"'annex'\"'\"'&&if [ ! -d .git ]; then if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git init --bare --shared; else git init --bare --shared; fi && if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git config receive.denyNonFastforwards; else git config receive.denyNonFastforwards; fi ;fi&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '\"'\"'#!/bin/sh'\"'\"';echo '\"'\"'set -e'\"'\"';echo '\"'\"'if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"'\"'\"';echo '\"'\"'else'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$@\"'\"'\"';echo '\"'\"'fi'\"'\"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '\"'\"'command=\"env GIT_ANNEX_SHELL_DIRECTORY='\"'\"'\"'\"'\"'\"'\"'\"'annex'\"'\"'\"'\"'\"'\"'\"'\"' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiPFdIMyYCBmc14f9cUZaG36Zw+NziqX9Z+xGl5GAYq16nORxVc+70Bj+A9cHoHLzTMBJnw7G/f7xJNGbKNgKUPKZohT8AQfg8lnyK8qpyzI2dJB3R0vPBMPxZCBm4IOpdB6ad3B6dUiyNtyMn1hza7GVhIFOsHfGG+K3PGtFgwOz/Zj+2zmcZIL/BHObFsba/yhQxbsjLYPI7mmNV9CLb1+XcR0z2okWvxu28lOrcIXDAdEhp1cjjjpBhwTH1F8/gJcJ6ENBa4JiGt/oEKb1b/pXLaMX6dRjc/gYoy7z0Hw7RD73hH+UtPj5TAeKwoNdaVXdqSsVI+3ql+O5PFTxt db48x@caradhras\n'\"'\"' >>~/.ssh/authorized_keys'"]
+"""]]
+
+> This sounds like it's all down to the newer ssh from cygwin ignoring HOME
+> and trying to use /home/user which doesn't work very well outside cygwin.
+>
+> Since git-annex has switched to not include that ssh any longer, and
+> instead use the ssh that's bundled with msysgit, I think this bug is
+> closed. [[done]] Upgrading to the latest daily build should fix your
+> system's ssh. Please followup if I'm wrong. --[[Joey]]
diff --git a/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment b/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment
new file mode 100644
--- /dev/null
+++ b/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"
+ nickname="Jörn"
+ subject="Mount detection"
+ date="2012-09-21T09:23:34Z"
+ content="""
+regarding the current mount polling on OSX: why not use the NSNotificationCenter for being notified on mount events on OSX?
+
+Details see:
+
+1. <http://stackoverflow.com/questions/12409458/detect-when-a-volume-is-mounted-on-os-x>
+2. <http://stackoverflow.com/questions/6062299/how-to-add-an-observer-to-nsnotificationcenter-in-a-c-class-using-objective-c>
+3. <https://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFNotificationCenterRef/Reference/reference.html#//apple_ref/doc/uid/20001438>
+"""]]
diff --git a/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn b/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn
@@ -0,0 +1,34 @@
+It's possible for one git annex repository to configure a special remote
+that it makes sense for other repositories to also be able to use. Today I
+added the UI to support that; in the list of repositories, such
+repositories have a "enable" link.
+
+To enable pre-existing rsync special remotes, the webapp has to do the same
+probing and ssh key setup that it does when initially creating them.
+Rsync.net is also handled as a special case in that code. There was one
+ugly part to this.. When a rsync remote is configured in the webapp,
+it uses a mangled hostname like "git-annex-example.com-user", to
+make ssh use the key it sets up. That gets stored in the `remote.log`, and so
+the enabling code has to unmangle it to get back to the real hostname.
+
+---
+
+Based on the still-running [[prioritizing_special_remotes]] poll, a lot
+of people want special remote support for their phone or mp3 player.
+(As opposed to running git-annex on an Android phone, which comes later..)
+It'd be easy enough to make the webapp set up a directory special remote
+on such a device, but that makes consuming some types of content on the
+phone difficult (mp3 players seem to handle them ok based on what people tell
+me). I need to think more about some of the ideas mentioned in [[android]]
+for more suitable ways of storing files.
+
+One thing's for sure: You won't want the assistant to sync all your files
+to your phone! So I also need to start coming up with partial syncing
+controls. One idea is for each remote to have a configurable matcher for files
+it likes to receive. That could be only mp3 files, or all files inside a
+given subdirectory, or all files *not* in a given subdirectory. That means
+that when the assistant detects a file has been moved, it'll need to add
+(or remove) a queued transfer. Lots of other things could be matched on,
+like file size, number of copies, etc. Oh look, I have a
+[beautiful library I wrote earlier](http://joeyh.name/blog/entry/happy_haskell_hacker)
+that I can reuse!
diff --git a/doc/devblog/day_284__development.mdwn b/doc/devblog/day_284__development.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_284__development.mdwn
@@ -0,0 +1,33 @@
+Implemented `git annex drop --all`. This also added for free drop with
+`--unused` and `--key`, which overlap with `git annexdropunused` and
+`git annex dropkey`.
+
+The `concurrentprogress` branch had gone too long without being merged, and
+had a lot of merge conflicts. I resolved those, and went ahead and merged
+it into master. However, since the ascii-progress library is not ready yet,
+I made it a build flag, and it will build without it by default. So, `git
+annex get -J5` can be used now, but no progress bars will display yet.
+
+When doing concurrent downloads, either with the new -J or by hand by
+running multiple processes, there was a bug in the diskreserve
+checking code. It didn't consider the disk space that was in the process of
+being used by other concurrent downloads, so would let more downloads
+start up than there was space for.
+
+I was able to fix this pretty easily, thanks to the transfer log files.
+Those were originally added just to let the webapp display transfers, but
+proved very helpful here!
+
+Finally, made .git/annex/transfer/failed/ files stop accumulating when the
+assistant is not being used. Looked into also cleaning up stale
+.git/annex/transfer/{upload,download}/ files (from interrupted transfers).
+But, since those are used as lock files, it's difficult to remove them
+in a concurrency safe way.
+
+Update: Unfortunately, I turned out to have stumbled over an apparent bug
+in haskell's implementation of file locking.
+<https://github.com/haskell/unix/issues/44> Had to work around that.
+
+Happily, the workaround also let me implement cleanup of stale transfer
+info files, left behind when a git-annex process was interrupted. So,
+.git/annex/transfer/ will entirely stop accumulating cruft!
diff --git a/doc/devblog/day_285__tuning_git-annex_unused_refs.mdwn b/doc/devblog/day_285__tuning_git-annex_unused_refs.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_285__tuning_git-annex_unused_refs.mdwn
@@ -0,0 +1,20 @@
+Today I added a feature to `git annex unused` that lets the user tune which
+refs they are interested in using. Annexed objects that are used by other
+refs then are considered unused.
+
+Did a fairly complicated refspec format for this, with globs and
+include/exclude of refs. Example:
+
+	+refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag
+
+----
+
+I think that, since Google dropped openid support, there seems to have been
+less activity on this website. Although possibly also a higher signal to
+noise ratio. :) I have been working on some ikiwiki changes to make it
+easier for users who don't have an openid to contiribute. So git-annex's
+website should soon let you log in and make posts with just an email address.
+
+People sometimes ask for a git-annex mailing list. I wouldn't mind having
+one, and would certianly subscribe, but don't see any reason that I should
+be involved in running it.
diff --git a/doc/devblog/day_286-287__rotten_locks.mdwn b/doc/devblog/day_286-287__rotten_locks.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_286-287__rotten_locks.mdwn
@@ -0,0 +1,44 @@
+There's something rotten in POSIX fctnl locking. It's not composable,
+or thread-safe.
+
+The most obvious problem with it is that if you have 2 threads, and they
+both try to take an exclusive lock of the same file (each opening it
+separately) ... They'll both succeed. Unlike 2 separate processes,
+where only one can take the lock.
+
+Then the really crazy bit: If a process has a lock file open and fcntl
+locked, and then the same process opens the lock file again, for any
+reason, closing the new FD will release the lock that was set
+using the other FD.
+
+So, that's a massive gotcha if you're writing complex multithreaded code.
+Or generally for composition of code. Of course, C programmers deal with
+this kind of thing all the time, but in the clean world of Haskell, this is
+a glaring problem. We don't expect to need to worry about this kind of
+unrelated side effect that breaks composition and thread safety.
+
+After noticing this problem affected git-anenx in at least one place,
+I have to assume there could be more. And I don't want to need to worry
+about this problem forever. So, I have been working today on a clean fix
+that I can cleanly switch all my lock-related code to use.
+
+One reasonable approach would be to avoid fcntl locking, and use flock.
+But, flock works even less well on NFS than fcntl, and git-annex relies on
+some fcntl locking features. On Linux, there's an "open file description
+locks" feature that fixes POSIX fnctl locking to not have this horrible
+wart, but that's not portable.
+
+Instead, my approach is to keep track of which files the process has
+locked. If it tries to do something with a lockfile that it already has
+locked, it avoids opening the same file again, instead implements its own
+in-process locking behavior. I use STM to do that in a thread-safe manner.
+
+I should probably break out git-annex's lock file handling code as a
+library. Eventually.. This was about as much fun as a root canal, and I'm
+having a real one tomorrow. :-/
+
+----
+
+git-annex is now included in [Stackage](http://www.stackage.org/)!
+
+Daniel Kahn Gillmor is doing some work on reproducible builds of git-annex.
diff --git a/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment b/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment
new file mode 100644
--- /dev/null
+++ b/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://pnijjar.livejournal.com/"
+ ip="99.236.22.229"
+ subject="comment 1"
+ date="2013-08-31T00:05:16Z"
+ content="""
+Do we need to update our RSS feeds? I appear to be getting your devblog posts in my old feed, but I do not know whether that will continue working.
+"""]]
diff --git a/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment b/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment
new file mode 100644
--- /dev/null
+++ b/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"
+ nickname="develop"
+ subject="comment 2"
+ date="2013-08-31T10:03:04Z"
+ content="""
+The old RSS feed will continue working.
+
+So sit back, relax, and enjoy the show.
+"""]]
diff --git a/doc/feeds.mdwn b/doc/feeds.mdwn
deleted file mode 100644
--- a/doc/feeds.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-Aggregating git-annex mentions from elsewhere on the net..
-
-* [[!aggregate expirecount=25 name="twitter" feedurl="http://tmp.kitenet.net/git-annex-twitter.rss" url="http://search.twitter.com/search.atom?q=git-annex"]]
-
diff --git a/doc/forum/Ambiguous_repo_names__63__.mdwn b/doc/forum/Ambiguous_repo_names__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Ambiguous_repo_names__63__.mdwn
@@ -0,0 +1,8 @@
+The output of `git annex info` includes this:
+
+ 	34xx3351-xx14-4039-6xxx-xxx9x5xxxxxx -- wx550 (wx312)
+ 	9x9x07xx-x6x9-464x-7x5x-x3xx42xx7x70 -- wx550
+
+What does this mean? Do I have two different repos both named wx550?
+What is wx312? 
+
diff --git a/doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn b/doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn
@@ -0,0 +1,14 @@
+Hi, I'm using the webapp and created a repository on my local computer. Then I created another remote repository (encrypted remote with gcrypt), this remote repository is selected as type "full backup". 
+
+I've added some files to the local repository, then changed some of them and watched the sync happen. Then I deleted some files, and these also get synced to the remote.
+
+Now, how can I recover those files from the foreign repo, using the webapp or the command line? I could not find any solution.
+
+I tried:
+git log --diff-filter=D --summary
+and then
+git checkout 488408bfcd58eced685d9e3ca5daf55250850f5d -- .
+to recover the file listed in this remote but got the following response:
+fatal: This operation must be run in a work tree
+
+What do I miss and how does the "Restore" part work when using "full backup" remote repository?
diff --git a/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn
@@ -0,0 +1,9 @@
+I have a repository on my laptop with a single remote on a USB drive. Both were created without the assistant.
+
+The remote holds all the content. My understanding is that this would be a "backup" repository, using the group definitions.
+
+The local repository generally holds no content. When I want a file, I make sure the remote is available, and then I `git annex get` it.
+
+This works fine in git annex, but I'm now experimenting with the assistant. As soon as I fire up the assistant, it starts downloading all of the data from the remote. I don't ever want it to automatically get any content from the remote. If it sees new content in the repository, I would like it to push that out to the remote. But never get anything from the remote, and never drop anything that is in the repository.
+
+How can I setup this behaviour in the assistant? I have set the remote's repository group to "backup". The local repository is not in any group, since none of the groups fit my model for this repo.
diff --git a/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment b/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"
+ nickname="Josef"
+ subject="wishlist"
+ date="2013-09-26T11:11:19Z"
+ content="""
+Posted the above yesterday before realizing that it should probably go to wishlist requests. I am sorry about that.
+
+Basically it is a request to extend import options and perhaps make the options easier to use/understand.
+
+Suggested Import Options:
+
+- source directory,
+- destination directory,
+- deduplicate in annex ( yes, no )
+- delete source files ( yes, no )
+- trial run ( screen output only )
+
+Many thanks for a great product!
+
+"""]]
diff --git a/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment b/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"
+ nickname="Josef"
+ subject="Additional Comments"
+ date="2013-09-30T21:33:31Z"
+ content="""
+Imported several thousand files to annex and would like to add the following comments:
+
+- it would be great to have an option to exclude hidden dot files from import,
+
+- empty directories should be deleted when files located in the directories are deleted,
+
+- \"git annex add\" seems to process directories and files alphabetically, unfortunately import processes files in a different order, which makes it hard to predict which files are deleted when deduplicating,
+
+Cheers,
+
+"""]]
diff --git a/doc/forum/Invalid_cross-device_link.mdwn b/doc/forum/Invalid_cross-device_link.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Invalid_cross-device_link.mdwn
@@ -0,0 +1,9 @@
+I want to import from an SD card to a mounted annex:
+
+    user@laptop:/media/.../annex/Pictures/(master)$ git annex import /media/.../sdcard/Download/QuickTransfer
+    [...]
+    git-annex: /media/.../sdcard/Download/QuickTransfer/20150428_192110.jpg: rename: unsupported operation (Invalid cross-device link)
+    [...]
+
+Why is it trying to make a cross-device link? As long as it can read the files, 
+it should be OK, no?
diff --git a/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment b/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.47"
+ subject="comment 1"
+ date="2013-11-05T16:17:22Z"
+ content="""
+In the git-annex webapp, each repository has a settings menu with \"delete repository\".
+"""]]
diff --git a/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment b/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"
+ nickname="dxtrish"
+ subject="comment 2"
+ date="2013-11-05T17:46:02Z"
+ content="""
+When I use that Delete button it seems to still have records of it
+because when I delete the repo on the other end and create a new bare
+one it complains about some UUID mismatch.
+"""]]
diff --git a/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment b/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.47"
+ subject="comment 3"
+ date="2013-11-05T18:03:26Z"
+ content="""
+Hmm well, it's true that deleting a repository does not clean out any git remotes that other repositories might have configured using it, and the uuid of the old remote is cached in there. This is only a problem if you put back another repository in the same location as the old one. `git remote remove` should clean that up for you.
+"""]]
diff --git a/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment b/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"
+ nickname="dxtrish"
+ subject="comment 4"
+ date="2013-11-06T14:24:21Z"
+ content="""
+That is exactly what I have wanted to do a couple of times now and 'git remote remove' does not seem to remove it all either.
+When I try to create a new repository in the same place it still complains about that darn UUID :)
+
+What is working is to manually add the new UUID to .git/config
+"""]]
diff --git a/doc/forum/Symlink_points_to_old_version.mdwn b/doc/forum/Symlink_points_to_old_version.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Symlink_points_to_old_version.mdwn
@@ -0,0 +1,13 @@
+Hello everyone,
+
+I have some PDF documents in a git annex repository. I appended a page to (several) of these PDF documents the following way:
+
+- `git annex edit file.pdf`
+- Append page to file.pdf
+- `git annex add file.pdf`
+- `git commit`
+
+If I now look at file.pdf it will not have the appended page. But if do `git annex edit file.pdf` again I will get the version with the appended page. `git annex add file.pdf` and the page "disappears" again. Anyone got any tips on how to solve this "mystery"?
+
+All the best,
+Per
diff --git a/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn
@@ -0,0 +1,11 @@
+Hello Joey,
+
+I just want to know if file transfers between three inter-connected repositories somehow gets syncronized. I have a laptop, a local file server in my home and a virtual server on the internet.
+
+Both my laptop and my file server are configured with a full git repository and connected through pairing and xmpp. The server on the internet is configured as a rsync special remote.
+
+I want the local file server to hold a copy of everything in my annex, the rsync remote should get everything except the folder "media" (too large to upload and not that important) and the laptop whatever I manually decide (preferred content is set to "present").
+
+I have added some files to the repository on the local file server and transferred their content to my laptop by using "git annex get". But when I started the web interface, I saw that those files who are present on both the file server and on the laptop get uploaded to the remote server from both computers, often the same file at the same time. Previously I though the two assistants would somehow talk to each other via xmpp so that doubled effort like that would be avoided. I'm also worried about data consistency because two apparently separate processes rsync to the same remote repository at the same time.
+
+So my question would be: Is your xmpp protocol designed to deal with situations like this and I did not set it up correctly or is what I'm trying to accomplish simply not (yet) possible?
diff --git a/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn b/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn
@@ -0,0 +1,5 @@
+I'm looking to use the Git-Annex Assistant to backup a single repository that is present on and synced between two computers (a home and a working computer). Ideally, each computer uses rsync.net for both of these service, while at the same time treating the cloud storage service as untrusted (so anything stored or tranferred through there is encrypted). Is it possible to do this using solely rsync.net (without the addition of some XMPP service)? According to the software, using shared encryption allows anyone with a clone of the repository to decrypt files on a remote, but the simplest way to make this clone seems to be to first clone to a removable drive, and then from the drive to the second computer (and then deleting the records of the clone to the drive). I'm unsure if by then setting up the backup at rsync.net for the second computer, whether the software will create a second backup that acts independently of the first, neglecting any syncing, or if it will recognize the backup as one of the same repository. I'm also unsure as to whether the software will even sync if the backup is recognized, or whether a tranfer repository at rsync.net is also necessary to complete the setup. Could you perhaps give me some advice on how to achieve this setup, or point me to some information that may help me along?
+
+(If the setup is unclear, I'm essentially trying to replicate something like SpiderOak with the Git-Annex Assistant, without using an XMPP service)
+
+[Edit: It may be easier to just use Git-Annex (no assistant), so that works too]
diff --git a/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment b/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.1.10"
+ subject="comment 1"
+ date="2013-07-22T19:13:38Z"
+ content="""
+To build the WebApp on arm, you need a ghc that supports template haskell on arm. While I have heard persistent rumors of such a thing existing, I have yet to see it.
+
+It's possible to build the WebApp on arm without that, but it's a complicated process, involving first building on x86 with the same versions of the haskell libraries that you have on the arm system, and then using the EvilSplicer to generate a source tree with the template haskell expanded, which can then be built on arm. This build process is not really suitable for a Debian package.
+"""]]
diff --git a/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn
@@ -0,0 +1,19 @@
+
+So much time gone by after the kickstarter and now I wanted to give it a kick finally.
+I set up everything on my linux desktop with no problems at all.
+
+I configured a ssh remote with shared encryption key.
+
+Then I tried to use this to share files with a windows Desktop. This is where problems started.
+
+1. Since there is no jabber sync I need to exchange keys manually. But although I read and googled for hours I just found that it would be there in the git repo somewhere in plain text. I didnt find a command to actually display it on the command line.
+2. I need to setup the (existing) ssh remote on windows manually, because I could not make the webapp recognize the ssh-keys from pageant. Also, unfortunately, all examples refer to s3. I didnt even find out which type I had to specify. There seems to be no comprehensive list of repository types for the cmdline and their required arguments respectively at all. The man page says "type=..." for the three-line description of shared encryption setups which appeared like a mockery to me. Since the remote does not have git metadata I also can not use git clone.
+3. The docs say initremote would only be used on fresh remotes, not existing ones. But enableremote only enables remotes that are already configured. So what am I to do here?
+
+Could someone tell me please
+
+1. How to find the shared key
+2. How to add the ssh remote properly
+3. Where 1 and 2 are documented
+
+Thank you!
diff --git a/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment b/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 10"
+ date="2014-09-18T17:27:36Z"
+ content="""
+In the meantime, I've been looking over the Annex.Branch code. 
+
+`stageJournal` is only ever called in code paths that commit the updated index, so those code paths cannot result in dangling objects unless git-annex is interrupted before it can commit. (This may explain some of my own repos having a few dangling refs, that were not commits; I could have ctrl-c'd git-annex.)
+
+It's possible for a forced update of the local git-annex branch, done by eg a push from another repo, to overwrite a commit made to it. In this case, the git-annex index is merged with the branch, resulting in a new commit, and the old commit that was overwritten will indeed be dangling. However, `git annex sync` doesn't overwrite the git-annex branch; it pushes to synced/git-annex, or does a `taggedPush` to a private ref. It is the case that both those pushes are forced pushes, so can overwrite a branch ref and leave the old commit it pointed to dangling. In the case of `taggedPush`, the old commit should be a parent of the new, so it won't dangle. In the case of synced/git-annex being overwritten, the old commit could dangle, but only until whatever repo pushed it syncs again, at which time it should get incorporated as one of the parents of the new synced/git-annex it pushes. So, I don't see how long-term dangling commits could happen this way, except for in the case where a repository stops syncing/goes missing/rebases its git-annex branch (ie, git-annex forget is used). (This may explain the 2 dangling commits I found on elephant; we did delete some clones of that repository recently.)
+
+At this point I'm not convinced that the dangling objects I found in my own repos are due to some systematic problem, the above seems like it could explain them, and the above is not a problem on the class of the one Rasmus is having. Of course, it's hard to be sure you've spotted all possible ways that a resource leak can happen, and that's what these dangling objects basically are.
+"""]]
diff --git a/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment b/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 11"
+ date="2014-09-18T17:32:09Z"
+ content="""
+I knew I *had* used \"Initial commit\" somewhere ... etckeeper uses that message. And commits as root. Could an etckeeper repo have somehow gotten merged into your git-annex repo? Seems strange, and the filenames and contents don't really look like /etc to me, but it otherwise somewhat fits.
+"""]]
diff --git a/doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment b/doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment
@@ -0,0 +1,71 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="146.185.23.178"
+ subject="comment 12"
+ date="2014-09-19T00:43:56Z"
+ content="""
+Hi Joey,
+
+Thanks for giving the thread a more appropriate title and thanks for the helpful messages. 
+
+Let me start with the easy points:
+
+
+* Looking at my log file of installed packages I have never used `etckeeper` on my system.  So unless it could have entered through `annex` then I think we can rule that one out. 
+* According to `git log` the repos are from January 2014 where I restarted my repos. 
+
+
+        commit 029a8e76ab5f66aa4390987130985550a1ccd69c
+        Author: Rasmus <w530@domain.eu>
+        Date:   Thu Jan 23 21:06:13 2014 +0100
+
+        created repository
+
+
+* When I start git repos I typically just use \"init\" so I don't think I did the 2012 commits. 
+* I checked out one of the 74mb files.  When I do `file test.blob` it shows `test.blob: GPG symmetrically encrypted data (CAST5 cipher)`.  But none of my normal passwords worked.  Could such a gpg'ed file be from local network connections where the assistant asks for a passphrase?  I'm pretty sure that my transfer repo has only been using `gcrypt` and I believe I \"restarted\" my repos because I switched to `gcrypt` repos.  Also, my transfer repo is 10Gb as well which sounds big for transfer repo. 
+
+I performed a similar \"analysis\" on the `conf.annex` repo which should contain mostly no binary files (some 16x16 pngs etc).  
+
+`conf.annex` has 727 unreachable objects and 3477 commits in total.  Of these 338 are commits.  Here's an example of a larger commit message of an unreachable commit.
+
+    commit 601c10f9512e8d3502d9dd52ef409560ebb5b7e0
+    Author: root <root@localhost>
+    Date:   Mon Dec 31 19:00:01 2012 -0400
+
+         Initial commit
+
+     diff --git a/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5
+     new file mode 100644
+     index 0000000..ea5fcc3
+     Binary files /dev/null and b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 differ
+     diff --git a/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a
+     new file mode 100644
+     index 0000000..a86c1a9
+     Binary files /dev/null and b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a differ
+     diff --git a/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194
+     new file mode 100644
+     index 0000000..ef1d71c
+     Binary files /dev/null and b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 differ
+     diff --git a/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594
+     new file mode 100644
+     index 0000000..61d3e5b
+     Binary files /dev/null and b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 differ
+     diff --git a/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc
+     new file mode 100644
+     index 0000000..92e9bd7
+     Binary files /dev/null and b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc differ
+
+Across all commits 6006 objects are mentioned, but only 371 are unique. 
+
+I checked out one blob and again `file` reports `GPG symmetrically encrypted data (CAST5 cipher)`.  Interesting for `conf.annex` I get this line when trying to decrypt
+
+    gpg: DBG: cleared passphrase cached with ID: SBF83A0F822D0F664
+
+
+For `doc.annex` I get
+
+    gpg: DBG: cleared passphrase cached with ID: S32DEAD1E8DD06A4D
+
+And on my other computer I see a third ID.  I'm not sure if this means anything when files are symmetrically encrypted, though. 
+"""]]
diff --git a/doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment b/doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="I know what it is now"
+ date="2014-09-19T02:43:22Z"
+ content="""
+These objects are the ones written by git-remote-gcrypt when pushing to a remote. That's why the weird dates, root pseudo-commit, crazy filenames, and big gpg encrypted blobs. All countermeasures that git-remote-gcrypt uses to keep your encrypted git remote safe and not leak information about what's in it.
+
+So, this is a bug in git-remote-gcrypt. It needs to clean these objects up after pushing them! (Also after failed pushes.)
+"""]]
diff --git a/doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment b/doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 14"
+ date="2014-09-19T02:59:36Z"
+ content="""
+<https://github.com/bluss/git-remote-gcrypt/issues/16>
+"""]]
diff --git a/doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment b/doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="217.130.110.20"
+ subject="comment 15"
+ date="2014-09-19T06:29:58Z"
+ content="""
+Brilliant!  Thanks for taking time to analyze the issue and taking the bug to `gcrypt`.
+
+[I'm surprised that a different key than my git-annex key is used and that it's a symmetric key, but I will explore the technology on my own].
+"""]]
diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn
@@ -0,0 +1,15 @@
+I keep a repo synced between machines over ssh. Assuming all the files are in sync, so no actual file transfer needs to takes place, when I do
+
+```
+git annex copy --fast --quiet --to blah
+```
+
+is quite slow, about 10 seconds, using 100% CPU on one core, just to decide nothing needs to be done. On the other hand, doing
+
+```
+  git annex copy --fast --quiet --from blah
+```
+
+takes about 1 second.
+
+I'm confused, as it seems to me that, since I'm using --fast, both transactions should use only locally available data, and both should need about the same amount of computing. Am I missing something? Can this be fixed?
diff --git a/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn b/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn
@@ -0,0 +1,6 @@
+I propose to add some functionality to git-annex, to automatically "throttle" the data retrieval from amazon glacier to stay within the daily free retrieval allowance. If someone would need to get his/her files faster, there should be an option to disable this throttling (or even better, specify the retrieval rate).
+
+As far as I understand glacier, this could be implemented using range retrievals. In short range retrievals enable you, to only retrieve a part of an archive in glacier. This can be used to only retrieve / request so much data, that you stay within the free retrieval allowance. ( please see [Q: Why would I retrieve only a range of an archive?](http://aws.amazon.com/glacier/faqs/#Why_would_I_retrieve_only_a_range_of_an_archive) ).
+
+
+This would be somewhat similar to the [smart retrieval feature in cloudberry](http://blog.cloudberrylab.com/2012/12/introducing-smart-restore-for-amazon.html) .
diff --git a/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn
@@ -0,0 +1,5 @@
+I fear that while using git annex I will at some point accidentally `git add` some small files and not notice it until the only way to fix the problem is to rewrite history. What would be the best way to prevent myself from ever `git add`-ing a file into my annex repository instead of `git annex add`-ing it?
+
+And secondly, how can I best search in my git annex repository whether I already did this mistake in the past or not? Currently I'm using this which returns everything that's not a symlink or a git submodule:
+
+    git ls-files -s | awk ' $1 != 120000 && $1 != 160000 { print $4 }'
diff --git a/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn
@@ -0,0 +1,3 @@
+A couple times working in an annex manually, I accidentally did "git add" instead of "git annex add" and ended up with files checked into my repo instead of symlinks.  So now there is some file content in git, rather than in the annex.  Is there any way to root that out, or is it there forever?  (My limited knowledge of git says: it's there forever, unless maybe you go into the branches where it lives, do an interactive rebase to the time before it was added, remove that commit, replay history, and then garbage collect, but I have no idea if that would suddenly break git annex, and it sounds painful anyway.)
+
+If say I were a neat freak and wanted to just start over with a clean annex, I imagine the thing to do would be to just start the hell over -- and if I wanted to do that, the way to go would be to get into a full repository, do a "git annex uninit" and then throw away the .git directory, then do "git init" and "git annex init" and then "git annex add ." ?
diff --git a/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn
@@ -0,0 +1,2 @@
+Is that really unsafe?  Because I did that and the switch to direct mode seemed to leave a lot of files still as links, and when I panicked and switched back to indirect mode, a whole lot of stuff seemed to have become unannexed and I reannexed it.
+
diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn
@@ -0,0 +1,27 @@
+I am running git-annex on Mac OS 10.9 and syncing to a Linux device that was attached to a Synology NAS.  Both were running December versions of git-annex.
+
+While working on an application in IntelliJ my workspace.xml file disappeared.  It went from being a real file to being a symlink to a location that didn't exist.
+
+The symlink looks like this: workspace.xml -> ../../../.git/annex/objects/M2/8W/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml
+
+I tried git-annex fsck and I get this message: ** No known copies exist of XXXXXXX/workspace.xml
+
+"XXXXXXX" is a path I needed to obscure I can see it in the git-annex repo but it is a reference to a symlink that doesn't exist
+
+It was mentioned in another thread ( http://git-annex.branchable.com/forum/git_annex_on_osx_only_creating_symlinks__63____63__/ ) that this could happen if I did a forced drop but I do not use git-annex on the command line.  I'm using the assistant and having it manage all of my files for me.
+
+I tried looking at the log for it and it shows this:
+
+<pre>
+timmattison$ /Applications/git-annex.app/Contents/MacOS/git-annex log XXXXXXX/.idea/workspace.xml 
+- 2014-01-03 19:49:58 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex
++ 2014-01-03 17:08:32 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex
+(Recording state in git...)
+</pre>
+
+So I can see that the git-annex thinks the file was deleted but what really happened is that IntelliJ just modified it.  workspace.xml files are modified very often when working in IntelliJ.
+
+Is this a known bug that has been fixed in the new version (2013-12-30 or later)?
+
+Thanks,
+Tim
diff --git a/doc/git-annex-copy.mdwn b/doc/git-annex-copy.mdwn
--- a/doc/git-annex-copy.mdwn
+++ b/doc/git-annex-copy.mdwn
@@ -24,6 +24,11 @@
   Use this option to copy the content of files from the local repository
   to the specified remote.
 
+* `--jobs=N` `-JN`
+
+  Enables parallel transfers with up to the specified number of jobs
+  running at once. For example: `-J10`
+
 * `--auto`
 
   Rather than copying all files, only copy files that don't yet have
diff --git a/doc/git-annex-drop.mdwn b/doc/git-annex-drop.mdwn
--- a/doc/git-annex-drop.mdwn
+++ b/doc/git-annex-drop.mdwn
@@ -35,6 +35,21 @@
   the last repository that is storing their content. Data loss can
   result from using this option.
 
+* `--all`
+
+  Rather than specifying a filename or path to drop, this option can be
+  used to drop all available versions of all files.
+
+  This is the default behavior when running git-annex drop in a bare repository.
+
+* `--unused`
+
+  Drop files found by last run of git-annex unused.
+
+* `--key=keyname`
+
+  Use this option to drop a specified key.
+
 * file matching options
 
   The [[git-annex-matching-options]](1)
diff --git a/doc/git-annex-get.mdwn b/doc/git-annex-get.mdwn
--- a/doc/git-annex-get.mdwn
+++ b/doc/git-annex-get.mdwn
@@ -27,6 +27,11 @@
   
   Any files that are not available on the remote will be silently skipped.
 
+* `--jobs=N` `-JN`
+
+  Enables parallel download with up to the specified number of jobs
+  running at once. For example: `-J10`
+
 * `--all`
 
   Rather than specifying a filename or path to get, this option can be
diff --git a/doc/git-annex-mirror.mdwn b/doc/git-annex-mirror.mdwn
--- a/doc/git-annex-mirror.mdwn
+++ b/doc/git-annex-mirror.mdwn
@@ -31,6 +31,11 @@
   Use the remote as the source repository, and mirror its contents to the local
   repository.
 
+* `--jobs=N` `-JN`
+
+  Enables parallel transfers with up to the specified number of jobs
+  running at once. For example: `-J10`
+
 * `--all`
 
   Mirror all objects stored in the git annex, not only objects used by
diff --git a/doc/git-annex-move.mdwn b/doc/git-annex-move.mdwn
--- a/doc/git-annex-move.mdwn
+++ b/doc/git-annex-move.mdwn
@@ -22,6 +22,11 @@
   Use this option to move the content of files from the local repository
   to the specified remote.
 
+* `--jobs=N` `-JN`
+
+  Enables parallel transfers with up to the specified number of jobs
+  running at once. For example: `-J10`
+
 * `--all`
 
   Rather than specifying a filename or path to move, this option can be
diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn
--- a/doc/git-annex-shell.mdwn
+++ b/doc/git-annex-shell.mdwn
@@ -38,6 +38,10 @@
   This checks if all specified keys are present in the annex, 
   and exits zero if so.
 
+  Exits 1 if the key is certianly not present in the annex.
+  Exits 100 if it's unable to tell (perhaps the key is in the process of
+  being removed from the annex).
+
 * dropkey directory [key ...]
 
   This drops the annexed data for the specified keys.
diff --git a/doc/git-annex-undo.mdwn b/doc/git-annex-undo.mdwn
--- a/doc/git-annex-undo.mdwn
+++ b/doc/git-annex-undo.mdwn
@@ -15,7 +15,7 @@
 contents of that directory.
   
 Running undo a second time will undo the undo, returning the working
-tree to the same state it had before. In order for undoing an undo of
+tree to the same state it had before. To support undoing an undo of
 staged changes, any staged changes are first committed by the
 undo command.
 
diff --git a/doc/git-annex-unused.mdwn b/doc/git-annex-unused.mdwn
--- a/doc/git-annex-unused.mdwn
+++ b/doc/git-annex-unused.mdwn
@@ -26,7 +26,40 @@
 
 * `--from=remote`
 
-  Check for unused data on a remote.
+  Check for unused data that is located on a remote.
+
+* `--used-refspec=+ref:-ref`
+
+  By default, any data that the work tree uses, or that any refs in the git
+  repository point to is considered to be used. If you only want to use
+  some refs, you can use this option to specify the ones to use. Data that
+  is not in the specified refs (and not used by the work tree) will then be
+  considered unused.
+
+  The git configuration annex.used-refspec can be used to configure
+  this in a more permanent fashion.
+
+# REFSPEC FORMAT
+
+The refspec format for --used-refspec is a colon-separated list of
+additions and removals of refs. For example:
+
+	+refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag
+
+This adds all refs/heads/ refs, as well as the previous version
+of HEAD. It also adds all tags, except for old-tag.
+
+This refspec is processed by starting with an empty set of refs,
+and walking the list in order from left to right.
+
+* Each + using a glob is matched against all relevant refs
+  (a subset of `git show-ref`) and all matching refs are added
+  to the set.
+  For example, "+refs/remotes/*" adds all remote refs.
+* Each + without a glob adds the literal value to the set.
+  For example, "+HEAD^" adds "HEAD^".
+* Each - is matched against the set of refs accumulated so far.
+  Any matching refs are removed from the set.
 
 # SEE ALSO
 
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -813,6 +813,11 @@
   When importfeed is used, it stores additional metadata from the feed,
   such as the author, title, etc.
 
+* `annex.used-refspec`
+
+  This controls which refs `git-annex unused` considers to be used.
+  See REFSPEC FORMAT in [[git-annex-unused]](1) for details.
+
 * `annex.queuesize`
 
   git-annex builds a queue of git commands, in order to combine similar
diff --git a/doc/index.mdwn b/doc/index.mdwn
--- a/doc/index.mdwn
+++ b/doc/index.mdwn
@@ -2,12 +2,6 @@
 
 [[!sidebar content="""
 [[!inline feeds=no template=bare pages=sidebar]]
-
-[[Feeds]]:
-
-<small>
-[[!inline pages="internal(feeds/*)" archive=yes show=8 feeds=no]]
-</small>
 """]]
 
 <table>
diff --git a/doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment b/doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU"
+ nickname="Daniel"
+ subject="comment 3"
+ date="2013-01-15T15:22:43Z"
+ content="""
+Installing via the MacPorts method. I ran into this error.
+
+    \"_locale_charset\", referenced from: _localeEncoding in libHSbase-4.5.1.0.a(PrelIOUtils.o) 
+    ld: symbol(s) not found for architecture x86_64
+
+I was able to solve and get git-annex to build buy providing the --extra-lib-dirs parameter
+
+    cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib
+
+Cheers, [Daniel Wozniak](http://woz.io)
+"""]]
diff --git a/doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment b/doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"
+ nickname="Pere"
+ subject="Segmentation Fault"
+ date="2013-01-19T16:10:08Z"
+ content="""
+I guess my adventure ends here. :'(
+"""]]
diff --git a/doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment b/doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc"
+ nickname="Eric"
+ subject="Updating to latest build"
+ date="2013-01-25T06:05:35Z"
+ content="""
+What is the appropriate way to update to the latest build of git-annex using cabal?
+"""]]
diff --git a/doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment b/doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"
+ nickname="Pere"
+ subject="git annex on Snow Leopard"
+ date="2013-01-25T14:36:52Z"
+ content="""
+Is there any way I can try to solve or by-pass the Segmentation Fault I commeted before? 
+"""]]
diff --git a/doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment b/doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.3.125"
+ subject="comment 13"
+ date="2013-02-05T19:46:29Z"
+ content="""
+@eric `cabal update && cabal upgrade git-annex`
+"""]]
diff --git a/doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment b/doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmCmNS-oUgYfNg85-LPuxzTZJUp0sIgprM"
+ nickname="Jonas"
+ subject="more homebrew"
+ date="2013-02-16T19:46:47Z"
+ content="""
+i had macports installed. then i installed brew, instaled haskell via brew. i needed to set 
+    PATH=$HOME/bin:/usr/local/bin:$PATH
+"""]]
diff --git a/doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment b/doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~wincus"
+ nickname="Juan Moyano"
+ subject="git annex on Snow Leopard"
+ date="2013-03-26T16:02:54Z"
+ content="""
+I'm having the same issue as @Pere, with a newer version of DAV :(
+
+cabal: Error: some packages failed to install:
+DAV-0.3.1 failed during the building phase. The exception was:
+ExitFailure 11
+git-annex-4.20130323 depends on shakespeare-css-1.0.3 which failed to install.
+persistent-1.1.5.1 failed during the building phase. The exception was:
+ExitFailure 11
+persistent-template-1.1.3.1 depends on persistent-1.1.5.1 which failed to
+install.
+shakespeare-css-1.0.3 failed during the building phase. The exception was:
+ExitFailure 11
+yesod-1.1.9.2 depends on shakespeare-css-1.0.3 which failed to install.
+yesod-auth-1.1.5.3 depends on shakespeare-css-1.0.3 which failed to install.
+yesod-core-1.1.8.2 depends on shakespeare-css-1.0.3 which failed to install.
+yesod-default-1.1.3.2 depends on shakespeare-css-1.0.3 which failed to
+install.
+yesod-form-1.2.1.3 depends on shakespeare-css-1.0.3 which failed to install.
+yesod-json-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.
+yesod-persistent-1.1.0.1 depends on shakespeare-css-1.0.3 which failed to
+install.
+yesod-static-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.
+
+
+
+*Any ideas?*
+
+
+"""]]
diff --git a/doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment b/doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment
@@ -0,0 +1,36 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"
+ nickname="Bret"
+ subject="Snow Leopard Issues"
+ date="2013-04-14T20:17:17Z"
+ content="""
+I was able to build snow leopard completely for the first time over last night (it took a very long time to build all the tools and dependancies).  Woohoo!
+
+The way I was able to fully build on a 32-bit 10.6 machine was this
+
+1. Delete ~/.ghc and ~/.cabal.  They were full of random things and were causing problems.
+2. `brew uninstall ghc and haskell-platform`
+3. `brew update`
+4. `brew install git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2`
+5. `brew upgrade git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2` (Some of these were already installed/up to date.
+6. `brew link libxml2`
+7. `brew install haskell-platform`  (This takes a long, long time).
+8. `cabal update` (assuming you have added `~/.cabal/bin` to your path
+9. `cabal install cablal-install`
+10. `cabal install c2hs`
+11. `cabal install git-annex`
+
+
+It also appears to be running fairly smoothly than it had in the past on a 32-bit SL system.  Thats also neat.  
+
+The problem is that it seems to not really work as git annex though, probably due to the error relating you get when you start up the webapp:
+Running
+`git annex webapp` 
+The browser starts up, and I get 3 of these errors:
+`Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents`
+
+Pairing with a local computer appears to work to systems running 10.7, but when you complete the process, they never show up in the repository list.
+
+
+Also on a side note, when running `git annex webapp` it triggers the opening of an html file in whatever the default html file handler is.  I edit a lot of html, so for me that is usually a text editor.  I had to change the file handler to open html files with my web browser for the `git annex webapp` to actually work.  Is there a way to change that so that `git annex webapp` uses the default web browser for the system rather than the default html file handler?
+"""]]
diff --git a/doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment b/doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 17"
+ date="2013-04-16T20:31:10Z"
+ content="""
+@Bret, the assistant relies on FSEvents pretty heavily. It seems to me your best bet is to upgrade OSX to a version that supports FSEvents.
+
+You can certainly use the rest of git-annex on Snow Leopard without FSEvents.
+"""]]
diff --git a/doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment b/doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"
+ nickname="Bret"
+ subject="Can't update"
+ date="2013-04-18T00:58:19Z"
+ content="""
+The laptop is one of the first macbook pro's with a 32 bit chip, which apple dropped support for in 10.7, so the furthest it can update to is 10.6.x. :(
+"""]]
diff --git a/doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment b/doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://edheil.wordpress.com/"
+ ip="99.54.57.201"
+ subject="comment 19"
+ date="2013-04-18T02:05:34Z"
+ content="""
+sounds like a prime candidate for a nice lightweight linux distro ;)
+"""]]
diff --git a/doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment b/doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"
+ nickname="Andrew"
+ subject="comment 22"
+ date="2013-07-25T02:19:53Z"
+ content="""
+Rather than specifying --bindir on the command line for cabal, I edited my ~/.cabal/config to add this line:
+
+    symlink-bindir: /usr/local/bin
+
+This installs the binaries to ~/.cabal/bin but symlinks them into /usr/local/bin alongside the links that homebrew installs. Additionally, I symlinked /usr/local/bin/git-annex-shell to /usr/local/bin/git-annex which made things work great from remote hosts via ssh.
+"""]]
diff --git a/doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment b/doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg"
+ nickname="Kristian"
+ subject="Build failure using Haskel Platform"
+ date="2013-09-15T18:49:01Z"
+ content="""
+I get this error when I try to build git-annex using \"cabal install git-annex\"
+
+    [ 34 of 347] Compiling Utility.Misc     ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )
+    [ 35 of 347] Compiling Utility.Process  ( Utility/Process.hs, dist/build/git-annex/git-annex-tmp/Utility/Process.o )
+    [ 36 of 347] Compiling Utility.Network  ( Utility/Network.hs, dist/build/git-annex/git-annex-tmp/Utility/Network.o )
+    [ 37 of 347] Compiling Utility.SRV      ( Utility/SRV.hs, dist/build/git-annex/git-annex-tmp/Utility/SRV.o )
+    
+    Utility/SRV.hs:70:54:
+        Couldn't match expected type `Maybe
+                                        [(Int, Int, Integer, B8.ByteString)]'
+                    with actual type `Either
+                                        dns-1.0.0:Network.DNS.Internal.DNSError
+                                        [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'
+        In the third argument of `maybe', namely `r'
+        In the second argument of `($)', namely
+          `maybe [] (orderHosts . map tohosts) r'
+        In a stmt of a 'do' block:
+          return $ maybe [] (orderHosts . map tohosts) r
+    Failed to install git-annex-4.20130909
+    cabal: Error: some packages failed to install:
+    git-annex-4.20130909 failed during the building phase. The exception was:
+    ExitFailure 1
+
+"""]]
diff --git a/doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment b/doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.152.108.128"
+ subject="comment 24"
+ date="2013-09-17T15:56:17Z"
+ content="""
+@Kristian, a new version of the DNS library has caused this. A workaround is to pass `-f-DNS` to the cabal command.
+
+I am in the process of adding support for the new DNS library version in git now.
+
+By the way, please [[file_a_bug|bugs]] if you have a big ugly looking build failure like that, so as to not clutter up this page.
+"""]]
diff --git a/doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment b/doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"
+ nickname="Carlo"
+ subject="comment 27"
+ date="2013-10-16T09:40:23Z"
+ content="""
+The [FSevents framework itself has been around since leopard](http://arstechnica.com/apple/2007/10/mac-os-x-10-5/7/).
+
+[This fsevents wrapper project](https://github.com/rastersize/CDEvents) supports snow leopard and even leopard, maybe it will provide some clues on how it was done.
+
+I'm guessing it would be worth it, [snow leopard is still the most popular OSX as of April](http://www.patentlyapple.com/patently-apple/2013/04/snow-leopard-remains-the-most-popular-version-of-os-x.html). From my own experience, snow leopard is a huge life extender for 2+ year old hardware. Lion just makes them sluggishly painful to use.
+
+Maybe someone could volunteer an SL machine for remote development? Sorry, mine are tied down :(
+"""]]
diff --git a/doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment b/doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="64.134.31.139"
+ subject="comment 27"
+ date="2013-10-16T15:14:53Z"
+ content="""
+The git-annex assistant uses **file level** FSevents to detect which files have been changed. Would it be possible to make it work with older versions that don't provide file-level events? Probably. The code for BSD kqueue deals with similar limitations in needing to scan the directory to find the files that actually changed. If someone cares about old versions of OSX and wants to do that work I'll happily support you.
+"""]]
diff --git a/doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment b/doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://alan.petitepomme.net/"
+ nickname="Alan Schmitt"
+ subject="dbus support?"
+ date="2013-10-18T08:24:11Z"
+ content="""
+Hello,
+
+I just compiled git-annex using cabal on OS X, and I see there is no dbus support:
+
+    Assistant/Threads/NetWatcher.hs:26:0:
+         warning: #warning Building without dbus support; will poll for network connection changes
+    
+    Assistant/Threads/MountWatcher.hs:33:0:
+         warning: #warning Building without dbus support; will use mtab polling
+
+Is this problematic? I see I can install dbus using homebrew. If I do so, will I have dbus support (after recompiling git-annex)?
+"""]]
diff --git a/doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment b/doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"
+ nickname="Carlo"
+ subject="comment 29"
+ date="2013-10-18T15:58:59Z"
+ content="""
+I think I dragged you out of dev mode for commenting unnecessarily, sorry about that. Apparently, [Lion](http://www.redmondpie.com/os-x-lion-vs-os-x-snow-leopard-head-to-head-performance-showdown/) and [Mountain Lion are fine on older hardware](http://apple.stackexchange.com/questions/58453/will-mountain-lion-make-an-older-computer-run-faster-or-slower). For a while [a daemon cause Lion slowdowns for a day after upgrade](https://discussions.apple.com/message/15719036) for a while, which was enough to cause a reputation.
+"""]]
diff --git a/doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment b/doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="64.134.31.139"
+ subject="comment 30"
+ date="2013-10-19T15:31:45Z"
+ content="""
+@Alan you don't need to install dbus on OSX. The polling code will work. On the other hand if you'd like to experiment with installing dbus and report back, perhaps it's worth a try. It's nice when the git-annex assistant can instantly detect when drives are plugged in, and then the network connection changes and react to it. On Linux, dbus gives it that capability.
+"""]]
diff --git a/doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment b/doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://alan.petitepomme.net/"
+ nickname="Alan Schmitt"
+ subject="dbus and homebrew"
+ date="2013-10-20T17:25:04Z"
+ content="""
+I'm trying to build git-annex with dbus support, and even though I installed dbus (through homebrew), at the end of compilation I get the warning about \"building without dbus\". Is there something special I need to do for git-annex to see I have installed dbus?
+
+(Also, it tells me at the beginning that I don't have gcrypt, but libgcrypt is installed.)
+"""]]
diff --git a/doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment b/doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="64.134.31.139"
+ subject="comment 32"
+ date="2013-10-21T22:47:14Z"
+ content="""
+You probably need to install libdbus dev stuff, and then the haskell dbus library. But it's certainly going to need code changes to make git-annex use dbus in any way on OSX, assuming there are even useful dbus events generated for network connections and drives being mounted on OSX.
+
+It was saying \"gcrypt\" when it meant \"git-remote-gcrypt\".
+"""]]
diff --git a/doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment b/doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://alan.petitepomme.net/"
+ nickname="Alan Schmitt"
+ subject="comment 33"
+ date="2013-10-23T11:39:51Z"
+ content="""
+I installed the haskell DBus library, but it's still not picking it up. Is there some additional option to pass to cabal, or is it supposed to find it automatically?
+"""]]
diff --git a/doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment b/doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac"
+ nickname="Srinath"
+ subject="build issue with brew technique on Darwin Kernel Version 13.0.0"
+ date="2014-02-15T02:17:16Z"
+ content="""
+Following the Mac OS X brew instructions from the top of the board, I got the following error:
+
+[5 of 5] Compiling Yesod            ( Yesod.hs, dist/build/Yesod.o )
+In-place registering yesod-1.2.5...
+Installing library in /Users/srinathv/.cabal/lib/yesod-1.2.5/ghc-7.6.3
+Registering yesod-1.2.5...
+Installed yesod-1.2.5
+cabal: Error: some packages failed to install:
+git-annex-5.20140210 depends on libxml-sax-0.7.4 which failed to install.
+libxml-sax-0.7.4 failed during the configure step. The exception was:
+ExitFailure 1
+network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to
+install.
+
+
+Then I perused the comments and did:
+$brew link libmxl2 --force
+$cabal install git-annex --bindir=$HOME/bin
+
+with success.  
+"""]]
diff --git a/doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment b/doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"
+ nickname="Pere"
+ subject="I couldn't install it on Snow Leopard"
+ date="2013-01-19T15:04:27Z"
+ content="""
+Bad news, it looks like I'm not able to install git-annex to my machine: When I run
+
+    sudo cabal install c2hs git-annex --bindir=$HOME/bin
+
+I get the following error:
+
+    cabal: Error: some packages failed to install:
+    DAV-0.3 failed during the building phase. The exception was:
+    ExitFailure 11
+    git-annex-3.20130114 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-1.1.7.2 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-auth-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-core-1.1.7.1 failed during the building phase. The exception was:
+    ExitFailure 11
+    yesod-default-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-form-1.2.0.2 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-json-1.1.2 depends on yesod-core-1.1.7.1 which failed to install.
+    yesod-persistent-1.1.0.1 depends on yesod-core-1.1.7.1 which failed to
+    install.
+    yesod-static-1.1.1.2 depends on yesod-core-1.1.7.1 which failed to install.
+
+What does *ExitFailure 11* mean?
+"""]]
diff --git a/doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment b/doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.3.194"
+ subject="comment 9"
+ date="2013-01-19T16:02:35Z"
+ content="""
+sig11 is a Segmentation Fault, probably from a C library used by DAV for HTTP in this case.
+"""]]
diff --git a/doc/install/fromsource.mdwn b/doc/install/fromsource.mdwn
--- a/doc/install/fromsource.mdwn
+++ b/doc/install/fromsource.mdwn
@@ -34,12 +34,18 @@
 Now you can build git-annex by running either `make` or `cabal build`
 inside the source tree.
 
-## minimal build with cabal
+## minimal build with cabal and stackage
 
 This can be done anywhere, and builds git-annex without some optional features
 that require harder-to-install C libraries. This is plenty to let you get started with
 git-annex, but it does not include the assistant or webapp.
 
+Be warned that this involves building a lot of Haskell libraries from
+source, and so it has a lot of moving parts, and it's not uncommon for it
+to be broken from time to time. A nice way to avoid such breakage is to
+[configure cabal to use the Stackage repository](http://www.stackage.org/),
+which is a more stable and consistent version of the Hackage repository.
+
 Inside the source tree, run:
 
 	cabal configure -f"-assistant -webapp -webdav -pairing -xmpp -dns"
@@ -48,16 +54,14 @@
 	PATH=$HOME/bin:$PATH
 	cabal install --bindir=$HOME/bin
 
-Be warned that this involves building a lot of Haskell libraries from
-source, and so it has a lot of moving parts, and it's not uncommon for it
-to be broken from time to time.
-
-## full build with cabal
+## full build with cabal and stackage
 
 To build with all features enabled, including the assistant and webapp,
 you will need to install several C libraries and their headers,
 including libgnutls, libgsasl, libxml2, and zlib. How to do that for
 your OS is beyond the scope of this page. 
+
+Using [Stackage](http://www.stackage.org/) is again a good idea here!
 
 Once the C libraries are installed, run inside the source tree:
 
diff --git a/doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment b/doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.152.246.110"
+ subject="comment 10"
+ date="2013-07-27T17:49:07Z"
+ content="""
+@Henning; see the [[OSX]] page for full installation instructions for OSX. Which include all the neccesary brew incantations.
+"""]]
diff --git a/doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment b/doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"
+ nickname="Gregor"
+ subject="Installation on tonidoplug"
+ date="2013-08-03T07:19:54Z"
+ content="""
+I tried various ways to install git-annex on my [TonidoPlug](http://www.tonidoplug.com/).
+
+System Info:
+
+	root@TonidoPlug2:~# uname -a
+	Linux TonidoPlug2 2.6.31.8-topkick1281p2-001-004-20101214 #1 Thu Jun 16 10:06:20 CST 2011 armv5tel GNU/Linux
+
+`apt-get` didn't work.
+
+	root@TonidoPlug2:~# apt-get install git-annex
+	Reading package lists... Done
+	Building dependency tree       
+	Reading state information... Done
+	E: Unable to locate package git-annex
+
+The Linux standalone installation results in an error message like this, when calling `git-annex` (or `git annex`)
+
+	~$ git-annex.linux/git-annex
+	/home/gitolite/git-annex.linux/bin/git-annex: 1: Syntax error: \")\" unexpected
+
+(git-annex.linux/bin/git-annex is a binary file and works fine on other distros)
+
+When installing with cabal, I get the error message (tried as root and gitolite user)
+
+	~$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"
+	Resolving dependencies...
+	cabal: cannot configure git-annex-4.20130802. It requires base >=4.5 && <4.8
+	For the dependency on base >=4.5 && <4.8 there are these packages:
+	base-4.5.0.0, base-4.5.1.0, base-4.6.0.0 and base-4.6.0.1. However none of
+	them are available.
+	base-4.5.0.0 was excluded because of the top level dependency base -any
+	base-4.5.1.0 was excluded because of the top level dependency base -any
+	base-4.6.0.0 was excluded because of the top level dependency base -any
+	base-4.6.0.1 was excluded because of the top level dependency base -any
+
+Any help is appreciated.
+Thanks for providing git-annex. I started cleaning up my backups with it yesterday and really like it.
+"""]]
diff --git a/doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment b/doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 12"
+ date="2013-08-07T16:31:30Z"
+ content="""
+The Linux standalone builds for i386 and amd64 will not work on Arm systems.
+
+There are builds of git-annex for arm in eg, Debian. You should be able to use one of those if this system is running Debian. You may need to upgrade to eg, Debian stable, which includes git-annex.
+
+It looks like you have an old and/or broken GHC compiler too. You could upgrade that to a newer version (eg from Debian stable) and build it that way, but it seems like the long way around if you have a Debian system there.
+"""]]
diff --git a/doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment b/doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"
+ nickname="Gregor"
+ subject="TonidoPlug"
+ date="2013-08-09T17:46:28Z"
+ content="""
+@Joey Thanks for the answer. I didn't want to mess around too much with the TonidoPlug. I am currently setting up a raspberry pi, which works fine. 
+"""]]
diff --git a/doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment b/doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlfIVXjkzrYE9qJAO2A0H7K6tKGMaSgc3U"
+ nickname="Daniel"
+ subject="Problems with cryptocipher"
+ date="2013-08-22T01:36:50Z"
+ content="""
+I had problems following these directions on recent releases of Fedora/Ubuntu. The install attempts failed on cryptocipher-0.3.1, which I think came as a dependency of Yesod.
+I was able to work around this by installing yesod-platform with cabal first, then installing git-annex.
+"""]]
diff --git a/doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment b/doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="77.247.181.162"
+ subject="git-annex assistant on Arm"
+ date="2013-08-23T03:07:11Z"
+ content="""
+I'd like to use the assistant's power on a Raspberry Pi to build an always-on file/sync server. Is there a way to get the assistant running on Arm? I know there's a Debian package, but it's Version 3.20120629 and comes without the assistant. Has anyone ever successfully built a recent git-annex version on Arm? What would I need in order to do it myself? 
+"""]]
diff --git a/doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment b/doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 16"
+ date="2013-08-23T17:37:52Z"
+ content="""
+The git-annex assistant can easily be built on arm. But not the webapp. It's entirely possible to use the assistant without the webapp though; you just have to make the git repository and configure the remotes by hand, and then the assistant will sync them the same way the webapp does.
+
+It is possible but very involved to build the webapp for arm. I do not anticipate doing it in the Debian package until ghc gets proper template haskell support for arm. See [[forum/Webapp_on_ARM]]
+"""]]
diff --git a/doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment b/doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="77.247.181.162"
+ subject="comment 17"
+ date="2013-08-23T18:51:51Z"
+ content="""
+Thanks for the quick answer. I will try to build git-annex with just the assistant, as you suggest, and once it works set up the server by hand as you suggest. 
+
+BTW: Awesome job you're doing with git-annex. I appreciate your enthusiasm.
+"""]]
diff --git a/doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment b/doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="96.47.226.20"
+ subject="git-annex assistant for the Raspberry Pi"
+ date="2013-09-04T03:58:37Z"
+ content="""
+It took a while and a few tries, but I finally built the git-annex binary including the assistant on a Raspberry Pi. The build comes without the flags webapp, webdav, and dbus as these rely on a Template Haskell compiler that hasn't been ported to Arm architecture yet. 
+
+I put the binary up on Github in case anyone's interested: <https://github.com/tradloff/git-annex-RPi>
+"""]]
diff --git a/doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment b/doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlu7K3h7Ry1uDAU_ERYGuqt0LoGNJqGuRo"
+ nickname="Nathan"
+ subject="Cabal installing git-annex on Ubuntu 12.04 Precise with GHC 7.6.3"
+ date="2013-09-25T22:39:04Z"
+ content="""
+I now realize [there is a Ubuntu 12.04 Precise PPA with a current
+version of
+git-annex](http://git-annex.branchable.com/install/Ubuntu/), so that's
+probably a better choice, but here's how I cabal isntalled git-annex.
+
+1. Apt install non-cabal dependencies:
+
+       sudo aptitude install c2hs libgsasl7-dev libxml2-dev
+
+2. Manually cabal install yesod-platform to avoid the [cryptocipher problem 
+   mentioned above](
+   http://git-annex.branchable.com/install/cabal/#comment-1807da37dc144b572b76aaf4b574bb54):
+
+       cabal install yesod-platform
+
+3. Cabal install git-annex with DNS flag disabled:
+
+       cabal install git-annex -f\"-dns\"
+
+I was getting this error building git-annex before disabling the DNS flag:
+
+    Utility/SRV.hs:70:54:
+        Couldn't match expected type `Maybe
+                                        [(Int, Int, Integer, B8.ByteString)]'
+                    with actual type `Either
+                                        dns-1.0.0:Network.DNS.Internal.DNSError
+                                        [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'
+        In the third argument of `maybe', namely `r'
+        In the second argument of `($)', namely
+          `maybe [] (orderHosts . map tohosts) r'
+        In a stmt of a 'do' block:
+          return $ maybe [] (orderHosts . map tohosts) r
+
+Looking at Utiltity/SRV.hs, it appears that disabling the DNS flag
+just makes git annex use a different DNS library (ADNS), not
+actually disable DNS lookups.
+
+"""]]
diff --git a/doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment b/doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4"
+ nickname="Blake"
+ subject="Updating git-annex via cabal"
+ date="2013-10-09T21:21:22Z"
+ content="""
+What is the best way to update git-annex and the dependencies via cabal? Just the `$ cabal install *` commands again?
+"""]]
diff --git a/doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment b/doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.4.22"
+ subject="comment 21"
+ date="2013-10-11T17:09:33Z"
+ content="""
+If you run the \"cabal update\" command followed by the \"cabal install\" command it'll upgrade git-annex.
+"""]]
diff --git a/doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment b/doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="96.44.189.100"
+ subject="&quot;Could not find module Crypto.Hash&quot; error when building git-annex "
+ date="2013-10-21T19:55:12Z"
+ content="""
+Lately I get this error message when trying to build git-annex-v4.20131002:
+
+    Utility/Hash.hs:7:8:
+        Could not find module `Crypto.Hash'
+        Perhaps you meant
+    	  Crypto.HMAC (needs flag -package crypto-api-0.10.2)
+        Use -v to see a list of the files searched for.
+
+crypto-api-0.10.2 is installed as a debian dev package. All the dependencies are met. I have no idea what's going on.  
+"""]]
diff --git a/doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment b/doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="64.134.31.139"
+ subject="comment 23"
+ date="2013-10-21T22:09:05Z"
+ content="""
+git-annex needs cryptohash version 0.10.0 or greater. You appear to have an old version. You can cabal `configure -f-CryptoHash` if it's for some reason failing to disable the cryptohash support despite the declared dependency not being met.
+"""]]
diff --git a/doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment b/doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="37.130.227.133"
+ subject="comment 24"
+ date="2013-10-22T17:55:32Z"
+ content="""
+I fixed the error by installing a newer version of cryptohash. Thanks for pointing out the culprit. 
+"""]]
diff --git a/doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment b/doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="141.138.141.208"
+ subject="Bad version on Hackage"
+ date="2013-10-30T18:56:25Z"
+ content="""
+Quick note: The latest version in the Hackage repository (git-annex-4.20131024) fails to build, due to a faulty version of Assistant/Threads/Cronner.hs. 
+"""]]
diff --git a/doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment b/doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.47"
+ subject="comment 26"
+ date="2013-11-01T16:33:25Z"
+ content="""
+@RaspberryPie that only affected builds without the webapp, in any case it's fixed now.
+"""]]
diff --git a/doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment b/doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="37.221.160.203"
+ subject="comment 27"
+ date="2013-11-02T12:52:18Z"
+ content="""
+Okay, the error doesn't show up anymore. I didn't even get to Cronner though, because this time I got a different error:
+
+    Assistant/Alert.hs:195:20:
+        Couldn't match expected type `Assistant ()' with actual type `()'
+        Expected type: Maybe Remote -> Assistant ()
+          Actual type: Maybe Remote -> ()
+        In the expression: noop
+        In an equation for `notFsckedNudge': notFsckedNudge _ = noop
+
+This is from trying to compile 4.20131101 with `-f\"-webapp -webdav\"`
+"""]]
diff --git a/doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment b/doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.47"
+ subject="comment 28"
+ date="2013-11-02T17:40:18Z"
+ content="""
+Unfortunate about that. I've fixed it in git.
+
+(It would be best to file bug reports about build failures to avoid cluttering up this page.)
+"""]]
diff --git a/doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment b/doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment
@@ -0,0 +1,39 @@
+[[!comment format=mdwn
+ username="robohack"
+ ip="24.67.98.78"
+ subject="cabal install failing due to problems building pcre-light-0.4"
+ date="2013-11-21T20:17:10Z"
+ content="""
+After a fresh install of Haskell, and following the instructions above, I end up with the following rather bizarre and unexpected problem:
+
+	$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"
+	Resolving dependencies...
+	Configuring pcre-light-0.4...
+	Building pcre-light-0.4...
+	Preprocessing library pcre-light-0.4...
+	Base.hsc:103:18: error: pcre.h: No such file or directory
+	Base.hsc: In function ‘main’:
+	Base.hsc:402: error: ‘PCRE_ANCHORED’ undeclared (first use in this function)
+	Base.hsc:402: error: (Each undeclared identifier is reported only once
+	Base.hsc:402: error: for each function it appears in.)
+	Base.hsc:405: error: ‘PCRE_AUTO_CALLOUT’ undeclared (first use in this function)
+
+(followed by an error for every other macro that was expected to be defined in the header...)
+
+	compiling dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c failed (exit code 1)
+	command was: /usr/bin/gcc -c dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c -o dist/build/Text/Regex/PCRE/Light/Base_hsc_make.o -m64 -fno-stack-protector -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=700 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/sw/lib/ghc-7.0.4/bytestring-0.9.1.10/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/base-4.3.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include/
+	Failed to install pcre-light-0.4
+	cabal: Error: some packages failed to install:
+	git-annex-3.20120230 depends on pcre-light-0.4 which failed to install.
+	pcre-light-0.4 failed during the building phase. The exception was:
+	ExitFailure 1
+
+This is a somewhat older Mac OS X 10.6.8 system.
+
+I do have PCRE already installed via Fink, and pcre.h is in /sw/include.  I see other -I/sw/... things in the compile command above, but obviously /sw/include is not one of them.
+
+Any clues for me?
+
+(Why the heck does git-annex need pcre in particular anyway???  I saw another regex library get installed earlier somewhere in this (massive) process.)
+
+"""]]
diff --git a/doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment b/doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="robohack"
+ ip="24.67.98.78"
+ subject="hmmm... ok, the PCRE problem was odd, but now this:"
+ date="2013-11-21T20:30:54Z"
+ content="""
+The PCRE problem is solved trivially in my case with a couple more cabal install options, though the need for these seems oddly dissatisfying given the reams of other stuff that was successfully built and installed without these options.
+
+Now however I seem to have encountered a deeper problem:
+
+	$ cabal install git-annex --bindir=$HOME/bin --extra-include-dirs=/sw/include --extra-lib-dirs=/sw/lib               
+	Resolving dependencies...
+	[1 of 1] Compiling Main             ( /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/Setup.hs, /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/Main.o )
+	Linking /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/setup ...
+	hsc2hs Utility/StatFS.hsc
+	perl -i -pe 's/^{-# INCLUDE.*//' Utility/StatFS.hs
+	ghc -O2 -Wall -ignore-package monads-fd --make configure
+	
+	Utility/StatFS.hsc:54:8:
+	    Could not find module `GHC.Foreign':
+	      Use -v to see a list of the files searched for.
+	make: *** [Build/SysConfig.hs] Error 1
+	Configuring git-annex-3.20120230...
+	Building git-annex-3.20120230...
+	Preprocessing executable 'git-annex' for git-annex-3.20120230...
+	
+	Git/Version.hs:11:18:
+	    Could not find module `Build.SysConfig':
+	      Use -v to see a list of the files searched for.
+	Failed to install git-annex-3.20120230
+	cabal: Error: some packages failed to install:
+	git-annex-3.20120230 failed during the building phase. The exception was:
+	ExitFailure 1
+
+"""]]
diff --git a/doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment b/doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="robohack"
+ ip="24.67.98.78"
+ subject="a different error trying to build from the git repo...."
+ date="2013-11-21T21:14:54Z"
+ content="""
+I'm using the ghc7.0 branch because Fink's GHC is still at 7.0.4....
+
+	$ cabal build                                
+	Building git-annex-3.20120523...
+	Preprocessing executable 'git-annex' for git-annex-3.20120523...
+	[ 78 of 163] Compiling Utility.Url      ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )
+	
+	Utility/Url.hs:111:88:
+	    Couldn't match expected type `Maybe URI' with actual type `URI'
+	    In the second argument of `fromMaybe', namely
+	      `(newURI `relativeTo` u)'
+	    In the expression: fromMaybe newURI (newURI `relativeTo` u)
+	    In an equation for `newURI_abs':
+	        newURI_abs = fromMaybe newURI (newURI `relativeTo` u)
+
+"""]]
diff --git a/doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment b/doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.64"
+ subject="comment 32"
+ date="2013-11-22T16:27:36Z"
+ content="""
+@robohack, the ghc7.0 branch is not being maintained, and is so old I don't recommend it. To build it against current cabal you will probably need to version its dependency on network to an older version than 2.4.0. 
+
+Also, git-annex has not depended on pcre for a long time. But you're building thoroughly old version so get to trip over every bug that's been reported for the past 2 years..
+"""]]
diff --git a/doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment b/doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc"
+ nickname="Matthias"
+ subject="Build failure"
+ date="2014-03-20T09:10:44Z"
+ content="""
+I followed the instructions and the invocation of
+
+    cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"
+
+resulted in the following error:
+
+    Test.hs:107:41: Not in scope: `errMessage'
+    Failed to install git-annex-5.20140306
+    cabal: Error: some packages failed to install:
+    git-annex-5.20140306 failed during the building phase. The exception was:
+    ExitFailure 1
+
+I used the Haskell Platform for Mac OS X (10.8)
+
+"""]]
diff --git a/doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment b/doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://openid.stackexchange.com/user/a05bb829-932b-49f2-85a9-00dcda8b5e20"
+ nickname="Christian Pietsch"
+ subject="Re: Build failure"
+ date="2014-03-20T13:56:16Z"
+ content="""
+I get exactly the same error message as Matthias when attempting the minimal Cabal install on openSUSE 12.2 (x86_64) Linux.
+"""]]
diff --git a/doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment b/doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.102"
+ subject="comment 35"
+ date="2014-03-20T16:06:22Z"
+ content="""
+The `errMessage` build failure is due to a new version of optparse-applicative. I've added support for it in git master.
+"""]]
diff --git a/doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment b/doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkNcHu5T1Pxzl-r2co9vf6SxXYWubv2P04"
+ nickname="Matthew"
+ subject="I did indeed get problems on Ubuntu 13.04"
+ date="2014-06-25T01:01:43Z"
+ content="""
+The issues I had were version mismatches when resolving dependencies of git-annex.
+
+It seems that when you install haskell-platform package with apt-get, it installs a bunch of haskell dependencies as apt packages, yet those aren't needed for any other system packages.  So some people here who complain about version mismatches might not have intended to install any Haskell libraries with apt, they just come along for the ride by default.
+
+I can't remember the exact ones, but I ended up uninstalling some of the stuff that gets auto-installed along with haskell-platform, and using cabal to build those.  Then all the git-annex dependencies worked.
+
+Why 13.04 in this day and age?  Using Zentyal as a home server/gateway, and it currently runs on 13.04.
+
+This method might not work if you installed other apt packages that _do_ need those apt-based Haskell libraries.   But if git-annex is all you need that uses the Haskell platform, might work.
+"""]]
diff --git a/doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment b/doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment
@@ -0,0 +1,69 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmveNWaFIL1zEehHr_0416bKBzsul5tGlE"
+ nickname="Daniel"
+ subject="Install fails horribly"
+ date="2014-07-10T23:11:51Z"
+ content="""
+```
+lyriondesktop:/home/zilti/tmp # cabal install c2hs
+Resolving dependencies...
+Configuring c2hs-0.17.2...
+Building c2hs-0.17.2...
+Preprocessing executable 'c2hs' for c2hs-0.17.2...
+[ 1 of 26] Compiling Data.DLists      ( src/Data/DLists.hs, dist/build/c2hs/c2hs-tmp/Data/DLists.o )
+[ 2 of 26] Compiling Control.StateTrans ( src/Control/StateTrans.hs, dist/build/c2hs/c2hs-tmp/Control/StateTrans.o )
+
+src/Control/StateTrans.hs:77:1: Warning:
+    Module `Prelude' does not export `catch'
+[ 3 of 26] Compiling Data.Errors      ( src/Data/Errors.hs, dist/build/c2hs/c2hs-tmp/Data/Errors.o )
+[ 4 of 26] Compiling Data.Attributes  ( src/Data/Attributes.hs, dist/build/c2hs/c2hs-tmp/Data/Attributes.o )
+[ 5 of 26] Compiling Text.Lexers      ( src/Text/Lexers.hs, dist/build/c2hs/c2hs-tmp/Text/Lexers.o )
+[ 6 of 26] Compiling Control.StateBase ( src/Control/StateBase.hs, dist/build/c2hs/c2hs-tmp/Control/StateBase.o )
+[ 7 of 26] Compiling Data.NameSpaces  ( src/Data/NameSpaces.hs, dist/build/c2hs/c2hs-tmp/Data/NameSpaces.o )
+[ 8 of 26] Compiling C2HS.C.Attrs     ( src/C2HS/C/Attrs.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Attrs.o )
+[ 9 of 26] Compiling C2HS.C.Builtin   ( src/C2HS/C/Builtin.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Builtin.o )
+[10 of 26] Compiling Paths_c2hs       ( dist/build/autogen/Paths_c2hs.hs, dist/build/c2hs/c2hs-tmp/Paths_c2hs.o )
+[11 of 26] Compiling C2HS.Config      ( src/C2HS/Config.hs, dist/build/c2hs/c2hs-tmp/C2HS/Config.o )
+[12 of 26] Compiling C2HS.Switches    ( src/C2HS/Switches.hs, dist/build/c2hs/c2hs-tmp/C2HS/Switches.o )
+[13 of 26] Compiling C2HS.Version     ( src/C2HS/Version.hs, dist/build/c2hs/c2hs-tmp/C2HS/Version.o )
+[14 of 26] Compiling System.CIO       ( src/System/CIO.hs, dist/build/c2hs/c2hs-tmp/System/CIO.o )
+[15 of 26] Compiling Control.State    ( src/Control/State.hs, dist/build/c2hs/c2hs-tmp/Control/State.o )
+[16 of 26] Compiling C2HS.State       ( src/C2HS/State.hs, dist/build/c2hs/c2hs-tmp/C2HS/State.o )
+[17 of 26] Compiling C2HS.CHS.Lexer   ( src/C2HS/CHS/Lexer.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS/Lexer.o )
+
+src/C2HS/CHS/Lexer.hs:612:16: Warning:
+    Defined but not used: `lexeme'
+[18 of 26] Compiling C2HS.CHS         ( src/C2HS/CHS.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS.o )
+[19 of 26] Compiling C2HS.Gen.Header  ( src/C2HS/Gen/Header.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Header.o )
+[20 of 26] Compiling C2HS.C.Trav      ( src/C2HS/C/Trav.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Trav.o )
+[21 of 26] Compiling C2HS.C.Names     ( src/C2HS/C/Names.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Names.o )
+[22 of 26] Compiling C2HS.C           ( src/C2HS/C.hs, dist/build/c2hs/c2hs-tmp/C2HS/C.o )
+[23 of 26] Compiling C2HS.Gen.Monad   ( src/C2HS/Gen/Monad.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Monad.o )
+
+src/C2HS/Gen/Monad.hs:227:10: Warning:
+    Orphan instance: instance Read Ident
+[24 of 26] Compiling C2HS.C.Info      ( src/C2HS/C/Info.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Info.o )
+[25 of 26] Compiling C2HS.Gen.Bind    ( src/C2HS/Gen/Bind.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Bind.o )
+
+src/C2HS/Gen/Bind.hs:971:43: Warning:
+    In the use of `posColumn' (imported from Language.C.Data.Position):
+    Deprecated: \"column number information is inaccurate in presence of macros - do not rely on it.\"
+
+src/C2HS/Gen/Bind.hs:789:10: Warning:
+    Orphan instance: instance Num CInteger
+[26 of 26] Compiling Main             ( src/Main.hs, dist/build/c2hs/c2hs-tmp/Main.o )
+Linking dist/build/c2hs/c2hs ...
+Installing executable(s) in /root/.cabal/bin
+Installed c2hs-0.17.2
+lyriondesktop:/home/zilti/tmp # cabal install git-annex
+Resolving dependencies...
+Configuring gnuidn-0.2.1...
+cabal: The program c2hs is required but it could not be found.
+Failed to install gnuidn-0.2.1
+cabal: Error: some packages failed to install:
+git-annex-5.20140709 depends on gnuidn-0.2.1 which failed to install.
+gnuidn-0.2.1 failed during the configure step. The exception was:
+ExitFailure 1
+network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install.
+```
+"""]]
diff --git a/doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment b/doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.2"
+ subject="comment 38"
+ date="2014-07-11T18:30:55Z"
+ content="""
+@Daniel, I suggest you either follow the instuctions above, or if you don't want to follow the instructions, follow the error messages. :P In this case, the instructions say to do:
+
+> PATH=$HOME/bin:$PATH
+> cabal install c2hs --bindir=$HOME/bin
+
+Which is exactly to work around the problem that we can see in your transcript: `Installing executable(s) in /root/.cabal/bin` 
+
+Also, to reiterate the top of the page: If you are not comfortable tracking down and dealing with library build problems, installing git-annex with cabal is probably not the right choice for you!
+
+"""]]
diff --git a/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment b/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkftzaCvV7EDKVDfJhsQZ3E1Vn-0db516w"
+ nickname="Edward"
+ subject="GHC 7.8 Issue"
+ date="2014-08-20T20:06:01Z"
+ content="""
+Just an FYI: I tried to \"cabal install --only-dependencies\" with GHC 7.8 and it fails because DAV-1.0.1 is pulling in lens-3.10.3 which is not compatible with GHC 7.8 due to changes in Typeable. 
+
+I don't have enough experience with cabal to figure out why it's not trying to use a newer version of lens.
+"""]]
diff --git a/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment b/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="no need for c2hs"
+ date="2014-09-16T19:28:09Z"
+ content="""
+The c2hs mentioned in some of the above comments is not needed any longer; ghc 7.6.3 and newer come with a hsc2hs command that is used.
+"""]]
diff --git a/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment b/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 46"
+ date="2014-09-16T19:33:11Z"
+ content="""
+Britt's comment is spot on, but git-annex tries pretty hard to work with lots of older versions of haskell libraries, as well as the latest and greatest. So it should be ok to install haskell libraries with apt-get and use them to build git-annex, as the (revised) instructions above show.
+
+What tends not to work so well is use apt-get to install older versions of haskell libraries and then cabal install on top to add newer stuff. Gets complicated and I'd recommend not going there. The instructions above show using either apt-get or cabal to install the haskell libraries, but not both.
+"""]]
diff --git a/doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment b/doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="thnetos"
+ subject="Where to start reading the source code?"
+ date="2014-12-15T22:04:06Z"
+ content="""
+Do you have any recommendations for the overall haskell architecture of the project? Where to start looking if I want to read through the source code?
+"""]]
diff --git a/doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment b/doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""where to start reading the source code"""
+ date="2015-01-05T20:58:50Z"
+ content="""
+@thnetos, great question!
+
+Annex.hs is a key starting place, as it defines git-annex's main monad.
+If you like learning code bases bottom-up, Types/* has files for
+the main data types used in git-annex, such as Key and UUID and Remote and
+GitConfig.
+
+Command/* gets you the implementation of any particular git-annex command
+you are interested in. Or Remote/* for any particular special remote.
+
+I recommend running "make tags" and then your editor should be able to use
+the tags file to bounce around in the source code.
+"""]]
diff --git a/doc/news/version_5.20150406.mdwn b/doc/news/version_5.20150406.mdwn
deleted file mode 100644
--- a/doc/news/version_5.20150406.mdwn
+++ /dev/null
@@ -1,33 +0,0 @@
-git-annex 5.20150406 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Prevent git-ls-files from double-expanding wildcards when an
-     unexpanded wildcard is passed to a git-annex command like add or find.
-   * Fix make build target. Thanks, Justin Geibel.
-   * Fix GETURLS in external special remote protocol to strip
-     downloader prefix from logged url info before checking for the
-     specified prefix.
-   * importfeed: Avoid downloading a redundant item from a feed whose
-     guid has been downloaded before, even when the url has changed.
-   * importfeed: Always store itemid in metadata; before this was only
-     done when annex.genmetadata was set.
-   * Relax debian package dependencies to git &gt;= 1:1.8.1 rather
-     than needing &gt;= 1:2.0.
-   * test: Fix --list-tests
-   * addurl --file: When used with a special remote that claims
-     urls and checks their contents, don't override the user's provided
-     filename with filenames that the special remote suggests. Also,
-     don't allow adding the url if the special remote says it contains
-     multiple files.
-   * import: --deduplicate and --cleanduplicates now output the keys
-     corresponding to duplicated files they process.
-   * expire: New command, for expiring inactive repositories.
-   * fsck: Record fsck activity for use by expire command.
-   * Fix truncation of parameters that could occur when using xargs git-annex.
-   * Significantly sped up processing of large numbers of directories
-     passed to a single git-annex command.
-   * version: Add --raw
-   * init: Improve fifo test to detect NFS systems that support fifos
-     but not well enough for sshcaching.
-   * --quiet now suppresses progress displays from eg, rsync.
-     (The option already suppressed git-annex's own built-in progress
-     displays.)"""]]
diff --git a/doc/news/version_5.20150522.mdwn b/doc/news/version_5.20150522.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_5.20150522.mdwn
@@ -0,0 +1,30 @@
+git-annex 5.20150522 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * import: Refuse to import files that are within the work tree, as that
+     does not make sense and could cause data loss.
+   * drop: Now supports --all, --unused, and --key.
+   * drop: Now defaults to --all when run in a bare repository.
+     (Previously, did nothing when run in a bare repository.)
+   * get, move, copy, mirror: Concurrent transfers are now supported!
+     For example: git-annex get -J10
+     However, progress bars are not yet displayed for concurrent transfers,
+     pending an updated version of the ascii-progress library.
+   * --quiet now makes progress output by rsync, wget, etc be quiet too.
+   * Take space that will be used by other running downloads into account when
+     checking annex.diskreserve.
+   * Avoid accumulating transfer failure log files unless the assistant is
+     being used.
+   * Fix an unlikely race that could result in two transfers of the same key
+     running at once.
+   * Stale transfer lock and info files will be cleaned up automatically
+     when get/unused/info commands are run.
+   * unused: Add --used-refspec option and annex.used-refspec, which can
+     specify a set of refs to consider used, rather than the default of
+     considering all refs used.
+   * webapp: Fix zombie xdg-open process left when opening file browser.
+     Closes: #[785498](http://bugs.debian.org/785498)
+   * Safer posix fctnl locking implementation, using lock pools and STM.
+   * Build documentation with TZ=UTC for reproducible builds. See #785736.
+   * OSX: Corrected the location of trustedkeys.gpg, so the built-in
+     upgrade code will find it. Fixes OSX upgrade going forward, but
+     older versions won't upgrade themselves due to this problem."""]]
diff --git a/doc/special_remotes/S3.mdwn b/doc/special_remotes/S3.mdwn
--- a/doc/special_remotes/S3.mdwn
+++ b/doc/special_remotes/S3.mdwn
@@ -59,7 +59,6 @@
   This is not enabled by default, since other S3 implementations may
   not support multipart uploads or have different limits,
   but can be enabled or changed at any time.
-  time.
 
 * `fileprefix` - By default, git-annex places files in a tree rooted at the
   top of the S3 bucket. When this is set, it's prefixed to the filenames
diff --git a/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment b/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 10"
+ date="2013-05-23T20:04:03Z"
+ content="""
+You can enable a special remote on a clone by running `git annex enableremote $name`, where $name is the name you used to originally create the special remote. (Older versions of git-annex used `git annex initremote` to enable the special remote on the clone.)
+
+(Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)
+"""]]
diff --git a/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment b/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="basak"
+ ip="2001:8b0:1c8::2"
+ subject="comment 11"
+ date="2013-05-24T09:38:40Z"
+ content="""
+Thanks Joey - initremote on my slightly older version appears to work. I'll use `enableremote` when I can.
+
+> (Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)
+
+This doesn't do what I expect. The documentation suggests that my S3 _login_ credentials would be stored. I understand that the cipher would be stored; but isn't this a separate concept? Instead, I'm being asked to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`; my understanding was that git-annex will keep them in the repository for me, so that I don't have to set them after running `initremote` before cloning. This works, apart from surviving the cloning. I'm using `encryption=shared`; does this affect anything? Or am I using a version of git-annex (3.20121112ubuntu3) that's too old?
+"""]]
diff --git a/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment b/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 12"
+ date="2013-05-24T15:33:12Z"
+ content="""
+Ah -- No, your AWS creds are not stored. While some other special remotes, like webdav, can store all necessary credentials, it's not done for AWS. I didn't want git-annex to be responsible for someone accidentially publishing their AWS creds to their friends, since that could cost them a lot of money.
+"""]]
diff --git a/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment b/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment
@@ -0,0 +1,33 @@
+[[!comment format=mdwn
+ username="basak"
+ ip="2001:8b0:1c8::2"
+ subject="comment 13"
+ date="2013-05-24T15:47:14Z"
+ content="""
+That's not what the documentation here says! It even warns me: \"Think carefully about who can access your repository before using embedcreds without gpg encryption.\"
+
+My use case:
+
+Occasional use of EC2, and a desire to store some persistent stuff in S3, since the dataset is large and I have limited bandwidth. I want to destroy the EC2 instance when I'm not using it, leaving the data in S3 for later.
+
+If I use git-annex to manage the S3 store, then I get the ability to clone the repository and destroy the instance. Later, I can start a new instance, push the repo back up, and would like to be able to then pull the data back out of S3 again.
+
+I'd really like the login credentials to persist in the repository (as the documentation here says it should). Even if I have to add a --yes-i-know-my-s3-credentials-will-end-up-available-to-anyone-who-can-see-my-git-repo flag. This is because I use some of my git repos to store private data, too.
+
+If I use an Amazon IAM policy as follows, I can generate a set of credentials that are limited to access to a particular prefix of a specific S3 bucket only - effectively creating a sandboxed area just for git-annex:
+
+    { 
+      \"Statement\": [{\"Sid\": \"Stmt1368780615583\",
+                     \"Action\": [\"s3:GetObject\", \"s3:PutObject\", \"s3:DeleteObject\"],
+                     \"Effect\": \"Allow\",
+                     \"Resource\": [\"arn:aws:s3:::bucketname/prefix/*\"]}
+                    ],
+      \"Statement\": [{\"Sid\": \"Stmt1368781573129\",
+                    \"Action\": [\"s3:GetBucketLocation\"],
+                    \"Effect\": \"Allow\",
+                    \"Resource\": [\"arn:aws:s3:::bucketname\"]}
+                   ]
+    }
+
+Doing this means that I have a different set of credentials for every annex, so it would be really useful to be able have these stored and managed within the repository itself. Each set is limited to what the annex stores, so there is no bigger compromise I have to worry about apart from the compromise of the data that the annex itself manages.
+"""]]
diff --git a/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment b/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 14"
+ date="2013-05-24T16:45:25Z"
+ content="""
+I apologise for incorrect information. I was thinking about defaults when using the webapp.
+
+I have verified that embedcreds=yes stores the AWS creds, always.
+
+
+"""]]
diff --git a/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment b/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio"
+ nickname="Tobias"
+ subject="different s3 storage URLs"
+ date="2013-08-23T08:59:32Z"
+ content="""
+Is it possible to change the S3 endpoint hosts? I'm running a radosgw with S3 support which I'd like to define as S3 remote for git-annex
+"""]]
diff --git a/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment b/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 16"
+ date="2013-08-23T17:39:56Z"
+ content="""
+Yes, you can specify the host to use when setting up the remote. It's actually documented earlier on this very page, if ou search for \"host\". Any S3 compatabile host will probably work -- the Internet Archive's S3 does, for example.
+"""]]
diff --git a/doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment b/doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlc-3pdibcizrdz4WmZooECL0k6AvM1cWc"
+ nickname="Joe"
+ subject="S3 file/folder names"
+ date="2015-02-19T22:22:26Z"
+ content="""
+Is there a way to tell the S3 backend to store the files as they are named locally, instead of by hashed content name? i.e., I've annexed foo/bar.txt and annex puts it in s3 as mybucket.name/foo/bar.txt instead of mybucket.name/GPGHMACSHA1-random.txt
+
+Or should I just write a script to s3cmd sync my annex, and add the S3/cloudfront distribution URL as a web remote?
+"""]]
diff --git a/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment b/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="http://sekenre.wordpress.com/"
+ nickname="sekenre"
+ subject="Synchronizing Bup repositories"
+ date="2013-05-07T16:46:34Z"
+ content="""
+Hi All,
+
+I managed to answer my questions above about copying changes between local bup repositories efficiently.
+
+You run the following commands 
+
+    git annex copy . --to bup_repo_1                      # Uses bup split in the background (slow)
+    rsync -av /mnt/repodisk1/repo/ /mnt/repodisk2/repo/ \
+    --exclude=config --exclude=*.bloom --exclude=*.midx   # rsync without bup-specific indices (speed depends on delta between repositories)
+    BUP_DIR=/mnt/repodisk2/repo/ bup midx -a && bup bloom # rebuild bup-specific indices on the target (this is extremely fast)
+    git annex copy . --to bup_repo_2                      # Records file is now available in repo2 (also extremely fast)
+
+Now `git annex whereis` will show the correct location and `git annex get <file> --from bup_repo_2` will work.
+
+So far in my testing I haven't found any problems...
+
+"""]]
diff --git a/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment b/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment
@@ -0,0 +1,24 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"
+ nickname="Tim"
+ subject="bup location data not synced through annex assistant"
+ date="2013-05-15T15:08:54Z"
+ content="""
+I set up 2 servers running git annex assistant, both with a ~/annex dir and an additional ~/annex-bup bup repo. There is no additional cloud repository.
+For test, I added my /etc dir which uploaded correctly from server1, but which never arrived on server2
+
+    bup@bup1:~/annex/etc$ git annex whereis updatedb.conf
+    whereis updatedb.conf (3 copies) 
+  	    687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- here (bup@bup1:~/annex)
+   	    adfc1307-771f-40e9-b794-bae2e1f21b8b -- bup2-annex-bup
+   	    e4e0ac0b-992a-4312-a4ac-fc8d3d9f7c0f -- bup1-annex-bup
+    ok
+
+    bup@bup2:~/annex/etc$ git annex whereis updatedb.conf
+    whereis updatedb.conf (1 copy) 
+  	    687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- bup1 (bup@bup1:~/annex)
+    ok
+
+As you can see, server 2 just doesn't know the data is already on it's own disk in it's local bup repo.
+Is there a reason this data does not get synced? Should I set up a transfer repo?
+"""]]
diff --git a/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment b/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"
+ nickname="Tim"
+ subject="my bad"
+ date="2013-05-15T15:39:31Z"
+ content="""
+Sorry, looks like I did initremote twice on the same folder, instead of enableremote the second time...
+"""]]
diff --git a/doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment b/doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkEYZEqLf3Aj_FGV7S0FvsMplmGqqb555M"
+ nickname="Sergiusz"
+ subject="bup-join local-arch/2014-12-03-235617 "
+ date="2014-12-04T19:38:07Z"
+ content="""
+How can I restore the previous commit from bup archives created with bup-split? Yes, I know I can use bup-join local-arch~1 git notation, but I would like to use bup-join local-arch/2014-12-03-235617 (bup-ls local-arch results) ...but this method does not work ...
+
+s.
+"""]]
diff --git a/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment b/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment
@@ -0,0 +1,43 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkgbXwQtPQSG8igdS7U8l031N8sqDmuyvk"
+ nickname="Albert"
+ subject="Error with bup and gnupg"
+ date="2012-10-22T20:56:56Z"
+ content="""
+Hello,
+
+I get this error when trying to use git-annex with bup and gnupg:
+
+<pre>
+move importable_pilot_surveys.tar (gpg) (checking localaseebup...) (to localaseebup...) 
+Traceback (most recent call last):
+  File \"/usr/lib/bup/cmd/bup-split\", line 133, in <module>
+    progress=prog)
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 167, in split_to_shalist
+    for (sha,size,bits) in sl:
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 118, in _split_to_blobs
+    for (blob, bits) in hashsplit_iter(files, keep_boundaries, progress):
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 86, in _hashsplit_iter
+    bnew = next(fi)
+  File \"/usr/lib/bup/bup/helpers.py\", line 86, in next
+    return it.next()
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 49, in blobiter
+    for filenum,f in enumerate(files):
+  File \"/usr/lib/bup/cmd/bup-split\", line 128, in <genexpr>
+    files = extra and (open(fn) for fn in extra) or [sys.stdin]
+IOError: [Errno 2] No such file or directory: '-'
+</pre>
+
+
+I was able to work-around this issue by altering /usr/lib/bup/cmd/bup-split (though I don't think its a bup bug) to just pull from stdin:
+
+files = [sys.stdin]
+
+on ~ line 128.
+
+Any ideas? Also, do you think that bup's data-deduplication does anything when gnupg is enabled, i.e. is it just as well to use a directory remote with gnupg?
+
+Thanks! Git annex rules!
+
+Albert
+"""]]
diff --git a/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment b/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.23"
+ subject="comment 2"
+ date="2012-10-23T20:01:43Z"
+ content="""
+@Albert, thanks for reporting this bug (but put them in [[bugs]] in future please).
+
+This is specific to using the bup special remote with encryption. Without encryption it works. And no, it won't manage to deduplicate anything that's encrypted, as far as I know. 
+
+I think bup-split must have used - for stdin in the past, but now, it just reads from stdin when no file is specified, so I've updated git-annex.
+"""]]
diff --git a/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment b/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="http://sekenre.wordpress.com/"
+ nickname="sekenre"
+ subject="Bup remotes in git-annex assistant"
+ date="2013-03-13T12:54:56Z"
+ content="""
+Hi,
+
+Is the bup remote available via the Assistant user interface?
+
+Unrelated question;
+
+If you are syncing files between two bup repos on local usb drives, does it use git to sync the changes or does it use \"bup split\" to re-add the file? (Basically, is the syncing as efficient as possible using git-annex or would I have to go to a lower level)
+
+Many Thanks,
+Sek
+"""]]
diff --git a/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment b/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 4"
+ date="2013-03-13T16:05:50Z"
+ content="""
+I don't plan to support creating bup spefial remotes in the assistant, currently. Of course the assistant can use bup special remotes you set up.
+
+Your two bup repos would be synced using bup-split.
+"""]]
diff --git a/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment b/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnZWCbRYPVnwscdkdEDwgQHZJLwW6H_AHo"
+ nickname="Tobias"
+ subject="bup fail?"
+ date="2013-03-31T21:05:32Z"
+ content="""
+I've run into problems storing a huge number of files in the bup repo. It seems that thousands of branches are a problem. I don't know if it's a problem of git-annex, bup, or the filesystem.
+
+How about adding an option to store tree/commit ids in git-annex instead of using branches in bup?
+"""]]
diff --git a/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment b/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 7"
+ date="2013-04-02T21:24:06Z"
+ content="""
+`bup-split` uses a git branch to name the objects stored in the bup repository. So it will be limited by any scalability issues affecting large numbers of git branches. I don't know what those are.
+
+Yes, it would be possible to make git-annex store this in the git-annex branch instead.
+"""]]
diff --git a/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment b/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"
+ nickname="Yung-Chin"
+ subject="re scaling issue"
+ date="2013-05-03T14:57:51Z"
+ content="""
+Tobias/joey,
+
+I think there are at least two scaling issues that may be causing you trouble. One is that bup writes pack+idx files rather than bare objects, and if you send 1 file per call to bup-split, you end up with a pair of pack and idx files for each such call. When you later try to retrieve a blob, bup currently just calls git, and git will have to traverse all these tiny idx files looking for the right hash (bare objects you could at least find by name). You can probably ameliorate the pain by calling git repack (look at the -a and --max-pack-size switches) on your bup repository. The other is the \"thousands of branches\" issue, and I think \"git pack-refs --all\" (that's again on your bup repository) might help a little bit. 
+
+It would certainly help performance if you could store blob/tree ids in git-annex instead of branch names. For small files, all bup would need to store is a blob, but currently you end up storing a blob, a tree, and a commit (and looking-up all of those, plus the ref too, on calling bup-join). (you might want to patch bup-split, so it would allow you to ask it for \"--blob-or-tree\", because currently if you say you pass it -b for blob-ids, then for bigger files you get a series of IDs, whereas you'd be much better off with a tree-id there)
+"""]]
diff --git a/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment b/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"
+ nickname="Yung-Chin"
+ subject="comment 9"
+ date="2013-05-03T16:34:05Z"
+ content="""
+Thinking about this some more, a very elegant way to make a bup remote could actually be to just pass the whole .git/annex tree into bup-index/save (you could avoid sending some files by only bup-indexing select subtrees, or by using --exclude-*'s, but you'd run bup-save over the whole .git/annex tree). You could then use bup-restore to retrieve files or whole subtrees, and you'd refer to the files you're retrieving by their actual pathname under which they live in .git/annex (if that doesn't make sense it's because I've misunderstood how git-annex is organised!), so something like \"bup restore branch_name/latest/.git/annex/aa/bb/sha-of-some-sort\" would work - that's cute, right? And you'd only have 1 branch.
+
+However... somebody who is good with lazy-evaluation would need to rework bup.vfs: currently, if you'd call bup-restore on a path like that, it would instantiate a _lot_ of vfs-nodes you don't need - to begin with, it would make a node for every commit you ever made (on any branch!) - on a big repository you'd wait ages for it to just find the commit objects...
+"""]]
diff --git a/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment b/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment
@@ -0,0 +1,32 @@
+[[!comment format=mdwn
+ username="helmut"
+ ip="89.0.176.236"
+ subject="Asynchronous hooks?"
+ date="2012-10-13T09:46:14Z"
+ content="""
+Is there a way to use asynchronous remotes? Interaction with git annex would have to
+split the part of initiating some action from completing it.
+
+I imagine I could `git annex copy` a file to an asynchronous remote and the command
+would almost immediately complete. Later I would learn that the transfer is
+completed, so the hook must be able to record that information in the `git-annex`
+branch. An additional plumbing command seems required here as well as a way to
+indicate that even though the store-hook completed, the file is not transferred.
+
+Similarly `git annex get` would immediately return without actually fetching the
+file. This should already be possible by returning non-zero from the retrieve-hook.
+Later the hook could use plumbing level commands to actually stick the received file
+into the repository.
+
+The remove-hook should need no changes, but the checkpresent-hook would be more like
+a trigger without any actual result. The extension of the plumbing required for the
+extension to the receive-hook could update the location log. A downside here is that
+you never know when a fsck has completed.
+
+My proposal does not include a way to track the completion of actions, but relies on
+the hook to always complete them reliably. It is not clear that this is the best road
+for asynchronous hooks.
+
+One use case for this would be a remote that is only accessible via uucp. Are there
+other use cases? Is the drafted interface useful?
+"""]]
diff --git a/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment b/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"
+ nickname="Bence"
+ subject="More environment variables"
+ date="2013-07-09T10:28:58Z"
+ content="""
+Could you please include the original filename+path in the environment variables (_next to ANNEX_KEY & ANNEX_FILE_)? Like ANNEX_FILENAME and ANNEX_PATH.
+
+Having these infos in a hook would help eg. a flickr backend to be more usefull. [Tags](http://www.flickr.com/help/tags/) would contain the ANNEX_KEY and the image title could be the original filename (ANNEX_FILENAME). Also, having directory path (ANNEX_PATH) for the given file, the uploading process could put images into the proper sets/collections. Voila, you have a \"filesystem based\" flickr image gallery (almost like flickrfs).
+
+Other backends, like AmazonS3 having [meta data](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html) also could benefit from this. 
+
+To build the Death Star further, an _annex.$hooktype-**sync**-hook_ would instruct the backend to sync data, eg. place or move images/files in the proper image-sets/directories after they are moved/repositioned in git-annex, but that would be the backend's job, not git-annex's. Maybe the sync-hook would be called when _git annex sync_ is called. This is just an idea.
+
+While writing this, a new hook for sharing came into my mind: _annex.$hooktype-**share**-hook_.
+Calling this on a file/directory (_git annex share my_image_to_share.jpg_) would return a publicly shareable (short)url pointing to the file/directory. This would work for web-backends like AmazonS3, flickr, DropBox, Google Drive, ...
+"""]]
diff --git a/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment b/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"
+ nickname="Tobias"
+ subject="comment 3"
+ date="2013-07-09T10:54:58Z"
+ content="""
+I have requested this before. But it doesn't seem to be entirely doable because some items may have multiple equally correct filenames/paths. And some items may have zero filenames/paths.
+
+That said I hope a solution can be found because I really want this feature too. And would implement it in all my hooks.
+
+And for some of the cases i don't really see it as an issue. If you have a public flickr repo with clean(unencrypted) files. It is because you want to access existing files. If an object has no filename/path the hook could/would/should just ignore the file, sure this means no backup of old versions of files, but you can have other backends for those versions.
+
+The bigger issue is with the same file existing multiple places in the annex, which filename/path should be used? And the filename/path can change between sync(if it is deleted from one of the positions). I personally still see this as being entirely doable. The key for downloading would always be the same, so worst case scenario is the image may be duplicated on flickr. Or that the picture only one of the multiple folders it should be in on flickr. Still, i see these issues as being minor, and that usability would increase if this was implemented, even with these caveats.
+
+And there probably is some issues I haven't realized/know about.
+
+"""]]
diff --git a/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment b/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"
+ nickname="Bence"
+ subject="checkpresent success and failure"
+ date="2013-07-31T13:06:21Z"
+ content="""
+What value should be returned in the \"checkpresent-hook\" to signal that the given file does not exist in the given backend? 
+
+Should the called hook process return an exit code less or greater then zero? In this case the following is displayed: 
+>(user error (sh [\"-c\",\"name_of_the_process\"] exited 1)) failed
+
+This tells that the process failed (no internet connection or something that prevents the process from doing its job) and not that result is false, which would mean the file/entry does not exist in the given backend.
+If the return code is zero the file is treated as existing file/entry (no matter what I write to stderr).
+
+Also I think, the \"checkpresent\" block misses the ending ;; in the example.
+
+Here is my work-in-progress hook: https://gist.github.com/parhuzamos/31bf4516eea434e0d248
+"""]]
diff --git a/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment b/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.21"
+ subject="comment 5"
+ date="2013-07-31T16:25:55Z"
+ content="""
+The checkpresent hook should always exit 0 unless there was an exceptional condition (eg, perhaps it cannot check if the file exists one way or the other). Like the documentation for it says, the important thing is what it outputs to stdout, which should contain the key name if it's present, and should not contain the key name if it's not present.
+
+I hope you post to this website about your special remote when you get it fully working!
+"""]]
diff --git a/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment b/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"
+ nickname="Bence"
+ subject="comment 6"
+ date="2013-07-31T17:34:50Z"
+ content="""
+Roger that.
+
+If this is acceptable: [terminal output screenshot](http://i.imgur.com/lsJJYwF.png), than I'm almost done and will publish soon.
+(Of course a REST API using client would much be better, but this is just the start.)
+
+"""]]
diff --git a/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment b/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.21"
+ subject="comment 7"
+ date="2013-07-31T17:42:22Z"
+ content="""
+If I were you I'd suppress that \"File not found\" error.
+
+Hook special remotes *can* output messages to stderr, and it's also fine to output eg, progress bars to stdout when seding/receving files. But unnecessary cluttery output should be avoided.
+"""]]
diff --git a/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment b/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"
+ nickname="Bence"
+ subject="checkpresent again"
+ date="2013-08-01T23:18:38Z"
+ content="""
+In the current [HEAD](https://github.com/joeyh/git-annex/commit/bb74db6ef094324062adcf26a677113ee6fd0e58) the \"checkpresent\" method in [Hook.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Hook.hs#L145) is missing a \"return\" while other hooks have a return value eg. [Directory.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Directory.hs#L241), [Rsync.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Rsync.hs#L272), ...
+
+
+I noticed that if my *checkpresent* hook does not output anything (to be exact: I commented out all the lines in the block) it behaves strangely. I copied the test file to \"copyrepo\", removed it by hand (so git-annex does not know about the change) and executed a fsck.
+
+    ~/annex5/test1/123 $ git annex fsck --from copyrepo --fast
+    fsck somefile.1 (checking copyrepo...) (fixing location log) 
+      ** Based on the location log, somefile.1
+      ** was expected to be present, but its content is missing.
+    failed
+
+running the check again
+
+    ~/annex5/test1/123 $ ga fsck --from copyrepo --fast
+    fsck somefile.1 (checking copyrepo...) ok
+
+and running the check again without --fast
+
+    ~/annex5/test1/123 $ ga fsck --from copyrepo
+    fsck somefile.1 (checking copyrepo...) ok
+
+It thinks, the file is in the repo but it is not.
+
+"""]]
diff --git a/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment b/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.152.108.145"
+ subject="comment 9"
+ date="2013-08-01T23:51:48Z"
+ content="""
+The behavior you show with `fsck --from` is that the first time it's run against the damaged remote it notices the file is not present using the checkpresent hook. It then updates the location log. The subsequent times it's run, it sees that the location log says the file is not present in the remote. It verifies this is the case by calling the checkpresent hook. Since the two data sources agree, and numcopies is still satisfied, it prints \"ok\". There does not seem to be a bug here.
+
+(`return` in Haskell does not do what you would expect to happen in a traditional imperative language. It does not alter control flow, and any function using `return` can be mechanically converted to one that does not use `return`.)
+"""]]
diff --git a/doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment b/doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ subject="about copying to the local store"
+ date="2015-03-07T13:16:02Z"
+ content="""
+there's a [discussion](https://github.com/jbenet/go-ipfs/issues/875) happening upstream about how copying to the local datastore could be avoided.
+"""]]
diff --git a/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment b/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://olivier.berger.myopenid.com/"
+ nickname="obergix"
+ subject="Which URL prefix are supported ?"
+ date="2013-08-17T08:44:05Z"
+ content="""
+It is not clear whether only http:// URLs are supported. Can you list others ?
+"""]]
diff --git a/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment b/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 2"
+ date="2013-08-17T08:59:11Z"
+ content="""
+When it says \"arbitrary urls\", it means it. The only requirement is that the url be well formed and that wget or whatever command you have it configured to use via annex.web-download-command knows how to download it.
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment b/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"
+ nickname="Tobias"
+ subject="User defined server"
+ date="2013-04-17T09:45:59Z"
+ content="""
+It would be nice if you could expand the XMPP setup in the assistant to support an \"advanced\" settings view where a custom server could be defined.
+
+Example: I have a google Apps domain called mytest.com, with the users bla1@mytest.com and bla2@mytest.com. When trying to add either of those accounts to the assistant XMPP will try to use mytest.com as the jabber server, and not googles server.
+
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment b/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"
+ nickname="Andrew"
+ subject="comment 2"
+ date="2013-04-17T22:28:39Z"
+ content="""
+Yeah, I agree, this would be nice. 
+
+For your own domain, you can configure DNS like this: [[http://support.google.com/a/bin/answer.py?hl=en&answer=34143]] to make XMPP find the right server. But for some that's not an option and the \"advanced\" mode would be useful in that case.
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment b/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment
@@ -0,0 +1,28 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="46.19.143.203"
+ subject="Missing prerequisites for XMPP syncing?"
+ date="2013-09-17T06:53:59Z"
+ content="""
+I set up two fresh annexes that can talk via XMPP and no other way. After I fire up the assistants I expect them to sync their metadata, but nothing happens. One log gives me an 'XMPPClient: received: [\"Unknown message\"]' message every two minutes. The other one doesn't contain the string XMPP at all, not once. So my suspicion is that this particular version of git-annex doesn't support XMPP, which is weird because:
+
+    $ git annex version
+    git-annex version: 4.20130909
+    build flags: Assistant Pairing Testsuite S3 Inotify XMPP DNS Feeds
+    local repository version: 3
+    default repository version: 3
+    supported repository versions: 3 4
+    upgrade supported from repository versions: 0 1 2
+
+This is the version output from the other machine: 
+
+    $ git annex version
+    git-annex version: 4.20130827
+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+    local repository version: 3
+    default repository version: 3
+    supported repository versions: 3 4
+    upgrade supported from repository versions: 0 1 2
+
+What am I missing? Are there more build flags for XMPP than the one called XMPP? (Also, no, I can't just copy versions between machines b/c the architectures are different. And yep, the one giving me trouble is ARM.)
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment b/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.153.14.105"
+ subject="comment 4"
+ date="2013-09-19T21:07:35Z"
+ content="""
+If you have the XMPP flag in your git-annex build, it will support XMPP. Are you sure you set up the xmpp creds file and the xmpp special remote correctly on the ARM machine? (I assume it has no webapp, so you had to set that up manually..)
+
+Here's how you can do that manually:
+
+1. Run git-annex on a machine with the webapp, set up XMPP, and copy the .git/annex/creds/xmpp to the machine without the webapp.
+2. On the machine without the webapp, add a git remote that has its \"url = xmpp::loginname@xmppserver.com\" and its annex-uuid set to the annex.uuid of the repository on the first machine.
+3. Run git-annex assistant on the machine without the webapp.
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment b/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment
@@ -0,0 +1,73 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="37.221.161.234"
+ subject="Nope"
+ date="2013-09-24T22:05:55Z"
+ content="""
+Your guess is right, Joey, I'm configuring by hand as the ARM machine has no webapp. And yes, I'm mostly sure I set up everything correctly. The XMPP account is working, and my configuration of git-annex is all but identical to your example.
+
+Here's what I do. First on the machine with the webapp:
+
+    mkdir ~/test
+    cd ~/test
+    git init
+    git annex init
+    git annex webapp
+
+I set up XMPP from within the webapp. The file ~/test/.git/annex/creds/xmpp is created with the correct credentials. (BTW: The file's default permissions are 620 instead of 600 - is that a bug?)
+
+I add a file or two to the annex for good measure. Then, on the ARM machine:
+
+    mkdir ~/test
+    cd ~/test
+    git init
+    git annex init
+    mkdir .git/annex/creds
+    scp -2 webappmachine:~/test/.git/annex/creds/xmpp .git/annex/creds 
+    chmod 600 .git/annex/creds/xmpp
+    git remote add webappmachine xmpp::login@server
+
+The final step is to edit .git/config on the ARM machine. The [remote] section now looks like this:
+
+    [remote \"webappmachine\"]
+        url = xmpp::login@server
+        fetch = +refs/heads/*:refs/remotes/webappmachine/*
+        annex-uuid = aaaaaaaa-bbbb-cccc-dddddddddddd
+
+where aaaaaaaa-bbbb-cccc-dddddddddddd is the return value of `git config --get annex.uuid` on the webapp machine.
+
+I then run `git annex assistant` on the ARM machine and expect the two machines to synchronize their metadata, e.g. the number of knownn annex keys in the repo. But it doesn't happen.
+
+So I set `debug = true`, restart the assistants and check the log. This is what I get on the webapp machine:
+
+    [2013-09-24 17:45:41 EDT] XMPPClient: connected a5/25577ac4-3248-4c83-8391-bd93708bcf2b
+    [2013-09-24 17:45:41 EDT] XMPPClient: received: [\"Presence from a5/dc9bcde8-fe18-47de-807c-c620019279f2 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Presence from a5/900e3b6e-a7f4-4a6a-8d12-ed94de429258 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"push\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"])], elementNodes = []})\",\"NotifyPush [UUID \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"]\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: push notification for
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (CanPush (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\") [34f875cc7fa1198414f93990af9ab78e6cee893e,6fad42234060361435d6cf2ab4bd40e438c2d05c])\"]
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"git-annex\"]
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"log\",\"refs/heads/git-annex..6fad42234060361435d6cf2ab4bd40e438c2d05c\",\"--oneline\",\"-n1\"]
+    [2013-09-24 17:45:42 EDT] chat: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"cat-file\",\"--batch\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Unknown message\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (PushRequest (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\"))\"]
+    [2013-09-24 17:45:42 EDT] XMPPSendPack: started running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\"))
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]
+    [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]
+    [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]
+    [2013-09-24 17:45:42 EDT] call: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"branch\",\"-f\",\"synced/master\"]
+    [2013-09-24 17:45:42 EDT] XMPPSendPack: finished running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\")) False
+
+And from then on, in two-minute intervals:
+
+    [2013-09-24 17:47:42 EDT] XMPPClient: received: [\"Unknown message\"]
+    [2013-09-24 17:49:42 EDT] XMPPClient: received: [\"Unknown message\"]
+    [2013-09-24 17:51:42 EDT] XMPPClient: received: [\"Unknown message\"]
+    
+The log on the ARM machine is rather unhelpful. Actually it doesn't even contain the string \"XMPP\". This looks to me like the webapp machine tries to communicate via Jabber but doesn't get any intelligible answer. And this is the reason I wondered whether the problem lies with my self-compiled ARM git-annex  binary. I actually spent a while compiling 4.20130909 with all flags but webapp and webdav, but the result is still the same. 
+
+Any other ideas what I'm doing wrong here?
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment b/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.152.108.220"
+ subject="comment 6"
+ date="2013-09-25T18:13:24Z"
+ content="""
+If you're not getting an \"XMPPClient: connected\", then my guess would be that your git-annex build's XMPP is screwed up somehow. For example, if it hung forever when connecting to the XMPP server, it would never get as far as printing that message. (If it tried and failed to connect, you'd get a message about the connection having failed.)
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment b/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="RaspberryPie"
+ ip="46.165.221.166"
+ subject="comment 7"
+ date="2013-09-26T03:46:18Z"
+ content="""
+I see. Is there a way to check whether the build is corrupt? The build logs gave me nothing. 
+
+Anyway, XMPP is not the most important feature to me. It still bugs me though that it doesn't work when it should.  
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment b/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"
+ nickname="Carlo"
+ subject="comment 8"
+ date="2013-10-22T14:30:58Z"
+ content="""
+Same setup, same problem... no log output on raspberry pi.
+"""]]
diff --git a/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment b/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment
new file mode 100644
--- /dev/null
+++ b/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"
+ nickname="Jörn"
+ subject="Same problem, no XMPP showing up in daemon.log"
+ date="2013-11-21T21:13:16Z"
+ content="""
+I have the same setup like @RaspberryPie, except that my server is not running on the Pi but on Debian7-amd64. On my client (OSX, self-compiled using cabal) I can see XMPP log entries like @RaspberryPi, however, on the Debian7 machine (also self-compiled) I do not see any XMPP entry in the daemon.log. Setup regarding .git/annex/creds/xmpp and the special xmpp remote is correct (checked a thousand times).
+
+Do you have any idea what could be wrong, Joey? Thanks a lot.
+
+Output of git annex version:
+
+    git-annex version: 5.20131120
+    build flags: Assistant Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi CryptoHash 
+    key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+    remote types: git gcrypt S3 bup directory rsync web webdav glacier hook
+    local repository version: 4
+    default repository version: 3
+    supported repository versions: 3 5
+    upgrade supported from repository versions: 0 1 2 4
+
+Jörn
+"""]]
diff --git a/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/2djv2EYwk43rfJIAQXjYt_vfuOU-#a11a6"
+ nickname="Olivier R"
+ subject="It doesn't work 100%"
+ date="2012-05-03T21:42:54Z"
+ content="""
+When you remove tracked files... it doesn't show the new status. it's like if the file was ignored.
+
+
+"""]]
diff --git a/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00"
+ nickname="Jakukyo"
+ subject="comment 2"
+ date="2013-09-05T12:14:42Z"
+ content="""
+> There are two gotchas...
+
+So just always run `git annex add` after editing a file
+and `git update-index --really-refresh` after migrating
+backend?
+
+"""]]
diff --git a/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment b/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"
+ nickname="Ovidiu"
+ subject="Syncing not working :-/"
+ date="2014-05-17T19:52:33Z"
+ content="""
+Error log says:
+
+    git-annex-remote-skydrive is not installed in PATH (/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/usr/bin:/bin:/usr/sbin:/sbin)
+
+BUT I did a symlink, I even did 2 to 2 different locations that are in my path:
+
+    cd /Users/ovi/skydriveannex/
+    ln -sf `pwd`/git-annex-remote-skydrive /usr/bin/git-annex-remote-skydrive
+    ln -sf `pwd`/git-annex-remote-skydrive /opt/local/bin/git-annex-remote-skydrive
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY"
+ nickname="Matt"
+ subject="ANNEX_S3 vs AWS for keys"
+ date="2012-05-29T12:24:25Z"
+ content="""
+The instructions state ANNEX_S3_ACCESS_KEY_ID and ANNEX_SECRET_ACCESS_KEY but git-annex cannot connect with those constants. git-annex tells me to set both \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\" instead, which works. This is with Xubuntu 12.04.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.153.81.112"
+ subject="comment 2"
+ date="2012-05-29T19:10:42Z"
+ content="""
+Thanks, I've fixed that. (You could have too.. this is a wiki ;)
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment b/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="annexuser"
+ ip="64.71.7.82"
+ subject="Altering AWS credentials"
+ date="2014-04-15T21:59:43Z"
+ content="""
+If I revoke old AWS credentials and create new ones, how would I inform git-annex of the change to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`?
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment b/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.191"
+ subject="comment 4"
+ date="2014-04-17T19:44:55Z"
+ content="""
+You can use `git annex enableremote` to change an existing remote's configuration. So this should work:
+
+    # export AWS_ACCESS_KEY_ID=\"newRANDOMGOBBLDEYGOOK\"
+    # export AWS_SECRET_ACCESS_KEY=\"news3kr1t\"
+    # git annex enableremote cloud
+
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment b/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkmN2ZZIdYNiFKmEH7rz4jMb6sYsx_dptA"
+ nickname="Jack William"
+ subject="What if you do not want to encrypt?"
+ date="2014-09-07T18:35:19Z"
+ content="""
+Once use case for GIT with Amazon S3 is to maintain a web site on S3 you can easily update from a local machine. In that case you would not want to encrypt. Is encryption optional? This isn't clear from the instructions.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment b/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://schnouki.net/"
+ nickname="Schnouki"
+ subject="comment 6"
+ date="2014-09-09T12:48:59Z"
+ content="""
+Jack, if you don't want to use encryption you can use `encryption=none` as documented [here](http://git-annex.branchable.com/special_remotes/S3/).
+
+I'm not sure exactly what you're trying to do, but please note that you files won't be easily available on S3: they will be named as git-annex keys, with long and unreadable names such as \"SHA256E-s6311--c7533fdd259d872793b7298cbb56a1912e80c52a845661b0b9ff391c65ee2abc.html\" instead of \"index.html\".
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment b/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment
@@ -0,0 +1,33 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"
+ nickname="Giovanni"
+ subject="How to publish your files to the public"
+ date="2014-09-13T15:29:18Z"
+ content="""
+I don't know if this is what Jack wanted, but you can upload your files to S3 and let them be accessible through a public URL.
+
+First, go to (or create) the bucket you will use at [S3](https://console.aws.amazon.com/s3/) and add a public get policy to it:
+
+```
+   {
+    	\"Version\": \"2008-10-17\",
+    	\"Statement\": [
+    		{
+    			\"Sid\": \"AllowPublicRead\",
+    			\"Effect\": \"Allow\",
+    			\"Principal\": {
+    				\"AWS\": \"*\"
+    			},
+    			\"Action\": \"s3:GetObject\",
+    			\"Resource\": \"arn:aws:s3:::BUCKETNAME/*\"
+    		}
+    	]
+    }
+```
+
+Then set up your special remote with the options `encryption=none`, `bucket='BUCKETNAME'` `chunk=0` (and any others you want).
+
+Your files will be accessible through `http://BUCKETNAME.s3-website-LOCATION.amazonaws.com/KEY` where location is the one specified through the options `datacenter` and KEY is the SHA-SOMETHING hash of the file, created by git annex and accessible if you run `git annex lookupkey FILEPATH`.
+
+This way you can share a link to each file you have at your S3 remote.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment b/doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkPIqJZ88VZEVqLhLOd1LMdYXcy6bAW9qE"
+ nickname="Lemao"
+ subject="comment 8"
+ date="2015-01-07T13:54:23Z"
+ content="""
+I use github as my central git repository and I would like to use S3 to store large files with annex. Since the s3 remote in .git/config is not stored in github, how do I make sure I reconnect to the same s3 bucket in case I delete my local clone? Reinitializing the remote will create a completely new bucket.
+
+I would also be a good idea to centralize git-annex folders inside a single bucket so I keep the global namespace under control and can narrow down the permissioning.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment b/doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ subject="comment 9"
+ date="2015-01-07T17:25:43Z"
+ content="""
+Lemao, make sure you have pushed your git-annex branch to your central git repository.
+
+When you clone that repo elsewhere, you can add the S3 remote by running `git annex enableremote cloud` (replace \"cloud\" with whatever name you originally picked when you used `git annex initremote` to set up the S3 remote in the first place.
+
+git-annex stores the necessary configuration of the S3 remote on the git-annex branch.
+"""]]
diff --git a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn
--- a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn
+++ b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn
@@ -28,7 +28,7 @@
 
     git remote add desktop ssh://desktop/~/annex 
 
-However for the desktop to add an ever changing laptops hostname it's a little tricky.  We make use of remote SSH tunnels to do this.  Essentially we have the laptop (which always knows it's own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on it's own SSH server port (22).
+However for the desktop to add an ever changing laptops hostname it's a little tricky.  We make use of remote SSH tunnels to do this.  Essentially we have the laptop (which always knows its own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on its own SSH server port (22).
 
 To do this make part of your laptop's SSH config look like this:
 
diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn
@@ -0,0 +1,9 @@
+### Please describe the problem.
+Instead of storing config for each remote in ~/.ssh/config, which mixes the user own config with that of git-annex-assistant, which is irritating if (like me) you store your ssh config in a vcs. Since the option -F allows the choice of the config file, it should be possible to move the config into ~/.ssh/git-annex/config. The only issue I see is according to the ssh man page on my system states that the system-wide config is ignored if a config file is specified on the command line.
+
+### What version of git-annex are you using? On what operating system?
+I'm using git-annex 4.20130601 on a Debian Testing/Unstable/Experimental mix.
+
+[[!tag design/assistant]]
+
+[[wontfix]]
diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn
@@ -0,0 +1,7 @@
+There are times when it is handy to be able to upload a file to a web host somewhere and share a link for that file to a select few people.
+
+It seems to be that the assistant could handle this scenario. It could generate a directory with a random name on the remote, and transfer the file there (using the existing filename) and the appropriate URL could be displayed in the assistant webapp to allow the user to copy the URL to send it to the appropriate people.
+
+Note: Joey and I had a quick chat about this use case at LCA2013.
+
+[[!tag design/assistant]]
diff --git a/doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn b/doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn
@@ -0,0 +1,26 @@
+So annex is super cool and all. But there is one really annoying thing about it. The symlinks disrupt workflow really horribly! For example if I have a .psd file that is annex'd and I open that file in photoshop, edit it, then try to save it again. It doesn't allow me, because the actual file is the one deep in the annex sub structure that is read only. There a bunch of other annoyances like this. But you basically can't work with annex'd files without some additional struggle.
+
+But there is a solution to this. Just don't symlink the files that are active. I think potentially the simplest way to do this is to have a 'annex' and 'unannex' command. Or rather, a 'create symlink' and 'uncreate symlink' command. 
+
+So then you can be going along, doing your work, nothing in your directory symlinked.
+
+You then type you 'annex symlink' command all priorly annexed filed will be deleted and replaced with their symlinks.
+
+Then you can add your new files to annex. Adding new files will just automatically symlink them unless you put like a -ns or something to signify to not symlink them.
+
+With all priorly annexed filed symlinked and all your new files symlinked, you then git commit and push.
+
+Then you do a git annex unsymlink command. And then all your symlinks are deleted and the actual file placed there.
+
+Then you just type git annex symlink again to re-symlink them all.
+
+> I think you are looking for the `unlock` and `add` (or `lock`) commands. Basically, to edit the file in photoshop, you want:
+>
+> <pre>
+> git annex unlock file.psd
+> photoshop file.psd # ...
+> git annex add file.psd # if you are happy with your changes or...
+> git annex lock file.psd # if you want to discard your changes
+> </pre>
+>
+> So basically what you are asking for is already [[done]], in my mind. I still think there are significant [[usability issues|forum/usability:_what_are_those_arrow_things__63__/]] with symlinks, but that's another story. --[[anarcat]]
diff --git a/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 1"
+ date="2011-05-17T07:27:02Z"
+ content="""
+Sounds like a good idea.
+
+* git annex fsck (or similar) should check/rebuild the caches
+* I would simply require a clean tree with a verbose error. 80/20 rule and defaulting to save actions.
+"""]]
diff --git a/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.172"
+ subject="comment 1"
+ date="2014-02-21T21:36:14Z"
+ content="""
+This really depends on the remote, some can resume where they were interrupted, such as rsync, and some cannot, such as glacier (and, er, encrypted rsync).
+"""]]
diff --git a/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://grossmeier.net/"
+ nickname="greg"
+ subject="very remote specific"
+ date="2014-02-21T22:11:16Z"
+ content="""
+Yeah, this is very remote specific and probably means adding the functionality there as well (eg: in the glacier.py code, not only in git-annex haskell). Maybe I should file bugs there accordingly :)
+"""]]
diff --git a/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.172"
+ subject="comment 3"
+ date="2014-02-21T22:34:14Z"
+ content="""
+Hmm, I forget if it's possible for git-annex to mask SIGINT when it runs glacier or rsync, so that the child process does not receive it, but the parent git-annex does.
+"""]]
diff --git a/doc/todo/enable_a_discussion_forum_or_support_system.mdwn b/doc/todo/enable_a_discussion_forum_or_support_system.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/enable_a_discussion_forum_or_support_system.mdwn
@@ -0,0 +1,132 @@
+I has been [[discussed|devblog/day_268_stressed_out]]
+[[twice|devblog/day_285__tuning_git-annex_unused_refs]] that the
+current [[forum]] support system is not ideal for providing
+support. It constitutes the [largest part of this wiki][] yet we
+sometimes get duplicated questions and it seems the forum may be a
+barrier to entry for people.
+
+ [largest part of this wiki]: http://git-annex.branchable.com/devblog/day_268_stressed_out/#comment-e0814585df0047e6d4e11515aebe1dec
+
+A few alternatives have been proposed, from a mailing list to using a
+StackExchange site. This post is to discuss the possible
+alternatives. The requirement is that the system may be available
+offline and on low-bandwidth connections yet enable conversations
+better than a simple web forum or mailing list; which may end up being
+the only solution considering the first requirements, but let's give
+it a try. :)
+
+Stack exchange
+==============
+
+i looked up how this works in stackexchange, and it turns out they
+provide [regular dumps][] of the data hosted. unfortunately, it's a
+gigantic zip file and not really designed for low-bandwidth
+use. There's also a [data explorer][] that was promising, until i
+realized that the query engine takes up 154KB, three times the space
+of the regular search engine (~54KB, which I guess is way too much for
+dialup).
+
+ [regular dumps]: http://blog.stackoverflow.com/category/cc-wiki-dump/
+ [data explorer]: http://data.stackexchange.com/
+
+Also: there is a [mobile version][] of all the stackexchange sites,
+which take up around 3KB, but still only works online. There's an app
+for mobile devices as well, but it [doesn't support offline access
+either][] - so another dead-end.
+
+ [mobile version]: http://meta.stackexchange.com/questions/104458/switch-to-mobile-site-on-standard-browser
+ [doesn't support offline access either]: http://meta.stackexchange.com/questions/220036/offline-features-in-stack-exchange-app
+
+Stackexchange runs a [garbled mess][] of IIS, MSSQL, ASP, Redis and
+Elasticsearch so there is probably little hope in integrating into
+something like git. I have asked for the [proverbial pony in this
+stackexchange question][] (yes, it's all very meta), describing the
+use case, but i am not holding my breath for a change.
+
+ [garbled mess]: http://en.wikipedia.org/wiki/Stack_Exchange#Technologies_used
+ [proverbial pony in this stackexchange question]: http://meta.stackexchange.com/questions/256573/best-way-to-use-stackexchange-sites-offline-or-on-dialup
+ 
+Askbot
+======
+
+Besides, SE sites are based on proprietary software, and i am not sure
+we'd want to advocate that here. There are free software alternatives,
+of which i made an [evaluation about 2 years ago][] after which we
+tried Askbot at [Koumbit][]. it never took off: staff didn't seem
+interested in it so much and we never made people aware of it too
+much. plus, it didn't integrate with existing authentication
+mechanisms (which are a little bit of a mess for us)...
+
+But it does seem like an interesting alternative, and has [primitive
+email integration][] where you can ask questions by email, but not
+answer (!). I haven't looked at such support in other software, but i
+suspect it is similarly not a priority as they struggle to monetize
+their free software...
+
+Most of those free software alternatives of Stackexchange are written
+in Python/Django or Ruby/Rails (iirc) with SQL backends, which would
+probably make git integration... also "challenging".
+
+ [evaluation about 2 years ago]: (https://wiki.koumbit.net/FaqService#A.2BAMk-valuation_logicielle)
+ [Koumbit]: http://koumbit.org/
+ [primitive email integration]: http://askbot.org/doc/sending-email-to-askbot.html
+
+Discourse
+=========
+
+From that point of view, maybe [discourse][] could be an interesting
+alternative. It has built-in email support, as it is designed as an
+alternative to mailing lists. With a simple setting, you can
+collaborate directly by email. What is interesting, compared to the
+mailing list model, is that posts can be collaboratively edited to
+(for example) arrive at a collective wisdom by refining an answer (or
+a question). There are also interesting community moderation and
+reputation systems.
+
+There seems to be some [offline tool][] for Discourse, but it's
+unclear to me how it works, as it seems to be a separate (nodejs!)
+application that connects with a discourse plugin. There's a
+[discussion about offline suport in discourse][] in the meta site...
+
+Discourse uses Ruby/Rails and PostgreSQL, and somewhat is only
+[officially supported in Docker][]...
+
+The discourse people do [warn against switching existing
+communities][] to Discourse because of the resulting friction, so it
+is also in that spirit that I open discussion about this here, that
+is, in the hope the change can be acknowledged, supported and
+discussed by everyone here, in a spirit of consensus building. :)
+
+ [offline tool]: https://github.com/etewiah/offcourse
+ [discussion about offline suport in discourse]: https://meta.discourse.org/t/offcourse-a-proof-of-concept-offline-reader-for-discourse/22356
+ [discourse]: http://discourse.org/
+ [warn against switching existing communities]: http://www.discourse.org/faq/#switch
+ [officially supported in Docker]: https://github.com/discourse/discourse/blob/master/docs/INSTALL.md
+
+Mailing lists
+=============
+
+Of course, the forum could simply be moved to a mailing list. The
+would have the advantage of reducing the barrier of entry to the site,
+reduce the load on the wiki, at the cost of adding the additionnal
+"how do i subscribe to a mailing list" barrier of entry, which, oddly
+enough, exists for a lot of mailing lists...
+
+Like it or not, web forums do enable a lot of less technical users to
+participate because they only need their web browser, and crossing
+that boundary can be hard for some people. Mailing lists also do not
+necessarily favor collaboration as much as the other systems, because
+they are articulated more towards discussion, as opposed to establishing
+common knowledge.
+
+A good option may be Mailman 3 which, with the new web interface, allows
+forum-like functionalities. Mailman 2 also used to have a usenet interface,
+not sure what became of that in Mailman 3.
+
+Web forums
+==========
+
+There's a plethora of "php-bb-like" software out there, i am just
+ignoring them for now, as I am not very familiar with them and they
+have never been too attractive for me, but people are of course free
+to edit this page to add suggestions! :)
diff --git a/doc/todo/fcntl_locks_break_with_threaded_concurrency.mdwn b/doc/todo/fcntl_locks_break_with_threaded_concurrency.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/fcntl_locks_break_with_threaded_concurrency.mdwn
@@ -0,0 +1,29 @@
+When using git-annex get -J2, one thread can clear another thread's
+transfer lock.
+
+This happens because fcntl locking is used, and it is not thread-safe.
+<https://github.com/haskell/unix/issues/44>
+
+>        *  If a process closes any  file  descriptor  referring  to  a
+>           file,  then  all  of  the  process's locks on that file are
+>           released, regardless of the file descriptor(s) on which the
+>           locks  were obtained. 
+
+One thread starts a transfer and locks it; the second thread starts a
+transfer of a different file, and in order to check annex.diskreserve,
+checks to see which other transfers are currently running. In doing this
+check, it closes a fd attached to the first thread's lock, which causes the
+lock to be dropped.
+
+This only affects -J mode.
+
+To fix it, probably need to use STM to keep a list of transfers all threads
+in the current process are doing. Then the lock checking code can avoid
+re-opening locks for transfers in the STM list.
+
+A more generic approach is to use Annex.LockFile for everything,
+and make it check its lock pool via STM for other threads holding a lock.
+(Currently, the pool is only used for shared locks.)
+--[[Joey]] 
+
+> [[fixed|done]] via LockPools. --[[Joey]]
diff --git a/doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment b/doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2014-11-10T17:11:52Z"
+ content="""
+Hmm, well, there have been requests for access to files as they're being
+get-ed before. This does have the advantage of providing that,
+but I don't know if I like trying in xdg-open, which might not always
+be the way a user wants to open a file.
+
+git-annex does have progress info available while a file is being
+transferred. (If nothing else, it tends to know the key size, and can
+see the file size.) However I don't know how it could tell if "enough"
+of the file was available to stream it.
+
+I guess what I'd be most comfortable with is putting in plumbing.
+Like making `examinekey` be able to report the temporary file
+that is used when a key is being downloaded. It might also make sense to
+have a bit of plumbing that waits for a file being downloaded to get
+to X% complete, or something.
+"""]]
diff --git a/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="206.74.132.139"
+ subject="comment 1"
+ date="2014-02-06T17:26:58Z"
+ content="""
+I would be quite happy if someone took care of adding git-annex to openwrt.
+
+I don't have time to personally handle packaging for different linux distributions myself. What I could do is add mips builds of git-annex to the existing standalone linux builds. These would need to be built the same way the arm builds are done, using a Debian chroot and qemu to run tools from it. This is rather a lot of work for me to set up, and I don't know if I'd have to do it for both little and big endian mips.
+
+Also, it seems that Debian does not currently have a working haskell toolchain for mips. Which may well mean that ghc is not in a working state on mips at all.
+"""]]
diff --git a/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE"
+ nickname="Łukasz"
+ subject="comment 2"
+ date="2014-02-11T21:05:00Z"
+ content="""
+if debian does not have working toolchain for mips then there is no way to port it into mips machines.
+am i correct ?
+"""]]
diff --git a/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.172"
+ subject="comment 3"
+ date="2014-02-11T21:39:34Z"
+ content="""
+Actually, debian stable does still have ghc building for mips/mipsel. It's just newer versions that have failed to build and nobody has fixed it yet.
+"""]]
diff --git a/doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment b/doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2015-01-13T20:39:53Z"
+ content="""
+I checked, and the current status is that mips and mipsel in Debian have
+up-to-date builds of ghc and git-annex.
+"""]]
diff --git a/doc/todo/parallel_get.mdwn b/doc/todo/parallel_get.mdwn
--- a/doc/todo/parallel_get.mdwn
+++ b/doc/todo/parallel_get.mdwn
@@ -76,3 +76,6 @@
 > It has nice support for multiple progress bars, and is portable.
 > I have filed 7 issues on it, around 4 of which need to get fixed before
 > it's suitable for git-annex to use.. --[[Joey]]
+
+>> `git annex get -JN` works now, but lacks any progress display.
+>> Waiting on some updates to ascii-progress. --[[Joey]]
diff --git a/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog"
+ nickname="Michael"
+ subject="comment 1"
+ date="2013-03-01T01:26:36Z"
+ content="""
+This would indeed be very helpful when remotely mounting a photo/video collection over samba.
+"""]]
diff --git a/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://edheil.wordpress.com/"
+ ip="173.162.44.162"
+ subject="comment 2"
+ date="2013-03-01T04:50:28Z"
+ content="""
++1 this would be sweet as hell
+
+"""]]
diff --git a/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://ypid.wordpress.com/"
+ nickname="ypid"
+ subject="Please add this ;)"
+ date="2014-03-13T19:10:17Z"
+ content="""
++1 This would be so great. For me the only thing which is missing in this awesome project.
+"""]]
diff --git a/doc/todo/unused_by_refspec.mdwn b/doc/todo/unused_by_refspec.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/unused_by_refspec.mdwn
@@ -0,0 +1,41 @@
+Currently `git annex unused` assumes that all branches (including remote
+tracking branches) and tags are "used" and finds only objects not used by
+any of those refs.
+
+That's a reasonable default, but in some cases, we don't care about
+specific refs. Perhaps we don't consider remote tracking branches
+important. Or perhaps we only want objects in HEAD to be considered used.
+
+This could be handled by adding an option to specify a refspec when running
+git-annex unused. Only matching refs would be checked. It's probably worth
+making this be both a command-line option --used-refspec, as well as a
+annex.used-refspec config setting.
+
+git's refspec format is not quite right (since it specifies a local side
+and a remote side for push/pull). But, it can be used as a point of
+departure. Let's allow wildcards as it does, and use leading '+' to add a
+ref, and '-' to remove. Let the user specify multiple such expressions,
+separated by ':'.
+
+	+refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag
+
+This is processed by starting with an empty set of refs, and walking the
+refspec in order. 
+
+* Each + is matched against all known refs (from `git show-ref`), and adds
+  everything it matches to the set. If the + does not contain a wildcard,
+  it is literally added to the set, rather than looking in the known refs.
+  This allows "+refs/heads/*" to match all heads, and "+HEAD"
+  to match HEAD, or even "+sha" to match a given SHA, or "+HEAD^" to match
+  the previous head.
+* Each - is matched against the contents of the set, and removes everything
+  it matches, using a lexographic matching with wildcards (not looking at
+  the SHAs that the refs point to, so -refs/heads/master does not remove
+  +HEAD).
+
+Hmm, unused currently does a separate pass to find files used in the work
+tree. I think it's best to keep that as-is.
+
+--[[Joey]]
+
+> [[done]] --[[Joey]] 
diff --git a/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkRITTYYsN0TFKN7G5sZ6BWGZOTQ88Pz4s"
+ nickname="Zoltán"
+ subject="cygwin"
+ date="2012-05-15T00:14:08Z"
+ content="""
+What about [Cygwin](http://cygwin.com/)? It emulates POSIX fairly well under Windows (including signals, forking, fs (also things like /dev/null, /proc), unix file permissions), has all standard gnu utilities. It also emulates symlinks, but they are unfortunately incompatible with NTFS symlinks introduced in Vista [due to some stupid restrictions on Windows](http://cygwin.com/ml/cygwin/2009-10/msg00756.html).
+
+If git-annex could be modified to not require symlinks to work, the it would be a pretty neat solution (and you get a real shell, not some command.com on drugs (aka cmd.exe))
+"""]]
diff --git a/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk5cj-itfFHq_yhJHdzk3QOPp-PNW_MjPU"
+ nickname="Michael"
+ subject="+1 Cygwin"
+ date="2012-05-23T19:30:21Z"
+ content="""
+Windows support is a must. In my experience, binary file means proprietary editor, which means Windows.
+
+Unfortunately, there's not much overlap between people who use graphical editors in Windows all day vs. people who are willing to tolerate Cygwin's setup.exe, compile a Haskell program, learn git and git-annex's 90-odd subcommands, and use a mintty terminal to manage their repository, especially now that there's a sexy GitHub app for Windows.
+
+That aside, I think Windows-based content producers are still *the* audience for git-annex. First Windows support, then a GUI, then the world.
+"""]]
diff --git a/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://xolus.net/openid/max"
+ nickname="B0FH"
+ subject="What about NTFS support ?"
+ date="2012-08-02T17:45:10Z"
+ content="""
+Has git-annex been tested with an NTFS-formatted disk under Linux ? NTFS is supposed to be case-sensitive and to allow symlinks, and these are supposed to work with ntfs3g.
+"""]]
diff --git a/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc"
+ nickname="Paul"
+ subject="Re: What about NTFS support?"
+ date="2012-08-16T19:30:38Z"
+ content="""
+I successfully use git-annex on an NTFS formatted external USB drive, so yes, it is possible and works well.
+"""]]
diff --git a/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/dASECLNzvckz4VwqUGYsvthiplY.#d2c27"
+ nickname="A. D. Sicks"
+ subject="comment 5"
+ date="2012-09-09T23:48:21Z"
+ content="""
+Haskell has C++ binding, so it should be possible to port it to .net/Mono with a VB GUI for Windows users.  Windows has a primitive form of symlinks called shortcuts.  Perhaps shortcut support in Windows could replace the use of symlinks.  I've used shortcuts since XP to put my home Windows directory on another partition and never had a hitch...
+
+If anyone is interested in working on this, hit me up.  I would like to use this in my XP vbox to have access to files on my host OS...I have a student edition of Visual Studio 2005 to do an open source port...
+"""]]
diff --git a/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnlwEMhiNYv__mEUABW4scn83yMraC3hqE"
+ nickname="Sean"
+ subject="NTFS symlinks"
+ date="2013-01-11T21:44:21Z"
+ content="""
+It seems that NTFS (from Vista forward) has full POSIX support for symlinks. At least, Wikipedia [seems to think so.](http://en.wikipedia.org/wiki/NTFS_symbolic_link). What about doing like GitHub and using MinGW for compatibility? Cygwin absolutely blows in terms of installation size and compatability with the rest of Windows.
+"""]]
diff --git a/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"
+ nickname="Dominik"
+ subject="So close :-)"
+ date="2013-06-30T12:46:40Z"
+ content="""
+I was fighting my way forward until I read here that special remote with ssh+rsync and encryption doesn't work. Interestingly I got everything working so far, ssh login is keybased, gpg -k works and the remote setup also correctly cooperated with gpg... but it just didn't sync. Any ideas how complex it is to get this last missing piece moving?
+"""]]
diff --git a/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.4.193"
+ subject="comment 8"
+ date="2013-06-30T17:58:08Z"
+ content="""
+It should be easy to fix whatever's wrong the the rsync special remote. Just a matter of debugging that.
+
+Adding encryption support on Windows is stuck at a roadblock I don't know the way around. To drive gpg, git-annex uses the `--passphrase-fd` option, and sends the \"passphrase\" (really a big block of binary foo!) over a file descriptor of a pipe that it set up.
+
+Windows, AFAIK, doesn't have file descriptors, or at least there is no equivilant to them that I have access to in the Haskell POSIX compatability layer for Windows. I am reluctant to fall back to using `--passphrase-file` on Windows, since that would be a massive security hole (as would passing the passphrase as a parameter via `--passphrase=`).
+"""]]
diff --git a/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"
+ nickname="Dominik"
+ subject="comment 9"
+ date="2013-07-31T10:29:51Z"
+ content="""
+The tradeoff for me is a \"local\" security hole (where I can secure my own laptop) vs. a remotely exploitable thing... If it needs to go through a file, so be it -- it would however be good if that file would be overwritten with garbage before being deleted :-)
+"""]]
diff --git a/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment b/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="madduck"
+ ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c"
+ subject="Warn while inconsistent"
+ date="2014-04-06T20:44:17Z"
+ content="""
+Sure, git-annex prevents me from dropping files unless there are numcopies around elsewhere, but shouldn't it also ensure that numcopies cannot be set unless that requirement is already met?
+
+Furthermore, shouldn't it ensure that when new files are added, they are automatically distributed to fulfill the requirement?
+"""]]
diff --git a/git-annex.cabal b/git-annex.cabal
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
 Name: git-annex
-Version: 5.20150508.1
+Version: 5.20150522
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess <id@joeyh.name>
@@ -93,6 +93,10 @@
 Flag TorrentParser
   Description: Use haskell torrent library to parse torrent files
 
+Flag AsciiProgress
+  Description: Use ascii-progress library (experimental)
+  Default: False
+
 Flag EKG
   Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/)
   Default: False
@@ -223,9 +227,9 @@
      warp (>= 3.0.0.5),
      warp-tls,
      wai, wai-extra,
-     blaze-builder, crypto-api, hamlet, clientsession,
+     blaze-builder, crypto-api, clientsession,
      template-haskell, aeson,
-     shakespeare
+     shakespeare (>= 2.0.0)
     CPP-Options: -DWITH_WEBAPP
 
   if flag(Webapp) && flag (Webapp-secure)
@@ -259,6 +263,10 @@
   if flag(TorrentParser)
     Build-Depends: torrent (>= 10000.0.0)
     CPP-Options: -DWITH_TORRENTPARSER
+
+  if flag(AsciiProgress)
+    Build-Depends: ascii-progress (<= 0.2.1.2), terminal-size
+    CPP-Options: -DWITH_ASCIIPROGRESS
 
   if flag(EKG)
     Build-Depends: ekg
diff --git a/man/git-annex-add.1 b/man/git-annex-add.1
--- a/man/git-annex-add.1
+++ b/man/git-annex-add.1
@@ -1,6 +1,6 @@
 .TH git-annex-add 1
 .SH NAME
-git-annex add \- adds files to the git annex
+git-annex-add \- adds files to the git annex
 .PP
 .SH SYNOPSIS
 git annex add \fB[path ...]\fP
diff --git a/man/git-annex-addunused.1 b/man/git-annex-addunused.1
--- a/man/git-annex-addunused.1
+++ b/man/git-annex-addunused.1
@@ -1,6 +1,6 @@
 .TH git-annex-addunused 1
 .SH NAME
-git-annex addunused \- add back unused files
+git-annex-addunused \- add back unused files
 .PP
 .SH SYNOPSIS
 git annex addunused \fB[number|range ...]\fP
diff --git a/man/git-annex-addurl.1 b/man/git-annex-addurl.1
--- a/man/git-annex-addurl.1
+++ b/man/git-annex-addurl.1
@@ -1,6 +1,6 @@
 .TH git-annex-addurl 1
 .SH NAME
-git-annex addurl \- add urls to annex
+git-annex-addurl \- add urls to annex
 .PP
 .SH SYNOPSIS
 git annex addurl \fB[url ...]\fP
diff --git a/man/git-annex-assistant.1 b/man/git-annex-assistant.1
--- a/man/git-annex-assistant.1
+++ b/man/git-annex-assistant.1
@@ -1,6 +1,6 @@
 .TH git-annex-assistant 1
 .SH NAME
-git-annex assistant \- automatically sync changes
+git-annex-assistant \- automatically sync changes
 .PP
 .SH SYNOPSIS
 git annex assistant
diff --git a/man/git-annex-checkpresentkey.1 b/man/git-annex-checkpresentkey.1
--- a/man/git-annex-checkpresentkey.1
+++ b/man/git-annex-checkpresentkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-checkpresentkey 1
 .SH NAME
-git-annex checkpresentkey \- check if key is present in remote
+git-annex-checkpresentkey \- check if key is present in remote
 .PP
 .SH SYNOPSIS
 git annex  \fBkey remote\fP
diff --git a/man/git-annex-contentlocation.1 b/man/git-annex-contentlocation.1
--- a/man/git-annex-contentlocation.1
+++ b/man/git-annex-contentlocation.1
@@ -1,6 +1,6 @@
 .TH git-annex-contentlocation 1
 .SH NAME
-git-annex contentlocation \- looks up content for a key
+git-annex-contentlocation \- looks up content for a key
 .PP
 .SH SYNOPSIS
 git annex contentlocation \fB[key ...]\fP
diff --git a/man/git-annex-copy.1 b/man/git-annex-copy.1
--- a/man/git-annex-copy.1
+++ b/man/git-annex-copy.1
@@ -1,6 +1,6 @@
 .TH git-annex-copy 1
 .SH NAME
-git-annex copy \- copy content of files to/from another repository
+git-annex-copy \- copy content of files to/from another repository
 .PP
 .SH SYNOPSIS
 git annex copy \fB[path ...] [\-\-from=remote|\-\-to=remote]\fP
@@ -19,6 +19,10 @@
 .IP "\fB\-\-to=remote\fP"
 Use this option to copy the content of files from the local repository
 to the specified remote.
+.IP
+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"
+Enables parallel transfers with up to the specified number of jobs
+running at once. For example: \fB\-J10\fP
 .IP
 .IP "\fB\-\-auto\fP"
 Rather than copying all files, only copy files that don't yet have
diff --git a/man/git-annex-dead.1 b/man/git-annex-dead.1
--- a/man/git-annex-dead.1
+++ b/man/git-annex-dead.1
@@ -1,6 +1,6 @@
 .TH git-annex-dead 1
 .SH NAME
-git-annex trust \- hide a lost repository
+git-annex-trust \- hide a lost repository
 .PP
 .SH SYNOPSIS
 git annex dead \fB[repository ...]\fP
diff --git a/man/git-annex-describe.1 b/man/git-annex-describe.1
--- a/man/git-annex-describe.1
+++ b/man/git-annex-describe.1
@@ -1,6 +1,6 @@
 .TH git-annex-describe 1
 .SH NAME
-git-annex describe \- change description of a repository
+git-annex-describe \- change description of a repository
 .PP
 .SH SYNOPSIS
 git annex describe repository description
diff --git a/man/git-annex-diffdriver.1 b/man/git-annex-diffdriver.1
--- a/man/git-annex-diffdriver.1
+++ b/man/git-annex-diffdriver.1
@@ -1,6 +1,6 @@
 .TH git-annex-diffdriver 1
 .SH NAME
-git-annex diffdriver \- external git diff driver shim
+git-annex-diffdriver \- external git diff driver shim
 .PP
 .SH SYNOPSIS
 git annex diffdriver \fB\-\- cmd \-\-opts \-\-\fP
diff --git a/man/git-annex-direct.1 b/man/git-annex-direct.1
--- a/man/git-annex-direct.1
+++ b/man/git-annex-direct.1
@@ -1,6 +1,6 @@
 .TH git-annex-direct 1
 .SH NAME
-git-annex direct \- switch repository to direct mode
+git-annex-direct \- switch repository to direct mode
 .PP
 .SH SYNOPSIS
 git annex direct
diff --git a/man/git-annex-drop.1 b/man/git-annex-drop.1
--- a/man/git-annex-drop.1
+++ b/man/git-annex-drop.1
@@ -1,6 +1,6 @@
 .TH git-annex-drop 1
 .SH NAME
-git-annex drop \- indicate content of files not currently wanted
+git-annex-drop \- indicate content of files not currently wanted
 .PP
 .SH SYNOPSIS
 git annex drop \fB[path ...]\fP
@@ -29,6 +29,18 @@
 git-annex to delete the content of the specified files, even from
 the last repository that is storing their content. Data loss can
 result from using this option.
+.IP
+.IP "\fB\-\-all\fP"
+Rather than specifying a filename or path to drop, this option can be
+used to drop all available versions of all files.
+.IP
+This is the default behavior when running git-annex drop in a bare repository.
+.IP
+.IP "\fB\-\-unused\fP"
+Drop files found by last run of git-annex unused.
+.IP
+.IP "\fB\-\-key=keyname\fP"
+Use this option to drop a specified key.
 .IP
 .IP "file matching options"
 The git-annex\-matching\-options(1)
diff --git a/man/git-annex-dropkey.1 b/man/git-annex-dropkey.1
--- a/man/git-annex-dropkey.1
+++ b/man/git-annex-dropkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-dropkey 1
 .SH NAME
-git-annex dropkey \- drops annexed content for specified keys
+git-annex-dropkey \- drops annexed content for specified keys
 .PP
 .SH SYNOPSIS
 git annex dropkey \fB[key ...]\fP
diff --git a/man/git-annex-dropunused.1 b/man/git-annex-dropunused.1
--- a/man/git-annex-dropunused.1
+++ b/man/git-annex-dropunused.1
@@ -1,6 +1,6 @@
 .TH git-annex-dropunused 1
 .SH NAME
-git-annex dropunused \- drop unused file content
+git-annex-dropunused \- drop unused file content
 .PP
 .SH SYNOPSIS
 git annex dropunused \fB[number|range ...]\fP
diff --git a/man/git-annex-edit.1 b/man/git-annex-edit.1
--- a/man/git-annex-edit.1
+++ b/man/git-annex-edit.1
@@ -1,6 +1,6 @@
 .TH git-annex-edit 1
 .SH NAME
-git-annex unlock \- unlock files for modification
+git-annex-unlock \- unlock files for modification
 .PP
 .SH SYNOPSIS
 git annex edit \fB[path ...]\fP
diff --git a/man/git-annex-enableremote.1 b/man/git-annex-enableremote.1
--- a/man/git-annex-enableremote.1
+++ b/man/git-annex-enableremote.1
@@ -1,6 +1,6 @@
 .TH git-annex-enableremote 1
 .SH NAME
-git-annex enableremote \- enables use of an existing special remote
+git-annex-enableremote \- enables use of an existing special remote
 .PP
 .SH SYNOPSIS
 git annex enableremote \fBname [param=value ...]\fP
diff --git a/man/git-annex-examinekey.1 b/man/git-annex-examinekey.1
--- a/man/git-annex-examinekey.1
+++ b/man/git-annex-examinekey.1
@@ -1,6 +1,6 @@
 .TH git-annex-examinekey 1
 .SH NAME
-git-annex examinekey \- prints information from a key
+git-annex-examinekey \- prints information from a key
 .PP
 .SH SYNOPSIS
 git annex examinekey \fB[key ...]\fP
diff --git a/man/git-annex-expire.1 b/man/git-annex-expire.1
--- a/man/git-annex-expire.1
+++ b/man/git-annex-expire.1
@@ -1,6 +1,6 @@
 .TH git-annex-expire 1
 .SH NAME
-git-annex expire \- expire inactive repositories
+git-annex-expire \- expire inactive repositories
 .PP
 .SH SYNOPSIS
 git annex expire \fB[repository:]time ...\fP
diff --git a/man/git-annex-find.1 b/man/git-annex-find.1
--- a/man/git-annex-find.1
+++ b/man/git-annex-find.1
@@ -1,6 +1,6 @@
 .TH git-annex-find 1
 .SH NAME
-git-annex find \- lists available files
+git-annex-find \- lists available files
 .PP
 .SH SYNOPSIS
 git annex find \fB[path ...]\fP
diff --git a/man/git-annex-findref.1 b/man/git-annex-findref.1
--- a/man/git-annex-findref.1
+++ b/man/git-annex-findref.1
@@ -1,6 +1,6 @@
 .TH git-annex-findref 1
 .SH NAME
-git-annex findref \- lists files in a git ref
+git-annex-findref \- lists files in a git ref
 .PP
 .SH SYNOPSIS
 git annex findref \fB[ref]\fP
diff --git a/man/git-annex-fix.1 b/man/git-annex-fix.1
--- a/man/git-annex-fix.1
+++ b/man/git-annex-fix.1
@@ -1,6 +1,6 @@
 .TH git-annex-fix 1
 .SH NAME
-git-annex fix \- fix up symlinks to point to annexed content
+git-annex-fix \- fix up symlinks to point to annexed content
 .PP
 .SH SYNOPSIS
 git annex fix \fB[path ...]\fP
diff --git a/man/git-annex-forget.1 b/man/git-annex-forget.1
--- a/man/git-annex-forget.1
+++ b/man/git-annex-forget.1
@@ -1,6 +1,6 @@
 .TH git-annex-forget 1
 .SH NAME
-git-annex forget \- prune git-annex branch history
+git-annex-forget \- prune git-annex branch history
 .PP
 .SH SYNOPSIS
 git annex forget
diff --git a/man/git-annex-fromkey.1 b/man/git-annex-fromkey.1
--- a/man/git-annex-fromkey.1
+++ b/man/git-annex-fromkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-fromkey 1
 .SH NAME
-git-annex fromkey \- adds a file using a specific key
+git-annex-fromkey \- adds a file using a specific key
 .PP
 .SH SYNOPSIS
 git annex fromkey \fB[key file]\fP
diff --git a/man/git-annex-fsck.1 b/man/git-annex-fsck.1
--- a/man/git-annex-fsck.1
+++ b/man/git-annex-fsck.1
@@ -1,6 +1,6 @@
 .TH git-annex-fsck 1
 .SH NAME
-git-annex fsck \- check for problems
+git-annex-fsck \- check for problems
 .PP
 .SH SYNOPSIS
 git annex fsck \fB[path ...]\fP
diff --git a/man/git-annex-fuzztest.1 b/man/git-annex-fuzztest.1
--- a/man/git-annex-fuzztest.1
+++ b/man/git-annex-fuzztest.1
@@ -1,6 +1,6 @@
 .TH git-annex-fuzztest 1
 .SH NAME
-git-annex fuzztest \- generates fuzz test files
+git-annex-fuzztest \- generates fuzz test files
 .PP
 .SH SYNOPSIS
 git annex fuzztest
diff --git a/man/git-annex-get.1 b/man/git-annex-get.1
--- a/man/git-annex-get.1
+++ b/man/git-annex-get.1
@@ -1,6 +1,6 @@
 .TH git-annex-get 1
 .SH NAME
-git-annex get \- make content of annexed files available
+git-annex-get \- make content of annexed files available
 .PP
 .SH SYNOPSIS
 git annex get \fB[path ...]\fP
@@ -22,6 +22,10 @@
 from. Use this option to specify which remote to use. 
 .IP
 Any files that are not available on the remote will be silently skipped.
+.IP
+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"
+Enables parallel download with up to the specified number of jobs
+running at once. For example: \fB\-J10\fP
 .IP
 .IP "\fB\-\-all\fP"
 Rather than specifying a filename or path to get, this option can be
diff --git a/man/git-annex-group.1 b/man/git-annex-group.1
--- a/man/git-annex-group.1
+++ b/man/git-annex-group.1
@@ -1,6 +1,6 @@
 .TH git-annex-group 1
 .SH NAME
-git-annex group \- add a repository to a group
+git-annex-group \- add a repository to a group
 .PP
 .SH SYNOPSIS
 git annex group \fBrepository groupname\fP
diff --git a/man/git-annex-groupwanted.1 b/man/git-annex-groupwanted.1
--- a/man/git-annex-groupwanted.1
+++ b/man/git-annex-groupwanted.1
@@ -1,6 +1,6 @@
 .TH git-annex-groupwanted 1
 .SH NAME
-git-annex groupwanted \- get or set groupwanted expression
+git-annex-groupwanted \- get or set groupwanted expression
 .PP
 .SH SYNOPSIS
 git annex groupwanted \fBgroupname [expression]\fP
diff --git a/man/git-annex-import.1 b/man/git-annex-import.1
--- a/man/git-annex-import.1
+++ b/man/git-annex-import.1
@@ -1,6 +1,6 @@
 .TH git-annex-import 1
 .SH NAME
-git-annex import \- move and add files from outside git working copy
+git-annex-import \- move and add files from outside git working copy
 .PP
 .SH SYNOPSIS
 git annex import \fB[path ...]\fP
diff --git a/man/git-annex-importfeed.1 b/man/git-annex-importfeed.1
--- a/man/git-annex-importfeed.1
+++ b/man/git-annex-importfeed.1
@@ -1,6 +1,6 @@
 .TH git-annex-importfeed 1
 .SH NAME
-git-annex importfeed \- import files from podcast feeds
+git-annex-importfeed \- import files from podcast feeds
 .PP
 .SH SYNOPSIS
 git annex importfeed \fB[url ...]\fP
diff --git a/man/git-annex-indirect.1 b/man/git-annex-indirect.1
--- a/man/git-annex-indirect.1
+++ b/man/git-annex-indirect.1
@@ -1,6 +1,6 @@
 .TH git-annex-indirect 1
 .SH NAME
-git-annex indirect \- switch repository to indirect mode
+git-annex-indirect \- switch repository to indirect mode
 .PP
 .SH SYNOPSIS
 git annex indirect
diff --git a/man/git-annex-info.1 b/man/git-annex-info.1
--- a/man/git-annex-info.1
+++ b/man/git-annex-info.1
@@ -1,6 +1,6 @@
 .TH git-annex-info 1
 .SH NAME
-git-annex info \- shows information about the specified item or the repository as a whole
+git-annex-info \- shows information about the specified item or the repository as a whole
 .PP
 .SH SYNOPSIS
 git annex info \fB[directory|file|remote|uuid ...]\fP
diff --git a/man/git-annex-init.1 b/man/git-annex-init.1
--- a/man/git-annex-init.1
+++ b/man/git-annex-init.1
@@ -1,6 +1,6 @@
 .TH git-annex-init 1
 .SH NAME
-git-annex init \- initialize git-annex
+git-annex-init \- initialize git-annex
 .PP
 .SH SYNOPSIS
 git annex init \fB[description]\fP
diff --git a/man/git-annex-initremote.1 b/man/git-annex-initremote.1
--- a/man/git-annex-initremote.1
+++ b/man/git-annex-initremote.1
@@ -1,6 +1,6 @@
 .TH git-annex-initremote 1
 .SH NAME
-git-annex initremote \- creates a special (non\-git) remote
+git-annex-initremote \- creates a special (non\-git) remote
 .PP
 .SH SYNOPSIS
 git annex initremote \fBname type=value [param=value ...]\fP
diff --git a/man/git-annex-list.1 b/man/git-annex-list.1
--- a/man/git-annex-list.1
+++ b/man/git-annex-list.1
@@ -1,6 +1,6 @@
 .TH git-annex-list 1
 .SH NAME
-git-annex list \- show which remotes contain files
+git-annex-list \- show which remotes contain files
 .PP
 .SH SYNOPSIS
 git annex list \fB[path ...]\fP
diff --git a/man/git-annex-lock.1 b/man/git-annex-lock.1
--- a/man/git-annex-lock.1
+++ b/man/git-annex-lock.1
@@ -1,6 +1,6 @@
 .TH git-annex-lock 1
 .SH NAME
-git-annex lock \- undo unlock command
+git-annex-lock \- undo unlock command
 .PP
 .SH SYNOPSIS
 git annex lock \fB[path ...]\fP
diff --git a/man/git-annex-log.1 b/man/git-annex-log.1
--- a/man/git-annex-log.1
+++ b/man/git-annex-log.1
@@ -1,6 +1,6 @@
 .TH git-annex-log 1
 .SH NAME
-git-annex log \- shows location log
+git-annex-log \- shows location log
 .PP
 .SH SYNOPSIS
 git annex log \fB[path ...]\fP
diff --git a/man/git-annex-lookupkey.1 b/man/git-annex-lookupkey.1
--- a/man/git-annex-lookupkey.1
+++ b/man/git-annex-lookupkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-lookupkey 1
 .SH NAME
-git-annex lookupkey \- looks up key used for file
+git-annex-lookupkey \- looks up key used for file
 .PP
 .SH SYNOPSIS
 git annex lookupkey \fB[file ...]\fP
diff --git a/man/git-annex-map.1 b/man/git-annex-map.1
--- a/man/git-annex-map.1
+++ b/man/git-annex-map.1
@@ -1,6 +1,6 @@
 .TH git-annex-map 1
 .SH NAME
-git-annex map \- generate map of repositories
+git-annex-map \- generate map of repositories
 .PP
 .SH SYNOPSIS
 git annex map
diff --git a/man/git-annex-merge.1 b/man/git-annex-merge.1
--- a/man/git-annex-merge.1
+++ b/man/git-annex-merge.1
@@ -1,6 +1,6 @@
 .TH git-annex-merge 1
 .SH NAME
-git-annex merge \- automatically merge changes from remotes
+git-annex-merge \- automatically merge changes from remotes
 .PP
 .SH SYNOPSIS
 git annex merge
diff --git a/man/git-annex-metadata.1 b/man/git-annex-metadata.1
--- a/man/git-annex-metadata.1
+++ b/man/git-annex-metadata.1
@@ -1,6 +1,6 @@
 .TH git-annex-metadata 1
 .SH NAME
-git-annex metadata \- sets or gets metadata of a file
+git-annex-metadata \- sets or gets metadata of a file
 .PP
 .SH SYNOPSIS
 git annex metadata \fB[path ...]\fP
diff --git a/man/git-annex-migrate.1 b/man/git-annex-migrate.1
--- a/man/git-annex-migrate.1
+++ b/man/git-annex-migrate.1
@@ -1,6 +1,6 @@
 .TH git-annex-migrate 1
 .SH NAME
-git-annex migrate \- switch data to different backend
+git-annex-migrate \- switch data to different backend
 .PP
 .SH SYNOPSIS
 git annex migrate \fB[path ...]\fP
diff --git a/man/git-annex-mirror.1 b/man/git-annex-mirror.1
--- a/man/git-annex-mirror.1
+++ b/man/git-annex-mirror.1
@@ -1,6 +1,6 @@
 .TH git-annex-mirror 1
 .SH NAME
-git-annex mirror \- mirror content of files to/from another repository
+git-annex-mirror \- mirror content of files to/from another repository
 .PP
 .SH SYNOPSIS
 git annex mirror \fB[path ...] [\-\-to=remote|\-\-from=remote]\fP
@@ -26,6 +26,10 @@
 .IP "\fB\-\-from=remote\fP"
 Use the remote as the source repository, and mirror its contents to the local
 repository.
+.IP
+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"
+Enables parallel transfers with up to the specified number of jobs
+running at once. For example: \fB\-J10\fP
 .IP
 .IP "\fB\-\-all\fP"
 Mirror all objects stored in the git annex, not only objects used by
diff --git a/man/git-annex-move.1 b/man/git-annex-move.1
--- a/man/git-annex-move.1
+++ b/man/git-annex-move.1
@@ -1,6 +1,6 @@
 .TH git-annex-move 1
 .SH NAME
-git-annex move \- move content of files to/from another repository
+git-annex-move \- move content of files to/from another repository
 .PP
 .SH SYNOPSIS
 git annex move \fB[path ...] [\-\-from=remote|\-\-to=remote]\fP
@@ -17,6 +17,10 @@
 .IP "\fB\-\-to=remote\fP"
 Use this option to move the content of files from the local repository
 to the specified remote.
+.IP
+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"
+Enables parallel transfers with up to the specified number of jobs
+running at once. For example: \fB\-J10\fP
 .IP
 .IP "\fB\-\-all\fP"
 Rather than specifying a filename or path to move, this option can be
diff --git a/man/git-annex-numcopies.1 b/man/git-annex-numcopies.1
--- a/man/git-annex-numcopies.1
+++ b/man/git-annex-numcopies.1
@@ -1,6 +1,6 @@
 .TH git-annex-numcopies 1
 .SH NAME
-git-annex numcopies \- configure desired number of copies
+git-annex-numcopies \- configure desired number of copies
 .PP
 .SH SYNOPSIS
 git annex numcopies \fBN\fP
diff --git a/man/git-annex-pre-commit.1 b/man/git-annex-pre-commit.1
--- a/man/git-annex-pre-commit.1
+++ b/man/git-annex-pre-commit.1
@@ -1,6 +1,6 @@
 .TH git-annex-pre-commit 1
 .SH NAME
-git-annex pre\-commit \- run by git pre\-commit hook
+git-annex-pre\-commit \- run by git pre\-commit hook
 .PP
 .SH SYNOPSIS
 git annex pre\-commit \fB[path ...]\fP
diff --git a/man/git-annex-proxy.1 b/man/git-annex-proxy.1
--- a/man/git-annex-proxy.1
+++ b/man/git-annex-proxy.1
@@ -1,6 +1,6 @@
 .TH git-annex-proxy 1
 .SH NAME
-git-annex proxy \- safely bypass direct mode guard
+git-annex-proxy \- safely bypass direct mode guard
 .PP
 .SH SYNOPSIS
 git annex proxy \fB\-\- git cmd [options]\fP
diff --git a/man/git-annex-readpresentkey.1 b/man/git-annex-readpresentkey.1
--- a/man/git-annex-readpresentkey.1
+++ b/man/git-annex-readpresentkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-readpresentkey 1
 .SH NAME
-git-annex readpresentkey \- read records of where key is present
+git-annex-readpresentkey \- read records of where key is present
 .PP
 .SH SYNOPSIS
 git annex readpresentkey \fBkey uuid\fP
diff --git a/man/git-annex-registerurl.1 b/man/git-annex-registerurl.1
--- a/man/git-annex-registerurl.1
+++ b/man/git-annex-registerurl.1
@@ -1,6 +1,6 @@
 .TH git-annex-registerurl 1
 .SH NAME
-git-annex registerurl \- registers an url for a key
+git-annex-registerurl \- registers an url for a key
 .PP
 .SH SYNOPSIS
 git annex registerurl \fB[key url]\fP
diff --git a/man/git-annex-reinit.1 b/man/git-annex-reinit.1
--- a/man/git-annex-reinit.1
+++ b/man/git-annex-reinit.1
@@ -1,6 +1,6 @@
 .TH git-annex-reinit 1
 .SH NAME
-git-annex reinit \- initialize repository, reusing old UUID
+git-annex-reinit \- initialize repository, reusing old UUID
 .PP
 .SH SYNOPSIS
 git annex reinit \fBuuid|description\fP
diff --git a/man/git-annex-reinject.1 b/man/git-annex-reinject.1
--- a/man/git-annex-reinject.1
+++ b/man/git-annex-reinject.1
@@ -1,6 +1,6 @@
 .TH git-annex-reinject 1
 .SH NAME
-git-annex reinject \- sets content of annexed file
+git-annex-reinject \- sets content of annexed file
 .PP
 .SH SYNOPSIS
 git annex reinject \fBsrc dest\fP
diff --git a/man/git-annex-rekey.1 b/man/git-annex-rekey.1
--- a/man/git-annex-rekey.1
+++ b/man/git-annex-rekey.1
@@ -1,6 +1,6 @@
 .TH git-annex-rekey 1
 .SH NAME
-git-annex rekey \- change keys used for files
+git-annex-rekey \- change keys used for files
 .PP
 .SH SYNOPSIS
 git annex rekey \fB[file key ...]\fP
diff --git a/man/git-annex-remotedaemon.1 b/man/git-annex-remotedaemon.1
--- a/man/git-annex-remotedaemon.1
+++ b/man/git-annex-remotedaemon.1
@@ -1,6 +1,6 @@
 .TH git-annex-remotedaemon 1
 .SH NAME
-git-annex remotedaemon \- detects when remotes have changed, and fetches from them
+git-annex-remotedaemon \- detects when remotes have changed, and fetches from them
 .PP
 .SH SYNOPSIS
 git annex remotedaemon
diff --git a/man/git-annex-repair.1 b/man/git-annex-repair.1
--- a/man/git-annex-repair.1
+++ b/man/git-annex-repair.1
@@ -1,6 +1,6 @@
 .TH git-annex-repair 1
 .SH NAME
-git-annex repair \- recover broken git repository
+git-annex-repair \- recover broken git repository
 .PP
 .SH SYNOPSIS
 git annex repair
diff --git a/man/git-annex-required.1 b/man/git-annex-required.1
--- a/man/git-annex-required.1
+++ b/man/git-annex-required.1
@@ -1,6 +1,6 @@
 .TH git-annex-required 1
 .SH NAME
-git-annex required \- get or set required content expression
+git-annex-required \- get or set required content expression
 .PP
 .SH SYNOPSIS
 git annex required \fBrepository [expression]\fP
diff --git a/man/git-annex-resolvemerge.1 b/man/git-annex-resolvemerge.1
--- a/man/git-annex-resolvemerge.1
+++ b/man/git-annex-resolvemerge.1
@@ -1,6 +1,6 @@
 .TH git-annex-resolvemerge 1
 .SH NAME
-git-annex resolvemerge \- resolve merge conflicts
+git-annex-resolvemerge \- resolve merge conflicts
 .PP
 .SH SYNOPSIS
 git annex resolvemerge
diff --git a/man/git-annex-rmurl.1 b/man/git-annex-rmurl.1
--- a/man/git-annex-rmurl.1
+++ b/man/git-annex-rmurl.1
@@ -1,6 +1,6 @@
 .TH git-annex-rmurl 1
 .SH NAME
-git-annex rmurl \- record file is not available at url
+git-annex-rmurl \- record file is not available at url
 .PP
 .SH SYNOPSIS
 git annex rmurl \fBfile url\fP
diff --git a/man/git-annex-schedule.1 b/man/git-annex-schedule.1
--- a/man/git-annex-schedule.1
+++ b/man/git-annex-schedule.1
@@ -1,6 +1,6 @@
 .TH git-annex-schedule 1
 .SH NAME
-git-annex schedule \- get or set scheduled jobs
+git-annex-schedule \- get or set scheduled jobs
 .PP
 .SH SYNOPSIS
 git annex schedule \fBrepository [expression]\fP
diff --git a/man/git-annex-semitrust.1 b/man/git-annex-semitrust.1
--- a/man/git-annex-semitrust.1
+++ b/man/git-annex-semitrust.1
@@ -1,6 +1,6 @@
 .TH git-annex-semitrust 1
 .SH NAME
-git-annex semitrust \- return repository to default trust level
+git-annex-semitrust \- return repository to default trust level
 .PP
 .SH SYNOPSIS
 git annex semitrust \fB[repository ...]\fP
diff --git a/man/git-annex-setpresentkey.1 b/man/git-annex-setpresentkey.1
--- a/man/git-annex-setpresentkey.1
+++ b/man/git-annex-setpresentkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-setpresentkey 1
 .SH NAME
-git-annex setpresentkey \- change records of where key is present
+git-annex-setpresentkey \- change records of where key is present
 .PP
 .SH SYNOPSIS
 git annex setpresentkey \fBkey uuid [1|0]\fP
diff --git a/man/git-annex-shell.1 b/man/git-annex-shell.1
--- a/man/git-annex-shell.1
+++ b/man/git-annex-shell.1
@@ -33,6 +33,10 @@
 This checks if all specified keys are present in the annex, 
 and exits zero if so.
 .IP
+Exits 1 if the key is certianly not present in the annex.
+Exits 100 if it's unable to tell (perhaps the key is in the process of
+being removed from the annex).
+.IP
 .IP "dropkey directory [key ...]"
 This drops the annexed data for the specified keys.
 .IP
diff --git a/man/git-annex-status.1 b/man/git-annex-status.1
--- a/man/git-annex-status.1
+++ b/man/git-annex-status.1
@@ -1,6 +1,6 @@
 .TH git-annex-status 1
 .SH NAME
-git-annex status \- show the working tree status
+git-annex-status \- show the working tree status
 .PP
 .SH SYNOPSIS
 git annex status \fB[path ...]\fP
diff --git a/man/git-annex-sync.1 b/man/git-annex-sync.1
--- a/man/git-annex-sync.1
+++ b/man/git-annex-sync.1
@@ -1,6 +1,6 @@
 .TH git-annex-sync 1
 .SH NAME
-git-annex sync \- synchronize local repository with remotes
+git-annex-sync \- synchronize local repository with remotes
 .PP
 .SH SYNOPSIS
 git annex sync \fB[remote ...]\fP
diff --git a/man/git-annex-test.1 b/man/git-annex-test.1
--- a/man/git-annex-test.1
+++ b/man/git-annex-test.1
@@ -1,6 +1,6 @@
 .TH git-annex-test 1
 .SH NAME
-git-annex test \- run built\-in test suite
+git-annex-test \- run built\-in test suite
 .PP
 .SH SYNOPSIS
 git annex test
diff --git a/man/git-annex-testremote.1 b/man/git-annex-testremote.1
--- a/man/git-annex-testremote.1
+++ b/man/git-annex-testremote.1
@@ -1,6 +1,6 @@
 .TH git-annex-testremote 1
 .SH NAME
-git-annex testremote \- test transfers to/from a remote
+git-annex-testremote \- test transfers to/from a remote
 .PP
 .SH SYNOPSIS
 git annex testremote \fBremote\fP
diff --git a/man/git-annex-transferkey.1 b/man/git-annex-transferkey.1
--- a/man/git-annex-transferkey.1
+++ b/man/git-annex-transferkey.1
@@ -1,6 +1,6 @@
 .TH git-annex-transferkey 1
 .SH NAME
-git-annex transferkey \- transfers a key from or to a remote
+git-annex-transferkey \- transfers a key from or to a remote
 .PP
 .SH SYNOPSIS
 git annex transferkey \fBkey [\-\-from=remote|\-\-to=remote]\fP
diff --git a/man/git-annex-transferkeys.1 b/man/git-annex-transferkeys.1
--- a/man/git-annex-transferkeys.1
+++ b/man/git-annex-transferkeys.1
@@ -1,6 +1,6 @@
 .TH git-annex-transferkeys 1
 .SH NAME
-git-annex transferkeys \- transfers keys
+git-annex-transferkeys \- transfers keys
 .PP
 .SH SYNOPSIS
 git annex transferkeys
diff --git a/man/git-annex-trust.1 b/man/git-annex-trust.1
--- a/man/git-annex-trust.1
+++ b/man/git-annex-trust.1
@@ -1,6 +1,6 @@
 .TH git-annex-trust 1
 .SH NAME
-git-annex trust \- trust a repository
+git-annex-trust \- trust a repository
 .PP
 .SH SYNOPSIS
 git annex trust \fB[repository ...]\fP
diff --git a/man/git-annex-unannex.1 b/man/git-annex-unannex.1
--- a/man/git-annex-unannex.1
+++ b/man/git-annex-unannex.1
@@ -1,6 +1,6 @@
 .TH git-annex-unannex 1
 .SH NAME
-git-annex unannex \- undo accidental add command
+git-annex-unannex \- undo accidental add command
 .PP
 .SH SYNOPSIS
 git annex unannex \fB[path ...]\fP
diff --git a/man/git-annex-undo.1 b/man/git-annex-undo.1
--- a/man/git-annex-undo.1
+++ b/man/git-annex-undo.1
@@ -1,6 +1,6 @@
 .TH git-annex-undo 1
 .SH NAME
-git-annex undo \- undo last change to a file or directory
+git-annex-undo \- undo last change to a file or directory
 .PP
 .SH SYNOPSIS
 git annex  \fB[filename|directory] ...\fP
@@ -13,7 +13,7 @@
 contents of that directory.
 .PP
 Running undo a second time will undo the undo, returning the working
-tree to the same state it had before. In order for undoing an undo of
+tree to the same state it had before. To support undoing an undo of
 staged changes, any staged changes are first committed by the
 undo command.
 .PP
diff --git a/man/git-annex-ungroup.1 b/man/git-annex-ungroup.1
--- a/man/git-annex-ungroup.1
+++ b/man/git-annex-ungroup.1
@@ -1,6 +1,6 @@
 .TH git-annex-ungroup 1
 .SH NAME
-git-annex ungroup \- remove a repository from a group
+git-annex-ungroup \- remove a repository from a group
 .PP
 .SH SYNOPSIS
 git annex ungroup \fBrepository groupname\fP
diff --git a/man/git-annex-uninit.1 b/man/git-annex-uninit.1
--- a/man/git-annex-uninit.1
+++ b/man/git-annex-uninit.1
@@ -1,6 +1,6 @@
 .TH git-annex-uninit 1
 .SH NAME
-git-annex uninit \- de\-initialize git-annex and clean out repository
+git-annex-uninit \- de\-initialize git-annex and clean out repository
 .PP
 .SH SYNOPSIS
 git annex uninit
diff --git a/man/git-annex-unlock.1 b/man/git-annex-unlock.1
--- a/man/git-annex-unlock.1
+++ b/man/git-annex-unlock.1
@@ -1,6 +1,6 @@
 .TH git-annex-unlock 1
 .SH NAME
-git-annex unlock \- unlock files for modification
+git-annex-unlock \- unlock files for modification
 .PP
 .SH SYNOPSIS
 git annex unlock \fB[path ...]\fP
diff --git a/man/git-annex-untrust.1 b/man/git-annex-untrust.1
--- a/man/git-annex-untrust.1
+++ b/man/git-annex-untrust.1
@@ -1,6 +1,6 @@
 .TH git-annex-untrust 1
 .SH NAME
-git-annex untrust \- do not trust a repository
+git-annex-untrust \- do not trust a repository
 .PP
 .SH SYNOPSIS
 git annex untrust \fB[repository ...]\fP
diff --git a/man/git-annex-unused.1 b/man/git-annex-unused.1
--- a/man/git-annex-unused.1
+++ b/man/git-annex-unused.1
@@ -1,6 +1,6 @@
 .TH git-annex-unused 1
 .SH NAME
-git-annex unused \- look for unused file content
+git-annex-unused \- look for unused file content
 .PP
 .SH SYNOPSIS
 git annex unused
@@ -22,7 +22,38 @@
 Only show unused temp and bad files.
 .IP
 .IP "\fB\-\-from=remote\fP"
-Check for unused data on a remote.
+Check for unused data that is located on a remote.
+.IP
+.IP "\fB\-\-used\-refspec=+ref:\-ref\fP"
+By default, any data that the work tree uses, or that any refs in the git
+repository point to is considered to be used. If you only want to use
+some refs, you can use this option to specify the ones to use. Data that
+is not in the specified refs (and not used by the work tree) will then be
+considered unused.
+.IP
+The git configuration annex.used\-refspec can be used to configure
+this in a more permanent fashion.
+.IP
+.SH REFSPEC FORMAT
+The refspec format for \-\-used\-refspec is a colon\-separated list of
+additions and removals of refs. For example:
+.PP
+ +refs/heads/*:+HEAD^:+refs/tags/*:\-refs/tags/old\-tag
+.PP
+This adds all refs/heads/ refs, as well as the previous version
+of HEAD. It also adds all tags, except for old\-tag.
+.PP
+This refspec is processed by starting with an empty set of refs,
+and walking the list in order from left to right.
+.PP
+.IP "Each + using a glob is matched against all relevant refs"
+(a subset of \fBgit show\-ref\fP) and all matching refs are added
+to the set.
+For example, "+refs/remotes/*" adds all remote refs.
+.IP "Each + without a glob adds the literal value to the set."
+For example, "+HEAD^" adds "HEAD^".
+.IP "Each \- is matched against the set of refs accumulated so far."
+Any matching refs are removed from the set.
 .IP
 .SH SEE ALSO
 git-annex(1)
diff --git a/man/git-annex-upgrade.1 b/man/git-annex-upgrade.1
--- a/man/git-annex-upgrade.1
+++ b/man/git-annex-upgrade.1
@@ -1,6 +1,6 @@
 .TH git-annex-upgrade 1
 .SH NAME
-git-annex upgrade \- upgrade repository layout
+git-annex-upgrade \- upgrade repository layout
 .PP
 .SH SYNOPSIS
 git annex upgrade
diff --git a/man/git-annex-vadd.1 b/man/git-annex-vadd.1
--- a/man/git-annex-vadd.1
+++ b/man/git-annex-vadd.1
@@ -1,6 +1,6 @@
 .TH git-annex-vadd 1
 .SH NAME
-git-annex vadd \- add subdirs to current view
+git-annex-vadd \- add subdirs to current view
 .PP
 .SH SYNOPSIS
 git annex vadd \fB[field=glob ...] [field=value ...] [tag ...]\fP
diff --git a/man/git-annex-vcycle.1 b/man/git-annex-vcycle.1
--- a/man/git-annex-vcycle.1
+++ b/man/git-annex-vcycle.1
@@ -1,6 +1,6 @@
 .TH git-annex-vcycle 1
 .SH NAME
-git-annex vcycle \- switch view to next layout
+git-annex-vcycle \- switch view to next layout
 .PP
 .SH SYNOPSIS
 git annex vcycle
diff --git a/man/git-annex-version.1 b/man/git-annex-version.1
--- a/man/git-annex-version.1
+++ b/man/git-annex-version.1
@@ -1,6 +1,6 @@
 .TH git-annex-version 1
 .SH NAME
-git-annex version \- show version info
+git-annex-version \- show version info
 .PP
 .SH SYNOPSIS
 git annex version
diff --git a/man/git-annex-vfilter.1 b/man/git-annex-vfilter.1
--- a/man/git-annex-vfilter.1
+++ b/man/git-annex-vfilter.1
@@ -1,6 +1,6 @@
 .TH git-annex-vfilter 1
 .SH NAME
-git-annex vfilter \- filter current view
+git-annex-vfilter \- filter current view
 .PP
 .SH SYNOPSIS
 git annex vfilter \fB[tag ...] [field=value ...] [!tag ...] [field!=value ...]\fP
diff --git a/man/git-annex-vicfg.1 b/man/git-annex-vicfg.1
--- a/man/git-annex-vicfg.1
+++ b/man/git-annex-vicfg.1
@@ -1,6 +1,6 @@
 .TH git-annex-vicfg 1
 .SH NAME
-git-annex vicfg \- edit git-annex's configuration
+git-annex-vicfg \- edit git-annex's configuration
 .PP
 .SH SYNOPSIS
 git annex vicfg
diff --git a/man/git-annex-view.1 b/man/git-annex-view.1
--- a/man/git-annex-view.1
+++ b/man/git-annex-view.1
@@ -1,6 +1,6 @@
 .TH git-annex-view 1
 .SH NAME
-git-annex view \- enter a view branch
+git-annex-view \- enter a view branch
 .PP
 .SH SYNOPSIS
 git annex view \fB[tag ...] [field=value ...] [field=glob ...] [!tag ...] [field!=value ...]\fP
diff --git a/man/git-annex-vpop.1 b/man/git-annex-vpop.1
--- a/man/git-annex-vpop.1
+++ b/man/git-annex-vpop.1
@@ -1,6 +1,6 @@
 .TH git-annex-vpop 1
 .SH NAME
-git-annex vpop \- switch back to previous view
+git-annex-vpop \- switch back to previous view
 .PP
 .SH SYNOPSIS
 git annex vpop \fB[N]\fP
diff --git a/man/git-annex-wanted.1 b/man/git-annex-wanted.1
--- a/man/git-annex-wanted.1
+++ b/man/git-annex-wanted.1
@@ -1,6 +1,6 @@
 .TH git-annex-wanted 1
 .SH NAME
-git-annex wanted \- get or set preferred content expression
+git-annex-wanted \- get or set preferred content expression
 .PP
 .SH SYNOPSIS
 git annex wanted \fBrepository [expression]\fP
diff --git a/man/git-annex-watch.1 b/man/git-annex-watch.1
--- a/man/git-annex-watch.1
+++ b/man/git-annex-watch.1
@@ -1,6 +1,6 @@
 .TH git-annex-watch 1
 .SH NAME
-git-annex watch \- watch for changes
+git-annex-watch \- watch for changes
 .PP
 .SH SYNOPSIS
 git annex watch
diff --git a/man/git-annex-webapp.1 b/man/git-annex-webapp.1
--- a/man/git-annex-webapp.1
+++ b/man/git-annex-webapp.1
@@ -1,6 +1,6 @@
 .TH git-annex-webapp 1
 .SH NAME
-git-annex webapp \- launch webapp
+git-annex-webapp \- launch webapp
 .PP
 .SH SYNOPSIS
 git annex webapp
diff --git a/man/git-annex-whereis.1 b/man/git-annex-whereis.1
--- a/man/git-annex-whereis.1
+++ b/man/git-annex-whereis.1
@@ -1,6 +1,6 @@
 .TH git-annex-whereis 1
 .SH NAME
-git-annex whereis \- lists repositories that have file content
+git-annex-whereis \- lists repositories that have file content
 .PP
 .SH SYNOPSIS
 git annex whereis \fB[path ...]\fP
diff --git a/man/git-annex-xmppgit.1 b/man/git-annex-xmppgit.1
--- a/man/git-annex-xmppgit.1
+++ b/man/git-annex-xmppgit.1
@@ -1,6 +1,6 @@
 .TH git-annex-xmppgit 1
 .SH NAME
-git-annex xmppgit \- git to XMPP relay
+git-annex-xmppgit \- git to XMPP relay
 .PP
 .SH SYNOPSIS
 git annex xmppgit
diff --git a/man/git-annex.1 b/man/git-annex.1
--- a/man/git-annex.1
+++ b/man/git-annex.1
@@ -1,6 +1,6 @@
 .TH git-annex 1
 .SH NAME
-git-annex \- manage files with git, without checking their contents in
+git-annex-\- manage files with git, without checking their contents in
 .PP
 .SH SYNOPSIS
 git annex command [params ...]
@@ -697,6 +697,10 @@
 .IP
 When importfeed is used, it stores additional metadata from the feed,
 such as the author, title, etc.
+.IP
+.IP "\fBannex.used\-refspec\fP"
+This controls which refs \fBgit-annex unused\fP considers to be used.
+See REFSPEC FORMAT in git-annex\-unused(1) for details.
 .IP
 .IP "\fBannex.queuesize\fP"
 git-annex builds a queue of git commands, in order to combine similar
diff --git a/standalone/android/cabal.config b/standalone/android/cabal.config
--- a/standalone/android/cabal.config
+++ b/standalone/android/cabal.config
@@ -204,4 +204,5 @@
              yesod-static ==1.2.4,
              zlib ==0.5.4.1,
              bytestring ==0.10.4.0,
-             scientific ==0.3.3.1
+             scientific ==0.3.3.1,
+             clock ==0.4.6.0
diff --git a/standalone/android/haskell-patches/clock_hack-for-android.patch b/standalone/android/haskell-patches/clock_hack-for-android.patch
new file mode 100644
--- /dev/null
+++ b/standalone/android/haskell-patches/clock_hack-for-android.patch
@@ -0,0 +1,76 @@
+From 5be3bdfc5ec83eaa5defd42e99f73a685123bea0 Mon Sep 17 00:00:00 2001
+From: androidbuilder <androidbuilder@example.com>
+Date: Fri, 22 May 2015 18:35:43 +0000
+Subject: [PATCH] hack for android
+
+---
+ System/Clock.hsc | 32 ++------------------------------
+ 1 file changed, 2 insertions(+), 30 deletions(-)
+
+diff --git a/System/Clock.hsc b/System/Clock.hsc
+index b6a4968..92bcf8b 100644
+--- a/System/Clock.hsc
++++ b/System/Clock.hsc
+@@ -35,8 +35,6 @@ import GHC.Generics (Generic)
+ #  endif
+ #endif
+ 
+-#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)
+-
+ -- | Clock types. A clock may be system-wide (that is, visible to all processes)
+ --   or per-process (measuring time that is meaningful only within a process).
+ --   All implementations shall support CLOCK_REALTIME.
+@@ -119,7 +117,7 @@ getTime ThreadCPUTime = allocaAndPeek hs_clock_win32_gettime_threadtime
+ #elif defined(__MACH__)
+ getTime clk = allocaAndPeek $ hs_clock_darwin_gettime $ clockToConst clk
+ #else
+-getTime clk = allocaAndPeek $ clock_gettime $ clockToConst clk
++getTime clk = error "getTime clk not implemented"
+ #endif
+ 
+ #if defined(_WIN32)
+@@ -130,7 +128,7 @@ getRes ThreadCPUTime = allocaAndPeek hs_clock_win32_getres_threadtime
+ #elif defined(__MACH__)
+ getRes clk = allocaAndPeek $ hs_clock_darwin_getres $ clockToConst clk
+ #else
+-getRes clk = allocaAndPeek $ clock_getres $ clockToConst clk
++getRes clk = error "getRes clk not implemented"
+ #endif
+ 
+ -- | TimeSpec structure
+@@ -139,32 +137,6 @@ data TimeSpec = TimeSpec
+   , nsec :: {-# UNPACK #-} !Int64 -- ^ nanoseconds
+   } deriving (Eq, Generic, Read, Show, Typeable)
+ 
+-#if defined(_WIN32)
+-instance Storable TimeSpec where
+-  sizeOf _ = sizeOf (undefined :: Int64) * 2
+-  alignment _ = alignment (undefined :: Int64)
+-  poke ptr ts = do
+-      pokeByteOff ptr 0 (sec ts)
+-      pokeByteOff ptr (sizeOf (undefined :: Int64)) (nsec ts)
+-  peek ptr = do
+-      TimeSpec
+-        <$> peekByteOff ptr 0
+-        <*> peekByteOff ptr (sizeOf (undefined :: Int64))
+-#else
+-instance Storable TimeSpec where
+-  sizeOf _ = #{size struct timespec}
+-  alignment _ = #{alignment struct timespec}
+-  poke ptr ts = do
+-      let xs :: #{type time_t} = fromIntegral $ sec ts
+-          xn :: #{type long} = fromIntegral $ nsec ts
+-      #{poke struct timespec, tv_sec} ptr (xs)
+-      #{poke struct timespec, tv_nsec} ptr (xn)
+-  peek ptr = do
+-      xs :: #{type time_t} <- #{peek struct timespec, tv_sec} ptr
+-      xn :: #{type long} <- #{peek struct timespec, tv_nsec} ptr
+-      return $ TimeSpec (fromIntegral xs) (fromIntegral xn)
+-#endif
+-
+ normalize :: TimeSpec -> TimeSpec
+ normalize (TimeSpec xs xn) =
+     let (q, r) = xn `divMod` (10^9)
+-- 
+2.1.4
+
diff --git a/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch
new file mode 100644
--- /dev/null
+++ b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch
@@ -0,0 +1,25 @@
+From df0f41f92d003f7d59ef927737ffec3a9bd61827 Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Tue, 7 May 2013 18:41:01 -0400
+Subject: [PATCH] avoid cabal hell
+
+---
+ gsasl.cabal |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/gsasl.cabal b/gsasl.cabal
+index d991873..c5c2b19 100644
+--- a/gsasl.cabal
++++ b/gsasl.cabal
+@@ -31,7 +31,7 @@ library
+   build-depends:
+       base >= 4.0 && < 5.0
+     , transformers >= 0.2
+-    , bytestring >= 0.9
++    , bytestring >= 0.10.3.0
+ 
+   pkgconfig-depends: libgsasl >= 1.1
+ 
+-- 
+1.7.10.4
+
diff --git a/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch
new file mode 100644
--- /dev/null
+++ b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch
@@ -0,0 +1,135 @@
+From e1a2f80f6bec25921ab645a0aaf1c6422a8917ab Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Mon, 11 Nov 2013 01:06:58 +0000
+Subject: [PATCH] fix
+
+---
+ Network/Socks5/Command.hs  |    8 +-------
+ Network/Socks5/Conf.hs     |    1 -
+ Network/Socks5/Lowlevel.hs |    1 -
+ Network/Socks5/Types.hs    |   18 +-----------------
+ Network/Socks5/Wire.hs     |    2 --
+ 5 files changed, 2 insertions(+), 28 deletions(-)
+
+diff --git a/Network/Socks5/Command.hs b/Network/Socks5/Command.hs
+index db95fbd..fdba5ec 100644
+--- a/Network/Socks5/Command.hs
++++ b/Network/Socks5/Command.hs
+@@ -13,7 +13,6 @@ module Network.Socks5.Command
+     , Connect(..)
+     , Command(..)
+     , connectIPV4
+-    , connectIPV6
+     , connectDomainName
+     -- * lowlevel interface
+     , rpc
+@@ -29,7 +28,7 @@ import qualified Data.ByteString as B
+ import qualified Data.ByteString.Char8 as BC
+ import Data.Serialize
+ 
+-import Network.Socket (Socket, PortNumber, HostAddress, HostAddress6)
++import Network.Socket (Socket, PortNumber, HostAddress)
+ import Network.Socket.ByteString
+ 
+ import Network.Socks5.Types
+@@ -65,11 +64,6 @@ connectIPV4 socket hostaddr port = onReply <$> rpc_ socket (Connect $ SocksAddre
+     where onReply (SocksAddrIPV4 h, p) = (h, p)
+           onReply _                    = error "ipv4 requested, got something different"
+ 
+-connectIPV6 :: Socket -> HostAddress6 -> PortNumber -> IO (HostAddress6, PortNumber)
+-connectIPV6 socket hostaddr6 port = onReply <$> rpc_ socket (Connect $ SocksAddress (SocksAddrIPV6 hostaddr6) port)
+-    where onReply (SocksAddrIPV6 h, p) = (h, p)
+-          onReply _                    = error "ipv6 requested, got something different"
+-
+ -- TODO: FQDN should only be ascii, maybe putting a "fqdn" data type
+ -- in front to make sure and make the BC.pack safe.
+ connectDomainName :: Socket -> String -> PortNumber -> IO (SocksHostAddress, PortNumber)
+diff --git a/Network/Socks5/Conf.hs b/Network/Socks5/Conf.hs
+index c29ff7b..007d382 100644
+--- a/Network/Socks5/Conf.hs
++++ b/Network/Socks5/Conf.hs
+@@ -47,5 +47,4 @@ defaultSocksConfFromSockAddr sockaddr = SocksConf server SocksVer5
+     where server       = SocksAddress haddr port
+           (haddr,port) = case sockaddr of
+                              SockAddrInet p h      -> (SocksAddrIPV4 h, p)
+-                             SockAddrInet6 p _ h _ -> (SocksAddrIPV6 h, p)
+                              _                     -> error "unsupported unix sockaddr type"
+diff --git a/Network/Socks5/Lowlevel.hs b/Network/Socks5/Lowlevel.hs
+index c10d9b9..2c3d59c 100644
+--- a/Network/Socks5/Lowlevel.hs
++++ b/Network/Socks5/Lowlevel.hs
+@@ -17,7 +17,6 @@ resolveToSockAddr :: SocksAddress -> IO SockAddr
+ resolveToSockAddr (SocksAddress sockHostAddr port) =
+     case sockHostAddr of
+         SocksAddrIPV4 ha       -> return $ SockAddrInet port ha
+-        SocksAddrIPV6 ha6      -> return $ SockAddrInet6 port 0 ha6 0
+         SocksAddrDomainName bs -> do he <- getHostByName (BC.unpack bs)
+                                      return $ SockAddrInet port (hostAddress he)
+ 
+diff --git a/Network/Socks5/Types.hs b/Network/Socks5/Types.hs
+index 7fbec25..17c7c83 100644
+--- a/Network/Socks5/Types.hs
++++ b/Network/Socks5/Types.hs
+@@ -19,7 +19,7 @@ module Network.Socks5.Types
+ import Data.ByteString (ByteString)
+ import Data.Word
+ import Data.Data
+-import Network.Socket (HostAddress, HostAddress6, PortNumber)
++import Network.Socket (HostAddress, PortNumber)
+ import Control.Exception
+ import qualified Data.ByteString.Char8 as BC
+ import Numeric (showHex)
+@@ -53,12 +53,10 @@ data SocksMethod =
+ data SocksHostAddress =
+       SocksAddrIPV4 !HostAddress
+     | SocksAddrDomainName !ByteString
+-    | SocksAddrIPV6 !HostAddress6
+     deriving (Eq,Ord)
+ 
+ instance Show SocksHostAddress where
+     show (SocksAddrIPV4 ha)       = "SocksAddrIPV4(" ++ showHostAddress ha ++ ")"
+-    show (SocksAddrIPV6 ha6)      = "SocksAddrIPV6(" ++ showHostAddress6 ha6 ++ ")"
+     show (SocksAddrDomainName dn) = "SocksAddrDomainName(" ++ BC.unpack dn ++ ")"
+ 
+ -- | Converts a HostAddress to a String in dot-decimal notation
+@@ -69,20 +67,6 @@ showHostAddress num = concat [show q1, ".", show q2, ".", show q3, ".", show q4]
+         (num''',q3) = num'' `quotRem` 256
+         (_,q4)      = num''' `quotRem` 256
+ 
+--- | Converts a IPv6 HostAddress6 to standard hex notation
+-showHostAddress6 :: HostAddress6 -> String
+-showHostAddress6 (a,b,c,d) =
+-    (concat . intersperse ":" . map (flip showHex ""))
+-        [p1,p2,p3,p4,p5,p6,p7,p8]
+-    where (a',p2) = a `quotRem` 65536
+-          (_,p1)  = a' `quotRem` 65536
+-          (b',p4) = b `quotRem` 65536
+-          (_,p3)  = b' `quotRem` 65536
+-          (c',p6) = c `quotRem` 65536
+-          (_,p5)  = c' `quotRem` 65536
+-          (d',p8) = d `quotRem` 65536
+-          (_,p7)  = d' `quotRem` 65536
+-
+ -- | Describe a Socket address on the SOCKS protocol
+ data SocksAddress = SocksAddress !SocksHostAddress !PortNumber
+     deriving (Show,Eq,Ord)
+diff --git a/Network/Socks5/Wire.hs b/Network/Socks5/Wire.hs
+index 10bd262..a30f32e 100644
+--- a/Network/Socks5/Wire.hs
++++ b/Network/Socks5/Wire.hs
+@@ -46,12 +46,10 @@ data SocksResponse = SocksResponse
+ 
+ getAddr 1 = SocksAddrIPV4 <$> getWord32host
+ getAddr 3 = SocksAddrDomainName <$> (getWord8 >>= getByteString . fromIntegral)
+-getAddr 4 = SocksAddrIPV6 <$> (liftM4 (,,,) getWord32host getWord32host getWord32host getWord32host)
+ getAddr n = error ("cannot get unknown socket address type: " ++ show n)
+ 
+ putAddr (SocksAddrIPV4 h)         = putWord8 1 >> putWord32host h
+ putAddr (SocksAddrDomainName b)   = putWord8 3 >> putWord8 (fromIntegral $ B.length b) >> putByteString b
+-putAddr (SocksAddrIPV6 (a,b,c,d)) = putWord8 4 >> mapM_ putWord32host [a,b,c,d]
+ 
+ getSocksRequest 5 = do
+     cmd <- toEnum . fromIntegral <$> getWord8
+-- 
+1.7.10.4
+
diff --git a/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png
new file mode 100644
Binary files /dev/null and b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png differ
diff --git a/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png
new file mode 100644
Binary files /dev/null and b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png differ
diff --git a/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png
new file mode 100644
Binary files /dev/null and b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png differ
diff --git a/standalone/android/install-haskell-packages b/standalone/android/install-haskell-packages
--- a/standalone/android/install-haskell-packages
+++ b/standalone/android/install-haskell-packages
@@ -112,6 +112,7 @@
 	patched yesod-persistent
 	patched yesod-form
 	patched crypto-numbers
+	patched clock
 	patched yesod-auth
 	patched yesod
 	patched shakespeare-text
diff --git a/standalone/android/tmp/network-2.4.1.2/LICENSE b/standalone/android/tmp/network-2.4.1.2/LICENSE
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2002-2010, The University Court of the University of Glasgow.
+Copyright (c) 2007-2010, Johan Tibell
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+- Neither name of the University nor the names of its contributors may be
+used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY COURT OF THE UNIVERSITY OF
+GLASGOW AND THE CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+UNIVERSITY COURT OF THE UNIVERSITY OF GLASGOW OR THE CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/standalone/android/tmp/network-2.4.1.2/Network.hs b/standalone/android/tmp/network-2.4.1.2/Network.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network.hs
@@ -0,0 +1,473 @@
+{-# LANGUAGE CPP #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Network
+-- Copyright   :  (c) The University of Glasgow 2001
+-- License     :  BSD-style (see the file libraries/network/LICENSE)
+-- 
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- The "Network" interface is a \"higher-level\" interface to
+-- networking facilities, and it is recommended unless you need the
+-- lower-level interface in "Network.Socket".
+--
+-----------------------------------------------------------------------------
+
+#include "HsNetworkConfig.h"
+
+#ifdef HAVE_GETADDRINFO
+-- Use IPv6-capable function definitions if the OS supports it.
+#define IPV6_SOCKET_SUPPORT 1
+#endif
+
+module Network
+    (
+    -- * Basic data types
+      Socket
+    , PortID(..)
+    , HostName
+    , PortNumber
+
+    -- * Initialisation
+    , withSocketsDo
+    
+    -- * Server-side connections
+    , listenOn
+    , accept
+    , sClose
+
+    -- * Client-side connections
+    , connectTo
+
+    -- * Simple sending and receiving
+    {-$sendrecv-}
+    , sendTo
+    , recvFrom
+
+    -- * Miscellaneous
+    , socketPort
+
+    -- * Networking Issues
+    -- ** Buffering
+    {-$buffering-}
+
+    -- ** Improving I\/O Performance over sockets
+    {-$performance-}
+
+    -- ** @SIGPIPE@
+    {-$sigpipe-}
+    ) where
+
+import Control.Monad (liftM)
+import Data.Maybe (fromJust)
+import Network.BSD
+import Network.Socket hiding (accept, socketPort, recvFrom, sendTo, PortNumber)
+import qualified Network.Socket as Socket (accept)
+import System.IO
+import Prelude
+import qualified Control.Exception as Exception
+
+-- ---------------------------------------------------------------------------
+-- High Level ``Setup'' functions
+
+-- If the @PortID@ specifies a unix family socket and the @Hostname@
+-- differs from that returned by @getHostname@ then an error is
+-- raised. Alternatively an empty string may be given to @connectTo@
+-- signalling that the current hostname applies.
+
+data PortID = 
+          Service String                -- Service Name eg "ftp"
+        | PortNumber PortNumber         -- User defined Port Number
+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+        | UnixSocket String             -- Unix family socket in file system
+#endif
+        deriving (Show, Eq)
+
+-- | Calling 'connectTo' creates a client side socket which is
+-- connected to the given host and port.  The Protocol and socket type is
+-- derived from the given port identifier.  If a port number is given
+-- then the result is always an internet family 'Stream' socket. 
+
+connectTo :: HostName           -- Hostname
+          -> PortID             -- Port Identifier
+          -> IO Handle          -- Connected Socket
+
+#if defined(IPV6_SOCKET_SUPPORT)
+-- IPv6 and IPv4.
+
+connectTo hostname (Service serv) = connect' hostname serv
+
+connectTo hostname (PortNumber port) = connect' hostname (show port)
+#else
+-- IPv4 only.
+
+connectTo hostname (Service serv) = do
+    proto <- getProtocolNumber "tcp"
+    bracketOnError
+        (socket AF_INET Stream proto)
+        (sClose)  -- only done if there's an error
+        (\sock -> do
+          port  <- getServicePortNumber serv
+          he    <- getHostByName hostname
+          connect sock (SockAddrInet port (hostAddress he))
+          socketToHandle sock ReadWriteMode
+        )
+
+connectTo hostname (PortNumber port) = do
+    proto <- getProtocolNumber "tcp"
+    bracketOnError
+        (socket AF_INET Stream proto)
+        (sClose)  -- only done if there's an error
+        (\sock -> do
+          he <- getHostByName hostname
+          connect sock (SockAddrInet port (hostAddress he))
+          socketToHandle sock ReadWriteMode
+        )
+#endif
+
+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+connectTo _ (UnixSocket path) = do
+    bracketOnError
+        (socket AF_UNIX Stream 0)
+        (sClose)
+        (\sock -> do
+          connect sock (SockAddrUnix path)
+          socketToHandle sock ReadWriteMode
+        )
+#endif
+
+#if defined(IPV6_SOCKET_SUPPORT)
+connect' :: HostName -> ServiceName -> IO Handle
+
+connect' host serv = do
+    proto <- getProtocolNumber "tcp"
+    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]
+                             , addrProtocol = proto
+                             , addrSocketType = Stream }
+    addrs <- getAddrInfo (Just hints) (Just host) (Just serv)
+    firstSuccessful $ map tryToConnect addrs
+  where
+  tryToConnect addr =
+    bracketOnError
+        (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))
+        (sClose)  -- only done if there's an error
+        (\sock -> do
+          connect sock (addrAddress addr)
+          socketToHandle sock ReadWriteMode
+        )
+#endif
+
+-- | Creates the server side socket which has been bound to the
+-- specified port.
+--
+-- 'maxListenQueue' (typically 128) is specified to the listen queue.
+-- This is good enough for normal network servers but is too small
+-- for high performance servers.
+--
+-- To avoid the \"Address already in use\" problems,
+-- the 'ReuseAddr' socket option is set on the listening socket.
+--
+-- If available, the 'IPv6Only' socket option is set to 0
+-- so that both IPv4 and IPv6 can be accepted with this socket.
+--
+-- If you don't like the behavior above, please use the lower level
+-- 'Network.Socket.listen' instead.
+
+listenOn :: PortID      -- ^ Port Identifier
+         -> IO Socket   -- ^ Listening Socket
+
+#if defined(IPV6_SOCKET_SUPPORT)
+-- IPv6 and IPv4.
+
+listenOn (Service serv) = listen' serv
+
+listenOn (PortNumber port) = listen' (show port)
+#else
+-- IPv4 only.
+
+listenOn (Service serv) = do
+    proto <- getProtocolNumber "tcp"
+    bracketOnError
+        (socket AF_INET Stream proto)
+        (sClose)
+        (\sock -> do
+            port    <- getServicePortNumber serv
+            setSocketOption sock ReuseAddr 1
+            bindSocket sock (SockAddrInet port iNADDR_ANY)
+            listen sock maxListenQueue
+            return sock
+        )
+
+listenOn (PortNumber port) = do
+    proto <- getProtocolNumber "tcp"
+    bracketOnError
+        (socket AF_INET Stream proto)
+        (sClose)
+        (\sock -> do
+            setSocketOption sock ReuseAddr 1
+            bindSocket sock (SockAddrInet port iNADDR_ANY)
+            listen sock maxListenQueue
+            return sock
+        )
+#endif
+
+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+listenOn (UnixSocket path) =
+    bracketOnError
+        (socket AF_UNIX Stream 0)
+        (sClose)
+        (\sock -> do
+            setSocketOption sock ReuseAddr 1
+            bindSocket sock (SockAddrUnix path)
+            listen sock maxListenQueue
+            return sock
+        )
+#endif
+
+#if defined(IPV6_SOCKET_SUPPORT)
+listen' :: ServiceName -> IO Socket
+
+listen' serv = do
+    proto <- getProtocolNumber "tcp"
+    -- We should probably specify addrFamily = AF_INET6 and the filter
+    -- code below should be removed. AI_ADDRCONFIG is probably not
+    -- necessary. But this code is well-tested. So, let's keep it.
+    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]
+                             , addrSocketType = Stream
+                             , addrProtocol = proto }
+    addrs <- getAddrInfo (Just hints) Nothing (Just serv)
+    -- Choose an IPv6 socket if exists.  This ensures the socket can
+    -- handle both IPv4 and IPv6 if v6only is false.
+    let addrs' = filter (\x -> addrFamily x == AF_INET6) addrs
+        addr = if null addrs' then head addrs else head addrs'
+    bracketOnError
+        (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))
+        (sClose)
+        (\sock -> do
+            setSocketOption sock ReuseAddr 1
+            bindSocket sock (addrAddress addr)
+            listen sock maxListenQueue
+            return sock
+        )
+#endif
+
+-- -----------------------------------------------------------------------------
+-- accept
+
+-- | Accept a connection on a socket created by 'listenOn'.  Normal
+-- I\/O operations (see "System.IO") can be used on the 'Handle'
+-- returned to communicate with the client.
+-- Notice that although you can pass any Socket to Network.accept,
+-- only sockets of either AF_UNIX, AF_INET, or AF_INET6 will work
+-- (this shouldn't be a problem, though). When using AF_UNIX, HostName
+-- will be set to the path of the socket and PortNumber to -1.
+--
+accept :: Socket                -- ^ Listening Socket
+       -> IO (Handle,
+              HostName,
+              PortNumber)       -- ^ Triple of: read\/write 'Handle' for 
+                                -- communicating with the client,
+                                -- the 'HostName' of the peer socket, and
+                                -- the 'PortNumber' of the remote connection.
+accept sock@(MkSocket _ AF_INET _ _ _) = do
+ ~(sock', (SockAddrInet port haddr)) <- Socket.accept sock
+ peer <- catchIO
+          (do   
+             (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr
+             return peer
+          )
+          (\_e -> inet_ntoa haddr)
+                -- if getHostByName fails, we fall back to the IP address
+ handle <- socketToHandle sock' ReadWriteMode
+ return (handle, peer, port)
+#if defined(IPV6_SOCKET_SUPPORT)
+accept sock@(MkSocket _ AF_INET6 _ _ _) = do
+ (sock', addr) <- Socket.accept sock
+ peer <- catchIO ((fromJust . fst) `liftM` getNameInfo [] True False addr) $
+         \_ -> case addr of
+                 SockAddrInet  _   a   -> inet_ntoa a
+                 SockAddrInet6 _ _ a _ -> return (show a)
+# if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+                 SockAddrUnix      a   -> return a
+# endif
+ handle <- socketToHandle sock' ReadWriteMode
+ let port = case addr of
+              SockAddrInet  p _     -> p
+              SockAddrInet6 p _ _ _ -> p
+              _                     -> -1
+ return (handle, peer, port)
+#endif
+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+accept sock@(MkSocket _ AF_UNIX _ _ _) = do
+ ~(sock', (SockAddrUnix path)) <- Socket.accept sock
+ handle <- socketToHandle sock' ReadWriteMode
+ return (handle, path, -1)
+#endif
+accept (MkSocket _ family _ _ _) =
+  error $ "Sorry, address family " ++ (show family) ++ " is not supported!"
+
+-- -----------------------------------------------------------------------------
+-- sendTo/recvFrom
+
+{-$sendrecv
+Send and receive data from\/to the given host and port number.  These
+should normally only be used where the socket will not be required for
+further calls. Also, note that due to the use of 'hGetContents' in 'recvFrom'
+the socket will remain open (i.e. not available) even if the function already
+returned. Their use is strongly discouraged except for small test-applications
+or invocations from the command line.
+-}
+
+sendTo :: HostName      -- Hostname
+       -> PortID        -- Port Number
+       -> String        -- Message to send
+       -> IO ()
+sendTo h p msg = do
+  s <- connectTo h p
+  hPutStr s msg
+  hClose s
+
+recvFrom :: HostName    -- Hostname
+         -> PortID      -- Port Number
+         -> IO String   -- Received Data
+
+#if defined(IPV6_SOCKET_SUPPORT)
+recvFrom host port = do
+    proto <- getProtocolNumber "tcp"
+    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]
+                             , addrProtocol = proto
+                             , addrSocketType = Stream }
+    allowed <- map addrAddress `liftM` getAddrInfo (Just hints) (Just host)
+                                                   Nothing
+    s <- listenOn port
+    let waiting = do
+        (s', addr) <- Socket.accept s
+        if not (addr `oneOf` allowed)
+         then sClose s' >> waiting
+         else socketToHandle s' ReadMode >>= hGetContents
+    waiting
+  where
+    a@(SockAddrInet _ ha) `oneOf` ((SockAddrInet _ hb):bs)
+        | ha == hb = True
+        | otherwise = a `oneOf` bs
+    a@(SockAddrInet6 _ _ ha _) `oneOf` ((SockAddrInet6 _ _ hb _):bs)
+        | ha == hb = True
+        | otherwise = a `oneOf` bs
+    _ `oneOf` _ = False
+#else
+recvFrom host port = do
+ ip  <- getHostByName host
+ let ipHs = hostAddresses ip
+ s   <- listenOn port
+ let 
+  waiting = do
+     ~(s', SockAddrInet _ haddr)  <-  Socket.accept s
+     he <- getHostByAddr AF_INET haddr
+     if not (any (`elem` ipHs) (hostAddresses he))
+      then do
+         sClose s'
+         waiting
+      else do
+        h <- socketToHandle s' ReadMode
+        msg <- hGetContents h
+        return msg
+
+ message <- waiting
+ return message
+#endif
+
+-- ---------------------------------------------------------------------------
+-- Access function returning the port type/id of socket.
+
+-- | Returns the 'PortID' associated with a given socket.
+socketPort :: Socket -> IO PortID
+socketPort s = do
+    sockaddr <- getSocketName s
+    return (portID sockaddr)
+  where
+   portID sa =
+    case sa of
+     SockAddrInet port _      -> PortNumber port
+#if defined(IPV6_SOCKET_SUPPORT)
+     SockAddrInet6 port _ _ _ -> PortNumber port
+#endif
+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)
+     SockAddrUnix path        -> UnixSocket path
+#endif
+
+-- ---------------------------------------------------------------------------
+-- Utils
+
+-- Like bracket, but only performs the final action if there was an 
+-- exception raised by the middle bit.
+bracketOnError
+        :: IO a         -- ^ computation to run first (\"acquire resource\")
+        -> (a -> IO b)  -- ^ computation to run last (\"release resource\")
+        -> (a -> IO c)  -- ^ computation to run in-between
+        -> IO c         -- returns the value from the in-between computation
+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 606
+bracketOnError before after thing =
+  Exception.block (do
+    a <- before
+    r <- Exception.catch
+           (Exception.unblock (thing a))
+           (\e -> do { after a; Exception.throw e })
+    return r
+ )
+#else
+bracketOnError = Exception.bracketOnError
+#endif
+
+-----------------------------------------------------------------------------
+-- Extra documentation
+
+{-$buffering
+
+The 'Handle' returned by 'connectTo' and 'accept' is block-buffered by
+default.  For an interactive application you may want to set the
+buffering mode on the 'Handle' to
+'LineBuffering' or 'NoBuffering', like so:
+
+> h <- connectTo host port
+> hSetBuffering h LineBuffering
+-}
+
+{-$performance
+
+For really fast I\/O, it might be worth looking at the 'hGetBuf' and
+'hPutBuf' family of functions in "System.IO".
+-}
+
+{-$sigpipe
+
+On Unix, when writing to a socket and the reading end is
+closed by the remote client, the program is normally sent a
+@SIGPIPE@ signal by the operating system.  The
+default behaviour when a @SIGPIPE@ is received is
+to terminate the program silently, which can be somewhat confusing
+if you haven't encountered this before.  The solution is to
+specify that @SIGPIPE@ is to be ignored, using
+the POSIX library:
+
+>  import Posix
+>  main = do installHandler sigPIPE Ignore Nothing; ...
+-}
+
+catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
+#if MIN_VERSION_base(4,0,0)
+catchIO = Exception.catch
+#else
+catchIO = Exception.catchJust Exception.ioErrors
+#endif
+
+-- Returns the first action from a list which does not throw an exception.
+-- If all the actions throw exceptions (and the list of actions is not empty),
+-- the last exception is thrown.
+firstSuccessful :: [IO a] -> IO a
+firstSuccessful [] = error "firstSuccessful: empty list"
+firstSuccessful (p:ps) = catchIO p $ \e ->
+    case ps of
+        [] -> Exception.throwIO e
+        _  -> firstSuccessful ps
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc b/standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc
@@ -0,0 +1,489 @@
+{-# LANGUAGE CPP, ForeignFunctionInterface #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Network.BSD
+-- Copyright   :  (c) The University of Glasgow 2001
+-- License     :  BSD-style (see the file libraries/network/LICENSE)
+-- 
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  experimental
+-- Portability :  non-portable
+--
+-- The "Network.BSD" module defines Haskell bindings to network
+-- programming functionality provided by BSD Unix derivatives.
+--
+-----------------------------------------------------------------------------
+
+#include "HsNet.h"
+
+-- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.
+##include "Typeable.h"
+
+module Network.BSD
+    (
+    -- * Host names
+      HostName
+    , getHostName
+
+    , HostEntry(..)
+    , getHostByName
+    , getHostByAddr
+    , hostAddress
+
+    -- * Service names
+    , ServiceEntry(..)
+    , ServiceName
+    , getServiceByName
+    , getServiceByPort
+    , getServicePortNumber
+
+#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)
+    , getServiceEntries
+
+    -- ** Low level functionality
+    , getServiceEntry
+    , setServiceEntry
+    , endServiceEntry
+#endif
+
+    -- * Protocol names
+    , ProtocolName
+    , ProtocolNumber
+    , ProtocolEntry(..)
+    , getProtocolByName
+    , getProtocolByNumber
+    , getProtocolNumber
+    , defaultProtocol
+
+    -- * Port numbers
+    , PortNumber
+
+    -- * Network names
+    , NetworkName
+    , NetworkAddr
+    , NetworkEntry(..)
+
+#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)
+    , getNetworkByName
+    , getNetworkByAddr
+    -- ** Low level functionality
+#endif
+    ) where
+
+import Network.Socket
+
+import Control.Concurrent (MVar, newMVar, withMVar)
+import qualified Control.Exception as E
+import Foreign.C.String (CString, peekCString, withCString)
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+import Foreign.C.Types ( CShort )
+#endif
+#if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types ( CInt(..), CULong(..), CSize(..) )
+#else
+import Foreign.C.Types ( CInt, CULong, CSize )
+#endif
+import Foreign.Ptr (Ptr, nullPtr)
+import Foreign.Storable (Storable(..))
+import Foreign.Marshal.Array (allocaArray0, peekArray0)
+import Foreign.Marshal.Utils (with, fromBool)
+import Data.Typeable
+import System.IO.Error (ioeSetErrorString, mkIOError)
+import System.IO.Unsafe (unsafePerformIO)
+
+#if __GLASGOW_HASKELL__ >= 611
+import GHC.IO.Exception
+#else
+import GHC.IOBase
+#endif
+
+import Control.Monad (liftM)
+
+import Network.Socket.Internal (throwSocketErrorIfMinus1_)
+
+-- ---------------------------------------------------------------------------
+-- Basic Types
+
+type ProtocolName = String
+
+-- ---------------------------------------------------------------------------
+-- Service Database Access
+
+-- Calling getServiceByName for a given service and protocol returns
+-- the systems service entry.  This should be used to find the port
+-- numbers for standard protocols such as SMTP and FTP.  The remaining
+-- three functions should be used for browsing the service database
+-- sequentially.
+
+-- Calling setServiceEntry with True indicates that the service
+-- database should be left open between calls to getServiceEntry.  To
+-- close the database a call to endServiceEntry is required.  This
+-- database file is usually stored in the file /etc/services.
+
+data ServiceEntry  = 
+  ServiceEntry  {
+     serviceName     :: ServiceName,    -- Official Name
+     serviceAliases  :: [ServiceName],  -- aliases
+     servicePort     :: PortNumber,     -- Port Number  ( network byte order )
+     serviceProtocol :: ProtocolName    -- Protocol
+  } deriving (Show, Typeable)
+
+instance Storable ServiceEntry where
+   sizeOf    _ = #const sizeof(struct servent)
+   alignment _ = alignment (undefined :: CInt) -- ???
+
+   peek p = do
+        s_name    <- (#peek struct servent, s_name) p >>= peekCString
+        s_aliases <- (#peek struct servent, s_aliases) p
+                           >>= peekArray0 nullPtr
+                           >>= mapM peekCString
+        s_port    <- (#peek struct servent, s_port) p
+        s_proto   <- (#peek struct servent, s_proto) p >>= peekCString
+        return (ServiceEntry {
+                        serviceName     = s_name,
+                        serviceAliases  = s_aliases,
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+                        servicePort     = PortNum (fromIntegral (s_port :: CShort)),
+#else
+                           -- s_port is already in network byte order, but it
+                           -- might be the wrong size.
+                        servicePort     = PortNum (fromIntegral (s_port :: CInt)),
+#endif
+                        serviceProtocol = s_proto
+                })
+
+   poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"
+
+
+-- | Get service by name.
+getServiceByName :: ServiceName         -- Service Name
+                 -> ProtocolName        -- Protocol Name
+                 -> IO ServiceEntry     -- Service Entry
+getServiceByName name proto = withLock $ do
+ withCString name  $ \ cstr_name  -> do
+ withCString proto $ \ cstr_proto -> do
+ throwNoSuchThingIfNull "getServiceByName" "no such service entry"
+   $ (trySysCall (c_getservbyname cstr_name cstr_proto))
+ >>= peek
+
+foreign import CALLCONV unsafe "getservbyname" 
+  c_getservbyname :: CString -> CString -> IO (Ptr ServiceEntry)
+
+-- | Get the service given a 'PortNumber' and 'ProtocolName'.
+getServiceByPort :: PortNumber -> ProtocolName -> IO ServiceEntry
+getServiceByPort (PortNum port) proto = withLock $ do
+ withCString proto $ \ cstr_proto -> do
+ throwNoSuchThingIfNull "getServiceByPort" "no such service entry"
+   $ (trySysCall (c_getservbyport (fromIntegral port) cstr_proto))
+ >>= peek
+
+foreign import CALLCONV unsafe "getservbyport" 
+  c_getservbyport :: CInt -> CString -> IO (Ptr ServiceEntry)
+
+-- | Get the 'PortNumber' corresponding to the 'ServiceName'.
+getServicePortNumber :: ServiceName -> IO PortNumber
+getServicePortNumber name = do
+    (ServiceEntry _ _ port _) <- getServiceByName name "tcp"
+    return port
+
+#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)
+getServiceEntry :: IO ServiceEntry
+getServiceEntry = withLock $ do
+ throwNoSuchThingIfNull "getServiceEntry" "no such service entry"
+   $ trySysCall c_getservent
+ >>= peek
+
+foreign import ccall unsafe "getservent" c_getservent :: IO (Ptr ServiceEntry)
+
+setServiceEntry :: Bool -> IO ()
+setServiceEntry flg = withLock $ trySysCall $ c_setservent (fromBool flg)
+
+foreign import ccall unsafe  "setservent" c_setservent :: CInt -> IO ()
+
+endServiceEntry :: IO ()
+endServiceEntry = withLock $ trySysCall $ c_endservent
+
+foreign import ccall unsafe  "endservent" c_endservent :: IO ()
+
+getServiceEntries :: Bool -> IO [ServiceEntry]
+getServiceEntries stayOpen = do
+  setServiceEntry stayOpen
+  getEntries (getServiceEntry) (endServiceEntry)
+#endif
+
+-- ---------------------------------------------------------------------------
+-- Protocol Entries
+
+-- The following relate directly to the corresponding UNIX C
+-- calls for returning the protocol entries. The protocol entry is
+-- represented by the Haskell type ProtocolEntry.
+
+-- As for setServiceEntry above, calling setProtocolEntry.
+-- determines whether or not the protocol database file, usually
+-- @/etc/protocols@, is to be kept open between calls of
+-- getProtocolEntry. Similarly, 
+
+data ProtocolEntry = 
+  ProtocolEntry  {
+     protoName    :: ProtocolName,      -- Official Name
+     protoAliases :: [ProtocolName],    -- aliases
+     protoNumber  :: ProtocolNumber     -- Protocol Number
+  } deriving (Read, Show, Typeable)
+
+instance Storable ProtocolEntry where
+   sizeOf    _ = #const sizeof(struct protoent)
+   alignment _ = alignment (undefined :: CInt) -- ???
+
+   peek p = do
+        p_name    <- (#peek struct protoent, p_name) p >>= peekCString
+        p_aliases <- (#peek struct protoent, p_aliases) p
+                           >>= peekArray0 nullPtr
+                           >>= mapM peekCString
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+         -- With WinSock, the protocol number is only a short;
+         -- hoist it in as such, but represent it on the Haskell side
+         -- as a CInt.
+        p_proto_short  <- (#peek struct protoent, p_proto) p 
+        let p_proto = fromIntegral (p_proto_short :: CShort)
+#else
+        p_proto        <- (#peek struct protoent, p_proto) p 
+#endif
+        return (ProtocolEntry { 
+                        protoName    = p_name,
+                        protoAliases = p_aliases,
+                        protoNumber  = p_proto
+                })
+
+   poke _p = error "Storable.poke(BSD.ProtocolEntry) not implemented"
+
+getProtocolByName :: ProtocolName -> IO ProtocolEntry
+getProtocolByName "tcp" = return $
+	ProtocolEntry {protoName = "tcp", protoAliases = ["TCP"], protoNumber = 6}
+getProtocolByName "udp" = return $
+	ProtocolEntry {protoName = "udp", protoAliases = ["UDP"], protoNumber = 17}
+getProtocolByName name = withLock $ do
+ withCString name $ \ name_cstr -> do
+ throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name)
+   $ (trySysCall.c_getprotobyname) name_cstr
+ >>= peek
+
+foreign import  CALLCONV unsafe  "getprotobyname" 
+   c_getprotobyname :: CString -> IO (Ptr ProtocolEntry)
+
+
+getProtocolByNumber :: ProtocolNumber -> IO ProtocolEntry
+getProtocolByNumber num = withLock $ do
+ throwNoSuchThingIfNull "getProtocolByNumber" ("no such protocol number: " ++ show num)
+   $ (trySysCall.c_getprotobynumber) (fromIntegral num)
+ >>= peek
+
+foreign import CALLCONV unsafe  "getprotobynumber"
+   c_getprotobynumber :: CInt -> IO (Ptr ProtocolEntry)
+
+
+getProtocolNumber :: ProtocolName -> IO ProtocolNumber
+getProtocolNumber proto = do
+ (ProtocolEntry _ _ num) <- getProtocolByName proto
+ return num
+
+-- ---------------------------------------------------------------------------
+-- Host lookups
+
+data HostEntry = 
+  HostEntry  {
+     hostName      :: HostName,         -- Official Name
+     hostAliases   :: [HostName],       -- aliases
+     hostFamily    :: Family,           -- Host Type (currently AF_INET)
+     hostAddresses :: [HostAddress]     -- Set of Network Addresses  (in network byte order)
+  } deriving (Read, Show, Typeable)
+
+instance Storable HostEntry where
+   sizeOf    _ = #const sizeof(struct hostent)
+   alignment _ = alignment (undefined :: CInt) -- ???
+
+   peek p = do
+        h_name       <- (#peek struct hostent, h_name) p >>= peekCString
+        h_aliases    <- (#peek struct hostent, h_aliases) p
+                                >>= peekArray0 nullPtr
+                                >>= mapM peekCString
+        h_addrtype   <- (#peek struct hostent, h_addrtype) p
+        -- h_length       <- (#peek struct hostent, h_length) p
+        h_addr_list  <- (#peek struct hostent, h_addr_list) p
+                                >>= peekArray0 nullPtr
+                                >>= mapM peek
+        return (HostEntry {
+                        hostName       = h_name,
+                        hostAliases    = h_aliases,
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+                        hostFamily     = unpackFamily (fromIntegral (h_addrtype :: CShort)),
+#else
+                        hostFamily     = unpackFamily h_addrtype,
+#endif
+                        hostAddresses  = h_addr_list
+                })
+
+   poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"
+
+
+-- convenience function:
+hostAddress :: HostEntry -> HostAddress
+hostAddress (HostEntry nm _ _ ls) =
+ case ls of
+   []    -> error ("BSD.hostAddress: empty network address list for " ++ nm)
+   (x:_) -> x
+
+-- getHostByName must use the same lock as the *hostent functions
+-- may cause problems if called concurrently.
+
+-- | Resolve a 'HostName' to IPv4 address.
+getHostByName :: HostName -> IO HostEntry
+getHostByName name = withLock $ do
+  withCString name $ \ name_cstr -> do
+   ent <- throwNoSuchThingIfNull "getHostByName" "no such host entry"
+                $ trySysCall $ c_gethostbyname name_cstr
+   peek ent
+
+foreign import CALLCONV safe "gethostbyname" 
+   c_gethostbyname :: CString -> IO (Ptr HostEntry)
+
+
+-- The locking of gethostbyaddr is similar to gethostbyname.
+-- | Get a 'HostEntry' corresponding to the given address and family.
+-- Note that only IPv4 is currently supported.
+getHostByAddr :: Family -> HostAddress -> IO HostEntry
+getHostByAddr family addr = do
+ with addr $ \ ptr_addr -> withLock $ do
+ throwNoSuchThingIfNull         "getHostByAddr" "no such host entry"
+   $ trySysCall $ c_gethostbyaddr ptr_addr (fromIntegral (sizeOf addr)) (packFamily family)
+ >>= peek
+
+foreign import CALLCONV safe "gethostbyaddr"
+   c_gethostbyaddr :: Ptr HostAddress -> CInt -> CInt -> IO (Ptr HostEntry)
+
+-- ---------------------------------------------------------------------------
+-- Accessing network information
+
+-- Same set of access functions as for accessing host,protocol and
+-- service system info, this time for the types of networks supported.
+
+-- network addresses are represented in host byte order.
+type NetworkAddr = CULong
+
+type NetworkName = String
+
+data NetworkEntry =
+  NetworkEntry {
+     networkName        :: NetworkName,   -- official name
+     networkAliases     :: [NetworkName], -- aliases
+     networkFamily      :: Family,         -- type
+     networkAddress     :: NetworkAddr
+   } deriving (Read, Show, Typeable)
+
+instance Storable NetworkEntry where
+   sizeOf    _ = #const sizeof(struct hostent)
+   alignment _ = alignment (undefined :: CInt) -- ???
+
+   peek p = do
+        n_name         <- (#peek struct netent, n_name) p >>= peekCString
+        n_aliases      <- (#peek struct netent, n_aliases) p
+                                >>= peekArray0 nullPtr
+                                >>= mapM peekCString
+        n_addrtype     <- (#peek struct netent, n_addrtype) p
+        n_net          <- (#peek struct netent, n_net) p
+        return (NetworkEntry {
+                        networkName      = n_name,
+                        networkAliases   = n_aliases,
+                        networkFamily    = unpackFamily (fromIntegral 
+                                                        (n_addrtype :: CInt)),
+                        networkAddress   = n_net
+                })
+
+   poke _p = error "Storable.poke(BSD.NetEntry) not implemented"
+
+
+#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)
+getNetworkByName :: NetworkName -> IO NetworkEntry
+getNetworkByName name = withLock $ do
+ withCString name $ \ name_cstr -> do
+  throwNoSuchThingIfNull "getNetworkByName" "no such network entry"
+    $ trySysCall $ c_getnetbyname name_cstr
+  >>= peek
+
+foreign import ccall unsafe "getnetbyname" 
+   c_getnetbyname  :: CString -> IO (Ptr NetworkEntry)
+
+getNetworkByAddr :: NetworkAddr -> Family -> IO NetworkEntry
+getNetworkByAddr addr family = withLock $ do
+ throwNoSuchThingIfNull "getNetworkByAddr" "no such network entry"
+   $ trySysCall $ c_getnetbyaddr addr (packFamily family)
+ >>= peek
+
+foreign import ccall unsafe "getnetbyaddr" 
+   c_getnetbyaddr  :: NetworkAddr -> CInt -> IO (Ptr NetworkEntry)
+
+#endif
+
+-- Mutex for name service lockdown
+
+{-# NOINLINE lock #-}
+lock :: MVar ()
+lock = unsafePerformIO $ newMVar ()
+
+withLock :: IO a -> IO a
+withLock act = withMVar lock (\_ -> act)
+
+-- ---------------------------------------------------------------------------
+-- Miscellaneous Functions
+
+-- | Calling getHostName returns the standard host name for the current
+-- processor, as set at boot time.
+
+getHostName :: IO HostName
+getHostName = do
+  let size = 256
+  allocaArray0 size $ \ cstr -> do
+    throwSocketErrorIfMinus1_ "getHostName" $ c_gethostname cstr (fromIntegral size)
+    peekCString cstr
+
+foreign import CALLCONV unsafe "gethostname" 
+   c_gethostname :: CString -> CSize -> IO CInt
+
+-- Helper function used by the exported functions that provides a
+-- Haskellised view of the enumerator functions:
+
+getEntries :: IO a  -- read
+           -> IO () -- at end
+           -> IO [a]
+getEntries getOne atEnd = loop
+  where
+    loop = do
+      vv <- E.catch (liftM Just getOne)
+            (\ e -> let _types = e :: IOException in return Nothing)
+      case vv of
+        Nothing -> return []
+        Just v  -> loop >>= \ vs -> atEnd >> return (v:vs)
+
+
+-- ---------------------------------------------------------------------------
+-- Winsock only:
+--   The BSD API networking calls made locally return NULL upon failure.
+--   That failure may very well be due to WinSock not being initialised,
+--   so if NULL is seen try init'ing and repeat the call.
+#if !defined(mingw32_HOST_OS) && !defined(_WIN32)
+trySysCall :: IO a -> IO a
+trySysCall act = act
+#else
+trySysCall :: IO (Ptr a) -> IO (Ptr a)
+trySysCall act = do
+  ptr <- act
+  if (ptr == nullPtr)
+   then withSocketsDo act
+   else return ptr
+#endif
+
+throwNoSuchThingIfNull :: String -> String -> IO (Ptr a) -> IO (Ptr a)
+throwNoSuchThingIfNull loc desc act = do
+  ptr <- act
+  if (ptr == nullPtr)
+   then ioError (ioeSetErrorString (mkIOError NoSuchThing loc Nothing Nothing) desc)
+   else return ptr
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc
@@ -0,0 +1,1663 @@
+{-# LANGUAGE CPP, ScopedTypeVariables #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Network.Socket
+-- Copyright   :  (c) The University of Glasgow 2001
+-- License     :  BSD-style (see the file libraries/network/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- The "Network.Socket" module is for when you want full control over
+-- sockets.  Essentially the entire C socket API is exposed through
+-- this module; in general the operations follow the behaviour of the C
+-- functions of the same name (consult your favourite Unix networking book).
+--
+-- A higher level interface to networking operations is provided
+-- through the module "Network".
+--
+-----------------------------------------------------------------------------
+
+#include "HsNet.h"
+
+-- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.
+##include "Typeable.h"
+
+-- In order to process this file, you need to have CALLCONV defined.
+
+module Network.Socket
+    (
+    -- * Types
+      Socket(..)
+    , Family(..)
+    , isSupportedFamily
+    , SocketType(..)
+    , isSupportedSocketType
+    , SockAddr(..)
+    , SocketStatus(..)
+    , HostAddress
+#if defined(IPV6_SOCKET_SUPPORTNO)
+    , HostAddress6
+    , FlowInfo
+    , ScopeID
+#endif
+    , ShutdownCmd(..)
+    , ProtocolNumber
+    , defaultProtocol
+    , PortNumber(..)
+    -- PortNumber is used non-abstractly in Network.BSD.  ToDo: remove
+    -- this use and make the type abstract.
+
+    -- * Address operations
+
+    , HostName
+    , ServiceName
+
+#if defined(IPV6_SOCKET_SUPPORT) || 1
+    , AddrInfo(..)
+
+    , AddrInfoFlag(..)
+    , addrInfoFlagImplemented
+
+    , defaultHints
+
+    , getAddrInfo
+
+    , NameInfoFlag(..)
+
+    , getNameInfo
+#endif
+
+    -- * Socket operations
+    , socket
+#if defined(DOMAIN_SOCKET_SUPPORT)
+    , socketPair
+#endif
+    , connect
+    , bind
+    , listen
+    , accept
+    , getPeerName
+    , getSocketName
+
+#ifdef HAVE_STRUCT_UCRED
+    -- get the credentials of our domain socket peer.
+    , getPeerCred
+#endif
+
+    , socketPort
+
+    , socketToHandle
+
+    -- ** Sending and receiving data
+    -- $sendrecv
+    , sendTo
+    , sendBufTo
+
+    , recvFrom
+    , recvBufFrom
+
+    , send
+    , recv
+    , recvLen
+    , sendBuf
+    , recvBuf
+
+    , inet_addr
+    , inet_ntoa
+
+    , shutdown
+    , close
+
+    -- ** Predicates on sockets
+    , isConnected
+    , isBound
+    , isListening
+    , isReadable
+    , isWritable
+
+    -- * Socket options
+    , SocketOption(..)
+    , isSupportedSocketOption
+    , getSocketOption
+    , setSocketOption
+
+    -- * File descriptor transmission
+#ifdef DOMAIN_SOCKET_SUPPORT
+    , sendFd
+    , recvFd
+
+#endif
+
+    -- * Special constants
+    , aNY_PORT
+    , iNADDR_ANY
+#if defined(IPV6_SOCKET_SUPPORTNO)
+    , iN6ADDR_ANY
+#endif
+    , sOMAXCONN
+    , sOL_SOCKET
+#ifdef SCM_RIGHTS
+    , sCM_RIGHTS
+#endif
+    , maxListenQueue
+
+    -- * Initialisation
+    , withSocketsDo
+
+    -- * Very low level operations
+    -- in case you ever want to get at the underlying file descriptor..
+    , fdSocket
+    , mkSocket
+
+    -- * Deprecated aliases
+    -- $deprecated-aliases
+    , bindSocket
+    , sClose
+    , sIsConnected
+    , sIsBound
+    , sIsListening
+    , sIsReadable
+    , sIsWritable
+
+    -- * Internal
+
+    -- | The following are exported ONLY for use in the BSD module and
+    -- should not be used anywhere else.
+
+    , packFamily
+    , unpackFamily
+    , packSocketType
+    ) where
+
+import Data.Bits
+import Data.List (delete, foldl')
+import Data.Maybe (fromMaybe, isJust)
+import Data.Word (Word8, Word16, Word32)
+import Foreign.Ptr (Ptr, castPtr, nullPtr)
+import Foreign.Storable (Storable(..))
+import Foreign.C.Error
+import Foreign.C.String (CString, withCString, peekCString, peekCStringLen)
+import Foreign.C.Types (CUInt, CChar)
+#if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types (CInt(..), CSize(..))
+#else
+import Foreign.C.Types (CInt, CSize)
+#endif
+import Foreign.Marshal.Alloc ( alloca, allocaBytes )
+import Foreign.Marshal.Array ( peekArray )
+import Foreign.Marshal.Utils ( maybeWith, with )
+
+import System.IO
+import Control.Monad (liftM, when)
+import Data.Ratio ((%))
+
+import qualified Control.Exception as E
+import Control.Concurrent.MVar
+import Data.Typeable
+import System.IO.Error
+
+import GHC.Conc (threadWaitRead, threadWaitWrite)
+##if MIN_VERSION_base(4,3,1)
+import GHC.Conc (closeFdWith)
+##endif
+# if defined(mingw32_HOST_OS)
+import GHC.Conc (asyncDoProc)
+import Foreign (FunPtr)
+# endif
+# if __GLASGOW_HASKELL__ >= 611
+import qualified GHC.IO.Device
+import GHC.IO.Handle.FD
+import GHC.IO.Exception
+import GHC.IO
+# else
+import GHC.IOBase
+import GHC.Handle
+# endif
+import qualified System.Posix.Internals
+
+# if __GLASGOW_HASKELL__ >= 611
+import GHC.IO.FD
+#endif
+
+import Network.Socket.Internal
+import Network.Socket.Types
+
+-- | Either a host name e.g., @\"haskell.org\"@ or a numeric host
+-- address string consisting of a dotted decimal IPv4 address or an
+-- IPv6 address e.g., @\"192.168.0.1\"@.
+type HostName       = String
+type ServiceName    = String
+
+-- ----------------------------------------------------------------------------
+-- On Windows, our sockets are not put in non-blocking mode (non-blocking
+-- is not supported for regular file descriptors on Windows, and it would
+-- be a pain to support it only for sockets).  So there are two cases:
+--
+--  - the threaded RTS uses safe calls for socket operations to get
+--    non-blocking I/O, just like the rest of the I/O library
+--
+--  - with the non-threaded RTS, only some operations on sockets will be
+--    non-blocking.  Reads and writes go through the normal async I/O
+--    system.  accept() uses asyncDoProc so is non-blocking.  A handful
+--    of others (recvFrom, sendFd, recvFd) will block all threads - if this
+--    is a problem, -threaded is the workaround.
+--
+##if defined(mingw32_HOST_OS)
+##define SAFE_ON_WIN safe
+##else
+##define SAFE_ON_WIN unsafe
+##endif
+
+-----------------------------------------------------------------------------
+-- Socket types
+
+#if __GLASGOW_HASKELL__ >= 611 && defined(mingw32_HOST_OS)
+socket2FD  (MkSocket fd _ _ _ _) =
+  -- HACK, 1 means True
+  FD{fdFD = fd,fdIsSocket_ = 1}
+#endif
+
+mkSocket :: CInt
+         -> Family
+         -> SocketType
+         -> ProtocolNumber
+         -> SocketStatus
+         -> IO Socket
+mkSocket fd fam sType pNum stat = do
+   mStat <- newMVar stat
+   return (MkSocket fd fam sType pNum mStat)
+
+
+fdSocket :: Socket -> CInt
+fdSocket (MkSocket fd _ _ _ _) = fd
+
+-- | This is the default protocol for a given service.
+defaultProtocol :: ProtocolNumber
+defaultProtocol = 0
+
+-----------------------------------------------------------------------------
+-- SockAddr
+
+instance Show SockAddr where
+#if defined(DOMAIN_SOCKET_SUPPORT)
+  showsPrec _ (SockAddrUnix str) = showString str
+#endif
+  showsPrec _ (SockAddrInet port ha)
+   = showString (unsafePerformIO (inet_ntoa ha))
+   . showString ":"
+   . shows port
+#if defined(IPV6_SOCKET_SUPPORT)
+  showsPrec _ addr@(SockAddrInet6 port _ _ _)
+   = showChar '['
+   . showString (unsafePerformIO $
+                 fst `liftM` getNameInfo [NI_NUMERICHOST] True False addr >>=
+                 maybe (fail "showsPrec: impossible internal error") return)
+   . showString "]:"
+   . shows port
+#endif
+
+-----------------------------------------------------------------------------
+-- Connection Functions
+
+-- In the following connection and binding primitives.  The names of
+-- the equivalent C functions have been preserved where possible. It
+-- should be noted that some of these names used in the C library,
+-- \tr{bind} in particular, have a different meaning to many Haskell
+-- programmers and have thus been renamed by appending the prefix
+-- Socket.
+
+-- | Create a new socket using the given address family, socket type
+-- and protocol number.  The address family is usually 'AF_INET',
+-- 'AF_INET6', or 'AF_UNIX'.  The socket type is usually 'Stream' or
+-- 'Datagram'.  The protocol number is usually 'defaultProtocol'.
+-- If 'AF_INET6' is used, the 'IPv6Only' socket option is set to 0
+-- so that both IPv4 and IPv6 can be handled with one socket.
+socket :: Family         -- Family Name (usually AF_INET)
+       -> SocketType     -- Socket Type (usually Stream)
+       -> ProtocolNumber -- Protocol Number (getProtocolByName to find value)
+       -> IO Socket      -- Unconnected Socket
+socket family stype protocol = do
+    c_stype <- packSocketTypeOrThrow "socket" stype
+    fd <- throwSocketErrorIfMinus1Retry "socket" $
+                c_socket (packFamily family) c_stype protocol
+    setNonBlockIfNeeded fd
+    socket_status <- newMVar NotConnected
+    let sock = MkSocket fd family stype protocol socket_status
+    return sock
+
+-- | Build a pair of connected socket objects using the given address
+-- family, socket type, and protocol number.  Address family, socket
+-- type, and protocol number are as for the 'socket' function above.
+-- Availability: Unix.
+#if defined(DOMAIN_SOCKET_SUPPORT)
+socketPair :: Family              -- Family Name (usually AF_INET or AF_INET6)
+           -> SocketType          -- Socket Type (usually Stream)
+           -> ProtocolNumber      -- Protocol Number
+           -> IO (Socket, Socket) -- unnamed and connected.
+socketPair family stype protocol = do
+    allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do
+    c_stype <- packSocketTypeOrThrow "socketPair" stype
+    _rc <- throwSocketErrorIfMinus1Retry "socketpair" $
+                c_socketpair (packFamily family) c_stype protocol fdArr
+    [fd1,fd2] <- peekArray 2 fdArr
+    s1 <- mkNonBlockingSocket fd1
+    s2 <- mkNonBlockingSocket fd2
+    return (s1,s2)
+  where
+    mkNonBlockingSocket fd = do
+       setNonBlockIfNeeded fd
+       stat <- newMVar Connected
+       return (MkSocket fd family stype protocol stat)
+
+foreign import ccall unsafe "socketpair"
+  c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt
+#endif
+
+-- | Set the socket to nonblocking, if applicable to this platform.
+setNonBlockIfNeeded :: CInt -> IO ()
+setNonBlockIfNeeded fd =
+#if __GLASGOW_HASKELL__ < 611
+    System.Posix.Internals.setNonBlockingFD fd
+#else
+    System.Posix.Internals.setNonBlockingFD fd True
+#endif
+
+-----------------------------------------------------------------------------
+-- Binding a socket
+
+-- | Bind the socket to an address. The socket must not already be
+-- bound.  The 'Family' passed to @bind@ must be the
+-- same as that passed to 'socket'.  If the special port number
+-- 'aNY_PORT' is passed then the system assigns the next available
+-- use port.
+bind :: Socket    -- Unconnected Socket
+           -> SockAddr  -- Address to Bind to
+           -> IO ()
+bind (MkSocket s _family _stype _protocol socketStatus) addr = do
+ modifyMVar_ socketStatus $ \ status -> do
+ if status /= NotConnected
+  then
+   ioError (userError ("bind: can't peform bind on socket in status " ++
+         show status))
+  else do
+   withSockAddr addr $ \p_addr sz -> do
+   _status <- throwSocketErrorIfMinus1Retry "bind" $ c_bind s p_addr (fromIntegral sz)
+   return Bound
+
+-----------------------------------------------------------------------------
+-- Connecting a socket
+
+-- | Connect to a remote socket at address.
+connect :: Socket    -- Unconnected Socket
+        -> SockAddr  -- Socket address stuff
+        -> IO ()
+connect sock@(MkSocket s _family _stype _protocol socketStatus) addr = do
+ modifyMVar_ socketStatus $ \currentStatus -> do
+ if currentStatus /= NotConnected && currentStatus /= Bound
+  then
+    ioError (userError ("connect: can't peform connect on socket in status " ++
+        show currentStatus))
+  else do
+    withSockAddr addr $ \p_addr sz -> do
+
+    let connectLoop = do
+           r <- c_connect s p_addr (fromIntegral sz)
+           if r == -1
+               then do
+#if !(defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS))
+                   err <- getErrno
+                   case () of
+                     _ | err == eINTR       -> connectLoop
+                     _ | err == eINPROGRESS -> connectBlocked
+--                   _ | err == eAGAIN      -> connectBlocked
+                     _otherwise             -> throwSocketError "connect"
+#else
+                   rc <- c_getLastError
+                   case rc of
+                     #{const WSANOTINITIALISED} -> do
+                       withSocketsDo (return ())
+                       r <- c_connect s p_addr (fromIntegral sz)
+                       if r == -1
+                         then throwSocketError "connect"
+                         else return r
+                     _ -> throwSocketError "connect"
+#endif
+               else return r
+
+        connectBlocked = do
+           threadWaitWrite (fromIntegral s)
+           err <- getSocketOption sock SoError
+           if (err == 0)
+                then return 0
+                else throwSocketErrorCode "connect" (fromIntegral err)
+
+    connectLoop
+    return Connected
+
+-----------------------------------------------------------------------------
+-- Listen
+
+-- | Listen for connections made to the socket.  The second argument
+-- specifies the maximum number of queued connections and should be at
+-- least 1; the maximum value is system-dependent (usually 5).
+listen :: Socket  -- Connected & Bound Socket
+       -> Int     -- Queue Length
+       -> IO ()
+listen (MkSocket s _family _stype _protocol socketStatus) backlog = do
+ modifyMVar_ socketStatus $ \ status -> do
+ if status /= Bound
+   then
+     ioError (userError ("listen: can't peform listen on socket in status " ++
+         show status))
+   else do
+     throwSocketErrorIfMinus1Retry "listen" (c_listen s (fromIntegral backlog))
+     return Listening
+
+-----------------------------------------------------------------------------
+-- Accept
+--
+-- A call to `accept' only returns when data is available on the given
+-- socket, unless the socket has been set to non-blocking.  It will
+-- return a new socket which should be used to read the incoming data and
+-- should then be closed. Using the socket returned by `accept' allows
+-- incoming requests to be queued on the original socket.
+
+-- | Accept a connection.  The socket must be bound to an address and
+-- listening for connections.  The return value is a pair @(conn,
+-- address)@ where @conn@ is a new socket object usable to send and
+-- receive data on the connection, and @address@ is the address bound
+-- to the socket on the other end of the connection.
+accept :: Socket                        -- Queue Socket
+       -> IO (Socket,                   -- Readable Socket
+              SockAddr)                 -- Peer details
+
+accept sock@(MkSocket s family stype protocol status) = do
+ currentStatus <- readMVar status
+ okay <- isAcceptable sock
+ if not okay
+   then
+     ioError (userError ("accept: can't perform accept on socket (" ++ (show (family,stype,protocol)) ++") in status " ++
+         show currentStatus))
+   else do
+     let sz = sizeOfSockAddrByFamily family
+     allocaBytes sz $ \ sockaddr -> do
+#if defined(mingw32_HOST_OS)
+     new_sock <-
+        if threaded
+           then with (fromIntegral sz) $ \ ptr_len ->
+                  throwSocketErrorIfMinus1Retry "Network.Socket.accept" $
+                    c_accept_safe s sockaddr ptr_len
+           else do
+                paramData <- c_newAcceptParams s (fromIntegral sz) sockaddr
+                rc        <- asyncDoProc c_acceptDoProc paramData
+                new_sock  <- c_acceptNewSock    paramData
+                c_free paramData
+                when (rc /= 0) $
+                     throwSocketErrorCode "Network.Socket.accept" (fromIntegral rc)
+                return new_sock
+#else
+     with (fromIntegral sz) $ \ ptr_len -> do
+     new_sock <-
+#if 0
+                 throwSocketErrorIfMinus1RetryMayBlock "accept"
+                        (threadWaitRead (fromIntegral s))
+                        (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK))
+# else
+                 throwSocketErrorWaitRead sock "accept"
+                        (c_accept s sockaddr ptr_len)
+# endif /* HAVE_ACCEPT4 */
+#endif
+     setNonBlockIfNeeded new_sock
+     addr <- peekSockAddr sockaddr
+     new_status <- newMVar Connected
+     return ((MkSocket new_sock family stype protocol new_status), addr)
+
+#if defined(mingw32_HOST_OS)
+foreign import ccall unsafe "HsNet.h acceptNewSock"
+  c_acceptNewSock :: Ptr () -> IO CInt
+foreign import ccall unsafe "HsNet.h newAcceptParams"
+  c_newAcceptParams :: CInt -> CInt -> Ptr a -> IO (Ptr ())
+foreign import ccall unsafe "HsNet.h &acceptDoProc"
+  c_acceptDoProc :: FunPtr (Ptr () -> IO Int)
+foreign import ccall unsafe "free"
+  c_free:: Ptr a -> IO ()
+#endif
+
+-----------------------------------------------------------------------------
+-- ** Sending and reciving data
+
+-- $sendrecv
+--
+-- Do not use the @send@ and @recv@ functions defined in this module
+-- in new code, as they incorrectly represent binary data as a Unicode
+-- string.  As a result, these functions are inefficient and may lead
+-- to bugs in the program.  Instead use the @send@ and @recv@
+-- functions defined in the 'Network.Socket.ByteString' module.
+
+-----------------------------------------------------------------------------
+-- sendTo & recvFrom
+
+-- | Send data to the socket.  The recipient can be specified
+-- explicitly, so the socket need not be in a connected state.
+-- Returns the number of bytes sent.  Applications are responsible for
+-- ensuring that all data has been sent.
+--
+-- NOTE: blocking on Windows unless you compile with -threaded (see
+-- GHC ticket #1129)
+sendTo :: Socket        -- (possibly) bound/connected Socket
+       -> String        -- Data to send
+       -> SockAddr
+       -> IO Int        -- Number of Bytes sent
+sendTo sock xs addr = do
+ withCString xs $ \str -> do
+   sendBufTo sock str (length xs) addr
+
+-- | Send data to the socket.  The recipient can be specified
+-- explicitly, so the socket need not be in a connected state.
+-- Returns the number of bytes sent.  Applications are responsible for
+-- ensuring that all data has been sent.
+sendBufTo :: Socket            -- (possibly) bound/connected Socket
+          -> Ptr a -> Int  -- Data to send
+          -> SockAddr
+          -> IO Int            -- Number of Bytes sent
+sendBufTo sock@(MkSocket s _family _stype _protocol _status) ptr nbytes addr = do
+ withSockAddr addr $ \p_addr sz -> do
+   liftM fromIntegral $
+     throwSocketErrorWaitWrite sock "sendTo" $
+        c_sendto s ptr (fromIntegral $ nbytes) 0{-flags-}
+                        p_addr (fromIntegral sz)
+
+-- | Receive data from the socket. The socket need not be in a
+-- connected state. Returns @(bytes, nbytes, address)@ where @bytes@
+-- is a @String@ of length @nbytes@ representing the data received and
+-- @address@ is a 'SockAddr' representing the address of the sending
+-- socket.
+--
+-- NOTE: blocking on Windows unless you compile with -threaded (see
+-- GHC ticket #1129)
+recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)
+recvFrom sock nbytes =
+  allocaBytes nbytes $ \ptr -> do
+    (len, sockaddr) <- recvBufFrom sock ptr nbytes
+    str <- peekCStringLen (ptr, len)
+    return (str, len, sockaddr)
+
+-- | Receive data from the socket, writing it into buffer instead of
+-- creating a new string.  The socket need not be in a connected
+-- state. Returns @(nbytes, address)@ where @nbytes@ is the number of
+-- bytes received and @address@ is a 'SockAddr' representing the
+-- address of the sending socket.
+--
+-- NOTE: blocking on Windows unless you compile with -threaded (see
+-- GHC ticket #1129)
+recvBufFrom :: Socket -> Ptr a -> Int -> IO (Int, SockAddr)
+recvBufFrom sock@(MkSocket s family _stype _protocol _status) ptr nbytes
+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvFrom")
+ | otherwise   =
+    withNewSockAddr family $ \ptr_addr sz -> do
+      alloca $ \ptr_len -> do
+        poke ptr_len (fromIntegral sz)
+        len <- throwSocketErrorWaitRead sock "recvFrom" $
+                   c_recvfrom s ptr (fromIntegral nbytes) 0{-flags-}
+                                ptr_addr ptr_len
+        let len' = fromIntegral len
+        if len' == 0
+         then ioError (mkEOFError "Network.Socket.recvFrom")
+         else do
+           flg <- isConnected sock
+             -- For at least one implementation (WinSock 2), recvfrom() ignores
+             -- filling in the sockaddr for connected TCP sockets. Cope with
+             -- this by using getPeerName instead.
+           sockaddr <-
+                if flg then
+                   getPeerName sock
+                else
+                   peekSockAddr ptr_addr
+           return (len', sockaddr)
+
+-----------------------------------------------------------------------------
+-- send & recv
+
+-- | Send data to the socket. The socket must be connected to a remote
+-- socket. Returns the number of bytes sent.  Applications are
+-- responsible for ensuring that all data has been sent.
+send :: Socket  -- Bound/Connected Socket
+     -> String  -- Data to send
+     -> IO Int  -- Number of Bytes sent
+send sock@(MkSocket s _family _stype _protocol _status) xs = do
+ let len = length xs
+ withCString xs $ \str -> do
+   liftM fromIntegral $
+#if defined(mingw32_HOST_OS)
+# if __GLASGOW_HASKELL__ >= 611
+    writeRawBufferPtr
+      "Network.Socket.send"
+      (socket2FD sock)
+      (castPtr str)
+      0
+      (fromIntegral len)
+#else
+      writeRawBufferPtr
+        "Network.Socket.send"
+        (fromIntegral s)
+        True
+        str
+        0
+       (fromIntegral len)
+#endif
+
+#else
+     throwSocketErrorWaitWrite sock "send" $
+        c_send s str (fromIntegral len) 0{-flags-}
+#endif
+
+-- | Send data to the socket. The socket must be connected to a remote
+-- socket. Returns the number of bytes sent.  Applications are
+-- responsible for ensuring that all data has been sent.
+sendBuf :: Socket     -- Bound/Connected Socket
+        -> Ptr Word8  -- Pointer to the data to send
+        -> Int        -- Length of the buffer
+        -> IO Int     -- Number of Bytes sent
+sendBuf sock@(MkSocket s _family _stype _protocol _status) str len = do
+   liftM fromIntegral $
+#if defined(mingw32_HOST_OS)
+# if __GLASGOW_HASKELL__ >= 611
+    writeRawBufferPtr
+      "Network.Socket.sendBuf"
+      (socket2FD sock)
+      (castPtr str)
+      0
+      (fromIntegral len)
+# else
+      writeRawBufferPtr
+        "Network.Socket.sendBuf"
+        (fromIntegral s)
+        True
+        str
+        0
+       (fromIntegral len)
+# endif
+#else
+     throwSocketErrorWaitWrite sock "sendBuf" $
+        c_send s str (fromIntegral len) 0{-flags-}
+#endif
+
+
+-- | Receive data from the socket.  The socket must be in a connected
+-- state. This function may return fewer bytes than specified.  If the
+-- message is longer than the specified length, it may be discarded
+-- depending on the type of socket.  This function may block until a
+-- message arrives.
+--
+-- Considering hardware and network realities, the maximum number of
+-- bytes to receive should be a small power of 2, e.g., 4096.
+--
+-- For TCP sockets, a zero length return value means the peer has
+-- closed its half side of the connection.
+recv :: Socket -> Int -> IO String
+recv sock l = recvLen sock l >>= \ (s,_) -> return s
+
+recvLen :: Socket -> Int -> IO (String, Int)
+recvLen sock@(MkSocket s _family _stype _protocol _status) nbytes
+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recv")
+ | otherwise   = do
+     allocaBytes nbytes $ \ptr -> do
+        len <-
+#if defined(mingw32_HOST_OS)
+# if __GLASGOW_HASKELL__ >= 611
+          readRawBufferPtr "Network.Socket.recvLen" (socket2FD sock) ptr 0
+                 (fromIntegral nbytes)
+#else
+          readRawBufferPtr "Network.Socket.recvLen" (fromIntegral s) True ptr 0
+                 (fromIntegral nbytes)
+#endif
+#else
+               throwSocketErrorWaitRead sock "recv" $
+                   c_recv s ptr (fromIntegral nbytes) 0{-flags-}
+#endif
+        let len' = fromIntegral len
+        if len' == 0
+         then ioError (mkEOFError "Network.Socket.recv")
+         else do
+           s' <- peekCStringLen (castPtr ptr,len')
+           return (s', len')
+
+-- | Receive data from the socket.  The socket must be in a connected
+-- state. This function may return fewer bytes than specified.  If the
+-- message is longer than the specified length, it may be discarded
+-- depending on the type of socket.  This function may block until a
+-- message arrives.
+--
+-- Considering hardware and network realities, the maximum number of
+-- bytes to receive should be a small power of 2, e.g., 4096.
+--
+-- For TCP sockets, a zero length return value means the peer has
+-- closed its half side of the connection.
+recvBuf :: Socket -> Ptr Word8 -> Int -> IO Int
+recvBuf sock p l = recvLenBuf sock p l
+
+recvLenBuf :: Socket -> Ptr Word8 -> Int -> IO Int
+recvLenBuf sock@(MkSocket s _family _stype _protocol _status) ptr nbytes
+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBuf")
+ | otherwise   = do
+        len <-
+#if defined(mingw32_HOST_OS)
+# if __GLASGOW_HASKELL__ >= 611
+          readRawBufferPtr "Network.Socket.recvLenBuf" (socket2FD sock) ptr 0
+                 (fromIntegral nbytes)
+#else
+          readRawBufferPtr "Network.Socket.recvLenBuf" (fromIntegral s) True ptr 0
+                 (fromIntegral nbytes)
+#endif
+#else
+               throwSocketErrorWaitRead sock "recvBuf" $
+                   c_recv s (castPtr ptr) (fromIntegral nbytes) 0{-flags-}
+#endif
+        let len' = fromIntegral len
+        if len' == 0
+         then ioError (mkEOFError "Network.Socket.recvBuf")
+         else return len'
+
+
+-- ---------------------------------------------------------------------------
+-- socketPort
+--
+-- The port number the given socket is currently connected to can be
+-- determined by calling $port$, is generally only useful when bind
+-- was given $aNY\_PORT$.
+
+socketPort :: Socket            -- Connected & Bound Socket
+           -> IO PortNumber     -- Port Number of Socket
+socketPort sock@(MkSocket _ AF_INET _ _ _) = do
+    (SockAddrInet port _) <- getSocketName sock
+    return port
+#if defined(IPV6_SOCKET_SUPPORT)
+socketPort sock@(MkSocket _ AF_INET6 _ _ _) = do
+    (SockAddrInet6 port _ _ _) <- getSocketName sock
+    return port
+#endif
+socketPort (MkSocket _ family _ _ _) =
+    ioError (userError ("socketPort: not supported for Family " ++ show family))
+
+
+-- ---------------------------------------------------------------------------
+-- getPeerName
+
+-- Calling $getPeerName$ returns the address details of the machine,
+-- other than the local one, which is connected to the socket. This is
+-- used in programs such as FTP to determine where to send the
+-- returning data.  The corresponding call to get the details of the
+-- local machine is $getSocketName$.
+
+getPeerName   :: Socket -> IO SockAddr
+getPeerName (MkSocket s family _ _ _) = do
+ withNewSockAddr family $ \ptr sz -> do
+   with (fromIntegral sz) $ \int_star -> do
+   throwSocketErrorIfMinus1Retry "getPeerName" $ c_getpeername s ptr int_star
+   _sz <- peek int_star
+   peekSockAddr ptr
+
+getSocketName :: Socket -> IO SockAddr
+getSocketName (MkSocket s family _ _ _) = do
+ withNewSockAddr family $ \ptr sz -> do
+   with (fromIntegral sz) $ \int_star -> do
+   throwSocketErrorIfMinus1Retry "getSocketName" $ c_getsockname s ptr int_star
+   peekSockAddr ptr
+
+-----------------------------------------------------------------------------
+-- Socket Properties
+
+-- | Socket options for use with 'setSocketOption' and 'getSocketOption'.
+--
+-- The existence of a constructor does not imply that the relevant option
+-- is supported on your system: see 'isSupportedSocketOption'
+data SocketOption
+    = Debug         -- ^ SO_DEBUG
+    | ReuseAddr     -- ^ SO_REUSEADDR
+    | Type          -- ^ SO_TYPE
+    | SoError       -- ^ SO_ERROR
+    | DontRoute     -- ^ SO_DONTROUTE
+    | Broadcast     -- ^ SO_BROADCAST
+    | SendBuffer    -- ^ SO_SNDBUF
+    | RecvBuffer    -- ^ SO_RCVBUF
+    | KeepAlive     -- ^ SO_KEEPALIVE
+    | OOBInline     -- ^ SO_OOBINLINE
+    | TimeToLive    -- ^ IP_TTL
+    | MaxSegment    -- ^ TCP_MAXSEG
+    | NoDelay       -- ^ TCP_NODELAY
+    | Cork          -- ^ TCP_CORK
+    | Linger        -- ^ SO_LINGER
+    | ReusePort     -- ^ SO_REUSEPORT
+    | RecvLowWater  -- ^ SO_RCVLOWAT
+    | SendLowWater  -- ^ SO_SNDLOWAT
+    | RecvTimeOut   -- ^ SO_RCVTIMEO
+    | SendTimeOut   -- ^ SO_SNDTIMEO
+    | UseLoopBack   -- ^ SO_USELOOPBACK
+    | IPv6Only      -- ^ IPV6_V6ONLY
+    deriving (Show, Typeable)
+
+-- | Does the 'SocketOption' exist on this system?
+isSupportedSocketOption :: SocketOption -> Bool
+isSupportedSocketOption = isJust . packSocketOption
+
+-- | For a socket option, return Just (level, value) where level is the
+-- corresponding C option level constant (e.g. SOL_SOCKET) and value is
+-- the option constant itself (e.g. SO_DEBUG)
+-- If either constant does not exist, return Nothing.
+packSocketOption :: SocketOption -> Maybe (CInt, CInt)
+packSocketOption so =
+  -- The Just here is a hack to disable GHC's overlapping pattern detection:
+  -- the problem is if all constants are present, the fallback pattern is
+  -- redundant, but if they aren't then it isn't. Hence we introduce an
+  -- extra pattern (Nothing) that can't possibly happen, so that the
+  -- fallback is always (in principle) necessary.
+  -- I feel a little bad for including this, but such are the sacrifices we
+  -- make while working with CPP - excluding the fallback pattern correctly
+  -- would be a serious nuisance.
+  -- (NB: comments elsewhere in this file refer to this one)
+  case Just so of
+#ifdef SOL_SOCKET
+#ifdef SO_DEBUG
+    Just Debug         -> Just ((#const SOL_SOCKET), (#const SO_DEBUG))
+#endif
+#ifdef SO_REUSEADDR
+    Just ReuseAddr     -> Just ((#const SOL_SOCKET), (#const SO_REUSEADDR))
+#endif
+#ifdef SO_TYPE
+    Just Type          -> Just ((#const SOL_SOCKET), (#const SO_TYPE))
+#endif
+#ifdef SO_ERROR
+    Just SoError       -> Just ((#const SOL_SOCKET), (#const SO_ERROR))
+#endif
+#ifdef SO_DONTROUTE
+    Just DontRoute     -> Just ((#const SOL_SOCKET), (#const SO_DONTROUTE))
+#endif
+#ifdef SO_BROADCAST
+    Just Broadcast     -> Just ((#const SOL_SOCKET), (#const SO_BROADCAST))
+#endif
+#ifdef SO_SNDBUF
+    Just SendBuffer    -> Just ((#const SOL_SOCKET), (#const SO_SNDBUF))
+#endif
+#ifdef SO_RCVBUF
+    Just RecvBuffer    -> Just ((#const SOL_SOCKET), (#const SO_RCVBUF))
+#endif
+#ifdef SO_KEEPALIVE
+    Just KeepAlive     -> Just ((#const SOL_SOCKET), (#const SO_KEEPALIVE))
+#endif
+#ifdef SO_OOBINLINE
+    Just OOBInline     -> Just ((#const SOL_SOCKET), (#const SO_OOBINLINE))
+#endif
+#ifdef SO_LINGER
+    Just Linger        -> Just ((#const SOL_SOCKET), (#const SO_LINGER))
+#endif
+#ifdef SO_REUSEPORT
+    Just ReusePort     -> Just ((#const SOL_SOCKET), (#const SO_REUSEPORT))
+#endif
+#ifdef SO_RCVLOWAT
+    Just RecvLowWater  -> Just ((#const SOL_SOCKET), (#const SO_RCVLOWAT))
+#endif
+#ifdef SO_SNDLOWAT
+    Just SendLowWater  -> Just ((#const SOL_SOCKET), (#const SO_SNDLOWAT))
+#endif
+#ifdef SO_RCVTIMEO
+    Just RecvTimeOut   -> Just ((#const SOL_SOCKET), (#const SO_RCVTIMEO))
+#endif
+#ifdef SO_SNDTIMEO
+    Just SendTimeOut   -> Just ((#const SOL_SOCKET), (#const SO_SNDTIMEO))
+#endif
+#ifdef SO_USELOOPBACK
+    Just UseLoopBack   -> Just ((#const SOL_SOCKET), (#const SO_USELOOPBACK))
+#endif
+#endif // SOL_SOCKET
+#ifdef IPPROTO_IP
+#ifdef IP_TTL
+    Just TimeToLive    -> Just ((#const IPPROTO_IP), (#const IP_TTL))
+#endif
+#endif // IPPROTO_IP
+#ifdef IPPROTO_TCP
+#ifdef TCP_MAXSEG
+    Just MaxSegment    -> Just ((#const IPPROTO_TCP), (#const TCP_MAXSEG))
+#endif
+#ifdef TCP_NODELAY
+    Just NoDelay       -> Nothing -- Just ((#const IPPROTO_TCP), (#const TCP_NODELAY))
+#endif
+#ifdef TCP_CORK
+    Just Cork          -> Just ((#const IPPROTO_TCP), (#const TCP_CORK))
+#endif
+#endif // IPPROTO_TCP
+#ifdef IPPROTO_IPV6
+#if HAVE_DECL_IPV6_V6ONLY
+    Just IPv6Only      -> Just ((#const IPPROTO_IPV6), (#const IPV6_V6ONLY))
+#endif
+#endif // IPPROTO_IPV6
+    _             -> Nothing
+
+-- | Return the option level and option value if they exist,
+-- otherwise throw an error that begins "Network.Socket." ++ the String
+-- parameter
+packSocketOption' :: String -> SocketOption -> IO (CInt, CInt)
+packSocketOption' caller so = maybe err return (packSocketOption so)
+ where
+  err = ioError . userError . concat $ ["Network.Socket.", caller,
+    ": socket option ", show so, " unsupported on this system"]
+
+-- | Set a socket option that expects an Int value.
+-- There is currently no API to set e.g. the timeval socket options
+setSocketOption :: Socket
+                -> SocketOption -- Option Name
+                -> Int          -- Option Value
+                -> IO ()
+setSocketOption (MkSocket s _ _ _ _) so v = do
+   (level, opt) <- packSocketOption' "setSocketOption" so
+   with (fromIntegral v) $ \ptr_v -> do
+   throwSocketErrorIfMinus1_ "setSocketOption" $
+       c_setsockopt s level opt ptr_v
+          (fromIntegral (sizeOf (undefined :: CInt)))
+   return ()
+
+
+-- | Get a socket option that gives an Int value.
+-- There is currently no API to get e.g. the timeval socket options
+getSocketOption :: Socket
+                -> SocketOption  -- Option Name
+                -> IO Int        -- Option Value
+getSocketOption (MkSocket s _ _ _ _) so = do
+   (level, opt) <- packSocketOption' "getSocketOption" so
+   alloca $ \ptr_v ->
+     with (fromIntegral (sizeOf (undefined :: CInt))) $ \ptr_sz -> do
+       throwSocketErrorIfMinus1Retry "getSocketOption" $
+         c_getsockopt s level opt ptr_v ptr_sz
+       fromIntegral `liftM` peek ptr_v
+
+
+#ifdef HAVE_STRUCT_UCRED
+-- | Returns the processID, userID and groupID of the socket's peer.
+--
+-- Only available on platforms that support SO_PEERCRED on domain sockets.
+getPeerCred :: Socket -> IO (CUInt, CUInt, CUInt)
+getPeerCred sock = do
+  let fd = fdSocket sock
+  let sz = (fromIntegral (#const sizeof(struct ucred)))
+  with sz $ \ ptr_cr ->
+   alloca       $ \ ptr_sz -> do
+     poke ptr_sz sz
+     throwSocketErrorIfMinus1Retry "getPeerCred" $
+       c_getsockopt fd (#const SOL_SOCKET) (#const SO_PEERCRED) ptr_cr ptr_sz
+     pid <- (#peek struct ucred, pid) ptr_cr
+     uid <- (#peek struct ucred, uid) ptr_cr
+     gid <- (#peek struct ucred, gid) ptr_cr
+     return (pid, uid, gid)
+#endif
+
+##if !(MIN_VERSION_base(4,3,1))
+closeFdWith closer fd = closer fd
+##endif
+
+#if defined(DOMAIN_SOCKET_SUPPORT)
+-- sending/receiving ancillary socket data; low-level mechanism
+-- for transmitting file descriptors, mainly.
+sendFd :: Socket -> CInt -> IO ()
+sendFd sock outfd = do
+  throwSocketErrorWaitWrite sock "sendFd" $
+     c_sendFd (fdSocket sock) outfd
+   -- Note: If Winsock supported FD-passing, thi would have been
+   -- incorrect (since socket FDs need to be closed via closesocket().)
+  closeFd outfd
+
+recvFd :: Socket -> IO CInt
+recvFd sock = do
+  theFd <- throwSocketErrorWaitRead sock "recvFd" $
+               c_recvFd (fdSocket sock)
+  return theFd
+
+foreign import ccall SAFE_ON_WIN "sendFd" c_sendFd :: CInt -> CInt -> IO CInt
+foreign import ccall SAFE_ON_WIN "recvFd" c_recvFd :: CInt -> IO CInt
+
+#endif
+
+-- ---------------------------------------------------------------------------
+-- Utility Functions
+
+aNY_PORT :: PortNumber
+aNY_PORT = 0
+
+-- | The IPv4 wild card address.
+
+iNADDR_ANY :: HostAddress
+iNADDR_ANY = htonl (#const INADDR_ANY)
+
+foreign import CALLCONV unsafe "my_htonl" htonl :: Word32 -> Word32
+
+#if defined(IPV6_SOCKET_SUPPORTNO)
+-- | The IPv6 wild card address.
+
+iN6ADDR_ANY :: HostAddress6
+iN6ADDR_ANY = (0, 0, 0, 0)
+#endif
+
+sOMAXCONN :: Int
+sOMAXCONN = #const SOMAXCONN
+
+sOL_SOCKET :: Int
+sOL_SOCKET = #const SOL_SOCKET
+
+#ifdef SCM_RIGHTS
+sCM_RIGHTS :: Int
+sCM_RIGHTS = #const SCM_RIGHTS
+#endif
+
+-- | This is the value of SOMAXCONN, typically 128.
+-- 128 is good enough for normal network servers but
+-- is too small for high performance servers.
+maxListenQueue :: Int
+maxListenQueue = sOMAXCONN
+
+-- -----------------------------------------------------------------------------
+
+data ShutdownCmd
+ = ShutdownReceive
+ | ShutdownSend
+ | ShutdownBoth
+ deriving Typeable
+
+sdownCmdToInt :: ShutdownCmd -> CInt
+sdownCmdToInt ShutdownReceive = 0
+sdownCmdToInt ShutdownSend    = 1
+sdownCmdToInt ShutdownBoth    = 2
+
+-- | Shut down one or both halves of the connection, depending on the
+-- second argument to the function.  If the second argument is
+-- 'ShutdownReceive', further receives are disallowed.  If it is
+-- 'ShutdownSend', further sends are disallowed.  If it is
+-- 'ShutdownBoth', further sends and receives are disallowed.
+shutdown :: Socket -> ShutdownCmd -> IO ()
+shutdown (MkSocket s _ _ _ _) stype = do
+  throwSocketErrorIfMinus1Retry "shutdown" (c_shutdown s (sdownCmdToInt stype))
+  return ()
+
+-- -----------------------------------------------------------------------------
+
+-- | Close the socket.  All future operations on the socket object
+-- will fail.  The remote end will receive no more data (after queued
+-- data is flushed).
+close :: Socket -> IO ()
+close (MkSocket s _ _ _ socketStatus) = do
+ modifyMVar_ socketStatus $ \ status ->
+   case status of
+     ConvertedToHandle ->
+         ioError (userError ("close: converted to a Handle, use hClose instead"))
+     Closed ->
+         return status
+     _ -> closeFdWith (closeFd . fromIntegral) (fromIntegral s) >> return Closed
+
+-- -----------------------------------------------------------------------------
+
+isConnected :: Socket -> IO Bool
+isConnected (MkSocket _ _ _ _ status) = do
+    value <- readMVar status
+    return (value == Connected)
+
+-- -----------------------------------------------------------------------------
+-- Socket Predicates
+
+isBound :: Socket -> IO Bool
+isBound (MkSocket _ _ _ _ status) = do
+    value <- readMVar status
+    return (value == Bound)
+
+isListening :: Socket -> IO Bool
+isListening (MkSocket _ _ _  _ status) = do
+    value <- readMVar status
+    return (value == Listening)
+
+isReadable  :: Socket -> IO Bool
+isReadable (MkSocket _ _ _ _ status) = do
+    value <- readMVar status
+    return (value == Listening || value == Connected)
+
+isWritable  :: Socket -> IO Bool
+isWritable = isReadable -- sort of.
+
+isAcceptable :: Socket -> IO Bool
+#if defined(DOMAIN_SOCKET_SUPPORT)
+isAcceptable (MkSocket _ AF_UNIX x _ status)
+    | x == Stream || x == SeqPacket = do
+        value <- readMVar status
+        return (value == Connected || value == Bound || value == Listening)
+isAcceptable (MkSocket _ AF_UNIX _ _ _) = return False
+#endif
+isAcceptable (MkSocket _ _ _ _ status) = do
+    value <- readMVar status
+    return (value == Connected || value == Listening)
+
+-- -----------------------------------------------------------------------------
+-- Internet address manipulation routines:
+
+inet_addr :: String -> IO HostAddress
+inet_addr ipstr = do
+   withCString ipstr $ \str -> do
+   had <- c_inet_addr str
+   if had == -1
+    then ioError (userError ("inet_addr: Malformed address: " ++ ipstr))
+    else return had  -- network byte order
+
+inet_ntoa :: HostAddress -> IO String
+inet_ntoa haddr = do
+  pstr <- c_inet_ntoa haddr
+  peekCString pstr
+
+-- | Turns a Socket into an 'Handle'. By default, the new handle is
+-- unbuffered. Use 'System.IO.hSetBuffering' to change the buffering.
+--
+-- Note that since a 'Handle' is automatically closed by a finalizer
+-- when it is no longer referenced, you should avoid doing any more
+-- operations on the 'Socket' after calling 'socketToHandle'.  To
+-- close the 'Socket' after 'socketToHandle', call 'System.IO.hClose'
+-- on the 'Handle'.
+
+#ifndef __PARALLEL_HASKELL__
+socketToHandle :: Socket -> IOMode -> IO Handle
+socketToHandle s@(MkSocket fd _ _ _ socketStatus) mode = do
+ modifyMVar socketStatus $ \ status ->
+    if status == ConvertedToHandle
+        then ioError (userError ("socketToHandle: already a Handle"))
+        else do
+# if __GLASGOW_HASKELL__ >= 611
+    h <- fdToHandle' (fromIntegral fd) (Just GHC.IO.Device.Stream) True (show s) mode True{-bin-}
+# elif __GLASGOW_HASKELL__ >= 608
+    h <- fdToHandle' (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}
+# elif __GLASGOW_HASKELL__ < 608
+    h <- openFd (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}
+# endif
+    hSetBuffering h NoBuffering
+    return (ConvertedToHandle, h)
+#else
+socketToHandle (MkSocket s family stype protocol status) m =
+  error "socketToHandle not implemented in a parallel setup"
+#endif
+
+-- | Pack a list of values into a bitmask.  The possible mappings from
+-- value to bit-to-set are given as the first argument.  We assume
+-- that each value can cause exactly one bit to be set; unpackBits will
+-- break if this property is not true.
+
+packBits :: (Eq a, Num b, Bits b) => [(a, b)] -> [a] -> b
+
+packBits mapping xs = foldl' pack 0 mapping
+    where pack acc (k, v) | k `elem` xs = acc .|. v
+                          | otherwise   = acc
+
+-- | Unpack a bitmask into a list of values.
+
+unpackBits :: (Num b, Bits b) => [(a, b)] -> b -> [a]
+
+-- Be permissive and ignore unknown bit values. At least on OS X,
+-- getaddrinfo returns an ai_flags field with bits set that have no
+-- entry in <netdb.h>.
+unpackBits [] _    = []
+unpackBits ((k,v):xs) r
+    | r .&. v /= 0 = k : unpackBits xs (r .&. complement v)
+    | otherwise    = unpackBits xs r
+
+-----------------------------------------------------------------------------
+-- Address and service lookups
+
+#if defined(IPV6_SOCKET_SUPPORT) || 1
+
+-- | Flags that control the querying behaviour of 'getAddrInfo'.
+data AddrInfoFlag
+    = AI_ADDRCONFIG
+    | AI_ALL
+    | AI_CANONNAME
+    | AI_NUMERICHOST
+    | AI_NUMERICSERV
+    | AI_PASSIVE
+    | AI_V4MAPPED
+    deriving (Eq, Read, Show, Typeable)
+
+aiFlagMapping :: [(AddrInfoFlag, CInt)]
+
+aiFlagMapping =
+    [
+#if HAVE_DECL_AI_ADDRCONFIG
+     (AI_ADDRCONFIG, #const AI_ADDRCONFIG),
+#else
+     (AI_ADDRCONFIG, 0),
+#endif
+#if HAVE_DECL_AI_ALL
+     (AI_ALL, #const AI_ALL),
+#else
+     (AI_ALL, 0),
+#endif
+     (AI_CANONNAME, #const AI_CANONNAME),
+     (AI_NUMERICHOST, #const AI_NUMERICHOST),
+#if HAVE_DECL_AI_NUMERICSERV
+     (AI_NUMERICSERV, #const AI_NUMERICSERV),
+#else
+     (AI_NUMERICSERV, 0),
+#endif
+     (AI_PASSIVE, #const AI_PASSIVE),
+#if HAVE_DECL_AI_V4MAPPED
+     (AI_V4MAPPED, #const AI_V4MAPPED)
+#else
+     (AI_V4MAPPED, 0)
+#endif
+    ]
+
+-- | Indicate whether the given 'AddrInfoFlag' will have any effect on
+-- this system.
+addrInfoFlagImplemented :: AddrInfoFlag -> Bool
+addrInfoFlagImplemented f = packBits aiFlagMapping [f] /= 0
+
+data AddrInfo =
+    AddrInfo {
+        addrFlags :: [AddrInfoFlag],
+        addrFamily :: Family,
+        addrSocketType :: SocketType,
+        addrProtocol :: ProtocolNumber,
+        addrAddress :: SockAddr,
+        addrCanonName :: Maybe String
+        }
+    deriving (Eq, Show, Typeable)
+
+instance Storable AddrInfo where
+    sizeOf    _ = #const sizeof(struct addrinfo)
+    alignment _ = alignment (undefined :: CInt)
+
+    peek p = do
+        ai_flags <- (#peek struct addrinfo, ai_flags) p
+        ai_family <- (#peek struct addrinfo, ai_family) p
+        ai_socktype <- (#peek struct addrinfo, ai_socktype) p
+        ai_protocol <- (#peek struct addrinfo, ai_protocol) p
+        ai_addr <- (#peek struct addrinfo, ai_addr) p >>= peekSockAddr
+        ai_canonname_ptr <- (#peek struct addrinfo, ai_canonname) p
+
+        ai_canonname <- if ai_canonname_ptr == nullPtr
+                        then return Nothing
+                        else liftM Just $ peekCString ai_canonname_ptr
+
+        socktype <- unpackSocketType' "AddrInfo.peek" ai_socktype
+        return (AddrInfo
+                {
+                 addrFlags = unpackBits aiFlagMapping ai_flags,
+                 addrFamily = unpackFamily ai_family,
+                 addrSocketType = socktype,
+                 addrProtocol = ai_protocol,
+                 addrAddress = ai_addr,
+                 addrCanonName = ai_canonname
+                })
+
+    poke p (AddrInfo flags family socketType protocol _ _) = do
+        c_stype <- packSocketTypeOrThrow "AddrInfo.poke" socketType
+
+        (#poke struct addrinfo, ai_flags) p (packBits aiFlagMapping flags)
+        (#poke struct addrinfo, ai_family) p (packFamily family)
+        (#poke struct addrinfo, ai_socktype) p c_stype
+        (#poke struct addrinfo, ai_protocol) p protocol
+
+        -- stuff below is probably not needed, but let's zero it for safety
+
+        (#poke struct addrinfo, ai_addrlen) p (0::CSize)
+        (#poke struct addrinfo, ai_addr) p nullPtr
+        (#poke struct addrinfo, ai_canonname) p nullPtr
+        (#poke struct addrinfo, ai_next) p nullPtr
+
+data NameInfoFlag
+    = NI_DGRAM
+    | NI_NAMEREQD
+    | NI_NOFQDN
+    | NI_NUMERICHOST
+    | NI_NUMERICSERV
+    deriving (Eq, Read, Show, Typeable)
+
+niFlagMapping :: [(NameInfoFlag, CInt)]
+
+niFlagMapping = [(NI_DGRAM, #const NI_DGRAM),
+                 (NI_NAMEREQD, #const NI_NAMEREQD),
+                 (NI_NOFQDN, #const NI_NOFQDN),
+                 (NI_NUMERICHOST, #const NI_NUMERICHOST),
+                 (NI_NUMERICSERV, #const NI_NUMERICSERV)]
+
+-- | Default hints for address lookup with 'getAddrInfo'.  The values
+-- of the 'addrAddress' and 'addrCanonName' fields are 'undefined',
+-- and are never inspected by 'getAddrInfo'.
+
+defaultHints :: AddrInfo
+
+defaultHints = AddrInfo {
+                         addrFlags = [],
+                         addrFamily = AF_UNSPEC,
+                         addrSocketType = NoSocketType,
+                         addrProtocol = defaultProtocol,
+                         addrAddress = undefined,
+                         addrCanonName = undefined
+                        }
+
+-- | Resolve a host or service name to one or more addresses.
+-- The 'AddrInfo' values that this function returns contain 'SockAddr'
+-- values that you can pass directly to 'connect' or
+-- 'bind'.
+--
+-- This function is protocol independent.  It can return both IPv4 and
+-- IPv6 address information.
+--
+-- The 'AddrInfo' argument specifies the preferred query behaviour,
+-- socket options, or protocol.  You can override these conveniently
+-- using Haskell's record update syntax on 'defaultHints', for example
+-- as follows:
+--
+-- @
+--   myHints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }
+-- @
+--
+-- Values for 'addrFlags' control query behaviour.  The supported
+-- flags are as follows:
+--
+--   [@AI_PASSIVE@] If no 'HostName' value is provided, the network
+--     address in each 'SockAddr'
+--     will be left as a "wild card", i.e. as either 'iNADDR_ANY'
+--     or 'iN6ADDR_ANY'.  This is useful for server applications that
+--     will accept connections from any client.
+--
+--   [@AI_CANONNAME@] The 'addrCanonName' field of the first returned
+--     'AddrInfo' will contain the "canonical name" of the host.
+--
+--   [@AI_NUMERICHOST@] The 'HostName' argument /must/ be a numeric
+--     address in string form, and network name lookups will not be
+--     attempted.
+--
+-- /Note/: Although the following flags are required by RFC 3493, they
+-- may not have an effect on all platforms, because the underlying
+-- network stack may not support them.  To see whether a flag from the
+-- list below will have any effect, call 'addrInfoFlagImplemented'.
+--
+--   [@AI_NUMERICSERV@] The 'ServiceName' argument /must/ be a port
+--     number in string form, and service name lookups will not be
+--     attempted.
+--
+--   [@AI_ADDRCONFIG@] The list of returned 'AddrInfo' values will
+--     only contain IPv4 addresses if the local system has at least
+--     one IPv4 interface configured, and likewise for IPv6.
+--
+--   [@AI_V4MAPPED@] If an IPv6 lookup is performed, and no IPv6
+--     addresses are found, IPv6-mapped IPv4 addresses will be
+--     returned.
+--
+--   [@AI_ALL@] If 'AI_ALL' is specified, return all matching IPv6 and
+--     IPv4 addresses.  Otherwise, this flag has no effect.
+--
+-- You must provide a 'Just' value for at least one of the 'HostName'
+-- or 'ServiceName' arguments.  'HostName' can be either a numeric
+-- network address (dotted quad for IPv4, colon-separated hex for
+-- IPv6) or a hostname.  In the latter case, its addresses will be
+-- looked up unless 'AI_NUMERICHOST' is specified as a hint.  If you
+-- do not provide a 'HostName' value /and/ do not set 'AI_PASSIVE' as
+-- a hint, network addresses in the result will contain the address of
+-- the loopback interface.
+--
+-- If the query fails, this function throws an IO exception instead of
+-- returning an empty list.  Otherwise, it returns a non-empty list
+-- of 'AddrInfo' values.
+--
+-- There are several reasons why a query might result in several
+-- values.  For example, the queried-for host could be multihomed, or
+-- the service might be available via several protocols.
+--
+-- Note: the order of arguments is slightly different to that defined
+-- for @getaddrinfo@ in RFC 2553.  The 'AddrInfo' parameter comes first
+-- to make partial application easier.
+--
+-- Example:
+-- @
+--   let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }
+--   addrs <- getAddrInfo (Just hints) (Just "www.haskell.org") (Just "http")
+--   let addr = head addrs
+--   sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+--   connect sock (addrAddress addr)
+-- @
+
+getAddrInfo :: Maybe AddrInfo -- ^ preferred socket type or protocol
+            -> Maybe HostName -- ^ host name to look up
+            -> Maybe ServiceName -- ^ service name to look up
+            -> IO [AddrInfo] -- ^ resolved addresses, with "best" first
+
+getAddrInfo hints node service =
+  maybeWith withCString node $ \c_node ->
+    maybeWith withCString service $ \c_service ->
+      maybeWith with filteredHints $ \c_hints ->
+        alloca $ \ptr_ptr_addrs -> do
+          ret <- c_getaddrinfo c_node c_service c_hints ptr_ptr_addrs
+          case ret of
+            0 -> do ptr_addrs <- peek ptr_ptr_addrs
+                    ais <- followAddrInfo ptr_addrs
+                    c_freeaddrinfo ptr_addrs
+                    return ais
+            _ -> do err <- gai_strerror ret
+                    ioError (ioeSetErrorString
+                             (mkIOError NoSuchThing "getAddrInfo" Nothing
+                              Nothing) err)
+    -- Leaving out the service and using AI_NUMERICSERV causes a
+    -- segfault on OS X 10.8.2. This code removes AI_NUMERICSERV
+    -- (which has no effect) in that case.
+  where
+#if defined(darwin_HOST_OS)
+    filteredHints = case service of
+        Nothing -> fmap (\ h -> h { addrFlags = delete AI_NUMERICSERV (addrFlags h) }) hints
+        _       -> hints
+#else
+    filteredHints = hints
+#endif
+
+followAddrInfo :: Ptr AddrInfo -> IO [AddrInfo]
+
+followAddrInfo ptr_ai | ptr_ai == nullPtr = return []
+                      | otherwise = do
+    a <- peek ptr_ai
+    as <- (#peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo
+    return (a:as)
+
+foreign import ccall safe "hsnet_getaddrinfo"
+    c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo)
+                  -> IO CInt
+
+foreign import ccall safe "hsnet_freeaddrinfo"
+    c_freeaddrinfo :: Ptr AddrInfo -> IO ()
+
+gai_strerror :: CInt -> IO String
+
+#ifdef HAVE_GAI_STRERROR
+gai_strerror n = c_gai_strerror n >>= peekCString
+
+foreign import ccall safe "gai_strerror"
+    c_gai_strerror :: CInt -> IO CString
+#else
+gai_strerror n = return ("error " ++ show n)
+#endif
+
+withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a
+withCStringIf False _ f = f 0 nullPtr
+withCStringIf True n f = allocaBytes n (f (fromIntegral n))
+
+-- | Resolve an address to a host or service name.
+-- This function is protocol independent.
+--
+-- The list of 'NameInfoFlag' values controls query behaviour.  The
+-- supported flags are as follows:
+--
+--   [@NI_NOFQDN@] If a host is local, return only the
+--     hostname part of the FQDN.
+--
+--   [@NI_NUMERICHOST@] The name of the host is not
+--     looked up.  Instead, a numeric representation of the host's
+--     address is returned.  For an IPv4 address, this will be a
+--     dotted-quad string.  For IPv6, it will be colon-separated
+--     hexadecimal.
+--
+--   [@NI_NUMERICSERV@] The name of the service is not
+--     looked up.  Instead, a numeric representation of the
+--     service is returned.
+--
+--   [@NI_NAMEREQD@] If the hostname cannot be looked up, an IO error
+--     is thrown.
+--
+--   [@NI_DGRAM@] Resolve a datagram-based service name.  This is
+--     required only for the few protocols that have different port
+--     numbers for their datagram-based versions than for their
+--     stream-based versions.
+--
+-- Hostname and service name lookups can be expensive.  You can
+-- specify which lookups to perform via the two 'Bool' arguments.  If
+-- one of these is 'False', the corresponding value in the returned
+-- tuple will be 'Nothing', and no lookup will be performed.
+--
+-- If a host or service's name cannot be looked up, then the numeric
+-- form of the address or service will be returned.
+--
+-- If the query fails, this function throws an IO exception.
+--
+-- Example:
+-- @
+--   (hostName, _) <- getNameInfo [] True False myAddress
+-- @
+
+getNameInfo :: [NameInfoFlag] -- ^ flags to control lookup behaviour
+            -> Bool -- ^ whether to look up a hostname
+            -> Bool -- ^ whether to look up a service name
+            -> SockAddr -- ^ the address to look up
+            -> IO (Maybe HostName, Maybe ServiceName)
+
+getNameInfo flags doHost doService addr =
+  withCStringIf doHost (#const NI_MAXHOST) $ \c_hostlen c_host ->
+    withCStringIf doService (#const NI_MAXSERV) $ \c_servlen c_serv -> do
+      withSockAddr addr $ \ptr_addr sz -> do
+        ret <- c_getnameinfo ptr_addr (fromIntegral sz) c_host c_hostlen
+                             c_serv c_servlen (packBits niFlagMapping flags)
+        case ret of
+          0 -> do
+            let peekIf doIf c_val = if doIf
+                                     then liftM Just $ peekCString c_val
+                                     else return Nothing
+            host <- peekIf doHost c_host
+            serv <- peekIf doService c_serv
+            return (host, serv)
+          _ -> do err <- gai_strerror ret
+                  ioError (ioeSetErrorString
+                           (mkIOError NoSuchThing "getNameInfo" Nothing
+                            Nothing) err)
+
+foreign import ccall safe "hsnet_getnameinfo"
+    c_getnameinfo :: Ptr SockAddr -> CInt{-CSockLen???-} -> CString -> CSize -> CString
+                  -> CSize -> CInt -> IO CInt
+#endif
+
+mkInvalidRecvArgError :: String -> IOError
+mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError
+                                    InvalidArgument
+                                    loc Nothing Nothing) "non-positive length"
+
+mkEOFError :: String -> IOError
+mkEOFError loc = ioeSetErrorString (mkIOError EOF loc Nothing Nothing) "end of file"
+
+-- ---------------------------------------------------------------------------
+-- foreign imports from the C library
+
+foreign import ccall unsafe "my_inet_ntoa"
+  c_inet_ntoa :: HostAddress -> IO (Ptr CChar)
+
+foreign import CALLCONV unsafe "inet_addr"
+  c_inet_addr :: Ptr CChar -> IO HostAddress
+
+foreign import CALLCONV unsafe "shutdown"
+  c_shutdown :: CInt -> CInt -> IO CInt
+
+closeFd :: CInt -> IO ()
+closeFd fd = throwSocketErrorIfMinus1_ "Network.Socket.close" $ c_close fd
+
+#if !defined(WITH_WINSOCK)
+foreign import ccall unsafe "close"
+  c_close :: CInt -> IO CInt
+#else
+foreign import stdcall unsafe "closesocket"
+  c_close :: CInt -> IO CInt
+#endif
+
+foreign import CALLCONV unsafe "socket"
+  c_socket :: CInt -> CInt -> CInt -> IO CInt
+foreign import CALLCONV unsafe "bind"
+  c_bind :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt
+foreign import CALLCONV SAFE_ON_WIN "connect"
+  c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt
+foreign import CALLCONV unsafe "accept"
+  c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt
+#if 0
+foreign import CALLCONV unsafe "accept4"
+  c_accept4 :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt
+#endif
+foreign import CALLCONV unsafe "listen"
+  c_listen :: CInt -> CInt -> IO CInt
+
+#if defined(mingw32_HOST_OS)
+foreign import CALLCONV safe "accept"
+  c_accept_safe :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt
+
+foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool
+#endif
+
+foreign import CALLCONV unsafe "send"
+  c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt
+foreign import CALLCONV SAFE_ON_WIN "sendto"
+  c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt
+foreign import CALLCONV unsafe "recv"
+  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt
+foreign import CALLCONV SAFE_ON_WIN "recvfrom"
+  c_recvfrom :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt
+foreign import CALLCONV unsafe "getpeername"
+  c_getpeername :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt
+foreign import CALLCONV unsafe "getsockname"
+  c_getsockname :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt
+
+foreign import CALLCONV unsafe "getsockopt"
+  c_getsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> Ptr CInt -> IO CInt
+foreign import CALLCONV unsafe "setsockopt"
+  c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt
+
+-- ---------------------------------------------------------------------------
+-- * Deprecated aliases
+
+-- $deprecated-aliases
+--
+-- These aliases are deprecated and should not be used in new code.
+-- They will be removed in some future version of the package.
+
+-- | Deprecated alias for 'bind'.
+bindSocket :: Socket    -- Unconnected Socket
+           -> SockAddr  -- Address to Bind to
+           -> IO ()
+bindSocket = bind
+
+-- | Deprecated alias for 'close'.
+sClose :: Socket -> IO ()
+sClose = close
+
+-- | Deprecated alias for 'isConnected'.
+sIsConnected :: Socket -> IO Bool
+sIsConnected = isConnected
+
+-- | Deprecated alias for 'isBound'.
+sIsBound :: Socket -> IO Bool
+sIsBound = isBound
+
+-- | Deprecated alias for 'isListening'.
+sIsListening :: Socket -> IO Bool
+sIsListening = isListening
+
+-- | Deprecated alias for 'isReadable'.
+sIsReadable  :: Socket -> IO Bool
+sIsReadable = isReadable
+
+-- | Deprecated alias for 'isWritable'.
+sIsWritable  :: Socket -> IO Bool
+sIsWritable = isWritable
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc
@@ -0,0 +1,374 @@
+{-# LANGUAGE CPP, ForeignFunctionInterface #-}
+
+#include "HsNet.h"
+
+-- |
+-- Module      : Network.Socket.ByteString
+-- Copyright   : (c) Johan Tibell 2007-2010
+-- License     : BSD-style
+--
+-- Maintainer  : johan.tibell@gmail.com
+-- Stability   : stable
+-- Portability : portable
+--
+-- This module provides access to the BSD /socket/ interface.  This
+-- module is generally more efficient than the 'String' based network
+-- functions in 'Network.Socket'.  For detailed documentation, consult
+-- your favorite POSIX socket reference. All functions communicate
+-- failures by converting the error number to 'System.IO.IOError'.
+--
+-- This module is made to be imported with 'Network.Socket' like so:
+--
+-- > import Network.Socket hiding (send, sendTo, recv, recvFrom)
+-- > import Network.Socket.ByteString
+--
+module Network.Socket.ByteString
+    ( 
+    -- * Send data to a socket
+      send
+    , sendAll
+    , sendTo
+    , sendAllTo
+
+    -- ** Vectored I/O
+    -- $vectored
+    , sendMany
+    , sendManyTo
+
+    -- * Receive data from a socket
+    , recv
+    , recvFrom
+
+    -- * Example
+    -- $example
+    ) where
+
+import Control.Monad (liftM, when)
+import Data.ByteString (ByteString)
+import Data.ByteString.Internal (createAndTrim)
+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
+import Data.Word (Word8)
+#if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types (CInt(..))
+#else
+import Foreign.C.Types (CInt)
+#endif
+import Foreign.Marshal.Alloc (allocaBytes)
+import Foreign.Ptr (Ptr, castPtr)
+import Network.Socket (SockAddr, Socket(..), sendBufTo, recvBufFrom)
+
+import qualified Data.ByteString as B
+
+import Network.Socket.ByteString.Internal
+import Network.Socket.Internal
+import Network.Socket.Types
+
+#if !defined(mingw32_HOST_OS)
+import Control.Monad (zipWithM_)
+import Foreign.C.Types (CChar)
+# if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types (CSize(..))
+# else
+import Foreign.C.Types (CSize)
+# endif
+import Foreign.Marshal.Array (allocaArray)
+import Foreign.Marshal.Utils (with)
+import Foreign.Ptr (plusPtr)
+import Foreign.Storable (Storable(..))
+
+import Network.Socket.ByteString.IOVec (IOVec(..))
+import Network.Socket.ByteString.MsgHdr (MsgHdr(..))
+
+import GHC.Conc (threadWaitRead, threadWaitWrite)
+#else
+#  if __GLASGOW_HASKELL__ >= 611
+import GHC.IO.FD
+#  else
+import GHC.Handle (readRawBufferPtr, writeRawBufferPtr)
+#  endif
+#endif
+
+#if !defined(mingw32_HOST_OS)
+foreign import CALLCONV unsafe "send"
+  c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt
+foreign import CALLCONV unsafe "recv"
+  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt
+#endif
+
+-- ----------------------------------------------------------------------------
+-- Sending
+
+-- | Send data to the socket.  The socket must be connected to a
+-- remote socket.  Returns the number of bytes sent. Applications are
+-- responsible for ensuring that all data has been sent.
+send :: Socket      -- ^ Connected socket
+     -> ByteString  -- ^ Data to send
+     -> IO Int      -- ^ Number of bytes sent
+send sock@(MkSocket s _ _ _ _) xs =
+    unsafeUseAsCStringLen xs $ \(str, len) ->
+    liftM fromIntegral $
+#if defined(mingw32_HOST_OS)
+#  if __GLASGOW_HASKELL__ >= 611
+        writeRawBufferPtr "Network.Socket.ByteString.send"
+        (FD s 1) (castPtr str) 0 (fromIntegral len)
+#  else
+        writeRawBufferPtr "Network.Socket.ByteString.send"
+        (fromIntegral s) True str 0 (fromIntegral len)
+#  endif
+#else
+        throwSocketErrorWaitWrite sock "send" $
+        c_send s str (fromIntegral len) 0
+#endif
+
+-- | Send data to the socket.  The socket must be connected to a
+-- remote socket.  Unlike 'send', this function continues to send data
+-- until either all data has been sent or an error occurs.  On error,
+-- an exception is raised, and there is no way to determine how much
+-- data, if any, was successfully sent.
+sendAll :: Socket      -- ^ Connected socket
+        -> ByteString  -- ^ Data to send
+        -> IO ()
+sendAll sock bs = do
+    sent <- send sock bs
+    when (sent < B.length bs) $ sendAll sock (B.drop sent bs)
+
+-- | Send data to the socket.  The recipient can be specified
+-- explicitly, so the socket need not be in a connected state.
+-- Returns the number of bytes sent. Applications are responsible for
+-- ensuring that all data has been sent.
+sendTo :: Socket      -- ^ Socket
+       -> ByteString  -- ^ Data to send
+       -> SockAddr    -- ^ Recipient address
+       -> IO Int      -- ^ Number of bytes sent
+sendTo sock xs addr =
+    unsafeUseAsCStringLen xs $ \(str, len) -> sendBufTo sock str len addr
+
+-- | Send data to the socket. The recipient can be specified
+-- explicitly, so the socket need not be in a connected state.  Unlike
+-- 'sendTo', this function continues to send data until either all
+-- data has been sent or an error occurs.  On error, an exception is
+-- raised, and there is no way to determine how much data, if any, was
+-- successfully sent.
+sendAllTo :: Socket      -- ^ Socket
+          -> ByteString  -- ^ Data to send
+          -> SockAddr    -- ^ Recipient address
+          -> IO ()
+sendAllTo sock xs addr = do
+    sent <- sendTo sock xs addr
+    when (sent < B.length xs) $ sendAllTo sock (B.drop sent xs) addr
+
+-- ----------------------------------------------------------------------------
+-- ** Vectored I/O
+
+-- $vectored
+--
+-- Vectored I\/O, also known as scatter\/gather I\/O, allows multiple
+-- data segments to be sent using a single system call, without first
+-- concatenating the segments.  For example, given a list of
+-- @ByteString@s, @xs@,
+--
+-- > sendMany sock xs
+--
+-- is equivalent to
+--
+-- > sendAll sock (concat xs)
+--
+-- but potentially more efficient.
+--
+-- Vectored I\/O are often useful when implementing network protocols
+-- that, for example, group data into segments consisting of one or
+-- more fixed-length headers followed by a variable-length body.
+
+-- | Send data to the socket.  The socket must be in a connected
+-- state.  The data is sent as if the parts have been concatenated.
+-- This function continues to send data until either all data has been
+-- sent or an error occurs.  On error, an exception is raised, and
+-- there is no way to determine how much data, if any, was
+-- successfully sent.
+sendMany :: Socket        -- ^ Connected socket
+         -> [ByteString]  -- ^ Data to send
+         -> IO ()
+#if !defined(mingw32_HOST_OS)
+sendMany sock@(MkSocket fd _ _ _ _) cs = do
+    sent <- sendManyInner
+    when (sent < totalLength cs) $ sendMany sock (remainingChunks sent cs)
+  where
+    sendManyInner =
+      liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) ->
+          throwSocketErrorWaitWrite sock "writev" $
+              c_writev (fromIntegral fd) iovsPtr
+              (fromIntegral (min iovsLen (0x0026)))
+#else
+sendMany sock = sendAll sock . B.concat
+#endif
+
+-- | Send data to the socket.  The recipient can be specified
+-- explicitly, so the socket need not be in a connected state.  The
+-- data is sent as if the parts have been concatenated.  This function
+-- continues to send data until either all data has been sent or an
+-- error occurs.  On error, an exception is raised, and there is no
+-- way to determine how much data, if any, was successfully sent.
+sendManyTo :: Socket        -- ^ Socket
+           -> [ByteString]  -- ^ Data to send
+           -> SockAddr      -- ^ Recipient address
+           -> IO ()
+#if !defined(mingw32_HOST_OS)
+sendManyTo sock@(MkSocket fd _ _ _ _) cs addr = do
+    sent <- liftM fromIntegral sendManyToInner
+    when (sent < totalLength cs) $ sendManyTo sock (remainingChunks sent cs) addr
+  where
+    sendManyToInner =
+      withSockAddr addr $ \addrPtr addrSize ->
+        withIOVec cs $ \(iovsPtr, iovsLen) -> do
+          let msgHdr = MsgHdr
+                addrPtr (fromIntegral addrSize)
+                iovsPtr (fromIntegral iovsLen)
+          with msgHdr $ \msgHdrPtr ->
+            throwSocketErrorWaitWrite sock "sendmsg" $
+              c_sendmsg (fromIntegral fd) msgHdrPtr 0
+#else
+sendManyTo sock cs = sendAllTo sock (B.concat cs)
+#endif
+
+-- ----------------------------------------------------------------------------
+-- Receiving
+
+-- | Receive data from the socket.  The socket must be in a connected
+-- state.  This function may return fewer bytes than specified.  If
+-- the message is longer than the specified length, it may be
+-- discarded depending on the type of socket.  This function may block
+-- until a message arrives.
+--
+-- Considering hardware and network realities, the maximum number of bytes to
+-- receive should be a small power of 2, e.g., 4096.
+--
+-- For TCP sockets, a zero length return value means the peer has
+-- closed its half side of the connection.
+recv :: Socket         -- ^ Connected socket
+     -> Int            -- ^ Maximum number of bytes to receive
+     -> IO ByteString  -- ^ Data received
+recv sock nbytes
+    | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")
+    | otherwise  = createAndTrim nbytes $ recvInner sock nbytes
+
+recvInner :: Socket -> Int -> Ptr Word8 -> IO Int
+recvInner sock nbytes ptr =
+    fmap fromIntegral $
+#if defined(mingw32_HOST_OS)
+#  if __GLASGOW_HASKELL__ >= 611
+        readRawBufferPtr "Network.Socket.ByteString.recv" (FD s 1) ptr 0 (fromIntegral nbytes)
+#  else
+        readRawBufferPtr "Network.Socket.ByteString.recv" (fromIntegral s)
+        True (castPtr ptr) 0 (fromIntegral nbytes)
+#  endif
+#else
+        throwSocketErrorWaitRead sock "recv" $
+        c_recv s (castPtr ptr) (fromIntegral nbytes) 0
+#endif
+  where
+    s = sockFd sock
+
+-- | Receive data from the socket.  The socket need not be in a
+-- connected state.  Returns @(bytes, address)@ where @bytes@ is a
+-- 'ByteString' representing the data received and @address@ is a
+-- 'SockAddr' representing the address of the sending socket.
+recvFrom :: Socket                     -- ^ Socket
+         -> Int                        -- ^ Maximum number of bytes to receive
+         -> IO (ByteString, SockAddr)  -- ^ Data received and sender address
+recvFrom sock nbytes =
+    allocaBytes nbytes $ \ptr -> do
+        (len, sockaddr) <- recvBufFrom sock ptr nbytes
+        str <- B.packCStringLen (ptr, len)
+        return (str, sockaddr)
+
+-- ----------------------------------------------------------------------------
+-- Not exported
+
+#if !defined(mingw32_HOST_OS)
+-- | Suppose we try to transmit a list of chunks @cs@ via a gathering write
+-- operation and find that @n@ bytes were sent. Then @remainingChunks n cs@ is
+-- list of chunks remaining to be sent.
+remainingChunks :: Int -> [ByteString] -> [ByteString]
+remainingChunks _ [] = []
+remainingChunks i (x:xs)
+    | i < len        = B.drop i x : xs
+    | otherwise      = let i' = i - len in i' `seq` remainingChunks i' xs
+  where
+    len = B.length x
+
+-- | @totalLength cs@ is the sum of the lengths of the chunks in the list @cs@.
+totalLength :: [ByteString] -> Int
+totalLength = sum . map B.length
+
+-- | @withIOVec cs f@ executes the computation @f@, passing as argument a pair
+-- consisting of a pointer to a temporarily allocated array of pointers to
+-- 'IOVec' made from @cs@ and the number of pointers (@length cs@).
+-- /Unix only/.
+withIOVec :: [ByteString] -> ((Ptr IOVec, Int) -> IO a) -> IO a
+withIOVec cs f =
+    allocaArray csLen $ \aPtr -> do
+        zipWithM_ pokeIov (ptrs aPtr) cs
+        f (aPtr, csLen)
+  where
+    csLen = length cs
+    ptrs = iterate (`plusPtr` sizeOf (undefined :: IOVec))
+    pokeIov ptr s =
+        unsafeUseAsCStringLen s $ \(sPtr, sLen) ->
+        poke ptr $ IOVec sPtr (fromIntegral sLen)
+#endif
+
+-- ---------------------------------------------------------------------
+-- Example
+
+-- $example
+--
+-- Here are two minimal example programs using the TCP/IP protocol: a
+-- server that echoes all data that it receives back (servicing only
+-- one client) and a client using it.
+--
+-- > -- Echo server program
+-- > module Main where
+-- >
+-- > import Control.Monad (unless)
+-- > import Network.Socket hiding (recv)
+-- > import qualified Data.ByteString as S
+-- > import Network.Socket.ByteString (recv, sendAll)
+-- >
+-- > main :: IO ()
+-- > main = withSocketsDo $
+-- >     do addrinfos <- getAddrInfo
+-- >                     (Just (defaultHints {addrFlags = [AI_PASSIVE]}))
+-- >                     Nothing (Just "3000")
+-- >        let serveraddr = head addrinfos
+-- >        sock <- socket (addrFamily serveraddr) Stream defaultProtocol
+-- >        bindSocket sock (addrAddress serveraddr)
+-- >        listen sock 1
+-- >        (conn, _) <- accept sock
+-- >        talk conn
+-- >        sClose conn
+-- >        sClose sock
+-- >
+-- >     where
+-- >       talk :: Socket -> IO ()
+-- >       talk conn =
+-- >           do msg <- recv conn 1024
+-- >              unless (S.null msg) $ sendAll conn msg >> talk conn
+--
+-- > -- Echo client program
+-- > module Main where
+-- >
+-- > import Network.Socket hiding (recv)
+-- > import Network.Socket.ByteString (recv, sendAll)
+-- > import qualified Data.ByteString.Char8 as C
+-- >
+-- > main :: IO ()
+-- > main = withSocketsDo $
+-- >     do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")
+-- >        let serveraddr = head addrinfos
+-- >        sock <- socket (addrFamily serveraddr) Stream defaultProtocol
+-- >        connect sock (addrAddress serveraddr)
+-- >        sendAll sock $ C.pack "Hello, world!"
+-- >        msg <- recv sock 1024
+-- >        sClose sock
+-- >        putStr "Received "
+-- >        C.putStrLn msg
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc
@@ -0,0 +1,30 @@
+{-# OPTIONS_GHC -funbox-strict-fields #-}
+
+-- | Support module for the POSIX writev system call.
+module Network.Socket.ByteString.IOVec
+    ( IOVec(..)
+    ) where
+
+import Foreign.C.Types (CChar, CInt, CSize)
+import Foreign.Ptr (Ptr)
+import Foreign.Storable (Storable(..))
+
+#include <sys/uio.h>
+
+data IOVec = IOVec
+    { iovBase :: !(Ptr CChar)
+    , iovLen  :: !CSize
+    }
+
+instance Storable IOVec where
+  sizeOf _    = (#const sizeof(struct iovec))
+  alignment _ = alignment (undefined :: CInt)
+
+  peek p = do
+    base <- (#peek struct iovec, iov_base) p
+    len  <- (#peek struct iovec, iov_len)  p
+    return $ IOVec base len
+
+  poke p iov = do
+    (#poke struct iovec, iov_base) p (iovBase iov)
+    (#poke struct iovec, iov_len)  p (iovLen  iov)
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE CPP, ForeignFunctionInterface #-}
+
+-- |
+-- Module      : Network.Socket.ByteString.Internal
+-- Copyright   : (c) Johan Tibell 2007-2010
+-- License     : BSD-style
+--
+-- Maintainer  : johan.tibell@gmail.com
+-- Stability   : stable
+-- Portability : portable
+--
+module Network.Socket.ByteString.Internal
+    (
+      mkInvalidRecvArgError
+#if !defined(mingw32_HOST_OS)
+    , c_writev
+    , c_sendmsg
+#endif
+    ) where
+
+import System.IO.Error (ioeSetErrorString, mkIOError)
+
+#if !defined(mingw32_HOST_OS)
+# if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types (CInt(..))
+import System.Posix.Types (CSsize(..))
+# else
+import Foreign.C.Types (CInt)
+import System.Posix.Types (CSsize)
+# endif
+import Foreign.Ptr (Ptr)
+
+import Network.Socket.ByteString.IOVec (IOVec)
+import Network.Socket.ByteString.MsgHdr (MsgHdr)
+#endif
+
+#if __GLASGOW_HASKELL__ < 611
+import GHC.IOBase (IOErrorType(..))
+#else
+import GHC.IO.Exception (IOErrorType(..))
+#endif
+
+mkInvalidRecvArgError :: String -> IOError
+mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError
+                                    InvalidArgument
+                                    loc Nothing Nothing) "non-positive length"
+
+#if !defined(mingw32_HOST_OS)
+foreign import ccall unsafe "writev"
+  c_writev :: CInt -> Ptr IOVec -> CInt -> IO CSsize
+
+foreign import ccall unsafe "sendmsg"
+  c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CSsize
+#endif
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc
@@ -0,0 +1,149 @@
+{-# LANGUAGE BangPatterns, CPP, ForeignFunctionInterface #-}
+
+-- |
+-- Module      : Network.Socket.ByteString.Lazy
+-- Copyright   : (c) Bryan O'Sullivan 2009
+-- License     : BSD-style
+--
+-- Maintainer  : bos@serpentine.com
+-- Stability   : experimental
+-- Portability : POSIX, GHC
+--
+-- This module provides access to the BSD /socket/ interface.  This
+-- module is generally more efficient than the 'String' based network
+-- functions in 'Network.Socket'.  For detailed documentation, consult
+-- your favorite POSIX socket reference. All functions communicate
+-- failures by converting the error number to 'System.IO.IOError'.
+--
+-- This module is made to be imported with 'Network.Socket' like so:
+--
+-- > import Network.Socket hiding (send, sendTo, recv, recvFrom)
+-- > import Network.Socket.ByteString.Lazy
+-- > import Prelude hiding (getContents)
+--
+module Network.Socket.ByteString.Lazy
+    (
+#if !defined(mingw32_HOST_OS)
+    -- * Send data to a socket
+      send
+    , sendAll
+    ,
+#endif
+
+    -- * Receive data from a socket
+      getContents
+    , recv
+    ) where
+
+import Control.Monad (liftM)
+import Data.ByteString.Lazy.Internal (ByteString(..), defaultChunkSize)
+import Data.Int (Int64)
+import Network.Socket (Socket(..), ShutdownCmd(..), shutdown)
+import Prelude hiding (getContents)
+import System.IO.Unsafe (unsafeInterleaveIO)
+
+import qualified Data.ByteString as S
+import qualified Network.Socket.ByteString as N
+
+#if !defined(mingw32_HOST_OS)
+import Control.Monad (unless)
+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
+import Foreign.Marshal.Array (allocaArray)
+import Foreign.Ptr (plusPtr)
+import Foreign.Storable (Storable(..))
+import Network.Socket.ByteString.IOVec (IOVec(IOVec))
+import Network.Socket.ByteString.Internal (c_writev)
+import Network.Socket.Internal
+
+import qualified Data.ByteString.Lazy as L
+
+import GHC.Conc (threadWaitWrite)
+#endif
+
+#if !defined(mingw32_HOST_OS)
+-- -----------------------------------------------------------------------------
+-- Sending
+
+-- | Send data to the socket. The socket must be in a connected state.
+-- Returns the number of bytes sent. Applications are responsible for
+-- ensuring that all data has been sent.
+--
+-- Because a lazily generated 'ByteString' may be arbitrarily long,
+-- this function caps the amount it will attempt to send at 4MB.  This
+-- number is large (so it should not penalize performance on fast
+-- networks), but not outrageously so (to avoid demanding lazily
+-- computed data unnecessarily early).  Before being sent, the lazy
+-- 'ByteString' will be converted to a list of strict 'ByteString's
+-- with 'L.toChunks'; at most 1024 chunks will be sent.  /Unix only/.
+send :: Socket      -- ^ Connected socket
+     -> ByteString  -- ^ Data to send
+     -> IO Int64    -- ^ Number of bytes sent
+send sock@(MkSocket fd _ _ _ _) s = do
+  let cs  = take maxNumChunks (L.toChunks s)
+      len = length cs
+  liftM fromIntegral . allocaArray len $ \ptr ->
+    withPokes cs ptr $ \niovs ->
+      throwSocketErrorWaitWrite sock "writev" $
+        c_writev (fromIntegral fd) ptr niovs
+  where
+    withPokes ss p f = loop ss p 0 0
+      where loop (c:cs) q k !niovs
+                | k < maxNumBytes =
+                    unsafeUseAsCStringLen c $ \(ptr,len) -> do
+                      poke q $ IOVec ptr (fromIntegral len)
+                      loop cs (q `plusPtr` sizeOf (undefined :: IOVec))
+                              (k + fromIntegral len) (niovs + 1)
+                | otherwise = f niovs
+            loop _ _ _ niovs = f niovs
+    maxNumBytes  = 4194304 :: Int  -- maximum number of bytes to transmit in one system call
+    maxNumChunks = 1024    :: Int  -- maximum number of chunks to transmit in one system call
+
+-- | Send data to the socket.  The socket must be in a connected
+-- state. This function continues to send data until either all data
+-- has been sent or an error occurs.  If there is an error, an
+-- exception is raised, and there is no way to determine how much data
+-- was sent.  /Unix only/.
+sendAll :: Socket      -- ^ Connected socket
+        -> ByteString  -- ^ Data to send
+        -> IO ()
+sendAll sock bs = do
+  sent <- send sock bs
+  let bs' = L.drop sent bs
+  unless (L.null bs') $ sendAll sock bs'
+#endif
+
+-- -----------------------------------------------------------------------------
+-- Receiving
+
+-- | Receive data from the socket.  The socket must be in a connected
+-- state.  Data is received on demand, in chunks; each chunk will be
+-- sized to reflect the amount of data received by individual 'recv'
+-- calls.
+--
+-- All remaining data from the socket is consumed.  When there is no
+-- more data to be received, the receiving side of the socket is shut
+-- down.  If there is an error and an exception is thrown, the socket
+-- is not shut down.
+getContents :: Socket         -- ^ Connected socket
+            -> IO ByteString  -- ^ Data received
+getContents sock = loop where
+  loop = unsafeInterleaveIO $ do
+    s <- N.recv sock defaultChunkSize
+    if S.null s
+      then shutdown sock ShutdownReceive >> return Empty
+      else Chunk s `liftM` loop
+
+-- | Receive data from the socket.  The socket must be in a connected
+-- state.  This function may return fewer bytes than specified.  If
+-- the received data is longer than the specified length, it may be
+-- discarded depending on the type of socket.  This function may block
+-- until a message arrives.
+--
+-- If there is no more data to be received, returns an empty 'ByteString'.
+recv :: Socket         -- ^ Connected socket
+     -> Int64          -- ^ Maximum number of bytes to receive
+     -> IO ByteString  -- ^ Data received
+recv sock nbytes = chunk `liftM` N.recv sock (fromIntegral nbytes) where
+  chunk k
+    | S.null k  = Empty
+    | otherwise = Chunk k Empty
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc
@@ -0,0 +1,48 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -funbox-strict-fields #-}
+
+-- | Support module for the POSIX 'sendmsg' system call.
+module Network.Socket.ByteString.MsgHdr
+    ( MsgHdr(..)
+    ) where
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+import Foreign.C.Types (CInt, CSize, CUInt)
+import Foreign.Ptr (Ptr)
+import Foreign.Storable (Storable(..))
+import Network.Socket (SockAddr)
+import Network.Socket.Internal (zeroMemory)
+
+import Network.Socket.ByteString.IOVec (IOVec)
+
+-- We don't use msg_control, msg_controllen, and msg_flags as these
+-- don't exist on OpenSolaris.
+data MsgHdr = MsgHdr
+    { msgName    :: !(Ptr SockAddr)
+    , msgNameLen :: !CUInt
+    , msgIov     :: !(Ptr IOVec)
+    , msgIovLen  :: !CSize
+    }
+
+instance Storable MsgHdr where
+  sizeOf _    = (#const sizeof(struct msghdr))
+  alignment _ = alignment (undefined :: CInt)
+
+  peek p = do
+    name       <- (#peek struct msghdr, msg_name)       p
+    nameLen    <- (#peek struct msghdr, msg_namelen)    p
+    iov        <- (#peek struct msghdr, msg_iov)        p
+    iovLen     <- (#peek struct msghdr, msg_iovlen)     p
+    return $ MsgHdr name nameLen iov iovLen
+
+  poke p mh = do
+    -- We need to zero the msg_control, msg_controllen, and msg_flags
+    -- fields, but they only exist on some platforms (e.g. not on
+    -- Solaris).  Instead of using CPP, we zero the entire struct.
+    zeroMemory p (#const sizeof(struct msghdr))
+    (#poke struct msghdr, msg_name)       p (msgName       mh)
+    (#poke struct msghdr, msg_namelen)    p (msgNameLen    mh)
+    (#poke struct msghdr, msg_iov)        p (msgIov        mh)
+    (#poke struct msghdr, msg_iovlen)     p (msgIovLen     mh)
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc
@@ -0,0 +1,257 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Network.Socket.Internal
+-- Copyright   :  (c) The University of Glasgow 2001
+-- License     :  BSD-style (see the file libraries/network/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A module containing semi-public 'Network.Socket' internals.
+-- Modules which extend the 'Network.Socket' module will need to use
+-- this module while ideally most users will be able to make do with
+-- the public interface.
+--
+-----------------------------------------------------------------------------
+
+#include "HsNet.h"
+
+module Network.Socket.Internal
+    (
+    -- * Socket addresses
+      HostAddress
+#if defined(IPV6_SOCKET_SUPPORTNO)
+    , HostAddress6
+    , FlowInfo
+    , ScopeID
+#endif
+    , PortNumber(..)
+    , SockAddr(..)
+
+    , peekSockAddr
+    , pokeSockAddr
+    , sizeOfSockAddr
+    , sizeOfSockAddrByFamily
+    , withSockAddr
+    , withNewSockAddr
+
+    -- * Protocol families
+    , Family(..)
+
+    -- * Socket error functions
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+    , c_getLastError
+#endif
+    , throwSocketError
+    , throwSocketErrorCode
+
+    -- * Guards for socket operations that may fail
+    , throwSocketErrorIfMinus1_
+    , throwSocketErrorIfMinus1Retry
+    , throwSocketErrorIfMinus1RetryMayBlock
+
+    -- ** Guards that wait and retry if the operation would block
+    -- | These guards are based on 'throwSocketErrorIfMinus1RetryMayBlock'.
+    -- They wait for socket readiness if the action fails with @EWOULDBLOCK@
+    -- or similar.
+    , throwSocketErrorWaitRead
+    , throwSocketErrorWaitWrite
+
+    -- * Initialization
+    , withSocketsDo
+
+    -- * Low-level helpers
+    , zeroMemory
+    ) where
+
+import Data.Bits ( (.|.), shiftL, shiftR )
+import Data.Word ( Word8, Word16, Word32 )
+import Data.Typeable (Typeable)
+import Foreign.C.Error (throwErrno, throwErrnoIfMinus1Retry,
+                        throwErrnoIfMinus1RetryMayBlock, throwErrnoIfMinus1_,
+                        Errno(..), errnoToIOError)
+import Foreign.C.String ( castCharToCChar, peekCString )
+#if __GLASGOW_HASKELL__ >= 703
+import Foreign.C.Types ( CInt(..), CSize(..) )
+#else
+import Foreign.C.Types ( CInt, CSize )
+#endif
+import Foreign.Marshal.Alloc ( allocaBytes )
+import Foreign.Marshal.Array ( pokeArray, pokeArray0 )
+import Foreign.Ptr ( Ptr, castPtr, plusPtr )
+import Foreign.Storable ( Storable(..) )
+import GHC.Conc (threadWaitRead, threadWaitWrite)
+
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+import Control.Exception ( finally )
+#  if __GLASGOW_HASKELL__ >= 707
+import GHC.IO.Exception ( IOErrorType(..) )
+#  else
+import GHC.IOBase ( IOErrorType(..) )
+#  endif
+import Foreign.C.Types ( CChar )
+import System.IO.Error ( ioeSetErrorString, mkIOError )
+#endif
+
+import Network.Socket.Types
+
+-- ---------------------------------------------------------------------
+-- Guards for socket operations that may fail
+
+-- | Throw an 'IOError' corresponding to the current socket error.
+throwSocketError :: String  -- ^ textual description of the error location
+                 -> IO a
+
+-- | Like 'throwSocketError', but the error code is supplied as an argument.
+--
+-- On Windows, do not use errno.  Use a system error code instead.
+throwSocketErrorCode :: String -> CInt -> IO a
+
+-- | Throw an 'IOError' corresponding to the current socket error if
+-- the IO action returns a result of @-1@.  Discards the result of the
+-- IO action after error handling.
+throwSocketErrorIfMinus1_
+    :: (Eq a, Num a)
+    => String  -- ^ textual description of the location
+    -> IO a    -- ^ the 'IO' operation to be executed
+    -> IO ()
+
+{-# SPECIALIZE throwSocketErrorIfMinus1_ :: String -> IO CInt -> IO () #-}
+
+-- | Throw an 'IOError' corresponding to the current socket error if
+-- the IO action returns a result of @-1@, but retries in case of an
+-- interrupted operation.
+throwSocketErrorIfMinus1Retry
+    :: (Eq a, Num a)
+    => String  -- ^ textual description of the location
+    -> IO a    -- ^ the 'IO' operation to be executed
+    -> IO a
+
+{-# SPECIALIZE throwSocketErrorIfMinus1Retry :: String -> IO CInt -> IO CInt #-}
+
+-- | Throw an 'IOError' corresponding to the current socket error if
+-- the IO action returns a result of @-1@, but retries in case of an
+-- interrupted operation.  Checks for operations that would block and
+-- executes an alternative action before retrying in that case.
+throwSocketErrorIfMinus1RetryMayBlock
+    :: (Eq a, Num a)
+    => String  -- ^ textual description of the location
+    -> IO b    -- ^ action to execute before retrying if an
+               --   immediate retry would block
+    -> IO a    -- ^ the 'IO' operation to be executed
+    -> IO a
+
+{-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock
+        :: String -> IO b -> IO CInt -> IO CInt #-}
+
+#if (!defined(HAVE_WINSOCK2_H) || defined(cygwin32_HOST_OS))
+
+throwSocketErrorIfMinus1RetryMayBlock name on_block act =
+    throwErrnoIfMinus1RetryMayBlock name act on_block
+
+throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry
+
+throwSocketErrorIfMinus1_ = throwErrnoIfMinus1_
+
+throwSocketError = throwErrno
+
+throwSocketErrorCode loc errno =
+    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)
+
+#else
+
+throwSocketErrorIfMinus1RetryMayBlock name _ act
+  = throwSocketErrorIfMinus1Retry name act
+
+throwSocketErrorIfMinus1_ name act = do
+  throwSocketErrorIfMinus1Retry name act
+  return ()
+
+# if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+throwSocketErrorIfMinus1Retry name act = do
+  r <- act
+  if (r == -1)
+   then do
+    rc   <- c_getLastError
+    case rc of
+      #{const WSANOTINITIALISED} -> do
+        withSocketsDo (return ())
+        r <- act
+        if (r == -1)
+           then throwSocketError name
+           else return r
+      _ -> throwSocketError name
+   else return r
+
+throwSocketErrorCode name rc = do
+    pstr <- c_getWSError rc
+    str  <- peekCString pstr
+    ioError (ioeSetErrorString (mkIOError OtherError name Nothing Nothing) str)
+
+throwSocketError name =
+    c_getLastError >>= throwSocketErrorCode name
+
+foreign import CALLCONV unsafe "WSAGetLastError"
+  c_getLastError :: IO CInt
+
+foreign import ccall unsafe "getWSErrorDescr"
+  c_getWSError :: CInt -> IO (Ptr CChar)
+
+
+# else
+throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry
+throwSocketError = throwErrno
+throwSocketErrorCode loc errno =
+    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)
+# endif
+#endif
+
+-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with
+-- @EWOULDBLOCK@ or similar, wait for the socket to be read-ready,
+-- and try again.
+throwSocketErrorWaitRead :: (Eq a, Num a) => Socket -> String -> IO a -> IO a
+throwSocketErrorWaitRead sock name io =
+    throwSocketErrorIfMinus1RetryMayBlock name
+        (threadWaitRead $ fromIntegral $ sockFd sock)
+        io
+
+-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with
+-- @EWOULDBLOCK@ or similar, wait for the socket to be write-ready,
+-- and try again.
+throwSocketErrorWaitWrite :: (Eq a, Num a) => Socket -> String -> IO a -> IO a
+throwSocketErrorWaitWrite sock name io =
+    throwSocketErrorIfMinus1RetryMayBlock name
+        (threadWaitWrite $ fromIntegral $ sockFd sock)
+        io
+
+-- ---------------------------------------------------------------------------
+-- WinSock support
+
+{-| On Windows operating systems, the networking subsystem has to be
+initialised using 'withSocketsDo' before any networking operations can
+be used.  eg.
+
+> main = withSocketsDo $ do {...}
+
+Although this is only strictly necessary on Windows platforms, it is
+harmless on other platforms, so for portability it is good practice to
+use it all the time.
+-}
+withSocketsDo :: IO a -> IO a
+#if !defined(WITH_WINSOCK)
+withSocketsDo x = x
+#else
+withSocketsDo act = do
+    x <- initWinSock
+    if x /= 0
+       then ioError (userError "Failed to initialise WinSock")
+       else act `finally` shutdownWinSock
+
+foreign import ccall unsafe "initWinSock" initWinSock :: IO Int
+foreign import ccall unsafe "shutdownWinSock" shutdownWinSock :: IO ()
+
+#endif
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc b/standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc
@@ -0,0 +1,962 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Network.Socket.Types
+    (
+    -- * Socket
+      Socket(..)
+    , sockFd
+    , sockFamily
+    , sockType
+    , sockProtocol
+    , sockStatus
+    , SocketStatus(..)
+
+    -- * Socket types
+    , SocketType(..)
+    , isSupportedSocketType
+    , packSocketType
+    , packSocketType'
+    , packSocketTypeOrThrow
+    , unpackSocketType
+    , unpackSocketType'
+
+    -- * Family
+    , Family(..)
+    , isSupportedFamily
+    , packFamily
+    , unpackFamily
+
+    -- * Socket addresses
+    , SockAddr(..)
+    , HostAddress
+#if defined(IPV6_SOCKET_SUPPORT)
+    , HostAddress6
+    , FlowInfo
+    , ScopeID
+#endif
+    , peekSockAddr
+    , pokeSockAddr
+    , sizeOfSockAddr
+    , sizeOfSockAddrByFamily
+    , withSockAddr
+    , withNewSockAddr
+
+    -- * Unsorted
+    , ProtocolNumber
+    , PortNumber(..)
+
+    -- * Low-level helpers
+    , zeroMemory
+    ) where
+
+#include "HsNet.h"
+
+import Control.Concurrent.MVar
+import Control.Monad
+import Data.Bits
+import Data.Maybe
+import Data.Ratio
+import Data.Typeable
+import Data.Word
+import Foreign.C
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+
+data Socket
+  = MkSocket
+            CInt                 -- File Descriptor
+            Family
+            SocketType
+            ProtocolNumber       -- Protocol Number
+            (MVar SocketStatus)  -- Status Flag
+  deriving Typeable
+
+sockFd       (MkSocket n _ _ _ _) = n
+sockFamily   (MkSocket _ f _ _ _) = f
+sockType     (MkSocket _ _ t _ _) = t
+sockProtocol (MkSocket _ _ _ p _) = p
+sockStatus   (MkSocket _ _ _ _ s) = s
+
+instance Eq Socket where
+  (MkSocket _ _ _ _ m1) == (MkSocket _ _ _ _ m2) = m1 == m2
+
+instance Show Socket where
+  showsPrec _n (MkSocket fd _ _ _ _) =
+        showString "<socket: " . shows fd . showString ">"
+
+type ProtocolNumber = CInt
+
+data SocketStatus
+  -- Returned Status    Function called
+  = NotConnected        -- socket
+  | Bound               -- bind
+  | Listening           -- listen
+  | Connected           -- connect/accept
+  | ConvertedToHandle   -- is now a Handle, don't touch
+  | Closed              -- close
+    deriving (Eq, Show, Typeable)
+
+-----------------------------------------------------------------------------
+-- Socket types
+
+-- There are a few possible ways to do this.  The first is convert the
+-- structs used in the C library into an equivalent Haskell type. An
+-- other possible implementation is to keep all the internals in the C
+-- code and use an Int## and a status flag. The second method is used
+-- here since a lot of the C structures are not required to be
+-- manipulated.
+
+-- Originally the status was non-mutable so we had to return a new
+-- socket each time we changed the status.  This version now uses
+-- mutable variables to avoid the need to do this.  The result is a
+-- cleaner interface and better security since the application
+-- programmer now can't circumvent the status information to perform
+-- invalid operations on sockets.
+
+-- | Socket Types.
+--
+-- The existence of a constructor does not necessarily imply that that
+-- socket type is supported on your system: see 'isSupportedSocketType'.
+data SocketType
+        = NoSocketType -- ^ 0, used in getAddrInfo hints, for example
+        | Stream -- ^ SOCK_STREAM
+        | Datagram -- ^ SOCK_DGRAM
+        | Raw -- ^ SOCK_RAW
+        | RDM -- ^ SOCK_RDM
+        | SeqPacket -- ^ SOCK_SEQPACKET
+        deriving (Eq, Ord, Read, Show, Typeable)
+
+-- | Does the SOCK_ constant corresponding to the given SocketType exist on
+-- this system?
+isSupportedSocketType :: SocketType -> Bool
+isSupportedSocketType = isJust . packSocketType'
+
+-- | Find the SOCK_ constant corresponding to the SocketType value.
+packSocketType' :: SocketType -> Maybe CInt
+packSocketType' stype = case Just stype of
+    -- the Just above is to disable GHC's overlapping pattern
+    -- detection: see comments for packSocketOption
+    Just NoSocketType -> Just 0
+#ifdef SOCK_STREAM
+    Just Stream -> Just #const SOCK_STREAM
+#endif
+#ifdef SOCK_DGRAM
+    Just Datagram -> Just #const SOCK_DGRAM
+#endif
+#ifdef SOCK_RAW
+    Just Raw -> Just #const SOCK_RAW
+#endif
+#ifdef SOCK_RDM
+    Just RDM -> Just #const SOCK_RDM
+#endif
+#ifdef SOCK_SEQPACKET
+    Just SeqPacket -> Just #const SOCK_SEQPACKET
+#endif
+    _ -> Nothing
+
+packSocketType :: SocketType -> CInt
+packSocketType stype = fromMaybe (error errMsg) (packSocketType' stype)
+  where
+    errMsg = concat ["Network.Socket.packSocketType: ",
+                     "socket type ", show stype, " unsupported on this system"]
+
+-- | Try packSocketType' on the SocketType, if it fails throw an error with
+-- message starting "Network.Socket." ++ the String parameter
+packSocketTypeOrThrow :: String -> SocketType -> IO CInt
+packSocketTypeOrThrow caller stype = maybe err return (packSocketType' stype)
+ where
+  err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",
+    "socket type ", show stype, " unsupported on this system"]
+
+
+unpackSocketType:: CInt -> Maybe SocketType
+unpackSocketType t = case t of
+        0 -> Just NoSocketType
+#ifdef SOCK_STREAM
+        (#const SOCK_STREAM) -> Just Stream
+#endif
+#ifdef SOCK_DGRAM
+        (#const SOCK_DGRAM) -> Just Datagram
+#endif
+#ifdef SOCK_RAW
+        (#const SOCK_RAW) -> Just Raw
+#endif
+#ifdef SOCK_RDM
+        (#const SOCK_RDM) -> Just RDM
+#endif
+#ifdef SOCK_SEQPACKET
+        (#const SOCK_SEQPACKET) -> Just SeqPacket
+#endif
+        _ -> Nothing
+
+-- | Try unpackSocketType on the CInt, if it fails throw an error with
+-- message starting "Network.Socket." ++ the String parameter
+unpackSocketType' :: String -> CInt -> IO SocketType
+unpackSocketType' caller ty = maybe err return (unpackSocketType ty)
+ where
+  err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",
+    "socket type ", show ty, " unsupported on this system"]
+
+------------------------------------------------------------------------
+-- Protocol Families.
+
+-- | Address families.
+--
+-- A constructor being present here does not mean it is supported by the
+-- operating system: see 'isSupportedFamily'.
+data Family
+    = AF_UNSPEC           -- unspecified
+    | AF_UNIX             -- local to host (pipes, portals
+    | AF_INET             -- internetwork: UDP, TCP, etc
+    | AF_INET6            -- Internet Protocol version 6
+    | AF_IMPLINK          -- arpanet imp addresses
+    | AF_PUP              -- pup protocols: e.g. BSP
+    | AF_CHAOS            -- mit CHAOS protocols
+    | AF_NS               -- XEROX NS protocols
+    | AF_NBS              -- nbs protocols
+    | AF_ECMA             -- european computer manufacturers
+    | AF_DATAKIT          -- datakit protocols
+    | AF_CCITT            -- CCITT protocols, X.25 etc
+    | AF_SNA              -- IBM SNA
+    | AF_DECnet           -- DECnet
+    | AF_DLI              -- Direct data link interface
+    | AF_LAT              -- LAT
+    | AF_HYLINK           -- NSC Hyperchannel
+    | AF_APPLETALK        -- Apple Talk
+    | AF_ROUTE            -- Internal Routing Protocol
+    | AF_NETBIOS          -- NetBios-style addresses
+    | AF_NIT              -- Network Interface Tap
+    | AF_802              -- IEEE 802.2, also ISO 8802
+    | AF_ISO              -- ISO protocols
+    | AF_OSI              -- umbrella of all families used by OSI
+    | AF_NETMAN           -- DNA Network Management
+    | AF_X25              -- CCITT X.25
+    | AF_AX25
+    | AF_OSINET           -- AFI
+    | AF_GOSSIP           -- US Government OSI
+    | AF_IPX              -- Novell Internet Protocol
+    | Pseudo_AF_XTP       -- eXpress Transfer Protocol (no AF)
+    | AF_CTF              -- Common Trace Facility
+    | AF_WAN              -- Wide Area Network protocols
+    | AF_SDL              -- SGI Data Link for DLPI
+    | AF_NETWARE
+    | AF_NDD
+    | AF_INTF             -- Debugging use only
+    | AF_COIP             -- connection-oriented IP, aka ST II
+    | AF_CNT              -- Computer Network Technology
+    | Pseudo_AF_RTIP      -- Help Identify RTIP packets
+    | Pseudo_AF_PIP       -- Help Identify PIP packets
+    | AF_SIP              -- Simple Internet Protocol
+    | AF_ISDN             -- Integrated Services Digital Network
+    | Pseudo_AF_KEY       -- Internal key-management function
+    | AF_NATM             -- native ATM access
+    | AF_ARP              -- (rev.) addr. res. prot. (RFC 826)
+    | Pseudo_AF_HDRCMPLT  -- Used by BPF to not rewrite hdrs in iface output
+    | AF_ENCAP
+    | AF_LINK             -- Link layer interface
+    | AF_RAW              -- Link layer interface
+    | AF_RIF              -- raw interface
+    | AF_NETROM           -- Amateur radio NetROM
+    | AF_BRIDGE           -- multiprotocol bridge
+    | AF_ATMPVC           -- ATM PVCs
+    | AF_ROSE             -- Amateur Radio X.25 PLP
+    | AF_NETBEUI          -- 802.2LLC
+    | AF_SECURITY         -- Security callback pseudo AF
+    | AF_PACKET           -- Packet family
+    | AF_ASH              -- Ash
+    | AF_ECONET           -- Acorn Econet
+    | AF_ATMSVC           -- ATM SVCs
+    | AF_IRDA             -- IRDA sockets
+    | AF_PPPOX            -- PPPoX sockets
+    | AF_WANPIPE          -- Wanpipe API sockets
+    | AF_BLUETOOTH        -- bluetooth sockets
+      deriving (Eq, Ord, Read, Show)
+
+packFamily :: Family -> CInt
+packFamily f = case packFamily' f of
+    Just fam -> fam
+    Nothing -> error $
+               "Network.Socket.packFamily: unsupported address family: " ++
+               show f
+
+-- | Does the AF_ constant corresponding to the given family exist on this
+-- system?
+isSupportedFamily :: Family -> Bool
+isSupportedFamily = isJust . packFamily'
+
+packFamily' :: Family -> Maybe CInt
+packFamily' f = case Just f of
+    -- the Just above is to disable GHC's overlapping pattern
+    -- detection: see comments for packSocketOption
+    Just AF_UNSPEC -> Just #const AF_UNSPEC
+#ifdef AF_UNIX
+    Just AF_UNIX -> Just #const AF_UNIX
+#endif
+#ifdef AF_INET
+    Just AF_INET -> Just #const AF_INET
+#endif
+#ifdef AF_INET6
+    Just AF_INET6 -> Just #const AF_INET6
+#endif
+#ifdef AF_IMPLINK
+    Just AF_IMPLINK -> Just #const AF_IMPLINK
+#endif
+#ifdef AF_PUP
+    Just AF_PUP -> Just #const AF_PUP
+#endif
+#ifdef AF_CHAOS
+    Just AF_CHAOS -> Just #const AF_CHAOS
+#endif
+#ifdef AF_NS
+    Just AF_NS -> Just #const AF_NS
+#endif
+#ifdef AF_NBS
+    Just AF_NBS -> Just #const AF_NBS
+#endif
+#ifdef AF_ECMA
+    Just AF_ECMA -> Just #const AF_ECMA
+#endif
+#ifdef AF_DATAKIT
+    Just AF_DATAKIT -> Just #const AF_DATAKIT
+#endif
+#ifdef AF_CCITT
+    Just AF_CCITT -> Just #const AF_CCITT
+#endif
+#ifdef AF_SNA
+    Just AF_SNA -> Just #const AF_SNA
+#endif
+#ifdef AF_DECnet
+    Just AF_DECnet -> Just #const AF_DECnet
+#endif
+#ifdef AF_DLI
+    Just AF_DLI -> Just #const AF_DLI
+#endif
+#ifdef AF_LAT
+    Just AF_LAT -> Just #const AF_LAT
+#endif
+#ifdef AF_HYLINK
+    Just AF_HYLINK -> Just #const AF_HYLINK
+#endif
+#ifdef AF_APPLETALK
+    Just AF_APPLETALK -> Just #const AF_APPLETALK
+#endif
+#ifdef AF_ROUTE
+    Just AF_ROUTE -> Just #const AF_ROUTE
+#endif
+#ifdef AF_NETBIOS
+    Just AF_NETBIOS -> Just #const AF_NETBIOS
+#endif
+#ifdef AF_NIT
+    Just AF_NIT -> Just #const AF_NIT
+#endif
+#ifdef AF_802
+    Just AF_802 -> Just #const AF_802
+#endif
+#ifdef AF_ISO
+    Just AF_ISO -> Just #const AF_ISO
+#endif
+#ifdef AF_OSI
+    Just AF_OSI -> Just #const AF_OSI
+#endif
+#ifdef AF_NETMAN
+    Just AF_NETMAN -> Just #const AF_NETMAN
+#endif
+#ifdef AF_X25
+    Just AF_X25 -> Just #const AF_X25
+#endif
+#ifdef AF_AX25
+    Just AF_AX25 -> Just #const AF_AX25
+#endif
+#ifdef AF_OSINET
+    Just AF_OSINET -> Just #const AF_OSINET
+#endif
+#ifdef AF_GOSSIP
+    Just AF_GOSSIP -> Just #const AF_GOSSIP
+#endif
+#ifdef AF_IPX
+    Just AF_IPX -> Just #const AF_IPX
+#endif
+#ifdef Pseudo_AF_XTP
+    Just Pseudo_AF_XTP -> Just #const Pseudo_AF_XTP
+#endif
+#ifdef AF_CTF
+    Just AF_CTF -> Just #const AF_CTF
+#endif
+#ifdef AF_WAN
+    Just AF_WAN -> Just #const AF_WAN
+#endif
+#ifdef AF_SDL
+    Just AF_SDL -> Just #const AF_SDL
+#endif
+#ifdef AF_NETWARE
+    Just AF_NETWARE -> Just #const AF_NETWARE
+#endif
+#ifdef AF_NDD
+    Just AF_NDD -> Just #const AF_NDD
+#endif
+#ifdef AF_INTF
+    Just AF_INTF -> Just #const AF_INTF
+#endif
+#ifdef AF_COIP
+    Just AF_COIP -> Just #const AF_COIP
+#endif
+#ifdef AF_CNT
+    Just AF_CNT -> Just #const AF_CNT
+#endif
+#ifdef Pseudo_AF_RTIP
+    Just Pseudo_AF_RTIP -> Just #const Pseudo_AF_RTIP
+#endif
+#ifdef Pseudo_AF_PIP
+    Just Pseudo_AF_PIP -> Just #const Pseudo_AF_PIP
+#endif
+#ifdef AF_SIP
+    Just AF_SIP -> Just #const AF_SIP
+#endif
+#ifdef AF_ISDN
+    Just AF_ISDN -> Just #const AF_ISDN
+#endif
+#ifdef Pseudo_AF_KEY
+    Just Pseudo_AF_KEY -> Just #const Pseudo_AF_KEY
+#endif
+#ifdef AF_NATM
+    Just AF_NATM -> Just #const AF_NATM
+#endif
+#ifdef AF_ARP
+    Just AF_ARP -> Just #const AF_ARP
+#endif
+#ifdef Pseudo_AF_HDRCMPLT
+    Just Pseudo_AF_HDRCMPLT -> Just #const Pseudo_AF_HDRCMPLT
+#endif
+#ifdef AF_ENCAP
+    Just AF_ENCAP -> Just #const AF_ENCAP
+#endif
+#ifdef AF_LINK
+    Just AF_LINK -> Just #const AF_LINK
+#endif
+#ifdef AF_RAW
+    Just AF_RAW -> Just #const AF_RAW
+#endif
+#ifdef AF_RIF
+    Just AF_RIF -> Just #const AF_RIF
+#endif
+#ifdef AF_NETROM
+    Just AF_NETROM -> Just #const AF_NETROM
+#endif
+#ifdef AF_BRIDGE
+    Just AF_BRIDGE -> Just #const AF_BRIDGE
+#endif
+#ifdef AF_ATMPVC
+    Just AF_ATMPVC -> Just #const AF_ATMPVC
+#endif
+#ifdef AF_ROSE
+    Just AF_ROSE -> Just #const AF_ROSE
+#endif
+#ifdef AF_NETBEUI
+    Just AF_NETBEUI -> Just #const AF_NETBEUI
+#endif
+#ifdef AF_SECURITY
+    Just AF_SECURITY -> Just #const AF_SECURITY
+#endif
+#ifdef AF_PACKET
+    Just AF_PACKET -> Just #const AF_PACKET
+#endif
+#ifdef AF_ASH
+    Just AF_ASH -> Just #const AF_ASH
+#endif
+#ifdef AF_ECONET
+    Just AF_ECONET -> Just #const AF_ECONET
+#endif
+#ifdef AF_ATMSVC
+    Just AF_ATMSVC -> Just #const AF_ATMSVC
+#endif
+#ifdef AF_IRDA
+    Just AF_IRDA -> Just #const AF_IRDA
+#endif
+#ifdef AF_PPPOX
+    Just AF_PPPOX -> Just #const AF_PPPOX
+#endif
+#ifdef AF_WANPIPE
+    Just AF_WANPIPE -> Just #const AF_WANPIPE
+#endif
+#ifdef AF_BLUETOOTH
+    Just AF_BLUETOOTH -> Just #const AF_BLUETOOTH
+#endif
+    _ -> Nothing
+
+--------- ----------
+
+unpackFamily :: CInt -> Family
+unpackFamily f = case f of
+        (#const AF_UNSPEC) -> AF_UNSPEC
+#ifdef AF_UNIX
+        (#const AF_UNIX) -> AF_UNIX
+#endif
+#ifdef AF_INET
+        (#const AF_INET) -> AF_INET
+#endif
+#ifdef AF_INET6
+        (#const AF_INET6) -> AF_INET6
+#endif
+#ifdef AF_IMPLINK
+        (#const AF_IMPLINK) -> AF_IMPLINK
+#endif
+#ifdef AF_PUP
+        (#const AF_PUP) -> AF_PUP
+#endif
+#ifdef AF_CHAOS
+        (#const AF_CHAOS) -> AF_CHAOS
+#endif
+#ifdef AF_NS
+        (#const AF_NS) -> AF_NS
+#endif
+#ifdef AF_NBS
+        (#const AF_NBS) -> AF_NBS
+#endif
+#ifdef AF_ECMA
+        (#const AF_ECMA) -> AF_ECMA
+#endif
+#ifdef AF_DATAKIT
+        (#const AF_DATAKIT) -> AF_DATAKIT
+#endif
+#ifdef AF_CCITT
+        (#const AF_CCITT) -> AF_CCITT
+#endif
+#ifdef AF_SNA
+        (#const AF_SNA) -> AF_SNA
+#endif
+#ifdef AF_DECnet
+        (#const AF_DECnet) -> AF_DECnet
+#endif
+#ifdef AF_DLI
+        (#const AF_DLI) -> AF_DLI
+#endif
+#ifdef AF_LAT
+        (#const AF_LAT) -> AF_LAT
+#endif
+#ifdef AF_HYLINK
+        (#const AF_HYLINK) -> AF_HYLINK
+#endif
+#ifdef AF_APPLETALK
+        (#const AF_APPLETALK) -> AF_APPLETALK
+#endif
+#ifdef AF_ROUTE
+        (#const AF_ROUTE) -> AF_ROUTE
+#endif
+#ifdef AF_NETBIOS
+        (#const AF_NETBIOS) -> AF_NETBIOS
+#endif
+#ifdef AF_NIT
+        (#const AF_NIT) -> AF_NIT
+#endif
+#ifdef AF_802
+        (#const AF_802) -> AF_802
+#endif
+#ifdef AF_ISO
+        (#const AF_ISO) -> AF_ISO
+#endif
+#ifdef AF_OSI
+# if (!defined(AF_ISO)) || (defined(AF_ISO) && (AF_ISO != AF_OSI))
+        (#const AF_OSI) -> AF_OSI
+# endif
+#endif
+#ifdef AF_NETMAN
+        (#const AF_NETMAN) -> AF_NETMAN
+#endif
+#ifdef AF_X25
+        (#const AF_X25) -> AF_X25
+#endif
+#ifdef AF_AX25
+        (#const AF_AX25) -> AF_AX25
+#endif
+#ifdef AF_OSINET
+        (#const AF_OSINET) -> AF_OSINET
+#endif
+#ifdef AF_GOSSIP
+        (#const AF_GOSSIP) -> AF_GOSSIP
+#endif
+#if defined(AF_IPX) && (!defined(AF_NS) || AF_NS != AF_IPX)
+        (#const AF_IPX) -> AF_IPX
+#endif
+#ifdef Pseudo_AF_XTP
+        (#const Pseudo_AF_XTP) -> Pseudo_AF_XTP
+#endif
+#ifdef AF_CTF
+        (#const AF_CTF) -> AF_CTF
+#endif
+#ifdef AF_WAN
+        (#const AF_WAN) -> AF_WAN
+#endif
+#ifdef AF_SDL
+        (#const AF_SDL) -> AF_SDL
+#endif
+#ifdef AF_NETWARE
+        (#const AF_NETWARE) -> AF_NETWARE
+#endif
+#ifdef AF_NDD
+        (#const AF_NDD) -> AF_NDD
+#endif
+#ifdef AF_INTF
+        (#const AF_INTF) -> AF_INTF
+#endif
+#ifdef AF_COIP
+        (#const AF_COIP) -> AF_COIP
+#endif
+#ifdef AF_CNT
+        (#const AF_CNT) -> AF_CNT
+#endif
+#ifdef Pseudo_AF_RTIP
+        (#const Pseudo_AF_RTIP) -> Pseudo_AF_RTIP
+#endif
+#ifdef Pseudo_AF_PIP
+        (#const Pseudo_AF_PIP) -> Pseudo_AF_PIP
+#endif
+#ifdef AF_SIP
+        (#const AF_SIP) -> AF_SIP
+#endif
+#ifdef AF_ISDN
+        (#const AF_ISDN) -> AF_ISDN
+#endif
+#ifdef Pseudo_AF_KEY
+        (#const Pseudo_AF_KEY) -> Pseudo_AF_KEY
+#endif
+#ifdef AF_NATM
+        (#const AF_NATM) -> AF_NATM
+#endif
+#ifdef AF_ARP
+        (#const AF_ARP) -> AF_ARP
+#endif
+#ifdef Pseudo_AF_HDRCMPLT
+        (#const Pseudo_AF_HDRCMPLT) -> Pseudo_AF_HDRCMPLT
+#endif
+#ifdef AF_ENCAP
+        (#const AF_ENCAP) -> AF_ENCAP
+#endif
+#ifdef AF_LINK
+        (#const AF_LINK) -> AF_LINK
+#endif
+#ifdef AF_RAW
+        (#const AF_RAW) -> AF_RAW
+#endif
+#ifdef AF_RIF
+        (#const AF_RIF) -> AF_RIF
+#endif
+#ifdef AF_NETROM
+        (#const AF_NETROM) -> AF_NETROM
+#endif
+#ifdef AF_BRIDGE
+        (#const AF_BRIDGE) -> AF_BRIDGE
+#endif
+#ifdef AF_ATMPVC
+        (#const AF_ATMPVC) -> AF_ATMPVC
+#endif
+#ifdef AF_ROSE
+        (#const AF_ROSE) -> AF_ROSE
+#endif
+#ifdef AF_NETBEUI
+        (#const AF_NETBEUI) -> AF_NETBEUI
+#endif
+#ifdef AF_SECURITY
+        (#const AF_SECURITY) -> AF_SECURITY
+#endif
+#ifdef AF_PACKET
+        (#const AF_PACKET) -> AF_PACKET
+#endif
+#ifdef AF_ASH
+        (#const AF_ASH) -> AF_ASH
+#endif
+#ifdef AF_ECONET
+        (#const AF_ECONET) -> AF_ECONET
+#endif
+#ifdef AF_ATMSVC
+        (#const AF_ATMSVC) -> AF_ATMSVC
+#endif
+#ifdef AF_IRDA
+        (#const AF_IRDA) -> AF_IRDA
+#endif
+#ifdef AF_PPPOX
+        (#const AF_PPPOX) -> AF_PPPOX
+#endif
+#ifdef AF_WANPIPE
+        (#const AF_WANPIPE) -> AF_WANPIPE
+#endif
+#ifdef AF_BLUETOOTH
+        (#const AF_BLUETOOTH) -> AF_BLUETOOTH
+#endif
+        unknown -> error ("Network.Socket.unpackFamily: unknown address " ++
+                          "family " ++ show unknown)
+
+------------------------------------------------------------------------
+-- Port Numbers
+
+newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable)
+-- newtyped to prevent accidental use of sane-looking
+-- port numbers that haven't actually been converted to
+-- network-byte-order first.
+
+instance Show PortNumber where
+  showsPrec p pn = showsPrec p (portNumberToInt pn)
+
+intToPortNumber :: Int -> PortNumber
+intToPortNumber v = PortNum (htons (fromIntegral v))
+
+portNumberToInt :: PortNumber -> Int
+portNumberToInt (PortNum po) = fromIntegral (ntohs po)
+
+foreign import CALLCONV unsafe "my_ntohs" ntohs :: Word16 -> Word16
+foreign import CALLCONV unsafe "my_htons" htons :: Word16 -> Word16
+--foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32
+
+instance Enum PortNumber where
+    toEnum   = intToPortNumber
+    fromEnum = portNumberToInt
+
+instance Num PortNumber where
+   fromInteger i = intToPortNumber (fromInteger i)
+    -- for completeness.
+   (+) x y   = intToPortNumber (portNumberToInt x + portNumberToInt y)
+   (-) x y   = intToPortNumber (portNumberToInt x - portNumberToInt y)
+   negate x  = intToPortNumber (-portNumberToInt x)
+   (*) x y   = intToPortNumber (portNumberToInt x * portNumberToInt y)
+   abs n     = intToPortNumber (abs (portNumberToInt n))
+   signum n  = intToPortNumber (signum (portNumberToInt n))
+
+instance Real PortNumber where
+    toRational x = toInteger x % 1
+
+instance Integral PortNumber where
+    quotRem a b = let (c,d) = quotRem (portNumberToInt a) (portNumberToInt b) in
+                  (intToPortNumber c, intToPortNumber d)
+    toInteger a = toInteger (portNumberToInt a)
+
+instance Storable PortNumber where
+   sizeOf    _ = sizeOf    (undefined :: Word16)
+   alignment _ = alignment (undefined :: Word16)
+   poke p (PortNum po) = poke (castPtr p) po
+   peek p = PortNum `liftM` peek (castPtr p)
+
+------------------------------------------------------------------------
+-- Socket addresses
+
+-- The scheme used for addressing sockets is somewhat quirky. The
+-- calls in the BSD socket API that need to know the socket address
+-- all operate in terms of struct sockaddr, a `virtual' type of
+-- socket address.
+
+-- The Internet family of sockets are addressed as struct sockaddr_in,
+-- so when calling functions that operate on struct sockaddr, we have
+-- to type cast the Internet socket address into a struct sockaddr.
+-- Instances of the structure for different families might *not* be
+-- the same size. Same casting is required of other families of
+-- sockets such as Xerox NS. Similarly for Unix domain sockets.
+
+-- To represent these socket addresses in Haskell-land, we do what BSD
+-- didn't do, and use a union/algebraic type for the different
+-- families. Currently only Unix domain sockets and the Internet
+-- families are supported.
+
+#if defined(IPV6_SOCKET_SUPPORT)
+type FlowInfo = Word32
+type ScopeID = Word32
+#endif
+
+data SockAddr       -- C Names
+  = SockAddrInet
+    PortNumber  -- sin_port  (network byte order)
+    HostAddress -- sin_addr  (ditto)
+#if defined(IPV6_SOCKET_SUPPORT)
+  | SockAddrInet6
+        PortNumber      -- sin6_port (network byte order)
+        FlowInfo        -- sin6_flowinfo (ditto)
+        HostAddress6    -- sin6_addr (ditto)
+        ScopeID         -- sin6_scope_id (ditto)
+#endif
+#if defined(DOMAIN_SOCKET_SUPPORT)
+  | SockAddrUnix
+        String          -- sun_path
+#endif
+  deriving (Eq, Ord, Typeable)
+
+#if defined(WITH_WINSOCK) || defined(cygwin32_HOST_OS)
+type CSaFamily = (#type unsigned short)
+#elif defined(darwin_HOST_OS)
+type CSaFamily = (#type u_char)
+#else
+type CSaFamily = (#type sa_family_t)
+#endif
+
+-- | Computes the storage requirements (in bytes) of the given
+-- 'SockAddr'.  This function differs from 'Foreign.Storable.sizeOf'
+-- in that the value of the argument /is/ used.
+sizeOfSockAddr :: SockAddr -> Int
+#if defined(DOMAIN_SOCKET_SUPPORT)
+sizeOfSockAddr (SockAddrUnix path) =
+    case path of
+        '\0':_ -> (#const sizeof(sa_family_t)) + length path
+        _      -> #const sizeof(struct sockaddr_un)
+#endif
+sizeOfSockAddr (SockAddrInet _ _) = #const sizeof(struct sockaddr_in)
+#if defined(IPV6_SOCKET_SUPPORT)
+sizeOfSockAddr (SockAddrInet6 _ _ _ _) = #const sizeof(struct sockaddr_in6)
+#endif
+
+-- | Computes the storage requirements (in bytes) required for a
+-- 'SockAddr' with the given 'Family'.
+sizeOfSockAddrByFamily :: Family -> Int
+#if defined(DOMAIN_SOCKET_SUPPORT)
+sizeOfSockAddrByFamily AF_UNIX  = #const sizeof(struct sockaddr_un)
+#endif
+#if defined(IPV6_SOCKET_SUPPORT)
+sizeOfSockAddrByFamily AF_INET6 = #const sizeof(struct sockaddr_in6)
+#endif
+sizeOfSockAddrByFamily AF_INET  = #const sizeof(struct sockaddr_in)
+
+-- | Use a 'SockAddr' with a function requiring a pointer to a
+-- 'SockAddr' and the length of that 'SockAddr'.
+withSockAddr :: SockAddr -> (Ptr SockAddr -> Int -> IO a) -> IO a
+withSockAddr addr f = do
+    let sz = sizeOfSockAddr addr
+    allocaBytes sz $ \p -> pokeSockAddr p addr >> f (castPtr p) sz
+
+-- | Create a new 'SockAddr' for use with a function requiring a
+-- pointer to a 'SockAddr' and the length of that 'SockAddr'.
+withNewSockAddr :: Family -> (Ptr SockAddr -> Int -> IO a) -> IO a
+withNewSockAddr family f = do
+    let sz = sizeOfSockAddrByFamily family
+    allocaBytes sz $ \ptr -> f ptr sz
+
+-- We can't write an instance of 'Storable' for 'SockAddr' because
+-- @sockaddr@ is a sum type of variable size but
+-- 'Foreign.Storable.sizeOf' is required to be constant.
+
+-- Note that on Darwin, the sockaddr structure must be zeroed before
+-- use.
+
+-- | Write the given 'SockAddr' to the given memory location.
+pokeSockAddr :: Ptr a -> SockAddr -> IO ()
+#if defined(DOMAIN_SOCKET_SUPPORT)
+pokeSockAddr p (SockAddrUnix path) = do
+#if defined(darwin_HOST_OS)
+    zeroMemory p (#const sizeof(struct sockaddr_un))
+#endif
+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
+    (#poke struct sockaddr_un, sun_len) p ((#const sizeof(struct sockaddr_un)) :: Word8)
+#endif
+    (#poke struct sockaddr_un, sun_family) p ((#const AF_UNIX) :: CSaFamily)
+    let pathC = map castCharToCChar path
+        poker = case path of ('\0':_) -> pokeArray; _ -> pokeArray0 0
+    poker ((#ptr struct sockaddr_un, sun_path) p) pathC
+#endif
+pokeSockAddr p (SockAddrInet (PortNum port) addr) = do
+#if defined(darwin_HOST_OS)
+    zeroMemory p (#const sizeof(struct sockaddr_in))
+#endif
+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
+    (#poke struct sockaddr_in, sin_len) p ((#const sizeof(struct sockaddr_in)) :: Word8)
+#endif
+    (#poke struct sockaddr_in, sin_family) p ((#const AF_INET) :: CSaFamily)
+    (#poke struct sockaddr_in, sin_port) p port
+    (#poke struct sockaddr_in, sin_addr) p addr
+#if defined(IPV6_SOCKET_SUPPORT)
+pokeSockAddr p (SockAddrInet6 (PortNum port) flow addr scope) = do
+#if defined(darwin_HOST_OS)
+    zeroMemory p (#const sizeof(struct sockaddr_in6))
+#endif
+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
+    (#poke struct sockaddr_in6, sin6_len) p ((#const sizeof(struct sockaddr_in6)) :: Word8)
+#endif
+    (#poke struct sockaddr_in6, sin6_family) p ((#const AF_INET6) :: CSaFamily)
+    (#poke struct sockaddr_in6, sin6_port) p port
+    (#poke struct sockaddr_in6, sin6_flowinfo) p flow
+    (#poke struct sockaddr_in6, sin6_addr) p addr
+    (#poke struct sockaddr_in6, sin6_scope_id) p scope
+#endif
+
+-- | Read a 'SockAddr' from the given memory location.
+peekSockAddr :: Ptr SockAddr -> IO SockAddr
+peekSockAddr p = do
+  family <- (#peek struct sockaddr, sa_family) p
+  case family :: CSaFamily of
+#if defined(DOMAIN_SOCKET_SUPPORT)
+    (#const AF_UNIX) -> do
+        str <- peekCString ((#ptr struct sockaddr_un, sun_path) p)
+        return (SockAddrUnix str)
+#endif
+    (#const AF_INET) -> do
+        addr <- (#peek struct sockaddr_in, sin_addr) p
+        port <- (#peek struct sockaddr_in, sin_port) p
+        return (SockAddrInet (PortNum port) addr)
+#if defined(IPV6_SOCKET_SUPPORT)
+    (#const AF_INET6) -> do
+        port <- (#peek struct sockaddr_in6, sin6_port) p
+        flow <- (#peek struct sockaddr_in6, sin6_flowinfo) p
+        addr <- (#peek struct sockaddr_in6, sin6_addr) p
+        scope <- (#peek struct sockaddr_in6, sin6_scope_id) p
+        return (SockAddrInet6 (PortNum port) flow addr scope)
+#endif
+
+------------------------------------------------------------------------
+
+-- | Network byte order.
+type HostAddress = Word32
+
+#if defined(IPV6_SOCKET_SUPPORT)
+-- | Host byte order.
+type HostAddress6 = (Word32, Word32, Word32, Word32)
+
+-- The peek32 and poke32 functions work around the fact that the RFCs
+-- don't require 32-bit-wide address fields to be present.  We can
+-- only portably rely on an 8-bit field, s6_addr.
+
+s6_addr_offset :: Int
+s6_addr_offset = (#offset struct in6_addr, s6_addr)
+
+peek32 :: Ptr a -> Int -> IO Word32
+peek32 p i0 = do
+    let i' = i0 * 4
+        peekByte n = peekByteOff p (s6_addr_offset + i' + n) :: IO Word8
+        a `sl` i = fromIntegral a `shiftL` i
+    a0 <- peekByte 0
+    a1 <- peekByte 1
+    a2 <- peekByte 2
+    a3 <- peekByte 3
+    return ((a0 `sl` 24) .|. (a1 `sl` 16) .|. (a2 `sl` 8) .|. (a3 `sl` 0))
+
+poke32 :: Ptr a -> Int -> Word32 -> IO ()
+poke32 p i0 a = do
+    let i' = i0 * 4
+        pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)
+        x `sr` i = fromIntegral (x `shiftR` i) :: Word8
+    pokeByte 0 (a `sr` 24)
+    pokeByte 1 (a `sr` 16)
+    pokeByte 2 (a `sr`  8)
+    pokeByte 3 (a `sr`  0)
+
+instance Storable HostAddress6 where
+    sizeOf _    = (#const sizeof(struct in6_addr))
+    alignment _ = alignment (undefined :: CInt)
+
+    peek p = do
+        a <- peek32 p 0
+        b <- peek32 p 1
+        c <- peek32 p 2
+        d <- peek32 p 3
+        return (a, b, c, d)
+
+    poke p (a, b, c, d) = do
+        poke32 p 0 a
+        poke32 p 1 b
+        poke32 p 2 c
+        poke32 p 3 d
+#endif
+
+------------------------------------------------------------------------
+-- Helper functions
+
+foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO ()
+
+-- | Zero a structure.
+zeroMemory :: Ptr a -> CSize -> IO ()
+zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)
diff --git a/standalone/android/tmp/network-2.4.1.2/Network/URI.hs b/standalone/android/tmp/network-2.4.1.2/Network/URI.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Network/URI.hs
@@ -0,0 +1,1349 @@
+{-# LANGUAGE CPP #-}
+--------------------------------------------------------------------------------
+-- |
+--  Module      :  Network.URI
+--  Copyright   :  (c) 2004, Graham Klyne
+--  License     :  BSD-style (see end of this file)
+--
+--  Maintainer  :  Graham Klyne <gk@ninebynine.org>
+--  Stability   :  provisional
+--  Portability :  portable
+--
+--  This module defines functions for handling URIs.  It presents substantially the
+--  same interface as the older GHC Network.URI module, but is implemented using
+--  Parsec rather than a Regex library that is not available with Hugs.  The internal
+--  representation of URI has been changed so that URI strings are more
+--  completely preserved when round-tripping to a URI value and back.
+--
+--  In addition, four methods are provided for parsing different
+--  kinds of URI string (as noted in RFC3986):
+--      'parseURI',
+--      'parseURIReference',
+--      'parseRelativeReference' and
+--      'parseAbsoluteURI'.
+--
+--  Further, four methods are provided for classifying different
+--  kinds of URI string (as noted in RFC3986):
+--      'isURI',
+--      'isURIReference',
+--      'isRelativeReference' and
+--      'isAbsoluteURI'.
+--
+--  The long-standing official reference for URI handling was RFC2396 [1],
+--  as updated by RFC 2732 [2], but this was replaced by a new specification,
+--  RFC3986 [3] in January 2005.  This latter specification has been used
+--  as the primary reference for constructing the URI parser implemented
+--  here, and it is intended that there is a direct relationship between
+--  the syntax definition in that document and this parser implementation.
+--
+--  RFC 1808 [4] contains a number of test cases for relative URI handling.
+--  Dan Connolly's Python module @uripath.py@ [5] also contains useful details
+--  and test cases.
+--
+--  Some of the code has been copied from the previous GHC implementation,
+--  but the parser is replaced with one that performs more complete
+--  syntax checking of the URI itself, according to RFC3986 [3].
+--
+--  References
+--
+--  (1) <http://www.ietf.org/rfc/rfc2396.txt>
+--
+--  (2) <http://www.ietf.org/rfc/rfc2732.txt>
+--
+--  (3) <http://www.ietf.org/rfc/rfc3986.txt>
+--
+--  (4) <http://www.ietf.org/rfc/rfc1808.txt>
+--
+--  (5) <http://www.w3.org/2000/10/swap/uripath.py>
+--
+--------------------------------------------------------------------------------
+
+module Network.URI
+    (
+    -- * The URI type
+      URI(..)
+    , URIAuth(..)
+    , nullURI
+      
+    -- * Parsing
+    , parseURI
+    , parseURIReference
+    , parseRelativeReference
+    , parseAbsoluteURI
+      
+    -- * Test for strings containing various kinds of URI
+    , isURI
+    , isURIReference
+    , isRelativeReference
+    , isAbsoluteURI
+    , isIPv6address
+    , isIPv4address
+      
+    -- * Predicates
+    , uriIsAbsolute
+    , uriIsRelative
+      
+    -- * Relative URIs
+    , relativeTo
+    , nonStrictRelativeTo
+    , relativeFrom
+      
+    -- * Operations on URI strings
+    -- | Support for putting strings into URI-friendly
+    --   escaped format and getting them back again.
+    --   This can't be done transparently in all cases, because certain
+    --   characters have different meanings in different kinds of URI.
+    --   The URI spec [3], section 2.4, indicates that all URI components
+    --   should be escaped before they are assembled as a URI:
+    --   \"Once produced, a URI is always in its percent-encoded form\"
+    , uriToString
+    , isReserved, isUnreserved
+    , isAllowedInURI, isUnescapedInURI
+    , isUnescapedInURIComponent
+    , escapeURIChar
+    , escapeURIString
+    , unEscapeString
+      
+    -- * URI Normalization functions
+    , normalizeCase
+    , normalizeEscape
+    , normalizePathSegments
+      
+    -- * Deprecated functions
+    , parseabsoluteURI
+    , escapeString
+    , reserved, unreserved
+    , scheme, authority, path, query, fragment
+    ) where
+
+import Text.ParserCombinators.Parsec
+    ( GenParser, ParseError
+    , parse, (<|>), (<?>), try
+    , option, many, many1, count, notFollowedBy
+    , char, satisfy, oneOf, string, eof
+    , unexpected
+    )
+
+import Control.Monad (MonadPlus(..))
+import Data.Char (ord, chr, isHexDigit, toLower, toUpper, digitToInt)
+import Data.Bits ((.|.),(.&.),shiftL,shiftR)
+import Debug.Trace (trace)
+import Numeric (showIntAtBase)
+
+import Data.Typeable (Typeable)
+#if MIN_VERSION_base(4,0,0)
+import Data.Data (Data)
+#else
+import Data.Generics (Data)
+#endif
+
+------------------------------------------------------------
+--  The URI datatype
+------------------------------------------------------------
+
+-- |Represents a general universal resource identifier using
+--  its component parts.
+--
+--  For example, for the URI
+--
+--  >   foo://anonymous@www.haskell.org:42/ghc?query#frag
+--
+--  the components are:
+--
+data URI = URI
+    { uriScheme     :: String           -- ^ @foo:@
+    , uriAuthority  :: Maybe URIAuth    -- ^ @\/\/anonymous\@www.haskell.org:42@
+    , uriPath       :: String           -- ^ @\/ghc@
+    , uriQuery      :: String           -- ^ @?query@
+    , uriFragment   :: String           -- ^ @#frag@
+    } deriving (Eq, Ord, Typeable, Data)
+
+-- |Type for authority value within a URI
+data URIAuth = URIAuth
+    { uriUserInfo   :: String           -- ^ @anonymous\@@
+    , uriRegName    :: String           -- ^ @www.haskell.org@
+    , uriPort       :: String           -- ^ @:42@
+    } deriving (Eq, Ord, Show, Typeable, Data)
+
+-- |Blank URI
+nullURI :: URI
+nullURI = URI
+    { uriScheme     = ""
+    , uriAuthority  = Nothing
+    , uriPath       = ""
+    , uriQuery      = ""
+    , uriFragment   = ""
+    }
+
+--  URI as instance of Show.  Note that for security reasons, the default
+--  behaviour is to suppress any userinfo field (see RFC3986, section 7.5).
+--  This can be overridden by using uriToString directly with first
+--  argument @id@ (noting that this returns a ShowS value rather than a string).
+--
+--  [[[Another design would be to embed the userinfo mapping function in
+--  the URIAuth value, with the default value suppressing userinfo formatting,
+--  but providing a function to return a new URI value with userinfo
+--  data exposed by show.]]]
+--
+instance Show URI where
+    showsPrec _ = uriToString defaultUserInfoMap
+
+defaultUserInfoMap :: String -> String
+defaultUserInfoMap uinf = user++newpass
+    where
+        (user,pass) = break (==':') uinf
+        newpass     = if null pass || (pass == "@")
+                                   || (pass == ":@")
+                        then pass
+                        else ":...@"
+
+testDefaultUserInfoMap :: [Bool]
+testDefaultUserInfoMap =
+     [ defaultUserInfoMap ""                == ""
+     , defaultUserInfoMap "@"               == "@"
+     , defaultUserInfoMap "user@"           == "user@"
+     , defaultUserInfoMap "user:@"          == "user:@"
+     , defaultUserInfoMap "user:anonymous@" == "user:...@"
+     , defaultUserInfoMap "user:pass@"      == "user:...@"
+     , defaultUserInfoMap "user:pass"       == "user:...@"
+     , defaultUserInfoMap "user:anonymous"  == "user:...@"
+     ]
+
+------------------------------------------------------------
+--  Parse a URI
+------------------------------------------------------------
+
+-- |Turn a string containing a URI into a 'URI'.
+--  Returns 'Nothing' if the string is not a valid URI;
+--  (an absolute URI with optional fragment identifier).
+--
+--  NOTE: this is different from the previous network.URI,
+--  whose @parseURI@ function works like 'parseURIReference'
+--  in this module.
+--
+parseURI :: String -> Maybe URI
+parseURI = parseURIAny uri
+
+-- |Parse a URI reference to a 'URI' value.
+--  Returns 'Nothing' if the string is not a valid URI reference.
+--  (an absolute or relative URI with optional fragment identifier).
+--
+parseURIReference :: String -> Maybe URI
+parseURIReference = parseURIAny uriReference
+
+-- |Parse a relative URI to a 'URI' value.
+--  Returns 'Nothing' if the string is not a valid relative URI.
+--  (a relative URI with optional fragment identifier).
+--
+parseRelativeReference :: String -> Maybe URI
+parseRelativeReference = parseURIAny relativeRef
+
+-- |Parse an absolute URI to a 'URI' value.
+--  Returns 'Nothing' if the string is not a valid absolute URI.
+--  (an absolute URI without a fragment identifier).
+--
+parseAbsoluteURI :: String -> Maybe URI
+parseAbsoluteURI = parseURIAny absoluteURI
+
+-- |Test if string contains a valid URI
+--  (an absolute URI with optional fragment identifier).
+--
+isURI :: String -> Bool
+isURI = isValidParse uri
+
+-- |Test if string contains a valid URI reference
+--  (an absolute or relative URI with optional fragment identifier).
+--
+isURIReference :: String -> Bool
+isURIReference = isValidParse uriReference
+
+-- |Test if string contains a valid relative URI
+--  (a relative URI with optional fragment identifier).
+--
+isRelativeReference :: String -> Bool
+isRelativeReference = isValidParse relativeRef
+
+-- |Test if string contains a valid absolute URI
+--  (an absolute URI without a fragment identifier).
+--
+isAbsoluteURI :: String -> Bool
+isAbsoluteURI = isValidParse absoluteURI
+
+-- |Test if string contains a valid IPv6 address
+--
+isIPv6address :: String -> Bool
+isIPv6address = isValidParse ipv6address
+
+-- |Test if string contains a valid IPv4 address
+--
+isIPv4address :: String -> Bool
+isIPv4address = isValidParse ipv4address
+
+-- |Test function: parse and reconstruct a URI reference
+--
+testURIReference :: String -> String
+testURIReference uristr = show (parseAll uriReference "" uristr)
+
+--  Helper function for turning a string into a URI
+--
+parseURIAny :: URIParser URI -> String -> Maybe URI
+parseURIAny parser uristr = case parseAll parser "" uristr of
+        Left  _ -> Nothing
+        Right u -> Just u
+
+--  Helper function to test a string match to a parser
+--
+isValidParse :: URIParser a -> String -> Bool
+isValidParse parser uristr = case parseAll parser "" uristr of
+        -- Left  e -> error (show e)
+        Left  _ -> False
+        Right _ -> True
+
+parseAll :: URIParser a -> String -> String -> Either ParseError a
+parseAll parser filename uristr = parse newparser filename uristr
+    where
+        newparser =
+            do  { res <- parser
+                ; eof
+                ; return res
+                }
+
+------------------------------------------------------------
+--  Predicates
+------------------------------------------------------------
+
+uriIsAbsolute :: URI -> Bool
+uriIsAbsolute (URI {uriScheme = scheme}) = scheme /= ""
+
+uriIsRelative :: URI -> Bool
+uriIsRelative = not . uriIsAbsolute
+
+------------------------------------------------------------
+--  URI parser body based on Parsec elements and combinators
+------------------------------------------------------------
+
+--  Parser parser type.
+--  Currently
+type URIParser a = GenParser Char () a
+
+--  RFC3986, section 2.1
+--
+--  Parse and return a 'pct-encoded' sequence
+--
+escaped :: URIParser String
+escaped =
+    do  { char '%'
+        ; h1 <- hexDigitChar
+        ; h2 <- hexDigitChar
+        ; return $ ['%',h1,h2]
+        }
+
+--  RFC3986, section 2.2
+--
+-- |Returns 'True' if the character is a \"reserved\" character in a
+--  URI.  To include a literal instance of one of these characters in a
+--  component of a URI, it must be escaped.
+--
+isReserved :: Char -> Bool
+isReserved c = isGenDelims c || isSubDelims c
+
+isGenDelims :: Char -> Bool
+isGenDelims c = c `elem` ":/?#[]@"
+
+isSubDelims :: Char -> Bool
+isSubDelims c = c `elem` "!$&'()*+,;="
+
+genDelims :: URIParser String
+genDelims = do { c <- satisfy isGenDelims ; return [c] }
+
+subDelims :: URIParser String
+subDelims = do { c <- satisfy isSubDelims ; return [c] }
+
+--  RFC3986, section 2.3
+--
+-- |Returns 'True' if the character is an \"unreserved\" character in
+--  a URI.  These characters do not need to be escaped in a URI.  The
+--  only characters allowed in a URI are either \"reserved\",
+--  \"unreserved\", or an escape sequence (@%@ followed by two hex digits).
+--
+isUnreserved :: Char -> Bool
+isUnreserved c = isAlphaNumChar c || (c `elem` "-_.~")
+
+unreservedChar :: URIParser String
+unreservedChar = do { c <- satisfy isUnreserved ; return [c] }
+
+--  RFC3986, section 3
+--
+--   URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
+--
+--   hier-part   = "//" authority path-abempty
+--               / path-abs
+--               / path-rootless
+--               / path-empty
+
+uri :: URIParser URI
+uri =
+    do  { us <- try uscheme
+        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )
+        -- ; up <- upath
+        ; (ua,up) <- hierPart
+        ; uq <- option "" ( do { char '?' ; uquery    } )
+        ; uf <- option "" ( do { char '#' ; ufragment } )
+        ; return $ URI
+            { uriScheme    = us
+            , uriAuthority = ua
+            , uriPath      = up
+            , uriQuery     = uq
+            , uriFragment  = uf
+            }
+        }
+
+hierPart :: URIParser ((Maybe URIAuth),String)
+hierPart =
+        do  { try (string "//")
+            ; ua <- uauthority
+            ; up <- pathAbEmpty
+            ; return (ua,up)
+            }
+    <|> do  { up <- pathAbs
+            ; return (Nothing,up)
+            }
+    <|> do  { up <- pathRootLess
+            ; return (Nothing,up)
+            }
+    <|> do  { return (Nothing,"")
+            }
+
+--  RFC3986, section 3.1
+
+uscheme :: URIParser String
+uscheme =
+    do  { s <- oneThenMany alphaChar (satisfy isSchemeChar)
+        ; char ':'
+        ; return $ s++":"
+        }
+
+--  RFC3986, section 3.2
+
+uauthority :: URIParser (Maybe URIAuth)
+uauthority =
+    do  { uu <- option "" (try userinfo)
+        ; uh <- host
+        ; up <- option "" port
+        ; return $ Just $ URIAuth
+            { uriUserInfo = uu
+            , uriRegName  = uh
+            , uriPort     = up
+            }
+        }
+
+--  RFC3986, section 3.2.1
+
+userinfo :: URIParser String
+userinfo =
+    do  { uu <- many (uchar ";:&=+$,")
+        ; char '@'
+        ; return (concat uu ++"@")
+        }
+
+--  RFC3986, section 3.2.2
+
+host :: URIParser String
+host = ipLiteral <|> try ipv4address <|> regName
+
+ipLiteral :: URIParser String
+ipLiteral =
+    do  { char '['
+        ; ua <- ( ipv6address <|> ipvFuture )
+        ; char ']'
+        ; return $ "[" ++ ua ++ "]"
+        }
+    <?> "IP address literal"
+
+ipvFuture :: URIParser String
+ipvFuture =
+    do  { char 'v'
+        ; h <- hexDigitChar
+        ; char '.'
+        ; a <- many1 (satisfy isIpvFutureChar)
+        ; return $ 'v':h:'.':a
+        }
+
+isIpvFutureChar :: Char -> Bool
+isIpvFutureChar c = isUnreserved c || isSubDelims c || (c==';')
+
+ipv6address :: URIParser String
+ipv6address =
+        try ( do
+                { a2 <- count 6 h4c
+                ; a3 <- ls32
+                ; return $ concat a2 ++ a3
+                } )
+    <|> try ( do
+                { string "::"
+                ; a2 <- count 5 h4c
+                ; a3 <- ls32
+                ; return $ "::" ++ concat a2 ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 0
+                ; string "::"
+                ; a2 <- count 4 h4c
+                ; a3 <- ls32
+                ; return $ a1 ++ "::" ++ concat a2 ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 1
+                ; string "::"
+                ; a2 <- count 3 h4c
+                ; a3 <- ls32
+                ; return $ a1 ++ "::" ++ concat a2 ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 2
+                ; string "::"
+                ; a2 <- count 2 h4c
+                ; a3 <- ls32
+                ; return $ a1 ++ "::" ++ concat a2 ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 3
+                ; string "::"
+                ; a2 <- h4c
+                ; a3 <- ls32
+                ; return $ a1 ++ "::" ++ a2 ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 4
+                ; string "::"
+                ; a3 <- ls32
+                ; return $ a1 ++ "::" ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 5
+                ; string "::"
+                ; a3 <- h4
+                ; return $ a1 ++ "::" ++ a3
+                } )
+    <|> try ( do
+                { a1 <- opt_n_h4c_h4 6
+                ; string "::"
+                ; return $ a1 ++ "::"
+                } )
+    <?> "IPv6 address"
+
+opt_n_h4c_h4 :: Int -> URIParser String
+opt_n_h4c_h4 n = option "" $
+    do  { a1 <- countMinMax 0 n h4c
+        ; a2 <- h4
+        ; return $ concat a1 ++ a2
+        }
+
+ls32 :: URIParser String
+ls32 =  try ( do
+                { a1 <- h4c
+                ; a2 <- h4
+                ; return (a1++a2)
+                } )
+    <|> ipv4address
+
+h4c :: URIParser String
+h4c = try $
+    do  { a1 <- h4
+        ; char ':'
+        ; notFollowedBy (char ':')
+        ; return $ a1 ++ ":"
+        }
+
+h4 :: URIParser String
+h4 = countMinMax 1 4 hexDigitChar
+
+ipv4address :: URIParser String
+ipv4address =
+    do  { a1 <- decOctet ; char '.'
+        ; a2 <- decOctet ; char '.'
+        ; a3 <- decOctet ; char '.'
+        ; a4 <- decOctet
+        ; notFollowedBy regName
+        ; return $ a1++"."++a2++"."++a3++"."++a4
+        }
+    <?> "IPv4 Address"
+
+decOctet :: URIParser String
+decOctet =
+    do  { a1 <- countMinMax 1 3 digitChar
+        ; if (read a1 :: Integer) > 255 then
+            fail "Decimal octet value too large"
+          else
+            return a1
+        }
+
+regName :: URIParser String
+regName =
+    do  { ss <- countMinMax 0 255 ( unreservedChar <|> escaped <|> subDelims )
+        ; return $ concat ss
+        }
+    <?> "Registered name"
+
+--  RFC3986, section 3.2.3
+
+port :: URIParser String
+port =
+    do  { char ':'
+        ; p <- many digitChar
+        ; return (':':p)
+        }
+
+--
+--  RFC3986, section 3.3
+--
+--   path          = path-abempty    ; begins with "/" or is empty
+--                 / path-abs        ; begins with "/" but not "//"
+--                 / path-noscheme   ; begins with a non-colon segment
+--                 / path-rootless   ; begins with a segment
+--                 / path-empty      ; zero characters
+--
+--   path-abempty  = *( "/" segment )
+--   path-abs      = "/" [ segment-nz *( "/" segment ) ]
+--   path-noscheme = segment-nzc *( "/" segment )
+--   path-rootless = segment-nz *( "/" segment )
+--   path-empty    = 0<pchar>
+--
+--   segment       = *pchar
+--   segment-nz    = 1*pchar
+--   segment-nzc   = 1*( unreserved / pct-encoded / sub-delims / "@" )
+--
+--   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+
+{-
+upath :: URIParser String
+upath = pathAbEmpty
+    <|> pathAbs
+    <|> pathNoScheme
+    <|> pathRootLess
+    <|> pathEmpty
+-}
+
+pathAbEmpty :: URIParser String
+pathAbEmpty =
+    do  { ss <- many slashSegment
+        ; return $ concat ss
+        }
+
+pathAbs :: URIParser String
+pathAbs =
+    do  { char '/'
+        ; ss <- option "" pathRootLess
+        ; return $ '/':ss
+        }
+
+pathNoScheme :: URIParser String
+pathNoScheme =
+    do  { s1 <- segmentNzc
+        ; ss <- many slashSegment
+        ; return $ concat (s1:ss)
+        }
+
+pathRootLess :: URIParser String
+pathRootLess =
+    do  { s1 <- segmentNz
+        ; ss <- many slashSegment
+        ; return $ concat (s1:ss)
+        }
+
+slashSegment :: URIParser String
+slashSegment =
+    do  { char '/'
+        ; s <- segment
+        ; return ('/':s)
+        }
+
+segment :: URIParser String
+segment =
+    do  { ps <- many pchar
+        ; return $ concat ps
+        }
+
+segmentNz :: URIParser String
+segmentNz =
+    do  { ps <- many1 pchar
+        ; return $ concat ps
+        }
+
+segmentNzc :: URIParser String
+segmentNzc =
+    do  { ps <- many1 (uchar "@")
+        ; return $ concat ps
+        }
+
+pchar :: URIParser String
+pchar = uchar ":@"
+
+-- helper function for pchar and friends
+uchar :: String -> URIParser String
+uchar extras =
+        unreservedChar
+    <|> escaped
+    <|> subDelims
+    <|> do { c <- oneOf extras ; return [c] }
+
+--  RFC3986, section 3.4
+
+uquery :: URIParser String
+uquery =
+    do  { ss <- many $ uchar (":@"++"/?")
+        ; return $ '?':concat ss
+        }
+
+--  RFC3986, section 3.5
+
+ufragment :: URIParser String
+ufragment =
+    do  { ss <- many $ uchar (":@"++"/?")
+        ; return $ '#':concat ss
+        }
+
+--  Reference, Relative and Absolute URI forms
+--
+--  RFC3986, section 4.1
+
+uriReference :: URIParser URI
+uriReference = uri <|> relativeRef
+
+--  RFC3986, section 4.2
+--
+--   relative-URI  = relative-part [ "?" query ] [ "#" fragment ]
+--
+--   relative-part = "//" authority path-abempty
+--                 / path-abs
+--                 / path-noscheme
+--                 / path-empty
+
+relativeRef :: URIParser URI
+relativeRef =
+    do  { notMatching uscheme
+        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )
+        -- ; up <- upath
+        ; (ua,up) <- relativePart
+        ; uq <- option "" ( do { char '?' ; uquery    } )
+        ; uf <- option "" ( do { char '#' ; ufragment } )
+        ; return $ URI
+            { uriScheme    = ""
+            , uriAuthority = ua
+            , uriPath      = up
+            , uriQuery     = uq
+            , uriFragment  = uf
+            }
+        }
+
+relativePart :: URIParser ((Maybe URIAuth),String)
+relativePart =
+        do  { try (string "//")
+            ; ua <- uauthority
+            ; up <- pathAbEmpty
+            ; return (ua,up)
+            }
+    <|> do  { up <- pathAbs
+            ; return (Nothing,up)
+            }
+    <|> do  { up <- pathNoScheme
+            ; return (Nothing,up)
+            }
+    <|> do  { return (Nothing,"")
+            }
+
+--  RFC3986, section 4.3
+
+absoluteURI :: URIParser URI
+absoluteURI =
+    do  { us <- uscheme
+        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )
+        -- ; up <- upath
+        ; (ua,up) <- hierPart
+        ; uq <- option "" ( do { char '?' ; uquery    } )
+        ; return $ URI
+            { uriScheme    = us
+            , uriAuthority = ua
+            , uriPath      = up
+            , uriQuery     = uq
+            , uriFragment  = ""
+            }
+        }
+
+--  Imports from RFC 2234
+
+    -- NOTE: can't use isAlphaNum etc. because these deal with ISO 8859
+    -- (and possibly Unicode!) chars.
+    -- [[[Above was a comment originally in GHC Network/URI.hs:
+    --    when IRIs are introduced then most codepoints above 128(?) should
+    --    be treated as unreserved, and higher codepoints for letters should
+    --    certainly be allowed.
+    -- ]]]
+
+isAlphaChar :: Char -> Bool
+isAlphaChar c    = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
+
+isDigitChar :: Char -> Bool
+isDigitChar c    = (c >= '0' && c <= '9')
+
+isAlphaNumChar :: Char -> Bool
+isAlphaNumChar c = isAlphaChar c || isDigitChar c
+
+isHexDigitChar :: Char -> Bool
+isHexDigitChar c = isHexDigit c
+
+isSchemeChar :: Char -> Bool
+isSchemeChar c   = (isAlphaNumChar c) || (c `elem` "+-.")
+
+alphaChar :: URIParser Char
+alphaChar = satisfy isAlphaChar         -- or: Parsec.letter ?
+
+digitChar :: URIParser Char
+digitChar = satisfy isDigitChar         -- or: Parsec.digit ?
+
+alphaNumChar :: URIParser Char
+alphaNumChar = satisfy isAlphaNumChar
+
+hexDigitChar :: URIParser Char
+hexDigitChar = satisfy isHexDigitChar   -- or: Parsec.hexDigit ?
+
+--  Additional parser combinators for common patterns
+
+oneThenMany :: GenParser t s a -> GenParser t s a -> GenParser t s [a]
+oneThenMany p1 pr =
+    do  { a1 <- p1
+        ; ar <- many pr
+        ; return (a1:ar)
+        }
+
+countMinMax :: Int -> Int -> GenParser t s a -> GenParser t s [a]
+countMinMax m n p | m > 0 =
+    do  { a1 <- p
+        ; ar <- countMinMax (m-1) (n-1) p
+        ; return (a1:ar)
+        }
+countMinMax _ n _ | n <= 0 = return []
+countMinMax _ n p = option [] $
+    do  { a1 <- p
+        ; ar <- countMinMax 0 (n-1) p
+        ; return (a1:ar)
+        }
+
+notMatching :: Show a => GenParser tok st a -> GenParser tok st ()
+notMatching p = do { a <- try p ; unexpected (show a) } <|> return ()
+
+------------------------------------------------------------
+--  Reconstruct a URI string
+------------------------------------------------------------
+--
+-- |Turn a 'URI' into a string.
+--
+--  Uses a supplied function to map the userinfo part of the URI.
+--
+--  The Show instance for URI uses a mapping that hides any password
+--  that may be present in the URI.  Use this function with argument @id@
+--  to preserve the password in the formatted output.
+--
+uriToString :: (String->String) -> URI -> ShowS
+uriToString userinfomap URI { uriScheme=myscheme
+                            , uriAuthority=myauthority
+                            , uriPath=mypath
+                            , uriQuery=myquery
+                            , uriFragment=myfragment
+                            } =
+    (myscheme++) . (uriAuthToString userinfomap myauthority)
+               . (mypath++) . (myquery++) . (myfragment++)
+
+uriAuthToString :: (String->String) -> (Maybe URIAuth) -> ShowS
+uriAuthToString _           Nothing   = id          -- shows ""
+uriAuthToString userinfomap
+        (Just URIAuth { uriUserInfo = myuinfo
+                      , uriRegName  = myregname
+                      , uriPort     = myport
+                      } ) =
+    ("//"++) . (if null myuinfo then id else ((userinfomap myuinfo)++))
+             . (myregname++)
+             . (myport++)
+
+------------------------------------------------------------
+--  Character classes
+------------------------------------------------------------
+
+-- | Returns 'True' if the character is allowed in a URI.
+--
+isAllowedInURI :: Char -> Bool
+isAllowedInURI c = isReserved c || isUnreserved c || c == '%' -- escape char
+
+-- | Returns 'True' if the character is allowed unescaped in a URI.
+--
+isUnescapedInURI :: Char -> Bool
+isUnescapedInURI c = isReserved c || isUnreserved c
+
+-- | Returns 'True' if the character is allowed unescaped in a URI component.
+--
+isUnescapedInURIComponent :: Char -> Bool
+isUnescapedInURIComponent c = not (isReserved c || not (isUnescapedInURI c))
+
+------------------------------------------------------------
+--  Escape sequence handling
+------------------------------------------------------------
+
+-- |Escape character if supplied predicate is not satisfied,
+--  otherwise return character as singleton string.
+--
+escapeURIChar :: (Char->Bool) -> Char -> String
+escapeURIChar p c
+    | p c       = [c]
+    | otherwise = concatMap (\i -> '%' : myShowHex i "") (utf8EncodeChar c)
+    where
+        myShowHex :: Int -> ShowS
+        myShowHex n r =  case showIntAtBase 16 (toChrHex) n r of
+            []  -> "00"
+            [x] -> ['0',x]
+            cs  -> cs
+        toChrHex d
+            | d < 10    = chr (ord '0' + fromIntegral d)
+            | otherwise = chr (ord 'A' + fromIntegral (d - 10))
+
+-- From http://hackage.haskell.org/package/utf8-string
+-- by Eric Mertens, BSD3
+-- Returns [Int] for use with showIntAtBase
+utf8EncodeChar :: Char -> [Int]
+utf8EncodeChar = map fromIntegral . go . ord
+ where
+  go oc
+   | oc <= 0x7f       = [oc]
+
+   | oc <= 0x7ff      = [ 0xc0 + (oc `shiftR` 6)
+                        , 0x80 + oc .&. 0x3f
+                        ]
+
+   | oc <= 0xffff     = [ 0xe0 + (oc `shiftR` 12)
+                        , 0x80 + ((oc `shiftR` 6) .&. 0x3f)
+                        , 0x80 + oc .&. 0x3f
+                        ]
+   | otherwise        = [ 0xf0 + (oc `shiftR` 18)
+                        , 0x80 + ((oc `shiftR` 12) .&. 0x3f)
+                        , 0x80 + ((oc `shiftR` 6) .&. 0x3f)
+                        , 0x80 + oc .&. 0x3f
+                        ]
+
+-- |Can be used to make a string valid for use in a URI.
+--
+escapeURIString
+    :: (Char->Bool)     -- ^ a predicate which returns 'False'
+                        --   if the character should be escaped
+    -> String           -- ^ the string to process
+    -> String           -- ^ the resulting URI string
+escapeURIString p s = concatMap (escapeURIChar p) s
+
+-- |Turns all instances of escaped characters in the string back
+--  into literal characters.
+--
+unEscapeString :: String -> String
+unEscapeString [] = ""
+unEscapeString s@(c:cs) = case unEscapeByte s of
+    Just (byte, rest) -> unEscapeUtf8 byte rest
+    Nothing -> c : unEscapeString cs
+
+unEscapeByte :: String -> Maybe (Int, String)
+unEscapeByte ('%':x1:x2:s) | isHexDigit x1 && isHexDigit x2 =
+    Just (digitToInt x1 * 16 + digitToInt x2, s)
+unEscapeByte _ = Nothing
+
+-- Adapted from http://hackage.haskell.org/package/utf8-string
+-- by Eric Mertens, BSD3
+unEscapeUtf8 :: Int -> String -> String
+unEscapeUtf8 c rest
+    | c < 0x80 = chr c : unEscapeString rest
+    | c < 0xc0 = replacement_character : unEscapeString rest
+    | c < 0xe0 = multi1
+    | c < 0xf0 = multi_byte 2 0xf 0x800
+    | c < 0xf8 = multi_byte 3 0x7 0x10000
+    | c < 0xfc = multi_byte 4 0x3 0x200000
+    | c < 0xfe = multi_byte 5 0x1 0x4000000
+    | otherwise    = replacement_character : unEscapeString rest
+    where
+    replacement_character = '\xfffd'
+    multi1 = case unEscapeByte rest of
+      Just (c1, ds) | c1 .&. 0xc0 == 0x80 ->
+        let d = ((fromEnum c .&. 0x1f) `shiftL` 6) .|.  fromEnum (c1 .&. 0x3f)
+        in if d >= 0x000080 then toEnum d : unEscapeString ds
+                            else replacement_character : unEscapeString ds
+      _ -> replacement_character : unEscapeString rest
+
+    multi_byte i mask overlong =
+      aux i rest (unEscapeByte rest) (c .&. mask)
+      where
+        aux 0 rs _ acc
+          | overlong <= acc && acc <= 0x10ffff &&
+            (acc < 0xd800 || 0xdfff < acc)     &&
+            (acc < 0xfffe || 0xffff < acc)      = chr acc : unEscapeString rs
+          | otherwise = replacement_character : unEscapeString rs
+
+        aux n _ (Just (r, rs)) acc
+          | r .&. 0xc0 == 0x80 = aux (n-1) rs (unEscapeByte rs)
+                               $! shiftL acc 6 .|. (r .&. 0x3f)
+
+        aux _ rs _ _ = replacement_character : unEscapeString rs
+
+------------------------------------------------------------
+-- Resolving a relative URI relative to a base URI
+------------------------------------------------------------
+
+-- |Returns a new 'URI' which represents the value of the
+--  first 'URI' interpreted as relative to the second 'URI'.
+--  For example:
+--
+--  > "foo" `relativeTo` "http://bar.org/" = "http://bar.org/foo"
+--  > "http:foo" `nonStrictRelativeTo` "http://bar.org/" = "http://bar.org/foo"
+--
+--  Algorithm from RFC3986 [3], section 5.2.2
+--
+
+nonStrictRelativeTo :: URI -> URI -> URI
+nonStrictRelativeTo ref base = relativeTo ref' base
+    where
+        ref' = if uriScheme ref == uriScheme base
+               then ref { uriScheme="" }
+               else ref
+
+isDefined :: ( MonadPlus m, Eq (m a) ) => m a -> Bool
+isDefined a = a /= mzero
+
+-- | Returns a new 'URI' which represents the value of the first 'URI'
+-- interpreted as relative to the second 'URI'.
+--
+-- Algorithm from RFC3986 [3], section 5.2
+relativeTo :: URI -> URI -> URI
+relativeTo ref base
+    | isDefined ( uriScheme ref ) =
+        just_segments ref
+    | isDefined ( uriAuthority ref ) =
+        just_segments ref { uriScheme = uriScheme base }
+    | isDefined ( uriPath ref ) =
+        if (head (uriPath ref) == '/') then
+            just_segments ref
+                { uriScheme    = uriScheme base
+                , uriAuthority = uriAuthority base
+                }
+        else
+            just_segments ref
+                { uriScheme    = uriScheme base
+                , uriAuthority = uriAuthority base
+                , uriPath      = mergePaths base ref
+                }
+    | isDefined ( uriQuery ref ) =
+        just_segments ref
+            { uriScheme    = uriScheme base
+            , uriAuthority = uriAuthority base
+            , uriPath      = uriPath base
+            }
+    | otherwise =
+        just_segments ref
+            { uriScheme    = uriScheme base
+            , uriAuthority = uriAuthority base
+            , uriPath      = uriPath base
+            , uriQuery     = uriQuery base
+            }
+    where
+        just_segments u =
+            u { uriPath = removeDotSegments (uriPath u) }
+        mergePaths b r
+            | isDefined (uriAuthority b) && null pb = '/':pr
+            | otherwise                             = dropLast pb ++ pr
+            where
+                pb = uriPath b
+                pr = uriPath r
+        dropLast = fst . splitLast -- reverse . dropWhile (/='/') . reverse
+
+--  Remove dot segments, but protect leading '/' character
+removeDotSegments :: String -> String
+removeDotSegments ('/':ps) = '/':elimDots ps []
+removeDotSegments ps       = elimDots ps []
+
+--  Second arg accumulates segments processed so far in reverse order
+elimDots :: String -> [String] -> String
+-- elimDots ps rs | traceVal "\nps " ps $ traceVal "rs " rs $ False = error ""
+elimDots [] [] = ""
+elimDots [] rs = concat (reverse rs)
+elimDots (    '.':'/':ps)     rs = elimDots ps rs
+elimDots (    '.':[]    )     rs = elimDots [] rs
+elimDots (    '.':'.':'/':ps) rs = elimDots ps (drop 1 rs)
+elimDots (    '.':'.':[]    ) rs = elimDots [] (drop 1 rs)
+elimDots ps rs = elimDots ps1 (r:rs)
+    where
+        (r,ps1) = nextSegment ps
+
+--  Returns the next segment and the rest of the path from a path string.
+--  Each segment ends with the next '/' or the end of string.
+--
+nextSegment :: String -> (String,String)
+nextSegment ps =
+    case break (=='/') ps of
+        (r,'/':ps1) -> (r++"/",ps1)
+        (r,_)       -> (r,[])
+
+--  Split last (name) segment from path, returning (path,name)
+splitLast :: String -> (String,String)
+splitLast p = (reverse revpath,reverse revname)
+    where
+        (revname,revpath) = break (=='/') $ reverse p
+
+------------------------------------------------------------
+-- Finding a URI relative to a base URI
+------------------------------------------------------------
+
+-- |Returns a new 'URI' which represents the relative location of
+--  the first 'URI' with respect to the second 'URI'.  Thus, the
+--  values supplied are expected to be absolute URIs, and the result
+--  returned may be a relative URI.
+--
+--  Example:
+--
+--  > "http://example.com/Root/sub1/name2#frag"
+--  >   `relativeFrom` "http://example.com/Root/sub2/name2#frag"
+--  >   == "../sub1/name2#frag"
+--
+--  There is no single correct implementation of this function,
+--  but any acceptable implementation must satisfy the following:
+--
+--  > (uabs `relativeFrom` ubase) `relativeTo` ubase == uabs
+--
+--  For any valid absolute URI.
+--  (cf. <http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html>
+--       <http://lists.w3.org/Archives/Public/uri/2003Jan/0005.html>)
+--
+relativeFrom :: URI -> URI -> URI
+relativeFrom uabs base
+    | diff uriScheme    uabs base = uabs
+    | diff uriAuthority uabs base = uabs { uriScheme = "" }
+    | diff uriPath      uabs base = uabs
+        { uriScheme    = ""
+        , uriAuthority = Nothing
+        , uriPath      = relPathFrom (removeBodyDotSegments $ uriPath uabs)
+                                     (removeBodyDotSegments $ uriPath base)
+        }
+    | diff uriQuery     uabs base = uabs
+        { uriScheme    = ""
+        , uriAuthority = Nothing
+        , uriPath      = ""
+        }
+    | otherwise = uabs          -- Always carry fragment from uabs
+        { uriScheme    = ""
+        , uriAuthority = Nothing
+        , uriPath      = ""
+        , uriQuery     = ""
+        }
+    where
+        diff :: Eq b => (a -> b) -> a -> a -> Bool
+        diff sel u1 u2 = sel u1 /= sel u2
+        -- Remove dot segments except the final segment
+        removeBodyDotSegments p = removeDotSegments p1 ++ p2
+            where
+                (p1,p2) = splitLast p
+
+relPathFrom :: String -> String -> String
+relPathFrom []   _    = "/"
+relPathFrom pabs []   = pabs
+relPathFrom pabs base =                 -- Construct a relative path segments
+    if sa1 == sb1                       -- if the paths share a leading segment
+        then if (sa1 == "/")            -- other than a leading '/'
+            then if (sa2 == sb2)
+                then relPathFrom1 ra2 rb2
+                else pabs
+            else relPathFrom1 ra1 rb1
+        else pabs
+    where
+        (sa1,ra1) = nextSegment pabs
+        (sb1,rb1) = nextSegment base
+        (sa2,ra2) = nextSegment ra1
+        (sb2,rb2) = nextSegment rb1
+
+--  relPathFrom1 strips off trailing names from the supplied paths,
+--  and calls difPathFrom to find the relative path from base to
+--  target
+relPathFrom1 :: String -> String -> String
+relPathFrom1 pabs base = relName
+    where
+        (sa,na) = splitLast pabs
+        (sb,nb) = splitLast base
+        rp      = relSegsFrom sa sb
+        relName = if null rp then
+                      if (na == nb) then ""
+                      else if protect na then "./"++na
+                      else na
+                  else
+                      rp++na
+        -- Precede name with some path if it is null or contains a ':'
+        protect s = null s || ':' `elem` s
+
+--  relSegsFrom discards any common leading segments from both paths,
+--  then invokes difSegsFrom to calculate a relative path from the end
+--  of the base path to the end of the target path.
+--  The final name is handled separately, so this deals only with
+--  "directory" segtments.
+--
+relSegsFrom :: String -> String -> String
+{-
+relSegsFrom sabs base
+    | traceVal "\nrelSegsFrom\nsabs " sabs $ traceVal "base " base $
+      False = error ""
+-}
+relSegsFrom []   []   = ""      -- paths are identical
+relSegsFrom sabs base =
+    if sa1 == sb1
+        then relSegsFrom ra1 rb1
+        else difSegsFrom sabs base
+    where
+        (sa1,ra1) = nextSegment sabs
+        (sb1,rb1) = nextSegment base
+
+--  difSegsFrom calculates a path difference from base to target,
+--  not including the final name at the end of the path
+--  (i.e. results always ends with '/')
+--
+--  This function operates under the invariant that the supplied
+--  value of sabs is the desired path relative to the beginning of
+--  base.  Thus, when base is empty, the desired path has been found.
+--
+difSegsFrom :: String -> String -> String
+{-
+difSegsFrom sabs base
+    | traceVal "\ndifSegsFrom\nsabs " sabs $ traceVal "base " base $
+      False = error ""
+-}
+difSegsFrom sabs ""   = sabs
+difSegsFrom sabs base = difSegsFrom ("../"++sabs) (snd $ nextSegment base)
+
+------------------------------------------------------------
+--  Other normalization functions
+------------------------------------------------------------
+
+-- |Case normalization; cf. RFC3986 section 6.2.2.1
+--  NOTE:  authority case normalization is not performed
+--
+normalizeCase :: String -> String
+normalizeCase uristr = ncScheme uristr
+    where
+        ncScheme (':':cs)                = ':':ncEscape cs
+        ncScheme (c:cs) | isSchemeChar c = toLower c:ncScheme cs
+        ncScheme _                       = ncEscape uristr -- no scheme present
+        ncEscape ('%':h1:h2:cs) = '%':toUpper h1:toUpper h2:ncEscape cs
+        ncEscape (c:cs)         = c:ncEscape cs
+        ncEscape []             = []
+
+-- |Encoding normalization; cf. RFC3986 section 6.2.2.2
+--
+normalizeEscape :: String -> String
+normalizeEscape ('%':h1:h2:cs)
+    | isHexDigit h1 && isHexDigit h2 && isUnreserved escval =
+        escval:normalizeEscape cs
+    where
+        escval = chr (digitToInt h1*16+digitToInt h2)
+normalizeEscape (c:cs)         = c:normalizeEscape cs
+normalizeEscape []             = []
+
+-- |Path segment normalization; cf. RFC3986 section 6.2.2.4
+--
+normalizePathSegments :: String -> String
+normalizePathSegments uristr = normstr juri
+    where
+        juri = parseURI uristr
+        normstr Nothing  = uristr
+        normstr (Just u) = show (normuri u)
+        normuri u = u { uriPath = removeDotSegments (uriPath u) }
+
+------------------------------------------------------------
+--  Local trace helper functions
+------------------------------------------------------------
+
+traceShow :: Show a => String -> a -> a
+traceShow msg x = trace (msg ++ show x) x
+
+traceVal :: Show a => String -> a -> b -> b
+traceVal msg x y = trace (msg ++ show x) y
+
+------------------------------------------------------------
+--  Deprecated functions
+------------------------------------------------------------
+
+{-# DEPRECATED parseabsoluteURI "use parseAbsoluteURI" #-}
+parseabsoluteURI :: String -> Maybe URI
+parseabsoluteURI = parseAbsoluteURI
+
+{-# DEPRECATED escapeString "use escapeURIString, and note the flipped arguments" #-}
+escapeString :: String -> (Char->Bool) -> String
+escapeString = flip escapeURIString
+
+{-# DEPRECATED reserved "use isReserved" #-}
+reserved :: Char -> Bool
+reserved = isReserved
+
+{-# DEPRECATED unreserved "use isUnreserved" #-}
+unreserved :: Char -> Bool
+unreserved = isUnreserved
+
+--  Additional component access functions for backward compatibility
+
+{-# DEPRECATED scheme "use uriScheme" #-}
+scheme :: URI -> String
+scheme = orNull init . uriScheme
+
+{-# DEPRECATED authority "use uriAuthority, and note changed functionality" #-}
+authority :: URI -> String
+authority = dropss . ($"") . uriAuthToString id . uriAuthority
+    where
+        -- Old-style authority component does not include leading '//'
+        dropss ('/':'/':s) = s
+        dropss s           = s
+
+{-# DEPRECATED path "use uriPath" #-}
+path :: URI -> String
+path = uriPath
+
+{-# DEPRECATED query "use uriQuery, and note changed functionality" #-}
+query :: URI -> String
+query = orNull tail . uriQuery
+
+{-# DEPRECATED fragment "use uriFragment, and note changed functionality" #-}
+fragment :: URI -> String
+fragment = orNull tail . uriFragment
+
+orNull :: ([a]->[a]) -> [a] -> [a]
+orNull _ [] = []
+orNull f as = f as
+
+--------------------------------------------------------------------------------
+--
+--  Copyright (c) 2004, G. KLYNE.  All rights reserved.
+--  Distributed as free software under the following license.
+--
+--  Redistribution and use in source and binary forms, with or without
+--  modification, are permitted provided that the following conditions
+--  are met:
+--
+--  - Redistributions of source code must retain the above copyright notice,
+--  this list of conditions and the following disclaimer.
+--
+--  - Redistributions in binary form must reproduce the above copyright
+--  notice, this list of conditions and the following disclaimer in the
+--  documentation and/or other materials provided with the distribution.
+--
+--  - Neither name of the copyright holders nor the names of its
+--  contributors may be used to endorse or promote products derived from
+--  this software without specific prior written permission.
+--
+--  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS
+--  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+--  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+--  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+--  HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+--  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+--  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+--  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+--  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+--  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+--  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+--------------------------------------------------------------------------------
diff --git a/standalone/android/tmp/network-2.4.1.2/README b/standalone/android/tmp/network-2.4.1.2/README
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/README
@@ -0,0 +1,4 @@
+To build this package using Cabal directly from git, you must run
+"autoreconf" before the usual Cabal build steps (configure/build/install).
+autoreconf is included in the GNU autoconf tools.  There is no need to run
+the "configure" script: the "setup configure" step will do this for you.
diff --git a/standalone/android/tmp/network-2.4.1.2/Setup.hs b/standalone/android/tmp/network-2.4.1.2/Setup.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/Setup.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+import Distribution.Simple
+
+main :: IO ()
+main = defaultMainWithHooks autoconfUserHooks
diff --git a/standalone/android/tmp/network-2.4.1.2/cabal.config b/standalone/android/tmp/network-2.4.1.2/cabal.config
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cabal.config
@@ -0,0 +1,208 @@
+constraints: Crypto ==4.2.5.1,
+             DAV ==1.0.3,
+             HTTP ==4000.2.17,
+             HUnit ==1.2.5.2,
+             IfElse ==0.85,
+             MissingH ==1.2.1.0,
+             MonadRandom ==0.1.13,
+             QuickCheck ==2.7.6,
+             SafeSemaphore ==0.10.1,
+             aeson ==0.7.0.6,
+             ansi-terminal ==0.6.1.1,
+             ansi-wl-pprint ==0.6.7.1,
+             appar ==0.1.4,
+             asn1-encoding ==0.8.1.3,
+             asn1-parse ==0.8.1,
+             asn1-types ==0.2.3,
+             async ==2.0.1.5,
+             attoparsec ==0.11.3.4,
+             attoparsec-conduit ==1.1.0,
+             authenticate ==1.3.2.10,
+             base-unicode-symbols ==0.2.2.4,
+             base16-bytestring ==0.1.1.6,
+             base64-bytestring ==1.0.0.1,
+             bifunctors ==4.1.1.1,
+             bloomfilter ==2.0.0.0,
+             byteable ==0.1.1,
+             byteorder ==1.0.4,
+             case-insensitive ==1.2.0.1,
+             cereal ==0.4.0.1,
+             cipher-aes ==0.2.8,
+             cipher-des ==0.0.6,
+             cipher-rc4 ==0.1.4,
+             clientsession ==0.9.0.3,
+             comonad ==4.2,
+             conduit ==1.1.6,
+             conduit-extra ==1.1.3,
+             connection ==0.2.3,
+             contravariant ==0.6.1.1,
+             cookie ==0.4.1.2,
+             cprng-aes ==0.5.2,
+             crypto-api ==0.13.2,
+             crypto-cipher-types ==0.0.9,
+             crypto-numbers ==0.2.3,
+             crypto-pubkey ==0.2.4,
+             crypto-pubkey-types ==0.4.2.2,
+             crypto-random ==0.0.7,
+             cryptohash ==0.11.6,
+             cryptohash-conduit ==0.1.1,
+             css-text ==0.1.2.1,
+             shakespeare-text ==1.0.2,
+             data-default ==0.5.3,
+             data-default-class ==0.0.1,
+             data-default-instances-base ==0.0.1,
+             data-default-instances-containers ==0.0.1,
+             data-default-instances-dlist ==0.0.1,
+             data-default-instances-old-locale ==0.0.1,
+             sandi ==0.3.0.1,
+             dbus ==0.10.8,
+             distributive ==0.4.4,
+             dlist ==0.7.0.1,
+             dns ==1.3.0,
+             edit-distance ==0.2.1.2,
+             either ==4.3,
+             email-validate ==1.0.0,
+             entropy ==0.2.1,
+             errors ==1.4.7,
+             exceptions ==0.6.1,
+             failure ==0.2.0.3,
+             fast-logger ==2.1.5,
+             fdo-notify ==0.3.1,
+             feed ==0.3.9.2,
+             file-embed ==0.0.6,
+             fingertree ==0.1.0.0,
+             free ==4.9,
+             gnuidn ==0.2,
+             gnutls ==0.1.4,
+             gsasl ==0.3.5,
+             hS3 ==0.5.7,
+             hamlet ==1.1.9.2,
+             hashable ==1.2.1.0,
+             hinotify ==0.3.5,
+             hjsmin ==0.1.4.7,
+             hslogger ==1.2.1,
+             http-client ==0.4.11.1,
+             http-client-tls ==0.2.2,
+             http-conduit ==2.1.5,
+             http-date ==0.0.2,
+             http-types ==0.8.5,
+             hxt ==9.3.1.4,
+             hxt-charproperties ==9.1.1.1,
+             hxt-regex-xmlschema ==9.0.4,
+             hxt-unicode ==9.0.2.2,
+             idna ==0.2,
+             iproute ==1.2.11,
+             json ==0.5,
+             keys ==3.10.1,
+             language-javascript ==0.5.13,
+             lens ==4.4.0.2,
+             libxml-sax ==0.7.5,
+             mime-mail ==0.4.1.2,
+             mime-types ==0.1.0.4,
+             mmorph ==1.0.3,
+             monad-control ==0.3.2.2,
+             monad-logger ==0.3.6.1,
+             monad-loops ==0.4.2.1,
+             monads-tf ==0.1.0.2,
+             mtl ==2.1.2,
+             nats ==0.1.2,
+             network ==2.4.1.2,
+             network-conduit ==1.1.0,
+             network-info ==0.2.0.5,
+             network-multicast ==0.0.10,
+             network-protocol-xmpp ==0.4.6,
+             network-uri ==2.6.0.1,
+             optparse-applicative ==0.10.0,
+             parallel ==3.2.0.4,
+             path-pieces ==0.1.4,
+             pem ==0.2.2,
+             persistent ==1.3.3,
+             persistent-template ==1.3.2.2,
+             pointed ==4.0,
+             prelude-extras ==0.4,
+             profunctors ==4.0.4,
+             publicsuffixlist ==0.1,
+             punycode ==2.0,
+             random ==1.0.1.1,
+             ranges ==0.2.4,
+             reducers ==3.10.2.1,
+             reflection ==1.2.0.1,
+             regex-base ==0.93.2,
+             regex-compat ==0.95.1,
+             regex-posix ==0.95.2,
+             regex-tdfa ==1.2.0,
+             resource-pool ==0.2.1.1,
+             resourcet ==1.1.2.3,
+             safe ==0.3.8,
+             securemem ==0.1.3,
+             semigroupoids ==4.2,
+             semigroups ==0.15.3,
+             shakespeare ==1.2.1.1,
+             shakespeare-css ==1.0.7.4,
+             shakespeare-i18n ==1.0.0.5,
+             shakespeare-js ==1.2.0.4,
+             silently ==1.2.4.1,
+             simple-sendfile ==0.2.14,
+             skein ==1.0.9,
+             socks ==0.5.4,
+             split ==0.2.2,
+             stm ==2.4.2,
+             stm-chans ==3.0.0.2,
+             streaming-commons ==0.1.4.1,
+             stringprep ==0.1.5,
+             stringsearch ==0.3.6.5,
+             syb ==0.4.0,
+             system-fileio ==0.3.14,
+             system-filepath ==0.4.12,
+             tagged ==0.7.2,
+             tagsoup ==0.13.1,
+             tagstream-conduit ==0.5.5.1,
+             tasty ==0.10,
+             tasty-hunit ==0.9,
+             tasty-quickcheck ==0.8.1,
+             tasty-rerun ==1.1.3,
+             text ==1.1.1.0,
+             text-icu ==0.6.3.7,
+             tf-random ==0.5,
+             tls ==1.2.9,
+             transformers ==0.3.0.0,
+             transformers-base ==0.4.1,
+             transformers-compat ==0.3.3.3,
+             unbounded-delays ==0.1.0.8,
+             unix-compat ==0.4.1.3,
+             unix-time ==0.2.2,
+             unordered-containers ==0.2.5.0,
+             utf8-string ==0.3.7,
+             uuid ==1.3.3,
+             vault ==0.3.0.3,
+             vector ==0.10.0.1,
+             void ==0.6.1,
+             wai ==3.0.1.1,
+             wai-app-static ==3.0.0.1,
+             wai-extra ==3.0.1.2,
+             wai-logger ==2.1.1,
+             warp ==3.0.0.5,
+             warp-tls ==3.0.0,
+             word8 ==0.1.1,
+             x509 ==1.4.11,
+             x509-store ==1.4.4,
+             x509-system ==1.4.5,
+             x509-validation ==1.5.0,
+             xml ==1.3.13,
+             xml-conduit ==1.2.1,
+             xml-hamlet ==0.4.0.9,
+             xml-types ==0.3.4,
+             xss-sanitize ==0.3.5.2,
+             yaml ==0.8.9.3,
+             yesod ==1.2.6.1,
+             yesod-auth ==1.3.4.6,
+             yesod-core ==1.2.20.1,
+             yesod-default ==1.2.0,
+             yesod-form ==1.3.16,
+             yesod-persistent ==1.2.3.1,
+             yesod-routes ==1.2.0.7,
+             yesod-static ==1.2.4,
+             zlib ==0.5.4.1,
+             bytestring ==0.10.4.0,
+             scientific ==0.3.3.1,
+             clock ==0.4.6.0
diff --git a/standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c b/standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c
@@ -0,0 +1,22 @@
+/* -----------------------------------------------------------------------------
+ * (c) The University of Glasgow 2002
+ *
+ * static versions of the inline functions from HsNet.h
+ * -------------------------------------------------------------------------- */
+
+#define INLINE
+#include "HsNet.h"
+
+#include <sys/endian.h>
+uint16_t my_htons(uint16_t v)
+{
+	htons(v);
+}
+uint32_t my_htonl(uint32_t v)
+{
+	htonl(v);
+}
+uint16_t my_ntohs(uint16_t v)
+{
+	ntohs(v);
+}
diff --git a/standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c b/standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c
@@ -0,0 +1,123 @@
+/*
+ *  Copyright(c), 2002 The GHC Team.
+ */
+
+#ifdef aix_HOST_OS
+#define _LINUX_SOURCE_COMPAT 
+// Required to get CMSG_SPACE/CMSG_LEN macros.  See #265.
+// Alternative is to #define COMPAT_43 and use the 
+// HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS code instead, but that means
+// fiddling with the configure script too.
+#endif
+
+#include "HsNet.h"
+#include <string.h>
+
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL || HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS /* until end */
+
+/* 
+ *  Support for transmitting file descriptors.
+ *
+ *  
+ */
+ 
+
+/*
+ * sendmsg() and recvmsg() wrappers for transmitting
+ * ancillary socket data.
+ *
+ * Doesn't provide the full generality of either, specifically:
+ *
+ *  - no support for scattered read/writes.
+ *  - only possible to send one ancillary chunk of data at a time.
+ */
+
+int
+sendFd(int sock,
+       int outfd)
+{
+  struct msghdr msg = {0};
+  struct iovec iov[1];
+  char  buf[2];
+#if HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
+  msg.msg_accrights = (void*)&outfd;
+  msg.msg_accrightslen = sizeof(int);
+#else
+  struct cmsghdr *cmsg;
+  char ancBuffer[CMSG_SPACE(sizeof(int))];
+  char* dPtr;
+  
+  msg.msg_control = ancBuffer;
+  msg.msg_controllen = sizeof(ancBuffer);
+
+  cmsg = CMSG_FIRSTHDR(&msg);
+  cmsg->cmsg_level = SOL_SOCKET;
+  cmsg->cmsg_type = SCM_RIGHTS;
+  cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+  dPtr = (char*)CMSG_DATA(cmsg);
+  
+  *(int*)dPtr = outfd;
+  msg.msg_controllen = cmsg->cmsg_len;
+#endif
+
+  buf[0] = 0; buf[1] = '\0';
+  iov[0].iov_base = buf;
+  iov[0].iov_len  = 2;
+
+  msg.msg_iov = iov;
+  msg.msg_iovlen = 1;
+  
+  return sendmsg(sock,&msg,0);
+}
+
+int
+recvFd(int sock)
+{
+  struct msghdr msg = {0};
+  char  duffBuf[10];
+  int rc;
+  int len = sizeof(int);
+  struct iovec iov[1];
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
+  struct cmsghdr *cmsg = NULL;
+  struct cmsghdr *cptr;
+#else
+  int* fdBuffer;
+#endif
+
+  iov[0].iov_base = duffBuf;
+  iov[0].iov_len  = sizeof(duffBuf);
+  msg.msg_iov = iov;
+  msg.msg_iovlen = 1;
+
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
+  cmsg = (struct cmsghdr*)malloc(CMSG_SPACE(len));
+  if (cmsg==NULL) {
+    return -1;
+  }
+  
+  msg.msg_control = (void *)cmsg;
+  msg.msg_controllen = CMSG_LEN(len);
+#else
+  fdBuffer = (int*)malloc(len);
+  if (fdBuffer) {
+    msg.msg_accrights    = (void *)fdBuffer;
+  } else {
+    return -1;
+  }
+  msg.msg_accrightslen = len;
+#endif
+
+  if ((rc = recvmsg(sock,&msg,0)) < 0) {
+    return rc;
+  }
+  
+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL
+  cptr = (struct cmsghdr*)CMSG_FIRSTHDR(&msg);
+  return *(int*)CMSG_DATA(cptr);
+#else
+  return *(int*)fdBuffer;
+#endif
+}
+
+#endif
diff --git a/standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c b/standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c
@@ -0,0 +1,72 @@
+/*
+ * (c) sof, 2003.
+ */
+
+#include "HsNet.h"
+#include "HsFFI.h"
+
+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+
+/* all the way to the end */
+
+/*
+ * To support non-blocking accept()s with WinSock, we use the asyncDoProc#
+ * primop, which lets a Haskell thread call an external routine without
+ * blocking the progress of other threads. 
+ *
+ * As can readily be seen, this is a low-level mechanism.
+ *
+ */
+
+typedef struct AcceptData {
+    int   fdSock;
+    int   newSock;
+    void* sockAddr;
+    int   size;
+} AcceptData;
+
+/*
+ * Fill in parameter block that's passed along when the RTS invokes the 
+ * accept()-calling proc below (acceptDoProc())
+ */
+void*
+newAcceptParams(int sock,
+		int sz,
+		void* sockaddr)
+{
+    AcceptData* data = (AcceptData*)malloc(sizeof(AcceptData));
+    if (!data) return NULL;
+    data->fdSock   = sock;
+    data->newSock  = 0;
+    data->sockAddr = sockaddr;
+    data->size     = sz;
+    
+    return data;
+}
+
+/* Accessors for return code and accept()'s socket result. */
+
+int
+acceptNewSock(void* d)
+{
+    return (((AcceptData*)d)->newSock);
+}
+
+/* Routine invoked by an RTS worker thread */
+int
+acceptDoProc(void* param)
+{
+    SOCKET s;
+
+    AcceptData* data = (AcceptData*)param;
+    s = accept( data->fdSock,
+		data->sockAddr,
+		&data->size);
+    data->newSock = s;
+    if ( s == INVALID_SOCKET ) {
+	return GetLastError();
+    } else {
+	return 0;
+    }
+}
+#endif
diff --git a/standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c b/standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c
@@ -0,0 +1,52 @@
+#include "HsNet.h"
+#include "HsFFI.h"
+
+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+
+static int winsock_inited = 0;
+static int winsock_uninited = 0;
+
+/* Initialising WinSock... */
+int
+initWinSock ()
+{
+  WORD wVersionRequested;
+  WSADATA wsaData;  
+  int err;
+
+  if (!winsock_inited) {
+    wVersionRequested = MAKEWORD( 2, 2 );
+
+    err = WSAStartup ( wVersionRequested, &wsaData );
+    
+    if ( err != 0 ) {
+       return err;
+    }
+
+    if ( LOBYTE( wsaData.wVersion ) != 2 ||
+       HIBYTE( wsaData.wVersion ) != 2 ) {
+      WSACleanup();
+      return (-1);
+    }
+
+    winsock_inited = 1;
+  }
+  return 0;
+}
+
+static void
+shutdownHandler(void)
+{
+  WSACleanup();
+}
+
+void
+shutdownWinSock()
+{
+    if (!winsock_uninited) {
+	atexit(shutdownHandler);
+	winsock_uninited = 1;
+    }
+}
+
+#endif
diff --git a/standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c b/standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c
@@ -0,0 +1,76 @@
+#include "HsNet.h"
+#include "HsFFI.h"
+
+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+#include <stdio.h>
+
+/* to the end */
+
+const char*
+getWSErrorDescr(int err)
+{
+  static char  otherErrMsg[256];
+
+  switch (err) {
+  case WSAEINTR:  return "Interrupted function call (WSAEINTR)";
+  case WSAEBADF:  return "bad socket descriptor (WSAEBADF)";
+  case WSAEACCES: return "Permission denied (WSAEACCESS)";
+  case WSAEFAULT: return "Bad address (WSAEFAULT)";
+  case WSAEINVAL: return "Invalid argument (WSAEINVAL)";
+  case WSAEMFILE: return "Too many open files (WSAEMFILE)";
+  case WSAEWOULDBLOCK:  return "Resource temporarily unavailable (WSAEWOULDBLOCK)";
+  case WSAEINPROGRESS:  return "Operation now in progress (WSAEINPROGRESS)";
+  case WSAEALREADY:     return "Operation already in progress (WSAEALREADY)";
+  case WSAENOTSOCK:     return "Socket operation on non-socket (WSAENOTSOCK)";
+  case WSAEDESTADDRREQ: return "Destination address required (WSAEDESTADDRREQ)";
+  case WSAEMSGSIZE:    	return "Message too long (WSAEMSGSIZE)";
+  case WSAEPROTOTYPE:   return "Protocol wrong type for socket (WSAEPROTOTYPE)";
+  case WSAENOPROTOOPT:  return "Bad protocol option (WSAENOPROTOOPT)";
+  case WSAEPROTONOSUPPORT: return "Protocol not supported (WSAEPROTONOSUPPORT)";
+  case WSAESOCKTNOSUPPORT: return "Socket type not supported (WSAESOCKTNOSUPPORT)";
+  case WSAEOPNOTSUPP:      return "Operation not supported (WSAEOPNOTSUPP)";
+  case WSAEPFNOSUPPORT:    return "Protocol family not supported (WSAEPFNOSUPPORT)";
+  case WSAEAFNOSUPPORT:    return "Address family not supported by protocol family (WSAEAFNOSUPPORT)";
+  case WSAEADDRINUSE:      return "Address already in use (WSAEADDRINUSE)";
+  case WSAEADDRNOTAVAIL:   return "Cannot assign requested address (WSAEADDRNOTAVAIL)";
+  case WSAENETDOWN:        return "Network is down (WSAENETDOWN)";
+  case WSAENETUNREACH:     return "Network is unreachable (WSAENETUNREACH)";
+  case WSAENETRESET:       return "Network dropped connection on reset (WSAENETRESET)";
+  case WSAECONNABORTED:    return "Software caused connection abort (WSAECONNABORTED)";
+  case WSAECONNRESET:      return "Connection reset by peer (WSAECONNRESET)";
+  case WSAENOBUFS:         return "No buffer space available (WSAENOBUFS)";
+  case WSAEISCONN:         return "Socket is already connected (WSAEISCONN)";
+  case WSAENOTCONN:        return "Socket is not connected (WSAENOTCONN)";
+  case WSAESHUTDOWN:       return "Cannot send after socket shutdown (WSAESHUTDOWN)";
+  case WSAETOOMANYREFS:    return "Too many references (WSAETOOMANYREFS)";
+  case WSAETIMEDOUT:       return "Connection timed out (WSAETIMEDOUT)";
+  case WSAECONNREFUSED:    return "Connection refused (WSAECONNREFUSED)";
+  case WSAELOOP:           return "Too many levels of symbolic links (WSAELOOP)";
+  case WSAENAMETOOLONG:    return "Filename too long (WSAENAMETOOLONG)";
+  case WSAEHOSTDOWN:       return "Host is down (WSAEHOSTDOWN)";
+  case WSAEHOSTUNREACH:    return "Host is unreachable (WSAEHOSTUNREACH)";
+  case WSAENOTEMPTY:       return "Resource not empty (WSAENOTEMPTY)";
+  case WSAEPROCLIM:        return "Too many processes (WSAEPROCLIM)";
+  case WSAEUSERS:          return "Too many users (WSAEUSERS)";
+  case WSAEDQUOT:          return "Disk quota exceeded (WSAEDQUOT)";
+  case WSAESTALE:          return "Stale NFS file handle (WSAESTALE)";
+  case WSAEREMOTE:         return "Too many levels of remote in path (WSAEREMOTE)";
+  case WSAEDISCON:         return "Graceful shutdown in progress (WSAEDISCON)";
+  case WSASYSNOTREADY:     return "Network subsystem is unavailable (WSASYSNOTREADY)";
+  case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range (WSAVERNOTSUPPORTED)";
+  case WSANOTINITIALISED:  return "Successful WSAStartup not yet performed (WSANOTINITIALISED)";
+#ifdef WSATYPE_NOT_FOUND
+  case WSATYPE_NOT_FOUND:  return "Class type not found (WSATYPE_NOT_FOUND)";
+#endif
+  case WSAHOST_NOT_FOUND:  return "Host not found (WSAHOST_NOT_FOUND)";
+  case WSATRY_AGAIN:       return "Nonauthoritative host not found (WSATRY_AGAIN)";
+  case WSANO_RECOVERY:     return "This is a nonrecoverable error (WSANO_RECOVERY)";
+  case WSANO_DATA:         return "Valid name, no data record of requested type (WSANO_DATA)";
+  default:
+    sprintf(otherErrMsg, "Unknown WinSock error: %u", err);
+    return otherErrMsg;
+  }
+}
+
+#endif
+
diff --git a/standalone/android/tmp/network-2.4.1.2/config.guess b/standalone/android/tmp/network-2.4.1.2/config.guess
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/config.guess
@@ -0,0 +1,1420 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
+
+timestamp='2014-03-23'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2014 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/standalone/android/tmp/network-2.4.1.2/config.sub b/standalone/android/tmp/network-2.4.1.2/config.sub
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/config.sub
@@ -0,0 +1,1799 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
+
+timestamp='2014-09-11'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2014 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 | or1k | or1knd | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/standalone/android/tmp/network-2.4.1.2/configure b/standalone/android/tmp/network-2.4.1.2/configure
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/configure
@@ -0,0 +1,5327 @@
+#! /bin/sh
+set -- --host=arm-linux-androideabi
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for Haskell network package 2.3.0.14.
+#
+# Report bugs to <libraries@haskell.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: libraries@haskell.org about your system, including any
+$0: error possibly output before this message. Then install
+$0: a modern shell, or manually run the script under such a
+$0: shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='Haskell network package'
+PACKAGE_TARNAME='network'
+PACKAGE_VERSION='2.3.0.14'
+PACKAGE_STRING='Haskell network package 2.3.0.14'
+PACKAGE_BUGREPORT='libraries@haskell.org'
+PACKAGE_URL=''
+
+ac_unique_file="include/HsNet.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+EXTRA_SRCS
+EXTRA_LIBS
+EXTRA_CPPFLAGS
+CALLCONV
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_cc
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures Haskell network package 2.3.0.14 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/network]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of Haskell network package 2.3.0.14:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+C compiler
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <libraries@haskell.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+Haskell network package configure 2.3.0.14
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to libraries@haskell.org ##
+## ------------------------------------ ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by Haskell network package $as_me 2.3.0.14, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_includes_default="$ac_includes_default
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+// fix for MingW not defining IPV6_V6ONLY
+# define IPV6_V6ONLY 27
+#endif
+#ifdef HAVE_WSPIAPI_H
+# include <wspiapi.h>
+#endif"
+
+# Safety check: Ensure that we are in the correct source directory.
+
+
+ac_config_headers="$ac_config_headers include/HsNetworkConfig.h"
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+# Check whether --with-cc was given.
+if test "${with_cc+set}" = set; then :
+  withval=$with_cc; CC=$withval
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this sort of thing.  */
+  typedef int charset[2];
+  const charset cs = { 0, 0 };
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in readlink symlink
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+"
+if test "x$ac_cv_member_struct_msghdr_msg_control" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1
+_ACEOF
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+"
+if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1
+_ACEOF
+
+
+fi
+
+
+ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+"
+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
+_ACEOF
+
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for in_addr_t in netinet/in.h" >&5
+$as_echo_n "checking for in_addr_t in netinet/in.h... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <netinet/in.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "in_addr_t" >/dev/null 2>&1; then :
+
+$as_echo "#define HAVE_IN_ADDR_T 1" >>confdefs.h
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f conftest*
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SO_PEERCRED and struct ucred in sys/socket.h" >&5
+$as_echo_n "checking for SO_PEERCRED and struct ucred in sys/socket.h... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_ucred=yes
+else
+  ac_cv_ucred=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if test "x$ac_cv_ucred" = xno; then
+    old_CFLAGS="$CFLAGS"
+    CFLAGS="-D_GNU_SOURCE $CFLAGS"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_ucred=yes
+else
+  ac_cv_ucred=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test "x$ac_cv_ucred" = xyes; then
+        EXTRA_CPPFLAGS=-D_GNU_SOURCE
+    fi
+else
+    old_CFLAGS="$CFLAGS"
+fi
+if test "x$ac_cv_ucred" = xno; then
+    CFLAGS="$old_CFLAGS"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+else
+
+$as_echo "#define HAVE_STRUCT_UCRED 1" >>confdefs.h
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _head_libws2_32_a in -lws2_32" >&5
+$as_echo_n "checking for _head_libws2_32_a in -lws2_32... " >&6; }
+if ${ac_cv_lib_ws2_32__head_libws2_32_a+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lws2_32  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _head_libws2_32_a ();
+int
+main ()
+{
+return _head_libws2_32_a ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ws2_32__head_libws2_32_a=yes
+else
+  ac_cv_lib_ws2_32__head_libws2_32_a=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32__head_libws2_32_a" >&5
+$as_echo "$ac_cv_lib_ws2_32__head_libws2_32_a" >&6; }
+if test "x$ac_cv_lib_ws2_32__head_libws2_32_a" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBWS2_32 1
+_ACEOF
+
+  LIBS="-lws2_32 $LIBS"
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5
+$as_echo_n "checking for getaddrinfo... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int testme(){ getaddrinfo; }
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+ ac_have_getaddrinfo=yes; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test "x$ac_have_getaddrinfo" = x; then
+  old_CFLAGS="$CFLAGS"
+  if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then
+    CFLAGS="-DWINVER=0x0501 $CFLAGS"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo if WINVER is 0x0501" >&5
+$as_echo_n "checking for getaddrinfo if WINVER is 0x0501... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+    int testme(){ getaddrinfo; }
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+
+$as_echo "#define NEED_WINVER_XP 1" >>confdefs.h
+ EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  CFLAGS="$old_CFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  fi
+fi
+
+for ac_func in gai_strerror
+do :
+  ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror"
+if test "x$ac_cv_func_gai_strerror" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GAI_STRERROR 1
+_ACEOF
+
+fi
+done
+
+
+ac_fn_c_check_decl "$LINENO" "AI_ADDRCONFIG" "ac_cv_have_decl_AI_ADDRCONFIG" "$ac_includes_default"
+if test "x$ac_cv_have_decl_AI_ADDRCONFIG" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_AI_ADDRCONFIG $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "AI_ALL" "ac_cv_have_decl_AI_ALL" "$ac_includes_default"
+if test "x$ac_cv_have_decl_AI_ALL" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_AI_ALL $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "AI_NUMERICSERV" "ac_cv_have_decl_AI_NUMERICSERV" "$ac_includes_default"
+if test "x$ac_cv_have_decl_AI_NUMERICSERV" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_AI_NUMERICSERV $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "AI_V4MAPPED" "ac_cv_have_decl_AI_V4MAPPED" "$ac_includes_default"
+if test "x$ac_cv_have_decl_AI_V4MAPPED" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_AI_V4MAPPED $ac_have_decl
+_ACEOF
+
+
+ac_fn_c_check_decl "$LINENO" "IPV6_V6ONLY" "ac_cv_have_decl_IPV6_V6ONLY" "$ac_includes_default"
+if test "x$ac_cv_have_decl_IPV6_V6ONLY" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_IPV6_V6ONLY $ac_have_decl
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/sendfile.h" >&5
+$as_echo_n "checking for sendfile in sys/sendfile.h... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/sendfile.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sendfile" >/dev/null 2>&1; then :
+
+$as_echo "#define HAVE_LINUX_SENDFILE 1" >>confdefs.h
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f conftest*
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/socket.h" >&5
+$as_echo_n "checking for sendfile in sys/socket.h... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/socket.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sendfile" >/dev/null 2>&1; then :
+
+$as_echo "#define HAVE_BSD_SENDFILE 1" >>confdefs.h
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f conftest*
+
+
+for ac_func in gethostent
+do :
+  ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent"
+if test "x$ac_cv_func_gethostent" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETHOSTENT 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in accept4
+do :
+  ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4"
+if test "x$ac_cv_func_accept4" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_ACCEPT4 1
+_ACEOF
+
+fi
+done
+
+
+case "$host" in
+*-mingw32)
+	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"
+	EXTRA_LIBS=ws2_32
+	CALLCONV=stdcall ;;
+*-solaris2*)
+	EXTRA_SRCS="cbits/ancilData.c"
+	EXTRA_LIBS="nsl, socket"
+	CALLCONV=ccall ;;
+*)
+	EXTRA_SRCS="cbits/ancilData.c"
+	EXTRA_LIBS=
+	CALLCONV=ccall ;;
+esac
+
+
+
+
+
+ac_config_files="$ac_config_files network.buildinfo"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by Haskell network package $as_me 2.3.0.14, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <libraries@haskell.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+Haskell network package config.status 2.3.0.14
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "include/HsNetworkConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsNetworkConfig.h" ;;
+    "network.buildinfo") CONFIG_FILES="$CONFIG_FILES network.buildinfo" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+ ;;
+
+
+  esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/standalone/android/tmp/network-2.4.1.2/configure.ac b/standalone/android/tmp/network-2.4.1.2/configure.ac
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/configure.ac
@@ -0,0 +1,184 @@
+AC_INIT([Haskell network package], [2.3.0.14], [libraries@haskell.org], [network])
+
+ac_includes_default="$ac_includes_default
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+// fix for MingW not defining IPV6_V6ONLY
+# define IPV6_V6ONLY 27
+#endif
+#ifdef HAVE_WSPIAPI_H
+# include <wspiapi.h>
+#endif"
+
+# Safety check: Ensure that we are in the correct source directory.
+AC_CONFIG_SRCDIR([include/HsNet.h])
+
+AC_CONFIG_HEADERS([include/HsNetworkConfig.h])
+
+AC_CANONICAL_HOST
+
+AC_ARG_WITH([cc],
+            [C compiler],
+            [CC=$withval])
+AC_PROG_CC()
+
+AC_C_CONST
+
+dnl ** check for specific header (.h) files that we are interested in
+AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h])
+AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h])
+
+AC_CHECK_FUNCS([readlink symlink])
+
+dnl ** check what fields struct msghdr contains
+AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights], [], [], [#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif])
+
+dnl ** check if struct sockaddr contains sa_len
+AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif])
+
+dnl --------------------------------------------------
+dnl * test for in_addr_t
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for in_addr_t in netinet/in.h)
+AC_EGREP_HEADER(in_addr_t, netinet/in.h,
+ [ AC_DEFINE([HAVE_IN_ADDR_T], [1], [Define to 1 if in_addr_t is available.]) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
+dnl --------------------------------------------------
+dnl * test for SO_PEERCRED and struct ucred
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for SO_PEERCRED and struct ucred in sys/socket.h)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)
+if test "x$ac_cv_ucred" = xno; then
+    old_CFLAGS="$CFLAGS"
+    CFLAGS="-D_GNU_SOURCE $CFLAGS"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)
+    if test "x$ac_cv_ucred" = xyes; then
+        EXTRA_CPPFLAGS=-D_GNU_SOURCE
+    fi
+else
+    old_CFLAGS="$CFLAGS"
+fi
+if test "x$ac_cv_ucred" = xno; then
+    CFLAGS="$old_CFLAGS"
+    AC_MSG_RESULT(no)
+else
+    AC_DEFINE([HAVE_STRUCT_UCRED], [1], [Define to 1 if you have both SO_PEERCRED and struct ucred.])
+    AC_MSG_RESULT(yes)
+fi
+
+dnl --------------------------------------------------
+dnl * check for Windows networking libraries
+dnl --------------------------------------------------
+AC_CHECK_LIB(ws2_32, _head_libws2_32_a)
+
+dnl --------------------------------------------------
+dnl * test for getaddrinfo as proxy for IPv6 support
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for getaddrinfo)
+dnl Can't use AC_CHECK_FUNC here, because it doesn't do the right
+dnl thing on Windows.
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default
+int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) ac_have_getaddrinfo=yes; AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])
+
+dnl Under mingw, we may need to set WINVER to 0x0501 to expose getaddrinfo.
+if test "x$ac_have_getaddrinfo" = x; then
+  old_CFLAGS="$CFLAGS"
+  if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then
+    CFLAGS="-DWINVER=0x0501 $CFLAGS"
+    AC_MSG_CHECKING(for getaddrinfo if WINVER is 0x0501)
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default
+    int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) AC_DEFINE([NEED_WINVER_XP], [1], [Define to 1 if the `getaddrinfo' function needs WINVER set.]) EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; AC_MSG_RESULT(yes)],[CFLAGS="$old_CFLAGS"; AC_MSG_RESULT(no)])
+  fi
+fi
+
+dnl Missing under mingw, sigh.
+AC_CHECK_FUNCS(gai_strerror)
+
+dnl -------------------------------------------------------
+dnl * test for AI_* flags that not all implementations have
+dnl -------------------------------------------------------
+AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED])
+
+dnl -------------------------------------------------------
+dnl * test for IPV6_V6ONLY flags that not all implementations have
+dnl -------------------------------------------------------
+AC_CHECK_DECLS([IPV6_V6ONLY])
+
+dnl --------------------------------------------------
+dnl * test for Linux sendfile(2)
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for sendfile in sys/sendfile.h)
+AC_EGREP_HEADER(sendfile, sys/sendfile.h,
+ [ AC_DEFINE([HAVE_LINUX_SENDFILE], [1], [Define to 1 if you have a Linux sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
+dnl --------------------------------------------------
+dnl * test for BSD sendfile(2)
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for sendfile in sys/socket.h)
+AC_EGREP_HEADER(sendfile, sys/socket.h,
+ [ AC_DEFINE([HAVE_BSD_SENDFILE], [1], [Define to 1 if you have a BSDish sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],
+ AC_MSG_RESULT(no))
+
+AC_CHECK_FUNCS(gethostent)
+
+AC_CHECK_FUNCS(accept4)
+
+case "$host" in
+*-mingw32)
+	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"
+	EXTRA_LIBS=ws2_32
+	CALLCONV=stdcall ;;
+*-solaris2*)
+	EXTRA_SRCS="cbits/ancilData.c"
+	EXTRA_LIBS="nsl, socket"
+	CALLCONV=ccall ;;
+*)
+	EXTRA_SRCS="cbits/ancilData.c"
+	EXTRA_LIBS=
+	CALLCONV=ccall ;;
+esac
+AC_SUBST([CALLCONV])
+AC_SUBST([EXTRA_CPPFLAGS])
+AC_SUBST([EXTRA_LIBS])
+AC_SUBST([EXTRA_SRCS])
+
+AC_CONFIG_FILES([network.buildinfo])
+
+AC_OUTPUT
diff --git a/standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs b/standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs
@@ -0,0 +1,18 @@
+-- Echo client program
+module Main where
+
+import Network.Socket hiding (recv)
+import Network.Socket.ByteString (recv, sendAll)
+import qualified Data.ByteString.Char8 as C
+
+main :: IO ()
+main = withSocketsDo $
+    do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")
+       let serveraddr = head addrinfos
+       sock <- socket (addrFamily serveraddr) Stream defaultProtocol
+       connect sock (addrAddress serveraddr)
+       sendAll sock $ C.pack "Hello, world!"
+       msg <- recv sock 1024
+       sClose sock
+       putStr "Received "
+       C.putStrLn msg
diff --git a/standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs b/standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs
@@ -0,0 +1,27 @@
+-- Echo server program
+module Main where
+
+import Control.Monad (unless)
+import Network.Socket hiding (recv)
+import qualified Data.ByteString as S
+import Network.Socket.ByteString (recv, sendAll)
+
+main :: IO ()
+main = withSocketsDo $
+    do addrinfos <- getAddrInfo
+                    (Just (defaultHints {addrFlags = [AI_PASSIVE]}))
+                    Nothing (Just "3000")
+       let serveraddr = head addrinfos
+       sock <- socket (addrFamily serveraddr) Stream defaultProtocol
+       bindSocket sock (addrAddress serveraddr)
+       listen sock 1
+       (conn, _) <- accept sock
+       talk conn
+       sClose conn
+       sClose sock
+
+    where
+      talk :: Socket -> IO ()
+      talk conn =
+          do msg <- recv conn 1024
+             unless (S.null msg) $ sendAll conn msg >> talk conn
diff --git a/standalone/android/tmp/network-2.4.1.2/include/HsNet.h b/standalone/android/tmp/network-2.4.1.2/include/HsNet.h
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/include/HsNet.h
@@ -0,0 +1,179 @@
+/* -----------------------------------------------------------------------------
+ *
+ * Definitions for package `net' which are visible in Haskell land.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef HSNET_H
+#define HSNET_H
+
+#include "HsNetworkConfig.h"
+
+#ifdef NEED_WINVER
+# define WINVER 0x0501
+#endif
+
+/* ultra-evil... */
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+
+#ifndef INLINE
+# if defined(_MSC_VER)
+#  define INLINE extern __inline
+# elif defined(__GNUC__)
+#  define INLINE extern inline
+# else
+#  define INLINE inline
+# endif
+#endif
+
+#ifdef HAVE_GETADDRINFO
+# define IPV6_SOCKET_SUPPORT 1
+#else
+# undef IPV6_SOCKET_SUPPORT
+#endif
+
+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+#include <winsock2.h>
+# ifdef HAVE_WS2TCPIP_H
+#  include <ws2tcpip.h>
+// fix for MingW not defining IPV6_V6ONLY
+#  define IPV6_V6ONLY 27
+# endif
+# ifdef HAVE_WSPIAPI_H
+#  include <wspiapi.h>
+# endif
+
+extern void  shutdownWinSock();
+extern int   initWinSock ();
+extern const char* getWSErrorDescr(int err);
+extern void* newAcceptParams(int sock,
+			     int sz,
+			     void* sockaddr);
+extern int   acceptNewSock(void* d);
+extern int   acceptDoProc(void* param);
+
+#else
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_UIO_H
+# include <sys/uio.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_TCP_H
+# include <netinet/tcp.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_BSD_SENDFILE
+#include <sys/uio.h>
+#endif
+#ifdef HAVE_LINUX_SENDFILE
+#if !defined(__USE_FILE_OFFSET64)
+#include <sys/sendfile.h>
+#endif
+#endif
+
+extern int
+sendFd(int sock, int outfd);
+
+extern int
+recvFd(int sock);
+
+#endif /* HAVE_WINSOCK2_H && !__CYGWIN */
+
+INLINE char *
+my_inet_ntoa(
+#if defined(HAVE_WINSOCK2_H)
+             u_long addr
+#elif defined(HAVE_IN_ADDR_T)
+             in_addr_t addr
+#elif defined(HAVE_INTTYPES_H)
+             u_int32_t addr
+#else
+             unsigned long addr
+#endif
+	    )
+{ 
+    struct in_addr a;
+    a.s_addr = addr;
+    return inet_ntoa(a);
+}
+
+#ifdef HAVE_GETADDRINFO
+INLINE int
+hsnet_getnameinfo(const struct sockaddr* a,socklen_t b, char* c,
+# if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)
+                  DWORD d, char* e, DWORD f, int g)
+# else
+                  socklen_t d, char* e, socklen_t f, int g)
+# endif
+{
+  return getnameinfo(a,b,c,d,e,f,g);
+}
+
+INLINE int
+hsnet_getaddrinfo(const char *hostname, const char *servname,
+		  const struct addrinfo *hints, struct addrinfo **res)
+{
+    return getaddrinfo(hostname, servname, hints, res);
+}
+
+INLINE void
+hsnet_freeaddrinfo(struct addrinfo *ai)
+{
+    freeaddrinfo(ai);
+}
+#endif
+
+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)
+# define WITH_WINSOCK  1
+#endif
+
+#if !defined(mingw32_HOST_OS) && !defined(_WIN32)
+# define DOMAIN_SOCKET_SUPPORT 1
+#endif
+
+#if !defined(CALLCONV)
+# if defined(WITH_WINSOCK)
+#  define CALLCONV stdcall
+# else
+#  define CALLCONV ccall
+# endif
+#endif
+
+#if !defined(IOV_MAX)
+# define IOV_MAX 1024
+#endif
+
+#endif /* HSNET_H */
diff --git a/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h b/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h
@@ -0,0 +1,154 @@
+/* include/HsNetworkConfig.h.  Generated from HsNetworkConfig.h.in by configure.  */
+/* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the `accept4' function. */
+/* #undef HAVE_ACCEPT4 */
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have a BSDish sendfile(2) implementation. */
+#define HAVE_BSD_SENDFILE 1
+
+/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you
+   don't. */
+#define HAVE_DECL_AI_ADDRCONFIG 1
+
+/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.
+   */
+#define HAVE_DECL_AI_ALL 1
+
+/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if
+   you don't. */
+#define HAVE_DECL_AI_NUMERICSERV 1
+
+/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you
+   don't. */
+#define HAVE_DECL_AI_V4MAPPED 1
+
+/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you
+   don't. */
+#define HAVE_DECL_IPV6_V6ONLY 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `gai_strerror' function. */
+#define HAVE_GAI_STRERROR 1
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `gethostent' function. */
+#define HAVE_GETHOSTENT 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if in_addr_t is available. */
+#define HAVE_IN_ADDR_T 1
+
+/* Define to 1 if you have the `ws2_32' library (-lws2_32). */
+/* #undef HAVE_LIBWS2_32 */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have a Linux sendfile(2) implementation. */
+/* #undef HAVE_LINUX_SENDFILE */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#define HAVE_NETINET_TCP_H 1
+
+/* Define to 1 if you have the `readlink' function. */
+#define HAVE_READLINK 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if `msg_accrights' is a member of `struct msghdr'. */
+/* #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
+
+/* Define to 1 if `msg_control' is a member of `struct msghdr'. */
+#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1
+
+/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
+
+/* Define to 1 if you have both SO_PEERCRED and struct ucred. */
+/* #undef HAVE_STRUCT_UCRED */
+
+/* Define to 1 if you have the `symlink' function. */
+#define HAVE_SYMLINK 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+#define HAVE_SYS_UN_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+/* #undef HAVE_WINSOCK2_H */
+
+/* Define to 1 if you have the <ws2tcpip.h> header file. */
+/* #undef HAVE_WS2TCPIP_H */
+
+/* Define to 1 if you have the <wspiapi.h> header file. */
+/* #undef HAVE_WSPIAPI_H */
+
+/* Define to 1 if the `getaddrinfo' function needs WINVER set. */
+/* #undef NEED_WINVER_XP */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "libraries@haskell.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "Haskell network package"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "Haskell network package 2.3.0.14"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "network"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.3.0.14"
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
diff --git a/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in b/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in
@@ -0,0 +1,153 @@
+/* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the `accept4' function. */
+#undef HAVE_ACCEPT4
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have a BSDish sendfile(2) implementation. */
+#undef HAVE_BSD_SENDFILE
+
+/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you
+   don't. */
+#undef HAVE_DECL_AI_ADDRCONFIG
+
+/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.
+   */
+#undef HAVE_DECL_AI_ALL
+
+/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if
+   you don't. */
+#undef HAVE_DECL_AI_NUMERICSERV
+
+/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you
+   don't. */
+#undef HAVE_DECL_AI_V4MAPPED
+
+/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you
+   don't. */
+#undef HAVE_DECL_IPV6_V6ONLY
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `gai_strerror' function. */
+#undef HAVE_GAI_STRERROR
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `gethostent' function. */
+#undef HAVE_GETHOSTENT
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if in_addr_t is available. */
+#undef HAVE_IN_ADDR_T
+
+/* Define to 1 if you have the `ws2_32' library (-lws2_32). */
+#undef HAVE_LIBWS2_32
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have a Linux sendfile(2) implementation. */
+#undef HAVE_LINUX_SENDFILE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#undef HAVE_NETINET_TCP_H
+
+/* Define to 1 if you have the `readlink' function. */
+#undef HAVE_READLINK
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if `msg_accrights' is a member of `struct msghdr'. */
+#undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
+
+/* Define to 1 if `msg_control' is a member of `struct msghdr'. */
+#undef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+
+/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+#undef HAVE_STRUCT_SOCKADDR_SA_LEN
+
+/* Define to 1 if you have both SO_PEERCRED and struct ucred. */
+#undef HAVE_STRUCT_UCRED
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#undef HAVE_SYS_UIO_H
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+#undef HAVE_SYS_UN_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define to 1 if you have the <ws2tcpip.h> header file. */
+#undef HAVE_WS2TCPIP_H
+
+/* Define to 1 if you have the <wspiapi.h> header file. */
+#undef HAVE_WSPIAPI_H
+
+/* Define to 1 if the `getaddrinfo' function needs WINVER set. */
+#undef NEED_WINVER_XP
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/standalone/android/tmp/network-2.4.1.2/install-sh b/standalone/android/tmp/network-2.4.1.2/install-sh
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/install-sh
@@ -0,0 +1,295 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2003-09-24.23
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=
+transform_arg=
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+
+usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
+   or: $0 -d DIR1 DIR2...
+
+In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
+In the second, create the directory path DIR.
+
+Options:
+-b=TRANSFORMBASENAME
+-c         copy source (using $cpprog) instead of moving (using $mvprog).
+-d         create directories instead of installing files.
+-g GROUP   $chgrp installed files to GROUP.
+-m MODE    $chmod installed files to MODE.
+-o USER    $chown installed files to USER.
+-s         strip installed files (using $stripprog).
+-t=TRANSFORM
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+        shift
+        continue;;
+
+    -c) instcmd=$cpprog
+        shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit 0;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+        shift
+        continue;;
+
+    --version) echo "$0 $scriptversion"; exit 0;;
+
+    *)  if test -z "$src"; then
+          src=$1
+        else
+          # this colon is to work around a 386BSD /bin/sh bug
+          :
+          dst=$1
+        fi
+        shift
+        continue;;
+  esac
+done
+
+if test -z "$src"; then
+  echo "$0: no input file specified." >&2
+  exit 1
+fi
+
+# Protect names starting with `-'.
+case $src in
+  -*) src=./$src ;;
+esac
+
+if test -n "$dir_arg"; then
+  dst=$src
+  src=
+
+  if test -d "$dst"; then
+    instcmd=:
+    chmodcmd=
+  else
+    instcmd=$mkdirprog
+  fi
+else
+  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+  # might cause directories to be created, which would be especially bad
+  # if $src (and thus $dsttmp) contains '*'.
+  if test ! -f "$src" && test ! -d "$src"; then
+    echo "$0: $src does not exist." >&2
+    exit 1
+  fi
+
+  if test -z "$dst"; then
+    echo "$0: no destination specified." >&2
+    exit 1
+  fi
+
+  # Protect names starting with `-'.
+  case $dst in
+    -*) dst=./$dst ;;
+  esac
+
+  # If destination is a directory, append the input filename; won't work
+  # if double slashes aren't ignored.
+  if test -d "$dst"; then
+    dst=$dst/`basename "$src"`
+  fi
+fi
+
+# This sed command emulates the dirname command.
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+
+# Skip lots of stat calls in the usual case.
+if test ! -d "$dstdir"; then
+  defaultIFS='
+	'
+  IFS="${IFS-$defaultIFS}"
+
+  oIFS=$IFS
+  # Some sh's can't handle IFS=/ for some reason.
+  IFS='%'
+  set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+  IFS=$oIFS
+
+  pathcomp=
+
+  while test $# -ne 0 ; do
+    pathcomp=$pathcomp$1
+    shift
+    test -d "$pathcomp" || $mkdirprog "$pathcomp"
+    pathcomp=$pathcomp/
+  done
+fi
+
+if test -n "$dir_arg"; then
+  $doit $instcmd "$dst" \
+    && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+    && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+    && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+else
+  # If we're going to rename the final executable, determine the name now.
+  if test -z "$transformarg"; then
+    dstfile=`basename "$dst"`
+  else
+    dstfile=`basename "$dst" $transformbasename \
+             | sed $transformarg`$transformbasename
+  fi
+
+  # don't allow the sed command to completely eliminate the filename.
+  test -z "$dstfile" && dstfile=`basename "$dst"`
+
+  # Make a couple of temp file names in the proper directory.
+  dsttmp=$dstdir/_inst.$$_
+  rmtmp=$dstdir/_rm.$$_
+
+  # Trap to clean up those temp files at exit.
+  trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Move or copy the file name to the temp name
+  $doit $instcmd "$src" "$dsttmp" &&
+
+  # and set any options; do chmod last to preserve setuid bits.
+  #
+  # If any of these fail, we abort the whole thing.  If we want to
+  # ignore errors from any of these, just make sure not to ignore
+  # errors from the above "$doit $instcmd $src $dsttmp" command.
+  #
+  { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+    && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+    && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+  # Now remove or move aside any old file at destination location.  We
+  # try this two ways since rm can't unlink itself on some systems and
+  # the destination file might be busy for other reasons.  In this case,
+  # the final cleanup might fail but the new file should still install
+  # successfully.
+  {
+    if test -f "$dstdir/$dstfile"; then
+      $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+      || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+      || {
+	  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+	  (exit 1); exit
+      }
+    else
+      :
+    fi
+  } &&
+
+  # Now rename the file to the real destination.
+  $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/standalone/android/tmp/network-2.4.1.2/network.buildinfo.in b/standalone/android/tmp/network-2.4.1.2/network.buildinfo.in
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/network.buildinfo.in
@@ -0,0 +1,5 @@
+ghc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@
+ghc-prof-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@
+cc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@
+c-sources: @EXTRA_SRCS@
+extra-libraries: @EXTRA_LIBS@
diff --git a/standalone/android/tmp/network-2.4.1.2/network.cabal b/standalone/android/tmp/network-2.4.1.2/network.cabal
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/network.cabal
@@ -0,0 +1,103 @@
+name:           network
+version:        2.4.1.2
+license:        BSD3
+license-file:   LICENSE
+maintainer:     Johan Tibell <johan.tibell@gmail.com>
+synopsis:       Low-level networking interface
+description:    Low-level networking interface
+category:       Network
+build-type:     Configure
+cabal-version:  >=1.8
+extra-tmp-files:
+  config.log config.status autom4te.cache network.buildinfo
+  include/HsNetworkConfig.h
+extra-source-files:
+  README examples/*.hs tests/*.hs config.guess config.sub install-sh
+  configure.ac configure network.buildinfo.in
+  include/HsNetworkConfig.h.in include/HsNet.h
+  -- C sources only used on some systems
+  cbits/ancilData.c cbits/asyncAccept.c cbits/initWinSock.c
+  cbits/winSockErr.c
+homepage:       https://github.com/haskell/network
+bug-reports:    https://github.com/haskell/network/issues
+
+library
+  exposed-modules:
+    Network
+    Network.BSD
+    Network.Socket
+    Network.Socket.ByteString
+    Network.Socket.ByteString.Lazy
+    Network.Socket.Internal
+    Network.URI
+  other-modules:
+    Network.Socket.ByteString.Internal
+    Network.Socket.Types
+
+  if !os(windows)
+    other-modules:
+      Network.Socket.ByteString.IOVec
+      Network.Socket.ByteString.MsgHdr
+
+  build-depends:
+    base >= 3 && < 5,
+    bytestring,
+    parsec >= 3.0
+
+  if !os(windows)
+    build-depends:
+      unix >= 2
+
+  extensions:
+    CPP, DeriveDataTypeable, ForeignFunctionInterface, TypeSynonymInstances
+  include-dirs: include
+  includes: HsNet.h
+  install-includes: HsNet.h HsNetworkConfig.h
+  c-sources: cbits/HsNet.c
+  if impl(ghc >= 6.8)
+    ghc-options: -fwarn-tabs
+
+test-suite simple
+  hs-source-dirs: tests
+  main-is: Simple.hs
+  type: exitcode-stdio-1.0
+
+  build-depends:
+    base < 5,
+    bytestring,
+    HUnit,
+    network,
+    test-framework,
+    test-framework-hunit
+
+test-suite regression
+  hs-source-dirs: tests
+  main-is: Regression.hs
+  type: exitcode-stdio-1.0
+
+  build-depends:
+    base < 5,
+    bytestring,
+    HUnit,
+    network,
+    test-framework,
+    test-framework-hunit
+
+  ghc-options: -Wall
+
+test-suite uri
+  hs-source-dirs: tests
+  main-is: uri001.hs
+  type: exitcode-stdio-1.0
+
+  build-depends:
+    base < 5,
+    HUnit,
+    network,
+    test-framework,
+    test-framework-hunit,
+    test-framework-quickcheck2
+
+source-repository head
+  type:     git
+  location: git://github.com/haskell/network.git
diff --git a/standalone/android/tmp/network-2.4.1.2/tests/Regression.hs b/standalone/android/tmp/network-2.4.1.2/tests/Regression.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/tests/Regression.hs
@@ -0,0 +1,31 @@
+-- | Tests for things that didn't work in the past.
+module Main where
+
+import Network.Socket
+import Test.Framework (Test, defaultMain)
+import Test.Framework.Providers.HUnit (testCase)
+
+------------------------------------------------------------------------
+-- Tests
+
+-- Used to segfault on OS X 10.8.2 due to AI_NUMERICSERV being set
+-- without a service being set. This is a OS X bug.
+testGetAddrInfo :: IO ()
+testGetAddrInfo = do
+    let hints = defaultHints { addrFlags = [AI_NUMERICSERV] }
+    _ <- getAddrInfo (Just hints) (Just "localhost") Nothing
+    return ()
+
+------------------------------------------------------------------------
+-- List of all tests
+
+tests :: [Test]
+tests =
+    [ testCase "testGetAddrInfo" testGetAddrInfo
+    ]
+
+------------------------------------------------------------------------
+-- Test harness
+
+main :: IO ()
+main = withSocketsDo $ defaultMain tests
diff --git a/standalone/android/tmp/network-2.4.1.2/tests/Simple.hs b/standalone/android/tmp/network-2.4.1.2/tests/Simple.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/tests/Simple.hs
@@ -0,0 +1,244 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Main where
+
+import Control.Concurrent (ThreadId, forkIO, myThreadId)
+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, readMVar)
+import qualified Control.Exception as E
+import qualified Data.ByteString as S
+import qualified Data.ByteString.Char8 as C
+import Network.Socket hiding (recv, recvFrom, send, sendTo)
+import Network.Socket.ByteString
+import Test.Framework (Test, defaultMain, testGroup)
+import Test.Framework.Providers.HUnit (testCase)
+import Test.HUnit (Assertion, (@=?))
+
+------------------------------------------------------------------------
+
+serverAddr :: String
+serverAddr = "127.0.0.1"
+
+testMsg :: S.ByteString
+testMsg = C.pack "This is a test message."
+
+------------------------------------------------------------------------
+-- Tests
+
+------------------------------------------------------------------------
+-- Sending and receiving
+
+testSend :: Assertion
+testSend = tcpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) testMsg
+    client sock = send sock testMsg
+
+testSendAll :: Assertion
+testSendAll = tcpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) testMsg
+    client sock = sendAll sock testMsg
+
+testSendTo :: Assertion
+testSendTo = udpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) testMsg
+    client sock serverPort = do
+        addr <- inet_addr serverAddr
+        sendTo sock testMsg (SockAddrInet serverPort addr)
+
+testSendAllTo :: Assertion
+testSendAllTo = udpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) testMsg
+    client sock serverPort = do
+        addr <- inet_addr serverAddr
+        sendAllTo sock testMsg (SockAddrInet serverPort addr)
+
+testSendMany :: Assertion
+testSendMany = tcpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) (S.append seg1 seg2)
+    client sock = sendMany sock [seg1, seg2]
+
+    seg1 = C.pack "This is a "
+    seg2 = C.pack "test message."
+
+testSendManyTo :: Assertion
+testSendManyTo = udpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) (S.append seg1 seg2)
+    client sock serverPort = do
+        addr <- inet_addr serverAddr
+        sendManyTo sock [seg1, seg2] (SockAddrInet serverPort addr)
+
+    seg1 = C.pack "This is a "
+    seg2 = C.pack "test message."
+
+testRecv :: Assertion
+testRecv = tcpTest client server
+  where
+    server sock = recv sock 1024 >>= (@=?) testMsg
+    client sock = send sock testMsg
+
+testOverFlowRecv :: Assertion
+testOverFlowRecv = tcpTest client server
+  where
+    server sock = do seg1 <- recv sock (S.length testMsg - 3)
+                     seg2 <- recv sock 1024
+                     let msg = S.append seg1 seg2
+                     testMsg @=? msg
+
+    client sock = send sock testMsg
+
+testRecvFrom :: Assertion
+testRecvFrom = tcpTest client server
+  where
+    server sock = do (msg, _) <- recvFrom sock 1024
+                     testMsg @=? msg
+
+    client sock = do
+        serverPort <- getPeerPort sock
+        addr <- inet_addr serverAddr
+        sendTo sock testMsg (SockAddrInet serverPort addr)
+
+testOverFlowRecvFrom :: Assertion
+testOverFlowRecvFrom = tcpTest client server
+  where
+    server sock = do (seg1, _) <- recvFrom sock (S.length testMsg - 3)
+                     (seg2, _) <- recvFrom sock 1024
+                     let msg = S.append seg1 seg2
+                     testMsg @=? msg
+
+    client sock = send sock testMsg
+
+------------------------------------------------------------------------
+-- Other
+
+------------------------------------------------------------------------
+-- List of all tests
+
+basicTests :: Test
+basicTests = testGroup "Basic socket operations"
+    [
+      -- Sending and receiving
+      testCase "testSend" testSend
+    , testCase "testSendAll" testSendAll
+    , testCase "testSendTo" testSendTo
+    , testCase "testSendAllTo" testSendAllTo
+    , testCase "testSendMany" testSendMany
+    , testCase "testSendManyTo" testSendManyTo
+    , testCase "testRecv" testRecv
+    , testCase "testOverFlowRecv" testOverFlowRecv
+    , testCase "testRecvFrom" testRecvFrom
+    , testCase "testOverFlowRecvFrom" testOverFlowRecvFrom
+    ]
+
+tests :: [Test]
+tests = [basicTests]
+
+------------------------------------------------------------------------
+-- Test helpers
+
+-- | Returns the 'PortNumber' of the peer. Will throw an 'error' if
+-- used on a non-IP socket.
+getPeerPort :: Socket -> IO PortNumber
+getPeerPort sock = do
+    sockAddr <- getPeerName sock
+    case sockAddr of
+        (SockAddrInet port _) -> return port
+        (SockAddrInet6 port _ _ _) -> return port
+        _ -> error "getPeerPort: only works with IP sockets"
+
+-- | Establish a connection between client and server and then run
+-- 'clientAct' and 'serverAct', in different threads.  Both actions
+-- get passed a connected 'Socket', used for communicating between
+-- client and server.  'tcpTest' makes sure that the 'Socket' is
+-- closed after the actions have run.
+tcpTest :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()
+tcpTest clientAct serverAct = do
+    portVar <- newEmptyMVar
+    test (clientSetup portVar) clientAct (serverSetup portVar) server
+  where
+    clientSetup portVar = do
+        sock <- socket AF_INET Stream defaultProtocol
+        addr <- inet_addr serverAddr
+        serverPort <- readMVar portVar
+        connect sock $ SockAddrInet serverPort addr
+        return sock
+
+    serverSetup portVar = do
+        sock <- socket AF_INET Stream defaultProtocol
+        setSocketOption sock ReuseAddr 1
+        addr <- inet_addr serverAddr
+        bindSocket sock (SockAddrInet aNY_PORT addr)
+        listen sock 1
+        serverPort <- socketPort sock
+        putMVar portVar serverPort
+        return sock
+
+    server sock = do
+        (clientSock, _) <- accept sock
+        serverAct clientSock
+        sClose clientSock
+
+-- | Create an unconnected 'Socket' for sending UDP and receiving
+-- datagrams and then run 'clientAct' and 'serverAct'.
+udpTest :: (Socket -> PortNumber -> IO a) -> (Socket -> IO b) -> IO ()
+udpTest clientAct serverAct = do
+    portVar <- newEmptyMVar
+    test clientSetup (client portVar) (serverSetup portVar) serverAct
+  where
+    clientSetup = socket AF_INET Datagram defaultProtocol
+
+    client portVar sock = do
+        serverPort <- readMVar portVar
+        clientAct sock serverPort
+
+    serverSetup portVar = do
+        sock <- socket AF_INET Datagram defaultProtocol
+        setSocketOption sock ReuseAddr 1
+        addr <- inet_addr serverAddr
+        bindSocket sock (SockAddrInet aNY_PORT addr)
+        serverPort <- socketPort sock
+        putMVar portVar serverPort
+        return sock
+
+-- | Run a client/server pair and synchronize them so that the server
+-- is started before the client and the specified server action is
+-- finished before the client closes the 'Socket'.
+test :: IO Socket -> (Socket -> IO b) -> IO Socket -> (Socket -> IO c) -> IO ()
+test clientSetup clientAct serverSetup serverAct = do
+    tid <- myThreadId
+    barrier <- newEmptyMVar
+    forkIO $ server barrier
+    client tid barrier
+  where
+    server barrier = do
+        E.bracket serverSetup sClose $ \sock -> do
+            serverReady
+            serverAct sock
+            putMVar barrier ()
+      where
+        -- | Signal to the client that it can proceed.
+        serverReady = putMVar barrier ()
+
+    client tid barrier = do
+        takeMVar barrier
+        -- Transfer exceptions to the main thread.
+        bracketWithReraise tid clientSetup sClose $ \res -> do
+            clientAct res
+            takeMVar barrier
+
+-- | Like 'bracket' but catches and reraises the exception in another
+-- thread, specified by the first argument.
+bracketWithReraise :: ThreadId -> IO a -> (a -> IO b) -> (a -> IO ()) -> IO ()
+bracketWithReraise tid before after thing =
+    E.bracket before after thing
+    `E.catch` \ (e :: E.SomeException) -> E.throwTo tid e
+
+------------------------------------------------------------------------
+-- Test harness
+
+main :: IO ()
+main = withSocketsDo $ defaultMain tests
diff --git a/standalone/android/tmp/network-2.4.1.2/tests/uri001.hs b/standalone/android/tmp/network-2.4.1.2/tests/uri001.hs
new file mode 100644
--- /dev/null
+++ b/standalone/android/tmp/network-2.4.1.2/tests/uri001.hs
@@ -0,0 +1,1431 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+--------------------------------------------------------------------------------
+--  $Id: URITest.hs,v 1.8 2005/07/19 22:01:27 gklyne Exp $
+--
+--  Copyright (c) 2004, G. KLYNE.  All rights reserved.
+--  See end of this file for licence information.
+--------------------------------------------------------------------------------
+-- |
+--  Module      :  URITest
+--  Copyright   :  (c) 2004, Graham Klyne
+--  License     :  BSD-style (see end of this file)
+--
+--  Maintainer  :  Graham Klyne
+--  Stability   :  provisional
+--  Portability :  H98
+--
+--  This Module contains test cases for module URI.
+--
+--  To run this test without using Cabal to build the package
+--  (2013-01-05, instructions tested on MacOS):
+--  1. Install Haskell platform
+--  2. cabal install test-framework
+--  3. cabal install test-framework-hunit
+--  4. ghc -XDeriveDataTypeable -D"MIN_VERSION_base(x,y,z)=1" ../Network/URI.hs uri001.hs
+--  5. ./uri001
+--
+--  Previous build instructions:
+--  Using GHC, I compile with this command line:
+--  ghc --make -fglasgow-exts
+--      -i..\;C:\Dev\Haskell\Lib\HUnit;C:\Dev\Haskell\Lib\Parsec
+--      -o URITest.exe URITest -main-is URITest.main
+--  The -i line may need changing for alternative installations.
+--
+--------------------------------------------------------------------------------
+
+module Main where
+
+import Network.URI
+    ( URI(..), URIAuth(..)
+    , nullURI
+    , parseURI, parseURIReference, parseRelativeReference, parseAbsoluteURI
+    , parseAbsoluteURI
+    , isURI, isURIReference, isRelativeReference, isAbsoluteURI
+    , uriIsAbsolute, uriIsRelative
+    , relativeTo, nonStrictRelativeTo
+    , relativeFrom
+    , uriToString
+    , isUnescapedInURIComponent
+    , isUnescapedInURI, escapeURIString, unEscapeString
+    , normalizeCase, normalizeEscape, normalizePathSegments
+    )
+
+import Test.HUnit
+
+import Data.Maybe (fromJust)
+import System.IO (openFile, IOMode(WriteMode), hClose)
+import qualified Test.Framework as TF
+import qualified Test.Framework.Providers.HUnit as TF
+import qualified Test.Framework.Providers.QuickCheck2 as TF
+
+-- Test supplied string for valid URI reference syntax
+--   isValidURIRef :: String -> Bool
+-- Test supplied string for valid absolute URI reference syntax
+--   isAbsoluteURIRef :: String -> Bool
+-- Test supplied string for valid absolute URI syntax
+--   isAbsoluteURI :: String -> Bool
+
+data URIType = AbsId    -- URI form (absolute, no fragment)
+             | AbsRf    -- Absolute URI reference
+             | RelRf    -- Relative URI reference
+             | InvRf    -- Invalid URI reference
+isValidT :: URIType -> Bool
+isValidT InvRf = False
+isValidT _     = True
+
+isAbsRfT :: URIType -> Bool
+isAbsRfT AbsId = True
+isAbsRfT AbsRf = True
+isAbsRfT _     = False
+
+isRelRfT :: URIType -> Bool
+isRelRfT RelRf = True
+isRelRfT _     = False
+
+isAbsIdT :: URIType -> Bool
+isAbsIdT AbsId = True
+isAbsIdT _     = False
+
+testEq :: (Eq a, Show a) => String -> a -> a -> Assertion
+testEq lab a1 a2 = assertEqual lab a1 a2
+
+testURIRef :: URIType -> String -> Assertion
+testURIRef t u = sequence_
+  [ testEq ("test_isURIReference:"++u) (isValidT t) (isURIReference u)
+  , testEq ("test_isRelativeReference:"++u)  (isRelRfT t) (isRelativeReference  u)
+  , testEq ("test_isAbsoluteURI:"++u)  (isAbsIdT t) (isAbsoluteURI  u)
+  ]
+
+testURIRefComponents :: String -> (Maybe URI) -> String -> Assertion
+testURIRefComponents _lab uv us =
+    testEq ("testURIRefComponents:"++us) uv (parseURIReference us)
+
+
+testURIRef001 = testURIRef AbsRf "http://example.org/aaa/bbb#ccc"
+testURIRef002 = testURIRef AbsId "mailto:local@domain.org"
+testURIRef003 = testURIRef AbsRf "mailto:local@domain.org#frag"
+testURIRef004 = testURIRef AbsRf "HTTP://EXAMPLE.ORG/AAA/BBB#CCC"
+testURIRef005 = testURIRef RelRf "//example.org/aaa/bbb#ccc"
+testURIRef006 = testURIRef RelRf "/aaa/bbb#ccc"
+testURIRef007 = testURIRef RelRf "bbb#ccc"
+testURIRef008 = testURIRef RelRf "#ccc"
+testURIRef009 = testURIRef RelRf "#"
+testURIRef010 = testURIRef RelRf "/"
+-- escapes
+testURIRef011 = testURIRef AbsRf "http://example.org/aaa%2fbbb#ccc"
+testURIRef012 = testURIRef AbsRf "http://example.org/aaa%2Fbbb#ccc"
+testURIRef013 = testURIRef RelRf "%2F"
+testURIRef014 = testURIRef RelRf "aaa%2Fbbb"
+-- ports
+testURIRef015 = testURIRef AbsRf "http://example.org:80/aaa/bbb#ccc"
+testURIRef016 = testURIRef AbsRf "http://example.org:/aaa/bbb#ccc"
+testURIRef017 = testURIRef AbsRf "http://example.org./aaa/bbb#ccc"
+testURIRef018 = testURIRef AbsRf "http://example.123./aaa/bbb#ccc"
+-- bare authority
+testURIRef019 = testURIRef AbsId "http://example.org"
+-- IPv6 literals (from RFC2732):
+testURIRef021 = testURIRef AbsId "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html"
+testURIRef022 = testURIRef AbsId "http://[1080:0:0:0:8:800:200C:417A]/index.html"
+testURIRef023 = testURIRef AbsId "http://[3ffe:2a00:100:7031::1]"
+testURIRef024 = testURIRef AbsId "http://[1080::8:800:200C:417A]/foo"
+testURIRef025 = testURIRef AbsId "http://[::192.9.5.5]/ipng"
+testURIRef026 = testURIRef AbsId "http://[::FFFF:129.144.52.38]:80/index.html"
+testURIRef027 = testURIRef AbsId "http://[2010:836B:4179::836B:4179]"
+testURIRef028 = testURIRef RelRf "//[2010:836B:4179::836B:4179]"
+testURIRef029 = testURIRef InvRf "[2010:836B:4179::836B:4179]"
+-- RFC2396 test cases
+testURIRef031 = testURIRef RelRf "./aaa"
+testURIRef032 = testURIRef RelRf "../aaa"
+testURIRef033 = testURIRef AbsId "g:h"
+testURIRef034 = testURIRef RelRf "g"
+testURIRef035 = testURIRef RelRf "./g"
+testURIRef036 = testURIRef RelRf "g/"
+testURIRef037 = testURIRef RelRf "/g"
+testURIRef038 = testURIRef RelRf "//g"
+testURIRef039 = testURIRef RelRf "?y"
+testURIRef040 = testURIRef RelRf "g?y"
+testURIRef041 = testURIRef RelRf "#s"
+testURIRef042 = testURIRef RelRf "g#s"
+testURIRef043 = testURIRef RelRf "g?y#s"
+testURIRef044 = testURIRef RelRf ";x"
+testURIRef045 = testURIRef RelRf "g;x"
+testURIRef046 = testURIRef RelRf "g;x?y#s"
+testURIRef047 = testURIRef RelRf "."
+testURIRef048 = testURIRef RelRf "./"
+testURIRef049 = testURIRef RelRf ".."
+testURIRef050 = testURIRef RelRf "../"
+testURIRef051 = testURIRef RelRf "../g"
+testURIRef052 = testURIRef RelRf "../.."
+testURIRef053 = testURIRef RelRf "../../"
+testURIRef054 = testURIRef RelRf "../../g"
+testURIRef055 = testURIRef RelRf "../../../g"
+testURIRef056 = testURIRef RelRf "../../../../g"
+testURIRef057 = testURIRef RelRf "/./g"
+testURIRef058 = testURIRef RelRf "/../g"
+testURIRef059 = testURIRef RelRf "g."
+testURIRef060 = testURIRef RelRf ".g"
+testURIRef061 = testURIRef RelRf "g.."
+testURIRef062 = testURIRef RelRf "..g"
+testURIRef063 = testURIRef RelRf "./../g"
+testURIRef064 = testURIRef RelRf "./g/."
+testURIRef065 = testURIRef RelRf "g/./h"
+testURIRef066 = testURIRef RelRf "g/../h"
+testURIRef067 = testURIRef RelRf "g;x=1/./y"
+testURIRef068 = testURIRef RelRf "g;x=1/../y"
+testURIRef069 = testURIRef RelRf "g?y/./x"
+testURIRef070 = testURIRef RelRf "g?y/../x"
+testURIRef071 = testURIRef RelRf "g#s/./x"
+testURIRef072 = testURIRef RelRf "g#s/../x"
+testURIRef073 = testURIRef RelRf ""
+testURIRef074 = testURIRef RelRf "A'C"
+testURIRef075 = testURIRef RelRf "A$C"
+testURIRef076 = testURIRef RelRf "A@C"
+testURIRef077 = testURIRef RelRf "A,C"
+-- Invalid
+testURIRef080 = testURIRef InvRf "http://foo.org:80Path/More"
+testURIRef081 = testURIRef InvRf "::"
+testURIRef082 = testURIRef InvRf " "
+testURIRef083 = testURIRef InvRf "%"
+testURIRef084 = testURIRef InvRf "A%Z"
+testURIRef085 = testURIRef InvRf "%ZZ"
+testURIRef086 = testURIRef InvRf "%AZ"
+testURIRef087 = testURIRef InvRf "A C"
+-- testURIRef088 = -- (case removed)
+-- testURIRef089 = -- (case removed)
+testURIRef090 = testURIRef InvRf "A\"C"
+testURIRef091 = testURIRef InvRf "A`C"
+testURIRef092 = testURIRef InvRf "A<C"
+testURIRef093 = testURIRef InvRf "A>C"
+testURIRef094 = testURIRef InvRf "A^C"
+testURIRef095 = testURIRef InvRf "A\\C"
+testURIRef096 = testURIRef InvRf "A{C"
+testURIRef097 = testURIRef InvRf "A|C"
+testURIRef098 = testURIRef InvRf "A}C"
+-- From RFC2396:
+-- rel_segment   = 1*( unreserved | escaped |
+--                     ";" | "@" | "&" | "=" | "+" | "$" | "," )
+-- unreserved    = alphanum | mark
+-- mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
+--                 "(" | ")"
+-- Note RFC 2732 allows '[', ']' ONLY for reserved purpose of IPv6 literals,
+-- or does it?
+testURIRef101 = testURIRef InvRf "A[C"
+testURIRef102 = testURIRef InvRf "A]C"
+testURIRef103 = testURIRef InvRf "A[**]C"
+testURIRef104 = testURIRef InvRf "http://[xyz]/"
+testURIRef105 = testURIRef InvRf "http://]/"
+testURIRef106 = testURIRef InvRf "http://example.org/[2010:836B:4179::836B:4179]"
+testURIRef107 = testURIRef InvRf "http://example.org/abc#[2010:836B:4179::836B:4179]"
+testURIRef108 = testURIRef InvRf "http://example.org/xxx/[qwerty]#a[b]"
+-- Random other things that crop up
+testURIRef111 = testURIRef AbsRf "http://example/Andr&#567;"
+testURIRef112 = testURIRef AbsId "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"
+testURIRef113 = testURIRef AbsId "http://46229EFFE16A9BD60B9F1BE88B2DB047ADDED785/demo.mp3"
+testURIRef114 = testURIRef InvRf "http://example.org/xxx/qwerty#a#b"
+testURIRef115 = testURIRef InvRf "dcp.tcp.pft://192.168.0.1:1002:3002?fec=1&crc=0"
+testURIRef116 = testURIRef AbsId "dcp.tcp.pft://192.168.0.1:1002?fec=1&crc=0"
+testURIRef117 = testURIRef AbsId "foo://"
+-- URIs prefixed with IPv4 addresses
+testURIRef118 = testURIRef AbsId "http://192.168.0.1.example.com/"
+testURIRef119 = testURIRef AbsId "http://192.168.0.1.example.com./"
+-- URI prefixed with 3 octets of an IPv4 address and a subdomain part with a leading digit.
+testURIRef120 = testURIRef AbsId "http://192.168.0.1test.example.com/"
+-- URI with IPv(future) address
+testURIRef121 = testURIRef AbsId "http://[v9.123.abc;456.def]/"
+testURIRef122 = testEq "v.future authority" 
+                       (Just (URIAuth "" "[v9.123.abc;456.def]" ":42"))
+                       ((maybe Nothing uriAuthority) . parseURI $ "http://[v9.123.abc;456.def]:42/") 
+-- URI with non-ASCII characters, fail with Network.HTTP escaping code (see below)
+-- Currently not supported by Network.URI, but captured here for possible future reference
+-- when IRI support may be added.
+testURIRef123 = testURIRef AbsId "http://example.com/test123/䡥汬漬⁗潲汤/index.html"
+testURIRef124 = testURIRef AbsId "http://example.com/test124/Москва/index.html"
+
+-- From report by Alexander Ivanov:
+-- should return " 䡥汬漬⁗潲汤", but returns "Hello, World" instead
+-- print $ urlDecode $ urlEncode " 䡥汬漬⁗潲汤"
+-- should return "Москва"
+-- print $ urlDecode $ urlEncode "Москва"
+
+testURIRefSuite = TF.testGroup "Test URIrefs" testURIRefList
+testURIRefList =
+  [ TF.testCase "testURIRef001" testURIRef001
+  , TF.testCase "testURIRef002" testURIRef002
+  , TF.testCase "testURIRef003" testURIRef003
+  , TF.testCase "testURIRef004" testURIRef004
+  , TF.testCase "testURIRef005" testURIRef005
+  , TF.testCase "testURIRef006" testURIRef006
+  , TF.testCase "testURIRef007" testURIRef007
+  , TF.testCase "testURIRef008" testURIRef008
+  , TF.testCase "testURIRef009" testURIRef009
+  , TF.testCase "testURIRef010" testURIRef010
+    --
+  , TF.testCase "testURIRef011" testURIRef011
+  , TF.testCase "testURIRef012" testURIRef012
+  , TF.testCase "testURIRef013" testURIRef013
+  , TF.testCase "testURIRef014" testURIRef014
+  , TF.testCase "testURIRef015" testURIRef015
+  , TF.testCase "testURIRef016" testURIRef016
+  , TF.testCase "testURIRef017" testURIRef017
+  , TF.testCase "testURIRef018" testURIRef018
+    --
+  , TF.testCase "testURIRef019" testURIRef019
+    --
+  , TF.testCase "testURIRef021" testURIRef021
+  , TF.testCase "testURIRef022" testURIRef022
+  , TF.testCase "testURIRef023" testURIRef023
+  , TF.testCase "testURIRef024" testURIRef024
+  , TF.testCase "testURIRef025" testURIRef025
+  , TF.testCase "testURIRef026" testURIRef026
+  , TF.testCase "testURIRef027" testURIRef027
+  , TF.testCase "testURIRef028" testURIRef028
+  , TF.testCase "testURIRef029" testURIRef029
+    --
+  , TF.testCase "testURIRef031" testURIRef031
+  , TF.testCase "testURIRef032" testURIRef032
+  , TF.testCase "testURIRef033" testURIRef033
+  , TF.testCase "testURIRef034" testURIRef034
+  , TF.testCase "testURIRef035" testURIRef035
+  , TF.testCase "testURIRef036" testURIRef036
+  , TF.testCase "testURIRef037" testURIRef037
+  , TF.testCase "testURIRef038" testURIRef038
+  , TF.testCase "testURIRef039" testURIRef039
+  , TF.testCase "testURIRef040" testURIRef040
+  , TF.testCase "testURIRef041" testURIRef041
+  , TF.testCase "testURIRef042" testURIRef042
+  , TF.testCase "testURIRef043" testURIRef043
+  , TF.testCase "testURIRef044" testURIRef044
+  , TF.testCase "testURIRef045" testURIRef045
+  , TF.testCase "testURIRef046" testURIRef046
+  , TF.testCase "testURIRef047" testURIRef047
+  , TF.testCase "testURIRef048" testURIRef048
+  , TF.testCase "testURIRef049" testURIRef049
+  , TF.testCase "testURIRef050" testURIRef050
+  , TF.testCase "testURIRef051" testURIRef051
+  , TF.testCase "testURIRef052" testURIRef052
+  , TF.testCase "testURIRef053" testURIRef053
+  , TF.testCase "testURIRef054" testURIRef054
+  , TF.testCase "testURIRef055" testURIRef055
+  , TF.testCase "testURIRef056" testURIRef056
+  , TF.testCase "testURIRef057" testURIRef057
+  , TF.testCase "testURIRef058" testURIRef058
+  , TF.testCase "testURIRef059" testURIRef059
+  , TF.testCase "testURIRef060" testURIRef060
+  , TF.testCase "testURIRef061" testURIRef061
+  , TF.testCase "testURIRef062" testURIRef062
+  , TF.testCase "testURIRef063" testURIRef063
+  , TF.testCase "testURIRef064" testURIRef064
+  , TF.testCase "testURIRef065" testURIRef065
+  , TF.testCase "testURIRef066" testURIRef066
+  , TF.testCase "testURIRef067" testURIRef067
+  , TF.testCase "testURIRef068" testURIRef068
+  , TF.testCase "testURIRef069" testURIRef069
+  , TF.testCase "testURIRef070" testURIRef070
+  , TF.testCase "testURIRef071" testURIRef071
+  , TF.testCase "testURIRef072" testURIRef072
+  , TF.testCase "testURIRef073" testURIRef073
+  , TF.testCase "testURIRef074" testURIRef074
+  , TF.testCase "testURIRef075" testURIRef075
+  , TF.testCase "testURIRef076" testURIRef076
+  , TF.testCase "testURIRef077" testURIRef077
+    --
+  , TF.testCase "testURIRef080" testURIRef080
+  , TF.testCase "testURIRef081" testURIRef081
+  , TF.testCase "testURIRef082" testURIRef082
+  , TF.testCase "testURIRef083" testURIRef083
+  , TF.testCase "testURIRef084" testURIRef084
+  , TF.testCase "testURIRef085" testURIRef085
+  , TF.testCase "testURIRef086" testURIRef086
+  , TF.testCase "testURIRef087" testURIRef087
+    -- testURIRef088,
+    -- testURIRef089,
+  , TF.testCase "testURIRef090" testURIRef090
+  , TF.testCase "testURIRef091" testURIRef091
+  , TF.testCase "testURIRef092" testURIRef092
+  , TF.testCase "testURIRef093" testURIRef093
+  , TF.testCase "testURIRef094" testURIRef094
+  , TF.testCase "testURIRef095" testURIRef095
+  , TF.testCase "testURIRef096" testURIRef096
+  , TF.testCase "testURIRef097" testURIRef097
+  , TF.testCase "testURIRef098" testURIRef098
+    -- testURIRef099,
+    --
+  , TF.testCase "testURIRef101" testURIRef101
+  , TF.testCase "testURIRef102" testURIRef102
+  , TF.testCase "testURIRef103" testURIRef103
+  , TF.testCase "testURIRef104" testURIRef104
+  , TF.testCase "testURIRef105" testURIRef105
+  , TF.testCase "testURIRef106" testURIRef106
+  , TF.testCase "testURIRef107" testURIRef107
+  , TF.testCase "testURIRef108" testURIRef108
+    --
+  , TF.testCase "testURIRef111" testURIRef111
+  , TF.testCase "testURIRef112" testURIRef112
+  , TF.testCase "testURIRef113" testURIRef113
+  , TF.testCase "testURIRef114" testURIRef114
+  , TF.testCase "testURIRef115" testURIRef115
+  , TF.testCase "testURIRef116" testURIRef116
+  , TF.testCase "testURIRef117" testURIRef117
+    --
+  , TF.testCase "testURIRef118" testURIRef118
+  , TF.testCase "testURIRef119" testURIRef119
+  , TF.testCase "testURIRef120" testURIRef120
+    --
+  , TF.testCase "testURIRef121" testURIRef121
+  , TF.testCase "testURIRef122" testURIRef122
+    -- IRI test cases not currently supported
+  -- , TF.testCase "testURIRef123" testURIRef123
+  -- , TF.testCase "testURIRef124" testURIRef124
+  ]
+
+-- test decomposition of URI into components
+testComponent01 = testURIRefComponents "testComponent01"
+        ( Just $ URI
+            { uriScheme    = "http:"
+            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
+            , uriPath      = "/aaa/bbb"
+            , uriQuery     = "?qqq"
+            , uriFragment  = "#fff"
+            } )
+        "http://user:pass@example.org:99/aaa/bbb?qqq#fff"
+testComponent02 = testURIRefComponents "testComponent02"
+        ( const Nothing
+        ( Just $ URI
+            { uriScheme    = "http:"
+            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
+            , uriPath      = "aaa/bbb"
+            , uriQuery     = ""
+            , uriFragment  = ""
+            } )
+        )
+        "http://user:pass@example.org:99aaa/bbb"
+testComponent03 = testURIRefComponents "testComponent03"
+        ( Just $ URI
+            { uriScheme    = "http:"
+            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
+            , uriPath      = ""
+            , uriQuery     = "?aaa/bbb"
+            , uriFragment  = ""
+            } )
+        "http://user:pass@example.org:99?aaa/bbb"
+testComponent04 = testURIRefComponents "testComponent03"
+        ( Just $ URI
+            { uriScheme    = "http:"
+            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
+            , uriPath      = ""
+            , uriQuery     = ""
+            , uriFragment  = "#aaa/bbb"
+            } )
+        "http://user:pass@example.org:99#aaa/bbb"
+-- These test cases contributed by Robert Buck (mathworks.com)
+testComponent11 = testURIRefComponents "testComponent03"
+        ( Just $ URI
+            { uriScheme    = "about:"
+            , uriAuthority = Nothing
+            , uriPath      = ""
+            , uriQuery     = ""
+            , uriFragment  = ""
+            } )
+        "about:"
+testComponent12 = testURIRefComponents "testComponent03"
+        ( Just $ URI
+            { uriScheme    = "file:"
+            , uriAuthority = Just (URIAuth "" "windowsauth" "")
+            , uriPath      = "/d$"
+            , uriQuery     = ""
+            , uriFragment  = ""
+            } )
+        "file://windowsauth/d$"
+
+testComponentSuite = TF.testGroup "Test URIrefs" $
+  [ TF.testCase "testComponent01" testComponent01
+  , TF.testCase "testComponent02" testComponent02
+  , TF.testCase "testComponent03" testComponent03
+  , TF.testCase "testComponent04" testComponent04
+  , TF.testCase "testComponent11" testComponent11
+  , TF.testCase "testComponent12" testComponent12
+  ]
+
+-- Get reference relative to given base
+--   relativeRef :: String -> String -> String
+--
+-- Get absolute URI given base and relative reference
+--   absoluteURI :: String -> String -> String
+--
+-- Test cases taken from: http://www.w3.org/2000/10/swap/uripath.py
+-- (Thanks, Dan Connolly)
+--
+-- NOTE:  absoluteURI base (relativeRef base u) is always equivalent to u.
+-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html
+
+testRelSplit :: String -> String -> String -> String -> Assertion
+testRelSplit label base uabs urel =
+    testEq label urel (mkrel puabs pubas)
+    where
+        mkrel (Just u1) (Just u2) = show (u1 `relativeFrom` u2)
+        mkrel Nothing   _         = "Invalid URI: "++urel
+        mkrel _         Nothing   = "Invalid URI: "++uabs
+        puabs = parseURIReference uabs
+        pubas = parseURIReference base
+
+testRelJoin  :: String -> String -> String -> String -> Assertion
+testRelJoin label base urel uabs =
+    testEq label uabs (mkabs purel pubas)
+    where
+        mkabs (Just u1) (Just u2) = show (u1 `relativeTo` u2)
+        mkabs Nothing   _         = "Invalid URI: "++urel
+        mkabs _         Nothing   = "Invalid URI: "++uabs
+        purel = parseURIReference urel
+        pubas = parseURIReference base
+
+testRelative :: String -> String -> String -> String -> Assertion
+testRelative label base uabs urel = sequence_
+    [
+    (testRelSplit (label++"(rel)") base uabs urel),
+    (testRelJoin  (label++"(abs)") base urel uabs)
+    ]
+
+testRelative01 = testRelative "testRelative01"
+                    "foo:xyz" "bar:abc" "bar:abc"
+testRelative02 = testRelative "testRelative02"
+                    "http://example/x/y/z" "http://example/x/abc" "../abc"
+testRelative03 = testRelative "testRelative03"
+                    "http://example2/x/y/z" "http://example/x/abc" "//example/x/abc"
+                    -- "http://example2/x/y/z" "http://example/x/abc" "http://example/x/abc"
+testRelative04 = testRelative "testRelative04"
+                    "http://ex/x/y/z" "http://ex/x/r" "../r"
+testRelative05 = testRelative "testRelative05"
+                    "http://ex/x/y/z" "http://ex/r" "/r"
+                    -- "http://ex/x/y/z" "http://ex/r" "../../r"
+testRelative06 = testRelative "testRelative06"
+                    "http://ex/x/y/z" "http://ex/x/y/q/r" "q/r"
+testRelative07 = testRelative "testRelative07"
+                    "http://ex/x/y" "http://ex/x/q/r#s" "q/r#s"
+testRelative08 = testRelative "testRelative08"
+                    "http://ex/x/y" "http://ex/x/q/r#s/t" "q/r#s/t"
+testRelative09 = testRelative "testRelative09"
+                    "http://ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"
+testRelative10 = testRelative "testRelative10"
+                    -- "http://ex/x/y" "http://ex/x/y" "y"
+                    "http://ex/x/y" "http://ex/x/y" ""
+testRelative11 = testRelative "testRelative11"
+                    -- "http://ex/x/y/" "http://ex/x/y/" "./"
+                    "http://ex/x/y/" "http://ex/x/y/" ""
+testRelative12 = testRelative "testRelative12"
+                    -- "http://ex/x/y/pdq" "http://ex/x/y/pdq" "pdq"
+                    "http://ex/x/y/pdq" "http://ex/x/y/pdq" ""
+testRelative13 = testRelative "testRelative13"
+                    "http://ex/x/y/" "http://ex/x/y/z/" "z/"
+testRelative14 = testRelative "testRelative14"
+                    -- "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "animal.rdf#Animal"
+                    "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "#Animal"
+testRelative15 = testRelative "testRelative15"
+                    "file:/e/x/y/z" "file:/e/x/abc" "../abc"
+testRelative16 = testRelative "testRelative16"
+                    "file:/example2/x/y/z" "file:/example/x/abc" "/example/x/abc"
+testRelative17 = testRelative "testRelative17"
+                    "file:/ex/x/y/z" "file:/ex/x/r" "../r"
+testRelative18 = testRelative "testRelative18"
+                    "file:/ex/x/y/z" "file:/r" "/r"
+testRelative19 = testRelative "testRelative19"
+                    "file:/ex/x/y" "file:/ex/x/q/r" "q/r"
+testRelative20 = testRelative "testRelative20"
+                    "file:/ex/x/y" "file:/ex/x/q/r#s" "q/r#s"
+testRelative21 = testRelative "testRelative21"
+                    "file:/ex/x/y" "file:/ex/x/q/r#" "q/r#"
+testRelative22 = testRelative "testRelative22"
+                    "file:/ex/x/y" "file:/ex/x/q/r#s/t" "q/r#s/t"
+testRelative23 = testRelative "testRelative23"
+                    "file:/ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"
+testRelative24 = testRelative "testRelative24"
+                    -- "file:/ex/x/y" "file:/ex/x/y" "y"
+                    "file:/ex/x/y" "file:/ex/x/y" ""
+testRelative25 = testRelative "testRelative25"
+                    -- "file:/ex/x/y/" "file:/ex/x/y/" "./"
+                    "file:/ex/x/y/" "file:/ex/x/y/" ""
+testRelative26 = testRelative "testRelative26"
+                    -- "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" "pdq"
+                    "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" ""
+testRelative27 = testRelative "testRelative27"
+                    "file:/ex/x/y/" "file:/ex/x/y/z/" "z/"
+testRelative28 = testRelative "testRelative28"
+                    "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"
+                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"
+                    -- "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"
+                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"
+testRelative29 = testRelative "testRelative29"
+                    "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"
+                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"
+                    -- "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"
+                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"
+testRelative30 = testRelative "testRelative30"
+                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"
+testRelative31 = testRelative "testRelative31"
+                    "file:/some/dir/foo" "file:/some/dir/#" "./#"
+testRelative32 = testRelative "testRelative32"
+                    "http://ex/x/y" "http://ex/x/q:r" "./q:r"
+                    -- see RFC2396bis, section 5       ^^
+testRelative33 = testRelative "testRelative33"
+                    "http://ex/x/y" "http://ex/x/p=q:r" "./p=q:r"
+                    -- "http://ex/x/y" "http://ex/x/p=q:r" "p=q:r"
+testRelative34 = testRelative "testRelative34"
+                    "http://ex/x/y?pp/qq" "http://ex/x/y?pp/rr" "?pp/rr"
+testRelative35 = testRelative "testRelative35"
+                    "http://ex/x/y?pp/qq" "http://ex/x/y/z" "y/z"
+testRelative36 = testRelative "testRelative36"
+                    "mailto:local"
+                    "mailto:local/qual@domain.org#frag"
+                    "local/qual@domain.org#frag"
+testRelative37 = testRelative "testRelative37"
+                    "mailto:local/qual1@domain1.org"
+                    "mailto:local/more/qual2@domain2.org#frag"
+                    "more/qual2@domain2.org#frag"
+testRelative38 = testRelative "testRelative38"
+                    "http://ex/x/z?q" "http://ex/x/y?q" "y?q"
+testRelative39 = testRelative "testRelative39"
+                    "http://ex?p" "http://ex/x/y?q" "/x/y?q"
+testRelative40 = testRelative "testRelative40"
+                    "foo:a/b" "foo:a/c/d" "c/d"
+testRelative41 = testRelative "testRelative41"
+                    "foo:a/b" "foo:/c/d" "/c/d"
+testRelative42 = testRelative "testRelative42"
+                    "foo:a/b?c#d" "foo:a/b?c" ""
+testRelative43 = testRelative "testRelative42"
+                    "foo:a" "foo:b/c" "b/c"
+testRelative44 = testRelative "testRelative44"
+                    "foo:/a/y/z" "foo:/a/b/c" "../b/c"
+testRelative45 = testRelJoin "testRelative45"
+                    "foo:a" "./b/c" "foo:b/c"
+testRelative46 = testRelJoin "testRelative46"
+                    "foo:a" "/./b/c" "foo:/b/c"
+testRelative47 = testRelJoin "testRelative47"
+                    "foo://a//b/c" "../../d" "foo://a/d"
+testRelative48 = testRelJoin "testRelative48"
+                    "foo:a" "." "foo:"
+testRelative49 = testRelJoin "testRelative49"
+                    "foo:a" ".." "foo:"
+
+-- add escape tests
+testRelative50 = testRelative "testRelative50"
+                    "http://example/x/y%2Fz" "http://example/x/abc" "abc"
+testRelative51 = testRelative "testRelative51"
+                    "http://example/a/x/y/z" "http://example/a/x%2Fabc" "../../x%2Fabc"
+testRelative52 = testRelative "testRelative52"
+                    "http://example/a/x/y%2Fz" "http://example/a/x%2Fabc" "../x%2Fabc"
+testRelative53 = testRelative "testRelative53"
+                    "http://example/x%2Fy/z" "http://example/x%2Fy/abc" "abc"
+testRelative54 = testRelative "testRelative54"
+                    "http://ex/x/y" "http://ex/x/q%3Ar" "q%3Ar"
+testRelative55 = testRelative "testRelative55"
+                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"
+-- Apparently, TimBL prefers the following way to 41, 42 above
+-- cf. http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html
+-- He also notes that there may be different relative fuctions
+-- that satisfy the basic equivalence axiom:
+-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html
+testRelative56 = testRelative "testRelative56"
+                    "http://example/x/y/z" "http://example/x%2Fabc" "/x%2Fabc"
+testRelative57 = testRelative "testRelative57"
+                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"
+
+-- Other oddball tests
+    -- Check segment normalization code:
+testRelative60 = testRelJoin "testRelative60"
+                    "ftp://example/x/y" "http://example/a/b/../../c" "http://example/c"
+testRelative61 = testRelJoin "testRelative61"
+                    "ftp://example/x/y" "http://example/a/b/c/../../" "http://example/a/"
+testRelative62 = testRelJoin "testRelative62"
+                    "ftp://example/x/y" "http://example/a/b/c/./" "http://example/a/b/c/"
+testRelative63 = testRelJoin "testRelative63"
+                    "ftp://example/x/y" "http://example/a/b/c/.././" "http://example/a/b/"
+testRelative64 = testRelJoin "testRelative64"
+                    "ftp://example/x/y" "http://example/a/b/c/d/../../../../e" "http://example/e"
+testRelative65 = testRelJoin "testRelative65"
+                    "ftp://example/x/y" "http://example/a/b/c/d/../.././../../e" "http://example/e"
+    -- Check handling of queries and fragments with non-relative paths
+testRelative70 = testRelative "testRelative70"
+                    "mailto:local1@domain1?query1" "mailto:local2@domain2"
+                    "local2@domain2"
+testRelative71 = testRelative "testRelative71"
+                    "mailto:local1@domain1" "mailto:local2@domain2?query2"
+                    "local2@domain2?query2"
+testRelative72 = testRelative "testRelative72"
+                    "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"
+                    "local2@domain2?query2"
+testRelative73 = testRelative "testRelative73"
+                    "mailto:local@domain?query1" "mailto:local@domain?query2"
+                    "?query2"
+testRelative74 = testRelative "testRelative74"
+                    "mailto:?query1" "mailto:local@domain?query2"
+                    "local@domain?query2"
+testRelative75 = testRelative "testRelative75"
+                    "mailto:local@domain?query1" "mailto:local@domain?query2"
+                    "?query2"
+testRelative76 = testRelative "testRelative76"
+                    "foo:bar" "http://example/a/b?c/../d"  "http://example/a/b?c/../d"
+testRelative77 = testRelative "testRelative77"
+                    "foo:bar" "http://example/a/b#c/../d"  "http://example/a/b#c/../d"
+{- These (78-81) are some awkward test cases thrown up by a question on the URI list:
+     http://lists.w3.org/Archives/Public/uri/2005Jul/0013
+   Mote that RFC 3986 discards path segents after the final '/' only when merging two
+   paths - otherwise the final segment in the base URI is mnaintained.  This leads to
+   difficulty in constructinmg a reversible relativeTo/relativeFrom pair of functions.
+-}
+testRelative78 = testRelative "testRelative78"
+                    "http://www.example.com/data/limit/.." "http://www.example.com/data/limit/test.xml"
+                    "test.xml"
+testRelative79 = testRelative "testRelative79"
+                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"
+testRelative80 = testRelative "testRelative80"
+                    "file:/some/dir/foo" "file:/some/dir/#" "./#"
+testRelative81 = testRelative "testRelative81"
+                    "file:/some/dir/.." "file:/some/dir/#blort" "./#blort"
+
+-- testRelative  base abs rel
+-- testRelSplit  base abs rel
+-- testRelJoin   base rel abs
+testRelative91 = testRelSplit "testRelative91"
+                    "http://example.org/base/uri" "http:this"
+                    "this"
+testRelative92 = testRelJoin "testRelative92"
+                    "http://example.org/base/uri" "http:this"
+                    "http:this"
+testRelative93 = testRelJoin "testRelative93"
+                    "http:base" "http:this"
+                    "http:this"
+testRelative94 = testRelJoin "testRelative94"
+                    "f:/a" ".//g"
+                    "f://g"
+testRelative95 = testRelJoin "testRelative95"
+                    "f://example.org/base/a" "b/c//d/e"
+                    "f://example.org/base/b/c//d/e"
+testRelative96 = testRelJoin "testRelative96"
+                    "mid:m@example.ord/c@example.org" "m2@example.ord/c2@example.org"
+                    "mid:m@example.ord/m2@example.ord/c2@example.org"
+testRelative97 = testRelJoin "testRelative97"
+                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/" "mini1.xml"
+                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml"
+testRelative98 = testRelative "testRelative98"
+                    "foo:a/y/z" "foo:a/b/c" "../b/c"
+testRelative99 = testRelJoin "testRelative99"
+                    "f:/a/" "..//g"
+                    "f://g"
+
+
+testRelativeSuite = TF.testGroup "Test Relative URIs" testRelativeList
+testRelativeList  =
+  [ TF.testCase "testRelative01" testRelative01
+  , TF.testCase "testRelative02" testRelative02
+  , TF.testCase "testRelative03" testRelative03
+  , TF.testCase "testRelative04" testRelative04
+  , TF.testCase "testRelative05" testRelative05
+  , TF.testCase "testRelative06" testRelative06
+  , TF.testCase "testRelative07" testRelative07
+  , TF.testCase "testRelative08" testRelative08
+  , TF.testCase "testRelative09" testRelative09
+  , TF.testCase "testRelative10" testRelative10
+  , TF.testCase "testRelative11" testRelative11
+  , TF.testCase "testRelative12" testRelative12
+  , TF.testCase "testRelative13" testRelative13
+  , TF.testCase "testRelative14" testRelative14
+  , TF.testCase "testRelative15" testRelative15
+  , TF.testCase "testRelative16" testRelative16
+  , TF.testCase "testRelative17" testRelative17
+  , TF.testCase "testRelative18" testRelative18
+  , TF.testCase "testRelative19" testRelative19
+  , TF.testCase "testRelative20" testRelative20
+  , TF.testCase "testRelative21" testRelative21
+  , TF.testCase "testRelative22" testRelative22
+  , TF.testCase "testRelative23" testRelative23
+  , TF.testCase "testRelative24" testRelative24
+  , TF.testCase "testRelative25" testRelative25
+  , TF.testCase "testRelative26" testRelative26
+  , TF.testCase "testRelative27" testRelative27
+  , TF.testCase "testRelative28" testRelative28
+  , TF.testCase "testRelative29" testRelative29
+  , TF.testCase "testRelative30" testRelative30
+  , TF.testCase "testRelative31" testRelative31
+  , TF.testCase "testRelative32" testRelative32
+  , TF.testCase "testRelative33" testRelative33
+  , TF.testCase "testRelative34" testRelative34
+  , TF.testCase "testRelative35" testRelative35
+  , TF.testCase "testRelative36" testRelative36
+  , TF.testCase "testRelative37" testRelative37
+  , TF.testCase "testRelative38" testRelative38
+  , TF.testCase "testRelative39" testRelative39
+  , TF.testCase "testRelative40" testRelative40
+  , TF.testCase "testRelative41" testRelative41
+  , TF.testCase "testRelative42" testRelative42
+  , TF.testCase "testRelative43" testRelative43
+  , TF.testCase "testRelative44" testRelative44
+  , TF.testCase "testRelative45" testRelative45
+  , TF.testCase "testRelative46" testRelative46
+  , TF.testCase "testRelative47" testRelative47
+  , TF.testCase "testRelative48" testRelative48
+  , TF.testCase "testRelative49" testRelative49
+    --
+  , TF.testCase "testRelative50" testRelative50
+  , TF.testCase "testRelative51" testRelative51
+  , TF.testCase "testRelative52" testRelative52
+  , TF.testCase "testRelative53" testRelative53
+  , TF.testCase "testRelative54" testRelative54
+  , TF.testCase "testRelative55" testRelative55
+  , TF.testCase "testRelative56" testRelative56
+  , TF.testCase "testRelative57" testRelative57
+    --
+  , TF.testCase "testRelative60" testRelative60
+  , TF.testCase "testRelative61" testRelative61
+  , TF.testCase "testRelative62" testRelative62
+  , TF.testCase "testRelative63" testRelative63
+  , TF.testCase "testRelative64" testRelative64
+  , TF.testCase "testRelative65" testRelative65
+    --
+  , TF.testCase "testRelative70" testRelative70
+  , TF.testCase "testRelative71" testRelative71
+  , TF.testCase "testRelative72" testRelative72
+  , TF.testCase "testRelative73" testRelative73
+  , TF.testCase "testRelative74" testRelative74
+  , TF.testCase "testRelative75" testRelative75
+  , TF.testCase "testRelative76" testRelative76
+  , TF.testCase "testRelative77" testRelative77
+  -- Awkward cases:
+  , TF.testCase "testRelative78" testRelative78
+  , TF.testCase "testRelative79" testRelative79
+  , TF.testCase "testRelative80" testRelative80
+  , TF.testCase "testRelative81" testRelative81
+    --
+  -- , TF.testCase "testRelative90" testRelative90
+  , TF.testCase "testRelative91" testRelative91
+  , TF.testCase "testRelative92" testRelative92
+  , TF.testCase "testRelative93" testRelative93
+  , TF.testCase "testRelative94" testRelative94
+  , TF.testCase "testRelative95" testRelative95
+  , TF.testCase "testRelative96" testRelative96
+  , TF.testCase "testRelative97" testRelative97
+  , TF.testCase "testRelative98" testRelative98
+  , TF.testCase "testRelative99" testRelative99
+  ]
+
+-- RFC2396 relative-to-absolute URI tests
+
+rfcbase  = "http://a/b/c/d;p?q"
+-- normal cases, RFC2396bis 5.4.1
+testRFC01 = testRelJoin "testRFC01" rfcbase "g:h" "g:h"
+testRFC02 = testRelJoin "testRFC02" rfcbase "g" "http://a/b/c/g"
+testRFC03 = testRelJoin "testRFC03" rfcbase "./g" "http://a/b/c/g"
+testRFC04 = testRelJoin "testRFC04" rfcbase "g/" "http://a/b/c/g/"
+testRFC05 = testRelJoin "testRFC05" rfcbase "/g" "http://a/g"
+testRFC06 = testRelJoin "testRFC06" rfcbase "//g" "http://g"
+testRFC07 = testRelJoin "testRFC07" rfcbase "?y" "http://a/b/c/d;p?y"
+testRFC08 = testRelJoin "testRFC08" rfcbase "g?y" "http://a/b/c/g?y"
+testRFC09 = testRelJoin "testRFC09" rfcbase "?q#s" "http://a/b/c/d;p?q#s"
+testRFC23 = testRelJoin "testRFC10" rfcbase "#s" "http://a/b/c/d;p?q#s"
+testRFC10 = testRelJoin "testRFC11" rfcbase "g#s" "http://a/b/c/g#s"
+testRFC11 = testRelJoin "testRFC12" rfcbase "g?y#s" "http://a/b/c/g?y#s"
+testRFC12 = testRelJoin "testRFC13" rfcbase ";x" "http://a/b/c/;x"
+testRFC13 = testRelJoin "testRFC14" rfcbase "g;x" "http://a/b/c/g;x"
+testRFC14 = testRelJoin "testRFC15" rfcbase "g;x?y#s" "http://a/b/c/g;x?y#s"
+testRFC24 = testRelJoin "testRFC16" rfcbase "" "http://a/b/c/d;p?q"
+testRFC15 = testRelJoin "testRFC17" rfcbase "." "http://a/b/c/"
+testRFC16 = testRelJoin "testRFC18" rfcbase "./" "http://a/b/c/"
+testRFC17 = testRelJoin "testRFC19" rfcbase ".." "http://a/b/"
+testRFC18 = testRelJoin "testRFC20" rfcbase "../" "http://a/b/"
+testRFC19 = testRelJoin "testRFC21" rfcbase "../g" "http://a/b/g"
+testRFC20 = testRelJoin "testRFC22" rfcbase "../.." "http://a/"
+testRFC21 = testRelJoin "testRFC23" rfcbase "../../" "http://a/"
+testRFC22 = testRelJoin "testRFC24" rfcbase "../../g" "http://a/g"
+-- abnormal cases, RFC2396bis 5.4.2
+testRFC31 = testRelJoin "testRFC31" rfcbase "?q" rfcbase
+testRFC32 = testRelJoin "testRFC32" rfcbase "../../../g" "http://a/g"
+testRFC33 = testRelJoin "testRFC33" rfcbase "../../../../g" "http://a/g"
+testRFC34 = testRelJoin "testRFC34" rfcbase "/./g" "http://a/g"
+testRFC35 = testRelJoin "testRFC35" rfcbase "/../g" "http://a/g"
+testRFC36 = testRelJoin "testRFC36" rfcbase "g." "http://a/b/c/g."
+testRFC37 = testRelJoin "testRFC37" rfcbase ".g" "http://a/b/c/.g"
+testRFC38 = testRelJoin "testRFC38" rfcbase "g.." "http://a/b/c/g.."
+testRFC39 = testRelJoin "testRFC39" rfcbase "..g" "http://a/b/c/..g"
+testRFC40 = testRelJoin "testRFC40" rfcbase "./../g" "http://a/b/g"
+testRFC41 = testRelJoin "testRFC41" rfcbase "./g/." "http://a/b/c/g/"
+testRFC42 = testRelJoin "testRFC42" rfcbase "g/./h" "http://a/b/c/g/h"
+testRFC43 = testRelJoin "testRFC43" rfcbase "g/../h" "http://a/b/c/h"
+testRFC44 = testRelJoin "testRFC44" rfcbase "g;x=1/./y" "http://a/b/c/g;x=1/y"
+testRFC45 = testRelJoin "testRFC45" rfcbase "g;x=1/../y" "http://a/b/c/y"
+testRFC46 = testRelJoin "testRFC46" rfcbase "g?y/./x" "http://a/b/c/g?y/./x"
+testRFC47 = testRelJoin "testRFC47" rfcbase "g?y/../x" "http://a/b/c/g?y/../x"
+testRFC48 = testRelJoin "testRFC48" rfcbase "g#s/./x" "http://a/b/c/g#s/./x"
+testRFC49 = testRelJoin "testRFC49" rfcbase "g#s/../x" "http://a/b/c/g#s/../x"
+testRFC50 = testRelJoin "testRFC50" rfcbase "http:x" "http:x"
+
+-- Null path tests
+-- See RFC2396bis, section 5.2,
+-- "If the base URI's path component is the empty string, then a single
+--  slash character is copied to the buffer"
+testRFC60 = testRelative "testRFC60" "http://ex"     "http://ex/x/y?q" "/x/y?q"
+testRFC61 = testRelJoin  "testRFC61" "http://ex"     "x/y?q"           "http://ex/x/y?q"
+testRFC62 = testRelative "testRFC62" "http://ex?p"   "http://ex/x/y?q" "/x/y?q"
+testRFC63 = testRelJoin  "testRFC63" "http://ex?p"   "x/y?q"           "http://ex/x/y?q"
+testRFC64 = testRelative "testRFC64" "http://ex#f"   "http://ex/x/y?q" "/x/y?q"
+testRFC65 = testRelJoin  "testRFC65" "http://ex#f"   "x/y?q"           "http://ex/x/y?q"
+testRFC66 = testRelative "testRFC66" "http://ex?p"   "http://ex/x/y#g" "/x/y#g"
+testRFC67 = testRelJoin  "testRFC67" "http://ex?p"   "x/y#g"           "http://ex/x/y#g"
+testRFC68 = testRelative "testRFC68" "http://ex"     "http://ex/"      "/"
+testRFC69 = testRelJoin  "testRFC69" "http://ex"     "./"              "http://ex/"
+testRFC70 = testRelative "testRFC70" "http://ex"     "http://ex/a/b"   "/a/b"
+testRFC71 = testRelative "testRFC71" "http://ex/a/b" "http://ex"       "./"
+
+testRFC2396Suite = TF.testGroup "Test RFC2396 examples" testRFC2396List
+testRFC2396List  =
+  [ TF.testCase "testRFC01" testRFC01
+  , TF.testCase "testRFC02" testRFC02
+  , TF.testCase "testRFC03" testRFC03
+  , TF.testCase "testRFC04" testRFC04
+  , TF.testCase "testRFC05" testRFC05
+  , TF.testCase "testRFC06" testRFC06
+  , TF.testCase "testRFC07" testRFC07
+  , TF.testCase "testRFC08" testRFC08
+  , TF.testCase "testRFC09" testRFC09
+  , TF.testCase "testRFC10" testRFC10
+  , TF.testCase "testRFC11" testRFC11
+  , TF.testCase "testRFC12" testRFC12
+  , TF.testCase "testRFC13" testRFC13
+  , TF.testCase "testRFC14" testRFC14
+  , TF.testCase "testRFC15" testRFC15
+  , TF.testCase "testRFC16" testRFC16
+  , TF.testCase "testRFC17" testRFC17
+  , TF.testCase "testRFC18" testRFC18
+  , TF.testCase "testRFC19" testRFC19
+  , TF.testCase "testRFC20" testRFC20
+  , TF.testCase "testRFC21" testRFC21
+  , TF.testCase "testRFC22" testRFC22
+  , TF.testCase "testRFC23" testRFC23
+  , TF.testCase "testRFC24" testRFC24
+    -- testRFC30,
+  , TF.testCase "testRFC31" testRFC31
+  , TF.testCase "testRFC32" testRFC32
+  , TF.testCase "testRFC33" testRFC33
+  , TF.testCase "testRFC34" testRFC34
+  , TF.testCase "testRFC35" testRFC35
+  , TF.testCase "testRFC36" testRFC36
+  , TF.testCase "testRFC37" testRFC37
+  , TF.testCase "testRFC38" testRFC38
+  , TF.testCase "testRFC39" testRFC39
+  , TF.testCase "testRFC40" testRFC40
+  , TF.testCase "testRFC41" testRFC41
+  , TF.testCase "testRFC42" testRFC42
+  , TF.testCase "testRFC43" testRFC43
+  , TF.testCase "testRFC44" testRFC44
+  , TF.testCase "testRFC45" testRFC45
+  , TF.testCase "testRFC46" testRFC46
+  , TF.testCase "testRFC47" testRFC47
+  , TF.testCase "testRFC48" testRFC48
+  , TF.testCase "testRFC49" testRFC49
+  , TF.testCase "testRFC50" testRFC50
+    --
+  , TF.testCase "testRFC60" testRFC60
+  , TF.testCase "testRFC61" testRFC61
+  , TF.testCase "testRFC62" testRFC62
+  , TF.testCase "testRFC63" testRFC63
+  , TF.testCase "testRFC64" testRFC64
+  , TF.testCase "testRFC65" testRFC65
+  , TF.testCase "testRFC66" testRFC66
+  , TF.testCase "testRFC67" testRFC67
+  , TF.testCase "testRFC68" testRFC68
+  , TF.testCase "testRFC69" testRFC69
+  , TF.testCase "testRFC70" testRFC70
+  ]
+
+-- And some other oddballs:
+mailbase = "mailto:local/option@domain.org?notaquery#frag"
+testMail01 = testRelJoin "testMail01"
+            mailbase "more@domain"
+            "mailto:local/more@domain"
+testMail02 = testRelJoin "testMail02"
+            mailbase "#newfrag"
+            "mailto:local/option@domain.org?notaquery#newfrag"
+testMail03 = testRelJoin "testMail03"
+            mailbase "l1/q1@domain"
+            "mailto:local/l1/q1@domain"
+
+testMail11 = testRelJoin "testMail11"
+             "mailto:local1@domain1?query1" "mailto:local2@domain2"
+             "mailto:local2@domain2"
+testMail12 = testRelJoin "testMail12"
+             "mailto:local1@domain1" "mailto:local2@domain2?query2"
+             "mailto:local2@domain2?query2"
+testMail13 = testRelJoin "testMail13"
+             "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"
+             "mailto:local2@domain2?query2"
+testMail14 = testRelJoin "testMail14"
+             "mailto:local@domain?query1" "mailto:local@domain?query2"
+             "mailto:local@domain?query2"
+testMail15 = testRelJoin "testMail15"
+             "mailto:?query1" "mailto:local@domain?query2"
+             "mailto:local@domain?query2"
+testMail16 = testRelJoin "testMail16"
+             "mailto:local@domain?query1" "?query2"
+             "mailto:local@domain?query2"
+testInfo17 = testRelJoin "testInfo17"
+             "info:name/1234/../567" "name/9876/../543"
+             "info:name/name/543"
+testInfo18 = testRelJoin "testInfo18"
+             "info:/name/1234/../567" "name/9876/../543"
+             "info:/name/name/543"
+
+testOddballSuite = TF.testGroup "Test oddball examples" testOddballList
+testOddballList  =
+  [ TF.testCase "testMail01" testMail01
+  , TF.testCase "testMail02" testMail02
+  , TF.testCase "testMail03" testMail03
+  , TF.testCase "testMail11" testMail11
+  , TF.testCase "testMail12" testMail12
+  , TF.testCase "testMail13" testMail13
+  , TF.testCase "testMail14" testMail14
+  , TF.testCase "testMail15" testMail15
+  , TF.testCase "testMail16" testMail16
+  , TF.testCase "testInfo17" testInfo17
+  ]
+
+--  Normalization tests
+
+--  Case normalization; cf. RFC2396bis section 6.2.2.1
+--  NOTE:  authority case normalization is not performed
+testNormalize01 = testEq "testNormalize01"
+                  "http://EXAMPLE.com/Root/%2A?%2B#%2C"
+                  (normalizeCase "HTTP://EXAMPLE.com/Root/%2a?%2b#%2c")
+
+--  Encoding normalization; cf. RFC2396bis section 6.2.2.2
+testNormalize11 = testEq "testNormalize11"
+                  "HTTP://EXAMPLE.com/Root/~Me/"
+                  (normalizeEscape "HTTP://EXAMPLE.com/Root/%7eMe/")
+testNormalize12 = testEq "testNormalize12"
+                  "foo:%40AZ%5b%60az%7b%2f09%3a-._~"
+                  (normalizeEscape "foo:%40%41%5a%5b%60%61%7a%7b%2f%30%39%3a%2d%2e%5f%7e")
+testNormalize13 = testEq "testNormalize13"
+                  "foo:%3a%2f%3f%23%5b%5d%40"
+                  (normalizeEscape "foo:%3a%2f%3f%23%5b%5d%40")
+
+--  Path segment normalization; cf. RFC2396bis section 6.2.2.4
+testNormalize21 = testEq "testNormalize21"
+                    "http://example/c"
+                    (normalizePathSegments "http://example/a/b/../../c")
+testNormalize22 = testEq "testNormalize22"
+                    "http://example/a/"
+                    (normalizePathSegments "http://example/a/b/c/../../")
+testNormalize23 = testEq "testNormalize23"
+                    "http://example/a/b/c/"
+                    (normalizePathSegments "http://example/a/b/c/./")
+testNormalize24 = testEq "testNormalize24"
+                    "http://example/a/b/"
+                    (normalizePathSegments "http://example/a/b/c/.././")
+testNormalize25 = testEq "testNormalize25"
+                    "http://example/e"
+                    (normalizePathSegments "http://example/a/b/c/d/../../../../e")
+testNormalize26 = testEq "testNormalize26"
+                    "http://example/e"
+                    (normalizePathSegments "http://example/a/b/c/d/../.././../../e")
+testNormalize27 = testEq "testNormalize27"
+                    "http://example/e"
+                    (normalizePathSegments "http://example/a/b/../.././../../e")
+testNormalize28 = testEq "testNormalize28"
+                    "foo:e"
+                    (normalizePathSegments "foo:a/b/../.././../../e")
+
+testNormalizeSuite = TF.testGroup "testNormalizeSuite"
+  [ TF.testCase "testNormalize01" testNormalize01
+  , TF.testCase "testNormalize11" testNormalize11
+  , TF.testCase "testNormalize12" testNormalize12
+  , TF.testCase "testNormalize13" testNormalize13
+  , TF.testCase "testNormalize21" testNormalize21
+  , TF.testCase "testNormalize22" testNormalize22
+  , TF.testCase "testNormalize23" testNormalize23
+  , TF.testCase "testNormalize24" testNormalize24
+  , TF.testCase "testNormalize25" testNormalize25
+  , TF.testCase "testNormalize26" testNormalize26
+  , TF.testCase "testNormalize27" testNormalize27
+  , TF.testCase "testNormalize28" testNormalize28
+  ]
+
+-- URI formatting (show) tests
+
+ts02URI = URI   { uriScheme    = "http:"
+                , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
+                , uriPath      = "/aaa/bbb"
+                , uriQuery     = "?ccc"
+                , uriFragment  = "#ddd/eee"
+                }
+
+ts04URI = URI   { uriScheme    = "http:"
+                , uriAuthority = Just (URIAuth "user:anonymous@" "example.org" ":99")
+                , uriPath      = "/aaa/bbb"
+                , uriQuery     = "?ccc"
+                , uriFragment  = "#ddd/eee"
+                }
+
+ts02str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"
+ts03str = "http://user:pass@example.org:99/aaa/bbb?ccc#ddd/eee"
+ts04str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"
+
+testShowURI01 = testEq "testShowURI01" ""      (show nullURI)
+testShowURI02 = testEq "testShowURI02" ts02str (show ts02URI)
+testShowURI03 = testEq "testShowURI03" ts03str ((uriToString id ts02URI) "")
+testShowURI04 = testEq "testShowURI04" ts04str (show ts04URI)
+
+testShowURI = TF.testGroup "testShowURI"
+  [ TF.testCase "testShowURI01" testShowURI01
+  , TF.testCase "testShowURI02" testShowURI02
+  , TF.testCase "testShowURI03" testShowURI03
+  , TF.testCase "testShowURI04" testShowURI04
+  ]
+
+
+-- URI escaping tests
+
+te01str = "http://example.org/az/09-_/.~:/?#[]@!$&'()*+,;="
+te02str = "http://example.org/a</b>/c%/d /e"
+te02esc = "http://example.org/a%3C/b%3E/c%25/d%20/e"
+
+testEscapeURIString01 = testEq "testEscapeURIString01"
+    te01str (escapeURIString isUnescapedInURI te01str)
+
+testEscapeURIString02 = testEq "testEscapeURIString02"
+    te02esc (escapeURIString isUnescapedInURI te02str)
+
+testEscapeURIString03 = testEq "testEscapeURIString03"
+    te01str (unEscapeString te01str)
+
+testEscapeURIString04 = testEq "testEscapeURIString04"
+    te02str (unEscapeString te02esc)
+
+testEscapeURIString05 = testEq "testEscapeURIString05"
+    "http%3A%2F%2Fexample.org%2Faz%2F09-_%2F.~%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"
+    (escapeURIString isUnescapedInURIComponent te01str)
+
+testEscapeURIString06 = testEq "testEscapeURIString06"
+    "hello%C3%B8%C2%A9%E6%97%A5%E6%9C%AC"
+    (escapeURIString isUnescapedInURIComponent "helloø©日本")
+
+propEscapeUnEscapeLoop :: String -> Bool
+propEscapeUnEscapeLoop s = s == (unEscapeString $! escaped)
+	where
+	escaped = escapeURIString (const False) s
+	{-# NOINLINE escaped #-}
+
+testEscapeURIString = TF.testGroup "testEscapeURIString"
+  [ TF.testCase "testEscapeURIString01" testEscapeURIString01
+  , TF.testCase "testEscapeURIString02" testEscapeURIString02
+  , TF.testCase "testEscapeURIString03" testEscapeURIString03
+  , TF.testCase "testEscapeURIString04" testEscapeURIString04
+  , TF.testCase "testEscapeURIString05" testEscapeURIString05
+  , TF.testCase "testEscapeURIString06" testEscapeURIString06
+  , TF.testProperty "propEscapeUnEscapeLoop" propEscapeUnEscapeLoop
+  ]
+
+-- URI string normalization tests
+
+tn01str = "eXAMPLE://a/b/%7bfoo%7d"
+tn01nrm = "example://a/b/%7Bfoo%7D"
+
+tn02str = "example://a/b/%63/"
+tn02nrm = "example://a/b/c/"
+
+tn03str = "example://a/./b/../b/c/foo"
+tn03nrm = "example://a/b/c/foo"
+
+tn04str = "eXAMPLE://a/b/%7bfoo%7d"     -- From RFC2396bis, 6.2.2
+tn04nrm = "example://a/b/%7Bfoo%7D"
+
+tn06str = "file:/x/..//y"
+tn06nrm = "file://y"
+
+tn07str = "file:x/..//y/"
+tn07nrm = "file:/y/"
+
+testNormalizeURIString01 = testEq "testNormalizeURIString01"
+    tn01nrm (normalizeCase tn01str)
+testNormalizeURIString02 = testEq "testNormalizeURIString02"
+    tn02nrm (normalizeEscape tn02str)
+testNormalizeURIString03 = testEq "testNormalizeURIString03"
+    tn03nrm (normalizePathSegments tn03str)
+testNormalizeURIString04 = testEq "testNormalizeURIString04"
+    tn04nrm ((normalizeCase . normalizeEscape . normalizePathSegments) tn04str)
+testNormalizeURIString05 = testEq "testNormalizeURIString05"
+    tn04nrm ((normalizePathSegments . normalizeEscape . normalizeCase) tn04str)
+testNormalizeURIString06 = testEq "testNormalizeURIString06"
+    tn06nrm (normalizePathSegments tn06str)
+testNormalizeURIString07 = testEq "testNormalizeURIString07"
+    tn07nrm (normalizePathSegments tn07str)
+
+testNormalizeURIString = TF.testGroup "testNormalizeURIString"
+  [ TF.testCase "testNormalizeURIString01" testNormalizeURIString01
+  , TF.testCase "testNormalizeURIString02" testNormalizeURIString02
+  , TF.testCase "testNormalizeURIString03" testNormalizeURIString03
+  , TF.testCase "testNormalizeURIString04" testNormalizeURIString04
+  , TF.testCase "testNormalizeURIString05" testNormalizeURIString05
+  , TF.testCase "testNormalizeURIString06" testNormalizeURIString06
+  , TF.testCase "testNormalizeURIString07" testNormalizeURIString07
+  ]
+
+-- Test strict vs non-strict relativeTo logic
+
+trbase = fromJust $ parseURIReference "http://bar.org/"
+
+testRelativeTo01 = testEq "testRelativeTo01"
+    "http://bar.org/foo"
+    (show $
+      (fromJust $ parseURIReference "foo") `relativeTo` trbase)
+
+testRelativeTo02 = testEq "testRelativeTo02"
+    "http:foo"
+    (show $
+      (fromJust $ parseURIReference "http:foo") `relativeTo` trbase)
+
+testRelativeTo03 = testEq "testRelativeTo03"
+    "http://bar.org/foo"
+    (show $
+      (fromJust $ parseURIReference "http:foo") `nonStrictRelativeTo` trbase)
+
+testRelativeTo = TF.testGroup "testRelativeTo"
+  [ TF.testCase "testRelativeTo01" testRelativeTo01
+  , TF.testCase "testRelativeTo02" testRelativeTo02
+  , TF.testCase "testRelativeTo03" testRelativeTo03
+  ]
+
+-- Test alternative parsing functions
+testAltFn01 = testEq "testAltFn01" "Just http://a.b/c#f"
+    (show . parseURI $ "http://a.b/c#f")
+testAltFn02 = testEq "testAltFn02" "Just http://a.b/c#f"
+    (show . parseURIReference $ "http://a.b/c#f")
+testAltFn03 = testEq "testAltFn03" "Just c/d#f"
+    (show . parseRelativeReference $ "c/d#f")
+testAltFn04 = testEq "testAltFn04" "Nothing"
+    (show . parseRelativeReference $ "http://a.b/c#f")
+testAltFn05 = testEq "testAltFn05" "Just http://a.b/c"
+    (show . parseAbsoluteURI $ "http://a.b/c")
+testAltFn06 = testEq "testAltFn06" "Nothing"
+    (show . parseAbsoluteURI $ "http://a.b/c#f")
+testAltFn07 = testEq "testAltFn07" "Nothing"
+    (show . parseAbsoluteURI $ "c/d")
+testAltFn08 = testEq "testAltFn08" "Just http://a.b/c"
+    (show . parseAbsoluteURI $ "http://a.b/c")
+
+testAltFn11 = testEq "testAltFn11" True  (isURI "http://a.b/c#f")
+testAltFn12 = testEq "testAltFn12" True  (isURIReference "http://a.b/c#f")
+testAltFn13 = testEq "testAltFn13" True  (isRelativeReference "c/d#f")
+testAltFn14 = testEq "testAltFn14" False (isRelativeReference "http://a.b/c#f")
+testAltFn15 = testEq "testAltFn15" True  (isAbsoluteURI "http://a.b/c")
+testAltFn16 = testEq "testAltFn16" False (isAbsoluteURI "http://a.b/c#f")
+testAltFn17 = testEq "testAltFn17" False (isAbsoluteURI "c/d")
+
+testAltFn = TF.testGroup "testAltFn"
+  [ TF.testCase "testAltFn01" testAltFn01
+  , TF.testCase "testAltFn02" testAltFn02
+  , TF.testCase "testAltFn03" testAltFn03
+  , TF.testCase "testAltFn04" testAltFn04
+  , TF.testCase "testAltFn05" testAltFn05
+  , TF.testCase "testAltFn06" testAltFn06
+  , TF.testCase "testAltFn07" testAltFn07
+  , TF.testCase "testAltFn08" testAltFn08
+  , TF.testCase "testAltFn11" testAltFn11
+  , TF.testCase "testAltFn12" testAltFn12
+  , TF.testCase "testAltFn13" testAltFn13
+  , TF.testCase "testAltFn14" testAltFn14
+  , TF.testCase "testAltFn15" testAltFn15
+  , TF.testCase "testAltFn16" testAltFn16
+  , TF.testCase "testAltFn17" testAltFn17
+  ]
+
+testUriIsAbsolute :: String -> Assertion
+testUriIsAbsolute str =
+    assertBool str (uriIsAbsolute uri)
+    where
+    Just uri = parseURIReference str
+
+testUriIsRelative :: String -> Assertion
+testUriIsRelative str =
+    assertBool str (uriIsRelative uri)
+    where
+    Just uri = parseURIReference str
+
+testIsAbsolute = TF.testGroup "testIsAbsolute"
+  [ TF.testCase "testIsAbsolute01" $ testUriIsAbsolute "http://google.com"
+  , TF.testCase "testIsAbsolute02" $ testUriIsAbsolute "ftp://p.x.ca/woo?hai=a"
+  , TF.testCase "testIsAbsolute03" $ testUriIsAbsolute "mailto:bob@example.com"
+  ]
+
+testIsRelative = TF.testGroup "testIsRelative"
+  [ TF.testCase "testIsRelative01" $ testUriIsRelative "//google.com"
+  , TF.testCase "testIsRelative02" $ testUriIsRelative "/hello"
+  , TF.testCase "testIsRelative03" $ testUriIsRelative "this/is/a/path"
+  , TF.testCase "testIsRelative04" $ testUriIsRelative "?what=that"
+  ]
+
+-- Full test suite
+allTests =
+  [ testURIRefSuite
+  , testComponentSuite
+  , testRelativeSuite
+  , testRFC2396Suite
+  , testOddballSuite
+  , testNormalizeSuite
+  , testShowURI
+  , testEscapeURIString
+  , testNormalizeURIString
+  , testRelativeTo
+  , testAltFn
+  , testIsAbsolute
+  , testIsRelative
+  ]
+
+main = TF.defaultMain allTests
+
+runTestFile t = do
+    h <- openFile "a.tmp" WriteMode
+    _ <- runTestText (putTextToHandle h False) t
+    hClose h
+tf = runTestFile
+tt = runTestTT
+
+-- Miscellaneous values for hand-testing/debugging in Hugs:
+
+uref = testURIRefSuite
+tr01 = testRelative01
+tr02 = testRelative02
+tr03 = testRelative03
+tr04 = testRelative04
+rel  = testRelativeSuite
+rfc  = testRFC2396Suite
+oddb = testOddballSuite
+
+(Just bu02) = parseURIReference "http://example/x/y/z"
+(Just ou02) = parseURIReference "../abc"
+(Just ru02) = parseURIReference "http://example/x/abc"
+-- fileuri = testURIReference "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"
+
+cu02 = ou02 `relativeTo` bu02
+
+--------------------------------------------------------------------------------
+--
+--  Copyright (c) 2004, G. KLYNE.  All rights reserved.
+--  Distributed as free software under the following license.
+--
+--  Redistribution and use in source and binary forms, with or without
+--  modification, are permitted provided that the following conditions
+--  are met:
+--
+--  - Redistributions of source code must retain the above copyright notice,
+--  this list of conditions and the following disclaimer.
+--
+--  - Redistributions in binary form must reproduce the above copyright
+--  notice, this list of conditions and the following disclaimer in the
+--  documentation and/or other materials provided with the distribution.
+--
+--  - Neither name of the copyright holders nor the names of its
+--  contributors may be used to endorse or promote products derived from
+--  this software without specific prior written permission.
+--
+--  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS
+--  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+--  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+--  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+--  HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+--  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+--  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+--  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+--  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+--  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+--  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--
+--------------------------------------------------------------------------------
+-- $Source: /srv/cvs/cvs.haskell.org/fptools/libraries/network/tests/URITest.hs,v $
+-- $Author: gklyne $
+-- $Revision: 1.8 $
+-- $Log: URITest.hs,v $
+-- Revision 1.81 2012/08/01           aaronfriel
+-- Added additional test case for the "xip.io" service style URLs and absolute URLs prefixed with ipv4 addresses.
+--
+-- Revision 1.8  2005/07/19 22:01:27  gklyne
+-- Added some additional test cases raised by discussion on URI@w3.org mailing list about 2005-07-19.  The test p[roposed by this discussion exposed a subtle bug in relativeFrom not being an exact inverse of relativeTo.
+--
+-- Revision 1.7  2005/06/06 16:31:44  gklyne
+-- Added two new test cases.
+--
+-- Revision 1.6  2005/05/31 17:18:36  gklyne
+-- Added some additional test cases triggered by URI-list discussions.
+--
+-- Revision 1.5  2005/04/07 11:09:37  gklyne
+-- Added test cases for alternate parsing functions (including deprecated 'parseabsoluteURI')
+--
+-- Revision 1.4  2005/04/05 12:47:32  gklyne
+-- Added test case.
+-- Changed module name, now requires GHC -main-is to compile.
+-- All tests run OK with GHC 6.4 on MS-Windows.
+--
+-- Revision 1.3  2004/11/05 17:29:09  gklyne
+-- Changed password-obscuring logic to reflect late change in revised URI
+-- specification (password "anonymous" is no longer a special case).
+-- Updated URI test module to use function 'escapeURIString'.
+-- (Should unEscapeString be similarly updated?)
+--
+-- Revision 1.2  2004/10/27 13:06:55  gklyne
+-- Updated URI module function names per:
+-- http://www.haskell.org//pipermail/cvs-libraries/2004-October/002916.html
+-- Added test cases to give better covereage of module functions.
+--
+-- Revision 1.1  2004/10/14 16:11:30  gklyne
+-- Add URI unit test to cvs.haskell.org repository
+--
+-- Revision 1.17  2004/10/14 11:51:09  graham
+-- Confirm that URITest runs with GHC.
+-- Fix up some comments and other minor details.
+--
+-- Revision 1.16  2004/10/14 11:45:30  graham
+-- Use moduke name main for GHC 6.2
+--
+-- Revision 1.15  2004/08/11 11:07:39  graham
+-- Add new test case.
+--
+-- Revision 1.14  2004/06/30 11:35:27  graham
+-- Update URI code to use hierarchical libraries for Parsec and Network.
+--
+-- Revision 1.13  2004/06/22 16:19:16  graham
+-- New URI test case added.
+--
+-- Revision 1.12  2004/04/21 15:13:29  graham
+-- Add test case
+--
+-- Revision 1.11  2004/04/21 14:54:05  graham
+-- Fix up some tests
+--
+-- Revision 1.10  2004/04/20 14:54:13  graham
+-- Fix up test cases related to port number in authority,
+-- and add some more URI decomposition tests.
+--
+-- Revision 1.9  2004/04/07 15:06:17  graham
+-- Add extra test case
+-- Revise syntax in line with changes to RFC2396bis
+--
+-- Revision 1.8  2004/03/17 14:34:58  graham
+-- Add Network.HTTP files to CVS
+--
+-- Revision 1.7  2004/03/16 14:19:38  graham
+-- Change licence to BSD style;  add nullURI definition; new test cases.
+--
+-- Revision 1.6  2004/02/20 12:12:00  graham
+-- Add URI normalization functions
+--
+-- Revision 1.5  2004/02/19 23:19:35  graham
+-- Network.URI module passes all test cases
+--
+-- Revision 1.4  2004/02/17 20:06:02  graham
+-- Revised URI parser to reflect latest RFC2396bis (-04)
+--
+-- Revision 1.3  2004/02/11 14:32:14  graham
+-- Added work-in-progress notes.
+--
+-- Revision 1.2  2004/02/02 14:00:39  graham
+-- Fix optional host name in URI.  Add test cases.
+--
+-- Revision 1.1  2004/01/27 21:13:45  graham
+-- New URI module and test suite added,
+-- implementing the GHC Network.URI interface.
+--
diff --git a/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch
new file mode 100644
--- /dev/null
+++ b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch
@@ -0,0 +1,26 @@
+From 392602f5ff14c0b5a801397d075ddcbcd890aa83 Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Thu, 18 Apr 2013 17:50:59 -0400
+Subject: [PATCH] fix cross build
+
+---
+ src/Data/Profunctor/Unsafe.hs | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/src/Data/Profunctor/Unsafe.hs b/src/Data/Profunctor/Unsafe.hs
+index 025c7c4..0249274 100644
+--- a/src/Data/Profunctor/Unsafe.hs
++++ b/src/Data/Profunctor/Unsafe.hs
+@@ -40,9 +40,6 @@ import Data.Tagged
+ import Prelude hiding (id,(.),sequence)
+ import Unsafe.Coerce
+ 
+-{-# ANN module "Hlint: ignore Redundant lambda" #-}
+-{-# ANN module "Hlint: ignore Collapse lambdas" #-}
+-
+ infixr 9 #.
+ infixl 8 .#
+ 
+-- 
+1.8.2.rc3
+
diff --git a/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch b/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch
new file mode 100644
--- /dev/null
+++ b/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch
@@ -0,0 +1,33 @@
+From e82ed4e6fd7b5ea6dbe474b5de2755ec5794161c Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Thu, 16 Oct 2014 02:23:50 +0000
+Subject: [PATCH] stub out
+
+---
+ yesod-persistent.cabal | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/yesod-persistent.cabal b/yesod-persistent.cabal
+index b116f3a..017b184 100644
+--- a/yesod-persistent.cabal
++++ b/yesod-persistent.cabal
+@@ -14,16 +14,6 @@ description:     Some helpers for using Persistent from Yesod.
+ 
+ library
+     build-depends:   base                      >= 4        && < 5
+-                   , yesod-core                >= 1.2.2    && < 1.3
+-                   , persistent                >= 1.2      && < 2.1
+-                   , persistent-template       >= 1.2      && < 2.1
+-                   , transformers              >= 0.2.2
+-                   , blaze-builder
+-                   , conduit
+-                   , resourcet                 >= 0.4.5
+-                   , resource-pool
+-    exposed-modules: Yesod.Persist
+-                     Yesod.Persist.Core
+     ghc-options:     -Wall
+ 
+ test-suite test
+-- 
+2.1.1
+
