(command.CommandList
  children: [
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:TEST_NO_CREATE_REPO spids:[24])
          op: Equal
          rhs: {(NoThanks)}
          spids: [24]
        )
      ]
      spids: [24]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:RETRY_TIMEOUT spids:[34])
          op: Equal
          rhs: {(60)}
          spids: [34]
        )
      ]
      spids: [34]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4D_TIMEOUT spids:[44])
          op: Equal
          rhs: {(300)}
          spids: [44]
        )
      ]
      spids: [44]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.If
      arms: [
        (if_arm
          cond: [(command.Pipeline children:[(C {(test_have_prereq)} {(PYTHON)})] negated:T)]
          action: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:skip_all spids:[64])
                  op: Equal
                  rhs: {(SQ <'skipping git p4 tests; python not available'>)}
                  spids: [64]
                )
              ]
              spids: [64]
            )
            (C {(test_done)})
          ]
          spids: [16777215 61]
        )
      ]
      spids: [16777215 72]
    )
    (command.AndOr
      ops: [Op_DPipe]
      children: [
        (command.Subshell
          child: (command.AndOr ops:[Op_DAmp] children:[(C {(p4)} {(-h)}) (C {(p4d)} {(-h)})])
          redirects: [
            (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})
            (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)})
          ]
          spids: [74 86]
        )
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:skip_all spids:[99])
                  op: Equal
                  rhs: {(SQ <'skipping git p4 tests; no p4 or p4d'>)}
                  spids: [99]
                )
              ]
              spids: [99]
            )
            (C {(test_done)})
          ]
          spids: [96]
        )
      ]
    )
    (command.FuncDef
      name: native_path
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:path spids:[139])
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [139]
                    )
                  ]
                  spids: [139]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.AndOr
                          ops: [Op_DAmp]
                          children: [
                            (C {(test_have_prereq)} {(CYGWIN)})
                            (command.Pipeline
                              children: [(C {(p4)} {(-V)}) (C {(grep)} {(-q)} {(CYGWIN)})]
                              negated: T
                            )
                          ]
                        )
                      ]
                      action: [
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:path spids:[173])
                              op: Equal
                              rhs: 
                                {
                                  (word_part.CommandSubPart
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (C {(cygpath)} {(--windows)} {(DQ ($ VSub_Name '$path'))})
                                        ]
                                      )
                                    left_token: <Left_CommandSub '$('>
                                    spids: [174 182]
                                  )
                                }
                              spids: [173]
                            )
                          ]
                          spids: [173]
                        )
                      ]
                      spids: [16777215 170]
                    )
                  ]
                  else_action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:path spids:[188])
                          op: Equal
                          rhs: 
                            {
                              (word_part.CommandSubPart
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (C {(test-path-utils)} {(real_path)} {(DQ ($ VSub_Name '$path'))})
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [189 197]
                              )
                            }
                          spids: [188]
                        )
                      ]
                      spids: [188]
                    )
                  ]
                  spids: [185 200]
                )
                (C {(echo)} {(DQ ($ VSub_Name '$path'))})
              ]
            )
          ]
          spids: [136]
        )
      spids: [131 135]
    )
    (command.FuncDef
      name: time_in_seconds
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              child: 
                (command.AndOr
                  ops: [Op_DAmp]
                  children: [
                    (C {(cd)} {(/)})
                    (C {(DQ ($ VSub_Name '$PYTHON_PATH'))} {(-c)} 
                      {(SQ <'import time; print(int(time.time()))'>)}
                    )
                  ]
                )
              spids: [237 253]
            )
          ]
          spids: [234]
        )
      spids: [229 233]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:testid spids:[273])
          op: Equal
          rhs: 
            {
              (word_part.BracedVarSub
                token: <VSub_Name this_test>
                suffix_op: (suffix_op.StringUnary op_id:VOp1_Pound arg_word:{(t)})
                spids: [274 278]
              )
            }
          spids: [273]
        )
      ]
      spids: [273]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:git_p4_test_start spids:[280])
          op: Equal
          rhs: {(9800)}
          spids: [280]
        )
      ]
      spids: [280]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4DPORT spids:[283])
          op: Equal
          rhs: 
            {
              (word_part.ArithSubPart
                anode: 
                  (arith_expr.ArithBinary
                    op_id: Arith_Plus
                    left: (arith_expr.ArithWord w:{(Lit_Digits 10669)})
                    right: 
                      (arith_expr.ArithBinary
                        op_id: Arith_Minus
                        left: (arith_expr.ArithWord w:{($ VSub_Name '$testid')})
                        right: (arith_expr.ArithWord w:{($ VSub_Name '$git_p4_test_start')})
                      )
                  )
                spids: [284 297]
              )
            }
          spids: [283]
        )
      ]
      spids: [283]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4PORT spids:[300])
          op: Equal
          rhs: {(localhost) (Lit_Other ':') ($ VSub_Name '$P4DPORT')}
          spids: [300]
        )
      ]
      spids: [300]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4CLIENT spids:[305])
          op: Equal
          rhs: {(client)}
          spids: [305]
        )
      ]
      spids: [305]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4USER spids:[308])
          op: Equal
          rhs: {(author)}
          spids: [308]
        )
      ]
      spids: [308]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:P4EDITOR spids:[311])
          op: Equal
          rhs: {(true)}
          spids: [311]
        )
      ]
      spids: [311]
    )
    (C {(unset)} {(P4CHARSET)})
    (C {(export)} {(P4PORT)} {(P4CLIENT)} {(P4USER)} {(P4EDITOR)} {(P4CHARSET)})
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:db spids:[331])
          op: Equal
          rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/db))}
          spids: [331]
        )
      ]
      spids: [331]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:cli spids:[337])
          op: Equal
          rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/cli))}
          spids: [337]
        )
      ]
      spids: [337]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:git spids:[343])
          op: Equal
          rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/git))}
          spids: [343]
        )
      ]
      spids: [343]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:pidfile spids:[349])
          op: Equal
          rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/p4d.pid))}
          spids: [349]
        )
      ]
      spids: [349]
    )
    (command.FuncDef
      name: cleanup
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [(C {(test)} {(-f)} {(DQ ($ VSub_Name '$pidfile'))})]
                  action: [
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [
                        (command.SimpleCommand
                          words: [
                            {(kill)}
                            {(-9)}
                            {
                              (word_part.CommandSubPart
                                command_list: 
                                  (command.CommandList
                                    children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [385 391]
                              )
                            }
                          ]
                          redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
                        )
                        (command.ControlFlow
                          token: <ControlFlow_Exit exit>
                          arg_word: {(255)}
                        )
                      ]
                    )
                  ]
                  spids: [16777215 378]
                )
              ]
              spids: [16777215 403]
            )
          ]
          spids: [364]
        )
      spids: [359 363]
    )
    (C {(trap)} {(cleanup)} {(EXIT)})
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:TMPDIR spids:[423])
          op: Equal
          rhs: {(DQ ($ VSub_Name '$TRASH_DIRECTORY'))}
          spids: [423]
        )
      ]
      spids: [423]
    )
    (C {(export)} {(TMPDIR)})
    (command.FuncDef
      name: start_p4d
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Op_DAmp Op_DAmp Op_DAmp]
              children: [
                (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$db'))} {(DQ ($ VSub_Name '$cli'))} 
                  {(DQ ($ VSub_Name '$git'))}
                )
                (C {(rm)} {(-f)} {(DQ ($ VSub_Name '$pidfile'))})
                (command.Subshell
                  child: 
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [
                        (C {(cd)} {(DQ ($ VSub_Name '$db'))})
                        (command.BraceGroup
                          children: [
                            (command.Sentence
                              child: 
                                (C {(p4d)} {(-q)} {(-p)} {($ VSub_Name '$P4DPORT')} {(DQ ($ VSub_At '$@'))})
                              terminator: <Op_Amp '&'>
                            )
                            (command.SimpleCommand
                              words: [{(echo)} {($ VSub_Bang '$!')}]
                              redirects: [
                                (redir.Redir
                                  op: <Redir_Great '>'>
                                  fd: 16777215
                                  arg_word: {(DQ ($ VSub_Name '$pidfile'))}
                                )
                              ]
                            )
                          ]
                          spids: [483]
                        )
                      ]
                    )
                  spids: [471 514]
                )
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:i spids:[540])
                      op: Equal
                      rhs: 
                        {
                          (word_part.BracedVarSub
                            token: <VSub_Name P4D_START_PATIENCE>
                            suffix_op: (suffix_op.StringUnary op_id:VTest_ColonHyphen arg_word:{(300)})
                            spids: [541 545]
                          )
                        }
                      spids: [540]
                    )
                  ]
                  spids: [540]
                )
              ]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:pid spids:[548])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [549 555]
                      )
                    }
                  spids: [548]
                )
              ]
              spids: [548]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:timeout spids:[559])
                  op: Equal
                  rhs: 
                    {
                      (word_part.ArithSubPart
                        anode: 
                          (arith_expr.ArithBinary
                            op_id: Arith_Plus
                            left: 
                              (arith_expr.ArithWord
                                w: 
                                  {
                                    (word_part.CommandSubPart
                                      command_list: 
                                        (command.CommandList
                                          children: [(C {(time_in_seconds)})]
                                        )
                                      left_token: <Left_CommandSub '$('>
                                      spids: [561 563]
                                    )
                                  }
                              )
                            right: (arith_expr.ArithWord w:{($ VSub_Name '$P4D_TIMEOUT')})
                          )
                        spids: [560 569]
                      )
                    }
                  spids: [559]
                )
              ]
              spids: [559]
            )
            (command.Sentence
              child: 
                (command.WhileUntil
                  keyword: <KW_While while>
                  cond: [(C {(true)})]
                  body: 
                    (command.DoGroup
                      children: [
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (C {(test)} 
                                  {
                                    (word_part.CommandSubPart
                                      command_list: 
                                        (command.CommandList
                                          children: [(C {(time_in_seconds)})]
                                        )
                                      left_token: <Left_CommandSub '$('>
                                      spids: [584 586]
                                    )
                                  } {(-gt)} {($ VSub_Name '$timeout')}
                                )
                              ]
                              action: [
                                (C {(kill)} {(-9)} {($ VSub_Name '$pid')})
                                (command.ControlFlow
                                  token: <ControlFlow_Exit exit>
                                  arg_word: {(1)}
                                )
                              ]
                              spids: [16777215 593]
                            )
                          ]
                          spids: [16777215 608]
                        )
                        (C {(sleep)} {(1)})
                      ]
                      spids: [577 616]
                    )
                )
              terminator: <Op_Amp '&'>
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:watchdog_pid spids:[621])
                  op: Equal
                  rhs: {($ VSub_Bang '$!')}
                  spids: [621]
                )
              ]
              spids: [621]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:ready spids:[626])
                  op: Equal
                  rhs: (word.EmptyWord)
                  spids: [626]
                )
              ]
              spids: [626]
            )
            (command.WhileUntil
              keyword: <KW_While while>
              cond: [(C {(test)} {($ VSub_Name '$i')} {(-gt)} {(0)})]
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.SimpleCommand
                              words: [{(p4)} {(info)}]
                              redirects: [
                                (redir.Redir
                                  op: <Redir_Great '>'>
                                  fd: 16777215
                                  arg_word: {(/dev/null)}
                                )
                                (redir.Redir
                                  op: <Redir_GreatAnd '2>&'>
                                  fd: 2
                                  arg_word: {(1)}
                                )
                              ]
                            )
                          ]
                          action: [
                            (command.Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (lhs_expr.LhsName name:ready spids:[663])
                                  op: Equal
                                  rhs: {(true)}
                                  spids: [663]
                                )
                              ]
                              spids: [663]
                            )
                            (command.ControlFlow
                              token: <ControlFlow_Break break>
                            )
                          ]
                          spids: [16777215 660]
                        )
                      ]
                      spids: [16777215 670]
                    )
                    (command.AndOr
                      ops: [Op_DPipe]
                      children: [
                        (command.SimpleCommand
                          words: [{(kill)} {(-0)} {($ VSub_Name '$pid')}]
                          redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
                        )
                        (command.ControlFlow token:<ControlFlow_Break break>)
                      ]
                    )
                    (C {(echo)} {(waiting)} {(KW_For for)} {(p4d)} {(to)} {(start)})
                    (C {(sleep)} {(1)})
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:i spids:[709])
                          op: Equal
                          rhs: 
                            {
                              (word_part.ArithSubPart
                                anode: 
                                  (arith_expr.ArithBinary
                                    op_id: Arith_Minus
                                    left: (arith_expr.ArithWord w:{($ VSub_Name '$i')})
                                    right: (arith_expr.ArithWord w:{(Lit_Digits 1)})
                                  )
                                spids: [710 719]
                              )
                            }
                          spids: [709]
                        )
                      ]
                      spids: [709]
                    )
                  ]
                  spids: [640 722]
                )
            )
            (command.If
              arms: [
                (if_arm
                  cond: [(C {(test)} {(-z)} {(DQ ($ VSub_Name '$ready'))})]
                  action: [(command.ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})]
                  spids: [16777215 737]
                )
              ]
              spids: [16777215 749]
            )
            (C {(p4_add_user)} {(author)})
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (C {(client_view)} {(DQ ('//depot/... //client/...'))})
                (command.ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})
              ]
            )
          ]
          spids: [438]
        )
      spids: [433 437]
    )
    (command.FuncDef
      name: p4_add_user
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:name spids:[792])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [792]
                    )
                  ]
                  spids: [792]
                )
                (command.SimpleCommand
                  words: [{(p4)} {(user)} {(-f)} {(-i)}]
                  redirects: [
                    (redir.HereDoc
                      op: <Redir_DLessDash '<<-'>
                      fd: 16777215
                      here_begin: {(EOF)}
                      here_end_span_id: 819
                      stdin_parts: [
                        ('User: ')
                        ($ VSub_Name '$name')
                        ('\n')
                        ('Email: ')
                        ($ VSub_Name '$name')
                        ('@example.com\n')
                        ('FullName: Dr. ')
                        ($ VSub_Name '$name')
                        ('\n')
                      ]
                    )
                  ]
                )
              ]
            )
          ]
          spids: [789]
        )
      spids: [784 788]
    )
    (command.FuncDef
      name: p4_add_job
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(p4)} {(job)} {(-f)} {(-i)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLessDash '<<-'>
                  fd: 16777215
                  here_begin: {(EOF)}
                  here_end_span_id: 849
                  stdin_parts: [
                    ('Job: ')
                    ($ VSub_Number '$1')
                    ('\n')
                    ('Status: open\n')
                    ('User: dummy\n')
                    ('Description:\n')
                  ]
                )
              ]
            )
          ]
          spids: [828]
        )
      spids: [823 827]
    )
    (command.FuncDef
      name: retry_until_success
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:timeout spids:[861])
                  op: Equal
                  rhs: 
                    {
                      (word_part.ArithSubPart
                        anode: 
                          (arith_expr.ArithBinary
                            op_id: Arith_Plus
                            left: 
                              (arith_expr.ArithWord
                                w: 
                                  {
                                    (word_part.CommandSubPart
                                      command_list: 
                                        (command.CommandList
                                          children: [(C {(time_in_seconds)})]
                                        )
                                      left_token: <Left_CommandSub '$('>
                                      spids: [863 865]
                                    )
                                  }
                              )
                            right: (arith_expr.ArithWord w:{($ VSub_Name '$RETRY_TIMEOUT')})
                          )
                        spids: [862 871]
                      )
                    }
                  spids: [861]
                )
              ]
              spids: [861]
            )
            (command.WhileUntil
              keyword: <KW_Until until>
              cond: [
                (command.AndOr
                  ops: [Op_DPipe]
                  children: [
                    (command.SimpleCommand
                      words: [{(DQ ($ VSub_At '$@'))}]
                      redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
                    )
                    (C {(test)} 
                      {
                        (word_part.CommandSubPart
                          command_list: (command.CommandList children:[(C {(time_in_seconds)})])
                          left_token: <Left_CommandSub '$('>
                          spids: [887 889]
                        )
                      } {(-gt)} {($ VSub_Name '$timeout')}
                    )
                  ]
                )
              ]
              body: (command.DoGroup children:[(C {(sleep)} {(1)})] spids:[896 904])
            )
          ]
          spids: [858]
        )
      spids: [853 857]
    )
    (command.FuncDef
      name: retry_until_fail
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:timeout spids:[917])
                  op: Equal
                  rhs: 
                    {
                      (word_part.ArithSubPart
                        anode: 
                          (arith_expr.ArithBinary
                            op_id: Arith_Plus
                            left: 
                              (arith_expr.ArithWord
                                w: 
                                  {
                                    (word_part.CommandSubPart
                                      command_list: 
                                        (command.CommandList
                                          children: [(C {(time_in_seconds)})]
                                        )
                                      left_token: <Left_CommandSub '$('>
                                      spids: [919 921]
                                    )
                                  }
                              )
                            right: (arith_expr.ArithWord w:{($ VSub_Name '$RETRY_TIMEOUT')})
                          )
                        spids: [918 927]
                      )
                    }
                  spids: [917]
                )
              ]
              spids: [917]
            )
            (command.WhileUntil
              keyword: <KW_Until until>
              cond: [
                (command.AndOr
                  ops: [Op_DPipe]
                  children: [
                    (command.Pipeline
                      children: [
                        (command.SimpleCommand
                          words: [{(DQ ($ VSub_At '$@'))}]
                          redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
                        )
                      ]
                      negated: T
                    )
                    (C {(test)} 
                      {
                        (word_part.CommandSubPart
                          command_list: (command.CommandList children:[(C {(time_in_seconds)})])
                          left_token: <Left_CommandSub '$('>
                          spids: [945 947]
                        )
                      } {(-gt)} {($ VSub_Name '$timeout')}
                    )
                  ]
                )
              ]
              body: (command.DoGroup children:[(C {(sleep)} {(1)})] spids:[954 962])
            )
          ]
          spids: [914]
        )
      spids: [909 913]
    )
    (command.FuncDef
      name: kill_p4d
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:pid spids:[975])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(cat)} {(DQ ($ VSub_Name '$pidfile'))})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [976 982]
                      )
                    }
                  spids: [975]
                )
              ]
              spids: [975]
            )
            (C {(retry_until_fail)} {(kill)} {($ VSub_Name '$pid')})
            (C {(retry_until_fail)} {(kill)} {(-9)} {($ VSub_Name '$pid')})
            (command.AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (command.SimpleCommand
                  words: [{(test_must_fail)} {(kill)} {($ VSub_Name '$pid')}]
                  redirects: [
                    (redir.Redir
                      op: <Redir_Great '>'>
                      fd: 16777215
                      arg_word: {(/dev/null)}
                    )
                    (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)})
                  ]
                )
                (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$db'))} {(DQ ($ VSub_Name '$cli'))} 
                  {(DQ ($ VSub_Name '$pidfile'))}
                )
                (C {(retry_until_fail)} {(kill)} {(-9)} {($ VSub_Name '$watchdog_pid')})
              ]
            )
          ]
          spids: [972]
        )
      spids: [967 971]
    )
    (command.FuncDef
      name: cleanup_git
      body: 
        (command.BraceGroup
          children: [
            (C {(retry_until_success)} {(rm)} {(-r)} {(DQ ($ VSub_Name '$git'))})
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (C {(test_must_fail)} {(test)} {(-d)} {(DQ ($ VSub_Name '$git'))})
                (C {(retry_until_success)} {(mkdir)} {(DQ ($ VSub_Name '$git'))})
              ]
            )
          ]
          spids: [1055]
        )
      spids: [1050 1054]
    )
    (command.FuncDef
      name: marshal_dump
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Op_DAmp Op_DAmp Op_DAmp]
              children: [
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:what spids:[1101])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [1101]
                    )
                  ]
                  spids: [1101]
                )
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:line spids:[1107])
                      op: Equal
                      rhs: 
                        {
                          (word_part.BracedVarSub
                            token: <VSub_Number 2>
                            suffix_op: (suffix_op.StringUnary op_id:VTest_ColonHyphen arg_word:{(1)})
                            spids: [1108 1112]
                          )
                        }
                      spids: [1107]
                    )
                  ]
                  spids: [1107]
                )
                (command.SimpleCommand
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: <Redir_Great '>'>
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/marshal-dump.py))}
                    )
                    (redir.HereDoc
                      op: <Redir_DLessDash '<<-'>
                      fd: 16777215
                      here_begin: {(EOF)}
                      here_end_span_id: 1141
                      stdin_parts: [
                        ('import marshal\n')
                        ('import sys\n')
                        ("instream = getattr(sys.stdin, 'buffer', sys.stdin)\n")
                        ('for i in range(')
                        ($ VSub_Name '$line')
                        ('):\n')
                        ('    d = marshal.load(instream)\n')
                        ("print(d[b'")
                        ($ VSub_Name '$what')
                        ("'].decode('utf-8'))\n")
                      ]
                    )
                  ]
                )
                (C {(DQ ($ VSub_Name '$PYTHON_PATH'))} 
                  {(DQ ($ VSub_Name '$TRASH_DIRECTORY') (/marshal-dump.py))}
                )
              ]
            )
          ]
          spids: [1098]
        )
      spids: [1093 1097]
    )
    (command.FuncDef
      name: client_view
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (command.Subshell
                  child: 
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [
                        (command.SimpleCommand
                          words: [{(cat)}]
                          redirects: [
                            (redir.HereDoc
                              op: <Redir_DLessDash '<<-'>
                              fd: 16777215
                              here_begin: {(EOF)}
                              here_end_span_id: 1203
                              stdin_parts: [
                                ('Client: ')
                                ($ VSub_Name '$P4CLIENT')
                                ('\n')
                                ('Description: ')
                                ($ VSub_Name '$P4CLIENT')
                                ('\n')
                                ('Root: ')
                                ($ VSub_Name '$cli')
                                ('\n')
                                ('AltRoots: ')
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(native_path)} {(DQ ($ VSub_Name '$cli'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [1192 1198]
                                )
                                ('\n')
                                ('LineEnd: unix\n')
                                ('View:\n')
                              ]
                            )
                          ]
                        )
                        (C {(printf)} {(DQ (Lit_Other '\\') ('t%s') (Lit_Other '\\') (n))} 
                          {(DQ ($ VSub_At '$@'))}
                        )
                      ]
                    )
                  spids: [1172 1219]
                )
                (C {(p4)} {(client)} {(-i)})
              ]
              negated: F
            )
          ]
          spids: [1169]
        )
      spids: [1164 1168]
    )
    (command.FuncDef
      name: is_cli_file_writeable
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:file spids:[1248])
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [1248]
                    )
                  ]
                  spids: [1248]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.AndOr
                          ops: [Op_DAmp]
                          children: [
                            (C {(test_have_prereq)} {(CYGWIN)})
                            (command.Pipeline
                              children: [(C {(p4)} {(-V)}) (C {(grep)} {(-q)} {(CYGWIN)})]
                              negated: F
                            )
                          ]
                        )
                      ]
                      action: [
                        (command.AndOr
                          ops: [Op_DAmp]
                          children: [
                            (command.Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (lhs_expr.LhsName name:stat spids:[1280])
                                  op: Equal
                                  rhs: 
                                    {
                                      (word_part.CommandSubPart
                                        command_list: 
                                          (command.CommandList
                                            children: [
                                              (C {(stat)} 
                                                {(--format) (Lit_Other '=') (Lit_Other '%') (a)} {(DQ ($ VSub_Name '$file'))}
                                              )
                                            ]
                                          )
                                        left_token: <Left_CommandSub '$('>
                                        spids: [1281 1292]
                                      )
                                    }
                                  spids: [1280]
                                )
                              ]
                              spids: [1280]
                            )
                            (C {(test)} {($ VSub_Name '$stat')} {(Lit_Other '=')} {(644)})
                          ]
                        )
                      ]
                      spids: [16777215 1277]
                    )
                  ]
                  else_action: [(C {(test)} {(-w)} {(DQ ($ VSub_Name '$file'))})]
                  spids: [1306 1318]
                )
              ]
            )
          ]
          spids: [1237]
        )
      spids: [1232 1236]
    )
  ]
)