(CommandList
  children: [
    (FuncDef
      name: error
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(echo)} {(DQ ($ VSub_At '$@'))}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[98])]
            )
            (C {(exit)} {(1)})
          ]
          spids: [89]
        )
      spids: [85 88]
    )
    (FuncDef
      name: usage
      body: (BraceGroup children:[(C {(error)} {(DQ ('usage: vigr [-d dir]'))})] spids:[113])
      spids: [109 112]
    )
    (While
      cond: [(Sentence child:(C {(getopts)} {(d) (Lit_Other ':')} {(opt)}) terminator:<Op_Semi ';'>)]
      body: 
        (DoGroup
          children: [
            (Case
              to_match: {($ VSub_Name '$opt')}
              arms: [
                (case_arm
                  pat_list: [{(d)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:etcdir)
                          op: Equal
                          rhs: {(DQ (${ VSub_Name OPTARG))}
                          spids: [153]
                        )
                      ]
                      spids: [153]
                    )
                  ]
                  spids: [149 150 161 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [(C {(usage)})]
                  spids: [164 165 171 16777215]
                )
              ]
              spids: [142 146 174]
            )
          ]
          spids: [139 176]
        )
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:grpfile)
          op: Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  token: <VSub_Name etcdir>
                  suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(Lit_Slash /) (etc)})
                  spids: [184 189]
                ) (/group)
              )
            }
          spids: [182]
        )
      ]
      spids: [182]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {(KW_Bang '!')} {(-f)} {(DQ (${ VSub_Name grpfile))} 
                  {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [(C {(error)} {(DQ ('Missing group file'))})]
          spids: [16777215 211]
        )
      ]
      spids: [16777215 220]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:tmpdir)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(mktemp)} {(-d)} {(-t)} {(vigr)})])
                left_token: <Left_CommandSub '$('>
                spids: [227 235]
              )
            }
          spids: [226]
        )
      ]
      spids: [226]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name tmpdir))} {(-o)} {(KW_Bang '!')} {(-d)} 
                  {(DQ (${ VSub_Name tmpdir))} {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [(C {(error)} {(DQ ('Unable to create the temporary directory'))})]
          spids: [16777215 265]
        )
      ]
      spids: [16777215 274]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:tmpfile)
          op: Equal
          rhs: {(DQ (${ VSub_Name tmpdir) (/group))}
          spids: [276]
        )
      ]
      spids: [276]
    )
    (C {(trap)} {(DQ ('exit 1'))} {(INT)})
    (C {(trap)} {(DQ ("rm -rf '") (${ VSub_Name tmpdir) ("'"))} {(EXIT)})
    (C {(set)} {(-e)})
    (C {(cp)} {(DQ (${ VSub_Name grpfile))} {(DQ (${ VSub_Name tmpfile))})
    (While
      cond: [(Sentence child:(C {(Lit_Other ':')}) terminator:<Op_Semi ';'>)]
      body: 
        (DoGroup
          children: [
            (C 
              {
                (BracedVarSub
                  token: <VSub_Name EDITOR>
                  suffix_op: 
                    (StringUnary
                      op_id: VTest_ColonHyphen
                      arg_word: {(Lit_Slash /) (usr) (Lit_Slash /) (bin) (Lit_Slash /) (vi)}
                    )
                  spids: [343 352]
                )
              } {(DQ (${ VSub_Name tmpfile))}
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: (C {(chkgrp)} {(-q)} {(DQ (${ VSub_Name tmpfile))})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(install)} {(-b)} {(-m)} {(0644)} {(-C)} {(-S)} {(DQ (${ VSub_Name tmpfile))} 
                      {(DQ (${ VSub_Name grpfile))}
                    )
                    (C {(exit)} {(0)})
                  ]
                  spids: [16777215 380]
                )
              ]
              spids: [16777215 413]
            )
            (While
              cond: [(Sentence child:(C {(Lit_Other ':')}) terminator:<Op_Semi ';'>)]
              body: 
                (DoGroup
                  children: [
                    (C {(echo)} {(-n)} {(DQ ('Re-edit the group file? '))})
                    (C {(read)} {(ans)})
                    (Case
                      to_match: {($ VSub_Name '$ans')}
                      arms: [
                        (case_arm
                          pat_list: [
                            {(Lit_Other '[') (Yy) (Lit_Other ']')}
                            {(Lit_Other '[') (Yy) (Lit_Other ']') (Lit_Other '[') (Ee) (Lit_Other ']') 
                              (Lit_Other '[') (Ss) (Lit_Other ']')
                            }
                          ]
                          action: [(ControlFlow token:<ControlFlow_Break break>)]
                          spids: [450 463 469 16777215]
                        )
                        (case_arm
                          pat_list: [
                            {(Lit_Other '[') (Nn) (Lit_Other ']')}
                            {(Lit_Other '[') (Nn) (Lit_Other ']') (Lit_Other '[') (Oo) (Lit_Other ']')}
                          ]
                          action: [(C {(exit)} {(1)})]
                          spids: [472 482 490 16777215]
                        )
                      ]
                      spids: [443 447 493]
                    )
                  ]
                  spids: [426 496]
                )
            )
          ]
          spids: [336 498]
        )
    )
  ]
)