(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:KB) op:assign_op.Equal rhs:{<1024>} spids:[85])]
    )
    (C {<Id.Lit_Colon ':'>} 
      {
        (braced_var_sub
          token: <Id.VSub_Name TMPDIR>
          suffix_op: (suffix_op.Unary tok:<Id.VTest_Equals '='> arg_word:{<Id.Lit_Slash '/'> <tmp>})
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:DEFAULT_MTREE_KEYWORDS)
          op: assign_op.Equal
          rhs: {(DQ <'type,mode,gid,uid,size,link'>)}
          spids: [115]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST_IMAGE)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/test.img'>)}
          spids: [120]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST_INPUTS_DIR)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/inputs'>)}
          spids: [126]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST_MD_DEVICE_FILE)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/md.output'>)}
          spids: [132]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST_MOUNT_DIR)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/mnt'>)}
          spids: [138]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TEST_SPEC_FILE)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/mtree.spec'>)}
          spids: [144]
        )
      ]
    )
    (command.ShFunction
      name: check_image_contents
      body: 
        (BraceGroup
          children: [
            (C {<local>} {<Id.Lit_VarLike 'directories='> ($ Id.VSub_DollarName '$TEST_INPUTS_DIR')})
            (C {<local>} {<excludes>} {<mtree_excludes_arg>} {<mtree_file>})
            (C {<local>} 
              {<Id.Lit_VarLike 'mtree_keywords='> 
                (DQ ($ Id.VSub_DollarName '$DEFAULT_MTREE_KEYWORDS'))
              }
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: (C {<getopts>} {(DQ <'d:f:m:X:'>)} {<flag>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  children: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$flag'))}
                      arms: [
                        (case_arm
                          pat_list: [{<d>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:directories)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ ($ Id.VSub_DollarName '$directories') <' '> 
                                        ($ Id.VSub_DollarName '$OPTARG')
                                      )
                                    }
                                  spids: [209]
                                )
                              ]
                            )
                          ]
                          spids: [205 206 217 -1]
                        )
                        (case_arm
                          pat_list: [{<f>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:mtree_file)
                                  op: assign_op.Equal
                                  rhs: {($ Id.VSub_DollarName '$OPTARG')}
                                  spids: [224]
                                )
                              ]
                            )
                          ]
                          spids: [220 221 228 -1]
                        )
                        (case_arm
                          pat_list: [{<m>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:mtree_keywords)
                                  op: assign_op.Equal
                                  rhs: {($ Id.VSub_DollarName '$OPTARG')}
                                  spids: [235]
                                )
                              ]
                            )
                          ]
                          spids: [231 232 239 -1]
                        )
                        (case_arm
                          pat_list: [{<X>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:excludes)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ ($ Id.VSub_DollarName '$excludes') <' '> 
                                        ($ Id.VSub_DollarName '$OPTARG')
                                      )
                                    }
                                  spids: [246]
                                )
                              ]
                            )
                          ]
                          spids: [242 243 254 -1]
                        )
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [
                            (C {<echo>} 
                              {
                                (DQ 
                                  <
'usage: check_image_contents [-d directory ...] [-f mtree-file] [-m mtree-keywords] [-X exclude]'
                                  >
                                )
                              }
                            )
                            (C {<atf_fail>} {(DQ <'unhandled option: '> ($ Id.VSub_DollarName '$flag'))})
                          ]
                          spids: [257 258 276 -1]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$excludes'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.Pipeline
                      children: [
                        (C {<echo>} {(DQ ($ Id.VSub_DollarName '$excludes'))})
                        (command.Simple
                          words: [{<tr>} {(SQ <' '>)} {(SQ <'\\n'>)}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<excludes.txt>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                      negated: F
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:mtree_excludes_arg)
                          op: assign_op.Equal
                          rhs: {(DQ <'-X excludes.txt'>)}
                          spids: [325]
                        )
                      ]
                    )
                  ]
                  spids: [286 299]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$mtree_file'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:mtree_file)
                          op: assign_op.Equal
                          rhs: {<input_spec.mtree>}
                          spids: [351]
                        )
                      ]
                    )
                    (command.ForEach
                      iter_name: directory
                      iter_words: [{($ Id.VSub_DollarName '$directories')}]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (C {<mtree>} {<-c>} {<-k>} {($ Id.VSub_DollarName '$mtree_keywords')} {<-p>} 
                              {($ Id.VSub_DollarName '$directory')} {($ Id.VSub_DollarName '$mtree_excludes_arg')}
                            )
                          ]
                        )
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$mtree_file')}
                        )
                      ]
                    )
                  ]
                  spids: [335 348]
                )
              ]
            )
            (C {<echo>} {(DQ <'<---- Input spec BEGIN ---->'>)})
            (C {<cat>} {($ Id.VSub_DollarName '$mtree_file')})
            (C {<echo>} {(DQ <'<---- Input spec END ---->'>)})
            (C {<atf_check>} {<-e>} {<empty>} {<-o>} {<empty>} {<-s>} 
              {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<mtree>} {<-UW>} {<-f>} {($ Id.VSub_DollarName '$mtree_file')} {<-p>} 
              {($ Id.VSub_DollarName '$TEST_MOUNT_DIR')} {($ Id.VSub_DollarName '$mtree_excludes_arg')}
            )
          ]
        )
    )
    (command.ShFunction
      name: create_test_dirs
      body: 
        (BraceGroup
          children: [
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<mkdir>} {<-m>} {<0777>} {<-p>} {($ Id.VSub_DollarName '$TEST_MOUNT_DIR')}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<mkdir>} {<-m>} {<0777>} {<-p>} {($ Id.VSub_DollarName '$TEST_INPUTS_DIR')}
            )
          ]
        )
    )
    (command.ShFunction
      name: create_test_inputs
      body: 
        (BraceGroup
          children: [
            (C {<create_test_dirs>})
            (C {<cd>} {($ Id.VSub_DollarName '$TEST_INPUTS_DIR')})
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<mkdir>} {<-m>} {<0755>} {<-p>} {<'a/b/1'>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<ln>} {<-s>} {<'a/b'>} {<c>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<d>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<ln>} {<d>} {<e>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<.f>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<mkdir>} {<.g>}
            )
            (C {<atf_check>} {<-e>} {<ignore>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<dd>} {<Id.Lit_VarLike 'if='> <'/dev/zero'>} {<Id.Lit_VarLike 'of='> <i>} {<Id.Lit_VarLike 'count='> <1000>} 
              {<Id.Lit_VarLike 'bs='> <1>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<klmn>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<opqr>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<stuv>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<install>} {<-m>} {<0755>} {<'/dev/null'>} {<wxyz>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000001>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000010>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000011>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000100>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000101>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000110>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00000111>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001000>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001001>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001010>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001011>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001100>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001101>}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} 
              {<touch>} {<0b00001110>}
            )
            (command.ForEach
              iter_name: filesize
              iter_words: [
                {<1>}
                {<512>}
                {
                  (word_part.ArithSub
                    anode: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Star
                        left: {<Id.Lit_Digits 2>}
                        right: {($ Id.VSub_DollarName '$KB')}
                      )
                  )
                }
                {
                  (word_part.ArithSub
                    anode: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Star
                        left: {<Id.Lit_Digits 10>}
                        right: {($ Id.VSub_DollarName '$KB')}
                      )
                  )
                }
                {
                  (word_part.ArithSub
                    anode: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Star
                        left: {<Id.Lit_Digits 512>}
                        right: {($ Id.VSub_DollarName '$KB')}
                      )
                  )
                }
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {<atf_check>} {<-e>} {<ignore>} {<-o>} {<empty>} {<-s>} 
                      {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<dd>} {<Id.Lit_VarLike 'if='> <'/dev/zero'>} 
                      {<Id.Lit_VarLike 'of='> (${ Id.VSub_Name filesize) <.file>} {<Id.Lit_VarLike 'bs='> <1>} {<Id.Lit_VarLike 'count='> <1>} 
                      {<Id.Lit_VarLike 'oseek='> (${ Id.VSub_Name filesize)} {<Id.Lit_VarLike 'conv='> <sparse>}
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:files)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name files) <' '> (${ Id.VSub_Name filesize) <.file>)}
                          spids: [1084]
                        )
                      ]
                    )
                  ]
                )
            )
            (C {<cd>} {<->})
          ]
        )
    )
    (command.ShFunction
      name: mount_image
      body: 
        (BraceGroup
          children: [
            (C {<atf_check>} {<-e>} {<empty>} {<-o>} 
              {<save> <Id.Lit_Colon ':'> ($ Id.VSub_DollarName '$TEST_MD_DEVICE_FILE')} {<-s>} {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {<mdconfig>} {<-a>} {<-f>} 
              {($ Id.VSub_DollarName '$TEST_IMAGE')}
            )
            (C {<atf_check>} {<-e>} {<empty>} {<-o>} {<empty>} {<-s>} 
              {<Id.ControlFlow_Exit exit> <Id.Lit_Colon ':'> <0>} {($ Id.VSub_DollarName '$MOUNT')} 
              {<'/dev/'> 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<cat>} {($ Id.VSub_DollarName '$TEST_MD_DEVICE_FILE')})
                )
              } {($ Id.VSub_DollarName '$TEST_MOUNT_DIR')}
            )
          ]
        )
    )
  ]
)