public Profile findProfile(Main plugin, PendingConnection connection, ListenerInfo info) {
        Server serverMatch;
        synchronized (this) {
            if (serverCache.containsKey(info)) {
                serverMatch = serverCache.get(info);
            } else {
                serverMatch = null;
                if (servers != null) {
                    for (Map.Entry<String, Server> e : servers.entrySet()) {
                        if (e.getValue() != null && hostMatch(plugin, e.getKey(), info)) {
                            serverMatch = e.getValue();
                            break;
                        }
                    }
                }
                serverCache.put(info, serverMatch);
            }
        }
        String profileName = null;
        if (serverMatch != null) {
            profileName = serverMatch.findProfileName(plugin, connection);
        }
        if (!profiles.containsKey(profileName)) {
            return null;
        } else {
            return profiles.get(profileName);
        }
    }