From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: =?UTF-8?B?VG9tbWkgSMO2eW7DpGzDpG5tYWE=?= Newsgroups: gmane.lisp.guile.devel Subject: Re: Corrected cumulative time measuring support Date: Sat, 30 Jan 2021 08:50:09 +0200 Message-ID: References: <5f91eb67-438a-6091-9dcb-83992815f576@gmail.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="fZMLvgvi5J5DDdI8x0Hw3CXNseUezntYF" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="13932"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.1 To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Sat Jan 30 07:50:41 2021 Return-path: Envelope-to: guile-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l5k5g-0003W5-Sk for guile-devel@m.gmane-mx.org; Sat, 30 Jan 2021 07:50:40 +0100 Original-Received: from localhost ([::1]:38396 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l5k5f-0000IM-VE for guile-devel@m.gmane-mx.org; Sat, 30 Jan 2021 01:50:39 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:36324) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l5k5K-0000I5-4E for guile-devel@gnu.org; Sat, 30 Jan 2021 01:50:18 -0500 Original-Received: from mail-lj1-x233.google.com ([2a00:1450:4864:20::233]:38746) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1l5k5H-000386-QU for guile-devel@gnu.org; Sat, 30 Jan 2021 01:50:17 -0500 Original-Received: by mail-lj1-x233.google.com with SMTP id f19so13079526ljn.5 for ; Fri, 29 Jan 2021 22:50:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:references:autocrypt:message-id:date:user-agent :mime-version:in-reply-to; bh=djWnSNLo2HV2+weZglVqazxRzjXsvoSnajv7lF0Jkas=; b=mEcu6XHZmOqF+bc0/gDJIpFy/4X3UQUM8BrZ2C/1rkskGJElppCpt13ImnOKXS5Qyv KxjPdT8OmNVNKYfOueMDSAS2zUWV7oXzwh1rkRZAnprM+hJQXLc9QgdKx6bl4geLvUya j1T5Ja8D4aXENtoLrfON4uB4mhFLuuc4fPvXimJHbXE8uoliH8lnHqzOJtQnV0QTNocl SSnvQ8c0e2nhYyFZY8QI+kfyOxFzmmUMIZNeoFxHxOyRg0eDDEBpPGPbXdVJ0ZQli0iB FH08jGwfpupCHDNAzV0HT5jRFB7pOXwxSLk7MKHSyfA35PSuHbu+oeN+1bNrlvFyc3eH Obog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:autocrypt:message-id :date:user-agent:mime-version:in-reply-to; bh=djWnSNLo2HV2+weZglVqazxRzjXsvoSnajv7lF0Jkas=; b=MSRPMHOym+TVFKD+lfYDiow1TWawz0FR0B7i1EMv3ZETJrXWvwgNcaYwZdseiJJSzs UCxe9bOCLnBE0bw3M7tI3J+DQHLnZuCQ0fmQ/UnZfHz7rs/xFiF7IJJ0me6C8l0xOVou gw5WUxFtogoBguIM6kNiwh+05O6ldu2hj7gifQQUstqD1zah3m7R5llgLygbvC5OJBoF 9LL1AV2ckknwwf00aapxj9dmyCapCEELbrOFftkPDHjR8l1Xl1tvRLxeykI0kpNcV1Ol vdL/8j2YI//JuCko9tJpI4L+EfpXpCABPIqZMd8LWrLr94+oeC4DA/azauF327UlwuCm Y3Fw== X-Gm-Message-State: AOAM531eRWCRr3MSsomifKJPkJ/8jnHOTGvBydNH7vdDZn7vqMQG2OZF 6GG1s6oAgplYNVyZLDm7OSWPolzHwUwr X-Google-Smtp-Source: ABdhPJzu3YFSv9dfcaQfNJjgioprs3ytO84olCqM7oc9kitp1ph3YLvsHFRCdxcM6+XKJa/t6uodzg== X-Received: by 2002:a2e:894b:: with SMTP id b11mr4452079ljk.265.1611989411254; Fri, 29 Jan 2021 22:50:11 -0800 (PST) Original-Received: from [192.168.43.143] (mobile-access-2e8405-66.dhcp.inet.fi. [46.132.5.66]) by smtp.gmail.com with ESMTPSA id n21sm203147lja.9.2021.01.29.22.50.10 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 29 Jan 2021 22:50:10 -0800 (PST) Autocrypt: addr=tommi.hoynalanmaa@gmail.com; keydata= xsFNBF+7UosBEAC4Uv03kSVIAHjl5FhbxqeLU8fQ6tQjEzbvOz0eqls5ShMLYVBUH5PubV9A wOjduQchWtrLgwwSz21TJm8ND2qqTjydYT+hs3AGw/F5Jq4ShXE7SobpXa5LDAvLe8k2PJ20 iSN7t3x6flTTph3Jz6BnH0IGGmdKh3arVdWYJ86whaI9hYqmK3TzD8d21wXA5Q8RlKt3008i G0cd4QEYlYkEXIWTd50q0dXr/YbNBKI2hmarm9kJ9Ihh7lauMeJeRllbtl1tCw2NY8KICNOV ZKcUZMZvRv8tzqwONXHzVpiCr4f9ZH4ltz+lXcCAYmSWd4mVSC1opZamWOeBfqda8YUOKDdJ dmImEfk5Q2IC/DTqt5FgA5Oi8FiIvUhsqkstVn11bUqREid0wd5/qfARiQjy0wdNmFpDh9pL qWm1n1nQvt9gtCm8yRY3MqFGVKlPyINo+xsiihUArAQ114Lc6gStM2F4HOqWuZx8hxlgmJb0 tLB+tF7twyfBbIdMKKWYrVElN1otQv5MmNrF4g8MJ9xoqHcNYuz8miAI5g2aXzvi3Ftum11U JrkcTL5PFgvfL/4zo6SnH49MOQSWRE47g8sxKIZpYs/h79g0kjfFPF7YPa+oJnCvQWpAb8Ge C9TrUUv+g74MhxpBX+QckpxM8VjYMNZBOVUHeQy6GzSXkdyIVQARAQABzTJUb21taSBIw7Z5 bsOkbMOkbm1hYSA8dG9tbWkuaG95bmFsYW5tYWFAZ21haWwuY29tPsLBjwQTAQgAORYhBFX0 JHdxVTUoXLIreruGH95ARg+DBQJfu1K In-Reply-To: <5f91eb67-438a-6091-9dcb-83992815f576@gmail.com> Received-SPF: pass client-ip=2a00:1450:4864:20::233; envelope-from=tommi.hoynalanmaa@gmail.com; helo=mail-lj1-x233.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, NICE_REPLY_A=-0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Original-Sender: "guile-devel" Xref: news.gmane.io gmane.lisp.guile.devel:20658 Archived-At: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --fZMLvgvi5J5DDdI8x0Hw3CXNseUezntYF Content-Type: multipart/mixed; boundary="bmY0qRJQUsiYyaGQA1AcqeNEPyYdOmW4P"; protected-headers="v1" From: =?UTF-8?B?VG9tbWkgSMO2eW7DpGzDpG5tYWE=?= To: guile-devel@gnu.org Message-ID: Subject: Re: Corrected cumulative time measuring support References: <5f91eb67-438a-6091-9dcb-83992815f576@gmail.com> In-Reply-To: <5f91eb67-438a-6091-9dcb-83992815f576@gmail.com> --bmY0qRJQUsiYyaGQA1AcqeNEPyYdOmW4P Content-Type: multipart/mixed; boundary="------------285429E46E7CAA39460915BC" Content-Language: en-US This is a multi-part message in MIME format. --------------285429E46E7CAA39460915BC Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi Here is a properly formatted version of the patch. =C2=A0=C2=A0=C2=A0=C2=A0 - Tommi H=C3=B6yn=C3=A4l=C3=A4nmaa Tommi H=C3=B6yn=C3=A4l=C3=A4nmaa kirjoitti 26.1.2021 klo 13.27: > Hi > > I made an enhanced version of Guile statprof that computes the=20 > cumulative time spent in procedures correctly (so that recursive=20 > invocations of the same procedure are counted only once). The patch is = > attached. Please inform me if you find any bugs. > > =C2=A0=C2=A0=C2=A0=C2=A0 - Tommi H=C3=B6yn=C3=A4l=C3=A4nmaa > > --------------285429E46E7CAA39460915BC Content-Type: text/x-patch; charset=UTF-8; name="0008-improve-statprof.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0008-improve-statprof.patch" Description: Implement corrected cumulative execution time in statprof Author: Tommi H=C3=B6yn=C3=A4l=C3=A4nmaa --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ --- a/module/statprof.scm +++ b/module/statprof.scm @@ -355,13 +355,16 @@ =20 (define-record-type call-data (make-call-data name printable source - call-count cum-sample-count self-sample-count) + call-count cum-sample-count corr-cum-sample-count + self-sample-count) call-data? (name call-data-name) (printable call-data-printable) (source call-data-source) (call-count call-data-call-count set-call-data-call-count!) (cum-sample-count call-data-cum-sample-count set-call-data-cum-sample-= count!) + (corr-cum-sample-count call-data-corr-cum-sample-count + set-call-data-corr-cum-sample-count!) (self-sample-count call-data-self-sample-count set-call-data-self-samp= le-count!)) =20 (define (source->string source) @@ -387,6 +390,10 @@ (set-call-data-cum-sample-count! cd (1+ (call-data-cum-sample-count cd= )))) (define (inc-call-data-self-sample-count! cd) (set-call-data-self-sample-count! cd (1+ (call-data-self-sample-count = cd)))) +(define (inc-call-data-corr-cum-sample-count! cd) + (set-call-data-corr-cum-sample-count! + cd + (1+ (call-data-corr-cum-sample-count cd)))) =20 (define (skip-count-call buffer start len) ;; If we are counting all procedure calls, count-call might be on the @@ -424,7 +431,8 @@ (and call-counts (hashv-ref call-counts entr= y)) 0 - 0))) + 0 + 0))) (hashv-set! table entry data) data)))) =20 @@ -443,12 +451,16 @@ pos))) (inc-call-data-self-sample-count! (addr->call-data (vector-ref buffer pos))) - (let visit-stack ((pos pos)) + (let visit-stack ((pos pos) + (visited-data '())) (cond ((vector-ref buffer pos) =3D> (lambda (ip) - (inc-call-data-cum-sample-count! (addr->call-data ip)= ) - (visit-stack (1+ pos)))) + (let ((cur-data (addr->call-data ip))) + (inc-call-data-cum-sample-count! cur-data) + (if (not (memv cur-data visited-data)) + (inc-call-data-corr-cum-sample-count! cur-data)) + (visit-stack (1+ pos) (cons cur-data visited-data))))) (else (visit-stacks (1+ pos))))))) (else table))))) @@ -502,13 +514,15 @@ =20 (define-record-type stats (make-stats proc-name proc-source - %-time-in-proc cum-secs-in-proc self-secs-in-proc + %-time-in-proc cum-secs-in-proc corr-cum-secs-in-proc + self-secs-in-proc calls) stats? (proc-name statprof-stats-proc-name) (proc-source statprof-stats-proc-source) (%-time-in-proc statprof-stats-%-time-in-proc) (cum-secs-in-proc statprof-stats-cum-secs-in-proc) + (corr-cum-secs-in-proc statprof-stats-corr-cum-secs-in-proc) (self-secs-in-proc statprof-stats-self-secs-in-proc) (calls statprof-stats-calls)) =20 @@ -534,6 +548,7 @@ (proc-source (and=3D> (call-data-source call-data) source->stri= ng)) (self-samples (call-data-self-sample-count call-data)) (cum-samples (call-data-cum-sample-count call-data)) + (corr-cum-samples (call-data-corr-cum-sample-count call-data)) (all-samples (statprof-sample-count state)) (secs-per-sample (/ (statprof-accumulated-time state) (statprof-sample-count state))) @@ -547,6 +562,7 @@ proc-source (* (/ self-samples all-samples) 100.0) (* cum-samples secs-per-sample 1.0) + (* corr-cum-samples secs-per-sample 1.0) (* self-samples secs-per-sample 1.0) num-calls))) =20 @@ -577,9 +593,10 @@ (sorted-stats (sort stats-list stats-sorter))) =20 (define (display-stats-line stats) - (format port "~6,2f ~9,2f ~9,2f" + (format port "~6,2f ~9,2f ~9,2f ~9,2f" (statprof-stats-%-time-in-proc stats) (statprof-stats-cum-secs-in-proc stats) + (statprof-stats-corr-cum-secs-in-proc stats) (statprof-stats-self-secs-in-proc stats)) (if (call-counts state) (if (statprof-stats-calls stats) @@ -599,15 +616,15 @@ =20 (if (call-counts state) (begin - (format port "~5a ~10a ~7a ~8a\n" - "% " "cumulative" "self" "") - (format port "~5a ~9a ~8a ~7a ~a\n" - "time" "seconds" "seconds" "calls" "procedure")) + (format port "~5a ~10a ~10a ~7a ~8a\n" + "% " "cumulative" "corr. cum." "self" "") + (format port "~5a ~10a ~10a ~8a ~7a ~a\n" + "time" "seconds" "seconds" "seconds" "calls" "proce= dure")) (begin - (format port "~5a ~10a ~7a ~8a\n" - "%" "cumulative" "self" "") - (format port "~5a ~10a ~7a ~a\n" - "time" "seconds" "seconds" "procedure"))) + (format port "~5a ~10a ~10a ~7a ~8a\n" + "%" "cumulative" "corr. cum." "self" "") + (format port "~5a ~10a ~10a ~7a ~a\n" + "time" "seconds" "seconds" "seconds" "procedure")))= =20 (for-each display-stats-line sorted-stats) =20 --------------285429E46E7CAA39460915BC Content-Type: application/pgp-keys; name="OpenPGP_0xBB861FDE40460F83.asc" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="OpenPGP_0xBB861FDE40460F83.asc" -----BEGIN PGP PUBLIC KEY BLOCK----- xsFNBF+7UosBEAC4Uv03kSVIAHjl5FhbxqeLU8fQ6tQjEzbvOz0eqls5ShMLYVBUH5PubV9Aw= Ojd uQchWtrLgwwSz21TJm8ND2qqTjydYT+hs3AGw/F5Jq4ShXE7SobpXa5LDAvLe8k2PJ20iSN7t= 3x6 flTTph3Jz6BnH0IGGmdKh3arVdWYJ86whaI9hYqmK3TzD8d21wXA5Q8RlKt3008iG0cd4QEYl= YkE XIWTd50q0dXr/YbNBKI2hmarm9kJ9Ihh7lauMeJeRllbtl1tCw2NY8KICNOVZKcUZMZvRv8tz= qwO NXHzVpiCr4f9ZH4ltz+lXcCAYmSWd4mVSC1opZamWOeBfqda8YUOKDdJdmImEfk5Q2IC/DTqt= 5Fg A5Oi8FiIvUhsqkstVn11bUqREid0wd5/qfARiQjy0wdNmFpDh9pLqWm1n1nQvt9gtCm8yRY3M= qFG VKlPyINo+xsiihUArAQ114Lc6gStM2F4HOqWuZx8hxlgmJb0tLB+tF7twyfBbIdMKKWYrVElN= 1ot Qv5MmNrF4g8MJ9xoqHcNYuz8miAI5g2aXzvi3Ftum11UJrkcTL5PFgvfL/4zo6SnH49MOQSWR= E47 g8sxKIZpYs/h79g0kjfFPF7YPa+oJnCvQWpAb8GeC9TrUUv+g74MhxpBX+QckpxM8VjYMNZBO= VUH eQy6GzSXkdyIVQARAQABzTJUb21taSBIw7Z5bsOkbMOkbm1hYSA8dG9tbWkuaG95bmFsYW5tY= WFA Z21haWwuY29tPsLBjwQTAQgAORYhBFX0JHdxVTUoXLIreruGH95ARg+DBQJfu1KMBQkFo5qAA= hsD BQsJCAcCBhUICQoLAgUWAgMBAAAKCRC7hh/eQEYPg4x8EACN6nozccEeGXDTlPgpgTa9evi89= PYF 82YMvIdu2S6YDFMQs5O3glQxbuprsvU2ZbchnYfjjnq8GWYxNjsYXOBrH2u90qrSSfM5pdkLB= fY9 EmZlh8tIa4CrPLMS1nQ88xKemfOLN492ZVX7mbtBhFS9V9gxT13R03S42H7LdtIpzq2ENY0kh= Wv8 4lBIT2HhPYSotvxY+0QFZZ2037lxE24U5Dc19ydQAcU61kTaOYmzjkVfJBak+wf3M9Az5TH5Y= umc KgWTMdOHDmqEps5n3uaCDe8A52JLakG462sBwruOikmzw0Hjlv1MLrhnaDxew5Ye1ah88BLvO= QCE q/IPppQTdiwcv1MoauDIAb8l4VsuDD8bUtnsh6rMFiD/G2QpGnQLGWoQTxxnzpafx8iSjqiE1= HUw wSsFpkB2t5i54Xtu0NNBQC6pcYWnaT2SGsw21qwONPF8FwEcMRS/8zmUN/yVhq+qJm0nm7Sf9= beK HGBKOAsEjiQovS5QKP4Jcp/NwjjcF3yK7iBvVeTFIf198ECkdJW/ONG6EhutxVKaAPs+zjRPM= cog qkQnrYen61z+1aSSvrD2cZ5U/WfTXkTA+ZLqald8En6yEK3WnQnp5vQQTb2w7yaOUM+6ZrDWV= 5PP qQzw1f2sAJ6NcaaOAjRvflElbrpvoKzgOahDlLGrxmOHac7BTQRfu1KNARAAymg3rs9Hd/e0k= OFA gzQYMDR8IQuCO3aOkBRD5JBLZnGFDqZa7NDSm6dXvbiQbtOXpYFBtunQa+g97JN422KDes4GA= jpY wAMxhdRUyFjpMcNPPEX2RGU0OguGnUdlN3FIdCVFIFT1PFvjIB5BDTN10Ycd35o7Txoy2xgO3= Gwu NU6Jw3RMMD5EO3NNCYrQnzqhcjRm5u35bInH7L+IlloN7T8bu6we9+cvy9SfZJhwU8Dp9aJBI= MLA 5a8gGJ2z+3FkxGCZuuANE2NMHDq/QM5T03pE3g/DfsxfIvPPAUSgu7mrm63XQVBmSuwrMOczI= 2TI n5wNNze8bII3Rvf/lzsnnSAAuM8b63PR/lEOgEUiXBNyhjQIm0rssUX1IevAOP5nKM0IsboOL= Szw WU6leBBu+lj9Cc5tF+7Wv79Al/Rnld8IDjw6e1dnOQ4dmdgsZOHpAN7e737jnWIfh/XfAguBO= zs6 OD3Hi8g/ak5GP60ecI0rnzsU68eQyDFjR8sugsL9i7p86U2C2M2UfMjqomaL6tD3ySR6IZlmg= +2o D0KqnD8D1PNUDmlZDAURPBN4F+2VTYpLcdavPNy7mJSc5girx2dbWeGEJmVJs5+t2+YMi7HyJ= pWW dQ6hW4zx5FdPzzVHUwyZbNLKGrPWzFY6LDyflJYxDmIwEqVo3PB5evPOsPUAEQEAAcLBfAQYA= QgA JhYhBFX0JHdxVTUoXLIreruGH95ARg+DBQJfu1KPBQkFo5qAAhsMAAoJELuGH95ARg+DZNAP/= 1Ur Vj0hm/m8P0hwffe/73r4Ri3OxrxkniGWce7iwkVT4pLA0y7H9PXT+dsqgiEJtdCJ2shcqUMUo= +UL hsbh/KAfeFWXErjFajlKwsOpO6ndu+bmIH2S8Z5OAJ4XKwL74nsapf3Jp3CgzsMmfMps01ekf= QKy pBETwBBvrtEaU3Wob/lXrJXJQOrZ3dez6uSgen1eYc9E1vmsSPqWXWdLHWVnwK1ruP0vHP/MT= o48 0qiwksKyIS4mCTr6gfbo6wsWqWM/gRaW3/SHS0Mnb9ARcb6N+v7k2qyP9O+LqhvvkoXhiKKbF= Uej JO0X+NPMvrJx1DNn6iMl2aDdueO5yMs+/LjBZxzz8Nn3VNZow7zfBVQSTxLTavYalNi4pijkC= Xw2 pRsOOwwVihmK7qyNV0dSMGQ/vRhKXSVUpsqzqwAJ8mo+JTzJF0sr6zHexYczBQZ3HYXnjzmA4= COl GiUNkT+0D4x3h5YqoPYRZw8MfOhnBArMwCZ5/lvyRwIxPeiZp29kX4pBBxV4UvpwShm/nq5lQ= G6P aTndery3rKxW+jZIequ/AJaebQf4RD/ZfdbvqBBBAj54Yn+GdPMYUpyeb464vTlfFSVWjV0SG= dKn UJWAoAuz0JUePOgXDS8zF+4/O1aPYCwzo6wd1sNSTgxNVBYisvRVBTgRwK63UbpK+KoeYz1q =3D3eRz -----END PGP PUBLIC KEY BLOCK----- --------------285429E46E7CAA39460915BC-- --bmY0qRJQUsiYyaGQA1AcqeNEPyYdOmW4P-- --fZMLvgvi5J5DDdI8x0Hw3CXNseUezntYF Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEVfQkd3FVNShcsit6u4Yf3kBGD4MFAmAVAaEFAwAAAAAACgkQu4Yf3kBGD4Mx RA//U2/qsXu+EtkPeOzMBFXcnKJUHUWS7MM5rano3FsVX77lGFYm1H+Eh4/w52ITgg6fNa+/MmxP LjXcErBScIjtKaAPGT5ySFqJFIoCb+fi6/+unYlBvnwAFoQ8ldJC/uXNE9S1z7mu25eDeTaB/GAA PefIzEG2OqkucBIw2ndTIb/o8js8vuVHcST16v0JNAezseELDRdukoJoFumkSHg9V4Q/2M/o0Uv7 NjhMDnZ1qCdRLaDwP3dSpxHiapTw8oL2rFoJsEjgEHIP7uCUX52BEbsF7t9gKRy3MtwUIPO5iDXw a2j2b0cyIFr/5HbfA98SUf5Mcj8Q2gxJUFMqHfadQ8f0QWbkEfEkcG/59VHrODO/FlWYcMCuItm8 3nUjEWf9CFg4zhk+nfgpqnloC33DXE/VEFow3Wg7sdxlkKIO78dwJbvXYVU8iKmXjo7bd2cJ6d59 iymPJgT98LWhBRC1ZgIh/NeUCQhnutGpBGhLxg/xApN//FRLc9cVnJMl4oGa+wSB++AboVL0EOZk ad0SxGKTSF8swgqDAwRoj4t5C/GOu6B13R71HHDRkzmrigI7lL75OZJ5dKbIQ+1OnxMd/J1l6miN CPZamuFAtDpQyBEPSFRmOp+KTfr0zBbQmUyugBFBSUD6XvEmbyeAI7HhovZMca5kj3PCkyJmnnIi aj8= =XE0t -----END PGP SIGNATURE----- --fZMLvgvi5J5DDdI8x0Hw3CXNseUezntYF--