module Mail::Parsers::EnvelopeFromParser

def self.parse(data)

def self.parse(data)
  data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
  envelope_from = EnvelopeFromStruct.new
  return envelope_from if Mail::Utilities.blank?(data)
  # Parser state
  address_s = ctime_date_s = nil
  # 5.1 Variables Used by Ragel
  p = 0
  eof = pe = data.length
  stack = []
  begin
    p ||= 0
    pe ||= data.length
    cs = start
    top = 0
  end
  begin
    testEof = false
    _slen, _trans, _keys, _inds, _acts, _nacts = nil
    _goto_level = 0
    _resume = 10
    _eof_trans = 15
    _again = 20
    _test_eof = 30
    _out = 40
    while true
      if _goto_level <= 0
        if p == pe
          _goto_level = _test_eof
          next
        end
        if cs == 0
          _goto_level = _out
          next
        end
      end
      if _goto_level <= _resume
        _keys = cs << 1
        _inds = _index_offsets[cs]
        _slen = _key_spans[cs]
        _wide = data[p].ord
        _trans = if (_slen > 0 &&
                     _trans_keys[_keys] <= _wide &&
                     _wide <= _trans_keys[_keys + 1])
                   _indicies[_inds + _wide - _trans_keys[_keys]]
                 else
                   _indicies[_inds + _slen]
                 end
        cs = _trans_targs[_trans]
        if _trans_actions[_trans] != 0
          case _trans_actions[_trans]
          when 3
            begin
              address_s = p
            end
          when 27
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 14
            begin
              ctime_date_s = p
            end
          when 8
            begin
            end
          when 15
            begin
            end
          when 6
            begin
            end
          when 24
            begin
            end
          when 20
            begin
            end
          when 4
            begin
            end
          when 12
            begin
            end
          when 10
            begin
            end
          when 40
            begin
            end
          when 5
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 18
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 1
            begin
              address_s = p
            end
            begin
            end
          when 28
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 26
            begin
            end
            begin
            end
          when 13
            begin
            end
            begin
            end
          when 42
            begin
            end
            begin
            end
          when 9
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 16
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 17
            begin
            end
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 29
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 7
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 23
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 36
            begin
            end
            begin
            end
          when 22
            begin
            end
            begin
            end
          when 21
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 11
            begin
            end
            begin
            end
          when 39
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 2
            begin
              address_s = p
            end
            begin
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 245
                _goto_level = _again
                next
              end
            end
          when 30
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 25
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 38
            begin
            end
            begin
            end
            begin
            end
          when 41
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 35
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 19
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 34
            begin
            end
            begin
            end
            begin
            end
          when 37
            begin
            end
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 33
            begin
            end
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          end
        end
      end
      if _goto_level <= _again
        if cs == 0
          _goto_level = _out
          next
        end
        p += 1
        if p != pe
          _goto_level = _resume
          next
        end
      end
      if _goto_level <= _test_eof
        if p == eof
          case _eof_actions[cs]
          when 27
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 31
            begin
              envelope_from.ctime_date = chars(data, ctime_date_s, p - 1)
            end
          when 28
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 32
            begin
            end
            begin
              envelope_from.ctime_date = chars(data, ctime_date_s, p - 1)
            end
          when 29
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 23
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 39
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 30
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 25
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 41
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 35
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 19
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 37
            begin
            end
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          when 33
            begin
            end
            begin
            end
            begin
            end
            begin
              envelope_from.address = chars(data, address_s, p - 1).rstrip
            end
          end
        end
      end
      if _goto_level <= _out
        break
      end
    end
  end
  if p != eof || cs < 257
    raise Mail::Field::IncompleteParseError.new(Mail::EnvelopeFromElement, data, p)
  end
  envelope_from
end