From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: chen bin Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] add 'string-distance' to calculate Levenshtein distance Date: Fri, 20 Apr 2018 20:47:23 +1000 Message-ID: References: <87vacuecrn.fsf@gmail.com> <83po3246ah.fsf@gnu.org> <87lgdq831h.fsf@gmail.com> <83muy553ae.fsf@gnu.org> <87o9ilhhcd.fsf@gmail.com> <83d0z14sws.fsf@gnu.org> <87o9il0wka.fsf@gmail.com> <83bmek4jdn.fsf@gnu.org> <83k1t72b2o.fsf@gnu.org> <83bmei36dw.fsf@gnu.org> <83wox3zkm7.fsf@gnu.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000d53b83056a4569ab" X-Trace: blaine.gmane.org 1524221180 29425 195.159.176.226 (20 Apr 2018 10:46:20 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 20 Apr 2018 10:46:20 +0000 (UTC) Cc: emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Apr 20 12:46:16 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1f9TYT-0007W1-71 for ged-emacs-devel@m.gmane.org; Fri, 20 Apr 2018 12:46:13 +0200 Original-Received: from localhost ([::1]:46716 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f9TaZ-0002wV-Nt for ged-emacs-devel@m.gmane.org; Fri, 20 Apr 2018 06:48:23 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59523) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f9TZj-0002vx-6O for emacs-devel@gnu.org; Fri, 20 Apr 2018 06:47:32 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f9TZh-0005Nn-HW for emacs-devel@gnu.org; Fri, 20 Apr 2018 06:47:31 -0400 Original-Received: from mail-lf0-x22f.google.com ([2a00:1450:4010:c07::22f]:38271) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1f9TZf-0005GH-1R; Fri, 20 Apr 2018 06:47:27 -0400 Original-Received: by mail-lf0-x22f.google.com with SMTP id z130-v6so4521298lff.5; Fri, 20 Apr 2018 03:47:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=hYBzGbyFqbQKMrab0PrY5F5dm3NOw1+k1KsnBOYJEoM=; b=IY9y+0aM5aAT6BwVbzHdP9jbbsgkm+FJ2HsxvvcmWrS6f1IDpImoFNst5HgY8E0UES f4P9UckKN0qnGr92URmA5jUxpg1yu3QIlfvHtFinXTcvrRY+xTywPGDu3dynX6QJnD0z PUIpLr3+CqxOU5fGXkWXy5wV/TzpNh5/VF6smp0dZVTd74QsfDgYir47ysqaoX7AM0bF esIkV2lX91TD14HsNtioiqyzl5Hcsy2yrUlOKglMmH8d1jpifBRfjIBBZVXsn+Xon9IN w/jr6BLd0UO1YUQkQt8PHDkulPgfHy4y5xal7wCZymsWuD8MIN7Votov1X3XqLFxYPEl 9Y7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=hYBzGbyFqbQKMrab0PrY5F5dm3NOw1+k1KsnBOYJEoM=; b=soG/6g2c9cW5VepYIv1nfdJlRTK9Qhq0LTIXphd3gOJQnkSl/2wy8Ls5g/XaAu5lDK 2LY3QZa9EUQT5lhpi/KeQhTxaDBPdCQUFZdGzkr3WqgcxjTY9mZhkpG+OLhJV/adLYAt KSg6IeYaaL5JFJf2rACSWuUHXJwKNitxLs/SU7Y+gJx4Dm8zZm/nvXI4SH39kJYWDdXN dw7mtdOhZzFz1N0NEW2Ye3JZqeWj/N3Kb1stz7Nlb54ecu86nngpvoALM24mV977sVn2 CBX6Em7MVj2yzRp41sDEegO2gMT6/uCkXMMc47jbmS4xxVNRAg+TkL+wJ8GtHbosPKXw qhvw== X-Gm-Message-State: ALQs6tAv98OLovkZZDXYrsW273IOhXYtqirG8s/1L2JOHU/mAUBJU3zu /HsDtkQUb0R3DRvWg2fTj0eivzW6MaxJxL/KMX0= X-Google-Smtp-Source: AB8JxZqTOa3AEkWrXp/8N6WbJ9KgetMj3EWzW8mns4CFDIzHosnVnsWlbOS2zx8WZik4a+7Jli2XN1TExnYlukvab5M= X-Received: by 2002:a19:c184:: with SMTP id r126-v6mr2475865lff.116.1524221244414; Fri, 20 Apr 2018 03:47:24 -0700 (PDT) Original-Received: by 10.46.20.93 with HTTP; Fri, 20 Apr 2018 03:47:23 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::22f X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:224737 Archived-At: --000000000000d53b83056a4569ab Content-Type: text/plain; charset="UTF-8" Hi, Eli, Attached is latest patch. It will use byte compare aglorithm if both strings are not multi-byte strings. Regards, Chen On Fri, Apr 20, 2018 at 12:55 AM, chen bin wrote: > Hi, Eli, > I attached the new patch. > > A software project usually contains nomal directory and file names. > Linux kernel source, for example. > > My package `counsel-etags` will use byte compare version. > > Regards, > Chen > > On Thu, Apr 19, 2018 at 6:05 PM, Eli Zaretskii wrote: >>> From: chen bin >>> Date: Tue, 17 Apr 2018 22:31:20 +1000 >>> Cc: emacs-devel@gnu.org >>> >>> As you suggested, I re-write the code using 'FETCH_STRING_CHAR_ADVANCE'. >> >> Thanks. >> >>> I also implemented the byte comparing version. It's 4 times as fast. And I do >>> need use it to compare file path in my package 'counsel-etags'. >> >> File names are just strings for this purpose, and they can potentially >> include any non-zero characters. So I don't see why they are special. >> >>> The fille path couldn't contain any funny characters (emoji). so >>> it'sperfectly fine >>> to use byte comparing version. >> >> File names can very well include emoji and other "funny" characters, >> Emacs supports that on all modern systems (including even MS-Windows). >> >>> diff --git a/etc/NEWS b/etc/NEWS >>> index 5aa92e2991..3cce2c48c7 100644 >>> --- a/etc/NEWS >>> +++ b/etc/NEWS >>> @@ -490,6 +490,8 @@ x-lost-selection-hooks, x-sent-selection-hooks >>> +++ >>> ** New function assoc-delete-all. >>> >>> +** New function string-distance to calculate Levenshtein distance between two strings. >> >> This long line should be filled using the fill-column setting we use >> in NEWS. Even better, make the header a short summary, like >> >> ** New function 'string-distance' >> >> and then describe its functionality in a separate sentence that starts >> immediately below that header. >> >>> +DEFUN ("string-distance", Fstring_distance, Sstring_distance, 2, 3, 0, >>> + doc: /* Return Levenshtein distance between STRING1 and STRING2. >>> +If BYTECOMPARE is nil, we compare character of strings. >>> +If BYTECOMPARE is t, we compare byte of strings. >> >> Please lose the "we" part, it's inappropriate in documentation, >> because it describes what Emacs does. >> >>> +Comparing by byte is faster and non-ascii characters has weighted distance. >> >> I would delete this sentence, it is IMO confusing more than anything >> else. (And I still think the bytewise comparison is not needed.) >> >>> + bool use_bytecompare = !NILP(bytecompare); >> ^^ >> Space between these 2 characters. >> >>> + else >>> + { >>> + int c1, c2; >>> + ptrdiff_t i1, i1_byte, i2, i2_byte; >>> + i2 = i2_byte = 0; >>> + for (x = 1; x <= len2; x++) >> >> Please move the initialization of i2 and i2_byte into the for-loop >> initializer (suing the comma operator). >> >>> + i1 = i1_byte = 0; >>> + for (y = 1, lastdiag = x - 1; y <= len1; y++) >> >> Likewise here with i1 and i1_byte. >> >> Thanks. > > > > -- > help me, help you. -- help me, help you. --000000000000d53b83056a4569ab Content-Type: text/x-patch; charset="UTF-8"; name="0001-add-api-string-distance.patch" Content-Disposition: attachment; filename="0001-add-api-string-distance.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jg7ty68p1 RnJvbSA3N2UzNGNiM2UzMzZjNzY0Y2Q3OWI2N2IyNTQ2NGY0NGY3NmRhNmY5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBDaGVuIEJpbiA8Y2hlbmJpbi5zaEBnbWFpbC5jb20+CkRhdGU6 IEZyaSwgMjAgQXByIDIwMTggMDA6Mzg6MjkgKzEwMDAKU3ViamVjdDogW1BBVENIXSBhZGQgYXBp IHN0cmluZy1kaXN0YW5jZQoKLS0tCiBldGMvTkVXUyAgICAgICAgICAgICAgICB8ICAzICsrKwog c3JjL2Zucy5jICAgICAgICAgICAgICAgfCA2MiArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiB0ZXN0L2xpc3Avc3Vici10ZXN0cy5lbCB8IDE4ICsrKysr KysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDgzIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQg YS9ldGMvTkVXUyBiL2V0Yy9ORVdTCmluZGV4IDVhYTkyZTI5OTEuLjRlZmI3ZTk4M2UgMTAwNjQ0 Ci0tLSBhL2V0Yy9ORVdTCisrKyBiL2V0Yy9ORVdTCkBAIC00OTAsNiArNDkwLDkgQEAgeC1sb3N0 LXNlbGVjdGlvbi1ob29rcywgeC1zZW50LXNlbGVjdGlvbi1ob29rcwogKysrCiAqKiBOZXcgZnVu Y3Rpb24gYXNzb2MtZGVsZXRlLWFsbC4KIAorKiogTmV3IGZ1bmN0aW9uIHN0cmluZy1kaXN0YW5j ZSB0byBjYWxjdWxhdGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UKK2JldHdlZW4gdHdvIHN0cmluZ3Mu CisKICoqICdwcmludC1xdW90ZWQnIG5vdyBkZWZhdWx0cyB0byB0LCBzbyBpZiB5b3Ugd2FudCB0 byBzZWUKIChxdW90ZSB4KSBpbnN0ZWFkIG9mICd4IHlvdSB3aWxsIGhhdmUgdG8gYmluZCBpdCB0 byBuaWwgd2hlcmUgYXBwbGljYWJsZS4KIApkaWZmIC0tZ2l0IGEvc3JjL2Zucy5jIGIvc3JjL2Zu cy5jCmluZGV4IDk0YjlkOTg0ZjAuLjZlODUxYzg1NTUgMTAwNjQ0Ci0tLSBhL3NyYy9mbnMuYwor KysgYi9zcmMvZm5zLmMKQEAgLTE1Myw2ICsxNTMsNjcgQEAgSWYgU1RSSU5HIGlzIG11bHRpYnl0 ZSwgdGhpcyBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgU1RSSU5HLiAgKi8pCiAg IHJldHVybiBtYWtlX251bWJlciAoU0JZVEVTIChzdHJpbmcpKTsKIH0KIAorREVGVU4gKCJzdHJp bmctZGlzdGFuY2UiLCBGc3RyaW5nX2Rpc3RhbmNlLCBTc3RyaW5nX2Rpc3RhbmNlLCAyLCAzLCAw LAorICAgICAgIGRvYzogLyogUmV0dXJuIExldmVuc2h0ZWluIGRpc3RhbmNlIGJldHdlZW4gU1RS SU5HMSBhbmQgU1RSSU5HMi4KK0lmIEJZVEVDT01QQVJFIGlzIG5pbCwgY29tcGFyZSBjaGFyYWN0 ZXIgb2Ygc3RyaW5ncy4KK0lmIEJZVEVDT01QQVJFIGlzIHQsIGNvbXBhcmUgYnl0ZSBvZiBzdHJp bmdzLgorQ2FzZSBpcyBzaWduaWZpY2FudCwgYnV0IHRleHQgcHJvcGVydGllcyBhcmUgaWdub3Jl ZC4gKi8pCisgIChMaXNwX09iamVjdCBzdHJpbmcxLCBMaXNwX09iamVjdCBzdHJpbmcyLCBMaXNw X09iamVjdCBieXRlY29tcGFyZSkKKworeworICBDSEVDS19TVFJJTkcgKHN0cmluZzEpOworICBD SEVDS19TVFJJTkcgKHN0cmluZzIpOworCisgIGJvb2wgdXNlX2J5dGVfY29tcGFyZSA9ICFOSUxQ IChieXRlY29tcGFyZSkKKyAgICB8fCAoIVNUUklOR19NVUxUSUJZVEUgKHN0cmluZzEpICYmICFT VFJJTkdfTVVMVElCWVRFIChzdHJpbmcyKSk7CisgIHB0cmRpZmZfdCBsZW4xID0gdXNlX2J5dGVf Y29tcGFyZT8gU0JZVEVTIChzdHJpbmcxKSA6IFNDSEFSUyAoc3RyaW5nMSk7CisgIHB0cmRpZmZf dCBsZW4yID0gdXNlX2J5dGVfY29tcGFyZT8gU0JZVEVTIChzdHJpbmcyKSA6IFNDSEFSUyAoc3Ry aW5nMik7CisgIHB0cmRpZmZfdCB4LCB5LCBsYXN0ZGlhZywgb2xkZGlhZzsKKworICBVU0VfU0FG RV9BTExPQ0E7CisgIHB0cmRpZmZfdCAqY29sdW1uID0gU0FGRV9BTExPQ0EgKChsZW4xICsgMSkg KiBzaXplb2YgKHB0cmRpZmZfdCkpOworICBmb3IgKHkgPSAxOyB5IDw9IGxlbjE7IHkrKykKKyAg ICBjb2x1bW5beV0gPSB5OworCisgIGlmICh1c2VfYnl0ZV9jb21wYXJlKQorICAgIHsKKyAgICAg IGNoYXIgKnMxID0gU1NEQVRBIChzdHJpbmcxKTsKKyAgICAgIGNoYXIgKnMyID0gU1NEQVRBIChz dHJpbmcyKTsKKworICAgICAgZm9yICh4ID0gMTsgeCA8PSBsZW4yOyB4KyspCisgICAgICAgIHsK KyAgICAgICAgICBjb2x1bW5bMF0gPSB4OworICAgICAgICAgIGZvciAoeSA9IDEsIGxhc3RkaWFn ID0geCAtIDE7IHkgPD0gbGVuMTsgeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBv bGRkaWFnID0gY29sdW1uW3ldOworICAgICAgICAgICAgICBjb2x1bW5beV0gPSBtaW4gKG1pbiAo Y29sdW1uW3ldICsgMSwgY29sdW1uW3ktMV0gKyAxKSwgbGFzdGRpYWcgKyAoczFbeS0xXSA9PSBz Mlt4LTFdPyAwIDogMSkpOworICAgICAgICAgICAgICBsYXN0ZGlhZyA9IG9sZGRpYWc7CisgICAg ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgYzEs IGMyOworICAgICAgcHRyZGlmZl90IGkxLCBpMV9ieXRlLCBpMiA9IDAsIGkyX2J5dGUgPSAwOwor ICAgICAgZm9yICh4ID0gMTsgeCA8PSBsZW4yOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICBj b2x1bW5bMF0gPSB4OworICAgICAgICAgIEZFVENIX1NUUklOR19DSEFSX0FEVkFOQ0UgKGMyLCBz dHJpbmcyLCBpMiwgaTJfYnl0ZSk7CisgICAgICAgICAgaTEgPSBpMV9ieXRlID0gMDsKKyAgICAg ICAgICBmb3IgKHkgPSAxLCBsYXN0ZGlhZyA9IHggLSAxOyB5IDw9IGxlbjE7IHkrKykKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgb2xkZGlhZyA9IGNvbHVtblt5XTsKKyAgICAgICAgICAg ICAgRkVUQ0hfU1RSSU5HX0NIQVJfQURWQU5DRSAoYzEsIHN0cmluZzEsIGkxLCBpMV9ieXRlKTsK KyAgICAgICAgICAgICAgY29sdW1uW3ldID0gbWluIChtaW4gKGNvbHVtblt5XSArIDEsIGNvbHVt blt5LTFdICsgMSksIGxhc3RkaWFnICsgKGMxID09IGMyPyAwIDogMSkpOworICAgICAgICAgICAg ICBsYXN0ZGlhZyA9IG9sZGRpYWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK KyAgU0FGRV9GUkVFICgpOworICByZXR1cm4gbWFrZV9udW1iZXIgKGNvbHVtbltsZW4xXSk7Cit9 CisKIERFRlVOICgic3RyaW5nLWVxdWFsIiwgRnN0cmluZ19lcXVhbCwgU3N0cmluZ19lcXVhbCwg MiwgMiwgMCwKICAgICAgICBkb2M6IC8qIFJldHVybiB0IGlmIHR3byBzdHJpbmdzIGhhdmUgaWRl bnRpY2FsIGNvbnRlbnRzLgogQ2FzZSBpcyBzaWduaWZpY2FudCwgYnV0IHRleHQgcHJvcGVydGll cyBhcmUgaWdub3JlZC4KQEAgLTUyMjYsNiArNTI4Nyw3IEBAIHRoaXMgdmFyaWFibGUuICAqLyk7 CiAgIGRlZnN1YnIgKCZTbGVuZ3RoKTsKICAgZGVmc3ViciAoJlNzYWZlX2xlbmd0aCk7CiAgIGRl ZnN1YnIgKCZTc3RyaW5nX2J5dGVzKTsKKyAgZGVmc3ViciAoJlNzdHJpbmdfZGlzdGFuY2UpOwog ICBkZWZzdWJyICgmU3N0cmluZ19lcXVhbCk7CiAgIGRlZnN1YnIgKCZTY29tcGFyZV9zdHJpbmdz KTsKICAgZGVmc3ViciAoJlNzdHJpbmdfbGVzc3ApOwpkaWZmIC0tZ2l0IGEvdGVzdC9saXNwL3N1 YnItdGVzdHMuZWwgYi90ZXN0L2xpc3Avc3Vici10ZXN0cy5lbAppbmRleCA1MmI2MWQ5ZmI5Li4x MzEwZjViMmE1IDEwMDY0NAotLS0gYS90ZXN0L2xpc3Avc3Vici10ZXN0cy5lbAorKysgYi90ZXN0 L2xpc3Avc3Vici10ZXN0cy5lbApAQCAtMjgxLDYgKzI4MSwyNCBAQCBzdWJyLXRlc3QtLWZyYW1l cy0xCiAgIChzaG91bGQgKGVxdWFsIChzdHJpbmctbWF0Y2gtcCAiXFxgW1s6Ymxhbms6XV1cXCci ICJcdTMwMDAiKSAwKSkKICAgKHNob3VsZC1ub3QgKHN0cmluZy1tYXRjaC1wICJcXGBbWzpibGFu azpdXVxcJyIgIlxOe0xJTkUgU0VQQVJBVE9SfSIpKSkKIAorKGVydC1kZWZ0ZXN0IHN1YnItdGVz dHMtLXN0cmluZy1kaXN0YW5jZSAoKQorICAiVGVzdCBgc3RyaW5nLWRpc3RhbmNlJyBiZWhhdmlv ci4iCisgIDs7IEFTQ0lJIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBmaW5lCisgIChzaG91bGQgKGVx dWFsIDEgKHN0cmluZy1kaXN0YW5jZSAiaGVlbG8iICJoZWxsbyIpKSkKKyAgKHNob3VsZCAoZXF1 YWwgMiAoc3RyaW5nLWRpc3RhbmNlICJhZWVsbyIgImhlbGxvIikpKQorICAoc2hvdWxkIChlcXVh bCAwIChzdHJpbmctZGlzdGFuY2UgImFiIiAiYWIiIHQpKSkKKyAgKHNob3VsZCAoZXF1YWwgMSAo c3RyaW5nLWRpc3RhbmNlICJhYiIgImFiYyIgdCkpKQorCisgIDs7IHN0cmluZyBjb250YWluaW5n IGhhbnppIGNoYXJhY3RlciwgY29tcGFyZSBieSBieXRlCisgIChzaG91bGQgKGVxdWFsIDYgKHN0 cmluZy1kaXN0YW5jZSAiYWIiICJhYuaIkeWluSIgdCkpKQorICAoc2hvdWxkIChlcXVhbCAzIChz dHJpbmctZGlzdGFuY2UgImFiIiAiYeaIkWIiIHQpKSkKKyAgKHNob3VsZCAoZXF1YWwgMyAoc3Ry aW5nLWRpc3RhbmNlICLmiJEiICLlpbkiIHQpKQorCisgIDs7IHN0cmluZyBjb250YWluaW5nIGhh bnppIGNoYXJhY3RlciwgY29tcGFyZSBieSBjaGFyYWN0ZXIKKyAgKHNob3VsZCAoZXF1YWwgMiAo c3RyaW5nLWRpc3RhbmNlICJhYiIgImFi5oiR5aW5IikpKQorICAoc2hvdWxkIChlcXVhbCAxIChz dHJpbmctZGlzdGFuY2UgImFiIiAiYeaIkWIiKSkpCisgIChzaG91bGQgKGVxdWFsIDEgKHN0cmlu Zy1kaXN0YW5jZSAi5oiRIiAi5aW5IikpKSkKKwogKGVydC1kZWZ0ZXN0IHN1YnItdGVzdHMtLWRv bGlzdC0td3JvbmctbnVtYmVyLW9mLWFyZ3MgKCkKICAgIlRlc3QgdGhhdCBgZG9saXN0JyBkb2Vz bid0IGFjY2VwdCB3cm9uZyB0eXBlcyBvciBsZW5ndGggb2YgU1BFQywKIGNmLiBCdWcjMjU0Nzcu IgotLSAKMi4xNi4zCgo= --000000000000d53b83056a4569ab--