module Mail::Parsers::AddressListsParser

def self.parse(data)

def self.parse(data)
  data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
  address_list = AddressListStruct.new([], [])
  return address_list if Mail::Utilities.blank?(data)
  phrase_s = phrase_e = qstr_s = qstr = comment_s = nil
  group_name_s = domain_s = group_name = nil
  local_dot_atom_s = local_dot_atom_e = nil
  local_dot_atom_pre_comment_e = nil
  obs_domain_list_s = nil
  address_s = 0
  address = AddressStruct.new(nil, nil, [], nil, nil, nil, 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 4
            begin
              phrase_e = p - 1
            end
          when 8
            begin
              qstr_s = p
            end
          when 10
            begin
              qstr = chars(data, qstr_s, p - 1)
            end
          when 59
            begin
              comment_s = p unless comment_s
            end
          when 12
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
          when 34
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 3
            begin
              if qstr
                address.display_name = Mail::Utilities.unescape(qstr)
                qstr = nil
              elsif phrase_e
                address.display_name = chars(data, phrase_s, phrase_e).strip
                phrase_e = phrase_s = nil
              end
            end
          when 43
            begin
              domain_s = p
            end
          when 54
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
          when 1
            begin
              local_dot_atom_s = p
            end
          when 24
            begin
              local_dot_atom_e = p - 1
            end
          when 21
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
          when 50
            begin
              address.local = '"' + qstr + '"' if address
            end
          when 20
            begin
              obs_domain_list_s = p
            end
          when 2
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 62
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 6
            begin
              phrase_e = p - 1
            end
            begin
              if qstr
                group = qstr
                qstr = nil
              else
                group = chars(data, group_name_s, p - 1)
                group_name_s = nil
              end
              address_list.group_names << group
              group_name = group
              # Start next address
              address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
              address_s = p
              address.group = group_name
            end
          when 7
            begin
              phrase_e = p - 1
            end
            begin
              if qstr
                address.display_name = Mail::Utilities.unescape(qstr)
                qstr = nil
              elsif phrase_e
                address.display_name = chars(data, phrase_s, phrase_e).strip
                phrase_e = phrase_s = nil
              end
            end
          when 42
            begin
              phrase_e = p - 1
            end
            begin
              domain_s = p
            end
          when 30
            begin
              phrase_e = p - 1
            end
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
          when 9
            begin
              qstr_s = p
            end
            begin
              qstr = chars(data, qstr_s, p - 1)
            end
          when 60
            begin
              comment_s = p unless comment_s
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 61
            begin
              comment_s = p unless comment_s
            end
            begin
              begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
              end
            end
          when 11
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              phrase_e = p - 1
            end
          when 35
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 17
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              if qstr
                address.display_name = Mail::Utilities.unescape(qstr)
                qstr = nil
              elsif phrase_e
                address.display_name = chars(data, phrase_s, phrase_e).strip
                phrase_e = phrase_s = nil
              end
            end
          when 55
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
          when 53
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_s = p
            end
          when 25
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
          when 52
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
          when 16
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 29
            begin
              address_s = p
            end
            begin
              phrase_s = p
            end
          when 28
            begin
              address_s = p
            end
            begin
              if qstr
                address.display_name = Mail::Utilities.unescape(qstr)
                qstr = nil
              elsif phrase_e
                address.display_name = chars(data, phrase_s, phrase_e).strip
                phrase_e = phrase_s = nil
              end
            end
          when 48
            begin
              domain_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 45
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 18
            begin
              local_dot_atom_s = p
            end
            begin
              obs_domain_list_s = p
            end
          when 33
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 39
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
          when 23
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
          when 22
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 49
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 56
            begin
              address.obs_domain_list = chars(data, obs_domain_list_s, p - 1)
            end
            begin
              local_dot_atom_s = p
            end
          when 5
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              phrase_e = p - 1
            end
          when 14
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              phrase_e = p - 1
            end
            begin
              if qstr
                group = qstr
                qstr = nil
              else
                group = chars(data, group_name_s, p - 1)
                group_name_s = nil
              end
              address_list.group_names << group
              group_name = group
              # Start next address
              address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
              address_s = p
              address.group = group_name
            end
          when 15
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              phrase_e = p - 1
            end
            begin
              if qstr
                address.display_name = Mail::Utilities.unescape(qstr)
                qstr = nil
              elsif phrase_e
                address.display_name = chars(data, phrase_s, phrase_e).strip
                phrase_e = phrase_s = nil
              end
            end
          when 46
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 47
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 41
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
          when 51
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 13
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              phrase_e = p - 1
            end
          when 65
            begin
              group_name_s = p
            end
            begin
              phrase_s = p
            end
            begin
              address_s = p
            end
          when 26
            begin
              address_s = p
            end
            begin
              phrase_s = p
            end
            begin
              local_dot_atom_s = p
            end
          when 19
            begin
              local_dot_atom_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              obs_domain_list_s = p
            end
          when 38
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 32
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 37
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
          when 57
            begin
              address.obs_domain_list = chars(data, obs_domain_list_s, p - 1)
            end
            begin
              local_dot_atom_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
          when 44
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              phrase_e = p - 1
            end
            begin
              domain_s = p
            end
          when 31
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              phrase_e = p - 1
            end
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
          when 40
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 63
            begin
              group_name_s = p
            end
            begin
              phrase_s = p
            end
            begin
              address_s = p
            end
            begin
              local_dot_atom_s = p
            end
          when 27
            begin
              address_s = p
            end
            begin
              phrase_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              local_dot_atom_s = p
            end
          when 36
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 58
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              address_s = p
            end
            begin
              phrase_s = p
            end
            begin
              local_dot_atom_s = p
            end
          when 64
            begin
              group_name_s = p
            end
            begin
              phrase_s = p
            end
            begin
              begin
                stack[top] = cs
                top += 1
                cs = 2449
                _goto_level = _again
                next
              end
            end
            begin
              address_s = p
            end
            begin
              local_dot_atom_s = p
            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 12
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
          when 34
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 35
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 45
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 33
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 49
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 46
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.domain = chars(data, domain_s, p - 1).rstrip if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 47
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 51
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 38
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 32
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 40
            begin
              if address
                address.comments << chars(data, comment_s, p - 2)
              end
              comment_s = nil
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          when 36
            begin
              local_dot_atom_pre_comment_e = p - 1
            end
            begin
              local_dot_atom_e = p - 1
            end
            begin
              address.local = '"' + qstr + '"' if address
            end
            begin
              if address_s
                if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
                  if address.domain
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_e)
                  else
                    address.local = chars(data, local_dot_atom_s, local_dot_atom_pre_comment_e)
                  end
                end
                address.raw = chars(data, address_s, p - 1)
                address_list.addresses << address if address
                # Start next address
                address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
                address.group = group_name
                address_s = nil
              end
            end
          end
        end
      end
      if _goto_level <= _out
        break
      end
    end
  end
  if p != eof || cs < 2461
    raise Mail::Field::IncompleteParseError.new(Mail::AddressList, data, p)
  end
  address_list
end