From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Zachary Kanfer Newsgroups: gmane.emacs.bugs Subject: bug#62892: proposal to extend mark-sexp to go forward and backward on command Date: Sun, 23 Apr 2023 01:33:44 -0400 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000007f2c8e05f9fa3c28" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16237"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Ruijie Yu , 62892@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Apr 23 07:35:32 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1pqSNo-0003xe-7D for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 23 Apr 2023 07:35:32 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pqSNX-0007YZ-It; Sun, 23 Apr 2023 01:35:15 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pqSNS-0007YI-KB for bug-gnu-emacs@gnu.org; Sun, 23 Apr 2023 01:35:10 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pqSNK-0005jo-Lw for bug-gnu-emacs@gnu.org; Sun, 23 Apr 2023 01:35:10 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pqSNK-0008U1-1B for bug-gnu-emacs@gnu.org; Sun, 23 Apr 2023 01:35:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Zachary Kanfer Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 23 Apr 2023 05:35:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 62892 X-GNU-PR-Package: emacs Original-Received: via spool by 62892-submit@debbugs.gnu.org id=B62892.168222804732529 (code B ref 62892); Sun, 23 Apr 2023 05:35:01 +0000 Original-Received: (at 62892) by debbugs.gnu.org; 23 Apr 2023 05:34:07 +0000 Original-Received: from localhost ([127.0.0.1]:44452 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pqSMQ-0008SY-HX for submit@debbugs.gnu.org; Sun, 23 Apr 2023 01:34:07 -0400 Original-Received: from mail-oa1-f46.google.com ([209.85.160.46]:62531) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pqSML-0008Rz-Fj for 62892@debbugs.gnu.org; Sun, 23 Apr 2023 01:34:04 -0400 Original-Received: by mail-oa1-f46.google.com with SMTP id 586e51a60fabf-187b70ab997so18726592fac.0 for <62892@debbugs.gnu.org>; Sat, 22 Apr 2023 22:34:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682228036; x=1684820036; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=qr9gUO7R87LUYbzDvNjx0UE3E7/RTUNw8OQ8v82kiD8=; b=ebh2JCGgJgFPZkbeAd3wKb4s0LhWSx/5rltzUnKPIJW7vhG/vFlUxTSZ/Ms8xeaSMb 0WvIjwlfn/7cQqQwX5BX0KH2mXVKykSH+apwGxuneabSg/Qh17rx7oPbmJ2PAwQm10/2 hedBJE2Onf1Q33T468hm4RmbgxkUgq1CGBmz96oYFH92YIJcUjioekzYQmhAl4yWIJoo gQfkW6iCwIljvADU1/SBW4Td1/BSNvDYXy6e9bIRUe8h+oROA6NMmb27gaGu96D4YEFe hW1dyxybu+rB98yPK8o7dnNoazbJ/3ZIYJ7OxOW3Tite7NRFawZo/U9KK1miOlPLD8tn qQKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682228036; x=1684820036; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=qr9gUO7R87LUYbzDvNjx0UE3E7/RTUNw8OQ8v82kiD8=; b=SDct5ts4OKL0S/S6CV3TsZlOTATzD+iCEklAdu3WDV6ixeIbW2XgsvhddJe3mpx0/h cwSTWD6eS/LbEFaKjBxqLYDBn6LysAc+kclAxVCY2hV8BV0QGTnDVS7tQT9UgDQCfaX3 j97/nk9VCRdUmS0I29UKsUcbSqdYZ8KaAJ8h7ajgAYpOgL+hexmIg2FwVmDLrAIAZmy9 NfJ0p5d9NAW6UYB0J1yHZgueXfrEv8yH01n0JAdlol5SkAwQPIybz5vW6c7LZbRUfLfm jw/R2UBcMCTQ4vtzkF5HOzg9nt8l6dO7+zlefxWO+aT+Mzv9iR7EtJpVtwaq1iSRGn91 5TNA== X-Gm-Message-State: AAQBX9e2EHfHhFGJGv8mWCld7SJ3iTfDWWJ5xb9n3Fc/pKRVgFtciH7F gnJWlo+JWNFQpROcuJdhKP+8u4lRZjy08wIXLoQ9wYwf3eQ= X-Google-Smtp-Source: AKy350Y9h9gVJh5hN+vU4wAMopT7iFYY4S2lcz1NKVn95oWz5YVLTVpvNxJHXa1KsVY/R/aJoHN1+ncO76JN5Ua+hKE= X-Received: by 2002:a05:6808:3082:b0:38e:6a4c:86e2 with SMTP id bl2-20020a056808308200b0038e6a4c86e2mr6292375oib.7.1682228035645; Sat, 22 Apr 2023 22:33:55 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:260492 Archived-At: --0000000000007f2c8e05f9fa3c28 Content-Type: multipart/alternative; boundary="0000000000007f2c8c05f9fa3c26" --0000000000007f2c8c05f9fa3c26 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Attached is a patch with a few updates: 1. Added documentation in doc/emacs/mark.texi, under the mark-sexp section. I'm unfamiliar with standards for how the manuals are written, but am happy to update further as needed. 2. Extracted a new helper function mark--helper. This takes two arguments -- a move function, and a number of how many things to move. The helper function is able to be used for all mark-*-forward and mark-*-backward functions; I think this should handle at least some of your concerns about the composability of the design -- different mark functions can be made by passing a different move function. For example, mark-word-forward and mark-word-backward would be defined this way: (defun mark-word-forward (&optional number-of-words) "Mark NUMBER-OF-WORDS words forward. Repeated calls to this mark more words." (interactive "p") (mark--helper #'forward-word (or number-of-words 1))) (defun mark-word-backward (&optional number-of-words) "Mark NUMBER-OF-WORDS words backward. Repeated calls to this mark more words." (interactive "p") (mark--helper #'forward-word (- (or number-of-words 1)))) I'm not exactly sure of the best place to put the helper function, nor exactly how the different lisp files in Emacs work together. There's no provide statement; are all the files in lisp/emacs-lisp loaded at the same time? If so, I'll make the other relevant functions (for marking word, defun, page, paragraph, line, and char). Also, whatever the outcome of this patch, I think it would be advisable to explain somewhere how mark-sexp extends region by the end of region opposite point; this is not in the docstring or any other documentation I've seen. On Fri, Apr 21, 2023 at 9:10=E2=80=AFAM Stefan Monnier wrote: > > If this is to be accepted, why not extend it to all like mark functions= , > > listed below? Implementing them should be pretty similar, and you migh= t > > even be able to reuse the same helper for all these variants. Also, th= e > > helper function might need to contain a double-dash in its name because > > this is inherently a private function. > > > > - `mark-defun' > > - `mark-page' > > - `mark-paragraph' > > - `mark-word' > > Agreed: we should move towards a more orthogonal/composable design, > where the granularity of the operation (char, word, line, sexp, > paragraph, page, defun, ...) and the operation itself (move, mark) and > the direction and all independent such that we can use any combination > of them. > > Both at the ELisp level and at the key-binding level. > > > Stefan > > --0000000000007f2c8c05f9fa3c26 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Attached is a patch with a few updates:

