From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: Amai Kinono Newsgroups: gmane.emacs.bugs Subject: bug#39600: [PATCH] Fix handling of non-exclusive non-prefix completion functions Date: Fri, 14 Feb 2020 15:34:19 +0800 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000006ba657059e843c86" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="56175"; mail-complaints-to="usenet@ciao.gmane.io" To: 39600@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Feb 14 16:08:13 2020 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 1j2cZg-000EWI-RZ for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 14 Feb 2020 16:08:12 +0100 Original-Received: from localhost ([::1]:40020 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j2cZf-0002mx-RT for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 14 Feb 2020 10:08:11 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:44671) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j2cZY-0002mr-3l for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 10:08:05 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j2cZW-0003Dn-KY for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 10:08:04 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:56723) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1j2cZW-0003DN-EM for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 10:08:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1j2cZW-0002Cm-8l for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 10:08:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Amai Kinono Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 14 Feb 2020 15:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 39600 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.15816928748460 (code B ref -1); Fri, 14 Feb 2020 15:08:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 14 Feb 2020 15:07:54 +0000 Original-Received: from localhost ([127.0.0.1]:34463 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j2cZN-0002CN-SD for submit@debbugs.gnu.org; Fri, 14 Feb 2020 10:07:54 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:41615) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1j2VUg-0005le-LA for submit@debbugs.gnu.org; Fri, 14 Feb 2020 02:34:35 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55018) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j2VUe-0003Cg-SH for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 02:34:34 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j2VUd-0007gs-94 for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 02:34:32 -0500 Original-Received: from mail-qk1-x744.google.com ([2607:f8b0:4864:20::744]:40757) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1j2VUd-0007gH-2z for bug-gnu-emacs@gnu.org; Fri, 14 Feb 2020 02:34:31 -0500 Original-Received: by mail-qk1-x744.google.com with SMTP id b7so8327468qkl.7 for ; Thu, 13 Feb 2020 23:34:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=PkTFLG20wezB0j2GOZioRETftw6BYh9JvAtxKLeFySI=; b=ZffBi031RNxgSt2+SqfmzaxMvp8Y3rC2S7sIiLpwgQSWfdX1WBlCgr6Snqdu6cjLal ydofjclMGi0Dxxe9FOlu7/Csn7I/NVPd6dXYGawBJ3HZGlzBr7IyM+bLOybL+5DjWeZp RoZ1a+M8X+CGlqv7Z7gsEICT4RmvMgMZ8Gi9rubNAdt+ADv76JBKRF2dUiJnXffEcNv5 1blbvf1aLD4eTPfW4igGMY89qtkAFf9M4uLZYQh9DP6wvTkT8PqLirVJGeiNfK3bVnmS QpMLcxq47FjgyB74AQyb1pncoKPEjQwbwdLFWdjO19eeKgHIoPmA3MXaaVgwWKBiRQ4l LJEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=PkTFLG20wezB0j2GOZioRETftw6BYh9JvAtxKLeFySI=; b=B3IXv8olZoSCkRwNYn5UcqGu3FVMsYE5s3+8Hhg++6Is2JEpvV15YikdI9H8Z6HMm7 2ueIWdnhaKMw7txpZFQTS5K/vjr/BLfF7h2Lb4ixkBCyhHWHwDjGQtUzKMNIMyvSUA9Y Y0oGatsSkWnEq911tToiEbJwMz/5IsSMJ03PYu9d1X5lZIfZ4hfNWtdOjesQc2OsuU3B N1d0vHlNTH1NFj5uSSTK9rWoJzDALPUVNYJsUVPzm85W9LacICOS4Re1vphcEGhqVIQg BK2fB3Y6HZ8MoCE6hoVKUukd2USnhXl6bezLo5gtPIII7P3mottieGwv8tix3ZX7Z1zO 0QuA== X-Gm-Message-State: APjAAAUVQPif67x5JpwzMgb8J6ElAZ9MvPkRPBO59aAFfnp9oUWblSh1 ipehU143/3j1LFI/d2RXT3MtKVswWCKdSa+DHK+WcU77m9E= X-Google-Smtp-Source: APXvYqwbnrmQo9+AALtl+0VMAU3mhdUbJM5B/wytwO2x8wnUEn2Nvl0OUqbaS4lV0mIobYpcq2kTIX1f90KBogYWHZ0= X-Received: by 2002:a05:620a:cc8:: with SMTP id b8mr1288485qkj.65.1581665670102; Thu, 13 Feb 2020 23:34:30 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Mailman-Approved-At: Fri, 14 Feb 2020 10:07:53 -0500 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-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:176056 Archived-At: --0000000000006ba657059e843c86 Content-Type: multipart/alternative; boundary="0000000000006ba656059e843c84" --0000000000006ba656059e843c84 Content-Type: text/plain; charset="UTF-8" # What does this fix? Currently, with non-exclusive completion functions, Emacs will do `try-completion` on the current text, and decide whether to try next completion function based on that. This makes completion functions that can do non-prefix completions fails when the current text only occurs in the middle of the candidates. This is a problem I found in a FIXME in the code. # How does this work? I use `completion-all-completions` instead. As far as I know, this respects the `completion-styles`. Here's a simple test. Eval this: ``` (require 'thingatpt) (defun my-completion-at-point () (let* ((symbol (thing-at-point 'symbol)) (bounds (bounds-of-thing-at-point 'symbol))) (list (car bounds) (cdr bounds) '("gnuemacs" "xemacs" "uemacs") :exclusive 'no))) (setq completion-at-point-functions '(my-completion-at-point elisp-completion-at-point)) (setq completion-styles '(substring)) ``` Now type "emacs" and press `C-M-i`, the candidates defined in `my-completion-at-point` will show up correctly. Now change `completion-styles` to `(basic)`, and complete "emacs" again, it fallbacks to `elisp-completion-at-point`. # The patch See the attachment. Since I don't know much about email, I'm not sure if gmail's attachment is permanent, so I'll also paste the diff and commit log here: ## Diff --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -2244,18 +2244,11 @@ completion--capf-wrapper (unless (member fun completion--capf-safe-funs) (push fun completion--capf-safe-funs)) (and (eq 'no (plist-get (nthcdr 3 res) :exclusive)) - ;; FIXME: Here we'd need to decide whether there are - ;; valid completions against the current text. But this depends - ;; on the actual completion UI (e.g. with the default completion - ;; it depends on completion-style) ;-( - ;; We approximate this result by checking whether prefix - ;; completion might work, which means that non-prefix completion - ;; will not work (or not right) for completion functions that - ;; are non-exclusive. - (null (try-completion (buffer-substring-no-properties - (car res) (point)) - (nth 2 res) - (plist-get (nthcdr 3 res) :predicate))) + (null (completion-all-completions + (buffer-substring-no-properties (car res) (point)) + (nth 2 res) + (plist-get (nthcdr 3 res) :predicate) + (- (point) (car res)))) (setq res nil))) ((not (or (listp res) (functionp res))) (unless (member fun completion--capf-misbehave-funs) ## Commit Log Fix handling for non-exclusive non-prefix completion functions * lisp/minibuffer.el (completion--capf-wrapper): use completion-all-completions to do the test. --0000000000006ba656059e843c84 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
# What does this fix?

