# HG changeset patch # User Marcus Lundblad # Date 1225149191 0 # Node ID a4dfc631b140465eea64b4ed7b67d2b736833167 # Parent 2a4f96dc074e8cd160927c447e803a42e8789393# Parent 91a021ffca9c7495ec596836d500993404d8bb42 propagate from branch 'im.pidgin.pidgin' (head 7bdc0d34e54e09101ba68ba39703a8fd5081e8eb) to branch 'im.pidgin.cpw.malu.xmpp.attention' (head f27e3d2026fab3f93eacb55e0d4fc8d6c3f75f31) diff -r 91a021ffca9c -r a4dfc631b140 ChangeLog --- a/ChangeLog Mon Oct 20 18:30:28 2008 +0000 +++ b/ChangeLog Mon Oct 27 23:13:11 2008 +0000 @@ -1,6 +1,12 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul version 2.5.3 (??/??/????): + libpurple: + * Fix an error with MSN offline messages by shipping the *new* + "Microsoft Secure Server Authority" and the + "Microsoft Internet Authority" certificates. People that use + --with-system-ssl-certs and GnuTLS need to include these in the + system certs directory. version 2.5.2 (10/19/2008): libpurple: diff -r 91a021ffca9c -r a4dfc631b140 Makefile.am diff -r 91a021ffca9c -r a4dfc631b140 NEWS diff -r 91a021ffca9c -r a4dfc631b140 configure.ac --- a/configure.ac Mon Oct 20 18:30:28 2008 +0000 +++ b/configure.ac Mon Oct 27 23:13:11 2008 +0000 @@ -74,7 +74,7 @@ AC_CANONICAL_SYSTEM AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE([dist-bzip2]) +AM_INIT_AUTOMAKE([1.9 -Wno-portability dist-bzip2]) PURPLE_MAJOR_VERSION=purple_major_version PURPLE_MINOR_VERSION=purple_minor_version diff -r 91a021ffca9c -r a4dfc631b140 finch/gntblist.c --- a/finch/gntblist.c Mon Oct 20 18:30:28 2008 +0000 +++ b/finch/gntblist.c Mon Oct 27 23:13:11 2008 +0000 @@ -1288,6 +1288,17 @@ } static void +toggle_show_offline(GntMenuItem *item, gpointer buddy) +{ + purple_blist_node_set_bool(buddy, "show_offline", + !purple_blist_node_get_bool(buddy, "show_offline")); + if (!ggblist->manager->can_add_node(buddy)) + node_remove(purple_get_blist(), buddy); + else + node_update(purple_get_blist(), buddy); +} + +static void create_buddy_menu(GntMenu *menu, PurpleBuddy *buddy) { PurpleAccount *account; @@ -1322,10 +1333,10 @@ gnt_menuitem_set_callback(item, toggle_block_buddy, buddy); gnt_menu_add_item(menu, item); -#if 0 - add_custom_action(tree, _("View Log"), - PURPLE_CALLBACK(finch_blist_view_log_cb)), buddy); -#endif + item = gnt_menuitem_check_new(_("Show when offline")); + gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), purple_blist_node_get_bool((PurpleBlistNode*)buddy, "show_offline")); + gnt_menuitem_set_callback(item, toggle_show_offline, buddy); + gnt_menu_add_item(menu, item); /* Protocol actions */ append_proto_menu(menu, diff -r 91a021ffca9c -r a4dfc631b140 libpurple/circbuffer.c --- a/libpurple/circbuffer.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/circbuffer.c Mon Oct 27 23:13:11 2008 +0000 @@ -109,13 +109,12 @@ else len_stored = len; - memcpy(buf->inptr, src, len_stored); + if (len_stored > 0) + memcpy(buf->inptr, src, len_stored); if (len_stored < len) { memcpy(buf->buffer, (char*)src + len_stored, len - len_stored); buf->inptr = buf->buffer + (len - len_stored); - } else if ((buf->buffer - buf->inptr) == len_stored) { - buf->inptr = buf->buffer; } else { buf->inptr += len_stored; } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/core.c --- a/libpurple/core.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/core.c Mon Oct 27 23:13:11 2008 +0000 @@ -361,7 +361,7 @@ #endif if (g_rename(path, new_name)) { - purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", path, new_name, g_strerror(errno)); g_free(new_name); return FALSE; @@ -374,7 +374,7 @@ old_name = g_build_filename(old_base, basename, NULL); if (symlink(new_name, old_name)) { - purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", old_name, new_name, g_strerror(errno)); } g_free(old_name); @@ -430,7 +430,7 @@ { if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { - purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", user_dir, g_strerror(errno)); g_free(status_file); g_free(old_user_dir); @@ -442,7 +442,7 @@ * incomplete migrations and properly retry. */ if (!(fp = g_fopen(status_file, "w"))) { - purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", status_file, g_strerror(errno)); g_free(status_file); g_free(old_user_dir); @@ -454,7 +454,7 @@ err = NULL; if (!(dir = g_dir_open(old_user_dir, 0, &err))) { - purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", status_file, (err ? err->message : "Unknown error")); if (err) @@ -483,7 +483,7 @@ if ((link = g_file_read_link(name, &err)) == NULL) { char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); - purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", name_utf8 ? name_utf8 : name, err->message); g_free(name_utf8); g_error_free(err); @@ -500,7 +500,7 @@ if ((linklen = readlink(name, buf, sizeof(buf) - 1) == -1)) { char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); - purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", name_utf8, g_strerror(errno)); g_free(name_utf8); g_free(name); @@ -538,7 +538,7 @@ * guaranteed. Oh well. */ if (symlink(link, logs_dir)) { - purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", logs_dir, link, g_strerror(errno)); g_free(link); g_free(name); @@ -577,7 +577,7 @@ err = NULL; if (!(icons_dir = g_dir_open(name, 0, &err))) { - purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", name, (err ? err->message : "Unknown error")); if (err) @@ -595,7 +595,7 @@ { if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { - purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", new_icons_dir, g_strerror(errno)); g_free(new_icons_dir); g_dir_close(icons_dir); @@ -658,7 +658,7 @@ if (!(fp = g_fopen(name, "rb"))) { - purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", name, g_strerror(errno)); g_free(name); g_dir_close(dir); @@ -670,7 +670,7 @@ new_name = g_build_filename(user_dir, entry, NULL); if (!(new_file = g_fopen(new_name, "wb"))) { - purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", new_name, g_strerror(errno)); fclose(fp); g_free(new_name); @@ -689,7 +689,7 @@ size = fread(buf, 1, sizeof(buf), fp); if (size != sizeof(buf) && !feof(fp)) { - purple_debug_error("core", "Error reading %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error reading %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", name, g_strerror(errno)); fclose(new_file); fclose(fp); @@ -703,7 +703,7 @@ if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0) { - purple_debug_error("core", "Error writing %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error writing %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", new_name, g_strerror(errno)); fclose(new_file); fclose(fp); @@ -718,7 +718,7 @@ if (fclose(new_file)) { - purple_debug_error("core", "Error writing: %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error writing: %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", new_name, g_strerror(errno)); } if (fclose(fp)) @@ -737,7 +737,7 @@ /* The migration was successful, so delete the status file. */ if (g_unlink(status_file)) { - purple_debug_error("core", "Error unlinking file %s: %s. Please report this at http://developer.pidgin.im\n", + purple_debug_error("core", "Error unlinking file %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", status_file, g_strerror(errno)); g_free(status_file); return FALSE; diff -r 91a021ffca9c -r a4dfc631b140 libpurple/network.c --- a/libpurple/network.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/network.c Mon Oct 27 23:13:11 2008 +0000 @@ -66,6 +66,8 @@ static DBusGConnection *nm_conn = NULL; static DBusGProxy *nm_proxy = NULL; static DBusGProxy *dbus_proxy = NULL; +static NMState nm_state = NM_STATE_UNKNOWN; +static gboolean have_nm_state = FALSE; #elif defined _WIN32 static int current_network_count; @@ -596,13 +598,15 @@ purple_network_is_available(void) { #ifdef HAVE_NETWORKMANAGER - NMState state = nm_get_network_state(); - if (state == NM_STATE_UNKNOWN) + if (!have_nm_state) { - purple_debug_warning("network", "NetworkManager not active. Assuming connection exists.\n"); - return TRUE; + have_nm_state = TRUE; + nm_state = nm_get_network_state(); + if (nm_state == NM_STATE_UNKNOWN) + purple_debug_warning("network", "NetworkManager not active. Assuming connection exists.\n"); } - else if (state == NM_STATE_CONNECTED) + + if (nm_state == NM_STATE_UNKNOWN || nm_state == NM_STATE_CONNECTED) return TRUE; return FALSE; @@ -618,9 +622,12 @@ static void nm_update_state(NMState state) { - static NMState prev = NM_STATE_UNKNOWN; + NMState prev = nm_state; PurpleConnectionUiOps *ui_ops = purple_connections_get_ui_ops(); + have_nm_state = TRUE; + nm_state = state; + purple_signal_emit(purple_network_get_handle(), "network-configuration-changed", NULL); switch(state) @@ -630,16 +637,14 @@ res_init(); if (ui_ops != NULL && ui_ops->network_connected != NULL) ui_ops->network_connected(); - prev = state; break; case NM_STATE_ASLEEP: case NM_STATE_CONNECTING: case NM_STATE_DISCONNECTED: - if (prev != NM_STATE_CONNECTED) + if (prev != NM_STATE_CONNECTED && prev != NM_STATE_UNKNOWN) break; if (ui_ops != NULL && ui_ops->network_disconnected != NULL) ui_ops->network_disconnected(); - prev = state; break; case NM_STATE_UNKNOWN: default: @@ -664,7 +669,6 @@ return NM_STATE_UNKNOWN; if (!dbus_g_proxy_call(nm_proxy, "state", &err, G_TYPE_INVALID, G_TYPE_UINT, &state, G_TYPE_INVALID)) { - /* XXX: Print an error? */ g_error_free(err); return NM_STATE_UNKNOWN; } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/plugins/ssl/Makefile.am --- a/libpurple/plugins/ssl/Makefile.am Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/plugins/ssl/Makefile.am Mon Oct 27 23:13:11 2008 +0000 @@ -9,10 +9,31 @@ if PLUGINS +# I'm sorry to report that Automake Conditionals don't support +# if USE_GNUTLS && USE_NSS +# but only support testing a single variable. Hence: + +if USE_GNUTLS +if USE_NSS plugin_LTLIBRARIES = \ ssl.la \ ssl-gnutls.la \ ssl-nss.la +else +plugin_LTLIBRARIES = \ + ssl.la \ + ssl-gnutls.la +endif +else +if USE_NSS +plugin_LTLIBRARIES = \ + ssl.la \ + ssl-nss.la +else +plugin_LTLIBRARIES = \ + ssl.la +endif +endif ssl_la_SOURCES = ssl.c ssl_gnutls_la_SOURCES = ssl-gnutls.c diff -r 91a021ffca9c -r a4dfc631b140 libpurple/plugins/ssl/ssl-gnutls.c --- a/libpurple/plugins/ssl/ssl-gnutls.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/plugins/ssl/ssl-gnutls.c Mon Oct 27 23:13:11 2008 +0000 @@ -29,8 +29,6 @@ #define SSL_GNUTLS_PLUGIN_ID "ssl-gnutls" -#ifdef HAVE_GNUTLS - #include #include @@ -943,12 +941,9 @@ NULL }; -#endif /* HAVE_GNUTLS */ - static gboolean plugin_load(PurplePlugin *plugin) { -#ifdef HAVE_GNUTLS if(!purple_ssl_get_ops()) { purple_ssl_set_ops(&ssl_ops); } @@ -960,21 +955,16 @@ purple_certificate_register_scheme( &x509_gnutls ); return TRUE; -#else - return FALSE; -#endif } static gboolean plugin_unload(PurplePlugin *plugin) { -#ifdef HAVE_GNUTLS if(purple_ssl_get_ops() == &ssl_ops) { purple_ssl_set_ops(NULL); } purple_certificate_unregister_scheme( &x509_gnutls ); -#endif return TRUE; } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/plugins/ssl/ssl-nss.c --- a/libpurple/plugins/ssl/ssl-nss.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/plugins/ssl/ssl-nss.c Mon Oct 27 23:13:11 2008 +0000 @@ -29,8 +29,6 @@ #define SSL_NSS_PLUGIN_ID "ssl-nss" -#ifdef HAVE_NSS - #undef HAVE_LONG_LONG /* Make Mozilla less angry. If angry, Mozilla SMASH! */ #include @@ -891,13 +889,10 @@ NULL }; -#endif /* HAVE_NSS */ - static gboolean plugin_load(PurplePlugin *plugin) { -#ifdef HAVE_NSS if (!purple_ssl_get_ops()) { purple_ssl_set_ops(&ssl_ops); } @@ -909,22 +904,17 @@ purple_certificate_register_scheme(&x509_nss); return TRUE; -#else - return FALSE; -#endif } static gboolean plugin_unload(PurplePlugin *plugin) { -#ifdef HAVE_NSS if (purple_ssl_get_ops() == &ssl_ops) { purple_ssl_set_ops(NULL); } /* Unregister our X.509 functions */ purple_certificate_unregister_scheme(&x509_nss); -#endif return TRUE; } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/protocols/jabber/iq.c --- a/libpurple/protocols/jabber/iq.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/protocols/jabber/iq.c Mon Oct 27 23:13:11 2008 +0000 @@ -105,8 +105,7 @@ void jabber_iq_set_id(JabberIq *iq, const char *id) { - if(iq->id) - g_free(iq->id); + g_free(iq->id); if(id) { xmlnode_set_attrib(iq->node, "id", id); @@ -320,9 +319,42 @@ from = xmlnode_get_attrib(packet, "from"); id = xmlnode_get_attrib(packet, "id"); + if(type == NULL || !(!strcmp(type, "get") || !strcmp(type, "set") + || !strcmp(type, "result") || !strcmp(type, "error"))) { + purple_debug_error("jabber", "IQ with invalid type ('%s') - ignoring.\n", + type ? type : "(null)"); + return; + } + + /* All IQs must have an ID, so send an error for a set/get that doesn't */ + if(!id || !*id) { + + if(!strcmp(type, "set") || !strcmp(type, "get")) { + JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR); + + xmlnode_free(iq->node); + iq->node = xmlnode_copy(packet); + xmlnode_set_attrib(iq->node, "to", from); + xmlnode_remove_attrib(iq->node, "from"); + xmlnode_set_attrib(iq->node, "type", "error"); + /* This id is clearly not useful, but we must put something there for a valid stanza */ + iq->id = jabber_get_next_id(js); + xmlnode_set_attrib(iq->node, "id", iq->id); + error = xmlnode_new_child(iq->node, "error"); + xmlnode_set_attrib(error, "type", "modify"); + x = xmlnode_new_child(error, "bad-request"); + xmlnode_set_namespace(x, "urn:ietf:params:xml:ns:xmpp-stanzas"); + + jabber_iq_send(iq); + } else + purple_debug_error("jabber", "IQ of type '%s' missing id - ignoring.\n", type); + + return; + } + /* First, lets see if a special callback got registered */ - if(type && (!strcmp(type, "result") || !strcmp(type, "error"))) { + if(!strcmp(type, "result") || !strcmp(type, "error")) { if(id && *id && (jcd = g_hash_table_lookup(js->iq_callbacks, id))) { jcd->callback(js, packet, jcd->data); jabber_iq_remove_callback_by_id(js, id); @@ -332,7 +364,7 @@ /* Apparently not, so lets see if we have a pre-defined handler */ - if(type && query && (xmlns = xmlnode_get_namespace(query))) { + if(query && (xmlns = xmlnode_get_namespace(query))) { if((jih = g_hash_table_lookup(iq_handlers, xmlns))) { jih(js, packet); return; @@ -348,7 +380,7 @@ jabber_gmail_poke(js, packet); return; } - + purple_debug_info("jabber", "jabber_iq_parse\n"); if(xmlnode_get_child_with_namespace(packet, "ping", "urn:xmpp:ping")) { @@ -362,7 +394,7 @@ } /* If we get here, send the default error reply mandated by XMPP-CORE */ - if(type && (!strcmp(type, "set") || !strcmp(type, "get"))) { + if(!strcmp(type, "set") || !strcmp(type, "get")) { JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR); xmlnode_free(iq->node); diff -r 91a021ffca9c -r a4dfc631b140 libpurple/proxy.c --- a/libpurple/proxy.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/proxy.c Mon Oct 27 23:13:11 2008 +0000 @@ -2152,6 +2152,8 @@ break; default: + purple_debug_error("proxy", "Invalid Proxy type (%d) specified.\n", + purple_proxy_info_get_type(connect_data->gpi)); purple_proxy_connect_data_destroy(connect_data); return NULL; } @@ -2160,6 +2162,7 @@ connectport, connection_host_resolved, connect_data); if (connect_data->query_data == NULL) { + purple_debug_error("proxy", "dns query failed unexpectedly.\n"); purple_proxy_connect_data_destroy(connect_data); return NULL; } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/prpl.c --- a/libpurple/prpl.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/prpl.c Mon Oct 27 23:13:11 2008 +0000 @@ -23,6 +23,7 @@ #include "internal.h" #include "conversation.h" #include "debug.h" +#include "network.h" #include "notify.h" #include "prpl.h" #include "request.h" @@ -317,7 +318,8 @@ PurplePluginProtocolInfo *prpl_info; if (purple_status_is_online(new_status) && - purple_account_is_disconnected(account)) + purple_account_is_disconnected(account) && + purple_network_is_available()) { purple_account_connect(account); return; diff -r 91a021ffca9c -r a4dfc631b140 libpurple/server.c --- a/libpurple/server.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/server.c Mon Oct 27 23:13:11 2008 +0000 @@ -261,14 +261,18 @@ conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account); if(conv != NULL && alias != NULL && strcmp(alias, who)) { + char *escaped = g_markup_escape_text(who, -1); + char *escaped2 = g_markup_escape_text(alias, -1); char *tmp = g_strdup_printf(_("%s is now known as %s.\n"), - who, alias); + escaped, escaped2); purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY, time(NULL)); g_free(tmp); + g_free(escaped2); + g_free(escaped); } } } diff -r 91a021ffca9c -r a4dfc631b140 libpurple/util.c --- a/libpurple/util.c Mon Oct 20 18:30:28 2008 +0000 +++ b/libpurple/util.c Mon Oct 27 23:13:11 2008 +0000 @@ -3979,6 +3979,13 @@ callback, user_data); } +static gboolean +url_fetch_connect_failed(gpointer data) +{ + url_fetch_connect_cb(data, -1, ""); + return FALSE; +} + PurpleUtilFetchUrlData * purple_util_fetch_url_request_len(const char *url, gboolean full, const char *user_agent, gboolean http11, @@ -4016,9 +4023,8 @@ if (gfud->connect_data == NULL) { - purple_util_fetch_url_error(gfud, _("Unable to connect to %s"), - gfud->website.address); - return NULL; + /* Trigger the connect_cb asynchronously. */ + purple_timeout_add(10, url_fetch_connect_failed, gfud); } return gfud; diff -r 91a021ffca9c -r a4dfc631b140 pidgin.spec.in --- a/pidgin.spec.in Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin.spec.in Mon Oct 27 23:13:11 2008 +0000 @@ -263,6 +263,7 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/purple-2/libjabber.so rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{perl_archlib}/perllocal.pod +find $RPM_BUILD_ROOT -type f -name '*.a' -exec rm -f {} ';' find $RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} ';' find $RPM_BUILD_ROOT -type f -name '*.bs' -empty -exec rm -f {} ';' diff -r 91a021ffca9c -r a4dfc631b140 pidgin/gtkconn.c --- a/pidgin/gtkconn.c Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin/gtkconn.c Mon Oct 27 23:13:11 2008 +0000 @@ -208,9 +208,7 @@ while (l) { PurpleAccount *a = (PurpleAccount*)l->data; if (!purple_account_is_disconnected(a)) { - purple_connection_error_reason(purple_account_get_connection(a), - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Network disconnected")); + purple_account_disconnect(a); } l = l->next; } diff -r 91a021ffca9c -r a4dfc631b140 pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin/gtkdialogs.c Mon Oct 27 23:13:11 2008 +0000 @@ -69,37 +69,35 @@ /* Order: Alphabetical by Last Name */ static const struct developer developers[] = { - {"Daniel 'datallah' Atallah", N_("developer"), NULL}, - {"John 'rekkanoryo' Bailey", N_("developer"), NULL}, - {"Ethan 'Paco-Paco' Blanton", N_("developer"), NULL}, - {"Thomas Butter", N_("developer"), NULL}, + {"Daniel 'datallah' Atallah", NULL, NULL}, + {"John 'rekkanoryo' Bailey", N_("bug master"), NULL}, + {"Ethan 'Paco-Paco' Blanton", NULL, NULL}, + {"Hylke Bons", N_("artist"), "h.bons@student.rug.nl"}, + {"Thomas Butter", NULL, NULL}, /* feel free to not translate this */ - {N_("Ka-Hing Cheung"), N_("developer"), NULL}, - {"Sadrul Habib Chowdhury", N_("developer"), NULL}, - {"Mark 'KingAnt' Doliner", N_("developer"), "mark@kingant.net"}, - {"Sean Egan", N_("developer"), "sean.egan@gmail.com"}, - {"Casey Harkins", N_("developer"), NULL}, - {"Gary 'grim' Kramlich", N_("developer"), NULL}, - {"Richard 'rlaager' Laager", N_("developer"), NULL}, - {"Richard 'wabz' Nelson", N_("developer"), NULL}, - {"Christopher 'siege' O'Brien", N_("developer"), "taliesein@users.sf.net"}, - {"Bartosz Oler", N_("developer"), NULL}, - {"Etan 'deryni' Reisner", N_("developer"), NULL}, - {"Tim 'marv' Ringenbach", N_("developer"), NULL}, - {"Elliott 'QuLogic' Sales de Andrade", N_("developer"), NULL}, + {N_("Ka-Hing Cheung"), NULL, NULL}, + {"Sadrul Habib Chowdhury", NULL, NULL}, + {"Mark 'KingAnt' Doliner", NULL, "mark@kingant.net"}, + {"Sean Egan", NULL, "sean.egan@gmail.com"}, + {"Casey Harkins", NULL, NULL}, + {"Gary 'grim' Kramlich", NULL, NULL}, + {"Richard 'rlaager' Laager", NULL, NULL}, + {"Richard 'wabz' Nelson", NULL, NULL}, + {"Christopher 'siege' O'Brien", NULL, "taliesein@users.sf.net"}, + {"Bartosz Oler", NULL, NULL}, + {"Etan 'deryni' Reisner", NULL, NULL}, + {"Tim 'marv' Ringenbach", NULL, NULL}, + {"Elliott 'QuLogic' Sales de Andrade", NULL, NULL}, {"Luke 'LSchiere' Schierer", N_("support"), "lschiere@users.sf.net"}, - {"Megan 'Cae' Schneider", N_("support/QA"), NULL}, - {"Evan Schoenberg", N_("developer"), NULL}, - {"Kevin 'SimGuy' Stange", N_("developer & webmaster"), NULL}, - {"Will 'resiak' Thompson", N_("developer"), NULL}, - {"Stu 'nosnilmot' Tomlinson", N_("developer"), NULL}, - {"Nathan 'faceprint' Walp", N_("developer"), NULL}, + {"Evan Schoenberg", NULL, NULL}, + {"Kevin 'SimGuy' Stange", N_("webmaster"), NULL}, + {"Will 'resiak' Thompson", NULL, NULL}, + {"Stu 'nosnilmot' Tomlinson", NULL, NULL}, {NULL, NULL, NULL} }; /* Order: Alphabetical by Last Name */ static const struct developer patch_writers[] = { - {"Felipe 'shx' Contreras", NULL, NULL}, {"Marcus 'malu' Lundblad", NULL, NULL}, {"Dennis 'EvilDennisR' Ristuccia", N_("Senior Contributor/QA"), NULL}, {"Peter 'Fmoo' Ruibal", NULL, NULL}, @@ -114,17 +112,20 @@ {"Jim Duchek", N_("maintainer"), "jim@linuxpimps.com"}, {"Rob Flynn", N_("maintainer"), NULL}, {"Adam Fritzler", N_("libfaim maintainer"), NULL}, - {"Christian 'ChipX86' Hammond", N_("developer & webmaster"), NULL}, + {"Christian 'ChipX86' Hammond", N_("webmaster"), NULL}, /* If "lazy bum" translates literally into a serious insult, use something else or omit it. */ {"Syd Logan", N_("hacker and designated driver [lazy bum]"), NULL}, - {"Jim Seymour", N_("XMPP developer"), NULL}, + {"Megan 'Cae' Schneider", N_("support/QA"), NULL}, + {"Jim Seymour", N_("XMPP"), NULL}, {"Mark Spencer", N_("original author"), "markster@marko.net"}, + {"Nathan 'faceprint' Walp", NULL, NULL}, {"Eric Warmenhoven", N_("lead developer"), "warmenhoven@yahoo.com"}, {NULL, NULL, NULL} }; /* Order: Alphabetical by Last Name */ static const struct developer retired_patch_writers[] = { + {"Felipe 'shx' Contreras", NULL, NULL}, {"Decklin Foster", NULL, NULL}, {"Peter 'Bleeter' Lawler", NULL, NULL}, {"Robert 'Robot101' McQueen", NULL, NULL}, @@ -193,7 +194,7 @@ {N_("Macedonian"), "mk", "Arangel Angov ", "arangel@linux.net.mk"}, {N_("Macedonian"), "mk", "Ivana Kirkovska", "ivana.kirkovska@gmail.com"}, {N_("Macedonian"), "mk", "Jovan Naumovski", "jovan@lugola.net"}, - {"Mongolian", "mn", "gooyo"}, + {"Mongolian", "mn", "gooyo", NULL}, {N_("Bokmål Norwegian"), "nb", "Espen Stefansen", "espenas@gmail.com"}, {N_("Nepali"), "ne", "Shyam Krishna Bal", "shyamkrishna_bal@yahoo.com"}, {N_("Dutch, Flemish"), "nl", "Vincent van Adrighem", "V.vanAdrighem@dirck.mine.nu"}, @@ -285,11 +286,6 @@ {NULL, NULL, NULL, NULL} }; -static const struct artist artists[] = { - {"Hylke Bons", "h.bons@student.rug.nl"}, - {NULL, NULL} -}; - void pidgin_dialogs_destroy_all() { @@ -428,12 +424,17 @@ _("Current Developers")); for (i = 0; developers[i].name != NULL; i++) { if (developers[i].email != NULL) { - g_string_append_printf(str, " %s (%s) <%s>
", - _(developers[i].name), _(developers[i].role), - developers[i].email, developers[i].email); + g_string_append_printf(str, " %s%s%s%s
", + developers[i].email, _(developers[i].name), + developers[i].role ? " (" : "", + developers[i].role ? _(developers[i].role) : "", + developers[i].role ? ")" : ""); } else { - g_string_append_printf(str, " %s (%s)
", - _(developers[i].name), _(developers[i].role)); + g_string_append_printf(str, " %s%s%s%s
", + _(developers[i].name), + developers[i].role ? " (" : "", + developers[i].role ? _(developers[i].role) : "", + developers[i].role ? ")" : ""); } } g_string_append(str, "
"); @@ -443,12 +444,17 @@ _("Crazy Patch Writers")); for (i = 0; patch_writers[i].name != NULL; i++) { if (patch_writers[i].email != NULL) { - g_string_append_printf(str, " %s <%s>
", - patch_writers[i].name, - patch_writers[i].email, patch_writers[i].email); + g_string_append_printf(str, " %s%s%s%s
", + patch_writers[i].email, _(patch_writers[i].name), + patch_writers[i].role ? " (" : "", + patch_writers[i].role ? _(patch_writers[i].role) : "", + patch_writers[i].role ? ")" : ""); } else { - g_string_append_printf(str, " %s
", - patch_writers[i].name); + g_string_append_printf(str, " %s%s%s%s
", + _(patch_writers[i].name), + patch_writers[i].role ? " (" : "", + patch_writers[i].role ? _(patch_writers[i].role) : "", + patch_writers[i].role ? ")" : ""); } } g_string_append(str, "
"); @@ -458,12 +464,17 @@ _("Retired Developers")); for (i = 0; retired_developers[i].name != NULL; i++) { if (retired_developers[i].email != NULL) { - g_string_append_printf(str, " %s (%s) <%s>
", - retired_developers[i].name, _(retired_developers[i].role), - retired_developers[i].email, retired_developers[i].email); + g_string_append_printf(str, " %s%s%s%s
", + retired_developers[i].email, _(retired_developers[i].name), + retired_developers[i].role ? " (" : "", + retired_developers[i].role ? _(retired_developers[i].role) : "", + retired_developers[i].role ? ")" : ""); } else { - g_string_append_printf(str, " %s (%s)
", - retired_developers[i].name, _(retired_developers[i].role)); + g_string_append_printf(str, " %s%s%s%s
", + _(retired_developers[i].name), + retired_developers[i].role ? " (" : "", + retired_developers[i].role ? _(retired_developers[i].role) : "", + retired_developers[i].role ? ")" : ""); } } g_string_append(str, "
"); @@ -473,42 +484,31 @@ _("Retired Crazy Patch Writers")); for (i = 0; retired_patch_writers[i].name != NULL; i++) { if (retired_patch_writers[i].email != NULL) { - g_string_append_printf(str, " %s <%s>
", - retired_patch_writers[i].name, - retired_patch_writers[i].email, retired_patch_writers[i].email); + g_string_append_printf(str, " %s%s%s%s
", + retired_patch_writers[i].email, _(retired_patch_writers[i].name), + retired_patch_writers[i].role ? " (" : "", + retired_patch_writers[i].role ? _(retired_patch_writers[i].role) : "", + retired_patch_writers[i].role ? ")" : ""); } else { - g_string_append_printf(str, " %s
", - retired_patch_writers[i].name); + g_string_append_printf(str, " %s%s%s%s
", + _(retired_patch_writers[i].name), + retired_patch_writers[i].role ? " (" : "", + retired_patch_writers[i].role ? _(retired_patch_writers[i].role) : "", + retired_patch_writers[i].role ? ")" : ""); } } g_string_append(str, "
"); - - /* Artists */ - g_string_append_printf(str, "%s:
", - _("Artists")); - for (i = 0; artists[i].name != NULL; i++) { - if (artists[i].email != NULL) { - g_string_append_printf(str, " %s <%s>
", - artists[i].name, - artists[i].email, artists[i].email); - } else { - g_string_append_printf(str, " %s
", - artists[i].name); - } - } - g_string_append(str, "
"); /* Current Translators */ g_string_append_printf(str, "%s:
", _("Current Translators")); for (i = 0; current_translators[i].language != NULL; i++) { if (current_translators[i].email != NULL) { - g_string_append_printf(str, " %s (%s) - %s <%s>
", + g_string_append_printf(str, " %s (%s) - %s
", _(current_translators[i].language), current_translators[i].abbr, - _(current_translators[i].name), current_translators[i].email, - current_translators[i].email); + _(current_translators[i].name)); } else { g_string_append_printf(str, " %s (%s) - %s
", _(current_translators[i].language), @@ -523,12 +523,11 @@ _("Past Translators")); for (i = 0; past_translators[i].language != NULL; i++) { if (past_translators[i].email != NULL) { - g_string_append_printf(str, " %s (%s) - %s <%s>
", + g_string_append_printf(str, " %s (%s) - %s
", _(past_translators[i].language), past_translators[i].abbr, - _(past_translators[i].name), past_translators[i].email, - past_translators[i].email); + _(past_translators[i].name)); } else { g_string_append_printf(str, " %s (%s) - %s
", _(past_translators[i].language), diff -r 91a021ffca9c -r a4dfc631b140 pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin/gtkimhtml.c Mon Oct 27 23:13:11 2008 +0000 @@ -348,9 +348,7 @@ g_string_free (t->values, TRUE); g_free (t->children); } - if (t && t->image) { - t->image->imhtml = NULL; - } + g_free (t); } } @@ -2522,6 +2520,78 @@ } } +/* CSS colors are either rgb (x,y,z) or #hex + * we need to convert to hex if it is RGB */ +static gchar* +parse_css_color(gchar *in_color) +{ + char *tmp = in_color; + + if (*tmp == 'r' && *(++tmp) == 'g' && *(++tmp) == 'b' && *(++tmp)) { + int rgbval[] = {0, 0, 0}; + int count = 0; + const char *v_start; + + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + if (*tmp != '(') { + /* We don't support rgba() */ + purple_debug_warning("gtkimhtml", "Invalid rgb CSS color in '%s'!\n", in_color); + return in_color; + } + tmp++; + + while (count < 3) { + /* Skip any leading spaces */ + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + + /* Find the subsequent contiguous digits */ + v_start = tmp; + if (*v_start == '-') + tmp++; + while (*tmp && g_ascii_isdigit(*tmp)) + tmp++; + + if (tmp != v_start) { + char prev = *tmp; + *tmp = '\0'; + rgbval[count] = atoi(v_start); + *tmp = prev; + + /* deal with % */ + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + if (*tmp == '%') { + rgbval[count] = (rgbval[count] / 100.0) * 255; + tmp++; + } + } else { + purple_debug_warning("gtkimhtml", "Invalid rgb CSS color in '%s'!\n", in_color); + return in_color; + } + + if (rgbval[count] > 255) { + rgbval[count] = 255; + } else if (rgbval[count] < 0) { + rgbval[count] = 0; + } + + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + if (*tmp == ',') + tmp++; + + count++; + } + + g_free(in_color); + return g_strdup_printf("#%02X%02X%02X", rgbval[0], rgbval[1], rgbval[2]); + } + + return in_color; +} + void gtk_imhtml_insert_html_at_iter(GtkIMHtml *imhtml, const gchar *text, GtkIMHtmlOptions options, @@ -2982,7 +3052,7 @@ oldfont = fonts->data; if (color && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_FORECOLOR)) { - font->fore = color; + font->fore = parse_css_color(color); gtk_imhtml_toggle_forecolor(imhtml, font->fore); } else { if (oldfont && oldfont->fore) @@ -2991,7 +3061,7 @@ } if (background && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_BACKCOLOR)) { - font->back = background; + font->back = parse_css_color(background); gtk_imhtml_toggle_backcolor(imhtml, font->back); } else { if (oldfont && oldfont->back) diff -r 91a021ffca9c -r a4dfc631b140 pidgin/gtkstatusbox.c --- a/pidgin/gtkstatusbox.c Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin/gtkstatusbox.c Mon Oct 27 23:13:11 2008 +0000 @@ -397,7 +397,8 @@ status_box->icon_box = gtk_event_box_new(); gtk_widget_set_parent(status_box->icon_box, GTK_WIDGET(status_box)); gtk_widget_show(status_box->icon_box); -#if 0 + +#if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(status_box->icon_box, status_box->account ? _("Click to change your buddyicon for this account.") : _("Click to change your buddyicon for all accounts.")); diff -r 91a021ffca9c -r a4dfc631b140 pidgin/plugins/notify.c --- a/pidgin/plugins/notify.c Mon Oct 20 18:30:28 2008 +0000 +++ b/pidgin/plugins/notify.c Mon Oct 27 23:13:11 2008 +0000 @@ -766,8 +766,7 @@ /* Urgent method button */ toggle = gtk_check_button_new_with_mnemonic(_("Set window manager \"_URGENT\" hint")); #else - /* TODO: When we're not string frozen, mark for translation */ - toggle = gtk_check_button_new_with_mnemonic("_Flash window"); + toggle = gtk_check_button_new_with_mnemonic(_("_Flash window")); #endif gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), diff -r 91a021ffca9c -r a4dfc631b140 share/ca-certs/Makefile.am --- a/share/ca-certs/Makefile.am Mon Oct 20 18:30:28 2008 +0000 +++ b/share/ca-certs/Makefile.am Mon Oct 27 23:13:11 2008 +0000 @@ -3,6 +3,7 @@ CAcert_Class3.pem \ Equifax_Secure_CA.pem \ GTE_CyberTrust_Global_Root.pem \ + Microsoft_Internet_Authority.pem \ Microsoft_Secure_Server_Authority.pem \ StartCom_Free_SSL_CA.pem \ Verisign_RSA_Secure_Server_CA.pem \ diff -r 91a021ffca9c -r a4dfc631b140 share/ca-certs/Microsoft_Internet_Authority.pem --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/ca-certs/Microsoft_Internet_Authority.pem Mon Oct 27 23:13:11 2008 +0000 @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIECzCCA3SgAwIBAgIEBAAD/jANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MB4XDTA2MDQxOTE0MzUwMFoXDTA5MDQxOTIzNTkwMFowJzElMCMG +A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALUIbk0YdsTXnGPswqx8d/Ntrsjy8Wau8cKHBGBu +KZwAZe5qW+QOU4gRxiKbM/trspEu1lObU77PVtiZSqFQMkXOYNLhlq1a/eqh68RJ +Jxxev9KWmfppQ388ONqhi8wziHoXc66RUCiqabp751dbmwnnTN6GfIR952Zg+ab1 +wmGL3o7B1efCMCI9LIMKsId16yHiXKbTBHuWnkAe4Qx2BMAgoJQQ21EbTBhyvCfd +EiRdOdYo1OTe2xih4JUPmXf7xPNDjMCrpjEJ8woxgCnH12z7PNPqwrhnFe/6808t +axy4iNgObXcZS3ERcZBA9RFT1z3onQ2E2plkaBPmZQPiZu0CAwEAAaOCAXAwggFs +MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0LmNvbS9j +Z2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFDNf3Q+3nFzO7ofdcHCL +X33PIry5MFQGA1UdIARNMEswSQYKKoZIhvhjAQIBBTA7MDkGCCsGAQUFBwIBFi1o +dHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwgYkG +A1UdIwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBv +cmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4x +IzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTAOBgNVHQ8B +Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBAjANBgkqhkiG9w0BAQUFAAOBgQBj +SQlU7cXbnngZAIOa4zci+1Z2XFTTyOFc/Tfc0qU/xVWPZPBJdx2UVk2yCwmIHFBY +OJSQC+7Kn7GE5nE3rBAyBrnB0oymBcBeD8tT3B4B31jHfnFgsC9UYin9uJN144+e +tbzOegUg4qaNApAaWGre3YY7ALn1y/6XgqIEIEZcCQ== +-----END CERTIFICATE----- diff -r 91a021ffca9c -r a4dfc631b140 share/ca-certs/Microsoft_Secure_Server_Authority.pem --- a/share/ca-certs/Microsoft_Secure_Server_Authority.pem Mon Oct 20 18:30:28 2008 +0000 +++ b/share/ca-certs/Microsoft_Secure_Server_Authority.pem Mon Oct 27 23:13:11 2008 +0000 @@ -1,28 +1,30 @@ -----BEGIN CERTIFICATE----- -MIIE1TCCA72gAwIBAgIKYSsApAADAAAAFDANBgkqhkiG9w0BAQUFADAnMSUwIwYD -VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA2MDQyMTE5MTEw -NFoXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ +MIIFEzCCA/ugAwIBAgIKYQVOAQADAAAAHDANBgkqhkiG9w0BAQUFADAnMSUwIwYD +VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA3MDkyODIyMDYz +N1oXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ kiaJk/IsZAEZFgltaWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYK CZImiZPyLGQBGRYHcmVkbW9uZDEqMCgGA1UEAxMhTWljcm9zb2Z0IFNlY3VyZSBT ZXJ2ZXIgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -syn2tJzCJKsQy98cYrzBT0qMSqTMibRel34u64jqd1GKP9cRMHagyNLZIb1rv8NZ -XPdf2uI8hGc4lxRh4iprbFPOZSiHQIyq9zoqLS7Bh/KnqnRX4CCntCQbWVa/s5c5 -FbGD5XG5AvA8sjn56WPotYLGeWrSZ/k2bcH9YgvQ2Yrt8t1VxPQciSuX82KSn2Kx -xxJKgQtAgZpyekR5QdIUUvQsEAPaCfWRsF/OMQoyc4UeAxAELavr2vlq869ye3Fu -f3fUhVEk8kxtiVPYWYBTAhWts62pEwaKGPteMsGnvbX+BRgIwc55vfs6KWXxnBUL -9Q8BfQQLbT8nQe7hO4XXMQIDAQABo4IBnDCCAZgwEgYDVR0TAQH/BAgwBgEB/wIB -ATAdBgNVHQ4EFgQUp08F+9GOQVM3lcpL4UMfWutNzVAwCwYDVR0PBAQDAgGGMBIG -CSsGAQQBgjcVAQQFAgMDAAMwIwYJKwYBBAGCNxUCBBYEFMnAnEM4ke3T6fpSclUI -g7XN8o57MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf -3Q+3nFzO7ofdcHCLX33PIry5MGYGA1UdHwRfMF0wW6BZoFeGNGh0dHA6Ly9jcmwu -bWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9tc3d3dygzKS5jcmyGH2h0dHA6 -Ly9jb3JwcGtpL2NybC9tc3d3dygzKS5jcmwweQYIKwYBBQUHAQEEbTBrMDwGCCsG -AQUFBzAChjBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9tc3d3 -dygzKS5jcnQwKwYIKwYBBQUHMAKGH2h0dHA6Ly9jb3JwcGtpL2FpYS9tc3d3dygz -KS5jcnQwDQYJKoZIhvcNAQEFBQADggEBAIJDQpkqhodC3ZmKPB4dTveoFCpuc4C0 -qdXPLggvRiTnQJP/SRdnfQwkaulDS3771zWo3fO1/tTiCmVvtU4LNbISpQmrz41q -AP2QIUl/d4Fjiaz0qchNxmTRlVLGsTrwkMMkOh9MUQEcNyk9RuGepf/1+66qeEnx -eCgK09yIcbgdE9ffk5ueTX7TNfgoNZO9ORnRS1p7nra3b0Wi1kdGqDmbpw7We+M8 -6B8VpPa0QaofgRdl2dzOijd7hGN+cgRNMvdGpRxzkaWUA52rBOrEVyJLu2IUksPV -0Q/0ZZMNZXJh8MmWW/o8ebQZJQshN5p4M7HiUN/cZ2onnrdZSpIwyAU= +xcCphW3RnMyuq1EAwlSsUghQUuCSQAaeFBTro1qbeCJEALHQGrXg8SMnY9Om64WG +PnB9HhOb1LTOdkMVx6a3GU0mcv+LkefcW/CewIMfDXPoeGA4ULmY9wbraPwJY8Ba +H3PAvOVSTJ0k9ZX6tXjE0D/214kn0+ZN+Y+ZwoqFC5/lgQyUxxgfVA0FsR/NDNF6 +keBsoNz2vPghAsruLhkON+5KGQo0o+T+XcJ7xNs7eJR7MWZn2rNCM1J+qrR0o2vG +vz8QBSKogUXiPRXYVkNSkBEFZqGvEob1pDwC5fJEP71J6xEJHsSe0pcaa637RU04 +4BsjRHqJE3Rrlurb6Fc8vQIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB +ATAdBgNVHQ4EFgQUmY+l9x6Bb/p5wvAWP7JUsQhoR1UwCwYDVR0PBAQDAgGGMBIG +CSsGAQQBgjcVAQQFAgMEAAQwIwYJKwYBBAGCNxUCBBYEFBOB4Tms57aqAqhuDUms +pmqjrALsMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf +3Q+3nFzO7ofdcHCLX33PIry5MIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6 +Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDMpLmNy +bIY0aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3 +KDMpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDMpLmNybDB5BggrBgEF +BQcBAQRtMGswPAYIKwYBBQUHMAKGMGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w +a2kvbXNjb3JwL21zd3d3KDMpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw +a2kvYWlhL21zd3d3KDMpLmNydDANBgkqhkiG9w0BAQUFAAOCAQEARSzU1qmSJczv +IiFrscxgYtzXekBWgm2rYVIqN996H5ZfMDaso0tZXmhWo0zX0z0r0H+IIGtJ+4D9 +t6dMTpB26jV/5EtMbtQu48ryCkMHBKNtCn7pQ5Mq2gqjq84KrVUlBFfPT4z4+Hqp +Q6gVghMggWNtiujdHh7w4ja3OqHkFZTX/wUSTb+BtH+GBZKYAGU6duakb3D0piFu +W5W6gZ4j15R12ys3ZYTKThZjW5blolA0lzuCSghoSfJHRA4jChIzDNojkf7OxqJw +yFl8+++iZwTiulCTgOucJxGCT1tEEwdfX2c+XKyJIS/d5Ndtk91WEWU+TzqX9ZT4 +SAMJpIZ1pg== -----END CERTIFICATE-----