(CommandList
  children: [
    (FuncDef
      name: stderr
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(echo)} {(DQ ($ VSub_At '$@'))}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[16])]
            )
          ]
          spids: [7]
        )
      spids: [3 6]
    )
    (FuncDef
      name: putd
      body: 
        (BraceGroup
          children: [
            (C {(stderr)} 
              {
                (DQ ($ VSub_Number '$1') ('=<') 
                  (BracedVarSub
                    token: <VSub_Number 1>
                    prefix_op: VSub_Bang
                    spids: [34 37]
                  ) ('>')
                )
              }
            )
          ]
          spids: [26]
        )
      spids: [22 25]
    )
    (FuncDef
      name: exists
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(type)} {(DQ ($ VSub_At '$@'))}]
              redirects: [
                (Redir
                  op_id: Redir_Great
                  fd: 16777215
                  arg_word: {(/dev/null)}
                  spids: [57]
                )
                (Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[60])
              ]
            )
          ]
          spids: [48]
        )
      spids: [44 47]
    )
    (FuncDef
      name: test_grepq
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:output)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [
                                (Pipeline
                                  children: [(C {(echo)} {(x)}) (C {(grep)} {(-q)} {(x)})]
                                  negated: False
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [77 89]
                        )
                      )
                    }
                  spids: [75]
                )
              ]
              spids: [73]
            )
            (AndOr
              children: [
                (DBracket
                  expr: (BoolBinary op_id:BoolBinary_GlobDEqual left:{($ VSub_QMark '$?')} right:{(0)})
                )
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
              op_id: Op_DPipe
            )
            (AndOr
              children: [
                (DBracket
                  expr: (BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$output'))})
                )
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
              op_id: Op_DPipe
            )
            (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})
          ]
          spids: [70]
        )
      spids: [66 69]
    )
    (FuncDef
      name: test_greps
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:output)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [
                                (Pipeline
                                  children: [(C {(echo)} {(x)}) (C {(grep)} {(-s)} {(x)})]
                                  negated: False
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [145 157]
                        )
                      )
                    }
                  spids: [143]
                )
              ]
              spids: [141]
            )
            (AndOr
              children: [
                (DBracket
                  expr: (BoolBinary op_id:BoolBinary_GlobDEqual left:{($ VSub_QMark '$?')} right:{(0)})
                )
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
              op_id: Op_DPipe
            )
            (AndOr
              children: [
                (DBracket
                  expr: (BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$output'))})
                )
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
              op_id: Op_DPipe
            )
            (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})
          ]
          spids: [138]
        )
      spids: [134 137]
    )
    (If
      arms: [
        (if_arm
          cond: [(Sentence child:(C {(test_grepq)}) terminator:<Op_Semi ';'>)]
          action: [
            (FuncDef
              name: matches
              body: 
                (BraceGroup
                  children: [
                    (Sentence
                      child: (C {(grep)} {(-q)} {(DQ ($ VSub_At '$@'))})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [214]
                )
              spids: [210 213]
            )
          ]
          spids: [16777215 207]
        )
        (if_arm
          cond: [(Sentence child:(C {(test_greps)}) terminator:<Op_Semi ';'>)]
          action: [
            (FuncDef
              name: matches
              body: 
                (BraceGroup
                  children: [
                    (Sentence
                      child: (C {(grep)} {(-s)} {(DQ ($ VSub_At '$@'))})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [239]
                )
              spids: [235 238]
            )
          ]
          spids: [227 232]
        )
      ]
      else_action: [
        (FuncDef
          name: matches
          body: 
            (BraceGroup
              children: [
                (Sentence
                  child: 
                    (SimpleCommand
                      words: [{(grep)} {(DQ ($ VSub_At '$@'))}]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 2
                          arg_word: {(1)}
                          spids: [267]
                        )
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: {(/dev/null)}
                          spids: [270]
                        )
                      ]
                    )
                  terminator: <Op_Semi ';'>
                )
              ]
              spids: [259]
            )
          spids: [255 258]
        )
      ]
      spids: [252 276]
    )
    (FuncDef
      name: pluralize
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Number '$1'))} {(Lit_Other ']')})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(echo)} {(${ VSub_Number 1) (s)})]
                  spids: [16777215 299]
                )
              ]
              else_action: [
                (While
                  cond: [(Sentence child:(C {(read)} {(line)}) terminator:<Op_Semi ';'>)]
                  body: 
                    (DoGroup
                      children: [(C {(pluralize)} {($ VSub_Name '$line')})]
                      spids: [324 332]
                    )
                )
              ]
              spids: [314 335]
            )
          ]
          spids: [283]
        )
      spids: [279 282]
    )
    (FuncDef
      name: getc
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(read)} {(-r)} {(-n1)} {(-d)} {(SQ )} {(DQ ($ VSub_At '$@'))}]
              more_env: [(env_pair name:IFS val:{(SQ )} spids:[369])]
            )
          ]
          spids: [366]
        )
      spids: [362 365]
    )
    (FuncDef
      name: read_until
      body: 
        (BraceGroup
          children: [
            (Sentence
              child: 
                (Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:glob)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [398]
                    )
                  ]
                  spids: [396]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (Sentence
              child: 
                (Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:var)
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [407]
                    )
                  ]
                  spids: [405]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:out) op:Equal spids:[417])]
              spids: [415]
            )
            (While
              cond: [(Sentence child:(C {(getc)} {(ch)}) terminator:<Op_Semi ';'>)]
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:out)
                          op: Equal
                          rhs: {(DQ (${ VSub_Name out) (${ VSub_Name ch))}
                          spids: [431]
                        )
                      ]
                      spids: [431]
                    )
                    (Case
                      to_match: {(DQ ($ VSub_Name '$out'))}
                      arms: [
                        (case_arm
                          pat_list: [{(Lit_Other '*') ($ VSub_Name '$glob')}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:FOUND)
                                  op: Equal
                                  rhs: {(1)}
                                  spids: [456]
                                )
                              ]
                              spids: [456]
                            )
                            (C {(export)} 
                              {($ VSub_Name '$var') (Lit_Other '=') 
                                (DQ 
                                  (BracedVarSub
                                    token: <VSub_Name out>
                                    suffix_op: 
                                      (StringUnary
                                        op_id: VOp1_Percent
                                        arg_word: {($ VSub_Name '$glob')}
                                      )
                                    spids: [465 469]
                                  )
                                )
                              }
                            )
                            (ControlFlow
                              token: <ControlFlow_Return return>
                              arg_word: {(0)}
                            )
                          ]
                          spids: [451 453 478 16777215]
                        )
                      ]
                      spids: [442 448 481]
                    )
                  ]
                  spids: [428 484]
                )
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: (C {(Lit_Other '[')} {(-z)} {(DQ ($ VSub_Name '$out'))} {(Lit_Other ']')})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(false)})]
                  spids: [16777215 505]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [(assign_pair lhs:(LhsName name:FOUND) op:Equal rhs:{(0)} spids:[514])]
                  spids: [514]
                )
                (C {(export)} {($ VSub_Name '$var') (Lit_Other '=') (DQ ($ VSub_Name '$out'))})
                (C {(true)})
              ]
              spids: [511 530]
            )
          ]
          spids: [393]
        )
      spids: [389 392]
    )
    (FuncDef
      name: trim_l
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: {(BracedVarSub token:<VSub_Number 1> prefix_op:VSub_Bang spids:[545 548])}
                  spids: [544]
                )
              ]
              spids: [542]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (BracedVarSub
                          token: <VSub_Name str>
                          suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{('+([[:space:]])')})
                          spids: [553 557]
                        )
                      )
                    }
                  spids: [551]
                )
              ]
              spids: [551]
            )
            (C {(export)} {(DQ ($ VSub_Number '$1')) (Lit_Other '=') (DQ ($ VSub_Name '$str'))})
          ]
          spids: [539]
        )
      spids: [535 538]
    )
    (FuncDef
      name: trim_r
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: {(BracedVarSub token:<VSub_Number 1> prefix_op:VSub_Bang spids:[584 587])}
                  spids: [583]
                )
              ]
              spids: [581]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (BracedVarSub
                          token: <VSub_Name str>
                          suffix_op: (StringUnary op_id:VOp1_DPercent arg_word:{('+([[:space:]])')})
                          spids: [592 596]
                        )
                      )
                    }
                  spids: [590]
                )
              ]
              spids: [590]
            )
            (C {(export)} {(DQ ($ VSub_Number '$1')) (Lit_Other '=') (DQ ($ VSub_Name '$str'))})
          ]
          spids: [578]
        )
      spids: [574 577]
    )
    (FuncDef
      name: trim
      body: 
        (BraceGroup
          children: [(C {(trim_l)} {(DQ ($ VSub_At '$@'))}) (C {(trim_r)} {(DQ ($ VSub_At '$@'))})]
          spids: [617]
        )
      spids: [613 616]
    )
    (FuncDef
      name: db_safe
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: 
                    {
                      (DQ (BracedVarSub token:<VSub_Number 1> prefix_op:VSub_Bang spids:[653 656]) (.))
                    }
                  spids: [651]
                )
              ]
              spids: [649]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:escaped_quote)
                  op: Equal
                  rhs: {(DQ (EscapedLiteralPart token:<Lit_EscapedChar '\\\\'>) ("'"))}
                  spids: [666]
                )
              ]
              spids: [664]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [
                                (Pipeline
                                  children: [
                                    (C {(echo)} 
                                      {
                                        (DQ 
                                          (BracedVarSub
                                            token: <VSub_Name str>
                                            suffix_op: 
                                              (PatSub
                                                pat: 
                                                  {
                                                    (EscapedLiteralPart
                                                      token: <Lit_EscapedChar "\\'">
                                                    )
                                                  }
                                                replace: {($ VSub_Name '$escaped_quote')}
                                                do_all: True
                                                do_prefix: False
                                                do_suffix: False
                                              )
                                            spids: [681 688]
                                          )
                                        )
                                      }
                                    )
                                    (While
                                      cond: [
                                        (Sentence
                                          child: (C {(read)} {(line)})
                                          terminator: <Op_Semi ';'>
                                        )
                                      ]
                                      body: 
                                        (DoGroup
                                          children: [
                                            (Sentence
                                              child: 
                                                (C {(echo)} {(-n)} 
                                                  {
                                                    (DQ ($ VSub_Name '$line') 
                                                      (EscapedLiteralPart
                                                        token: <Lit_EscapedChar '\\\\'>
                                                      ) (n)
                                                    )
                                                  }
                                                )
                                              terminator: <Op_Semi ';'>
                                            )
                                          ]
                                          spids: [700 713]
                                        )
                                    )
                                  ]
                                  negated: False
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [675 714]
                        )
                      )
                    }
                  spids: [673]
                )
              ]
              spids: [673]
            )
            (C {(export)} 
              {(DQ ($ VSub_Number '$1')) (Lit_Other '=') 
                (DQ ("'") 
                  (BracedVarSub
                    token: <VSub_Name str>
                    suffix_op: 
                      (Slice
                        begin: (ArithWord w:{(Lit_Digits 0)})
                        length: 
                          (ArithBinary
                            op_id: Arith_Minus
                            left: 
                              (ArithWord
                                w: 
                                  {
                                    (BracedVarSub
                                      token: <VSub_Name str>
                                      prefix_op: VSub_Pound
                                      spids: [735 738]
                                    )
                                  }
                              )
                            right: (ArithWord w:{(Lit_Digits 1)})
                          )
                      )
                    spids: [730 741]
                  ) ("'")
                )
              }
            )
          ]
          spids: [646]
        )
      spids: [642 645]
    )
    (FuncDef
      name: bash_safe
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:str)
                  op: Equal
                  rhs: {(DQ (BracedVarSub token:<VSub_Number 1> prefix_op:VSub_Bang spids:[765 768]))}
                  spids: [763]
                )
              ]
              spids: [761]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:escaped_quote)
                  op: Equal
                  rhs: {(DQ ("'") (EscapedLiteralPart token:<Lit_EscapedChar '\\\\'>) ("''"))}
                  spids: [778]
                )
              ]
              spids: [776]
            )
            (C {(export)} 
              {(DQ ($ VSub_Number '$1')) (Lit_Other '=') 
                (DQ ("'") 
                  (BracedVarSub
                    token: <VSub_Name str>
                    suffix_op: 
                      (PatSub
                        pat: {(EscapedLiteralPart token:<Lit_EscapedChar "\\'">)}
                        replace: {($ VSub_Name '$escaped_quote')}
                        do_all: True
                        do_prefix: False
                        do_suffix: False
                      )
                    spids: [794 801]
                  ) ("'")
                )
              }
            )
          ]
          spids: [758]
        )
      spids: [754 757]
    )
    (FuncDef
      name: join
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:delim)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [817]
                )
              ]
              spids: [815]
            )
            (AndOr
              children: [(C {(read)} {(line)}) (C {(echo)} {(-n)} {(DQ ($ VSub_Name '$line'))})]
              op_id: Op_DAmp
            )
            (While
              cond: [(Sentence child:(C {(read)} {(line)}) terminator:<Op_Semi ';'>)]
              body: 
                (DoGroup
                  children: [
                    (C {(echo)} {(-n)} {(DQ ($ VSub_Name '$delim'))})
                    (C {(echo)} {(-n)} {(DQ ($ VSub_Name '$line'))})
                  ]
                  spids: [845 866]
                )
            )
          ]
          spids: [812]
        )
      spids: [808 811]
    )
  ]
)