beginCompilationUnit(bool)
  beginMetadataStar(bool)
  endMetadataStar(0)
  beginTopLevelMember(bool)
    handleIdentifier(bool, typeReference)
    handleNoTypeArguments(x)
    handleType(bool, null)
    handleIdentifier(x, topLevelVariableDeclaration)
    handleNoFieldInitializer(;)
  endTopLevelFields(null, null, null, null, null, 1, bool, ;)
endTopLevelDeclaration(bool)
beginMetadataStar(bool)
endMetadataStar(0)
beginTopLevelMember(bool)
  handleIdentifier(bool, typeReference)
  handleNoTypeArguments(x)
  handleType(bool, null)
  handleIdentifier(x, topLevelVariableDeclaration)
  handleNoFieldInitializer(;)
endTopLevelFields(null, null, null, null, null, 1, bool, ;)
endTopLevelDeclaration(errors)
beginMetadataStar(errors)
endMetadataStar(0)
beginTopLevelMember(errors)
beginTopLevelMethod(;, null)
  handleNoType(;)
  handleIdentifier(errors, topLevelFunctionDeclaration)
  handleNoTypeVariables(()
  beginFormalParameters((, MemberKind.TopLevelMethod)
  endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
  handleAsyncModifier(null, null)
  beginBlockFunctionBody({)
    handleIdentifier(print, expression)
    handleNoTypeArguments(()
    beginArguments(()
      handleIdentifier(x, expression)
      handleNoTypeArguments())
      handleNoArguments())
      handleSend(x, ))
    endArguments(1, (, ))
    handleSend(print, ;)
    handleExpressionStatement(;)
    handleIdentifier(print, expression)
    handleNoTypeArguments(()
    beginArguments(()
      handleIdentifier(x, expression)
      handleNoTypeArguments(!)
      handleNoArguments(!)
      handleSend(x, !)
      handleNonNullAssertExpression(!)
    endArguments(1, (, ))
    handleSend(print, ;)
    handleExpressionStatement(;)
    handleIdentifier(print, expression)
    handleNoTypeArguments(()
    beginArguments(()
      handleIdentifier(x, expression)
      handleNoTypeArguments())
      handleNoArguments())
      handleSend(x, ))
      handleUnaryPrefixExpression(!)
    endArguments(1, (, ))
    handleSend(print, ;)
    handleExpressionStatement(;)
  endBlockFunctionBody(3, {, })
endTopLevelMethod(errors, null, })
endTopLevelDeclaration(class)
beginMetadataStar(class)
endMetadataStar(0)
beginClassOrNamedMixinApplicationPrelude(class)
handleIdentifier(C, classOrMixinDeclaration)
handleNoTypeVariables({)
beginClassDeclaration(class, null, C)
  handleNoType(C)
  handleClassExtends(null, 1)
  handleClassNoWithClause()
  handleClassOrMixinImplements(null, 0)
  handleClassHeader(class, class, null)
  beginClassOrMixinBody(DeclarationKind.Class, {)
    beginMetadataStar(C)
    endMetadataStar(0)
    beginMember()
      beginMethod(null, null, null, null, null, C)
        handleNoType({)
        handleIdentifier(C, methodDeclaration)
        handleIdentifier(c0, methodDeclarationContinuation)
        handleQualified(.)
        handleNoTypeVariables(()
        beginFormalParameters((, MemberKind.NonStaticMethod)
        endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
        beginInitializers(:)
          beginInitializer(super)
            handleSuperExpression(super, expression)
            handleNoTypeArguments(()
            beginArguments(()
            endArguments(0, (, ))
            handleSend(super, ;)
          endInitializer(;)
        endInitializers(1, :, ;)
        handleAsyncModifier(null, null)
        handleEmptyFunctionBody(;)
      endClassConstructor(null, C, (, :, ;)
    endMember()
    beginMetadataStar(C)
    endMetadataStar(0)
    beginMember()
      beginMethod(null, null, null, null, null, C)
        handleNoType(;)
        handleIdentifier(C, methodDeclaration)
        handleIdentifier(c1, methodDeclarationContinuation)
        handleQualified(.)
        handleNoTypeVariables(()
        beginFormalParameters((, MemberKind.NonStaticMethod)
        endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
        beginInitializers(:)
          beginInitializer(super)
            handleSuperExpression(super, expression)
            handleNoTypeArguments(()
            beginArguments(()
            endArguments(0, (, ))
            handleSend(super, !)
            handleNonNullAssertExpression(!)
          endInitializer(;)
        endInitializers(1, :, ;)
        handleAsyncModifier(null, null)
        handleEmptyFunctionBody(;)
      endClassConstructor(null, C, (, :, ;)
    endMember()
  endClassOrMixinBody(DeclarationKind.Class, 2, {, })
endClassDeclaration(class, })
endTopLevelDeclaration(main)
beginMetadataStar(main)
endMetadataStar(0)
beginTopLevelMember(main)
beginTopLevelMethod(}, null)
  handleNoType(})
  handleIdentifier(main, topLevelFunctionDeclaration)
  handleNoTypeVariables(()
  beginFormalParameters((, MemberKind.TopLevelMethod)
  endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
  handleAsyncModifier(null, null)
  beginBlockFunctionBody({)
  endBlockFunctionBody(0, {, })
endTopLevelMethod(main, null, })
endTopLevelDeclaration()
endCompilationUnit(5, )
