pads-haskell (empty) → 0.0.0.1
raw patch · 46 files changed
+10626/−0 lines, 46 filesdep +Cabaldep +Globdep +HUnitsetup-changedbinary-added
Dependencies added: Cabal, Glob, HUnit, QuickCheck, base, byteorder, bytestring, containers, directory, haskell-src, haskell-src-meta, mainland-pretty, mtl, normaldistribution, old-locale, parsec, random, regex-posix, syb, template-haskell, test-framework, test-framework-hunit, test-framework-quickcheck2, th-lift, time, transformers
Files
- Documentation/Info/PADS-Index.txt +104/−0
- Documentation/Info/PackagesUsedInPads.txt +37/−0
- Documentation/Info/Pads-grammar.tex +121/−0
- Examples/AI.hs +91/−0
- Examples/Binary.hs +74/−0
- Examples/First.hs +992/−0
- Examples/FirstPads.hs +8/−0
- Examples/Proc.hs +51/−0
- Examples/data/README +24/−0
- Examples/data/a2b.c +34/−0
- Examples/data/ai.3000 +3001/−0
- Examples/data/ai.big too large to diff
- Examples/data/binTest.a +1/−0
- Examples/data/binTest.b binary
- Examples/data/binary +1/−0
- Examples/data/calls10.a +11/−0
- Examples/data/calls10.b binary
- Examples/data/genBin.c +40/−0
- Examples/data/test_file +3/−0
- LICENSE +24/−0
- Language/Pads/BaseTypes.hs +155/−0
- Language/Pads/CodeGen.hs +1227/−0
- Language/Pads/CoreBaseTypes.hs +983/−0
- Language/Pads/Errors.hs +77/−0
- Language/Pads/GenPretty.hs +267/−0
- Language/Pads/Generic.hs +203/−0
- Language/Pads/Library/BigEndian.hs +63/−0
- Language/Pads/Library/BinaryUtilities.hs +114/−0
- Language/Pads/Library/LittleEndian.hs +64/−0
- Language/Pads/Library/Native.hs +78/−0
- Language/Pads/MetaData.hs +136/−0
- Language/Pads/PadsParser.hs +534/−0
- Language/Pads/PadsPrinter.hs +123/−0
- Language/Pads/Padsc.hs +59/−0
- Language/Pads/Parser.hs +439/−0
- Language/Pads/Pretty.hs +173/−0
- Language/Pads/Quote.hs +67/−0
- Language/Pads/RegExp.hs +20/−0
- Language/Pads/Source.hs +566/−0
- Language/Pads/Syntax.hs +191/−0
- Language/Pads/TH.hs +164/−0
- Language/Pads/Testing.hs +33/−0
- Setup.hs +2/−0
- Test/Examples.hs +77/−0
- Test/data/maps0 +33/−0
- pads-haskell.cabal +161/−0
+ Documentation/Info/PADS-Index.txt view
@@ -0,0 +1,104 @@+PACKAGE-RELATED FILES+pads-haskell.cabal+This file describes the pads-haskell package so that the pads/haskell library can be installed along with its dependencies using the tool cabal, which is part of the Haskell platform and is available on the homework.eecs.tufts.edu cluster. Instructions on using cabal to install packages are available from+ http://www.haskell.org/haskellwiki/Cabal-Install+When installing packages, you do not normally need to look at the contents of this file.++Instructions on creating a project.cabal file using the command cabal init are available from+ http://www.haskell.org/cabal/users-guide/developing-packages.html+You will need to create such a file for your project.++Setup.hs+This file is needed for the cabal packaging process. It is also created automatically as part of the cabal init process for creating a Haskell package.+++EXAMPLES+Examples/AI.hs+Contains a simple Pads description of a web sever log. Invoke using result n where n is the number of records from sample data file you would like to parse.++Examples/First.hs+Contains a regression of 89 simple pads examples. Invoke using function test.++Examples/Binary.hs+Contains a regression of 3 pads examples using binary data.+++PADS LANGUAGE FILES+Language/Pads+Directory containing all files in the implementation of the PADS/Haskell EDSL.++Language/Pads/Padsc.hs+Top-level file that exports all the functionality of the PADS language. Haskell files that want to use Pads just need to import Language.Pads.Padsc.++Language/Pads/Testing.hs+Code to describe and run unit tests.+++COMPILER FILES+Language/Pads/Quote.hs+Code to implement the Pads quasi-quoter.++Language/Pads/Syntax.hs+Parse tree data structure for representing Pads programs.++Language/Pads/Parser.hs+Parser for Pads syntax. The code in this file maps the input given in a quasi-quotation block into a Pads parse tree represented in the data structures defined in Language.Pads.Syntax.++Language/Pads/CodeGen.hs+Code to convert Pads parse tree data structures into corresponding Haskell code. The corresponding Haskell code is represented in the Template Haskell data structures from Language.Haskell.TH embedded in the Q Quasi-Quotation monad.++Language/Pads/RegExp.hs+Defines a dataype for representing regular expressions in Pads descriptions.++Language/Pads/TH.hs+Helper functions for building Template Haskell data structures relevant for PADS.++Language/Pads/GenPretty.hs+Code for pretty printing Pads Parse Tree data structures. Used mainly for debugging purposes.+++RUNTIME SYSTEM FILES+Language/Pads/PadsParser.hs+Code for parsing source files according to Pads descriptions.++Language/Pads/Source.hs+Code for manipulating input sources that will be parsed using Pads-generated tools.++Language/Pads/LazyLists.hs+Code for lazy-append lists.++Language/Pads/Library/Native.hs+Library support for parsing bytes and integers in the host machine native format.++Language/Pads/Library/BigEndian.hs+Library support for parsing bytes and integers in big endian format.++Language/Pads/Library/LittleEndian.hs+Library support for parsing bytes and integers in little endian format.++Language/Pads/Library/BinaryUtilities.hs+Code to manage different binary representations of bytes and integers.++Language/Pads/Generic.hs+Declaration of the Pads type class and corresponding generic functions+for parsing various forms of input and for generating default values.+++Language/Pads/MetaData.hs+Declaration of the Pads type class for meta data and for generic operations on meta-data.++Language/Pads/CoreBaseTypes.hs+Code to implement Pads base types that can’t be implemented as expressions in the Pads language.++Language/Pads/BaseTypes.hs+Code to implement Pads base types that can be implemented as expressions in the Pads language.++Language/Pads/Error.hs+Error messages that can be reported during parsing using a Pads description.++GENERATED TOOLS+Language/Pads/GenPretty.hs+Code for generating pretty-printers for data in the Pads in-memory representation.+++
+ Documentation/Info/PackagesUsedInPads.txt view
@@ -0,0 +1,37 @@+Key packages used in the implementation of Pads/Haskell++template-haskell+ http://hackage.haskell.org/package/template-haskell-2.9.0.0+ Language.Haskell.TH+ “This package provides modules containing facilities for manipulating Haskell source code using template Haskell” + This package provides support for Quasi-Quotation. To generate Haskell code, we define a quasi-quoter that represents the desired Haskell code in the data structures defined in this package. ++haskell-src+ https://hackage.haskell.org/package/haskell-src+ Language.Haskell.{Syntax, Parser, …}+ “The haskell-src package provides support for manipulating Haskell source code. The package provides a lexer, parser and pretty-printer, and a definition of a Haskell abstract syntax tree (AST). Common uses of this package are to parse or generate Haskell 98 code”+ Pads uses this library to parse embedded uses of Haskell in Pads descriptions into the data structures described in this package.+++haskell-src-meta+ https://hackage.haskell.org/package/haskell-src-meta+ Language.Haskell.Meta+ “The translation from haskell-src-exts abstract syntax to template-haskell abstract syntax isn't 100% complete yet.”+ This package provides routines to convert between the Template Haskell and Haskell Source representations for Haskell source code. Pads calls Haskell Source parser to convert Haskell expressions and patterns nested in Pads Code into the Haskell Source data structure for Haskell code. Pads then calls the haskell-src-meta translation routines to convert those data structures into Template Haskell data structures that the quasi-quoter can use.++parsec+ https://hackage.haskell.org/package/parsec+ Text.Parsec+ “Parsec is designed from scratch as an industrial-strength parser library. It is simple, safe, well documented (on the package homepage), has extensive libraries and good error messages, and is also fast. It is defined as a monad transformer that can be stacked on arbitrary monads, and it is also parametric in the input stream type.”+ Pads uses this library to define the parser for Pads syntax.+++mainland-pretty+ http://hackage.haskell.org/package/mainland-pretty-0.2.7+ Text.PrettyPrint.Mainland+ “Pretty printing designed for printing source code based on Wadler's paper A Prettier Printer. The main advantage of this library is its ability to automatically track the source locations associated with pretty printed values and output appropriate #line pragmas and its ability to produce output in the form of lazy text using a builder.”++HUnit+ http://hackage.haskell.org/package/HUnit+ Test.HUnit+ “HUnit is a unit testing framework for Haskell, inspired by the JUnit tool for Java, see: http://www.junit.org”
+ Documentation/Info/Pads-grammar.tex view
@@ -0,0 +1,121 @@+\documentclass{article}+\title{ PADS/Haskell Grammar}+\usepackage{fullpage}+\usepackage{syntax}+\author{Kathleen Fisher}+\date{October 5, 2014}++\setlength{\grammarindent}{6em}++\begin{document}++\maketitle+\thispagestyle{empty}++\begin{grammar}+<decls> ::= <decl>*++<dec> ::= <typeDecl> | <dataDecl> | <newDecl> | <obtainDecl>++<typeDecl> ::= "type" <padsID> <haskell-pat>? "=" <ptype>++<dataDecl> ::= "data" <padsID> <haskell-pat>? "=" <dataRHS> <derives>?++<newDecl> ::= "newtype" <padsID> <haskell-pat>? "=" <newRHS> <derives>?++<obtainDecl> ::= "obtain" <padsID> "from" <ptype> "using" <expression>++<padsID> ::= <upper><lower>*++<ptype> ::= <constrain> | <obtain> | <partition> | <listTy> | <value> | <btype>++<constrain> ::= "constrain" <haskell-pat> "::" <ptype> <predic>++<obtain> ::= "obtain" <ptype> "from" <ptype> "using" <expression>++<partition> ::= "partition" <ptype> "using" <expression>++<listTy> ::= "[" <listInside> "]" <listEnd>++<listInside> ::= <ptype> ("|" <ptype>)?++<listEnd> ::= "terminator" <ptype> | "length" <expression>++<value> ::= "value" <expression> "::" <ptype>++<btype> ::= <etype> <atype>* <expression>?++<etype> ::= <atype> | <expression>++<atype> ::= <tuple> | "[" <listInside> "]" | <qualUpper> | <tyvar>++<tuple> ::= "(" (<ptype> ("," <ptype>)*)? ")"++<dataRHS> ::= <switchTy> | <constrs>+ +<switchTy> ::= "case" <expression> "of" <branch> ("|" <branch>)*++<branch> ::= <haskell-pat> "->" <constr>++<constrs> ::= <constr> ("|" <constr>)*++<constr> ::= <upper> <record> <predic>? | <upper> <constrArgs>? <predic>?++<constrArgs> ::= ("!"? <etype>)+++<record> ::= "{" <field> ("," <field>)* "}"++<field> ::= <lower> "::" <ftype> <predic>? + \alt <lower> "=" "value" <expression> "::" <ftype> <predic>?+ \alt <ftype> <predic>?++<ftype> ::= "!" <atype> | <ptype>++<newRHS> ::= <upper> <record1> <predic>? | <upper> <atype> <predic>?++<record1> ::= "{" (<ftype> ",")* <field1> ("," <ftype>)* "}"++<field1> ::= <lower> "::" <ptype> <predic>?++<literal> ::= <charLit> | <reLit> | <stringLit> | <intLit> | <qualLower> | <qualUpper>++<predic> ::= "where" <expression>++<expression> ::= <h-exp> | <literal>++<h-exp> ::= "<|" <haskell-exp> "|>"++<derives> ::= "deriving" <qualUpper> | "deriving" "(" <qualUppers> ")"++<tyvar> ::= <lower>++<qualUpper> ::= <upper> | <qualUpper> "." <upper>++<qualLower> ::= <lower> | <qualUpper> "." <lower>++<qualUppers> ::= <qualUpper> | <qualUpper> "," <qualUppers>++<haskell-pat> ::= Parsed according to Language.Haskell.Meta.parsePat++<haskell-exp> ::= Parsed according to Language.Haskell.Meta.pareExp++<upper> ::= <identifier> with capitalized first character++<lower> ::= <identifier> with lowercase first character++<reLit> ::= Anything contained within single quotes (')++<charLit> ::= As defined in Text.Parsec.Token++<stringLit> ::= As defined in Text.Parsec.Token++<intLit> ::= As defined in Text.Parsec.Token++<identifier> ::= As defined in Text.Parsec.Token++<whiteSpace> :: As defined in Text.Parsec.Token+\end{grammar} ++\end{document}++
+ Examples/AI.hs view
@@ -0,0 +1,91 @@+{-# LANGUAGE TypeFamilies, ScopedTypeVariables, DeriveDataTypeable+ , MultiParamTypeClasses+ , TypeSynonymInstances+ , TemplateHaskell+ , QuasiQuotes+ , FlexibleInstances #-}++-- :set -ddump-splices++module Examples.AI where+import Language.Pads.Padsc+import Language.Pads.GenPretty++import System.IO.Unsafe (unsafePerformIO)+++[pads|+ newtype AI = AI ([Line Entry] terminator EOF)++ data Entry = Entry+ { host :: Src,+ ' ', identdID :: ID,+ ' ', httpID :: ID,+ ' ', time :: TimeStamp,+ ' ', request :: Request,+ ' ', response :: Response,+ ' ', contentLen :: ContentLength }++ data Src = Addr+ { a :: IPInt, '.'+ , b :: IPInt, '.'+ , c :: IPInt, '.'+ , d :: IPInt+ }+ | Name Host+ --type IP_v4 = (IPInt, '.', IPInt, '.', IPInt, '.', IPInt)+ type IPInt = constrain i :: Int where <| 0 <= i && i < 256 |>+ type Host = StringC ' '++ data ID = Missing '-' | Id (StringC ' ')++++ type TimeStamp = ('[', Date, ']')+ type Date = DateFC <|("%d/%h/%Y:%H:%M:%S %z", ']')|>++ data Request = Request+ { '"', method :: Method,+ ' ', url :: StringC ' ',+ ' ', version :: Version where <| checkVersion method version |>, '"'+ }++ data Method = GET | PUT | POST | HEAD | DELETE+ | LINK | UNLINK -- obsolete after http 1.0+ data Version = Version {"HTTP/", major :: Int, '.', minor :: Int} -- add constriants on major and minor mode++ type Response = constrain r :: Int where <| 100 <= r && r < 600 |>++ data ContentLength = NotAvailable '-' | ContentLength Int+ |]++checkVersion :: Method -> Version -> Bool+checkVersion method version =+ case method of+ LINK -> major version == 1 && minor version == 0+ UNLINK -> major version == 1 && minor version == 0+ _ -> True++++mkPrettyInstance ''AI+mkPrettyInstance ''AI_md++ai_file = ai_big+ai_3000 = "Examples/data/ai.3000"+ai_big = "Examples/data/ai.big"++-- (ai_rep, ai_md) = let (AI rep, md) = unsafePerformIO $ parseFile ai_file in (rep,md)+(AI ai_rep, ai_md) = unsafePerformIO $ parseFileWith aI_parseM ai_file+++ai_file_length = Prelude.length ai_rep+ai_file_take n = Prelude.take n ai_rep+test = ai_file_take 20++printAI n = putStrLn(pretty 100 (ppr (ai_file_take n)))++result n = do+ { (AI rep, md) <- parseFile ai_file+ ; return (Prelude.take n rep)+ }
+ Examples/Binary.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE TypeFamilies, TypeSynonymInstances, TemplateHaskell, QuasiQuotes, MultiParamTypeClasses, FlexibleInstances, DeriveDataTypeable, ScopedTypeVariables #-}+module Examples.Binary where+import Language.Pads.Padsc+import Language.Pads.Library.LittleEndian as LE+import qualified Language.Pads.Library.BigEndian as BE+import qualified Language.Pads.Library.Native as Native+import Language.Pads.Testing+import System.IO.Unsafe (unsafePerformIO)++test = runTestTT $ TestList tests++tests = [TestLabel "Calls" call_test+ ,TestLabel "Calls" callNoRec_test+ ,TestLabel "BaseTypes" testRec_test]+++[pads| data Call = Call+ { onpa :: Int32, obase :: LE.Int32+ , dpna :: Int32, dbase :: Int32+ , con :: Int32+ , dur :: Int32 }++ type Calls = [Call | EOR] terminator EOF+ type CallsB = partition Calls using <| bytes 24 |>++ type CallsNoRec = [Call] terminator EOF+ type CallsNoRecInstall = partition CallsNoRec using none+|]++call_input_file = "data/calls10.b"+call_result :: (Calls, Calls_md) = unsafePerformIO $ parseFileWith callsB_parseM call_input_file+call_expect = ([Call {onpa = 221, obase = 2360199, dpna = 936, dbase = 3615299, con = 96977709, dur = 71},Call {onpa = 221, obase = 2360399, dpna = 855, dbase = 5445599, con = 96978527, dur = 126},Call {onpa = 221, obase = 2390199, dpna = 974, dbase = 4298199, con = 96980122, dur = 990},Call {onpa = 221, obase = 2390399, dpna = 855, dbase = 5404599, con = 96976885, dur = 35},Call {onpa = 222, obase = 2332099, dpna = 426, dbase = 6814599, con = 96977173, dur = 4850},Call {onpa = 222, obase = 2332099, dpna = -15, dbase = 9999999, con = 96978457, dur = 533},Call {onpa = 222, obase = 2340599, dpna = 855, dbase = 8442799, con = 96980047, dur = 8},Call {onpa = 222, obase = 2341299, dpna = 855, dbase = 7081599, con = 96979104, dur = 11},Call {onpa = 223, obase = 2340099, dpna = 855, dbase = 2484499, con = 96977739, dur = 564},Call {onpa = 223, obase = 2340199, dpna = -15, dbase = 9999999, con = 96979345, dur = 143}],0)+call_test = mkFileTestCase "Call" call_expect call_result++callNoRec_result = unsafePerformIO $ parseFileWith callsNoRecInstall_parseM call_input_file+callNoRec_test = mkFileTestCase "CallNoRec" call_expect callNoRec_result++binary_input_file = "data/binary"+word32sbh_result :: (Word32, Base_md) = unsafePerformIO $ parseFileWith BE.word32_parseM binary_input_file+word32sbh_expect = (2864434397,0 )++word32sbl_result :: (Word32, Base_md) = unsafePerformIO $ parseFileWith LE.word32_parseM binary_input_file+word32sbl_expect = (3721182122,0)++{- on a little endian machine -}+word32_result :: (Word32, Base_md) = unsafePerformIO $ parseFileWith Native.word32_parseM binary_input_file+word32_expect = (3721182122,0)+++int32sbh_result :: (Int32, Base_md) = unsafePerformIO $ parseFileWith BE.int32_parseM binary_input_file+int32sbh_expect = (-1430532899,0)++int32sbl_result :: (Int32, Base_md) = unsafePerformIO $ parseFileWith LE.int32_parseM binary_input_file+int32sbl_expect = (-573785174,0 )++{- on a little endian machine -}+int32_result :: (Int32, Base_md) = unsafePerformIO $ parseFileWith Native.int32_parseM binary_input_file+int32_expect = (-573785174,0 )+++[pads| data TestRec = TestRec+ { w8 :: Word8+ , i8 :: Int8+ , w16 :: Word16+ , i16 :: Int16+ , j16 :: Int16+ , w32 :: Word32+ , i32 :: Int32+ } |]++testRec_input_file = "data/binTest.b"+testRec_result :: (TestRec, TestRec_md) = unsafePerformIO $ parseFileWith testRec_parseM testRec_input_file+testRec_expect = (TestRec {w8 = 25, i8 = 23, w16 = 300, i16 = -400, j16 = 899, w32 = 9876, i32 = -98744},0)+testRec_test = mkFileTestCase "BinaryBaseTypes" testRec_expect testRec_result
+ Examples/First.hs view
@@ -0,0 +1,992 @@+{-# LANGUAGE FlexibleContexts, TypeFamilies, TypeSynonymInstances, TemplateHaskell, QuasiQuotes,+ MultiParamTypeClasses, FlexibleInstances, UndecidableInstances,+ DeriveDataTypeable, ScopedTypeVariables #-}++module Examples.First where+import Language.Pads.Padsc+import Language.Pads.Testing+import Examples.FirstPads+import Language.Haskell.TH++import System.IO.Unsafe (unsafePerformIO)+import Data.Char as Char+import qualified Data.ByteString as B+import Data.Word++--import qualified Text.Regex.ByteString as BRE++ws = REd "[\t ]+|$" " "++---- PADS EXAMPLES++[pads| |]++[pads| type MyChar = Char |]+myChar_result = myChar_parseS "ab"+myChar_expects = ('a', 0,"b")+myChar_test = mkTestCase "myChar" myChar_expects myChar_result++[pads| type IntPair = (Int, '|', Int) |]+intPair_result = intPair_parseS "12|23"+intPair_expects = ((12,23), 0,"")+intPair_test = mkTestCase "intPair" intPair_expects intPair_result++[pads| type Bar = (Int, ',', IntPair, ';', Int) |] -- reference to another named type+bar_result = bar_parseS "256,12|23;456:"+bar_expects = ((256, (12, 23), 456), 0, ":")+bar_test = mkTestCase "bar" bar_expects bar_result++[pads| type Bar2 = (Int, ',', (Int,':',Int), ';', Int) |] -- nested tuple type.+bar2_result = bar2_parseS "56,23:46;29"+bar2_expects = ((56,(23,46),29), 0 ,"")+bar2_test = mkTestCase "bar2" bar2_expects bar2_result++[pads| type BazR = Line (Int, ',', Int) |] -- type that consumes a line boundary.+bazr_result = bazR_parseS "33,33\n"+bazr_expects = ((33,33),0,"")+bazr_test = mkTestCase "bazr" bazr_expects bazr_result++[pads| type MyInt = Int |] -- Integer base type+myInt_result = myInt_parseS "23"+myInt_expects = (23,0,"")+myInt_test = mkTestCase "myInt" myInt_expects myInt_result+++{- String base types -}+testStrLen = 2+computeLen x = x - 1+[pads| type StrTy = StringFW <| testStrLen + (computeLen 4) |> |]+inputStrTy = "catdog"+strTy_results = strTy_parseS inputStrTy+strTy_expects = ("catdo", 0,"g")+strTy_test = mkTestCase "strTy" strTy_expects strTy_results++[pads| type StrTy1 = StringC 'o' |]+strTy1_results = strTy1_parseS inputStrTy+strTy1_expects = ("catd",0,"og")+strTy1_test = mkTestCase "strTy1" strTy1_expects strTy1_results++[pads| type Baz = (StringFW 3,',',Int) |]+input_baz = "cat,123"+baz_results = baz_parseS input_baz+baz_expects = (("cat",123),0,"")+baz_test = mkTestCase "baz" baz_expects baz_results++{- Regular expression types -}+[pads| type StrME = StringME 'a+' |]+input_strME = "aaaab"+strME_results = strME_parseS input_strME++[pads| type StrSE = StringSE <|RE "b|c"|> |]+input_strSE_1 = "aaaab"+input_strSE_2 = "aaaac"+strSE_results_1 = strSE_parseS input_strSE_1+strSE_results_2 = strSE_parseS input_strSE_2++[pads| type StrP1 (x::Int) = StringFW <|x - 1|> |]+input_strP1 = "abcd"+strP1_result = strP1_parseS 3 input_strP1++[pads| type StrHex = StringME '[0-9A-Fa-f]+' |]+input_strHex = "12abcds"+strHex_result = strHex_parseS input_strHex++{- Testing for Phex32FW, which is in Pads.Language.BaseTypes -}+input_hex32FW = "12bc34"+phex32FW_results = phex32FW_parseS 4 input_hex32FW+phex32FW_expects = (4796, 0, "34")+phex32FW_test = mkTestCase "phex32FW" phex32FW_expects phex32FW_results++input2_hex32FW = "00bc34"+strhex32FW_result2 = phex32FW_parseS 4 input2_hex32FW -- ((Phex32FW (188),Errors: 0),"34")++input3_hex32FW = "gbc34"+strhex32FW_result3 = phex32FW_parseS 4 input3_hex32FW -- Prints error message++[pads| type HexPair = (Phex32FW 2, ',', Phex32FW 3) |]+input_hexpair = "aa,bbb"+hexpair_result = hexPair_parseS input_hexpair+++{- Constrained types -}+[pads| type IntRange = constrain x :: Int where <| 0 <= x && x <= 256 |> |]+intRange24_input = "24"+intRange0_input = "0"+intRange256_input = "256"+intRangeLow_input = "-23"+intRangeHigh_input = "512"+intRangeBad_input = "aaa"++result_intRange24 = intRange_parseS intRange24_input+expect_intRange24 = (24,0,"")+test_intRange24 = mkTestCase "IntRange24" expect_intRange24 result_intRange24++result_intRange0 = intRange_parseS intRange0_input+expect_intRange0 = (0,0,"")+test_intRange0 = mkTestCase "IntRange0" expect_intRange0 result_intRange0++result_intRange256 = intRange_parseS intRange256_input+expect_intRange256 = (256,0,"")+test_intRange256 = mkTestCase "IntRange256" expect_intRange256 result_intRange256++result_intRangeLow = intRange_parseS intRangeLow_input+expect_intRangeLow = ((-23),1,"")+test_intRangeLow = mkTestCase "IntRangeLow" expect_intRangeLow result_intRangeLow++result_intRangeHigh = intRange_parseS intRangeHigh_input+expect_intRangeHigh = (512,1,"")+test_intRangeHigh = mkTestCase "IntRangeHigh" expect_intRangeHigh result_intRangeHigh++result_intRangeBad = intRange_parseS intRangeBad_input+expect_intRangeBad = (0,1,"aaa")+test_intRangeBad = mkTestCase "IntRangeBad" expect_intRangeBad result_intRangeBad++{- Note that the special variable "md" is in scope in the body of the predicate. -}+{- md is the meta-data descriptor for the underyling type. -}++[pads| type IntRangeP (low::Int, high::Int) = constrain x :: Int where <| low <= x && x <= high && (numErrors md == 0) |> |]++result_intRangeP24 = intRangeP_parseS (0, 256) intRange24_input+expect_intRangeP24 = (24,0,"")+test_intRangeP24 = mkTestCase "IntRangeP24" expect_intRangeP24 result_intRangeP24++result_intRangeP0 = intRangeP_parseS (0, 256) intRange0_input+expect_intRangeP0 = (0,0,"")+test_intRangeP0 = mkTestCase "IntRangeP0" expect_intRangeP0 result_intRangeP0++result_intRangeP256 = intRangeP_parseS (0, 256) intRange256_input+expect_intRangeP256 = (256,0,"")+test_intRangeP256 = mkTestCase "IntRangeP256" expect_intRangeP256 result_intRangeP256++result_intRangePLow = intRangeP_parseS (0, 256) intRangeLow_input+expect_intRangePLow = ((-23), 1, "")+test_intRangePLow = mkTestCase "IntRangePLow" expect_intRangePLow result_intRangePLow+++result_intRangePHigh = intRangeP_parseS (0, 256) intRangeHigh_input+expect_intRangePHigh = (512, 1,"")+test_intRangePHigh = mkTestCase "IntRangePHigh" expect_intRangePHigh result_intRangePHigh+++result_intRangePBad = intRangeP_parseS (0, 256) intRangeBad_input+expect_intRangePBad = (0, 2,"aaa")+test_intRangePBad = mkTestCase "IntRangePBad" expect_intRangePBad result_intRangePBad+++++[pads| data Record (bound::Int) = Record+ { i1 :: Int,+ ',', i2 :: Int where <| i1 + i2 <= bound |> } |]++input_Record = "24,45"+result_Record = record_parseS 100 input_Record+expect_Record = (Record {i1 = 24, i2 = 45},0,"")+test_Record = mkTestCase "Record" expect_Record result_Record++[pads| data Id = Numeric Int+ | Alpha (StringC ',') |]++input_IdInt = "23"+result_IdInt = id_parseS input_IdInt+expect_IdInt = (Numeric 23,0,"")+test_IdInt = mkTestCase "IdInt" expect_IdInt result_IdInt++input_IdStr = "hello"+result_IdStr = id_parseS input_IdStr+expect_IdStr = (Alpha ("hello"),0,"")+test_IdStr = mkTestCase "IdAlpha" expect_IdStr result_IdStr++[pads| data Id2 (bound::Int) =+ Numeric2 (constrain n::Int where <| n <= bound |>)+ | Alpha2 (StringC ',') |]+input_IdInt2 = "23"+result_IdInt2 = id2_parseS 10 input_IdInt2+expect_IdInt2 = (Alpha2 ("23"),0,"")+test_IdInt2 = mkTestCase "IdInt2" expect_IdInt2 result_IdInt2++input_IdStr2 = "hello"+result_IdStr2 = id2_parseS 10 input_IdStr2+expect_IdStr2 = (Alpha2 ("hello"),0,"")+test_IdStr2 = mkTestCase "IdAlpha2" expect_IdStr2 result_IdStr2++++[pads| data Id3 = Numeric3 (IntRangeP <|(1,10)|>)+ | Numeric3a Int+ | Lit3 ',' |]+input_IdInt3 = "24"+result_IdInt3 = id3_parseS input_IdInt3+expect_IdInt3 = (Numeric3a (24),0,"")+test_IdInt3 = mkTestCase "IdInt3" expect_IdInt2 result_IdInt2++input_IdLit3 = ","+result_IdLit3 = id3_parseS input_IdLit3+expect_IdLit3 = (Lit3,0,"")+test_IdLit3 = mkTestCase "IdLit3" expect_IdLit3 result_IdLit3++++[pads| data Ab_or_a = AB "ab" | A "a" |]+input_AB = "ab"+result_Ab_or_a = ab_or_a_parseS input_AB+expect_Ab_or_a = (AB,0,"")+test_Ab_or_a = mkTestCase "Ab_or_a" expect_Ab_or_a result_Ab_or_a++[pads| data AB_test = AB_test { field_AB :: Ab_or_a , 'b'} |]+input_AB_test1 = "abb"+result_AB_test1 = aB_test_parseS input_AB_test1+expect_AB_test1 = (AB_test {field_AB = AB},0,"")+test_AB_test1 = mkTestCase "AB_test1" expect_AB_test1 result_AB_test1++input_AB_test2 = "ab"+result_AB_test2 = aB_test_parseS input_AB_test2+--expect_AB_test2 = (AB_test {field_AB = A},0,"") -- if backtracking+expect_AB_test2 = (AB_test {field_AB = AB},1,"")+test_AB_test2 = mkTestCase "AB_test2" expect_AB_test2 result_AB_test2++[pads| data Method = GET | PUT | LINK | UNLINK | POST+ data Version = Version+ {"HTTP/"+ , major :: Int, '.'+ , minor :: Int}+|]++checkVersion :: Method -> Version -> Bool+checkVersion method version =+ case method of+ LINK -> major version == 1 && minor version == 0+ UNLINK -> major version == 1 && minor version == 0+ _ -> True++[pads| data Request = Request+ { '"', method :: Method+ , ' ', url :: StringC ' '+ , ' ', version :: Version where <| checkVersion method version |>+ , '"'+ } |]++input_method_get = "GET"+result_method_get = method_parseS input_method_get+expect_method_get = (GET,0,"")+test_method_get = mkTestCase "Method_get" expect_method_get result_method_get++input_method_put = "PUT"+result_method_put = method_parseS input_method_put+expect_method_put = (PUT,0,"")+test_method_put = mkTestCase "Method_put" expect_method_put result_method_put+++input_method_link = "LINK"+result_method_link = method_parseS input_method_link+expect_method_link = (LINK,0,"")+test_method_link = mkTestCase "Method_link" expect_method_link result_method_link+++input_method_post = "POST"+result_method_post = method_parseS input_method_post+expect_method_post = (POST,0,"")+test_method_post = mkTestCase "Method_post" expect_method_post result_method_post+++input_version = "HTTP/1.2"+result_version = version_parseS input_version+expect_version = (Version {major = 1, minor = 2},0,"")+test_version = mkTestCase "Version" expect_version result_version++input_request_G = "\"PUT /www.google.com HTTP/1.0\""+result_request_G = request_parseS input_request_G+expect_request_G = (Request {method = PUT, url = "/www.google.com", version = Version {major = 1, minor = 0}}, 0, "")+test_request_G = mkTestCase "Request_G" expect_request_G result_request_G++input_request_B = "\"LINK /www.google.com HTTP/1.3\""+result_request_B = request_parseS input_request_B+expect_request_B = (Request {method = LINK, url = "/www.google.com", version = Version {major = 1, minor = 3}},1, "")+test_request_B = mkTestCase "Request_B" expect_request_B result_request_B++[pads| type Eor_Test = (Int, EOR, Int) |]+input_eor_test = "23\n56"+result_eor_test = eor_Test_parseS input_eor_test+expect_eor_test = ((23,56),0,"")+test_eor_test = mkTestCase "Eor_Test" expect_eor_test result_eor_test++[pads| type Eof_Test = (Int, EOR, Int, EOF) |]+input_eof_test_G = "23\n56"+result_eof_test_G = eof_Test_parseS input_eof_test_G+expect_eof_test_G = ((23,56),0,"")+test_eof_test_G = mkTestCase "Eof_TestG" expect_eof_test_G result_eof_test_G++input_eof_test_B = "23\n56ab"+result_eof_test_B = eof_Test_parseS input_eof_test_B+expect_eof_test_B = ((23,56), 1,"ab")+test_eof_test_B = mkTestCase "Eof_TestB" expect_eof_test_B result_eof_test_B++{- Restate after Maybe is implemented -}+[pads| type Opt_test = (Int, '|', Maybe Int, '|', Int) |]+input_opt_test_j = "34|35|56"+result_opt_test_j = opt_test_parseS input_opt_test_j+expect_opt_test_j = ((34,Just 35,56),0,"")+test_opt_test_j = mkTestCase "Opt_test_j" expect_opt_test_j result_opt_test_j++input_opt_test_n = "34||56"+result_opt_test_n = opt_test_parseS input_opt_test_n+expect_opt_test_n = ((34,Nothing,56),0,"")+test_opt_test_n = mkTestCase "Opt_test_n" expect_opt_test_n result_opt_test_n+++{- LIST EXAMPLES -}++[pads| type Entries_nosep_noterm = [StringFW 3] |]+input_entries_nosep_noterm = "123456789"+result_entries_nosep_noterm = entries_nosep_noterm_parseS input_entries_nosep_noterm+expect_entries_nosep_noterm = (["123","456","789"],0,"")+test_entries_nosep_noterm = mkTestCase "NoSep_NoTerm" expect_entries_nosep_noterm result_entries_nosep_noterm++input_entries_nosep_noterm' = "1234567890"+result_entries_nosep_noterm' = entries_nosep_noterm_parseS input_entries_nosep_noterm'+expect_entries_nosep_noterm' = (["123","456","789"],0,"0")+test_entries_nosep_noterm' = mkTestCase "NoSep_NoTerm'" expect_entries_nosep_noterm' result_entries_nosep_noterm'++[pads| type Entries_nosep_noterm2 = [Char] |]+input_entries_nosep_noterm2 = ""+result_entries_nosep_noterm2 = entries_nosep_noterm2_parseS input_entries_nosep_noterm2+expect_entries_nosep_noterm2 = ([],0,"")+test_entries_nosep_noterm2 = mkTestCase "NoSep_NoTerm2" expect_entries_nosep_noterm2 result_entries_nosep_noterm2+++[pads| type EvenInt = constrain x :: Digit where <| x `mod` 2 == 0 |>+ type EvenInts = [EvenInt] |]+input_evenInts = "2465"+result_evenInt = evenInt_parseS input_evenInts+expect_evenInt = ( 2,0,"465")+test_evenInt = mkTestCase "EvenInt" expect_evenInt result_evenInt++result_evenInts = evenInts_parseS input_evenInts+expect_evenInts = ([2,4,6],0,"5")+test_evenInts = mkTestCase "EvenInts" expect_evenInts result_evenInts+++[pads| type DigitList = [Digit | ','] |]+input_digitListG = "1,2,3"+input_digitList2G = "1,2,3|fed"+input_digitListB = "1,b,3"+result_digitListG = digitList_parseS input_digitListG+expect_digitListG = ([1,2,3],0,"")+test_digitListG = mkTestCase "DigitListG" expect_digitListG result_digitListG++result_digitList2G = digitList_parseS input_digitList2G+expect_digitList2G = ([1,2,3],0,"|fed")+test_digitList2G = mkTestCase "DigitList2G" expect_digitList2G result_digitList2G++result_digitListB = digitList_parseS input_digitListB+expect_digitListB = ([1],0,",b,3")+test_digitListB = mkTestCase "DigitListB" expect_digitListB result_digitListB++[pads| type DigitListLen (x::Int) = [Digit] length <|x + 1 |> |]+input_digitListLenG = "123456"+input_digitListLenB = "12a456"++result_digitListLenG = digitListLen_parseS 4 input_digitListLenG+expect_digitListLenG = ([1,2,3,4,5],0,"6")+test_digitListLenG = mkTestCase "DigitListLenG" expect_digitListLenG result_digitListLenG++result_digitListLenB = digitListLen_parseS 4 input_digitListLenB+expect_digitListLenB = ([1,2,0,4,5],1 ,"6")+test_digitListLenB = mkTestCase "DigitListLenB" expect_digitListLenB result_digitListLenB+++[pads| type DigitListLenSep (x::Int) = [Digit | "ab" ] length <|x + 1|> |]+input_digitListLenSepG = "1ab2ab3ab4ab5ab6ab7ab"+input_digitListLenSepB = "1ab2ab3abDab5ab6ab7ab"+result_digitListLenSepG = digitListLenSep_parseS 4 input_digitListLenSepG+expect_digitListLenSepG = ([1,2,3,4,5],0,"ab6ab7ab")+test_digitListLenSepG = mkTestCase "DigitListLenSepG" expect_digitListLenSepG result_digitListLenSepG++result_digitListLenSepB = digitListLenSep_parseS 4 input_digitListLenSepB+expect_digitListLenSepB = ([1,2,3,0,5],1,"ab6ab7ab")+test_digitListLenSepB = mkTestCase "DigitListLenSepB" expect_digitListLenSepB result_digitListLenSepB+++[pads| type DigitListTerm = [Digit] terminator EOR|]+input_digitListTermG = "12345\nhello"+result_digitListTermG = digitListTerm_parseS input_digitListTermG+expect_digitListTermG = ([1,2,3,4,5],0,"hello")+test_digitListTermG = mkTestCase "DigitListTermG" expect_digitListTermG result_digitListTermG++input_digitListTermB = "12345,h"+result_digitListTermB = digitListTerm_parseS input_digitListTermB+expect_digitListTermB = ([1,2,3,4,5,0,0],2,"")+test_digitListTermB = mkTestCase "DigitListTermB" expect_digitListTermB result_digitListTermB++[pads| type DigitListTermSep = [Digit | '|' ] terminator ';' |]+input_digitListTermSepG = "1|2|3|4|5|6;hello"+result_digitListTermSepG = digitListTermSep_parseS input_digitListTermSepG+expect_digitListTermSepG = ([1,2,3,4,5,6], 0,"hello")+test_digitListTermSepG = mkTestCase "digitListTermSepG" expect_digitListTermSepG result_digitListTermSepG++input_digitListTermSepB = "1|2|3|4|56;hello"+result_digitListTermSepB = digitListTermSep_parseS input_digitListTermSepB+expect_digitListTermSepB = ([1,2,3,4,5],1,"hello")+test_digitListTermSepB = mkTestCase "digitListTermSepB" expect_digitListTermSepB result_digitListTermSepB++[pads| type TryTest = (Try Char, StringFW 3) |]+input_tryTest = "abc123"+result_tryTest = tryTest_parseS input_tryTest+expect_tryTest = (('a',"abc"),0,"123")+test_tryTest = mkTestCase "tryTest" expect_tryTest result_tryTest++[pads| type TryTestD = (Try Digit, StringFW 3) |]+input_tryTestDG = "123abc"+result_tryTestDG = tryTestD_parseS input_tryTestDG+expect_tryTestDG = ((1,"123"),0,"abc")+test_tryTestDG = mkTestCase "tryTestDG" expect_tryTestDG result_tryTestDG++-- Note that 'try_parseM' does not return an error when it fails to parse a+-- digit (and therefore uses the default value of "0") because a "try" parser+-- should fail silently, similar to how the 'try' combinator works in parsec.+input_tryTestDB = "abc123"+result_tryTestDB = tryTestD_parseS input_tryTestDB+expect_tryTestDB = ((0,"abc"),0,"123")+test_tryTestDB = mkTestCase "tryTestDB" expect_tryTestDB result_tryTestDB++{- ((TryTestD (0,"abc"),+ (Errors: 1 Encountered a when expecting Digit. at: Line: 0, Offset:+ 0,(Errors: 1 Encountered a when expecting Digit. at: Line: 0, Offset:+ 0,Errors: 0))),"123")++ XXX: we are getting a repeat error message because of change to how errors are+ propagated. Need to work on cleaning up error reporting.+-}+++[pads| type ListWithTry = ([Char] terminator (Try Digit), Digit) |]+input_ListWithTry = "cat123"+result_ListWithTry = listWithTry_parseS input_ListWithTry+expect_ListWithTry = ((['c', 'a', 't'],1),0,"23")+test_ListWithTry = mkTestCase "ListWithTry" expect_ListWithTry result_ListWithTry++++[pads| type WithVoid = (Char, ',', Void, '|') |]+input_WithVoid = "a,|rest"+result_WithVoid = withVoid_parseS input_WithVoid+expect_WithVoid = ('a',0,"rest")+test_WithVoid = mkTestCase "WithVoid" expect_WithVoid result_WithVoid++[pads| data VoidOpt = PDigit Digit | Pcolor "red" | Pnothing Void+ type VoidEntry = (VoidOpt, StringFW 3) |]+input_voidEntry1 = "9abcdef"+result_voidEntry1 = voidEntry_parseS input_voidEntry1+expect_voidEntry1 = ((PDigit 9,"abc"),0,"def")+test_voidEntry1 = mkTestCase "VoidEntry1" expect_voidEntry1 result_voidEntry1++input_voidEntry2 = "redabcdef"+result_voidEntry2 = voidEntry_parseS input_voidEntry2+expect_voidEntry2 = ((Pcolor,"abc"),0,"def")+test_voidEntry2 = mkTestCase "VoidEntry2" expect_voidEntry2 result_voidEntry2++input_voidEntry3 = "abcdef"+result_voidEntry3 = voidEntry_parseS input_voidEntry3+expect_voidEntry3 = ((Pnothing,"abc"),0,"def")+test_voidEntry3 = mkTestCase "VoidEntry3" expect_voidEntry3 result_voidEntry3++[pads| data Switch (which :: Int) =+ case <| which |> of+ 0 -> Even Int where <| even `mod` 2 == 0 |>+ | 1 -> Comma ','+ | otherwise -> Missing Void |]+input_switch0 = "2hello"+input_switch1 = ",hello"+input_switchOther = "hello"++result_switch0 = switch_parseS 0 input_switch0+expect_switch0 = (Even (2),0,"hello")+test_switch0 = mkTestCase "switch0" expect_switch0 result_switch0++result_switch1 = switch_parseS 1 input_switch1+expect_switch1 = (Comma,0,"hello")+test_switch1 = mkTestCase "switch1" expect_switch1 result_switch1++result_switchOther = switch_parseS 2 input_switchOther+expect_switchOther = (Missing,0,"hello")+test_switchOther = mkTestCase "switchOther" expect_switchOther result_switchOther++++result_stringln = stringLn_parseS "hello\ngoodbye"+expect_stringln = ("hello",0,"\ngoodbye")+test_stringln = mkTestCase "stringln" expect_stringln result_stringln++[pads| data MyBody (which::Int) =+ case <| which |> of+ 0 -> First Int+ | 1 -> Second (StringC ',')+ | otherwise -> Other Void++ data MyEntry = MyEntry+ { header :: Int, ','+ , body :: MyBody header, ','+ , trailer :: Char}++ type MyData = [Line MyEntry] terminator EOF |]++input_myData = "0,23,a\n1,hello,b\n2,,c\n"+result_myData = myData_parseS input_myData+expect_myData = ([MyEntry {header = 0, body = First (23), trailer = 'a'},+ MyEntry {header = 1, body = Second ("hello"), trailer = 'b'},+ MyEntry {header = 2, body = Other, trailer = 'c'}],0, "")+test_myData = mkTestCase "MyData" expect_myData result_myData++++[pads| data HP = HP { student_num :: Int, ',',+ student_name :: StringFW student_num }+ type HP_data = [Line HP] terminator EOF |]++input_hp_data = "8,Hermione\n3,Ron\n5,Harry\n"+result_hp_data = hP_data_parseS input_hp_data+expect_hp_data = ([HP {student_num = 8, student_name = "Hermione"},+ HP {student_num = 3, student_name = "Ron"},+ HP {student_num = 5, student_name = "Harry"}], 0, "")+test_hp_data = mkTestCase "HP Data" expect_hp_data result_hp_data++++test_file = "Examples/data/test_file"+result_hp_data_file_parse :: (HP_data, HP_data_md) = unsafePerformIO $ parseFileWith hP_data_parseM test_file++expect_hp_data_file_parse =+ ( [HP {student_num = 8, student_name = "Hermione"},+ HP {student_num = 3, student_name = "Ron"},+ HP {student_num = 5, student_name = "Harry"}], 0)+test_hp_data_file_parse = mkFileTestCase "HP file" expect_hp_data_file_parse result_hp_data_file_parse++++strToBS = B.pack . (map chrToWord8)++[pads| newtype MyDoc = MyDoc Text |]+myDoc_input_file = "Examples/data/test_file"+myDoc_result :: (MyDoc, MyDoc_md) = unsafePerformIO $ parseFile myDoc_input_file+myDoc_expects = (MyDoc (Text (strToBS "8,Hermione\n3,Ron\n5,Harry\n")),0)+myDoc_test = mkFileTestCase "myDoc" myDoc_expects myDoc_result+++acomma = ","+[pads| data LitRec = LitRec { fstField :: Int, acomma, sndField :: Int} |]+litRec_input = "12,34"+litRec_result = litRec_parseS litRec_input+litRec_expects = (LitRec {fstField = 12, sndField = 34},0,"")+litRec_test = mkTestCase "Haskell identifier literal" litRec_expects litRec_result++[pads| type WhiteSpace = (Int, '[ \t]+', Int) |]+whiteSpace_input = "12 34"+whiteSpace_result = whiteSpace_parseS whiteSpace_input+whiteSpace_expects = ((12,34),0,"")+whiteSpace_test = mkTestCase "regular expression literal" whiteSpace_expects whiteSpace_result++++[pads| type WhiteSpace2 = (Int, ws, Int) |]+whiteSpace2_input = "12 34"+whiteSpace2_result = whiteSpace2_parseS whiteSpace2_input+whiteSpace2_expects = ((12,34),0,"")+whiteSpace2_test = mkTestCase "Haskell expression regular expression literal" whiteSpace2_expects whiteSpace2_result++[pads| type RE_ty = (StringME '[tod]', ws, StringME 'a+') |]+rE_ty_input = "t aaaa"+rE_ty_result = rE_ty_parseS rE_ty_input+rE_ty_expects = (("t","aaaa"),0,"")+rE_ty_test = mkTestCase "regular expression abbreviation for StringME" rE_ty_expects rE_ty_result+++[pads| type Disc = (Int, EOR, Int, EOR, (partition (Int, EOR, Int, EOR) using windows), Int, EOR) |]+disc_input = "1\n2\n3\r\n4\r\n5\n"+disc_result = disc_parseS disc_input+disc_expects = ((1,2,(3,4),5),0,"")+disc_test = mkTestCase "multiple record disciplines" disc_expects disc_result++[pads| data Exxy a = Exxy {exxy :: Int, aa :: a}+ type ExxyInt = Exxy Char |]+exxy_input = "32635def"+exxy_result = exxyInt_parseS exxy_input+exxy_expects = (Exxy {exxy = 32635, aa = 'd'},0,"ef")+exxy_test = mkTestCase "label overlap" exxy_expects exxy_result++[pads| type OneLine = [Char] terminator EOR+ type Lines = [OneLine] terminator EOF+ type LinesFW = partition Lines using <| bytes 3 |>+|]++linesFW_input = "123456789"+linesFW_result = linesFW_parseS linesFW_input+linesFW_expects = (["123","456","789"],0,"")+linesFW_test = mkTestCase "fixed-width record discpline" linesFW_expects linesFW_result+++[pads| type Strs = [StringSE ws | ws] terminator EOR |]+strs_input = "0.700264\n"+strs_result = strs_parseS strs_input++[pads| data Vals = Vals { vv :: Int, uu = value <| even vv |> :: Bool, ww::Char} |]+vals_input = "123x"+vals_result = vals_parseS vals_input+vals_expects = (Vals {vv=123,uu=False,ww='x'},0,"")+vals_test = mkTestCase "values" vals_expects vals_result++[pads| data Vals2 = Vals2 { vv2 :: (Int,",",Int),+ uu2 = value <| fst vv2 `mod` snd vv2 == 0 |> :: Bool,+ ww2 :: Char} |]+vals2_input = "12,3x"+vals2_result = vals2_parseS vals2_input+vals2_expects = (Vals2 {vv2=(12,3),uu2=True,ww2='x'},0,"")+vals2_test = mkTestCase "values" vals2_expects vals2_result+++{-+[pads| data Vals3 a = Vals3 { vv3 :: (Int,",",Int),+ uu3 = value <| [] |> :: [a],+ ww3 :: Char} |]+vals3_input = "12,3x"+vals3_result = vals3_parseS vals3_input+vals3_expects = (Vals3 {vv3=(12,3),uu3=[],ww3='x'},0,"")+vals3_test = mkTestCase "values" vals3_expects vals3_result+-}++[pads| type Doubles = [Double | EOR] terminator EOF |]+doubles_input = "12.34\n1\n-12.0\n1.3e4\n1.2e-2"+doubles_result = doubles_parseS doubles_input+doubles_expects = ([12.34,1.0,-12.0,13000.0,1.2e-2],0,"")+doubles_test = mkTestCase "doubles" doubles_expects doubles_result++[pads| type StringSEs = [StringSE <|RE "$"|> | EOR] terminator EOF |]++stringSEs_input = "12.34\n1\n-12.0\n1.3e4\n1.2e-2"+stringSEs_result = stringSEs_parseS stringSEs_input+stringSEs_expects = (["12.34","1","-12.0","1.3e4","1.2e-2"],0,"")+stringSEs_test = mkTestCase "stringSEs" stringSEs_expects stringSEs_result++[pads| type StringFWs = [StringFW 3| EOR] terminator EOF |]+stringFWs_input = "abc\nabcd\nab\nabc"+stringFWs_result = stringFWs_parseS stringFWs_input+stringFWs_expects = (["abc","abc","XXX","abc"],2,"")+stringFWs_test = mkTestCase "stringFWs" stringFWs_expects stringFWs_result+++[pads| type StringESCs = [(StringESC <| ('!', ";,") |>, '[;,]') | EOR] terminator EOF |]+stringESCs_input = "abc\na;\nb,\na!;bc,\na!,cd\nhe!"+stringESCs_result = stringESCs_parseS stringESCs_input+stringESCs_expects = (["abc","a","b","a;bc","a,cd","he!"],4, "")+stringESCs_test = mkTestCase "stringESCs" stringESCs_expects stringESCs_result++[pads| type StringPs = [StringP Char.isDigit | EOR] terminator EOF |]+stringPs_input = "123\na\n123a"+stringPs_result = stringPs_parseS stringPs_input+stringPs_expects = (["123","","123"],2, "")+stringPs_test = mkTestCase "stringPs" stringPs_expects stringPs_result++{- Bit-level functionality tests -}++[pads| type BitBools = (partition [BitBool] using none) |]+bitBools_input = "a" -- binary 01100001+bitBools_result = bitBools_parseS bitBools_input+bitBools_expects = ([False,True,True,False,False,False,False,True], 0, "")+bitBools_test = mkTestCase "bitBools" bitBools_expects bitBools_result++bitBools_input2 = "a\n" -- binary 01100001 00001010+bitBools_result2 = bitBools_parseS bitBools_input2+bitBools_expects2 = ([False,True,True,False,False,False,False,True,+ False,False,False,False,True,False,True,False], 0, "")+bitBools_test2 = mkTestCase "bitBools" bitBools_expects2 bitBools_result2++[pads| type IncompleteBitBools = (partition (BitBool,+ BitBool,+ BitBool) using none) |]+incompleteBitBools_input = "4"+incompleteBitBools_result = incompleteBitBools_parseS incompleteBitBools_input+incompleteBitBools_expects = ((False,False,True), 0, "4")+incompleteBitBools_test = mkTestCase "incompleteBitBools"+ incompleteBitBools_expects+ incompleteBitBools_result++[pads| type ArithPixel = (partition (Bits16 9,+ Bits8 5,+ Bits8 5,+ Bits8 5,+ Bits8 4,+ Bits8 4) using none) |]+arithPixel_input = map word8ToChr [136,114,32,0]+arithPixel_result = arithPixel_parseS arithPixel_input+arithPixel_expects = ((272,28,17,0,0,0), 0, "")+arithPixel_test = mkTestCase "arithPixel" arithPixel_expects arithPixel_result++[pads| type Mixed = (partition (StringC ' ',+ ' ',+ Bits8 4,+ BitBool,+ Bits8 3,+ Char) using none) |]++mixed_input = "Hello " ++ (map word8ToChr [74]) ++ "c"+mixed_result = mixed_parseS mixed_input+mixed_expects = (("Hello",4,True,2,'c'), 0, "")+mixed_test = mkTestCase "mixed" mixed_expects mixed_result++[pads| type OddWidths = (partition (Bits32 19,+ Bits64 39,+ Bits8 1,+ Bits8 5) using none) |]++oddWidths_input = map word8ToChr [104,46,174,3,185,8,6,158]+oddWidths_result = oddWidths_parseS oddWidths_input+oddWidths_expects = ((213365,240768000026,0,30), 0, "")+oddWidths_test = mkTestCase "oddWidths" oddWidths_expects oddWidths_result++[pads| type LargeWidths = (partition (Bits8 7,+ BitField 89,+ BitField 65) using none) |]++largeWidths_input = map word8ToChr [1,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,128]+largeWidths_result = largeWidths_parseS largeWidths_input+largeWidths_expects = ((0,309485009821345068724781057,18446744073709551617), 0, map word8ToChr [128])+largeWidths_test = mkTestCase "largeWidths" largeWidths_expects largeWidths_result++[pads| data EnumType (x :: Bits8) = case x of 0 -> ZERO {}+ | 1 -> ONE {}+ | 2 -> TWO {}+ | _ -> OTHER {}++ data Enumerate = Enumerate {x :: Bits8 3,+ Bits8 5,+ y :: EnumType x}++ type Enumerated = (partition Enumerate using none) |]++enumerated_input = map word8ToChr [64]+enumerated_result = enumerated_parseS enumerated_input+enumerated_expects = (Enumerate {x = 2, y = TWO}, 0, "")+enumerated_test = mkTestCase "Enumerated" enumerated_expects enumerated_result++enumerated_input_wc = map word8ToChr [255]+enumerated_result_wc = enumerated_parseS enumerated_input_wc+enumerated_expects_wc = (Enumerate {x = 7, y = OTHER}, 0, "")+enumerated_test_wc = mkTestCase "EnumeratedWC" enumerated_expects_wc enumerated_result_wc++[pads| data EnumTypeBool (x' :: BitBool) = case x' of True -> ON {}+ | False -> OFF {}++ data EnumerateBool = EnumerateBool {Bits8 7,+ x' :: BitBool,+ y' :: EnumTypeBool x'}++ type EnumeratedBool = (partition EnumerateBool using none) |]++enumeratedBool_input = map word8ToChr [1]+enumeratedBool_result = enumeratedBool_parseS enumeratedBool_input+enumeratedBool_expects = (EnumerateBool {x' = True, y' = ON}, 0, "")+enumeratedBool_test = mkTestCase "EnumeratedBool" enumeratedBool_expects enumeratedBool_result++[pads| type NBA_char = (partition (Bits8 3, CharNB, Bits8 5) using none) |]++nBA_char_input = map word8ToChr [70,181] -- 01000110 10110101+nBA_char_result = nBA_char_parseS nBA_char_input+nBA_char_expects = ((2,'5',21), 0, "") -- 010 00110101 10101+nBA_char_test = mkTestCase "NBA_char" nBA_char_expects nBA_char_result++[pads| type NBA_char_aligned = (partition (CharNB, CharNB) using none)|]++nBA_char_aligned_input = map word8ToChr [70,181]+nBA_char_aligned_result = nBA_char_aligned_parseS nBA_char_aligned_input+nBA_char_aligned_expects = ((word8ToChr 70, word8ToChr 181), 0, "")+nBA_char_aligned_test = mkTestCase "NBA_char_aligned" nBA_char_aligned_expects nBA_char_aligned_result++[pads| type NBA_BS = (partition (Bits8 6, BytesNB 2, Bits8 2) using none) |]++nBA_BS_input = map word8ToChr [99,234,3] -- 01100011 11101010 0000011+nBA_BS_result = nBA_BS_parseS nBA_BS_input+nBA_BS_expects = ((24, B.pack [250,128], 3), 0, "")+nBA_BS_test = mkTestCase "NBA_BS" nBA_BS_expects nBA_BS_result++[pads| type NBA_BS_aligned = (partition (BytesNB 4) using none) |]++nBA_BS_aligned_input = map word8ToChr [9,8,7,255]+nBA_BS_aligned_result = nBA_BS_aligned_parseS nBA_BS_aligned_input+nBA_BS_aligned_expects = ((B.pack [9,8,7,255]), 0, "")+nBA_BS_aligned_test = mkTestCase "NBA_BS_aligned" nBA_BS_aligned_expects nBA_BS_aligned_result++[pads| type NBA_BS_empty = (partition (BytesNB 1) using none) |]++nBA_BS_empty_input = ""+nBA_BS_empty_result = nBA_BS_empty_parseS nBA_BS_empty_input+nBA_BS_empty_expects = ((B.singleton 0), 1, "")+nBA_BS_empty_test = mkTestCase "NBA_BS_empty" nBA_BS_empty_expects nBA_BS_empty_result++[pads| type NBA_StringFW = (partition (Bits8 4, StringFWNB 3, Bits8 4) using none) |]++nBA_StringFW_input = map word8ToChr [134,22,38,63] --1000 0110 0001 0110 0010 0110 0011 1111+nBA_StringFW_result = nBA_StringFW_parseS nBA_StringFW_input+nBA_StringFW_expects = ((8,"abc",15),0,"")+nBA_StringFW_test = mkTestCase "NBA_StringFW" nBA_StringFW_expects nBA_StringFW_result++[pads| type NBA_StringFW_aligned = (partition (StringFWNB 15) using none) |]++nBA_StringFW_aligned_input = map word8ToChr (replicate 15 97)+nBA_StringFW_aligned_result = nBA_StringFW_aligned_parseS nBA_StringFW_aligned_input+nBA_StringFW_aligned_expects = (("aaaaaaaaaaaaaaa"),0,"")+nBA_StringFW_aligned_test = mkTestCase "NBA_StringFW_aligned" nBA_StringFW_aligned_expects nBA_StringFW_aligned_result++[pads| type NBA_StringFW_err = (partition (StringFWNB 3) using none) |]++nBA_StringFW_err_input = map word8ToChr [99,99]+nBA_StringFW_err_result = nBA_StringFW_err_parseS nBA_StringFW_err_input+nBA_StringFW_err_expects = (("XXX"),1,"")+nBA_StringFW_err_test = mkTestCase "NBA_StringFW_err" nBA_StringFW_err_expects nBA_StringFW_err_result++[pads| type NBA_StringC = (partition (Bits8 2, StringCNB 'z', CharNB, Bits8 6) using none) |]++nBA_StringC_input = map word8ToChr [158,30,94,149] -- 10 011110 00 011110 01 011110 10 010101+nBA_StringC_result = nBA_StringC_parseS nBA_StringC_input+nBA_StringC_expects = ((2,"xy",'z',21),0,"")+nBA_StringC_test = mkTestCase "NBA_StringC" nBA_StringC_expects nBA_StringC_result++[pads| type NBA_StringC_aligned = (partition (StringCNB 'z') using none) |]++nBA_StringC_aligned_input = "xyz"+nBA_StringC_aligned_result = nBA_StringC_aligned_parseS nBA_StringC_aligned_input+nBA_StringC_aligned_expects = (("xy"),0,"z")+nBA_StringC_aligned_test = mkTestCase "NBA_StringC_aligned" nBA_StringC_aligned_expects nBA_StringC_aligned_result++$(make_pads_declarations $ map snd padsExp)++padsExp_ast =+ [ ("Halloween", PadsDeclType "Halloween" [] Nothing+ ( PList (PApp [PTycon ["StringFW"]] (Just (LitE (IntegerL 4))))+ (Just (PTycon ["EOR"]))+ (Just (LTerm (PTycon ["EOF"])))))]+padsExp_input = "karl\njred\nmatt\nsam_"+padsExp_result = halloween_parseS padsExp_input+padsExp_expects = (["karl", "jred", "matt", "sam_"], 0, "")+padsExp_test = TestCase (assertEqual "padsExp" padsExp padsExp_ast) -- mkTestCase "padsExp" padsExp padsExp_ast+padsExp_test2 = mkTestCase "padsExp" padsExp_expects padsExp_result++++-- | Regression tests need to be run from the root directory of the pads-haskell+-- package because the data file paths in these test cases use paths relative to+-- the root.+test = runTestTT (TestList tests)+++tests = [ TestLabel "MyChar" myChar_test+ , TestLabel "IntPair" intPair_test+ , TestLabel "Bar" bar_test+ , TestLabel "Bar2" bar2_test+ , TestLabel "Bazr" bazr_test+ , TestLabel "MyInt" myInt_test+ , TestLabel "StrTy" strTy_test+ , TestLabel "StrTy1" strTy1_test+ , TestLabel "Baz" baz_test+ , TestLabel "Phex32FW" phex32FW_test+ , TestLabel "IntRange" test_intRange24+ , TestLabel "IntRange" test_intRange0+ , TestLabel "IntRange" test_intRange256+ , TestLabel "IntRange" test_intRangeLow+ , TestLabel "IntRange" test_intRangeHigh+ , TestLabel "IntRange" test_intRangeBad+ , TestLabel "IntRangeP" test_intRangeP24+ , TestLabel "IntRangeP" test_intRangeP0+ , TestLabel "IntRangeP" test_intRangeP256+ , TestLabel "IntRangeP" test_intRangePLow+ , TestLabel "IntRangeP" test_intRangePHigh+ , TestLabel "IntRangeP" test_intRangePBad+ , TestLabel "Record" test_Record+ , TestLabel "Id" test_IdInt+ , TestLabel "Id" test_IdStr+ , TestLabel "Id" test_IdInt2+ , TestLabel "Id" test_IdStr2+ , TestLabel "Id3" test_IdInt3+ , TestLabel "Id3" test_IdLit3+ , TestLabel "Ab_or_a" test_Ab_or_a+ , TestLabel "AB_test" test_AB_test1+ , TestLabel "AB_test" test_AB_test2+ , TestLabel "Method" test_method_get+ , TestLabel "Method" test_method_put+ , TestLabel "Method" test_method_link+ , TestLabel "Method" test_method_post+ , TestLabel "Version" test_version+ , TestLabel "Request" test_request_G+ , TestLabel "Request" test_request_B+ , TestLabel "Eor" test_eor_test+ , TestLabel "Eof" test_eof_test_G+ , TestLabel "Eof" test_eof_test_B+ , TestLabel "Opt" test_opt_test_j+ , TestLabel "Opt" test_opt_test_n+ , TestLabel "List" test_entries_nosep_noterm+ , TestLabel "List" test_entries_nosep_noterm'+ , TestLabel "List" test_entries_nosep_noterm2+ , TestLabel "List" test_evenInt+ , TestLabel "List" test_evenInts+ , TestLabel "List" test_digitListG+ , TestLabel "List" test_digitList2G+ , TestLabel "List" test_digitListB+ , TestLabel "List" test_digitListLenG+ , TestLabel "List" test_digitListLenB+ , TestLabel "List" test_digitListLenSepG+ , TestLabel "List" test_digitListLenSepB+ , TestLabel "List" test_digitListTermG+ , TestLabel "List" test_digitListTermB+ , TestLabel "List" test_digitListTermSepG+ , TestLabel "List" test_digitListTermSepB+ , TestLabel "Try" test_tryTest+ , TestLabel "Try" test_tryTestDG+ , TestLabel "Try" test_tryTestDB+ , TestLabel "Try" test_ListWithTry+ , TestLabel "Void" test_WithVoid+ , TestLabel "Void" test_voidEntry1+ , TestLabel "Void" test_voidEntry2+ , TestLabel "Void" test_voidEntry3+ , TestLabel "Switch" test_switch0+ , TestLabel "Switch" test_switch1+ , TestLabel "Switch" test_switchOther+ , TestLabel "Stringln" test_stringln+ , TestLabel "Compound" test_myData+ , TestLabel "Compound" test_hp_data+ , TestLabel "Doc" test_hp_data_file_parse+ , TestLabel "Doc" myDoc_test+ , TestLabel "Literal" litRec_test+ , TestLabel "Literal" whiteSpace_test+ , TestLabel "Literal" whiteSpace2_test+ , TestLabel "Regular Expression" rE_ty_test+ , TestLabel "Discipline" disc_test+ , TestLabel "Overlap" exxy_test+ , TestLabel "Discipline" linesFW_test+ , TestLabel "Values" vals_test+ , TestLabel "Values" vals2_test+ , TestLabel "Double" doubles_test+ , TestLabel "StringSE" stringSEs_test+ , TestLabel "StringFWs" stringFWs_test+ , TestLabel "StringESCs" stringESCs_test+ , TestLabel "StringPs" stringPs_test+ , TestLabel "PadsExp" padsExp_test+ , TestLabel "PadsExp2" padsExp_test2+ , TestLabel "BitBools" bitBools_test+ , TestLabel "BitBools" bitBools_test2+ , TestLabel "ArithPixel" arithPixel_test+ , TestLabel "IncompleteBitBools" incompleteBitBools_test+ , TestLabel "Mixed" mixed_test+ , TestLabel "OddWidths" oddWidths_test+ , TestLabel "LargeWidths" largeWidths_test+ , TestLabel "Enumerated" enumerated_test+ , TestLabel "EnumeratedWC" enumerated_test_wc+ , TestLabel "EnumeratedBool" enumeratedBool_test+ , TestLabel "NBA_char" nBA_char_test+ , TestLabel "NBA_char_aligned" nBA_char_aligned_test+ , TestLabel "NBA_BS" nBA_BS_test+ , TestLabel "NBA_BS_aligned" nBA_BS_aligned_test+ , TestLabel "NBA_BS_empty" nBA_BS_empty_test+ , TestLabel "NBA_StringFW" nBA_StringFW_test+ , TestLabel "NBA_StringFW_aligned" nBA_StringFW_aligned_test+ , TestLabel "NBA_StringFW_err" nBA_StringFW_err_test+ , TestLabel "NBA_StringC" nBA_StringC_test+ , TestLabel "NBA_StringC_aligned" nBA_StringC_aligned_test+ ]
+ Examples/FirstPads.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE FlexibleContexts, TypeFamilies, TypeSynonymInstances, TemplateHaskell, QuasiQuotes,+ MultiParamTypeClasses, FlexibleInstances, UndecidableInstances,+ DeriveDataTypeable, ScopedTypeVariables #-}+module Examples.FirstPads where+import Language.Pads.Padsc++padsExp = [pads| type Halloween = [StringFW 4 | EOR] terminator EOF |]+
+ Examples/Proc.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE TypeFamilies, ScopedTypeVariables, DeriveDataTypeable+ , MultiParamTypeClasses+ , TypeSynonymInstances+ , TemplateHaskell+ , QuasiQuotes+ , FlexibleInstances #-}+-- :set -ddump-splices+module Examples.Proc where+import Language.Pads.Padsc++ws = RE "[ \t]+"++[pads|++ newtype MapsFile = MapsFile ([Line Region] terminator EOF)+ + data Region = Region+ { start_addr :: Hex+ , '-', end_addr :: Hex+ , ' ', perms :: Permissions+ , ' ', offset :: Int+ , ' ', device :: (Hex, ':', Hex)+ , ' ', inode :: Int+ , ws , path :: RegionName+ }++ type Hex = StringME '[0-9A-Fa-f]+'++ data RegionName =+ Heap "[heap]"+ | Stack "[stack]"+ | VDSO "[vdso]"+ | VVAR "[vvar]"+ | VSyscall "[vsyscall]"+ | Path ([Char] terminator EOR)+ | Anonymous ""++ data Permissions = Permissions+ { permRead :: RP+ , permWrite :: WP+ , permExec :: XP+ , permShare :: SP+ }++ data RP = READ 'r' | NOREAD '-'+ data WP = WRITE 'w' | NOWRITE '-'+ data XP = EXEC 'x' | NOEXEC '-'+ data SP = SHARE 's' | PRIVATE 'p'++|]+
+ Examples/data/README view
@@ -0,0 +1,24 @@+This directory contains data for example programs.++For Examples/First.hs+ Examples/data/test_file++For Examples/AI.hs+ Examples/data/ai.3000+ Examples/data/ai.big++For Examples/Binary.hs+ Examples/data/binary -- Small input test file+ Call Detail Records+ Examples/data/a2b.c -- C program to convert ascii records to binary+ -- To compile: cc -o a2b a2b.c+ -- To run: a2b < calls10.a > calls10.b+ Examples/data/calls10.a, -- ASCII call detail records+ Examples/data/calls10.b, -- Corresponding binary records+ + Binary base type tseting+ Examples/data/genBin.c, -- C program to convert ascii records to binary+ -- To compile: cc -o genBin binTest.a+ -- To run: genBin < binTest.a > binTest.b+ Examples/data/binTest.a, + Examples/data/binTest.b
+ Examples/data/a2b.c view
@@ -0,0 +1,34 @@+#include <stdio.h>++/* Reads ascii call detail records from stdin.+ * Writes scampRec binary call detail records on stdout.+ */++typedef struct+{+ int onpa, obase;+ int dnpa, dbase;+ int con;+ int dur; +} scampRec_t;++++int readAscii(FILE *in, scampRec_t *r){+ int success = fscanf(in, "%d %d %d %d %d %d\n",+ &(r->onpa), &(r->obase), + &(r->dnpa), &(r->dbase),+ &(r->con), &(r->dur)); + return success;+}++void writeBinary(FILE *out, scampRec_t *r){+ fwrite(r, sizeof(scampRec_t), 1, out);+}++int main(){+ scampRec_t current;+ while (readAscii(stdin, ¤t) != EOF)+ writeBinary(stdout, ¤t);+ return 0;+}
+ Examples/data/ai.3000 view
@@ -0,0 +1,3001 @@+207.136.97.49 - - [15/Oct/1997:18:46:51 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+207.136.97.49 - - [15/Oct/1997:18:46:51 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+207.136.97.49 - - [15/Oct/1997:18:46:52 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+207.136.97.49 - - [15/Oct/1997:18:46:52 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+208.196.124.26 - - [15/Oct/1997:18:46:55 -0700] "GET /candatop.html HTTP/1.0" 200 10629+208.196.124.26 - - [15/Oct/1997:18:46:57 -0700] "GET /images/done.gif HTTP/1.0" 200 4785+208.196.124.26 - - [15/Oct/1997:18:47:01 -0700] "GET /images/reddash2.gif HTTP/1.0" 200 237+208.196.124.26 - - [15/Oct/1997:18:47:02 -0700] "GET /images/refrun1.gif HTTP/1.0" 200 836+208.196.124.26 - - [15/Oct/1997:18:47:05 -0700] "GET /images/hasene2.gif HTTP/1.0" 200 8833+208.196.124.26 - - [15/Oct/1997:18:47:08 -0700] "GET /images/candalog.gif HTTP/1.0" 200 8638+208.196.124.26 - - [15/Oct/1997:18:47:09 -0700] "GET /images/nigpost1.gif HTTP/1.0" 200 4429+208.196.124.26 - - [15/Oct/1997:18:47:09 -0700] "GET /images/rally4.jpg HTTP/1.0" 200 7352+128.200.68.71 - - [15/Oct/1997:18:47:11 -0700] "GET /amnesty/usalinks.html HTTP/1.0" 200 10329+208.196.124.26 - - [15/Oct/1997:18:47:11 -0700] "GET /images/reyes.gif HTTP/1.0" 200 10859+128.200.68.71 - - [15/Oct/1997:18:47:12 -0700] "GET /amnesty/images/ai_cand1.gif HTTP/1.0" 200 6328+128.200.68.71 - - [15/Oct/1997:18:47:12 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+128.200.68.71 - - [15/Oct/1997:18:47:13 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+208.196.124.26 - - [15/Oct/1997:18:47:14 -0700] "GET /images/kids5.jpg HTTP/1.0" 200 2903+128.200.68.71 - - [15/Oct/1997:18:47:15 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+128.200.68.71 - - [15/Oct/1997:18:47:15 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+128.200.68.71 - - [15/Oct/1997:18:47:15 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+128.200.68.71 - - [15/Oct/1997:18:47:16 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+!! BAD LINE !!+208.196.124.26 - - [15/Oct/1997:18:47:16 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+128.200.68.71 - - [15/Oct/1997:18:47:19 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+208.196.124.26 - - [15/Oct/1997:18:47:21 -0700] "GET /images/turkboy.gif HTTP/1.0" 200 4625+208.196.124.26 - - [15/Oct/1997:18:47:23 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+208.196.124.26 - - [15/Oct/1997:18:47:23 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+208.196.124.26 - - [15/Oct/1997:18:47:24 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+208.196.124.26 - - [15/Oct/1997:18:47:32 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+208.196.124.26 - - [15/Oct/1997:18:47:53 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+128.200.68.71 - - [15/Oct/1997:18:48:01 -0700] "GET /amnesty/about.html HTTP/1.0" 200 6902+128.200.68.71 - - [15/Oct/1997:18:48:02 -0700] "GET /amnesty/images/howbut.gif HTTP/1.0" 200 509+128.200.68.71 - - [15/Oct/1997:18:48:02 -0700] "GET /amnesty/images/whobut.gif HTTP/1.0" 200 505+128.200.68.71 - - [15/Oct/1997:18:48:04 -0700] "GET /amnesty/images/aalogo.gif HTTP/1.0" 200 15293+128.200.68.71 - - [15/Oct/1997:18:48:05 -0700] "GET /amnesty/images/whatbut.gif HTTP/1.0" 200 526+128.200.68.71 - - [15/Oct/1997:18:48:05 -0700] "GET /amnesty/images/where.gif HTTP/1.0" 200 605+206.175.186.71 - - [15/Oct/1997:18:48:07 -0700] "GET /amnesty/immigr.html HTTP/1.0" 200 11284+128.200.68.71 - - [15/Oct/1997:18:48:08 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+128.200.68.71 - - [15/Oct/1997:18:48:08 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+128.200.68.71 - - [15/Oct/1997:18:48:08 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+128.200.68.71 - - [15/Oct/1997:18:48:08 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+128.200.68.71 - - [15/Oct/1997:18:48:09 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+128.200.68.71 - - [15/Oct/1997:18:48:35 -0700] "GET /amnesty/candatop.html HTTP/1.0" 200 10629+128.200.68.71 - - [15/Oct/1997:18:48:36 -0700] "GET /amnesty/images/done.gif HTTP/1.0" 200 4785+128.200.68.71 - - [15/Oct/1997:18:48:37 -0700] "GET /amnesty/images/candalog.gif HTTP/1.0" 200 8638+128.200.68.71 - - [15/Oct/1997:18:48:38 -0700] "GET /amnesty/images/rally4.jpg HTTP/1.0" 200 7352+128.200.68.71 - - [15/Oct/1997:18:48:38 -0700] "GET /amnesty/images/reyes.gif HTTP/1.0" 200 10859+128.200.68.71 - - [15/Oct/1997:18:48:38 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+128.200.68.71 - - [15/Oct/1997:18:48:39 -0700] "GET /amnesty/images/turkboy.gif HTTP/1.0" 200 4625+128.200.68.71 - - [15/Oct/1997:18:48:40 -0700] "GET /amnesty/images/hasene2.gif HTTP/1.0" 200 8833+128.200.68.71 - - [15/Oct/1997:18:48:40 -0700] "GET /amnesty/images/nigpost1.gif HTTP/1.0" 200 4429+128.200.68.71 - - [15/Oct/1997:18:48:40 -0700] "GET /amnesty/images/reddash2.gif HTTP/1.0" 200 237+128.200.68.71 - - [15/Oct/1997:18:48:40 -0700] "GET /amnesty/images/refrun1.gif HTTP/1.0" 200 836+128.200.68.71 - - [15/Oct/1997:18:48:41 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+128.200.68.71 - - [15/Oct/1997:18:48:44 -0700] "GET /amnesty/images/kids5.jpg HTTP/1.0" 200 2903+128.200.68.71 - - [15/Oct/1997:18:49:17 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+128.200.68.71 - - [15/Oct/1997:18:49:17 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+128.200.68.71 - - [15/Oct/1997:18:49:19 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+128.200.68.71 - - [15/Oct/1997:18:49:19 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+128.200.68.71 - - [15/Oct/1997:18:49:19 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+128.200.68.71 - - [15/Oct/1997:18:49:20 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+128.200.68.71 - - [15/Oct/1997:18:49:20 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+128.200.68.71 - - [15/Oct/1997:18:49:20 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+128.200.68.71 - - [15/Oct/1997:18:49:21 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+128.200.68.71 - - [15/Oct/1997:18:49:21 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+128.200.68.71 - - [15/Oct/1997:18:49:21 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+128.200.68.71 - - [15/Oct/1997:18:49:21 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+128.200.68.71 - - [15/Oct/1997:18:49:21 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+148.4.61.168 - - [15/Oct/1997:18:49:22 -0700] "GET / HTTP/1.0" 200 3082+128.200.68.71 - - [15/Oct/1997:18:49:22 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+128.200.68.71 - - [15/Oct/1997:18:49:23 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+128.200.68.71 - - [15/Oct/1997:18:49:24 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+128.200.68.71 - - [15/Oct/1997:18:49:24 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+148.4.61.168 - - [15/Oct/1997:18:49:24 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+128.200.68.71 - - [15/Oct/1997:18:49:25 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+128.200.68.71 - - [15/Oct/1997:18:49:25 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+148.4.61.168 - - [15/Oct/1997:18:49:28 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+128.200.68.71 - - [15/Oct/1997:18:49:30 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+128.200.68.71 - - [15/Oct/1997:18:49:31 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+148.4.61.168 - - [15/Oct/1997:18:49:37 -0700] "GET /joinai.html HTTP/1.0" 200 4054+148.4.61.168 - - [15/Oct/1997:18:49:38 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+148.4.61.168 - - [15/Oct/1997:18:49:38 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+148.4.61.168 - - [15/Oct/1997:18:49:38 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+148.4.61.168 - - [15/Oct/1997:18:49:39 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+148.4.61.168 - - [15/Oct/1997:18:49:39 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+148.4.61.168 - - [15/Oct/1997:18:49:41 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+148.4.61.168 - - [15/Oct/1997:18:51:48 -0700] "POST /scripts/mailform/aimember@aiusa.org/confirm HTTP/1.0" 200 553+148.4.61.168 - - [15/Oct/1997:18:51:49 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+148.4.61.168 - - [15/Oct/1997:18:51:59 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+148.4.61.168 - - [15/Oct/1997:18:52:00 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+148.4.61.168 - - [15/Oct/1997:18:52:00 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+148.4.61.168 - - [15/Oct/1997:18:52:00 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+148.4.61.168 - - [15/Oct/1997:18:52:00 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+148.4.61.168 - - [15/Oct/1997:18:52:00 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+148.4.61.168 - - [15/Oct/1997:18:52:33 -0700] "GET /amnesty/candatop.html HTTP/1.0" 200 10629+148.4.61.168 - - [15/Oct/1997:18:52:35 -0700] "GET /amnesty/images/reddash2.gif HTTP/1.0" 200 237+148.4.61.168 - - [15/Oct/1997:18:52:35 -0700] "GET /amnesty/images/reyes.gif HTTP/1.0" 200 10859+148.4.61.168 - - [15/Oct/1997:18:52:37 -0700] "GET /amnesty/images/refrun1.gif HTTP/1.0" 200 836+148.4.61.168 - - [15/Oct/1997:18:52:38 -0700] "GET /amnesty/images/candalog.gif HTTP/1.0" 200 8638+148.4.61.168 - - [15/Oct/1997:18:52:38 -0700] "GET /amnesty/images/hasene2.gif HTTP/1.0" 200 8833+148.4.61.168 - - [15/Oct/1997:18:52:38 -0700] "GET /amnesty/images/nigpost1.gif HTTP/1.0" 200 4429+148.4.61.168 - - [15/Oct/1997:18:52:39 -0700] "GET /amnesty/images/rally4.jpg HTTP/1.0" 200 7352+148.4.61.168 - - [15/Oct/1997:18:52:40 -0700] "GET /amnesty/images/turkboy.gif HTTP/1.0" 200 4625+148.4.61.168 - - [15/Oct/1997:18:52:41 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+148.4.61.168 - - [15/Oct/1997:18:52:42 -0700] "GET /amnesty/images/howbut.gif HTTP/1.0" 200 509+148.4.61.168 - - [15/Oct/1997:18:52:42 -0700] "GET /amnesty/images/kids5.jpg HTTP/1.0" 200 2903+148.4.61.168 - - [15/Oct/1997:18:52:43 -0700] "GET /amnesty/images/done.gif HTTP/1.0" 200 4785+148.4.61.168 - - [15/Oct/1997:18:53:14 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+148.4.61.168 - - [15/Oct/1997:18:53:14 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+148.4.61.168 - - [15/Oct/1997:18:53:15 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+148.4.61.168 - - [15/Oct/1997:18:53:15 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+148.4.61.168 - - [15/Oct/1997:18:53:15 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+148.4.61.168 - - [15/Oct/1997:18:53:15 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+148.4.61.168 - - [15/Oct/1997:18:53:16 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+148.4.61.168 - - [15/Oct/1997:18:53:16 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+148.4.61.168 - - [15/Oct/1997:18:53:17 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+208.151.41.69 - - [15/Oct/1997:18:53:29 -0700] "GET /country/balkans HTTP/1.0" 301 196+128.200.68.71 - - [15/Oct/1997:18:53:30 -0700] "GET /amnesty/about/history.html HTTP/1.0" 200 10342+128.200.68.71 - - [15/Oct/1997:18:53:31 -0700] "GET /amnesty/about/images/airmail2.jpg HTTP/1.0" 200 7820+128.200.68.71 - - [15/Oct/1997:18:53:31 -0700] "GET /amnesty/about/images/coverbut.gif HTTP/1.0" 200 400+128.200.68.71 - - [15/Oct/1997:18:53:31 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+208.151.41.69 - - [15/Oct/1997:18:53:31 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+128.200.68.71 - - [15/Oct/1997:18:53:32 -0700] "GET /amnesty/about/images/backtono.gif HTTP/1.0" 200 2367+128.200.68.71 - - [15/Oct/1997:18:53:32 -0700] "GET /amnesty/about/images/sagan4.gif HTTP/1.0" 200 3596+128.200.68.71 - - [15/Oct/1997:18:53:32 -0700] "GET /amnesty/images/wamwer6.jpg HTTP/1.0" 200 9786+128.200.68.71 - - [15/Oct/1997:18:53:33 -0700] "GET /amnesty/about/images/masthd3.gif HTTP/1.0" 200 33250+128.200.68.71 - - [15/Oct/1997:18:53:33 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+208.151.41.69 - - [15/Oct/1997:18:53:33 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+208.151.41.69 - - [15/Oct/1997:18:53:35 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+208.151.41.69 - - [15/Oct/1997:18:53:35 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+208.151.41.69 - - [15/Oct/1997:18:53:36 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+208.151.41.69 - - [15/Oct/1997:18:53:37 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+208.151.41.69 - - [15/Oct/1997:18:53:38 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+208.151.41.69 - - [15/Oct/1997:18:53:38 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+208.151.41.69 - - [15/Oct/1997:18:53:38 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+207.228.67.219 - - [15/Oct/1997:18:53:47 -0700] "GET / HTTP/1.0" 200 3082+207.228.67.219 - - [15/Oct/1997:18:53:51 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+207.228.67.219 - - [15/Oct/1997:18:53:55 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+128.200.68.71 - - [15/Oct/1997:18:54:03 -0700] "GET /amnesty/feats/wamphoto.html HTTP/1.0" 200 6567+128.200.68.71 - - [15/Oct/1997:18:54:04 -0700] "GET /amnesty/images/opencuf2.jpg HTTP/1.0" 200 2581+207.228.67.219 - - [15/Oct/1997:18:54:04 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+128.200.68.71 - - [15/Oct/1997:18:54:05 -0700] "GET /amnesty/images/wamwere.gif HTTP/1.0" 200 19858+207.228.67.219 - - [15/Oct/1997:18:54:08 -0700] "GET /comm/medaward.html HTTP/1.0" 200 6483+207.228.67.219 - - [15/Oct/1997:18:54:10 -0700] "GET /comm/images/starblu.jpg HTTP/1.0" 200 5498+207.228.67.219 - - [15/Oct/1997:18:54:17 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+207.228.67.219 - - [15/Oct/1997:18:54:24 -0700] "GET /comm/images/bluai.jpg HTTP/1.0" 200 11848+207.228.67.219 - - [15/Oct/1997:18:54:32 -0700] "GET /comm/images/bluspots.jpg HTTP/1.0" 200 18585+128.200.68.71 - - [15/Oct/1997:18:54:35 -0700] "GET /amnesty/ann-rpt.html HTTP/1.0" 200 1899+207.228.67.219 - - [15/Oct/1997:18:54:40 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+207.228.67.219 - - [15/Oct/1997:18:54:58 -0700] "GET /comm/honor2.html HTTP/1.0" 200 10981+128.200.68.71 - - [15/Oct/1997:18:55:01 -0700] "GET /amnesty/ar-sum.html HTTP/1.0" 200 27608+128.200.68.71 - - [15/Oct/1997:18:55:07 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+207.228.67.219 - - [15/Oct/1997:18:55:08 -0700] "GET /comm/images/bsilk7.gif HTTP/1.0" 200 10517+207.228.67.219 - - [15/Oct/1997:18:55:17 -0700] "GET /comm/images/people/jagger3.jpg HTTP/1.0" 200 4864+207.228.67.219 - - [15/Oct/1997:18:55:17 -0700] "GET /comm/images/people/stew3.jpg HTTP/1.0" 200 5558+207.228.67.219 - - [15/Oct/1997:18:55:17 -0700] "GET /comm/images/people/wallace3.jpg HTTP/1.0" 200 5348+207.228.67.219 - - [15/Oct/1997:18:55:36 -0700] "GET /comm/images/people/berman3.jpg HTTP/1.0" 200 4705+207.228.67.219 - - [15/Oct/1997:18:55:40 -0700] "GET /comm/images/people/bailey3.jpg HTTP/1.0" 200 4565+207.228.67.219 - - [15/Oct/1997:18:55:41 -0700] "GET /comm/images/people/herbert3.jpg HTTP/1.0" 200 4819+207.228.67.219 - - [15/Oct/1997:18:55:43 -0700] "GET /comm/images/spot05.gif HTTP/1.0" 200 8192+207.228.67.219 - - [15/Oct/1997:18:55:54 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+207.228.67.219 - - [15/Oct/1997:18:55:54 -0700] "GET /images/pnbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:55:54 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+207.228.67.219 - - [15/Oct/1997:18:55:57 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+207.228.67.219 - - [15/Oct/1997:18:55:59 -0700] "GET /home.html HTTP/1.0" 200 17233+207.228.67.219 - - [15/Oct/1997:18:55:59 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:01 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+207.228.67.219 - - [15/Oct/1997:18:56:03 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:03 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+207.228.67.219 - - [15/Oct/1997:18:56:04 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+207.228.67.219 - - [15/Oct/1997:18:56:06 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:07 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+207.228.67.219 - - [15/Oct/1997:18:56:07 -0700] "GET /images/pubbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:08 -0700] "GET /images/eventbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:08 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+207.228.67.219 - - [15/Oct/1997:18:56:09 -0700] "GET /images/countbut.gif HTTP/1.0" 304 -+207.228.67.219 - - [15/Oct/1997:18:56:11 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+207.228.67.219 - - [15/Oct/1997:18:56:12 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+207.228.67.219 - - [15/Oct/1997:18:56:12 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+207.228.67.219 - - [15/Oct/1997:18:56:15 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+207.228.67.219 - - [15/Oct/1997:18:56:33 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+128.200.68.71 - - [15/Oct/1997:18:56:46 -0700] "GET /amnesty/mandate.html HTTP/1.0" 200 21981+148.4.61.168 - - [15/Oct/1997:18:56:55 -0700] "GET /comm/medaward.html HTTP/1.0" 200 6483+148.4.61.168 - - [15/Oct/1997:18:56:56 -0700] "GET /comm/images/starblu.jpg HTTP/1.0" 200 5498+148.4.61.168 - - [15/Oct/1997:18:56:56 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+148.4.61.168 - - [15/Oct/1997:18:56:57 -0700] "GET /comm/images/bluai.jpg HTTP/1.0" 200 11848+148.4.61.168 - - [15/Oct/1997:18:56:57 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+148.4.61.168 - - [15/Oct/1997:18:57:00 -0700] "GET /comm/images/bluspots.jpg HTTP/1.0" 200 18585+148.4.61.168 - - [15/Oct/1997:18:57:41 -0700] "GET /home.html HTTP/1.0" 200 17233+148.4.61.168 - - [15/Oct/1997:18:57:41 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+148.4.61.168 - - [15/Oct/1997:18:57:41 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+148.4.61.168 - - [15/Oct/1997:18:57:41 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+148.4.61.168 - - [15/Oct/1997:18:57:42 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+148.4.61.168 - - [15/Oct/1997:18:57:42 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+148.4.61.168 - - [15/Oct/1997:18:57:42 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+148.4.61.168 - - [15/Oct/1997:18:57:42 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+148.4.61.168 - - [15/Oct/1997:18:57:42 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+148.4.61.168 - - [15/Oct/1997:18:57:43 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+148.4.61.168 - - [15/Oct/1997:18:57:45 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+148.4.61.168 - - [15/Oct/1997:18:57:46 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+148.4.61.168 - - [15/Oct/1997:18:57:46 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+148.4.61.168 - - [15/Oct/1997:18:57:46 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+148.4.61.168 - - [15/Oct/1997:18:57:47 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+148.4.61.168 - - [15/Oct/1997:18:57:47 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+148.4.61.168 - - [15/Oct/1997:18:57:47 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+207.67.28.158 - - [15/Oct/1997:18:58:12 -0700] "GET /refugee HTTP/1.0" 301 188+207.67.28.158 - - [15/Oct/1997:18:58:16 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+207.67.28.158 - - [15/Oct/1997:18:58:16 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+207.67.28.158 - - [15/Oct/1997:18:58:16 -0700] "GET /images/refrun1.gif HTTP/1.0" 200 836+207.67.28.158 - - [15/Oct/1997:18:58:16 -0700] "GET /images/turqbut.gif HTTP/1.0" 200 903+207.67.28.158 - - [15/Oct/1997:18:58:18 -0700] "GET /refugee/ HTTP/1.0" 200 18751+207.67.28.158 - - [15/Oct/1997:18:58:23 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+207.67.28.158 - - [15/Oct/1997:18:58:23 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+207.67.28.158 - - [15/Oct/1997:18:58:23 -0700] "GET /images/morinfox.gif HTTP/1.0" 200 2056+207.67.28.158 - - [15/Oct/1997:18:58:23 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+148.4.61.168 - - [15/Oct/1997:18:58:50 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+148.4.61.168 - - [15/Oct/1997:18:58:54 -0700] "GET /about.html HTTP/1.0" 200 6902+148.4.61.168 - - [15/Oct/1997:18:58:55 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+148.4.61.168 - - [15/Oct/1997:18:58:55 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+148.4.61.168 - - [15/Oct/1997:18:58:56 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+148.4.61.168 - - [15/Oct/1997:18:58:57 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+148.4.61.168 - - [15/Oct/1997:18:58:57 -0700] "GET /images/where.gif HTTP/1.0" 200 605+148.4.61.168 - - [15/Oct/1997:18:59:00 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+136.168.101.17 - - [15/Oct/1997:18:59:09 -0700] "GET / HTTP/1.0" 200 3082+207.67.28.158 - - [15/Oct/1997:18:59:09 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+207.67.28.158 - - [15/Oct/1997:18:59:09 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+207.67.28.158 - - [15/Oct/1997:18:59:09 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+207.67.28.158 - - [15/Oct/1997:18:59:10 -0700] "GET /home.html HTTP/1.0" 200 17233+136.168.101.17 - - [15/Oct/1997:18:59:10 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+207.67.28.158 - - [15/Oct/1997:18:59:11 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+207.67.28.158 - - [15/Oct/1997:18:59:12 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+136.168.101.17 - - [15/Oct/1997:18:59:12 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+207.67.28.158 - - [15/Oct/1997:18:59:13 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+207.67.28.158 - - [15/Oct/1997:18:59:13 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+207.67.28.158 - - [15/Oct/1997:18:59:15 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+207.67.28.158 - - [15/Oct/1997:18:59:17 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+207.67.28.158 - - [15/Oct/1997:18:59:17 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+207.67.28.158 - - [15/Oct/1997:18:59:17 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+207.67.28.158 - - [15/Oct/1997:18:59:17 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+24.64.22.142 - - [15/Oct/1997:18:59:18 -0700] "GET /amnesty/mideast/countrie.html HTTP/1.0" 200 1527+207.67.28.158 - - [15/Oct/1997:18:59:18 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+207.67.28.158 - - [15/Oct/1997:18:59:18 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+24.64.22.142 - - [15/Oct/1997:18:59:19 -0700] "GET /amnesty/mideast/butalg.gif HTTP/1.0" 200 368+24.64.22.142 - - [15/Oct/1997:18:59:19 -0700] "GET /amnesty/mideast/butbah.gif HTTP/1.0" 200 380+24.64.22.142 - - [15/Oct/1997:18:59:19 -0700] "GET /amnesty/mideast/butegy.gif HTTP/1.0" 200 363+24.64.22.142 - - [15/Oct/1997:18:59:19 -0700] "GET /amnesty/mideast/butgul.gif HTTP/1.0" 200 399+207.67.28.158 - - [15/Oct/1997:18:59:19 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+24.64.22.142 - - [15/Oct/1997:18:59:20 -0700] "GET /amnesty/mideast/butirn.gif HTTP/1.0" 200 317+24.64.22.142 - - [15/Oct/1997:18:59:21 -0700] "GET /amnesty/mideast/butirq.gif HTTP/1.0" 200 329+24.64.22.142 - - [15/Oct/1997:18:59:21 -0700] "GET /amnesty/mideast/butisr.gif HTTP/1.0" 200 384+24.64.22.142 - - [15/Oct/1997:18:59:21 -0700] "GET /amnesty/mideast/butjor.gif HTTP/1.0" 200 352+24.64.22.142 - - [15/Oct/1997:18:59:21 -0700] "GET /amnesty/mideast/butkuw.gif HTTP/1.0" 200 366+24.64.22.142 - - [15/Oct/1997:18:59:21 -0700] "GET /amnesty/mideast/butleb.gif HTTP/1.0" 200 383+207.67.28.158 - - [15/Oct/1997:18:59:21 -0700] "GET /write.html HTTP/1.0" 200 9408+24.64.22.142 - - [15/Oct/1997:18:59:22 -0700] "GET /amnesty/mideast/butlib.gif HTTP/1.0" 200 352+24.64.22.142 - - [15/Oct/1997:18:59:22 -0700] "GET /amnesty/mideast/butmor.gif HTTP/1.0" 200 432+24.64.22.142 - - [15/Oct/1997:18:59:22 -0700] "GET /amnesty/mideast/butsau.gif HTTP/1.0" 200 403+207.67.28.158 - - [15/Oct/1997:18:59:22 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+207.67.28.158 - - [15/Oct/1997:18:59:22 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+207.67.28.158 - - [15/Oct/1997:18:59:22 -0700] "GET /images/usstamp.gif HTTP/1.0" 200 6166+24.64.22.142 - - [15/Oct/1997:18:59:23 -0700] "GET /amnesty/mideast/butbac.gif HTTP/1.0" 200 592+24.64.22.142 - - [15/Oct/1997:18:59:23 -0700] "GET /amnesty/mideast/butsyr.gif HTTP/1.0" 200 344+24.64.22.142 - - [15/Oct/1997:18:59:23 -0700] "GET /amnesty/mideast/buttun.gif HTTP/1.0" 200 359+24.64.22.142 - - [15/Oct/1997:18:59:23 -0700] "GET /amnesty/mideast/butyem.gif HTTP/1.0" 200 352+207.67.28.158 - - [15/Oct/1997:18:59:23 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+207.67.28.158 - - [15/Oct/1997:18:59:25 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+207.67.28.158 - - [15/Oct/1997:18:59:25 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+207.67.28.158 - - [15/Oct/1997:18:59:25 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+136.168.101.17 - - [15/Oct/1997:18:59:26 -0700] "GET /about.html HTTP/1.0" 200 6902+136.168.101.17 - - [15/Oct/1997:18:59:26 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+136.168.101.17 - - [15/Oct/1997:18:59:26 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+136.168.101.17 - - [15/Oct/1997:18:59:27 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+136.168.101.17 - - [15/Oct/1997:18:59:27 -0700] "GET /images/where.gif HTTP/1.0" 200 605+136.168.101.17 - - [15/Oct/1997:18:59:28 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+136.168.101.17 - - [15/Oct/1997:18:59:29 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+136.168.101.17 - - [15/Oct/1997:18:59:29 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+136.168.101.17 - - [15/Oct/1997:18:59:29 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+136.168.101.17 - - [15/Oct/1997:18:59:29 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+136.168.101.17 - - [15/Oct/1997:18:59:30 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+24.64.22.142 - - [15/Oct/1997:18:59:35 -0700] "GET /amnesty/mideast/iran.html HTTP/1.0" 200 8412+24.64.22.142 - - [15/Oct/1997:18:59:35 -0700] "GET /amnesty/mideast/iran.jpg HTTP/1.0" 200 3240+24.64.22.142 - - [15/Oct/1997:18:59:35 -0700] "GET /amnesty/mideast/irnflag.gif HTTP/1.0" 200 2273+24.64.22.142 - - [15/Oct/1997:18:59:35 -0700] "GET /amnesty/mideast/mailbut2.gif HTTP/1.0" 200 1202+207.67.28.158 - - [15/Oct/1997:19:00:19 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+207.67.28.158 - - [15/Oct/1997:19:00:19 -0700] "GET /weeklyua.html HTTP/1.0" 200 10887+207.67.28.158 - - [15/Oct/1997:19:00:20 -0700] "GET /images/linebrn.gif HTTP/1.0" 200 308+24.64.22.142 - - [15/Oct/1997:19:00:28 -0700] "GET /amnesty/mideast/index.html HTTP/1.0" 200 3104+24.64.22.142 - - [15/Oct/1997:19:00:29 -0700] "GET /amnesty/mideast/ailogo.gif HTTP/1.0" 200 2682+24.64.22.142 - - [15/Oct/1997:19:00:35 -0700] "GET /amnesty/mideast/hrme.jpg HTTP/1.0" 200 24216+148.4.61.168 - - [15/Oct/1997:19:00:59 -0700] "GET /group.html HTTP/1.0" 200 8575+148.4.61.168 - - [15/Oct/1997:19:00:59 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+148.4.61.168 - - [15/Oct/1997:19:00:59 -0700] "GET /images/goldfla2.gif HTTP/1.0" 200 1161+148.4.61.168 - - [15/Oct/1997:19:00:59 -0700] "GET /images/grncndl.gif HTTP/1.0" 200 1471+148.4.61.168 - - [15/Oct/1997:19:01:00 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+148.4.61.168 - - [15/Oct/1997:19:01:00 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+148.4.61.168 - - [15/Oct/1997:19:01:00 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+148.4.61.168 - - [15/Oct/1997:19:01:00 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+148.4.61.168 - - [15/Oct/1997:19:01:01 -0700] "GET /images/canfuz1.gif HTTP/1.0" 200 3013+148.4.61.168 - - [15/Oct/1997:19:01:01 -0700] "GET /images/evenbut.gif HTTP/1.0" 200 399+148.4.61.168 - - [15/Oct/1997:19:01:02 -0700] "GET /images/04candle.gif HTTP/1.0" 200 7257+148.4.61.168 - - [15/Oct/1997:19:01:06 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+148.4.61.168 - - [15/Oct/1997:19:01:07 -0700] "GET /images/can1_2.gif HTTP/1.0" 200 30430+24.64.22.142 - - [15/Oct/1997:19:01:08 -0700] "GET /amnesty/mideast/counfram.html HTTP/1.0" 200 1145+24.64.22.142 - - [15/Oct/1997:19:01:09 -0700] "GET /amnesty/mideast/algeria.html HTTP/1.0" 200 7945+24.64.22.142 - - [15/Oct/1997:19:01:10 -0700] "GET /amnesty/mideast/algeria.jpg HTTP/1.0" 200 5485+24.64.22.142 - - [15/Oct/1997:19:01:10 -0700] "GET /amnesty/mideast/algflag.gif HTTP/1.0" 200 1902+204.162.96.92 - - [15/Oct/1997:19:01:14 -0700] "GET /robots.txt HTTP/1.0" 404 163+204.162.96.92 - - [15/Oct/1997:19:01:25 -0700] "GET /education/ HTTP/1.0" 200 9100+207.67.28.158 - - [15/Oct/1997:19:01:31 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+207.67.28.158 - - [15/Oct/1997:19:01:34 -0700] "GET /urgact/newslett.html HTTP/1.0" 200 26074+207.67.28.158 - - [15/Oct/1997:19:02:12 -0700] "GET /urgact/index.html HTTP/1.0" 200 8283+207.67.28.158 - - [15/Oct/1997:19:02:40 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+207.67.28.158 - - [15/Oct/1997:19:02:41 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+207.67.28.158 - - [15/Oct/1997:19:02:41 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+207.67.28.158 - - [15/Oct/1997:19:02:41 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+207.67.28.158 - - [15/Oct/1997:19:02:42 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+207.67.28.158 - - [15/Oct/1997:19:02:42 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+207.67.28.158 - - [15/Oct/1997:19:02:48 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+207.67.28.158 - - [15/Oct/1997:19:02:53 -0700] "GET /welcome.html HTTP/1.0" 200 4731+207.67.28.158 - - [15/Oct/1997:19:02:55 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+207.67.28.158 - - [15/Oct/1997:19:02:55 -0700] "GET /images/never.gif HTTP/1.0" 200 914+207.67.28.158 - - [15/Oct/1997:19:02:56 -0700] "GET /images/doubt.gif HTTP/1.0" 200 924+207.67.28.158 - - [15/Oct/1997:19:03:00 -0700] "GET /images/commit.gif HTTP/1.0" 200 190+207.67.28.158 - - [15/Oct/1997:19:03:00 -0700] "GET /images/your.gif HTTP/1.0" 200 951+207.67.28.158 - - [15/Oct/1997:19:03:01 -0700] "GET /images/rights.gif HTTP/1.0" 200 938+207.67.28.158 - - [15/Oct/1997:19:03:02 -0700] "GET /images/can.gif HTTP/1.0" 200 946+207.67.28.158 - - [15/Oct/1997:19:03:04 -0700] "GET /images/a.gif HTTP/1.0" 200 865+207.67.28.158 - - [15/Oct/1997:19:03:04 -0700] "GET /images/refugee2.gif HTTP/1.0" 200 14882+207.67.28.158 - - [15/Oct/1997:19:03:05 -0700] "GET /images/differ.gif HTTP/1.0" 200 191+204.162.96.93 - - [15/Oct/1997:19:03:06 -0700] "GET /amnesty/regions/maregcon.html HTTP/1.0" 200 1304+207.67.28.158 - - [15/Oct/1997:19:03:06 -0700] "GET /images/canred.gif HTTP/1.0" 200 311+207.67.28.158 - - [15/Oct/1997:19:03:08 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+148.4.61.168 - - [15/Oct/1997:19:03:09 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+148.4.61.168 - - [15/Oct/1997:19:03:09 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+148.4.61.168 - - [15/Oct/1997:19:03:09 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+148.4.61.168 - - [15/Oct/1997:19:03:09 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+148.4.61.168 - - [15/Oct/1997:19:03:09 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+148.4.61.168 - - [15/Oct/1997:19:03:10 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+148.4.61.168 - - [15/Oct/1997:19:03:10 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+148.4.61.168 - - [15/Oct/1997:19:03:10 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+148.4.61.168 - - [15/Oct/1997:19:03:10 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+207.67.28.158 - - [15/Oct/1997:19:03:11 -0700] "GET /images/3ways.gif HTTP/1.0" 200 1157+148.4.61.168 - - [15/Oct/1997:19:03:11 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+148.4.61.168 - - [15/Oct/1997:19:03:11 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+148.4.61.168 - - [15/Oct/1997:19:03:11 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+148.4.61.168 - - [15/Oct/1997:19:03:11 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+148.4.61.168 - - [15/Oct/1997:19:03:12 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+148.4.61.168 - - [15/Oct/1997:19:03:12 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+148.4.61.168 - - [15/Oct/1997:19:03:12 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+207.67.28.158 - - [15/Oct/1997:19:03:13 -0700] "GET /images/it.gif HTTP/1.0" 200 170+148.4.61.168 - - [15/Oct/1997:19:03:13 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+148.4.61.168 - - [15/Oct/1997:19:03:13 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+148.4.61.168 - - [15/Oct/1997:19:03:14 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+207.67.28.158 - - [15/Oct/1997:19:03:16 -0700] "GET /images/aiusabut.gif HTTP/1.0" 200 591+207.67.28.158 - - [15/Oct/1997:19:03:17 -0700] "GET /images/mombab10.gif HTTP/1.0" 200 28581+148.4.61.168 - - [15/Oct/1997:19:03:17 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+207.67.28.158 - - [15/Oct/1997:19:03:19 -0700] "GET /images/human.gif HTTP/1.0" 200 155+207.67.28.158 - - [15/Oct/1997:19:03:27 -0700] "GET /postcard/welact.html HTTP/1.0" 200 4640+207.67.28.158 - - [15/Oct/1997:19:03:29 -0700] "GET /postcard/images/joinbut.gif HTTP/1.0" 200 409+207.67.28.158 - - [15/Oct/1997:19:03:29 -0700] "GET /postcard/images/w.gif HTTP/1.0" 200 565+207.67.28.158 - - [15/Oct/1997:19:03:29 -0700] "GET /postcard/images/welbut.gif HTTP/1.0" 200 600+207.67.28.158 - - [15/Oct/1997:19:03:30 -0700] "GET /postcard/images/letbut.gif HTTP/1.0" 200 517+207.67.28.158 - - [15/Oct/1997:19:03:31 -0700] "GET /postcard/images/aiusabut.gif HTTP/1.0" 200 591+207.67.28.158 - - [15/Oct/1997:19:03:41 -0700] "GET /postcard/images/wombarb9.gif HTTP/1.0" 200 20647+148.4.61.168 - - [15/Oct/1997:19:04:34 -0700] "GET /members.html HTTP/1.0" 200 1501+148.4.61.168 - - [15/Oct/1997:19:04:35 -0700] "GET /images/memlogo.gif HTTP/1.0" 200 7872+148.4.61.168 - - [15/Oct/1997:19:04:49 -0700] "GET /members/index.html HTTP/1.0" 401 350+148.4.61.168 - - [15/Oct/1997:19:05:15 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+148.4.61.168 - - [15/Oct/1997:19:05:15 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+148.4.61.168 - - [15/Oct/1997:19:05:15 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+148.4.61.168 - - [15/Oct/1997:19:05:15 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+148.4.61.168 - - [15/Oct/1997:19:05:20 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+148.4.61.168 - - [15/Oct/1997:19:05:51 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+152.163.207.138 - - [15/Oct/1997:19:05:54 -0700] "GET / HTTP/1.0" 200 3082+152.163.207.138 - - [15/Oct/1997:19:06:00 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+152.163.207.138 - - [15/Oct/1997:19:06:03 -0700] "GET /images/spot5.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:06:52 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+152.163.207.138 - - [15/Oct/1997:19:06:56 -0700] "GET /images/pandnlog.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:06:59 -0700] "GET /images/ganbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:00 -0700] "GET /images/campbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:02 -0700] "GET /images/deathbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:02 -0700] "GET /images/groupbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:03 -0700] "GET /images/dot.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:04 -0700] "GET /images/uabut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:05 -0700] "GET /images/refbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:07 -0700] "GET /images/ncasebut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:08 -0700] "GET /images/lgbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:09 -0700] "GET /images/educbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:09 -0700] "GET /images/healbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:11 -0700] "GET /images/legalbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:12 -0700] "GET /images/womenbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:12 -0700] "GET /images/wordo35d.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:14 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:15 -0700] "GET /images/penhand3.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:16 -0700] "GET /images/kids3.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:16 -0700] "GET /images/womland2.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:18 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:18 -0700] "GET /images/candles3.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:18 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:21 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:22 -0700] "GET /images/homebut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:07:23 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:04 -0700] "GET /candatop.html HTTP/1.0" 200 10629+152.163.207.138 - - [15/Oct/1997:19:08:08 -0700] "GET /images/candalog.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:09 -0700] "GET /images/done.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:11 -0700] "GET /images/hasene2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:11 -0700] "GET /images/rally4.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:13 -0700] "GET /images/reddash2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:13 -0700] "GET /images/refrun1.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:13 -0700] "GET /images/reyes.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:14 -0700] "GET /images/kids5.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:15 -0700] "GET /images/nigpost1.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:16 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:17 -0700] "GET /images/howbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:08:19 -0700] "GET /images/turkboy.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:09:18 -0700] "GET / HTTP/1.0" 200 -+206.175.189.221 - - [15/Oct/1997:19:09:29 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+206.175.189.221 - - [15/Oct/1997:19:09:32 -0700] "GET /images/spot5.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:09:33 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+152.163.207.138 - - [15/Oct/1997:19:09:36 -0700] "GET /group.html HTTP/1.0" 200 8575+152.163.207.138 - - [15/Oct/1997:19:09:42 -0700] "GET /images/can1_2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:42 -0700] "GET /images/goldfla2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:42 -0700] "GET /images/grncndl.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:44 -0700] "GET /images/04candle.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:44 -0700] "GET /images/canfuz1.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:47 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:53 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:54 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:55 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:58 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:09:58 -0700] "GET /images/evenbut.gif HTTP/1.0" 304 -+136.168.101.19 - - [15/Oct/1997:19:10:07 -0700] "GET / HTTP/1.0" 200 3082+136.168.101.19 - - [15/Oct/1997:19:10:08 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+136.168.101.19 - - [15/Oct/1997:19:10:09 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+206.175.189.221 - - [15/Oct/1997:19:10:10 -0700] "GET /write.html HTTP/1.0" 200 9408+206.175.189.221 - - [15/Oct/1997:19:10:12 -0700] "GET /images/usstamp.gif HTTP/1.0" 200 6166+206.175.189.221 - - [15/Oct/1997:19:10:13 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:10:13 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:10:13 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:10:15 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:10:16 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:10:16 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+136.168.101.19 - - [15/Oct/1997:19:10:28 -0700] "GET /about.html HTTP/1.0" 200 6902+136.168.101.19 - - [15/Oct/1997:19:10:29 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+136.168.101.19 - - [15/Oct/1997:19:10:29 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+136.168.101.19 - - [15/Oct/1997:19:10:29 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+136.168.101.19 - - [15/Oct/1997:19:10:29 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+136.168.101.19 - - [15/Oct/1997:19:10:30 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+136.168.101.19 - - [15/Oct/1997:19:10:30 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+136.168.101.19 - - [15/Oct/1997:19:10:30 -0700] "GET /images/where.gif HTTP/1.0" 200 605+136.168.101.19 - - [15/Oct/1997:19:10:31 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+136.168.101.19 - - [15/Oct/1997:19:10:32 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+136.168.101.19 - - [15/Oct/1997:19:10:32 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+152.163.207.138 - - [15/Oct/1997:19:10:39 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:11:12 -0700] "GET /joinai.html HTTP/1.0" 200 4054+206.175.189.221 - - [15/Oct/1997:19:11:14 -0700] "GET /weeklyua.html HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:11:16 -0700] "GET /images/amnesty.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:11:16 -0700] "GET /images/linebrn.gif HTTP/1.0" 304 -+206.175.189.221 - - [15/Oct/1997:19:11:16 -0700] "GET /images/logo2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:11:37 -0700] "GET /home.html HTTP/1.0" 200 17233+152.163.207.138 - - [15/Oct/1997:19:11:43 -0700] "GET /images/homelogo.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:11:47 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+152.163.207.138 - - [15/Oct/1997:19:11:47 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+152.163.207.138 - - [15/Oct/1997:19:11:47 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:11:56 -0700] "GET /ainews.html HTTP/1.0" 200 13435+152.163.207.138 - - [15/Oct/1997:19:12:08 -0700] "GET /images/newslogo.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:10 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:12 -0700] "GET /images/pubbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:12 -0700] "GET /images/refhand4.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:14 -0700] "GET /images/countbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:16 -0700] "GET /images/netbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:16 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:17 -0700] "GET /images/joinbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:19 -0700] "GET /images/eventbut.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:20 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:12:23 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:09 -0700] "GET /feats/weij.html HTTP/1.0" 200 6121+152.163.205.106 - - [15/Oct/1997:19:13:21 -0700] "GET /casework/fw.html HTTP/1.0" 304 -+152.163.205.106 - - [15/Oct/1997:19:13:24 -0700] "GET /casework/images/amnesty.gif HTTP/1.0" 304 -+152.163.205.106 - - [15/Oct/1997:19:13:24 -0700] "GET /casework/images/stamptil.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:33 -0700] "GET /asa/china/ HTTP/1.0" 200 18000+152.163.207.138 - - [15/Oct/1997:19:13:37 -0700] "GET /asa/china/contents.html HTTP/1.0" 200 3336+152.163.207.138 - - [15/Oct/1997:19:13:51 -0700] "GET /asa/china/images/welcome.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:53 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+152.163.207.138 - - [15/Oct/1997:19:13:54 -0700] "GET /asa/china/images/tibet.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:57 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:57 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:13:58 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 200 36122+152.163.207.138 - - [15/Oct/1997:19:13:59 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:14:01 -0700] "GET /asa/china/chinese.html HTTP/1.0" 200 15983+152.163.205.106 - - [15/Oct/1997:19:14:09 -0700] "GET /casework/fwq&a.html HTTP/1.0" 200 6329+152.163.207.138 - - [15/Oct/1997:19:14:12 -0700] "GET /asa/china/images/link.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:14:13 -0700] "GET /asa/china/images/renquan.gif HTTP/1.0" 200 411+152.163.207.138 - - [15/Oct/1997:19:14:15 -0700] "GET /asa/china/images/animai.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:14:15 -0700] "GET /asa/china/images/smflag.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:14:16 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 200 27794+152.163.207.138 - - [15/Oct/1997:19:14:18 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.0" 200 1202+152.163.207.138 - - [15/Oct/1997:19:14:19 -0700] "GET /asa/china/images/what-is-ai-chinese.gif HTTP/1.0" 200 3648+152.163.207.138 - - [15/Oct/1997:19:14:27 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:14:33 -0700] "GET /asa/china/images/aichico.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:15:55 -0700] "GET /asa/china/images/blue.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:15:57 -0700] "GET /asa/china/tibet.html HTTP/1.0" 200 8882+152.163.205.106 - - [15/Oct/1997:19:16:03 -0700] "GET /casework/fw1.html HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:16:04 -0700] "GET /asa/china/images/cgyatso2.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:16:04 -0700] "GET /asa/china/images/mainmenu.gif HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:16:06 -0700] "GET /asa/china/images/cohen.jpg HTTP/1.0" 304 -+152.163.207.138 - - [15/Oct/1997:19:16:55 -0700] "GET /asa/china/TRANS.GIF HTTP/1.0" 404 172+152.163.207.138 - - [15/Oct/1997:19:16:55 -0700] "GET /asa/china/cando.html HTTP/1.0" 200 8129+152.163.207.138 - - [15/Oct/1997:19:17:00 -0700] "GET /asa/china/images/mailme.gif HTTP/1.0" 200 14893+136.168.221.19 - - [15/Oct/1997:19:17:10 -0700] "GET / HTTP/1.0" 200 3082+136.168.221.19 - - [15/Oct/1997:19:17:12 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+136.168.221.19 - - [15/Oct/1997:19:17:12 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+136.168.221.19 - - [15/Oct/1997:19:17:16 -0700] "GET /about.html HTTP/1.0" 200 6902+152.163.207.138 - - [15/Oct/1997:19:17:16 -0700] "GET /asa/china/images/punchy.gif HTTP/1.0" 304 -+136.168.221.19 - - [15/Oct/1997:19:17:17 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+136.168.221.19 - - [15/Oct/1997:19:17:17 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+136.168.221.19 - - [15/Oct/1997:19:17:18 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+152.163.207.138 - - [15/Oct/1997:19:17:19 -0700] "GET /asa/china/images/world.gif HTTP/1.0" 304 -+136.168.221.19 - - [15/Oct/1997:19:17:21 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+136.168.221.19 - - [15/Oct/1997:19:17:21 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+136.168.221.19 - - [15/Oct/1997:19:17:21 -0700] "GET /images/where.gif HTTP/1.0" 200 605+136.168.221.19 - - [15/Oct/1997:19:17:22 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+136.168.221.19 - - [15/Oct/1997:19:17:22 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+136.168.221.19 - - [15/Oct/1997:19:17:23 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+136.168.221.19 - - [15/Oct/1997:19:17:25 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+136.168.221.19 - - [15/Oct/1997:19:18:51 -0700] "GET /about/history.html HTTP/1.0" 200 10342+136.168.221.19 - - [15/Oct/1997:19:18:52 -0700] "GET /about/images/masthd3.gif HTTP/1.0" 200 33250+136.168.221.19 - - [15/Oct/1997:19:18:52 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+136.168.221.19 - - [15/Oct/1997:19:18:52 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+136.168.221.19 - - [15/Oct/1997:19:18:53 -0700] "GET /about/images/airmail2.jpg HTTP/1.0" 200 7820+136.168.221.19 - - [15/Oct/1997:19:18:53 -0700] "GET /about/images/backtono.gif HTTP/1.0" 200 2367+136.168.221.19 - - [15/Oct/1997:19:18:54 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+136.168.221.19 - - [15/Oct/1997:19:18:55 -0700] "GET /about/images/coverbut.gif HTTP/1.0" 200 400+136.168.221.19 - - [15/Oct/1997:19:18:56 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+136.168.221.19 - - [15/Oct/1997:19:18:56 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+136.168.221.19 - - [15/Oct/1997:19:18:57 -0700] "GET /about/images/sagan4.gif HTTP/1.0" 200 3596+152.171.10.6 - - [15/Oct/1997:19:19:12 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+152.171.10.6 - - [15/Oct/1997:19:19:18 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+152.171.10.6 - - [15/Oct/1997:19:19:22 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+152.171.10.6 - - [15/Oct/1997:19:20:49 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+152.171.10.6 - - [15/Oct/1997:19:20:53 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+152.171.10.6 - - [15/Oct/1997:19:20:58 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+152.171.10.6 - - [15/Oct/1997:19:20:58 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+152.171.10.6 - - [15/Oct/1997:19:20:58 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+152.171.10.6 - - [15/Oct/1997:19:20:58 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+152.171.10.6 - - [15/Oct/1997:19:21:00 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+152.171.10.6 - - [15/Oct/1997:19:21:07 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+199.217.72.166 - - [15/Oct/1997:19:27:19 -0700] "GET /country/balkans HTTP/1.0" 301 196+199.217.72.166 - - [15/Oct/1997:19:27:21 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+199.217.72.166 - - [15/Oct/1997:19:27:23 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+199.217.72.166 - - [15/Oct/1997:19:27:24 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+199.217.72.166 - - [15/Oct/1997:19:27:26 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+199.217.72.166 - - [15/Oct/1997:19:27:26 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+199.217.72.166 - - [15/Oct/1997:19:27:30 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+199.217.72.166 - - [15/Oct/1997:19:27:30 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+199.217.72.166 - - [15/Oct/1997:19:27:42 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+199.217.72.166 - - [15/Oct/1997:19:27:42 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+203.18.134.1 - - [15/Oct/1997:19:27:44 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+203.18.134.1 - - [15/Oct/1997:19:27:46 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+203.18.134.1 - - [15/Oct/1997:19:27:47 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+203.18.134.1 - - [15/Oct/1997:19:27:48 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+203.18.134.1 - - [15/Oct/1997:19:27:49 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+203.18.134.1 - - [15/Oct/1997:19:27:50 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+203.18.134.1 - - [15/Oct/1997:19:27:51 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+203.18.134.1 - - [15/Oct/1997:19:27:52 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+203.18.134.1 - - [15/Oct/1997:19:27:53 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+203.18.134.1 - - [15/Oct/1997:19:27:54 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+203.18.134.1 - - [15/Oct/1997:19:27:56 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+203.18.134.1 - - [15/Oct/1997:19:27:56 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+203.18.134.1 - - [15/Oct/1997:19:27:58 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+203.18.134.1 - - [15/Oct/1997:19:27:58 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+203.18.134.1 - - [15/Oct/1997:19:27:59 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+203.18.134.1 - - [15/Oct/1997:19:28:02 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+203.18.134.1 - - [15/Oct/1997:19:28:03 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+203.18.134.1 - - [15/Oct/1997:19:28:04 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+203.18.134.1 - - [15/Oct/1997:19:28:06 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+203.18.134.1 - - [15/Oct/1997:19:28:08 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+203.18.134.1 - - [15/Oct/1997:19:28:09 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+203.18.134.1 - - [15/Oct/1997:19:28:09 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+203.18.134.1 - - [15/Oct/1997:19:28:10 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+203.18.134.1 - - [15/Oct/1997:19:28:11 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+203.18.134.1 - - [15/Oct/1997:19:28:12 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+203.18.134.1 - - [15/Oct/1997:19:28:13 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+204.192.112.114 - - [15/Oct/1997:19:28:28 -0700] "GET /robots.txt HTTP/1.0" 404 163+204.192.112.114 - - [15/Oct/1997:19:28:29 -0700] "GET / HTTP/1.0" 200 3082+203.18.134.1 - - [15/Oct/1997:19:28:51 -0700] "GET /amnesty/candatop.html HTTP/1.0" 200 10629+203.18.134.1 - - [15/Oct/1997:19:28:54 -0700] "GET /amnesty/images/candalog.gif HTTP/1.0" 200 8638+203.18.134.1 - - [15/Oct/1997:19:28:55 -0700] "GET /amnesty/images/done.gif HTTP/1.0" 200 4785+203.18.134.1 - - [15/Oct/1997:19:28:57 -0700] "GET /amnesty/images/reyes.gif HTTP/1.0" 200 10859+203.18.134.1 - - [15/Oct/1997:19:28:58 -0700] "GET /amnesty/images/reddash2.gif HTTP/1.0" 200 237+203.18.134.1 - - [15/Oct/1997:19:28:59 -0700] "GET /amnesty/images/kids5.jpg HTTP/1.0" 200 2903+203.18.134.1 - - [15/Oct/1997:19:29:01 -0700] "GET /amnesty/images/hasene2.gif HTTP/1.0" 200 8833+203.18.134.1 - - [15/Oct/1997:19:29:01 -0700] "GET /amnesty/images/rally4.jpg HTTP/1.0" 200 7352+203.18.134.1 - - [15/Oct/1997:19:29:03 -0700] "GET /amnesty/images/refrun1.gif HTTP/1.0" 200 836+203.18.134.1 - - [15/Oct/1997:19:29:06 -0700] "GET /amnesty/images/nigpost1.gif HTTP/1.0" 200 4429+203.18.134.1 - - [15/Oct/1997:19:29:06 -0700] "GET /amnesty/images/turkboy.gif HTTP/1.0" 200 4625+203.18.134.1 - - [15/Oct/1997:19:29:14 -0700] "GET /amnesty/images/howbut.gif HTTP/1.0" 200 509+203.18.134.1 - - [15/Oct/1997:19:29:14 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+203.18.134.1 - - [15/Oct/1997:19:32:09 -0700] "GET /amnesty/guatem/ndsa.html HTTP/1.0" 200 2605+203.18.134.1 - - [15/Oct/1997:19:32:11 -0700] "GET /amnesty/guatem/magglas2.jpg HTTP/1.0" 200 798+203.18.134.1 - - [15/Oct/1997:19:32:11 -0700] "GET /amnesty/images/wordo35c.jpg HTTP/1.0" 200 4123+203.18.134.1 - - [15/Oct/1997:19:32:13 -0700] "GET /amnesty/images/wordoll2.jpg HTTP/1.0" 200 3063+203.18.134.1 - - [15/Oct/1997:19:33:30 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+203.18.134.1 - - [15/Oct/1997:19:33:30 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+203.18.134.1 - - [15/Oct/1997:19:33:32 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+203.18.134.1 - - [15/Oct/1997:19:33:34 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+203.18.134.1 - - [15/Oct/1997:19:33:34 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+203.18.134.1 - - [15/Oct/1997:19:33:35 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+203.18.134.1 - - [15/Oct/1997:19:33:36 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+203.18.134.1 - - [15/Oct/1997:19:33:37 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+203.18.134.1 - - [15/Oct/1997:19:33:39 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+203.18.134.1 - - [15/Oct/1997:19:33:40 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+203.18.134.1 - - [15/Oct/1997:19:33:41 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+203.18.134.1 - - [15/Oct/1997:19:33:42 -0700] "GET /amnesty/welcome.html HTTP/1.0" 200 4731+203.18.134.1 - - [15/Oct/1997:19:33:43 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+203.18.134.1 - - [15/Oct/1997:19:33:47 -0700] "GET /amnesty/images/refugee2.gif HTTP/1.0" 200 14882+203.18.134.1 - - [15/Oct/1997:19:33:48 -0700] "GET /amnesty/images/doubt.gif HTTP/1.0" 200 924+203.18.134.1 - - [15/Oct/1997:19:33:48 -0700] "GET /amnesty/images/never.gif HTTP/1.0" 200 914+203.18.134.1 - - [15/Oct/1997:19:33:49 -0700] "GET /amnesty/images/your.gif HTTP/1.0" 200 951+203.18.134.1 - - [15/Oct/1997:19:33:50 -0700] "GET /amnesty/images/commit.gif HTTP/1.0" 200 190+203.18.134.1 - - [15/Oct/1997:19:33:51 -0700] "GET /amnesty/images/human.gif HTTP/1.0" 200 155+203.18.134.1 - - [15/Oct/1997:19:33:51 -0700] "GET /amnesty/images/rights.gif HTTP/1.0" 200 938+203.18.134.1 - - [15/Oct/1997:19:33:52 -0700] "GET /amnesty/images/a.gif HTTP/1.0" 200 865+203.18.134.1 - - [15/Oct/1997:19:33:52 -0700] "GET /amnesty/images/can.gif HTTP/1.0" 200 946+203.18.134.1 - - [15/Oct/1997:19:33:53 -0700] "GET /amnesty/images/differ.gif HTTP/1.0" 200 191+203.18.134.1 - - [15/Oct/1997:19:33:54 -0700] "GET /amnesty/images/it.gif HTTP/1.0" 200 170+203.18.134.1 - - [15/Oct/1997:19:33:55 -0700] "GET /amnesty/images/canred.gif HTTP/1.0" 200 311+203.18.134.1 - - [15/Oct/1997:19:33:56 -0700] "GET /amnesty/images/wamwer6.jpg HTTP/1.0" 200 9786+203.18.134.1 - - [15/Oct/1997:19:33:57 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+203.18.134.1 - - [15/Oct/1997:19:33:58 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+203.18.134.1 - - [15/Oct/1997:19:33:58 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+203.18.134.1 - - [15/Oct/1997:19:33:59 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+203.18.134.1 - - [15/Oct/1997:19:34:00 -0700] "GET /amnesty/images/3ways.gif HTTP/1.0" 200 1157+203.18.134.1 - - [15/Oct/1997:19:34:01 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+203.18.134.1 - - [15/Oct/1997:19:34:01 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+203.18.134.1 - - [15/Oct/1997:19:34:02 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+203.18.134.1 - - [15/Oct/1997:19:34:03 -0700] "GET /amnesty/images/aiusabut.gif HTTP/1.0" 200 591+203.18.134.1 - - [15/Oct/1997:19:34:03 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+203.18.134.1 - - [15/Oct/1997:19:34:03 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+203.18.134.1 - - [15/Oct/1997:19:34:03 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+203.18.134.1 - - [15/Oct/1997:19:34:04 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+203.18.134.1 - - [15/Oct/1997:19:34:04 -0700] "GET /amnesty/images/mombab10.gif HTTP/1.0" 200 28581+203.18.134.1 - - [15/Oct/1997:19:34:04 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+203.18.134.1 - - [15/Oct/1997:19:34:07 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+203.18.134.1 - - [15/Oct/1997:19:34:07 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+203.18.134.1 - - [15/Oct/1997:19:34:07 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+203.18.134.1 - - [15/Oct/1997:19:34:07 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+203.18.134.1 - - [15/Oct/1997:19:34:11 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+203.18.134.1 - - [15/Oct/1997:19:34:11 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+203.18.134.1 - - [15/Oct/1997:19:34:11 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+203.18.134.1 - - [15/Oct/1997:19:34:11 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+203.18.134.1 - - [15/Oct/1997:19:34:14 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+203.18.134.1 - - [15/Oct/1997:19:34:14 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+203.18.134.1 - - [15/Oct/1997:19:34:15 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+203.18.134.1 - - [15/Oct/1997:19:34:15 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+203.18.134.1 - - [15/Oct/1997:19:34:17 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+204.62.245.166 - - [15/Oct/1997:19:35:24 -0700] "GET /amnesty/guatem/uscondec.html HTTP/1.0" 200 3282+140.142.174.15 - - [15/Oct/1997:19:37:47 -0700] "GET /amnesty HTTP/1.0" 301 184+140.142.174.15 - - [15/Oct/1997:19:37:48 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+140.142.174.15 - - [15/Oct/1997:19:37:50 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+140.142.174.15 - - [15/Oct/1997:19:37:52 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+140.142.174.15 - - [15/Oct/1997:19:38:19 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+140.142.174.15 - - [15/Oct/1997:19:38:19 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+140.142.174.15 - - [15/Oct/1997:19:38:19 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+140.142.174.15 - - [15/Oct/1997:19:38:21 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+140.142.174.15 - - [15/Oct/1997:19:38:21 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+140.142.174.15 - - [15/Oct/1997:19:38:22 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+140.142.174.15 - - [15/Oct/1997:19:38:23 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+140.142.174.15 - - [15/Oct/1997:19:38:25 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+140.142.174.15 - - [15/Oct/1997:19:38:26 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+140.142.174.15 - - [15/Oct/1997:19:38:28 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+140.142.174.15 - - [15/Oct/1997:19:38:28 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+140.142.174.15 - - [15/Oct/1997:19:38:29 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+140.142.174.15 - - [15/Oct/1997:19:38:29 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+140.142.174.15 - - [15/Oct/1997:19:38:29 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+140.142.174.15 - - [15/Oct/1997:19:38:30 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+140.142.174.15 - - [15/Oct/1997:19:38:30 -0700] "GET /amnesty/images/savebutx.gif HTTP/1.0" 200 889+140.142.174.15 - - [15/Oct/1997:19:38:32 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+140.142.174.15 - - [15/Oct/1997:19:38:32 -0700] "GET /amnesty/images/getbut.gif HTTP/1.0" 200 2482+140.142.174.15 - - [15/Oct/1997:19:38:32 -0700] "GET /amnesty/images/membutx.gif HTTP/1.0" 200 849+140.142.174.15 - - [15/Oct/1997:19:38:32 -0700] "GET /amnesty/images/spanbut.gif HTTP/1.0" 200 447+140.142.174.15 - - [15/Oct/1997:19:38:34 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+140.142.174.15 - - [15/Oct/1997:19:38:34 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+207.137.47.247 - - [15/Oct/1997:19:38:35 -0700] "GET /amnesty/guatem/howdolls.html HTTP/1.0" 200 4203+207.137.47.247 - - [15/Oct/1997:19:38:38 -0700] "GET /amnesty/images/dollhow1.jpg HTTP/1.0" 200 2635+207.137.47.247 - - [15/Oct/1997:19:38:38 -0700] "GET /amnesty/images/dollhow2.jpg HTTP/1.0" 200 4865+207.137.47.247 - - [15/Oct/1997:19:38:38 -0700] "GET /amnesty/images/dollhow3.jpg HTTP/1.0" 200 7300+207.137.47.247 - - [15/Oct/1997:19:38:41 -0700] "GET /amnesty/images/wordoll2.jpg HTTP/1.0" 200 3063+140.142.174.15 - - [15/Oct/1997:19:38:54 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+140.142.174.15 - - [15/Oct/1997:19:38:55 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+140.142.174.15 - - [15/Oct/1997:19:38:55 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+140.142.174.15 - - [15/Oct/1997:19:38:57 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+140.142.174.15 - - [15/Oct/1997:19:38:57 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+140.142.174.15 - - [15/Oct/1997:19:38:57 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+140.142.174.15 - - [15/Oct/1997:19:38:59 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+207.137.47.247 - - [15/Oct/1997:19:39:03 -0700] "GET /amnesty/images/dollhow4.jpg HTTP/1.0" 200 10830+140.142.174.15 - - [15/Oct/1997:19:39:08 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+140.142.174.15 - - [15/Oct/1997:19:40:26 -0700] "GET /amnesty/country.html HTTP/1.0" 200 1765+140.142.174.15 - - [15/Oct/1997:19:40:27 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+140.142.174.15 - - [15/Oct/1997:19:40:27 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+140.142.174.15 - - [15/Oct/1997:19:40:27 -0700] "GET /amnesty/tools/topline3.gif HTTP/1.0" 200 233+140.142.174.15 - - [15/Oct/1997:19:40:27 -0700] "GET /amnesty/tools/topline4.gif HTTP/1.0" 200 263+140.142.174.15 - - [15/Oct/1997:19:40:28 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+140.142.174.15 - - [15/Oct/1997:19:40:28 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+140.142.174.15 - - [15/Oct/1997:19:40:28 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+140.142.174.15 - - [15/Oct/1997:19:40:28 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+140.142.174.15 - - [15/Oct/1997:19:40:41 -0700] "GET /amnesty/country/index.html HTTP/1.0" 200 2808+140.142.174.15 - - [15/Oct/1997:19:40:43 -0700] "GET /amnesty/country/images/balkhead.jpg HTTP/1.0" 200 5046+140.142.174.15 - - [15/Oct/1997:19:40:43 -0700] "GET /amnesty/country/images/rwanhea2.gif HTTP/1.0" 200 2737+140.142.174.15 - - [15/Oct/1997:19:40:43 -0700] "GET /amnesty/country/images/topline4.gif HTTP/1.0" 200 263+140.142.174.15 - - [15/Oct/1997:19:40:43 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+140.142.174.15 - - [15/Oct/1997:19:40:45 -0700] "GET /amnesty/country/images/nigeria3.gif HTTP/1.0" 200 1549+140.142.174.15 - - [15/Oct/1997:19:40:46 -0700] "GET /amnesty/country/images/topline3.gif HTTP/1.0" 200 233+140.142.174.15 - - [15/Oct/1997:19:40:55 -0700] "GET /amnesty/country/images/goddess3.jpg HTTP/1.0" 200 5491+140.142.174.15 - - [15/Oct/1997:19:40:56 -0700] "GET /amnesty/country/images/hrme2.jpg HTTP/1.0" 200 7337+140.142.174.15 - - [15/Oct/1997:19:40:56 -0700] "GET /amnesty/country/images/mandala2.jpg HTTP/1.0" 200 7568+32.96.68.164 - - [15/Oct/1997:19:41:08 -0700] "GET / HTTP/1.0" 200 3082+32.96.68.164 - - [15/Oct/1997:19:41:10 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+32.96.68.164 - - [15/Oct/1997:19:41:12 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+32.96.68.164 - - [15/Oct/1997:19:41:29 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+32.96.68.164 - - [15/Oct/1997:19:41:29 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+32.96.68.164 - - [15/Oct/1997:19:41:30 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+32.96.68.164 - - [15/Oct/1997:19:41:30 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+32.96.68.164 - - [15/Oct/1997:19:41:31 -0700] "GET /ainews.html HTTP/1.0" 200 13435+32.96.68.164 - - [15/Oct/1997:19:41:32 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+32.96.68.164 - - [15/Oct/1997:19:41:35 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+32.96.68.164 - - [15/Oct/1997:19:41:35 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+32.96.68.164 - - [15/Oct/1997:19:41:35 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+32.96.68.164 - - [15/Oct/1997:19:41:36 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+32.96.68.164 - - [15/Oct/1997:19:41:39 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+32.96.68.164 - - [15/Oct/1997:19:41:41 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+32.96.68.164 - - [15/Oct/1997:19:41:41 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+32.96.68.164 - - [15/Oct/1997:19:41:42 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+32.96.68.164 - - [15/Oct/1997:19:41:42 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+32.96.68.164 - - [15/Oct/1997:19:41:48 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+140.142.174.15 - - [15/Oct/1997:19:49:25 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+204.62.245.32 - - [15/Oct/1997:19:52:12 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+158.152.1.181 - - [15/Oct/1997:19:53:14 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+158.152.1.181 - - [15/Oct/1997:19:53:23 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+158.152.1.181 - - [15/Oct/1997:19:53:23 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+158.152.1.181 - - [15/Oct/1997:19:53:23 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+128.226.4.62 - - [15/Oct/1997:19:53:29 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+207.115.1.33 - - [15/Oct/1997:19:53:34 -0700] "GET / HTTP/1.0" 200 3082+128.226.4.62 - - [15/Oct/1997:19:53:35 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+128.226.4.62 - - [15/Oct/1997:19:53:35 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+207.115.1.33 - - [15/Oct/1997:19:53:36 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+207.115.1.33 - - [15/Oct/1997:19:53:37 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+128.226.4.62 - - [15/Oct/1997:19:53:47 -0700] "GET /amnesty/welcome.html HTTP/1.0" 200 4731+128.226.4.62 - - [15/Oct/1997:19:53:49 -0700] "GET /amnesty/images/a.gif HTTP/1.0" 200 865+128.226.4.62 - - [15/Oct/1997:19:53:49 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+128.226.4.62 - - [15/Oct/1997:19:53:49 -0700] "GET /amnesty/images/commit.gif HTTP/1.0" 200 190+128.226.4.62 - - [15/Oct/1997:19:53:49 -0700] "GET /amnesty/images/doubt.gif HTTP/1.0" 200 924+128.226.4.62 - - [15/Oct/1997:19:53:49 -0700] "GET /amnesty/images/never.gif HTTP/1.0" 200 914+128.226.4.62 - - [15/Oct/1997:19:53:50 -0700] "GET /amnesty/images/canred.gif HTTP/1.0" 200 311+128.226.4.62 - - [15/Oct/1997:19:53:50 -0700] "GET /amnesty/images/human.gif HTTP/1.0" 200 155+128.226.4.62 - - [15/Oct/1997:19:53:50 -0700] "GET /amnesty/images/it.gif HTTP/1.0" 200 170+128.226.4.62 - - [15/Oct/1997:19:53:50 -0700] "GET /amnesty/images/rights.gif HTTP/1.0" 200 938+128.226.4.62 - - [15/Oct/1997:19:53:50 -0700] "GET /amnesty/images/your.gif HTTP/1.0" 200 951+128.226.4.62 - - [15/Oct/1997:19:53:51 -0700] "GET /amnesty/images/3ways.gif HTTP/1.0" 200 1157+128.226.4.62 - - [15/Oct/1997:19:53:51 -0700] "GET /amnesty/images/aiusabut.gif HTTP/1.0" 200 591+128.226.4.62 - - [15/Oct/1997:19:53:51 -0700] "GET /amnesty/images/can.gif HTTP/1.0" 200 946+128.226.4.62 - - [15/Oct/1997:19:53:51 -0700] "GET /amnesty/images/refugee2.gif HTTP/1.0" 200 14882+128.226.4.62 - - [15/Oct/1997:19:53:52 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+128.226.4.62 - - [15/Oct/1997:19:53:52 -0700] "GET /amnesty/images/mombab10.gif HTTP/1.0" 200 28581+128.226.4.62 - - [15/Oct/1997:19:53:52 -0700] "GET /amnesty/images/wamwer6.jpg HTTP/1.0" 200 9786+128.226.4.62 - - [15/Oct/1997:19:53:57 -0700] "GET /amnesty/images/differ.gif HTTP/1.0" 200 191+128.226.4.62 - - [15/Oct/1997:19:54:12 -0700] "GET /amnesty/postcard/welact.html HTTP/1.0" 200 4640+128.226.4.62 - - [15/Oct/1997:19:54:17 -0700] "GET /amnesty/postcard/images/joinbut.gif HTTP/1.0" 200 409+128.226.4.62 - - [15/Oct/1997:19:54:17 -0700] "GET /amnesty/postcard/images/welbut.gif HTTP/1.0" 200 600+128.226.4.62 - - [15/Oct/1997:19:54:18 -0700] "GET /amnesty/postcard/images/aiusabut.gif HTTP/1.0" 200 591+128.226.4.62 - - [15/Oct/1997:19:54:18 -0700] "GET /amnesty/postcard/images/letbut.gif HTTP/1.0" 200 517+128.226.4.62 - - [15/Oct/1997:19:54:19 -0700] "GET /amnesty/postcard/images/w.gif HTTP/1.0" 200 565+128.226.4.62 - - [15/Oct/1997:19:54:20 -0700] "GET /amnesty/postcard/images/wombarb9.gif HTTP/1.0" 200 20647+207.115.1.33 - - [15/Oct/1997:19:54:34 -0700] "GET /whatsnew.html HTTP/1.0" 200 7562+207.115.1.33 - - [15/Oct/1997:19:54:38 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+207.115.1.33 - - [15/Oct/1997:19:54:38 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+207.115.1.33 - - [15/Oct/1997:19:54:38 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+207.115.1.33 - - [15/Oct/1997:19:54:38 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+207.115.1.33 - - [15/Oct/1997:19:54:41 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+207.115.1.33 - - [15/Oct/1997:19:54:42 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+207.115.1.33 - - [15/Oct/1997:19:54:42 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+207.115.1.33 - - [15/Oct/1997:19:54:42 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+128.226.4.62 - - [15/Oct/1997:19:54:45 -0700] "GET /amnesty/postcard/anyapp.html HTTP/1.0" 200 3797+128.226.4.62 - - [15/Oct/1997:19:54:46 -0700] "GET /amnesty/postcard/images/blkcnd2.gif HTTP/1.0" 200 1082+128.226.4.62 - - [15/Oct/1997:19:55:10 -0700] "GET /amnesty/postcard/anylett.html HTTP/1.0" 200 1489+207.115.1.33 - - [15/Oct/1997:19:56:16 -0700] "GET /asa/china/louisa-links.html HTTP/1.0" 200 1076+208.136.13.104 - - [15/Oct/1997:19:56:37 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+208.136.13.104 - - [15/Oct/1997:19:56:43 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+208.136.13.104 - - [15/Oct/1997:19:56:43 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+208.136.13.104 - - [15/Oct/1997:19:56:44 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+208.136.13.104 - - [15/Oct/1997:19:56:44 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+198.168.101.58 - - [15/Oct/1997:19:59:35 -0700] "GET / HTTP/1.0" 200 3082+198.168.101.58 - - [15/Oct/1997:19:59:37 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+198.168.101.58 - - [15/Oct/1997:19:59:39 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+128.226.4.62 - - [15/Oct/1997:20:00:03 -0700] "GET /amnesty/postcard/welgroup.html HTTP/1.0" 200 8002+128.226.4.62 - - [15/Oct/1997:20:00:04 -0700] "GET /amnesty/postcard/images/goldfla2.gif HTTP/1.0" 200 1161+128.226.4.62 - - [15/Oct/1997:20:00:04 -0700] "GET /amnesty/postcard/images/grncndl.gif HTTP/1.0" 200 1471+128.226.4.62 - - [15/Oct/1997:20:00:04 -0700] "GET /amnesty/postcard/images/weletbut.gif HTTP/1.0" 200 566+128.226.4.62 - - [15/Oct/1997:20:00:05 -0700] "GET /amnesty/images/04candle.gif HTTP/1.0" 200 7257+128.226.4.62 - - [15/Oct/1997:20:00:05 -0700] "GET /amnesty/images/can1_2.gif HTTP/1.0" 200 30430+128.226.4.62 - - [15/Oct/1997:20:00:05 -0700] "GET /amnesty/images/canfuz1.gif HTTP/1.0" 200 3013+198.110.98.5 - - [15/Oct/1997:20:01:07 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+128.226.4.62 - - [15/Oct/1997:20:01:13 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+128.226.4.62 - - [15/Oct/1997:20:01:20 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+128.226.4.62 - - [15/Oct/1997:20:01:21 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+128.226.4.62 - - [15/Oct/1997:20:01:21 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+128.226.4.62 - - [15/Oct/1997:20:01:21 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+128.226.4.62 - - [15/Oct/1997:20:01:22 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+128.226.4.62 - - [15/Oct/1997:20:01:22 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+128.226.4.62 - - [15/Oct/1997:20:01:22 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+128.226.4.62 - - [15/Oct/1997:20:01:22 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+128.226.4.62 - - [15/Oct/1997:20:01:22 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+128.226.4.62 - - [15/Oct/1997:20:01:23 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+128.226.4.62 - - [15/Oct/1997:20:01:37 -0700] "GET /amnesty/ainews/china/execrec.html HTTP/1.0" 200 6897+204.74.108.98 - - [15/Oct/1997:20:01:39 -0700] "GET / HTTP/1.0" 200 3082+204.74.108.98 - - [15/Oct/1997:20:01:40 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+204.74.108.98 - - [15/Oct/1997:20:01:40 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+204.74.108.98 - - [15/Oct/1997:20:02:01 -0700] "GET /home.html HTTP/1.0" 200 17233+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+204.74.108.98 - - [15/Oct/1997:20:02:02 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+204.74.108.98 - - [15/Oct/1997:20:02:03 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.74.108.98 - - [15/Oct/1997:20:02:03 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+204.74.108.98 - - [15/Oct/1997:20:02:03 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+204.74.108.98 - - [15/Oct/1997:20:02:03 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+204.74.108.98 - - [15/Oct/1997:20:02:03 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+204.74.108.98 - - [15/Oct/1997:20:02:04 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+204.74.108.98 - - [15/Oct/1997:20:02:05 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+128.226.4.62 - - [15/Oct/1997:20:02:06 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+204.74.108.98 - - [15/Oct/1997:20:02:07 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+204.74.108.98 - - [15/Oct/1997:20:02:08 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+204.201.210.19 - - [15/Oct/1997:20:02:35 -0700] "GET /country/balkans HTTP/1.0" 301 196+204.201.210.19 - - [15/Oct/1997:20:02:36 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+204.201.210.19 - - [15/Oct/1997:20:02:39 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+204.201.210.19 - - [15/Oct/1997:20:02:41 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+204.201.210.19 - - [15/Oct/1997:20:02:41 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+204.201.210.19 - - [15/Oct/1997:20:02:41 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+204.201.210.19 - - [15/Oct/1997:20:02:43 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+204.201.210.19 - - [15/Oct/1997:20:02:43 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+204.201.210.19 - - [15/Oct/1997:20:02:43 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+204.201.210.19 - - [15/Oct/1997:20:02:43 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+204.74.108.98 - - [15/Oct/1997:20:04:05 -0700] "GET /candatop.html HTTP/1.0" 200 10629+204.74.108.98 - - [15/Oct/1997:20:04:06 -0700] "GET /images/candalog.gif HTTP/1.0" 200 8638+204.74.108.98 - - [15/Oct/1997:20:04:06 -0700] "GET /images/done.gif HTTP/1.0" 200 4785+204.74.108.98 - - [15/Oct/1997:20:04:07 -0700] "GET /images/hasene2.gif HTTP/1.0" 200 8833+204.74.108.98 - - [15/Oct/1997:20:04:07 -0700] "GET /images/reddash2.gif HTTP/1.0" 200 237+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/kids5.jpg HTTP/1.0" 200 2903+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/nigpost1.gif HTTP/1.0" 200 4429+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/rally4.jpg HTTP/1.0" 200 7352+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/refrun1.gif HTTP/1.0" 200 836+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/reyes.gif HTTP/1.0" 200 10859+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/turkboy.gif HTTP/1.0" 200 4625+204.74.108.98 - - [15/Oct/1997:20:04:08 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+204.74.108.98 - - [15/Oct/1997:20:04:09 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+204.74.108.98 - - [15/Oct/1997:20:04:09 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+204.74.108.98 - - [15/Oct/1997:20:05:17 -0700] "GET /talun.html HTTP/1.0" 200 1210+204.74.108.98 - - [15/Oct/1997:20:05:31 -0700] "GET /reyes.html HTTP/1.0" 200 2137+204.74.108.98 - - [15/Oct/1997:20:05:32 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+204.74.108.98 - - [15/Oct/1997:20:05:46 -0700] "GET /turkoglu.html HTTP/1.0" 200 1176+204.201.210.19 - - [15/Oct/1997:20:05:47 -0700] "GET /country/index.html HTTP/1.0" 200 2808+204.201.210.19 - - [15/Oct/1997:20:05:49 -0700] "GET /country/images/balkhead.jpg HTTP/1.0" 200 5046+204.201.210.19 - - [15/Oct/1997:20:05:49 -0700] "GET /country/images/rwanhea2.gif HTTP/1.0" 200 2737+204.201.210.19 - - [15/Oct/1997:20:05:49 -0700] "GET /country/images/topline4.gif HTTP/1.0" 200 263+204.201.210.19 - - [15/Oct/1997:20:05:49 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+204.201.210.19 - - [15/Oct/1997:20:05:52 -0700] "GET /country/images/nigeria3.gif HTTP/1.0" 200 1549+204.201.210.19 - - [15/Oct/1997:20:05:57 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 200 7568+204.201.210.19 - - [15/Oct/1997:20:05:57 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+204.201.210.19 - - [15/Oct/1997:20:05:59 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+204.201.210.19 - - [15/Oct/1997:20:05:59 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+204.201.210.19 - - [15/Oct/1997:20:06:01 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 200 5491+204.74.108.98 - - [15/Oct/1997:20:06:02 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+204.74.108.98 - - [15/Oct/1997:20:06:02 -0700] "GET /joinai.html HTTP/1.0" 200 4054+204.201.210.19 - - [15/Oct/1997:20:06:30 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 200 5491+204.201.210.19 - - [15/Oct/1997:20:06:30 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 200 7337+204.201.210.19 - - [15/Oct/1997:20:06:30 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:06:30 -0700] "GET /country/images/topline3.gif HTTP/1.0" 200 233+204.201.210.19 - - [15/Oct/1997:20:06:34 -0700] "GET /country/rwanda/index.html HTTP/1.0" 200 1987+204.201.210.19 - - [15/Oct/1997:20:06:36 -0700] "GET /country/rwanda/images/rwanbg.jpg HTTP/1.0" 200 4042+204.201.210.19 - - [15/Oct/1997:20:06:36 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+204.201.210.19 - - [15/Oct/1997:20:06:45 -0700] "GET /country/rwanda/images/rwanhead.gif HTTP/1.0" 200 20639+209.12.153.58 - - [15/Oct/1997:20:07:06 -0700] "GET /amnesty/women/index.html HTTP/1.0" 200 8198+209.12.153.58 - - [15/Oct/1997:20:07:07 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+204.74.108.98 - - [15/Oct/1997:20:07:08 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+209.12.153.58 - - [15/Oct/1997:20:07:24 -0700] "GET /amnesty/women/images/unocal3.gif HTTP/1.0" 200 1170+209.12.153.58 - - [15/Oct/1997:20:07:30 -0700] "GET /amnesty/women/images/enronlog.gif HTTP/1.0" 200 17130+209.12.153.58 - - [15/Oct/1997:20:07:45 -0700] "GET /amnesty/women/images/sari1.gif HTTP/1.0" 200 1784+209.12.153.58 - - [15/Oct/1997:20:07:46 -0700] "GET /amnesty/women/images/afgref2.jpg HTTP/1.0" 200 3853+209.12.153.58 - - [15/Oct/1997:20:07:46 -0700] "GET /amnesty/women/images/afwom5.jpg HTTP/1.0" 200 3853+209.12.153.58 - - [15/Oct/1997:20:07:48 -0700] "GET /amnesty/group.html HTTP/1.0" 200 8575+204.201.210.19 - - [15/Oct/1997:20:07:57 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:07:57 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:07:57 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:07:57 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+204.201.210.19 - - [15/Oct/1997:20:07:58 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 206 4709+204.201.210.19 - - [15/Oct/1997:20:07:58 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 206 6555+204.201.210.19 - - [15/Oct/1997:20:07:59 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 206 5250+204.201.210.19 - - [15/Oct/1997:20:08:00 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+209.12.153.58 - - [15/Oct/1997:20:08:01 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+209.12.153.58 - - [15/Oct/1997:20:08:03 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+209.12.153.58 - - [15/Oct/1997:20:08:04 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+209.12.153.58 - - [15/Oct/1997:20:08:06 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+209.12.153.58 - - [15/Oct/1997:20:08:07 -0700] "GET /amnesty/images/goldfla2.gif HTTP/1.0" 200 1161+209.12.153.58 - - [15/Oct/1997:20:08:07 -0700] "GET /amnesty/images/grncndl.gif HTTP/1.0" 200 1471+209.12.153.58 - - [15/Oct/1997:20:08:09 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+209.12.153.58 - - [15/Oct/1997:20:08:15 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+209.12.153.58 - - [15/Oct/1997:20:08:21 -0700] "GET /amnesty/images/canfuz1.gif HTTP/1.0" 200 3013+209.12.153.58 - - [15/Oct/1997:20:08:36 -0700] "GET /amnesty/images/can1_2.gif HTTP/1.0" 200 30430+204.201.210.19 - - [15/Oct/1997:20:08:42 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:08:42 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:08:42 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:08:43 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 206 3954+204.201.210.19 - - [15/Oct/1997:20:08:43 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 206 5800+204.201.210.19 - - [15/Oct/1997:20:08:43 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 206 4496+204.201.210.19 - - [15/Oct/1997:20:08:43 -0700] "GET /images/newbutx.gif HTTP/1.0" 206 930+204.201.210.19 - - [15/Oct/1997:20:08:43 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:09:00 -0700] "GET /images/amnty1.gif HTTP/1.0" 200 3013+204.201.210.19 - - [15/Oct/1997:20:09:00 -0700] "GET /images/nigeria2.gif HTTP/1.0" 200 2518+204.201.210.19 - - [15/Oct/1997:20:09:00 -0700] "GET /nigsham.html HTTP/1.0" 200 19559+204.201.210.19 - - [15/Oct/1997:20:09:07 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.201.210.19 - - [15/Oct/1997:20:09:08 -0700] "GET /images/chris.jpg HTTP/1.0" 200 8302+204.201.210.19 - - [15/Oct/1997:20:09:08 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+209.12.153.58 - - [15/Oct/1997:20:09:10 -0700] "GET /amnesty/images/evenbut.gif HTTP/1.0" 200 399+204.201.210.19 - - [15/Oct/1997:20:09:11 -0700] "GET /images/image1.jpg HTTP/1.0" 200 8557+209.12.153.58 - - [15/Oct/1997:20:09:12 -0700] "GET /amnesty/images/04candle.gif HTTP/1.0" 200 7257+204.201.210.19 - - [15/Oct/1997:20:09:13 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+204.201.210.19 - - [15/Oct/1997:20:09:13 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+204.201.210.19 - - [15/Oct/1997:20:09:15 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+204.201.210.19 - - [15/Oct/1997:20:09:38 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:09:38 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:09:38 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+204.201.210.19 - - [15/Oct/1997:20:09:38 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+204.201.210.19 - - [15/Oct/1997:20:09:39 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 206 1462+204.201.210.19 - - [15/Oct/1997:20:09:39 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 206 1694+204.201.210.19 - - [15/Oct/1997:20:09:40 -0700] "GET /images/aboutbux.gif HTTP/1.0" 206 850+209.12.153.58 - - [15/Oct/1997:20:09:53 -0700] "GET /amnesty/women/images/afgref2.jpg HTTP/1.0" 304 -+209.12.153.58 - - [15/Oct/1997:20:09:53 -0700] "GET /amnesty/women/images/afwom5.jpg HTTP/1.0" 304 -+209.12.153.58 - - [15/Oct/1997:20:09:53 -0700] "GET /amnesty/women/images/sari1.gif HTTP/1.0" 200 1784+146.6.94.50 - - [15/Oct/1997:20:10:07 -0700] "GET / HTTP/1.0" 200 3082+146.6.94.50 - - [15/Oct/1997:20:10:17 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+146.6.94.50 - - [15/Oct/1997:20:10:21 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+38.14.126.160 - - [15/Oct/1997:20:11:51 -0700] "GET / HTTP/1.0" 200 3082+38.14.126.160 - - [15/Oct/1997:20:11:53 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+38.14.126.160 - - [15/Oct/1997:20:11:53 -0700] "GET /images/spot5.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:08 -0700] "GET /country HTTP/1.0" 301 188+38.14.126.160 - - [15/Oct/1997:20:12:08 -0700] "GET /country/ HTTP/1.0" 200 2808+38.14.126.160 - - [15/Oct/1997:20:12:11 -0700] "GET /country/images/balkhead.jpg HTTP/1.0" 200 5046+38.14.126.160 - - [15/Oct/1997:20:12:11 -0700] "GET /country/images/rwanhea2.gif HTTP/1.0" 200 2737+38.14.126.160 - - [15/Oct/1997:20:12:11 -0700] "GET /country/images/topline4.gif HTTP/1.0" 200 263+38.14.126.160 - - [15/Oct/1997:20:12:11 -0700] "GET /images/aiusared.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:12 -0700] "GET /country/images/mandala2.jpg HTTP/1.0" 200 7568+38.14.126.160 - - [15/Oct/1997:20:12:12 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:15 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:20 -0700] "GET /country/images/goddess3.jpg HTTP/1.0" 200 5491+38.14.126.160 - - [15/Oct/1997:20:12:20 -0700] "GET /country/images/hrme2.jpg HTTP/1.0" 200 7337+38.14.126.160 - - [15/Oct/1997:20:12:20 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:20 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:23 -0700] "GET /country/images/nigeria3.gif HTTP/1.0" 200 1549+38.14.126.160 - - [15/Oct/1997:20:12:23 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:28 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+38.14.126.160 - - [15/Oct/1997:20:12:31 -0700] "GET /country/images/topline3.gif HTTP/1.0" 200 233+206.86.247.122 - - [15/Oct/1997:20:16:38 -0700] "GET /usalinks.html HTTP/1.0" 200 10329+206.86.247.122 - - [15/Oct/1997:20:16:44 -0700] "GET /amnesty/fw.html HTTP/1.0" 200 779+203.116.1.245 - - [15/Oct/1997:20:16:52 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+192.65.17.24 - - [15/Oct/1997:20:20:26 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+192.65.17.24 - - [15/Oct/1997:20:20:31 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+192.65.17.24 - - [15/Oct/1997:20:20:33 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+192.65.17.24 - - [15/Oct/1997:20:20:56 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+192.65.17.24 - - [15/Oct/1997:20:21:08 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+192.65.17.24 - - [15/Oct/1997:20:23:40 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+192.65.17.24 - - [15/Oct/1997:20:23:49 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+192.65.17.24 - - [15/Oct/1997:20:23:49 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+192.65.17.24 - - [15/Oct/1997:20:23:50 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+192.65.17.24 - - [15/Oct/1997:20:23:54 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+192.65.17.24 - - [15/Oct/1997:20:23:54 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+192.65.17.24 - - [15/Oct/1997:20:23:54 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+192.65.17.24 - - [15/Oct/1997:20:23:54 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+192.65.17.24 - - [15/Oct/1997:20:23:56 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+192.65.17.24 - - [15/Oct/1997:20:23:56 -0700] "GET /amnesty/images/savebutx.gif HTTP/1.0" 200 889+192.65.17.24 - - [15/Oct/1997:20:23:57 -0700] "GET /amnesty/images/getbut.gif HTTP/1.0" 200 2482+192.65.17.24 - - [15/Oct/1997:20:23:57 -0700] "GET /amnesty/images/spanbut.gif HTTP/1.0" 200 447+192.65.17.24 - - [15/Oct/1997:20:23:59 -0700] "GET /amnesty/images/membutx.gif HTTP/1.0" 200 849+192.65.17.24 - - [15/Oct/1997:20:24:02 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+192.65.17.24 - - [15/Oct/1997:20:24:03 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+38.14.126.160 - - [15/Oct/1997:20:24:07 -0700] "GET /country/balkans HTTP/1.0" 301 196+38.14.126.160 - - [15/Oct/1997:20:24:08 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+38.14.126.160 - - [15/Oct/1997:20:24:11 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+38.14.126.160 - - [15/Oct/1997:20:24:12 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+38.14.126.160 - - [15/Oct/1997:20:24:12 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+38.14.126.160 - - [15/Oct/1997:20:24:13 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+38.14.126.160 - - [15/Oct/1997:20:24:14 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+38.14.126.160 - - [15/Oct/1997:20:24:14 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+38.14.126.160 - - [15/Oct/1997:20:24:14 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+38.14.126.160 - - [15/Oct/1997:20:24:16 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+192.65.17.24 - - [15/Oct/1997:20:24:33 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+192.65.17.24 - - [15/Oct/1997:20:24:36 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+192.65.17.24 - - [15/Oct/1997:20:24:37 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+192.65.17.24 - - [15/Oct/1997:20:24:37 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+192.65.17.24 - - [15/Oct/1997:20:24:46 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+192.65.17.24 - - [15/Oct/1997:20:24:46 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+192.65.17.24 - - [15/Oct/1997:20:24:47 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+192.65.17.24 - - [15/Oct/1997:20:24:52 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+192.65.17.24 - - [15/Oct/1997:20:24:53 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+192.65.17.24 - - [15/Oct/1997:20:24:53 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+192.65.17.24 - - [15/Oct/1997:20:24:53 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+192.65.17.24 - - [15/Oct/1997:20:24:56 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+192.65.17.24 - - [15/Oct/1997:20:24:56 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+192.65.17.24 - - [15/Oct/1997:20:24:57 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+192.65.17.24 - - [15/Oct/1997:20:24:58 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+192.65.17.24 - - [15/Oct/1997:20:24:58 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+192.65.17.24 - - [15/Oct/1997:20:24:59 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+192.65.17.24 - - [15/Oct/1997:20:24:59 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+192.65.17.24 - - [15/Oct/1997:20:25:00 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+192.65.17.24 - - [15/Oct/1997:20:25:09 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+192.65.17.24 - - [15/Oct/1997:20:25:14 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+192.65.17.24 - - [15/Oct/1997:20:25:37 -0700] "GET /amnesty/urgact/index.html HTTP/1.0" 200 8283+192.65.17.24 - - [15/Oct/1997:20:25:41 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+192.65.17.24 - - [15/Oct/1997:20:25:42 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+192.65.17.24 - - [15/Oct/1997:20:25:42 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+192.65.17.24 - - [15/Oct/1997:20:25:42 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+192.65.17.24 - - [15/Oct/1997:20:25:45 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+192.65.17.24 - - [15/Oct/1997:20:25:45 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+192.65.17.24 - - [15/Oct/1997:20:25:47 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+192.65.17.24 - - [15/Oct/1997:20:27:22 -0700] "GET /amnesty/urgact/newslett.html HTTP/1.0" 200 26074+192.65.17.24 - - [15/Oct/1997:20:27:23 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 200 43+132.254.40.136 - - [15/Oct/1997:20:30:29 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+132.254.40.136 - - [15/Oct/1997:20:30:32 -0700] "GET /amnesty/latinam/spoeadp.html HTTP/1.0" 200 8540+128.8.21.79 - - [15/Oct/1997:20:34:34 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+128.8.21.79 - - [15/Oct/1997:20:34:37 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+128.8.21.79 - - [15/Oct/1997:20:34:42 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+128.8.21.79 - - [15/Oct/1997:20:34:46 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+128.8.21.79 - - [15/Oct/1997:20:35:04 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+128.8.21.79 - - [15/Oct/1997:20:35:04 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+128.8.21.79 - - [15/Oct/1997:20:35:05 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+128.8.21.79 - - [15/Oct/1997:20:35:05 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+128.8.21.79 - - [15/Oct/1997:20:35:10 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+128.8.21.79 - - [15/Oct/1997:20:35:10 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+128.8.21.79 - - [15/Oct/1997:20:35:14 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+128.8.21.79 - - [15/Oct/1997:20:35:17 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+128.8.21.79 - - [15/Oct/1997:20:35:20 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+128.8.21.79 - - [15/Oct/1997:20:35:24 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+128.8.21.79 - - [15/Oct/1997:20:35:27 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+128.8.21.79 - - [15/Oct/1997:20:35:27 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+128.8.21.79 - - [15/Oct/1997:20:35:28 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+128.8.21.79 - - [15/Oct/1997:20:35:29 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+128.8.21.79 - - [15/Oct/1997:20:35:30 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+128.8.21.79 - - [15/Oct/1997:20:35:48 -0700] "GET /amnesty/country.html HTTP/1.0" 200 1765+128.8.21.79 - - [15/Oct/1997:20:35:50 -0700] "GET /amnesty/tools/topline4.gif HTTP/1.0" 200 263+128.8.21.79 - - [15/Oct/1997:20:35:51 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+128.8.21.79 - - [15/Oct/1997:20:35:51 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+128.8.21.79 - - [15/Oct/1997:20:35:51 -0700] "GET /amnesty/tools/topline3.gif HTTP/1.0" 200 233+128.8.21.79 - - [15/Oct/1997:20:35:52 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+128.8.21.79 - - [15/Oct/1997:20:35:53 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+128.8.21.79 - - [15/Oct/1997:20:35:54 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+128.8.21.79 - - [15/Oct/1997:20:35:55 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+204.162.96.93 - - [15/Oct/1997:20:35:57 -0700] "GET /amnesty/usa/assault.html HTTP/1.0" 200 4292+128.8.21.79 - - [15/Oct/1997:20:36:07 -0700] "GET /amnesty/country/index.html HTTP/1.0" 200 2808+128.8.21.79 - - [15/Oct/1997:20:36:09 -0700] "GET /amnesty/country/images/topline4.gif HTTP/1.0" 200 263+128.8.21.79 - - [15/Oct/1997:20:36:09 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+128.8.21.79 - - [15/Oct/1997:20:36:10 -0700] "GET /amnesty/country/images/balkhead.jpg HTTP/1.0" 200 5046+128.8.21.79 - - [15/Oct/1997:20:36:10 -0700] "GET /amnesty/country/images/rwanhea2.gif HTTP/1.0" 200 2737+128.8.21.79 - - [15/Oct/1997:20:36:13 -0700] "GET /amnesty/country/images/goddess3.jpg HTTP/1.0" 200 5491+128.8.21.79 - - [15/Oct/1997:20:36:14 -0700] "GET /amnesty/country/images/nigeria3.gif HTTP/1.0" 200 1549+128.8.21.79 - - [15/Oct/1997:20:36:18 -0700] "GET /amnesty/country/images/hrme2.jpg HTTP/1.0" 200 7337+128.8.21.79 - - [15/Oct/1997:20:36:22 -0700] "GET /amnesty/country/images/mandala2.jpg HTTP/1.0" 200 7568+128.8.21.79 - - [15/Oct/1997:20:36:25 -0700] "GET /amnesty/country/images/topline3.gif HTTP/1.0" 200 233+128.8.21.79 - - [15/Oct/1997:20:36:54 -0700] "GET /amnesty/candatop.html HTTP/1.0" 200 10629+128.8.21.79 - - [15/Oct/1997:20:36:55 -0700] "GET /amnesty/images/done.gif HTTP/1.0" 200 4785+128.8.21.79 - - [15/Oct/1997:20:36:56 -0700] "GET /amnesty/images/reddash2.gif HTTP/1.0" 200 237+128.8.21.79 - - [15/Oct/1997:20:37:03 -0700] "GET /amnesty/images/candalog.gif HTTP/1.0" 200 8638+128.8.21.79 - - [15/Oct/1997:20:37:04 -0700] "GET /amnesty/images/rally4.jpg HTTP/1.0" 200 7352+128.8.21.79 - - [15/Oct/1997:20:37:06 -0700] "GET /amnesty/images/reyes.gif HTTP/1.0" 200 10859+polux.entelchile.net - - [15/Oct/1997:21:02:07 -0700] "GET /latinam/spoeadp.html HTTP/1.0" 200 8540+polux.entelchile.net - - [15/Oct/1997:21:02:29 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+ws186.library.msstate.edu - - [15/Oct/1997:21:02:44 -0700] "GET /amnesty/usa/assault.html HTTP/1.0" 200 4292+ws186.library.msstate.edu - - [15/Oct/1997:21:02:45 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:02:49 -0700] "GET /amnesty/urgact/urgact.html HTTP/1.0" 404 179+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:09 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 200 43+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:09 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:10 -0700] "GET /amnesty/urgact/newslett.html HTTP/1.0" 200 26074+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:14 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:14 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:14 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:15 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:17 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:03:17 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:04:58 -0700] "GET /amnesty/urgact/urgact.html HTTP/1.0" 404 179+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:05:10 -0700] "GET /amnesty/urgac HTTP/1.0" 404 166+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:05:16 -0700] "GET /amnesty/urgact HTTP/1.0" 301 191+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:05:18 -0700] "GET /amnesty/urgact/ HTTP/1.0" 200 8283+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:06:33 -0700] "GET /amnesty/urgact/uafaq.html HTTP/1.0" 200 20157+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:06:55 -0700] "GET /amnesty/urgac HTTP/1.0" 404 166+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:06:56 -0700] "GET /amnesty/urgac HTTP/1.0" 404 166+1cust230.tnt3.krk1.da.uu.net - - [15/Oct/1997:21:06:58 -0700] "GET /amnesty/urgact/urgact.html HTTP/1.0" 404 179+ip051029.dialup.wvnet.edu - - [15/Oct/1997:21:07:07 -0700] "GET /amnesty HTTP/1.0" 301 184+ip051029.dialup.wvnet.edu - - [15/Oct/1997:21:07:09 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ip051029.dialup.wvnet.edu - - [15/Oct/1997:21:07:12 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ip051029.dialup.wvnet.edu - - [15/Oct/1997:21:07:17 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ip051029.dialup.wvnet.edu - - [15/Oct/1997:21:07:21 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+polux.entelchile.net - - [15/Oct/1997:21:08:38 -0700] "GET /ainews.html HTTP/1.0" 200 13435+polux.entelchile.net - - [15/Oct/1997:21:08:44 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+polux.entelchile.net - - [15/Oct/1997:21:09:01 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+polux.entelchile.net - - [15/Oct/1997:21:09:10 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+polux.entelchile.net - - [15/Oct/1997:21:09:10 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+polux.entelchile.net - - [15/Oct/1997:21:09:23 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+ww-tq03.proxy.aol.com - - [15/Oct/1997:21:11:33 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+ww-tq03.proxy.aol.com - - [15/Oct/1997:21:11:35 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ww-tq03.proxy.aol.com - - [15/Oct/1997:21:11:36 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+ww-tq03.proxy.aol.com - - [15/Oct/1997:21:11:37 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:13:59 -0700] "GET / HTTP/1.0" 200 3082+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:01 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:03 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:23 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:25 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:25 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:25 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:28 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:28 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:28 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:31 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:31 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:32 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:34 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:34 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:35 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:36 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:37 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:37 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:37 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:37 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:38 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:38 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:38 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:39 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:41 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:47 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:49 -0700] "GET /group.html HTTP/1.0" 200 8575+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:50 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:50 -0700] "GET /images/goldfla2.gif HTTP/1.0" 200 1161+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:50 -0700] "GET /images/grncndl.gif HTTP/1.0" 200 1471+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:53 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:53 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:53 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:53 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:55 -0700] "GET /images/04candle.gif HTTP/1.0" 200 7257+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:55 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:55 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:14:57 -0700] "GET /images/evenbut.gif HTTP/1.0" 200 399+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:15:00 -0700] "GET /images/canfuz1.gif HTTP/1.0" 200 3013+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:15:09 -0700] "GET /images/can1_2.gif HTTP/1.0" 200 30430+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:14 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:18 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:22 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:33 -0700] "GET /urgact/index.html HTTP/1.0" 200 8283+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:36 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:17:37 -0700] "GET /index.html HTTP/1.0" 200 3082+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:17:40 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:17:42 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:17:46 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+anx-lkf0044.deltanet.com - - [15/Oct/1997:21:17:58 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:31 -0700] "GET /whatsnew.html HTTP/1.0" 200 7562+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:34 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:35 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:18:35 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:34 -0700] "GET /about.html HTTP/1.0" 200 6902+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:36 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:37 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:38 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:38 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:38 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:38 -0700] "GET /images/where.gif HTTP/1.0" 200 605+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:38 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:39 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:39 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:19:40 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:11 -0700] "GET /group.html HTTP/1.0" 200 8575+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:19 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:19 -0700] "GET /images/goldfla2.gif HTTP/1.0" 200 1161+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:19 -0700] "GET /images/grncndl.gif HTTP/1.0" 200 1471+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:20 -0700] "GET /images/04candle.gif HTTP/1.0" 200 7257+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:20 -0700] "GET /images/canfuz1.gif HTTP/1.0" 200 3013+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:20 -0700] "GET /images/evenbut.gif HTTP/1.0" 200 399+proxy4.ykt.prodigy.net - - [15/Oct/1997:21:22:21 -0700] "GET /images/can1_2.gif HTTP/1.0" 200 30430+ppp23.fortworth.dfw.net - - [15/Oct/1997:22:04:57 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+al-jacob.wvmccd.cc.ca.us - - [15/Oct/1997:22:05:24 -0700] "GET / HTTP/1.0" 200 3082+proxy4.la.prodigy.net - - [15/Oct/1997:22:05:26 -0700] "GET /casework/index.html HTTP/1.0" 304 -+proxy4.la.prodigy.net - - [15/Oct/1997:22:05:27 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+proxy4.la.prodigy.net - - [15/Oct/1997:22:05:29 -0700] "GET /casework/index.html HTTP/1.0" 304 -+proxy4.la.prodigy.net - - [15/Oct/1997:22:05:30 -0700] "GET /casework/index.html HTTP/1.0" 304 -+proxy4.la.prodigy.net - - [15/Oct/1997:22:05:32 -0700] "GET /casework/index.html HTTP/1.0" 304 -+wdcsun2.usdoj.gov - - [15/Oct/1997:22:05:58 -0700] "GET /amnesty/women/afghaii.html HTTP/1.0" 200 3854+ip051029.dialup.wvnet.edu - - [15/Oct/1997:22:10:45 -0700] "GET /amnesty/death/cabana.html HTTP/1.0" 404 178+globulus.itd.uts.edu.au - - [15/Oct/1997:22:14:51 -0700] "GET /women/enronbac.html HTTP/1.0" 200 6806+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:02 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:05 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:05 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:11 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:12 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:13 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:25 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+globulus.itd.uts.edu.au - - [15/Oct/1997:22:15:25 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:01 -0700] "GET / HTTP/1.0" 200 3082+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:15 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:16 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ldn99-1.leiden.nl.net - - [15/Oct/1997:22:21:42 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+ldn99-1.leiden.nl.net - - [15/Oct/1997:22:21:42 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ldn99-1.leiden.nl.net - - [15/Oct/1997:22:21:42 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+ldn99-1.leiden.nl.net - - [15/Oct/1997:22:21:45 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:49 -0700] "GET /joinai.html HTTP/1.0" 200 4054+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:51 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:53 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:53 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:54 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:21:54 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:22:02 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:25:05 -0700] "GET /joinai.txt HTTP/1.0" 200 1914+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:28:46 -0700] "GET /home.html HTTP/1.0" 200 3854+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:28:59 -0700] "GET /home.html HTTP/1.0" 200 17233+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:03 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:03 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:05 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:06 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:07 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:12 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:13 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:13 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:14 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:18 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:18 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:19 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+ww-tr05.proxy.aol.com - - [15/Oct/1997:22:29:19 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+templeton-bbn.infoseek.com - - [15/Oct/1997:22:53:53 -0700] "GET /robots.txt HTTP/1.0" 404 163+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:53:56 -0700] "GET / HTTP/1.0" 200 3082+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:00 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+slip166-72-240-91.oh.us.ibm.net - - [15/Oct/1997:22:54:15 -0700] "GET / HTTP/1.0" 200 3082+slip166-72-240-91.oh.us.ibm.net - - [15/Oct/1997:22:54:17 -0700] "GET /amnesty/usalinks.html HTTP/1.0" 200 3854+templeton-bbn.infoseek.com - - [15/Oct/1997:22:54:17 -0700] "GET /asa/china/ HTTP/1.0" 200 3854+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:19 -0700] "GET /welcome.html HTTP/1.0" 200 4731+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:21 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:22 -0700] "GET /images/doubt.gif HTTP/1.0" 200 924+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:22 -0700] "GET /images/never.gif HTTP/1.0" 200 914+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:25 -0700] "GET /images/a.gif HTTP/1.0" 200 865+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:26 -0700] "GET /images/commit.gif HTTP/1.0" 200 190+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:26 -0700] "GET /images/rights.gif HTTP/1.0" 200 938+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:28 -0700] "GET /images/canred.gif HTTP/1.0" 200 311+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:30 -0700] "GET /images/aiusabut.gif HTTP/1.0" 200 591+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:30 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:30 -0700] "GET /images/refugee2.gif HTTP/1.0" 200 14882+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:32 -0700] "GET /images/spot5.gif HTTP/1.0" 200 3855+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:33 -0700] "GET /images/human.gif HTTP/1.0" 200 155+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:33 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:34 -0700] "GET /images/differ.gif HTTP/1.0" 200 191+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:36 -0700] "GET /images/your.gif HTTP/1.0" 200 951+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:37 -0700] "GET /images/can.gif HTTP/1.0" 200 946+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:37 -0700] "GET /images/it.gif HTTP/1.0" 200 170+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:40 -0700] "GET /images/3ways.gif HTTP/1.0" 200 1157+ppp-206-170-32-226.snfc21.pacbell.net - - [15/Oct/1997:22:54:43 -0700] "GET /images/mombab10.gif HTTP/1.0" 200 28581+ww-tk61.proxy.aol.com - - [15/Oct/1997:22:57:54 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+ww-tk61.proxy.aol.com - - [15/Oct/1997:22:57:54 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ww-tk61.proxy.aol.com - - [15/Oct/1997:22:57:54 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+ww-tk61.proxy.aol.com - - [15/Oct/1997:22:57:54 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+piweba5y-ext.prodigy.com - - [15/Oct/1997:23:00:34 -0700] "GET / HTTP/1.0" 200 3082+146.7.214.63 - - [15/Oct/1997:23:04:37 -0700] "GET /comm/stewart.html HTTP/1.0" 200 1648+146.7.214.63 - - [15/Oct/1997:23:04:46 -0700] "GET /comm/images/bsilk7.gif HTTP/1.0" 200 10517+146.7.214.63 - - [15/Oct/1997:23:04:52 -0700] "GET /comm/images/dot_clea.gif HTTP/1.0" 200 43+146.7.214.63 - - [15/Oct/1997:23:04:54 -0700] "GET /comm/images/people/stew4.jpg HTTP/1.0" 200 11278+templeton-bbn.infoseek.com - - [15/Oct/1997:23:31:38 -0700] "GET /amnesty/about.html HTTP/1.0" 200 6902+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:45:48 -0700] "GET /whatsnew.html** HTTP/1.0" 404 168+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:10 -0700] "GET /whatsnew.html** HTTP/1.0" 404 168+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:32 -0700] "GET /whatsnew.html HTTP/1.0" 200 7562+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:36 -0700] "GET /images/aiusared.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:36 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:36 -0700] "GET /images/homenew.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:36 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:37 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:37 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:37 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+ip160.ridgewood.nj.pub-ip.psi.net - - [15/Oct/1997:23:46:37 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+j8.inktomi.com - - [15/Oct/1997:23:47:57 -0700] "GET /education HTTP/1.0" 301 190+pool027-max6.gardena-ca-us.dialup.earthlink.net - - [16/Oct/1997:00:05:02 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+pool027-max6.gardena-ca-us.dialup.earthlink.net - - [16/Oct/1997:00:05:02 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+pool027-max6.gardena-ca-us.dialup.earthlink.net - - [16/Oct/1997:00:05:02 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+pool027-max6.gardena-ca-us.dialup.earthlink.net - - [16/Oct/1997:00:05:09 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+galore-bbn.infoseek.com - - [16/Oct/1997:00:35:46 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:36 -0700] "GET /urgact/ HTTP/1.0" 200 8283+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:38 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:38 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:38 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:38 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:42 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:42 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+adialup151.phnx.uswest.net - - [16/Oct/1997:00:56:42 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+203.21.39.23 - - [16/Oct/1997:00:57:21 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+ww-tn05.proxy.aol.com - - [16/Oct/1997:01:03:49 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+ww-tn05.proxy.aol.com - - [16/Oct/1997:01:03:51 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ww-tn05.proxy.aol.com - - [16/Oct/1997:01:03:51 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+ww-tn05.proxy.aol.com - - [16/Oct/1997:01:03:53 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+widow.av.pa-x.dec.com - - [16/Oct/1997:01:18:00 -0700] "GET /amnesty/so-cal.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:01:19:14 -0700] "GET /amnesty/index.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:01:21:40 -0700] "GET /amnesty/guatem/iobdecl.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:01:25:45 -0700] "GET /amnesty/guatem/ndsa4.html HTTP/1.0" 304 -+md18-228.mun.compuserve.com - - [16/Oct/1997:01:33:20 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+templeton-bbn.infoseek.com - - [16/Oct/1997:01:35:20 -0700] "GET /amnesty/regions/maregcon.html HTTP/1.0" 304 -+templeton-bbn.infoseek.com - - [16/Oct/1997:01:37:42 -0700] "GET /robots.txt HTTP/1.0" 404 163+templeton-bbn.infoseek.com - - [16/Oct/1997:01:37:52 -0700] "GET /education/ HTTP/1.0" 200 -+lsc070067.res-hall.nwu.edu - - [16/Oct/1997:01:40:55 -0700] "GET /amnesty/regions/startrek.html HTTP/1.0" 404 182+px1.syd.aone.net.au - - [16/Oct/1997:01:45:47 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+px1.syd.aone.net.au - - [16/Oct/1997:01:45:48 -0700] "GET /feats/coptrain.html HTTP/1.0" 200 20726+widow.av.pa-x.dec.com - - [16/Oct/1997:01:48:43 -0700] "GET /amnesty/guatem/ngodcl.html HTTP/1.0" 304 -+stargate.uni-paderborn.de - - [16/Oct/1997:01:50:47 -0700] "GET / HTTP/1.0" 200 3082+stargate.uni-paderborn.de - - [16/Oct/1997:01:50:51 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+stargate.uni-paderborn.de - - [16/Oct/1997:01:50:52 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:04 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:04 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:05 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:06 -0700] "GET /home.html HTTP/1.0" 200 17233+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:06 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:07 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:08 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:10 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:11 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:14 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:15 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:15 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:16 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:18 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:23 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:26 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:27 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:29 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:30 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:32 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:33 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+widow.av.pa-x.dec.com - - [16/Oct/1997:01:51:48 -0700] "GET /amnesty/guatem/huelgade.html HTTP/1.0" 304 -+stargate.uni-paderborn.de - - [16/Oct/1997:01:51:53 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+aluminum.elemental.ultra.net.au - - [16/Oct/1997:02:00:52 -0700] "GET /images/suu50b.jpg HTTP/1.0" 200 17237+aluminum.elemental.ultra.net.au - - [16/Oct/1997:02:00:52 -0700] "GET /myanmar/aungsan.html HTTP/1.0" 200 14464+widow.av.pa-x.dec.com - - [16/Oct/1997:02:02:43 -0700] "GET /amnesty/guatem/guatcamp.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:02:04:50 -0700] "GET /amnesty/guatem/guatdc.html HTTP/1.0" 304 -+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:06:51 -0700] "GET /amnesty HTTP/1.0" 301 184+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:06:52 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:06:54 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:06:57 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:12 -0700] "GET /amnesty/whatsnew.html HTTP/1.0" 200 7562+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:13 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:13 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+barracuda.res.wpi.net - - [16/Oct/1997:02:07:13 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+barracuda.res.wpi.net - - [16/Oct/1997:02:07:14 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+barracuda.res.wpi.net - - [16/Oct/1997:02:07:14 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+barracuda.res.wpi.net - - [16/Oct/1997:02:07:14 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+barracuda.res.wpi.net - - [16/Oct/1997:02:07:14 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:16 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:16 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:16 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:17 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:18 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:18 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:21 -0700] "GET /asa/china/ HTTP/1.1" 200 18000+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:21 -0700] "GET /asa/china/contents.html HTTP/1.1" 200 3336+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:29 -0700] "GET /asa/china/chinese.html HTTP/1.1" 200 15983+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:32 -0700] "GET /asa/china/images/welcome.gif HTTP/1.1" 200 1049+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:37 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.1" 200 27794+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:42 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:42 -0700] "GET /asa/china/images/hk.gif HTTP/1.1" 200 1212+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:45 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:45 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:45 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:45 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:07:46 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:46 -0700] "GET /asa/china/images/tibet.gif HTTP/1.1" 200 1241+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:47 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.1" 200 36122+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:50 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.1" 200 4196+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:50 -0700] "GET /asa/china/images/xj.gif HTTP/1.1" 200 1247+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:53 -0700] "GET /asa/china/images/link.gif HTTP/1.1" 200 4236+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:55 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.1" 200 2899+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:55 -0700] "GET /asa/china/images/renquan.gif HTTP/1.1" 200 411+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:56 -0700] "GET /asa/china/images/what-is-ai-chinese.gif HTTP/1.1" 200 3648+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:56 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.1" 200 1202+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:07:59 -0700] "GET /asa/china/images/aichico.gif HTTP/1.1" 200 4724+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:08:03 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.1" 200 17344+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:08:04 -0700] "GET /asa/china/images/animai.gif HTTP/1.1" 200 5175+1cust40.max6.santa-clara.ca.ms.uu.net - - [16/Oct/1997:02:08:05 -0700] "GET /asa/china/images/smflag.gif HTTP/1.1" 200 951+ti18a37-0013.dialup.online.no - - [16/Oct/1997:02:08:44 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ww-to06.proxy.aol.com - - [16/Oct/1997:02:10:41 -0700] "GET / HTTP/1.0" 200 3082+ww-to06.proxy.aol.com - - [16/Oct/1997:02:10:43 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+ww-to06.proxy.aol.com - - [16/Oct/1997:02:10:44 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+widow.av.pa-x.dec.com - - [16/Oct/1997:02:14:00 -0700] "GET /amnesty/guatem/uscondec.html HTTP/1.0" 304 -+lp02port26.highway.telekom.at - - [16/Oct/1997:02:14:41 -0700] "GET /amnesty/turkey/women.html HTTP/1.0" 200 17534+lp02port26.highway.telekom.at - - [16/Oct/1997:02:14:44 -0700] "GET /amnesty/turkey/amnty1.gif HTTP/1.0" 200 3013+lp02port26.highway.telekom.at - - [16/Oct/1997:02:14:44 -0700] "GET /amnesty/turkey/back.gif HTTP/1.0" 200 224+lp02port26.highway.telekom.at - - [16/Oct/1997:02:14:44 -0700] "GET /amnesty/turkey/clear.gif HTTP/1.0" 200 76+gk-red.unicc.org - - [16/Oct/1997:02:15:54 -0700] "GET / HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:17:12 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:17:12 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:17:15 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:17:15 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:17:16 -0700] "GET / HTTP/1.0" 200 3082+dialup74-3-48.swipnet.se - - [16/Oct/1997:02:17:58 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:02:18:01 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+dialup74-3-48.swipnet.se - - [16/Oct/1997:02:18:01 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+dialup74-3-48.swipnet.se - - [16/Oct/1997:02:18:03 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+dialup74-3-48.swipnet.se - - [16/Oct/1997:02:19:48 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+dialup74-3-48.swipnet.se - - [16/Oct/1997:02:24:38 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+obatanga.chat.carleton.ca - - [16/Oct/1997:02:26:06 -0700] "GET /amnesty/death/cabana.html HTTP/1.0" 404 178+142.los-angeles-09.ca.dial-access.att.net - - [16/Oct/1997:02:37:00 -0700] "GET /home.html HTTP/1.0" 200 17233+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:42:22 -0700] "GET /i-what.html HTTP/1.0" 404 164+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:42:42 -0700] "GET / HTTP/1.0" 200 3082+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:42:45 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:42:46 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:42:57 -0700] "GET /about.html HTTP/1.0" 200 6902+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:00 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:00 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:00 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:01 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:01 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:01 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:03 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:03 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:04 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:04 -0700] "GET /images/where.gif HTTP/1.0" 200 605+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:43 -0700] "GET /about/history.html HTTP/1.0" 200 10342+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:44 -0700] "GET /about/images/airmail2.jpg HTTP/1.0" 200 7820+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:44 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:44 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:45 -0700] "GET /about/images/backtono.gif HTTP/1.0" 200 2367+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:45 -0700] "GET /about/images/coverbut.gif HTTP/1.0" 200 400+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:46 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:47 -0700] "GET /about/images/masthd3.gif HTTP/1.0" 200 33250+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:47 -0700] "GET /about/images/sagan4.gif HTTP/1.0" 200 3596+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:48 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:43:48 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:45:13 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+gymnasiet-4.hanko.fi - - [16/Oct/1997:02:45:23 -0700] "GET /i-what.html HTTP/1.0" 404 164+194.158.162.143 - - [16/Oct/1997:02:50:22 -0700] "GET /country/balkans HTTP/1.0" 301 196+194.158.162.143 - - [16/Oct/1997:02:50:23 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+194.158.162.143 - - [16/Oct/1997:02:50:27 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+194.158.162.143 - - [16/Oct/1997:02:50:27 -0700] "GET /country/balkans/images/dot.gif%20ALT= HTTP/1.0" 404 188+194.158.162.143 - - [16/Oct/1997:02:50:29 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+194.158.162.143 - - [16/Oct/1997:02:50:33 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+194.158.162.143 - - [16/Oct/1997:02:50:33 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+194.158.162.143 - - [16/Oct/1997:02:50:36 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+194.158.162.143 - - [16/Oct/1997:02:50:36 -0700] "GET /country/balkans/images/dot.gif%20ALT= HTTP/1.0" 404 188+194.158.162.143 - - [16/Oct/1997:02:50:36 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+194.158.162.143 - - [16/Oct/1997:02:50:36 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+194.158.162.143 - - [16/Oct/1997:02:50:37 -0700] "GET /country/balkans/images/dot.gif%20ALT= HTTP/1.0" 404 188+194.158.162.143 - - [16/Oct/1997:02:50:37 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+195.53.57.2 - - [16/Oct/1997:02:53:15 -0700] "GET /latinam/spoeadp.html HTTP/1.0" 200 8540+195.53.57.2 - - [16/Oct/1997:02:53:20 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+widow.av.pa-x.dec.com - - [16/Oct/1997:02:53:28 -0700] "GET /amnesty/guatem/guatdocs.html HTTP/1.0" 304 -+194.158.162.143 - - [16/Oct/1997:02:54:10 -0700] "GET /country/balkans HTTP/1.0" 301 196+194.158.162.143 - - [16/Oct/1997:02:54:56 -0700] "GET /home.html HTTP/1.0" 200 17233+194.158.162.143 - - [16/Oct/1997:02:54:56 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+194.158.162.143 - - [16/Oct/1997:02:54:56 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+194.158.162.143 - - [16/Oct/1997:02:54:56 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+194.158.162.143 - - [16/Oct/1997:02:54:57 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+194.158.162.143 - - [16/Oct/1997:02:54:58 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+194.158.162.143 - - [16/Oct/1997:02:54:58 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+194.158.162.143 - - [16/Oct/1997:02:54:58 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+194.158.162.143 - - [16/Oct/1997:02:55:00 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+194.158.162.143 - - [16/Oct/1997:02:55:01 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+194.158.162.143 - - [16/Oct/1997:02:55:01 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+194.158.162.143 - - [16/Oct/1997:02:55:02 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+194.158.162.143 - - [16/Oct/1997:02:55:04 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+194.158.162.143 - - [16/Oct/1997:02:55:04 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+194.158.162.143 - - [16/Oct/1997:02:55:04 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+194.158.162.143 - - [16/Oct/1997:02:55:04 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+194.158.162.143 - - [16/Oct/1997:02:55:05 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+194.158.162.143 - - [16/Oct/1997:02:55:05 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+194.158.162.143 - - [16/Oct/1997:02:55:05 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+194.158.162.143 - - [16/Oct/1997:02:55:05 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+194.158.162.143 - - [16/Oct/1997:02:55:09 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+194.158.162.143 - - [16/Oct/1997:02:55:10 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+194.158.162.143 - - [16/Oct/1997:02:55:14 -0700] "GET /ainews.html HTTP/1.0" 200 13435+194.158.162.143 - - [16/Oct/1997:02:55:15 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+194.158.162.143 - - [16/Oct/1997:02:55:15 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+194.158.162.143 - - [16/Oct/1997:02:55:16 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+194.158.162.143 - - [16/Oct/1997:02:55:17 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+194.158.162.143 - - [16/Oct/1997:02:55:17 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+194.158.162.143 - - [16/Oct/1997:02:55:18 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+194.158.162.143 - - [16/Oct/1997:02:55:20 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+194.158.162.143 - - [16/Oct/1997:02:56:03 -0700] "GET /ainews/cuba/criticsp.html HTTP/1.0" 200 7711+194.158.162.143 - - [16/Oct/1997:02:56:04 -0700] "GET /ainews/images/blkcnd2.gif HTTP/1.0" 200 1082+194.158.162.143 - - [16/Oct/1997:02:56:12 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+widow.av.pa-x.dec.com - - [16/Oct/1997:03:02:49 -0700] "GET /amnesty/guatem/aidecl.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:03:18:20 -0700] "GET /amnesty/guatem/guatacts.html HTTP/1.0" 304 -+widow.av.pa-x.dec.com - - [16/Oct/1997:03:27:46 -0700] "GET /amnesty/guatem/bgdecl.html HTTP/1.0" 304 -+ppp066.b.ite.net - - [16/Oct/1997:03:36:06 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ppp066.b.ite.net - - [16/Oct/1997:03:36:08 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ppp066.b.ite.net - - [16/Oct/1997:03:36:12 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ppp066.b.ite.net - - [16/Oct/1997:03:37:04 -0700] "GET /amnesty/about.html HTTP/1.0" 200 6902+ppp066.b.ite.net - - [16/Oct/1997:03:37:06 -0700] "GET /amnesty/images/howbut.gif HTTP/1.0" 200 509+ppp066.b.ite.net - - [16/Oct/1997:03:37:07 -0700] "GET /amnesty/images/whobut.gif HTTP/1.0" 200 505+ppp066.b.ite.net - - [16/Oct/1997:03:37:11 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+ppp066.b.ite.net - - [16/Oct/1997:03:37:11 -0700] "GET /amnesty/images/whatbut.gif HTTP/1.0" 200 526+ppp066.b.ite.net - - [16/Oct/1997:03:37:11 -0700] "GET /amnesty/images/where.gif HTTP/1.0" 200 605+ppp066.b.ite.net - - [16/Oct/1997:03:37:17 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+ppp066.b.ite.net - - [16/Oct/1997:03:37:18 -0700] "GET /amnesty/images/aalogo.gif HTTP/1.0" 200 15293+ppp066.b.ite.net - - [16/Oct/1997:03:37:18 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+ppp066.b.ite.net - - [16/Oct/1997:03:37:18 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+ppp066.b.ite.net - - [16/Oct/1997:03:37:22 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+ppp066.b.ite.net - - [16/Oct/1997:03:38:33 -0700] "GET /amnesty/images/done.gif HTTP/1.0" 200 4785+ppp066.b.ite.net - - [16/Oct/1997:03:38:34 -0700] "GET /amnesty/candatop.html HTTP/1.0" 200 10629+ppp066.b.ite.net - - [16/Oct/1997:03:38:48 -0700] "GET /amnesty/images/candalog.gif HTTP/1.0" 200 8638+ppp066.b.ite.net - - [16/Oct/1997:03:38:50 -0700] "GET /amnesty/images/reyes.gif HTTP/1.0" 200 10859+ppp066.b.ite.net - - [16/Oct/1997:03:38:56 -0700] "GET /amnesty/images/kids5.jpg HTTP/1.0" 200 2903+ppp066.b.ite.net - - [16/Oct/1997:03:38:56 -0700] "GET /amnesty/images/reddash2.gif HTTP/1.0" 200 237+ppp066.b.ite.net - - [16/Oct/1997:03:38:58 -0700] "GET /amnesty/images/refrun1.gif HTTP/1.0" 200 836+ppp066.b.ite.net - - [16/Oct/1997:03:39:03 -0700] "GET /amnesty/images/hasene2.gif HTTP/1.0" 200 8833+ppp066.b.ite.net - - [16/Oct/1997:03:39:08 -0700] "GET /amnesty/images/nigpost1.gif HTTP/1.0" 200 4429+ppp066.b.ite.net - - [16/Oct/1997:03:39:08 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+ppp066.b.ite.net - - [16/Oct/1997:03:39:09 -0700] "GET /amnesty/images/turkboy.gif HTTP/1.0" 200 4625+ppp066.b.ite.net - - [16/Oct/1997:03:39:14 -0700] "GET /amnesty/images/rally4.jpg HTTP/1.0" 200 7352+ppp066.b.ite.net - - [16/Oct/1997:03:39:20 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+ppp066.b.ite.net - - [16/Oct/1997:03:39:23 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+ppp066.b.ite.net - - [16/Oct/1997:03:40:09 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:42:31 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:42:34 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+widow.av.pa-x.dec.com - - [16/Oct/1997:03:42:40 -0700] "GET /amnesty/guatem/guatstud.html HTTP/1.0" 304 -+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:06 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:10 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:10 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:11 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:14 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:15 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:18 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:19 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:21 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+proxyf11.cyberway.com.sg - - [16/Oct/1997:03:43:22 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+141.244.102.33 - - [16/Oct/1997:03:57:32 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+141.244.102.33 - - [16/Oct/1997:03:59:17 -0700] "GET /amnesty/ainews/congo_rwanda/massinc.html HTTP/1.0" 200 3855+141.244.102.33 - - [16/Oct/1997:03:59:30 -0700] "GET /amnesty/ainews/congo_rwanda/massinc.html HTTP/1.0" 200 3855+141.244.102.33 - - [16/Oct/1997:03:59:43 -0700] "GET /amnesty/ainews/congo_rwanda/massinc.html HTTP/1.0" 200 3855+202.231.192.180 - - [16/Oct/1997:04:09:02 -0700] "GET /usalinks.html HTTP/1.0" 200 10329+202.231.192.180 - - [16/Oct/1997:04:09:05 -0700] "GET /images/ai_cand1.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:05 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:09 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:09 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:09 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:09 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:12 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+202.231.192.180 - - [16/Oct/1997:04:09:12 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:20:42 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 200 43+hud02a01.ml.com - - [16/Oct/1997:04:20:42 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+hud02a01.ml.com - - [16/Oct/1997:04:20:42 -0700] "GET /amnesty/urgact/newslett.html HTTP/1.0" 200 26074+hud02a01.ml.com - - [16/Oct/1997:04:20:43 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+hud02a01.ml.com - - [16/Oct/1997:04:20:43 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+hud02a01.ml.com - - [16/Oct/1997:04:20:43 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+hud02a01.ml.com - - [16/Oct/1997:04:20:44 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+hud02a01.ml.com - - [16/Oct/1997:04:20:44 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+hud02a01.ml.com - - [16/Oct/1997:04:20:44 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+hud02a01.ml.com - - [16/Oct/1997:04:23:03 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:03 -0700] "GET /amnesty/urgact/nl0997.html HTTP/1.0" 200 18812+hud02a01.ml.com - - [16/Oct/1997:04:23:04 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:05 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:05 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:05 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:05 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:23:06 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 304 -+203.8.223.2 - - [16/Oct/1997:04:23:54 -0700] "GET /amnesty/feats/china1.html HTTP/1.0" 200 3303+203.8.223.2 - - [16/Oct/1997:04:24:10 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+hud02a01.ml.com - - [16/Oct/1997:04:25:20 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+hud02a01.ml.com - - [16/Oct/1997:04:25:20 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+hud02a01.ml.com - - [16/Oct/1997:04:25:20 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+hud02a01.ml.com - - [16/Oct/1997:04:25:21 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+hud02a01.ml.com - - [16/Oct/1997:04:25:21 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+hud02a01.ml.com - - [16/Oct/1997:04:25:21 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+hud02a01.ml.com - - [16/Oct/1997:04:25:22 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+hud02a01.ml.com - - [16/Oct/1997:04:25:23 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+hud02a01.ml.com - - [16/Oct/1997:04:25:23 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+hud02a01.ml.com - - [16/Oct/1997:04:25:23 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+m.johns.slip.auckland.ac.nz - - [16/Oct/1997:04:28:31 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+m.johns.slip.auckland.ac.nz - - [16/Oct/1997:04:28:31 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+m.johns.slip.auckland.ac.nz - - [16/Oct/1997:04:28:31 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+m.johns.slip.auckland.ac.nz - - [16/Oct/1997:04:28:34 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:26 -0700] "GET /amnesty/images/linebrn.gif HTTP/1.0" 200 308+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:26 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:26 -0700] "GET /amnesty/weeklyua.html HTTP/1.0" 200 10887+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:30 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:30 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:30 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:30 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:32 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:29:32 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+proxyf11.cyberway.com.sg - - [16/Oct/1997:04:30:45 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+hud02a01.ml.com - - [16/Oct/1997:04:32:30 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:30 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+hud02a01.ml.com - - [16/Oct/1997:04:32:32 -0700] "GET /amnesty/urgact/newslett.html HTTP/1.0" 200 26074+hud02a01.ml.com - - [16/Oct/1997:04:32:33 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+hud02a01.ml.com - - [16/Oct/1997:04:32:33 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+hud02a01.ml.com - - [16/Oct/1997:04:32:33 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:33 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+hud02a01.ml.com - - [16/Oct/1997:04:32:33 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+hud02a01.ml.com - - [16/Oct/1997:04:32:34 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+hud02a01.ml.com - - [16/Oct/1997:04:32:38 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:38 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:38 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:38 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:38 -0700] "GET /amnesty/urgact/nl0997.html HTTP/1.0" 200 18812+hud02a01.ml.com - - [16/Oct/1997:04:32:39 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:39 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:04:32:39 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 304 -+202.54.52.100 - - [16/Oct/1997:04:39:23 -0700] "GET /amnesty/immigr.html HTTP/1.0" 200 11284+poppy.mcc.ac.uk - - [16/Oct/1997:04:39:29 -0700] "GET /asa/china/ HTTP/1.0" 200 18000+poppy.mcc.ac.uk - - [16/Oct/1997:04:41:03 -0700] "GET /asa/china/contents.html HTTP/1.0" 200 3336+poppy.mcc.ac.uk - - [16/Oct/1997:04:42:08 -0700] "GET /asa/china/images/smflag.gif HTTP/1.0" 200 951+poppy.mcc.ac.uk - - [16/Oct/1997:04:42:18 -0700] "GET /asa/china/images/animai.gif HTTP/1.0" 200 5175+poppy.mcc.ac.uk - - [16/Oct/1997:04:42:21 -0700] "GET /asa/china/chinese.html HTTP/1.0" 200 15983+widow.av.pa-x.dec.com - - [16/Oct/1997:04:42:49 -0700] "GET /amnesty/guatem/howdolls.html HTTP/1.0" 304 -+poppy.mcc.ac.uk - - [16/Oct/1997:04:43:15 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+poppy.mcc.ac.uk - - [16/Oct/1997:04:43:15 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.0" 200 4196+poppy.mcc.ac.uk - - [16/Oct/1997:04:44:14 -0700] "GET /asa/china/images/tibet.gif HTTP/1.0" 200 1241+poppy.mcc.ac.uk - - [16/Oct/1997:04:44:28 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 200 1247+poppy.mcc.ac.uk - - [16/Oct/1997:04:45:10 -0700] "GET /asa/china/images/aichico.gif HTTP/1.0" 200 4724+poppy.mcc.ac.uk - - [16/Oct/1997:04:46:10 -0700] "GET /asa/china/images/welcome.gif HTTP/1.0" 200 1049+poppy.mcc.ac.uk - - [16/Oct/1997:04:46:48 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.0" 200 2899+palo10.pacific.net.sg - - [16/Oct/1997:04:48:08 -0700] "GET / HTTP/1.0" 200 3082+poppy.mcc.ac.uk - - [16/Oct/1997:04:49:04 -0700] "GET /asa/china/images/link.gif HTTP/1.0" 200 4236+poppy.mcc.ac.uk - - [16/Oct/1997:04:49:15 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 200 16384+poppy.mcc.ac.uk - - [16/Oct/1997:04:49:29 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.0" 206 2114+palo10.pacific.net.sg - - [16/Oct/1997:04:49:46 -0700] "GET /ainews.html HTTP/1.0" 200 13435+poppy.mcc.ac.uk - - [16/Oct/1997:04:50:04 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 206 19844+poppy.mcc.ac.uk - - [16/Oct/1997:04:50:58 -0700] "GET /asa/china/images/renquan.gif HTTP/1.0" 200 411+poppy.mcc.ac.uk - - [16/Oct/1997:04:51:03 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 200 17344+palo10.pacific.net.sg - - [16/Oct/1997:04:51:10 -0700] "GET /ainews/singapore/sue.html HTTP/1.0" 200 5225+poppy.mcc.ac.uk - - [16/Oct/1997:04:51:45 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.0" 200 1202+poppy.mcc.ac.uk - - [16/Oct/1997:04:51:54 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 200 9487+poppy.mcc.ac.uk - - [16/Oct/1997:04:52:47 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 304 -+poppy.mcc.ac.uk - - [16/Oct/1997:04:52:58 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 206 30731+palo10.pacific.net.sg - - [16/Oct/1997:04:53:23 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+poppy.mcc.ac.uk - - [16/Oct/1997:04:54:46 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 206 11441+ip244.baltimore3.md.pub-ip.psi.net - - [16/Oct/1997:05:00:07 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+ip244.baltimore3.md.pub-ip.psi.net - - [16/Oct/1997:05:00:07 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ip244.baltimore3.md.pub-ip.psi.net - - [16/Oct/1997:05:00:07 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+ip244.baltimore3.md.pub-ip.psi.net - - [16/Oct/1997:05:00:10 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:38 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:38 -0700] "GET /amnesty/images/refrun1.gif HTTP/1.0" 200 836+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:39 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:39 -0700] "GET /amnesty/images/turqbut.gif HTTP/1.0" 200 903+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:42 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:48 -0700] "GET /amnesty/refugee/refqa.html HTTP/1.0" 200 18657+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:49 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:49 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+ccds232.ccds.cincinnati.oh.us - - [16/Oct/1997:05:05:49 -0700] "GET /amnesty/images/morinfox.gif HTTP/1.0" 200 2056+pc5249.cmiu.bt.co.uk - - [16/Oct/1997:05:14:20 -0700] "GET /amnesty/turkey/women.html HTTP/1.0" 200 17534+194.184.94.45 - - [16/Oct/1997:05:15:30 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+204.232.49.4 - - [16/Oct/1997:05:15:32 -0700] "GET / HTTP/1.0" 200 3082+204.232.49.4 - - [16/Oct/1997:05:15:39 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+204.232.49.4 - - [16/Oct/1997:05:15:46 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+206.23.223.136 - - [16/Oct/1997:05:16:05 -0700] "GET /amnesty/death/cabana.html HTTP/1.0" 404 178+rolf.powersim.no - - [16/Oct/1997:05:16:28 -0700] "GET /spanish/images/yi.gif HTTP/1.0" 200 16599+193.213.14.50 - - [16/Oct/1997:05:16:29 -0700] "GET /spanish/fwspupda.html HTTP/1.0" 200 4283+rolf.powersim.no - - [16/Oct/1997:05:16:30 -0700] "GET /spanish/images/padilla2.gif HTTP/1.0" 200 12312+rolf.powersim.no - - [16/Oct/1997:05:16:31 -0700] "GET /spanish/images/ghaleh.gif HTTP/1.0" 200 27250+pc26.huron.ac.uk - - [16/Oct/1997:05:17:43 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+204.232.49.4 - - [16/Oct/1997:05:21:44 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+204.232.49.4 - - [16/Oct/1997:05:21:44 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+204.232.49.4 - - [16/Oct/1997:05:21:45 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+204.232.49.4 - - [16/Oct/1997:05:21:46 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+204.232.49.4 - - [16/Oct/1997:05:21:53 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+204.232.49.4 - - [16/Oct/1997:05:21:53 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+204.232.49.4 - - [16/Oct/1997:05:21:53 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+204.232.49.4 - - [16/Oct/1997:05:21:54 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+204.232.49.4 - - [16/Oct/1997:05:21:55 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+204.232.49.4 - - [16/Oct/1997:05:21:57 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+204.232.49.4 - - [16/Oct/1997:05:21:57 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+204.232.49.4 - - [16/Oct/1997:05:21:58 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+204.232.49.4 - - [16/Oct/1997:05:21:59 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+204.232.49.4 - - [16/Oct/1997:05:22:03 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.232.49.4 - - [16/Oct/1997:05:22:03 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+204.232.49.4 - - [16/Oct/1997:05:22:07 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+204.232.49.4 - - [16/Oct/1997:05:22:07 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+204.232.49.4 - - [16/Oct/1997:05:22:11 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+204.232.49.4 - - [16/Oct/1997:05:22:12 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+204.232.49.4 - - [16/Oct/1997:05:22:15 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+204.232.49.4 - - [16/Oct/1997:05:22:16 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+204.232.49.4 - - [16/Oct/1997:05:22:17 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+204.232.49.4 - - [16/Oct/1997:05:22:19 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+204.232.49.4 - - [16/Oct/1997:05:22:21 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+204.232.49.4 - - [16/Oct/1997:05:22:21 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+204.232.49.4 - - [16/Oct/1997:05:22:21 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+ircf.funet.fi - - [16/Oct/1997:05:26:47 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+hhtam025027.netvigator.com - - [16/Oct/1997:05:29:57 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+207.38.218.70 - - [16/Oct/1997:05:30:56 -0700] "GET /ainews.html HTTP/1.0" 304 -+hhtam025027.netvigator.com - - [16/Oct/1997:05:30:56 -0700] "GET /asa/china/consdoc.html HTTP/1.0" 200 32768+207.38.218.70 - - [16/Oct/1997:05:31:00 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:00 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:00 -0700] "GET /images/newslogo.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:00 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+207.38.218.70 - - [16/Oct/1997:05:31:01 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+207.38.218.70 - - [16/Oct/1997:05:31:01 -0700] "GET /images/refhand4.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:01 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:02 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:31:02 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 3854+207.38.218.70 - - [16/Oct/1997:05:31:02 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+207.38.218.70 - - [16/Oct/1997:05:31:02 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:09 -0700] "GET / HTTP/1.0" 200 3082+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:11 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:15 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:38 -0700] "GET /amnesty/asa/china/images/animai.gif HTTP/1.0" 200 5175+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:39 -0700] "GET /amnesty/asa/china/images/smflag.gif HTTP/1.0" 200 951+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:44 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:44 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:45 -0700] "GET /amnesty/asa/china/chinese.html HTTP/1.0" 200 15983+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:47 -0700] "GET /amnesty/asa/china/images/hk.gif HTTP/1.0" 200 1212+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:47 -0700] "GET /amnesty/asa/china/images/mail8380.gif HTTP/1.0" 200 4196+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:47 -0700] "GET /amnesty/asa/china/images/tibet.gif HTTP/1.0" 200 1241+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:47 -0700] "GET /amnesty/asa/china/images/xj.gif HTTP/1.0" 200 1247+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:48 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:31:48 -0700] "GET /amnesty/asa/china/images/aichico.gif HTTP/1.0" 200 4724+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:51 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:51 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:58 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:58 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:59 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+pppch146141.dacom.co.kr - - [16/Oct/1997:05:31:59 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:02 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:04 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:04 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:04 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:06 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:07 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:07 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:07 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+s09-pm02.milledgeville.campus.mci.net - - [16/Oct/1997:05:32:09 -0700] "GET /amnesty/asa/china/images/mailbox1.gif HTTP/1.0" 200 17344+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:09 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:10 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:11 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:15 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:15 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:21 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:27 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:30 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+pppch146141.dacom.co.kr - - [16/Oct/1997:05:32:38 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+207.38.218.70 - - [16/Oct/1997:05:32:39 -0700] "GET /ainews.html HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:41 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:41 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:41 -0700] "GET /images/newslogo.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:41 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+207.38.218.70 - - [16/Oct/1997:05:32:42 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+207.38.218.70 - - [16/Oct/1997:05:32:42 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+207.38.218.70 - - [16/Oct/1997:05:32:42 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+207.38.218.70 - - [16/Oct/1997:05:32:42 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:43 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+207.38.218.70 - - [16/Oct/1997:05:32:44 -0700] "GET /images/homebut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:44 -0700] "GET /images/pubbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/countbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/eventbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/joinbut.gif HTTP/1.0" 304 -+207.38.218.70 - - [16/Oct/1997:05:32:45 -0700] "GET /images/netbut.gif HTTP/1.0" 304 -+pppch146141.dacom.co.kr - - [16/Oct/1997:05:33:23 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+pppch146141.dacom.co.kr - - [16/Oct/1997:05:33:23 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+pppch146141.dacom.co.kr - - [16/Oct/1997:05:33:27 -0700] "GET /ainews.html HTTP/1.0" 200 13435+pppch146141.dacom.co.kr - - [16/Oct/1997:05:33:27 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+pppch146141.dacom.co.kr - - [16/Oct/1997:05:33:31 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 8192+198.215.121.135 - - [16/Oct/1997:05:37:18 -0700] "GET /asa/china/ HTTP/1.0" 200 18000+198.215.121.135 - - [16/Oct/1997:05:37:19 -0700] "GET /asa/china/chinese.html HTTP/1.0" 200 15983+198.215.121.135 - - [16/Oct/1997:05:37:19 -0700] "GET /asa/china/contents.html HTTP/1.0" 200 3336+198.215.121.135 - - [16/Oct/1997:05:37:19 -0700] "GET /asa/china/images/welcome.gif HTTP/1.0" 200 1049+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/animai.gif HTTP/1.0" 200 5175+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/renquan.gif HTTP/1.0" 200 411+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/smflag.gif HTTP/1.0" 200 951+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/tibet.gif HTTP/1.0" 200 1241+198.215.121.135 - - [16/Oct/1997:05:37:20 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 200 1247+198.215.121.135 - - [16/Oct/1997:05:37:21 -0700] "GET /asa/china/images/aichico.gif HTTP/1.0" 200 4724+198.215.121.135 - - [16/Oct/1997:05:37:21 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 200 36122+198.215.121.135 - - [16/Oct/1997:05:37:21 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 200 1247+198.215.121.135 - - [16/Oct/1997:05:37:22 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.0" 200 2899+198.215.121.135 - - [16/Oct/1997:05:37:22 -0700] "GET /asa/china/images/link.gif HTTP/1.0" 200 4236+198.215.121.135 - - [16/Oct/1997:05:37:23 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.0" 200 4196+198.215.121.135 - - [16/Oct/1997:05:37:23 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 200 17344+198.215.121.135 - - [16/Oct/1997:05:37:23 -0700] "GET /asa/china/images/what-is-ai-chinese.gif HTTP/1.0" 200 3648+198.215.121.135 - - [16/Oct/1997:05:37:24 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.0" 200 1202+198.215.121.135 - - [16/Oct/1997:05:37:26 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 200 27794+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:46:47 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:46:48 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:02 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 3855+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:15 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:21 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:23 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:23 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:47:34 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 3854+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:48:27 -0700] "GET /amnesty/home.html HTTP/1.0" 200 3854+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:48:27 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 3854+pc21.ipc.univ-metz.fr - - [16/Oct/1997:05:48:28 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:48:31 -0700] "GET /amnesty/pakistan/viol.html HTTP/1.0" 200 7679+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:48:34 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+198.108.140.121 - - [16/Oct/1997:05:50:41 -0700] "GET /amnesty/usa/assault.html HTTP/1.0" 200 4292+198.108.140.121 - - [16/Oct/1997:05:50:42 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+mso94.marsweb.com - - [16/Oct/1997:05:51:27 -0700] "GET /amnesty/death/cabana.html HTTP/1.0" 404 178+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:48 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:48 -0700] "GET /amnesty/urgact/index.html HTTP/1.0" 200 8283+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:49 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:49 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:49 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:52 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:52 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:51:55 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:00 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:19 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 3855+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:23 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:25 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:28 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:29 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:31 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:32 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:33 -0700] "GET /amnesty/images/netbut.gif HTTP/1.0" 200 1191+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:36 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:52:37 -0700] "GET /amnesty/urgact/contact.html HTTP/1.0" 200 882+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:38 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:41 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+207.38.218.89 - - [16/Oct/1997:05:52:42 -0700] "GET / HTTP/1.0" 200 -+207.38.218.89 - - [16/Oct/1997:05:52:44 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+207.38.218.89 - - [16/Oct/1997:05:52:44 -0700] "GET /images/spot5.gif HTTP/1.0" 304 -+hhtam005082.netvigator.com - - [16/Oct/1997:05:52:45 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 8192+hhtam005082.netvigator.com - - [16/Oct/1997:05:53:13 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 304 -+hhtam005082.netvigator.com - - [16/Oct/1997:05:53:14 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+hhtam005082.netvigator.com - - [16/Oct/1997:05:53:14 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+hhtam005082.netvigator.com - - [16/Oct/1997:05:53:15 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 304 -+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:17 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:17 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:17 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:17 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+hhtam005082.netvigator.com - - [16/Oct/1997:05:53:18 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 206 6029+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:20 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:20 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:20 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:21 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:21 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:22 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:23 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:23 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:23 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:24 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:25 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:25 -0700] "GET /amnesty/images/savebutx.gif HTTP/1.0" 200 889+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:26 -0700] "GET /amnesty/images/getbut.gif HTTP/1.0" 200 2482+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:26 -0700] "GET /amnesty/images/spanbut.gif HTTP/1.0" 200 447+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:27 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:27 -0700] "GET /amnesty/images/membutx.gif HTTP/1.0" 200 849+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:28 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:31 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:47 -0700] "GET /amnesty/members.html HTTP/1.0" 200 1501+s4.usr1.ww-interlink.net - - [16/Oct/1997:05:53:49 -0700] "GET /amnesty/images/memlogo.gif HTTP/1.0" 200 7872+ehv51-2.eindhoven.nl.net - - [16/Oct/1997:06:00:03 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:10 -0700] "GET /country/balkans HTTP/1.0" 301 196+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:18 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:28 -0700] "GET /country/balkans/images/ailogo.gif HTTP/1.0" 200 3630+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:28 -0700] "GET /country/balkans/images/dot.gif%20ALT= HTTP/1.0" 404 188+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:29 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:30 -0700] "GET /country/balkans/images/albania.gif HTTP/1.0" 200 314+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:30 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:54 -0700] "GET /country/balkans/images/fry.gif HTTP/1.0" 200 984+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:54 -0700] "GET /country/balkans/images/mace.gif HTTP/1.0" 200 429+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:55 -0700] "GET /country/balkans/images/croatia.gif HTTP/1.0" 200 354+ww-ta05.proxy.aol.com - - [16/Oct/1997:06:00:55 -0700] "GET /country/balkans/images/slovenia.gif HTTP/1.0" 200 376+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:06 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:08 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:10 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:11 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:18 -0700] "GET /amnesty/whatsnew.html HTTP/1.0" 200 7562+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:20 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:20 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:20 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:20 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:21 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:22 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:22 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:22 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:43 -0700] "GET /amnesty/ainews/usa/texas.html HTTP/1.0" 200 5825+ti34a96-0155.dialup.online.no - - [16/Oct/1997:06:01:45 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:19 -0700] "GET /asa/china/contents.html HTTP/1.0" 200 3336+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:22 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:22 -0700] "GET /asa/china/images/welcome.gif HTTP/1.0" 200 1049+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:24 -0700] "GET /asa/china/images/tibet.gif HTTP/1.0" 200 1241+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:24 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 200 1247+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:26 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.0" 200 4196+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:27 -0700] "GET /asa/china/images/ic_pict.gif HTTP/1.0" 200 2899+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:32 -0700] "GET /asa/china/images/link.gif HTTP/1.0" 200 4236+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:33 -0700] "GET /asa/china/images/renquan.gif HTTP/1.0" 200 411+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:34 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.0" 200 1202+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:38 -0700] "GET /asa/china/images/what-is-ai-chinese.gif HTTP/1.0" 200 3648+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:43 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 200 27794+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:44 -0700] "GET /asa/china/images/aichico.gif HTTP/1.0" 200 4724+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:45 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 200 36122+spc-isp-ott-uas-2-65.sprint.ca - - [16/Oct/1997:06:06:52 -0700] "GET /asa/china/images/mailbox1.gif HTTP/1.0" 200 17344+208.195.7.217 - - [16/Oct/1997:06:08:32 -0700] "GET / HTTP/1.0" 200 3082+208.195.7.217 - - [16/Oct/1997:06:08:36 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+208.195.7.217 - - [16/Oct/1997:06:08:36 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+208.195.7.217 - - [16/Oct/1997:06:08:57 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+208.195.7.217 - - [16/Oct/1997:06:08:59 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+208.195.7.217 - - [16/Oct/1997:06:08:59 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+208.195.7.217 - - [16/Oct/1997:06:09:00 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+208.195.7.217 - - [16/Oct/1997:06:09:05 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+208.195.7.217 - - [16/Oct/1997:06:09:05 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+208.195.7.217 - - [16/Oct/1997:06:09:06 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+208.195.7.217 - - [16/Oct/1997:06:09:06 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+208.195.7.217 - - [16/Oct/1997:06:09:07 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+208.195.7.217 - - [16/Oct/1997:06:09:09 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+208.195.7.217 - - [16/Oct/1997:06:09:09 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+208.195.7.217 - - [16/Oct/1997:06:09:09 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+208.195.7.217 - - [16/Oct/1997:06:09:10 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+208.195.7.217 - - [16/Oct/1997:06:09:11 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+208.195.7.217 - - [16/Oct/1997:06:09:12 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+208.195.7.217 - - [16/Oct/1997:06:09:12 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+208.195.7.217 - - [16/Oct/1997:06:09:12 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+208.195.7.217 - - [16/Oct/1997:06:09:12 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+208.195.7.217 - - [16/Oct/1997:06:09:14 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+208.195.7.217 - - [16/Oct/1997:06:09:14 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+208.195.7.217 - - [16/Oct/1997:06:09:16 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+208.195.7.217 - - [16/Oct/1997:06:09:16 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+208.195.7.217 - - [16/Oct/1997:06:09:17 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+208.195.7.217 - - [16/Oct/1997:06:09:17 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+208.195.7.217 - - [16/Oct/1997:06:09:17 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+208.195.7.217 - - [16/Oct/1997:06:09:18 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+208.195.7.217 - - [16/Oct/1997:06:09:45 -0700] "GET /casework/index.html HTTP/1.0" 200 2974+208.195.7.217 - - [16/Oct/1997:06:09:49 -0700] "GET /images/aiusarex.gif HTTP/1.0" 200 3237+208.195.7.217 - - [16/Oct/1997:06:09:49 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+208.195.7.217 - - [16/Oct/1997:06:09:49 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+208.195.7.217 - - [16/Oct/1997:06:09:50 -0700] "GET /casework/images/bothlogo.gif HTTP/1.0" 200 8650+208.195.7.217 - - [16/Oct/1997:06:09:54 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+208.195.7.217 - - [16/Oct/1997:06:09:54 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+208.195.7.217 - - [16/Oct/1997:06:09:54 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+208.195.7.217 - - [16/Oct/1997:06:09:55 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+208.195.7.217 - - [16/Oct/1997:06:10:12 -0700] "GET /casework/fw.html HTTP/1.0" 200 5528+208.195.7.217 - - [16/Oct/1997:06:10:18 -0700] "GET /casework/images/amnesty.gif HTTP/1.0" 200 1158+208.195.7.217 - - [16/Oct/1997:06:10:18 -0700] "GET /casework/images/stamptil.jpg HTTP/1.0" 200 10003+208.195.7.217 - - [16/Oct/1997:06:11:51 -0700] "GET /casework/fw1.html HTTP/1.0" 200 2813+199.250.191.4 - - [16/Oct/1997:06:14:38 -0700] "GET /urgact/ HTTP/1.0" 200 8283+ww-pa01.proxy.aol.com - - [16/Oct/1997:06:17:46 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+ww-pa01.proxy.aol.com - - [16/Oct/1997:06:17:48 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+ww-pa01.proxy.aol.com - - [16/Oct/1997:06:17:49 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+ww-pa01.proxy.aol.com - - [16/Oct/1997:06:17:49 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+spg-tnt12s127.erols.com - - [16/Oct/1997:06:21:24 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+spg-tnt12s127.erols.com - - [16/Oct/1997:06:22:28 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+spg-tnt12s127.erols.com - - [16/Oct/1997:06:22:30 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+spg-tnt12s127.erols.com - - [16/Oct/1997:06:22:38 -0700] "GET /amnesty/whatsnew.html HTTP/1.0" 200 7562+207.38.218.77 - - [16/Oct/1997:06:23:09 -0700] "GET /images/ai_cand1.gif HTTP/1.0" 200 6328+207.38.218.77 - - [16/Oct/1997:06:23:09 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+207.38.218.77 - - [16/Oct/1997:06:23:12 -0700] "GET /usalinks.html HTTP/1.0" 200 10329+207.38.218.77 - - [16/Oct/1997:06:23:13 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+207.38.218.77 - - [16/Oct/1997:06:23:13 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+207.38.218.77 - - [16/Oct/1997:06:23:13 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+207.38.218.77 - - [16/Oct/1997:06:23:13 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+207.38.218.77 - - [16/Oct/1997:06:23:15 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+207.38.218.77 - - [16/Oct/1997:06:23:15 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+207.38.218.77 - - [16/Oct/1997:06:23:37 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+207.38.218.77 - - [16/Oct/1997:06:23:37 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+207.38.218.77 - - [16/Oct/1997:06:23:38 -0700] "GET /home.html HTTP/1.0" 200 17233+207.38.218.77 - - [16/Oct/1997:06:23:40 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+207.38.218.77 - - [16/Oct/1997:06:23:40 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+207.38.218.77 - - [16/Oct/1997:06:23:41 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+207.38.218.77 - - [16/Oct/1997:06:23:42 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+207.38.218.77 - - [16/Oct/1997:06:23:42 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+207.38.218.77 - - [16/Oct/1997:06:23:43 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+207.38.218.77 - - [16/Oct/1997:06:23:43 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+207.38.218.77 - - [16/Oct/1997:06:23:43 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+207.38.218.77 - - [16/Oct/1997:06:23:44 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+207.38.218.77 - - [16/Oct/1997:06:23:44 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+207.38.218.77 - - [16/Oct/1997:06:23:47 -0700] "GET /ainews.html HTTP/1.0" 200 13435+207.38.218.77 - - [16/Oct/1997:06:23:47 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+207.38.218.77 - - [16/Oct/1997:06:23:47 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+207.38.218.77 - - [16/Oct/1997:06:23:48 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+207.38.218.77 - - [16/Oct/1997:06:23:48 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+207.38.218.77 - - [16/Oct/1997:06:23:49 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+207.38.218.77 - - [16/Oct/1997:06:23:50 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+207.38.218.77 - - [16/Oct/1997:06:23:51 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 8192+207.38.218.77 - - [16/Oct/1997:06:23:52 -0700] "GET /ainews/israel_occupied_territories/killing.html HTTP/1.0" 200 6647+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:07 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:09 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:14 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:17 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:18 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:24 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:25 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+spg-tnt12s127.erols.com - - [16/Oct/1997:06:24:33 -0700] "GET /amnesty/asa/china/louisa-links.html HTTP/1.0" 200 1076+hud02a01.ml.com - - [16/Oct/1997:06:26:23 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:24 -0700] "GET /amnesty/urgact/newslett.html HTTP/1.0" 200 26074+hud02a01.ml.com - - [16/Oct/1997:06:26:25 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:25 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+hud02a01.ml.com - - [16/Oct/1997:06:26:26 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+hud02a01.ml.com - - [16/Oct/1997:06:26:26 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:26 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:26 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+hud02a01.ml.com - - [16/Oct/1997:06:26:27 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+hud02a01.ml.com - - [16/Oct/1997:06:26:31 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:31 -0700] "GET /amnesty/urgact/nl0997.html HTTP/1.0" 200 18812+hud02a01.ml.com - - [16/Oct/1997:06:26:32 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:32 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:32 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:32 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:33 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 304 -+hud02a01.ml.com - - [16/Oct/1997:06:26:36 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 304 -+spg-tnt12s127.erols.com - - [16/Oct/1997:06:27:11 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+spg-tnt12s127.erols.com - - [16/Oct/1997:06:27:48 -0700] "GET /amnesty/asa/china/chadrel-newsflash.html HTTP/1.0" 200 1084+spg-tnt12s127.erols.com - - [16/Oct/1997:06:28:00 -0700] "GET /amnesty/asa/china/images/c_chinma.jpg HTTP/1.0" 200 4655+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:00 -0700] "GET /casework/index.html HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:02 -0700] "GET /casework/images/bothlogo.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:02 -0700] "GET /images/aiusarex.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:02 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:02 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:04 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:04 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:04 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:04 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+spg-tnt12s127.erols.com - - [16/Oct/1997:06:28:05 -0700] "GET /amnesty/asa/china/images/newsflas.gif HTTP/1.0" 200 2340+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:14 -0700] "GET /casework/fw.html HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:16 -0700] "GET /casework/images/amnesty.gif HTTP/1.0" 304 -+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:28:16 -0700] "GET /casework/images/stamptil.jpg HTTP/1.0" 304 -+spg-tnt12s127.erols.com - - [16/Oct/1997:06:28:31 -0700] "GET /amnesty/asa/china/images/chadrel.jpg HTTP/1.0" 200 20391+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:29:11 -0700] "GET /casework/fw1.html HTTP/1.0" 304 -+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:21 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:35 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:43 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:44 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:47 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:48 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:51 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:54 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:55 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+spg-tnt12s127.erols.com - - [16/Oct/1997:06:29:58 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:09 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:33 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:35 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:46 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:53 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:54 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+spg-tnt12s127.erols.com - - [16/Oct/1997:06:30:55 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+spg-tnt12s127.erols.com - - [16/Oct/1997:06:31:09 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+spg-tnt12s127.erols.com - - [16/Oct/1997:06:31:37 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+spg-tnt12s127.erols.com - - [16/Oct/1997:06:31:41 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+proxy1.ykt.prodigy.net - - [16/Oct/1997:06:31:41 -0700] "GET /casework/fw2.html HTTP/1.0" 304 -+spg-tnt12s127.erols.com - - [16/Oct/1997:06:31:49 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+spg-tnt12s127.erols.com - - [16/Oct/1997:06:31:55 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+spg-tnt12s127.erols.com - - [16/Oct/1997:06:32:02 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+spg-tnt12s127.erols.com - - [16/Oct/1997:06:32:06 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+spg-tnt12s127.erols.com - - [16/Oct/1997:06:32:08 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+spg-tnt12s127.erols.com - - [16/Oct/1997:06:32:09 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+spg-tnt12s127.erols.com - - [16/Oct/1997:06:32:14 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+194.151.13.64 - - [16/Oct/1997:06:33:36 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+spg-tnt12s127.erols.com - - [16/Oct/1997:06:33:37 -0700] "GET /amnesty/urgact/index.html HTTP/1.0" 200 8283+193.63.139.50 - - [16/Oct/1997:06:34:03 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+gk-red.unicc.org - - [16/Oct/1997:06:34:29 -0700] "GET /amnesty/mideast/libya.html HTTP/1.0" 200 6278+gk-red.unicc.org - - [16/Oct/1997:06:34:36 -0700] "GET /amnesty/mideast/libya.jpg HTTP/1.0" 200 4641+gk-red.unicc.org - - [16/Oct/1997:06:34:39 -0700] "GET /amnesty/mideast/libflag.gif HTTP/1.0" 200 1364+gk-red.unicc.org - - [16/Oct/1997:06:34:41 -0700] "GET /amnesty/mideast/mailbut2.gif HTTP/1.0" 200 1202+spg-tnt12s127.erols.com - - [16/Oct/1997:06:35:46 -0700] "GET /amnesty/urgact/index.html HTTP/1.0" 200 8283+spg-tnt12s127.erols.com - - [16/Oct/1997:06:35:48 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+131.123.15.27 - - [16/Oct/1997:06:35:54 -0700] "GET /images/aiusa2.gif HTTP/1.0" 200 2905+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:06:36:26 -0700] "GET /amnesty/death/cabana.html HTTP/1.0" 404 178+krafla.rhi.hi.is - - [16/Oct/1997:06:36:29 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+krafla.rhi.hi.is - - [16/Oct/1997:06:36:30 -0700] "GET /amnesty/about/history.html HTTP/1.0" 200 10342+krafla.rhi.hi.is - - [16/Oct/1997:06:38:41 -0700] "GET /amnesty/about/images/masthd3.gif HTTP/1.0" 200 33250+130inf121.cinet.es - - [16/Oct/1997:06:38:47 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+130inf121.cinet.es - - [16/Oct/1997:06:39:15 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+130inf121.cinet.es - - [16/Oct/1997:06:39:37 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ppp44.igc.org - - [16/Oct/1997:06:39:37 -0700] "GET /images/homelogo.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:37 -0700] "GET /images/hometake.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:37 -0700] "GET /images/writbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:38 -0700] "GET /images/candles3.jpg HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:38 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:39 -0700] "GET /images/pnbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:39 -0700] "GET /images/rsacirat.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:40 -0700] "GET /images/joinbut2.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:44 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:44 -0700] "GET /images/homenew.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:44 -0700] "GET /images/homeside.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:45 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:47 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:47 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:48 -0700] "GET /images/eventbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:48 -0700] "GET /images/pubbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:49 -0700] "GET /images/countbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:49 -0700] "GET /images/savebutx.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:49 -0700] "GET /images/spanbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:50 -0700] "GET /images/getbut.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:39:50 -0700] "GET /images/membutx.gif HTTP/1.0" 304 -+130inf121.cinet.es - - [16/Oct/1997:06:40:13 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+dialup177-1-5.swipnet.se - - [16/Oct/1997:06:41:32 -0700] "GET /amnesty/casework/fwq&a.html HTTP/1.0" 200 6329+146.186.150.185 - - [16/Oct/1997:06:45:20 -0700] "GET / HTTP/1.0" 200 3082+146.186.150.185 - - [16/Oct/1997:06:45:21 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+146.186.150.185 - - [16/Oct/1997:06:45:21 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+146.186.150.185 - - [16/Oct/1997:06:45:45 -0700] "GET /about.html HTTP/1.0" 200 6902+146.186.150.185 - - [16/Oct/1997:06:45:46 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+146.186.150.185 - - [16/Oct/1997:06:45:46 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+146.186.150.185 - - [16/Oct/1997:06:45:46 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+146.186.150.185 - - [16/Oct/1997:06:45:46 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+146.186.150.185 - - [16/Oct/1997:06:45:47 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+146.186.150.185 - - [16/Oct/1997:06:45:47 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+146.186.150.185 - - [16/Oct/1997:06:45:48 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+146.186.150.185 - - [16/Oct/1997:06:45:52 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+146.186.150.185 - - [16/Oct/1997:06:45:53 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+146.186.150.185 - - [16/Oct/1997:06:45:54 -0700] "GET /images/where.gif HTTP/1.0" 200 605+palo1.pacific.net.sg - - [16/Oct/1997:06:45:57 -0700] "GET /amnesty HTTP/1.0" 301 184+palo1.pacific.net.sg - - [16/Oct/1997:06:45:59 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+palo1.pacific.net.sg - - [16/Oct/1997:06:46:03 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+146.186.150.185 - - [16/Oct/1997:06:46:21 -0700] "GET /group.html HTTP/1.0" 200 8575+146.186.150.185 - - [16/Oct/1997:06:46:21 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+146.186.150.185 - - [16/Oct/1997:06:46:21 -0700] "GET /images/goldfla2.gif HTTP/1.0" 200 1161+146.186.150.185 - - [16/Oct/1997:06:46:21 -0700] "GET /images/grncndl.gif HTTP/1.0" 200 1471+146.186.150.185 - - [16/Oct/1997:06:46:22 -0700] "GET /images/canfuz1.gif HTTP/1.0" 200 3013+146.186.150.185 - - [16/Oct/1997:06:46:23 -0700] "GET /images/04candle.gif HTTP/1.0" 200 7257+146.186.150.185 - - [16/Oct/1997:06:46:23 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+146.186.150.185 - - [16/Oct/1997:06:46:23 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+146.186.150.185 - - [16/Oct/1997:06:46:23 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+146.186.150.185 - - [16/Oct/1997:06:46:24 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+palo1.pacific.net.sg - - [16/Oct/1997:06:46:25 -0700] "GET /amnesty/ainews.html HTTP/1.0" 200 13435+146.186.150.185 - - [16/Oct/1997:06:46:25 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+146.186.150.185 - - [16/Oct/1997:06:46:25 -0700] "GET /images/evenbut.gif HTTP/1.0" 200 399+146.186.150.185 - - [16/Oct/1997:06:46:25 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+146.186.150.185 - - [16/Oct/1997:06:46:28 -0700] "GET /images/can1_2.gif HTTP/1.0" 200 30430+palo1.pacific.net.sg - - [16/Oct/1997:06:46:32 -0700] "GET /amnesty/images/ai_emb2.gif HTTP/1.0" 200 2189+palo1.pacific.net.sg - - [16/Oct/1997:06:46:32 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+palo1.pacific.net.sg - - [16/Oct/1997:06:46:33 -0700] "GET /amnesty/images/newslogo.gif HTTP/1.0" 200 17448+palo1.pacific.net.sg - - [16/Oct/1997:06:46:40 -0700] "GET /amnesty/spanish/images/spespbut.gif HTTP/1.0" 200 427+palo1.pacific.net.sg - - [16/Oct/1997:06:46:42 -0700] "GET /amnesty/images/refhand4.gif HTTP/1.0" 200 6789+palo1.pacific.net.sg - - [16/Oct/1997:06:46:48 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+palo1.pacific.net.sg - - [16/Oct/1997:06:46:51 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+146.186.150.185 - - [16/Oct/1997:06:46:54 -0700] "GET /ann-rpt.html HTTP/1.0" 200 1899+146.186.150.185 - - [16/Oct/1997:06:46:55 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+146.186.150.185 - - [16/Oct/1997:06:46:55 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+146.186.150.185 - - [16/Oct/1997:06:47:02 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+146.186.150.185 - - [16/Oct/1997:06:47:06 -0700] "GET /ar-sum.html HTTP/1.0" 200 27608+ppp44.igc.org - - [16/Oct/1997:06:47:08 -0700] "GET /regions/west.html HTTP/1.0" 200 5900+palo1.pacific.net.sg - - [16/Oct/1997:06:47:10 -0700] "GET /amnesty/ainews/singapore/sue.html HTTP/1.0" 200 5225+ppp44.igc.org - - [16/Oct/1997:06:47:10 -0700] "GET /images/bg.gif HTTP/1.0" 200 2464+ppp44.igc.org - - [16/Oct/1997:06:47:11 -0700] "GET /images/amnesty.gif HTTP/1.0" 304 -+ppp44.igc.org - - [16/Oct/1997:06:47:13 -0700] "GET /images/refuges1.jpg HTTP/1.0" 200 7377+ppp44.igc.org - - [16/Oct/1997:06:47:16 -0700] "GET /images/border15.jpg HTTP/1.0" 200 5092+gate2.bankerstrust.com - - [16/Oct/1997:06:47:38 -0700] "GET /comm/jagger.html HTTP/1.0" 200 1864+gate2.bankerstrust.com - - [16/Oct/1997:06:47:44 -0700] "GET /comm/images/dot_clea.gif HTTP/1.0" 200 43+gate2.bankerstrust.com - - [16/Oct/1997:06:47:46 -0700] "GET /comm/images/bsilk7.gif HTTP/1.0" 200 10517+gate2.bankerstrust.com - - [16/Oct/1997:06:47:46 -0700] "GET /comm/images/people/jagger4.jpg HTTP/1.0" 200 10112+gate2.bankerstrust.com - - [16/Oct/1997:06:48:18 -0700] "GET /comm/medaward.html HTTP/1.0" 200 6483+docrefoff5.library.emory.edu - - [16/Oct/1997:06:48:21 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+docrefoff5.library.emory.edu - - [16/Oct/1997:06:48:21 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+docrefoff5.library.emory.edu - - [16/Oct/1997:06:48:22 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+gate2.bankerstrust.com - - [16/Oct/1997:06:48:27 -0700] "GET /comm/images/starblu.jpg HTTP/1.0" 200 5498+gate2.bankerstrust.com - - [16/Oct/1997:06:48:27 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+gate2.bankerstrust.com - - [16/Oct/1997:06:48:28 -0700] "GET /comm/images/bluai.jpg HTTP/1.0" 200 11848+gate2.bankerstrust.com - - [16/Oct/1997:06:48:33 -0700] "GET /comm/images/bluspots.jpg HTTP/1.0" 200 18585+gate2.bankerstrust.com - - [16/Oct/1997:06:48:39 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+gate2.bankerstrust.com - - [16/Oct/1997:06:48:39 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+gate2.bankerstrust.com - - [16/Oct/1997:06:48:39 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+gate2.bankerstrust.com - - [16/Oct/1997:06:48:41 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43+ppp44.igc.org - - [16/Oct/1997:06:49:12 -0700] "GET /regions/southern.html HTTP/1.0" 200 6455+palo1.pacific.net.sg - - [16/Oct/1997:06:49:13 -0700] "GET /amnesty/weeklyua.html HTTP/1.0" 200 10887+ppp44.igc.org - - [16/Oct/1997:06:49:15 -0700] "GET /regions/aiusared.gif HTTP/1.0" 200 2725+palo1.pacific.net.sg - - [16/Oct/1997:06:49:19 -0700] "GET /amnesty/images/logo2.gif HTTP/1.0" 200 6343+palo1.pacific.net.sg - - [16/Oct/1997:06:49:22 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+palo1.pacific.net.sg - - [16/Oct/1997:06:49:22 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+palo1.pacific.net.sg - - [16/Oct/1997:06:49:31 -0700] "GET /amnesty/images/linebrn.gif HTTP/1.0" 200 308+palo1.pacific.net.sg - - [16/Oct/1997:06:49:45 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+palo1.pacific.net.sg - - [16/Oct/1997:06:49:57 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+palo1.pacific.net.sg - - [16/Oct/1997:06:50:07 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+docrefoff5.library.emory.edu - - [16/Oct/1997:06:50:09 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+gate2.bankerstrust.com - - [16/Oct/1997:06:53:00 -0700] "GET /ainews/usa/spotward.html HTTP/1.0" 200 7907+gate2.bankerstrust.com - - [16/Oct/1997:06:53:12 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+ppp2200.stk.inreach.net - - [16/Oct/1997:06:54:21 -0700] "GET /cambodia/prosecut.html HTTP/1.0" 200 4764+1cust108.max41.los-angeles.ca.ms.uu.net - - [16/Oct/1997:06:55:23 -0700] "GET /amnesty/turkey/back.gif HTTP/1.0" 200 224+1cust108.max41.los-angeles.ca.ms.uu.net - - [16/Oct/1997:06:55:24 -0700] "GET /amnesty/turkey/women.html HTTP/1.0" 200 17534+1cust108.max41.los-angeles.ca.ms.uu.net - - [16/Oct/1997:06:55:27 -0700] "GET /amnesty/turkey/amnty1.gif HTTP/1.0" 200 3013+1cust108.max41.los-angeles.ca.ms.uu.net - - [16/Oct/1997:06:55:27 -0700] "GET /amnesty/turkey/clear.gif HTTP/1.0" 200 76+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:06:57:33 -0700] "GET /amnesty/mideast/ HTTP/1.0" 200 3104+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:06:58:57 -0700] "GET /amnesty/mideast/hrme.jpg HTTP/1.0" 200 24216+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:06:59:10 -0700] "GET /amnesty/mideast/ailogo.gif HTTP/1.0" 200 2682+194.165.130.7 - - [16/Oct/1997:06:59:34 -0700] "GET /amnesty/gan.html HTTP/1.0" 200 5020+194.165.130.7 - - [16/Oct/1997:06:59:39 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+194.165.130.7 - - [16/Oct/1997:06:59:39 -0700] "GET /amnesty/images/clear1.jpg HTTP/1.0" 200 849+194.165.130.7 - - [16/Oct/1997:06:59:43 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+194.165.130.7 - - [16/Oct/1997:06:59:44 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+194.165.130.7 - - [16/Oct/1997:06:59:44 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+194.165.130.7 - - [16/Oct/1997:06:59:44 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+194.165.130.7 - - [16/Oct/1997:06:59:47 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+194.165.130.7 - - [16/Oct/1997:07:00:14 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+194.165.130.7 - - [16/Oct/1997:07:00:14 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+194.165.130.7 - - [16/Oct/1997:07:00:14 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+194.165.130.7 - - [16/Oct/1997:07:00:19 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+194.165.130.7 - - [16/Oct/1997:07:00:20 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:00:20 -0700] "GET /amnesty/mideast/mailbut2.gif HTTP/1.0" 200 1202+194.165.130.7 - - [16/Oct/1997:07:00:27 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+194.165.130.7 - - [16/Oct/1997:07:00:27 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+194.165.130.7 - - [16/Oct/1997:07:00:27 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+194.165.130.7 - - [16/Oct/1997:07:00:31 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+194.165.130.7 - - [16/Oct/1997:07:00:33 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+194.165.130.7 - - [16/Oct/1997:07:00:35 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+194.165.130.7 - - [16/Oct/1997:07:00:37 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+194.165.130.7 - - [16/Oct/1997:07:00:37 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+194.165.130.7 - - [16/Oct/1997:07:00:40 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+194.165.130.7 - - [16/Oct/1997:07:00:42 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+194.165.130.7 - - [16/Oct/1997:07:00:43 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+194.165.130.7 - - [16/Oct/1997:07:00:45 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+194.165.130.7 - - [16/Oct/1997:07:00:54 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+ppp14.igc.org - - [16/Oct/1997:07:00:59 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+ppp14.igc.org - - [16/Oct/1997:07:00:59 -0700] "GET /images/writbut.gif HTTP/1.0" 200 543+ppp14.igc.org - - [16/Oct/1997:07:01:01 -0700] "GET /home.html HTTP/1.0" 200 17233+194.165.130.7 - - [16/Oct/1997:07:01:05 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+194.165.130.7 - - [16/Oct/1997:07:01:06 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+ppp14.igc.org - - [16/Oct/1997:07:01:06 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 3854+194.165.130.7 - - [16/Oct/1997:07:01:08 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+194.165.130.7 - - [16/Oct/1997:07:01:12 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+194.165.130.7 - - [16/Oct/1997:07:01:12 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:02:27 -0700] "GET /amnesty/mideast/counfram.html HTTP/1.0" 200 1145+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:02:58 -0700] "GET /amnesty/mideast/algeria.html HTTP/1.0" 200 7945+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:02:59 -0700] "GET /amnesty/mideast/algflag.gif HTTP/1.0" 200 1902+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:05 -0700] "GET /amnesty/mideast/algeria.jpg HTTP/1.0" 200 5485+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:10 -0700] "GET /amnesty/mideast/countrie.html HTTP/1.0" 200 1527+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:11 -0700] "GET /amnesty/mideast/butalg.gif HTTP/1.0" 200 368+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:12 -0700] "GET /amnesty/mideast/butbah.gif HTTP/1.0" 200 380+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:12 -0700] "GET /amnesty/mideast/butegy.gif HTTP/1.0" 200 363+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:12 -0700] "GET /amnesty/mideast/butgul.gif HTTP/1.0" 200 399+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:12 -0700] "GET /amnesty/mideast/butirn.gif HTTP/1.0" 200 317+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:13 -0700] "GET /amnesty/mideast/butirq.gif HTTP/1.0" 200 329+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:13 -0700] "GET /amnesty/mideast/butisr.gif HTTP/1.0" 200 384+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:13 -0700] "GET /amnesty/mideast/butjor.gif HTTP/1.0" 200 352+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:21 -0700] "GET /amnesty/mideast/butleb.gif HTTP/1.0" 200 383+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:30 -0700] "GET /amnesty/mideast/butsau.gif HTTP/1.0" 200 403+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:30 -0700] "GET /amnesty/mideast/buttun.gif HTTP/1.0" 200 359+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:31 -0700] "GET /amnesty/mideast/butkuw.gif HTTP/1.0" 200 366+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:32 -0700] "GET /amnesty/mideast/butyem.gif HTTP/1.0" 200 352+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:34 -0700] "GET /amnesty/mideast/butbac.gif HTTP/1.0" 200 592+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:34 -0700] "GET /amnesty/mideast/butlib.gif HTTP/1.0" 200 352+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:35 -0700] "GET /amnesty/mideast/butmor.gif HTTP/1.0" 200 432+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:03:35 -0700] "GET /amnesty/mideast/butsyr.gif HTTP/1.0" 200 344+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:04:19 -0700] "GET /amnesty/mideast/saudi.jpg HTTP/1.0" 200 8769+ppp14.igc.org - - [16/Oct/1997:07:04:48 -0700] "GET /regions/maregcon.html HTTP/1.0" 200 1304+ppp14.igc.org - - [16/Oct/1997:07:04:51 -0700] "GET /images/picasso.gif HTTP/1.0" 200 1213+ppp14.igc.org - - [16/Oct/1997:07:04:55 -0700] "GET /images/women05.jpg HTTP/1.0" 200 10130+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:04:56 -0700] "GET /amnesty/mideast/sauflag.gif HTTP/1.0" 200 3101+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:07:33 -0700] "GET /amnesty/mideast/saudi.html HTTP/1.0" 200 8072+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:14:56 -0700] "GET /amnesty/mideast/oman.jpg HTTP/1.0" 200 4371+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:14 -0700] "GET /amnesty/mideast/omanflag.gif HTTP/1.0" 200 2012+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:22 -0700] "GET /amnesty/mideast/gulf.html HTTP/1.0" 200 10736+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:23 -0700] "GET /amnesty/mideast/qatflag.gif HTTP/1.0" 200 1456+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:28 -0700] "GET /amnesty/mideast/qatar.jpg HTTP/1.0" 200 4615+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:29 -0700] "GET /amnesty/mideast/uaeflag.gif HTTP/1.0" 200 1725+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:15:42 -0700] "GET /amnesty/mideast/uae.jpg HTTP/1.0" 200 13752+168.30.243.210 - - [16/Oct/1997:07:18:52 -0700] "GET /amnesty/asa/china/images/animai.gif HTTP/1.0" 200 5175+168.30.243.210 - - [16/Oct/1997:07:18:52 -0700] "GET /amnesty/asa/china/images/smflag.gif HTTP/1.0" 200 951+168.30.243.210 - - [16/Oct/1997:07:18:53 -0700] "GET /amnesty/asa/china/chinese.html HTTP/1.0" 200 15983+168.30.243.210 - - [16/Oct/1997:07:18:54 -0700] "GET /amnesty/asa/china/images/mail8380.gif HTTP/1.0" 200 4196+168.30.243.210 - - [16/Oct/1997:07:18:54 -0700] "GET /amnesty/asa/china/images/tibet.gif HTTP/1.0" 200 1241+168.30.243.210 - - [16/Oct/1997:07:18:54 -0700] "GET /amnesty/asa/china/images/xj.gif HTTP/1.0" 200 1247+168.30.243.210 - - [16/Oct/1997:07:18:55 -0700] "GET /amnesty/asa/china/images/aichico.gif HTTP/1.0" 200 4724+168.30.243.210 - - [16/Oct/1997:07:18:55 -0700] "GET /amnesty/asa/china/images/hk.gif HTTP/1.0" 200 1212+168.30.243.210 - - [16/Oct/1997:07:18:56 -0700] "GET /amnesty/asa/china/images/mailbox1.gif HTTP/1.0" 200 17344+ppp6-12.igc.org - - [16/Oct/1997:07:19:27 -0700] "GET / HTTP/1.0" 200 3082+ppp6-12.igc.org - - [16/Oct/1997:07:19:28 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+ppp6-12.igc.org - - [16/Oct/1997:07:19:40 -0700] "GET /images/spot5.gif HTTP/1.0" 200 3855+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:22:01 -0700] "GET /amnesty/mideast/uaemona.html HTTP/1.0" 200 2200+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:22:59 -0700] "GET /amnesty/mideast/bahrain.html HTTP/1.0" 200 11354+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:23:01 -0700] "GET /amnesty/mideast/bahflag.gif HTTP/1.0" 200 1505+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:23:01 -0700] "GET /amnesty/mideast/bahrain.jpg HTTP/1.0" 200 5547+tbm-jjs.caen.cnet.fr - - [16/Oct/1997:07:24:13 -0700] "GET /amnesty/mideast/region.html HTTP/1.0" 200 1049+ppp22.igc.org - - [16/Oct/1997:07:27:23 -0700] "GET / HTTP/1.0" 200 3082+ppp22.igc.org - - [16/Oct/1997:07:27:26 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+ppp22.igc.org - - [16/Oct/1997:07:27:29 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ppp22.igc.org - - [16/Oct/1997:07:27:39 -0700] "GET /joinai.html HTTP/1.0" 200 4054+ppp22.igc.org - - [16/Oct/1997:07:27:41 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+ppp22.igc.org - - [16/Oct/1997:07:27:41 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+ppp22.igc.org - - [16/Oct/1997:07:27:42 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+ppp22.igc.org - - [16/Oct/1997:07:27:42 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+ppp22.igc.org - - [16/Oct/1997:07:27:44 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+ppp22.igc.org - - [16/Oct/1997:07:27:44 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+ppp22.igc.org - - [16/Oct/1997:07:28:12 -0700] "GET /amnesty HTTP/1.0" 301 184+ppp22.igc.org - - [16/Oct/1997:07:28:15 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ppp22.igc.org - - [16/Oct/1997:07:28:17 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ppp22.igc.org - - [16/Oct/1997:07:28:20 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ppp22.igc.org - - [16/Oct/1997:07:29:36 -0700] "GET /welcome.html HTTP/1.0" 200 4731+ppp22.igc.org - - [16/Oct/1997:07:29:39 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+ppp22.igc.org - - [16/Oct/1997:07:29:39 -0700] "GET /images/never.gif HTTP/1.0" 200 914+ppp22.igc.org - - [16/Oct/1997:07:29:41 -0700] "GET /images/doubt.gif HTTP/1.0" 200 924+ppp22.igc.org - - [16/Oct/1997:07:29:43 -0700] "GET /images/your.gif HTTP/1.0" 200 951+ppp22.igc.org - - [16/Oct/1997:07:29:44 -0700] "GET /images/commit.gif HTTP/1.0" 200 190+ppp22.igc.org - - [16/Oct/1997:07:29:46 -0700] "GET /images/human.gif HTTP/1.0" 200 155+ppp22.igc.org - - [16/Oct/1997:07:29:46 -0700] "GET /images/refugee2.gif HTTP/1.0" 200 14882+ppp22.igc.org - - [16/Oct/1997:07:29:48 -0700] "GET /images/can.gif HTTP/1.0" 200 946+ppp22.igc.org - - [16/Oct/1997:07:29:48 -0700] "GET /images/rights.gif HTTP/1.0" 200 938+ppp22.igc.org - - [16/Oct/1997:07:29:49 -0700] "GET /images/a.gif HTTP/1.0" 200 865+ppp22.igc.org - - [16/Oct/1997:07:29:49 -0700] "GET /images/differ.gif HTTP/1.0" 200 191+ppp22.igc.org - - [16/Oct/1997:07:29:50 -0700] "GET /images/it.gif HTTP/1.0" 200 170+ppp22.igc.org - - [16/Oct/1997:07:29:51 -0700] "GET /images/canred.gif HTTP/1.0" 200 311+ppp22.igc.org - - [16/Oct/1997:07:29:52 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+ppp22.igc.org - - [16/Oct/1997:07:29:54 -0700] "GET /images/3ways.gif HTTP/1.0" 200 1157+ppp22.igc.org - - [16/Oct/1997:07:29:57 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+ppp22.igc.org - - [16/Oct/1997:07:29:58 -0700] "GET /images/aiusabut.gif HTTP/1.0" 200 591+ppp22.igc.org - - [16/Oct/1997:07:30:05 -0700] "GET /images/mombab10.gif HTTP/1.0" 200 28581+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:36:56 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:36:57 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:36:58 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:06 -0700] "GET /amnesty/comm/medaward.html HTTP/1.0" 200 6483+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:08 -0700] "GET /amnesty/comm/images/starblu.jpg HTTP/1.0" 200 5498+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:08 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 200 43+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:08 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:10 -0700] "GET /amnesty/comm/images/bluai.jpg HTTP/1.0" 200 11848+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:10 -0700] "GET /amnesty/comm/images/bluspots.jpg HTTP/1.0" 200 18585+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:33 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:33 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:33 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:34 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:35 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:35 -0700] "GET /amnesty/images/membutx.gif HTTP/1.0" 200 849+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:35 -0700] "GET /amnesty/images/spanbut.gif HTTP/1.0" 200 447+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:36 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:36 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:36 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:37 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:37 -0700] "GET /amnesty/images/getbut.gif HTTP/1.0" 200 2482+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:38 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:38 -0700] "GET /amnesty/images/savebutx.gif HTTP/1.0" 200 889+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:37:43 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+pm3-138.lex.infi.net - - [16/Oct/1997:07:38:19 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+pm3-138.lex.infi.net - - [16/Oct/1997:07:38:25 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+pm3-138.lex.infi.net - - [16/Oct/1997:07:38:27 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+pm3-138.lex.infi.net - - [16/Oct/1997:07:38:53 -0700] "GET /amnesty/images/usstamp.gif HTTP/1.0" 200 6166+pm3-138.lex.infi.net - - [16/Oct/1997:07:38:53 -0700] "GET /amnesty/write.html HTTP/1.0" 200 9408+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:00 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:00 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:00 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:01 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:03 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+pm3-138.lex.infi.net - - [16/Oct/1997:07:39:03 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+rm122a.flhigh.fsu.edu - - [16/Oct/1997:07:40:08 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+pm3-138.lex.infi.net - - [16/Oct/1997:07:40:37 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+pm3-138.lex.infi.net - - [16/Oct/1997:07:40:50 -0700] "GET /amnesty/whatsnew.html HTTP/1.0" 200 7562+pm3-138.lex.infi.net - - [16/Oct/1997:07:40:51 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+pm3-138.lex.infi.net - - [16/Oct/1997:07:40:52 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+pm3-138.lex.infi.net - - [16/Oct/1997:07:41:44 -0700] "GET /amnesty/asa/china/torgeson.html HTTP/1.0" 200 1862+pm3-138.lex.infi.net - - [16/Oct/1997:07:41:47 -0700] "GET /amnesty/asa/china/images/marble3.jpg HTTP/1.0" 200 2518+pm3-138.lex.infi.net - - [16/Oct/1997:07:42:02 -0700] "GET /amnesty/asa/china/images/wall.jpg HTTP/1.0" 200 16469+pm3-138.lex.infi.net - - [16/Oct/1997:07:42:19 -0700] "GET /amnesty/asa/china/images/kris.jpg HTTP/1.0" 200 37521+pm3-138.lex.infi.net - - [16/Oct/1997:07:42:32 -0700] "GET /amnesty/asa/china/images/read.gif HTTP/1.0" 200 13330+spo27.homeshopping.com.br - - [16/Oct/1997:07:42:58 -0700] "GET / HTTP/1.0" 200 3082+spo27.homeshopping.com.br - - [16/Oct/1997:07:43:00 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+pm3-138.lex.infi.net - - [16/Oct/1997:07:43:04 -0700] "GET /amnesty/asa/china/louisa-links.html HTTP/1.0" 200 1076+spo27.homeshopping.com.br - - [16/Oct/1997:07:43:06 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+spo27.homeshopping.com.br - - [16/Oct/1997:07:43:11 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+128.146.150.29 - - [16/Oct/1997:07:43:13 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+128.146.150.29 - - [16/Oct/1997:07:43:14 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+128.146.150.29 - - [16/Oct/1997:07:43:14 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+128.146.150.29 - - [16/Oct/1997:07:43:14 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+128.146.150.29 - - [16/Oct/1997:07:43:15 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+204.183.72.198 - - [16/Oct/1997:07:45:28 -0700] "GET /weeklyua.html HTTP/1.0" 200 10887+204.183.72.198 - - [16/Oct/1997:07:45:29 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+204.183.72.198 - - [16/Oct/1997:07:45:29 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+204.183.72.198 - - [16/Oct/1997:07:45:29 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+204.183.72.198 - - [16/Oct/1997:07:45:30 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+204.183.72.198 - - [16/Oct/1997:07:45:30 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+204.183.72.198 - - [16/Oct/1997:07:45:31 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+204.183.72.198 - - [16/Oct/1997:07:45:31 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+204.183.72.198 - - [16/Oct/1997:07:45:32 -0700] "GET /images/linebrn.gif HTTP/1.0" 200 308+204.183.72.198 - - [16/Oct/1997:07:46:44 -0700] "GET /urgact/ HTTP/1.0" 200 8283+207.38.218.82 - - [16/Oct/1997:07:46:50 -0700] "GET /amnesty HTTP/1.0" 301 184+207.38.218.82 - - [16/Oct/1997:07:46:51 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+207.38.218.82 - - [16/Oct/1997:07:46:53 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+207.38.218.82 - - [16/Oct/1997:07:46:54 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+171-164-127.ipt.aol.com - - [16/Oct/1997:07:47:18 -0700] "GET /turkey/back.gif HTTP/1.0" 200 224+171-164-127.ipt.aol.com - - [16/Oct/1997:07:47:22 -0700] "GET /turkey/clear.gif HTTP/1.0" 200 76+171-164-127.ipt.aol.com - - [16/Oct/1997:07:47:23 -0700] "GET /turkey/amnty1.gif HTTP/1.0" 200 3013+171-164-127.ipt.aol.com - - [16/Oct/1997:07:47:31 -0700] "GET /turkey/women.html HTTP/1.0" 200 17534+207.38.218.82 - - [16/Oct/1997:07:48:08 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+207.38.218.82 - - [16/Oct/1997:07:48:10 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+207.38.218.82 - - [16/Oct/1997:07:48:10 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+207.38.218.82 - - [16/Oct/1997:07:48:10 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+207.38.218.82 - - [16/Oct/1997:07:48:11 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+207.38.218.82 - - [16/Oct/1997:07:48:13 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+207.38.218.82 - - [16/Oct/1997:07:48:15 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+207.38.218.82 - - [16/Oct/1997:07:48:19 -0700] "GET /amnesty/images/hometake.gif HTTP/1.0" 200 1367+207.38.218.82 - - [16/Oct/1997:07:48:19 -0700] "GET /amnesty/images/writbut.gif HTTP/1.0" 200 543+207.38.218.82 - - [16/Oct/1997:07:48:20 -0700] "GET /amnesty/home.html HTTP/1.0" 200 17233+207.38.218.82 - - [16/Oct/1997:07:48:21 -0700] "GET /amnesty/images/homelogo.gif HTTP/1.0" 200 11841+207.38.218.82 - - [16/Oct/1997:07:48:21 -0700] "GET /amnesty/images/pubbut.gif HTTP/1.0" 200 1291+207.38.218.82 - - [16/Oct/1997:07:48:22 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+207.38.218.82 - - [16/Oct/1997:07:48:24 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+207.38.218.82 - - [16/Oct/1997:07:48:24 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+207.38.218.82 - - [16/Oct/1997:07:48:24 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+207.38.218.82 - - [16/Oct/1997:07:48:24 -0700] "GET /amnesty/images/rsacirat.gif HTTP/1.0" 200 2021+207.38.218.82 - - [16/Oct/1997:07:48:25 -0700] "GET /amnesty/images/eventbut.gif HTTP/1.0" 200 380+207.38.218.82 - - [16/Oct/1997:07:48:25 -0700] "GET /amnesty/images/joinbut2.gif HTTP/1.0" 200 362+207.38.218.82 - - [16/Oct/1997:07:48:25 -0700] "GET /amnesty/images/savebutx.gif HTTP/1.0" 200 889+207.38.218.82 - - [16/Oct/1997:07:48:26 -0700] "GET /amnesty/images/countbut.gif HTTP/1.0" 200 1673+207.38.218.82 - - [16/Oct/1997:07:48:26 -0700] "GET /amnesty/images/spanbut.gif HTTP/1.0" 200 447+207.38.218.82 - - [16/Oct/1997:07:48:27 -0700] "GET /amnesty/images/getbut.gif HTTP/1.0" 200 2482+207.38.218.82 - - [16/Oct/1997:07:48:27 -0700] "GET /amnesty/images/membutx.gif HTTP/1.0" 200 849+207.38.218.82 - - [16/Oct/1997:07:48:28 -0700] "GET /amnesty/images/homenew.gif HTTP/1.0" 200 1493+207.38.218.82 - - [16/Oct/1997:07:48:29 -0700] "GET /amnesty/images/homeside.gif HTTP/1.0" 200 1612+207.38.218.82 - - [16/Oct/1997:07:48:34 -0700] "GET /amnesty/welcome.html HTTP/1.0" 200 4731+207.38.218.82 - - [16/Oct/1997:07:48:37 -0700] "GET /amnesty/images/doubt.gif HTTP/1.0" 200 924+207.38.218.82 - - [16/Oct/1997:07:48:37 -0700] "GET /amnesty/images/never.gif HTTP/1.0" 200 914+207.38.218.82 - - [16/Oct/1997:07:48:38 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+207.38.218.82 - - [16/Oct/1997:07:48:38 -0700] "GET /amnesty/images/commit.gif HTTP/1.0" 200 190+207.38.218.82 - - [16/Oct/1997:07:48:38 -0700] "GET /amnesty/images/rights.gif HTTP/1.0" 200 938+207.38.218.82 - - [16/Oct/1997:07:48:39 -0700] "GET /amnesty/images/a.gif HTTP/1.0" 200 865+207.38.218.82 - - [16/Oct/1997:07:48:40 -0700] "GET /amnesty/images/refugee2.gif HTTP/1.0" 200 14882+207.38.218.82 - - [16/Oct/1997:07:48:41 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+207.38.218.82 - - [16/Oct/1997:07:48:41 -0700] "GET /amnesty/images/canred.gif HTTP/1.0" 200 311+207.38.218.82 - - [16/Oct/1997:07:48:42 -0700] "GET /amnesty/images/your.gif HTTP/1.0" 200 951+207.38.218.82 - - [16/Oct/1997:07:48:43 -0700] "GET /amnesty/images/differ.gif HTTP/1.0" 200 191+207.38.218.82 - - [16/Oct/1997:07:48:43 -0700] "GET /amnesty/images/human.gif HTTP/1.0" 200 155+207.38.218.82 - - [16/Oct/1997:07:48:44 -0700] "GET /amnesty/images/3ways.gif HTTP/1.0" 200 1157+207.38.218.82 - - [16/Oct/1997:07:48:44 -0700] "GET /amnesty/images/can.gif HTTP/1.0" 200 946+207.38.218.82 - - [16/Oct/1997:07:48:44 -0700] "GET /amnesty/images/it.gif HTTP/1.0" 200 170+207.38.218.82 - - [16/Oct/1997:07:48:44 -0700] "GET /amnesty/images/wamwer6.jpg HTTP/1.0" 200 9786+207.38.218.82 - - [16/Oct/1997:07:48:45 -0700] "GET /amnesty/images/aiusabut.gif HTTP/1.0" 200 591+207.38.218.82 - - [16/Oct/1997:07:48:48 -0700] "GET /amnesty/images/mombab10.gif HTTP/1.0" 200 16384+207.38.218.82 - - [16/Oct/1997:07:48:54 -0700] "GET /amnesty/images/aiusabut.gif HTTP/1.0" 304 -+207.38.218.82 - - [16/Oct/1997:07:48:54 -0700] "GET /amnesty/welcome.html HTTP/1.0" 304 -+207.38.218.82 - - [16/Oct/1997:07:48:55 -0700] "GET /amnesty/images/mombab10.gif HTTP/1.0" 304 -+207.38.218.82 - - [16/Oct/1997:07:48:56 -0700] "GET /amnesty/images/aiusabut.gif HTTP/1.0" 206 318+207.38.218.82 - - [16/Oct/1997:07:49:03 -0700] "GET /amnesty/images/mombab10.gif HTTP/1.0" 206 14999+207.38.218.82 - - [16/Oct/1997:07:50:28 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+207.38.218.82 - - [16/Oct/1997:07:50:29 -0700] "GET /amnesty/joinai.html HTTP/1.0" 304 -+207.38.218.82 - - [16/Oct/1997:07:50:30 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+208.133.54.8 - - [16/Oct/1997:07:51:45 -0700] "GET / HTTP/1.0" 200 3082+208.133.54.8 - - [16/Oct/1997:07:51:46 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+208.133.54.8 - - [16/Oct/1997:07:51:49 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+208.133.54.8 - - [16/Oct/1997:07:51:50 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+208.133.54.8 - - [16/Oct/1997:07:52:02 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+208.133.54.8 - - [16/Oct/1997:07:52:02 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+208.133.54.8 - - [16/Oct/1997:07:52:03 -0700] "GET /ainews.html HTTP/1.0" 200 13435+208.133.54.8 - - [16/Oct/1997:07:52:04 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+208.133.54.8 - - [16/Oct/1997:07:52:04 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+208.133.54.8 - - [16/Oct/1997:07:52:05 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+208.133.54.8 - - [16/Oct/1997:07:52:05 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+208.133.54.8 - - [16/Oct/1997:07:52:06 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+208.133.54.8 - - [16/Oct/1997:07:52:06 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+208.133.54.8 - - [16/Oct/1997:07:52:06 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+208.133.54.8 - - [16/Oct/1997:07:52:06 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+208.133.54.8 - - [16/Oct/1997:07:52:06 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+208.133.54.8 - - [16/Oct/1997:07:52:07 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+208.133.54.8 - - [16/Oct/1997:07:52:07 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+208.133.54.8 - - [16/Oct/1997:07:52:08 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+208.133.54.8 - - [16/Oct/1997:07:52:57 -0700] "GET /peru/aatiger.html HTTP/1.0" 200 10330+208.133.54.8 - - [16/Oct/1997:07:52:58 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+208.133.54.8 - - [16/Oct/1997:07:53:15 -0700] "GET /peru/peru.html HTTP/1.0" 200 12264+207.8.177.135 - - [16/Oct/1997:07:55:41 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+207.8.177.135 - - [16/Oct/1997:07:55:55 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+207.8.177.135 - - [16/Oct/1997:07:56:02 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+207.8.177.135 - - [16/Oct/1997:07:56:14 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+207.8.177.135 - - [16/Oct/1997:07:56:17 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+207.8.177.135 - - [16/Oct/1997:07:56:20 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+207.8.177.135 - - [16/Oct/1997:07:56:20 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+207.8.177.135 - - [16/Oct/1997:07:56:20 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+207.8.177.135 - - [16/Oct/1997:07:56:23 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+207.8.177.135 - - [16/Oct/1997:07:56:23 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+207.8.177.135 - - [16/Oct/1997:07:56:25 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+207.8.177.135 - - [16/Oct/1997:07:56:26 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+207.8.177.135 - - [16/Oct/1997:07:56:26 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+207.8.177.135 - - [16/Oct/1997:07:56:29 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+207.8.177.135 - - [16/Oct/1997:07:56:29 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+207.8.177.135 - - [16/Oct/1997:07:56:30 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+207.8.177.135 - - [16/Oct/1997:07:56:34 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+207.8.177.135 - - [16/Oct/1997:07:56:38 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+207.8.177.135 - - [16/Oct/1997:07:56:41 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+207.8.177.135 - - [16/Oct/1997:07:56:41 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+207.8.177.135 - - [16/Oct/1997:07:56:47 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+pm3-138.lex.infi.net - - [16/Oct/1997:07:56:52 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+207.8.177.135 - - [16/Oct/1997:07:56:52 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+207.8.177.135 - - [16/Oct/1997:07:56:54 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+207.8.177.135 - - [16/Oct/1997:07:56:54 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+207.8.177.135 - - [16/Oct/1997:07:57:00 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+207.8.177.135 - - [16/Oct/1997:07:57:00 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+pm3-138.lex.infi.net - - [16/Oct/1997:07:57:18 -0700] "GET /amnesty/welcome.html HTTP/1.0" 200 4731+pm3-138.lex.infi.net - - [16/Oct/1997:07:57:20 -0700] "GET /amnesty/images/never.gif HTTP/1.0" 200 914+pm3-138.lex.infi.net - - [16/Oct/1997:07:57:21 -0700] "GET /amnesty/images/doubt.gif HTTP/1.0" 200 924+207.8.177.135 - - [16/Oct/1997:07:57:27 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+207.8.177.135 - - [16/Oct/1997:07:57:27 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+207.8.177.135 - - [16/Oct/1997:07:57:28 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+207.8.177.135 - - [16/Oct/1997:07:57:58 -0700] "GET /amnesty/joinai.txt HTTP/1.0" 200 1914+207.8.177.135 - - [16/Oct/1997:07:58:23 -0700] "GET /amnesty/vgroups.html HTTP/1.0" 200 4391+207.8.177.135 - - [16/Oct/1997:07:58:25 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+207.8.177.135 - - [16/Oct/1997:07:58:26 -0700] "GET /amnesty/images/groucont.gif HTTP/1.0" 200 669+207.8.177.135 - - [16/Oct/1997:07:58:26 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+207.8.177.135 - - [16/Oct/1997:07:58:29 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+207.8.177.135 - - [16/Oct/1997:07:58:42 -0700] "GET /amnesty/group.html HTTP/1.0" 200 8575+207.8.177.135 - - [16/Oct/1997:07:58:44 -0700] "GET /amnesty/images/goldfla2.gif HTTP/1.0" 200 1161+207.8.177.135 - - [16/Oct/1997:07:58:46 -0700] "GET /amnesty/images/canfuz1.gif HTTP/1.0" 200 3013+207.8.177.135 - - [16/Oct/1997:07:58:47 -0700] "GET /amnesty/images/04candle.gif HTTP/1.0" 200 7257+207.8.177.135 - - [16/Oct/1997:07:58:47 -0700] "GET /amnesty/images/grncndl.gif HTTP/1.0" 200 1471+207.8.177.135 - - [16/Oct/1997:07:58:49 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+207.8.177.135 - - [16/Oct/1997:07:58:53 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+207.8.177.135 - - [16/Oct/1997:07:58:53 -0700] "GET /amnesty/images/evenbut.gif HTTP/1.0" 200 399+207.8.177.135 - - [16/Oct/1997:07:58:59 -0700] "GET /amnesty/images/can1_2.gif HTTP/1.0" 200 30430+207.8.177.135 - - [16/Oct/1997:07:59:01 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+207.8.177.135 - - [16/Oct/1997:07:59:07 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+207.8.177.135 - - [16/Oct/1997:07:59:08 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+207.8.177.135 - - [16/Oct/1997:07:59:14 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+204.232.49.30 - - [16/Oct/1997:07:59:37 -0700] "GET / HTTP/1.0" 200 3082+204.232.49.30 - - [16/Oct/1997:07:59:38 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+204.232.49.30 - - [16/Oct/1997:07:59:38 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+204.232.49.30 - - [16/Oct/1997:07:59:49 -0700] "GET /whatsnew.html HTTP/1.0" 200 7562+204.232.49.30 - - [16/Oct/1997:07:59:50 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+204.232.49.30 - - [16/Oct/1997:07:59:50 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+204.232.49.30 - - [16/Oct/1997:07:59:50 -0700] "GET /images/homenew.gif HTTP/1.0" 200 1493+204.232.49.30 - - [16/Oct/1997:07:59:50 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+204.232.49.30 - - [16/Oct/1997:07:59:51 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+158.5.27.50 - - [16/Oct/1997:07:59:52 -0700] "GET /amnesty/mideast/iraqar.html HTTP/1.0" 200 15153+204.232.49.30 - - [16/Oct/1997:07:59:52 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+204.232.49.30 - - [16/Oct/1997:07:59:52 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+204.232.49.30 - - [16/Oct/1997:07:59:52 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+204.232.49.30 - - [16/Oct/1997:08:00:16 -0700] "GET /images/homelogo.gif HTTP/1.0" 200 11841+204.232.49.30 - - [16/Oct/1997:08:00:16 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+204.232.49.30 - - [16/Oct/1997:08:00:17 -0700] "GET /images/hometake.gif HTTP/1.0" 200 1367+204.232.49.30 - - [16/Oct/1997:08:00:18 -0700] "GET /home.html HTTP/1.0" 200 17233+204.232.49.30 - - [16/Oct/1997:08:00:18 -0700] "GET /images/homeside.gif HTTP/1.0" 200 1612+204.232.49.30 - - [16/Oct/1997:08:00:20 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+204.232.49.30 - - [16/Oct/1997:08:00:21 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+204.232.49.30 - - [16/Oct/1997:08:00:21 -0700] "GET /images/joinbut2.gif HTTP/1.0" 200 362+204.232.49.30 - - [16/Oct/1997:08:00:21 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+204.232.49.30 - - [16/Oct/1997:08:00:22 -0700] "GET /images/getbut.gif HTTP/1.0" 200 2482+204.232.49.30 - - [16/Oct/1997:08:00:22 -0700] "GET /images/savebutx.gif HTTP/1.0" 200 889+204.232.49.30 - - [16/Oct/1997:08:00:22 -0700] "GET /images/spanbut.gif HTTP/1.0" 200 447+204.232.49.30 - - [16/Oct/1997:08:00:23 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.232.49.30 - - [16/Oct/1997:08:00:23 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+204.232.49.30 - - [16/Oct/1997:08:00:23 -0700] "GET /images/rsacirat.gif HTTP/1.0" 200 2021+204.232.49.30 - - [16/Oct/1997:08:00:24 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+204.232.49.30 - - [16/Oct/1997:08:00:24 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+204.232.49.30 - - [16/Oct/1997:08:00:24 -0700] "GET /images/membutx.gif HTTP/1.0" 200 849+204.232.49.30 - - [16/Oct/1997:08:00:24 -0700] "GET /images/pnbut.gif HTTP/1.0" 200 670+204.232.49.30 - - [16/Oct/1997:08:00:25 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+204.232.49.30 - - [16/Oct/1997:08:00:28 -0700] "GET /images/usstamp.gif HTTP/1.0" 200 6166+204.232.49.30 - - [16/Oct/1997:08:00:28 -0700] "GET /write.html HTTP/1.0" 200 9408+204.232.49.30 - - [16/Oct/1997:08:00:52 -0700] "GET / HTTP/1.0" 200 -+204.232.49.30 - - [16/Oct/1997:08:00:53 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+204.232.49.30 - - [16/Oct/1997:08:00:53 -0700] "GET /images/spot5.gif HTTP/1.0" 304 -+208.226.16.80 - - [16/Oct/1997:08:00:57 -0700] "GET / HTTP/1.0" 200 3082+204.232.49.30 - - [16/Oct/1997:08:00:58 -0700] "GET /write.html HTTP/1.0" 200 9408+204.232.49.30 - - [16/Oct/1997:08:00:59 -0700] "GET /images/usstamp.gif HTTP/1.0" 200 6166+204.232.49.30 - - [16/Oct/1997:08:01:00 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:01:01 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:01:01 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:01:01 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:01:01 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:01:01 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+208.226.16.80 - - [16/Oct/1997:08:01:39 -0700] "GET / HTTP/1.0" 200 3082+204.232.49.30 - - [16/Oct/1997:08:02:11 -0700] "GET /images/linebrn.gif HTTP/1.0" 200 308+204.232.49.30 - - [16/Oct/1997:08:02:11 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+204.232.49.30 - - [16/Oct/1997:08:02:12 -0700] "GET /weeklyua.html HTTP/1.0" 200 10887+208.226.16.80 - - [16/Oct/1997:08:02:40 -0700] "GET / HTTP/1.0" 200 3082+208.226.16.80 - - [16/Oct/1997:08:02:45 -0700] "GET / HTTP/1.0" 200 3082+pm3-138.lex.infi.net - - [16/Oct/1997:08:04:03 -0700] "GET /amnesty/images/refugee2.gif HTTP/1.0" 200 9230+204.232.49.30 - - [16/Oct/1997:08:04:17 -0700] "GET /joinai.html HTTP/1.0" 200 4054+204.232.49.30 - - [16/Oct/1997:08:04:18 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+204.232.49.30 - - [16/Oct/1997:08:04:18 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+204.232.49.30 - - [16/Oct/1997:08:04:18 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+204.232.49.30 - - [16/Oct/1997:08:04:19 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.232.49.30 - - [16/Oct/1997:08:04:20 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+ad20-094.compuserve.com - - [16/Oct/1997:08:04:39 -0700] "GET /amnesty/mideast/countrie.html HTTP/1.0" 200 1527+ad20-094.compuserve.com - - [16/Oct/1997:08:04:43 -0700] "GET /amnesty/mideast/butalg.gif HTTP/1.0" 200 368+ad20-094.compuserve.com - - [16/Oct/1997:08:04:55 -0700] "GET /amnesty/mideast/butbah.gif HTTP/1.0" 200 380+ad20-094.compuserve.com - - [16/Oct/1997:08:04:59 -0700] "GET /amnesty/mideast/butegy.gif HTTP/1.0" 200 363+ad20-094.compuserve.com - - [16/Oct/1997:08:04:59 -0700] "GET /amnesty/mideast/butgul.gif HTTP/1.0" 200 399+ad20-094.compuserve.com - - [16/Oct/1997:08:05:02 -0700] "GET /amnesty/mideast/butirq.gif HTTP/1.0" 200 329+ad20-094.compuserve.com - - [16/Oct/1997:08:05:04 -0700] "GET /amnesty/mideast/butjor.gif HTTP/1.0" 200 352+ad20-094.compuserve.com - - [16/Oct/1997:08:05:06 -0700] "GET /amnesty/mideast/butirn.gif HTTP/1.0" 200 317+ad20-094.compuserve.com - - [16/Oct/1997:08:05:06 -0700] "GET /amnesty/mideast/butisr.gif HTTP/1.0" 200 384+ad20-094.compuserve.com - - [16/Oct/1997:08:05:09 -0700] "GET /amnesty/mideast/butleb.gif HTTP/1.0" 200 383+ad20-094.compuserve.com - - [16/Oct/1997:08:05:11 -0700] "GET /amnesty/mideast/butlib.gif HTTP/1.0" 200 352+204.232.49.30 - - [16/Oct/1997:08:05:12 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+ad20-094.compuserve.com - - [16/Oct/1997:08:05:12 -0700] "GET /amnesty/mideast/butsau.gif HTTP/1.0" 200 403+ad20-094.compuserve.com - - [16/Oct/1997:08:05:13 -0700] "GET /amnesty/mideast/butkuw.gif HTTP/1.0" 200 366+204.232.49.30 - - [16/Oct/1997:08:05:13 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+204.232.49.30 - - [16/Oct/1997:08:05:13 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+204.232.49.30 - - [16/Oct/1997:08:05:13 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+ad20-094.compuserve.com - - [16/Oct/1997:08:05:14 -0700] "GET /amnesty/mideast/butmor.gif HTTP/1.0" 200 432+204.232.49.30 - - [16/Oct/1997:08:05:14 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+204.232.49.30 - - [16/Oct/1997:08:05:14 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+204.232.49.30 - - [16/Oct/1997:08:05:14 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+204.232.49.30 - - [16/Oct/1997:08:05:15 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+204.232.49.30 - - [16/Oct/1997:08:05:15 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+204.232.49.30 - - [16/Oct/1997:08:05:15 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+ad20-094.compuserve.com - - [16/Oct/1997:08:05:16 -0700] "GET /amnesty/mideast/butsyr.gif HTTP/1.0" 200 344+204.232.49.30 - - [16/Oct/1997:08:05:17 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+204.232.49.30 - - [16/Oct/1997:08:05:17 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+ad20-094.compuserve.com - - [16/Oct/1997:08:05:18 -0700] "GET /amnesty/mideast/buttun.gif HTTP/1.0" 200 359+204.232.49.30 - - [16/Oct/1997:08:05:18 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+ad20-094.compuserve.com - - [16/Oct/1997:08:05:19 -0700] "GET /amnesty/mideast/butbac.gif HTTP/1.0" 200 592+ad20-094.compuserve.com - - [16/Oct/1997:08:05:19 -0700] "GET /amnesty/mideast/butyem.gif HTTP/1.0" 200 352+204.232.49.30 - - [16/Oct/1997:08:05:19 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+204.232.49.30 - - [16/Oct/1997:08:05:19 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+204.232.49.30 - - [16/Oct/1997:08:05:19 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+204.232.49.30 - - [16/Oct/1997:08:05:19 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+204.232.49.30 - - [16/Oct/1997:08:05:20 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+204.232.49.30 - - [16/Oct/1997:08:05:21 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+204.232.49.30 - - [16/Oct/1997:08:05:21 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+204.232.49.30 - - [16/Oct/1997:08:05:21 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+204.232.49.30 - - [16/Oct/1997:08:05:25 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+ad20-094.compuserve.com - - [16/Oct/1997:08:05:35 -0700] "GET /amnesty/mideast/saudi.html HTTP/1.0" 200 8072+ad20-094.compuserve.com - - [16/Oct/1997:08:05:35 -0700] "GET /amnesty/mideast/sauflag.gif HTTP/1.0" 200 3101+204.232.49.30 - - [16/Oct/1997:08:05:46 -0700] "GET /about.html HTTP/1.0" 200 6902+ad20-094.compuserve.com - - [16/Oct/1997:08:05:46 -0700] "GET /amnesty/mideast/mailbut2.gif HTTP/1.0" 200 1202+204.232.49.30 - - [16/Oct/1997:08:05:47 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+204.232.49.30 - - [16/Oct/1997:08:05:48 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+204.232.49.30 - - [16/Oct/1997:08:05:48 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+204.232.49.30 - - [16/Oct/1997:08:05:48 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+204.232.49.30 - - [16/Oct/1997:08:05:49 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+204.232.49.30 - - [16/Oct/1997:08:05:49 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+204.232.49.30 - - [16/Oct/1997:08:05:49 -0700] "GET /images/where.gif HTTP/1.0" 200 605+ad20-094.compuserve.com - - [16/Oct/1997:08:05:52 -0700] "GET /amnesty/mideast/saudi.jpg HTTP/1.0" 200 8769+204.232.49.30 - - [16/Oct/1997:08:06:10 -0700] "GET /ainews.html HTTP/1.0" 200 13435+204.232.49.30 - - [16/Oct/1997:08:06:10 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+204.232.49.30 - - [16/Oct/1997:08:06:11 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+204.232.49.30 - - [16/Oct/1997:08:06:11 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+204.232.49.30 - - [16/Oct/1997:08:06:11 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+204.232.49.30 - - [16/Oct/1997:08:06:12 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+204.232.49.30 - - [16/Oct/1997:08:06:12 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+204.232.49.30 - - [16/Oct/1997:08:06:13 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+204.232.49.30 - - [16/Oct/1997:08:06:13 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+208.226.16.80 - - [16/Oct/1997:08:06:20 -0700] "GET / HTTP/1.0" 200 3082+204.232.49.30 - - [16/Oct/1997:08:06:29 -0700] "GET /ainews/china/execrec.html HTTP/1.0" 200 6897+204.232.49.30 - - [16/Oct/1997:08:06:30 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+doe-190-9.lib.berkeley.edu - - [16/Oct/1997:08:07:22 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+doe-190-9.lib.berkeley.edu - - [16/Oct/1997:08:07:23 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+doe-190-9.lib.berkeley.edu - - [16/Oct/1997:08:07:28 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+doe-190-9.lib.berkeley.edu - - [16/Oct/1997:08:07:39 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ad20-094.compuserve.com - - [16/Oct/1997:08:08:20 -0700] "GET /amnesty/mideast/moroc.html HTTP/1.0" 200 6539+ad20-094.compuserve.com - - [16/Oct/1997:08:08:24 -0700] "GET /amnesty/mideast/morflag.gif HTTP/1.0" 200 1680+ad20-094.compuserve.com - - [16/Oct/1997:08:09:09 -0700] "GET /amnesty/mideast/morws.jpg HTTP/1.0" 200 17585+ppp4-35.igc.org - - [16/Oct/1997:08:11:14 -0700] "GET /images/homelogo.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:14 -0700] "GET /images/hometake.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:15 -0700] "GET /home.html HTTP/1.0" 200 17233+ppp4-35.igc.org - - [16/Oct/1997:08:11:15 -0700] "GET /images/writbut.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:16 -0700] "GET /images/pnbut.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:16 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:17 -0700] "GET /images/candles3.jpg HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:17 -0700] "GET /images/rsacirat.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:19 -0700] "GET /images/joinbut2.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:20 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:20 -0700] "GET /images/homenew.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:20 -0700] "GET /images/homeside.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:20 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:21 -0700] "GET /whatsnew.html HTTP/1.0" 200 7562+ppp4-35.igc.org - - [16/Oct/1997:08:11:23 -0700] "GET /images/aiusared.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:23 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:23 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:23 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:23 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:24 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:24 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:26 -0700] "GET /regions/index.html HTTP/1.0" 200 2312+ppp4-35.igc.org - - [16/Oct/1997:08:11:27 -0700] "GET /images/amnesty.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:33 -0700] "GET /regions/maregcon.html HTTP/1.0" 200 1304+ppp4-35.igc.org - - [16/Oct/1997:08:11:34 -0700] "GET /images/picasso.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:11:34 -0700] "GET /images/women05.jpg HTTP/1.0" 304 -+ad20-094.compuserve.com - - [16/Oct/1997:08:11:38 -0700] "GET /amnesty/mideast/index.html HTTP/1.0" 200 3104+ad20-094.compuserve.com - - [16/Oct/1997:08:11:47 -0700] "GET /amnesty/mideast/ailogo.gif HTTP/1.0" 200 2682+ad20-094.compuserve.com - - [16/Oct/1997:08:12:09 -0700] "GET /amnesty/mideast/hrme.jpg HTTP/1.0" 200 24216+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:12:39 -0700] "GET /amnesty HTTP/1.0" 301 184+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:12:40 -0700] "GET /amnesty/ HTTP/1.0" 200 3082+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:12:43 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:12:45 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:13 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:16 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:16 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:16 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:18 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:19 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:20 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:22 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:22 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:22 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:22 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:24 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:24 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:25 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:25 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:27 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:27 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:27 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:27 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:30 -0700] "GET /amnesty/abolish/index.html HTTP/1.0" 200 6318+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:33 -0700] "GET /amnesty/images/aiusared.gif HTTP/1.0" 200 2725+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:34 -0700] "GET /amnesty/images/dot_clea.gif HTTP/1.0" 200 43+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:35 -0700] "GET /amnesty/abolish/images/clock6.gif HTTP/1.0" 200 11949+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:37 -0700] "GET /amnesty/abolish/images/clock4.gif HTTP/1.0" 200 37947+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:37 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:37 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:39 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:41 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+p03-54.onyx.net - - [16/Oct/1997:08:13:44 -0700] "GET /amnesty/ai_gloss.html HTTP/1.0" 200 6214+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:46 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+p03-54.onyx.net - - [16/Oct/1997:08:13:47 -0700] "GET /amnesty/images/amnesty.gif HTTP/1.0" 200 1158+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:13:58 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:05 -0700] "GET /amnesty/abolish/dpfacts.html HTTP/1.0" 200 14087+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:06 -0700] "GET /amnesty/abolish/images/greysand.gif HTTP/1.0" 200 10546+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:09 -0700] "GET /amnesty/images/blkcnd2x.gif HTTP/1.0" 200 1439+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:11 -0700] "GET /amnesty/abolish/images/airedsnd.gif HTTP/1.0" 200 8856+p03-54.onyx.net - - [16/Oct/1997:08:14:12 -0700] "GET /amnesty/regions.html HTTP/1.0" 200 4886+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:15 -0700] "GET /amnesty/images/deathbux.gif HTTP/1.0" 200 1667+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:27 -0700] "GET /amnesty/abolish/8'5uaup.html HTTP/1.0" 200 4586+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:30 -0700] "GET /amnesty/tools/dot_clea.gif HTTP/1.0" 200 43+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:30 -0700] "GET /amnesty/tools/ffffff.gif HTTP/1.0" 200 35+p03-54.onyx.net - - [16/Oct/1997:08:14:42 -0700] "GET /amnesty/index.html HTTP/1.0" 200 3082+p03-54.onyx.net - - [16/Oct/1997:08:14:45 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+p03-54.onyx.net - - [16/Oct/1997:08:14:48 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 200 9372+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:14:54 -0700] "GET /amnesty/abolish/executio.html HTTP/1.0" 200 5523+p03-54.onyx.net - - [16/Oct/1997:08:14:56 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+p03-54.onyx.net - - [16/Oct/1997:08:15:24 -0700] "GET /amnesty/joinai.html HTTP/1.0" 200 4054+ww-tr03.proxy.aol.com - - [16/Oct/1997:08:15:47 -0700] "GET /amnesty/abolish/leavrick.html HTTP/1.0" 200 1585+hera-18.hermesnet.net - - [16/Oct/1997:08:18:45 -0700] "GET / HTTP/1.0" 200 3082+hera-18.hermesnet.net - - [16/Oct/1997:08:18:49 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+hera-18.hermesnet.net - - [16/Oct/1997:08:18:52 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:23 -0700] "GET /amnesty/index.html HTTP/1.0" 200 3082+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:32 -0700] "GET /amnesty/images/bsilk7.gif HTTP/1.0" 404 178+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:33 -0700] "GET /amnesty/images/spot5.gif HTTP/1.0" 304 -+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:42 -0700] "GET /amnesty/aicapn2.html HTTP/1.0" 200 12769+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:44 -0700] "GET /amnesty/images/campbut.gif HTTP/1.0" 200 1257+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:45 -0700] "GET /amnesty/images/dot.gif HTTP/1.0" 200 946+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:45 -0700] "GET /amnesty/images/ganbut.gif HTTP/1.0" 200 1414+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:45 -0700] "GET /amnesty/images/pandnlog.gif HTTP/1.0" 200 15944+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:45 -0700] "GET /amnesty/images/refbut.gif HTTP/1.0" 200 1182+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:53 -0700] "GET /amnesty/images/deathbut.gif HTTP/1.0" 200 1310+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:53 -0700] "GET /amnesty/images/groupbut.gif HTTP/1.0" 200 1173+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:53 -0700] "GET /amnesty/images/lgbut.gif HTTP/1.0" 200 614+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:53 -0700] "GET /amnesty/images/ncasebut.gif HTTP/1.0" 200 1427+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:53 -0700] "GET /amnesty/images/uabut.gif HTTP/1.0" 200 1288+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:56 -0700] "GET /amnesty/images/healbut.gif HTTP/1.0" 200 1492+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:56 -0700] "GET /amnesty/images/legalbut.gif HTTP/1.0" 200 1097+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:57 -0700] "GET /amnesty/images/educbut.gif HTTP/1.0" 200 1246+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:57 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:57 -0700] "GET /amnesty/images/wordo35d.gif HTTP/1.0" 200 7089+nyc-ny53-56.ix.netcom.com - - [16/Oct/1997:08:20:57 -0700] "GET /comm/herbert.html HTTP/1.0" 200 1563+ww-to03.proxy.aol.com - - [16/Oct/1997:08:20:59 -0700] "GET /amnesty/images/mombaby4.jpg HTTP/1.0" 200 6718+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:00 -0700] "GET /amnesty/images/penhand3.gif HTTP/1.0" 200 1181+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:02 -0700] "GET /amnesty/images/kids3.gif HTTP/1.0" 200 8552+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:03 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:03 -0700] "GET /amnesty/images/womland2.jpg HTTP/1.0" 200 10884+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:05 -0700] "GET /amnesty/images/cabut.gif HTTP/1.0" 200 1425+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:05 -0700] "GET /amnesty/images/candles3.jpg HTTP/1.0" 200 5240+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:06 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:07 -0700] "GET /amnesty/images/newbut.gif HTTP/1.0" 200 1357+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:08 -0700] "GET /amnesty/images/aboutbut.gif HTTP/1.0" 200 1277+user-37kbnkv.dialup.mindspring.com - - [16/Oct/1997:08:21:28 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+user-37kbnkv.dialup.mindspring.com - - [16/Oct/1997:08:21:31 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+user-37kbnkv.dialup.mindspring.com - - [16/Oct/1997:08:21:31 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+user-37kbnkv.dialup.mindspring.com - - [16/Oct/1997:08:21:32 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+user-37kbnkv.dialup.mindspring.com - - [16/Oct/1997:08:21:34 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:50 -0700] "GET /amnesty/legal.html HTTP/1.0" 200 5654+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:53 -0700] "GET /amnesty/images/blkcnd2.gif HTTP/1.0" 200 1082+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:54 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:55 -0700] "GET /amnesty/images/joinbut.gif HTTP/1.0" 200 409+ww-to03.proxy.aol.com - - [16/Oct/1997:08:21:56 -0700] "GET /amnesty/images/clear1.jpg HTTP/1.0" 200 849+152.157.224.6 - - [16/Oct/1997:08:22:12 -0700] "GET /amnesty/women/fgmegypt.html HTTP/1.0" 200 6256+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:24 -0700] "GET /amnesty/casework/index.html HTTP/1.0" 200 2974+152.157.224.6 - - [16/Oct/1997:08:22:24 -0700] "GET /amnesty/images/homebut.gif HTTP/1.0" 200 518+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:26 -0700] "GET /amnesty/images/aiusarex.gif HTTP/1.0" 200 3237+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:27 -0700] "GET /amnesty/images/homebutx.gif HTTP/1.0" 200 875+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:28 -0700] "GET /amnesty/casework/images/bothlogo.gif HTTP/1.0" 200 8650+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:28 -0700] "GET /amnesty/images/newbutx.gif HTTP/1.0" 200 1714+152.157.224.6 - - [16/Oct/1997:08:22:28 -0700] "GET /amnesty/images/pnbut.gif HTTP/1.0" 200 670+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:28 -0700] "GET /amnesty/images/pnbutx.gif HTTP/1.0" 200 1027+152.157.224.6 - - [16/Oct/1997:08:22:28 -0700] "GET /amnesty/images/womenbut.gif HTTP/1.0" 200 1367+152.157.224.6 - - [16/Oct/1997:08:22:30 -0700] "GET /amnesty/images/helpbut.gif HTTP/1.0" 200 536+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:35 -0700] "GET /amnesty/images/aboutbux.gif HTTP/1.0" 200 1634+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:35 -0700] "GET /amnesty/images/cabutx.gif HTTP/1.0" 200 1782+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:35 -0700] "GET /amnesty/images/joinbutx.gif HTTP/1.0" 200 766+ppp4-35.igc.org - - [16/Oct/1997:08:22:46 -0700] "GET /regions/maregcon.html HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:22:47 -0700] "GET /images/picasso.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:22:47 -0700] "GET /images/women05.jpg HTTP/1.0" 304 -+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:48 -0700] "GET /amnesty/group.html HTTP/1.0" 200 8575+ppp4-35.igc.org - - [16/Oct/1997:08:22:50 -0700] "GET /regions/maregcon.html HTTP/1.0" 304 -+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:52 -0700] "GET /amnesty/images/canfuz1.gif HTTP/1.0" 200 3013+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:52 -0700] "GET /amnesty/images/goldfla2.gif HTTP/1.0" 200 1161+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:52 -0700] "GET /amnesty/images/grncndl.gif HTTP/1.0" 200 1471+ppp4-35.igc.org - - [16/Oct/1997:08:22:52 -0700] "GET /images/picasso.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:22:52 -0700] "GET /images/women05.jpg HTTP/1.0" 304 -+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:56 -0700] "GET /amnesty/images/can1_2.gif HTTP/1.0" 200 30430+ww-to03.proxy.aol.com - - [16/Oct/1997:08:22:58 -0700] "GET /amnesty/images/04candle.gif HTTP/1.0" 200 7257+ww-to03.proxy.aol.com - - [16/Oct/1997:08:23:08 -0700] "GET /amnesty/images/evenbut.gif HTTP/1.0" 200 399+nyc-ny53-56.ix.netcom.com - - [16/Oct/1997:08:24:13 -0700] "GET /comm/herbert.html HTTP/1.0" 304 -+nyc-ny53-56.ix.netcom.com - - [16/Oct/1997:08:24:14 -0700] "GET /comm/images/dot_clea.gif HTTP/1.0" 200 43+nyc-ny53-56.ix.netcom.com - - [16/Oct/1997:08:24:20 -0700] "GET /comm/images/bsilk7.gif HTTP/1.0" 200 10517+nyc-ny53-56.ix.netcom.com - - [16/Oct/1997:08:24:25 -0700] "GET /comm/images/people/herbert4.jpg HTTP/1.0" 200 11129+ppp4-35.igc.org - - [16/Oct/1997:08:27:11 -0700] "GET /regions/maregcon.html HTTP/1.0" 200 1304+ppp4-35.igc.org - - [16/Oct/1997:08:27:14 -0700] "GET /images/picasso.gif HTTP/1.0" 304 -+ppp4-35.igc.org - - [16/Oct/1997:08:27:14 -0700] "GET /images/women05.jpg HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:29:55 -0700] "GET /argact/ HTTP/1.0" 404 160+204.48.151.245 - - [16/Oct/1997:08:30:03 -0700] "GET /urgact/ HTTP/1.0" 200 8283+204.48.151.245 - - [16/Oct/1997:08:30:04 -0700] "GET /images/homebutx.gif HTTP/1.0" 200 875+204.48.151.245 - - [16/Oct/1997:08:30:04 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+204.48.151.245 - - [16/Oct/1997:08:30:04 -0700] "GET /images/newbutx.gif HTTP/1.0" 200 1714+204.48.151.245 - - [16/Oct/1997:08:30:04 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+204.48.151.245 - - [16/Oct/1997:08:30:06 -0700] "GET /images/aboutbux.gif HTTP/1.0" 200 1634+204.48.151.245 - - [16/Oct/1997:08:30:06 -0700] "GET /images/cabutx.gif HTTP/1.0" 200 1782+204.48.151.245 - - [16/Oct/1997:08:30:10 -0700] "GET /images/joinbutx.gif HTTP/1.0" 200 766+209.76.123.200 - - [16/Oct/1997:08:31:26 -0700] "GET /weeklyua.html HTTP/1.0" 200 11321+204.48.151.245 - - [16/Oct/1997:08:32:32 -0700] "GET /urgact/ HTTP/1.0" 200 -+204.48.151.245 - - [16/Oct/1997:08:32:36 -0700] "GET /images/logo2.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:37 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:37 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:38 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:38 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:39 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:32:43 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:13 -0700] "GET /home.html HTTP/1.0" 200 3854+204.48.151.245 - - [16/Oct/1997:08:33:26 -0700] "GET /index.html HTTP/1.0" 200 3082+204.48.151.245 - - [16/Oct/1997:08:33:27 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+204.48.151.245 - - [16/Oct/1997:08:33:27 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ppp37.igc.org - - [16/Oct/1997:08:33:28 -0700] "GET /casework/ HTTP/1.0" 200 2974+ppp37.igc.org - - [16/Oct/1997:08:33:29 -0700] "GET /images/aiusarex.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:30 -0700] "GET /casework/images/bothlogo.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:30 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:31 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:31 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:32 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:32 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+ppp37.igc.org - - [16/Oct/1997:08:33:32 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:33:49 -0700] "GET /joinai.html HTTP/1.0" 200 4054+204.48.151.245 - - [16/Oct/1997:08:33:50 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+204.48.151.245 - - [16/Oct/1997:08:33:50 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+204.48.151.245 - - [16/Oct/1997:08:33:50 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+204.48.151.245 - - [16/Oct/1997:08:33:50 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+204.48.151.245 - - [16/Oct/1997:08:34:09 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+204.185.34.45 - - [16/Oct/1997:08:36:37 -0700] "GET /asa/china/ HTTP/1.0" 200 18000+204.185.34.45 - - [16/Oct/1997:08:36:46 -0700] "GET /asa/china/contents.html HTTP/1.0" 200 3336+204.185.34.45 - - [16/Oct/1997:08:36:49 -0700] "GET /asa/china/images/smflag.gif HTTP/1.0" 200 951+204.185.34.45 - - [16/Oct/1997:08:37:11 -0700] "GET /asa/china/chinese.html HTTP/1.0" 200 8192+204.185.34.45 - - [16/Oct/1997:08:37:21 -0700] "GET /asa/china/images/welcome.gif HTTP/1.0" 200 1049+204.185.34.45 - - [16/Oct/1997:08:37:37 -0700] "GET /asa/china/images/tibet.gif HTTP/1.0" 200 1241+204.185.34.45 - - [16/Oct/1997:08:37:38 -0700] "GET /asa/china/images/hk.gif HTTP/1.0" 200 1212+204.185.34.45 - - [16/Oct/1997:08:37:39 -0700] "GET /asa/china/images/xj.gif HTTP/1.0" 200 1247+204.185.34.45 - - [16/Oct/1997:08:37:47 -0700] "GET /asa/china/images/mail8380.gif HTTP/1.0" 200 4196+204.185.34.45 - - [16/Oct/1997:08:37:48 -0700] "GET /asa/china/images/link.gif HTTP/1.0" 200 4236+204.185.34.45 - - [16/Oct/1997:08:37:53 -0700] "GET /asa/china/images/renquan.gif HTTP/1.0" 200 411+204.185.34.45 - - [16/Oct/1997:08:38:00 -0700] "GET /asa/china/images/zhongwen.gif HTTP/1.0" 200 1202+204.185.34.45 - - [16/Oct/1997:08:38:16 -0700] "GET /asa/china/images/what-is-ai-chinese.gif HTTP/1.0" 200 3648+204.185.34.45 - - [16/Oct/1997:08:38:17 -0700] "GET /asa/china/images/ar97.jpg HTTP/1.0" 200 8192+204.185.34.45 - - [16/Oct/1997:08:38:17 -0700] "GET /asa/china/images/dzlbanner.gif HTTP/1.0" 200 16384+ppp31.igc.org - - [16/Oct/1997:08:38:50 -0700] "GET /images/homelogo.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:51 -0700] "GET /images/hometake.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:51 -0700] "GET /images/writbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:52 -0700] "GET /home.html HTTP/1.0" 200 17234+ppp31.igc.org - - [16/Oct/1997:08:38:52 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:53 -0700] "GET /images/pnbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:53 -0700] "GET /images/spanbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:54 -0700] "GET /images/candles3.jpg HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:54 -0700] "GET /images/joinbut2.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:54 -0700] "GET /images/rsacirat.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:55 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:55 -0700] "GET /images/homenew.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:55 -0700] "GET /images/homeside.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:55 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:56 -0700] "GET /images/helpbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:57 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:57 -0700] "GET /images/eventbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:57 -0700] "GET /images/pubbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:58 -0700] "GET /images/savebutx.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:59 -0700] "GET /images/countbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:59 -0700] "GET /images/getbut.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:38:59 -0700] "GET /images/membutx.gif HTTP/1.0" 304 -+ppp31.igc.org - - [16/Oct/1997:08:39:50 -0700] "GET /members/afreport.html HTTP/1.0" 401 350+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:05 -0700] "GET / HTTP/1.0" 200 3082+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:06 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:11 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ppp31.igc.org - amnesty [16/Oct/1997:08:40:11 -0700] "GET /members/afreport.html HTTP/1.0" 200 450+204.48.151.245 - - [16/Oct/1997:08:40:44 -0700] "GET /urgact/ HTTP/1.0" 200 -+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:46 -0700] "GET /images/dot.gif HTTP/1.0" 200 946+204.48.151.245 - - [16/Oct/1997:08:40:46 -0700] "GET /images/homebutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:40:46 -0700] "GET /images/logo2.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:40:46 -0700] "GET /images/newbutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:40:46 -0700] "GET /images/pnbutx.gif HTTP/1.0" 304 -+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:46 -0700] "GET /images/refbut.gif HTTP/1.0" 200 1182+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:47 -0700] "GET /aicapn2.html HTTP/1.0" 200 12769+204.48.151.245 - - [16/Oct/1997:08:40:48 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:40:48 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:40:48 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:50 -0700] "GET /images/campbut.gif HTTP/1.0" 200 1257+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:50 -0700] "GET /images/deathbut.gif HTTP/1.0" 200 1310+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:50 -0700] "GET /images/pandnlog.gif HTTP/1.0" 200 15944+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:51 -0700] "GET /images/groupbut.gif HTTP/1.0" 200 1173+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:51 -0700] "GET /images/lgbut.gif HTTP/1.0" 200 614+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:52 -0700] "GET /images/ncasebut.gif HTTP/1.0" 200 1427+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:52 -0700] "GET /images/uabut.gif HTTP/1.0" 200 1288+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:53 -0700] "GET /images/legalbut.gif HTTP/1.0" 200 1097+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:54 -0700] "GET /images/educbut.gif HTTP/1.0" 200 1246+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:54 -0700] "GET /images/ganbut.gif HTTP/1.0" 200 1414+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:54 -0700] "GET /images/healbut.gif HTTP/1.0" 200 1492+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:54 -0700] "GET /images/womenbut.gif HTTP/1.0" 200 1367+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:55 -0700] "GET /images/wordo35d.gif HTTP/1.0" 200 7089+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:56 -0700] "GET /images/candles3.jpg HTTP/1.0" 200 5240+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:56 -0700] "GET /images/mombaby4.jpg HTTP/1.0" 200 6718+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:56 -0700] "GET /images/penhand3.gif HTTP/1.0" 200 1181+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:40:59 -0700] "GET /images/womland2.jpg HTTP/1.0" 200 10884+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:00 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:02 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:03 -0700] "GET /images/helpbut.gif HTTP/1.0" 200 536+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:05 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:05 -0700] "GET /images/kids3.gif HTTP/1.0" 200 8552+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:09 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+204.48.151.245 - - [16/Oct/1997:08:41:21 -0700] "GET /images/aboutbux.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:41:21 -0700] "GET /images/cabutx.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:41:22 -0700] "GET /images/joinbutx.gif HTTP/1.0" 304 -+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:37 -0700] "GET /images/ai_emb2.gif HTTP/1.0" 200 2189+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:37 -0700] "GET /tools/dot_clea.gif HTTP/1.0" 200 43+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:39 -0700] "GET /ainews.html HTTP/1.0" 200 13435+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:39 -0700] "GET /spanish/images/spespbut.gif HTTP/1.0" 200 427+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:41 -0700] "GET /images/refhand4.gif HTTP/1.0" 200 6789+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:44 -0700] "GET /images/newslogo.gif HTTP/1.0" 200 17448+204.48.151.245 - - [16/Oct/1997:08:41:45 -0700] "GET /urgact/contact.html HTTP/1.0" 200 882+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:52 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:52 -0700] "GET /images/pubbut.gif HTTP/1.0" 200 1291+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:53 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:53 -0700] "GET /images/joinbut.gif HTTP/1.0" 200 409+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:41:58 -0700] "GET /images/countbut.gif HTTP/1.0" 200 1673+204.48.151.245 - - [16/Oct/1997:08:42:04 -0700] "GET /index.html HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:06 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+204.48.151.245 - - [16/Oct/1997:08:42:15 -0700] "GET /joinai.html HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:18 -0700] "GET /images/aboutbut.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:18 -0700] "GET /images/homebut.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:20 -0700] "GET /images/cabut.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:23 -0700] "GET /images/amnesty.gif HTTP/1.0" 304 -+204.48.151.245 - - [16/Oct/1997:08:42:24 -0700] "GET /images/newbut.gif HTTP/1.0" 304 -+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:37 -0700] "GET /candatop.html HTTP/1.0" 200 10629+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:38 -0700] "GET /images/done.gif HTTP/1.0" 200 4785+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:40 -0700] "GET /images/candalog.gif HTTP/1.0" 200 8638+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:41 -0700] "GET /images/reyes.gif HTTP/1.0" 200 10859+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:42 -0700] "GET /images/reddash2.gif HTTP/1.0" 200 237+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:43 -0700] "GET /images/rally4.jpg HTTP/1.0" 200 7352+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:44 -0700] "GET /images/hasene2.gif HTTP/1.0" 200 8833+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:44 -0700] "GET /images/kids5.jpg HTTP/1.0" 200 2903+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:45 -0700] "GET /images/refrun1.gif HTTP/1.0" 200 836+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:46 -0700] "GET /images/nigpost1.gif HTTP/1.0" 200 4429+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:46 -0700] "GET /images/turkboy.gif HTTP/1.0" 200 4625+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:48 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:43:51 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:44:33 -0700] "GET /images/linebrn.gif HTTP/1.0" 200 308+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:44:33 -0700] "GET /images/logo2.gif HTTP/1.0" 200 6343+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:44:37 -0700] "GET /weeklyua.html HTTP/1.0" 200 11321+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:45:00 -0700] "GET /about.html HTTP/1.0" 200 6902+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:45:01 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:45:01 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:45:03 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:45:07 -0700] "GET /images/where.gif HTTP/1.0" 200 605+ppp48.centraltx.net - - [16/Oct/1997:08:49:35 -0700] "GET / HTTP/1.0" 200 3082+ppp48.centraltx.net - - [16/Oct/1997:08:49:38 -0700] "GET /images/bsilk7.gif HTTP/1.0" 404 170+ppp48.centraltx.net - - [16/Oct/1997:08:49:47 -0700] "GET /images/spot5.gif HTTP/1.0" 200 9372+ppp48.centraltx.net - - [16/Oct/1997:08:49:53 -0700] "GET /joinai.html HTTP/1.0" 200 4054+ppp48.centraltx.net - - [16/Oct/1997:08:49:55 -0700] "GET /images/amnesty.gif HTTP/1.0" 200 1158+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:56 -0700] "GET /about/history.html HTTP/1.0" 200 10342+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:56 -0700] "GET /images/aiusared.gif HTTP/1.0" 200 2725+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:56 -0700] "GET /images/blkcnd2.gif HTTP/1.0" 200 1082+ppp48.centraltx.net - - [16/Oct/1997:08:49:58 -0700] "GET /images/homebut.gif HTTP/1.0" 200 518+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:59 -0700] "GET /about/images/airmail2.jpg HTTP/1.0" 200 7820+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:59 -0700] "GET /about/images/backtono.gif HTTP/1.0" 200 2367+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:49:59 -0700] "GET /about/images/sagan4.gif HTTP/1.0" 200 3596+ppp48.centraltx.net - - [16/Oct/1997:08:49:59 -0700] "GET /images/aboutbut.gif HTTP/1.0" 200 1277+ppp48.centraltx.net - - [16/Oct/1997:08:49:59 -0700] "GET /images/pnbutx.gif HTTP/1.0" 200 1027+ppp48.centraltx.net - - [16/Oct/1997:08:50:00 -0700] "GET /images/cabut.gif HTTP/1.0" 200 1425+ppp48.centraltx.net - - [16/Oct/1997:08:50:00 -0700] "GET /images/newbut.gif HTTP/1.0" 200 1357+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:50:01 -0700] "GET /images/wamwer6.jpg HTTP/1.0" 200 9786+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:50:04 -0700] "GET /about/images/coverbut.gif HTTP/1.0" 200 400+shadow-01.sturgeon.ab.ca - - [16/Oct/1997:08:50:07 -0700] "GET /about/images/masthd3.gif HTTP/1.0" 200 33250+ppp48.centraltx.net - - [16/Oct/1997:08:50:09 -0700] "GET /images/spot5.gif HTTP/1.0" 200 3855+ppp48.centraltx.net - - [16/Oct/1997:08:50:15 -0700] "GET /about.html HTTP/1.0" 200 6902+ppp48.centraltx.net - - [16/Oct/1997:08:50:19 -0700] "GET /images/howbut.gif HTTP/1.0" 200 509+ppp48.centraltx.net - - [16/Oct/1997:08:50:20 -0700] "GET /images/whobut.gif HTTP/1.0" 200 505+ppp48.centraltx.net - - [16/Oct/1997:08:50:22 -0700] "GET /images/netbut.gif HTTP/1.0" 200 1191+ppp48.centraltx.net - - [16/Oct/1997:08:50:24 -0700] "GET /images/whatbut.gif HTTP/1.0" 200 526+ppp48.centraltx.net - - [16/Oct/1997:08:50:25 -0700] "GET /images/eventbut.gif HTTP/1.0" 200 380+ppp48.centraltx.net - - [16/Oct/1997:08:50:27 -0700] "GET /images/aalogo.gif HTTP/1.0" 200 15293+ecarh29c.nortel.ca - - [16/Oct/1997:08:50:34 -0700] "GET /country/balkans HTTP/1.0" 301 196+ecarh29c.nortel.ca - - [16/Oct/1997:08:50:35 -0700] "GET /country/balkans/ HTTP/1.0" 200 2778+ecarh29c.nortel.ca - - [16/Oct/1997:08:50:38 -0700] "GET /country/balkans/images/dot.gif HTTP/1.0" 200 46+ecarh29c.nortel.ca - - [16/Oct/1997:08:50:38 -0700] "GET /country/balkans/images/head.gif HTTP/1.0" 200 2908+ppp48.centraltx.net - - [16/Oct/1997:08:50:40 -0700] "GET /quiz.html HTTP/1.0" 200 10126+ecarh29c.nortel.ca - - [16/Oct/1997:08:50:41 -0700] "GET /country/balkans/images/bosnia.gif HTTP/1.0" 200 638+ppp48.centraltx.net - - [16/Oct/1997:08:50:42 -0700] "GET /images/dot_clea.gif HTTP/1.0" 200 43
+ Examples/data/ai.big view
file too large to diff
+ Examples/data/binTest.a view
@@ -0,0 +1,1 @@+25 23 300 -400 899 9876 -98744 97687676543 -98765432187
+ Examples/data/binTest.b view
binary file changed (absent → 32 bytes)
+ Examples/data/binary view
@@ -0,0 +1,1 @@+ª»ÌÝccdd
+ Examples/data/calls10.a view
@@ -0,0 +1,11 @@+221 2360199 936 3615299 96977709 71+221 2360399 855 5445599 96978527 126+221 2390199 974 4298199 96980122 990+221 2390399 855 5404599 96976885 35+222 2332099 426 6814599 96977173 4850+222 2332099 -15 9999999 96978457 533+222 2340599 855 8442799 96980047 8+222 2341299 855 7081599 96979104 11+223 2340099 855 2484499 96977739 564+223 2340199 -15 9999999 96979345 143+
+ Examples/data/calls10.b view
binary file changed (absent → 240 bytes)
+ Examples/data/genBin.c view
@@ -0,0 +1,40 @@+#include <stdio.h>++/* Reads ascii call detail records from stdin.+ * Writes scampRec binary call detail records on stdout.+ */++typedef struct+{+ unsigned char uc;+ signed char sc;+ unsigned short us;+ signed short ss;+ signed short ss2;+ unsigned int ui;+ signed int si;+ unsigned long long ull;+ signed long long sll;+} binRec_t;++++int readAscii(FILE *in, binRec_t *r){+ int success = fscanf(in, "%hhu %hhd %hu %hd %hd %u %d %llu %lld\n",+ &(r->uc), &(r->sc), + &(r->us), &(r->ss), &(r->ss2),+ &(r->ui), &(r->si),+ &(r->ull),&(r->sll)); + return success;+}++void writeBinary(FILE *out, binRec_t *r){+ fwrite(r, sizeof(binRec_t), 1, out);+}++int main(){+ binRec_t current;+ while (readAscii(stdin, ¤t) != EOF)+ writeBinary(stdout, ¤t);+ return 0;+}
+ Examples/data/test_file view
@@ -0,0 +1,3 @@+8,Hermione+3,Ron+5,Harry
+ LICENSE view
@@ -0,0 +1,24 @@+The code in pads-haskell is released under the license below. ++The MIT License (MIT)++Copyright (c) 2011 Kathleen Fisher, John Launchbury, and AT&T Intellectual+Property. All rights reserved.++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+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+SOFTWARE.
+ Language/Pads/BaseTypes.hs view
@@ -0,0 +1,155 @@+{-# LANGUAGE FlexibleContexts, TypeFamilies, TemplateHaskell, QuasiQuotes, DeriveDataTypeable, ScopedTypeVariables, MultiParamTypeClasses,+ FlexibleInstances, TypeSynonymInstances, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.BaseTypes+ Description : Base types provided by Pads+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ Some useful Pads types (parsers) implemented by the code generator in lieu of+ writing them by hand.++-}++module Language.Pads.BaseTypes where++import Language.Pads.Source+import Language.Pads.Errors +import Language.Pads.Generic+import Language.Pads.MetaData+import Language.Pads.CoreBaseTypes+import Language.Pads.Quote+import Language.Pads.RegExp+import Language.Pads.PadsPrinter+import Data.Time+import System.Locale as Locale+import Text.PrettyPrint.Mainland (text)+import Text.PrettyPrint.Mainland.Class++import qualified Data.Char as C+import qualified Data.List as L+import Data.Data+import qualified Data.ByteString as B ++[pads|+-- string that stops in a newline+type StringEOR = [Char] terminator EOR+type Line a = (a, EOR)+type StringLn = [Char] terminator (Try EOR)+type StringLnP (p :: String -> Bool) = constrain s :: StringLn where <| p s |> +type StringESCLn (p :: (Char, [Char])) = StringPESC <|(True, p)|> +type StringESC (p :: (Char, [Char])) = StringPESC <|(False, p)|> ++data PMaybe a = PJust a+ | PNothing Void+obtain Maybe a from PMaybe a using <|(pm2m,m2pm)|>++|]++-- | Pads maybe to Haskell maybe+pm2m :: Span -> (PMaybe a, PMaybe_md a_md) -> (Maybe a, Maybe_md a_md)+pm2m p (PJust x, md) = (Just x, md)+pm2m p (PNothing,md) = (Nothing,md)++-- | Haskell maybe to Pads maybe+m2pm :: (Maybe a, Maybe_md a_md) -> (PMaybe a, PMaybe_md a_md)+m2pm (Just x, md) = (PJust x, md)+m2pm (Nothing,md) = (PNothing,md)+++[pads|+type Lit (x::String) = (Void, x)+type LitRE (x::RE) = (Void, x)+|]++[pads| obtain Bool from Bytes 1 using <|(bTobl,blTob)|> |]+-- | Bytes to Bool+bTobl :: Span -> (Bytes,Bytes_md) -> (Bool,Bool_md)+bTobl p (bytes,md) = (fromIntegral (bytes `B.index` 0)==(1::Int), md)+-- | Bool to Bytes+blTob :: (Bool,Bool_md) -> (Bytes,Bytes_md)+blTob (b,md) = (B.singleton (if b then 1 else 0), md)+++[pads| type DateFSE (fmt :: String, se :: RE) = obtain UTCTime from StringSE se using <| (strToUTC fmt, utcToStr fmt) |> + type DateFC (fmt::String, c::Char) = DateFSE <|(fmt, RE ("[" ++ [c] ++ "]")) |> |] ++-- | Coordinated universal time Pads metadata type+type UTCTime_md = Base_md+instance Pretty UTCTime where+ ppr utc = text (show utc)++-- | UTC parser from a string based on Haskell builtin UTC parser.+strToUTC :: String -> Span -> (StringSE, Base_md) -> (UTCTime, Base_md)+strToUTC fmt pos (input, input_bmd) = + case parseTimeM True Data.Time.defaultTimeLocale fmt input of + Nothing -> (gdef, mergeBaseMDs [errPD, input_bmd])+ Just t -> (t, input_bmd)+ where+ errPD = mkErrBasePD (TransformToDstFail "DateFSE" input " (conversion failed)") (Just pos)++-- | Default time of: 0h Nov 17, 1858+uTCTime_def = UTCTime (ModifiedJulianDay 0) (secondsToDiffTime 0)++-- | Format a UTC instance as a string.+utcToStr :: String -> (UTCTime, Base_md) -> (StringSE, Base_md) +utcToStr fmt (utcTime, bmd) = (formatTime Data.Time.defaultTimeLocale fmt utcTime, bmd)+++[pads| type TimeZoneSE (se :: RE) = obtain TimeZone from StringSE se using <| (strToTz, tzToStr) |> + type TimeZoneC (c::Char) = TimeZoneSE <|RE ("[" ++ [c] ++ "]") |> |] ++type TimeZone_md = Base_md+instance Pretty TimeZone where+ ppr tz = text (show tz)++-- | Timezone parser+strToTz :: Span -> (StringSE, Base_md) -> (TimeZone, Base_md)+strToTz pos (input, input_bmd) = + case parseTimeM True Data.Time.defaultTimeLocale "%z" input of + Nothing -> (gdef, mergeBaseMDs [mkErrBasePD (TransformToDstFail "TimeZoneSE" input " (conversion failed)") (Just pos), input_bmd])+ Just t -> (t, input_bmd)++-- | Timezone formatter+tzToStr :: (TimeZone, Base_md) -> (StringSE, Base_md) +tzToStr (tz, bmd) = (h ++ ":" ++ m, bmd)+ where (h,m) = splitAt 3 (show tz)++timeZone_def = utc++[pads| type Phex32FW (size :: Int) = obtain Int from StringFW size using <| (hexStr2Int,int2HexStr size) |> |] ++-- | Transform a hexadecimal string to an int+hexStr2Int :: Span -> (StringFW, Base_md) -> (Int, Base_md)+hexStr2Int src_pos (s,md) = if good then (intList2Int ints 0, md)+ else (0, mkErrBasePD (TransformToDstFail "StrHex" s " (non-hex digit)") (Just src_pos))+ where+ hc2int c = if C.isHexDigit c then (C.digitToInt c,True) else (0,False)+ (ints,bools) = unzip (map hc2int s)+ good = (L.and bools) && (length ints > 0)+ intList2Int digits a = case digits of+ [] -> a+ (d:ds) -> intList2Int ds ((16 * a) + d)++-- | Transform an int into a hexadecimal string+int2HexStr :: Int -> (Int, Base_md) -> (StringFW, Base_md)+int2HexStr size (x,md)+ | length result == size && wasPos = (result, md) + | not wasPos = (Prelude.take size result, + mkErrBasePD (TransformToSrcFail "StrHex" (show x) (" (Expected positive number)")) Nothing)+ | otherwise = (Prelude.take size result,+ mkErrBasePD (TransformToSrcFail "StrHex" (show x) (" (too big to fit in "++ (show size) ++" characters)")) Nothing)+ where+ cvt rest a = if rest < 16 then {- reverse $ -} (C.intToDigit rest) : a+ else cvt (rest `div` 16) (C.intToDigit (rest `mod` 16) : a)+ (wasPos,x') = if x < 0 then (False, -x) else (True, x)+ temp = cvt x' []+ padding = size - (length temp)+ stutter c n = if n <= 0 then [] else c : (stutter c (n-1))+ result = (stutter '0' padding) ++ temp+
+ Language/Pads/CodeGen.hs view
@@ -0,0 +1,1227 @@+{-# LANGUAGE TupleSections, ViewPatterns, TemplateHaskell, NamedFieldPuns, ScopedTypeVariables,+ RecordWildCards, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.CodeGen+ Description : Template Haskell based code generator+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ To the best of my knowledge, all functions defined herein are only ever run at+ compile time. These compile time functions are intended to be used in a+ quasiquoted context where the runtime system support modules have been properly+ imported. See "Examples.First" for the necessary imports.++ The crucial piece of the code generator is 'genParseTy', which translates Pads+ syntactic forms into Haskell code for parsing them.++-}+module Language.Pads.CodeGen where++import Language.Pads.Syntax as PS+import Language.Pads.MetaData+import Language.Pads.Generic+import Language.Pads.PadsParser+import Language.Pads.CoreBaseTypes+import Language.Pads.TH+import qualified Language.Pads.Errors as E+import qualified Language.Pads.Source as S+import Language.Pads.PadsPrinter++import Language.Haskell.TH +import Language.Haskell.Syntax++import Data.Data+import Data.Char+import qualified Data.Map as M+import qualified Data.List as List+import qualified Data.Maybe as Maybe+import Control.Monad+import Language.Haskell.TH.Syntax (lift)++import qualified Debug.Trace as D++-- | +type BString = S.RawStream++-- | A function passed into the code generator which gets called on data type+-- declarations and returns a list of standalone-deriving declarations.+-- Presently this is unused by Pads.+type Derivation = Dec -> Q [Dec]++-- | Top level code gen function from Pads decls to Haskell decls+make_pads_declarations :: [PadsDecl] -> Q [Dec]+make_pads_declarations = make_pads_declarations' (const $ return [])++-- | Top level code gen function from Pads decls to Haskell expression with just+-- the PADS AST (no parser codegen)+make_pads_asts :: [PadsDecl] -> Q Exp+make_pads_asts = let+ mpa pd@(PadsDeclType n _ _ _) = [| ($(litE $ stringL n), $(lift pd)) |]+ mpa pd@(PadsDeclData n _ _ _ _) = [| ($(litE $ stringL n), $(lift pd)) |]+ mpa pd@(PadsDeclNew n _ _ _ _) = [| ($(litE $ stringL n), $(lift pd)) |]+ mpa pd@(PadsDeclObtain n _ _ _) = [| ($(litE $ stringL n), $(lift pd)) |]+ in listE . (map mpa)++-- | Top level code gen function from Pads decls to Haskell decls with the+-- specified list of type classes for all of the generated Pads types to derive.+make_pads_declarations' :: Derivation -> [PadsDecl] -> Q [Dec]+make_pads_declarations' derivation ds = fmap concat (mapM (genPadsDecl derivation) ds)++-------------------------------------------------------------------------------+-- * Generating Declarations and Code from Individual Pads Declarations++genPadsDecl :: Derivation -> PadsDecl -> Q [Dec]+-- ^ Generate all the top level Haskell declarations associated with a single+-- Pads declaration.+genPadsDecl derivation pd@(PadsDeclType name args pat padsTy) = do+ let typeDecs = mkTyRepMDDecl name args padsTy+ parseM <- genPadsParseM name args pat padsTy+ parseS <- genPadsParseS name args pat+ printFL <- genPadsPrintFL name args pat padsTy+ def <- genPadsDef name args pat padsTy+ let sigs = mkPadsSignature name args (fmap patType pat)+ ast <- astDecl name pd+ return $ typeDecs ++ parseM ++ parseS ++ printFL ++ def ++ sigs++genPadsDecl derivation pd@(PadsDeclData name args pat padsData derives) = do+ dataDecs <- mkDataRepMDDecl derivation name args padsData derives+ parseM <- genPadsDataParseM name args pat padsData + parseS <- genPadsParseS name args pat+ printFL <- genPadsDataPrintFL name args pat padsData+ def <- genPadsDataDef name args pat padsData+ let instances = mkPadsInstance name args (fmap patType pat)+ let sigs = mkPadsSignature name args (fmap patType pat)+ ast <- astDecl name pd+ return $ dataDecs ++ parseM ++ parseS ++ printFL ++ def ++ instances ++ sigs++genPadsDecl derivation pd@(PadsDeclNew name args pat branch derives) = do+ dataDecs <- mkNewRepMDDecl derivation name args branch derives+ parseM <- genPadsNewParseM name args pat branch + parseS <- genPadsParseS name args pat+ printFL <- genPadsNewPrintFL name args pat branch+ def <- genPadsNewDef name args pat branch+ let instances = mkPadsInstance name args (fmap patType pat)+ let sigs = mkPadsSignature name args (fmap patType pat)+ ast <- astDecl name pd+ return $ dataDecs ++ parseM ++ parseS ++ printFL ++ def ++ instances ++ sigs++genPadsDecl derivation pd@(PadsDeclObtain name args padsTy exp) = do+ let mdDec = mkObtainMDDecl name args padsTy+ parseM <- genPadsObtainParseM name args padsTy exp+ parseS <- genPadsParseS name args Nothing+ printFL <- genPadsObtainPrintFL name args padsTy exp+ def <- genPadsObtainDef name args padsTy exp+ let sigs = mkPadsSignature name args Nothing+ ast <- astDecl name pd+ return $ mdDec ++ parseM ++ parseS ++ printFL ++ def ++ sigs++-- | A Haskell declaration containing the literal Pads AST representation of a+-- Pads description (the syntax of Pads encoded as Haskell data constructors)+astDecl name pd = funD (mkName $ "ast_" ++ name) [clause [] (normalB $ lift pd) []]++-- | The Haskell 'Type' of a Haskell pattern 'Pat'.+patType :: Pat -> Type+patType p = case p of+ LitP lit -> case lit of+ CharL c -> VarT ''Char+ StringL s -> VarT ''String+ TupP ps -> mkTupleT (map patType ps)+ SigP p t -> t+ ParensP p -> patType p+ otherwise -> error $ show p++-------------------------------------------------------------------------------+-- * Generating Rep/MD Type Declarations++-- | Make the type declarations for the representation and the metadata of a+-- Pads-defined type, @'PadsTy'@.+mkTyRepMDDecl :: UString -> [UString] -> PadsTy -> [Dec]+mkTyRepMDDecl name args ty = [repType, mdType]+ where+ repType = TySynD (mkRepName name) tyArgs (mkRepTy ty)+ mdType = TySynD (mkMDName name) tyArgsMD (mkMDTy False ty)+ tyArgs = map (PlainTV . mkName) args+ tyArgsMD = map (PlainTV . mkName . (++"_md")) args++-------------------------------------------------------------------------------+-- * Generating Rep/MD Data Declarations++-- | Make the data type declarations for the representation and the metadata of+-- a Pads-defined data type, @'PadsData'@.+mkDataRepMDDecl :: Derivation -> UString -> [LString] -> PadsData -> [QString] -> Q [Dec]+mkDataRepMDDecl derivation name args branches ds = do+ bs' <- mapM (return . mkMDUnion) bs+ imdDecl <- dataD (cxt []) (mkIMDName name) tyArgsMD Nothing bs' [derive []]+ bs'' <- mapM (return . mkRepUnion) bs+ --let ds' = map (conT . mkName . qName) ds+ dataDecl <- dataD (cxt []) (mkRepName name) tyArgs Nothing bs'' [derive ds]+ derivesData <- derivation dataDecl+ derivesImd <- derivation imdDecl+ let mdName = mkMDName name+ --let bT = bangType (mkStrict NotStrict)+ --let mdDeclConstr = normalC mdName $ [bT $ return $ mkTupleT [ConT '' Base_md, imdApp]]+ --mdDecl <- newtypeD (cxt []) mdName tyArgsMD Nothing mdDeclConstr []+ let mdDecl = TySynD (mkMDName name) tyArgsMD (mkTupleT [ConT ''Base_md, imdApp])+ return $ [dataDecl, mdDecl, imdDecl] ++ derivesData ++ derivesImd+ where+ tyArgs = map (PlainTV . mkName) args+ tyArgsMD = map (PlainTV . mkName . (++"_md")) args+ imdApp = foldl AppT (ConT (mkIMDName name)) (map (VarT . mkName . (++"_md")) args)+ bs = case branches of+ PUnion bnchs -> bnchs+ PSwitch exp pbs -> [b | (p,b) <- pbs]++-- | Convert a Pads strictness annotation into the appropriate Haskell+-- strictness annotation in the template haskell Q monad for splicing.+mkStrict :: PadsStrict -> Q Strict+mkStrict NotStrict = bang noSourceUnpackedness noSourceStrictness -- i.e. notStrict+mkStrict IsStrict = bang noSourceUnpackedness sourceStrict -- i.e. isStrict++-- | Make the Haskell data type *constructor* (@'normalC'@ and @'recC'@) for the+-- given fragment of a Pads type (@'BranchInfo'@).+mkRepUnion :: BranchInfo -> ConQ+mkRepUnion (BConstr c args expM) = normalC (mkConstrName c) reps+ where reps = [bangType (mkStrict strict) (return $ mkRepTy ty) | (strict,ty) <- args, hasRep ty]+mkRepUnion (BRecord c fields expM) = recC (mkConstrName c) lreps+ where lreps = [ varBangType+ (mkName l)+ (bangType (mkStrict strict)+ (return $ mkRepTy ty))+ | (Just l,(strict,ty),_) <- fields, hasRep ty]++-- | Make the 'Con' metadata constructor definition for an individual branch of+-- a Pads type, which gets used to create the Haskell data type declaration for+-- the metadata of a Pads type.+mkMDUnion :: BranchInfo -> Q Con+mkMDUnion (BConstr c args expM) = normalC (mkConstrIMDName c) mds+ where + mds = [bangType (mkStrict NotStrict) (return $ mkMDTy False ty) | (_,ty) <- args] --MD , hasRep ty]+mkMDUnion (BRecord c fields expM) = do+ { let lmds = [ do { fn <- genLabMDName "m" lM+ ; varBangType fn (bangType (mkStrict NotStrict) (return $ mkMDTy False ty))+ }+ | (lM,(_,ty),_) <- fields+ ]+ ; recC (mkConstrIMDName c) lmds+ }+--MD lmds <- return [(mkFieldMDName l,NotStrict,mkMDTy ty) | (Just l,(_,ty),_) <- fields, hasRep ty]++-- | Make the type context of a data declaration, consisting of the typeclasses+-- instanced by Pads data types.+--derive :: [QString] -> CxtQ+derive :: [QString] -> DerivClauseQ+derive ds = derivClause Nothing $ map (conT . mkName . qName) ds+ ++ [conT $ mkName d | d<-["Show","Eq","Typeable","Data","Ord"], not (d `elem` map last ds)]++-------------------------------------------------------------------------------+-- * Generating Rep/MD Newtype Declarations++-- | Construct the newtype Haskell data declaration from a Pads type defined+-- using the "newtype" keyword.+mkNewRepMDDecl :: Derivation -> UString -> [LString] -> BranchInfo -> [QString] -> Q [Dec]+mkNewRepMDDecl derivation name args branch ds = do+ imdDecl <- newtypeD (cxt []) (mkIMDName name) tyArgsMD Nothing (mkMDUnion branch) [derive []]+ let ds' = map (conT . mkName . qName) ds+ dataDecl <- newtypeD (cxt []) (mkRepName name) tyArgs Nothing (mkRepUnion branch) [derive ds]+ --[derivClause Nothing ds']+ derivesData <- derivation dataDecl+ derivesImd <- derivation imdDecl+ return $ [dataDecl, mdDecl, imdDecl] ++ derivesData ++ derivesImd+ where+ mdDecl = TySynD (mkMDName name) tyArgsMD (mkTupleT [ConT ''Base_md, imdApp])+ tyArgs = map (PlainTV . mkName) args+ tyArgsMD = map (PlainTV . mkName . (++"_md")) args+ imdApp = foldl AppT (ConT (mkIMDName name)) (map (VarT . mkName . (++"_md")) args)++-------------------------------------------------------------------------------+-- * Generating MD Type from Obtain Declarations+-- Design decision not to do this.++-- | Construct the Haskell type synonym declaration for a Pads type declared+-- using the "obtain" keyword.+mkObtainMDDecl :: UString -> [UString] -> PadsTy -> [Dec]+mkObtainMDDecl name args ty+ = [mdType]+ where+ mdType = TySynD (mkMDName name) tyArgsMD (mkMDTy False ty)+ tyArgsMD = map (PlainTV . mkName . (++"_md")) args++-------------------------------------------------------------------------------+-- * Generating Representation Type of a Type Expression++-- | Make the template haskell 'Type' for the given 'PadsTy' pads type, to be+-- used anywhere in generated Haskell code where the representation type is+-- expected.+mkRepTy :: PadsTy -> Type+mkRepTy ty = case ty of+ PPartition pty exp -> mkRepTy pty+ PConstrain pat pty exp -> mkRepTy pty + PTransform tySrc tyDest exp -> mkRepTy tyDest + PList ty sep term -> ListT `AppT` mkRepTy ty+ PValue exp pty -> mkRepTy pty + PApp tys expM -> foldl1 AppT [mkRepTy ty | ty <- tys, hasRep ty]+ PTuple tys -> mkRepTuple tys+ PExpression _ -> ConT ''()+ PTycon c -> ConT (mkRepQName c)+ PTyvar v -> VarT (mkName v) ++-- | Make the template haskell 'Type' corresponding to a tuple consisting of the+-- given pads types given in list form at compile time '[PadsTy]'.+mkRepTuple :: [PadsTy] -> Type+mkRepTuple tys = case reps of + [] -> ConT ''()+ [ty] -> ty+ (t:ts) -> mkTupleT reps+ where+ reps = [mkRepTy ty | ty <- tys, hasRep ty]++-------------------------------------------------------------------------------+-- * Generating Meta-Data Representation of Type Expression++-- | Make the template haskell 'Type' corresponding to the externally visible+-- metadata of a given 'PadsTy'. The boolean indicates whether or not Pads type+-- variables 'PTyvar's should be put in a 'Meta' constructor or merely stuffed+-- into a 'VarT' and appended with "_md" postfix. Currently we always do the+-- latter (all calls to 'mkMDTy' give False as the boolean).+mkMDTy :: Bool -> PadsTy -> Type+mkMDTy isMeta ty = case ty of+ PPartition pty exp -> mkMDTy isMeta pty+ PConstrain pat pty exp -> mkMDTy isMeta pty + PTransform src dest exp -> mkMDTy isMeta dest + PList ty sep term -> mkTupleT [ConT ''Base_md, ListT `AppT` mkMDTy isMeta ty]+ PValue exp pty -> mkMDTy isMeta pty + PApp tys expM -> foldl1 AppT [mkMDTy isMeta ty | ty <- tys] --MD , hasRep ty]+ PTuple tys -> mkMDTuple isMeta tys+ PExpression _ -> ConT ''Base_md+ PTycon c -> ConT (mkMDQName c)+ PTyvar v -> if isMeta+ then AppT (ConT ''Meta) (VarT $ mkName v)+ else VarT (mkName $ v ++ "_md") ++-- | Make the template haskell 'Type' corresponding to a Haskell tuple type+-- consisting of the metadata types for the given Pads types '[PadsTy]'.+mkMDTuple :: Bool -> [PadsTy] -> Type+mkMDTuple isMeta tys = case mds of + [] -> ConT ''Base_md+ [m] -> mkTupleT [ConT ''Base_md, m] + (m:ms) -> mkTupleT [ConT ''Base_md, mkTupleT mds]+ where+ mds = [mkMDTy isMeta ty | ty <- tys] --MD , hasRep ty]+++-------------------------------------------------------------------------------+-- * Generating Instance Declarations from Data / New Declarations++-- | Make the following instance and type instance declarations for a Pads data+-- type and new type declaration:+--+-- > [pads| data Foo (Bar1, Bar2, Bar3) = Foo+-- > { i1 :: Bar1+-- > , i2 :: Bar2 i1+-- > , i3 :: Bar3 i2+-- > } |]+--+-- > instance Pads1 (Bar1, Bar2, Bar3) Foo Foo_md where+-- > parsePP1 = foo_parseM+-- > printFL1 = foo_printFL+-- > def1 = foo_def+-- > type instance Meta Foo = Foo_md+-- > type instance PadsArg Foo = (Bar1, Bar2, Bar3)+mkPadsInstance :: UString -> [LString] -> Maybe Type -> [Dec]+mkPadsInstance str args mb@(Nothing)+ = buildInst mb str args (ConT ''Pads1 `AppT` TupleT 0)+mkPadsInstance str args mb@(Just ety) + = buildInst mb str args (ConT ''Pads1 `AppT` ety)++-- | See 'mkPadsInstance' above.+buildInst mb str args pads =+ [ InstanceD Nothing ctx inst [parsePP_method, printFL_method,def_method]+ , TySynInstD ''Meta $ TySynEqn [ty_name] meta_ty+ , TySynInstD ''PadsArg $ TySynEqn [ty_name] arg_ty+ ]+ where+ arg_ty = case mb of+ Nothing -> TupleT 0+ Just ety -> ety+ mbarg = case mb of+ Nothing -> [TupP []]+ Just _ -> []+ inst = applyT [pads, ty_name, md_ty]+ ty_name = applyT (ConT (mkName str) : map fst argpairs)+ md_ty = applyT (ConT (mkMDName str) : map snd argpairs)+ meta_ty = applyT (ConT (mkMDName str) : metas)+ parsePP_method = FunD 'parsePP1 [Clause mbarg (NormalB (applyE (VarE (mkTyParserName str) : [VarE 'parsePP | a <- args]))) []]+ printFL_method = + if str == "Entry"+ then FunD 'printFL1 [Clause mbarg (NormalB $ VarE $ mkName "undefined") []]+ else FunD 'printFL1 [Clause mbarg (NormalB (applyE (VarE (mkTyPrinterName str) : [VarE 'printFL | a <- args]))) []]+ def_method = FunD 'def1 [Clause mbarg (NormalB (applyE (VarE (mkTyDefName str) : [VarE 'def | a <- args]))) []]+ argpair n = (VarT (mkName n),VarT (mkName $ n++"_md"))+ meta n = AppT (ConT ''Meta) (VarT $ mkName n)+ argpairs = [argpair a | a <- args]+ metas = map meta args+ argtyvars = concat [[PlainTV (mkName a), PlainTV (mkName (a++"_md"))] | a <- args]++ ctx = [AppT (AppT (ConT ''Pads) r) m | (r,m) <- argpairs]++ padsprinter t t_md = AppT (ConT ''PadsPrinter) $ appT2 (TupleT 2) t t_md++ printer = case mb of+ Nothing -> padsprinter ty_name md_ty+ Just ety -> appT2 ArrowT ety (padsprinter ty_name md_ty)+++-- | Make the following type signatures, applicable for all the forms of a Pads+-- declaration:+--+-- > foo_printFL :: (Bar1, Bar2, Bar3) -> PadsPrinter (Foo, Foo_md)+-- > foo_def :: (Bar1, Bar2, Bar3) -> Foo+--+-- See 'mkPadsInstance' above for the definition of the Pads type "Foo".+mkPadsSignature :: UString -> [LString] -> Maybe Type -> [Dec]+mkPadsSignature str args mb@(Nothing)+ = buildSignature mb str args (ConT ''Pads)+mkPadsSignature str args mb@(Just ety) + = buildSignature mb str args (ConT ''Pads1 `AppT` ety)++-- | See 'mkPadsSignature' above.+buildSignature mb str args pads =+ if str == "Entry"+ then [def_signature]+ else [printFL_signature,def_signature]+ where+ mbarg = case mb of+ Nothing -> [TupP []]+ Just _ -> []+ inst = applyT [pads, ty_name, md_ty]+ ty_name = applyT (ConT (mkName str) : map (\(x,y,z) -> y) argpairs)+ md_ty = applyT (ConT (mkMDName str) : map (\(x,y,z) -> z) argpairs)+ meta_ty = applyT (ConT (mkMDName str) : metas)+ argpair n = (VarT (mkName $ n++"_arg"),VarT (mkName n),VarT (mkName $ n++"_md"))+ meta n = AppT (ConT ''Meta) (VarT $ mkName n)+ argpairs = [argpair a | a <- args]+ metas = map meta args+ argtyvars = concat [[PlainTV (mkName (a++"_arg")),PlainTV (mkName a), PlainTV (mkName (a++"_md"))] | a <- args]++ printerctx = concat $ [[AppT (ConT ''Data) r, AppT (ConT ''Data) m] | (arg,r,m) <- argpairs]+ defctx = concat $ [[AppT (ConT ''Data) r] | (arg,r,m) <- argpairs]++ padsprinter t t_md = AppT (ConT ''PadsPrinter) $ appT2 (TupleT 2) t t_md+ padsdef t t_md = t++ printer = case mb of+ Nothing -> padsprinter ty_name md_ty+ Just ety -> appT2 ArrowT ety (padsprinter ty_name md_ty)+ def = case mb of+ Nothing -> padsdef ty_name md_ty+ Just ety -> appT2 ArrowT ety (padsdef ty_name md_ty)++ printFL_signature = SigD (mkTyPrinterName str) $ ForallT argtyvars printerctx $ foldr (\a t -> let (a_arg,a_rep,a_md) = argpair a in appT2 ArrowT (padsprinter a_rep a_md) t) printer args+ def_signature = SigD (mkTyDefName str) $ ForallT argtyvars defctx $ foldr (\a t -> let (a_arg,a_rep,a_md) = argpair a in appT2 ArrowT (padsdef a_rep a_md) t) def args++-------------------------------------------------------------------------------+-- * Generating Parser Declaration from Type / Data / New Declarations++-- | Construct the function body and resulting declaration of the "_parseM"+-- function for a given 'PadsTy' type declaration.+genPadsParseM :: UString -> [LString] -> Maybe Pat -> PadsTy -> Q [Dec]+genPadsParseM name args patM padsTy = do + let body = genParseTy padsTy+ mkParserFunction name args patM body++-- | 'PadsData' data declaration flavour of the "_parseM" function.+genPadsDataParseM :: UString -> [LString] -> (Maybe Pat) -> PadsData -> Q [Dec] +genPadsDataParseM name args patM padsData = do + let body = genParseData padsData+ mkParserFunction name args patM body++-- | 'BranchInfo' new type declaration flavour of the "_parseM" function.+genPadsNewParseM :: UString -> [LString] -> (Maybe Pat) -> BranchInfo -> Q [Dec] +genPadsNewParseM name args patM branch = do + (dec,exp) <- genParseBranchInfo branch+ let body = letE [return dec] (return exp)+ mkParserFunction name args patM body++-- | Pads Obtain declaration flavour of the "_parseM" function.+genPadsObtainParseM :: UString -> [LString] -> PadsTy -> Exp -> Q [Dec]+genPadsObtainParseM name args padsTy exp = do+ let body = genParseTy (PTransform padsTy (PTycon [name]) exp)+ mkParserFunction name args Nothing body++-- | Construct the declaration for a function which monadically parses a Pads+-- type given the body of the function as input.+mkParserFunction :: UString -> [LString] -> Maybe Pat -> Q Exp -> Q [Dec]+mkParserFunction name args patM body+ = sequence $ if name == "Entry" then [sig,fun] else [fun]+ where+ fun = funD parserName [clause parserArgs (normalB body) []]+ sig = sigD parserName [t| PadsParser ($(conT $ mkConstrName name), (Base_md, $(conT $ mkConstrIMDName name))) |]+ parserName = mkTyParserName name+ parserArgs = map (varP . mkVarParserName) args ++ Maybe.maybeToList (return <$> patM)++-------------------------------------------------------------------------------+-- * Generating String-Parser Declaration++-- | Construct the "_parseS" function at compile time such that it makes a call+-- to 'parseStringInput' at runtime.+genPadsParseS :: UString -> [LString] -> Maybe Pat -> Q [Dec]+genPadsParseS name args patM = do + { body <- [| parseStringInput $(return parserWithArgs) |]+ ; return [ FunD (mkTyParserSName name) [Clause parserArgs (NormalB body) []] ]+ }+ where+ parserWithArgs = foldl1 AppE (VarE parserName : map patToExp parserArgs)+ parserName = mkTyParserName name + parserArgs = map (VarP . mkVarParserName) args ++ Maybe.maybeToList patM++-------------------------------------------------------------------------------+-- * Generating Parser from Type Expression++-- | This function only ever gets called at compile time in order to construct a+-- template haskell expression to be used somewhere in the body of a "_parseM"+-- function. This expression is the meat of the pads-haskell parsing algorithm+-- and semantics - we use metaprogramming to map the Pads syntax onto+-- expressions which return a tuple consisting of the parsed representation+-- followed by the metadata (with parse errors).+genParseTy :: PadsTy -> Q Exp+genParseTy pty = case pty of+ PConstrain pat ty exp -> genParseConstrain (return pat) ty (return exp)+ PTransform src dest exp -> genParseTyTrans src dest (return exp)+ PList ty sep term -> genParseList ty sep term+ PPartition ty exp -> genParsePartition ty exp+ PValue exp ty -> genParseValue exp+ PApp tys argE -> genParseTyApp tys argE+ PTuple tys -> genParseTuple tys+ PExpression exp -> genParseExp exp+ PTycon c -> return $ mkParseTycon c+ PTyvar v -> return $ mkParseTyvar v++-- | Simply generate a call to the runtime system function 'parseConstraint'+-- where the first argument is a Haskell expression spliced directly into the+-- call to 'parseConstraint' which parses the thing being constrained and the+-- second argument is the (Haskell) predicate function used to constrain the+-- Pads type.+genParseConstrain :: Q Pat -> PadsTy -> Q Exp -> Q Exp+genParseConstrain patQ ty expQ = [| parseConstraint $(genParseTy ty) $pred |]+ where+ pred = lamE [patQ, varP (mkName "md")] expQ++-- | Simply generate a call to the runtime system function 'parseTransform'+-- where the first argument is the spliced-in-place parser for the "source" Pads+-- type being transformed and the second argument is the (Haskell)+-- transformation function for producing something of the desired destination+-- type. Note that we can ignore the destination 'PadsTy' at compile time in+-- *this* function because the Haskell type checker will type check the result+-- of 'parseTransform' for us.+genParseTyTrans :: PadsTy -> PadsTy -> Q Exp -> Q Exp+genParseTyTrans src dest expQ+ = [| parseTransform $(genParseTy src) (fst $expQ) |]++-- | This compile time function figures out which runtime system support+-- function to generate a call to for parsing a Pads list type based on the+-- given separator Pads type and the desired termination condition 'TermCond'.+genParseList :: PadsTy -> (Maybe PadsTy) -> (Maybe TermCond) -> Q Exp+genParseList ty sep term =+ case (sep,term) of + (Nothing, Nothing) -> [| parseListNoSepNoTerm $(genParseTy ty) |]+ (Just sep, Nothing) -> [| parseListSepNoTerm $(genParseTy sep) $(genParseTy ty) |]+ (Nothing, Just (LLen lenE)) -> [| parseListNoSepLength $(return lenE) $(genParseTy ty) |]+ (Just sep, Just (LLen lenE)) -> [| parseListSepLength $(genParseTy sep) $(return lenE) $(genParseTy ty) |]+ (Nothing, Just (LTerm term))-> [| parseListNoSepTerm $(genParseTy term) $(genParseTy ty) |]+ (Just sep, Just (LTerm term))-> [| parseListSepTerm $(genParseTy sep) $(genParseTy term) $(genParseTy ty) |]++-- | Simply generate a call to the runtime system function 'parsePartition'+-- where the first argument is an expression for parsing the 'PadsTy' pads type+-- we're partitioning on and the second argument is the Haskell expression given+-- in the Pads syntactic form specifying the record discipline with which to+-- partition things. For example the following code:+--+-- > type Foo = (partition [Bar] using none)+--+-- declares a type Foo which is a list of Bars where Bars are separated by+-- nothing.+genParsePartition :: PadsTy -> Exp -> Q Exp+genParsePartition ty disc = [| parsePartition $(genParseTy ty) $(return disc) |]++-- | This compile time function generates code which wraps a Pads Value type's+-- Haskell expression in the appropriate type to be returned for use in the pads+-- parsing monad, namely of type 'PadsParser (rep, md)' where rep and md are the+-- representation and metadata type variables.+genParseValue :: Exp -> Q Exp+genParseValue exp = [| return ($(return exp), cleanBasePD) |]+--genParseValue exp = return $ AppE (VarE 'return) (TupE [exp,VarE 'cleanBasePD])++-- | Construct the sequentially-defined parser for a Pads tuple type.+genParseTuple :: [PadsTy] -> Q Exp+genParseTuple [] = [| return ((), cleanBasePD) |]+genParseTuple tys = do+ f_rep_name <- newName "f_rep"+ f_md_name <- newName "f_md"+ let f_rep = buildF_rep f_rep_name vars_frep+ f_rep_sig = buildF_rep_sig f_rep_name sigs_frep+ f_md = buildF_md f_md_name vars_fmd+ f_md_sig <- buildF_md_sig f_md_name tys+ body <- foldl parseNext [| return ($(dyn "f_rep"),$(dyn "f_md")) |] tys+ return (LetE [f_rep_sig,f_rep,f_md_sig,f_md] body)+ where+ vars_frep = [v | (v,t) <- zip vars_fmd tys, hasRep t]+ sigs_frep = [t | t <- tys, hasRep t]+ vars_fmd = [ mkName ("x"++show n) | n <- [1 .. length tys]] ++-- | Glom the generated parser for the given 'PadsTy' onto the given parser+-- using the '=@=' and '=@' runtime system operators.+parseNext :: Q Exp -> PadsTy -> Q Exp+parseNext prog t+ | hasRep t = [| $prog =@= $(genParseTy t) |]+ | otherwise = [| $prog =@ $(genParseTy t) |]++-- | Construct the "f_rep" let-bound function inside of a Pads tuple type for+-- uncurrying the result of parsing the tuple sequentially at runtime. The+-- "f_rep" function generated by *this* function gets passed into the '=@=' and+-- '=@' runtime system operators which call f_rep on the result of parsing each+-- of the members of the tuple.+buildF_rep :: Name -> [Name] -> Dec+buildF_rep name vars_frep+ = FunD name [Clause+ (map VarP vars_frep) (NormalB (TupE (map VarE vars_frep))) [] ]++isVarT (VarT _) = True+isVarT _ = False++buildF_md_sig :: Name -> [PadsTy] -> Q Dec+buildF_md_sig name ptys = do+ let tys = map (mkMDTy False) ptys+ mdRet = foldl AppT (TupleT $ length tys) tys+ retTy <- [t| (Base_md, $(return mdRet)) |]+ let sigTy = foldr1 (appT2 ArrowT) (tys ++ [retTy])+ varTs = filter isVarT tys+ varTNames = map (\(VarT t) -> PlainTV t) varTs+ sigT' = ForallT varTNames (map (AppT (ConT ''PadsMD)) varTs) sigTy+ return (case tys of+ [] -> SigD name $ TupleT 0+ (t:[]) -> SigD name $ appT2 ArrowT t t+ _ -> SigD name $ sigT')++-- | Same as 'buildF_rep' above but for the metadata instead of the parse+-- representation. In this case we need to pull off just the 'Base_md' from the+-- metadata resulting from whatever the parser returned to us for each of the+-- tuple results using the 'get_md_header' type class function provided by the+-- runtime system.+buildF_md :: Name -> [Name] -> Dec+buildF_md f_md_name vars_fmd+ = FunD f_md_name [Clause (map VarP vars_fmd) (NormalB body) []]+ where+ mdHeaders = [ VarE 'get_md_header `AppE` VarE xi | xi <- vars_fmd ]+ body = TupE [mkMergeBaseMDs mdHeaders, TupE (map VarE vars_fmd)]++buildF_rep_sig :: Name -> [PadsTy] -> Dec+buildF_rep_sig name ptys = let+ tys = map mkRepTy ptys+ retTy = foldl AppT (TupleT $ length tys) tys+ sigTy = foldr1 (appT2 ArrowT) (tys ++ [retTy])+ in (case tys of+ [] -> SigD name $ TupleT 0+ (t:[]) -> SigD name $ appT2 ArrowT t t+ _ -> SigD name $ sigTy)++-- | Generate a call to 'mergeBaseMDs'+mkMergeBaseMDs :: [Exp] -> Exp+mkMergeBaseMDs [e] = e+mkMergeBaseMDs es = VarE 'mergeBaseMDs `AppE` ListE es++-- | Construct a call to the 'litParse' runtime system type class function so+-- that we can parse a literal (Haskell) expression. The type of the expression+-- provided as a Haskell expression must be Literally Parseable ('LitParse' type+-- class), otherwise the code generated by *this* compile time function produces+-- a type error.+genParseExp :: Exp -> Q Exp+genParseExp exp = [| litParse $(return exp) |]++-- | Generate the parser for a Pads type application.+genParseTyApp :: [PadsTy] -> Maybe Exp -> Q Exp+genParseTyApp tys expM = do+ fs <- mapM genParseTy tys+ return (foldl1 AppE (fs ++ Maybe.maybeToList expM))++-- | Make the parser for a Pads type constructor - just return it as a Haskell+-- variable expression.+mkParseTycon :: QString -> Exp+mkParseTycon ["EOF"] = VarE 'eof_parseM+mkParseTycon ["EOR"] = VarE 'eor_parseM+mkParseTycon c = VarE (mkTyParserQName c)++-- | Make the parser for a Pads type variable - just return it as a Haskell+-- variable expression.+mkParseTyvar :: String -> Exp+mkParseTyvar v = VarE (mkVarParserName v) -- should gensym these, but probably ok++-------------------------------------------------------------------------------+-- * Generating Parsers from Union/Switch Expressions++-- | A data declaration in pads is either a union or a switch expression -+-- generate the template haskell for parsing them.+genParseData :: PadsData -> Q Exp+genParseData (PUnion bs) = genParseUnion bs+genParseData (PSwitch exp pbs) = genParseSwitch exp pbs++-- | Generate the template haskell for parsing a Pads union expression. Namely+-- generate the metadata constructors for each of the branches of the union and+-- stuff them into let-bound functions so that nested parsers have them in+-- scope. Then generate a call to the runtime system function 'choiceP' for+-- choosing among the different parsers.+genParseUnion :: [BranchInfo] -> Q Exp+genParseUnion bs = do+ { (decs,bodies) <- fmap unzip $ mapM genParseBranchInfo bs+ ; let body = case bodies of+ [b] -> b+ bs -> (VarE 'choiceP) `AppE` (ListE bs)+ ; return (LetE decs body)+ }++-- | Generate the template haskell case expression from a Pads switch type. This+-- is almost entirely just matching the syntax of a Pads case onto the syntax of+-- a Haskell case expression. Semantically the case just figures out which+-- parser needs to be run by pattern matching on something already parsed from+-- the input.+genParseSwitch :: Exp -> [(Pat,BranchInfo)] -> Q Exp+genParseSwitch exp pbs = do+ let (ps,bs) = unzip pbs+ (decs,bodies) <- fmap unzip $ mapM genParseBranchInfo bs+ let body = CaseE exp [Match p (NormalB b) [] | (p,b) <- zip ps bodies]+ return (LetE decs body)++-- | Generate the parser for an individual branch of a Pads new type, Pads+-- union, or Pads switch.+genParseBranchInfo :: BranchInfo -> Q (Dec,Exp)+genParseBranchInfo (BRecord c fields pred) = genParseRecord c fields pred+genParseBranchInfo (BConstr c args pred) = do+ { body <- foldl parseNext [| return ($(conE (mkConstrName c)),$(varE (mkfnMDName c))) |] tys+ ; return (con_md, body)+ }+ where+ tys = [ty | (strict,ty) <- args]+ con_md = buildConstr_md (mkfnMDName c) (ConE (mkConstrIMDName c)) tys++-- | Build the constructor function for tupling together the metadata results of+-- parsing a bunch of Pads types.+buildConstr_md :: Name -> Exp -> [PadsTy] -> Dec+buildConstr_md fnMD conMD tys + = FunD fnMD [Clause (map VarP vars_fmd) (NormalB body) []]+ where+ vars_fmd = [ mkName ("x"++show n) | n <- [1 .. length tys]] + mdHeaders = [ VarE 'get_md_header `AppE` VarE xi | xi <- vars_fmd ]+ body = TupE [mkMergeBaseMDs mdHeaders, applyE (conMD : map VarE vars_conmd)]+ vars_conmd = vars_fmd --MD [v | (v,t) <- zip vars_fmd tys, hasRep t]++-------------------------------------------------------------------------------+-- * Generating Parsers from Record Expressions++-- | Generate the template haskell code for parsing a Pads record.+genParseRecord :: UString -> [FieldInfo] -> (Maybe Exp) -> Q (Dec,Exp)+genParseRecord c fields pred = do+ c_md <- newName (strToLower c)+ let con_md = buildConstr_md c_md (ConE (mkConstrIMDName c))+ [ty | (_,(_,ty),_) <- fields]+ labMDs <- sequence [genLabMDName "x" l | (l,(_,_),_) <- fields] + let fnMDLabs = applyE $ map VarE (c_md : labMDs)+ doStmts <- sequence $ [genParseField f xn | (f,xn) <- zip fields labMDs]+ let labs = [mkName lab | (Just lab,(_,ty),_) <- fields, hasRep ty]+ let conLabs = applyE (ConE (mkConstrName c) : map VarE labs)+ returnStmt <- [| return ($(return conLabs),$(return fnMDLabs)) |]+ return (con_md, DoE (concat doStmts ++ [NoBindS returnStmt]))++-- | Generate the name (label?) for the metadata of a field in a record.+genLabMDName :: String -> Maybe String -> Q Name+genLabMDName s (Just lab) = return (mkFieldMDName lab)+genLabMDName s Nothing = liftM mangleName (newName s)++-- | Generate the parser for a field of a Pads record.+genParseField :: FieldInfo -> Name -> Q [Stmt]+genParseField (labM, (strict, ty), expM) xn = do+ let parseTy = (case expM of + Nothing -> genParseTy ty+ Just exp -> genParseRecConstrain labP (varP xn) ty (return exp))+ sequence $+ [ bindS (tupP [labP, varP xn]) parseTy+ ]+ where+ labP = case labM of+ Just lab -> varP (mkName lab)+ Nothing -> wildP++-- | Generate the parser for a constrained field on a record.+genParseRecConstrain :: Q Pat -> Q Pat -> PadsTy -> Q Exp -> Q Exp+genParseRecConstrain labP xnP ty exp = [| parseConstraint $(genParseTy ty) $pred |]+ where+ pred = lamE [labP, xnP] exp++-------------------------------------------------------------------------------+-- Generating Printing Function from a Declaration++-- | Generate the lazy "function list" printer for a given 'PadsTy' Pads type as+-- parsed using Pads' plain-type syntactic form..+genPadsPrintFL :: UString -> [LString] -> Maybe Pat -> PadsTy -> Q [Dec]+genPadsPrintFL name args patM padsTy = do + let rm = [mkName "rep", mkName "md"]+ body <- genPrintTy padsTy $ Just $ TupE (map VarE rm)+ return [mkPrinterFunction name args rm patM body]++-- | Generate the lazy function list printer for the Pads data-type syntactic+-- form.+genPadsDataPrintFL :: UString -> [LString] -> Maybe Pat -> PadsData -> Q [Dec] +genPadsDataPrintFL name args patM padsData = do+ let rm = [mkName "rep", mkName "md"]+ body <- genPrintData padsData $ Just $ TupE (map VarE rm)+ return [mkPrinterFunction name args rm patM body]++-- | Generate the lazy function list printer for the Pads newtype syntactic form.+genPadsNewPrintFL :: UString -> [LString] -> Maybe Pat -> BranchInfo -> Q [Dec] +genPadsNewPrintFL name args patM branch = do + let rm = [mkName "rep", mkName "md"]+ matches <- genPrintBranchInfo False branch+ let body = CaseE (TupE (map VarE rm)) matches+ return [mkPrinterFunction name args rm patM body]++-- | Generate the lazy function list printer for the Pads obtain syntactic form.+genPadsObtainPrintFL :: UString -> [LString] -> PadsTy -> Exp -> Q [Dec]+genPadsObtainPrintFL name args padsTy exp = do+ let rm = [mkName "rep", mkName "md"]+ body <- genPrintTy (PTransform padsTy (PTycon [name]) exp) $ Just $ TupE (map VarE rm)+ return [mkPrinterFunction name args rm Nothing body]++-- | Make the function declaration for the "lazy function list" printer with the+-- body as generated by 'genPrintTy', 'genPrintData', or 'genPrintBranchInfo' as+-- passed into this function as the last 'Exp' parameter.+mkPrinterFunction :: UString -> [LString] -> [Name] -> Maybe Pat -> Exp -> Dec+mkPrinterFunction name args rm patM body =+ FunD printerName [Clause (printerArgs ++ [TupP (map VarP rm)]) (NormalB body) []]+ where+ printerName = mkTyPrinterName name+ printerArgs = map (VarP . mkTyPrinterVarName) args ++ Maybe.maybeToList patM++-------------------------------------------------------------------------------+-- * Generate Printing Function from a Type++-- | Generate the body of the printing function for a Pads type - this function+-- dispatches to the ones below according to the syntactic form being+-- translated.+genPrintTy :: PadsTy -> Maybe Exp -> Q Exp+genPrintTy (PConstrain pat ty exp) rm = genPrintTy ty rm -- XXX: doesn't check the constraint; ideally we should change @printFL@ to account for possible printing errors+genPrintTy (PTransform src dest exp) rm = genPrintTrans src exp rm+genPrintTy (PList ty sepM termM) rm = genPrintList ty sepM termM >>= applyPrintTy rm+genPrintTy (PPartition ty exp) rm = [| (error "genPrintTy PPartition not implemented") |] --genPrintPartition ty exp rm+genPrintTy (PApp tys expM) rm = genPrintTyApp tys expM >>= applyPrintTy rm+genPrintTy (PTuple tys) rm = genPrintTuple tys rm+genPrintTy (PExpression exp) rm = genPrintExp exp rm+genPrintTy (PTycon c) rm = genPrintTycon c >>= applyPrintTy rm+genPrintTy (PTyvar v) rm = genPrintTyVar v >>= applyPrintTy rm+genPrintTy (PValue exp ty) rm = genPrintValue exp rm++-- | Generate the printer for the Pads Value syntactic form 'PValue'. Because a+-- pads value is something that wasn't parsed (it's a way to compute / add an extra+-- field to a parsed Haskell record), we just return the 'nil' printer (prints+-- nothing).+genPrintValue :: Exp -> Maybe Exp -> Q Exp+genPrintValue exp rm = return $ VarE 'nil++-- | Generate the printer for the Pads Transform syntactic form 'PTransform'.+-- This means we need to grab the second function from the tuple provided by the+-- Pads programmer which corresponds to the inverse of the transform function,+-- and print the format of the resulting (source) type. Source here means what's+-- read from a file and destination type means the type for which we have a+-- value that we want to print out. In order for round-trip parsing to work, we+-- need to reverse the transformation because the on-disk format of the source+-- type is usually different from the on-disk format of the destination type.+genPrintTrans :: PadsTy -> Exp -> Maybe Exp -> Q Exp+genPrintTrans tySrc exp Nothing+ = genPrintTy tySrc Nothing+genPrintTrans tySrc (TupE [_, fncn]) (Just rm) = do+ rm' <- [| $(return fncn) $(return rm) |]+ genPrintTy tySrc (Just rm')+genPrintTrans _ tup _ = error ("Template Haskell exp '" ++ show tup ++ "' does not appear to be a two-tuple.")++-- | Some of the printing utilities provided by the runtime system need to know+-- about the representation and the metadata. If the first argument to this+-- function is Nothing, then we don't need to pass the representation and+-- metadata to the expression / utility (e.g. ca case expression printing a+-- union type). Otherwise the first argument contains 'Just' the '(rep, md)'+-- tuple brought into scope as the first parameter to the "*_printFL" functions+-- (e.g. the 'printList' runtime system function needs to know about the rep and+-- md).+applyPrintTy :: Maybe Exp -> Exp -> Q Exp+applyPrintTy rm f = do+ case rm of+ Nothing -> return f+ Just repmdE -> return $ AppE f repmdE++-- | Generate the template haskell code for printing a 'PList' Pads type.+genPrintList :: PadsTy -> Maybe PadsTy -> Maybe TermCond -> Q Exp+genPrintList ty sepOpt termCondOpt = do + (elemRepE, elemRepP) <- doGenPE "elemrep"+ (elemMDE, elemMDP) <- doGenPE "elemmd"+ parseElemE <- genPrintTy ty $ Just $ TupE [elemRepE,elemMDE]+ let parseElemFnE = LamE [TupP [elemRepP, elemMDP]] parseElemE+ sepElemE <- case sepOpt of + Nothing -> return (VarE 'printNothing)+ Just ty -> do+ def <- genDefTy ty+ genPrintTy ty $ Just $ TupE [SigE def (mkRepTy ty),SigE (VarE 'myempty) (mkMDTy False ty)]+ termElemE <- case termCondOpt of+ Nothing -> return (VarE 'printNothing)+ Just (LLen _) -> return (VarE 'printNothing)+ Just (LTerm (PApp [PTycon ["Try"],_] _)) -> return (VarE 'printNothing)+ Just (LTerm (PTuple [PApp [PTycon ["Try"],_] _])) -> return (VarE 'printNothing)+ Just (LTerm termTy) -> do+ def <- genDefTy termTy+ genPrintTy termTy $ Just $ TupE [SigE def (mkRepTy termTy),SigE (VarE 'myempty) (mkMDTy False termTy)]+ return $ appE3 (VarE 'printList) parseElemFnE sepElemE termElemE++-- | Generate the template haskell code for printing a Pads type application by+-- recursively calling 'genPrintTy' on the Pads types of each of the arguments to the+-- Pads type constructor.+genPrintTyApp :: [PadsTy] -> Maybe Exp -> Q Exp+genPrintTyApp tys expM = do+ prtys <- mapM (flip genPrintTy Nothing) tys+ foldl1M (\e1 e2 -> return $ AppE e1 e2) (prtys ++ Maybe.maybeToList expM)++-- | Generate the template haskell code for printing a Pads tuple type.+genPrintTuple :: [PadsTy] -> Maybe Exp -> Q Exp+genPrintTuple tys (Just rm) = do+ repNamesM <- genNamesforTuple True "rep" tys+ let repVars = map VarE (Maybe.catMaybes repNamesM)+ let repPats = map VarP (Maybe.catMaybes repNamesM)+ mdNamesM <- genNamesforTuple False "md" tys+ let mdVars = map VarE (Maybe.catMaybes mdNamesM)+ let mdPats = map VarP (Maybe.catMaybes mdNamesM)+ inners <- sequence [genPrintTupleInner t r m | (t,r,m) <- zip3 tys repNamesM mdNamesM{-, hasRep t-}]+ return $ CaseE rm+ [Match (TupP [TupP $ repPats, TupP [SigP WildP (ConT ''Base_md), (TupP mdPats)]]) + (NormalB (VarE 'concatFL `AppE` ListE inners))+ []]+genPrintTuple tys Nothing = do+ repName <- newName "rep"+ mdName <- newName "md"+ liftM (LamE [TupP [VarP repName,VarP mdName]]) $ genPrintTuple tys $ Just $ TupE [VarE repName,VarE mdName]++-- | Filters a second list based on which corresponding Pads types from the+-- first list have an underlying representation in memory (removing the ones+-- that don't have an underlying representation).+filterByHasRep :: [PadsTy] -> [a] -> [a]+filterByHasRep tys xs = map snd $ filter (hasRep . fst) (zip tys xs)++-- | Generate a list of names to be used as Haskell pattern variables and+-- expression variables for a Pads tuple type. If the tuple is for the+-- representation then the given 'Bool' is True and we want to ignore data that+-- doesn't have a representation in memory. Otherwise the tuple is for the+-- metadata meaning the given 'Bool' is False and we want to print *everything*.+genNamesforTuple :: Bool -> String -> [PadsTy] -> Q [Maybe Name]+genNamesforTuple False str tys = sequence [fmap Just (newName str) | ty <- tys]+genNamesforTuple True str tys = sequence [if hasRep ty then fmap Just (newName str) else return Nothing | ty <- tys]++-- | Generate the template haskell print function for some type inside of a+-- tuple based on whether or not that type has an in-memory representation+-- '(Just r)' and a metadata representation '(Just m)'.+genPrintTupleInner t (Just r) (Just m) = genPrintTy t (Just (TupE [VarE r,VarE m])) +genPrintTupleInner t Nothing (Just m) = genDefTy t >>= \def -> genPrintTy t (Just (TupE [def, VarE m]))+genPrintTupleInner t Nothing Nothing = genPrintTy t Nothing+genPrintTupleInner t (Just r) Nothing = error ("genPrintTupleInner: Type '" ++ show t+ ++ "' has a representation but no metadata.")++-- | Generate the template haskell code for printing the value of a Pads literal+-- (string, character, regex) by simply constructing a runtime system call to+-- 'litPrint' with the code for computing the Haskell value of the literal+-- spliced into the first argument position.+genPrintExp :: Exp -> Maybe Exp -> Q Exp+genPrintExp e _ = [| litPrint $(return e) |]++-- | Generate the printer for a Pads type constructor (hint: it's just the+-- variable name according to 'mkTyPrinterQName'.+genPrintTycon :: QString -> Q Exp+genPrintTycon c = return $ VarE (mkTyPrinterQName c)++-- | Generate the printing expression for a Pads type variable according to+-- 'mkTyPrinterVarName'.+genPrintTyVar :: LString -> Q Exp+genPrintTyVar v = return $ VarE (mkTyPrinterVarName v)++-------------------------------------------------------------------------------+-- Generate Printing Function from a Datatype++-- | Generate the template haskell expression for printing a Haskell value given+-- the Pads data type declaration defining the type of the Haskell value.+genPrintData :: PadsData -> Maybe Exp -> Q Exp+genPrintData (PUnion bs) rm = genPrintUnion bs rm+genPrintData (PSwitch exp pbs) rm = genPrintSwitch exp pbs rm++-- | Generate a Haskell case expression for printing a Pads union type.+genPrintUnion :: [BranchInfo] -> Maybe Exp -> Q Exp+genPrintUnion bs (Just rm) = do+ let doDef = if length bs > 1 then True else False+ matches <- liftM concat $ mapM (genPrintBranchInfo doDef) bs+ return $ CaseE rm matches+genPrintUnion bs Nothing = do+ repName <- newName "rep"+ mdName <- newName "md"+ let doDef = if length bs > 1 then True else False+ matches <- liftM concat $ mapM (genPrintBranchInfo doDef) bs+ return $ LamE [TupP [VarP repName,VarP mdName]] $ CaseE (TupE [VarE repName,VarE mdName]) matches++-- | Generate the printing function body of an individual branch of a Pads data type.+genPrintBranchInfo :: Bool -> BranchInfo -> Q [Match]+genPrintBranchInfo doDef (BRecord c fields predM) = genPrintRecord c fields predM+genPrintBranchInfo doDef (BConstr c args predM) = genPrintConstr doDef c args predM++-- | Generate the individual 'Match' of the Haskell case expression for matching+-- on a record being printed.+genPrintRecord :: UString -> [FieldInfo] -> Maybe Exp -> Q [Match]+genPrintRecord (mkName -> recName) fields predM = do + (repEs, repPs) <- getPEforFields (\t -> genDefTy t >>= \def -> return $ SigE def (mkRepTy t)) (return . getBranchNameL) fields+ (mdEs, mdPs) <- getPEforFields (return . SigE (VarE 'myempty) . mkMDTy False) (return . getBranchMDNameL) fields+ let ptys = map (\(n,(_,ty),p) -> ty) fields+ let ty_rep_mds = zip3 ptys repEs mdEs+ expE <- mapM (\(ty,r,m) -> genPrintTy ty $ Just $ TupE [r,m]) ty_rep_mds+ let printItemsE = ListE expE+ let caseBody = NormalB (AppE (VarE 'concatFL) printItemsE)+ let mdPat = TupP[WildP, RecP (getStructInnerMDName recName) mdPs]+ let repPat = RecP recName repPs+ let casePat = TupP [repPat, mdPat]+ let match = Match casePat caseBody []+ return [match]++-- | Get the printer expression for an individual field of a record.+getPEforField :: (PadsTy -> Q Exp) -> (String -> Q Name) -> FieldInfo -> Q (Exp, Maybe FieldPat)+getPEforField def mkFieldNm (nameOpt, (strict,pty), optPred) = case nameOpt of+ Nothing -> def pty >>= \d -> return (d,Nothing)+ Just str -> do+ name <- mkFieldNm str+ let (varE, varP) = genPE name+ return (varE, Just (name, varP))++-- | Get the printer expressions and corresponding record field pattern+-- matches for each of the given 'FieldInfo's.+getPEforFields :: (PadsTy -> Q Exp) -> (String -> Q Name) -> [FieldInfo] -> Q ([Exp], [FieldPat])+getPEforFields def mkFieldNm fields = do+ eps <- mapM (getPEforField def mkFieldNm) fields+ let (es, pOpts) = List.unzip eps+ ps = Maybe.catMaybes pOpts+ return (es, ps)++-- | Generate the template haskell code for matching on and printing the value+-- for a Pads value constructor.+genPrintConstr :: Bool -> String -> [ConstrArg] -> (Maybe Exp) -> Q [Match]+genPrintConstr doDef (mkName -> recName) args predM = do+ let fields = map (\c -> (Just "arg",c,Nothing)) args+ (repEs, repPs) <- getPEforFields (\t -> genDefTy t >>= \def -> return $ SigE def (mkRepTy t)) newName fields+ (mdEs, mdPs) <- getPEforFields (return . SigE (VarE 'myempty) . mkMDTy False) newName fields+ let ptys = map (\(n,(s,ty),p) -> ty) fields++ let genBody mdEs = (do+ { let genTyRepMd = (\(ty,r,m) -> if hasRep ty then return (ty,r,m) else genDefTy ty >>= (\def -> return (ty,SigE def (mkRepTy ty),m)))+ ; ty_rep_mds <- mapM genTyRepMd $ zip3 ptys repEs mdEs+ ; expE <- mapM (\(ty,repE,mdE) -> genPrintTy ty $ Just $ TupE [repE,mdE]) ty_rep_mds+ ; let printItemsE = ListE expE+ ; let caseBody = NormalB (AppE (VarE 'concatFL) printItemsE)+ ; return caseBody+ })++ let repPat = ConP recName (filterByHasRep ptys $ map snd repPs) + let mdPat = TupP[SigP WildP (ConT ''Base_md), ConP (getStructInnerMDName recName) (map snd mdPs)]++ caseBody <- genBody mdEs+ let match = Match (TupP [repPat, mdPat]) caseBody []++ caseBodyDef <- genBody $ map (\(_,ty) -> SigE (VarE 'myempty) (mkMDTy False ty)) args+ let matchDef = Match (TupP [repPat,WildP]) caseBodyDef []+ if doDef then return [match,matchDef] else return [match]++-- | Generate the template haskell code for printing a Pads switch type by+-- ignoring the value we're switching on and simply generating the same case+-- expression that 'genPrintUnion' does for a Pads union type.+genPrintSwitch :: Exp -> [(Pat,BranchInfo)] -> Maybe Exp -> Q Exp+genPrintSwitch exp pbs rm = genPrintUnion (map snd pbs) rm++-------------------------------------------------------------------------------+-- * Generating Default Function from a Declaration++-- | Generate the Pads default value for a 'PadsDeclType'+genPadsDef :: UString -> [LString] -> Maybe Pat -> PadsTy -> Q [Dec]+genPadsDef name args patM padsTy = do + body <- genDefTy padsTy+ return [mkDefFunction name args patM body]++-- | Generate the Pads default value for a Pads data declaration.+genPadsDataDef :: UString -> [LString] -> Maybe Pat -> PadsData -> Q [Dec] +genPadsDataDef name args patM padsData = do+ body <- genDefData padsData+ return [mkDefFunction name args patM body]++-- | Generate the Pads default value for a Pads newtype declaration.+genPadsNewDef :: UString -> [LString] -> Maybe Pat -> BranchInfo -> Q [Dec] +genPadsNewDef name args patM branch = do + body <- genDefBranchInfo branch+ return [mkDefFunction name args patM body]++-- | Generate the Pads default value for a Pads obtain declaration.+genPadsObtainDef :: UString -> [LString] -> PadsTy -> Exp -> Q [Dec]+genPadsObtainDef name args padsTy exp = do+ body <- genDefTy (PTransform padsTy (PTycon [name]) exp)+ return [mkDefFunction name args Nothing body]++-- | Generate the Pads default value as a function declaration of the form+-- "foo_def" for a Pads parser named "Foo".+mkDefFunction :: UString -> [LString] -> Maybe Pat -> Exp -> Dec+mkDefFunction name args patM body =+ FunD defName [Clause (defArgs) (NormalB body) []]+ where+ defName = mkTyDefName name+ defArgs = map (VarP . mkTyDefVarName) args ++ Maybe.maybeToList patM++-------------------------------------------------------------------------------+-- * Generate Default Function from a Type++-- | Generate the default Haskell value for some Pads type.+genDefTy :: PadsTy -> Q Exp+genDefTy (PConstrain pat ty exp) = genDefTy ty -- XXX: doesn't check the constraint; ideally we should change @printFL@ to account for possible printing errors+genDefTy (PTransform src dest exp) = do+ defSrc <- genDefTy src+ srcToDest <- [| \rep -> fst $ (fst $(return exp)) S.zeroSpan (rep,(error "TODO defaultMd")) |] -- XXX: fix this undefined, it kind of requires defaultMd to be defined inductively over Pads types as well...+ return $ AppE srcToDest defSrc+genDefTy (PList ty sepM termM) = [| [] |]+genDefTy (PPartition ty exp) = genDefTy ty+genDefTy (PApp tys expM) = do+ prtys <- mapM genDefTy tys+ foldl1M (\e1 e2 -> return $ AppE e1 e2) (prtys ++ Maybe.maybeToList expM)+genDefTy (PTuple tys) = genDefTuple tys+genDefTy (PExpression exp) = return exp+genDefTy (PTycon c) = return $ VarE (mkTyDefQName c)+genDefTy (PTyvar v) = return $ VarE (mkTyDefVarName v)+genDefTy (PValue exp ty) = genDefTy ty++-- | Generate the default Haskell value for a Pads tuple type.+genDefTuple :: [PadsTy] -> Q Exp+genDefTuple tys = case reps of+ [] -> [| () |]+ [ty] -> genDefTy ty+ tys -> do+ exps <- mapM genDefTy tys+ return $ TupE exps+ where+ reps = [ty | ty <- tys, hasRep ty]++-------------------------------------------------------------------------------+-- Generate Default Function from a Datatype++-- | Generate the default Haskell value for a Pads data type 'PadsData'.+genDefData :: PadsData -> Q Exp+genDefData (PUnion (b:bs)) = genDefBranchInfo b+genDefData (PSwitch exp (pb:pbs)) = genDefBranchInfo (snd pb)+genDefData (PUnion []) = error "genDefData: empty PUnion."+genDefData (PSwitch exp []) = error "genDefData: empty PSwitch."++-- | Generate the default Haskell value for a single branch of a Pads type,+-- namely either a Pads constructor or record.+genDefBranchInfo :: BranchInfo -> Q Exp+genDefBranchInfo (BConstr c args pred) = do+ reps <- sequence $ [genDefTy ty | (strict,ty) <- args, hasRep ty]+ return $ foldl1 AppE (ConE (mkConstrName c):reps)+genDefBranchInfo (BRecord c fields expM) = do+ reps <- sequence $ [liftM (l,) (genDefTy ty) | (Just l,(strict,ty),_) <- fields, hasRep ty]++ let lets = flip map reps $ \(lab,def) -> ValD (VarP $ mkName lab) (NormalB def) []+ return $ LetE lets $ foldl1 AppE (ConE (mkConstrName c):map (VarE . mkName . fst) reps)++-------------------------------------------------------------------------------+-- * Name Manipulation Functions ++-- ** Naming types, and accessing the names of types++-- | Get the template haskell 'Name' for a given Pads type.+mkRepName :: String -> Name+mkRepName str = mkName str++-- | Make the template haskell 'Name' of a given 'PTycon' with a qualified name.+mkRepQName :: QString -> Name+mkRepQName str = mkName (qName str)++-- | Make externally visible metadata name for a Pads type+mkMDName :: String -> Name+mkMDName str = mkName (str ++ "_md")++-- | Given a Pads type name in the template haskell @Q@ monad, get the metadata+-- type name.+mkMDQName :: QString -> Name+mkMDQName str = mkName (appendTo str "_md")++-- | Make the internal metadata type name for a given Pads type+mkIMDName name = mkName (name ++ "_imd")++-- | Make externally visible metadata name for a Pads variable+mkMDVarName name = mkName (name ++ "_md")++-- ** Naming fields and constructors++-- | Convert Pads source (record) field name into a 'Q' monad name+mkFieldName str = mkName str++-- | Convert Pads source (record) field name into its metadata name in the 'Q'+-- monad.+mkFieldMDName str = mkName (str ++ "_md")++-- | Pads constructor +mkConstrName str = mkName str+mkConstrIMDName str = mkName (str ++ "_imd")+mkfnMDName str = mkName (strToLower str ++ "_md")+++-- ** Naming Parsers++mkTyParserName str = mkName (strToLower str ++ "_parseM")+mkTyParserSName str = mkName (strToLower str ++ "_parseS")++mkTyParserQName str = mkName (appendLower str "_parseM")+mkTyParserSQName str = mkName (appendLower str "_parseS")++mkVarParserName str = mkName (strToLower str ++ "__p")+++-- ** Naming Printers++getBranchMDNameU str = mkName ((strToUpper str)++"_md")+getBranchMDNameL str = mkName ((strToLower str)++"_md")+getBranchNameU str = mkName (strToUpper str)+getBranchNameL str = mkName (strToLower str)+getStructInnerMDName name = let str = show name in mkName (str++"_imd")++mkTyPrinterName str = mkName (strToLower str ++ "_printFL")+mkTyPrinterQName str = mkName (appendLower str "_printFL")+mkTyPrinterVarName str = mkName (str ++ "__pr")+ +mkTyDefName str = mkName (strToLower str ++ "_def")+mkTyDefQName str = mkName (appendLower str "_def")+mkTyDefVarName str = mkName (str ++ "__d")++ ++appendTo :: QString -> String -> String+appendTo ms s = qName (init ms ++ [last ms ++ s])+appendLower ms s = qName (init ms ++ [strToLower (last ms) ++ s])++type UString = String+type LString = String++foldl1M :: Monad m => (a -> a -> m a) -> [a] -> m a+foldl1M f (x:xs) = foldM f x xs++foldr1M :: Monad m => (a -> a -> m a) -> [a] -> m a+foldr1M f [x] = return x+foldr1M f (x:xs) = f x =<< foldr1M f xs++appT2 f x y = AppT (AppT f x) y++appE3 f x y z = AppE (AppE (AppE f x) y) z+
+ Language/Pads/CoreBaseTypes.hs view
@@ -0,0 +1,983 @@+{-# LANGUAGE TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, ScopedTypeVariables,+ MultiParamTypeClasses, DeriveDataTypeable, TypeSynonymInstances,+ FlexibleInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.CoreBaseTypes+ Description : Core Pads base types with parsers+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.CoreBaseTypes where++import Language.Pads.Generic+import Language.Pads.MetaData+import Language.Pads.PadsParser+import Language.Pads.RegExp+import Data.Maybe++import qualified Language.Pads.Source as S+import qualified Language.Pads.Errors as E+import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as C++import Language.Pads.PadsPrinter++import Language.Haskell.TH as TH+import Language.Haskell.TH.Syntax+import Data.Data+import qualified Data.Map as M+import qualified Data.List as List+import Data.Word+import Data.Char as Char+import Data.Int+import Data.Bits++import Text.PrettyPrint.Mainland as PP+import Text.PrettyPrint.Mainland.Class++import Control.Monad++-- | Metadata type for a PADS Char+type Char_md = Base_md++-- | Monadic parser for a PADS Char+char_parseM :: PadsParser (Char, Base_md)+char_parseM =+ handleEOF def "Char" $+ handleEOR def "Char" $ do+ c <- takeHeadP+ returnClean c++-- | Default value inserted by the parser for a PADS Char+char_def :: Char+char_def = 'X'++type instance PadsArg Char = ()+type instance Meta Char = Base_md+instance Pads1 () Char Base_md where+ parsePP1 () = char_parseM+ printFL1 () = char_printFL+ def1 () = char_def++char_printFL :: PadsPrinter (Char, md)+char_printFL (c,bmd) = addString [c]++---------------------------------------------++type CharNB = Char+type CharNB_md = Base_md++charNB_parseM :: PadsParser (CharNB, Base_md)+charNB_parseM =+ handleEOF def "CharNB" $+ handleEOR def "CharNB" $ do+ c <- takeBitsP 8+ returnClean (S.word8ToChr (fromIntegral c :: Word8))++charNB_def :: Char+charNB_def = char_def++charNB_printFL :: PadsPrinter (CharNB, md)+charNB_printFL (c, bmd) = addString [c]+++-----------------------------------------------------------------++type BitBool = Bool+type BitBool_md = Base_md++bitBool_parseM :: PadsParser (BitBool, Base_md)+bitBool_parseM =+ handleEOF False "BitBool" $+ handleEOR False "BitBool" $ do+ b <- takeBits8P 1+ returnClean (b == 1)++bitBool_def = False++bitBool_printFL :: PadsPrinter (BitBool, md)+bitBool_printFL (bb,bbmd) = fshow bb++-- type instance PadsArg Bool = ()+-- type instance Meta Bool = Base_md+-- instance Pads1 () Bool Base_md where+-- parsePP1 () = bitBool_parseM+-- printFL1 () = bitBool_printFL+-- def1 () = bitBool_def++-----------------------------------------------------------------++type BitField = Integer+type BitField_md = Base_md++bitField_parseM :: Int -> PadsParser (BitField, Base_md)+bitField_parseM x =+ if x < 0+ then returnError def (E.BitWidthError 0 (fromIntegral x))+ else handleEOF 0 "BitField" $+ handleEOR 0 "BitField" $ do+ b <- takeBitsP x+ returnClean b++bitField_def :: Int -> BitField+bitField_def _ = 0++bitField_printFL :: Int -> PadsPrinter (BitField, md)+bitField_printFL _ (x, xmd) = fshow x++-- type instance PadsArg Integer = ()+-- type instance Meta Integer = Base_md+-- instance Pads1 () Integer Base_md where+-- parsePP1 () = bitField_parseM+-- printFL1 () = bitField_printFL+-- def1 () = bitField_def+++type Bits8 = Word8+type Bits8_md = Base_md++bits8_parseM :: Int -> PadsParser (Bits8, Base_md)+bits8_parseM x =+ if x < 1 || x > 8+ then returnError 0 (E.BitWidthError 8 (fromIntegral x))+ else handleEOF 0 "Bits8" $+ handleEOR 0 "Bits8" $ do+ b <- takeBits8P x+ returnClean b+++type Bits16 = Word16+type Bits16_md = Base_md++bits16_parseM :: Int -> PadsParser (Bits16, Base_md)+bits16_parseM x =+ if x < 1 || x > 16+ then returnError 0 (E.BitWidthError 16 (fromIntegral x))+ else handleEOF 0 "Bits16" $+ handleEOR 0 "Bits16" $ do+ b <- takeBits16P x+ returnClean b+++type Bits32 = Word32+type Bits32_md = Base_md++bits32_parseM :: Int -> PadsParser (Bits32, Base_md)+bits32_parseM x =+ if x < 1 || x > 32+ then returnError 0 (E.BitWidthError 32 (fromIntegral x))+ else handleEOF 0 "Bits32" $+ handleEOR 0 "Bits32" $ do+ b <- takeBits32P x+ returnClean b+++type Bits64 = Word64+type Bits64_md = Base_md++bits64_parseM :: Int -> PadsParser (Bits64, Base_md)+bits64_parseM x =+ if x < 1 || x > 64+ then returnError 0 (E.BitWidthError 64 (fromIntegral x))+ else handleEOF 0 "Bits64" $+ handleEOR 0 "Bits64" $ do+ b <- takeBits64P x+ returnClean b+++bits8_def :: a -> Bits8+bits16_def :: a -> Bits16+bits32_def :: a -> Bits32+bits64_def :: a -> Bits64++bits8_def _ = 0+bits16_def _ = 0+bits32_def _ = 0+bits64_def _ = 0++bits8_printFL :: Int -> PadsPrinter (Bits8, md)+bits16_printFL :: Int -> PadsPrinter (Bits16, md)+bits32_printFL :: Int -> PadsPrinter (Bits32, md)+bits64_printFL :: Int -> PadsPrinter (Bits64, md)++bits8_printFL _ (x, xmd) = fshow x+bits16_printFL _ (x, xmd) = fshow x+bits32_printFL _ (x, xmd) = fshow x+bits64_printFL _ (x, xmd) = fshow x++-----------------------------------------------------------------++--type Int+type Int_md = Base_md++-- | Monadic parser for a PADS Int+int_parseM :: PadsParser (Int,Base_md)+int_parseM =+ handleEOF def "Int" $+ handleEOR def "Int" $ do+ c <- peekHeadP+ let isNeg = (c == '-')+ when isNeg (takeHeadP >> return ())+ digits <- satisfy Char.isDigit+ if not (null digits)+ then returnClean (digitListToInt isNeg digits)+ else returnError def (E.FoundWhenExpecting (mkStr c) "Int")++-- | Default value inserted by the parser for a PADS Int+int_def :: Int+int_def = 0++type instance PadsArg Int = ()+type instance Meta Int = Base_md+instance Pads1 () Int Base_md where+ parsePP1 () = int_parseM+ printFL1 () = int_printFL+ def1 () = int_def++int_printFL :: PadsPrinter (Int, Base_md)+int_printFL (i, bmd) = fshow i++-----------------------------------------------------------------++--type Integer+type Integer_md = Base_md++-- | Monadic parser for a PADS Integer+integer_parseM :: PadsParser (Integer,Base_md)+integer_parseM =+ handleEOF def "Integer" $+ handleEOR def "Integer" $ do+ c <- peekHeadP+ let isNeg = (c == '-')+ when isNeg (takeHeadP >> return ())+ digits <- satisfy Char.isDigit+ if not (null digits)+ then returnClean (toEnum $ digitListToInt isNeg digits)+ else returnError def (E.FoundWhenExpecting (mkStr c) "Integer")++-- | Default value inserted by the parser for a PADS Integer+integer_def :: Integer+integer_def = 0++type instance PadsArg Integer = ()+type instance Meta Integer = Base_md+instance Pads1 () Integer Base_md where+ parsePP1 () = integer_parseM+ printFL1 () = integer_printFL+ def1 () = integer_def++integer_printFL :: PadsPrinter (Integer, Base_md)+integer_printFL (i, bmd) = fshow i++-----------------------------------------------------------------++--type Float+type Float_md = Base_md++-- | Monadic parser for a PADS Float, e.g. "-3.1415"+float_parseM :: PadsParser (Float,Base_md)+float_parseM =+ handleEOF def "Float" $+ handleEOR def "Float" $ do+ -- Get leading sign+ c <- peekHeadP+ let isNeg = (c == '-')+ when isNeg (takeHeadP >> return ())+ let sign = if isNeg then "-" else ""+ -- Get digits before any dot+ digits1 <- satisfy Char.isDigit+ -- Get optional dot+ d <- peekHeadP+ let hasDot = (d == '.')+ when hasDot (takeHeadP >> return ())+ let dec = if hasDot then "." else ""+ -- Get digits after dot+ digits2 <- satisfy Char.isDigit+ -- Get optional exponent marker+ e <- peekHeadP+ let hasExp = (e == 'e')+ when hasExp (takeHeadP >> return ())+ let exp = if hasExp then "e" else ""+ -- Get optional exponent sign+ es <- peekHeadP+ let hasESign = (es == '-')+ when hasESign (takeHeadP >> return ())+ let expSign = if hasESign then "-" else ""+ -- Get digits in the exponent+ digits3 <- satisfy Char.isDigit+ -- As long as the double had digits+ if not (null digits1)+ then returnClean (read (sign ++digits1++dec++digits2++exp++expSign++digits3))+ else returnError def (E.FoundWhenExpecting (mkStr c) "Float")++-- | Default value inserted by the parser for a PADS Float+float_def :: Float+float_def = 0++type instance PadsArg Float = ()+type instance Meta Float = Base_md+instance Pads1 () Float Base_md where+ parsePP1 () = float_parseM+ printFL1 () = float_printFL+ def1 () = float_def++float_printFL :: PadsPrinter (Float, Base_md)+float_printFL (d, bmd) = fshow d++-----------------------------------------------------------------++--type Double+type Double_md = Base_md++-- | Monadic parser for a textual PADS Double, e.g. "-3.1415"+double_parseM :: PadsParser (Double,Base_md)+double_parseM =+ handleEOF def "Double" $+ handleEOR def "Double" $ do+ -- Get leading sign+ c <- peekHeadP+ let isNeg = (c == '-')+ when isNeg (takeHeadP >> return ())+ let sign = if isNeg then "-" else ""+ -- Get digits before any dot+ digits1 <- satisfy Char.isDigit+ -- Get optional dot+ d <- peekHeadP+ let hasDot = (d == '.')+ when hasDot (takeHeadP >> return ())+ let dec = if hasDot then "." else ""+ -- Get digits after dot+ digits2 <- satisfy Char.isDigit+ -- Get optional exponent marker+ e <- peekHeadP+ let hasExp = (e == 'e')+ when hasExp (takeHeadP >> return ())+ let exp = if hasExp then "e" else ""+ -- Get optional exponent sign+ es <- peekHeadP+ let hasESign = (es == '-')+ when hasESign (takeHeadP >> return ())+ let expSign = if hasESign then "-" else ""+ -- Get digits in the exponent+ digits3 <- satisfy Char.isDigit+ -- As long as the double had digits+ if not (null digits1)+ then returnClean (read (sign ++digits1++dec++digits2++exp++expSign++digits3))+ else returnError def (E.FoundWhenExpecting (mkStr c) "Double")++-- | Default value inserted by the parser for a PADS Float+double_def :: Double+double_def = 0++type instance PadsArg Double = ()+type instance Meta Double = Base_md+instance Pads1 () Double Base_md where+ parsePP1 () = double_parseM+ printFL1 () = double_printFL+ def1 () = 0++double_printFL :: PadsPrinter (Double, Base_md)+double_printFL (d, bmd) = fshow d++++-----------------------------------------------------------------++-- tries to parse @a@ without consuming the input string+type Try a = a+type Try_md a_md = (Base_md, a_md)++try_parseM :: PadsMD md => PadsParser (rep,md) -> PadsParser (Try rep, Try_md md)+try_parseM p = do+ (rep,md) <- parseTry p+ return (rep, (cleanBasePD, md))++try_printFL :: PadsPrinter (a,a_md) -> PadsPrinter (Try a,Try_md a_md)+try_printFL p _ = printNothing++try_def :: a -> Try a+try_def d = d+++-----------------------------------------------------------------++type Digit = Int+type Digit_md = Base_md++-- | Monadic parser for a PADS Digit according to @'isDigit'@+digit_parseM :: PadsParser (Digit, Base_md)+digit_parseM =+ handleEOF def "Pdigit" $+ handleEOR def "Pdigit" $ do+ c <- takeHeadP+ if isDigit c+ then returnClean (digitToInt c)+ else returnError def (E.FoundWhenExpecting [c] "Digit")++-- | Default value inserted by the parser for a PADS Digit+digit_def :: Digit+digit_def = 0++digit_printFL :: PadsPrinter (Digit, Base_md)+digit_printFL (i, bmd) = fshow i+++-----------------------------------------------------------------++--type String+type String_md = Base_md++string_parseM :: PadsParser (String, Base_md)+string_parseM = do+ document <- getAllBinP+ returnClean $ C.unpack document++-- | Default value inserted by the parser for a PADS String+string_def = ""++type instance PadsArg String = ()+type instance Meta String = Base_md+instance Pads1 () String Base_md where+ parsePP1 () = string_parseM+ printFL1 () = string_printFL+ def1 () = string_def++string_printFL :: PadsPrinter (String, Base_md)+string_printFL (str, bmd) = addString str++-----------------------------------------------------------------++type StringNB = String+type StringNB_md = Base_md++stringNB_parseM :: PadsParser (String, Base_md)+stringNB_parseM = do+ str <- drainSourceNBP+ returnClean str++stringNB_def = string_def++stringNB_printFL :: PadsPrinter (String, Base_md)+stringNB_printFL = string_printFL++-----------------------------------------------------------------++newtype Text = Text S.RawStream+ deriving (Eq, Show, Data, Typeable, Ord)+type Text_md = Base_md++text_parseM :: PadsParser (Text, Base_md)+text_parseM = do+ document <- getAllBinP+ returnClean (Text document)++instance Pretty Text where+ ppr (Text str) = text "ASCII"++text_def :: Text+text_def = Text $ B.pack []++type instance PadsArg Text = ()+type instance Meta Text = Base_md+instance Pads1 () Text Base_md where+ parsePP1 () = text_parseM+ printFL1 () = text_printFL+ def1 () = text_def++text_printFL :: PadsPrinter (Text, Base_md)+text_printFL (Text str, bmd) = addBString str+++-----------------------------------------------------------------++newtype Binary = Binary S.RawStream+ deriving (Eq, Show, Data, Typeable, Ord)+type Binary_md = Base_md++binary_parseM :: PadsParser (Binary, Base_md)+binary_parseM = do+ document <- getAllBinP+ returnClean (Binary document)++instance Pretty Binary where+ ppr (Binary str) = text "Binary"++binary_def :: Binary+binary_def = Binary $ B.pack []++type instance PadsArg Binary = ()+type instance Meta Binary = Base_md+instance Pads1 () Binary Base_md where+ parsePP1 () = binary_parseM+ printFL1 () = binary_printFL+ def1 () = binary_def++binary_printFL :: PadsPrinter (Binary, Base_md)+binary_printFL (Binary bstr, bmd) = addBString bstr+++-----------------------------------------------------------------++-- | string with end character. Ex:+--+-- > StringC ','+type StringC = String+type StringC_md = Base_md++stringC_parseM :: Char -> PadsParser (StringC, Base_md)+stringC_parseM c =+ handleEOF (stringC_def c) "StringC" $+ handleEOR (stringC_def c) "StringC" $ do+ str <- satisfy (\c'-> c /= c')+ returnClean str++stringC_def c = ""++stringC_printFL :: Char -> PadsPrinter (StringC, Base_md)+stringC_printFL c (str, bmd) = addString str++-----------------------------------------------------------------++type StringCNB = String+type StringCNB_md = Base_md++stringCNB_parseM :: Char -> PadsParser (StringCNB, Base_md)+stringCNB_parseM c =+ handleEOF (stringCNB_def c) "StringCNB" $+ handleEOR (stringCNB_def c) "StringCNB" $ do+ str <- satisfyNBP (\c' -> c /= c')+ returnClean str++stringCNB_def :: Char -> StringCNB+stringCNB_def = stringC_def++stringCNB_printFL :: Char -> PadsPrinter (StringCNB, Base_md)+stringCNB_printFL = stringC_printFL++-----------------------------------------------------------------++-- | string of fixed length+type StringFW = String+type StringFW_md = Base_md++stringFW_parseM :: Int -> PadsParser (StringFW, Base_md)+stringFW_parseM 0 = returnClean ""+stringFW_parseM n =+ handleEOF (stringFW_def n) "StringFW" $+ handleEOR (stringFW_def n) "StringFW" $ do+ str <- takeP n+ if (length str) == n+ then returnClean str+ else returnError (stringFW_def n) (E.Insufficient (length str) n)++stringFW_def :: Int -> StringFW+stringFW_def n = replicate n 'X'++stringFW_printFL :: Int -> PadsPrinter (StringFW, Base_md)+stringFW_printFL n (str, bmd) = addString (take n str)++-----------------------------------------------------------------++type StringFWNB = String+type StringFWNB_md = Base_md++stringFWNB_parseM :: Int -> PadsParser (StringFW, Base_md)+stringFWNB_parseM 0 = returnClean ""+stringFWNB_parseM n =+ handleEOF (stringFWNB_def n) "StringFWNB" $+ handleEOR (stringFWNB_def n) "StringFWNB" $ do+ str <- takeBytesNBP n+ let str' = map S.word8ToChr (B.unpack str)+ if (length str') == n+ then returnClean str'+ else returnError (stringFWNB_def n) (E.Insufficient (length str') n)++stringFWNB_def :: Int -> StringFW+stringFWNB_def n = replicate n 'X'++stringFWNB_printFL :: Int -> PadsPrinter (StringFW, Base_md)+stringFWNB_printFL = stringFW_printFL++-----------------------------------------------------------------++-- | string of variable length+type StringVW = String+type StringVW_md = Base_md++stringVW_parseM :: Int -> PadsParser (StringVW, Base_md)+stringVW_parseM 0 = returnClean ""+stringVW_parseM n =+ handleEOF (stringVW_def n) "StringVW" $+ handleEOR (stringVW_def n) "StringVW" $ do+ str <- takeP n+ returnClean str++stringVW_def :: Int -> StringVW+stringVW_def n = replicate n 'X'++stringVW_printFL :: Int -> PadsPrinter (StringVW, Base_md)+stringVW_printFL n (str, bmd) = addString (take n str)++---- string of variable length (end if EOR)+--type StringVW = String+--type StringVW_md = Base_md+--+--stringVW_parseM :: (Bool,Int) -> PadsParser (StringVW, Base_md)+--stringVW_parseM (endIfEOR,0) = returnClean ""+--stringVW_parseM (endIfEOR,n) = do+-- let (doEOF, doEOR) = if endIfEOR then (checkEOF, checkEOR) else (handleEOF, handleEOR)+-- doEOF "" "StringVW" $ doEOR "" "StringVW" $ do+-- c1 <- takeHeadP+-- (rest, rest_md) <- stringVW_parseM (endIfEOR,pred n)+-- return (c1:rest, rest_md)+--+--stringVW_def (endIfEOR,n) = replicate n 'X'+--+--stringVW_printFL :: (Bool,Int) -> PadsPrinter (StringVW, Base_md)+--stringVW_printFL (endIfEOR,n) (str, bmd) = addString (take n str)++-----------------------------------------------------------------++-----------------------------------------------------------------++-- | string with matching expression. For example:+--+-- > [pads| type StrME = StringME 'a+' |]+type StringME = String+type StringME_md = Base_md++stringME_parseM :: RE -> PadsParser (StringME, Base_md)+stringME_parseM re =+ handleEOF (stringME_def re) "StringME" $ do+ match <- regexMatchP re+ case match of+ Just str -> returnClean str+ Nothing -> returnError (stringME_def re) (E.RegexMatchFail (show re))++stringME_def (RE re) = "" -- should invert the re+stringME_def (REd re d) = d++stringME_printFL :: RE -> PadsPrinter (StringME, Base_md)+stringME_printFL re (str, bmd) = addString str+ -- We're not likely to check that str matches re++-----------------------------------------------------------------++-- | string matching given native regex. PADS uses posix regex (from the+-- regex-posix package). For example:+--+-- > [pads| StringSE <| RE "b|c" |>|]+type StringSE = String+type StringSE_md = Base_md++stringSE_parseM :: RE -> PadsParser (StringSE, Base_md)+stringSE_parseM re =+ checkEOF (stringSE_def re) "StringSE" $+ checkEOR (stringSE_def re) "StringSE" $ do+ match <- regexStopP re+ case match of+ Just str -> returnClean str+ Nothing -> returnError (stringSE_def re) (E.RegexMatchFail (show re))++stringSE_def (RE re) = "" -- should invert the re+stringSE_def (REd re d) = d++stringSE_printFL :: RE -> PadsPrinter (StringSE, Base_md)+stringSE_printFL re (str, bmd) = addString str+++-----------------------------------------------------------------++-- | string with a predicate. For example:+--+-- > [pads| type Digits = StringP Char.isDigit |]+type StringP = String+type StringP_md = Base_md++stringP_parseM :: (Char -> Bool) -> PadsParser (StringP, Base_md)+stringP_parseM p =+ handleEOF (stringP_def p) "StringP" $+ handleEOR (stringP_def p) "StringP" $ do+ str <- satisfy p+ returnClean str++stringP_def _ = ""++stringP_printFL :: (Char -> Bool) -> PadsPrinter (StringP, Base_md)+stringP_printFL p (str, bmd) = addString str++-----------------------------------------------------------------++-- | string predicate with escape condition+type StringPESC = String+type StringPESC_md = Base_md++stringPESC_parseM :: (Bool, (Char, [Char])) -> PadsParser(StringPESC, Base_md)+stringPESC_parseM arg @ (endIfEOR, (escape, stops)) =+ let (doEOF, doEOR) = if endIfEOR then (checkEOF, checkEOR) else (handleEOF, handleEOR)+ in+ doEOF "" "StringPESC" $+ doEOR "" "StringPESC" $ do+ { c1 <- peekHeadP+ ; if c1 `elem` stops then+ returnClean ""+ else if c1 == escape then do+ { takeHeadP+ ; doEOF [c1] "StringPESC" $+ doEOR [c1] "StringPESC" $ do+ { c2 <- takeHeadP+ ; if (c2 == escape) || (c2 `elem` stops) then do+ { (rest, rest_md) <- stringPESC_parseM arg+ ; return (c2:rest, rest_md)+ }+ else do+ { (rest, rest_md) <- stringPESC_parseM arg+ ; return (c1:c2:rest, rest_md)+ }+ }+ } else do+ { c1 <- takeHeadP+ ; (rest, rest_md) <- stringPESC_parseM arg+ ; return (c1:rest, rest_md)+ }+ }++stringPESC_def :: (Bool, (Char, [Char])) -> String+stringPESC_def arg@(endIfEOR, (escape, stops)) = ""++stringPESC_printFL :: (Bool, (Char, [Char])) -> PadsPrinter (StringPESC, Base_md)+stringPESC_printFL (_, (escape, stops)) (str, bmd) =+ let replace c = if c `elem` stops then escape : [c] else [c]+ newStr = concat (map replace str)+ in addString newStr++++-----------------------------------------------------------------+++class LitParse a where+ litParse :: a -> PadsParser ((), Base_md)+ litPrint :: a -> FList++strLit_parseM :: String -> PadsParser ((), Base_md)+strLit_parseM s =+ handleEOF () s $+ handleEOR () s $ do+ match <- scanStrP s+ case match of+ Just [] -> returnClean ()+ Just junk -> returnError () (E.ExtraBeforeLiteral s)+ Nothing -> returnError () (E.MissingLiteral s)++strLit_printFL :: String -> FList+strLit_printFL str = addString str++instance LitParse Char where+ litParse = charLit_parseM+ litPrint = charLit_printFL++charLit_parseM :: Char -> PadsParser ((),Base_md)+charLit_parseM c =+ handleEOF () (mkStr c) $+ handleEOR () (mkStr c) $ do+ c' <- takeHeadP+ if c == c' then returnClean () else do+ foundIt <- scanP c+ returnError () (if foundIt+ then E.ExtraBeforeLiteral (mkStr c)+ else E.MissingLiteral (mkStr c))++charLit_printFL :: Char -> FList+charLit_printFL c = addString [c]++instance LitParse String where+ litParse = strLit_parseM+ litPrint = strLit_printFL+++instance LitParse RE where+ litParse = reLit_parseM+ litPrint = reLit_printFL++reLit_parseM :: RE -> PadsParser ((), Base_md)+reLit_parseM re = do+ (match, md) <- stringME_parseM re+ if numErrors md == 0+ then return ((), md)+ else badReturn ((), md)++reLit_printFL :: RE -> FList+reLit_printFL (RE re) = addString "--REGEXP LITERAL-- "+reLit_printFL (REd re def) = addString def++-- | End of File+type EOF = ()+type EOF_md = Base_md++eof_parseM :: PadsParser (EOF, Base_md)+eof_parseM = do+ isEof <- isEOFP+ if isEof then returnClean ()+ else returnError () (E.ExtraBeforeLiteral "Eof")++-- | End of Record+type EOR = ()+type EOR_md = Base_md++eor_parseM :: PadsParser (EOR, Base_md)+eor_parseM =+ handleEOF () "EOR" $ do+ isEor <- isEORP+ if isEor then doLineEnd+ else returnError () (E.LineError "Expecting EOR")++eor_printFL :: (EOR,Base_md) -> FList+eor_printFL = const eorLit_printFL++eOR_printFL = eor_printFL++eOR_def :: EOR+eOR_def = ()++eof_printFL :: (EOF,Base_md) -> FList+eof_printFL = const eofLit_printFL++eOF_printFL = eof_printFL++eOF_def :: EOF+eOF_def = ()++eorLit_printFL :: FList+eorLit_printFL = printEOR++eofLit_printFL :: FList+eofLit_printFL = printEOF++-----------------------------------------------------------------++newtype Void = Void ()+ deriving (Eq, Show, Data, Typeable, Ord)+type Void_md = Base_md++void_parseM :: PadsParser (Void, Base_md)+void_parseM = returnClean (Void ())++void_def :: Void+void_def = Void ()++type instance Meta Void = Base_md+instance Pads1 () Void Base_md where+ parsePP1 () = void_parseM+ printFL1 () = void_printFL+ def1 () = void_def++void_printFL :: PadsPrinter (Void,Base_md)+void_printFL v = nil++++pstrLit_printQ :: String -> FList+pstrLit_printQ str = addString str++tuple_printQ :: (String, String, String) -> FList+tuple_printQ (s1,s2,s3) = pstrLit_printQ s1 +++ pstrLit_printQ s2 +++ pstrLit_printQ s3++rtuple_printQ :: (String, String, String) -> FList+rtuple_printQ ss = tuple_printQ ss +++ (addString ['\n'])++list_printQ :: [(String,String,String)] -> FList+list_printQ [] = nil+list_printQ (item:items) = rtuple_printQ item +++ list_printQ items+++++++++----------------------------------++handleEOF val str p+ = do { isEof <- isEOFP+ ; if isEof then+ returnError val (E.FoundWhenExpecting "EOF" str)+ else p}++handleEOR val str p+ = do { isEor <- isEORP+ ; if isEor then+ returnError val (E.FoundWhenExpecting "EOR" str)+ else p}++checkEOF val str p+ = do { isEof <- isEOFP+ ; if isEof then+ returnClean val+ else p}++checkEOR val str p+ = do { isEor <- isEORP+ ; if isEor then+ returnClean val+ else p}++----------------------------------+-- BINARY TYPES --+----------------------------------+++type Bytes = S.RawStream+type Bytes_md = Base_md++bytes_parseM :: Int -> PadsParser (Bytes,Bytes_md)+bytes_parseM n =+ handleEOF (def1 n) "Bytes" $+ handleEOR (def1 n) "Bytes" $ do+ bytes <- takeBytesP n+ if B.length bytes == n+ then returnClean bytes+ else returnError (def1 n) (E.Insufficient (B.length bytes) n)++bytes_printFL :: Int -> PadsPrinter (Bytes, Bytes_md)+bytes_printFL n (bs, bmd) =+ addBString bs++bytes_def :: Int -> Bytes+bytes_def i = B.pack $ replicate i (0::Word8)++type instance PadsArg Bytes = Int+type instance Meta Bytes = Bytes_md+instance Pads1 Int Bytes Bytes_md where+ parsePP1 = bytes_parseM+ printFL1 = bytes_printFL+ def1 i = bytes_def i+++type BytesNB = S.RawStream+type BytesNB_md = Base_md++bytesNB_parseM :: Int -> PadsParser (BytesNB, BytesNB_md)+bytesNB_parseM n =+ handleEOF (def1 n) "BytesNB" $+ handleEOR (def1 n) "BytesNB" $ do+ bytes <- takeBytesNBP n+ if B.length bytes == n+ then returnClean bytes+ else returnError (def1 n) (E.Insufficient (B.length bytes) n)++bytesNB_printFL :: Int -> PadsPrinter (BytesNB, BytesNB_md)+bytesNB_printFL = bytes_printFL++bytesNB_def :: Int -> BytesNB+bytesNB_def = bytes_def++{- Helper functions -}+mkStr c = "'" ++ [c] ++ "'"
+ Language/Pads/Errors.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE NamedFieldPuns, DeriveDataTypeable #-}+{-# OPTIONS_HADDOCK prune #-} +{-|+ Module : Language.Pads.Errors+ Description : Parse error reporting support+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental+-}++module Language.Pads.Errors where+import Text.PrettyPrint.Mainland as PP+import Text.PrettyPrint.Mainland.Class+import qualified Language.Pads.Source as S+import Data.Data++-- | Errors which can be encountered at runtime when parsing a Pads type+data ErrMsg =+ FoundWhenExpecting String String+ | MissingLiteral String+ | ExtraBeforeLiteral String+ | LineError String+ | Insufficient Int Int+ | RegexMatchFail String+ | TransformToDstFail String String String+ | TransformToSrcFail String String String+ | UnderlyingTypedefFail+ | PredicateFailure+ | ExtraStuffBeforeTy String String+ | FileError String String+ | BitWidthError Int Int+ deriving (Typeable, Data, Eq, Ord, Show)++{- XXX-KSF: fix pretty printing to use pretty printing combinators rather than string ++ -}+-- | Pretty printer for Pads runtime error messages.+instance Pretty ErrMsg where+ ppr (FoundWhenExpecting str1 str2) = text ("Encountered " ++ str1 ++ " when expecting " ++ str2 ++ ".")+ ppr (MissingLiteral s) = text ("Missing Literal: " ++ s ++ ".")+ ppr (ExtraBeforeLiteral s) = text ("Extra bytes before literal: " ++ s ++ ".")+ ppr (ExtraStuffBeforeTy junk ty) = text ("Extra bytes: " ++ junk ++ " before " ++ ty ++ ".")+ ppr (Insufficient found expected) = text("Found " ++ show found ++ " bytes when looking for " ++ show expected ++ "bytes.")+ ppr (RegexMatchFail s) = text ("Failed to match regular expression: " ++ s ++ ".")+ ppr (TransformToDstFail s1 s2 s3) = text ("Parsing transform " ++ s1 ++ " failed on input: " ++ s2 ++ s3)+ ppr (TransformToSrcFail s1 s2 s3) = text ("Printing transform "++ s1 ++ " failed on input: " ++ s2 ++ s3)+ ppr (LineError s) = text s+ ppr UnderlyingTypedefFail = text "Pads predicate is true, but underlying type had an error."+ ppr PredicateFailure = text "Pads predicate is false."+ ppr (FileError err file) = text ("Problem with file: " ++ file ++ "("++ err ++ ").")+ ppr (BitWidthError x y) = text ("Bad field width: " ++ show y ++ " cannot fit in " ++ show x ++ ".")++-- | Error information relating back to the source input+data ErrInfo = ErrInfo { msg :: ErrMsg,+ position :: Maybe S.Span }+ deriving (Typeable, Data, Eq, Ord, Show)++-- | Pretty printer for reporting where in the source text a parse error+-- occured.+instance Pretty ErrInfo where+ ppr ErrInfo{msg,position} = ppr msg <+>+ case position of+ Nothing -> empty+ Just pos -> text "at:" <+> ppr pos++-- | Always just pick the first error message+mergeErrInfo ErrInfo{msg=msg1, position=position1} ErrInfo{msg=msg2, position=position2} =+ ErrInfo{msg=msg1, position=position1}++-- | Merge errors in the Maybe monad+maybeMergeErrInfo m1 m2 = case (m1,m2) of+ (Nothing,Nothing) -> Nothing+ (Just p, Nothing) -> Just p+ (Nothing, Just p) -> Just p+ (Just p1, Just p2) -> Just (mergeErrInfo p1 p2)+
+ Language/Pads/GenPretty.hs view
@@ -0,0 +1,267 @@+{-# LANGUAGE TypeSynonymInstances, TemplateHaskell, QuasiQuotes, MultiParamTypeClasses+ , FlexibleInstances, DeriveDataTypeable, NamedFieldPuns, ScopedTypeVariables #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.GenPretty+ Description : Template haskell based pretty printing instances+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.GenPretty where++import Language.Pads.Padsc+import Language.Pads.Errors+import Language.Pads.MetaData+import Language.Pads.TH++import Language.Haskell.TH as TH hiding (ppr)++import Text.PrettyPrint.Mainland+import Text.PrettyPrint.Mainland.Class++import qualified Data.List as L+import qualified Data.Set as S+import Control.Monad++import System.Posix.Types+import Data.Word+import Data.Int+import Data.Time+import Debug.Trace as D++pprE argE = AppE (VarE 'ppr) argE+pprListEs argEs = ListE (map pprE argEs)+pprCon1E argE = AppE (VarE 'pprCon1) argE+pprCon2E argE = AppE (VarE 'pprCon2) argE++pprCon1 arg = ppr (toList1 arg)+pprCon2 arg = ppr (toList2 arg)++-- | Get all the names of types referenced within the given 'TH.Type'+getTyNames :: TH.Type -> S.Set TH.Name+getTyNames ty = case ty of+ ForallT tvb cxt ty' -> getTyNames ty'+ VarT name -> S.empty+ ConT name -> S.singleton name+ TupleT i -> S.empty+ ArrowT -> S.empty+ ListT -> S.empty+ AppT t1 t2 -> getTyNames t1 `S.union` getTyNames t2+ SigT ty kind -> getTyNames ty++-- | Get all the types referenced within the given Haskell constructor.+getTyNamesFromCon :: TH.Con -> S.Set TH.Name+getTyNamesFromCon con = case con of+ (NormalC name stys) -> S.unions (map (\(_,ty) -> getTyNames ty) stys)+ (RecC name vstys) -> S.unions (map (\(_,_,ty) -> getTyNames ty) vstys)+ (InfixC st1 name st2) -> getTyNames (snd st1) `S.union` getTyNames (snd st2)+ (ForallC tvb cxt con) -> getTyNamesFromCon con++-- | Recursively reify types to get all the named types referenced by the given+-- name+getNamedTys :: TH.Name -> Q [TH.Name]+getNamedTys ty_name = S.toList <$> getNamedTys' S.empty (S.singleton ty_name)++-- | Helper for 'getNamedTys'+getNamedTys' :: S.Set TH.Name -> S.Set TH.Name -> Q (S.Set TH.Name)+getNamedTys' answers worklist =+ if S.null worklist then return answers+ else do+ { let (ty_name, worklist') = S.deleteFindMin worklist+ ; let answers' = S.insert ty_name answers+ ; info <- reify ty_name+ ; case info of+ TyConI (NewtypeD [] ty_name' [] _ con derives) -> do+ { let all_nested = getTyNamesFromCon con+ ; let new_nested = all_nested `S.difference` answers'+ ; let new_worklist = worklist' `S.union` new_nested+ ; getNamedTys' answers' new_worklist+ }+ TyConI (DataD [] ty_name' [] _ cons derives) -> do+ { let all_nested = S.unions (map getTyNamesFromCon cons)+ ; let new_nested = all_nested `S.difference` answers'+ ; let new_worklist = worklist' `S.union` new_nested+ ; getNamedTys' answers' new_worklist+ }+ TyConI (TySynD _ _ _ ) -> do {reportError ("getTyNames: unimplemented TySynD case " ++ (nameBase ty_name)); return answers'}+ TyConI (ForeignD _) -> do {reportError ("getTyNames: unimplemented ForeignD case " ++ (nameBase ty_name)); return answers'}+ PrimTyConI _ _ _ -> return answers+ otherwise -> do {reportError ("getTyNames: pattern didn't match for " ++ (nameBase ty_name)); return answers'}+ }++-- | All the base types supported by Pads+baseTypeNames = S.fromList [ ''Int, ''Char, ''Digit, ''Text, ''String, ''StringFW, ''StringME+ , ''StringSE, ''COff, ''EpochTime, ''FileMode, ''Int, ''Word, ''Int64+ , ''Language.Pads.Errors.ErrInfo, ''Bool, ''Binary, ''Base_md, ''UTCTime, ''TimeZone+ ]++-- | Recursively make the pretty printing instance for a given named type by+-- also making instances for all nested types.+mkPrettyInstance :: TH.Name -> Q [TH.Dec]+mkPrettyInstance ty_name = mkPrettyInstance' (S.singleton ty_name) baseTypeNames []++mkMe :: TH.Name -> Q [TH.Dec]+mkMe n = do+ D.traceM "HELLOOOOOOOOOO"+ return []++-- | Helper for 'mkPrettyInstance'+mkPrettyInstance' :: S.Set TH.Name -> S.Set TH.Name -> [TH.Dec] -> Q [TH.Dec]+mkPrettyInstance' worklist done decls =+ if S.null worklist then return decls+ else do+ let (ty_name, worklist') = S.deleteFindMin worklist+ if ty_name `S.member` done then mkPrettyInstance' worklist' done decls+ else do+ let tyBaseName = nameBase ty_name+ let baseStr = strToLower tyBaseName+ let specificPprName = mkName (baseStr ++ "_ppr")+ let funName = mkName (strToLower (tyBaseName ++ "_ppr"))+ let inst = AppT (ConT ''Pretty) (ConT ty_name)+ let genericPprName = mkName "ppr"+ let ppr_method = ValD (VarP genericPprName) (NormalB (VarE specificPprName)) []+ let instD = InstanceD Nothing [] inst [ppr_method]+ let newDone = S.insert ty_name done+ info <- reify ty_name+ (nestedTyNames, decls') <- case info of+ TyConI (NewtypeD [] ty_name' [] _ (NormalC ty_name'' [(Bang NoSourceUnpackedness NoSourceStrictness, AppT ListT ty)]) derives) -> do -- List+ { let nestedTyNames = getTyNames ty+-- ; reportError ("list case " ++ (nameBase ty_name))+ ; (itemsE,itemsP) <- doGenPE "list"+ ; let mapE = AppE (AppE (VarE 'map) (VarE 'ppr)) itemsE+ ; let bodyE = AppE (AppE (VarE 'namedlist_ppr) (nameToStrLit ty_name)) mapE+ ; let argP = ConP (mkName tyBaseName) [itemsP]+ ; let clause = Clause [argP] (NormalB bodyE) []+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]])+ }+ TyConI (NewtypeD [] ty_name' [] _ (NormalC ty_name'' [(Bang NoSourceUnpackedness NoSourceStrictness, AppT (AppT (ConT ty_con_name) ty_arg1) ty_arg2) ]) derives) -> do -- curry rep (Map)+ { let nestedTyNames = getTyNames ty_arg2+ ; (argP, body) <- mkPatBody tyBaseName pprCon2E+-- ; reportError ("curry rep case " ++ (nameBase ty_name))+ ; let clause = Clause [argP] body []+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]])+ }+ TyConI (NewtypeD [] ty_name' [] _ (NormalC ty_name'' [(Bang NoSourceUnpackedness NoSourceStrictness, AppT (ConT ty_con_name) ty_arg) ]) derives) -> do -- con rep (Set)+ { let nestedTyNames = getTyNames ty_arg+ ; (argP, body) <- mkPatBody tyBaseName pprCon1E+-- ; reportError ("con rep case " ++ (nameBase ty_name))+ ; let clause = Clause [argP] body []+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]])+ }+ TyConI (NewtypeD [] ty_name' [] _ (NormalC ty_name'' [(Bang NoSourceUnpackedness NoSourceStrictness, ConT core_name)]) derives) -> do -- App, Typedef+ { (argP, body) <- mkPatBody tyBaseName pprE+-- ; reportError ("app, typedef case " ++ (nameBase ty_name))+ ; let clause = Clause [argP] body []+ ; return (S.singleton core_name, [instD, FunD specificPprName [clause]])+ }+ TyConI (NewtypeD [] ty_name' [] _ (NormalC ty_name'' [(Bang NoSourceUnpackedness NoSourceStrictness, ty)]) derives) | isTuple ty -> do -- Tuple+ { let nestedTyNames = getTyNames ty+-- ; reportError ("tuple case " ++ (nameBase ty_name))+ ; let (len, tys) = tupleTyToListofTys ty+ ; (exps, pats) <- doGenPEs len "tuple"+ ; let bodyE = AppE (AppE (VarE 'namedtuple_ppr) (LitE (StringL tyBaseName))) (pprListEs exps)+ ; let argP = ConP (mkName tyBaseName) [TupP pats]+ ; let clause = Clause [argP] (NormalB bodyE) []+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]])+ }+ TyConI (DataD [] ty_name' [] _ cons derives) | isDataType cons -> do+ { let nestedTyNames = S.unions (map getTyNamesFromCon cons)+ ; (exp, pat) <- doGenPE "case_arg"+ ; matches <- mapM mkClause cons+ ; let caseE = CaseE exp matches+ ; let clause = Clause [pat] (NormalB caseE) []+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]] )+ }+ TyConI (DataD [] ty_name' [] _ cons derives) | isRecordType cons -> do+ { let nestedTyNames = S.unions (map getTyNamesFromCon cons)+-- ; report (length cons /= 1) ("GenPretty: record " ++ (nameBase ty_name') ++ " did not have a single constructor.")+ ; clause <- mkRecord (L.head cons)+ ; return (nestedTyNames, [instD, FunD specificPprName [clause]])+ }+ TyConI (DataD _ ty_name' _ _ cons derives) -> do+ {+-- reportError ("DataD pattern didn't match for"++(nameBase ty_name))+ ; return (S.empty, [])}+ TyConI (TySynD ty_name' [] ty) -> do+ { let nestedTyNames = getTyNames ty+-- ; reportError ("tysyn for"++(nameBase ty_name))+ ; return (nestedTyNames, [])}+ TyConI (TySynD ty_name' tyVarBndrs ty) -> do+ { let nestedTyNames = getTyNames ty+-- ; reportError ("tysyn for"++(nameBase ty_name))+ ; return (nestedTyNames, [])}+ TyConI dec -> do {reportError ("otherwise; tyconI case "++(nameBase ty_name)) ; return (S.empty, [])}+ otherwise -> do {reportError ("pattern didn't match for "++(nameBase ty_name)) ; return (S.empty, [])}+ let newWorklist = worklist `S.union` nestedTyNames+ let newDecls = decls'++decls+ mkPrettyInstance' newWorklist newDone newDecls++-- | Is the given type a TupleT?+isTuple (TupleT n) = True+isTuple (AppT ty _) = isTuple ty++-- | Is the given constructor a normal Haskell constructor?+isDataType [] = False+isDataType (NormalC _ _ : rest) = True+isDataType _ = False++-- | Is the given constructor a Haskell record constructor?+isRecordType [] = False+isRecordType (RecC _ _ : rest) = True+isRecordType _ = False++-- | Make the pattern body of a pretty printer expression for a named Pads type+mkPatBody core_name_str pprE = do+ (exp,pat) <- doGenPE "arg"+ bodyE <- [| namedty_ppr $(litE $ stringL core_name_str) $(return $ pprE exp) |]+ argP <- conP (mkName core_name_str) [return pat]+ return (argP, NormalB bodyE)++-- | Make the pattern body of a pretty printer expression for a Pads type /+-- data constructor without arguments.+mkPatBodyNoArg core_name_str = do+ bodyE <- [| text $(litE $ stringL core_name_str) |]+ argP <- conP (mkName core_name_str) []+ return (argP, NormalB bodyE)++-- | Make the clause for the data constructor of a data type based on whether or+-- not it has any arguments.+mkClause con = case con of+ NormalC name [] -> do+ { (argP, body) <- mkPatBodyNoArg (nameBase name)+ ; return (Match argP body [])+ }+ NormalC name ty_args -> do+ { (argP, body) <- mkPatBody (nameBase name) pprE+ ; return (Match argP body [])+ }+ otherwise -> error "mkClause not implemented for this kind of constructor."++-- | Make the Haskell clause for a Pads record.+mkRecord (RecC rec_name fields) = do+ fieldInfo <- mapM mkField fields+ let (recPs, recEs) = unzip fieldInfo+ let recP = RecP rec_name recPs+ let bodyE = AppE (AppE (VarE 'record_ppr) (nameToStrLit rec_name)) (ListE recEs)+ return (Clause [recP] (NormalB bodyE) [])++-- | Make the field pretty printer case.+mkField (field_name, _, ty) = do+ (expE, pat) <- doGenPE (nameBase field_name)+ fieldE <- [| field_ppr $(return $ nameToStrLit field_name) $(return $ pprE expE) |]+ return ((field_name, pat), fieldE)++nameToStrLit name = LitE (StringL (nameBase name))++instance Pretty a => Pretty (PMaybe a) where+ ppr PNothing = text ""+ ppr (PJust a) = ppr a++instance Pretty a => Pretty (PMaybe_imd a) where+ ppr (PNothing_imd _) = text ""+ ppr (PJust_imd a) = ppr a
+ Language/Pads/Generic.hs view
@@ -0,0 +1,203 @@+{-# LANGUAGE TypeFamilies, ConstraintKinds, MultiParamTypeClasses+ , FunctionalDependencies, ScopedTypeVariables, FlexibleContexts+ , Rank2Types, FlexibleInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Generic+ Description : Default parse values using GHC Generics+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Generic where++import Language.Pads.MetaData+import Language.Pads.PadsParser+import qualified Language.Pads.Errors as E+import qualified Language.Pads.Source as S+import Language.Pads.PadsPrinter+import qualified Data.ByteString as B+import qualified Control.Exception as CE+import Data.Data+import Data.Generics.Aliases (extB, ext1B)+import Data.Map (Map(..))+import qualified Data.Map as Map+import Data.Set (Set(..))+import qualified Data.Set as Set+import Language.Pads.Errors++import System.Posix.Types+import Foreign.C.Types+import System.CPUTime++type Pads rep md = Pads1 () rep md++def :: Pads rep md => rep+def = def1 ()+defaultMd :: Pads rep md => rep -> md+defaultMd = defaultMd1 ()+parsePP :: Pads rep md => PadsParser (rep,md)+parsePP = parsePP1 ()+printFL :: Pads rep md => PadsPrinter (rep,md)+printFL = printFL1 ()+defaultRepMd :: Pads rep md => (rep,md)+defaultRepMd = defaultRepMd1 ()++parseRep :: Pads rep md => String -> rep+parseRep cs = fst $ fst $ parseStringInput parsePP cs++parseS :: Pads rep md => String -> ((rep, md), String)+parseS cs = parseStringInput parsePP cs++parseBS :: Pads rep md => B.ByteString -> ((rep, md), B.ByteString)+parseBS cs = parseByteStringInput parsePP cs++parseFile :: Pads rep md => FilePath -> IO (rep, md)+parseFile file = parseFileWith parsePP file++parseFileWithDisc :: Pads rep md => S.RecordDiscipline -> FilePath -> IO (rep, md)+parseFileWithDisc d file = parseFileWithD d parsePP file++printS :: Pads rep md => (rep,md) -> (String)+printS = S.byteStringToStr . printBS++printRep :: Pads rep md => rep -> String+printRep = printRep1 ()++printBS :: Pads rep md => (rep,md) -> (B.ByteString)+printBS r = let f = (printFL r) in f B.empty++printFile :: Pads rep md => FilePath -> (rep,md) -> IO ()+printFile filepath r = do+ let str = printBS r+ B.writeFile filepath str++printFileRep :: Pads rep md => FilePath -> rep -> IO ()+printFileRep filepath r = printFile filepath (r,defaultMd r)++type family PadsArg rep :: *++class (Data rep, PadsMD md, PadsMD (Meta rep)) => Pads1 arg rep md | rep -> md, rep -> arg where+ def1 :: arg -> rep+ def1 = \_ -> gdef+ defaultMd1 :: arg -> rep -> md+ defaultMd1 _ _ = myempty+ parsePP1 :: arg -> PadsParser (rep,md)+ printFL1 :: arg -> PadsPrinter (rep,md)+ defaultRepMd1 :: arg -> (rep,md)+ defaultRepMd1 arg = (rep,md) where+ rep = def1 arg+ md = defaultMd1 arg rep++parseRep1 :: Pads1 arg rep md => arg -> String -> rep+parseRep1 arg cs = fst $ fst $ parseStringInput (parsePP1 arg) cs++parseS1 :: Pads1 arg rep md => arg -> String -> ((rep, md), String)+parseS1 arg cs = parseStringInput (parsePP1 arg) cs++parseBS1 :: Pads1 arg rep md => arg -> B.ByteString -> ((rep, md), B.ByteString)+parseBS1 arg cs = parseByteStringInput (parsePP1 arg) cs+++parseString1 :: Pads1 arg rep md => arg-> String -> (rep, md)+parseString1 arg str = parseStringWith (parsePP1 arg) str++parseFile1 :: Pads1 arg rep md => arg-> FilePath -> IO (rep, md)+parseFile1 arg file = parseFileWith (parsePP1 arg) file++parseFile1WithDisc :: Pads1 arg rep md => S.RecordDiscipline -> arg -> FilePath -> IO (rep, md)+parseFile1WithDisc d arg file = parseFileWithD d (parsePP1 arg) file++printS1 :: Pads1 arg rep md => arg -> (rep,md) -> (String)+printS1 arg (rep,md) = S.byteStringToStr (printBS1 arg (rep,md))++printRep1 :: Pads1 arg rep md => arg -> rep -> String+printRep1 arg rep = printS1 arg (rep,defaultMd1 arg rep)++printBS1 :: Pads1 arg rep md => arg -> (rep,md) -> (B.ByteString)+printBS1 arg r = let f = (printFL1 arg r) in f B.empty+printFile1 :: Pads1 arg rep md => arg -> FilePath -> (rep,md) -> IO ()+printFile1 arg filepath r = do+ let str = printBS1 arg r+ B.writeFile filepath str++printFileRep1 :: Pads1 arg rep md => arg -> FilePath -> rep -> IO ()+printFileRep1 arg filepath r = printFile1 arg filepath (r,defaultMd1 arg r)++parseStringWith :: (Data rep, PadsMD md) => PadsParser (rep,md) -> String -> (rep,md)+parseStringWith p str = fst $ parseStringInput p str++parseFileWith :: (Data rep, PadsMD md) => PadsParser (rep,md) -> FilePath -> IO (rep,md)+parseFileWith p file = do+ result <- CE.try (parseFileInput p file)+ case result of+ Left (e::CE.SomeException) -> return (gdef, replace_md_header gdef+ (mkErrBasePD (E.FileError (show e) file) Nothing))+ Right r -> return r++parseFileWithD :: (Data rep, PadsMD md) => S.RecordDiscipline -> PadsParser (rep,md) -> FilePath -> IO (rep,md)+parseFileWithD d p file = do+ result <- CE.try (parseFileInputWithDisc d p file)+ case result of+ Left (e::CE.SomeException) -> return (gdef, replace_md_header gdef+ (mkErrBasePD (E.FileError (show e) file) Nothing))+ Right r -> return r++{- Generic function for computing the default for any type supporting Data a interface -}+getConstr :: DataType -> Constr+getConstr ty =+ case dataTypeRep ty of+ AlgRep cons -> head cons+ IntRep -> mkIntegralConstr ty 0+ FloatRep -> mkRealConstr ty 0.0+ CharRep -> mkCharConstr ty '\NUL'+ NoRep -> error "PADSC: Unexpected NoRep in PADS type"++gdef :: Data a => a+gdef = def_help+ where+ def_help+ = let ty = dataTypeOf (def_help)+ constr = getConstr ty+ in fromConstrB gdef constr++ext2 :: (Data a, Typeable t)+ => c a+ -> (forall d1 d2. (Data d1, Data d2) => c (t d1 d2))+ -> c a+ext2 def ext = maybe def id (dataCast2 ext)++newtype B x = B {unB :: x}++ext2B :: (Data a, Typeable t)+ => a+ -> (forall b1 b2. (Data b1, Data b2) => t b1 b2)+ -> a+ext2B def ext = unB ((B def) `ext2` (B ext))++++class BuildContainer2 c key item where+ buildContainer2 :: [(key,item)] -> c key item+ toList2 :: c key item -> [(key,item)]++instance Ord key => BuildContainer2 Map key a where+ buildContainer2 = Map.fromList+ toList2 = Map.toList++class BuildContainer1 c key item where+ buildContainer1 :: [(key,item)] -> c (key, item)+ toList1 :: c (key, item) -> [(key,item)]++instance (Ord a,Ord key) => BuildContainer1 Set key a where+ buildContainer1 = Set.fromList+ toList1 = Set.toList++instance BuildContainer1 [] key a where+ buildContainer1 = id+ toList1 = id+
+ Language/Pads/Library/BigEndian.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, ScopedTypeVariables, MultiParamTypeClasses,+ FlexibleInstances, TypeSynonymInstances, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune, ignore-exports #-}+{-|+ Module : Language.Pads.Library.BigEndian+ Description : Support for parsing of big endian data+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Library.BigEndian where++import Language.Pads.Padsc+import Language.Pads.Library.BinaryUtilities++import qualified Data.Int+import qualified Data.Word+import Data.ByteString as B++-- * Signed Integers+-- | type Int8 : 8-bit, signed integers+type Int8 = Data.Int.Int8+[pads| obtain Int8 from Bytes 1 using <|(bToi8sbh,i8Tobsbh)|> |]+bToi8sbh :: Span -> (Bytes, Base_md) -> (Data.Int.Int8, Base_md)+bToi8sbh p (bytes,md) = (fromIntegral (bytes `B.index` 0), md)+i8Tobsbh (i,md) = (B.singleton (fromIntegral i), md)++-- | type Int16 : signed byte high, 16-bit, signed integers+type Int16 = Data.Int.Int16+[pads| obtain Int16 from Bytes 2 using <| (bToi16sbh,i16sbhTob) |> |]+bToi16sbh p (bs,md) = (bytesToInt16 SBH bs, md)+i16sbhTob (i,md) = (int16ToBytes SBH i, md)++-- | type Int32 : signed byte high, 32-bit, signed integers+type Int32 = Data.Int.Int32+[pads| obtain Int32 from Bytes 4 using <| (bToi32sbh,i32sbhTob) |> |]+bToi32sbh p (bs,md) = (bytesToInt32 SBH bs, md)+i32sbhTob (i,md) = (int32ToBytes SBH i, md)+++-- * Unsigned Integers (aka Words)+-- | type Word8 : signed byte high, 8-bit, unsigned integers+type Word8 = Data.Word.Word8+[pads| obtain Word8 from Bytes 1 using <|(bTow8,w8Tob)|> |]+bTow8 p (bytes,md) = (bytes `B.index` 0, md)+w8Tob (i,md) = (B.singleton i, md)++-- | type Word16 : signed byte high, 16-bit, unsigned integers+type Word16 = Data.Word.Word16+[pads| obtain Word16 from Bytes 2 using <| (bTow16sbh,w16sbhTob) |> |]+bTow16sbh p (bs,md) = (bytesToWord16 SBH bs, md)+w16sbhTob (i,md) = (word16ToBytes SBH i, md)++-- | type Word32 : signed byte high, 32-bit, unsigned integers+type Word32 = Data.Word.Word32+[pads| obtain Word32 from Bytes 4 using <| (bTow32sbh,w32sbhTob) |> |]+bTow32sbh p (bs,md) = (bytesToWord32 SBH bs, md)+w32sbhTob (i,md) = (word32ToBytes SBH i, md)+
+ Language/Pads/Library/BinaryUtilities.hs view
@@ -0,0 +1,114 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, ScopedTypeVariables, MultiParamTypeClasses,+ FlexibleInstances, TypeSynonymInstances, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Library.BinaryUtilities+ Description : Utilities for transforming binary data+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Library.BinaryUtilities where++import Data.Int+import Data.Word+import Data.ByteString as B+import Data.Bits+import System.ByteOrder++-------------------------------------------------------------------------------++-- | * Signed-Byte-High Functions+-- The most significant digit is on the left (lowest address).+-- These functions manage the case where the wire representation+-- is signed-byte high, regardless of the endianness of the host+-- machine.+data Endian = SBH | SBL | Native++bytesToInt16 :: Endian -> B.ByteString -> Int16+bytesToInt16 endian = fromIntegral . (bytesToWord16 endian)++int16ToBytes :: Endian -> Int16 -> B.ByteString+int16ToBytes endian = (word16ToBytes endian) . fromIntegral+++bytesToInt32 :: Endian -> B.ByteString -> Int32+bytesToInt32 endian = fromIntegral . (bytesToWord32 endian)++int32ToBytes :: Endian -> Int32 -> B.ByteString+int32ToBytes endian = (word32ToBytes endian) . fromIntegral+++bytesToWord16 :: Endian -> B.ByteString -> Word16+bytesToWord16 endian b =+ let b0 :: Word16 = fromIntegral (b `B.index` 0)+ b1 :: Word16 = fromIntegral (b `B.index` 1)+ in+ case (endian, byteOrder) of+ (SBH, BigEndian) -> assembleWord16 (b1, b0)+ (SBH, LittleEndian) -> assembleWord16 (b0, b1)+ (SBL, BigEndian) -> assembleWord16 (b0, b1)+ (SBL, LittleEndian) -> assembleWord16 (b1, b0)+ (Native, BigEndian) -> assembleWord16 (b0, b1)+ (Native, LittleEndian) -> assembleWord16 (b1, b0)+++word16ToBytes :: Endian -> Word16 -> B.ByteString+word16ToBytes endian word16 =+ let w0 :: Word8 = fromIntegral (shiftR (word16 .&. 0xFF00) 8)+ w1 :: Word8 = fromIntegral (word16 .&. 0x00FF)+ in case (endian, byteOrder) of+ (SBH, BigEndian) -> B.pack [w1,w0]+ (SBH, LittleEndian) -> B.pack [w0,w1]+ (SBL, BigEndian) -> B.pack [w0,w1]+ (SBL, LittleEndian) -> B.pack [w1,w0]+ (Native, BigEndian) -> B.pack [w0,w1]+ (Native, LittleEndian) -> B.pack [w1,w0]+++assembleWord16 :: (Word16, Word16) -> Word16+assembleWord16 (b0, b1) = shift b0 8 .|. b1++++bytesToWord32 :: Endian -> B.ByteString -> Word32+bytesToWord32 endian b =+ let b0 :: Word32 = fromIntegral (b `B.index` 0)+ b1 :: Word32 = fromIntegral (b `B.index` 1)+ b2 :: Word32 = fromIntegral (b `B.index` 2)+ b3 :: Word32 = fromIntegral (b `B.index` 3)+ in+ case (endian, byteOrder) of+ (SBH, BigEndian) -> assembleWord32 (b3, b2, b1, b0)+ (SBH, LittleEndian) -> assembleWord32 (b0, b1, b2, b3)+ (SBL, BigEndian) -> assembleWord32 (b0, b1, b2, b3)+ (SBL, LittleEndian) -> assembleWord32 (b3, b2, b1, b0)+ (Native, BigEndian) -> assembleWord32 (b0, b1, b2, b3)+ (Native, LittleEndian) -> assembleWord32 (b3, b2, b1, b0)+++word32ToBytes :: Endian -> Word32 -> B.ByteString+word32ToBytes endian word32 =+ let w0 :: Word8 = fromIntegral (shiftR (word32 .&. 0xFF000000) 24)+ w1 :: Word8 = fromIntegral (shiftR (word32 .&. 0x00FF0000) 16)+ w2 :: Word8 = fromIntegral (shiftR (word32 .&. 0x0000FF00) 8)+ w3 :: Word8 = fromIntegral (word32 .&. 0x000000FF)+ in case (endian, byteOrder) of+ (SBH, BigEndian) -> B.pack [w3,w2,w1,w0]+ (SBH, LittleEndian) -> B.pack [w0,w1,w2,w3]+ (SBL, BigEndian) -> B.pack [w0,w1,w2,w3]+ (SBL, LittleEndian) -> B.pack [w3,w2,w1,w0]+ (Native, BigEndian) -> B.pack [w0,w1,w2,w3]+ (Native, LittleEndian) -> B.pack [w3,w2,w1,w0]+++assembleWord32 :: (Word32, Word32, Word32, Word32) -> Word32+assembleWord32 (b0, b1, b2, b3) =+ shift b0 24 .|. shift b1 16 .|. shift b2 8 .|. b3++-------------------------------------------------------------------------------+
+ Language/Pads/Library/LittleEndian.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, ScopedTypeVariables, MultiParamTypeClasses,+ FlexibleInstances, TypeSynonymInstances, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Library.LittleEndian+ Description : Support for parsing of little endian data+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Library.LittleEndian where++import Language.Pads.Padsc+import Language.Pads.Library.BinaryUtilities++import qualified Data.Int+import qualified Data.Word+import Data.ByteString as B++-------------------------------------------------------------------------------+-- * Signed Integers+-- | type Int8 : signed byte low, 8-bit, signed integers+type Int8 = Data.Int.Int8+[pads| obtain Int8 from Bytes 1 using <|(bToi8,i8Tob)|> |]+bToi8 :: Span -> (Bytes, Base_md) -> (Data.Int.Int8, Base_md)+bToi8 p (bytes,md) = (fromIntegral (bytes `B.index` 0), md)+i8Tob (i,md) = (B.singleton (fromIntegral i), md)++-- | type Int16 : signed byte low, 16-bit, signed integers+type Int16 = Data.Int.Int16+[pads| obtain Int16 from Bytes 2 using <| (bToi16sbl,i16sblTob) |> |]+bToi16sbl p (bs,md) = (bytesToInt16 SBL bs, md)+i16sblTob (i,md) = (int16ToBytes SBL i, md)++-- | type Int32 : signed byte low, 32-bit, signed integers+type Int32 = Data.Int.Int32+[pads| obtain Int32 from Bytes 4 using <| (bToi32sbl,i32sblTob) |> |]+bToi32sbl p (bs,md) = (bytesToInt32 SBL bs, md)+i32sblTob (i,md) = (int32ToBytes SBL i, md)++-------------------------------------------------------------------------------+-- * Unsigned Integers (aka Words)+-- | type Word8 : signed byte low, 8-bit, unsigned integers+type Word8 = Data.Word.Word8+[pads| obtain Word8 from Bytes 1 using <|(bTow8,w8Tob)|> |]+bTow8 p (bytes,md) = (bytes `B.index` 0, md)+w8Tob (i,md) = (B.singleton i, md)++type Word16 = Data.Word.Word16+-- | type Word16 : signed byte low, 16-bit, unsigned integers+[pads| obtain Word16 from Bytes 2 using <| (bTow16sbl,w16sblTob) |> |]+bTow16sbl p (bs,md) = (bytesToWord16 SBL bs, md)+w16sblTob (i,md) = (word16ToBytes SBL i, md)++type Word32 = Data.Word.Word32+-- | type Word32 : signed byte low, 32-bit, unsigned integers+[pads| obtain Word32 from Bytes 4 using <| (bTow32sbl,w32sblTob) |> |]+bTow32sbl p (bs,md) = (bytesToWord32 SBL bs, md)+w32sblTob (i,md) = (word32ToBytes SBL i, md)+
+ Language/Pads/Library/Native.hs view
@@ -0,0 +1,78 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, ScopedTypeVariables, MultiParamTypeClasses,+ FlexibleInstances, TypeSynonymInstances, UndecidableInstances #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Library.Native+ Description : Support for parsing of native byte order data+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Library.Native where++import Language.Pads.Padsc+import Language.Pads.Library.BinaryUtilities++import qualified Data.Int+import qualified Data.Word+import Data.ByteString as B++-------------------------------------------------------------------------------+-- * Signed Integers+-- | type Int8 : 8-bit, signed integers+type Int8 = Data.Int.Int8+[pads| obtain Int8 from Bytes 1 using <|(bToi8,i8Tob)|> |]+bToi8 :: Span -> (Bytes, Base_md) -> (Data.Int.Int8, Base_md)+bToi8 p (bytes,md) = (fromIntegral (bytes `B.index` 0), md)+i8Tob :: (Int8,Int8_md) -> (Bytes,Bytes_md)+i8Tob (i,md) = (B.singleton (fromIntegral i), md)+++-- | type Int16 : 16-bit, signed integers; bytes assembled in order+type Int16 = Data.Int.Int16+[pads| obtain Int16 from Bytes 2 using <| (bToi16,i16Tob) |> |]+bToi16 :: Span -> (Bytes,Bytes_md) -> (Int16,Int16_md)+bToi16 p (bs,md) = (bytesToInt16 Native bs, md)+i16Tob :: (Int16,Int16_md) -> (Bytes,Bytes_md)+i16Tob (i,md) = (int16ToBytes Native i, md)+++-- | type Int32 : 32-bit, signed integers; bytes assembled in order+type Int32 = Data.Int.Int32+[pads| obtain Int32 from Bytes 4 using <|(bToi32,i32Tob)|> |]+bToi32 :: Span -> (Bytes,Bytes_md) -> (Int32,Int32_md)+bToi32 p (bytes,md) = (bytesToInt32 Native bytes, md)+i32Tob :: (Int32,Int32_md) -> (Bytes,Bytes_md)+i32Tob (i,md) = (int32ToBytes Native i, md)++-------------------------------------------------------------------------------+-- * Unsigned Integers (aka Words)+-- | type Word8 : 8-bit, unsigned integers, raw order+type Word8 = Data.Word.Word8+[pads| obtain Word8 from Bytes 1 using <|(bTow8,w8Tob)|> |]+bTow8 :: Span -> (Bytes,Bytes_md) -> (Word8,Word8_md)+bTow8 p (bytes,md) = (bytes `B.index` 0, md)+w8Tob :: (Word8,Word8_md) -> (Bytes,Bytes_md)+w8Tob (i,md) = (B.singleton i, md)++-- | type Word16 : 16-bit, unsigned integers, raw order+type Word16 = Data.Word.Word16+[pads| obtain Word16 from Bytes 2 using <|(bTow16,w16Tob)|> |]+bTow16 :: Span -> (Bytes,Bytes_md) -> (Word16,Word16_md)+bTow16 p (bytes,md) = (bytesToWord16 Native bytes, md)+w16Tob :: (Word16,Word16_md) -> (Bytes,Bytes_md)+w16Tob (i,md) = (word16ToBytes Native i, md)++-- | type Word32 : 32-bit, unsigned integers, raw order+type Word32 = Data.Word.Word32+[pads| obtain Word32 from Bytes 4 using <|(bTow32,w32Tob)|> |]+bTow32 :: Span -> (Bytes,Bytes_md) -> (Data.Word.Word32,Word32_md)+bTow32 p (bytes,md) = (bytesToWord32 Native bytes, md)+w32Tob :: (Data.Word.Word32,Word32_md) -> (Bytes,Bytes_md)+w32Tob (i,md) = (word32ToBytes Native i, md)++
+ Language/Pads/MetaData.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE Rank2Types, TypeFamilies, KindSignatures, NamedFieldPuns, DisambiguateRecordFields+ , FlexibleInstances, DeriveDataTypeable, ConstraintKinds, MultiParamTypeClasses+ , ScopedTypeVariables, FlexibleContexts #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.MetaData+ Description : Metadata produced by a Pads parser+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ ++-}+module Language.Pads.MetaData where++import qualified Language.Pads.Errors as E+import qualified Language.Pads.Source as S+import Text.PrettyPrint.Mainland as PP+import Text.PrettyPrint.Mainland.Class++import System.Posix.Types++import Data.Generics+import Data.Map (Map(..))+import qualified Data.Map as Map+import Data.Set (Set(..))+import qualified Data.Set as Set+import Data.List++-- | Base type library support for internal (to Pads) metadata+data Base_md = Base_md { numErrors :: Int+ , errInfo :: Maybe E.ErrInfo+ -- Need to add location information, etc.+ }+ deriving (Typeable, Data, Eq, Ord, Show)+++-- | Meta data type class+class Data md => PadsMD md where+ get_md_header :: md -> Base_md+ replace_md_header :: md -> Base_md -> md++-- | The trivial case for when the Pads parser doesn't need to add any metadata.+instance PadsMD Base_md where+ get_md_header b = b+ replace_md_header old new = new++-- | If we have a 2-tuple where the first thing is of type Base_md, then the tuple+-- itself is a Pads metadata instance.+instance Data b => PadsMD (Base_md,b) where+ get_md_header (h,b) = h+ replace_md_header (h1,b) h2 = (h2,b)++-- | Default metadata instance with no errors being reported.+cleanBasePD = Base_md {numErrors = 0, errInfo = Nothing }++-- | Default metadata instance with a generic "file error" being reported.+errorBasePD msg path = Base_md {numErrors = 1, errInfo = Just (E.ErrInfo (E.FileError msg path) Nothing) }++-- | Metadata merge+mergeBaseMDs :: [Base_md] -> Base_md+mergeBaseMDs mds = foldl addInfo cleanBasePD mds+ where+ addInfo (Base_md {numErrors=num1,errInfo=i1})+ (Base_md {numErrors=num2,errInfo=i2})+ = Base_md {numErrors=num1 + num2, errInfo= E.maybeMergeErrInfo i1 i2 }++-- | Metadata for a single parse error occuring at some location 'Loc'.+mkErrBasePDfromLoc msg loc+ = Base_md {numErrors = 1,+ errInfo = Just (E.ErrInfo{msg=msg,position= Just (S.locToSpan loc)}) }++-- | Metadata for a single parse error occuring at some position 'Span'.+mkErrBasePD msg pos+ = Base_md {numErrors = 1,+ errInfo = Just (E.ErrInfo{msg=msg,position= pos}) }++instance Pretty Base_md where+ ppr = pprBaseMD++-- | Pretty printer for the base metadata type.+pprBaseMD Base_md {numErrors=num, errInfo = info}+ = text "Errors:" <+> ppr num <+>+ case info of+ Nothing -> PP.empty+ Just e -> ppr e++type family Meta (rep :: *) :: *++-- | Fancy 'Generic' magic for defining a function that produces a default value+-- for any type so long as that type is an instance of Data. We do this by+-- selecting the first alternative of algebraic data types and recursively+-- filling in any nested types with default values as well. For instance:+--+-- > > :set -XDeriveDataTypeable+-- > > type Bar = (Int,Char)+-- > > data Foo = A Bar Bar | B | C deriving (Data, Show)+-- > > myempty :: Foo+-- > A (0,'\NUL') (0,'\NUL')+myempty :: forall a. Data a => a+myempty = general+ `extB` char+ `extB` int+ `extB` integer+ `extB` float+ `extB` double+ `extB` coff+ `extB` epochTime+ `extB` fileMode+ `ext2B` map+ `ext1B` set+ `ext1B` list where+ -- Generic case+ general :: Data a => a+ general = fromConstrB myempty (indexConstr (dataTypeOf general) 1)++ -- Base cases+ char = '\NUL'+ int = 0 :: Int+ integer = 0 :: Integer+ float = 0.0 :: Float+ double = 0.0 :: Double+ coff = 0 :: COff+ epochTime = 0 :: EpochTime+ fileMode = 0 :: FileMode+ list :: Data b => [b]+ list = []+ map :: (Data k,Data v) => Map k v+ map = Map.empty+ set :: Data k => Set k+ set = Set.empty+
+ Language/Pads/PadsParser.hs view
@@ -0,0 +1,534 @@+{-# LANGUAGE NamedFieldPuns #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.PadsParser+ Description : The parsing monad for Pads+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ These are the combinators used to build PADS parsers. In this module we define+ the 'PadsParser' parsing monad which operates in a model where each parsing+ step (bind in the monad) runs a function `f :: Source -> (a, Source)`. This is+ similar to how the 'Read' typeclass implements parsing where we return the thing+ parsed by `f` of type `a` along with the remainder source input of type+ `Source`.++ Some important notes for future developers:+ - 'primPads' and 'queryP' below let you define new PadsParsers using Haskell+ functions without having to crack open the monad yourself.+ - As soon as the monad encounters a failure, we stop parsing and return the+ parsed result as far as we got in the input string.++-}++module Language.Pads.PadsParser where++import qualified Language.Pads.Source as S+import Language.Pads.Errors+import Language.Pads.MetaData+import Language.Pads.RegExp+import Data.Char+import Data.Word++import Control.Applicative (Applicative(..))+import Control.Monad++-- | Take a 'PadsParser' for some type and an input 'String' and parse the+-- 'String' using the 'PadsParser'.+parseStringInput :: PadsParser a -> String -> (a,String)+parseStringInput pp cs =+ let ((r,rest),b) = pp # S.padsSourceFromString cs+ in (r, S.padsSourceToString rest)++-- | Same as 'parseStringInput' but with a 'RawStream' source as input.+parseByteStringInput :: PadsParser a -> S.RawStream -> (a, S.RawStream)+parseByteStringInput pp cs =+ let ((r,rest),b) = pp # S.padsSourceFromByteString cs+ in (r, S.padsSourceToByteString rest)++-- | Same as 'parseStringInput' but with a 'FilePath' as input and 'IO' output.+parseFileInput :: PadsParser a -> FilePath -> IO a+parseFileInput pp file = do+ source <- S.padsSourceFromFile file+ let ((r,rest),b) = pp # source+ return r++-- | Same as 'parseFileInput' but with the ability to specify a non-default+-- record discipline.+parseFileInputWithDisc :: S.RecordDiscipline -> PadsParser a -> FilePath -> IO a+parseFileInputWithDisc d pp file = do+ source <- S.padsSourceFromFileWithDisc d file+ let ((r,rest),b) = pp # source+ return r++-------------------------------------------------------------------------------+-- * The Pads Parsing Monad++-- | A Pads parser is a function over inputs to some type `a` and the remaining+-- input.+newtype PadsParser a = PadsParser { (#) :: S.Source -> Result (a,S.Source) }++-- | A Pads parse result is just a tuple of the type parsed and a boolean+-- indicating whether or not a parse error occured. If the boolean is False,+-- the result type has been populated with default values. See+-- "Language.Pads.Generic" for the type class implementing default values, and+-- "Language.Pads.CoreBaseTypes" for definitions of default values for the+-- built-in types.+type Result a = (a,Bool)++-- | A Pads parser can be mapped over, which just says we need to run the+-- parser, grab the resulting parsed value, and apply the function we're mapping+-- to that result.+instance Functor PadsParser where+ fmap f p = PadsParser $ \bs -> let ((x,bs'),b) = p # bs in+ ((f x, bs'),b)++-- | This monad instance for Pads parsers looks just like any other sequencing+-- monad (run the first one and pipe the result into the second) with one thing+-- added: if any results on the way are bad, then the whole parse is bad.+instance Monad PadsParser where+ return r = PadsParser $ \bs -> ((r,bs), True)+ p >>= f = PadsParser $ \bs -> let ((v,bs'),b) = p # bs+ ((w,bs''),b') = f v # bs'+ in ((w,bs''), b && b')++-- | Applicative instance for 'PadsParser' to satisfy GHC+instance Applicative PadsParser where+ pure = return+ (<*>) = ap++-- | A pads parsing combinator used by other pads parsers when they detect a+-- parse error.+badReturn r = PadsParser $ \bs -> ((r,bs), False)++-- | +mdReturn (rep,md) = PadsParser $+ \bs -> (((rep,md),bs), numErrors (get_md_header md) == 0)++-- | Construct a Pads parser which always returns the given value and metadata+-- reporting no errors.+returnClean :: t -> PadsParser (t, Base_md)+returnClean x = return (x, cleanBasePD)++-- | Construct a Pads parser which always reports the given error message along+-- with returning a (likely default) value given to us.+returnError :: t -> ErrMsg -> PadsParser (t, Base_md)+returnError x err = do loc <- getLoc+ badReturn (x, mkErrBasePDfromLoc err loc)++infixl 5 =@=, =@++-- | +(=@=) :: PadsParser (t3 -> t2, t1 -> t)+ -> PadsParser (t3, t1)+ -> PadsParser (t2, t)+p =@= q = do + (f,g) <- p+ (rep,md) <- q+ return (f rep, g md)++(=@) :: PadsParser (t3, t2 -> t1)+ -> PadsParser (t, t2)+ -> PadsParser (t3, t1)+p =@ q = do+ (f,g) <- p+ (rep,md) <- q+ return (f, g md)++-------------------------------------------------------------------------------+-- * Source manipulation functions++-- | Run a pure function on the current source input from inside the+-- 'PadsParser' monad. Used for detecting things like 'isEOF', 'isEOR', or for+-- peaking at the current head of the input with 'peekHeadP'.+queryP :: (S.Source -> a) -> PadsParser a+queryP f = PadsParser $ \bs -> ((f bs,bs), True)++-- | Run a pure function to mutate the current input source.+primPads :: (S.Source -> (a,S.Source)) -> PadsParser a+primPads f = PadsParser $ \bs -> (f bs, True)++-- | Lift a function which runs in the 'Maybe' monad to run in the 'PadsParser'+-- monad with the same semantics as 'primPads', with the added ability that a+-- Nothing produces a parse failure.+liftStoP :: (S.Source -> Maybe (a,S.Source)) -> a -> PadsParser a+liftStoP f def = PadsParser $ \bs ->+ case f bs of+ Nothing -> ((def,bs), False)+ Just (v,bs') -> ((v,bs'), True)++-- | Replace the source in the given 'Result' with the given 'Source'+replaceSource :: S.Source -> Result (a,S.Source) -> Result (a,S.Source)+replaceSource bs ((v,_),b) = ((v,bs),b)++-------------------------------------------------------------------------------+-- * Monad choice combinators++-- The monad is non-backtracking. The only choice point is at ChoiceP++-- | One-by-one try a list of parsers in order until you find the one that works+-- and return that one. If none of them work, return the last one that failed.+choiceP :: [PadsParser a] -> PadsParser a+choiceP ps = foldr1 (<||>) ps++-- | Try the first parser and if it fails, try the second parser+(<||>) :: PadsParser a -> PadsParser a -> PadsParser a+p <||> q = PadsParser $ \bs -> (p # bs) <++> (q # bs)++-- | Grab the first result if it succeeded, otherwise use the second one+(<++>) :: Result a -> Result a -> Result a+(r, True) <++> _ = (r, True)+(r1, False) <++> r2 = r2 -- A number of functions rely on this being r2++-------------------------------------------------------------------------------++-- | Run the given Pads parser on the current input, but after running it+-- replace the (now possibly mutated input) with the original input while+-- returning the result parsed.+parseTry :: PadsMD md => PadsParser (rep,md) -> PadsParser (rep,md)+parseTry p = do+ (rep, md) <- PadsParser $ \bs -> replaceSource bs (p # bs)+ mdReturn (rep, md)++-------------------------------------------------------------------------------+-- * Parsers for Pads language features++-- | This is where constraint predicates get run and converted into error+-- messages upon predicate failure.+parseConstraint :: PadsMD md =>+ PadsParser(rep,md) -> (rep -> md -> Bool) -> PadsParser(rep, md)+parseConstraint p pred = do+ (rep,md) <- p+ mdReturn (rep, replace_md_header md (constraintReport (pred rep md) md))++-- | Convert the result of running a Pads constraint predicate into an error+-- message.+constraintReport :: PadsMD md => Bool -> md -> Base_md+constraintReport isGood md = Base_md {numErrors = totErrors, errInfo = errors}+ where+ Base_md {numErrors, errInfo} = get_md_header md+ totErrors = if isGood then numErrors else numErrors + 1+ errors = if totErrors == 0 then Nothing else+ Just(ErrInfo {msg = if isGood then UnderlyingTypedefFail+ else PredicateFailure,+ position = join $ fmap position errInfo})++-------------------------------------------------------------------------------++-- | Run the given parser and transform the result using the given Haskell+-- function, which originally looked like this in Pads syntax:+--+-- > type Foo = transform Bar => Baz using <|(bar2baz, baz2bar)|>+--+-- The first function in the antiquoted tuple (bar2baz) is run here, whereas the+-- second function in the tuple (baz2bar) is used during pretty printing.+parseTransform :: PadsMD dmd =>+ PadsParser (sr,smd) -> (S.Span->(sr,smd)->(dr,dmd)) -> PadsParser (dr,dmd)+parseTransform sParser transform = do+ begin_loc <- getLoc+ src_result <- sParser+ end_loc <- getLoc+ let src_pos = S.locsToSpan begin_loc end_loc+ return (transform src_pos src_result)++-------------------------------------------------------------------------------++-- | Run a parser with the appropriate record discipline enabled in the parsing+-- monad. See the 'RecordDiscipline' data type for the available disciplines+-- along with appropriate Haskell functions that can be referenced from a Pads+-- partition expression, e.g.:+--+-- > type Foo = partition Bar using none+--+-- Note that the record discipline specified in a partition expression remains+-- active until the parsing monad encounters another partition expression. This+-- effectively means that record disciplines form a stack that get popped off as+-- parsers complete. This stack however is implemented as scoped variables in+-- nested calls of this function rather than as a Haskell stack stored in the+-- monad.+parsePartition :: PadsMD md =>+ PadsParser(rep,md) -> S.RecordDiscipline -> PadsParser(rep, md)+parsePartition p newDisc = do+ oldDisc <- queryP S.getRecordDiscipline+ primPads (S.setRecordDiscipline newDisc)+ x <- p+ primPads (S.setRecordDiscipline oldDisc)+ return x++-------------------------------------------------------------------------------++-- | +parseListNoSepNoTerm :: PadsMD md =>+ PadsParser (rep,md) -> PadsParser ([rep], (Base_md, [md]))+parseListNoSepNoTerm p = listReport (parseMany p)++-- | +parseListSepNoTerm :: (PadsMD md, PadsMD mdSep) =>+ PadsParser (repSep,mdSep) -> PadsParser(rep, md) -> PadsParser ([rep], (Base_md, [md]))+parseListSepNoTerm sep p = listReport (parseManySep sep p)++-- | +parseListNoSepLength :: (PadsMD md) =>+ Int -> PadsParser(rep, md) -> PadsParser ([rep], (Base_md, [md]))+parseListNoSepLength i p = listReport (parseCount i p)++-- | +parseListSepLength :: (PadsMD md, PadsMD mdSep) =>+ PadsParser (repSep,mdSep) -> Int -> PadsParser(rep, md) -> PadsParser ([rep], (Base_md, [md]))+parseListSepLength sep n p = listReport (parseCountSep n sep p)++-- | +parseListNoSepTerm :: (PadsMD md, PadsMD mdTerm) =>+ PadsParser (repTerm,mdTerm) -> PadsParser(rep, md) -> PadsParser ([rep], (Base_md, [md]))+parseListNoSepTerm term p = listReport (parseManyTerm term p)++-- | +parseListSepTerm :: (PadsMD md, PadsMD mdSep, PadsMD mdTerm) =>+ PadsParser (repSep,mdSep) -> PadsParser (repTerm,mdTerm) ->+ PadsParser(rep, md) -> PadsParser ([rep], (Base_md, [md]))+parseListSepTerm sep term p = listReport (parseManySepTerm sep term p)++-- | +listReport :: PadsMD b => PadsParser [(a, b)] -> PadsParser ([a], (Base_md, [b]))+listReport p = do+ listElems <- p+ let (reps, mds) = unzip listElems+ let hmds = map get_md_header mds+ return (reps, (mergeBaseMDs hmds, mds))++-------------------------------------------------------------------------------++-- | Parse zero or more instances of the given parser. Stop parsing when the+-- parser encounters something it is unable to parse properly. This means,+-- during a valid parse, we attempt to parse more of the input than we really+-- should and only given up when there isn't a single valid parse.+parseMany :: PadsMD md => PadsParser (rep,md) -> PadsParser [(rep,md)]+parseMany p = do (r,m) <- p+ if (numErrors (get_md_header m) == 0)+ then do { rms <- parseMany p+ ; return ((r,m) : rms)}+ else badReturn []++ <||> return []++-- | Parse one or more instances of the given parser.+parseManySep :: (PadsMD md, PadsMD mdSep) => PadsParser (repSep,mdSep) -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseManySep sep p = do { rm <- p+ ; rms <- parseManySep1 sep p+ ; return (rm : rms)+ }++-- | Parse zero or more instances of the given parser. TODO: The name of this+-- and 'parseManySep' are misleading / should be swapped?+parseManySep1 :: (PadsMD md, PadsMD mdSep) => PadsParser (repSep,mdSep) -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseManySep1 sep p = do (r,m) <- sep+ if (numErrors (get_md_header m) == 0)+ then parseManySep sep p+ else badReturn []+ <||> return []++-------------------------------------------------------------------------------++-- | Parse n instances of the given parser.+parseCount :: (PadsMD md) => Int -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseCount n p = sequence (replicate n p)++-- | Parse n instances of the given parser with another parser acting as the+-- separator between instances of the first parser. Note that this properly+-- intersperses the separator +parseCountSep :: (PadsMD md) =>+ Int -> PadsParser rmdSep -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseCountSep n sep p | n <= 0 = return []+parseCountSep n sep p = do+ rm <- p+ rms <- sequence $ replicate (n-1) (sep >> p)+ return (rm:rms)++-------------------------------------------------------------------------------++-- | Parse many instances of the given parser until we see an instance of the+-- terminator parser. Parsing satisfies the following rules in decreasing order+-- of precedence:+-- * If we see the terminator, parse it and stop parsing (even if the terminator+-- is ambiguous with the given parser).+-- * If we see the end of file, stop parsing and return what we've parsed thus+-- far.+-- * Parse an instance of the given parser and recurse.+parseManyTerm :: (PadsMD md, PadsMD mdTerm) =>+ PadsParser (repTerm,mdTerm) -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseManyTerm term p = (term >> return [])+ <||> (ifEOFP >> return [])+ <||> do { rm <- p+ ; rms <- parseManyTerm term p+ ; return (rm:rms) }++-- | Like 'parseManyTerm' but with a separator in-between instances of the given+-- parser.+parseManySepTerm :: (PadsMD md, PadsMD mdSep, PadsMD mdTerm) =>+ PadsParser (repSep,mdSep) -> PadsParser (repTerm,mdTerm) -> PadsParser(rep, md) -> PadsParser [(rep,md)]+parseManySepTerm sep term p = (term >> return [])+ <||> (ifEOFP >> return [])+ <||> scan+ where+ scan = do (rep, md) <- p+ (terminated,junk) <- seekSep sep term+ case junk of+ [] -> if terminated then return [(rep,md)] else+ do rms <- scan+ return ((rep,md):rms)+ _ -> do sepLoc <- getLoc+ let report = junkReport md sepLoc junk+ if terminated then+ badReturn [(rep,report)]+ else do+ rms <- scan+ badReturn ((rep,report) : rms)++-- | Consume input until we find the terminator, separator, end-of-file, or+-- end-of-record. If we find (in decreasing order of precedence):+-- * The terminator, then report that we successfully terminated+-- * The end-of-file, report successful termination.+-- * The separator, report that we successfully seeked until a separator was+-- consumed from the input.+-- * An end-of-record symbol, report a bad parse+--+-- Note that the fact that we report successful termination upon end-of-file is+-- probably a bug, because it means we report a successful parse even though we+-- didn't find the terminator to the list being parsed.+seekSep sep term = (term >> return (True, []))+ <||> (ifEOFP >> return (True, []))+ <||> (sep >> return (False, []))+ <||> do { b <- isEORP+ ; if b then badReturn (False, []) else+ do { c <- takeHeadP+ ; (b,cs) <- seekSep sep term+ ; badReturn (b, c:cs)+ }+ }++-- | +junkReport md loc junk = replace_md_header md mergeMD+ where+ mdSep = mkErrBasePDfromLoc (ExtraStuffBeforeTy junk "separator" ) loc+ mergeMD = mergeBaseMDs [get_md_header md, mdSep]++-------------------------------------------------------------------------------++-- | Get the current source location offset into the data we're currently+-- parsing.+getLoc :: PadsParser S.Loc+getLoc = queryP S.getSrcLoc++isEOFP, isEORP :: PadsParser Bool+isEOFP = queryP S.isEOF+isEORP = queryP S.isEOR++ifEOFP, ifEORP :: PadsParser ()+ifEOFP = do { b <- isEOFP; if b then return () else badReturn ()}+ifEORP = do { b <- isEORP; if b then return () else badReturn ()}++-- | Remove and return the first n characters from the input source+takeP :: Integral a => a -> PadsParser String+takeP n = primPads (S.take (fromInt n))++-- | Remove and return the first n bytes from the input source+takeBytesP :: Integral a => a -> PadsParser S.RawStream+takeBytesP n = primPads (S.takeBytes (fromInt n))++takeBytesNBP :: Integral a => a -> PadsParser S.RawStream+takeBytesNBP n = primPads (S.takeBytesNB (fromInt n))++takeBitsP :: Integral a => a -> PadsParser Integer+takeBitsP b = primPads (S.takeBits (fromInt b))++takeBits8P :: Integral a => a -> PadsParser Word8+takeBits8P b = primPads (S.takeBits8 (fromInt b))++takeBits16P :: Integral a => a -> PadsParser Word16+takeBits16P b = primPads (S.takeBits16 (fromInt b))++takeBits32P :: Integral a => a -> PadsParser Word32+takeBits32P b = primPads (S.takeBits32 (fromInt b))++takeBits64P :: Integral a => a -> PadsParser Word64+takeBits64P b = primPads (S.takeBits64 (fromInt b))++fromInt :: (Integral a1, Num a) => a1 -> a+fromInt n = fromInteger $ toInteger n++-------------------------------------------------------------------------------++-- | Query the current symbol (character) of input+peekHeadP :: PadsParser Char+peekHeadP = queryP S.head++-- | Remove and return the current symbol (character) of input+takeHeadP :: PadsParser Char+takeHeadP = primPads S.takeHead++-- | See 'takeHeadStr' - returns false in the PadsParser monad iff the front of+-- current source matches the given string with the side effect of removing that+-- string from the front of the source if it does.+takeHeadStrP :: String -> PadsParser Bool+takeHeadStrP str = primPads (S.takeHeadStr str)++-- Return string is junk before found string+scanStrP :: String -> PadsParser (Maybe String)+scanStrP str = primPads (S.scanStr str)+++regexMatchP ::RE -> PadsParser (Maybe String)+regexMatchP re = primPads (S.regexMatch re)++regexStopP :: RE -> PadsParser (Maybe String)+regexStopP re = primPads (S.regexStop re)++scanP :: Char -> PadsParser Bool+scanP c = primPads (\s -> let (f,r,e) = S.scanTo c s in (f,r))++getAllP :: PadsParser String+getAllP = primPads S.drainSource++getAllBinP :: PadsParser S.RawStream+getAllBinP = primPads S.rawSource++drainSourceNBP :: PadsParser String+drainSourceNBP = primPads S.drainSourceNB++satisfy p = primPads loop+ where loop s = if S.isEOF s || S.isEOR s then ([],s) else+ let c = S.head s in+ if p c then+ let (xs,s') = loop (S.tail s) in+ (c:xs, s')+ else+ ([],s)++satisfyNBP :: (Char -> Bool) -> (PadsParser String)+satisfyNBP p = primPads (S.satisfyNB p)++digitListToInt :: Bool -> [Char] -> Int+digitListToInt isNeg digits = if isNeg then negate raw else raw+ where+ raw = foldl (\a d ->10*a + digitToInt d) 0 digits++-------------------------------------------------------------------------------++doLineBegin :: PadsParser ((), Base_md)+doLineBegin = do+ rbegErr <- primPads S.srcLineBegin+ case rbegErr of+ Nothing -> returnClean ()+ Just err -> returnError () (LineError err)+++doLineEnd :: PadsParser ((), Base_md)+doLineEnd = do+ rendErr <- primPads S.srcLineEnd+ case rendErr of+ Nothing -> returnClean ()+ Just err -> returnError () (LineError err)
+ Language/Pads/PadsPrinter.hs view
@@ -0,0 +1,123 @@+{-# LANGUAGE FlexibleContexts, DeriveDataTypeable #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.PadsPrinter+ Description : Lazy Pads printing monad+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ This module provides a way to lazily append to a ByteString for the purpose+ of printing said ByteString.++-}+module Language.Pads.PadsPrinter where++import qualified Data.ByteString as B+import qualified Language.Pads.Source as S+import qualified Data.List as List+import Language.Pads.Errors+import Data.Typeable+import Language.Pads.MetaData+import Data.Data++{- Printing Monad -}++-- | +type PadsPrinter a = a -> FList++-- Lazy append-lists++-- | +type FList = B.ByteString -> B.ByteString++-- | +(+++) :: FList -> FList -> FList+p +++ q = p . q++-- | +nil :: FList+nil = id++-- | +concatFL :: [FList] -> FList+concatFL (f:fs) = foldr (+++) nil fs++-- | +printNothing :: FList+printNothing ws = ws++-- | +addBString :: B.ByteString -> FList+addBString bs = B.append bs++-- | +addString :: String -> FList+addString s = B.append (S.strToByteString s)++-- | +fshow :: Show a => a -> FList+fshow x = B.append (S.strToByteString (show x))++-- | +printEOR :: FList+printEOR = addString ['\n']++-- | +printEOF :: FList+printEOF = addString []++-- | +endRecord :: FList -> FList+endRecord fst = fst +++ printEOR++-- | +printF :: FList -> IO ()+printF q = Prelude.print (B.unpack (q B.empty))++--------------------------------------------------++printList' (reps, (_,mds)) printItem printSep printTerm = (concatFL (List.intersperse printSep (map printItem (zip reps $ mds ++ repeat myempty))) ) +++ printTerm++printList :: (Data r,Data m) => (PadsPrinter (r,m)) -> FList -> FList -> ([r], (Base_md,[m])) -> FList+printList printItem printSep printTerm (reps, (_,mds)) =+ (concatFL (List.intersperse printSep (map printItem (zip reps $ mds ++ repeat myempty))) )+ +++ printTerm++{-++++type IntPair = (Int,"|",Int)++=====>++type IntPair = (Int, Int)+type IntPair_md = (Base_md, (Base_md, Base_md))++intPair_parseM+ = let+ f_rep x1 x3 = (x1, x3)+ f_md x1 x2 x3+ = (mergeBaseMDs+ [get_md_header x1, get_md_header x2, get_md_header x3],+ (x1, x3))+ in+ (((return (f_rep, f_md) =@= int_parseM) =@ strLit_parseM "|")+ =@=+ int_parseM)++intPair_parseS = parseStringInput intPair_parseM]++intPair_printFL (r,m)+ = case (r,m) of+ ((r1,r2),(_,(m1,m2)))+ -> int_PrintFL (r1,m1) ++++ addString "|" ++++ int_PrintFL (r2,m2)++-}+
+ Language/Pads/Padsc.hs view
@@ -0,0 +1,59 @@+{-# LANGUAGE TypeSynonymInstances, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell, DeriveDataTypeable,+ ScopedTypeVariables, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances,+ UndecidableInstances, NamedFieldPuns, RecordWildCards, StandaloneDeriving #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Padsc+ Description : Pads compiler+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ This module re-exports all the modules necessary to make use of the Pads+ quasiquoter and compilation infrastructure.++-}+module Language.Pads.Padsc (+ {- FIX: Languages.Pads.Source exports "take", which clashes with+ the function of the same name in Prelude -}+ module Language.Pads.Source,+ module Language.Pads.RegExp,+ module Language.Pads.Errors,+ module Language.Pads.PadsParser,+ module Language.Pads.MetaData,+ module Language.Pads.Generic,+ module Language.Pads.CoreBaseTypes,+ module Language.Pads.Quote,+ module Language.Pads.Syntax,+ module Language.Pads.BaseTypes,+ module Language.Pads.Pretty,+ module Language.Pads.PadsPrinter,+ module Data.Data,+ ppr, pretty+ )+ where++import Language.Pads.Source+import Language.Pads.RegExp+import Language.Pads.Errors hiding (msg)+import Language.Pads.PadsParser+import Language.Pads.MetaData+import Language.Pads.Generic+import Language.Pads.CoreBaseTypes+import Language.Pads.Quote+import Language.Pads.Syntax+import Language.Pads.BaseTypes+import Language.Pads.Pretty+import Language.Pads.PadsPrinter++import Data.Data+import Text.PrettyPrint.Mainland hiding (line, dot)+import Text.PrettyPrint.Mainland.Class++{- Fix these should be reexported -}+-- parseAllS = Language.Pads.PadsParser.parseAllS+numErrors = Language.Pads.MetaData.numErrors+
+ Language/Pads/Parser.hs view
@@ -0,0 +1,439 @@+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Parser+ Description : Parser for the syntax of Pads+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ This module implements the parser for the PADS syntax in Haskell using parser+ combinators.+-}+module Language.Pads.Parser where++import Language.Pads.Syntax+++import Text.Parsec hiding (upper,lower)+import qualified Text.Parsec.String as PS+import Text.Parsec.Error+import Text.Parsec.Prim as PP+import qualified Text.Parsec.Token as PT+import Text.Parsec.Language+import Text.ParserCombinators.Parsec.Language+import Text.ParserCombinators.Parsec.Pos+import Text.Parsec.Expr+import Control.Monad++import qualified Language.Haskell.Meta as LHM+import Language.Haskell.TH++import Data.Char+import System.FilePath.Glob++++type Parser = PS.Parser+type Env = [String]++-- | The main entry point for the Pads QuasiQuoter+parsePadsDecls :: SourceName -> Line -> Column -> String -> Either ParseError [PadsDecl]+parsePadsDecls fileName line column input+ = PP.parse (do { setPosition (newPos fileName line column)+ ; whiteSpace+ ; x <- padsDecls+ ; whiteSpace+ ; eof <|> errorParse+ ; return x+ }) fileName input++errorParse = do+ { rest <- manyTill anyToken eof+ ; unexpected rest }++-------------------------------------------------------------------------------+-- * PADS DECLARATIONS++padsDecls :: Parser [PadsDecl]+padsDecls = option [] (many1 topDecl)++topDecl :: Parser PadsDecl+topDecl+ = typeDecl <|> dataDecl <|> newDecl <|> obtainDecl+ <?> "Pads declaration keyword"++typeDecl :: Parser PadsDecl+typeDecl+ = do { reserved "type"+ ; (id,env) <- declLHS; pat <- patLHS+ ; rhs <- ptype env+ ; return (PadsDeclType id env pat rhs)+ } <?> "Pads type declaration"++dataDecl :: Parser PadsDecl+dataDecl+ = do { reserved "data"+ ; (id,env) <- declLHS; pat <- patLHS+ ; rhs <- dataRHS env; drvs <- option [] derives+ ; return (PadsDeclData id env pat rhs drvs)+ } <?> "Pads data declaration"++newDecl :: Parser PadsDecl+newDecl+ = do { reserved "newtype"+ ; (id,env) <- declLHS; pat <- patLHS+ ; rhs <- newRHS env; drvs <- option [] derives+ ; return (PadsDeclNew id env pat rhs drvs)+ } <?> "Pads newtype declaration"++obtainDecl :: Parser PadsDecl+obtainDecl+ = do { reserved "obtain"+ ; (id,env) <- declLHS+ ; reservedOp "from"; rhs <- ptype env+ ; reserved "using"; exp <- expression+ ; return (PadsDeclObtain id env rhs exp)+ } <?> "Pads transform type"++declLHS+ = do { id <- upper; env <- try $ many lower+ ; return (id,env)+ }++patLHS+ = do { p <- try $ haskellParsePatTill "="+ ; return (Just p)+ }+ <|> (reservedOp "=" >> return Nothing)++derives+ = reserved "deriving" >>+ (do { q <- qualUpper; return [q] }+ <|> parens (commaSep1 qualUpper))++-------------------------------------------------------------------------------+-- * PADS TYPES++ptype :: Env -> Parser PadsTy+ptype env+ = constrain env+ <|> obtain env+ <|> partition env+ <|> listTy env+ <|> value env+ <|> btype env+ <?> "Pads Pads type expression"++constrain :: Env -> Parser PadsTy+constrain env+ = do { reserved "constrain"+ ; pat <- haskellParsePatTill "::"; ty <- ptype env+ ; exp <- predic+ ; return (PConstrain pat ty exp)+ } <?> "Pads constrain type"++predic = do { reservedOp "where"; expression }++obtain :: Env -> Parser PadsTy+obtain env+ = do { reserved "obtain"; dst <- ptype env+ ; reservedOp "from"; src <- ptype env+ ; reserved "using"; exp <- expression+ ; return (PTransform src dst exp)+ } <?> "Pads transform type"++partition :: Env -> Parser PadsTy+partition env+ = do { reserved "partition"; ty <- ptype env+ ; reserved "using"; exp <- expression+ ; return (PPartition ty exp)+ } <?> "Pads partition type"++listTy :: Env -> Parser PadsTy+listTy env+ = do { (elm,sepM) <- brackets (listInside env)+ ; termM <- listEnd env+ ; return (PList elm sepM termM)+ } <?> "Pads list type"++listInside env+ = do { elm <- ptype env+ ; sepM <- optionMaybe (reservedOp "|" >> ptype env)+ ; return (elm,sepM)+ }++listEnd env+ = optionMaybe+ ( do {reservedOp "terminator"; t<-ptype env; return (LTerm t)}+ <|> do {reservedOp "length"; e<-expression; return (LLen e)})++value env+ = do { reserved "value"+ ; exp <- expression; reservedOp "::"+ ; ty <- ptype env+ ; return (PValue exp ty)+ }+++btype :: Env -> Parser PadsTy+btype env+ = try $ do+ { ty <- etype env; tys <- many (atype env)+ ; expM <- optionMaybe (try expression);+ ; if length tys==0 && expM == Nothing+ then return ty+ else return (PApp (ty:tys) expM) }++etype :: Env -> Parser PadsTy+etype env = atype env+ <|> try (expression >>= (return . PExpression))++atype env+ = try (tuple env)+ <|> do { (elm,sepM) <- brackets (listInside env)+ ; return (PList elm sepM Nothing)}+ <|> fmap PTycon qualUpper+ <|> fmap PTyvar (tyvar env)++tuple :: Env -> Parser PadsTy+tuple env+ = do { tys <- parens $ option [] (commaSep1 (ptype env))+ ; case length tys of+ 0 -> return (PTycon ["Void"])+ 1 -> return (head tys)+ _ -> return (PTuple tys)+ }+ <?> "Pads tuple type"++-------------------------------------------------------------------------------+-- * PADS DATA DECLARATIONS++dataRHS :: Env -> Parser PadsData+dataRHS env+ = switchTy env+ <|> fmap PUnion (constrs env)+ <?> "Pads data type right hand side"++switchTy :: Env -> Parser PadsData+switchTy env+ = do { reservedOp "case"; exp <- expression+ ; reservedOp "of"; brs <- branch env `sepBy1` reservedOp "|"+ ; return (PSwitch exp brs)+ } <?> "Pads switch type"++branch :: Env -> Parser (Pat, BranchInfo)+branch env+ = do { pat <- haskellParsePatTill "->"; br <- constr env+ ; return (pat, br)+ } <?> "Pads switch branch"++constrs :: Env -> Parser [BranchInfo]+constrs env = constr env `sepBy1` reservedOp "|"++constr :: Env -> Parser BranchInfo+constr env+ = do { id <- upper;+ ; do { args <- record env; predM <- optionMaybe predic+ ; return (BRecord id args predM)}+ <|> do { args <- option (mkId id) (constrArgs env)+ ; predM <- optionMaybe predic+ ; return (BConstr id args predM)}}+ where+ mkId id = [(NotStrict, PExpression (LitE (StringL id)))]+ -- Provides the expansion e.g.: Tue -> Tue "Tue"+++constrArgs :: Env -> Parser [ConstrArg]+constrArgs env+ = many1 $ do+ { bang <- option NotStrict (reservedOp "!" >> return IsStrict)+ ; ty <- etype env+ ; return (bang,ty)+ }+++record :: Env -> Parser [FieldInfo]+record env+ = do { reservedOp "{"+ ; flds <- field env `sepBy` reservedOp ","+ ; reservedOp "}"+ ; return flds+ } <?> "Pads record type"++field :: Env -> Parser FieldInfo+field env+ = try (do { id <- (lower << reservedOp "::")+ ; ty <- ftype env+ ; predM <- optionMaybe predic+ ; return (Just id, ty, predM)+ })+ <|> try (do { id <- lower; reservedOp "="+ ; reserved "value"+ ; exp <- expression; reservedOp "::"+ ; (strict,ty) <- ftype env+ ; predM <- optionMaybe predic+ ; return (Just id, (strict, PValue exp ty), predM)+ })+ <|> do { ty <- ftype env+ ; let recordid = (case ty of+ (strict,PConstrain (VarP name) _ _) -> Just $ nameBase name+ otherwise -> Nothing+ )+ ; predM <- optionMaybe predic+ ; return (recordid, ty, predM)+ }+ <?> "record field"++ftype env+ = do { reservedOp "!"; ty <- atype env; return (IsStrict,ty)}+ <|> do { ty <- ptype env; return (NotStrict,ty)}++-------------------------------------------------------------------------------+-- * PADS NEW TYPE DECLARATIONS++newRHS :: Env -> Parser BranchInfo+newRHS env+ = do { id <- upper;+ ; do { rec <- record1 env+ ; predM <- optionMaybe predic+ ; return (BRecord id rec predM)}+ <|> do { arg <- atype env+ ; predM <- optionMaybe predic+ ; return (BConstr id [(NotStrict,arg)] predM)+ }+ }++record1 :: Env -> Parser [FieldInfo]+record1 env+ = do { reservedOp "{"+ ; args1 <- many (ftype env << reservedOp ",")+ ; fld <- field1 env+ ; args2 <- many (reservedOp "," >> ftype env)+ ; reservedOp "}"+ ; return (map expand args1 ++ [fld] ++ map expand args2)+ } <?> "Pads newtype record"+ where+ expand fty = (Nothing, fty, Nothing)++field1 :: Env -> Parser FieldInfo+field1 env+ = do { id <- lower; reservedOp "::"; ty <- ptype env+ ; predM <- optionMaybe predic+ ; return (Just id, (NotStrict,ty), predM)+ }++-------------------------------------------------------------------------------+-- * HASKELL IN PADS DECLARATIONS++expression :: Parser Exp+expression = haskellExp+ <|> literal++haskellExp :: Parser Exp+haskellExp = do { reservedOp "<|"+ ; haskellParseExpTill "|>"+ }+ <?> "Pads Haskell expression"+++haskellParseExp :: String -> Parser Exp+haskellParseExp str = case LHM.parseExp str of+ Left err -> parserZero+ Right expTH -> return expTH++haskellParseExpTill :: String -> Parser Exp+haskellParseExpTill op = do { str <- manyTill anyChar (reservedOp op)+ ; haskellParseExp str+ }++haskellParsePat :: String -> Parser Pat+haskellParsePat str = case LHM.parsePat str of+ Left err -> parserZero+ Right patTH -> return patTH++haskellParsePatTill :: String -> Parser Pat+haskellParsePatTill op = do { str <- manyTill anyChar (reservedOp op)+ ; haskellParsePat str+ }+++literal :: Parser Exp+literal = fmap (LitE . CharL) (try charLiteral)+ <|> reLiteral+ <|> fmap (LitE . StringL) stringLiteral+ <|> fmap (LitE . IntegerL) (try integer)+ <|> fmap (VarE . mkName . qName) qualLower+ <|> fmap (ConE . mkName . qName) qualUpper+ <?> "Pads literal"++reLiteral :: Parser Exp+reLiteral = do { reservedOp reMark+ ; str <- manyTill anyChar (reservedOp reMark)+ ; return (ConE (mkName "RE") `AppE` LitE (StringL str))+ }+reMark = "'"++literalPat :: Parser Pat+literalPat = fmap (LitP . CharL) (try charLiteral)+ <|> reLiteralPat+ <|> fmap (LitP . StringL) stringLiteral+ <|> fmap (LitP . IntegerL) (try integer)+ <|> fmap (VarP . mkName . qName) qualLower+ <|> fmap (flip ConP [] . mkName . qName) qualUpper+ <?> "Pads literal"++reLiteralPat :: Parser Pat+reLiteralPat = do { reservedOp reMark+ ; str <- manyTill anyChar (reservedOp reMark)+ ; return (ConP (mkName "RE") [LitP (StringL str)])+ }++qualUpper, qualLower :: Parser QString+qualUpper = try (upper `sepBy1` reservedOp ".")+qualLower = try $ do { prefix <- many (upper << reservedOp ".")+ ; final <- lower+ ; return (prefix ++ [final])+ }++upper :: Parser String+upper = try $ do { id <- identifier+ ; guard $ isUpper (head id)+ ; return id}++lower :: Parser String+lower = try $ do { id <- identifier+ ; guard $ isLower (head id)+ ; return id}++tyvar env = try $ do { v <- lower+ ; guard (v `elem` env)+ ; return v }++-------------------------------------------------------------------------------+-- * LEXER++p << q = do {x<-p;q;return x}+++lexer :: PT.TokenParser ()+lexer = PT.makeTokenParser (haskellStyle+ { reservedOpNames = ["=", "=>", "{", "}", "::", "<|", "|>", "|", reMark, "." ],+ reservedNames = ["data", "type", "newtype", "old", "existing", "deriving",+ "using", "where", "terminator", "length", "of", "from",+ "case", "constrain", "obtain", "partition","value" ]})++whiteSpace = PT.whiteSpace lexer+identifier = PT.identifier lexer+operator = PT.operator lexer+reserved = PT.reserved lexer+reservedOp = PT.reservedOp lexer+charLiteral = PT.charLiteral lexer+stringLiteral = PT.stringLiteral lexer+integer = PT.integer lexer+commaSep1 = PT.commaSep1 lexer+parens = PT.parens lexer+braces = PT.braces lexer+brackets = PT.brackets lexer
+ Language/Pads/Pretty.hs view
@@ -0,0 +1,173 @@+{-# LANGUAGE NamedFieldPuns,RecordWildCards #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Pretty+ Description : Pretty printing utilities for Pads types+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Pretty where+import Data.Char (isPrint, ord)+import qualified Data.Map as M+import qualified Language.Haskell.TH as TH++import Text.PrettyPrint.Mainland as PP+import Text.PrettyPrint.Mainland.Class+import Language.Pads.Syntax+import qualified Language.Pads.Parser as P+import Language.Pads.RegExp+++instance Pretty PadsDecl where+ ppr (PadsDeclType con vars pat padsty) = text "type" <+> (ppr_decl_lhs con vars pat) <+> text "=" <+> ppr padsty+ ppr (PadsDeclData con vars pat padsrhs cons) = text "data" <+> (ppr_decl_lhs con vars pat) <+> text "="+ <+> ppr padsrhs <> ppr_derives cons+ ppr (PadsDeclNew con vars pat branchInfo cons) = text "newtype" <+> (ppr_decl_lhs con vars pat) <+> text "="+ <+> ppr branchInfo <> ppr_derives cons++ppr_decl_lhs id args patOpt = text id <> ppr_args args <> ppr_optArgPat patOpt+ppr_derives cons = case cons of+ [] -> empty+ [l] -> space <> text (qName l)+ ls -> space <> tuple (map (text . qName) cons)++ppr_args args = case args of [] -> empty ; _ -> space <> (spread (map text args))+++instance Pretty PadsData where+ ppr (PUnion branches) = ppr_branches branches+ ppr (PSwitch exp patBranches) = text "case" <+> ppr exp <+> text "of" <+> ppr_patBranches patBranches++ppr_patBranches patBranches = enclosesep empty empty (text " |") (map ppr_patBranch patBranches)+ppr_patBranch (pat, branchInfo) = ppr pat <+> text "->" <+> ppr branchInfo+ppr_branches branches = enclosesep empty empty (text " |") (map ppr branches)++instance Pretty BranchInfo where+ ppr (BRecord con fields predOpt) = text con <+> braces (commasep (map ppr_fieldInfo fields)) <> (ppr_optPred predOpt)+ ppr (BConstr con constrArgs predOpt) = (ppr_conApp con constrArgs) <> (ppr_optPred predOpt)++ppr_conApp con constrArgs = case constrArgs of+ [(NotStrict,arg)] | argIsCon con arg -> text con+ otherwise -> text con <+> (spread (map ppr_constrArgApp constrArgs))+++argIsCon con arg = case arg of+ PExpression (TH.LitE (TH.StringL str)) -> con == str+ otherwise -> False++ppr_fieldInfo (varOpt, constrArg, expOpt)+ = (case varOpt of Nothing -> empty ; Just var -> (text var) <+> (text "::") <> space)+ <> ppr_constrArg constrArg+ <> ppr_optPred expOpt++ppr_constrArg (strict, padsTy) = ppr_strict strict <> ppr padsTy++ppr_constrArgApp (strict, padsTy)+ | isAtomicTy padsTy = ppr_strict strict <> ppr padsTy+ | otherwise = ppr_strict strict <> parens (ppr padsTy)++ppr_alpha padsTy+ | isAtomicTy padsTy = ppr padsTy+ | otherwise = parens (ppr padsTy)++ppr_strict IsStrict = text "!"+ppr_strict NotStrict = empty++isAtomicTy (PList _ _ _ ) = True+isAtomicTy (PTycon _ ) = True+isAtomicTy (PTyvar _ ) = True+isAtomicTy (PExpression _ ) = True+isAtomicTy (PTuple _ ) = True+isAtomicTy _ = False+++instance Pretty PadsTy where+ ppr (PConstrain pat ty exp) = text "constrain" <+> ppr pat <+> text "::" <+> ppr ty <+> text "where" <+> ppr exp+ ppr (PTransform sty dty exp) = text "transform" <+> ppr sty <+> text "=>" <+> ppr dty <+> text "using" <+> ppr exp+ ppr (PList itemTy sepTy termTy) = ppr_padsList itemTy sepTy termTy+ ppr (PValue exp ty) = text "value" <+> ppr exp <+> text "::" <+> ppr ty+ ppr (PApp argTys expArgOpt) = spread (map ppr_alpha argTys) <> ppr_opt expArgOpt+ ppr (PTuple tys) = tuple (map ppr tys)+ ppr (PExpression exp) = ppr exp+ ppr (PTycon con) = text (qName con)+ ppr (PTyvar var) = text var++instance Pretty TH.Pat where+ ppr = text . TH.pprint++pprHpat pat = case pat of+ TH.TupP p -> ppr pat+ otherwise -> parens (ppr pat)++instance Pretty TH.Exp where+ ppr = pprHexp++pprHexp exp = case exp of+ TH.VarE name -> text(TH.pprint exp)+ TH.ConE name -> text(TH.pprint exp)+ TH.LitE lit -> text(TH.pprint exp)+ TH.AppE (TH.ConE re) (TH.LitE (TH.StringL str)) | re==TH.mkName "RE"+ -> text("'"++str++"'")+ otherwise -> ppr_bird (text(TH.pprint exp))++ppr_bird s = (text "<|") <> s <> (text "|>")++instance Pretty TermCond where+ ppr (LTerm ty) = text "terminator" <+> ppr ty+ ppr (LLen exp) = text "length" <+> ppr exp+++ppr_padsList itemTy sepTyOpt termTyOpt = brackets (ppr itemTy <> ppr_sep sepTyOpt) <> ppr_opt termTyOpt++ppr_opt opt = case opt of Nothing -> empty ; Just e -> (space <> ppr e)+ppr_optArgPat pat = case pat of Nothing -> empty; Just e -> (space <> pprHpat e)++ppr_optPred pred = case pred of Nothing -> empty; Just e -> (space <> text "where" <+> ppr e)++ppr_sep Nothing = empty+ppr_sep (Just sepTy) = text " |" <+> ppr sepTy+++++{- Utilities for generated pretty printer for PADS types -}+seplines :: Doc -> [Doc] -> Doc+seplines s = folddoc (\hd tl -> hd <> s </> tl)++whitesep = sep+field_ppr field_name ppr = text field_name <+> equals <+> ppr+record_ppr str pprs = namedty_ppr str (recordbody_ppr pprs)+recordbody_ppr docs = braces (align (seplines comma docs))++tuple_ppr ds = parens (align (commasep ds))++maybe_ppr d = case d of+ Nothing -> text "Nothing"+ Just a -> ppr a+++namedty_ppr str ph = hang 2 (text str <+/> ph)++namedtuple_ppr :: String -> [Doc] -> Doc+namedtuple_ppr name pprls = group $ hang 2 (text name <+/> (tuple_ppr pprls))+++list_ppr ds = (text "[---" <//>+ align (seplines comma ds ) <//>+ text "]")++--instance (Pretty a, Pretty b) => Pretty (M.Map a b) where+-- ppr = map_ppr+map_ppr d = list_ppr (map ppr (M.toList d))++string_ppr :: String -> Doc+string_ppr = ppr+++namedlist_ppr :: String -> [Doc] -> Doc+namedlist_ppr name pprls = group $ hang 2 (text name <+/> (list_ppr pprls))
+ Language/Pads/Quote.hs view
@@ -0,0 +1,67 @@+{-|+ Module : Language.Pads.Quote+ Description : Quasiquoter+ Copyright : (c) 2005-2011 AT&T+ Kathleen Fisher <kfisher@research.att.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Quote+ (pads, padsDerivation, pparseDecl, make_pads_declarations)+ where++import Prelude hiding (exp, init)+import System.IO.Unsafe (unsafePerformIO)++import Language.Haskell.TH+import Language.Haskell.TH.Quote (QuasiQuoter(..))++import Language.Pads.CodeGen+import qualified Language.Pads.Parser as P++-- | The PADS quasiquoter which can be invoked by e.g.:+--+-- > [pads| type MyType = (Int, Int) |]+pads :: QuasiQuoter+pads = padsDerivation (const $ return [])++-- | Same as /pads/, but parametrized by a higher order function which+-- constructs a list of Haskell decls to splice into scope for each PADS+-- metadata and data declaration. Namely the /type/, /newtype/, and /data/ PADS+-- constructs get passed into /derivation/ as a template haskell declaration.+--+-- PADS only supports quasiquotes in place of a Haskell declaration+-- (expressions, patterns, and types produce errors).+padsDerivation :: Derivation -> QuasiQuoter+padsDerivation derivation = QuasiQuoter+ pparseExp+ (error "parse pattern")+ (error "parse type")+ (pparseDecl derivation)++-- | Just the declaration parser for a PADS quasiquotation. Glues together+-- 'P.parsePadsDecls' and 'make_pads_declarations', the parser and code+-- generator.+pparseDecl :: Derivation -> String -> Q [Dec]+pparseDecl derivation input = do+ loc <- location+ let fileName = loc_filename loc+ let (line,column) = loc_start loc+ case P.parsePadsDecls fileName line column input of+ Left err -> unsafePerformIO $ fail $ show err+ Right x -> make_pads_declarations' derivation x++-- | Just the declaration parser for a PADS quasiquotation. Glues together+-- 'P.parsePadsDecls' and 'make_pads_declarations', the parser and code+-- generator.+pparseExp :: String -> Q Exp+pparseExp input = do+ loc <- location+ let fileName = loc_filename loc+ let (line,column) = loc_start loc+ case P.parsePadsDecls fileName line column input of+ Left err -> unsafePerformIO $ fail $ show err+ Right x -> make_pads_asts x+
+ Language/Pads/RegExp.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-|+ Module : Language.Pads.RegExp+ Description : Pads regular expressions+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.RegExp where+import Data.Data++-- | Regular expression support. PADS uses the regex-posix package.+data RE = RE String -- ^ A regular expression printed as its match+ | REd String String -- ^ A regular expression printed as the second arg+ deriving (Eq, Data, Typeable, Show)+
+ Language/Pads/Source.hs view
@@ -0,0 +1,566 @@+{-# LANGUAGE NamedFieldPuns, RecordWildCards, DeriveDataTypeable #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Source+ Description : Host language representation of data input+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental+-}++module Language.Pads.Source where++import qualified Data.ByteString as B -- abstraction for input data+import qualified Text.Regex.Posix as TRP+import Language.Pads.RegExp -- user-specified regular expressions+import Text.PrettyPrint.Mainland as PP+import Text.PrettyPrint.Mainland.Class++import Data.Int+import Data.Data+import Data.Word+import Data.Char+import Data.Bits (shiftR, shiftL, (.&.))+import qualified Data.ByteString.Char8 as Char8++type RawStream = B.ByteString -- This is the type that should be used in other files!!!++{-| Input source abstraction -}+data Source = Source+ { current :: B.ByteString -- ^ The current input before EOR+ , rest :: B.ByteString -- ^ The rest of the input after the next EOR+ , loc :: Loc -- ^ The current location 'Loc' in the input+ , bit :: Int -- ^ Bit offset into the current input being parsed+ , disc :: RecordDiscipline -- ^ The record discipline of this input source+ , eorAtEOF :: Bool -- ^ Relevant for seperator-based record disciplines: Single, Multi+ -- Set when current record is last record and separtor appeared at end.+ }++-- | A record discipline specifies the manner by which pads should partition the+-- input into records. Note that the record character gets consumed internally+-- by the parsing monad.+data RecordDiscipline =+ Single Word8 -- ^ Split input based on a single 8-bit unsigned integer (character)+ | Multi B.ByteString -- ^ Split input based on more than one character+ | Bytes Int -- ^ Split the input into records every 'Int' characters+ | NoPartition -- ^ No partitioning of the input - all input data is in the 'current' field+ | NoDiscipline -- ^ No discipline is currently installed; all input data is in 'rest' field++-- | Record discipline for Unix newlines+newline = Single (chrToWord8 '\n')+-- | Record discipline for Windows CRLF newlines+windows = Multi (B.pack (strToWord8s "\r\n"))+-- | Record discipline for every n characters+bytes n = Bytes n+-- | No record discipline+none = NoPartition++{-| Source location information. -}+data Loc = Loc+ { recordNumber :: Int64 -- ^ Number of records parsed so far (i.e. record index)+ , byteOffset :: Int64 -- ^ Total number of bytes parsed into the source input so far+ } deriving (Typeable, Data,Eq, Ord, Show)++-- | A span in the source input, covering a contiguous range of the 'Source'+-- input. AFAIK there's no distinction between the states where @begin == end@+-- and where @end == Nothing@.+data Span = Span+ { begin :: Loc -- ^ Start location of the 'Span'+ , end :: Maybe Loc -- ^ End location of the 'Span', inclusive+ } deriving (Typeable, Data, Eq, Ord, Show)++-- | Initial instance of a 'Loc'+zeroLoc = Loc {recordNumber = 0, byteOffset = 0}++-- | A span starting at the beginning of the file and containing nothing.+zeroSpan = locToSpan zeroLoc++-- | Parse the most significant bit in a byte first+zeroBit = 7++-- | Increment how many records have been seen in the given 'Loc'+incRecordNumber :: Loc -> Loc+incRecordNumber Loc{recordNumber, ..} = Loc{ recordNumber = recordNumber+1+ , byteOffset = 0}++-- | Decrement how many records have been seen in the given 'Loc'+decLineNumber :: Loc -> Loc+decLineNumber Loc{recordNumber, ..} = Loc{recordNumber=recordNumber-1, byteOffset=0}++-- | Increment the offset of the 'Loc' by one+incOffset :: Loc -> Loc+incOffset l@Loc{byteOffset} = l { byteOffset = byteOffset + 1 }++-- | Increment the offset of the given 'Loc' by some number+incOffsetBy :: Loc -> Int -> Loc+incOffsetBy l@Loc{byteOffset} n = l { byteOffset = byteOffset + fromIntegral n }++-- | Decrement the offset of the given 'Loc' by one+decOffset :: Loc -> Loc+decOffset l@Loc{byteOffset} = l { byteOffset = byteOffset - 1 }++getSrcLoc :: Source -> Loc+getSrcLoc = loc++getRecordDiscipline :: Source -> RecordDiscipline+getRecordDiscipline = disc+++-------------------------------------------------------------------------------+-- * Source Creation++-- | An empty Source with reasonable defaults for everything.+emptySource = Source+ { current = B.empty+ , rest = B.empty+ , loc = zeroLoc+ , bit = zeroBit+ , eorAtEOF = False+ , disc = newline+ }++-- | Stuff the given 'String' into a 'Source' with a newline discipline by+-- default (see 'padsSourceFromByteString')+padsSourceFromString :: String -> Source+padsSourceFromString str = padsSourceFromByteString (strToByteString str)++-- | Stuff the given 'String' into a 'Source' with the given record discipline+padsSourceFromStringWithDisc :: RecordDiscipline -> String -> Source+padsSourceFromStringWithDisc d str = padsSourceFromByteStringWithDisc d (strToByteString str)++-- | Read a 'Source' from disk+padsSourceFromFile :: FilePath -> IO Source+padsSourceFromFile file = do+ bs <- B.readFile file+ return (padsSourceFromByteString bs)++-- | Read a 'Source' from disk using the given record discipline+padsSourceFromFileWithDisc :: RecordDiscipline -> FilePath -> IO Source+padsSourceFromFileWithDisc d file = do+ bs <- B.readFile file+ return (padsSourceFromByteStringWithDisc d bs)++-- | Construct a 'Source' from the given 'ByteString', preparing the first+-- record immediately.+padsSourceFromByteString :: B.ByteString -> Source+padsSourceFromByteString bs =+ let rawSource = Source{ current = B.empty+ , rest = bs+ , loc = zeroLoc+ , bit = zeroBit+ , disc = newline+ , eorAtEOF = False+ }+ in getNextRecord rawSource++-- | Same as 'padsSourceFromByteString' but with a record discipline+padsSourceFromByteStringWithDisc :: RecordDiscipline -> B.ByteString -> Source+padsSourceFromByteStringWithDisc d bs =+ let rawSource = Source{ current = B.empty+ , rest = bs+ , loc = zeroLoc+ , bit = zeroBit+ , disc = d+ , eorAtEOF = False+ }+ in getNextRecord rawSource++-- | Whether or not the 'Source' has consumed all available input+isEOF :: Source -> Bool+isEOF (s @ Source{current, rest, eorAtEOF, ..}) = B.null current && B.null rest && not eorAtEOF++-- | Whether or not the 'Source' has consumed all input in the current record+isEOR :: Source -> Bool+isEOR = B.null . current++-------------------------------------------------------------------------------+-- * Record Manipulating Functions+{- Called when current is empty to get the next record, where the disc field defines what constitutes a record.+ NOOP when isEOF is already true. -}+getNextRecord :: Source -> Source+getNextRecord (s @ Source {current, rest, loc, bit, disc, eorAtEOF}) =+ if isEOF s then s+ else if eorAtEOF || B.null rest then+ (Source {current = B.empty, rest = B.empty, loc = incRecordNumber loc, bit = zeroBit, disc, eorAtEOF = False})+ else (Source {current = nextLine, rest=residual, loc = incRecordNumber loc, bit = zeroBit, disc, eorAtEOF = eorAtEOF'}) --TODO: is this bit positioning sound?+ where (nextLine, residual, eorAtEOF') = breakUsingDisc rest disc++srcLineBegin :: Source -> (Maybe String, Source)+srcLineBegin s = (Nothing, s)++srcLineEnd :: Source -> (Maybe String, Source)+srcLineEnd s = if isEOF s+ then (Just "Found EOF when looking for EOR", s)+ else (Nothing, getNextRecord s)++{- External code should not set discipline to NoDiscipline; that is an internal state only to+ mark state between two legal external disciplines. -}+setRecordDiscipline :: RecordDiscipline -> Source -> ((),Source)+setRecordDiscipline r s =+ let s' = unputCurrentLine s+ s'' = s'{disc = r}+ in ((),getNextRecord s'')++{- Merge current record back on to rest according to current record discipline.+ Resulting source will be in NoDiscipline state.+ Noop if called at EOF.+-}+unputCurrentLine :: Source -> Source+unputCurrentLine (s @ Source {current, rest, loc, disc, eorAtEOF}) =+ if isEOF s then s+ else case disc of+ Single n -> let rest' = if B.null rest+ then if eorAtEOF+ then B.concat [current, B.singleton n]+ else current+ else B.concat [current, B.singleton n, rest]+ loc' = if B.null current then loc else decLineNumber loc+ in Source {current = B.empty, rest = rest', loc = loc', bit = zeroBit, disc = NoDiscipline, eorAtEOF = False}+ Multi br -> let rest' = if B.null rest+ then if eorAtEOF+ then B.concat [current, br]+ else current+ else B.concat [current, rest]+ loc' = if B.null current then loc else decLineNumber loc+ in Source {current = B.empty, rest = rest', loc = loc', bit = zeroBit, disc = NoDiscipline, eorAtEOF = False}+ Bytes n -> Source {current = B.empty, rest = B.append current rest, loc = decLineNumber loc, bit = zeroBit, disc = NoDiscipline, eorAtEOF = False}+ NoPartition -> Source {current = B.empty, rest = current, loc = decLineNumber loc, bit = zeroBit, disc = NoDiscipline, eorAtEOF = False}+ NoDiscipline -> s+++breakUsingDisc :: B.ByteString -> RecordDiscipline -> (B.ByteString, B.ByteString, Bool)+breakUsingDisc bs rd = case rd of+ Single n -> let (nextLine, raw_residual) = B.break (\c->c == n) bs+ residual = B.drop 1 raw_residual+ eorAtEOF = (B.null residual) && (not $ B.null raw_residual)+ in (nextLine, residual, eorAtEOF)+ Multi s -> let (nextLine, raw_residual) = B.breakSubstring s bs+ residual = B.drop (B.length s) raw_residual+ eorAtEOF = (B.null residual) && (not $ B.null raw_residual)+ in (nextLine, residual, eorAtEOF)+ Bytes n -> let (nextLine, residual) = B.splitAt n bs+ in (nextLine, residual, False)+ NoPartition -> (bs, B.empty, False)+ NoDiscipline -> error "Pads Source: Attempt to partition source using internal discipline 'NoDiscipline'"++-------------------------------------------------------------------------------+-- * Converting Sources to Strings+--+padsSourceToString :: Source -> String+padsSourceToString = (map word8ToChr) . B.unpack . padsSourceToByteString++padsSourceToByteString :: Source -> B.ByteString+padsSourceToByteString = rest . unputCurrentLine++drainSource :: Source -> (String, Source)+drainSource s = (padsSourceToString s, emptySource)++drainSourceNB :: Source -> (String, Source)+drainSourceNB (s @ Source{current,loc, ..}) =+ let len = (B.length current) - (if bit == zeroBit then 0 else 1)+ (bs, s') = takeBits (len * 8) s+ in (map word8ToChr (numToWord8s bs []), emptySource)+++{- XXX: Change call site to use no record discipline; then this call should just became an instance of drainSource -}+rawSource :: Source -> (B.ByteString, Source)+rawSource s = (padsSourceToByteString s, emptySource)++{- Return the rest of the current record as a string -}+restRec :: Source -> String+restRec = byteStringToStr . current++-------------------------------------------------------------------------------+-- * Operations within a single record+head :: Source -> Char+head = word8ToChr . headOrZero . current++headOrZero s = if B.null s then chrToWord8 '\0' else B.head s++peekHeadM :: Source -> (Maybe Char, Source)+peekHeadM (s @ Source{current,loc, ..}) =+ if B.null current then (Nothing, s) else (Just (Language.Pads.Source.head s), s)++takeHead :: Source -> (Char, Source)+takeHead (s @ Source{current,loc, ..}) =+ (word8ToChr $ B.head current, s{current = B.tail current, loc = incOffset loc})++partitionBS :: B.ByteString -> Int -> Int -> (B.ByteString, B.ByteString, Bool)+partitionBS bS bitIndex bits =+ let part b bs = if bs > b + 1 then 1 + part zeroBit (bs - (b + 1)) else 1+ byteAlign = (bits - (bitIndex + 1)) `mod` 8 == 0+ withinByte = bits <= bitIndex + 1+ hd = B.take (part bitIndex bits) bS+ tl = B.drop (B.length hd - if not byteAlign then 1 else 0) bS+ in (hd, tl, withinByte || not byteAlign)++accumulate :: Integral a => a -> (a, Int) -> (a, Int)+accumulate byte (num, pow) = ((byte * (256 ^ pow)) + num, pow + 1)++takeBits8 :: Int -> Source -> (Word8, Source)+takeBits8 b (s @ Source{current,loc,bit, ..}) =+ let (hd, tl, partial) = partitionBS current bit b+ bS = map (\x -> fromIntegral x :: Word16) (B.unpack $ B.take 2 hd)+ bytes = fst $ foldr accumulate (0,0) bS+ mask = (2 ^ b) - 1+ bits = mask .&. shiftR bytes ((B.length hd * 8) - b - (zeroBit - bit))+ in (fromIntegral bits, s{current = tl,+ loc = incOffsetBy loc (B.length hd - if partial then 1 else 0),+ bit = (zeroBit - (((zeroBit - bit) + b) `mod` 8))})++takeBits16 :: Int -> Source -> (Word16, Source)+takeBits16 b (s @ Source{current,loc,bit, ..}) =+ let (hd, tl, partial) = partitionBS current bit b+ bS = map (\x -> fromIntegral x :: Word32) (B.unpack $ B.take 3 hd)+ bytes = fst $ foldr accumulate (0,0) bS+ mask = (2 ^ b) - 1+ bits = mask .&. shiftR bytes ((B.length hd * 8) - b - (zeroBit - bit))+ in (fromIntegral bits, s{current = tl,+ loc = incOffsetBy loc (B.length hd - if partial then 1 else 0),+ bit = (zeroBit - (((zeroBit - bit) + b) `mod` 8))})++takeBits32 :: Int -> Source -> (Word32, Source)+takeBits32 b (s @ Source{current,loc,bit, ..}) =+ let (hd, tl, partial) = partitionBS current bit b+ bS = map (\x -> fromIntegral x :: Word64) (B.unpack $ B.take 5 hd)+ bytes = fst $ foldr accumulate (0,0) bS+ mask = (2 ^ b) - 1+ bits = mask .&. shiftR bytes ((B.length hd * 8) - b - (zeroBit - bit))+ in (fromIntegral bits, s{current = tl,+ loc = incOffsetBy loc (B.length hd - if partial then 1 else 0),+ bit = zeroBit - (((zeroBit - bit) + b) `mod` 8)})++takeBits64 :: Int -> Source -> (Word64, Source)+takeBits64 b s = let (bits, s') = takeBits b s+ in (fromIntegral bits, s')++tobinary :: Integer -> Integer+tobinary x+ | (div x 2) == 0 = x+ | otherwise = (mod x 2) + (10 * (tobinary $ div x 2))++takeBits :: Int -> Source -> (Integer, Source)+takeBits b (s @ Source{current,loc,bit, ..}) =+ let (hd, tl, partial) = partitionBS current bit b+ bS = map fromIntegral (B.unpack hd)+ bytes = fst $ foldr accumulate (0,0) bS+ mask = (2 ^ b) - 1+ shiftAmt = max 0 ((B.length hd * 8) - b - (zeroBit - bit))+ bits = mask .&. shiftR bytes shiftAmt+ in (bits, s{current = tl,+ loc = incOffsetBy loc (B.length hd - if partial then 1 else 0),+ bit = zeroBit - (((zeroBit - bit) + b) `mod` 8)})++takeHeadM :: Source -> (Maybe Char, Source)+takeHeadM (s @ Source{current,loc, ..}) =+ if B.null current then (Nothing, s)+ else (Just $ word8ToChr $ B.head current, s{current = B.tail current, loc = incOffset loc})++-- | If the front of the current source input matches the given string then+-- remove it and return the modified source. Otherwise return the original+-- source and a boolean flag indicating that we failed to take the given string+-- off the front of the source input.+takeHeadStr :: String -> Source -> (Bool, Source)+takeHeadStr str s =+ let pstr = strToByteString str+ in if B.isPrefixOf pstr (current s)+ then let (res,source) = Language.Pads.Source.take (B.length pstr) s+ in (True, source)+ else (False, s)+++matchString :: String -> Source -> Maybe(String, Source)+matchString str s =+ let pstr = strToByteString str+ in if B.isPrefixOf pstr (current s)+ then let (res,source) = Language.Pads.Source.take (B.length pstr) s+ in Just(str, source)+ else Nothing+++breakSubstring :: B.ByteString -- ^ String to search for+ -> B.ByteString -- ^ String to search in+ -> (B.ByteString,B.ByteString) -- ^ Head and tail of string broken at substring+breakSubstring pat src = search 0 src+ where+ -- STRICT2(search)+ search :: Int -> B.ByteString -> (B.ByteString, B.ByteString)+ search a b | a `seq` b `seq` False = undefined+ search n s+ | B.null s = (src,B.empty) -- not found+ | pat `B.isPrefixOf` s = (B.take n src,s)+ | otherwise = search (n+1) (B.tail s)++{-|+ Scan the current source input until we find the given string:+ - If we don't find the string return Nothing and leave source unmodified+ - If we return (Maybe []), then we found the string at the beginning of the+ source and removed it.+ - If we return (Maybe junk), then we found the string somewhere after the+ first character in the source and we consumed / removed (junk:str).+-}+scanStr :: String -> Source -> (Maybe String, Source)+scanStr str (s @ Source{current,loc, ..}) =+ let pat = strToByteString str+ (before,after) = breakSubstring pat current+ in if B.null after then (Nothing, s)+ else let len = B.length pat+ in (Just (byteStringToStr before),+ s{current = B.drop len after, loc = incOffsetBy loc len})+++scanString :: String -> Source -> Maybe (String, Source)+scanString str (s @ Source{current,loc, ..}) =+ let pat = strToByteString str+ (before,after) = breakSubstring pat current+ in if B.null after then Nothing+ else let len = B.length pat+ in Just (byteStringToStr before, s{current= B.drop len after, loc = incOffsetBy loc len})++satisfyNB :: (Char -> Bool) -> Source -> (String, Source)+satisfyNB p s =+ let (c, s') = takeBits8 8 s+ c' = word8ToChr c+ in if p c'+ then (c' : (fst $ satisfyNB p s'), snd $ satisfyNB p s')+ else ([], s)++takeBytes :: Int -> Source -> (B.ByteString, Source)+takeBytes n (s @ Source{current,loc, ..}) =+ let (head, tail) = B.splitAt n current+ incOffset = B.length head+ in (head, s{current= tail, loc = incOffsetBy loc incOffset})++takeBytesNB :: Int -> Source -> (B.ByteString, Source)+takeBytesNB n s =+ let (bits, s') = takeBits (n * 8) s+ numToBS x = B.pack $ numToWord8s x []+ in (numToBS bits, s')++numToWord8s :: Integral a => a -> [Word8] -> [Word8]+numToWord8s x accum+ | x < 256 = fromIntegral x : accum+ | otherwise = numToWord8s (x `div` 256) (fromIntegral (x `mod` 256) : accum)++take :: Int -> Source -> (String, Source)+take n s = let (bs, s') = takeBytes n s+ in (byteStringToStr bs, s')++-- | Match the beginning of the source input with a regex, returning a tuple of+-- the matched string and the modified source with that string removed.+regexMatch :: RE -> Source -> (Maybe String, Source)+regexMatch (RE re_str_raw) (s @ Source{current,loc,..}) =+ let (before, match, after) = current TRP.=~ (strToByteString('^' : re_str_raw))+ in if not (B.null before) then (Nothing, s) -- only looking for matches at the beginning of the string+ else (Just (byteStringToStr match), s{current=after, loc=incOffsetBy loc (fromIntegral (B.length match))})+regexMatch (REd re_str_raw def ) s = regexMatch (RE re_str_raw) s++-- | Find the first match of a regex in the source input, returning the contents+-- of the source input *before* the match.+-- * If there's no match return Nothing and leave the source unmodified.+-- * If there's a match, return the string before the match and remove *just*+-- the string before from the source input.+regexStop :: RE -> Source -> (Maybe String, Source)+regexStop (RE re_str_raw) (s @ Source{current,loc,..}) =+ let packed = strToByteString re_str_raw+ (before, match, after) = current TRP.=~ packed -- Is there a way to test this result matches w/o duplicating match?+ isMatch = current TRP.=~ packed+ in if not isMatch+ then (Nothing, s) -- match failed, return input unchanged+ else (Just (byteStringToStr before),+ s{current= B.append match after,loc=incOffsetBy loc (fromIntegral (B.length before))})++-- | See 'regexStop'+regexStop (REd re_str_raw def) s = regexStop (RE re_str_raw) s++-- | Remove and return the longest prefix of the source input satisfying the+-- given predicate.+span p (s @ Source{current,loc,..}) =+ let (head, tail) = B.span p current+ incOffset = B.length head+ in (B.unpack head, s{current=tail, loc = incOffsetBy loc incOffset})++-- | Same as 'span' but for predicates over type 'Char'.+whileS :: (Char -> Bool) -> Source -> Maybe (String,Source)+whileS p (s @ Source{current,loc,..}) =+ let (head, tail) = B.span (p . word8ToChr) current+ incOffset = B.length head+ in Just (byteStringToStr head, s{current=tail, loc=incOffsetBy loc incOffset})++-- | Remove the first byte of the input source.+tail (s @ Source{current,loc,..}) =+ (s{current=B.tail current,loc=incOffset loc})++-- | Scan the input source until we find the given character. If we don't find+-- the character indicate as such with the boolean (False) and remove all source+-- input from the current record. If we do find the character, return True and+-- consume input up to and including the matched character. The 'Span' in the+-- returned tuple indicates the region in the input that got scanned and removed+-- by this function (whether or not we failed to find the character).+scanTo :: Char -> Source -> (Bool, Source, Span)+scanTo chr (src @ Source{current,loc, ..}) =+ let begin = getSrcLoc src+ (skipped, residual) = B.break (\c->c== (chrToWord8 chr)) current+ (found,remaining,incAmount) =+ if B.null residual then -- Reached EOR w/o finding chr+ (False, residual, B.length skipped)+ else (True, B.tail residual, (B.length skipped) + 1)+ newLoc = incOffsetBy loc incAmount+ endErrLoc = incOffsetBy loc (B.length skipped)+ in (found,+ src {current = remaining, loc=newLoc},+ Span {begin, end=Just endErrLoc})+++lift :: (String -> [(a, String)]) -> (Source -> (Maybe a, Source))+lift f s = case f (byteStringToStr $ current s) of+ [] -> (Nothing, s)+ (x,residual):rest -> (Just x, s{current= (strToByteString residual)})++{- Helper routines -}++eqCurrent :: Source -> Source -> Bool+eqCurrent s s'= current s == current s'++chrToWord8 :: Char -> Word8+chrToWord8 c = toEnum $ fromEnum c++strToWord8s :: String -> [Word8]+strToWord8s = map chrToWord8++word8ToChr :: Word8 -> Char+word8ToChr = toEnum . fromEnum++word8sToStr :: [Word8] -> String+word8sToStr = map word8ToChr++byteStringToStr :: B.ByteString -> String+byteStringToStr = word8sToStr . B.unpack++strToByteString :: String -> B.ByteString+--strToByteString = B.pack . strToWord8s+strToByteString = Char8.pack++++locToSpan :: Loc -> Span+locToSpan loc = Span { begin = loc, end = Nothing }++locsToSpan :: Loc -> Loc -> Span+locsToSpan b e = Span {begin = b, end = Just e}++-------------------------------------------------------------------------------+-- * Pretty print sources+instance Pretty Source where+ ppr (Source{current, rest, ..}) = text "Current:" <+> text (show current)++instance Pretty Loc where+ ppr (Loc{recordNumber,byteOffset}) = text "Line:" <+> ppr recordNumber <> text ", Offset:" <+> ppr byteOffset++instance Pretty Span where+ ppr (Span{begin,end}) = case end of+ Nothing -> ppr begin+ Just end_loc -> text "from:" <+> ppr begin <+> text "to:" <+> ppr end_loc
+ Language/Pads/Syntax.hs view
@@ -0,0 +1,191 @@+{-# LANGUAGE DeriveDataTypeable,DeriveLift, DeriveAnyClass, DeriveGeneric #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.Syntax+ Description : The concrete syntax of Pads in Haskell+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++ Haskell data types, instances, and helper functions over these types for the+ syntax of Pads.++-}+module Language.Pads.Syntax where++import Data.Generics (Data(..), Typeable(..))+import Language.Haskell.TH+import Language.Haskell.TH.Lift (Lift(..))+import GHC.Generics (Generic(..))++instance Lift Pat+instance Lift Exp++-- | AST form of a pads declaration with four flavors.+data PadsDecl+ -- | A pads type declaration e.g.:+ --+ -- > [pads| type Foo x y z (foo :: Int) = (x, y, z, foo) |]+ = PadsDeclType String [String] (Maybe Pat) PadsTy++ -- | A pads data declaration e.g.:+ --+ -- > [pads| data Foo x y z (foo :: Int) = Foo (x, y, z, foo) deriving (Eq, Ord, Show) |]+ | PadsDeclData String [String] (Maybe Pat) PadsData [QString]++ -- | A pads newtype declaration e.g.:+ --+ -- > [pads| newtype Foo x y z (foo :: Int) = Foo (x, y, z, foo) deriving (Eq, Ord, Show) |]+ | PadsDeclNew String [String] (Maybe Pat) BranchInfo [QString]++ -- | A pads declaration for obtaining one type after parsing it from another, e.g.:+ --+ -- > [pads| obtain Foo x y z from Int using <|(fncn,inverse)|> |]+ | PadsDeclObtain String [String] PadsTy Exp+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | AST form of a pads type, as notably used to the right hand side of an+-- equals sign in a @'PadsDecl'@ pads declaration.+data PadsTy+ -- | AST form of "constrain @'Pat'@ :: @'PadsTy'@ where @'Exp'@" e.g.:+ --+ -- > [pads| constrain x :: Digit where <|x `mod` 2|> == 0|> |]+ = PConstrain Pat PadsTy Exp++ -- | AST form of "transform @'PadsTy'@ => @'PadsTy'@ using @'Exp'@" e.g.:+ --+ -- > [pads| transform StringFW 1 => Char using <|(head, list1)|> |]+ | PTransform PadsTy PadsTy Exp++ -- | AST form of a list of some @'PadsTy'@ type, comes with two optional attributes e.g.:+ -- "[ @'PadsTy'@ | @'PadsTy'@ ] terminator @'TermCond'@"+ --+ -- The following @'PadsTy'@ describes a comma-separated list of integers+ -- terminated by the EOF symbol:+ --+ -- > [pads| [Int | ','] terminator EOF |]+ | PList PadsTy (Maybe PadsTy) (Maybe TermCond)++ -- | AST form of a partitioned type "partition @'PadsTy'@ using @'Exp'@" e.g.:+ --+ -- > [pads| partition Entries using <| bytes 6 |> |]+ --+ -- A partitioned type allows for parser extensions to make use of the state of+ -- the PADS parser in deciding how to divide up (partition) the input.+ | PPartition PadsTy Exp++ -- | AST form of a value constructor "value @'Exp'@ :: @'PadsTy'@" e.g.:+ --+ -- > [pads| data Foo = Foo { x :: Int, xIsEven = value <| even x |> :: Bool } |]+ --+ -- This allows you to do the opposite of what @'BConstr'@ does: bring names into+ -- scope which get stored in the output of the parser (rather than having them+ -- disappear after the parser finishes.+ | PValue Exp PadsTy++ -- | A pads type application like "@'PadsTy'@ @'PadsTy'@ @'PadsTy'@ ... @'Exp'@" e.g.+ --+ -- > [pads| data Foo = Foo { x :: Int, Bar x <| x + 1 |> |]+ | PApp [PadsTy] (Maybe Exp)++ -- | AST form of a pads tuple "( @'PadsTy@', @'PadsTy@', ... )" e.g.+ --+ -- > [pads| (Int, "+", Int) |]+ | PTuple [PadsTy]++ -- | An arbitrary Haskell expression as used in a @'PApp'@ pads type application+ -- and in a @'PSwitch'@ pads switch/case type.+ | PExpression Exp++ -- | Pads type constructor with a qualified name+ | PTycon QString++ -- | Pads type variable with a name+ | PTyvar String+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | Parser terminator condition+data TermCond+ -- | Lexical terminator type: any @'PadsTy'@ signaling termination+ = LTerm PadsTy++ -- | Lexical length: arbitrary Haskell @'Exp@'+ | LLen Exp+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | Right-hand side of a pads data type declaration+data PadsData+ -- | A pads union data type declaration.+ -- Syntax: "@'BranchInfo'@ | @'BranchInfo'@ | ..."+ = PUnion [BranchInfo]++ -- | A pads switch-case 'statement'.+ --+ -- Syntax:+ --+ -- @+ -- case 'Exp' of+ -- 'Pat' -> 'BranchInfo'+ -- | 'Pat' -> 'BranchInfo'+ -- ...+ -- @+ --+ -- > [pads| case <| tag + 1 |> of+ -- > 2 -> Foo+ -- > | 3 -> Bar+ -- > |]+ | PSwitch Exp [(Pat,BranchInfo)]+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | An individual branch of some pads data type, either defining a Haskell record+-- parser or a Haskell constructor parser.+data BranchInfo+ -- | Branch record with a constructor name, list of record fields, and maybe a boolean 'where' clause.+ --+ -- Syntax: @'String'@ { @'FieldInfo'@, @'FieldInfo'@, ... } where @'Exp@'+ --+ -- > [pads| Foo { x :: Int, y :: Char } where <| x == ord y |>+ = BRecord String [FieldInfo] (Maybe Exp)++ -- | Branch constructor with a constructor name, a list of argument types, and maybe a boolean 'where' clause:+ --+ -- Syntax: @'String'@ @'ConstrArg'@ @'ConstrArg'@ ... where @'Exp@'+ --+ -- > [pads| Foo (x :: Int) (y :: Char) where <| x == ord y |>+ --+ -- Note that this lets you bring variables into scope during parsing (`x` and+ -- `y` in the above) *without* saving them into the parse result, effectively+ -- making them operate as temporary variables that can be referenced by the+ -- Haskell predicates.+ | BConstr String [ConstrArg] (Maybe Exp)+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | Individual field of a pads record, "@'String'@ :: @'ConstrArg'@ where @'Exp'@"+type FieldInfo = (Maybe String, ConstrArg, Maybe Exp)+type ConstrArg = (PadsStrict, PadsTy)++-- | A hold-over resulting from a deprecation moving from an older version of template-haskell.+data PadsStrict = IsStrict | NotStrict | Unpacked+ deriving (Eq, Data, Typeable, Show, Lift, Generic)++-- | Qualified names where ["Foo", "Bar"] means "Foo.Bar"+type QString = [String]++-- | Whether or not a @'PadsTy'@ has an underlying Haskell representation+hasRep :: PadsTy -> Bool+hasRep (PExpression l) = False+hasRep (PTycon ["EOF"]) = False+hasRep (PTycon ["EOR"]) = False+hasRep (PTycon ["Void"]) = False+hasRep ty = True++-- | > ["Foo", "Bar"] -> "Foo.Bar"+qName :: QString -> String+qName [n] = n+qName (n:ms) = n ++ "." ++ qName ms+++
+ Language/Pads/TH.hs view
@@ -0,0 +1,164 @@+{-# LANGUAGE TemplateHaskell, MagicHash #-}+{-# OPTIONS_GHC -Wall #-}+{-# OPTIONS_HADDOCK prune #-}+{-|+ Module : Language.Pads.TH+ Description : Template Haskell utilities+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.TH where++import Language.Haskell.TH as TH+import Language.Haskell.TH.Syntax+import Control.Monad+import Data.Char+import GHC.Exts++typeAnnotate :: Maybe TH.Pat -> Maybe (TH.Pat, TH.Type)+typeAnnotate Nothing = Nothing+typeAnnotate (Just pat) = Just (pat, patToTy pat)++mergeMaybe :: Maybe a -> Maybe b -> Maybe (a,b)+mergeMaybe m1 m2 = case (m1,m2) of+ (Nothing, Nothing) -> Nothing+ (Just d1, Just d2) -> Just (d1,d2)+ _ -> error "mergeMaybe given two maybes in different states."++mapFstChar :: (Char -> Char) -> String -> String+mapFstChar _ [] = []+mapFstChar f (c:cs) = f c : cs++strToUpper, strToLower :: String -> String+strToUpper = mapFstChar toUpper+strToLower = mapFstChar toLower++applyE :: [Exp] -> Exp+applyE ts = foldl1 AppE ts++applyT :: [Type] -> Type+applyT ts = foldl1 AppT ts++abstractT :: Type -> [Type] -> Type+abstractT t ts = foldr arrow t ts+ where+ t1 `arrow` t2 = (ArrowT `AppT` t1) `AppT` t2++arrowTy :: Type -> Type -> Type+arrowTy ty1 ty2 = (ArrowT `AppT` ty1) `AppT` ty2+++mkListT, mkTupleT :: [Type] -> Type+mkListT ts = foldl AppT ListT ts+mkTupleT ts = foldl AppT (TupleT (length ts)) ts++listTH, tupleTH :: [Name] -> Q Exp+listTH xs = return (ListE (map VarE xs))+tupleTH xs = return (TupE (map VarE xs))++++tupleTyToListofTys :: Type -> (Int,[Type])++-- for tuples encoded as AppT (,) (AppT a b)+tupleTyToListofTys (AppT (TupleT n) ty0) = (n, collect ty0)+ where+ collect ty = case ty of+ AppT ty' tys' -> ty' : collect tys'+ _ -> [ty]++-- for tuples encoded as AppT (AppT (,) a) b+tupleTyToListofTys ty0 = collect ty0 []+ where+ collect ty acc = case ty of+ TupleT n -> (n, acc)+ AppT tys ty' -> collect tys (ty':acc)+ _ -> error "typeleTyToListofTys: unexpected type"++genPE :: Name -> (Exp,Pat)+genPE name = (VarE name, VarP name)++genPEQ :: Name -> (Q Exp, Q Pat)+genPEQ name = (return (VarE name), return (VarP name))++doGenPE :: String -> Q (Exp,Pat)+doGenPE str = do {+ ; name <- newName str+ ; return (VarE name, VarP name)+ }++doGenPEs :: Int -> String -> Q([TH.Exp], [TH.Pat])+doGenPEs n str = do+ { varpats <- replicateM n (doGenPE str)+ ; return (unzip varpats)+ }++{- XXX: need to add location information so can report location of error messages. -}+patToTy :: TH.Pat -> TH.Type+patToTy pat = case pat of+ LitP l -> litToTy l+ VarP n -> error ("Variable "++ (showName n) ++ " needs a type annotation.")+ TupP pats -> mkTupleT (map patToTy pats)+ InfixP _ n _ -> error ("Infix constructor "++ (showName n) ++ " application needs a type annotation.")+ TildeP p -> patToTy p+ BangP p -> patToTy p+ AsP _ p -> patToTy p+ WildP -> error "Wild card patterns are not supported in PADS declarations."+ {- I think this is the correct represtentation of a line type. -}+ RecP name _fieldPats -> ConT name+ ListP pats -> mkListT (map patToTy pats)+ SigP _ ty -> ty+ ParensP pat' -> patToTy pat'+ _ -> error ("patToTy: unexpected pat: " ++ show pat)++litToTy :: TH.Lit -> TH.Type+litToTy lit = ConT $ case lit of+ CharL _ -> ''Char+ StringL _ -> ''String+ IntegerL _ -> ''Integer+ RationalL _ -> ''Rational+ IntPrimL _ -> ''Integer+ WordPrimL _ -> ''Integer+ FloatPrimL _ -> ''Rational+ DoublePrimL _ -> ''Rational+ _ -> error ("litToTy: unexpected lit: " ++ show lit)++patToExp :: TH.Pat -> TH.Exp+patToExp pat = case pat of+ LitP l -> LitE l+ VarP n -> VarE n+ TupP pats -> TupE (map patToExp pats)+ InfixP p1 n p2 -> InfixE (Just (patToExp p1)) (VarE n) (Just (patToExp p2))+ TildeP p -> patToExp p+ BangP p -> patToExp p+ AsP n _ -> VarE n+ WildP -> error "Wild card patterns are not supported in PADS \+ \ declarations. Can't convert to expression"++ {- I think this is the correct represtentation of a line type. -}+ RecP name fieldPats -> RecConE name (map fieldPatToExp fieldPats)+ ListP pats -> ListE (map patToExp pats)+ SigP p _ty -> patToExp p+ ParensP p -> patToExp p+ _ -> error ("patToExp: unexpected pat: " ++ show pat)++fieldPatToExp :: (a,Pat) -> (a,Exp)+fieldPatToExp (n,p) = (n, patToExp p)++boolToExpE :: Bool -> Exp+boolToExpE True = ConE 'True+boolToExpE False = ConE 'False++-- generate globally scoped unique variables as suggested in https://ghc.haskell.org/trac/ghc/ticket/5398+mangleName :: Name -> Name+mangleName name@(Name occ fl) = case fl of+ NameU (I# u) -> Name (mangle_occ occ u) fl+ _ -> name+ where+ mangle_occ :: OccName -> Int# -> OccName+ mangle_occ occ' uniq = mkOccName (occString occ' ++ "_" ++ show (I# uniq))
+ Language/Pads/Testing.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_HADDOCK prune, ignore-exports #-}+{-|+ Module : Language.Pads.Testing+ Description : Pads testing utilities+ Copyright : (c) 2011+ Kathleen Fisher <kathleen.fisher@gmail.com>+ John Launchbury <john.launchbury@gmail.com>+ License : MIT+ Maintainer : Karl Cronburg <karl@cs.tufts.edu>+ Stability : experimental++-}+module Language.Pads.Testing (+ module Test.HUnit,+ mkTestCase,+ mkFileTestCase,+ mdToError,+ mdFileToError+ )+ where++import Language.Pads.Padsc+import Test.HUnit hiding (test)++mdToError ((rep,md), residual) = (rep, getTotalErrors md, residual)+mkTestCase s expected seen = TestCase(assertEqual s expected (mdToError seen))++mdFileToError (rep,md) = (rep, getTotalErrors md)+mkFileTestCase s expected seen = TestCase(assertEqual s expected (mdFileToError seen))++getTotalErrors :: PadsMD md => md -> Int+getTotalErrors md = numErrors $ get_md_header md+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Test/Examples.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE TypeFamilies, ScopedTypeVariables, DeriveDataTypeable+ , MultiParamTypeClasses+ , TypeSynonymInstances+ , TemplateHaskell+ , QuasiQuotes+ , FlexibleInstances #-}+module Main where+import System.IO.Unsafe (unsafePerformIO)+import Data.Monoid+import Test.Framework+import Test.Framework.Providers.HUnit+import Test.Framework.Providers.QuickCheck2+import qualified Test.HUnit as H+import Test.HUnit ((@?=))+import Test.QuickCheck (Property, quickCheck, (==>))+import qualified Test.QuickCheck.Monadic as TQM+import Control.Monad.State.Lazy (liftIO)++import Language.Pads.Padsc+import Examples.Proc+import qualified Examples.First as First+import qualified Examples.AI as AI+import qualified Examples.Binary as Binary++procMaps fn =+ let (MapsFile maps, maps_md) = unsafePerformIO $ parseFileWith mapsFile_parseM fn+ in last maps+ @?=+ Region { start_addr = "ffffffffff600000"+ , end_addr = "ffffffffff601000"+ , perms = Permissions+ { permRead = READ+ , permWrite = NOWRITE+ , permExec = EXEC+ , permShare = PRIVATE+ }+ , offset = 0+ , device = ("00", "00")+ , inode = 0+ , path = VSyscall+ }++testFirst =+ unsafePerformIO First.test+ @?=+ H.Counts (length First.tests) (length First.tests) 0 0++testAI = True ==> TQM.monadicIO $ do+ r <- liftIO $ AI.result 1+ TQM.assert $ r ==+ [ AI.Entry+ { AI.host = AI.Addr 207 136 97 49+ , AI.identdID = AI.Missing+ , AI.httpID = AI.Missing+ , AI.time = read "1997-10-16 01:46:51 UTC"+ , AI.request = AI.Request+ { AI.method = AI.GET+ , AI.url = "/turkey/amnty1.gif"+ , AI.version = AI.Version {AI.major = 1, AI.minor = 0}+ }+ , AI.response = 200+ , AI.contentLen = AI.ContentLength 3013+ }+ ]++testBinary =+ unsafePerformIO Binary.test+ @?=+ H.Counts (length Binary.tests) (length Binary.tests) 0 0++main :: IO ()+main = defaultMainWithOpts+ [ testCase "Examples.First" testFirst+ , testProperty "Examples.AI" testAI+ , testCase "proc maps file 0" (procMaps "Test/data/maps0")+ ] mempty+
+ Test/data/maps0 view
@@ -0,0 +1,33 @@+00400000-00422000 r-xp 00000000 fe:02 4968 /usr/bin/less+00622000-00623000 r--p 00022000 fe:02 4968 /usr/bin/less+00623000-00627000 rw-p 00023000 fe:02 4968 /usr/bin/less+00627000-0062b000 rw-p 00000000 00:00 0 +00aa0000-00ac1000 rw-p 00000000 00:00 0 [heap]+7f1ae9999000-7f1ae99b2000 r-xp 00000000 fe:02 93235 /usr/lib/libpthread-2.25.so+7f1ae99b2000-7f1ae9bb1000 ---p 00019000 fe:02 93235 /usr/lib/libpthread-2.25.so+7f1ae9bb1000-7f1ae9bb2000 r--p 00018000 fe:02 93235 /usr/lib/libpthread-2.25.so+7f1ae9bb2000-7f1ae9bb3000 rw-p 00019000 fe:02 93235 /usr/lib/libpthread-2.25.so+7f1ae9bb3000-7f1ae9bb7000 rw-p 00000000 00:00 0 +7f1ae9bb7000-7f1ae9d52000 r-xp 00000000 fe:02 93077 /usr/lib/libc-2.25.so+7f1ae9d52000-7f1ae9f51000 ---p 0019b000 fe:02 93077 /usr/lib/libc-2.25.so+7f1ae9f51000-7f1ae9f55000 r--p 0019a000 fe:02 93077 /usr/lib/libc-2.25.so+7f1ae9f55000-7f1ae9f57000 rw-p 0019e000 fe:02 93077 /usr/lib/libc-2.25.so+7f1ae9f57000-7f1ae9f5b000 rw-p 00000000 00:00 0 +7f1ae9f5b000-7f1ae9fcd000 r-xp 00000000 fe:02 108084 /usr/lib/libpcre.so.1.2.8+7f1ae9fcd000-7f1aea1cc000 ---p 00072000 fe:02 108084 /usr/lib/libpcre.so.1.2.8+7f1aea1cc000-7f1aea1cd000 r--p 00071000 fe:02 108084 /usr/lib/libpcre.so.1.2.8+7f1aea1cd000-7f1aea1ce000 rw-p 00072000 fe:02 108084 /usr/lib/libpcre.so.1.2.8+7f1aea1ce000-7f1aea235000 r-xp 00000000 fe:02 106343 /usr/lib/libncursesw.so.6.0+7f1aea235000-7f1aea434000 ---p 00067000 fe:02 106343 /usr/lib/libncursesw.so.6.0+7f1aea434000-7f1aea438000 r--p 00066000 fe:02 106343 /usr/lib/libncursesw.so.6.0+7f1aea438000-7f1aea43a000 rw-p 0006a000 fe:02 106343 /usr/lib/libncursesw.so.6.0+7f1aea43a000-7f1aea45d000 r-xp 00000000 fe:02 93078 /usr/lib/ld-2.25.so+7f1aea490000-7f1aea629000 r--p 00000000 fe:02 96759 /usr/lib/locale/locale-archive+7f1aea629000-7f1aea62d000 rw-p 00000000 00:00 0 +7f1aea65c000-7f1aea65d000 r--p 00022000 fe:02 93078 /usr/lib/ld-2.25.so+7f1aea65d000-7f1aea65e000 rw-p 00023000 fe:02 93078 /usr/lib/ld-2.25.so+7f1aea65e000-7f1aea65f000 rw-p 00000000 00:00 0 +7fff3cc14000-7fff3cc35000 rw-p 00000000 00:00 0 [stack]+7fff3cc3a000-7fff3cc3c000 r--p 00000000 00:00 0 [vvar]+7fff3cc3c000-7fff3cc3e000 r-xp 00000000 00:00 0 [vdso]+ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
+ pads-haskell.cabal view
@@ -0,0 +1,161 @@+-- pads-haskell.cabal auto-generated by cabal init. For additional options,+-- see+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.+-- The name of the package.+Name: pads-haskell++-- The package version. See the Haskell package versioning policy+-- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for+-- standards guiding when and how versions should be incremented.+Version: 0.0.0.1++-- A short (one-line) description of the package.+Synopsis: PADS data description language for Haskell++-- A longer description of the package.+Description: Massive amounts of useful data are stored and processed in+ ad hoc formats for which common tools like parsers,+ printers, query engines and format converters are not readily+ available. Pads/Haskell is a domain-specific language that+ facilitates the generation of data processing tools for ad hoc+ formats. Pads/Haskell includes features such as+ dependent, polymorphic and recursive datatypes, which allow+ programmers to describe the syntax and semantics of ad hoc data in a+ concise, easy-to-read notation.++-- URL for the project homepage or repository.+Homepage: http://www.padsproj.org++-- The license under which the package is released.+License: BSD3++-- The file containing the license text.+License-file: LICENSE++-- The package author(s).+Author: Kathleen Fisher and John Launchbury++-- An email address to which users can send suggestions, bug reports,+-- and patches.+Maintainer: kathleen.fisher@gmail.com++-- A copyright notice.+-- Copyright:+++Category: Language++Build-type: Simple++-- Extra files to be distributed with the package, such as examples or+-- a README.+Extra-source-files: Examples/First.hs, Examples/AI.hs, Examples/Binary.hs,+ Examples/data/README+ Examples/data/test_file+ Examples/data/ai.3000, Examples/data/ai.big,+ Examples/data/binary,+ Examples/data/a2b.c, Examples/data/calls10.a, Examples/data/calls10.b,+ Examples/data/genBin.c, Examples/data/binTest.a, Examples/data/binTest.b+ Documentation/Info/PADS-Index.txt+ Documentation/Info/PackagesUsedInPads.txt+ Documentation/Info/Pads-grammar.tex+ Test/data/maps0++-- Constraint on the version of Cabal needed to build this package.+Cabal-version: >=1.10+++Library+ -- Modules exported by the library.+ exposed-modules: Language.Pads.GenPretty, Language.Pads.Padsc,+ Language.Pads.BaseTypes, Language.Pads.Quote,+ Language.Pads.Syntax, Language.Pads.Parser,+ Language.Pads.Generic, Language.Pads.RegExp+ Language.Pads.Pretty, Language.Pads.Source,+ Language.Pads.TH, Language.Pads.Testing,+ Language.Pads.Library.BinaryUtilities,+ Language.Pads.Library.Native,+ Language.Pads.Library.BigEndian,+ Language.Pads.Library.LittleEndian,+ Language.Pads.CodeGen,+ Language.Pads.CoreBaseTypes,+ Language.Pads.Errors,+ Language.Pads.MetaData,+ Language.Pads.PadsParser,+ Language.Pads.PadsPrinter++ -- Packages needed in order to build this package.+ build-depends: base >= 4.7 && < 5.0,+ syb >= 0.7 && < 0.8,+ containers >= 0.5.5.1 && < 0.6,+ template-haskell >= 2.9 && < 2.14,+ Glob >= 0.9.2 && < 0.10,+ regex-posix >= 0.95.2 && < 0.96,+ bytestring >= 0.10.4 && < 0.11,+ haskell-src >= 1.0.1.6 && < 1.1,+ haskell-src-meta >= 0.8.0.2 && < 0.9,+ parsec >= 3.1.0 && < 3.2,+ mainland-pretty >= 0.6.1 && < 0.7,+ HUnit >= 1.6.0.0 && < 1.7,+ byteorder >= 1.0.4 && < 1.1,+ old-locale >= 1.0.0.6 && < 1.1,+ time >= 1.8.0.2 && < 1.9,+ random >= 1.1 && < 1.2,+ normaldistribution >= 1.1.0.3 && < 1.2,+ th-lift >= 0.7.8 && < 0.8,+ transformers++ -- Modules not exported by this package.++ default-language: Haskell2010++ -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.+ -- Build-tools:++Flag debug+ Description: Adds debug logging+ Manual: True+ Default: False+ ++Test-Suite examples+ Type: exitcode-stdio-1.0+ Main-Is: Test/Examples.hs+ if flag(debug)+ ghc-options: -ddump-splices+ build-depends: base+ , old-locale, haskell-src, template-haskell+ , mainland-pretty, containers, time, syb, parsec+ , haskell-src-meta, Glob, bytestring, regex-posix+ , QuickCheck, HUnit+ , Cabal+ , test-framework+ , test-framework-hunit+ , test-framework-quickcheck2+ , directory, byteorder+ , th-lift, transformers, mtl+ default-language: Haskell2010+ other-modules: Examples.Proc, Examples.First, Examples.AI, Examples.Binary+ , Examples.FirstPads+ , Language.Pads.Testing+ , Language.Pads.BaseTypes+ , Language.Pads.CodeGen+ , Language.Pads.CoreBaseTypes+ , Language.Pads.Errors+ , Language.Pads.GenPretty+ , Language.Pads.Generic+ , Language.Pads.MetaData+ , Language.Pads.PadsParser+ , Language.Pads.PadsPrinter+ , Language.Pads.Padsc+ , Language.Pads.Parser+ , Language.Pads.Pretty+ , Language.Pads.Quote+ , Language.Pads.RegExp+ , Language.Pads.Source+ , Language.Pads.Syntax+ , Language.Pads.TH+ , Language.Pads.Library.BigEndian+ , Language.Pads.Library.BinaryUtilities+ , Language.Pads.Library.LittleEndian+ , Language.Pads.Library.Native