=
1. Added documentation in doc/emacs/mark.texi, under the mark-sexp sec= tion. I'm unfamiliar with standards for how the manuals are written, bu= t am happy to update further as needed.
2. Extracted a new helper= function mark--helper. This takes two arguments -- a move function, and a = number of how many things to move.

The helper func= tion is able to be used for all mark-*-forward and mark-*-backward function= s; I think this should handle at least some of your concerns about the comp= osability of the design -- different mark functions can be made by passing = a different move function. For example, mark-word-forward and mark-word-bac= kward would be defined this way:

(defun mark-word-= forward (&optional number-of-words)
=C2=A0 "Mark NUMBER-OF-WORD= S words forward.

=C2=A0Repeated calls to this mark more words."=
=C2=A0 (interactive "p")
=C2=A0 (mark--helper #'forwar= d-word (or number-of-words 1)))

(defun mark-word-backward (&opti= onal number-of-words)
=C2=A0 "Mark NUMBER-OF-WORDS words backward.<= br>
=C2=A0Repeated calls to this mark more words."
=C2=A0 (inter= active "p")
=C2=A0 (mark--helper #'forward-word (- (or num= ber-of-words 1))))

I'm not exactly sure of the= best place to put the helper function, nor exactly how the different lisp = files in Emacs work together. There's no provide statement; are all the= files in lisp/emacs-lisp loaded at the same time? If so, I'll make the= other relevant functions (for marking word, defun, page, paragraph, line, = and char).

Also, whatever the outcome of this patc= h, I think it would be advisable to explain somewhere how mark-sexp extends= region by the end of region opposite point; this is not in the docstring o= r any other documentation I've seen.

On Fri, Apr 21, 2023 at 9= :10=E2=80=AFAM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> If this is to be accepted, why not extend i= t to all like mark functions,
> listed below?=C2=A0 Implementing them should be pretty similar, and yo= u might
> even be able to reuse the same helper for all these variants.=C2=A0 Al= so, the
> helper function might need to contain a double-dash in its name becaus= e
> this is inherently a private function.
>
> - `mark-defun'
> - `mark-page'
> - `mark-paragraph'
> - `mark-word'

Agreed: we should move towards a more orthogonal/composable design,
where the granularity of the operation (char, word, line, sexp,
paragraph, page, defun, ...) and the operation itself (move, mark) and
the direction and all independent such that we can use any combination
of them.

Both at the ELisp level and at the key-binding level.


=C2=A0 =C2=A0 =C2=A0 =C2=A0 Stefan

--0000000000007f2c8c05f9fa3c26-- --0000000000007f2c8e05f9fa3c28 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Add-mark-sexp-forward-mark-sexp-backward.patch" Content-Disposition: attachment; filename="0001-Add-mark-sexp-forward-mark-sexp-backward.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lgsz4oys0 RnJvbSBlYzVmYjBiMDlkYzA1ZDU3MjY4NzRjMzE2ZGUwMDI4YTlhNGM0NmIzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBaYWNoYXJ5IEthbmZlciA8emthbmZlckBnbWFpbC5jb20+CkRh dGU6IFN1biwgMTYgQXByIDIwMjMgMjI6MTY6MzkgLTA0MDAKU3ViamVjdDogW1BBVENIXSBBZGQg bWFyay1zZXhwLWZvcndhcmQsIG1hcmstc2V4cC1iYWNrd2FyZAoKLS0tCiBkb2MvZW1hY3MvbWFy ay50ZXhpICAgICB8ICA4ICsrKysrKysKIGV0Yy9ORVdTICAgICAgICAgICAgICAgIHwgIDQgKysr KwogbGlzcC9lbWFjcy1saXNwL2xpc3AuZWwgfCA0NiArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA1OCBpbnNlcnRpb25zKCspCgpkaWZm IC0tZ2l0IGEvZG9jL2VtYWNzL21hcmsudGV4aSBiL2RvYy9lbWFjcy9tYXJrLnRleGkKaW5kZXgg M2YxYzc2YzE1OTEuLjljMjMwYTcyMjUyIDEwMDY0NAotLS0gYS9kb2MvZW1hY3MvbWFyay50ZXhp CisrKyBiL2RvYy9lbWFjcy9tYXJrLnRleGkKQEAgLTIyNCw2ICsyMjQsMTQgQEAgTWFya2luZyBP YmplY3RzCiBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBudW1lcmljIGFyZ3VtZW50cyBtb3ZlIHRoZSBt YXJrIGZvcndhcmQgb3IKIGJhY2t3YXJkIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGV4cHJl c3Npb25zLgogCitAZmluZGV4IG1hcmstc2V4cC1mb3J3YXJkCisgIEBjb2Rle21hcmstc2V4cC1m b3J3YXJkfSBpcyBzaW1pbGFyIHRvIEBjb2Rle21hcmstc2V4cH0sIGJ1dCBvbmx5CisgIG1vdmVz IGZvcndhcmQuCisKK0BmaW5kZXggbWFyay1zZXhwLWJhY2t3YXJkCisgIEBjb2Rle21hcmstc2V4 cC1iYWNrd2FyZH0gaXMgc2ltaWxhciB0byBAY29kZXttYXJrLXNleHB9LCBidXQgb25seQorICBt b3ZlcyBiYWNrd2FyZC4KKwogICAgVGhlIG90aGVyIGNvbW1hbmRzIGluIHRoZSBhYm92ZSBsaXN0 IHNldCBib3RoIHBvaW50IGFuZCBtYXJrLCBzbyBhcwogdG8gZGVsaW1pdCBhbiBvYmplY3QgaW4g dGhlIGJ1ZmZlci4gIEBrYmR7TS1ofSAoQGNvZGV7bWFyay1wYXJhZ3JhcGh9KQogbWFya3MgcGFy YWdyYXBocyAoQHB4cmVme1BhcmFncmFwaHN9KSwgQGtiZHtDLU0taH0gKEBjb2Rle21hcmstZGVm dW59KQpkaWZmIC0tZ2l0IGEvZXRjL05FV1MgYi9ldGMvTkVXUwppbmRleCBjNjFhOWVjM2M1Zi4u OWYyYjdkMjFmOWIgMTAwNjQ0Ci0tLSBhL2V0Yy9ORVdTCisrKyBiL2V0Yy9ORVdTCkBAIC04MSw2 ICs4MSwxMCBAQCBtaXN0YWtlbiBjb21wb3NpdGlvbnMsIHRoaXMgd2lsbCBub3cgd29yayBhcyB3 ZWxsLgogVGhpcyB3b3JrcyBsaWtlICdraWxsLW1hdGNoaW5nLWJ1ZmZlcnMnLCBidXQgd2l0aG91 dCBhc2tpbmcgZm9yCiBjb25maXJtYXRpb24uCiAKKy0tLQorKiogTmV3IGNvbW1hbmRzICdtYXJr LXNleHAtZm9yd2FyZCcgYW5kICdtYXJrLXNleHAtYmFja3dhcmQnLgorVGhlc2Ugd29yayBsaWtl IG1hcmstc2V4cCwgYnV0IGV4cGxpY2l0bHkgYWxsb3cgc2V4cHMgdG8gYmUgbWFya2VkIGZvcndh cmQgYW5kIGJhY2t3YXJkLgorCiAMCiAqIENoYW5nZXMgaW4gU3BlY2lhbGl6ZWQgTW9kZXMgYW5k IFBhY2thZ2VzIGluIEVtYWNzIDMwLjEKIApkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL2xp c3AuZWwgYi9saXNwL2VtYWNzLWxpc3AvbGlzcC5lbAppbmRleCA0MTdjMjE4YzZkNy4uMzAxOTQz NTRmMTkgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC9saXNwLmVsCisrKyBiL2xpc3AvZW1h Y3MtbGlzcC9saXNwLmVsCkBAIC0xMjksNiArMTI5LDUyIEBAIG1hcmstc2V4cAogCSAgICAocG9p bnQpKQogCSAgbmlsIHQpKSkpCiAKKyhkZWZ1biBtYXJrLS1oZWxwZXIgKG1vdmUtZm4gbnVtYmVy LW9mLXRoaW5ncykKKyAgIlVzZSBNT1ZFLUZOIHRvIG1vdmUgTlVNQkVSLU9GLVRISU5HUyB0aGlu Z3MsIGV4dGVuZGluZyByZWdpb24gb3ZlciB0aGVtLgorCitUaGUgTU9WRS1GTiBzaG91bGQgdGFr ZSBhIG51bWVyaWMgYXJndW1lbnQsIGFuZCBtb3ZlIHRoYXQgbWFueQoraXRlbXMgZm9yd2FyZCAo bmVnYXRpdmUgbWVhbnMgYmFja3dhcmQpLgorCitOVU1CRVItT0YtVEhJTkdTIGlzIHRoZSBudW1i ZXIgb2YgYWRkaXRpb25hbCB0aGluZ3MgdG8gbW92ZS4iCisgIChpZiAodXNlLXJlZ2lvbi1wKQor ICAgICAgKGxldCogKChmb3J3YXJkICg+PSBudW1iZXItb2YtdGhpbmdzIDApKQorICAgICAgICAg ICAgIChiZWdpbm5pbmctb2YtcmVnaW9uIChyZWdpb24tYmVnaW5uaW5nKSkKKyAgICAgICAgICAg ICAoZW5kLW9mLXJlZ2lvbiAocmVnaW9uLWVuZCkpCisgICAgICAgICAgICAgKGF0LWVuZC1vZi1y ZWdpb24gKD0gZW5kLW9mLXJlZ2lvbiAocG9pbnQpKSkKKyAgICAgICAgICAgICAobmV3LWJvcmRl ci1wb2ludAorICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgICAo Z290by1jaGFyIChpZiBmb3J3YXJkIChyZWdpb24tZW5kKSAocmVnaW9uLWJlZ2lubmluZykpKQor ICAgICAgICAgICAgICAgIChjb25kaXRpb24tY2FzZSBuaWwKKyAgICAgICAgICAgICAgICAgICAg KGZ1bmNhbGwgbW92ZS1mbiBudW1iZXItb2YtdGhpbmdzKQorICAgICAgICAgICAgICAgICAgKHNj YW4tZXJyb3IgKHVzZXItZXJyb3IgIk5vIG1vcmUgaW4gdGhpcyBkaXJlY3Rpb24hIikpKQorICAg ICAgICAgICAgICAgIChwb2ludCkpKQorICAgICAgICAgICAgIChuZXctYmVnaW5uaW5nLW9mLXJl Z2lvbiAobWluIGJlZ2lubmluZy1vZi1yZWdpb24gbmV3LWJvcmRlci1wb2ludCkpCisgICAgICAg ICAgICAgKG5ldy1lbmQtb2YtcmVnaW9uIChtYXggZW5kLW9mLXJlZ2lvbiBuZXctYm9yZGVyLXBv aW50KSkpCisgICAgICAgIChnb3RvLWNoYXIgKGlmIGF0LWVuZC1vZi1yZWdpb24KKyAgICAgICAg ICAgICAgICAgICAgICAgbmV3LWVuZC1vZi1yZWdpb24KKyAgICAgICAgICAgICAgICAgICAgIG5l dy1iZWdpbm5pbmctb2YtcmVnaW9uKSkKKyAgICAgICAgKHNldC1tYXJrIChpZiBhdC1lbmQtb2Yt cmVnaW9uCisgICAgICAgICAgICAgICAgICAgICAgbmV3LWJlZ2lubmluZy1vZi1yZWdpb24KKyAg ICAgICAgICAgICAgICAgICAgbmV3LWVuZC1vZi1yZWdpb24pKSkKKyAgICAocHJvZ24gKHB1c2gt bWFyayAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIG1v dmUtZm4gbnVtYmVyLW9mLXRoaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkp KQorICAgICAgICAgICAoYWN0aXZhdGUtbWFyaykpKSkKKworKGRlZnVuIG1hcmstc2V4cC1mb3J3 YXJkICgmb3B0aW9uYWwgbnVtYmVyLW9mLWV4cHJlc3Npb25zKQorICAiTWFyayBOVU1CRVItT0Yt RVhQUkVTU0lPTlMgcy1leHByZXNzaW9ucyBmb3J3YXJkLgorCisgUmVwZWF0ZWQgY2FsbHMgdG8g dGhpcyBtYXJrIG1vcmUgcy1leHByZXNzaW9ucy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICht YXJrLS1oZWxwZXIgIydmb3J3YXJkLXNleHAgKG9yIG51bWJlci1vZi1leHByZXNzaW9ucyAxKSkp CisKKyhkZWZ1biBtYXJrLXNleHAtYmFja3dhcmQgKCZvcHRpb25hbCBudW1iZXItb2YtZXhwcmVz c2lvbnMpCisgICJNYXJrIE5VTUJFUi1PRi1FWFBSRVNTSU9OUyBzLWV4cHJlc3Npb25zIGJhY2t3 YXJkLgorCisgUmVwZWF0ZWQgY2FsbHMgdG8gdGhpcyBtYXJrIG1vcmUgcy1leHByZXNzaW9ucy4i CisgIChpbnRlcmFjdGl2ZSAicCIpCisgIChtYXJrLS1oZWxwZXIgIydmb3J3YXJkLXNleHAgKC0g KG9yIG51bWJlci1vZi1leHByZXNzaW9ucyAxKSkpKQorCiAoZGVmdW4gZm9yd2FyZC1saXN0ICgm b3B0aW9uYWwgYXJnIGludGVyYWN0aXZlKQogICAiTW92ZSBmb3J3YXJkIGFjcm9zcyBvbmUgYmFs YW5jZWQgZ3JvdXAgb2YgcGFyZW50aGVzZXMuCiBUaGlzIGNvbW1hbmQgd2lsbCBhbHNvIHdvcmsg b24gb3RoZXIgcGFyZW50aGVzZXMtbGlrZSBleHByZXNzaW9ucwotLSAKMi4zOC40Cgo= --0000000000007f2c8e05f9fa3c28--