Currently, with non-exclusive= completion functions, Emacs will do
`try-completion` on the current tex= t, and decide whether to try next
completion function based on that. Thi= s makes completion functions that
can do non-prefix completions fails wh= en the current text only occurs in
the middle of the candidates. This is= a problem I found in a FIXME in
the code.

# How does this work?<= br>
I use `completion-all-completions` instead. As far as I know, thisrespects the `completion-styles`.

Here's a simple test. Eval t= his:

```
(require 'thingatpt)
(defun my-completion-at-poin= t ()
=C2=A0 (let* ((symbol (thing-at-point 'symbol))
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(bounds (bounds-of-thing-at-point 'symbol)))=C2=A0 =C2=A0 (list (car bounds) (cdr bounds)
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 '("gnuemacs" "xemacs" "uemacs"= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :exclusive 'no)))
(setq comp= letion-at-point-functions
=C2=A0 =C2=A0 =C2=A0 '(my-completion-at-po= int elisp-completion-at-point))
(setq completion-styles '(substring)= )
```

Now type "emacs" and press `C-M-i`, the candidate= s defined in
`my-completion-at-point` will show up correctly. Now change=
`completion-styles` to `(basic)`, and complete "emacs" again,= it
fallbacks to `elisp-completion-at-point`.

# The patch

