From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#35374: Calc; Div by 0 in solving system Date: Sun, 22 Sep 2019 19:34:45 +0200 Message-ID: <2C5B66F6-D2BC-4A7E-B27A-BB0F6A80A1A3@acm.org> References: <1555910400.14181.1.camel@qlfiles.net> Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_CB6A9A27-E9F1-4A28-8513-5B8CD916C647" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="232873"; mail-complaints-to="usenet@blaine.gmane.org" Cc: Christopher Howard To: 35374@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Sep 22 19:35:19 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1iC5lX-000yQm-6g for geb-bug-gnu-emacs@m.gmane.org; Sun, 22 Sep 2019 19:35:19 +0200 Original-Received: from localhost ([::1]:48050 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iC5lV-0004nS-0L for geb-bug-gnu-emacs@m.gmane.org; Sun, 22 Sep 2019 13:35:17 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:60970) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iC5lH-0004ms-NB for bug-gnu-emacs@gnu.org; Sun, 22 Sep 2019 13:35:04 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iC5lG-0008L1-Np for bug-gnu-emacs@gnu.org; Sun, 22 Sep 2019 13:35:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:53885) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iC5lG-0008KR-HB for bug-gnu-emacs@gnu.org; Sun, 22 Sep 2019 13:35:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1iC5lG-00070g-CE for bug-gnu-emacs@gnu.org; Sun, 22 Sep 2019 13:35:02 -0400 X-Loop: help-debbugs@gnu.org In-Reply-To: <1555910400.14181.1.camel@qlfiles.net> Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 22 Sep 2019 17:35:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 35374 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: confirmed Original-Received: via spool by 35374-submit@debbugs.gnu.org id=B35374.156917369526929 (code B ref 35374); Sun, 22 Sep 2019 17:35:02 +0000 Original-Received: (at 35374) by debbugs.gnu.org; 22 Sep 2019 17:34:55 +0000 Original-Received: from localhost ([127.0.0.1]:34473 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iC5l8-00070A-4V for submit@debbugs.gnu.org; Sun, 22 Sep 2019 13:34:54 -0400 Original-Received: from mail205c50.megamailservers.eu ([91.136.10.215]:42728 helo=mail193c50.megamailservers.eu) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iC5l4-0006zu-7R; Sun, 22 Sep 2019 13:34:51 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1569173688; bh=uZYaFRTWn2vxDfESaAHL4aZ/q9LikXPCE7dNP/v/UkI=; h=From:Date:Subject:Cc:To:From; b=F6C0soP99U8vC6zNSwbbUXO8lNSMDUFgs7ZWoiPY+iP671+Oulkc9ev3xSODsxSrA 58CmSS4ykP95xClH9p6iMoJoIxXFP4plnYJeKQ8Tqp7UWEkrAbDncmMZXDpgqCWDWY h5GatvtV4gnsgTbl2bNiBp0Pk2T7C+EOJdPLgaLw= Feedback-ID: mattiase@acm.or Original-Received: from [192.168.0.4] ([188.150.171.71]) (authenticated bits=0) by mail193c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x8MHYjfe021830; Sun, 22 Sep 2019 17:34:47 +0000 X-Mailer: Apple Mail (2.3445.104.11) X-CTCH-RefID: str=0001.0A0B0214.5D87B0B8.000B, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=b7vMHeOx c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=M51BFTxLslgA:10 a=_Mu3s2Z2xRbByigg6TIA:9 a=CjuIK1q_8ugA:10 a=Luvn13_oWmm2pjtSAq4A:9 a=B2y7HmGcmWMA:10 a=pHzHmUro8NiASowvMSCR:22 a=Ew2E2A-JSTLzCXPT_086:22 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: 209.51.188.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:166930 Archived-At: --Apple-Mail=_CB6A9A27-E9F1-4A28-8513-5B8CD916C647 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii tags 35374 patch stop > Maybe someone more knowledgeable about Calc can help further. Much to our surprise, very few people volunteered their service. Now, = despite being grossly under-qualified for the task, I did give it a go. = After all, we can't have it fail on simple linear equation systems now = can we. Please try this patch. --Apple-Mail=_CB6A9A27-E9F1-4A28-8513-5B8CD916C647 Content-Disposition: attachment; filename=0001-Fix-linear-equation-system-solving-in-Calc-bug-35374.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Fix-linear-equation-system-solving-in-Calc-bug-35374.patch" Content-Transfer-Encoding: quoted-printable =46rom=20980a1f0b73d2aa58335a47ad4a68005a28307a4b=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Sun,=2022=20Sep=202019=2015:03:02=20+0200=0A= Subject:=20[PATCH]=20Fix=20linear=20equation=20system=20solving=20in=20= Calc=20(bug#35374)=0A=0A*=20lisp/calc/calcalg2.el=20= (math-try-solve-for):=0ATo=20solve=20Ax^n=3D0=20where=20A=20is=20a=20= nonzero=20constant=20and=20x=20the=20variable=20to=0Asolve=20for,=20= solve=20x^n=3D0=20instead=20of=20solving=20A=3D0=20(which=20obviously=20= fails)=0Aor=20something=20equally=20stupid.=0A*=20= test/lisp/calc/calc-tests.el=20(calc-test-solve-linear-system):=20New.=0A= ---=0A=20lisp/calc/calcalg2.el=20=20=20=20=20=20=20=20|=20=20=206=20++=0A= =20test/lisp/calc/calc-tests.el=20|=20103=20= +++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20109=20= insertions(+)=0A=0Adiff=20--git=20a/lisp/calc/calcalg2.el=20= b/lisp/calc/calcalg2.el=0Aindex=2018243bfc74..2a716633ae=20100644=0A---=20= a/lisp/calc/calcalg2.el=0A+++=20b/lisp/calc/calcalg2.el=0A@@=20-2417,6=20= +2417,12=20@@=20math-try-solve-for=0A=20=09=09=09=20=20=20=20((=3D=20= (length=20math-t1)=202)=0A=20=09=09=09=20=20=20=20=20(apply=20= 'math-solve-linear=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car=20math-t2)=20= math-try-solve-sign=20math-t1))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((=3D=20(length=20math-t1)=20= 1)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20;;=20Constant=20polynomial.=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(if=20= (eql=20(nth=202=20math-t2)=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20nil=20=20=20=20= ;=20No=20possible=20solution.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Root=20of=20the=20= factor,=20if=20any.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(math-try-solve-for=20(nth=202=20= math-t2)=200=20nil=20t)))=0A=20=09=09=09=20=20=20=20(math-solve-full=0A=20= =09=09=09=20=20=20=20=20(math-poly-all-roots=20(car=20math-t2)=20= math-t1))=0A=20=09=09=09=20=20=20=20(calc-symbolic-mode=20nil)=0Adiff=20= --git=20a/test/lisp/calc/calc-tests.el=20b/test/lisp/calc/calc-tests.el=0A= index=20e1ee20b5d2..36a81dc2b7=20100644=0A---=20= a/test/lisp/calc/calc-tests.el=0A+++=20b/test/lisp/calc/calc-tests.el=0A= @@=20-215,6=20+215,109=20@@=20calc-test-calendar=0A=20=20=20(should=20= (equal=20(math-absolute-from-julian-dt=20-101=203=201)=20-36832))=0A=20=20= =20(should=20(equal=20(math-absolute-from-julian-dt=20-4713=201=201)=20= -1721425)))=0A=20=0A+(ert-deftest=20calc-test-solve-linear-system=20()=0A= +=20=20"Test=20linear=20system=20solving=20(bug#35374)."=0A+=20=20;;=20=20= =20x=20+=20y=20=3D=20=20=203=0A+=20=20;;=20=202x=20-=203y=20=3D=20-4=0A+=20= =20;;=20with=20the=20unique=20solution=20x=3D1,=20y=3D2=0A+=20=20(should=20= (equal=0A+=20=20=20=20=20=20=20=20=20=20=20(calcFunc-solve=0A+=20=20=20=20= =20=20=20=20=20=20=20=20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=203)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(-=20(*=202=20(var=20= x=20var-x))=20(*=203=20(var=20y=20var-y)))=20-4))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20'(vec=20(var=20x=20var-x)=20(var=20y=20var-y)))=0A+=20=20=20= =20=20=20=20=20=20=20=20'(vec=20(calcFunc-eq=20(var=20x=20var-x)=201)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20= y=20var-y)=202))))=0A+=0A+=20=20;;=20=20x=20+=20y=20=3D=201=0A+=20=20;;=20= =20x=20+=20y=20=3D=202=0A+=20=20;;=20has=20no=20solution=0A+=20=20= (should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20(calcFunc-solve=0A+=20= =20=20=20=20=20=20=20=20=20=20=20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(calcFunc-eq=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=201)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(+=20(var=20x=20= var-x)=20(var=20y=20var-y))=202))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= '(vec=20(var=20x=20var-x)=20(var=20y=20var-y)))=0A+=20=20=20=20=20=20=20=20= =20=20=20'(calcFunc-solve=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(vec=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(+=20(var=20x=20= var-x)=20(var=20y=20var-y))=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(calcFunc-eq=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=202))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20(vec=20(var=20x=20var-x)=20(var=20y=20= var-y)))))=0A+=20=20;;=20=20=20x=20-=20y=20=3D=201=0A+=20=20;;=20=20=20x=20= +=20y=20=3D=201=0A+=20=20;;=20with=20the=20unique=20solution=20x=3D1,=20= y=3D0=0A+=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-solve=0A+=20=20=20=20=20=20=20=20=20=20=20=20'(vec=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(-=20(var=20x=20var-x)=20= (var=20y=20var-y))=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=201))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20'(vec=20(var=20x=20var-x)=20(var=20y=20= var-y)))=0A+=20=20=20=20=20=20=20=20=20=20=20'(vec=20(calcFunc-eq=20(var=20= x=20var-x)=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20y=20var-y)=200))))=0A+=20=20;;=20=202x=20-=203y=20= +=20=20z=20=3D=20=205=0A+=20=20;;=20=20=20x=20+=20=20y=20-=202z=20=3D=20=20= 0=0A+=20=20;;=20=20-x=20+=202y=20+=203z=20=3D=20-3=0A+=20=20;;=20with=20= the=20unique=20solution=20x=3D1,=20y=3D-1,=20z=3D0=0A+=20=20(should=20= (equal=0A+=20=20=20=20=20=20=20=20=20=20=20(calcFunc-solve=0A+=20=20=20=20= =20=20=20=20=20=20=20=20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(+=20(-=20= (*=202=20(var=20x=20var-x))=20(*=203=20(var=20y=20var-y)))=20(var=20z=20= var-z))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=205)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(calcFunc-eq=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(-=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=20(*=20= 2=20(var=20z=20var-z)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 0)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(+=20(-=20(*=202=20(var=20y=20= var-y))=20(var=20x=20var-x))=20(*=203=20(var=20z=20var-z)))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20-3))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20'(vec=20(var=20x=20var-x)=20(var=20y=20var-y)=20(var=20z=20var-z)))=0A= +=20=20=20=20=20=20=20=20=20=20=20;;=20The=20`float'=20forms=20in=20the=20= result=20are=20just=20artefacts=20of=20Calc's=0A+=20=20=20=20=20=20=20=20= =20=20=20;;=20current=20solver;=20it=20should=20be=20fixed=20to=20= produce=20exact=20(integral)=0A+=20=20=20=20=20=20=20=20=20=20=20;;=20= results=20in=20this=20case.=0A+=20=20=20=20=20=20=20=20=20=20=20'(vec=20= (calcFunc-eq=20(var=20x=20var-x)=20(float=201=200))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20y=20var-y)=20= (float=20-1=200))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20z=20var-z)=200))))=0A+=20=20;;=20=20=20x=20=3D=20y=20= +=201=0A+=20=20;;=20=20=20x=20=3D=20y=0A+=20=20;;=20has=20no=20solution=0A= +=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-solve=0A+=20=20=20=20=20=20=20=20=20=20=20=20'(vec=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20x=20var-x)=20(+=20= (var=20y=20var-y)=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20x=20var-x)=20(var=20y=20var-y)))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20'(vec=20(var=20x=20var-x)=20(var=20y=20var-y)))=0A+=20= =20=20=20=20=20=20=20=20=20=20'(calcFunc-solve=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20x=20var-x)=20(+=20(var=20y=20var-y)=201))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20x=20var-x)=20= (var=20y=20var-y)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(vec=20= (var=20x=20var-x)=20(var=20y=20var-y)))))=0A+=20=20;;=20=20x=20+=20y=20+=20= z=20=3D=206=0A+=20=20;;=20=20x=20+=20y=20=20=20=20=20=3D=203=0A+=20=20;;=20= =20x=20-=20y=20=20=20=20=20=3D=201=0A+=20=20;;=20with=20the=20unique=20= solution=20x=3D2,=20y=3D1,=20z=3D3=0A+=20=20(should=20(equal=0A+=20=20=20= =20=20=20=20=20=20=20=20(calcFunc-solve=0A+=20=20=20=20=20=20=20=20=20=20= =20=20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20= (+=20(+=20(var=20x=20var-x)=20(var=20y=20var-y))=20(var=20z=20var-z))=20= 6)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(+=20(var=20= x=20var-x)=20(var=20y=20var-y))=203)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(calcFunc-eq=20(-=20(var=20x=20var-x)=20(var=20y=20var-y))=20= 1))=0A+=20=20=20=20=20=20=20=20=20=20=20=20'(vec=20(var=20x=20var-x)=20= (var=20y=20var-y)=20(var=20z=20var-z)))=0A+=20=20=20=20=20=20=20=20=20=20= =20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20= x=20var-x)=202)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(calcFunc-eq=20= (var=20y=20var-y)=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20z=20var-z)=203))))=0A+=20=20;;=20x=20=3D=203=0A+=20= =20;;=20x=20+=204y^2=20=3D=203=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(ok,=20so=20this=20one=20isn't=20linear)=0A+=20=20;;=20with=20= the=20unique=20(double)=20solution=20x=3D3,=20y=3D0=0A+=20=20(should=20= (equal=0A+=20=20=20=20=20=20=20=20=20=20=20(calcFunc-solve=0A+=20=20=20=20= =20=20=20=20=20=20=20=20'(vec=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (calcFunc-eq=20(var=20x=20var-x)=203)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(calcFunc-eq=20(+=20(var=20x=20var-x)=20(*=204=20(^=20(var=20y=20= var-y)=202)))=203))=0A+=20=20=20=20=20=20=20=20=20=20=20=20'(vec=20(var=20= x=20var-x)=20(var=20y=20var-y)))=0A+=20=20=20=20=20=20=20=20=20=20=20= '(vec=20(calcFunc-eq=20(var=20x=20var-x)=203)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(calcFunc-eq=20(var=20y=20var-y)=200)))))=0A+=0A= =20(provide=20'calc-tests)=0A=20;;;=20calc-tests.el=20ends=20here=0A=20=0A= --=20=0A2.21.0=20(Apple=20Git-122)=0A=0A= --Apple-Mail=_CB6A9A27-E9F1-4A28-8513-5B8CD916C647--