From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Nicolas Petton Newsgroups: gmane.emacs.bugs Subject: bug#27584: 26.0.50; alist-get: Add optional arg TESTFN Date: Fri, 07 Jul 2017 21:47:03 +0200 Message-ID: <8737a858so.fsf@petton.fr> References: <87tw2rva7v.fsf@calancha-pc> <87mv8j6y1z.fsf@petton.fr> <87y3s2m76v.fsf@calancha-pc> <8760f562bo.fsf@petton.fr> <877ezk3g4p.fsf@calancha-pc> <874luovf7a.fsf@petton.fr> <87shi8tzkr.fsf@petton.fr> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-Trace: blaine.gmane.org 1499456901 5285 195.159.176.226 (7 Jul 2017 19:48:21 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 7 Jul 2017 19:48:21 +0000 (UTC) Cc: 27584@debbugs.gnu.org, Tino Calancha To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Jul 07 21:48:17 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dTZEb-0000rJ-4z for geb-bug-gnu-emacs@m.gmane.org; Fri, 07 Jul 2017 21:48:13 +0200 Original-Received: from localhost ([::1]:58550 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dTZEf-0006Ym-2C for geb-bug-gnu-emacs@m.gmane.org; Fri, 07 Jul 2017 15:48:17 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59017) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dTZEU-0006Y8-7A for bug-gnu-emacs@gnu.org; Fri, 07 Jul 2017 15:48:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dTZEQ-0007H5-VZ for bug-gnu-emacs@gnu.org; Fri, 07 Jul 2017 15:48:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:54419) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dTZEQ-0007Gq-OI for bug-gnu-emacs@gnu.org; Fri, 07 Jul 2017 15:48:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dTZEQ-0002Tg-FX for bug-gnu-emacs@gnu.org; Fri, 07 Jul 2017 15:48:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Nicolas Petton Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 07 Jul 2017 19:48:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 27584 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 27584-submit@debbugs.gnu.org id=B27584.14994568399472 (code B ref 27584); Fri, 07 Jul 2017 19:48:02 +0000 Original-Received: (at 27584) by debbugs.gnu.org; 7 Jul 2017 19:47:19 +0000 Original-Received: from localhost ([127.0.0.1]:57096 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dTZDi-0002Sh-Iv for submit@debbugs.gnu.org; Fri, 07 Jul 2017 15:47:19 -0400 Original-Received: from petton.fr ([89.234.186.68]:47512) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dTZDg-0002ST-AS for 27584@debbugs.gnu.org; Fri, 07 Jul 2017 15:47:17 -0400 In-Reply-To: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=petton.fr; s=mail; t=1499456826; bh=pJk5/IPM6At2tGN7WxzxFSIZWyzMT+EBK+bX0axmRPg=; h=From:To:Cc:Subject:In-Reply-To:References:Date:Message-ID:MIME-Version:Content-Type; b=jAXJizbZ0kZVOPDQExoTWFZlTmcGxTd3chael1W4N7HGbjfeBFFwInFqpVOmapLo9pf68aFbQ/IuIRHvkOZypBBkfyXXF3doPZtZEsAUljrghq+PF3HzhkyO+K2dd2haPOJFxknEROuXwdsVyjUAEKJCdH2JttXp2REmXySapcE= X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:134316 Archived-At: --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Stefan Monnier writes: > It's like "faire d'une pierre deux coups", which you could also relate > to "buy one get one free". So, yes, it's a good thing to kill two birds > in a shot. Now that I know it's a good things to kill birds, what about the patch below, and then applyind a modified version of your patch, Tino? From=200ac5e42962fde069680fefeddc3ab589fe4b6d6c Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Fri, 7 Jul 2017 21:21:55 +0200 Subject: [PATCH] Add an optional testfn parameter to assoc * src/fns.c (assoc): New optional testfn parameter used for comparison when provided. * test/src/fns-tests.el (test-assoc-testfn): Add tests for the new 'testfn' parameter. * src/buffer.c: * src/coding.c: * src/dbusbind.c: * src/font.c: * src/fontset.c: * src/gfilenotify.c: * src/image.c: * src/keymap.c: * src/process.c: * src/w32fns.c: * src/w32font.c: * src/w32notify.c: * src/w32term.c: * src/xdisp.c: * src/xfont.c: Add a third argument to Fassoc calls. * etc/NEWS: * doc/lispref/lists.texi: Document the new 'testfn' parameter. =2D-- doc/lispref/lists.texi | 18 +++++++++--------- etc/NEWS | 5 +++++ src/buffer.c | 2 +- src/coding.c | 6 +++--- src/dbusbind.c | 6 +++--- src/fns.c | 23 ++++++++++++++++------- src/font.c | 2 +- src/fontset.c | 2 +- src/gfilenotify.c | 2 +- src/image.c | 2 +- src/keymap.c | 2 +- src/process.c | 2 +- src/w32fns.c | 2 +- src/w32font.c | 2 +- src/w32notify.c | 4 ++-- src/w32term.c | 2 +- src/xdisp.c | 6 +++--- src/xfont.c | 3 ++- test/src/fns-tests.el | 6 ++++++ 19 files changed, 59 insertions(+), 38 deletions(-) diff --git a/doc/lispref/lists.texi b/doc/lispref/lists.texi index 8eab281..966d8f1 100644 =2D-- a/doc/lispref/lists.texi +++ b/doc/lispref/lists.texi @@ -1511,12 +1511,12 @@ Association Lists each key can occur only once. @xref{Property Lists}, for a comparison of property lists and association lists. =20 =2D@defun assoc key alist +@defun assoc key alist &optional testfn This function returns the first association for @var{key} in @var{alist}, comparing @var{key} against the alist elements using =2D@code{equal} (@pxref{Equality Predicates}). It returns @code{nil} if no =2Dassociation in @var{alist} has a @sc{car} @code{equal} to @var{key}. =2DFor example: +@var{testfn} if non-nil, or @code{equal} if nil (@pxref{Equality +Predicates}). It returns @code{nil} if no association in @var{alist} +has a @sc{car} equal to @var{key}. For example: =20 @smallexample (setq trees '((pine . cones) (oak . acorns) (maple . seeds))) @@ -1561,11 +1561,11 @@ Association Lists @defun assq key alist This function is like @code{assoc} in that it returns the first association for @var{key} in @var{alist}, but it makes the comparison =2Dusing @code{eq} instead of @code{equal}. @code{assq} returns @code{nil} =2Dif no association in @var{alist} has a @sc{car} @code{eq} to @var{key}. =2DThis function is used more often than @code{assoc}, since @code{eq} is =2Dfaster than @code{equal} and most alists use symbols as keys. =2D@xref{Equality Predicates}. +using @code{eq}. @code{assq} returns @code{nil} if no association in +@var{alist} has a @sc{car} @code{eq} to @var{key}. This function is +used more often than @code{assoc}, since @code{eq} is faster than +@code{equal} and most alists use symbols as keys. @xref{Equality +Predicates}. =20 @smallexample (setq trees '((pine . cones) (oak . acorns) (maple . seeds))) diff --git a/etc/NEWS b/etc/NEWS index 13805ce..d7a6f29 100644 =2D-- a/etc/NEWS +++ b/etc/NEWS @@ -100,6 +100,11 @@ required capabilities are found in terminfo. See the = FAQ node * Changes in Emacs 26.1 =20 ++++ +** The function 'assoc' now takes an optional third argument 'testfn'. +This argument, when non-nil, is used for comparison instead of +'equal'. + ** The variable 'emacs-version' no longer includes the build number. This is now stored separately in a new variable, 'emacs-build-number'. =20 diff --git a/src/buffer.c b/src/buffer.c index 80dbd33..bf49d61 100644 =2D-- a/src/buffer.c +++ b/src/buffer.c @@ -1164,7 +1164,7 @@ buffer_local_value (Lisp_Object variable, Lisp_Object= buffer) { /* Look in local_var_alist. */ struct Lisp_Buffer_Local_Value *blv =3D SYMBOL_BLV (sym); XSETSYMBOL (variable, sym); /* Update In case of aliasing. */ =2D result =3D Fassoc (variable, BVAR (buf, local_var_alist)); + result =3D Fassoc (variable, BVAR (buf, local_var_alist), Qnil); if (!NILP (result)) { if (blv->fwd) diff --git a/src/coding.c b/src/coding.c index 5682fc0..50ad206 100644 =2D-- a/src/coding.c +++ b/src/coding.c @@ -10539,7 +10539,7 @@ usage: (define-coding-system-internal ...) */) ASET (this_spec, 2, this_eol_type); Fputhash (this_name, this_spec, Vcoding_system_hash_table); Vcoding_system_list =3D Fcons (this_name, Vcoding_system_list); =2D val =3D Fassoc (Fsymbol_name (this_name), Vcoding_system_alist); + val =3D Fassoc (Fsymbol_name (this_name), Vcoding_system_alist, Qnil); if (NILP (val)) Vcoding_system_alist =3D Fcons (Fcons (Fsymbol_name (this_name), Qnil), @@ -10554,7 +10554,7 @@ usage: (define-coding-system-internal ...) */) =20 Fputhash (name, spec_vec, Vcoding_system_hash_table); Vcoding_system_list =3D Fcons (name, Vcoding_system_list); =2D val =3D Fassoc (Fsymbol_name (name), Vcoding_system_alist); + val =3D Fassoc (Fsymbol_name (name), Vcoding_system_alist, Qnil); if (NILP (val)) Vcoding_system_alist =3D Fcons (Fcons (Fsymbol_name (name), Qnil), Vcoding_system_alist); @@ -10662,7 +10662,7 @@ DEFUN ("define-coding-system-alias", Fdefine_coding= _system_alias, =20 Fputhash (alias, spec, Vcoding_system_hash_table); Vcoding_system_list =3D Fcons (alias, Vcoding_system_list); =2D val =3D Fassoc (Fsymbol_name (alias), Vcoding_system_alist); + val =3D Fassoc (Fsymbol_name (alias), Vcoding_system_alist, Qnil); if (NILP (val)) Vcoding_system_alist =3D Fcons (Fcons (Fsymbol_name (alias), Qnil), Vcoding_system_alist); diff --git a/src/dbusbind.c b/src/dbusbind.c index d2460fd..0d9d3e5 100644 =2D-- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -955,7 +955,7 @@ xd_get_connection_address (Lisp_Object bus) DBusConnection *connection; Lisp_Object val; =20 =2D val =3D CDR_SAFE (Fassoc (bus, xd_registered_buses)); + val =3D CDR_SAFE (Fassoc (bus, xd_registered_buses, Qnil)); if (NILP (val)) XD_SIGNAL2 (build_string ("No connection to bus"), bus); else @@ -1057,7 +1057,7 @@ xd_close_bus (Lisp_Object bus) Lisp_Object busobj; =20 /* Check whether we are connected. */ =2D val =3D Fassoc (bus, xd_registered_buses); + val =3D Fassoc (bus, xd_registered_buses, Qnil); if (NILP (val)) return; =20 @@ -1127,7 +1127,7 @@ this connection to those buses. */) xd_close_bus (bus); =20 /* Check, whether we are still connected. */ =2D val =3D Fassoc (bus, xd_registered_buses); + val =3D Fassoc (bus, xd_registered_buses, Qnil); if (!NILP (val)) { connection =3D xd_get_connection_address (bus); diff --git a/src/fns.c b/src/fns.c index 6610d2a..6f4fb87 100644 =2D-- a/src/fns.c +++ b/src/fns.c @@ -1417,18 +1417,27 @@ assq_no_quit (Lisp_Object key, Lisp_Object list) return Qnil; } =20 =2DDEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0, =2D doc: /* Return non-nil if KEY is `equal' to the car of an element= of LIST. =2DThe value is actually the first element of LIST whose car equals KEY. *= /) =2D (Lisp_Object key, Lisp_Object list) +DEFUN ("assoc", Fassoc, Sassoc, 2, 3, 0, + doc: /* Return non-nil if KEY is equal to the car of an element of = LIST. +The value is actually the first element of LIST whose car equals KEY. + +Equality is defined by TESTFN if non-nil or by `equal' if nil. */) + (Lisp_Object key, Lisp_Object list, Lisp_Object testfn) { Lisp_Object tail =3D list; FOR_EACH_TAIL (tail) { Lisp_Object car =3D XCAR (tail); =2D if (CONSP (car) =2D && (EQ (XCAR (car), key) || !NILP (Fequal (XCAR (car), key)))) =2D return car; + if (NILP (testfn)) + { + if (CONSP (car) + && (EQ (XCAR (car), key) || !NILP (Fequal (XCAR (car), key)))) + return car; + } + else if (CONSP (car) && (!NILP (call2 (testfn, (XCAR (car)), key)))) + { + return car; + } } CHECK_LIST_END (tail, list); return Qnil; diff --git a/src/font.c b/src/font.c index 5a3f271..a5e5b6a 100644 =2D-- a/src/font.c +++ b/src/font.c @@ -1893,7 +1893,7 @@ otf_tag_symbol (OTF_Tag tag) static OTF * otf_open (Lisp_Object file) { =2D Lisp_Object val =3D Fassoc (file, otf_list); + Lisp_Object val =3D Fassoc (file, otf_list, Qnil); OTF *otf; =20 if (! NILP (val)) diff --git a/src/fontset.c b/src/fontset.c index 850558b..7401806 100644 =2D-- a/src/fontset.c +++ b/src/fontset.c @@ -1186,7 +1186,7 @@ fs_query_fontset (Lisp_Object name, int name_pattern) { tem =3D Frassoc (name, Vfontset_alias_alist); if (NILP (tem)) =2D tem =3D Fassoc (name, Vfontset_alias_alist); + tem =3D Fassoc (name, Vfontset_alias_alist, Qnil); if (CONSP (tem) && STRINGP (XCAR (tem))) name =3D XCAR (tem); else if (name_pattern =3D=3D 0) diff --git a/src/gfilenotify.c b/src/gfilenotify.c index 285a253..fa4854c 100644 =2D-- a/src/gfilenotify.c +++ b/src/gfilenotify.c @@ -266,7 +266,7 @@ reason. Removing the watch by calling `gfile-rm-watch'= also makes it invalid. */) (Lisp_Object watch_descriptor) { =2D Lisp_Object watch_object =3D Fassoc (watch_descriptor, watch_list); + Lisp_Object watch_object =3D Fassoc (watch_descriptor, watch_list, Qnil); if (NILP (watch_object)) return Qnil; else diff --git a/src/image.c b/src/image.c index 91749fb..1426e30 100644 =2D-- a/src/image.c +++ b/src/image.c @@ -4231,7 +4231,7 @@ xpm_load_image (struct frame *f, color_val =3D Qnil; if (!NILP (color_symbols) && !NILP (symbol_color)) { =2D Lisp_Object specified_color =3D Fassoc (symbol_color, color_symbols); + Lisp_Object specified_color =3D Fassoc (symbol_color, color_symbols, Qn= il); =20 if (CONSP (specified_color) && STRINGP (XCDR (specified_color))) { diff --git a/src/keymap.c b/src/keymap.c index b568f47..db9aa7c 100644 =2D-- a/src/keymap.c +++ b/src/keymap.c @@ -1292,7 +1292,7 @@ silly_event_symbol_error (Lisp_Object c) base =3D XCAR (parsed); name =3D Fsymbol_name (base); /* This alist includes elements such as ("RET" . "\\r"). */ =2D assoc =3D Fassoc (name, exclude_keys); + assoc =3D Fassoc (name, exclude_keys, Qnil); =20 if (! NILP (assoc)) { diff --git a/src/process.c b/src/process.c index abd017b..1900951 100644 =2D-- a/src/process.c +++ b/src/process.c @@ -951,7 +951,7 @@ DEFUN ("get-process", Fget_process, Sget_process, 1, 1,= 0, if (PROCESSP (name)) return name; CHECK_STRING (name); =2D return Fcdr (Fassoc (name, Vprocess_alist)); + return Fcdr (Fassoc (name, Vprocess_alist, Qnil)); } =20 /* This is how commands for the user decode process arguments. It diff --git a/src/w32fns.c b/src/w32fns.c index b0842b5..457599f 100644 =2D-- a/src/w32fns.c +++ b/src/w32fns.c @@ -467,7 +467,7 @@ if the entry is new. */) block_input (); =20 /* replace existing entry in w32-color-map or add new entry. */ =2D entry =3D Fassoc (name, Vw32_color_map); + entry =3D Fassoc (name, Vw32_color_map, Qnil); if (NILP (entry)) { entry =3D Fcons (name, rgb); diff --git a/src/w32font.c b/src/w32font.c index 67d2f6d..314d7ac 100644 =2D-- a/src/w32font.c +++ b/src/w32font.c @@ -1627,7 +1627,7 @@ x_to_w32_charset (char * lpcs) Format of each entry is (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)). */ =2D this_entry =3D Fassoc (build_string (charset), Vw32_charset_info_alist= ); + this_entry =3D Fassoc (build_string (charset), Vw32_charset_info_alist, = Qnil); =20 if (NILP (this_entry)) { diff --git a/src/w32notify.c b/src/w32notify.c index 2520581..e8bdef8 100644 =2D-- a/src/w32notify.c +++ b/src/w32notify.c @@ -642,7 +642,7 @@ WATCH-DESCRIPTOR should be an object returned by `w32no= tify-add-watch'. */) /* Remove the watch object from watch list. Do this before freeing the object, do that even if we fail to free it, watch_list is kept free of junk. */ =2D watch_object =3D Fassoc (watch_descriptor, watch_list); + watch_object =3D Fassoc (watch_descriptor, watch_list, Qnil); if (!NILP (watch_object)) { watch_list =3D Fdelete (watch_object, watch_list); @@ -679,7 +679,7 @@ the watcher thread exits abnormally for any other reaso= n. Removing the watch by calling `w32notify-rm-watch' also makes it invalid. */) (Lisp_Object watch_descriptor) { =2D Lisp_Object watch_object =3D Fassoc (watch_descriptor, watch_list); + Lisp_Object watch_object =3D Fassoc (watch_descriptor, watch_list, Qnil); =20 if (!NILP (watch_object)) { diff --git a/src/w32term.c b/src/w32term.c index c37805c..0f7bb93 100644 =2D-- a/src/w32term.c +++ b/src/w32term.c @@ -6110,7 +6110,7 @@ x_calc_absolute_position (struct frame *f) =20 list =3D CDR(list); =20 =2D geometry =3D Fassoc (Qgeometry, attributes); + geometry =3D Fassoc (Qgeometry, attributes, Qnil); if (!NILP (geometry)) { monitor_left =3D Fnth (make_number (1), geometry); diff --git a/src/xdisp.c b/src/xdisp.c index 1c316fa..6717405 100644 =2D-- a/src/xdisp.c +++ b/src/xdisp.c @@ -22859,7 +22859,7 @@ display_mode_element (struct it *it, int depth, int= field_width, int precision, props =3D oprops; } =20 =2D aelt =3D Fassoc (elt, mode_line_proptrans_alist); + aelt =3D Fassoc (elt, mode_line_proptrans_alist, Qnil); if (! NILP (aelt) && !NILP (Fequal (props, XCDR (aelt)))) { /* AELT is what we want. Move it to the front @@ -28325,7 +28325,7 @@ set_frame_cursor_types (struct frame *f, Lisp_Objec= t arg) =20 /* By default, set up the blink-off state depending on the on-state. */ =20 =2D tem =3D Fassoc (arg, Vblink_cursor_alist); + tem =3D Fassoc (arg, Vblink_cursor_alist, Qnil); if (!NILP (tem)) { FRAME_BLINK_OFF_CURSOR (f) @@ -28463,7 +28463,7 @@ get_window_cursor_type (struct window *w, struct gl= yph *glyph, int *width, /* Cursor is blinked off, so determine how to "toggle" it. */ =20 /* First look for an entry matching the buffer's cursor-type in blink-cu= rsor-alist. */ =2D if ((alt_cursor =3D Fassoc (BVAR (b, cursor_type), Vblink_cursor_alist= ), !NILP (alt_cursor))) + if ((alt_cursor =3D Fassoc (BVAR (b, cursor_type), Vblink_cursor_alist, = Qnil), !NILP (alt_cursor))) return get_specified_cursor_type (XCDR (alt_cursor), width); =20 /* Then see if frame has specified a specific blink off cursor type. */ diff --git a/src/xfont.c b/src/xfont.c index b73596c..85fccf0 100644 =2D-- a/src/xfont.c +++ b/src/xfont.c @@ -505,7 +505,8 @@ xfont_list (struct frame *f, Lisp_Object spec) Lisp_Object alter; =20 if ((alter =3D Fassoc (SYMBOL_NAME (registry), =2D Vface_alternative_font_registry_alist), + Vface_alternative_font_registry_alist, + Qnil), CONSP (alter))) { /* Pointer to REGISTRY-ENCODING field. */ diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el index 2e46345..e294859 100644 =2D-- a/test/src/fns-tests.el +++ b/test/src/fns-tests.el @@ -373,6 +373,12 @@ dot2 (should-error (assoc 3 d1) :type 'wrong-type-argument) (should-error (assoc 3 d2) :type 'wrong-type-argument))) =20 +(ert-deftest test-assoc-testfn () + (let ((alist '(("a" . 1) ("b" . 2)))) + (should-not (assoc "a" alist #'ignore)) + (should (eq (assoc "b" alist #'string-equal) (cadr alist))) + (should-not (assoc "b" alist #'eq)))) + (ert-deftest test-cycle-rassq () (let ((c1 (cyc1 '(0 . 1))) (c2 (cyc2 '(0 . 1) '(0 . 2))) =2D-=20 2.9.4 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCAAGBQJZX+U3AAoJECM1h6R8IHkQt+gH/RTpcw/sGHosLVovnYXV4Vjg R8s/NSh2VSJ34h1PDGPtLnDQGRi6EwVluSLMEDrkcyzQXq08W1Cr55iN0U+9S1kH +TO/qZZc3N8XJs0LxG6PRuu29CL39quFZ/XDbzzW36Cs0AThcJKZYfWtrHLoRLmo ad77XQK60NKP7Ue/oow/oYMlVejp/mv+xIqwfi5BxiQDE9axKzq3pdgXg3tDcjDj QD1EoRXGCD48doVv3jurio1kXsqA2MeiqNSG0K4AHKd+FqSjgMzAYadGuSRmI3mw EHmBJ5EY905ShI1w4VjnrhwpKXezG7jxkHAqdqUd8c0vPYAWCtrs+pkSh9Rj+h8= =pz4E -----END PGP SIGNATURE----- --=-=-=--