(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SAVEPATH)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PATH'))}
          spids: [66]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<source>} {<'sources/include.sh'>})
        (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:STAGE_DIR)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name HOSTTOOLS))}
          spids: [82]
        )
      ]
    )
    (C {<blank_tempdir>} {(DQ ($ Id.VSub_DollarName '$WORK'))})
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [(C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}) (C {<dienow>})]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PATH)
          op: assign_op.Equal
          rhs: 
            {
              (DQ (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<hosttools_path>})) 
                <':'> ($ Id.VSub_DollarName '$PATH')
              )
            }
          spids: [179]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$BUILD_STATIC'))} 
                  {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<none>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (C {($ Id.VSub_DollarName '$CC')} 
              {(DQ ($ Id.VSub_DollarName '$SOURCES') <'/root-filesystem/src/hello.c'>)} {<--static>} {<-o>} {<'/dev/null'>}
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>} 
                          {<Id.Lit_RBracket ']'>}
                        )
                      ]
                    )
                  action: [
                    (command.Simple
                      words: [{<echo>} {(DQ <'Your host toolchain does not support static linking.'>)}]
                      redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (command.Simple
                      words: [{<echo>} {(DQ <'Either install support, or export BUILD_STATIC=none'>)}]
                      redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (C {<dienow>})
                  ]
                  spids: [226 239]
                )
              ]
            )
          ]
          spids: [193 208]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
          {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/busybox'>)} {<Id.Lit_RBracket ']'>}
        )
        (C {<build_section>} {<busybox>})
        (C {<rm>} {<-f>} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/sh'>)})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
          {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/toybox'>)} {<Id.Lit_RBracket ']'>}
        )
        (C {<build_section>} {<toybox>})
      ]
    )
    (command.ForEach
      iter_name: i
      iter_words: [
        {<ar>}
        {<as>}
        {<nm>}
        {<cc>}
        {<make>}
        {<ld>}
        {<gcc>}
        {<objdump>}
        {<sh>}
        {($ Id.VSub_DollarName '$HOST_EXTRA')}
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                          {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/'> ($ Id.VSub_DollarName '$i'))} {<Id.Lit_RBracket ']'>}
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:X)
                          op: assign_op.Equal
                          rhs: {<0>}
                          spids: [415]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FALLBACK)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                          spids: [419]
                        )
                      ]
                    )
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [
                            {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/which'>)}
                            {<-a>}
                            {(DQ ($ Id.VSub_DollarName '$i'))}
                          ]
                          more_env: [
                            (env_pair
                              name: PATH
                              val: {(DQ ($ Id.VSub_DollarName '$SAVEPATH'))}
                              spids: [425]
                            )
                          ]
                          do_fork: T
                        )
                        (command.WhileUntil
                          keyword: <Id.KW_While while>
                          cond: (condition.Shell commands:[(C {<read>} {<j>})])
                          body: 
                            (command.DoGroup
                              children: [
                                (command.If
                                  arms: [
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-e>} 
                                              {
                                                (DQ ($ Id.VSub_DollarName '$FALLBACK') <'/'> 
                                                  ($ Id.VSub_DollarName '$i')
                                                )
                                              } {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.AndOr
                                          ops: [Id.Op_DAmp Id.Op_DPipe]
                                          children: [
                                            (C {<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName '$FALLBACK'))})
                                            (C {<ln>} {<-sf>} {(DQ ($ Id.VSub_DollarName '$j'))} 
                                              {
                                                (DQ ($ Id.VSub_DollarName '$FALLBACK') <'/'> 
                                                  ($ Id.VSub_DollarName '$i')
                                                )
                                              }
                                            )
                                            (C {<dienow>})
                                          ]
                                        )
                                      ]
                                      spids: [453 470]
                                    )
                                  ]
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:X)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (word_part.ExprSub
                                            left: <Id.Left_DollarBracket '$['>
                                            child: 
                                              (expr.Binary
                                                op: <Id.Arith_Plus _>
                                                left: ($ Id.VSub_DollarName '$X')
                                                right: (Const Id.Expr_DecInt 1)
                                              )
                                          )
                                        }
                                      spids: [507]
                                    )
                                  ]
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:FALLBACK)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/fallback-'> 
                                            ($ Id.VSub_DollarName '$X')
                                          )
                                        }
                                      spids: [515]
                                    )
                                  ]
                                )
                              ]
                            )
                        )
                      ]
                      negated: F
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                                  {
                                    (DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/'> 
                                      ($ Id.VSub_DollarName '$i')
                                    )
                                  } {<Id.Lit_RBracket ']'>}
                                )
                              ]
                            )
                          action: [
                            (command.Simple
                              words: [
                                {<echo>}
                                {(DQ <'Toolchain component missing: '> ($ Id.VSub_DollarName '$i'))}
                              ]
                              redirects: [
                                (redir
                                  op: <Id.Redir_GreatAnd '>&'>
                                  loc: (redir_loc.Fd fd:1)
                                  arg: {<2>}
                                )
                              ]
                              do_fork: T
                            )
                            (C {<dienow>})
                          ]
                          spids: [527 544]
                        )
                      ]
                    )
                  ]
                  spids: [390 407]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ET_TU_UBUNTU)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      words: [{(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/which'>)} {<gcc.real>}]
                      more_env: [
                        (env_pair
                          name: PATH
                          val: {(DQ ($ Id.VSub_DollarName '$SAVEPATH'))}
                          spids: [579]
                        )
                      ]
                      do_fork: T
                    )
                )
              )
            }
          spids: [576]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} {(DQ ($ Id.VSub_DollarName '$ET_TU_UBUNTU'))} 
          {<Id.Lit_RBracket ']'>}
        )
        (command.Simple
          words: [
            {<ln>}
            {<-s>}
            {(DQ ($ Id.VSub_DollarName '$ET_TU_UBUNTU'))}
            {(DQ ($ Id.VSub_DollarName '$STAGE_DIR') <'/gcc.real'>)}
          ]
          redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{<'/dev/null'>})]
          do_fork: T
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PATH)
          op: assign_op.Equal
          rhs: {(DQ (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<hosttools_path>})))}
          spids: [631]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} 
                  {
                    (DQ 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            words: [
                              {<find>}
                              {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                              {<-newer>}
                              {(DQ ($ Id.VSub_DollarName '$BUILD') <'/record-commands'>)}
                            ]
                            redirects: [
                              (redir
                                op: <Id.Redir_Great '2>'>
                                loc: (redir_loc.Fd fd:2)
                                arg: {<'/dev/null'>}
                              )
                            ]
                            do_fork: T
                          )
                      )
                    )
                  } {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (C {<cd>} {(DQ ($ Id.VSub_DollarName '$TOP'))})
                (C {<'more/record-commands.sh'>})
                (C {<dienow>})
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:PATH)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$WRAPDIR'))}
                  spids: [686]
                )
              ]
            )
          ]
          spids: [638 668]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<-z>} 
                  {
                    (DQ 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<which>} {<distccd>})
                      )
                    )
                  } {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<setupfor>} {<distcc>})
                (C {<'./configure'>} {<--with-included-popt>} {<--disable-Werror>})
                (C {<make>} {<-j>} {(DQ ($ Id.VSub_DollarName '$CPUS'))})
                (C {<cp>} {<distcc>} {<distccd>} {(DQ (${ Id.VSub_Name STAGE_DIR))})
              ]
            )
            (C {<cleanup>})
          ]
          spids: [720 736]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                  {(DQ (${ Id.VSub_Name STAGE_DIR)) <'/genext2fs'>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<setupfor>} {<genext2fs>})
                (C {<'./configure'>})
                (C {<make>} {<-j>} {($ Id.VSub_DollarName '$CPUS')})
                (C {<cp>} {<genext2fs>} {(DQ (${ Id.VSub_Name STAGE_DIR))})
              ]
            )
            (C {<cleanup>})
          ]
          spids: [792 809]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                  {(DQ (${ Id.VSub_Name STAGE_DIR)) <'/mke2fs'>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<setupfor>} {<e2fsprogs>})
                (C {<'./configure'>} {<--disable-tls>} {<--disable-nls>} {<--enable-htree>})
                (C {<make>} {<-j>} {(DQ ($ Id.VSub_DollarName '$CPUS'))})
                (C {<cp>} 
                  (word.BracedTree
                    parts: [<'misc/'> (word_part.BracedTuple words:[{<mke2fs>} {<tune2fs>}])]
                  ) {<'resize/resize2fs'>} {(DQ (${ Id.VSub_Name STAGE_DIR))}
                )
                (C {<cp>} {<'e2fsck/e2fsck'>} {(DQ ($ Id.VSub_DollarName '$STAGE_DIR')) <'/fsck.ext2'>})
              ]
            )
            (C {<cleanup>})
          ]
          spids: [883 900]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                  {(DQ (${ Id.VSub_Name STAGE_DIR)) <'/mksquashfs'>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<setupfor>} {<zlib>})
                (C {<'./configure'>})
                (C {<make>} {<-j>} {($ Id.VSub_DollarName '$CPUS')})
                (C {<mv>} {<z> <Id.Lit_Star '*'> <.h>} {<libz.a>} {<..>})
              ]
            )
            (C {<cleanup>})
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {<setupfor>} {<squashfs>})
                (C {<cd>} {<squashfs-tools>})
                (C {<sed>} {<-i>} {(DQ <'/^XATTR_/d'>)} {<Makefile>})
                (command.Simple
                  words: [{<make>} {<-j>} {($ Id.VSub_DollarName '$CPUS')}]
                  more_env: [
                    (env_pair
                      name: CC
                      val: {(DQ ($ Id.VSub_DollarName '$CC') <' -I ../.. -L ../..'>)}
                      spids: [1064]
                    )
                  ]
                  do_fork: T
                )
                (C {<cp>} {<mksquashfs>} {<unsquashfs>} {(DQ (${ Id.VSub_Name STAGE_DIR))})
                (C {<rm>} 
                  (word.BracedTree
                    parts: [
                      <'../../'>
                      (word_part.BracedTuple
                        words: [{<z> <Id.Lit_Star '*'> <.h>} {<libz.a>}]
                      )
                    ]
                  )
                )
              ]
            )
            (C {<cleanup>})
          ]
          spids: [972 989]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} 
                  {
                    (DQ 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            words: [
                              {<find>}
                              {(DQ ($ Id.VSub_DollarName '$STAGE_DIR'))}
                              {<-newer>}
                              {(DQ ($ Id.VSub_DollarName '$BUILD') <'/record-commands'>)}
                            ]
                            redirects: [
                              (redir
                                op: <Id.Redir_Great '2>'>
                                loc: (redir_loc.Fd fd:2)
                                arg: {<'/dev/null'>}
                              )
                            ]
                            do_fork: T
                          )
                      )
                    )
                  } {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DPipe]
              children: [
                (C {<cd>} {(DQ ($ Id.VSub_DollarName '$TOP'))})
                (C {<'more/record-commands.sh'>})
                (C {<dienow>})
              ]
            )
          ]
          spids: [1115 1145]
        )
      ]
    )
    (C {<echo>} {<-e>} 
      {
        (DQ <Id.Lit_BadBackslash '\\'> <'e[32mHost tools build complete.'> <Id.Lit_BadBackslash '\\'> 
          <'e[0m'>
        )
      }
    )
  ]
)