(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PERL)
          op: assign_op.Equal
          rhs: {(SQ (Token id:Id.Lit_Chars val:'@@PERL@@' span_id:15))}
          spids: [13]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:OPTIONS_KEEPDASHDASH)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [18]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:OPTIONS_STUCKLONG)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [20]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:OPTIONS_SPEC)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ('git instaweb [options] (--start | --stop | --restart)\n') ('--\n') 
                ('l,local        only bind on 127.0.0.1\n') ('p,port=        the port to bind to\n') ('d,httpd=       the command to launch\n') 
                ('b,browser=     the browser to launch\n') ('m,module-path= the module path (only needed for apache2)\n') (' Action\n') 
                ('stop           stop the web server\n') ('start          start the web server\n') ('restart        restart the web server\n')
              )
            }
          spids: [22]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SUBDIRECTORY_OK)
          op: assign_op.Equal
          rhs: {(Yes)}
          spids: [39]
        )
      ]
    )
    (C {(.)} {(git-sh-setup)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fqgitdir)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$GIT_DIR'))}
          spids: [47]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:local)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:54)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(config)} {(--bool)} {(--get)} {(instaweb.local)})]
                    )
                )
              )
            }
          spids: [52]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:httpd)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:69)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(config)} {(--get)} {(instaweb.httpd)})]
                    )
                )
              )
            }
          spids: [67]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:root)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:82)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(config)} {(--get)} {(instaweb.gitwebdir)})]
                    )
                )
              )
            }
          spids: [80]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:port)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:94)
                command_list: 
                  (command.CommandList
                    children: [(C {(git)} {(config)} {(--get)} {(instaweb.port)})]
                  )
              )
            }
          spids: [93]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:module_path)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:106)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(config)} {(--get)} {(instaweb.modulepath)})]
                    )
                )
              )
            }
          spids: [104]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:action)
          op: assign_op.Equal
          rhs: {(DQ (browse))}
          spids: [117]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:conf)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/gitweb/httpd.conf))}
          spids: [123]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$httpd'))})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:httpd)
              op: assign_op.Equal
              rhs: {(SQ (Token id:Id.Lit_Chars val:'lighttpd -f' span_id:149))}
              spids: [147]
            )
          ]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$root'))})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:root)
              op: assign_op.Equal
              rhs: {(SQ (Token id:Id.Lit_Chars val:'@@GITWEBDIR@@' span_id:168))}
              spids: [166]
            )
          ]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$port'))})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:port)
              op: assign_op.Equal
              rhs: {(1234)}
              spids: [185]
            )
          ]
        )
      ]
    )
    (command.ShFunction
      name: resolve_full_httpd
      body: 
        (command.BraceGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$httpd'))}
              arms: [
                (case_arm
                  pat_list: [
                    {(Id.Lit_Star '*') (apache2) (Id.Lit_Star '*')}
                    {(Id.Lit_Star '*') (lighttpd) (Id.Lit_Star '*')}
                    {(Id.Lit_Star '*') (httpd) (Id.Lit_Star '*')}
                  ]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Pipeline
                              children: [
                                (C {(echo)} {(DQ ($ Id.VSub_DollarName '$httpd'))})
                                (command.Simple
                                  words: [
                                    {(sane_grep)}
                                    {(--)}
                                    {(SQ (Token id:Id.Lit_Chars val:'-f *$' span_id:245))}
                                  ]
                                  redirects: [
                                    (redir.Redir
                                      op: (Token id:Id.Redir_Great val:'>' span_id:248)
                                      fd: -1
                                      arg_word: {(/dev/null)}
                                    )
                                    (redir.Redir
                                      op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:251)
                                      fd: 2
                                      arg_word: {(1)}
                                    )
                                  ]
                                )
                              ]
                              negated: T
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:httpd)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName '$httpd') (' -f'))}
                                  spids: [258]
                                )
                              ]
                            )
                          ]
                          spids: [228 255]
                        )
                      ]
                    )
                  ]
                  spids: [206 217 268 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (plackup) (Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:full_httpd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb.psgi))}
                          spids: [281]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:httpd_only)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (braced_var_sub
                                  token: (Token id:Id.VSub_Name val:httpd span_id:291)
                                  suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{(' *')})
                                )
                              )
                            }
                          spids: [288]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:301)
                    )
                  ]
                  spids: [271 274 304 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (webrick) (Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:full_httpd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/webrick.rb))}
                          spids: [321]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:httpd_only)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (braced_var_sub
                                  token: (Token id:Id.VSub_Name val:httpd span_id:331)
                                  suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{(' *')})
                                )
                              )
                            }
                          spids: [328]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Return val:return span_id:341)
                    )
                  ]
                  spids: [307 310 344 -1]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:httpd_only)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:353)
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Pipeline
                                  children: [
                                    (C {(echo)} {($ Id.VSub_DollarName '$httpd')})
                                    (C {(cut)} {(-f1)} 
                                      {(-d) (SQ (Token id:Id.Lit_Chars val:' ' span_id:366))}
                                    )
                                  ]
                                  negated: F
                                )
                              ]
                            )
                        )
                      )
                    }
                  spids: [351]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$httpd_only'))}
                      arms: [
                        (case_arm
                          pat_list: [{(/) (Id.Lit_Star '*')}]
                          action: [(C {(Id.Lit_Other ':')})]
                          spids: [382 384 388 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.Simple
                              words: [{(which)} {($ Id.VSub_DollarName '$httpd_only')}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:397)
                                  fd: -1
                                  arg_word: {(/dev/null)}
                                )
                                (redir.Redir
                                  op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:400)
                                  fd: 2
                                  arg_word: {(1)}
                                )
                              ]
                            )
                          ]
                          spids: [390 391 402 -1]
                        )
                      ]
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:full_httpd)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$httpd')}
                          spids: [410]
                        )
                      ]
                    )
                  ]
                  spids: [372 407]
                )
              ]
              else_action: [
                (command.ForEach
                  iter_name: i
                  iter_words: [
                    {(/usr/local/sbin)}
                    {(/usr/sbin)}
                    {(DQ ($ Id.VSub_DollarName '$root'))}
                    {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb))}
                  ]
                  do_arg_iter: F
                  body: 
                    (command.DoGroup
                      children: [
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (C {(test)} {(-x)} 
                                  {
                                    (DQ ($ Id.VSub_DollarName '$i') (/) 
                                      ($ Id.VSub_DollarName '$httpd_only')
                                    )
                                  }
                                )
                              ]
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:full_httpd)
                                      op: assign_op.Equal
                                      rhs: 
                                        {($ Id.VSub_DollarName '$i') (/) 
                                          ($ Id.VSub_DollarName '$httpd')
                                        }
                                      spids: [472]
                                    )
                                  ]
                                )
                                (command.ControlFlow
                                  token: (Token id:Id.ControlFlow_Return val:return span_id:478)
                                )
                              ]
                              spids: [456 469]
                            )
                          ]
                        )
                      ]
                    )
                )
                (command.Simple
                  words: [
                    {(echo)}
                    {
                      (DQ ($ Id.VSub_DollarName '$httpd_only') (' not found. Install ') 
                        ($ Id.VSub_DollarName '$httpd_only') (' or use')
                      )
                    }
                    {(DQ ('--httpd to specify another httpd daemon.'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:490)
                      fd: -1
                      arg_word: {(2)}
                    )
                  ]
                )
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Exit val:exit span_id:507)
                  arg_word: {(1)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: start_httpd
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/pid))})
                      terminator: (Token id:Id.Op_Semi val:';' span_id:535)
                    )
                  ]
                  action: [
                    (C {(say)} {(DQ ('Instance already running. Restarting...'))})
                    (C {(stop_httpd)})
                  ]
                  spids: [525 537]
                )
              ]
            )
            (C {(resolve_full_httpd)})
            (C {(mkdir)} {(-p)} 
              {
                (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd_only'))
              }
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:conf)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) 
                        ($ Id.VSub_DollarName '$httpd_only') (.conf)
                      )
                    }
                  spids: [572]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$conf'))})
                (C {(configure_httpd)})
              ]
            )
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb_config.perl))})
                (C {(gitweb_conf)})
              ]
            )
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$httpd'))}
              arms: [
                (case_arm
                  pat_list: [
                    {(Id.Lit_Star '*') (mongoose) (Id.Lit_Star '*')}
                    {(Id.Lit_Star '*') (plackup) (Id.Lit_Star '*')}
                  ]
                  action: [
                    (command.Sentence
                      child: 
                        (C {($ Id.VSub_DollarName '$full_httpd')} {(DQ ($ Id.VSub_DollarName '$conf'))})
                      terminator: (Token id:Id.Op_Amp val:'&' span_id:647)
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:pid)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Bang '$!')}
                          spids: [654]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(test)} {($ Id.VSub_QMark '$?')} 
                                  {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(0)}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:669)
                            )
                          ]
                          action: [
                            (C {(echo)} 
                              {
                                (DQ ('Could not execute http daemon ') ($ Id.VSub_DollarName '$httpd') 
                                  (.)
                                )
                              }
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Exit val:exit span_id:683)
                              arg_word: {(1)}
                            )
                          ]
                          spids: [659 671]
                        )
                      ]
                    )
                    (command.Simple
                      words: [{(cat)}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:694)
                          fd: -1
                          arg_word: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/pid))}
                        )
                        (redir.HereDoc
                          op: (Token id:Id.Redir_DLess val:'<<' span_id:701)
                          fd: -1
                          here_begin: {(EOF)}
                          here_end_span_id: 707
                          stdin_parts: [($ Id.VSub_DollarName '$pid') ('\n')]
                        )
                      ]
                    )
                  ]
                  spids: [627 634 709 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (C {($ Id.VSub_DollarName '$full_httpd')} {(DQ ($ Id.VSub_DollarName '$conf'))})
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(test)} {($ Id.VSub_QMark '$?')} 
                                  {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(0)}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:733)
                            )
                          ]
                          action: [
                            (C {(echo)} 
                              {
                                (DQ ('Could not execute http daemon ') ($ Id.VSub_DollarName '$httpd') 
                                  (.)
                                )
                              }
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Exit val:exit span_id:747)
                              arg_word: {(1)}
                            )
                          ]
                          spids: [723 735]
                        )
                      ]
                    )
                  ]
                  spids: [712 713 755 -1]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: stop_httpd
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/pid))})
                (C {(kill)} 
                  {
                    (command_sub
                      left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:784)
                      command_list: 
                        (command.CommandList
                          children: [(C {(cat)} {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/pid))})]
                        )
                    )
                  }
                )
              ]
            )
            (C {(rm)} {(-f)} {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/pid))})
          ]
        )
    )
    (command.ShFunction
      name: httpd_is_ready
      body: 
        (command.BraceGroup
          children: [
            (C {(DQ ($ Id.VSub_DollarName '$PERL'))} 
              {(-MIO) (Id.Lit_Other ':') (Id.Lit_Other ':') (Socket) (Id.Lit_Other ':') 
                (Id.Lit_Other ':') (INET)
              } {(-e)} 
              {
                (DQ ('\n') ('local ') 
                  (word_part.EscapedLiteral
                    token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:831)
                  ) ('| = 1; # turn on autoflush\n') ("exit if (IO::Socket::INET->new('127.0.0.1:") 
                  ($ Id.VSub_DollarName '$port') ("'));\n") ("print 'Waiting for ") (Id.Lit_Other '\\') ("'") ($ Id.VSub_DollarName '$httpd') 
                  (Id.Lit_Other '\\') ("' to start ..';\n") ('do {\n') ("\tprint '.';\n") ('\tsleep(1);\n') 
                  ("} until (IO::Socket::INET->new('127.0.0.1:") ($ Id.VSub_DollarName '$port') ("'));\n") ('print qq! (done)') (Id.Lit_Other '\\') ('n!;\n')
                )
              }
            )
          ]
        )
    )
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:856)
      cond: [(C {(test)} {($ Id.VSub_Pound '$#')} {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(0)})]
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(--stop)} {(stop)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:action)
                          op: assign_op.Equal
                          rhs: {(DQ (stop))}
                          spids: [885]
                        )
                      ]
                    )
                  ]
                  spids: [879 882 891 -1]
                )
                (case_arm
                  pat_list: [{(--start)} {(start)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:action)
                          op: assign_op.Equal
                          rhs: {(DQ (start))}
                          spids: [900]
                        )
                      ]
                    )
                  ]
                  spids: [894 897 906 -1]
                )
                (case_arm
                  pat_list: [{(--restart)} {(restart)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:action)
                          op: assign_op.Equal
                          rhs: {(DQ (restart))}
                          spids: [915]
                        )
                      ]
                    )
                  ]
                  spids: [909 912 921 -1]
                )
                (case_arm
                  pat_list: [{(-l)} {(--local)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:local)
                          op: assign_op.Equal
                          rhs: {(true)}
                          spids: [930]
                        )
                      ]
                    )
                  ]
                  spids: [924 927 934 -1]
                )
                (case_arm
                  pat_list: [{(-d)} {(--httpd)}]
                  action: [
                    (C {(shift)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:httpd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$1'))}
                          spids: [946]
                        )
                      ]
                    )
                  ]
                  spids: [937 940 952 -1]
                )
                (case_arm
                  pat_list: [{(-b)} {(--browser)}]
                  action: [
                    (C {(shift)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:browser)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$1'))}
                          spids: [964]
                        )
                      ]
                    )
                  ]
                  spids: [955 958 970 -1]
                )
                (case_arm
                  pat_list: [{(-p)} {(--port)}]
                  action: [
                    (C {(shift)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:port)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$1'))}
                          spids: [982]
                        )
                      ]
                    )
                  ]
                  spids: [973 976 988 -1]
                )
                (case_arm
                  pat_list: [{(-m)} {(--module-path)}]
                  action: [
                    (C {(shift)})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:module_path)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number '$1'))}
                          spids: [1000]
                        )
                      ]
                    )
                  ]
                  spids: [991 994 1006 -1]
                )
                (case_arm pat_list:[{(--)}] spids:[1009 1010 1013 -1])
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [(C {(usage)})]
                  spids: [1016 1017 1023 -1]
                )
              ]
            )
            (C {(shift)})
          ]
        )
    )
    (C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$GIT_DIR') (/gitweb/tmp))})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_EXEC_PATH)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1045)
                  command_list: (command.CommandList children:[(C {(git)} {(--exec-path)})])
                )
              )
            }
          spids: [1043]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_DIR)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$fqgitdir'))}
          spids: [1052]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GITWEB_CONFIG)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb_config.perl))}
          spids: [1057]
        )
      ]
    )
    (C {(export)} {(GIT_EXEC_PATH)} {(GIT_DIR)} {(GITWEB_CONFIG)})
    (command.ShFunction
      name: webrick_conf
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:wrapper)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd') 
                        (/wrapper.sh)
                      )
                    }
                  spids: [1092]
                )
              ]
            )
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1103)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$wrapper'))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1109)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1128
                  stdin_parts: [
                    ('#!@SHELL_PATH@\n')
                    ('# we use this shell script wrapper around the real gitweb.cgi since\n')
                    ('# there appears to be no other way to pass arbitrary environment variables\n')
                    ('# into the CGI process\n')
                    ('GIT_EXEC_PATH=')
                    ($ Id.VSub_DollarName '$GIT_EXEC_PATH')
                    (' GIT_DIR=')
                    ($ Id.VSub_DollarName '$GIT_DIR')
                    (' GITWEB_CONFIG=')
                    ($ Id.VSub_DollarName '$GITWEB_CONFIG')
                    ('\n')
                    ('export GIT_EXEC_PATH GIT_DIR GITWEB_CONFIG\n')
                    ('exec ')
                    ($ Id.VSub_DollarName '$root')
                    ('/gitweb.cgi\n')
                  ]
                )
              ]
            )
            (C {(chmod)} {(Id.Lit_Other '+') (x)} {(DQ ($ Id.VSub_DollarName '$wrapper'))})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1155)
                  fd: -1
                  arg_word: 
                    {
                      (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd') 
                        (.rb)
                      )
                    }
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1163)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1226
                  stdin_parts: [
                    ('#!/usr/bin/env ruby\n')
                    ("require 'webrick'\n")
                    ("require 'logger'\n")
                    ('options = {\n')
                    ('  :Port => ')
                    ($ Id.VSub_DollarName '$port')
                    (',\n')
                    ('  :DocumentRoot => ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ("  :Logger => Logger.new('")
                    ($ Id.VSub_DollarName '$fqgitdir')
                    ("/gitweb/error.log'),\n")
                    ('  :AccessLog => [\n')
                    ("    [ Logger.new('")
                    ($ Id.VSub_DollarName '$fqgitdir')
                    ("/gitweb/access.log'),\n")
                    ('      WEBrick::AccessLog::COMBINED_LOG_FORMAT ]\n')
                    ('  ],\n')
                    ('  :DirectoryIndex => [')
                    (Id.Right_DoubleQuote '"')
                    (gitweb.cgi)
                    (Id.Right_DoubleQuote '"')
                    ('],\n')
                    ('  :CGIInterpreter => ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$wrapper')
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  :StartCallback => lambda do\n')
                    ('    File.open(')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/pid)
                    (Id.Right_DoubleQuote '"')
                    (', ')
                    (Id.Right_DoubleQuote '"')
                    (w)
                    (Id.Right_DoubleQuote '"')
                    (') { |f| f.puts Process.pid }\n')
                    ('  end,\n')
                    ('  :ServerType => WEBrick::Daemon,\n')
                    ('}\n')
                    ("options[:BindAddress] = '127.0.0.1' if ")
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$local')
                    (Id.Right_DoubleQuote '"')
                    (' == ')
                    (Id.Right_DoubleQuote '"')
                    (true)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('server = WEBrick::HTTPServer.new(options)\n')
                    ("['INT', 'TERM'].each do |signal|\n")
                    ('  trap(signal) {server.shutdown}\n')
                    ('end\n')
                    ('server.start\n')
                  ]
                )
              ]
            )
            (C {(chmod)} {(Id.Lit_Other '+') (x)} 
              {
                (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd') (.rb))
              }
            )
            (C {(rm)} {(-f)} {(DQ ($ Id.VSub_DollarName '$conf'))})
          ]
        )
    )
    (command.ShFunction
      name: lighttpd_conf
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1266)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1272)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1821
                  stdin_parts: [
                    ('server.document-root = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('server.port = ')
                    ($ Id.VSub_DollarName '$port')
                    ('\n')
                    ('server.modules = ( ')
                    (Id.Right_DoubleQuote '"')
                    (mod_setenv)
                    (Id.Right_DoubleQuote '"')
                    (', ')
                    (Id.Right_DoubleQuote '"')
                    (mod_cgi)
                    (Id.Right_DoubleQuote '"')
                    (' )\n')
                    ('server.indexfiles = ( ')
                    (Id.Right_DoubleQuote '"')
                    (gitweb.cgi)
                    (Id.Right_DoubleQuote '"')
                    (' )\n')
                    ('server.pid-file = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/pid)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('server.errorlog = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    (/error.log)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('\n')
                    ('# to enable, add ')
                    (Id.Right_DoubleQuote '"')
                    (mod_access)
                    (Id.Right_DoubleQuote '"')
                    (', ')
                    (Id.Right_DoubleQuote '"')
                    (mod_accesslog)
                    (Id.Right_DoubleQuote '"')
                    (' to server.modules\n')
                    ('# variable above and uncomment this\n')
                    ('#accesslog.filename = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    (/access.log)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('\n')
                    ('setenv.add-environment = ( ')
                    (Id.Right_DoubleQuote '"')
                    (PATH)
                    (Id.Right_DoubleQuote '"')
                    (' => env.PATH, ')
                    (Id.Right_DoubleQuote '"')
                    (GITWEB_CONFIG)
                    (Id.Right_DoubleQuote '"')
                    (' => env.GITWEB_CONFIG )\n')
                    ('\n')
                    ('cgi.assign = ( ')
                    (Id.Right_DoubleQuote '"')
                    (.cgi)
                    (Id.Right_DoubleQuote '"')
                    (' => ')
                    (Id.Right_DoubleQuote '"')
                    (Id.Right_DoubleQuote '"')
                    (' )\n')
                    ('\n')
                    ('# mimetype mapping\n')
                    ('mimetype.assign             = (\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.pdf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/pdf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.sig)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/pgp-signature)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.spl)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/futuresplash)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.class)
                    (Id.Right_DoubleQuote '"')
                    ('        =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/octet-stream)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.ps)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/postscript)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.torrent)
                    (Id.Right_DoubleQuote '"')
                    ('      =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bittorrent)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.dvi)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-dvi)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.gz)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-gzip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.pac)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-ns-proxy-autoconfig)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.swf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-shockwave-flash)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.tar.gz)
                    (Id.Right_DoubleQuote '"')
                    ('       =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tgz)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.tgz)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tgz)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.tar)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.zip)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/zip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.mp3)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.m3u)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-mpegurl)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.wma)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-ms-wma)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.wax)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-ms-wax)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.ogg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/ogg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.wav)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-wav)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.gif)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/gif)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.jpg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/jpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.jpeg)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/jpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.png)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/png)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.xbm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xbitmap)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.xpm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xpixmap)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.xwd)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xwindowdump)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.css)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/css)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.html)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/html)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.htm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/html)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.js)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/javascript)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.asc)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.c)
                    (Id.Right_DoubleQuote '"')
                    ('            =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.cpp)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.log)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.conf)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.text)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.txt)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.dtd)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/xml)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.xml)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/xml)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.mpeg)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.mpg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.mov)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/quicktime)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.qt)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/quicktime)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.avi)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-msvideo)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.asf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-asf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.asx)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-asf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.wmv)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-wmv)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.bz2)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.tbz)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip-compressed-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (.tar.bz2)
                    (Id.Right_DoubleQuote '"')
                    ('      =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip-compressed-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('  ')
                    (Id.Right_DoubleQuote '"')
                    (Id.Right_DoubleQuote '"')
                    ('              =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    (' )\n')
                  ]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test)} {(x) (DQ ($ Id.VSub_DollarName '$local'))} {(Id.Lit_Equals '=')} {(xtrue)})
                (command.Simple
                  words: [
                    {(echo)}
                    {(SQ (Token id:Id.Lit_Chars val:'server.bind = "127.0.0.1"' span_id:1839))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:1842)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: apache2_conf
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [(C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$module_path'))})]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(test)} {(-d)} {(DQ (/usr/lib/httpd/modules))})
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:module_path)
                              op: assign_op.Equal
                              rhs: {(DQ (/usr/lib/httpd/modules))}
                              spids: [1884]
                            )
                          ]
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(test)} {(-d)} {(DQ (/usr/lib/apache2/modules))})
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:module_path)
                              op: assign_op.Equal
                              rhs: {(DQ (/usr/lib/apache2/modules))}
                              spids: [1901]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [1859 1870]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:bind)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [1910]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test)} {(x) (DQ ($ Id.VSub_DollarName '$local'))} {(Id.Lit_Equals '=')} {(xtrue)})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:bind)
                      op: assign_op.Equal
                      rhs: {(SQ (Token id:Id.Lit_Chars val:'127.0.0.1:' span_id:1928))}
                      spids: [1926]
                    )
                  ]
                )
              ]
            )
            (command.Simple
              words: [{(echo)} {(SQ (Token id:Id.Lit_Chars val:'text/css css' span_id:1935))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1938)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/mime.types))}
                )
              ]
            )
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1948)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1954)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1999
                  stdin_parts: [
                    ('ServerName ')
                    (Id.Right_DoubleQuote '"')
                    (git-instaweb)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('ServerRoot ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('DocumentRoot ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('ErrorLog ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    (/error.log)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('CustomLog ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    (/access.log)
                    (Id.Right_DoubleQuote '"')
                    (' combined\n')
                    ('PidFile ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/pid)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('Listen ')
                    ($ Id.VSub_DollarName '$bind')
                    ($ Id.VSub_DollarName '$port')
                    ('\n')
                  ]
                )
              ]
            )
            (command.ForEach
              iter_name: mod
              iter_words: [{(mpm_event)} {(mpm_prefork)} {(mpm_worker)}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(-e)} 
                              {($ Id.VSub_DollarName '$module_path') (/mod_) (${ Id.VSub_Name mod) 
                                (.so)
                              }
                            )
                          ]
                          action: [
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('LoadModule ') (${ Id.VSub_Name mod) ('_module '))}
                                {
                                  (DQ ($ Id.VSub_DollarName '$module_path') (/mod_) 
                                    (${ Id.VSub_Name mod) (.so)
                                  )
                                }
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:2056)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                                )
                              ]
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Break val:break span_id:2067)
                            )
                          ]
                          spids: [2018 2032]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.ForEach
              iter_name: mod
              iter_words: [{(mime)} {(dir)} {(env)} {(log_config)} {(authz_core)}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(-e)} 
                              {($ Id.VSub_DollarName '$module_path') (/mod_) (${ Id.VSub_Name mod) 
                                (.so)
                              }
                            )
                          ]
                          action: [
                            (command.Simple
                              words: [
                                {(echo)}
                                {(DQ ('LoadModule ') (${ Id.VSub_Name mod) ('_module '))}
                                {
                                  (DQ ($ Id.VSub_DollarName '$module_path') (/mod_) 
                                    (${ Id.VSub_Name mod) (.so)
                                  )
                                }
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:2134)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                                )
                              ]
                            )
                          ]
                          spids: [2096 2110]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:2149)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:2155)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 2166
                  stdin_parts: [
                    ('TypesConfig ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/mime.types)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('DirectoryIndex gitweb.cgi\n')
                  ]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$module_path') (/mod_perl.so))})
                        (command.Simple
                          words: [
                            {(sane_grep)}
                            {(SQ (Token id:Id.Lit_Chars val:MOD_PERL span_id:2194))}
                            {(DQ ($ Id.VSub_DollarName '$root') (/gitweb.cgi))}
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:2202)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                          ]
                        )
                      ]
                    )
                  ]
                  action: [
                    (command.Simple
                      words: [{(cat)}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_DGreat val:'>>' span_id:2215)
                          fd: -1
                          arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                        )
                        (redir.HereDoc
                          op: (Token id:Id.Redir_DLess val:'<<' span_id:2221)
                          fd: -1
                          here_begin: {(EOF)}
                          here_end_span_id: 2237
                          stdin_parts: [
                            ('LoadModule perl_module ')
                            ($ Id.VSub_DollarName '$module_path')
                            ('/mod_perl.so\n')
                            ('PerlPassEnv GIT_DIR\n')
                            ('PerlPassEnv GIT_EXEC_PATH\n')
                            ('PerlPassEnv GITWEB_CONFIG\n')
                            ('<Location /gitweb.cgi>\n')
                            ('\tSetHandler perl-script\n')
                            ('\tPerlResponseHandler ModPerl::Registry\n')
                            ('\tPerlOptions +ParseHeaders\n')
                            ('\tOptions +ExecCGI\n')
                            ('</Location>\n')
                          ]
                        )
                      ]
                    )
                  ]
                  spids: [2177 2206]
                )
              ]
              else_action: [
                (C {(resolve_full_httpd)})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:list_mods)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2250)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(DQ ($ Id.VSub_DollarName '$full_httpd'))})
                                      (C {(sed)} 
                                        {(SQ (Token id:Id.Lit_Chars val:'s/-f$/-l/' span_id:2262))}
                                      )
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [2249]
                    )
                  ]
                )
                (command.AndOr
                  ops: [Id.Op_DPipe]
                  children: [
                    (command.Pipeline
                      children: [
                        (C {($ Id.VSub_DollarName '$list_mods')})
                        (command.Simple
                          words: [
                            {(sane_grep)}
                            {(SQ (Token id:Id.Lit_Chars val:'mod_cgi\\.c' span_id:2274))}
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:2277)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:2280)
                              fd: 2
                              arg_word: {(1)}
                            )
                          ]
                        )
                      ]
                      negated: F
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(-f)} {(DQ ($ Id.VSub_DollarName '$module_path') (/mod_cgi.so))})
                          ]
                          action: [
                            (command.Simple
                              words: [
                                {(echo)}
                                {
                                  (DQ ('LoadModule cgi_module ') ($ Id.VSub_DollarName '$module_path') 
                                    (/mod_cgi.so)
                                  )
                                }
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_DGreat val:'>>' span_id:2310)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                                )
                              ]
                            )
                          ]
                          spids: [2287 2299]
                        )
                      ]
                      else_action: [
                        (command.AndOr
                          ops: [Id.Op_DPipe]
                          children: [
                            (command.Pipeline
                              children: [
                                (C {($ Id.VSub_DollarName '$list_mods')})
                                (command.Simple
                                  words: [
                                    {(grep)}
                                    {(SQ (Token id:Id.Lit_Chars val:'mod_cgid\\.c' span_id:2327))}
                                  ]
                                  redirects: [
                                    (redir.Redir
                                      op: (Token id:Id.Redir_Great val:'>' span_id:2330)
                                      fd: -1
                                      arg_word: {(/dev/null)}
                                    )
                                    (redir.Redir
                                      op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:2333)
                                      fd: 2
                                      arg_word: {(1)}
                                    )
                                  ]
                                )
                              ]
                              negated: F
                            )
                            (command.If
                              arms: [
                                (if_arm
                                  cond: [
                                    (C {(test)} {(-f)} 
                                      {(DQ ($ Id.VSub_DollarName '$module_path') (/mod_cgid.so))}
                                    )
                                  ]
                                  action: [
                                    (command.Simple
                                      words: [
                                        {(echo)}
                                        {
                                          (DQ ('LoadModule cgid_module ') 
                                            ($ Id.VSub_DollarName '$module_path') (/mod_cgid.so)
                                          )
                                        }
                                      ]
                                      redirects: [
                                        (redir.Redir
                                          op: (Token id:Id.Redir_DGreat val:'>>' span_id:2365)
                                          fd: -1
                                          arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [2340 2352]
                                )
                              ]
                              else_action: [
                                (C {(echo)} {(DQ ('You have no CGI support!'))})
                                (command.ControlFlow
                                  token: (Token id:Id.ControlFlow_Exit val:exit span_id:2382)
                                  arg_word: {(2)}
                                )
                              ]
                            )
                          ]
                        )
                        (command.Simple
                          words: [{(echo)} {(DQ ('ScriptSock logs/gitweb.sock'))}]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_DGreat val:'>>' span_id:2396)
                              fd: -1
                              arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                            )
                          ]
                        )
                      ]
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:2408)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLess val:'<<' span_id:2414)
                      fd: -1
                      here_begin: {(EOF)}
                      here_end_span_id: 2425
                      stdin_parts: [
                        ('PassEnv GIT_DIR\n')
                        ('PassEnv GIT_EXEC_PATH\n')
                        ('PassEnv GITWEB_CONFIG\n')
                        ('AddHandler cgi-script .cgi\n')
                        ('<Location /gitweb.cgi>\n')
                        ('\tOptions +ExecCGI\n')
                        ('</Location>\n')
                      ]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: mongoose_conf
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2441)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$conf'))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:2447)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 2494
                  stdin_parts: [
                    ('# Mongoose web server configuration file.\n')
                    ("# Lines starting with '#' and empty lines are ignored.\n")
                    ('# For detailed description of every option, visit\n')
                    ('# http://code.google.com/p/mongoose/wiki/MongooseManual\n')
                    ('\n')
                    ('root\t\t')
                    ($ Id.VSub_DollarName '$root')
                    ('\n')
                    ('ports\t\t')
                    ($ Id.VSub_DollarName '$port')
                    ('\n')
                    ('index_files\tgitweb.cgi\n')
                    ('#ssl_cert\t')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    ('/gitweb/ssl_cert.pem\n')
                    ('error_log\t')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    ('/error.log\n')
                    ('access_log\t')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    ('/access.log\n')
                    ('\n')
                    ('#cgi setup\n')
                    ('cgi_env\t\tPATH=')
                    ($ Id.VSub_DollarName '$PATH')
                    (',GIT_DIR=')
                    ($ Id.VSub_DollarName '$GIT_DIR')
                    (',GIT_EXEC_PATH=')
                    ($ Id.VSub_DollarName '$GIT_EXEC_PATH')
                    (',GITWEB_CONFIG=')
                    ($ Id.VSub_DollarName '$GITWEB_CONFIG')
                    ('\n')
                    ('cgi_interp\t')
                    ($ Id.VSub_DollarName '$PERL')
                    ('\n')
                    ('cgi_ext\t\tcgi,pl\n')
                    ('\n')
                    ('# mimetype mapping\n')
                    (
'mime_types\t.gz=application/x-gzip,.tar.gz=application/x-tgz,.tgz=application/x-tgz,.tar=application/x-tar,.zip=application/zip,.gif=image/gif,.jpg=image/jpeg,.jpeg=image/jpeg,.png=image/png,.css=text/css,.html=text/html,.htm=text/html,.js=text/javascript,.c=text/plain,.cpp=text/plain,.log=text/plain,.conf=text/plain,.text=text/plain,.txt=text/plain,.dtd=text/xml,.bz2=application/x-bzip,.tbz=application/x-bzip-compressed-tar,.tar.bz2=application/x-bzip-compressed-tar\n'
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: plackup_conf
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2516)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb.psgi))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:2523)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 3211
                  stdin_parts: [
                    ('#!')
                    ($ Id.VSub_DollarName '$PERL')
                    ('\n')
                    ('\n')
                    ('# gitweb - simple web interface to track changes in git repositories\n')
                    ('#          PSGI wrapper and server starter (see http://plackperl.org)\n')
                    ('\n')
                    ('use strict;\n')
                    ('\n')
                    ('use IO::Handle;\n')
                    ('use Plack::MIME;\n')
                    ('use Plack::Builder;\n')
                    ('use Plack::App::WrapCGI;\n')
                    (
'use CGI::Emulate::PSGI 0.07; # minimum version required to work with gitweb\n'
                    )
                    ('\n')
                    ('# mimetype mapping (from lighttpd_conf)\n')
                    ('Plack::MIME->add_type(\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.pdf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/pdf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.sig)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/pgp-signature)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.spl)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/futuresplash)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.class)
                    (Id.Right_DoubleQuote '"')
                    ('        =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/octet-stream)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.ps)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/postscript)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.torrent)
                    (Id.Right_DoubleQuote '"')
                    ('      =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bittorrent)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.dvi)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-dvi)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.gz)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-gzip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.pac)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-ns-proxy-autoconfig)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.swf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-shockwave-flash)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.tar.gz)
                    (Id.Right_DoubleQuote '"')
                    ('       =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tgz)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.tgz)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tgz)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.tar)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.zip)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/zip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.mp3)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.m3u)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-mpegurl)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.wma)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-ms-wma)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.wax)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-ms-wax)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.ogg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/ogg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.wav)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (audio/x-wav)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.gif)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/gif)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.jpg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/jpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.jpeg)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/jpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.png)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/png)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.xbm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xbitmap)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.xpm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xpixmap)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.xwd)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (image/x-xwindowdump)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.css)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/css)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.html)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/html)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.htm)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/html)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.js)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/javascript)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.asc)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.c)
                    (Id.Right_DoubleQuote '"')
                    ('            =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.cpp)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.log)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.conf)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.text)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.txt)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.dtd)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/xml)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.xml)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/xml)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.mpeg)
                    (Id.Right_DoubleQuote '"')
                    ('         =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.mpg)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/mpeg)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.mov)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/quicktime)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.qt)
                    (Id.Right_DoubleQuote '"')
                    ('           =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/quicktime)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.avi)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-msvideo)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.asf)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-asf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.asx)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-asf)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.wmv)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (video/x-ms-wmv)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.bz2)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.tbz)
                    (Id.Right_DoubleQuote '"')
                    ('          =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip-compressed-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (.tar.bz2)
                    (Id.Right_DoubleQuote '"')
                    ('      =>      ')
                    (Id.Right_DoubleQuote '"')
                    (application/x-bzip-compressed-tar)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t')
                    (Id.Right_DoubleQuote '"')
                    (Id.Right_DoubleQuote '"')
                    ('              =>      ')
                    (Id.Right_DoubleQuote '"')
                    (text/plain)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    (');\n')
                    ('\n')
                    ('my ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3013)
                    )
                    ('app = builder {\n')
                    ('\t# to be able to override ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3016)
                    )
                    ('SIG{__WARN__} to log build time warnings\n')
                    ('\tuse CGI::Carp; # it sets ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3019)
                    )
                    ('SIG{__WARN__} itself\n')
                    ('\n')
                    ('\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3023)
                    )
                    ('logdir = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/)
                    ($ Id.VSub_DollarName '$httpd_only')
                    (Id.Right_DoubleQuote '"')
                    (';\n')
                    ('\topen my ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3032)
                    )
                    ("access_log_fh, '>>', ")
                    (Id.Right_DoubleQuote '"')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3035)
                    )
                    (logdir/access.log)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('\t\tor die ')
                    (Id.Right_DoubleQuote '"')
                    ("Couldn't open access log '")
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3042)
                    )
                    ("logdir/access.log': ")
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3044)
                    )
                    ('!')
                    (Id.Right_DoubleQuote '"')
                    (';\n')
                    ('\topen my ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3049)
                    )
                    ("error_log_fh,  '>>', ")
                    (Id.Right_DoubleQuote '"')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3052)
                    )
                    (logdir/error.log)
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('\t\tor die ')
                    (Id.Right_DoubleQuote '"')
                    ("Couldn't open error log '")
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3059)
                    )
                    ("logdir/error.log': ")
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3061)
                    )
                    ('!')
                    (Id.Right_DoubleQuote '"')
                    (';\n')
                    ('\n')
                    ('\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3067)
                    )
                    ('access_log_fh->autoflush(1);\n')
                    ('\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3070)
                    )
                    ('error_log_fh->autoflush(1);\n')
                    ('\n')
                    ('\t# redirect build time warnings to error.log\n')
                    ('\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3075)
                    )
                    ("SIG{'__WARN__'} = sub {\n")
                    ('\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3078)
                    )
                    ('msg = shift;\n')
                    ('\t\t# timestamp warning like in CGI::Carp::warn\n')
                    ('\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3082)
                    )
                    ('stamp = CGI::Carp::stamp();\n')
                    ('\t\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3085)
                    )
                    ('msg =~ s/^/')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3087)
                    )
                    ('stamp/gm;\n')
                    ('\t\tprint ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3090)
                    )
                    ('error_log_fh ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3092)
                    )
                    ('msg;\n')
                    ('\t};\n')
                    ('\n')
                    ('\t# write errors to error.log, access to access.log\n')
                    ("\tenable 'AccessLog',\n")
                    ('\t\tformat => ')
                    (Id.Right_DoubleQuote '"')
                    (combined)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ('\t\tlogger => sub { print ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3104)
                    )
                    ('access_log_fh @_; };\n')
                    ('\tenable sub {\n')
                    ('\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3108)
                    )
                    ('app = shift;\n')
                    ('\t\tsub {\n')
                    ('\t\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3112)
                    )
                    ('env = shift;\n')
                    ('\t\t\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3115)
                    )
                    ("env->{'psgi.errors'} = ")
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3117)
                    )
                    ('error_log_fh;\n')
                    ('\t\t\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3120)
                    )
                    ('app->(')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3122)
                    )
                    ('env);\n')
                    ('\t\t}\n')
                    ('\t};\n')
                    ("\t# gitweb currently doesn't work with ")
                    ($ Id.VSub_DollarName '$SIG')
                    ("{CHLD} set to 'IGNORE',\n")
                    ("\t# because it uses 'close ")
                    ($ Id.VSub_DollarName '$fd')
                    (" or die...' on piped filehandle ")
                    ($ Id.VSub_DollarName '$fh')
                    ('\n')
                    ('\t# (which causes the parent process to wait for child to finish).\n')
                    ('\tenable_if { ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3136)
                    )
                    ("SIG{'CHLD'} eq 'IGNORE' } sub {\n")
                    ('\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3139)
                    )
                    ('app = shift;\n')
                    ('\t\tsub {\n')
                    ('\t\t\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3143)
                    )
                    ('env = shift;\n')
                    ('\t\t\tlocal ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3146)
                    )
                    ("SIG{'CHLD'} = 'DEFAULT';\n")
                    ('\t\t\tlocal ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3149)
                    )
                    ("SIG{'CLD'}  = 'DEFAULT';\n")
                    ('\t\t\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3152)
                    )
                    ('app->(')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3154)
                    )
                    ('env);\n')
                    ('\t\t}\n')
                    ('\t};\n')
                    ('\t# serve static files, i.e. stylesheet, images, script\n')
                    ("\tenable 'Static',\n")
                    ('\t\tpath => sub { m!')
                    (Id.Lit_Other '\\')
                    ('.(js|css|png)')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3163)
                    )
                    ('! && s!^/gitweb/!! },\n')
                    ('\t\troot => ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (/)
                    (Id.Right_DoubleQuote '"')
                    (',\n')
                    ("\t\tencoding => 'utf-8'; # encoding for 'text/plain' files\n")
                    ('\t# convert CGI application to PSGI app\n')
                    ('\tPlack::App::WrapCGI->new(script => ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$root')
                    (/gitweb.cgi)
                    (Id.Right_DoubleQuote '"')
                    (')->to_app;\n')
                    ('};\n')
                    ('\n')
                    ('# make it runnable as standalone app,\n')
                    ("# like it would be run via 'plackup' utility\n")
                    ('if (caller) {\n')
                    ('\treturn ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3185)
                    )
                    ('app;\n')
                    ('} else {\n')
                    ('\trequire Plack::Runner;\n')
                    ('\n')
                    ('\tmy ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3191)
                    )
                    ('runner = Plack::Runner->new();\n')
                    ('\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3194)
                    )
                    ('runner->parse_options(qw(--env deployment --port ')
                    ($ Id.VSub_DollarName '$port')
                    ('),\n')
                    ('\t\t\t\t')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$local')
                    (Id.Right_DoubleQuote '"')
                    (' ? qw(--host 127.0.0.1) : ());\n')
                    ('\t')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3204)
                    )
                    ('runner->run(')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3206)
                    )
                    ('app);\n')
                    ('}\n')
                    ('__END__\n')
                  ]
                )
              ]
            )
            (C {(chmod)} {(a) (Id.Lit_Other '+') (x)} 
              {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb.psgi))}
            )
            (C {(rm)} {(-f)} {(DQ ($ Id.VSub_DollarName '$conf'))})
          ]
        )
    )
    (command.ShFunction
      name: gitweb_conf
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:3250)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/gitweb_config.perl))}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:3257)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 3291
                  stdin_parts: [
                    ('#!@@PERL@@\n')
                    ('our ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3262)
                    )
                    ('projectroot = ')
                    (Id.Right_DoubleQuote '"')
                    (command_sub
                      left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:3265)
                      command_list: 
                        (command.CommandList
                          children: [(C {(dirname)} {(DQ ($ Id.VSub_DollarName '$fqgitdir'))})]
                        )
                    )
                    (Id.Right_DoubleQuote '"')
                    (';\n')
                    ('our ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3275)
                    )
                    ('git_temp = ')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$fqgitdir')
                    (/gitweb/tmp)
                    (Id.Right_DoubleQuote '"')
                    (';\n')
                    ('our ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3283)
                    )
                    ('projects_list = ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3285)
                    )
                    ('projectroot;\n')
                    ('\n')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:3288)
                    )
                    ("feature{'remote_heads'}{'default'} = [1];\n")
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: configure_httpd
      body: 
        (command.BraceGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$httpd'))}
              arms: [
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (lighttpd) (Id.Lit_Star '*')}]
                  action: [(C {(lighttpd_conf)})]
                  spids: [3311 3314 3320 -1]
                )
                (case_arm
                  pat_list: [
                    {(Id.Lit_Star '*') (apache2) (Id.Lit_Star '*')}
                    {(Id.Lit_Star '*') (httpd) (Id.Lit_Star '*')}
                  ]
                  action: [(C {(apache2_conf)})]
                  spids: [3323 3330 3336 -1]
                )
                (case_arm
                  pat_list: [{(webrick)}]
                  action: [(C {(webrick_conf)})]
                  spids: [3339 3340 3346 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (mongoose) (Id.Lit_Star '*')}]
                  action: [(C {(mongoose_conf)})]
                  spids: [3349 3352 3358 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (plackup) (Id.Lit_Star '*')}]
                  action: [(C {(plackup_conf)})]
                  spids: [3361 3364 3370 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (C {(echo)} {(DQ ('Unknown httpd specified: ') ($ Id.VSub_DollarName '$httpd'))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:3385)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [3373 3374 3390 -1]
                )
              ]
            )
          ]
        )
    )
    (command.Case
      to_match: {(DQ ($ Id.VSub_DollarName '$action'))}
      arms: [
        (case_arm
          pat_list: [{(stop)}]
          action: [
            (C {(stop_httpd)})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:3413)
              arg_word: {(0)}
            )
          ]
          spids: [3406 3407 3418 -1]
        )
        (case_arm
          pat_list: [{(start)}]
          action: [
            (C {(start_httpd)})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:3427)
              arg_word: {(0)}
            )
          ]
          spids: [3420 3421 3432 -1]
        )
        (case_arm
          pat_list: [{(restart)}]
          action: [
            (C {(stop_httpd)})
            (C {(start_httpd)})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:3444)
              arg_word: {(0)}
            )
          ]
          spids: [3434 3435 3449 -1]
        )
      ]
    )
    (C {(gitweb_conf)})
    (C {(resolve_full_httpd)})
    (C {(mkdir)} {(-p)} 
      {(DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd_only'))}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:conf)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ($ Id.VSub_DollarName '$fqgitdir') (/gitweb/) ($ Id.VSub_DollarName '$httpd_only') 
                (.conf)
              )
            }
          spids: [3469]
        )
      ]
    )
    (C {(configure_httpd)})
    (C {(start_httpd)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:url)
          op: assign_op.Equal
          rhs: 
            {(http) (Id.Lit_Other ':') (//127.0.0.1) (Id.Lit_Other ':') ($ Id.VSub_DollarName '$port')}
          spids: [3483]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {(test)} {(-n)} {(DQ ($ Id.VSub_DollarName '$browser'))})
              terminator: (Token id:Id.Op_Semi val:';' span_id:3500)
            )
          ]
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (C {(httpd_is_ready)})
                (C {(git)} {(web--browse)} {(-b)} {(DQ ($ Id.VSub_DollarName '$browser'))} 
                  {($ Id.VSub_DollarName '$url')}
                )
                (C {(echo)} {($ Id.VSub_DollarName '$url')})
              ]
            )
          ]
          spids: [3491 3502]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DAmp Id.Op_DPipe]
          children: [
            (C {(httpd_is_ready)})
            (C {(git)} {(web--browse)} {(-c)} {(DQ (instaweb.browser))} {($ Id.VSub_DollarName '$url')})
            (C {(echo)} {($ Id.VSub_DollarName '$url')})
          ]
        )
      ]
    )
  ]
)