(CommandList
  children: [
    (If
      arms: [
        (if_arm
          cond: [(C {(test_have_prereq)} {(MINGW)})]
          action: [
            (FuncDef
              name: sanitize_L
              body: 
                (BraceGroup
                  children: [
                    (Pipeline
                      children: [
                        (C {(echo)} {(DQ ($ VSub_Number "$1"))})
                        (C {(sed)} {(SQ <"sX\\(^-L\\|,\\)\\^\\?/X&\\\\;*Xg">)})
                      ]
                      negated: False
                    )
                  ]
                  spids: [21]
                )
              spids: [16 20]
            )
          ]
          spids: [-1 13]
        )
      ]
      else_action: [
        (FuncDef
          name: sanitize_L
          body: (BraceGroup children:[(C {(echo)} {(DQ ($ VSub_Number "$1"))})] spids:[49])
          spids: [44 48]
        )
      ]
      spids: [41 61]
    )
    (FuncDef
      name: check_count
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Assignment
                  keyword: Assign_None
                  pairs: [(assign_pair lhs:(LhsName name:head) op:Equal rhs:{(SQ )} spids:[72])]
                  spids: [72]
                )
                (AndOr
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:file)
                          op: Equal
                          rhs: {(SQ <file>)}
                          spids: [77]
                        )
                      ]
                      spids: [77]
                    )
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:options)
                              op: Equal
                              rhs: {(SQ )}
                              spids: [85]
                            )
                          ]
                          spids: [85]
                        )
                        (AndOr
                          children: [
                            (While
                              cond: [(C {(Lit_Other ":")})]
                              body: 
                                (DoGroup
                                  children: [
                                    (Case
                                      to_match: {(DQ ($ VSub_Number "$1"))}
                                      arms: [
                                        (case_arm
                                          pat_list: [{(-h)}]
                                          action: [
                                            (Sentence
                                              child: 
                                                (Assignment
                                                  keyword: Assign_None
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (LhsName name:head)
                                                      op: Equal
                                                      rhs: {(DQ ($ VSub_Number "$2"))}
                                                      spids: [110]
                                                    )
                                                  ]
                                                  spids: [110]
                                                )
                                              terminator: <Op_Semi ";">
                                            )
                                            (Sentence
                                              child: (C {(shift)})
                                              terminator: <Op_Semi ";">
                                            )
                                            (C {(shift)})
                                          ]
                                          spids: [107 108 121 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(-f)}]
                                          action: [
                                            (Sentence
                                              child: 
                                                (Assignment
                                                  keyword: Assign_None
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (LhsName name:file)
                                                      op: Equal
                                                      rhs: {(DQ ($ VSub_Number "$2"))}
                                                      spids: [127]
                                                    )
                                                  ]
                                                  spids: [127]
                                                )
                                              terminator: <Op_Semi ";">
                                            )
                                            (Sentence
                                              child: (C {(shift)})
                                              terminator: <Op_Semi ";">
                                            )
                                            (C {(shift)})
                                          ]
                                          spids: [124 125 138 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(-L) (Lit_Other "*")}]
                                          action: [
                                            (Sentence
                                              child: 
                                                (Assignment
                                                  keyword: Assign_None
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (LhsName name:options)
                                                      op: Equal
                                                      rhs: 
                                                        {
                                                          (DQ ($ VSub_Name "$options") (" ") 
                                                            (CommandSubPart
                                                              command_list: 
                                                                (CommandList
                                                                  children: [
                                                                    (C {(sanitize_L)} 
                                                                      {(DQ ($ VSub_Number "$1"))}
                                                                    )
                                                                  ]
                                                                )
                                                              left_token: <Left_CommandSub "$(">
                                                              spids: [149 155]
                                                            )
                                                          )
                                                        }
                                                      spids: [145]
                                                    )
                                                  ]
                                                  spids: [145]
                                                )
                                              terminator: <Op_Semi ";">
                                            )
                                            (C {(shift)})
                                          ]
                                          spids: [141 143 161 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(-) (Lit_Other "*")}]
                                          action: [
                                            (Sentence
                                              child: 
                                                (Assignment
                                                  keyword: Assign_None
                                                  pairs: [
                                                    (assign_pair
                                                      lhs: (LhsName name:options)
                                                      op: Equal
                                                      rhs: 
                                                        {
                                                          (DQ ($ VSub_Name "$options") (" ") 
                                                            ($ VSub_Number "$1")
                                                          )
                                                        }
                                                      spids: [168]
                                                    )
                                                  ]
                                                  spids: [168]
                                                )
                                              terminator: <Op_Semi ";">
                                            )
                                            (C {(shift)})
                                          ]
                                          spids: [164 166 178 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(Lit_Other "*")}]
                                          action: [(ControlFlow token:<ControlFlow_Break break>)]
                                          spids: [181 182 186 -1]
                                        )
                                      ]
                                      spids: [98 104 189]
                                    )
                                  ]
                                  spids: [95 192]
                                )
                            )
                            (AndOr
                              children: [
                                (SimpleCommand
                                  words: [
                                    {(echo)}
                                    {
                                      (DQ ($ VSub_Name "$PROG") (" ") ($ VSub_Name "$options") (" ") 
                                        ($ VSub_Name "$file") (" ") ($ VSub_Name "$head")
                                      )
                                    }
                                  ]
                                  redirects: [
                                    (Redir
                                      op_id: Redir_GreatAnd
                                      fd: -1
                                      arg_word: {(4)}
                                      spids: [209]
                                    )
                                  ]
                                )
                                (AndOr
                                  children: [
                                    (SimpleCommand
                                      words: [
                                        {($ VSub_Name "$PROG")}
                                        {($ VSub_Name "$options")}
                                        {($ VSub_Name "$file")}
                                        {($ VSub_Name "$head")}
                                      ]
                                      redirects: [
                                        (Redir
                                          op_id: Redir_Great
                                          fd: -1
                                          arg_word: {(actual)}
                                          spids: [223]
                                        )
                                      ]
                                    )
                                    (SimpleCommand
                                      words: [
                                        {(perl)}
                                        {(-e)}
                                        {
                                          (SQ <"\n"> <"\t\tmy %expect = (@ARGV);\n"> 
                                            <"\t\tmy %count = map { $_ => 0 } keys %expect;\n"> <"\t\twhile (<STDIN>) {\n"> <"\t\t\tif (/^[0-9a-f]+\\t\\(([^\\t]+)\\t/) {\n"> 
                                            <"\t\t\t\tmy $author = $1;\n"> <"\t\t\t\tfor ($author) { s/^\\s*//; s/\\s*$//; }\n"> <"\t\t\t\t$count{$author}++;\n"> <"\t\t\t}\n"> 
                                            <"\t\t}\n"> <"\t\tmy $bad = 0;\n"> <"\t\twhile (my ($author, $count) = each %count) {\n"> <"\t\t\tmy $ok;\n"> 
                                            <"\t\t\tmy $value = 0;\n"> <"\t\t\t$value = $expect{$author} if defined $expect{$author};\n"> <"\t\t\tif ($value != $count) {\n"> 
                                            <"\t\t\t\t$bad = 1;\n"> <"\t\t\t\t$ok = \"bad\";\n"> <"\t\t\t}\n"> <"\t\t\telse {\n"> <"\t\t\t\t$ok = \"good\";\n"> <"\t\t\t}\n"> 
                                            <
"\t\t\tprint STDERR \"Author $author (expected $value, attributed $count) $ok\\n\";\n"
                                            > <"\t\t}\n"> <"\t\texit($bad);\n"> <"\t">
                                          )
                                        }
                                        {(DQ ($ VSub_At "$@"))}
                                      ]
                                      redirects: [
                                        (Redir
                                          op_id: Redir_Less
                                          fd: -1
                                          arg_word: {(actual)}
                                          spids: [266]
                                        )
                                      ]
                                    )
                                  ]
                                  op_id: Op_DAmp
                                )
                              ]
                              op_id: Op_DAmp
                            )
                          ]
                          op_id: Op_DAmp
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [69]
        )
      spids: [64 68]
    )
    (C {(test_expect_success)} {(SQ <"setup A lines">)} 
      {
        (SQ <"\n"> <"\techo \"1A quick brown fox jumps over the\" >file &&\n"> 
          <"\techo \"lazy dog\" >>file &&\n"> <"\tgit add file &&\n"> <"\tGIT_AUTHOR_NAME=\"A\" GIT_AUTHOR_EMAIL=\"A@test.git\" \\\n"> 
          <"\tgit commit -a -m \"Initial.\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame 1 author">)} {(SQ <"\n"> <"\tcheck_count A 2\n">)})
    (C {(test_expect_success)} {(SQ <"blame by tag objects">)} 
      {
        (SQ <"\n"> <"\tgit tag -m \"test tag\" testTag &&\n"> 
          <"\tgit tag -m \"test tag #2\" testTag2 testTag &&\n"> <"\tcheck_count -h testTag A 2 &&\n"> <"\tcheck_count -h testTag2 A 2\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup B lines">)} 
      {
        (SQ <"\n"> <"\techo \"2A quick brown fox jumps over the\" >>file &&\n"> 
          <"\techo \"lazy dog\" >>file &&\n"> <"\tGIT_AUTHOR_NAME=\"B\" GIT_AUTHOR_EMAIL=\"B@test.git\" \\\n"> <"\tgit commit -a -m \"Second.\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame 2 authors">)} {(SQ <"\n"> <"\tcheck_count A 2 B 2\n">)})
    (C {(test_expect_success)} {(SQ <"setup B1 lines (branch1)">)} 
      {
        (SQ <"\n"> <"\tgit checkout -b branch1 master &&\n"> 
          <"\techo \"3A slow green fox jumps into the\" >>file &&\n"> <"\techo \"well.\" >>file &&\n"> <"\tGIT_AUTHOR_NAME=\"B1\" GIT_AUTHOR_EMAIL=\"B1@test.git\" \\\n"> 
          <"\tgit commit -a -m \"Branch1-1\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame 2 authors + 1 branch1 author">)} 
      {(SQ <"\n"> <"\tcheck_count A 2 B 2 B1 2\n">)}
    )
    (C {(test_expect_success)} {(SQ <"setup B2 lines (branch2)">)} 
      {
        (SQ <"\n"> <"\tgit checkout -b branch2 master &&\n"> 
          <"\tsed -e \"s/2A quick brown/4A quick brown lazy dog/\" <file >file.new &&\n"> <"\tmv file.new file &&\n"> <"\tGIT_AUTHOR_NAME=\"B2\" GIT_AUTHOR_EMAIL=\"B2@test.git\" \\\n"> 
          <"\tgit commit -a -m \"Branch2-1\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame 2 authors + 1 branch2 author">)} 
      {(SQ <"\n"> <"\tcheck_count A 2 B 1 B2 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"merge branch1 & branch2">)} {(SQ <"\n"> <"\tgit merge branch1\n">)})
    (C {(test_expect_success)} {(SQ <"blame 2 authors + 2 merged-in authors">)} 
      {(SQ <"\n"> <"\tcheck_count A 2 B 1 B1 2 B2 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame --first-parent blames merge for branch1">)} 
      {(SQ <"\n"> <"\tcheck_count --first-parent A 2 B 1 \"A U Thor\" 2 B2 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame ancestor">)} 
      {(SQ <"\n"> <"\tcheck_count -h master A 2 B 2\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame great-ancestor">)} 
      {(SQ <"\n"> <"\tcheck_count -h master^ A 2\n">)}
    )
    (C {(test_expect_success)} {(SQ <"setup evil merge">)} 
      {(SQ <"\n"> <"\techo \"evil merge.\" >>file &&\n"> <"\tgit commit -a --amend\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame evil merge">)} 
      {(SQ <"\n"> <"\tcheck_count A 2 B 1 B1 2 B2 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame huge graft">)} 
      {
        (SQ <"\n"> <"\ttest_when_finished \"git checkout branch2\" &&\n"> 
          <"\ttest_when_finished \"rm -f .git/info/grafts\" &&\n"> <"\tgraft= &&\n"> <"\tfor i in 0 1 2\n"> <"\tdo\n"> <"\t\tfor j in 0 1 2 3 4 5 6 7 8 9\n"> <"\t\tdo\n"> 
          <"\t\t\tgit checkout --orphan \"$i$j\" &&\n"> <"\t\t\tprintf \"%s\\n\" \"$i\" \"$j\" >file &&\n"> <"\t\t\ttest_tick &&\n"> 
          <"\t\t\tGIT_AUTHOR_NAME=$i$j GIT_AUTHOR_EMAIL=$i$j@test.git \\\n"> <"\t\t\tgit commit -a -m \"$i$j\" &&\n"> <"\t\t\tcommit=$(git rev-parse --verify HEAD) &&\n"> 
          <"\t\t\tgraft=\"$graft$commit \"\n"> <"\t\tdone\n"> <"\tdone &&\n"> <"\tprintf \"%s \" $graft >.git/info/grafts &&\n"> 
          <"\tcheck_count -h 00 01 1 10 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup incomplete line">)} 
      {
        (SQ <"\n"> <"\techo \"incomplete\" | tr -d \"\\\\012\" >>file &&\n"> 
          <"\tGIT_AUTHOR_NAME=\"C\" GIT_AUTHOR_EMAIL=\"C@test.git\" \\\n"> <"\tgit commit -a -m \"Incomplete\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame incomplete line">)} 
      {(SQ <"\n"> <"\tcheck_count A 2 B 1 B1 2 B2 1 \"A U Thor\" 1 C 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"setup edits">)} 
      {
        (SQ <"\n"> <"\tmv file file.orig &&\n"> <"\t{\n"> <"\t\tcat file.orig &&\n"> <"\t\techo\n"> 
          <"\t} | sed -e \"s/^3A/99/\" -e \"/^1A/d\" -e \"/^incomplete/d\" >file &&\n"> <"\techo \"incomplete\" | tr -d \"\\\\012\" >>file &&\n"> 
          <"\tGIT_AUTHOR_NAME=\"D\" GIT_AUTHOR_EMAIL=\"D@test.git\" \\\n"> <"\tgit commit -a -m \"edit\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame edits">)} 
      {(SQ <"\n"> <"\tcheck_count A 1 B 1 B1 1 B2 1 \"A U Thor\" 1 C 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"setup obfuscated email">)} 
      {
        (SQ <"\n"> <"\techo \"No robots allowed\" >file.new &&\n"> <"\tcat file >>file.new &&\n"> 
          <"\tmv file.new file &&\n"> <"\tGIT_AUTHOR_NAME=\"E\" GIT_AUTHOR_EMAIL=\"E at test dot git\" \\\n"> 
          <"\tgit commit -a -m \"norobots\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame obfuscated email">)} 
      {(SQ <"\n"> <"\tcheck_count A 1 B 1 B1 1 B2 1 \"A U Thor\" 1 C 1 D 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 1 (all)">)} 
      {(SQ <"\n"> <"\tcheck_count -L1 A 1 B 1 B1 1 B2 1 \"A U Thor\" 1 C 1 D 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L , (all)">)} 
      {(SQ <"\n"> <"\tcheck_count -L, A 1 B 1 B1 1 B2 1 \"A U Thor\" 1 C 1 D 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X (X to end)">)} 
      {(SQ <"\n"> <"\tcheck_count -L5 B1 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X, (X to end)">)} 
      {(SQ <"\n"> <"\tcheck_count -L5, B1 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,Y (up to Y)">)} 
      {(SQ <"\n"> <"\tcheck_count -L,3 A 1 B2 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,X">)} {(SQ <"\n"> <"\tcheck_count -L3,3 B2 1\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L X,Y">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,6 B 1 B1 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L Y,X (undocumented)">)} 
      {(SQ <"\n"> <"\tcheck_count -L6,3 B 1 B1 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L -X">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L-1 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 0">)} {(SQ <"\n"> <"\ttest_must_fail $PROG -L0 file\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L ,0">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L,0 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,+0">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L,+0 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,+0">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,+0 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,+1">)} {(SQ <"\n"> <"\tcheck_count -L3,+1 B2 1\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L X,+N">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,+4 B 1 B1 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,-0">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L,-0 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,-0">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,-0 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,-1">)} {(SQ <"\n"> <"\tcheck_count -L3,-1 B2 1\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L X,-N">)} 
      {(SQ <"\n"> <"\tcheck_count -L6,-4 B 1 B1 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (RE to end)">)} 
      {(SQ <"\n"> <"\tcheck_count -L/evil/ C 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/,/RE2/">)} 
      {(SQ <"\n"> <"\tcheck_count -L/robot/,/green/ A 1 B 1 B2 1 D 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,/RE/">)} 
      {(SQ <"\n"> <"\tcheck_count -L5,/evil/ B1 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/,Y">)} 
      {(SQ <"\n"> <"\tcheck_count -L/99/,7 B1 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/,+N">)} 
      {(SQ <"\n"> <"\tcheck_count -L/99/,+3 B1 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/,-N">)} 
      {(SQ <"\n"> <"\tcheck_count -L/99/,-3 B 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X (X == nlines)">)} 
      {(SQ <"\n"> <"\tn=$(expr $(wc -l <file) + 1) &&\n"> <"\tcheck_count -L$n C 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X (X == nlines + 1)">)} 
      {(SQ <"\n"> <"\tn=$(expr $(wc -l <file) + 2) &&\n"> <"\ttest_must_fail $PROG -L$n file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X (X > nlines)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L12345 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,Y (Y == nlines)">)} 
      {
        (SQ <"\n"> <"\tn=$(expr $(wc -l <file) + 1) &&\n"> 
          <"\tcheck_count -L,$n A 1 B 1 B1 1 B2 1 \"A U Thor\" 1 C 1 D 1 E 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,Y (Y == nlines + 1)">)} 
      {(SQ <"\n"> <"\tn=$(expr $(wc -l <file) + 2) &&\n"> <"\ttest_must_fail $PROG -L,$n file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,Y (Y > nlines)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L,12345 file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (disjoint)">)} 
      {(SQ <"\n"> <"\tcheck_count -L2,3 -L6,7 A 1 B1 1 B2 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (disjoint: unordered)">)} 
      {(SQ <"\n"> <"\tcheck_count -L6,7 -L2,3 A 1 B1 1 B2 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (adjacent)">)} 
      {(SQ <"\n"> <"\tcheck_count -L2,3 -L4,5 A 1 B 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (adjacent: unordered)">)} 
      {(SQ <"\n"> <"\tcheck_count -L4,5 -L2,3 A 1 B 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (overlapping)">)} 
      {(SQ <"\n"> <"\tcheck_count -L2,4 -L3,5 A 1 B 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (overlapping: unordered)">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,5 -L2,4 A 1 B 1 B2 1 D 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (superset/subset)">)} 
      {(SQ <"\n"> <"\tcheck_count -L2,8 -L3,5 A 1 B 1 B1 1 B2 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L multiple (superset/subset: unordered)">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,5 -L2,8 A 1 B 1 B1 1 B2 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (relative)">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,3 -L/fox/ B1 1 B2 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (relative: no preceding range)">)} 
      {(SQ <"\n"> <"\tcheck_count -L/dog/ A 1 B 1 B1 1 B2 1 C 1 D 1 \"A U Thor\" 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (relative: adjacent)">)} 
      {(SQ <"\n"> <"\tcheck_count -L1,1 -L/dog/,+1 A 1 E 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (relative: not found)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L4,4 -L/dog/ file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L /RE/ (relative: end-of-file)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L, -L/$/ file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^/RE/ (absolute)">)} 
      {(SQ <"\n"> <"\tcheck_count -L3,3 -L^/dog/,+2 A 1 B2 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^/RE/ (absolute: no preceding range)">)} 
      {(SQ <"\n"> <"\tcheck_count -L^/dog/,+2 A 1 B2 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^/RE/ (absolute: not found)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L4,4 -L^/tambourine/ file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^/RE/ (absolute: end-of-file)">)} 
      {
        (SQ <"\n"> <"\tn=$(expr $(wc -l <file) + 1) &&\n"> 
          <"\tcheck_count -L$n -L^/$/,+2 A 1 C 1 E 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup -L :regex">)} 
      {
        (SQ <"\n"> <"\ttr Q \"\\\\t\" >hello.c <<-\\EOF &&\n"> 
          <"\tint main(int argc, const char *argv[])\n"> <"\t{\n"> <"\tQputs(\"hello\");\n"> <"\t}\n"> <"\tEOF\n"> <"\tgit add hello.c &&\n"> 
          <"\tGIT_AUTHOR_NAME=\"F\" GIT_AUTHOR_EMAIL=\"F@test.git\" \\\n"> <"\tgit commit -m \"hello\" &&\n"> <"\n"> <"\tmv hello.c hello.orig &&\n"> 
          <"\tsed -e \"/}/ {x; s/$/Qputs(\\\"goodbye\\\");/; G;}\" <hello.orig |\n"> <"\ttr Q \"\\\\t\" >hello.c &&\n"> <"\tGIT_AUTHOR_NAME=\"G\" GIT_AUTHOR_EMAIL=\"G@test.git\" \\\n"> 
          <"\tgit commit -a -m \"goodbye\" &&\n"> <"\n"> <"\tmv hello.c hello.orig &&\n"> <"\techo \"#include <stdio.h>\" >hello.c &&\n"> 
          <"\tcat hello.orig >>hello.c &&\n"> <"\ttr Q \"\\\\t\" >>hello.c <<-\\EOF &&\n"> <"\tvoid mail()\n"> <"\t{\n"> <"\tQputs(\"mail\");\n"> 
          <"\t}\n"> <"\tEOF\n"> <"\tGIT_AUTHOR_NAME=\"H\" GIT_AUTHOR_EMAIL=\"H@test.git\" \\\n"> 
          <"\tgit commit -a -m \"mail\"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame -L :literal">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c -L:main F 4 G 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :regex">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c \"-L:m[a-z][a-z]l\" H 4\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :nomatch">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L:nomatch hello.c\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :RE (relative)">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c -L3,3 -L:ma.. F 1 H 4\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :RE (relative: no preceding range)">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c -L:ma.. F 4 G 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :RE (relative: not found)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L3,3 -L:tambourine hello.c\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L :RE (relative: end-of-file)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L, -L:main hello.c\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^:RE (absolute)">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c -L3,3 -L^:ma.. F 4 G 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^:RE (absolute: no preceding range)">)} 
      {(SQ <"\n"> <"\tcheck_count -f hello.c -L^:ma.. F 4 G 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^:RE (absolute: not found)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L4,4 -L^:tambourine hello.c\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ^:RE (absolute: end-of-file)">)} 
      {
        (SQ <"\n"> <"\tn=$(printf \"%d\" $(wc -l <hello.c)) &&\n"> 
          <"\tcheck_count -f hello.c -L$n -L^:ma.. F 4 G 1 H 1\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup incremental">)} 
      {
        (SQ <"\n"> <"\t(\n"> <"\tGIT_AUTHOR_NAME=I &&\n"> <"\texport GIT_AUTHOR_NAME &&\n"> 
          <"\tGIT_AUTHOR_EMAIL=I@test.git &&\n"> <"\texport GIT_AUTHOR_EMAIL &&\n"> <"\t>incremental &&\n"> <"\tgit add incremental &&\n"> 
          <"\tgit commit -m \"step 0\" &&\n"> <"\tprintf \"partial\" >>incremental &&\n"> <"\tgit commit -a -m \"step 0.5\" &&\n"> 
          <"\techo >>incremental &&\n"> <"\tgit commit -a -m \"step 1\"\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"blame empty">)} 
      {(SQ <"\n"> <"\tcheck_count -h HEAD^^ -f incremental\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 0 empty">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L0 incremental HEAD^^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 1 empty">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1 incremental HEAD^^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 2 empty">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L2 incremental HEAD^^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame half">)} 
      {(SQ <"\n"> <"\tcheck_count -h HEAD^ -f incremental I 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 0 half">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L0 incremental HEAD^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 1 half">)} 
      {(SQ <"\n"> <"\tcheck_count -h HEAD^ -f incremental -L1 I 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 2 half">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L2 incremental HEAD^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 3 half">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L3 incremental HEAD^\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame full">)} {(SQ <"\n"> <"\tcheck_count -f incremental I 1\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L 0 full">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L0 incremental\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 1 full">)} 
      {(SQ <"\n"> <"\tcheck_count -f incremental -L1 I 1\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 2 full">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L2 incremental\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L 3 full">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L3 incremental\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L">)} {(SQ <"\n"> <"\ttest_must_fail $PROG -L file\n">)})
    (C {(test_expect_success)} {(SQ <"blame -L X,+">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,+ file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,-">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,- file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X (non-numeric X)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -LX file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,Y (non-numeric Y)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,Y file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,+N (non-numeric N)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,+N file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L X,-N (non-numeric N)">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,-N file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"blame -L ,^/RE/">)} 
      {(SQ <"\n"> <"\ttest_must_fail $PROG -L1,^/99/ file\n">)}
    )
  ]
)