From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp10.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id mOhSLAfVEWNGwQAAbAwnHQ (envelope-from ) for ; Fri, 02 Sep 2022 12:03:51 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp10.migadu.com with LMTPS id 2Dt6KwfVEWOaUwAAG6o9tA (envelope-from ) for ; Fri, 02 Sep 2022 12:03:51 +0200 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 2B6BE1123D for ; Fri, 2 Sep 2022 12:03:51 +0200 (CEST) Received: from localhost ([::1]:42630 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oU3Wg-0003B5-0h for larch@yhetil.org; Fri, 02 Sep 2022 06:03:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46130) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oU3Vu-00038r-CG for guix-patches@gnu.org; Fri, 02 Sep 2022 06:03:08 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:55160) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oU3Vu-0004ju-4K for guix-patches@gnu.org; Fri, 02 Sep 2022 06:03:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1oU3Vt-0004l2-ST for guix-patches@gnu.org; Fri, 02 Sep 2022 06:03:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#56604] [PATCH 0/8] Update Clojure to 1.11.1. Resent-From: Roman Scherer Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 02 Sep 2022 10:03:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56604 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Ludovic =?UTF-8?Q?Court=C3=A8s?= Cc: 56604-done@debbugs.gnu.org Received: via spool by 56604-done@debbugs.gnu.org id=D56604.166211297118272 (code D ref 56604); Fri, 02 Sep 2022 10:03:01 +0000 Received: (at 56604-done) by debbugs.gnu.org; 2 Sep 2022 10:02:51 +0000 Received: from localhost ([127.0.0.1]:44909 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oU3Vi-0004kd-FD for submit@debbugs.gnu.org; Fri, 02 Sep 2022 06:02:51 -0400 Received: from mail-ej1-f46.google.com ([209.85.218.46]:42874) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oU3Vf-0004kQ-UR for 56604-done@debbugs.gnu.org; Fri, 02 Sep 2022 06:02:48 -0400 Received: by mail-ej1-f46.google.com with SMTP id p16so2797410ejb.9 for <56604-done@debbugs.gnu.org>; Fri, 02 Sep 2022 03:02:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=burningswell-com.20210112.gappssmtp.com; s=20210112; h=mime-version:message-id:in-reply-to:date:subject:cc:to:from :user-agent:references:from:to:cc:subject:date; bh=eh0gZYj43wLm7dfsjxmOa6fsPWMbur+VbAw6qtQ3Cu4=; b=GOfJM1hFalnuneJyk0dJbe5Nrv61o0efaWrBGCUcVVW+4LpS8dBok75ndUERnbRbzH nJFxz2mvp33TIt9VzTqPYYFuy4vxEin9muRH7ADWUZGCFgT+Qo8bNQmCqJE3diWsTOe7 H9lk4/AO6wqUgpsiiJRwA4ytTpAPd1RPTVkOcO+1UyeNS0dB+nsFXxLCHkQuoUXMfuMg xZOaLTm3cVj+KJHRekUep3cxj2EiUHQbZuW+hJRU+0g8MU2V69PjqrvtKjM7ZauWiKUP c/d3vCZ6/mUeeRUgPU69QJ0QdYNzrRhjqp0g22EmJYdhKgOE0MLL1ff/iqKuyYp8pqH+ OKLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:message-id:in-reply-to:date:subject:cc:to:from :user-agent:references:x-gm-message-state:from:to:cc:subject:date; bh=eh0gZYj43wLm7dfsjxmOa6fsPWMbur+VbAw6qtQ3Cu4=; b=bh4D25DL4mLWgjIiPRysJiZt8+zuvbdQyzPpoFetAiBddyyVS914UUc+a3TuShrEMI 5kCEYqRuCWoB9Vufzb8wnt9g6Esci6ix9K+4LRPkz9IxZf5YZWHpibyOXrPGr4cmEU7f xLcca2uUAiVHMgP9wJwIKjA/vmZFj2rDAIwN2F+xjMeRV/uvtB8eyajNifum4qX5UG+m tlqm/7JC0bdnMUIzjbGe5jDVyIA9AA1rn7DrD/SkqWs+RkZTeBlGfWsaXwT1DfK7zXym /PEGBg1ixHROIqi+IiUb8+zmQUEGEp8X85JNXDeNFFzFQKxJnPsyTzk0htT0hqGyImzJ 92yQ== X-Gm-Message-State: ACgBeo3ie/3qQmaSn1venA8IWkK+chBNLrd/Ag98OZ+0q8bPbelXi84v PtQjdewnrPJO7FOUW7OOTCsd+Xbf7DQlzAaP X-Google-Smtp-Source: AA6agR4AV8GzwvtP46cvvr2l3LdiBQC2Ymg2dvLy0YeUn73Dtx46fzjiixt69iAmtpvK14aJsV8t/w== X-Received: by 2002:a17:906:3bd2:b0:731:3f03:1697 with SMTP id v18-20020a1709063bd200b007313f031697mr27624725ejf.289.1662112961571; Fri, 02 Sep 2022 03:02:41 -0700 (PDT) Received: from precision (tmo-119-93.customers.d1-online.com. [80.187.119.93]) by smtp.gmail.com with ESMTPSA id m14-20020a50ef0e000000b0043d5ead65a6sm1072333eds.84.2022.09.02.03.02.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Sep 2022 03:02:40 -0700 (PDT) References: <87fsisg5mu.fsf@gnu.org> <87zgg55wyq.fsf@burningswell.com> <87tu5r4g20.fsf@gnu.org> User-agent: mu4e 1.8.9; emacs 28.1 From: Roman Scherer Date: Fri, 02 Sep 2022 09:52:37 +0000 In-reply-to: <87tu5r4g20.fsf@gnu.org> Message-ID: <87k06mksap.fsf@burningswell.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN X-Migadu-To: larch@yhetil.org X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1662113031; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=eh0gZYj43wLm7dfsjxmOa6fsPWMbur+VbAw6qtQ3Cu4=; b=fMHUzfW6pwxbBbpGo5AGLriarjbQNNy7a56xktxpxT4mLdk7hGC2iYhLwNF4yDduWDgn3Z gjXjqyPO9G8GUjraw+YopX9a0LzEDvbKghjGjAXF+HHFKLWseqJUyzyK4RV0hhLWmrD6l1 ZPodGrgWfjAo2refhnVqBzqxf53lNaEkkOIYnATwWNNE7is9H4rSmgU4CyAHEqZ3cTnmIr HzU/QyRQfRu6A618Xsz27RcomRF3p5OYmJpowlQHhS8AaZU79MmjfUvdJIO771Qlk3zDWp RRCYPJriYWX0qagWJNKqtw8xqe7wS/P9QeFIvEYSbTaHJjXgIAFWP4kJG5XVHw== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1662113031; a=rsa-sha256; cv=none; b=G5/IwNWDZxf8ZGP+g1WpvgQJXGRxwZ9UNtKQXDA455A0UlqSObgAtwbvcFmm6nLyRe5dWn lLO943ZR9Gak+5tyWilrKkOvMuovioe52A2uQMEo7NbHvib6hXLbaOAMvy8F4A5UyGWWXp P7ZWWomk2fdyUIhLA9VFNkCtsTkcki3yWvw8AWBs2TKqYSzaQ2ZSrNpFy/mBzMyITD/S4n s5Cc3fqETYhQJLhhAwoAbnrTiO87Ik5hRb9iDYEy3G93HOkH1uEXmZViOz1uyszl1T7527 z8IFcBwQgHmkGZvy0RK9X/aECciTmExDbjfcgfqDFB8E7MHAem0TxEtfWtMI+A== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=burningswell-com.20210112.gappssmtp.com header.s=20210112 header.b=GOfJM1hF; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: 0.63 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=burningswell-com.20210112.gappssmtp.com header.s=20210112 header.b=GOfJM1hF; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: 2B6BE1123D X-Spam-Score: 0.63 X-Migadu-Scanner: scn0.migadu.com X-TUID: YnXJP3pBhkY/ --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain Hi Ludo, thanks for taking a look. Here's a new patch. I changed the patch to not use define-public and I'm exporting the repack-jar function now as per your suggestion. I also updated the commit message to (hopefully) match the changelog style. Is that correct now? I did not add the #:jar-timestamp parameter because there is one more difference. The strip-jar-timestamps function in the Ant build system changes the timestamp of all files in the JAR. The reset-class-timestamps function in the Clojure build system sets the timestamp of only the class files. I could add another parameter called "extension" to the strip-jar-timestamps function if you prefer that. It would default to "*", matching all filenames and use it with "*.class" from the Clojure build system. I have the feeling the repack-jar function is more flexible as is, but I'm open to doing this change or any other suggestion you have. Wdyt? Roman --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-build-system-Remove-code-duplication-in-Ant-Clojure-.patch Content-Transfer-Encoding: quoted-printable From=20c3e06172044264ff871cbe8637236415bfd6077f Mon Sep 17 00:00:00 2001 From: Roman Scherer Date: Mon, 15 Aug 2022 15:29:25 +0000 Subject: [PATCH] build-system: Remove code duplication in Ant & Clojure bui= ld systems * guix/build/ant-build-system.scm (repack-jar): Add repack-jar function to unpack, modify, and repack a JAR file. * guix/build/ant-build-system.scm (strip-jar-timestamps): Use the repack-jar function to set the timestamps of all files in the JAR file to 1980-01-01. * guix/build/clojure-build-system.scm (reset-class-timestamps): Use the repack-jar function from the Ant build system to set the timestamps of all class files in the JAR file to 1980-01-02 to prevent the Clojure compiler f= rom re-compiling Clojure source files. =2D-- guix/build/ant-build-system.scm | 29 ++++++++------- guix/build/clojure-build-system.scm | 55 +++++------------------------ 2 files changed, 26 insertions(+), 58 deletions(-) diff --git a/guix/build/ant-build-system.scm b/guix/build/ant-build-system.= scm index fae1b47ec5..dec261cb82 100644 =2D-- a/guix/build/ant-build-system.scm +++ b/guix/build/ant-build-system.scm @@ -27,7 +27,8 @@ (define-module (guix build ant-build-system) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases =2D ant-build)) + ant-build + repack-jar)) =20 ;; Commentary: ;; @@ -195,10 +196,9 @@ (define (generate-index jar) outputs) #t) =20 =2D(define* (strip-jar-timestamps #:key outputs =2D #:allow-other-keys) =2D "Unpack all jar archives, reset the timestamp of all contained files, = and =2Drepack them. This is necessary to ensure that archives are reproducible= ." +(define (repack-jar outputs repack-fn) + "Unpack all jar archives, invoke repack-fn for each JAR with the directo= ry +it has been unpacked to, and pack them again." (define (repack-archive jar) (format #t "repacking ~a\n" jar) (let* ((dir (mkdtemp! "jar-contents.XXXXXX")) @@ -206,13 +206,7 @@ (define (repack-archive jar) (with-directory-excursion dir (invoke "jar" "xf" jar)) (delete-file jar) =2D ;; XXX: copied from (gnu build install) =2D (for-each (lambda (file) =2D (let ((s (lstat file))) =2D (unless (eq? (stat:type s) 'symlink) =2D (utime file 0 0 0 0)))) =2D (find-files dir #:directories? #t)) =2D + (repack-fn dir) ;; The jar tool will always set the timestamp on the manifest file ;; and the containing directory to the current time, even when we ;; reuse an existing manifest file. To avoid this we use "zip" @@ -237,6 +231,17 @@ (define (repack-archive jar) outputs) #t) =20 +(define* (strip-jar-timestamps #:key outputs + #:allow-other-keys) + "Unpack all jar archives, reset the timestamp of all contained files, and +repack them. This is necessary to ensure that archives are reproducible." + (repack-jar outputs (lambda (dir) + (for-each (lambda (file) + (let ((s (lstat file))) + (unless (eq? (stat:type s) 'symlink) + (utime file 0 0 0 0)))) + (find-files dir #:directories? #t))))) + (define* (check #:key target (make-flags '()) (tests? (not target)) (test-target "check") #:allow-other-keys) diff --git a/guix/build/clojure-build-system.scm b/guix/build/clojure-build= -system.scm index cacbefb386..b82ebc30fe 100644 =2D-- a/guix/build/clojure-build-system.scm +++ b/guix/build/clojure-build-system.scm @@ -19,7 +19,7 @@ (define-module (guix build clojure-build-system) #:use-module ((guix build ant-build-system) #:select ((%standard-phases . %standard-phases@ant) =2D ant-build)) + ant-build repack-jar)) #:use-module (guix build clojure-utils) #:use-module (guix build java-utils) #:use-module (guix build syscalls) @@ -112,54 +112,17 @@ (define* (check #:key jar-names))) #t) =20 =2D(define (regular-jar-file? file stat) =2D "Predicate returning true if FILE is ending on '.jar' =2Dand STAT indicates it is a regular file." =2D (and (string-suffix? ".jar" file) =2D (eq? 'regular (stat:type stat)))) =2D =2D;; XXX: The only difference compared to 'strip-jar-timestamps' in =2D;; ant-build-system.scm is the date. TODO: Adjust and factorize. (define* (reset-class-timestamps #:key outputs #:allow-other-keys) "Unpack all jar archives, reset the timestamp of all contained class fil= es, and repack them. This is necessary to ensure that archives are reproducib= le." =2D (define (repack-archive jar) =2D (format #t "resetting class timestamps and repacking ~a\n" jar) =2D =2D ;; Note: .class files need to be strictly newer than source files, =2D ;; otherwise the Clojure compiler will recompile sources. =2D (let* ((early-1980 315619200) ; 1980-01-02 UTC =2D (dir (mkdtemp! "jar-contents.XXXXXX")) =2D (manifest (string-append dir "/META-INF/MANIFEST.MF"))) =2D (with-directory-excursion dir =2D (invoke "jar" "xf" jar)) =2D (delete-file jar) =2D (for-each (lambda (file) =2D (let ((s (lstat file))) =2D (unless (eq? (stat:type s) 'symlink) =2D (when (string-match "^(.*)\\.class$" file) =2D (utime file early-1980 early-1980))))) =2D (find-files dir #:directories? #t)) =2D ;; The jar tool will always set the timestamp on the manifest file =2D ;; and the containing directory to the current time, even when we =2D ;; reuse an existing manifest file. To avoid this we use "zip" =2D ;; instead of "jar". It is important that the manifest appears =2D ;; first. =2D (with-directory-excursion dir =2D (let* ((files (find-files "." ".*" #:directories? #t)) =2D ;; To ensure that the reference scanner can detect all =2D ;; store references in the jars we disable compression =2D ;; with the "-0" option. =2D (command (if (file-exists? manifest) =2D `("zip" "-0" "-X" ,jar ,manifest ,@files) =2D `("zip" "-0" "-X" ,jar ,@files)))) =2D (apply invoke command))) =2D (utime jar 0 0))) =2D (for-each (match-lambda =2D ((output . directory) =2D (for-each repack-archive =2D (find-files directory regular-jar-file?)))) =2D outputs)) + (repack-jar outputs (lambda (dir) + (for-each (lambda (file) + (let ((s (lstat file)) + (early-1980 315619200)) ; 1980-0= 1-02 UTC + (unless (eq? (stat:type s) 'symlink) + (when (string-match "^(.*)\\.class= $" file) + (utime file early-1980 early-198= 0))))) + (find-files dir #:directories? #t))))) =20 (define-with-docs install "Standard 'install' phase for clojure-build-system." =2D-=20 2.37.2 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: > Hi Roman, > > (Catching up after vacation=E2=80=A6) > > Roman Scherer skribis: > >> here's the promised patch to follow up with the code duplication I >> introduced in my previous patch. > > Awesome. > >> When I run the following commands after modifying the build systems they >> run for quite some time, because they were compiling a ton (the jdk, >> jetty) of things. >> >> ./pre-inst-env guix build clojure >> ./pre-inst-env guix build clojure-tools >> >> I guess this is expected, since a change in a build system might affect >> all packages being built with it. But I was wondering if there is a way >> to force only building the packages specified on the command line. Does >> such a thing exists? > > No, it doesn=E2=80=99t exist, because that would be building something > different. In this case, building everything that depends on > =E2=80=98ant-build-system.scm=E2=80=99 is unavoidable. > >> I was wondering what is the most efficient way to quickly iterate on >> changes to a build system, without recompiling the whole world for that >> build system. How would you do that? > > There=E2=80=99s no ideal solution as you=E2=80=99ll have to recompile the= world anyway. > > When changing build systems, I=E2=80=99d usually stare at my changes for = quite > some time first, to make sure I don=E2=80=99t have to rebuild the world o= n the > next day because of a typo. :-) > > Then, for small local changes, I=E2=80=99d build just the bottom of the > dependency graph to check for breakage (in this case, making sure the > =E2=80=98strip-jar-timestamps=E2=80=99 phase still works as intended). T= hen we can let > ci.guix build the whole thing afterwards, and make sure nothing goes > wrong. > >> From 756bfd3458ded38e1041ebb255c6b6ffe737732d Mon Sep 17 00:00:00 2001 >> From: Roman Scherer >> Date: Mon, 15 Aug 2022 15:29:25 +0000 >> Subject: [PATCH] build-system: Add repack-jar and use it in Ant & Clojure >> build systems >> >> * guix/build/ant-build-system.scm: Add repack-jar and use it in strip-ja= r-timestamps >> * guix/build/clojure-build-system.scm: Use repack-jar in reset-class-tim= estamps > > Please use the ChangeLog format, specifying procedure/variable names and > their actual changes. > > [...] > >> +(define-public (repack-jar outputs repack-fn) >> + "Unpack all jar archives, invoke repack-fn for each JAR with the dire= ctory >> +it has been unpacked to, and pack them again." > > Instead of =E2=80=98define-public=E2=80=99, I=E2=80=99d move =E2=80=98rep= ack-jar=E2=80=99 to #:export at the > top, like the other procedures. > > But=E2=80=A6 > >> @@ -206,13 +205,7 @@ (define (repack-archive jar) >> (with-directory-excursion dir >> (invoke "jar" "xf" jar)) >> (delete-file jar) >> - ;; XXX: copied from (gnu build install) >> - (for-each (lambda (file) >> - (let ((s (lstat file))) >> - (unless (eq? (stat:type s) 'symlink) >> - (utime file 0 0 0 0)))) >> - (find-files dir #:directories? #t)) >> - >> + (repack-fn dir) > > Looking at the code, the only difference between the two repack > functions is the timestamp, right? In that case, I=E2=80=99d lean towards > adding a #:jar-timestamp parameter to =E2=80=98strip-jar-timestamps=E2=80= =99 (rather than > this =E2=80=98repack-fn=E2=80=99 argument) that=E2=80=99d be passed to = =E2=80=98utime=E2=80=99. The default for > #:jar-timestamp would be '(0 0 0 0); for Clojure we=E2=80=99d set the def= ault > #:jar-timestamp in (guix build-system clojure) to: > > #:jar-timestamp (list early-1980 early-1980) > > WDYT? > > Thanks, > Ludo=E2=80=99. --=-=-=-- --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFTBAEBCAA9FiEE0iajOdjfRIFd3gygPdpSUn0qwZkFAmMR1L4fHHJvbWFuLnNj aGVyZXJAYnVybmluZ3N3ZWxsLmNvbQAKCRA92lJSfSrBmU0sB/9tYMjHbknoHVs1 eCMW9Qm/hfWCTYcASDlD/zCDMcBelfcCIYFdn1QDck0r6Yp/U6YaRTD1KrF7V28U ntsS3ne2hEmUNVkhru47yjZBrwL1H29nTBuN/h29i6IobpotiWQ+YTaBX4NF9zh/ 4iyhtdm/8TOWOQhoXDM3ZllNSIObdNJUcm1pQzDAwybP3LPsY7BgPa7BrFqqjDEQ fG/w9KCRLF/oVL551xmswNeEOM5VSKs7CniYV/qGj3zxMek3O48LTKDLTTk8/MsO Cx0gOrNvmoQwGATi1IJ/BSj5+FjhJPOuq73jPktLFBSyjqKdJihItfWFWiMHrkzv kmD52sdo =hB/J -----END PGP SIGNATURE----- --==-=-=--