= See the attachment. Since I don't know much about email, I'm not su= re if
gmail's attachment is permanent, so I'll also paste the di= ff and commit
log here:

## Diff

--- a/lisp/minibuffer.el+++ b/lisp/minibuffer.el
@@ -2244,18 +2244,11 @@ completion--capf-wrap= per
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(unless (member fun complet= ion--capf-safe-funs)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pu= sh fun completion--capf-safe-funs))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0(and (eq 'no (plist-get (nthcdr 3 res) :exclusive))
- =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; FIXME: Here we'd need to d= ecide whether there are
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ;; valid completions against the current text.=C2=A0 But this depends- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; on the actual compl= etion UI (e.g. with the default completion
- =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 ;; it depends on completion-style) ;-(
- =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We approximate this result by = checking whether prefix
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ;; completion might work, which means that non-prefix completion
- = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; will not work (or not r= ight) for completion functions that
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 ;; are non-exclusive.
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 (null (try-completion (buffer-substring-no-properties
= - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(car res) (point= ))
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (nth 2 res)
= - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plist-get (nthcdr 3 r= es) :predicate)))
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (nu= ll (completion-all-completions
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(buffer-substring-no-properties (car = res) (point))
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0(nth 2 res)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(plist-get (nthcdr 3 res) :predicate)=
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0(- (point) (car res))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (setq res nil)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((not= (or (listp res) (functionp res)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0(unless (member fun completion--capf-misbehave-funs)

## Commit= Log

Fix handling for non-exclusive non-prefix completion functions<= br>
* lisp/minibuffer.el (completion--capf-wrapper):
use completion-a= ll-completions to do the test.
--0000000000006ba656059e843c84-- --0000000000006ba657059e843c86 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Fix-handling-for-non-exclusive-non-prefix-completion.patch" Content-Disposition: attachment; filename="0001-Fix-handling-for-non-exclusive-non-prefix-completion.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_k6lutlbe0 RnJvbSA0ZGQ0ZDU4ZDU2YzExMWViMWJhNDgyMTE5YzA3MTM0Yjg1NTkxNzQ3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbWFpS2lub25vIDxhbWFpa2lub25vQGdtYWlsLmNvbT4KRGF0 ZTogRnJpLCAxNCBGZWIgMjAyMCAxNDo1Mjo1NSArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIEZpeCBo YW5kbGluZyBmb3Igbm9uLWV4Y2x1c2l2ZSBub24tcHJlZml4IGNvbXBsZXRpb24KIGZ1bmN0aW9u cwoKKiBsaXNwL21pbmlidWZmZXIuZWwgKGNvbXBsZXRpb24tLWNhcGYtd3JhcHBlcik6CnVzZSBj b21wbGV0aW9uLWFsbC1jb21wbGV0aW9ucyB0byBkbyB0aGUgdGVzdC4KLS0tCiBsaXNwL21pbmli dWZmZXIuZWwgfCAxNyArKysrKy0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDUgaW5zZXJ0 aW9ucygrKSwgMTIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9taW5pYnVmZmVyLmVs IGIvbGlzcC9taW5pYnVmZmVyLmVsCmluZGV4IDQ5ZGFhYmMuLmY4MTFhNWYgMTAwNjQ0Ci0tLSBh L2xpc3AvbWluaWJ1ZmZlci5lbAorKysgYi9saXNwL21pbmlidWZmZXIuZWwKQEAgLTIyNDQsMTgg KzIyNDQsMTEgQEAgY29tcGxldGlvbi0tY2FwZi13cmFwcGVyCiAgICAgICAgICAgKHVubGVzcyAo bWVtYmVyIGZ1biBjb21wbGV0aW9uLS1jYXBmLXNhZmUtZnVucykKICAgICAgICAgICAgIChwdXNo IGZ1biBjb21wbGV0aW9uLS1jYXBmLXNhZmUtZnVucykpCiAgICAgICAgICAgKGFuZCAoZXEgJ25v IChwbGlzdC1nZXQgKG50aGNkciAzIHJlcykgOmV4Y2x1c2l2ZSkpCi0gICAgICAgICAgICAgICA7 OyBGSVhNRTogSGVyZSB3ZSdkIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlcmUgYXJlCi0gICAg ICAgICAgICAgICA7OyB2YWxpZCBjb21wbGV0aW9ucyBhZ2FpbnN0IHRoZSBjdXJyZW50IHRleHQu ICBCdXQgdGhpcyBkZXBlbmRzCi0gICAgICAgICAgICAgICA7OyBvbiB0aGUgYWN0dWFsIGNvbXBs ZXRpb24gVUkgKGUuZy4gd2l0aCB0aGUgZGVmYXVsdCBjb21wbGV0aW9uCi0gICAgICAgICAgICAg ICA7OyBpdCBkZXBlbmRzIG9uIGNvbXBsZXRpb24tc3R5bGUpIDstKAotICAgICAgICAgICAgICAg OzsgV2UgYXBwcm94aW1hdGUgdGhpcyByZXN1bHQgYnkgY2hlY2tpbmcgd2hldGhlciBwcmVmaXgK LSAgICAgICAgICAgICAgIDs7IGNvbXBsZXRpb24gbWlnaHQgd29yaywgd2hpY2ggbWVhbnMgdGhh dCBub24tcHJlZml4IGNvbXBsZXRpb24KLSAgICAgICAgICAgICAgIDs7IHdpbGwgbm90IHdvcmsg KG9yIG5vdCByaWdodCkgZm9yIGNvbXBsZXRpb24gZnVuY3Rpb25zIHRoYXQKLSAgICAgICAgICAg ICAgIDs7IGFyZSBub24tZXhjbHVzaXZlLgotICAgICAgICAgICAgICAgKG51bGwgKHRyeS1jb21w bGV0aW9uIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGNhciByZXMpIChwb2ludCkpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKG50aCAyIHJlcykKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAocGxpc3QtZ2V0IChudGhjZHIgMyByZXMpIDpwcmVkaWNhdGUpKSkKKyAg ICAgICAgICAgICAgIChudWxsIChjb21wbGV0aW9uLWFsbC1jb21wbGV0aW9ucworICAgICAgICAg ICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgKGNhciByZXMpIChw b2ludCkpCisgICAgICAgICAgICAgICAgICAgICAgKG50aCAyIHJlcykKKyAgICAgICAgICAgICAg ICAgICAgICAocGxpc3QtZ2V0IChudGhjZHIgMyByZXMpIDpwcmVkaWNhdGUpCisgICAgICAgICAg ICAgICAgICAgICAgKC0gKHBvaW50KSAoY2FyIHJlcykpKSkKICAgICAgICAgICAgICAgIChzZXRx IHJlcyBuaWwpKSkKICAgICAgICAgICgobm90IChvciAobGlzdHAgcmVzKSAoZnVuY3Rpb25wIHJl cykpKQogICAgICAgICAgICh1bmxlc3MgKG1lbWJlciBmdW4gY29tcGxldGlvbi0tY2FwZi1taXNi ZWhhdmUtZnVucykKLS0gCjIuMjUuMAoK --0000000000006ba657059e843c86--