From unknown Tue Jul 15 05:17:18 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79009: [PATCH] Improve 'vtable' object handling, cache handling, messages Resent-From: =?UTF-8?Q?St=C3=A9phane?= Marks Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 13 Jul 2025 18:08:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 79009 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 79009@debbugs.gnu.org Cc: Spencer Baugh , Kristoffer Balintona , Joost Kremers , ijqq@protonmail.com, Visuwesh , Adam Porter , Lars Ingebrigtsen , Augusto Stoffel X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.17524300285152 (code B ref -1); Sun, 13 Jul 2025 18:08:01 +0000 Received: (at submit) by debbugs.gnu.org; 13 Jul 2025 18:07:08 +0000 Received: from localhost ([127.0.0.1]:55318 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ub16S-0001Ky-2P for submit@debbugs.gnu.org; Sun, 13 Jul 2025 14:07:08 -0400 Received: from lists.gnu.org ([2001:470:142::17]:34090) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ub16P-0001K6-IG for submit@debbugs.gnu.org; Sun, 13 Jul 2025 14:07:05 -0400 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 1ub169-0001Nd-5n for bug-gnu-emacs@gnu.org; Sun, 13 Jul 2025 14:06:49 -0400 Received: from mail-vk1-xa2f.google.com ([2607:f8b0:4864:20::a2f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1ub166-0005Io-1w for bug-gnu-emacs@gnu.org; Sun, 13 Jul 2025 14:06:48 -0400 Received: by mail-vk1-xa2f.google.com with SMTP id 71dfb90a1353d-528ce9731dbso1483492e0c.0 for ; Sun, 13 Jul 2025 11:06:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752430003; x=1753034803; darn=gnu.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=5DT44fq8qcyRvgyaewlN1qySm4mi5JSCp1aEVwZ86wk=; b=dIAOKoZ/bJRjT6vqcL4Hg1iyMwBkWrlq7PPMGoT9NwAJeOjjdtChXfpfe/pk463cuv Da3bHldRdyorFhLOwxZoFGf075zgJdXaQDQ9T9fsJ6IE4FH/w9taN8RT7zrtXkr9QNAX 5AStK7SF5Com0iS/I0j94rTlWwMUIf4iCSs2GmtUA3EdGI8KjLxNP7JTF6L2AY8dk9v7 7suCFxVrOhncdLFidWdPyvjtheeXjL3w4MvdFPhUT7COvLlozWxE3az3rW/Qg+TefqHc mnFeCMto15sy5jT1nuVWEhHzpJ5NfaYsjkCn+ihJzCYuvZNi8AdPM6kIk4/lcNxgpxG/ kPKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752430003; x=1753034803; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=5DT44fq8qcyRvgyaewlN1qySm4mi5JSCp1aEVwZ86wk=; b=h0/EITZX6LliQBwbDwjvpObH5xlHPnFw6ND7Xf8KAgJ9A2OOMEP2XmCkzqLtV/yTsz lUYtVG6/wK5izmp9WhXGjSjAw0ae7NEGV6BCQNbDmShwinEi6nEBtgdRROV5FS4+Y/n7 Wus4xmo+9y1pR0j+TKB0+9pYBa3z0CcnW7smVZIQsvmiiGI7tMTyS+wRY+UMSlLFF5MN 5nY8gqXN515Po4YCNyjrja2N5Y9d7Sq7rGGLWTKg3HpjrMybmEG/ZC4/vLfZYmexpAvm raL5SLAJG0qUmCmAL/PVoE7KSMgBgi1SKpbxIoMHb0xNo8eqSycEBVJIgyQi2PkHK0sb sHKQ== X-Gm-Message-State: AOJu0YwkxjSnW7NTDn6X+gp1u3kIWHDtQr8b0BbvoiCONHEYh0VatSKF UTIPbi2hnKgcZfMCh9n5e4sVqdfnWKRhsAA/p3OwqvvFem+jx/JSyWDhmBm3wagSuRsQDRZ8M+4 trxs2C+Xwyp6zRjnxrRiqAxZkCOWlFhls60Qj X-Gm-Gg: ASbGncs4otAJtuffvFAujI8Xo90OF9aBmOy6FRA5o6q+80YOBoeJn8yuxzXtmj0+ecl NDsHtR+t3prbtNP6xAorEtCFPBV9yugJUjyw9Akp6HEm6gaITmIDoy4ofUv7jZ00cnQYf158Dnh aJHH827eHm2YGE4MZZj2411Nbe3senWc/9askrVaqCp4aIOoV6hHu4WMeFplzsTl32itVuH/xM5 ryx4GVzRg== X-Google-Smtp-Source: AGHT+IFi/Ty4dl0SsIT9izrtdnAvyReSjrv3qcKySKh4ZP0+8+hZbxDCb/E5S1p4UBC4Tcv60aJ0Dhp35saa+YlgOAg= X-Received: by 2002:a05:6122:82a6:b0:531:2afc:4637 with SMTP id 71dfb90a1353d-535f48f2339mr6539322e0c.9.1752430003187; Sun, 13 Jul 2025 11:06:43 -0700 (PDT) MIME-Version: 1.0 From: =?UTF-8?Q?St=C3=A9phane?= Marks Date: Sun, 13 Jul 2025 14:06:31 -0400 X-Gm-Features: Ac12FXw8V6GMcbWDaYuw9gEPG3mcevYtDh1SGKeGI4RXHuN5i-IMObilNuxpzOM Message-ID: Content-Type: multipart/mixed; boundary="000000000000d5919c0639d367f0" Received-SPF: pass client-ip=2607:f8b0:4864:20::a2f; envelope-from=shipmints@gmail.com; helo=mail-vk1-xa2f.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, HTML_MESSAGE=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-Spam-Score: 1.0 (+) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) --000000000000d5919c0639d367f0 Content-Type: multipart/alternative; boundary="000000000000d5919b0639d367ee" --000000000000d5919b0639d367ee Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Attached is the first "smaller" patch to converge on the fixed and upgraded vtable presented elsewhere under bug 78843. I'd like for us to consider this patch size for vtable acceptable, and to review it in short order to accommodate getting the next patch sets to follow quickly after this one. I'd prefer this not take until the autumn (in the northern hemisphere). If any of you cc'd here do not want to be cc'd on other patches, let me know. You're the ones who I've seen use vtable in the wild, or have submitted bug reports. All of your issues have been addressed, though not necessarily in this first patch. Refer to bug 78843 to see the fixed and upgraded vtable intended to converge here. Thanks in advance and good summer regards, -St=C3=A9phane --000000000000d5919b0639d367ee Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Attached is the first "smaller" patch to converge on the fixed= and upgraded vtable presented elsewhere under bug 78843.=C2=A0 I'd lik= e for us to consider this patch size for vtable acceptable, and to review i= t in short order to accommodate getting the next patch sets to follow quick= ly after this one.=C2=A0 I'd prefer this not take until the autumn (in = the northern hemisphere).

If any of you cc'd here do not want to be cc'd on othe= r patches, let me know.=C2=A0 You're the ones who I've seen use vta= ble in the wild,=C2=A0or have submitted bug reports.=C2=A0 All of your issu= es have been addressed, though not necessarily in this first=C2=A0patch.=C2= =A0 Refer to bug 78843 to see the fixed and upgraded vtable intended to con= verge here.

T= hanks in advance and good summer regards,

-St=C3=A9phane
--000000000000d5919b0639d367ee-- --000000000000d5919c0639d367f0 Content-Type: application/octet-stream; name="0001-Improve-vtable-object-handling-cache-handling-messag.patch" Content-Disposition: attachment; filename="0001-Improve-vtable-object-handling-cache-handling-messag.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_md1z7cij0 RnJvbSBlMDBlM2RkODIwNGVhZGEwYTI4M2ZlOWRlYjY2Y2I2NjMwZDExNjg5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFN1biwgMTMgSnVsIDIwMjUgMTM6MzI6MjggLTA0MDAK U3ViamVjdDogW1BBVENIXSBJbXByb3ZlICd2dGFibGUnIG9iamVjdCBoYW5kbGluZywgY2FjaGUg aGFuZGxpbmcsIG1lc3NhZ2VzCgpBZGQgb2JqZWN0IGVxdWFsaXR5IGZ1bmN0aW9uIG92ZXJyaWRl IChkZWZhdWx0cyB0byBleGlzdGluZyAnZXEnCmJlaGF2aW9yKS4gIEFkZCBjb2x1bW4gY29tcGFy YXRvciB0byBhZGRyZXNzIG9iamVjdApzb3J0aW5nIChkZWZhdWx0cyB0byBleGlzdGluZyBiZWhh dmlvcikuICBBZGQgZHVwbGljYXRlIG9iamVjdApoYW5kbGluZyAoZGVmYXVsdHMgdG8gYWxsb3dp bmcgZHVwbGljYXRlcykuICBDb3JyZWN0IGNhY2hlCnJlZmVyZW5jZXMgdG8gcHJpbWUgdGhlIGNh Y2hlIGFzIG5lZWRlZC4gIEFkZCBjYWNoZSBhY2Nlc3NvcgpmdW5jdGlvbnMuICBBZGQgdGFibGUg bmFtZSBzbG90IHRvIGltcHJvdmUgZXJyb3JzIGFuZAptZXNzYWdlcyAoZGVmYXVsdHMgdG8gIip2 dGFibGUqIikuCgpBZGRlZCB0ZXN0cy4KCiogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAodnRh YmxlLWNvbHVtbik6IEFkZCBjb21wYXJhdG9yCnNsb3QuCih2dGFibGUpOiBBZGQgbmFtZSwgb2Jq ZWN0LWVxdWFsLCBkdXBsaWNhdGUtb2JqZWN0cyBzbG90cy4KKG1ha2UtdnRhYmxlKTogSW5pdGlh bGl6ZSBuZXcgc2xvdHMuCih2dGFibGUtZ290by1vYmplY3QpOiBVc2Ugb2JqZWN0LWVxdWFsLgoo dnRhYmxlLXVwZGF0ZS1vYmplY3QpOiBVc2Ugb2JqZWN0LWVxdWFsLCBoYW5kbGUgZHVwbGljYXRl Cm9iamVjdHMsIHVzZSBjYWNoZSBhY2Nlc3NvciwgaW1wcm92ZSBtZXNzYWdlcy4KKHZ0YWJsZS1y ZW1vdmUtb2JqZWN0KTogVXNlIG9iamVjdC1lcXVhbCwgcHJpbWUgY2FjaGUsIHVzZSBjYWNoZQpm dW5jdGlvbnMsIGltcHJvdmUgbWVzc2FnZXMuCih2dGFibGUtaW5zZXJ0LW9iamVjdCk6IFVzZSBv YmplY3QtZXF1YWwsIGhhbmRsZSBkdXBsaWNhdGUKb2JqZWN0cywgdXNlIGNhY2hlIGFjY2Vzc29y LCBpbXByb3ZlIG1lc3NhZ2VzLgoodnRhYmxlLS1zb21lLW9iamVjdHMpOiBOZXcgZGVmdW4uCih2 dGFibGUtLWhhbmRsZS1kdXBsaWNhdGUtb2JqZWN0KTogTmV3IGRlZnVuLgoodnRhYmxlLWluc2Vy dCk6IFByaW1lIGNhY2hlLCB1c2UgY2FjaGUgYWNjZXNzb3IuCih2dGFibGUtLXNvcnQpOiBVc2Ug Y29sdW1uIGNvbXBhcmF0b3IsIHByaW1lIGNhY2hlLCB1c2UgY2FjaGUKYWNjZXNzb3IuCih2dGFi bGUtLWNvbXB1dGUtd2lkdGgpOiBJbXByb3ZlIG1lc3NhZ2UuCih2dGFibGUtLXdpZHRocyk6IFVz ZSBjYWNoZSBhY2Nlc3Nvci4KCiogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVs Cih0ZXN0LXZzdGFibGUtY29tcHV0ZS1jb2x1bW5zKTogUmVuYW1lZCB0bwp0ZXN0LXZ0YWJsZS1j b21wdXRlLWNvbHVtbnMuCih0ZXN0LXZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogQ2hhbmdlZCBidWZm ZXIgbmFtZSB0byBub24taGlkZGVuLgoodGVzdC12dGFibGUtZHVwbGljYXRlLW9iamVjdCwgdGVz dC12dGFibGUtdXBkYXRlLW9iamVjdCkKKHRlc3QtdnRhYmxlLXJlbW92ZS1vYmplY3QsIHRlc3Qt dnRhYmxlLW9iamVjdC1lcXVhbCkKKHRlc3QtdnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yKTogTmV3 IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgNDQxICsr KysrKysrKysrKysrKysrLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl c3RzLmVsIHwgMTMwICsrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDQwMSBpbnNlcnRpb25zKCsp LCAxNzAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5l bCBiL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKaW5kZXggMDA3ODUxMTNlZGIuLmY0YmU5MDYy MGNlIDEwMDY0NAotLS0gYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCisrKyBiL2xpc3AvZW1h Y3MtbGlzcC92dGFibGUuZWwKQEAgLTQ1LDE0ICs0NSwyMCBAQCB2dGFibGUtY29sdW1uCiAgIGdl dHRlcgogICBmb3JtYXR0ZXIKICAgZGlzcGxheWVyCisgIGNvbXBhcmF0b3IKICAgLW51bWVyaWNh bAogICAtYWxpZ25lZCkKIAogKGRlZmNsYXNzIHZ0YWJsZSAoKQotICAoKGNvbHVtbnMgOmluaXRh cmcgOmNvbHVtbnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW5zKQorICAoKG5hbWUgOmluaXRhcmcg Om5hbWUgOmFjY2Vzc29yIHZ0YWJsZS1uYW1lKQorICAgKGNvbHVtbnMgOmluaXRhcmcgOmNvbHVt bnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW5zKQogICAgKG9iamVjdHMgOmluaXRhcmcgOm9iamVj dHMgOmFjY2Vzc29yIHZ0YWJsZS1vYmplY3RzKQogICAgKG9iamVjdHMtZnVuY3Rpb24gOmluaXRh cmcgOm9iamVjdHMtZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgIDphY2Nlc3NvciB2dGFi bGUtb2JqZWN0cy1mdW5jdGlvbikKKyAgIChvYmplY3QtZXF1YWwgOmluaXRhcmcgOm9iamVjdC1l cXVhbAorICAgICAgICAgICAgICAgICA6YWNjZXNzb3IgdnRhYmxlLW9iamVjdC1lcXVhbCkKKyAg IChkdXBsaWNhdGUtb2JqZWN0cyA6aW5pdGFyZyA6ZHVwbGljYXRlLW9iamVjdHMKKyAgICAgICAg ICAgICAgICAgICAgICA6YWNjZXNzb3IgdnRhYmxlLWR1cGxpY2F0ZS1vYmplY3RzKQogICAgKGdl dHRlciA6aW5pdGFyZyA6Z2V0dGVyIDphY2Nlc3NvciB2dGFibGUtZ2V0dGVyKQogICAgKGZvcm1h dHRlciA6aW5pdGFyZyA6Zm9ybWF0dGVyIDphY2Nlc3NvciB2dGFibGUtZm9ybWF0dGVyKQogICAg KGRpc3BsYXllciA6aW5pdGFyZyA6ZGlzcGxheWVyIDphY2Nlc3NvciB2dGFibGUtZGlzcGxheWVy KQpAQCAtODYsMjEgKzkyLDI3IEBAIHZ0YWJsZS1oZWFkZXItbGluZS1tYXAKICAgIjxmb2xsb3ct bGluaz4iICdtb3VzZS1mYWNlCiAgICI8bW91c2UtMj4iICMndnRhYmxlLWhlYWRlci1saW5lLXNv cnQpCiAKLShjbC1kZWZ1biBtYWtlLXZ0YWJsZSAoJmtleSBjb2x1bW5zIG9iamVjdHMgb2JqZWN0 cy1mdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcgotICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAg IGRpc3BsYXllcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2UtaGVhZGVyLWxpbmUg dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmFjZSAndnRhYmxlKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGFjdGlvbnMga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHNlcGFyYXRvci13aWR0aCAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRp dmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyLXdpZHRoCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgc29ydC1ieQotICAgICAgICAgICAgICAgICAgICAgICAgICAg IChlbGxpcHNpcyB0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgdCkKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICByb3ctY29sb3JzCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29sdW1uLWNvbG9ycykKKyhjbC1kZWZ1biBtYWtlLXZ0YWJsZSAoJmtleQorICAg ICAgICAgICAgICAgICAgICAgICAobmFtZSAiKnZ0YWJsZSoiKQorICAgICAgICAgICAgICAgICAg ICAgICBjb2x1bW5zCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMKKyAgICAgICAgICAg ICAgICAgICAgICAgb2JqZWN0cy1mdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAob2Jq ZWN0LWVxdWFsICMnZXEpCisgICAgICAgICAgICAgICAgICAgICAgIChkdXBsaWNhdGUtb2JqZWN0 cyAnYWxsb3cpCisgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcgorICAgICAgICAgICAgICAg ICAgICAgICBmb3JtYXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVyCisgICAg ICAgICAgICAgICAgICAgICAgICh1c2UtaGVhZGVyLWxpbmUgdCkKKyAgICAgICAgICAgICAgICAg ICAgICAgKGZhY2UgJ3Z0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyBrZXlt YXAKKyAgICAgICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci13aWR0aCAxKQorICAgICAgICAg ICAgICAgICAgICAgICBkaXZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZXItd2lk dGgKKyAgICAgICAgICAgICAgICAgICAgICAgc29ydC1ieQorICAgICAgICAgICAgICAgICAgICAg ICAoZWxsaXBzaXMgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgKGluc2VydCB0KQorICAgICAg ICAgICAgICAgICAgICAgICByb3ctY29sb3JzCisgICAgICAgICAgICAgICAgICAgICAgIGNvbHVt bi1jb2xvcnMpCiAgICJDcmVhdGUgYW5kIGluc2VydCBhIHZ0YWJsZSBhdCBwb2ludC4KIFRoZSB2 dGFibGUgb2JqZWN0IGlzIHJldHVybmVkLiAgSWYgSU5TRVJUIGlzIG5pbCwgdGhlIHRhYmxlIHdv bid0CiBiZSBpbnNlcnRlZC4KQEAgLTExMyw4ICsxMjUsMTEgQEAgbWFrZS12dGFibGUKICAgKGxl dCAoKHRhYmxlCiAgICAgICAgICAobWFrZS1pbnN0YW5jZQogICAgICAgICAgICd2dGFibGUKKyAg ICAgICAgICA6bmFtZSBuYW1lCiAgICAgICAgICAgOm9iamVjdHMgb2JqZWN0cwogICAgICAgICAg IDpvYmplY3RzLWZ1bmN0aW9uIG9iamVjdHMtZnVuY3Rpb24KKyAgICAgICAgICA6b2JqZWN0LWVx dWFsIG9iamVjdC1lcXVhbAorICAgICAgICAgIDpkdXBsaWNhdGUtb2JqZWN0cyBkdXBsaWNhdGUt b2JqZWN0cwogICAgICAgICAgIDpnZXR0ZXIgZ2V0dGVyCiAgICAgICAgICAgOmZvcm1hdHRlciBm b3JtYXR0ZXIKICAgICAgICAgICA6ZGlzcGxheWVyIGRpc3BsYXllcgpAQCAtMTMyLDcgKzE0Nyw4 IEBAIG1ha2UtdnRhYmxlCiAgICAgOzsgQXV0by1nZW5lcmF0ZSB0aGUgY29sdW1ucy4KICAgICAo dW5sZXNzIGNvbHVtbnMKICAgICAgICh1bmxlc3Mgb2JqZWN0cwotICAgICAgICAoZXJyb3IgIkNh bid0IGF1dG8tZ2VuZXJhdGUgY29sdW1uczsgbm8gb2JqZWN0cyIpKQorICAgICAgICAoZXJyb3Ig IkNhbid0IGF1dG8tZ2VuZXJhdGUgY29sdW1uczsgbm8gb2JqZWN0cyAodnRhYmxlIGAlcycpIgor ICAgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpCiAgICAgICAoc2V0cSBjb2x1bW5z IChtYWtlLWxpc3QgKGxlbmd0aCAoY2FyIG9iamVjdHMpKSAiIikpKQogICAgIChzZXRmICh2dGFi bGUtY29sdW1ucyB0YWJsZSkKICAgICAgICAgICAobWFwY2FyIChsYW1iZGEgKGNvbHVtbikKQEAg LTI1MSwxNCArMjY3LDE1IEBAIHZ0YWJsZS1nb3RvLW9iamVjdAogUmV0dXJuIHRoZSBwb3NpdGlv biBvZiB0aGUgb2JqZWN0IGlmIGZvdW5kLCBhbmQgbmlsIGlmIG5vdC4iCiAgIChsZXQgKChzdGFy dCAocG9pbnQpKSkKICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkKLSAgICAoc2F2ZS1y ZXN0cmljdGlvbgotICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNp b24gKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKLSAgICAgIChpZiAodGV4dC1wcm9wZXJ0eS1zZWFy Y2gtZm9yd2FyZCAndnRhYmxlLW9iamVjdCBvYmplY3QgIydlcSkKLSAgICAgICAgICAocHJvZ24K LSAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgLTEpCi0gICAgICAgICAgICAocG9pbnQpKQotICAg ICAgICAoZ290by1jaGFyIHN0YXJ0KQotICAgICAgICBuaWwpKSkpCisgICAgKGxldCAoKHByZWRp Y2F0ZSAodnRhYmxlLW9iamVjdC1lcXVhbCAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkpCisgICAg ICAoc2F2ZS1yZXN0cmljdGlvbgorICAgICAgICAobmFycm93LXRvLXJlZ2lvbiAocG9pbnQpIChz YXZlLWV4Y3Vyc2lvbiAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQorICAgICAgICAoaWYgKHRleHQt cHJvcGVydHktc2VhcmNoLWZvcndhcmQgJ3Z0YWJsZS1vYmplY3Qgb2JqZWN0IHByZWRpY2F0ZSkK KyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIC0xKQorICAg ICAgICAgICAgICAocG9pbnQpKQorICAgICAgICAgIChnb3RvLWNoYXIgc3RhcnQpCisgICAgICAg ICAgbmlsKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1nb3RvLXRhYmxlICh0YWJsZSkKICAgIkdvIHRv IFRBQkxFIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KQEAgLTI4NSw2MyArMzAyLDkyIEBAIHZ0YWJs ZS11cGRhdGUtb2JqZWN0CiBjb21wYXJlZCB3aXRoIGBlcXVhbCcpLCBzaWduYWwgYW4gZXJyb3Iu ICBOb3RlIGEgbGltaXRhdGlvbjogaWYgVEFCTEUncwogYnVmZmVyIGlzIG5vdCBpbiBhIHZpc2li bGUgd2luZG93LCBvciBpZiBpdHMgd2luZG93IGhhcyBjaGFuZ2VkIHdpZHRoCiBzaW5jZSBpdCB3 YXMgdXBkYXRlZCwgdXBkYXRpbmcgdGhlIFRBQkxFIGlzIG5vdCBwb3NzaWJsZSwgYW5kIGFuIGVy cm9yCi1pcyBzaWduYWxlZC4iCitpcyBzaWduYWxlZC4KKworQ29uc3VsdCB0aGUgdGFibGUncyBg OmR1cGxpY2F0ZS1vYmplY3RzJyBwcm9wZXJ0eS4iCiAgICh1bmxlc3Mgb2xkLW9iamVjdAogICAg IChzZXRxIG9sZC1vYmplY3Qgb2JqZWN0KSkKLSAgKGxldCogKChvYmplY3RzICh2dGFibGUtb2Jq ZWN0cyB0YWJsZSkpCi0gICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAgOzsgRmly c3QgcmVwbGFjZSB0aGUgb2JqZWN0IGluIHRoZSBvYmplY3Qgc3RvcmFnZS4KLSAgICAoaWYgKGVx IG9sZC1vYmplY3QgKGNhciBvYmplY3RzKSkKLSAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwg c28gcmVwbGFjZSBpdCB0aGVyZS4KLSAgICAgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxl KQotICAgICAgICAgICAgICAoY29ucyBvYmplY3QgKGNkciBvYmplY3RzKSkpCi0gICAgICA7OyBP dGhlcndpc2Ugc3BsaWNlIGludG8gdGhlIGxpc3QuCi0gICAgICAod2hpbGUgKGFuZCAoY2RyIG9i amVjdHMpCi0gICAgICAgICAgICAgICAgICAobm90IChlcSAoY2FkciBvYmplY3RzKSBvbGQtb2Jq ZWN0KSkpCi0gICAgICAgIChzZXRxIG9iamVjdHMgKGNkciBvYmplY3RzKSkpCi0gICAgICAodW5s ZXNzIG9iamVjdHMKLSAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0Iikp Ci0gICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKLSAgICA7OyBUaGVuIHVwZGF0 ZSB0aGUgY2FjaGUuLi4KLSAgICA7OyBGSVhNRTogSWYgdGhlIHRhYmxlJ3MgYnVmZmVyIGhhcyBu byB2aXNpYmxlIHdpbmRvdywgb3IgaWYgaXRzCi0gICAgOzsgd2lkdGggaGFzIGNoYW5nZWQgc2lu Y2UgdGhlIHRhYmxlIHdhcyB1cGRhdGVkLCB0aGUgY2FjaGUga2V5IHdpbGwKLSAgICA7OyBub3Qg bWF0Y2ggYW5kIHRoZSBvYmplY3QgY2FuJ3QgYmUgdXBkYXRlZC4gIChCdWcgIzY5ODM3KS4KLSAg ICAoaWYtbGV0KiAoKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKGNhciAodnRhYmxlLS1jYWNo ZSB0YWJsZSkpIG9sZC1vYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGxhbWJkYSAoYSBiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCi0gICAgICAgICAgICAgIChsaW5lIChlbHQgKGNh ciAodnRhYmxlLS1jYWNoZSB0YWJsZSkpIGxpbmUtbnVtYmVyKSkpCi0gICAgICAgIChwcm9nbgot ICAgICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCi0gICAgICAgICAgKHNldGNkciBsaW5lICh2 dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkKLSAgICAgICAgICA7OyAu Li4gYW5kIHJlZGlzcGxheSB0aGUgbGluZSBpbiBxdWVzdGlvbi4KLSAgICAgICAgICAoc2F2ZS1l eGN1cnNpb24KLSAgICAgICAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2xkLW9iamVjdCkKLSAg ICAgICAgICAgIChsZXQgKChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1h cCkpCi0gICAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkpCi0gICAgICAgICAgICAgIChk ZWxldGUtbGluZSkKLSAgICAgICAgICAgICAgKHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGlu ZSBsaW5lLW51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIDEg KHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQotICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVy dGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpKSkK LSAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUg aW50byBhIHByZXZpb3VzbHkKLSAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyBy ZWNvbXB1dGUuCi0gICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAo Y2RyIGxpbmUpKSkKLSAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0 YWJsZSIpKSkpCisgICh1bmxlc3MgKGFuZCAobm90IChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVx dWFsIHRhYmxlKSBvbGQtb2JqZWN0IG9iamVjdCkpCisgICAgICAgICAgICAgICAodnRhYmxlLS1o YW5kbGUtZHVwbGljYXRlLW9iamVjdCB0YWJsZSBvYmplY3QpKQorICAgIChsZXQqICgob2JqZWN0 cyAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkg dCkpCisgICAgICA7OyBGaXJzdCByZXBsYWNlIHRoZSBvYmplY3QgaW4gdGhlIG9iamVjdCBzdG9y YWdlLgorICAgICAgKGlmIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSBvbGQt b2JqZWN0IChjYXIgb2JqZWN0cykpCisgICAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwgc28g cmVwbGFjZSBpdCB0aGVyZS4KKyAgICAgICAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUp CisgICAgICAgICAgICAgICAgKGNvbnMgb2JqZWN0IChjZHIgb2JqZWN0cykpKQorICAgICAgICA7 OyBPdGhlcndpc2Ugc3BsaWNlIGludG8gdGhlIGxpc3QuCisgICAgICAgICh3aGlsZSAoYW5kIChj ZHIgb2JqZWN0cykKKyAgICAgICAgICAgICAgICAgICAgKG5vdCAoZnVuY2FsbCAodnRhYmxlLW9i amVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Fk ciBvYmplY3RzKSBvbGQtb2JqZWN0KSkpCisgICAgICAgICAgKHNldHEgb2JqZWN0cyAoY2RyIG9i amVjdHMpKSkKKyAgICAgICAgKHVubGVzcyAoYW5kIG9iamVjdHMKKyAgICAgICAgICAgICAgICAg ICAgIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGNhZHIgb2JqZWN0cykgb2xkLW9iamVjdCkpCisgICAgICAgICAgKGVy cm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisgICAgICAgICAg ICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKQorICAgICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0 cykgb2JqZWN0KSkKKyAgICAgIDs7IFRoZW4gdXBkYXRlIHRoZSBjYWNoZS4uLgorICAgICAgOzsg RklYTUU6IElmIHRoZSB0YWJsZSdzIGJ1ZmZlciBoYXMgbm8gdmlzaWJsZSB3aW5kb3csIG9yIGlm IGl0cworICAgICAgOzsgd2lkdGggaGFzIGNoYW5nZWQgc2luY2UgdGhlIHRhYmxlIHdhcyB1cGRh dGVkLCB0aGUgY2FjaGUga2V5IHdpbGwKKyAgICAgIDs7IG5vdCBtYXRjaCBhbmQgdGhlIG9iamVj dCBjYW4ndCBiZSB1cGRhdGVkLiAgKEJ1ZyAjNjk4MzcpLgorICAgICAgKGlmLWxldCogKChjYWNo ZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgICAgICAgIChsaW5lLW51 bWJlciAoc2VxLXBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxl LS1jYWNoZS1saW5lcyBjYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3Nv YyBvbGQtb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJs ZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpKSkpCisgICAgICAgICAgICAgICAgKGxpbmUg KGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1iZXIpKSkKKyAgICAgICAg ICAocHJvZ24KKyAgICAgICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCisgICAgICAgICAgICAo c2V0Y2RyIGxpbmUgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQor ICAgICAgICAgICAgOzsgLi4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCisg ICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgKHZ0YWJsZS1nb3RvLW9i amVjdCBvbGQtb2JqZWN0KQorICAgICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4dC1w cm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQorICAgICAgICAgICAgICAgICAgICAoc3RhcnQgKHBv aW50KSkpCisgICAgICAgICAgICAgICAgKGRlbGV0ZS1saW5lKQorICAgICAgICAgICAgICAgICh2 dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgbGluZS1udW1iZXIKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkK KyAgICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0 ICdrZXltYXAga2V5bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5 IGhhdmUgaW5zZXJ0ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Cisg ICAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAg ICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKQorICAg ICAgICAoZXJyb3IgIkNhbid0IGZpbmQgY2FjaGVkIG9iamVjdCAodnRhYmxlIGAlcycpIgorICAg ICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkpCiAKIChkZWZ1biB2dGFibGUtcmVt b3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQogICAiUmVtb3ZlIE9CSkVDVCBmcm9tIFRBQkxFLgog VGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBkaXNwbGF5ZWQgbGluZS4iCi0gIDs7IEZpcnN0IHJl bW92ZSBmcm9tIHRoZSBvYmplY3RzLgotICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChk ZWxxIG9iamVjdCAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKLSAgOzsgVGhlbiBhZGp1c3QgdGhl IGNhY2hlIGFuZCBkaXNwbGF5LgotICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUp KQorICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKICAgICAgICAg KGluaGliaXQtcmVhZC1vbmx5IHQpKQotICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2Jq ZWN0IChjYXIgY2FjaGUpKSAoY2FyIGNhY2hlKSkpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAg ICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2Jq ZWN0IG9iamVjdCkKLSAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkKKyAgICAodW5sZXNzIChzZXEt Y29udGFpbnMtcCAodnRhYmxlLW9iamVjdHMgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1vYmplY3Qt ZXF1YWwgdGFibGUpKQorICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBvYmplY3QgdG8gcmVt b3ZlICh2dGFibGUgYCVzJykiCisgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpCisg ICAgOzsgRmlyc3QgcmVtb3ZlIGZyb20gdGhlIG9iamVjdHMuCisgICAgKHNldGYgKHZ0YWJsZS1v YmplY3RzIHRhYmxlKSAoc2VxLXJlbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChsYW1iZGEgKGVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChm dW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZWx0IG9iamVjdCkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCisgICAgOzsgVGhlbiBhZGp1 c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgorICAgIChpZi1sZXQqICgob2xkLWxpbmUgKGFzc29j IG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLWxp bmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0 LWVxdWFsIHRhYmxlKSkpKQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAoc2V0Y2FyIGNhY2hl IChkZWxxIG9sZC1saW5lICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkpCisgICAgICAgICAg KHNhdmUtZXhjdXJzaW9uCisgICAgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisg ICAgICAgICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAgICAgICAg ICAgKGRlbGV0ZS1saW5lKSkpKQorICAgICAgOzsgQXQgdGhpcyBwb2ludCwgdGhlIG9iamVjdCB3 YXMgcmVtb3ZlZCBmcm9tIG9iamVjdHMsIGJ1dCBub3QKKyAgICAgIDs7IHRoZSBjYWNoZSwgd2hp Y2ggd2lsbCBzdGFsZS4KKyAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0ICh2 dGFibGUgYCVzJykiCisgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkKIAogOzsg RklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2dGFi bGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJwcmV0 ZWQgYXMKQEAgLTM2Miw2ICs0MDgsOCBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAogZW5kIChpZiB0 aGUgaW5kZXggaXMgdG9vIGxhcmdlKSBvZiB0aGUgdGFibGUuICBCRUZPUkUgaXMgaWdub3JlZCBp biB0aGlzCiBjYXNlLgogCitDb25zdWx0IHRoZSB0YWJsZSdzIGA6ZHVwbGljYXRlLW9iamVjdHMn IHByb3BlcnR5LgorCiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgZGlzcGxheWVkIHRhYmxlLiIKICAg OzsgSWYgdGhlIHZ0YWJsZSBpcyBlbXB0eSwganVzdCBhZGQgdGhlIG9iamVjdCBhbmQgcmVnZW5l cmF0ZSB0aGUKICAgOzsgdGFibGUuCkBAIC0zNzEsODYgKzQxOSwxMjcgQEAgdnRhYmxlLWluc2Vy dC1vYmplY3QKICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRh YmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCiAgICAgICAgICh2dGFibGUt Z290by10YWJsZSB0YWJsZSkKICAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkpCi0gICAg OzsgRmlyc3QgaW5zZXJ0IGludG8gdGhlIG9iamVjdHMuCi0gICAgKGxldCAoKHBvcyAoaWYgbG9j YXRpb24KLSAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAgICAg ICAgICAgICAgICAgICAgICAocHJvZzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGhj ZHIgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAgICAgICAg ICAgICA7OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28gbGFyZ2U6Ci0gICAgICAgICAg ICAgICAgICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCi0gICAgICAgICAgICAgICAgICAgICAo b3IgKG1lbXEgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAg ICAgICAgICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlvbicgaXMgbm90IGZvdW5kIGFuZAotICAg ICAgICAgICAgICAgICAgICAgICAgIDs7IGBiZWZvcmUnIGlzIG5vbi1uaWw6Ci0gICAgICAgICAg ICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpKQotICAg ICAgICAgICAgICAgICA7OyBJZiBgbG9jYXRpb24nIGlzIG5pbCBhbmQgYGJlZm9yZScgaXMgbm9u LW5pbCwgd2UKLSAgICAgICAgICAgICAgICAgOzsgcHJlcGVuZCB0aGUgbmV3IG9iamVjdC4KLSAg ICAgICAgICAgICAgICAgKGlmIGJlZm9yZSAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpKQotICAg ICAgKGlmIChvciBiZWZvcmUgIDsgSWYgYGJlZm9yZScgaXMgbm9uLW5pbCwgYHBvcycgc2hvdWxk IGJlLCBhcyB3ZWxsLgotICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24p KSkKLSAgICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlLgotICAgICAgICAgIChs ZXQgKChvbGQtb2JqZWN0IChjYXIgcG9zKSkpCi0gICAgICAgICAgICAoc2V0Y2FyIHBvcyBvYmpl Y3QpCi0gICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtb2JqZWN0IChjZHIgcG9zKSkp KQotICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgotICAgICAgICAo aWYgcG9zCi0gICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0Lgot ICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2JqZWN0IChjZHIgcG9zKSkpCi0gICAgICAg ICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAobmNvbmMgKHZ0 YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKSkpKQotICAgIDs7IFRoZW4gYWRqdXN0 IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICh2dGFi bGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUg dGFibGUpKQotICAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQotICAgICAgICAgICAg IChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAg ICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHByb3BlcnRpemUgKHRydW5jYXRlLXN0cmluZy1lbGxpcHNpcykKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJs ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiIpKQotICAgICAgICAgICAgIChlbGxpcHNp cy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzKSkKLSAgICAgICAgICAgICAoZWxl bSAoaWYgbG9jYXRpb24gIDsgVGhpcyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBv cycgYWJvdmUuCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24p Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIChjYXIgY2FjaGUpKQot ICAgICAgICAgICAgICAgICAgICAgICAgIChvciAoYXNzcSBsb2NhdGlvbiAoY2FyIGNhY2hlKSkK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhYXIgY2FjaGUpKSkp Ci0gICAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYWFyIGNhY2hlKSkpKQotICAgICAg ICAgICAgIChwb3MgKG1lbXEgZWxlbSAoY2FyIGNhY2hlKSkpCi0gICAgICAgICAgICAgKGxpbmUg KGNvbnMgb2JqZWN0ICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkp KQotICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAgICh1bmxlc3MgKHZ0YWJsZS0taGFuZGxlLWR1 cGxpY2F0ZS1vYmplY3QgdGFibGUgb2JqZWN0KQorICAgICAgOzsgRmlyc3QgaW5zZXJ0IGludG8g dGhlIG9iamVjdHMuCisgICAgICAobGV0ICgocG9zIChpZiBsb2NhdGlvbgorICAgICAgICAgICAg ICAgICAgICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAg ICAocHJvZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aGNkciBsb2NhdGlvbiAo dnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgRG8g bm90IHByZXBlbmQgaWYgaW5kZXggaXMgdG9vIGxhcmdlOgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCisgICAgICAgICAgICAgICAgICAgICAgIChvcgorICAg ICAgICAgICAgICAgICAgICAgICAgKGxldCAoKGxvYyAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWxlIChhbmQgKGNkciBsb2MpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKGZ1bmNhbGwgKHZ0YWJsZS1vYmpl Y3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGNhciBsb2MpIGxvY2F0aW9uKSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHNldHEgbG9jIChjZHIgbG9jKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChp ZiAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChjYXIgbG9jKSBsb2NhdGlvbikKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGxvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCkpCisg ICAgICAgICAgICAgICAgICAgICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlvbicgaXMgbm90IGZv dW5kIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgOzsgYGJlZm9yZScgaXMgbm9uLW5pbDoK KyAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2dGFibGUtb2JqZWN0cyB0YWJs ZSkpKSkKKyAgICAgICAgICAgICAgICAgICA7OyBJZiBgbG9jYXRpb24nIGlzIG5pbCBhbmQgYGJl Zm9yZScgaXMgbm9uLW5pbCwgd2UKKyAgICAgICAgICAgICAgICAgICA7OyBwcmVwZW5kIHRoZSBu ZXcgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKHZ0YWJsZS1vYmplY3Rz IHRhYmxlKSkpKSkKKyAgICAgICAgKGlmIChvciBiZWZvcmUgIDsgSWYgYGJlZm9yZScgaXMgbm9u LW5pbCwgYHBvcycgc2hvdWxkIGJlLCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgIChhbmQgcG9z IChpbnRlZ2VycCBsb2NhdGlvbikpKQotICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0 IGJlZm9yZTouCi0gICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKLSAgICAg ICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKLSAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNv bnMgb2xkLWxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgKHVubGVzcyAodnRhYmxlLWdv dG8tb2JqZWN0IChjYXIgZWxlbSkpCi0gICAgICAgICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmct b2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmUuCisg ICAgICAgICAgICAobGV0ICgob2xkLW9iamVjdCAoY2FyIHBvcykpKQorICAgICAgICAgICAgICAo c2V0Y2FyIHBvcyBvYmplY3QpCisgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1v YmplY3QgKGNkciBwb3MpKSkpCiAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9iamVj dCBhZnRlci4KICAgICAgICAgICAoaWYgcG9zCiAgICAgICAgICAgICAgIDs7IFNwbGljZSB0aGUg b2JqZWN0IGludG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAg ICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgICAo aWYgKHZ0YWJsZS1nb3RvLW9iamVjdCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgKGZv cndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KLSAgICAgICAgICAgICAgICAgICh2dGFi bGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9iamVj dCAoY2RyIHBvcykpKQogICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVj dC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIChjYXIgY2FjaGUpIChsaXN0IGxp bmUpKSkKLSAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCi0gICAgICAgIChsZXQg KChzdGFydCAocG9pbnQpKSkKLSAgICAgICAgICA7OyBGSVhNRTogV2UgaGF2ZSB0byBhZGp1c3Qg Y29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKLSAgICAgICAgICA7OyBoYXZlIDpyb3ct Y29sb3JzLgotICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgMAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggMSBjYWNoZSkgKHZ0YWJsZS0tc3BhY2Vy IHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lz LXdpZHRoKQotICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxp c3QgJ2tleW1hcCBrZXltYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICd2dGFibGUgdGFibGUpKSkKLSAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5z ZXJ0ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Ci0gICAgICAgIDs7 IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KLSAgICAgICAgKHZ0YWJsZS0tcmVj b21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkpKSkKKyAgICAgICAgICAgIChuY29u YyAodnRhYmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkpCisgICAgICA7OyBUaGVu IGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCisgICAgICAoc2F2ZS1leGN1cnNpb24KKyAg ICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAgICAgICAobGV0KiAoKGNhY2hlICh2 dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgICAgICAoaW5oaWJpdC1yZWFk LW9ubHkgdCkKKyAgICAgICAgICAgICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2lu dCkgJ2tleW1hcCkpCisgICAgICAgICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBz aXMgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVu Y2F0ZS1zdHJpbmctZWxsaXBzaXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAiIikpCisgICAgICAgICAgICAgICAoZWxsaXBzaXMtd2lkdGggKHN0cmluZy1waXhlbC13 aWR0aCBlbGxpcHNpcykpCisgICAgICAgICAgICAgICAoZWxlbSAoaWYgbG9jYXRpb24gIDsgVGhp cyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBvcycgYWJvdmUuCisgICAgICAgICAg ICAgICAgICAgICAgICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKG50aCBsb2NhdGlvbiAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFzc29jCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2 dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGFuZCBiZWZvcmUgKGNhYXIgY2FjaGUpKSkpCisgICAgICAgICAgICAgICAgICAgICAg IChpZiBiZWZvcmUgKGNhYXIgY2FjaGUpKSkpCisgICAgICAgICAgICAgICAocG9zIChtZW1xIGVs ZW0gKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKSkKKyAgICAgICAgICAgICAgIChsaW5lIChj b25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkK KyAgICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGlu dGVnZXJwIGxvY2F0aW9uKSkpCisgICAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBi ZWZvcmU6LgorICAgICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKKyAgICAg ICAgICAgICAgICAoc2V0Y2FyIHBvcyBsaW5lKQorICAgICAgICAgICAgICAgIChzZXRjZHIgcG9z IChjb25zIG9sZC1saW5lIChjZHIgcG9zKSkpCisgICAgICAgICAgICAgICAgKHVubGVzcyAodnRh YmxlLWdvdG8tb2JqZWN0IChjYXIgZWxlbSkpCisgICAgICAgICAgICAgICAgICAodnRhYmxlLWJl Z2lubmluZy1vZi10YWJsZSkpKQorICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9i amVjdCBhZnRlci4KKyAgICAgICAgICAgIChpZiBwb3MKKyAgICAgICAgICAgICAgICA7OyBTcGxp Y2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgIChwcm9nbgorICAg ICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgbGluZSAoY2RyIHBvcykpKQorICAgICAg ICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCisgICAgICAgICAg ICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KKyAgICAgICAg ICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgICAgOzsgT3Ro ZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgKHNldGNhciBjYWNoZSAo bmNvbmMgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIChsaXN0IGxpbmUpKSkKKyAgICAgICAg ICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAobGV0ICgoc3RhcnQgKHBv aW50KSkpCisgICAgICAgICAgICA7OyBGSVhNRTogV2UgaGF2ZSB0byBhZGp1c3QgY29sb3JzIGlu IGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKKyAgICAgICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMu CisgICAgICAgICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLXdpZHRocyBjYWNoZSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQor ICAgICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAna2V5 bWFwIGtleW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAndnRhYmxlIHRhYmxlKSkpCisgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0 ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgOzsg YWxsLW51bWVyaWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgorICAgICAgICAgICh2dGFibGUtLXJl Y29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxl LWNvbHVtbiAodGFibGUgaW5kZXgpCiAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIElOREVYdGgg Y29sdW1uIGluIFRBQkxFLiIKICAgKHZ0YWJsZS1jb2x1bW4tbmFtZSAoZWx0ICh2dGFibGUtY29s dW1ucyB0YWJsZSkgaW5kZXgpKSkKIAorKGRlZnVuIHZ0YWJsZS0tc29tZS1vYmplY3RzICh0YWJs ZSBvYmplY3QpCisgIChzZXEtc29tZSAobGFtYmRhIChlbHQpCisgICAgICAgICAgICAgIChmdW5j YWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSBlbHQgb2JqZWN0KSkKKyAgICAgICAgICAg ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKQorCisoZGVmdW4gdnRhYmxlLS1oYW5kbGUtZHVwbGlj YXRlLW9iamVjdCAodGFibGUgbmV3LW9iamVjdCkKKyAgIlJldHVybiBuaWwgaWYgTkVXLU9CSkVD VCBpcyBhY2NlcHRhYmxlIGluIFRBQkxFLCB0IGlmIG5vdC4KK1JldHVybiBuaWwgaWYgZHVwbGlj YXRlcyBhcmUgYWxsb3dlZC4KK1JldHVybiB0IGlmIGR1cGxpY2F0ZSBmb3VuZCBhbmQgc2hvdWxk IGJlIGlnbm9yZWQuCitTaWduYWwgYW4gZXJyb3IgaWYgZHVwbGljYXRlIGZvdW5kIGFuZCBkaXNh bGxvd2VkLiIKKyAgKHBjYXNlLWV4aGF1c3RpdmUgKHZ0YWJsZS1kdXBsaWNhdGUtb2JqZWN0cyB0 YWJsZSkKKyAgICAoJ2FsbG93CisgICAgIG5pbCkKKyAgICAoJ2lnbm9yZQorICAgICAodnRhYmxl LS1zb21lLW9iamVjdHMgdGFibGUgbmV3LW9iamVjdCkpCisgICAgKCdpZ25vcmUtd2FybgorICAg ICAoaWYgKHZ0YWJsZS0tc29tZS1vYmplY3RzIHRhYmxlIG5ldy1vYmplY3QpCisgICAgICAgICAo cHJvZ24KKyAgICAgICAgICAgKG1lc3NhZ2UgIldhcm5pbmc6IGR1cGxpY2F0ZSBvYmplY3QgaWdu b3JlZCAodnRhYmxlIGAlcycpIgorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLW5hbWUgdGFi bGUpKQorICAgICAgICAgICB0KQorICAgICAgIG5pbCkpCisgICAgKCdlcnJvcgorICAgICAod2hl biAodnRhYmxlLS1zb21lLW9iamVjdHMgdGFibGUgbmV3LW9iamVjdCkKKyAgICAgICAoZXJyb3Ig IkR1cGxpY2F0ZSBvYmplY3RzIG5vdCBhbGxvd2VkICh2dGFibGUgYCVzJykiCisgICAgICAgICAg ICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpKQorCiA7OzsgR2VuZXJhdGluZyB0aGUgdGFibGUu CiAKIChkZWZ1biB2dGFibGUtLWdldC12YWx1ZSAob2JqZWN0IGluZGV4IGNvbHVtbiB0YWJsZSkK QEAgLTUyMyw3ICs2MTIsOCBAQCB2dGFibGUtLWVuc3VyZS1jYWNoZQogICAgICAgKHZ0YWJsZS0t cmVjb21wdXRlLWNhY2hlIHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkK LSAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgKGxldCogKChjYWNo ZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgKHNwYWNlciAodnRhYmxl LS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAgICAgICAgICAoZWxs aXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAg IChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCkBAIC01MzMsNyArNjIzLDcg QEAgdnRhYmxlLWluc2VydAogICAgICAgICAgOzsgV2UgbWFpbnRhaW4gYSBjYWNoZSBwZXIgc2Ny ZWVuL3dpbmRvdyB3aWR0aCwgc28gdGhhdCB3ZSByZW5kZXIKICAgICAgICAgIDs7IGNvcnJlY3Rs eSBpZiBFbWFjcyBpcyBvcGVuIG9uIHR3byBkaWZmZXJlbnQgc2NyZWVucyAob3IgdGhlCiAgICAg ICAgICA7OyB1c2VyIHJlc2l6ZXMgdGhlIGZyYW1lKS4KLSAgICAgICAgICh3aWR0aHMgKG50aCAx ICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpKSkKKyAgICAgICAgICh3aWR0aHMgKHZ0YWJs ZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSkpCiAgICAgOzsgRG9uJ3QgaW5zZXJ0IGFueSBoZWFkZXIg b3IgaGVhZGVyIGxpbmUgaWYgdGhlIHVzZXIgaGFzbid0CiAgICAgOzsgc3BlY2lmaWVkIHRoZSBj b2x1bW5zLgogICAgICh3aGVuIChzbG90LXZhbHVlIHRhYmxlICctaGFzLWNvbHVtbi1zcGVjKQpA QCAtNTUxLDcgKzY0MSw3IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAodnRhYmxlLS1zb3J0IHRhYmxl KQogICAgIDs7IEluc2VydCB0aGUgZGF0YS4KICAgICAobGV0ICgobGluZS1udW1iZXIgMCkpCi0g ICAgICAoZG9saXN0IChsaW5lIChjYXIgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKSkKKyAgICAgIChk b2xpc3QgKGxpbmUgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKQogICAgICAgICAodnRhYmxl LS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgICAgICAg IChzZXRxIGxpbmUtbnVtYmVyICgxKyBsaW5lLW51bWJlcikpKSkKQEAgLTY2NywyOCArNzU3LDM2 IEBAIHZ0YWJsZS0tY2xlYXItY2FjaGUKIAogKGRlZnVuIHZ0YWJsZS0tc29ydCAodGFibGUpCiAg IChwY2FzZS1kb2xpc3QgKGAoLGluZGV4IC4gLGRpcmVjdGlvbikgKHZ0YWJsZS1zb3J0LWJ5IHRh YmxlKSkKLSAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAgICAgICAg IChudW1lcmljYWwgKHZ0YWJsZS1jb2x1bW4tLW51bWVyaWNhbAotICAgICAgICAgICAgICAgICAg ICAgIChlbHQgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSBpbmRleCkpKQotICAgICAgICAgIChudW1j b21wIChpZiAoZXEgZGlyZWN0aW9uICdkZXNjZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAj Jz4gIyc8KSkKLSAgICAgICAgICAoc3RyaW5nY29tcCAoaWYgKGVxIGRpcmVjdGlvbiAnZGVzY2Vu ZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIydzdHJpbmc+ICMnc3RyaW5nPCkpKQorICAg IChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAg KGNvbHVtbiAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgaW5kZXgpKQorICAgICAgICAgICAo bnVtZXJpY2FsICh2dGFibGUtY29sdW1uLS1udW1lcmljYWwgY29sdW1uKSkKKyAgICAgICAgICAg KG51bWNvbXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCisgICAgICAgICAgICAgICAgICAg ICAgICAjJz4gIyc8KSkKKyAgICAgICAgICAgKHN0cmluZ2NvbXAgKGlmIChlcSBkaXJlY3Rpb24g J2Rlc2NlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3N0cmluZz4gIydzdHJpbmc8 KSkKKyAgICAgICAgICAgKGNvbXBhcmF0b3IgKHZ0YWJsZS1jb2x1bW4tY29tcGFyYXRvciBjb2x1 bW4pKQorICAgICAgICAgICAoY29tcGFyYXRvci1mdW5jICh3aGVuIGNvbXBhcmF0b3IKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXEgZGlyZWN0aW9uICdkZXNjZW5kKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHYxIHYyKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY29tcGFyYXRvciB2MiB2MSkpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IpKSkpCiAgICAgICAoc2V0 Y2FyIGNhY2hlCi0gICAgICAgICAgICAgIChzb3J0IChjYXIgY2FjaGUpCisgICAgICAgICAgICAg IChzb3J0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAo bGFtYmRhIChlMSBlMikKICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoYzEgKGVsdCBlMSAo MSsgaW5kZXgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgKGVsdCBlMiAoMSsg aW5kZXgpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAoaWYgbnVtZXJpY2FsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgbnVtY29tcCAoY2FyIGMxKSAoY2FyIGMyKSkK LSAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cmluZ2NvbXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5n cCAoY2FyIGMxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGMxKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMSkpKQotICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmdwIChjYXIgYzIpKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjYXIgYzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg IChmb3JtYXQgIiVzIiAoY2FyIGMyKSkpKSkpKSkpKSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAoaWYgY29tcGFyYXRvci1mdW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNh bGwgY29tcGFyYXRvci1mdW5jIChjYXIgYzEpIChjYXIgYzIpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAoaWYgbnVtZXJpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVu Y2FsbCBudW1jb21wIChjYXIgYzEpIChjYXIgYzIpKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChmdW5jYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2NvbXAKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmdwIChjYXIgYzEpKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBjMSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMSkpKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoaWYgKHN0cmluZ3AgKGNhciBjMikpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY2FyIGMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQg IiVzIiAoY2FyIGMyKSkpKSkpKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxlLS1pbmRpY2F0b3IgKHRh YmxlIGluZGV4KQogICAobGV0ICgob3JkZXIgKGNhciAobGFzdCAodnRhYmxlLXNvcnQtYnkgdGFi bGUpKSkpKQpAQCAtODYwLDcgKzk1OCw4IEBAIHZ0YWJsZS0tY29tcHV0ZS13aWR0aAogICAgICgv ICgqIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgMSBzcGVjKSkgKHdpbmRvdy13aWR0 aCBuaWwgdCkpCiAgICAgICAgMTAwKSkKICAgICh0Ci0gICAgKGVycm9yICJJbnZhbGlkIHNwZWM6 ICVzIiBzcGVjKSkpKQorICAgIChlcnJvciAiSW52YWxpZCBzcGVjOiAlcyAodnRhYmxlIGAlcycp IgorICAgICAgICAgICBzcGVjICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1biB2dGFi bGUtLWNvbXB1dGUtd2lkdGhzICh0YWJsZSBjYWNoZSkKICAgIkNvbXB1dGUgdGhlIGRpc3BsYXkg d2lkdGhzIGZvciBUQUJMRS4KQEAgLTk3Miw3ICsxMDcxLDEzIEBAIHZ0YWJsZS1yZXZlcnQKICAg ICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKQogCiAoZGVmdW4gdnRhYmxlLS13aWR0 aHMgKHRhYmxlKQotICAobnRoIDEgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkpCisgICh2 dGFibGUtLWNhY2hlLXdpZHRocyAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKSkKKworKGRl ZnVuIHZ0YWJsZS0tY2FjaGUtd2lkdGhzIChjYWNoZSkKKyAgKG50aCAxIGNhY2hlKSkKKworKGRl ZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMgKGNhY2hlKQorICAoY2FyIGNhY2hlKSkKIAogOzs7IENv bW1hbmRzLgogCmRpZmYgLS1naXQgYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMu ZWwgYi90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXggNzRmYjhjYzgx MzkuLmIzMjAxYzdhOWQ4IDEwMDY0NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUt dGVzdHMuZWwKKysrIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCkBAIC0y Nyw3ICsyNyw3IEBACiAocmVxdWlyZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRl ZnRlc3QgdGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQorKGVydC1kZWZ0ZXN0IHRlc3Qt dnRhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQogICAoc2hvdWxkCiAgICAoZXF1YWwgKG1hcGNhcgog ICAgICAgICAgICAobGFtYmRhIChjb2x1bW4pCkBAIC00MSw3ICs0MSw3IEBAIHRlc3QtdnN0YWJs ZS1jb21wdXRlLWNvbHVtbnMKIAogKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWluc2VydC1vYmpl Y3QgKCkKICAgKHNob3VsZAotICAgKGVxdWFsIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3Jl YXRlICIgKnZ0YWJsZS10ZXN0KiIpKSkKKyAgIChlcXVhbCAobGV0ICgoYnVmZmVyIChnZXQtYnVm ZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKICAgICAgICAgICAgIChwb3AtdG8tYnVmZmVy IGJ1ZmZlcikKICAgICAgICAgICAgIChlcmFzZS1idWZmZXIpCiAgICAgICAgICAgICAobGV0KiAo KG9iamVjdDEgJygiRm9vIiAzKSkKQEAgLTY5LDQgKzY5LDEzMCBAQCB0ZXN0LXZ0YWJsZS1pbnNl cnQtb2JqZWN0CiAgICAgICAgICAgICAgIChtYXBjYXIgIydjYWRyICh2dGFibGUtb2JqZWN0cyB0 YWJsZSkpKSkKICAgICAgICAgICAobnVtYmVyLXNlcXVlbmNlIDAgMTEpKSkpCiAKKyhlcnQtZGVm dGVzdCB0ZXN0LXZ0YWJsZS1kdXBsaWNhdGUtb2JqZWN0ICgpCisgIChsZXQgKChidWZmZXIgKGdl dC1idWZmZXItY3JlYXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3AtdG8tYnVmZmVyIGJ1 ZmZlcikKKyAgICAoZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0MSAiWFhYIikKKyAg ICAgICAgICAgKG9iamVjdDIgIllZWSIpCisgICAgICAgICAgICh0YWJsZQorICAgICAgICAgICAg KG1ha2UtdnRhYmxlCisgICAgICAgICAgICAgOnVzZS1oZWFkZXItbGluZSBuaWwKKyAgICAgICAg ICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4KKyAgICAgICAgICAgICA6ZHVwbGlj YXRlLW9iamVjdHMgJ2Vycm9yCisgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2JqZWN0MSBv YmplY3QyKSkpKQorICAgICAgKHNob3VsZC1lcnJvcgorICAgICAgICh2dGFibGUtaW5zZXJ0LW9i amVjdCB0YWJsZSBvYmplY3QxKQorICAgICAgIDp0eXBlICdlcnJvcikKKyAgICAgIChzaG91bGQt ZXJyb3IKKyAgICAgICAodnRhYmxlLXVwZGF0ZS1vYmplY3QgdGFibGUgb2JqZWN0MiBvYmplY3Qx KQorICAgICAgIDp0eXBlICdlcnJvcikKKyAgICAgIDs7IE5vIGVycm9yLgorICAgICAgKHZ0YWJs ZS1pbnNlcnQtb2JqZWN0IHRhYmxlICJaWloiKQorICAgICAgKHNob3VsZCAoZXEgMyAobGVuZ3Ro ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkpKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxl LXVwZGF0ZS1vYmplY3QgKCkKKyAgKGxldCAoKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIip2 dGFibGUtdGVzdCoiKSkpCisgICAgKHBvcC10by1idWZmZXIgYnVmZmVyKQorICAgIChlcmFzZS1i dWZmZXIpCisgICAgKGxldCogKChvYmplY3QxIChjb25zICJYWFgiIDEpKQorICAgICAgICAgICAo b2JqZWN0MiAoY29ucyAiWVlZIiAyKSkKKyAgICAgICAgICAgKHRhYmxlCisgICAgICAgICAgICAo bWFrZS12dGFibGUKKyAgICAgICAgICAgICA6dXNlLWhlYWRlci1saW5lIG5pbAorICAgICAgICAg ICAgIDpvYmplY3QtZXF1YWwgIydlcSA7IElkZW50aXR5LgorICAgICAgICAgICAgIDpjb2x1bW5z ICcoKDpuYW1lICJYWFgiKSkKKyAgICAgICAgICAgICA6b2JqZWN0cyAobGlzdCBvYmplY3QxIG9i amVjdDIpKSkpCisgICAgICAoc2hvdWxkLWVycm9yICh2dGFibGUtdXBkYXRlLW9iamVjdCB0YWJs ZSAiWlpaIikpCisgICAgICAoc2V0Y2RyIG9iamVjdDEgMykKKyAgICAgICh2dGFibGUtdXBkYXRl LW9iamVjdCB0YWJsZSBvYmplY3QxKQorICAgICAgKHNob3VsZCAoZXEgMyAoY2RyIChhc3NvYyAi WFhYIiAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12 dGFibGUtcmVtb3ZlLW9iamVjdCAoKQorICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0 ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVy YXNlLWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEgKGNvbnMgIlhYWCIgMSkpCisgICAgICAg ICAgIChvYmplY3QyIChjb25zICJZWVkiIDIpKQorICAgICAgICAgICAodGFibGUKKyAgICAgICAg ICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAg ICAgICAgICAgOm9iamVjdC1lcXVhbCAjJ2VxIDsgSWRlbnRpdHkuCisgICAgICAgICAgICAgOmNv bHVtbnMgJygoOm5hbWUgIlhYWCIpKQorICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVj dDEgb2JqZWN0MikpKSkKKyAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0 IHRhYmxlICJaWloiKSkKKyAgICAgICh2dGFibGUtcmVtb3ZlLW9iamVjdCB0YWJsZSBvYmplY3Qx KQorICAgICAgKHNob3VsZCAoZXEgMSAobGVuZ3RoICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkp KSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW9iamVjdC1lcXVhbCAoKQorICAobGV0ICgo YnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRv LWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEg IlhYWCIpCisgICAgICAgICAgIChvYmplY3QyICJYWFgiKQorICAgICAgICAgICAodGFibGUtZXEK KyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1tYXgp KQorICAgICAgICAgICAgICAobWFrZS12dGFibGUKKyAgICAgICAgICAgICAgIDp1c2UtaGVhZGVy LWxpbmUgbmlsCisgICAgICAgICAgICAgICA6Y29sdW1ucyAnKCg6bmFtZSAidGFibGUtZXEiIDp3 aWR0aCAyMCkpCisgICAgICAgICAgICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4K KyAgICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVjdDEgb2JqZWN0MikpKSkKKyAgICAg ICAgICAgKHRhYmxlLWVxdWFsCisgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgKGdv dG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAgICAgICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAg ICAgICAgICA6dXNlLWhlYWRlci1saW5lIG5pbAorICAgICAgICAgICAgICAgOmNvbHVtbnMgJygo Om5hbWUgInRhYmxlLWVxdWFsIiA6d2lkdGggMjApKQorICAgICAgICAgICAgICAgOm9iamVjdC1l cXVhbCAjJ2VxdWFsIDsgVmFsdWUuCisgICAgICAgICAgICAgICA6b2JqZWN0cyAobGlzdCBvYmpl Y3QxIG9iamVjdDIpKSkpKQorICAgICAgKHNob3VsZAorICAgICAgIChwcm9nbgorICAgICAgICAg KHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxKQorICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVj dCBvYmplY3QyKQorICAgICAgICAgKGVxdWFsIG9iamVjdDIgKGdldC10ZXh0LXByb3BlcnR5IChw b2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hvdWxkLW5vdAorICAgICAgIChwcm9n bgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxKQorICAgICAgICAgKHZ0YWJs ZS1nb3RvLW9iamVjdCAiWlpaIikKKyAgICAgICAgIChlcXVhbCBvYmplY3QxIChnZXQtdGV4dC1w cm9wZXJ0eSAocG9pbnQpICd2dGFibGUtb2JqZWN0KSkpKQorICAgICAgKHNob3VsZAorICAgICAg IChwcm9nbgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxdWFsKQorICAgICAg ICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QyKQorICAgICAgICAgKGVxdWFsIG9iamVjdDEg KGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hv dWxkLW5vdAorICAgICAgIChwcm9nbgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxl LWVxdWFsKQorICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCAiWlpaIikKKyAgICAgICAgIChl cXVhbCBvYmplY3QxIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICd2dGFibGUtb2JqZWN0KSkp KSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29sdW1uLWNvbXBhcmF0b3IgKCkKKyAg KGxldCAoKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIip2dGFibGUtdGVzdCoiKSkpCisgICAg KHBvcC10by1idWZmZXIgYnVmZmVyKQorICAgIChlcmFzZS1idWZmZXIpCisgICAgKGxldCAoKHRh YmxlCisgICAgICAgICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgOnVzZS1oZWFkZXItbGlu ZSB0CisgICAgICAgICAgICA6Z2V0dGVyIChsYW1iZGEgKG9iamVjdCBfaW5kZXggX3RhYmxlKSBv YmplY3QpCisgICAgICAgICAgICA6Y29sdW1ucyAnKCggOm5hbWUgIkRhdGUiCisgICAgICAgICAg ICAgICAgICAgICAgICAgOnByaW1hcnkgYXNjZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAg OndpZHRoIDQwCisgICAgICAgICAgICAgICAgICAgICAgICAgOmZvcm1hdHRlciAobGFtYmRhIChv YmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKCh0aW1l IChkYXRlLXRvLXRpbWUgb2JqZWN0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGZvcm1hdCAiJXMgKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChmb3JtYXQtdGltZS1zdHJpbmcgIiVBLCAlQiAlZCAlWSIgdGlt ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIg dGltZSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tcGFyYXRvciAobGFtYmRhIChv YmplY3QxIG9iamVjdDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bGV0ICgodGltZTEgKGRhdGUtdG8tdGltZSBvYmplY3QxKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lMiAoZGF0ZS10by10aW1lIG9iamVjdDIpKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDwgKGNhciB0aW1lMSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciB0aW1lMikp KSkpKQorICAgICAgICAgICAgOm9iamVjdHMgJygiRnJpLCAxMSBKdWwgMjAyNSIKKyAgICAgICAg ICAgICAgICAgICAgICAgIlRodSwgMTAgSnVsIDIwMjUiKSkpKQorICAgICAgKHNob3VsZAorICAg ICAgIChzdHJpbmc9CisgICAgICAgICJUaHVyc2RheSIKKyAgICAgICAgKHRoaW5nLWF0LXBvaW50 ICd3b3JkKSkpKSkpCisKIDs7OyB2dGFibGUtdGVzdHMuZWwgZW5kcyBoZXJlCi0tIAoyLjQ3LjEK Cg== --000000000000d5919c0639d367f0-- From unknown Tue Jul 15 05:17:18 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79009: [PATCH] Improve 'vtable' object handling, cache handling, messages Resent-From: =?UTF-8?Q?St=C3=A9phane?= Marks Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Jul 2025 19:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79009 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 79009@debbugs.gnu.org Cc: Spencer Baugh , Kristoffer Balintona , Joost Kremers , ijqq@protonmail.com, Visuwesh , Adam Porter , Lars Ingebrigtsen , Augusto Stoffel Received: via spool by 79009-submit@debbugs.gnu.org id=B79009.17525204998224 (code B ref 79009); Mon, 14 Jul 2025 19:15:02 +0000 Received: (at 79009) by debbugs.gnu.org; 14 Jul 2025 19:14:59 +0000 Received: from localhost ([127.0.0.1]:36580 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ubOdf-00028a-Bo for submit@debbugs.gnu.org; Mon, 14 Jul 2025 15:14:59 -0400 Received: from mail-vk1-xa2d.google.com ([2607:f8b0:4864:20::a2d]:47462) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1ubOdc-00028D-09 for 79009@debbugs.gnu.org; Mon, 14 Jul 2025 15:14:56 -0400 Received: by mail-vk1-xa2d.google.com with SMTP id 71dfb90a1353d-535ae7eeebeso4166552e0c.3 for <79009@debbugs.gnu.org>; Mon, 14 Jul 2025 12:14:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752520490; x=1753125290; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=B/UPY+4xQxjrxelgAE05hpPkUiD4JBBAp3Q5KWOxwC8=; b=Jn2EMli34KoHG75Tr9bDZS1jYLIngmt8SMOQGu4BOPiSDnX5EwSGMXTtpMl/0suc7d KxJWnHhwxIMR4gzIso5P5JY3PhSAlEeo7wlZAoOZZsoTnQP4Zb5U13smWqSFUxTRAS5s RjezMppRlJcOIRENylf5lLh6c0LAs3znV0gdHAWde6lpnHESF7l5OvE4SI9qBoHf9/HA S5qKElEQb/UlqN882OyT3mbGgQda8NkaSCBsXGOuQPT6DvvCg3pDPCFenSqLF17ZxuRX WchYZOg1jWtKsirTcvck9rrtx3LeicxmeL/cPEcIabAJ5RnQtDSmYzfl4o96D+hjcby/ osbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752520490; x=1753125290; 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=B/UPY+4xQxjrxelgAE05hpPkUiD4JBBAp3Q5KWOxwC8=; b=njNnlKGvAOWdjH53tw2Wm9HvZL0/nBZB6FAJunbwYtXApaXQjKfVLQz6OXFG/uX1HX SlGznY4bDP6iAE1MxYSN1PpDsqPC390EsXstrvChQVZRL6+r3/2HSZdcrJ2w8nATbsX9 BS6Fe0lOSBr3jU4z0vF6SFkyg8+SnAJMzXKJpD6T2K/v1MRFR75d9yGmuRH9XPxXXuwK 0kmPAPfu3CL7m1NCgj//W05s1YaCKPnJRFITtFuxRvhRZ2Xd7IifHY7f9FgFWB59T8Cd USIdXswmWtXmAQCaot5TP5mnObTstjfmYxd8W2ylqoPyw+zsI1ng5c68OL8aMSrTQPYv YXBg== X-Gm-Message-State: AOJu0YyRKMgiqrKOeZm/mrTpVzH6kqE+CX1bfE1acQ2nQzuucM2ZWl0x HzjpNd6VSJVXbdG3hP/k9MT0ugg+dNR3iLtbdvcd5YlkYvwkEbyR9UnbJ0J9uFvOcelzGEp1hqk A2dR06z7QW7U5F7ssl5izho5m42LytDQp6w== X-Gm-Gg: ASbGnctA20vhC5DRoVvaQt0fy9RlCcrWojQZo9OIdPi8VYx3D/SVmxzFqGHwNE0uQS5 nPaS86Y7u3tZ3Pb1iClnF3JLnXUBOEHuJ4cpDvntqBADHxoBdEaPqo/gYLtMseK6HJEQAXVR4cv HnF+ir/nxn5M4pykh/P6sk94tKr2TDy9915/+T3upSShUoqRxh4SN/YJVLgWZYl+nRayzYCfF9L oBOzACzh2ES7puzivbN X-Google-Smtp-Source: AGHT+IHNxDY5OcUtNjJ97KnF2NQztLHWYXMRn7ax3elTVO7dZAzBqOo6C6pI4+5ZgNd0xwQVlf5dm8KO7MaKiWrxUi4= X-Received: by 2002:a05:6122:2a14:b0:535:aea0:795a with SMTP id 71dfb90a1353d-535f46dfabdmr7320528e0c.1.1752520489772; Mon, 14 Jul 2025 12:14:49 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: =?UTF-8?Q?St=C3=A9phane?= Marks Date: Mon, 14 Jul 2025 15:14:37 -0400 X-Gm-Features: Ac12FXw9ocUXNLBhIHUZGnwpkjeaIAp3tcyIvnZkg7eCMHiWX_9MU1kIg122A9M Message-ID: Content-Type: multipart/mixed; boundary="000000000000414fa80639e87937" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --000000000000414fa80639e87937 Content-Type: multipart/alternative; boundary="000000000000414fa70639e87935" --000000000000414fa70639e87935 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks wrote: > Attached is the first "smaller" patch to converge on the fixed and > upgraded vtable presented elsewhere under bug 78843. I'd like for us to > consider this patch size for vtable acceptable, and to review it in short > order to accommodate getting the next patch sets to follow quickly after > this one. I'd prefer this not take until the autumn (in the northern > hemisphere). > > If any of you cc'd here do not want to be cc'd on other patches, let me > know. You're the ones who I've seen use vtable in the wild, or have > submitted bug reports. All of your issues have been addressed, though no= t > necessarily in this first patch. Refer to bug 78843 to see the fixed and > upgraded vtable intended to converge here. > I've updated the broader vtable update in the referenced 78843 bug to check out if interested. I've removed support for the duplicate-object feature. After careful consideration, it was half baked and I think better for vtable programmers to handle their own objects. I will be sure the documentation stresses to avoid duplicate objects as vtable's design is predicated on unique objects (or race conditions ensue among duplicate object references). Attaching the updated patch which is also formatted to avoid mere whitespace changes. -St=C3=A9phane --000000000000414fa70639e87935 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
= On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks <shipmints@gmail.com> wrote:
=
Attached is the first "smaller" patch to converge on the= fixed and upgraded vtable presented elsewhere under bug 78843.=C2=A0 I'= ;d like for us to consider this patch size for vtable acceptable, and to re= view it in short order to accommodate getting the next patch sets to follow= quickly after this one.=C2=A0 I'd prefer this not take until the autum= n (in the northern hemisphere).
<= br>
If any of you cc'd here d= o not want to be cc'd on other patches, let me know.=C2=A0 You're t= he ones who I've seen use vtable in the wild,=C2=A0or have submitted bu= g reports.=C2=A0 All of your issues have been addressed, though not necessa= rily in this first=C2=A0patch.=C2=A0 Refer to bug 78843 to see the fixed an= d upgraded vtable intended to converge here.

I've up= dated the broader vtable update in the referenced 78843 bug to check out if= interested.

= I've removed support=C2=A0for the duplicate-object feature.=C2=A0 After= careful consideration, it was half baked and I think better for vtable pro= grammers to handle their own objects.=C2=A0 I will be sure the documentatio= n stresses to avoid duplicate objects as vtable's design is predicated = on unique objects (or race conditions ensue among duplicate object referenc= es).

=
Attachin= g the updated patch which is also formatted to avoid mere whitespace change= s.

-St=C3=A9p= hane
--000000000000414fa70639e87935-- --000000000000414fa80639e87937 Content-Type: application/octet-stream; name="0001-Improve-vtable-object-handling-cache-handling-messag.patch" Content-Disposition: attachment; filename="0001-Improve-vtable-object-handling-cache-handling-messag.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_md3hfw4f0 RnJvbSBlN2JiNjFiZWNiMTVlMDdlYmQzZTU0Y2YyYzFlYTJiZWNhZGEwOWIwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFN1biwgMTMgSnVsIDIwMjUgMTM6MzI6MjggLTA0MDAK U3ViamVjdDogW1BBVENIXSBJbXByb3ZlICd2dGFibGUnIG9iamVjdCBoYW5kbGluZywgY2FjaGUg aGFuZGxpbmcsIG1lc3NhZ2VzCgpBZGQgb2JqZWN0IGVxdWFsaXR5IGZ1bmN0aW9uIG92ZXJyaWRl IChkZWZhdWx0cyB0byBleGlzdGluZyAnZXEnCmJlaGF2aW9yKS4gIEFkZCBjb2x1bW4gY29tcGFy YXRvciB0byBhZGRyZXNzIG9iamVjdApzb3J0aW5nIChkZWZhdWx0cyB0byBleGlzdGluZyBiZWhh dmlvcikuICBDb3JyZWN0IGNhY2hlCnJlZmVyZW5jZXMgdG8gcHJpbWUgdGhlIGNhY2hlIGFzIG5l ZWRlZC4gIEFkZCBjYWNoZSBhY2Nlc3NvcgpmdW5jdGlvbnMuICBBZGQgdGFibGUgbmFtZSBzbG90 IHRvIGltcHJvdmUgZXJyb3JzIGFuZAptZXNzYWdlcyAoZGVmYXVsdHMgdG8gIip2dGFibGUqIiku CgpBZGRlZCB0ZXN0cy4KCiogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAodnRhYmxlLWNvbHVt bik6IEFkZCBjb21wYXJhdG9yCnNsb3QuCih2dGFibGUpOiBBZGQgbmFtZSwgb2JqZWN0LWVxdWFs IHNsb3RzLgoobWFrZS12dGFibGUpOiBJbml0aWFsaXplIG5ldyBzbG90cy4KKHZ0YWJsZS1nb3Rv LW9iamVjdCk6IFVzZSBvYmplY3QtZXF1YWwuCih2dGFibGUtdXBkYXRlLW9iamVjdCk6IFVzZSBv YmplY3QtZXF1YWwsIHVzZSBjYWNoZSBhY2Nlc3NvciwKaW1wcm92ZSBtZXNzYWdlcy4KKHZ0YWJs ZS1yZW1vdmUtb2JqZWN0KTogVXNlIG9iamVjdC1lcXVhbCwgcHJpbWUgY2FjaGUsIHVzZSBjYWNo ZQpmdW5jdGlvbnMsIGltcHJvdmUgbWVzc2FnZXMuCih2dGFibGUtaW5zZXJ0LW9iamVjdCk6IFVz ZSBvYmplY3QtZXF1YWwsIHVzZSBjYWNoZSBhY2Nlc3NvciwKaW1wcm92ZSBtZXNzYWdlcy4KKHZ0 YWJsZS1pbnNlcnQpOiBQcmltZSBjYWNoZSwgdXNlIGNhY2hlIGFjY2Vzc29yLgoodnRhYmxlLS1z b3J0KTogVXNlIGNvbHVtbiBjb21wYXJhdG9yLCBwcmltZSBjYWNoZSwgdXNlIGNhY2hlCmFjY2Vz c29yLgoodnRhYmxlLS1jb21wdXRlLXdpZHRoKTogSW1wcm92ZSBtZXNzYWdlLgoodnRhYmxlLS13 aWR0aHMpOiBVc2UgY2FjaGUgYWNjZXNzb3IuCgoqIHRlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJs ZS10ZXN0cy5lbAoodGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyk6IFJlbmFtZWQgdG8KdGVz dC12dGFibGUtY29tcHV0ZS1jb2x1bW5zLgoodGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdCk6IENo YW5nZWQgYnVmZmVyIG5hbWUgdG8gbm9uLWhpZGRlbi4KKHRlc3QtdnRhYmxlLXVwZGF0ZS1vYmpl Y3QsIHRlc3QtdnRhYmxlLXJlbW92ZS1vYmplY3QpCih0ZXN0LXZ0YWJsZS1vYmplY3QtZXF1YWws IHRlc3QtdnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yKTogTmV3CnRlc3QuCi0tLQogbGlzcC9lbWFj cy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMTQzICsrKysrKysrKysrKysrKysrKysrLS0t LS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIHwgMTA2ICsrKysrKysr KysrKysrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDIxMCBpbnNlcnRpb25zKCspLCAzOSBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsIGIvbGlzcC9l bWFjcy1saXNwL3Z0YWJsZS5lbAppbmRleCAwMDc4NTExM2VkYi4uMzFlZjczZDVlYjQgMTAwNjQ0 Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFjcy1saXNwL3Z0 YWJsZS5lbApAQCAtNDUsMTQgKzQ1LDE4IEBAIHZ0YWJsZS1jb2x1bW4KICAgZ2V0dGVyCiAgIGZv cm1hdHRlcgogICBkaXNwbGF5ZXIKKyAgY29tcGFyYXRvcgogICAtbnVtZXJpY2FsCiAgIC1hbGln bmVkKQogCiAoZGVmY2xhc3MgdnRhYmxlICgpCi0gICgoY29sdW1ucyA6aW5pdGFyZyA6Y29sdW1u cyA6YWNjZXNzb3IgdnRhYmxlLWNvbHVtbnMpCisgICgobmFtZSA6aW5pdGFyZyA6bmFtZSA6YWNj ZXNzb3IgdnRhYmxlLW5hbWUpCisgICAoY29sdW1ucyA6aW5pdGFyZyA6Y29sdW1ucyA6YWNjZXNz b3IgdnRhYmxlLWNvbHVtbnMpCiAgICAob2JqZWN0cyA6aW5pdGFyZyA6b2JqZWN0cyA6YWNjZXNz b3IgdnRhYmxlLW9iamVjdHMpCiAgICAob2JqZWN0cy1mdW5jdGlvbiA6aW5pdGFyZyA6b2JqZWN0 cy1mdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgOmFjY2Vzc29yIHZ0YWJsZS1vYmplY3Rz LWZ1bmN0aW9uKQorICAgKG9iamVjdC1lcXVhbCA6aW5pdGFyZyA6b2JqZWN0LWVxdWFsCisgICAg ICAgICAgICAgICAgIDphY2Nlc3NvciB2dGFibGUtb2JqZWN0LWVxdWFsKQogICAgKGdldHRlciA6 aW5pdGFyZyA6Z2V0dGVyIDphY2Nlc3NvciB2dGFibGUtZ2V0dGVyKQogICAgKGZvcm1hdHRlciA6 aW5pdGFyZyA6Zm9ybWF0dGVyIDphY2Nlc3NvciB2dGFibGUtZm9ybWF0dGVyKQogICAgKGRpc3Bs YXllciA6aW5pdGFyZyA6ZGlzcGxheWVyIDphY2Nlc3NvciB2dGFibGUtZGlzcGxheWVyKQpAQCAt ODYsNyArOTAsMTIgQEAgdnRhYmxlLWhlYWRlci1saW5lLW1hcAogICAiPGZvbGxvdy1saW5rPiIg J21vdXNlLWZhY2UKICAgIjxtb3VzZS0yPiIgIyd2dGFibGUtaGVhZGVyLWxpbmUtc29ydCkKIAot KGNsLWRlZnVuIG1ha2UtdnRhYmxlICgma2V5IGNvbHVtbnMgb2JqZWN0cyBvYmplY3RzLWZ1bmN0 aW9uCisoY2wtZGVmdW4gbWFrZS12dGFibGUgKCZrZXkKKyAgICAgICAgICAgICAgICAgICAgICAg KG5hbWUgIip2dGFibGUqIikKKyAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucworICAgICAg ICAgICAgICAgICAgICAgICBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMt ZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdC1lcXVhbCAjJ2VxKQogICAg ICAgICAgICAgICAgICAgICAgICBnZXR0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0 dGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllcgpAQCAtMTEzLDggKzEyMiwxMCBA QCBtYWtlLXZ0YWJsZQogICAobGV0ICgodGFibGUKICAgICAgICAgIChtYWtlLWluc3RhbmNlCiAg ICAgICAgICAgJ3Z0YWJsZQorICAgICAgICAgIDpuYW1lIG5hbWUKICAgICAgICAgICA6b2JqZWN0 cyBvYmplY3RzCiAgICAgICAgICAgOm9iamVjdHMtZnVuY3Rpb24gb2JqZWN0cy1mdW5jdGlvbgor ICAgICAgICAgIDpvYmplY3QtZXF1YWwgb2JqZWN0LWVxdWFsCiAgICAgICAgICAgOmdldHRlciBn ZXR0ZXIKICAgICAgICAgICA6Zm9ybWF0dGVyIGZvcm1hdHRlcgogICAgICAgICAgIDpkaXNwbGF5 ZXIgZGlzcGxheWVyCkBAIC0xMzIsNyArMTQzLDggQEAgbWFrZS12dGFibGUKICAgICA7OyBBdXRv LWdlbmVyYXRlIHRoZSBjb2x1bW5zLgogICAgICh1bmxlc3MgY29sdW1ucwogICAgICAgKHVubGVz cyBvYmplY3RzCi0gICAgICAgIChlcnJvciAiQ2FuJ3QgYXV0by1nZW5lcmF0ZSBjb2x1bW5zOyBu byBvYmplY3RzIikpCisgICAgICAgIChlcnJvciAiQ2FuJ3QgYXV0by1nZW5lcmF0ZSBjb2x1bW5z OyBubyBvYmplY3RzICh2dGFibGUgYCVzJykiCisgICAgICAgICAgICAgICAodnRhYmxlLW5hbWUg dGFibGUpKSkKICAgICAgIChzZXRxIGNvbHVtbnMgKG1ha2UtbGlzdCAobGVuZ3RoIChjYXIgb2Jq ZWN0cykpICIiKSkpCiAgICAgKHNldGYgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKQogICAgICAgICAg IChtYXBjYXIgKGxhbWJkYSAoY29sdW1uKQpAQCAtMjUxLDE0ICsyNjMsMTUgQEAgdnRhYmxlLWdv dG8tb2JqZWN0CiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBvYmplY3QgaWYgZm91bmQsIGFu ZCBuaWwgaWYgbm90LiIKICAgKGxldCAoKHN0YXJ0IChwb2ludCkpKQogICAgICh2dGFibGUtYmVn aW5uaW5nLW9mLXRhYmxlKQorICAgIChsZXQgKChwcmVkaWNhdGUgKHZ0YWJsZS1vYmplY3QtZXF1 YWwgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKQogICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KICAg ICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKHZ0YWJsZS1l bmQtb2YtdGFibGUpKSkKLSAgICAgIChpZiAodGV4dC1wcm9wZXJ0eS1zZWFyY2gtZm9yd2FyZCAn dnRhYmxlLW9iamVjdCBvYmplY3QgIydlcSkKKyAgICAgICAgKGlmICh0ZXh0LXByb3BlcnR5LXNl YXJjaC1mb3J3YXJkICd2dGFibGUtb2JqZWN0IG9iamVjdCBwcmVkaWNhdGUpCiAgICAgICAgICAg ICAocHJvZ24KICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAtMSkKICAgICAgICAgICAgICAg KHBvaW50KSkKICAgICAgICAgICAoZ290by1jaGFyIHN0YXJ0KQotICAgICAgICBuaWwpKSkpCisg ICAgICAgICAgbmlsKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1nb3RvLXRhYmxlICh0YWJsZSkKICAg IkdvIHRvIFRBQkxFIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KQEAgLTI5MSwyNSArMzA0LDMyIEBA IHZ0YWJsZS11cGRhdGUtb2JqZWN0CiAgIChsZXQqICgob2JqZWN0cyAodnRhYmxlLW9iamVjdHMg dGFibGUpKQogICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQogICAgIDs7IEZpcnN0IHJl cGxhY2UgdGhlIG9iamVjdCBpbiB0aGUgb2JqZWN0IHN0b3JhZ2UuCi0gICAgKGlmIChlcSBvbGQt b2JqZWN0IChjYXIgb2JqZWN0cykpCisgICAgKGlmIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVx dWFsIHRhYmxlKSBvbGQtb2JqZWN0IChjYXIgb2JqZWN0cykpCiAgICAgICAgIDs7IEl0J3MgYXQg dGhlIGhlYWQsIHNvIHJlcGxhY2UgaXQgdGhlcmUuCiAgICAgICAgIChzZXRmICh2dGFibGUtb2Jq ZWN0cyB0YWJsZSkKICAgICAgICAgICAgICAgKGNvbnMgb2JqZWN0IChjZHIgb2JqZWN0cykpKQog ICAgICAgOzsgT3RoZXJ3aXNlIHNwbGljZSBpbnRvIHRoZSBsaXN0LgogICAgICAgKHdoaWxlIChh bmQgKGNkciBvYmplY3RzKQotICAgICAgICAgICAgICAgICAgKG5vdCAoZXEgKGNhZHIgb2JqZWN0 cykgb2xkLW9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgKG5vdCAoZnVuY2FsbCAodnRhYmxl LW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNh ZHIgb2JqZWN0cykgb2xkLW9iamVjdCkpKQogICAgICAgICAoc2V0cSBvYmplY3RzIChjZHIgb2Jq ZWN0cykpKQotICAgICAgKHVubGVzcyBvYmplY3RzCi0gICAgICAgIChlcnJvciAiQ2FuJ3QgZmlu ZCB0aGUgb2xkIG9iamVjdCIpKQorICAgICAgKHVubGVzcyAoYW5kIG9iamVjdHMKKyAgICAgICAg ICAgICAgICAgICAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoY2FkciBvYmplY3RzKSBvbGQtb2JqZWN0KSkKKyAgICAgICAg KGVycm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisgICAgICAg ICAgICAgICAodnRhYmxlLW5hbWUgdGFibGUpKSkKICAgICAgIChzZXRjYXIgKGNkciBvYmplY3Rz KSBvYmplY3QpKQogICAgIDs7IFRoZW4gdXBkYXRlIHRoZSBjYWNoZS4uLgogICAgIDs7IEZJWE1F OiBJZiB0aGUgdGFibGUncyBidWZmZXIgaGFzIG5vIHZpc2libGUgd2luZG93LCBvciBpZiBpdHMK ICAgICA7OyB3aWR0aCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgdGFibGUgd2FzIHVwZGF0ZWQsIHRo ZSBjYWNoZSBrZXkgd2lsbAogICAgIDs7IG5vdCBtYXRjaCBhbmQgdGhlIG9iamVjdCBjYW4ndCBi ZSB1cGRhdGVkLiAgKEJ1ZyAjNjk4MzcpLgotICAgIChpZi1sZXQqICgobGluZS1udW1iZXIgKHNl cS1wb3NpdGlvbiAoY2FyICh2dGFibGUtLWNhY2hlIHRhYmxlKSkgb2xkLW9iamVjdAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChhIGIpCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsIChjYXIgYSkgYikpKSkK LSAgICAgICAgICAgICAgKGxpbmUgKGVsdCAoY2FyICh2dGFibGUtLWNhY2hlIHRhYmxlKSkgbGlu ZS1udW1iZXIpKSkKKyAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0 YWJsZSkpCisgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGFzc29jIG9sZC1vYmplY3QKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkpKQor ICAgICAgICAgICAgICAobGluZSAoZWx0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5l LW51bWJlcikpKQogICAgICAgICAocHJvZ24KICAgICAgICAgICAoc2V0Y2FyIGxpbmUgb2JqZWN0 KQogICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRh YmxlIG9iamVjdCkpCkBAIC0zMjAsMjggKzM0MCw0NiBAQCB2dGFibGUtdXBkYXRlLW9iamVjdAog ICAgICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpKQogICAgICAgICAgICAgICAoZGVsZXRl LWxpbmUpCiAgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgbGlu ZS1udW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aCAxICh2dGFi bGUtLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0 YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgICAgICAoYWRkLXRleHQtcHJv cGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkp KSkKICAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFs dWUgaW50byBhIHByZXZpb3VzbHkKICAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBz byByZWNvbXB1dGUuCiAgICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJs ZSAoY2RyIGxpbmUpKSkKLSAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGlu IHZ0YWJsZSIpKSkpCisgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgY2FjaGVkIG9iamVjdCAodnRh YmxlIGAlcycpIgorICAgICAgICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1 biB2dGFibGUtcmVtb3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQogICAiUmVtb3ZlIE9CSkVDVCBm cm9tIFRBQkxFLgogVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBkaXNwbGF5ZWQgbGluZS4iCisg IChsZXQgKChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAoaW5o aWJpdC1yZWFkLW9ubHkgdCkpCisgICAgKHVubGVzcyAoc2VxLWNvbnRhaW5zLXAgKHZ0YWJsZS1v YmplY3RzIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkKKyAgICAg IChlcnJvciAiQ2FuJ3QgZmluZCB0aGUgb2JqZWN0IHRvIHJlbW92ZSAodnRhYmxlIGAlcycpIgor ICAgICAgICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKQogICAgIDs7IEZpcnN0IHJlbW92ZSBm cm9tIHRoZSBvYmplY3RzLgotICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9i amVjdCAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKKyAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMg dGFibGUpIChzZXEtcmVtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxh bWJkYSAoZWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwg KHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBlbHQgb2JqZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKICAgICA7OyBUaGVuIGFkanVzdCB0aGUg Y2FjaGUgYW5kIGRpc3BsYXkuCi0gIChsZXQgKChjYWNoZSAodnRhYmxlLS1jYWNoZSB0YWJsZSkp Ci0gICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKLSAgICAoc2V0Y2FyIGNhY2hlIChkZWxx IChhc3NxIG9iamVjdCAoY2FyIGNhY2hlKSkgKGNhciBjYWNoZSkpKQorICAgIChpZi1sZXQqICgo b2xkLWxpbmUgKGFzc29jIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2 dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkpKQorICAgICAgICAocHJvZ24KKyAgICAgICAg ICAoc2V0Y2FyIGNhY2hlIChkZWxxIG9sZC1saW5lICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl KSkpCiAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAodnRhYmxlLWdvdG8t dGFibGUgdGFibGUpCiAgICAgICAgICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVj dCkKLSAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkKKyAgICAgICAgICAgICAgKGRlbGV0ZS1saW5l KSkpKQorICAgICAgOzsgQXQgdGhpcyBwb2ludCwgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZCBmcm9t IG9iamVjdHMsIGJ1dCBub3QKKyAgICAgIDs7IHRoZSBjYWNoZSwgd2hpY2ggd2lsbCBzdGFsZS4K KyAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisg ICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkKIAogOzsgRklYTUU6IFRoZSBmYWN0 IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2dGFibGUtaW5zZXJ0LW9iamVj dCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYXMKQEAgLTM3OCw3 ICs0MTYsMTYgQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChudGhjZHIgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICA7OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28gbGFyZ2U6CiAg ICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCi0gICAgICAgICAgICAg ICAgICAgICAob3IgKG1lbXEgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKKyAgICAg ICAgICAgICAgICAgICAgIChvcgorICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChsb2MgKHZ0 YWJsZS1vYmplY3RzIHRhYmxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAod2hpbGUgKGFu ZCAoY2RyIGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKGZ1 bmNhbGwgKHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgbG9jKSBsb2NhdGlvbikpKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAoc2V0cSBsb2MgKGNkciBsb2MpKSkKKyAgICAgICAgICAgICAg ICAgICAgICAgIChpZiAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGxvYykgbG9jYXRpb24pCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5p bCkpCiAgICAgICAgICAgICAgICAgICAgICAgOzsgUHJlcGVuZCBpZiBgbG9jYXRpb24nIGlzIG5v dCBmb3VuZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICA7OyBgYmVmb3JlJyBpcyBub24tbmls OgogICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2dGFibGUtb2JqZWN0cyB0YWJs ZSkpKSkKQEAgLTQwMCw3ICs0NDcsNyBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAogICAgIDs7IFRo ZW4gYWRqdXN0IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KICAgICAoc2F2ZS1leGN1cnNpb24KICAg ICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJs ZS0tY2FjaGUgdGFibGUpKQorICAgICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2Fj aGUgdGFibGUpKQogICAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQogICAgICAgICAg ICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCiAgICAgICAg ICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQpAQCAtNDEwLDExICs0 NTcsMTQgQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAgICAgICAoZWxsaXBzaXMtd2lk dGggKHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcykpCiAgICAgICAgICAgICAgKGVsZW0gKGlm IGxvY2F0aW9uICA7IFRoaXMgYmluZGluZyBtaXJyb3JzIHRoZSBiaW5kaW5nIG9mIGBwb3MnIGFi b3ZlLgogICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgKG50aCBsb2NhdGlvbiAoY2FyIGNhY2hlKSkKLSAgICAg ICAgICAgICAgICAgICAgICAgICAob3IgKGFzc3EgbG9jYXRpb24gKGNhciBjYWNoZSkpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVz IGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFzc29jCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChhbmQgYmVmb3JlIChjYWFyIGNhY2hlKSkpKQogICAgICAgICAgICAgICAgICAgICAg KGlmIGJlZm9yZSAoY2FhciBjYWNoZSkpKSkKLSAgICAgICAgICAgICAocG9zIChtZW1xIGVsZW0g KGNhciBjYWNoZSkpKQorICAgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSAodnRhYmxlLS1jYWNo ZS1saW5lcyBjYWNoZSkpKQogICAgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxl LS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKICAgICAgICAgKGlmIChvciBi ZWZvcmUKICAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24pKSkKQEAg LTQzMywxMyArNDgzLDE0IEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAgICAgICAgICAgICAg ICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCiAgICAgICAgICAgICAgICAg ICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQogICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBl bmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIChjYXIgY2Fj aGUpIChsaXN0IGxpbmUpKSkKKyAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jICh2dGFi bGUtLWNhY2hlLWxpbmVzIGNhY2hlKSAobGlzdCBsaW5lKSkpCiAgICAgICAgICAgICAodnRhYmxl LWVuZC1vZi10YWJsZSkpKQogICAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCiAgICAgICAg ICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBsaW5lcyBiZWxvdyB0aGlz IGlmIHdlCiAgICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9ycy4KICAgICAgICAgICAodnRhYmxl LS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobnRoIDEgY2FjaGUpICh2dGFibGUtLXNwYWNlciB0YWJsZSkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQogICAgICAgICAgIChhZGQt dGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUgdGFi bGUpKSkKQEAgLTUyMyw3ICs1NzQsOCBAQCB2dGFibGUtLWVuc3VyZS1jYWNoZQogICAgICAgKHZ0 YWJsZS0tcmVjb21wdXRlLWNhY2hlIHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaW5zZXJ0ICh0 YWJsZSkKLSAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgKGxldCog KChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgKHNwYWNlciAo dnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAgICAgICAg ICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCiAgICAgICAgICAgICAgICAg ICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCkBAIC01MzMsNyAr NTg1LDcgQEAgdnRhYmxlLWluc2VydAogICAgICAgICAgOzsgV2UgbWFpbnRhaW4gYSBjYWNoZSBw ZXIgc2NyZWVuL3dpbmRvdyB3aWR0aCwgc28gdGhhdCB3ZSByZW5kZXIKICAgICAgICAgIDs7IGNv cnJlY3RseSBpZiBFbWFjcyBpcyBvcGVuIG9uIHR3byBkaWZmZXJlbnQgc2NyZWVucyAob3IgdGhl CiAgICAgICAgICA7OyB1c2VyIHJlc2l6ZXMgdGhlIGZyYW1lKS4KLSAgICAgICAgICh3aWR0aHMg KG50aCAxICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpKSkKKyAgICAgICAgICh3aWR0aHMg KHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSkpCiAgICAgOzsgRG9uJ3QgaW5zZXJ0IGFueSBo ZWFkZXIgb3IgaGVhZGVyIGxpbmUgaWYgdGhlIHVzZXIgaGFzbid0CiAgICAgOzsgc3BlY2lmaWVk IHRoZSBjb2x1bW5zLgogICAgICh3aGVuIChzbG90LXZhbHVlIHRhYmxlICctaGFzLWNvbHVtbi1z cGVjKQpAQCAtNTUxLDcgKzYwMyw3IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAodnRhYmxlLS1zb3J0 IHRhYmxlKQogICAgIDs7IEluc2VydCB0aGUgZGF0YS4KICAgICAobGV0ICgobGluZS1udW1iZXIg MCkpCi0gICAgICAoZG9saXN0IChsaW5lIChjYXIgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKSkKKyAg ICAgIChkb2xpc3QgKGxpbmUgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKQogICAgICAgICAo dnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAg ICAgICAgIChzZXRxIGxpbmUtbnVtYmVyICgxKyBsaW5lLW51bWJlcikpKSkKQEAgLTY2NywxOCAr NzE5LDI2IEBAIHZ0YWJsZS0tY2xlYXItY2FjaGUKIAogKGRlZnVuIHZ0YWJsZS0tc29ydCAodGFi bGUpCiAgIChwY2FzZS1kb2xpc3QgKGAoLGluZGV4IC4gLGRpcmVjdGlvbikgKHZ0YWJsZS1zb3J0 LWJ5IHRhYmxlKSkKLSAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAg ICAgICAgIChudW1lcmljYWwgKHZ0YWJsZS1jb2x1bW4tLW51bWVyaWNhbAotICAgICAgICAgICAg ICAgICAgICAgIChlbHQgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSBpbmRleCkpKQorICAgIChsZXQq ICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgKGNvbHVt biAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgaW5kZXgpKQorICAgICAgICAgICAobnVtZXJp Y2FsICh2dGFibGUtY29sdW1uLS1udW1lcmljYWwgY29sdW1uKSkKICAgICAgICAgICAgKG51bWNv bXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAj Jz4gIyc8KSkKICAgICAgICAgICAgKHN0cmluZ2NvbXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2Nl bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMnc3RyaW5nPiAjJ3N0cmluZzwpKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICMnc3RyaW5nPiAjJ3N0cmluZzwpKQorICAgICAgICAg ICAoY29tcGFyYXRvciAodnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yIGNvbHVtbikpCisgICAgICAg ICAgIChjb21wYXJhdG9yLWZ1bmMgKHdoZW4gY29tcGFyYXRvcgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGxhbWJkYSAodjEgdjIpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoZnVuY2FsbCBjb21wYXJhdG9yIHYyIHYxKSkKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcikpKSkKICAgICAgIChzZXRjYXIgY2FjaGUKLSAg ICAgICAgICAgICAgKHNvcnQgKGNhciBjYWNoZSkKKyAgICAgICAgICAgICAgKHNvcnQgKHZ0YWJs ZS0tY2FjaGUtbGluZXMgY2FjaGUpCiAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGUxIGUy KQogICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChjMSAoZWx0IGUxICgxKyBpbmRleCkpKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiAoZWx0IGUyICgxKyBpbmRleCkpKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgIChpZiBjb21wYXJhdG9yLWZ1bmMKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoZnVuY2FsbCBjb21wYXJhdG9yLWZ1bmMgKGNhciBjMSkgKGNhciBjMikp CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBudW1lcmljYWwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChmdW5jYWxsIG51bWNvbXAgKGNhciBjMSkgKGNhciBjMikpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwKQEAgLTY4OCw3ICs3NDgsNyBAQCB2dGFi bGUtLXNvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNh ciBjMSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHN0cmluZ3AgKGNhciBj MikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGMyKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMikpKSkpKSkpKSkpKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiVzIiAoY2FyIGMyKSkpKSkpKSkp KSkpKQogCiAoZGVmdW4gdnRhYmxlLS1pbmRpY2F0b3IgKHRhYmxlIGluZGV4KQogICAobGV0ICgo b3JkZXIgKGNhciAobGFzdCAodnRhYmxlLXNvcnQtYnkgdGFibGUpKSkpKQpAQCAtODYwLDcgKzky MCw4IEBAIHZ0YWJsZS0tY29tcHV0ZS13aWR0aAogICAgICgvICgqIChzdHJpbmctdG8tbnVtYmVy IChtYXRjaC1zdHJpbmcgMSBzcGVjKSkgKHdpbmRvdy13aWR0aCBuaWwgdCkpCiAgICAgICAgMTAw KSkKICAgICh0Ci0gICAgKGVycm9yICJJbnZhbGlkIHNwZWM6ICVzIiBzcGVjKSkpKQorICAgIChl cnJvciAiSW52YWxpZCBzcGVjOiAlcyAodnRhYmxlIGAlcycpIgorICAgICAgICAgICBzcGVjICh2 dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1biB2dGFibGUtLWNvbXB1dGUtd2lkdGhzICh0 YWJsZSBjYWNoZSkKICAgIkNvbXB1dGUgdGhlIGRpc3BsYXkgd2lkdGhzIGZvciBUQUJMRS4KQEAg LTk3Miw3ICsxMDMzLDEzIEBAIHZ0YWJsZS1yZXZlcnQKICAgICAgICh2dGFibGUtZ290by1jb2x1 bW4gY29sdW1uKSkpKQogCiAoZGVmdW4gdnRhYmxlLS13aWR0aHMgKHRhYmxlKQotICAobnRoIDEg KHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkpCisgICh2dGFibGUtLWNhY2hlLXdpZHRocyAo dnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKSkKKworKGRlZnVuIHZ0YWJsZS0tY2FjaGUtd2lk dGhzIChjYWNoZSkKKyAgKG50aCAxIGNhY2hlKSkKKworKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGlu ZXMgKGNhY2hlKQorICAoY2FyIGNhY2hlKSkKIAogOzs7IENvbW1hbmRzLgogCmRpZmYgLS1naXQg YS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwgYi90ZXN0L2xpc3AvZW1hY3Mt bGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXggNzRmYjhjYzgxMzkuLjZlM2MwOWUxNGRlIDEwMDY0 NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKKysrIGIvdGVzdC9s aXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCkBAIC0yNyw3ICsyNyw3IEBACiAocmVxdWly ZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNv bXB1dGUtY29sdW1ucyAoKQorKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWNvbXB1dGUtY29sdW1u cyAoKQogICAoc2hvdWxkCiAgICAoZXF1YWwgKG1hcGNhcgogICAgICAgICAgICAobGFtYmRhIChj b2x1bW4pCkBAIC02OSw0ICs2OSwxMDggQEAgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdAogICAg ICAgICAgICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpCiAgICAg ICAgICAgKG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFi bGUtdXBkYXRlLW9iamVjdCAoKQorICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAi KnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNl LWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEgKGNvbnMgIlhYWCIgMSkpCisgICAgICAgICAg IChvYmplY3QyIChjb25zICJZWVkiIDIpKQorICAgICAgICAgICAodGFibGUKKyAgICAgICAgICAg IChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAgICAg ICAgICAgOm9iamVjdC1lcXVhbCAjJ2VxIDsgSWRlbnRpdHkuCisgICAgICAgICAgICAgOmNvbHVt bnMgJygoOm5hbWUgIlhYWCIpKQorICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVjdDEg b2JqZWN0MikpKSkKKyAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJsZS11cGRhdGUtb2JqZWN0IHRh YmxlICJaWloiKSkKKyAgICAgIChzZXRjZHIgb2JqZWN0MSAzKQorICAgICAgKHZ0YWJsZS11cGRh dGUtb2JqZWN0IHRhYmxlIG9iamVjdDEpCisgICAgICAoc2hvdWxkIChlcSAzIChjZHIgKGFzc29j ICJYWFgiICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0 LXZ0YWJsZS1yZW1vdmUtb2JqZWN0ICgpCisgIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3Jl YXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3AtdG8tYnVmZmVyIGJ1ZmZlcikKKyAgICAo ZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0MSAoY29ucyAiWFhYIiAxKSkKKyAgICAg ICAgICAgKG9iamVjdDIgKGNvbnMgIllZWSIgMikpCisgICAgICAgICAgICh0YWJsZQorICAgICAg ICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAgICAgICAgOnVzZS1oZWFkZXItbGluZSBuaWwKKyAg ICAgICAgICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4KKyAgICAgICAgICAgICA6 Y29sdW1ucyAnKCg6bmFtZSAiWFhYIikpCisgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2Jq ZWN0MSBvYmplY3QyKSkpKQorICAgICAgKHNob3VsZC1lcnJvciAodnRhYmxlLXJlbW92ZS1vYmpl Y3QgdGFibGUgIlpaWiIpKQorICAgICAgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0IHRhYmxlIG9iamVj dDEpCisgICAgICAoc2hvdWxkIChlcSAxIChsZW5ndGggKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkp KSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtb2JqZWN0LWVxdWFsICgpCisgIChsZXQg KChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3At dG8tYnVmZmVyIGJ1ZmZlcikKKyAgICAoZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0 MSAiWFhYIikKKyAgICAgICAgICAgKG9iamVjdDIgIlhYWCIpCisgICAgICAgICAgICh0YWJsZS1l cQorICAgICAgICAgICAgKHByb2duCisgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1h eCkpCisgICAgICAgICAgICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgICAgOnVzZS1oZWFk ZXItbGluZSBuaWwKKyAgICAgICAgICAgICAgIDpjb2x1bW5zICcoKDpuYW1lICJ0YWJsZS1lcSIg OndpZHRoIDIwKSkKKyAgICAgICAgICAgICAgIDpvYmplY3QtZXF1YWwgIydlcSA7IElkZW50aXR5 LgorICAgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2JqZWN0MSBvYmplY3QyKSkpKQorICAg ICAgICAgICAodGFibGUtZXF1YWwKKyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAo Z290by1jaGFyIChwb2ludC1tYXgpKQorICAgICAgICAgICAgICAobWFrZS12dGFibGUKKyAgICAg ICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAgICAgICAgICAgICA6Y29sdW1ucyAn KCg6bmFtZSAidGFibGUtZXF1YWwiIDp3aWR0aCAyMCkpCisgICAgICAgICAgICAgICA6b2JqZWN0 LWVxdWFsICMnZXF1YWwgOyBWYWx1ZS4KKyAgICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9i amVjdDEgb2JqZWN0MikpKSkpCisgICAgICAoc2hvdWxkCisgICAgICAgKHByb2duCisgICAgICAg ICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXEpCisgICAgICAgICAodnRhYmxlLWdvdG8tb2Jq ZWN0IG9iamVjdDIpCisgICAgICAgICAoZXF1YWwgb2JqZWN0MiAoZ2V0LXRleHQtcHJvcGVydHkg KHBvaW50KSAndnRhYmxlLW9iamVjdCkpKSkKKyAgICAgIChzaG91bGQtbm90CisgICAgICAgKHBy b2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXEpCisgICAgICAgICAodnRh YmxlLWdvdG8tb2JqZWN0ICJaWloiKQorICAgICAgICAgKGVxdWFsIG9iamVjdDEgKGdldC10ZXh0 LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hvdWxkCisgICAg ICAgKHByb2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXF1YWwpCisgICAg ICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdDIpCisgICAgICAgICAoZXF1YWwgb2JqZWN0 MSAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAndnRhYmxlLW9iamVjdCkpKSkKKyAgICAgIChz aG91bGQtbm90CisgICAgICAgKHByb2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFi bGUtZXF1YWwpCisgICAgICAgICAodnRhYmxlLWdvdG8tb2JqZWN0ICJaWloiKQorICAgICAgICAg KGVxdWFsIG9iamVjdDEgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3Qp KSkpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1jb2x1bW4tY29tcGFyYXRvciAoKQor ICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAg ICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAobGV0ICgo dGFibGUKKyAgICAgICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAgICAgICA6dXNlLWhlYWRlci1s aW5lIHQKKyAgICAgICAgICAgIDpnZXR0ZXIgKGxhbWJkYSAob2JqZWN0IF9pbmRleCBfdGFibGUp IG9iamVjdCkKKyAgICAgICAgICAgIDpjb2x1bW5zICcoKCA6bmFtZSAiRGF0ZSIKKyAgICAgICAg ICAgICAgICAgICAgICAgICA6cHJpbWFyeSBhc2NlbmQKKyAgICAgICAgICAgICAgICAgICAgICAg ICA6d2lkdGggNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9ybWF0dGVyIChsYW1iZGEg KG9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHRp bWUgKGRhdGUtdG8tdGltZSBvYmplY3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoZm9ybWF0ICIlcyAoJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdC10aW1lLXN0cmluZyAiJUEsICVCICVkICVZIiB0 aW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNh ciB0aW1lKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21wYXJhdG9yIChsYW1iZGEg KG9iamVjdDEgb2JqZWN0MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChsZXQgKCh0aW1lMSAoZGF0ZS10by10aW1lIG9iamVjdDEpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUyIChkYXRlLXRvLXRpbWUgb2JqZWN0Mikp KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPCAoY2FyIHRpbWUx KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIHRpbWUy KSkpKSkpCisgICAgICAgICAgICA6b2JqZWN0cyAnKCJGcmksIDExIEp1bCAyMDI1IgorICAgICAg ICAgICAgICAgICAgICAgICAiVGh1LCAxMCBKdWwgMjAyNSIpKSkpCisgICAgICAoc2hvdWxkCisg ICAgICAgKHN0cmluZz0KKyAgICAgICAgIlRodXJzZGF5IgorICAgICAgICAodGhpbmctYXQtcG9p bnQgJ3dvcmQpKSkpKSkKKwogOzs7IHZ0YWJsZS10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIuNDcu MQoK --000000000000414fa80639e87937-- From unknown Tue Jul 15 05:17:18 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79009: [PATCH] Improve 'vtable' object handling, cache handling, messages, [PATCH] Improve 'vtable' object handling, cache handling, messages Resent-From: Spencer Baugh Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Jul 2025 19:55:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79009 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Marks Cc: Kristoffer Balintona , Joost Kremers , 79009@debbugs.gnu.org, Visuwesh , Adam Porter , Lars Ingebrigtsen , Augusto Stoffel , ijqq@protonmail.com Received: via spool by 79009-submit@debbugs.gnu.org id=B79009.175252289417509 (code B ref 79009); Mon, 14 Jul 2025 19:55:01 +0000 Received: (at 79009) by debbugs.gnu.org; 14 Jul 2025 19:54:54 +0000 Received: from localhost ([127.0.0.1]:36677 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ubPGG-0004YF-4l for submit@debbugs.gnu.org; Mon, 14 Jul 2025 15:54:53 -0400 Received: from mxout5.mail.janestreet.com ([64.215.233.18]:56409) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ubPGC-0004XU-HU for 79009@debbugs.gnu.org; Mon, 14 Jul 2025 15:54:49 -0400 From: Spencer Baugh In-Reply-To: ("=?UTF-8?Q?St=C3=A9phane?= Marks"'s message of "Mon, 14 Jul 2025 15:14:37 -0400") References: Date: Mon, 14 Jul 2025 15:54:42 -0400 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com; s=waixah; t=1752522882; bh=8FdRzguCVljxFV3OHyHbyNoNMun8aMQ8p4fh2FiGi80=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=oTPcIWecs4IXqWSS/8X9uFjQkcNk8MbA6gy2ECSMi2iL2kJE7rsRu7u4ngEq50zTP oPbqon7lC+la+9sBSopqubQQUwS01AeRdV6HoEGXF6jcrym1TldElbsNvnjaJiPFPt eKaazAjK6fd56thc6bzuEK2CDTdSFL5LQZhCrPF+ytLhBXqSBds/FruONzAJFw0P3e vFpqjaEiUhOxrNB+i+lKVq5pG/qfJ+rU0axrV7N6DNWoJaY25nH6ElnpCL54cbt2GH v8ZIpelX2gpUdngQ6d0jjnYeOIyVboUvET17a2so/w80IrhosMYb+w8xIfDcP9c+gI wHQsL9QdWWUfg== X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) St=C3=A9phane Marks writes: > On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks wrote: > I've updated the broader vtable update in the referenced 78843 bug to che= ck out if interested. > > I've removed support for the duplicate-object feature. After careful con= sideration, it was half baked and I think better for vtable > programmers to handle their own objects. I will be sure the documentatio= n stresses to avoid duplicate objects as vtable's design is > predicated on unique objects (or race conditions ensue among duplicate ob= ject references). Thank you, this was going to be my first bit of feedback. Folowup question: What is the motivation for adding customizable object equality? Could the need for that be avoided by some changes specific to vtable-update-object? > Attaching the updated patch which is also formatted to avoid mere whitesp= ace changes. Thanks for this too. > From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 Mon Sep 17 00:00:00 2001 > From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D > Date: Sun, 13 Jul 2025 13:32:28 -0400 > Subject: [PATCH] Improve 'vtable' object handling, cache handling, messag= es > > Add object equality function override (defaults to existing 'eq' > behavior). Add column comparator to address object > sorting (defaults to existing behavior). Correct cache > references to prime the cache as needed. Add cache accessor > functions. Add table name slot to improve errors and > messages (defaults to "*vtable*"). > > Added tests. > > * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator > slot. > (vtable): Add name, object-equal slots. > (make-vtable): Initialize new slots. > (vtable-goto-object): Use object-equal. > (vtable-update-object): Use object-equal, use cache accessor, > improve messages. > (vtable-remove-object): Use object-equal, prime cache, use cache > functions, improve messages. > (vtable-insert-object): Use object-equal, use cache accessor, > improve messages. > (vtable-insert): Prime cache, use cache accessor. > (vtable--sort): Use column comparator, prime cache, use cache > accessor. > (vtable--compute-width): Improve message. > (vtable--widths): Use cache accessor. > > * test/lisp/emacs-lisp/vtable-tests.el > (test-vstable-compute-columns): Renamed to > test-vtable-compute-columns. > (test-vtable-insert-object): Changed buffer name to non-hidden. > (test-vtable-update-object, test-vtable-remove-object) > (test-vtable-object-equal, test-vtable-column-comparator): New > test. > --- > lisp/emacs-lisp/vtable.el | 143 ++++++++++++++++++++------- > test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++- > 2 files changed, 210 insertions(+), 39 deletions(-) > > diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el > index 00785113edb..31ef73d5eb4 100644 > --- a/lisp/emacs-lisp/vtable.el > +++ b/lisp/emacs-lisp/vtable.el > @@ -45,14 +45,18 @@ vtable-column > getter > formatter > displayer > + comparator > -numerical > -aligned) >=20=20 > (defclass vtable () > - ((columns :initarg :columns :accessor vtable-columns) > + ((name :initarg :name :accessor vtable-name) > + (columns :initarg :columns :accessor vtable-columns) > (objects :initarg :objects :accessor vtable-objects) > (objects-function :initarg :objects-function > :accessor vtable-objects-function) > + (object-equal :initarg :object-equal > + :accessor vtable-object-equal) (I feel like there's probably a better name for this but I don't know what it would be) > (getter :initarg :getter :accessor vtable-getter) > (formatter :initarg :formatter :accessor vtable-formatter) > (displayer :initarg :displayer :accessor vtable-displayer) > @@ -86,7 +90,12 @@ vtable-header-line-map > "" 'mouse-face > "" #'vtable-header-line-sort) >=20=20 > -(cl-defun make-vtable (&key columns objects objects-function > +(cl-defun make-vtable (&key > + (name "*vtable*") > + columns > + objects > + objects-function > + (object-equal #'eq) > getter > formatter > displayer No need to reformat this. > @@ -113,8 +122,10 @@ make-vtable > (let ((table > (make-instance > 'vtable > + :name name > :objects objects > :objects-function objects-function > + :object-equal object-equal > :getter getter > :formatter formatter > :displayer displayer > @@ -132,7 +143,8 @@ make-vtable > ;; Auto-generate the columns. > (unless columns > (unless objects > - (error "Can't auto-generate columns; no objects")) > + (error "Can't auto-generate columns; no objects (vtable `%s')" > + (vtable-name table))) > (setq columns (make-list (length (car objects)) ""))) > (setf (vtable-columns table) > (mapcar (lambda (column) > @@ -251,14 +263,15 @@ vtable-goto-object > Return the position of the object if found, and nil if not." > (let ((start (point))) > (vtable-beginning-of-table) > + (let ((predicate (vtable-object-equal (vtable-current-table)))) > (save-restriction > (narrow-to-region (point) (save-excursion (vtable-end-of-table))) > - (if (text-property-search-forward 'vtable-object object #'eq) > + (if (text-property-search-forward 'vtable-object object predicat= e) > (progn > (forward-line -1) > (point)) > (goto-char start) > - nil)))) > + nil))))) >=20=20 > (defun vtable-goto-table (table) > "Go to TABLE in the current buffer. > @@ -291,25 +304,32 @@ vtable-update-object > (let* ((objects (vtable-objects table)) > (inhibit-read-only t)) > ;; First replace the object in the object storage. > - (if (eq old-object (car objects)) > + (if (funcall (vtable-object-equal table) old-object (car objects)) > ;; It's at the head, so replace it there. > (setf (vtable-objects table) > (cons object (cdr objects))) > ;; Otherwise splice into the list. > (while (and (cdr objects) > - (not (eq (cadr objects) old-object))) > + (not (funcall (vtable-object-equal table) > + (cadr objects) old-object))) > (setq objects (cdr objects))) > - (unless objects > - (error "Can't find the old object")) > + (unless (and objects > + (funcall (vtable-object-equal table) > + (cadr objects) old-object)) > + (error "Can't find the old object (vtable `%s')" > + (vtable-name table))) > (setcar (cdr objects) object)) > ;; Then update the cache... > ;; FIXME: If the table's buffer has no visible window, or if its > ;; width has changed since the table was updated, the cache key will > ;; not match and the object can't be updated. (Bug #69837). > - (if-let* ((line-number (seq-position (car (vtable--cache table)) old= -object > - (lambda (a b) > - (equal (car a) b)))) > - (line (elt (car (vtable--cache table)) line-number))) > + (if-let* ((cache (vtable--ensure-cache table)) > + (line-number (seq-position > + (vtable--cache-lines cache) > + (assoc old-object > + (vtable--cache-lines cache) > + (vtable-object-equal table)))) > + (line (elt (vtable--cache-lines cache) line-number))) I think you should either remove the vtable--cache function entirely or make vtable--cache do what vtable--ensure-cache does. Better yet: adopt what I did in bug#69837, which mostly removes the code which looks up the cache based on the current window and frame attributes. Such code is not correct anyway, since when modifying part of a vtable that already exists, one should use the widths which are already in place for that vtable, as I mentioned in my patch there. > (progn > (setcar line object) > (setcdr line (vtable--compute-cached-line table object)) > @@ -320,28 +340,46 @@ vtable-update-object > (start (point))) > (delete-line) > (vtable--insert-line table line line-number > - (nth 1 (vtable--cache table)) > + (vtable--cache-widths cache) > (vtable--spacer table)) > (add-text-properties start (point) (list 'keymap keymap > 'vtable table)))) > ;; We may have inserted a non-numerical value into a previously > ;; all-numerical table, so recompute. > (vtable--recompute-numerical table (cdr line))) > - (error "Can't find cached object in vtable")))) > + (error "Can't find cached object (vtable `%s')" > + (vtable-name table))))) >=20=20 > (defun vtable-remove-object (table object) > "Remove OBJECT from TABLE. > This will also remove the displayed line." > + (let ((cache (vtable--ensure-cache table)) > + (inhibit-read-only t)) > + (unless (seq-contains-p (vtable-objects table) > + object > + (vtable-object-equal table)) > + (error "Can't find the object to remove (vtable `%s')" > + (vtable-name table))) > ;; First remove from the objects. > - (setf (vtable-objects table) (delq object (vtable-objects table))) > + (setf (vtable-objects table) (seq-remove > + (lambda (elt) > + (funcall (vtable-object-equal table) > + elt object)) > + (vtable-objects table))) > ;; Then adjust the cache and display. > - (let ((cache (vtable--cache table)) > - (inhibit-read-only t)) > - (setcar cache (delq (assq object (car cache)) (car cache))) > + (if-let* ((old-line (assoc object > + (vtable--cache-lines cache) > + (vtable-object-equal table)))) > + (progn > + (setcar cache (delq old-line (vtable--cache-lines cache))) > (save-excursion > (vtable-goto-table table) > (when (vtable-goto-object object) > - (delete-line))))) > + (delete-line)))) > + ;; At this point, the object was removed from objects, but not > + ;; the cache, which will stale. > + (error "Can't find cached object (vtable `%s')" > + (vtable-name table))))) So then why not look the object up in both the cache and objects first, before modifying either? Also, it seems like maybe vtable-remove-object should not actually be using the customizable object equality anyway? >=20=20 > ;; FIXME: The fact that the `location' argument of > ;; `vtable-insert-object' can be an integer and is then interpreted as > @@ -378,7 +416,16 @@ vtable-insert-object > (nthcdr location (vtable-objects table)) > ;; Do not prepend if index is too large: > (setq before nil)) > - (or (memq location (vtable-objects table)) > + (or > + (let ((loc (vtable-objects table))) > + (while (and (cdr loc) > + (not (funcall (vtable-object-equal t= able) > + (car loc) location))) > + (setq loc (cdr loc))) > + (if (funcall (vtable-object-equal table) > + (car loc) location) > + loc > + nil)) I think you probably should introduce a function which searches (vtable-objects table) for an existing object using the equality function, and use that everywhere; it would make the changes like this much simpler. > ;; Prepend if `location' is not found and > ;; `before' is non-nil: > (and before (vtable-objects table)))) > @@ -400,7 +447,7 @@ vtable-insert-object > ;; Then adjust the cache and display. > (save-excursion > (vtable-goto-table table) > - (let* ((cache (vtable--cache table)) > + (let* ((cache (vtable--ensure-cache table)) > (inhibit-read-only t) > (keymap (get-text-property (point) 'keymap)) > (ellipsis (if (vtable-ellipsis table) > @@ -410,11 +457,14 @@ vtable-insert-object > (ellipsis-width (string-pixel-width ellipsis)) > (elem (if location ; This binding mirrors the binding of `= pos' above. > (if (integerp location) > - (nth location (car cache)) > - (or (assq location (car cache)) > + (nth location (vtable--cache-lines cache)) > + (or (assoc > + location > + (vtable--cache-lines cache) > + (vtable-object-equal table)) > (and before (caar cache)))) > (if before (caar cache)))) > - (pos (memq elem (car cache))) > + (pos (memq elem (vtable--cache-lines cache))) > (line (cons object (vtable--compute-cached-line table objec= t)))) > (if (or before > (and pos (integerp location))) > @@ -433,13 +483,14 @@ vtable-insert-object > (forward-line 1) ; Insert *after*. > (vtable-end-of-table))) > ;; Otherwise, append the object. > - (setcar cache (nconc (car cache) (list line))) > + (setcar cache (nconc (vtable--cache-lines cache) (list line)= )) > (vtable-end-of-table))) > (let ((start (point))) > ;; FIXME: We have to adjust colors in lines below this if we > ;; have :row-colors. > (vtable--insert-line table line 0 > - (nth 1 cache) (vtable--spacer table) > + (vtable--cache-widths cache) > + (vtable--spacer table) > ellipsis ellipsis-width) > (add-text-properties start (point) (list 'keymap keymap > 'vtable table))) > @@ -523,7 +574,8 @@ vtable--ensure-cache > (vtable--recompute-cache table))) >=20=20 > (defun vtable-insert (table) > - (let* ((spacer (vtable--spacer table)) > + (let* ((cache (vtable--ensure-cache table)) > + (spacer (vtable--spacer table)) > (start (point)) > (ellipsis (if (vtable-ellipsis table) > (propertize (truncate-string-ellipsis) > @@ -533,7 +585,7 @@ vtable-insert > ;; We maintain a cache per screen/window width, so that we rend= er > ;; correctly if Emacs is open on two different screens (or the > ;; user resizes the frame). > - (widths (nth 1 (vtable--ensure-cache table)))) > + (widths (vtable--cache-widths cache))) > ;; Don't insert any header or header line if the user hasn't > ;; specified the columns. > (when (slot-value table '-has-column-spec) > @@ -551,7 +603,7 @@ vtable-insert > (vtable--sort table) > ;; Insert the data. > (let ((line-number 0)) > - (dolist (line (car (vtable--cache table))) > + (dolist (line (vtable--cache-lines cache)) > (vtable--insert-line table line line-number widths spacer > ellipsis ellipsis-width) > (setq line-number (1+ line-number)))) > @@ -667,18 +719,26 @@ vtable--clear-cache >=20=20 > (defun vtable--sort (table) > (pcase-dolist (`(,index . ,direction) (vtable-sort-by table)) > - (let ((cache (vtable--cache table)) > - (numerical (vtable-column--numerical > - (elt (vtable-columns table) index))) > + (let* ((cache (vtable--ensure-cache table)) > + (column (elt (vtable-columns table) index)) > + (numerical (vtable-column--numerical column)) > (numcomp (if (eq direction 'descend) > #'> #'<)) > (stringcomp (if (eq direction 'descend) > - #'string> #'string<))) > + #'string> #'string<)) > + (comparator (vtable-column-comparator column)) > + (comparator-func (when comparator > + (if (eq direction 'descend) > + (lambda (v1 v2) > + (funcall comparator v2 v1)) > + comparator)))) > (setcar cache > - (sort (car cache) > + (sort (vtable--cache-lines cache) > (lambda (e1 e2) > (let ((c1 (elt e1 (1+ index))) > (c2 (elt e2 (1+ index)))) > + (if comparator-func > + (funcall comparator-func (car c1) (car c2)) > (if numerical > (funcall numcomp (car c1) (car c2)) > (funcall > @@ -688,7 +748,7 @@ vtable--sort > (format "%s" (car c1))) > (if (stringp (car c2)) > (car c2) > - (format "%s" (car c2)))))))))))) > + (format "%s" (car c2))))))))))))) >=20=20 > (defun vtable--indicator (table index) > (let ((order (car (last (vtable-sort-by table))))) > @@ -860,7 +920,8 @@ vtable--compute-width > (/ (* (string-to-number (match-string 1 spec)) (window-width nil t)) > 100)) > (t > - (error "Invalid spec: %s" spec)))) > + (error "Invalid spec: %s (vtable `%s')" > + spec (vtable-name table))))) >=20=20 > (defun vtable--compute-widths (table cache) > "Compute the display widths for TABLE. > @@ -972,7 +1033,13 @@ vtable-revert > (vtable-goto-column column)))) >=20=20 > (defun vtable--widths (table) > - (nth 1 (vtable--ensure-cache table))) > + (vtable--cache-widths (vtable--ensure-cache table))) > + > +(defun vtable--cache-widths (cache) > + (nth 1 cache)) > + > +(defun vtable--cache-lines (cache) > + (car cache)) > ;;; Commands. >=20=20 > diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-lisp/= vtable-tests.el > index 74fb8cc8139..6e3c09e14de 100644 > --- a/test/lisp/emacs-lisp/vtable-tests.el > +++ b/test/lisp/emacs-lisp/vtable-tests.el > @@ -27,7 +27,7 @@ > (require 'ert) > (require 'ert-x) >=20=20 > -(ert-deftest test-vstable-compute-columns () > +(ert-deftest test-vtable-compute-columns () > (should > (equal (mapcar > (lambda (column) > @@ -69,4 +69,108 @@ test-vtable-insert-object > (mapcar #'cadr (vtable-objects table)))) > (number-sequence 0 11)))) >=20=20 > +(ert-deftest test-vtable-update-object () > + (let ((buffer (get-buffer-create "*vtable-test*"))) > + (pop-to-buffer buffer) > + (erase-buffer) > + (let* ((object1 (cons "XXX" 1)) > + (object2 (cons "YYY" 2)) > + (table > + (make-vtable > + :use-header-line nil > + :object-equal #'eq ; Identity. > + :columns '((:name "XXX")) > + :objects (list object1 object2)))) > + (should-error (vtable-update-object table "ZZZ")) > + (setcdr object1 3) > + (vtable-update-object table object1) > + (should (eq 3 (cdr (assoc "XXX" (vtable-objects table)))))))) > + > +(ert-deftest test-vtable-remove-object () > + (let ((buffer (get-buffer-create "*vtable-test*"))) > + (pop-to-buffer buffer) > + (erase-buffer) > + (let* ((object1 (cons "XXX" 1)) > + (object2 (cons "YYY" 2)) > + (table > + (make-vtable > + :use-header-line nil > + :object-equal #'eq ; Identity. > + :columns '((:name "XXX")) > + :objects (list object1 object2)))) > + (should-error (vtable-remove-object table "ZZZ")) > + (vtable-remove-object table object1) > + (should (eq 1 (length (vtable-objects table))))))) > + > +(ert-deftest test-vtable-object-equal () > + (let ((buffer (get-buffer-create "*vtable-test*"))) > + (pop-to-buffer buffer) > + (erase-buffer) > + (let* ((object1 "XXX") > + (object2 "XXX") > + (table-eq > + (progn > + (goto-char (point-max)) > + (make-vtable > + :use-header-line nil > + :columns '((:name "table-eq" :width 20)) > + :object-equal #'eq ; Identity. > + :objects (list object1 object2)))) > + (table-equal > + (progn > + (goto-char (point-max)) > + (make-vtable > + :use-header-line nil > + :columns '((:name "table-equal" :width 20)) > + :object-equal #'equal ; Value. > + :objects (list object1 object2))))) > + (should > + (progn > + (vtable-goto-table table-eq) > + (vtable-goto-object object2) > + (equal object2 (get-text-property (point) 'vtable-object)))) > + (should-not > + (progn > + (vtable-goto-table table-eq) > + (vtable-goto-object "ZZZ") > + (equal object1 (get-text-property (point) 'vtable-object)))) > + (should > + (progn > + (vtable-goto-table table-equal) > + (vtable-goto-object object2) > + (equal object1 (get-text-property (point) 'vtable-object)))) > + (should-not > + (progn > + (vtable-goto-table table-equal) > + (vtable-goto-object "ZZZ") > + (equal object1 (get-text-property (point) 'vtable-object))))))) > + > +(ert-deftest test-vtable-column-comparator () > + (let ((buffer (get-buffer-create "*vtable-test*"))) > + (pop-to-buffer buffer) > + (erase-buffer) > + (let ((table > + (make-vtable > + :use-header-line t > + :getter (lambda (object _index _table) object) > + :columns '(( :name "Date" > + :primary ascend > + :width 40 > + :formatter (lambda (object) > + (let ((time (date-to-time object))) > + (format "%s (%d)" > + (format-time-string "%A,= %B %d %Y" time) > + (car time)))) > + :comparator (lambda (object1 object2) > + (let ((time1 (date-to-time object= 1)) > + (time2 (date-to-time object= 2))) > + (< (car time1) > + (car time2)))))) > + :objects '("Fri, 11 Jul 2025" > + "Thu, 10 Jul 2025")))) > + (should > + (string=3D > + "Thursday" > + (thing-at-point 'word)))))) > + > ;;; vtable-tests.el ends here Thank you very much for adding tests. Overall this patch looks good, I am in favor of this landing soon (after feedback is addressed of course). (One other thing: Could you try to tell your mail client to attach the patch in "inline" mode? This makes the patch somewhat easier to review in debbugs. (This may be easiest if you use Gnus to send the patch, perhaps using debbugs-gnu-post-patch)) From unknown Tue Jul 15 05:17:18 2025 X-Loop: help-debbugs@gnu.org Subject: bug#79009: [PATCH] Improve 'vtable' object handling, cache handling, messages, [PATCH] Improve 'vtable' object handling, cache handling, messages Resent-From: =?UTF-8?Q?St=C3=A9phane?= Marks Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 15 Jul 2025 11:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 79009 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Spencer Baugh Cc: Kristoffer Balintona , Joost Kremers , 79009@debbugs.gnu.org, Visuwesh , Adam Porter , Lars Ingebrigtsen , Augusto Stoffel , ijqq@protonmail.com Received: via spool by 79009-submit@debbugs.gnu.org id=B79009.175257815716788 (code B ref 79009); Tue, 15 Jul 2025 11:16:02 +0000 Received: (at 79009) by debbugs.gnu.org; 15 Jul 2025 11:15:57 +0000 Received: from localhost ([127.0.0.1]:40597 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ubddZ-0004MW-SJ for submit@debbugs.gnu.org; Tue, 15 Jul 2025 07:15:57 -0400 Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b]:55786) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1ubddV-0004M6-Bt for 79009@debbugs.gnu.org; Tue, 15 Jul 2025 07:15:52 -0400 Received: by mail-vk1-xa2b.google.com with SMTP id 71dfb90a1353d-52b2290e292so2370151e0c.3 for <79009@debbugs.gnu.org>; Tue, 15 Jul 2025 04:15:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752578143; x=1753182943; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=9hFcK3wA12GD6C3avIdhGZ4b/vwe+5P/o0/1dCL14wk=; b=AkWV6oWk/A+7jizPezbPXN2ekbzTvgN3Y/xlwA8NbL2nbmvInvIqpFMAjAghfI+2H0 d/Z2YTbQTFCY7XC6DlUrfooFpYQPSQA/BBOEdzKnwMqzsVc5hp91g1illSR9Hq475cpQ SHFh25nTDzTJc3DoXJeMbWQ5Ynhi6oqdC5adfp7m3FTiIl+hvbQRSFOqTVdAPfM2Wlrj h+ASNUMpL8uogq334GePVF7tzAHeSX9MTvlqgmTFOks8oumQ/cHYqvLSX+tGYITufQ7L X5pkn74XTzvVgRg8UDiU119fFhCHBXKiGapWgsHCpHTWyrjvptXpgutp7mm2mV5cyPnN aaGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752578143; x=1753182943; 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=9hFcK3wA12GD6C3avIdhGZ4b/vwe+5P/o0/1dCL14wk=; b=e2m6th2Gf5bgaSY3M/d46voc4NZoSXlfka54g85lreJCGwmdnYoQL7L1vyYkCXxQ07 Q/xsOOqiSzyvD5MFYaaqaRltRo+M+xnRH+k1eoa/+TBQPp74qQSwr2UUrVuXNdf2OqzM t2kJSTQSbm1hiFKj0I9vUrikrOJms+AfoA87p6yBa378sZTIlotCJgXpL9cq7GZPBJuE HlkZDrBP5wv5wOguVyICgkpmzmgUltucm5/58/w8pGlQLyf5om4q6ZLCx2wNIS+AV8hP QmVDH9BDcxgjOSeIBBfhRv9STPTxEULfxPBdhO37ND828nIkhKBWfNsQBiSgZN17YDYK J5/g== X-Gm-Message-State: AOJu0YwMlPdUmphr580TpL0i9g7p/AM/KANbItJIm3tbzPk6fEpIGOib DfFzdx4XCoSp6JDAV+AmtKjLX93q36b4Tc5LxTa5P8F49YBbpGkZI8VO2DY/FUcKvEgDGUdj+NA 6gMEyh1H2apa3fUBXi3PAe8nvAr3PKqY= X-Gm-Gg: ASbGnctlqZD0U/YFzh6pQx84q78CrGzhfm5JRfirUFWvYWtBrh856lyNl5MELcXgggd gxL3GCE31EWy9oXN9Z+pOs+IdPfEvQeDw7rpp44ZqnhlHMWBLdJdqQnh5U91QYdZV2HxOBDy2z+ tF1zuUpm/51BYYS+8ltR+KCquKbaUdg+1Zn8ywvXz1kCceXyp2Ct2VWO2xgywr5VZEYMrONSbI5 mexTXdyxw== X-Google-Smtp-Source: AGHT+IFls0VOfsGm9g3BZ0qfUZsrOOLYkUmxfXDl+HmpNMRS6/46ZbIX3P5lWDKqiPwgpAACGB8EV3YGc2LNgmluEgM= X-Received: by 2002:a05:6122:90b:b0:534:69b3:a200 with SMTP id 71dfb90a1353d-535f45580bcmr7983330e0c.0.1752578143317; Tue, 15 Jul 2025 04:15:43 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: =?UTF-8?Q?St=C3=A9phane?= Marks Date: Tue, 15 Jul 2025 07:15:32 -0400 X-Gm-Features: Ac12FXxt-_4BFjO41WXGcvxq48Zn5Dw8kwcO7cx6xRMdxZYWZSI896C_a45pXBs Message-ID: Content-Type: multipart/alternative; boundary="000000000000ac73390639f5e534" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --000000000000ac73390639f5e534 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jul 14, 2025 at 3:54=E2=80=AFPM Spencer Baugh wrote: > St=C3=A9phane Marks writes: > > On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks > wrote: > > I've updated the broader vtable update in the referenced 78843 bug to > check out if interested. > > > > I've removed support for the duplicate-object feature. After careful > consideration, it was half baked and I think better for vtable > > programmers to handle their own objects. I will be sure the > documentation stresses to avoid duplicate objects as vtable's design is > > predicated on unique objects (or race conditions ensue among duplicate > object references). > > Thank you, this was going to be my first bit of feedback. > > Folowup question: What is the motivation for adding customizable object > equality? Could the need for that be avoided by some changes specific > to vtable-update-object? > It's really a policy question and future proofing. I believe Lars originated this idea and probably has use cases for this in his vtable code= . > > Attaching the updated patch which is also formatted to avoid mere > whitespace changes. > > Thanks for this too. > > > From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 Mon Sep 17 00:00:00 2001 > > From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D > > Date: Sun, 13 Jul 2025 13:32:28 -0400 > > Subject: [PATCH] Improve 'vtable' object handling, cache handling, > messages > > > > Add object equality function override (defaults to existing 'eq' > > behavior). Add column comparator to address object > > sorting (defaults to existing behavior). Correct cache > > references to prime the cache as needed. Add cache accessor > > functions. Add table name slot to improve errors and > > messages (defaults to "*vtable*"). > > > > Added tests. > > > > * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator > > slot. > > (vtable): Add name, object-equal slots. > > (make-vtable): Initialize new slots. > > (vtable-goto-object): Use object-equal. > > (vtable-update-object): Use object-equal, use cache accessor, > > improve messages. > > (vtable-remove-object): Use object-equal, prime cache, use cache > > functions, improve messages. > > (vtable-insert-object): Use object-equal, use cache accessor, > > improve messages. > > (vtable-insert): Prime cache, use cache accessor. > > (vtable--sort): Use column comparator, prime cache, use cache > > accessor. > > (vtable--compute-width): Improve message. > > (vtable--widths): Use cache accessor. > > > > * test/lisp/emacs-lisp/vtable-tests.el > > (test-vstable-compute-columns): Renamed to > > test-vtable-compute-columns. > > (test-vtable-insert-object): Changed buffer name to non-hidden. > > (test-vtable-update-object, test-vtable-remove-object) > > (test-vtable-object-equal, test-vtable-column-comparator): New > > test. > > --- > > lisp/emacs-lisp/vtable.el | 143 ++++++++++++++++++++------- > > test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++- > > 2 files changed, 210 insertions(+), 39 deletions(-) > > > > diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el > > index 00785113edb..31ef73d5eb4 100644 > > --- a/lisp/emacs-lisp/vtable.el > > +++ b/lisp/emacs-lisp/vtable.el > > @@ -45,14 +45,18 @@ vtable-column > > getter > > formatter > > displayer > > + comparator > > -numerical > > -aligned) > > > > (defclass vtable () > > - ((columns :initarg :columns :accessor vtable-columns) > > + ((name :initarg :name :accessor vtable-name) > > + (columns :initarg :columns :accessor vtable-columns) > > (objects :initarg :objects :accessor vtable-objects) > > (objects-function :initarg :objects-function > > :accessor vtable-objects-function) > > + (object-equal :initarg :object-equal > > + :accessor vtable-object-equal) > > (I feel like there's probably a better name for this but I don't know > what it would be) > > > (getter :initarg :getter :accessor vtable-getter) > > (formatter :initarg :formatter :accessor vtable-formatter) > > (displayer :initarg :displayer :accessor vtable-displayer) > > @@ -86,7 +90,12 @@ vtable-header-line-map > > "" 'mouse-face > > "" #'vtable-header-line-sort) > > > > -(cl-defun make-vtable (&key columns objects objects-function > > +(cl-defun make-vtable (&key > > + (name "*vtable*") > > + columns > > + objects > > + objects-function > > + (object-equal #'eq) > > getter > > formatter > > displayer > > No need to reformat this. > Getting ready for more slots (and I kind of like the format as it's easier for me to read). > @@ -113,8 +122,10 @@ make-vtable > > (let ((table > > (make-instance > > 'vtable > > + :name name > > :objects objects > > :objects-function objects-function > > + :object-equal object-equal > > :getter getter > > :formatter formatter > > :displayer displayer > > @@ -132,7 +143,8 @@ make-vtable > > ;; Auto-generate the columns. > > (unless columns > > (unless objects > > - (error "Can't auto-generate columns; no objects")) > > + (error "Can't auto-generate columns; no objects (vtable `%s')" > > + (vtable-name table))) > > (setq columns (make-list (length (car objects)) ""))) > > (setf (vtable-columns table) > > (mapcar (lambda (column) > > @@ -251,14 +263,15 @@ vtable-goto-object > > Return the position of the object if found, and nil if not." > > (let ((start (point))) > > (vtable-beginning-of-table) > > + (let ((predicate (vtable-object-equal (vtable-current-table)))) > > (save-restriction > > (narrow-to-region (point) (save-excursion > (vtable-end-of-table))) > > - (if (text-property-search-forward 'vtable-object object #'eq) > > + (if (text-property-search-forward 'vtable-object object > predicate) > > (progn > > (forward-line -1) > > (point)) > > (goto-char start) > > - nil)))) > > + nil))))) > > > > (defun vtable-goto-table (table) > > "Go to TABLE in the current buffer. > > @@ -291,25 +304,32 @@ vtable-update-object > > (let* ((objects (vtable-objects table)) > > (inhibit-read-only t)) > > ;; First replace the object in the object storage. > > - (if (eq old-object (car objects)) > > + (if (funcall (vtable-object-equal table) old-object (car objects)) > > ;; It's at the head, so replace it there. > > (setf (vtable-objects table) > > (cons object (cdr objects))) > > ;; Otherwise splice into the list. > > (while (and (cdr objects) > > - (not (eq (cadr objects) old-object))) > > + (not (funcall (vtable-object-equal table) > > + (cadr objects) old-object))) > > (setq objects (cdr objects))) > > - (unless objects > > - (error "Can't find the old object")) > > + (unless (and objects > > + (funcall (vtable-object-equal table) > > + (cadr objects) old-object)) > > + (error "Can't find the old object (vtable `%s')" > > + (vtable-name table))) > > (setcar (cdr objects) object)) > > ;; Then update the cache... > > ;; FIXME: If the table's buffer has no visible window, or if its > > ;; width has changed since the table was updated, the cache key wi= ll > > ;; not match and the object can't be updated. (Bug #69837). > > - (if-let* ((line-number (seq-position (car (vtable--cache table)) > old-object > > - (lambda (a b) > > - (equal (car a) b)))) > > - (line (elt (car (vtable--cache table)) line-number))) > > + (if-let* ((cache (vtable--ensure-cache table)) > > + (line-number (seq-position > > + (vtable--cache-lines cache) > > + (assoc old-object > > + (vtable--cache-lines cache) > > + (vtable-object-equal table)))) > > + (line (elt (vtable--cache-lines cache) line-number))) > > I think you should either remove the vtable--cache function entirely or > make vtable--cache do what vtable--ensure-cache does. > That's sensible. Better yet: adopt what I did in bug#69837, which mostly removes the code > which looks up the cache based on the current window and frame > attributes. Such code is not correct anyway, since when modifying part > of a vtable that already exists, one should use the widths which are > already in place for that vtable, as I mentioned in my patch there. > Backward compatibility is a potential issue with that strategy. If we do that, we might as well support a single cache just for the most recently displayed vtable window. Lars clearly had a reason to implement the multi-width cache and I decided to leave it in place (and improve it as you've seen in the much larger patch) rather than break people's code. A cache patch coming after this one. > (progn > > (setcar line object) > > (setcdr line (vtable--compute-cached-line table object)) > > @@ -320,28 +340,46 @@ vtable-update-object > > (start (point))) > > (delete-line) > > (vtable--insert-line table line line-number > > - (nth 1 (vtable--cache table)) > > + (vtable--cache-widths cache) > > (vtable--spacer table)) > > (add-text-properties start (point) (list 'keymap keymap > > 'vtable table))= )) > > ;; We may have inserted a non-numerical value into a > previously > > ;; all-numerical table, so recompute. > > (vtable--recompute-numerical table (cdr line))) > > - (error "Can't find cached object in vtable")))) > > + (error "Can't find cached object (vtable `%s')" > > + (vtable-name table))))) > > > > (defun vtable-remove-object (table object) > > "Remove OBJECT from TABLE. > > This will also remove the displayed line." > > + (let ((cache (vtable--ensure-cache table)) > > + (inhibit-read-only t)) > > + (unless (seq-contains-p (vtable-objects table) > > + object > > + (vtable-object-equal table)) > > + (error "Can't find the object to remove (vtable `%s')" > > + (vtable-name table))) > > ;; First remove from the objects. > > - (setf (vtable-objects table) (delq object (vtable-objects table))) > > + (setf (vtable-objects table) (seq-remove > > + (lambda (elt) > > + (funcall (vtable-object-equal tabl= e) > > + elt object)) > > + (vtable-objects table))) > > ;; Then adjust the cache and display. > > - (let ((cache (vtable--cache table)) > > - (inhibit-read-only t)) > > - (setcar cache (delq (assq object (car cache)) (car cache))) > > + (if-let* ((old-line (assoc object > > + (vtable--cache-lines cache) > > + (vtable-object-equal table)))) > > + (progn > > + (setcar cache (delq old-line (vtable--cache-lines cache))) > > (save-excursion > > (vtable-goto-table table) > > (when (vtable-goto-object object) > > - (delete-line))))) > > + (delete-line)))) > > + ;; At this point, the object was removed from objects, but not > > + ;; the cache, which will stale. > > + (error "Can't find cached object (vtable `%s')" > > + (vtable-name table))))) > > So then why not look the object up in both the cache and objects first, > before modifying either? > Also sensible. Originally, I wanted to keep the structure of the code in place with minimal changes. In fact, checking both in advance avoids a cache bug that was also addressed in the larger patch but it's almost 6 of 1, 1/2 doz of another. > Also, it seems like maybe vtable-remove-object should not actually be > using the customizable object equality anyway? > If object equality is delegated to whatever the user wants, why would remove not honor that to locate the object by user equality? > > > ;; FIXME: The fact that the `location' argument of > > ;; `vtable-insert-object' can be an integer and is then interpreted as > > @@ -378,7 +416,16 @@ vtable-insert-object > > (nthcdr location (vtable-objects table)) > > ;; Do not prepend if index is too large: > > (setq before nil)) > > - (or (memq location (vtable-objects table)) > > + (or > > + (let ((loc (vtable-objects table))) > > + (while (and (cdr loc) > > + (not (funcall (vtable-object-equal > table) > > + (car loc) location))= ) > > + (setq loc (cdr loc))) > > + (if (funcall (vtable-object-equal table) > > + (car loc) location) > > + loc > > + nil)) > > I think you probably should introduce a function which searches > (vtable-objects table) for an existing object using the equality > function, and use that everywhere; it would make the changes like this > much simpler. > Maybe. There are other idioms more repetitive than this one that also could use a bit more love. > ;; Prepend if `location' is not found and > > ;; `before' is non-nil: > > (and before (vtable-objects table)))) > > @@ -400,7 +447,7 @@ vtable-insert-object > > ;; Then adjust the cache and display. > > (save-excursion > > (vtable-goto-table table) > > - (let* ((cache (vtable--cache table)) > > + (let* ((cache (vtable--ensure-cache table)) > > (inhibit-read-only t) > > (keymap (get-text-property (point) 'keymap)) > > (ellipsis (if (vtable-ellipsis table) > > @@ -410,11 +457,14 @@ vtable-insert-object > > (ellipsis-width (string-pixel-width ellipsis)) > > (elem (if location ; This binding mirrors the binding of > `pos' above. > > (if (integerp location) > > - (nth location (car cache)) > > - (or (assq location (car cache)) > > + (nth location (vtable--cache-lines cache)) > > + (or (assoc > > + location > > + (vtable--cache-lines cache) > > + (vtable-object-equal table)) > > (and before (caar cache)))) > > (if before (caar cache)))) > > - (pos (memq elem (car cache))) > > + (pos (memq elem (vtable--cache-lines cache))) > > (line (cons object (vtable--compute-cached-line table > object)))) > > (if (or before > > (and pos (integerp location))) > > @@ -433,13 +483,14 @@ vtable-insert-object > > (forward-line 1) ; Insert *after*. > > (vtable-end-of-table))) > > ;; Otherwise, append the object. > > - (setcar cache (nconc (car cache) (list line))) > > + (setcar cache (nconc (vtable--cache-lines cache) (list > line))) > > (vtable-end-of-table))) > > (let ((start (point))) > > ;; FIXME: We have to adjust colors in lines below this if we > > ;; have :row-colors. > > (vtable--insert-line table line 0 > > - (nth 1 cache) (vtable--spacer table) > > + (vtable--cache-widths cache) > > + (vtable--spacer table) > > ellipsis ellipsis-width) > > (add-text-properties start (point) (list 'keymap keymap > > 'vtable table))) > > @@ -523,7 +574,8 @@ vtable--ensure-cache > > (vtable--recompute-cache table))) > > > > (defun vtable-insert (table) > > - (let* ((spacer (vtable--spacer table)) > > + (let* ((cache (vtable--ensure-cache table)) > > + (spacer (vtable--spacer table)) > > (start (point)) > > (ellipsis (if (vtable-ellipsis table) > > (propertize (truncate-string-ellipsis) > > @@ -533,7 +585,7 @@ vtable-insert > > ;; We maintain a cache per screen/window width, so that we > render > > ;; correctly if Emacs is open on two different screens (or th= e > > ;; user resizes the frame). > > - (widths (nth 1 (vtable--ensure-cache table)))) > > + (widths (vtable--cache-widths cache))) > > ;; Don't insert any header or header line if the user hasn't > > ;; specified the columns. > > (when (slot-value table '-has-column-spec) > > @@ -551,7 +603,7 @@ vtable-insert > > (vtable--sort table) > > ;; Insert the data. > > (let ((line-number 0)) > > - (dolist (line (car (vtable--cache table))) > > + (dolist (line (vtable--cache-lines cache)) > > (vtable--insert-line table line line-number widths spacer > > ellipsis ellipsis-width) > > (setq line-number (1+ line-number)))) > > @@ -667,18 +719,26 @@ vtable--clear-cache > > > > (defun vtable--sort (table) > > (pcase-dolist (`(,index . ,direction) (vtable-sort-by table)) > > - (let ((cache (vtable--cache table)) > > - (numerical (vtable-column--numerical > > - (elt (vtable-columns table) index))) > > + (let* ((cache (vtable--ensure-cache table)) > > + (column (elt (vtable-columns table) index)) > > + (numerical (vtable-column--numerical column)) > > (numcomp (if (eq direction 'descend) > > #'> #'<)) > > (stringcomp (if (eq direction 'descend) > > - #'string> #'string<))) > > + #'string> #'string<)) > > + (comparator (vtable-column-comparator column)) > > + (comparator-func (when comparator > > + (if (eq direction 'descend) > > + (lambda (v1 v2) > > + (funcall comparator v2 v1)) > > + comparator)))) > > (setcar cache > > - (sort (car cache) > > + (sort (vtable--cache-lines cache) > > (lambda (e1 e2) > > (let ((c1 (elt e1 (1+ index))) > > (c2 (elt e2 (1+ index)))) > > + (if comparator-func > > + (funcall comparator-func (car c1) (car c2)= ) > > (if numerical > > (funcall numcomp (car c1) (car c2)) > > (funcall > > @@ -688,7 +748,7 @@ vtable--sort > > (format "%s" (car c1))) > > (if (stringp (car c2)) > > (car c2) > > - (format "%s" (car c2)))))))))))) > > + (format "%s" (car c2))))))))))))) > > > > (defun vtable--indicator (table index) > > (let ((order (car (last (vtable-sort-by table))))) > > @@ -860,7 +920,8 @@ vtable--compute-width > > (/ (* (string-to-number (match-string 1 spec)) (window-width nil t= )) > > 100)) > > (t > > - (error "Invalid spec: %s" spec)))) > > + (error "Invalid spec: %s (vtable `%s')" > > + spec (vtable-name table))))) > > > > (defun vtable--compute-widths (table cache) > > "Compute the display widths for TABLE. > > @@ -972,7 +1033,13 @@ vtable-revert > > (vtable-goto-column column)))) > > > > (defun vtable--widths (table) > > - (nth 1 (vtable--ensure-cache table))) > > + (vtable--cache-widths (vtable--ensure-cache table))) > > + > > +(defun vtable--cache-widths (cache) > > + (nth 1 cache)) > > + > > +(defun vtable--cache-lines (cache) > > + (car cache)) > > ;;; Commands. > > > > diff --git a/test/lisp/emacs-lisp/vtable-tests.el > b/test/lisp/emacs-lisp/vtable-tests.el > > index 74fb8cc8139..6e3c09e14de 100644 > > --- a/test/lisp/emacs-lisp/vtable-tests.el > > +++ b/test/lisp/emacs-lisp/vtable-tests.el > > @@ -27,7 +27,7 @@ > > (require 'ert) > > (require 'ert-x) > > > > -(ert-deftest test-vstable-compute-columns () > > +(ert-deftest test-vtable-compute-columns () > > (should > > (equal (mapcar > > (lambda (column) > > @@ -69,4 +69,108 @@ test-vtable-insert-object > > (mapcar #'cadr (vtable-objects table)))) > > (number-sequence 0 11)))) > > > > +(ert-deftest test-vtable-update-object () > > + (let ((buffer (get-buffer-create "*vtable-test*"))) > > + (pop-to-buffer buffer) > > + (erase-buffer) > > + (let* ((object1 (cons "XXX" 1)) > > + (object2 (cons "YYY" 2)) > > + (table > > + (make-vtable > > + :use-header-line nil > > + :object-equal #'eq ; Identity. > > + :columns '((:name "XXX")) > > + :objects (list object1 object2)))) > > + (should-error (vtable-update-object table "ZZZ")) > > + (setcdr object1 3) > > + (vtable-update-object table object1) > > + (should (eq 3 (cdr (assoc "XXX" (vtable-objects table)))))))) > > + > > +(ert-deftest test-vtable-remove-object () > > + (let ((buffer (get-buffer-create "*vtable-test*"))) > > + (pop-to-buffer buffer) > > + (erase-buffer) > > + (let* ((object1 (cons "XXX" 1)) > > + (object2 (cons "YYY" 2)) > > + (table > > + (make-vtable > > + :use-header-line nil > > + :object-equal #'eq ; Identity. > > + :columns '((:name "XXX")) > > + :objects (list object1 object2)))) > > + (should-error (vtable-remove-object table "ZZZ")) > > + (vtable-remove-object table object1) > > + (should (eq 1 (length (vtable-objects table))))))) > > + > > +(ert-deftest test-vtable-object-equal () > > + (let ((buffer (get-buffer-create "*vtable-test*"))) > > + (pop-to-buffer buffer) > > + (erase-buffer) > > + (let* ((object1 "XXX") > > + (object2 "XXX") > > + (table-eq > > + (progn > > + (goto-char (point-max)) > > + (make-vtable > > + :use-header-line nil > > + :columns '((:name "table-eq" :width 20)) > > + :object-equal #'eq ; Identity. > > + :objects (list object1 object2)))) > > + (table-equal > > + (progn > > + (goto-char (point-max)) > > + (make-vtable > > + :use-header-line nil > > + :columns '((:name "table-equal" :width 20)) > > + :object-equal #'equal ; Value. > > + :objects (list object1 object2))))) > > + (should > > + (progn > > + (vtable-goto-table table-eq) > > + (vtable-goto-object object2) > > + (equal object2 (get-text-property (point) 'vtable-object)))) > > + (should-not > > + (progn > > + (vtable-goto-table table-eq) > > + (vtable-goto-object "ZZZ") > > + (equal object1 (get-text-property (point) 'vtable-object)))) > > + (should > > + (progn > > + (vtable-goto-table table-equal) > > + (vtable-goto-object object2) > > + (equal object1 (get-text-property (point) 'vtable-object)))) > > + (should-not > > + (progn > > + (vtable-goto-table table-equal) > > + (vtable-goto-object "ZZZ") > > + (equal object1 (get-text-property (point) 'vtable-object)))))= )) > > + > > +(ert-deftest test-vtable-column-comparator () > > + (let ((buffer (get-buffer-create "*vtable-test*"))) > > + (pop-to-buffer buffer) > > + (erase-buffer) > > + (let ((table > > + (make-vtable > > + :use-header-line t > > + :getter (lambda (object _index _table) object) > > + :columns '(( :name "Date" > > + :primary ascend > > + :width 40 > > + :formatter (lambda (object) > > + (let ((time (date-to-time > object))) > > + (format "%s (%d)" > > + (format-time-string > "%A, %B %d %Y" time) > > + (car time)))) > > + :comparator (lambda (object1 object2) > > + (let ((time1 (date-to-time > object1)) > > + (time2 (date-to-time > object2))) > > + (< (car time1) > > + (car time2)))))) > > + :objects '("Fri, 11 Jul 2025" > > + "Thu, 10 Jul 2025")))) > > + (should > > + (string=3D > > + "Thursday" > > + (thing-at-point 'word)))))) > > + > > ;;; vtable-tests.el ends here > > Thank you very much for adding tests. > > Overall this patch looks good, I am in favor of this landing soon (after > feedback is addressed of course). > Thank you for your support. (One other thing: Could you try to tell your mail client to attach the > patch in "inline" mode? This makes the patch somewhat easier to review > in debbugs. (This may be easiest if you use Gnus to send the patch, > perhaps using debbugs-gnu-post-patch)) > I'm a gmail user, for good or for bad. I could probably just copy/paste the patch content into the body of the message, unless there are recipes to follow that make gmail do what you suggest. I fear gmail considers body text fair game to screw with formatting, etc., so attachments seem safest. I could spend some time making gnus work (I haven't been a gnus user for 25 years) with my gmail account (but I really really don't want to import my entire gmail account content into gnus just to send a few email messages with inline patches). Perhaps you can make your gnus recognize patch attachments and treat them specially? As I say, it's been 3 dog generations since I touched gnus. Feel free to contact me off line from this bug report if you have some configuration/guidelines you'd like me to look at. --000000000000ac73390639f5e534 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
= On Mon, Jul 14, 2025 at 3:54=E2=80=AFPM Spencer Baugh <sbaugh@janestreet.com> wrote:
St=C3=A9phane Marks <shipmints@gmail.com> writes:
> On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks <shipmints@gmail.com&= gt; wrote:
> I've updated the broader vtable update in the referenced 78843 bug= to check out if interested.
>
> I've removed support for the duplicate-object feature.=C2=A0 After= careful consideration, it was half baked and I think better for vtable
> programmers to handle their own objects.=C2=A0 I will be sure the docu= mentation stresses to avoid duplicate objects as vtable's design is
> predicated on unique objects (or race conditions ensue among duplicate= object references).

Thank you, this was going to be my first bit of feedback.

Folowup question: What is the motivation for adding customizable object
equality?=C2=A0 Could the need for that be avoided by some changes specific=
to vtable-update-object?

It's really a policy que= stion and future proofing.=C2=A0 I believe Lars originated this idea and pr= obably has use cases for this in his vtable code.
=C2=A0
> Attaching the updated patch which is also formatted to avoid mere whit= espace changes.

Thanks for this too.

> From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 Mon Sep 17 00:00:00 2001=
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@gmail.com>
> Date: Sun, 13 Jul 2025 13:32:28 -0400
> Subject: [PATCH] Improve 'vtable' object handling, cache handl= ing, messages
>
> Add object equality function override (defaults to existing 'eq= 9;
> behavior).=C2=A0 Add column comparator to address object
> sorting (defaults to existing behavior).=C2=A0 Correct cache
> references to prime the cache as needed.=C2=A0 Add cache accessor
> functions.=C2=A0 Add table name slot to improve errors and
> messages (defaults to "*vtable*").
>
> Added tests.
>
> * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator
> slot.
> (vtable): Add name, object-equal slots.
> (make-vtable): Initialize new slots.
> (vtable-goto-object): Use object-equal.
> (vtable-update-object): Use object-equal, use cache accessor,
> improve messages.
> (vtable-remove-object): Use object-equal, prime cache, use cache
> functions, improve messages.
> (vtable-insert-object): Use object-equal, use cache accessor,
> improve messages.
> (vtable-insert): Prime cache, use cache accessor.
> (vtable--sort): Use column comparator, prime cache, use cache
> accessor.
> (vtable--compute-width): Improve message.
> (vtable--widths): Use cache accessor.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (test-vstable-compute-columns): Renamed to
> test-vtable-compute-columns.
> (test-vtable-insert-object): Changed buffer name to non-hidden.
> (test-vtable-update-object, test-vtable-remove-object)
> (test-vtable-object-equal, test-vtable-column-comparator): New
> test.
> ---
>=C2=A0 lisp/emacs-lisp/vtable.el=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 | 143 ++++++++++++++++++++-------
>=C2=A0 test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++-<= br> >=C2=A0 2 files changed, 210 insertions(+), 39 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index 00785113edb..31ef73d5eb4 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -45,14 +45,18 @@ vtable-column
>=C2=A0 =C2=A0 getter
>=C2=A0 =C2=A0 formatter
>=C2=A0 =C2=A0 displayer
> +=C2=A0 comparator
>=C2=A0 =C2=A0 -numerical
>=C2=A0 =C2=A0 -aligned)
>=C2=A0
>=C2=A0 (defclass vtable ()
> -=C2=A0 ((columns :initarg :columns :accessor vtable-columns)
> +=C2=A0 ((name :initarg :name :accessor vtable-name)
> +=C2=A0 =C2=A0(columns :initarg :columns :accessor vtable-columns)
>=C2=A0 =C2=A0 =C2=A0(objects :initarg :objects :accessor vtable-objects= )
>=C2=A0 =C2=A0 =C2=A0(objects-function :initarg :objects-function
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0:accessor vtable-objects-function)
> +=C2=A0 =C2=A0(object-equal :initarg :object-equal
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:access= or vtable-object-equal)

(I feel like there's probably a better name for this but I don't kn= ow
what it would be)

>=C2=A0 =C2=A0 =C2=A0(getter :initarg :getter :accessor vtable-getter) >=C2=A0 =C2=A0 =C2=A0(formatter :initarg :formatter :accessor vtable-for= matter)
>=C2=A0 =C2=A0 =C2=A0(displayer :initarg :displayer :accessor vtable-dis= player)
> @@ -86,7 +90,12 @@ vtable-header-line-map
>=C2=A0 =C2=A0 "<follow-link>" 'mouse-face
>=C2=A0 =C2=A0 "<mouse-2>" #'vtable-header-line-sort= )
>=C2=A0
> -(cl-defun make-vtable (&key columns objects objects-function
> +(cl-defun make-vtable (&key
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(name "*vtable*")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0columns
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0objects
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0objects-function
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(object-equal #'eq)
>=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=A0getter
>=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=A0formatter
>=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=A0displayer

No need to reformat this.

Getting ready for more slots (an= d I kind of like the format as it's easier for me to read).

> @@ -113,8 +122,10 @@ make-vtable
>=C2=A0 =C2=A0 (let ((table
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-instance
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :name name
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects objects
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects-function objects-fun= ction
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :object-equal object-equal
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :getter getter
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :formatter formatter
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :displayer displayer
> @@ -132,7 +143,8 @@ make-vtable
>=C2=A0 =C2=A0 =C2=A0 ;; Auto-generate the columns.
>=C2=A0 =C2=A0 =C2=A0 (unless columns
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless objects
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error "Can't auto-generate colu= mns; no objects"))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error "Can't auto-generate colu= mns; no objects (vtable `%s')"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name t= able)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq columns (make-list (length (car objec= ts)) "")))
>=C2=A0 =C2=A0 =C2=A0 (setf (vtable-columns table)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (mapcar (lambda (column)
> @@ -251,14 +263,15 @@ vtable-goto-object
>=C2=A0 Return the position of the object if found, and nil if not."= ;
>=C2=A0 =C2=A0 (let ((start (point)))
>=C2=A0 =C2=A0 =C2=A0 (vtable-beginning-of-table)
> +=C2=A0 =C2=A0 (let ((predicate (vtable-object-equal (vtable-current-t= able))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-restriction
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (narrow-to-region (point) (save-excu= rsion (vtable-end-of-table)))
> -=C2=A0 =C2=A0 =C2=A0 (if (text-property-search-forward 'vtable-ob= ject object #'eq)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (text-property-search-forward 'vt= able-object object predicate)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (forward-line -= 1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (point))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char start)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 nil))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 nil)))))
>=C2=A0
>=C2=A0 (defun vtable-goto-table (table)
>=C2=A0 =C2=A0 "Go to TABLE in the current buffer.
> @@ -291,25 +304,32 @@ vtable-update-object
>=C2=A0 =C2=A0 (let* ((objects (vtable-objects table))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t))
>=C2=A0 =C2=A0 =C2=A0 ;; First replace the object in the object storage.=
> -=C2=A0 =C2=A0 (if (eq old-object (car objects))
> +=C2=A0 =C2=A0 (if (funcall (vtable-object-equal table) old-object (ca= r objects))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; It's at the head, so replace = it there.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cons object (c= dr objects)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise splice into the list.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (while (and (cdr objects)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (not (= eq (cadr objects) old-object)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (not (= funcall (vtable-object-equal table)
> +=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 (cadr objects) old-object)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq objects (cdr objects)))
> -=C2=A0 =C2=A0 =C2=A0 (unless objects
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error "Can't find the old objec= t"))
> +=C2=A0 =C2=A0 =C2=A0 (unless (and objects
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (funcall (vtable-object-equal table)
> +=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 (cadr objects) old-object))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error "Can't find the old objec= t (vtable `%s')"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name t= able)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar (cdr objects) object))
>=C2=A0 =C2=A0 =C2=A0 ;; Then update the cache...
>=C2=A0 =C2=A0 =C2=A0 ;; FIXME: If the table's buffer has no visible= window, or if its
>=C2=A0 =C2=A0 =C2=A0 ;; width has changed since the table was updated, = the cache key will
>=C2=A0 =C2=A0 =C2=A0 ;; not match and the object can't be updated.= =C2=A0 (Bug #69837).
> -=C2=A0 =C2=A0 (if-let* ((line-number (seq-position (car (vtable--cach= e table)) old-object
> -=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 =C2=A0 =C2= =A0(lambda (a b)
> -=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 =C2=A0 =C2= =A0 =C2=A0(equal (car a) b))))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (car (vta= ble--cache table)) line-number)))
> +=C2=A0 =C2=A0 (if-let* ((cache (vtable--ensure-cache table))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line-number (seq-po= sition
> +=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 (vtable--cache-lines cache)
> +=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 (assoc old-object
> +=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(vtable--cache-line= s cache)
> +=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(vtable-object-equa= l table))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (vtable--= cache-lines cache) line-number)))

I think you should either remove the vtable--cache function entirely or
make vtable--cache do what vtable--ensure-cache does.
=
That's sensible.

Better yet: adopt what I did in bug#69837, which mostly removes the code which looks up the cache based on the current window and frame
attributes.=C2=A0 Such code is not correct anyway, since when modifying par= t
of a vtable that already exists, one should use the widths which are
already in place for that vtable, as I mentioned in my patch there.

Backward compatibility is a potential issue with that strate= gy.=C2=A0 If we do that, we might as well support a single cache just for t= he most recently displayed vtable window.=C2=A0 Lars clearly had a reason t= o implement the multi-width cache and I decided to leave it in place (and i= mprove it as you've seen in the much larger patch) rather than break pe= ople's code.=C2=A0 A cache patch coming after this one.

>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar line object)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr line (vtable--compute= -cached-line table object))
> @@ -320,28 +340,46 @@ vtable-update-object
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= start (point)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line) >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert= -line table line line-number
> -=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 1 (vtable--cac= he table))
> +=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(vtable--cache-widt= hs cache)
>=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(vtable--spac= er table))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-prope= rties start (point) (list 'keymap keymap
>=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'vtable tabl= e))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We may have inserted a non= -numerical value into a previously
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so re= compute.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical = table (cdr line)))
> -=C2=A0 =C2=A0 =C2=A0 (error "Can't find cached object in vta= ble"))))
> +=C2=A0 =C2=A0 =C2=A0 (error "Can't find cached object (vtabl= e `%s')"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))= ))
>=C2=A0
>=C2=A0 (defun vtable-remove-object (table object)
>=C2=A0 =C2=A0 "Remove OBJECT from TABLE.
>=C2=A0 This will also remove the displayed line."
> +=C2=A0 (let ((cache (vtable--ensure-cache table))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))
> +=C2=A0 =C2=A0 (unless (seq-contains-p (vtable-objects table)
> +=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 object
> +=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 (vtable-object-equal table))
> +=C2=A0 =C2=A0 =C2=A0 (error "Can't find the object to remove= (vtable `%s')"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))=
>=C2=A0 =C2=A0 =C2=A0 ;; First remove from the objects.
> -=C2=A0 (setf (vtable-objects table) (delq object (vtable-objects tabl= e)))
> +=C2=A0 =C2=A0 (setf (vtable-objects table) (seq-remove
> +=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 (lambda (elt)
> +=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 (funcall (vtable-o= bject-equal table)
> +=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0elt object))
> +=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 (vtable-objects table)))<= br> >=C2=A0 =C2=A0 =C2=A0 ;; Then adjust the cache and display.
> -=C2=A0 (let ((cache (vtable--cache table))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))
> -=C2=A0 =C2=A0 (setcar cache (delq (assq object (car cache)) (car cach= e)))
> +=C2=A0 =C2=A0 (if-let* ((old-line (assoc object
> +=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(vtable--cache-lines cache)
> +=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(vtable-object-equal table)))) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (delq old-line (vtab= le--cache-lines cache)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table tab= le)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (vtable-goto-obj= ect object)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line)))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line))))
> +=C2=A0 =C2=A0 =C2=A0 ;; At this point, the object was removed from ob= jects, but not
> +=C2=A0 =C2=A0 =C2=A0 ;; the cache, which will stale.
> +=C2=A0 =C2=A0 =C2=A0 (error "Can't find cached object (vtabl= e `%s')"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))= ))

So then why not look the object up in both the cache and objects first,
before modifying either?

Also sensible.=C2=A0 Origina= lly, I wanted to keep the structure of the code in place with minimal chang= es.=C2=A0 In fact, checking both in advance avoids a cache bug that was als= o addressed in the larger patch but it's almost 6 of 1, 1/2 doz of anot= her.
=C2=A0
Also, it seems like maybe vtable-remove-object should not actually be
using the customizable object equality anyway?

If object e= quality is delegated to whatever the=C2=A0user wants, why would remove=C2= =A0not honor that to=C2=A0locate the object by user equality?

>=C2=A0
>=C2=A0 ;; FIXME: The fact that the `location' argument of
>=C2=A0 ;; `vtable-insert-object' can be an integer and is then inte= rpreted as
> @@ -378,7 +416,16 @@ vtable-insert-object
>=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(nthcdr location (vtable-objects table))<= br> >=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;; Do not prepend if index is too large:
>=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(setq before nil))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0(or (memq location (vtable-objects table))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0(or
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 (let ((loc (vtable-objects table)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (while (and (cdr loc)
> +=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 (not (funcall (vta= ble-object-equal table)
> +=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (car loc) location)))
> +=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 (setq loc (cdr loc)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (if (funcall (vtable-object-equal table)
> +=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 loc) lo= cation)
> +=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 loc
> +=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 nil))

I think you probably should introduce a function which searches
(vtable-objects table) for an existing object using the equality
function, and use that everywhere; it would make the changes like this
much simpler.

Maybe.=C2=A0 There are other idioms more rep= etitive than this one that also could use a bit more love.

>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 ;; Prepend if `location' is not found and
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 ;; `before' is non-nil:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 (and before (vtable-objects table))))
> @@ -400,7 +447,7 @@ vtable-insert-object
>=C2=A0 =C2=A0 =C2=A0 ;; Then adjust the cache and display.
>=C2=A0 =C2=A0 =C2=A0 (save-excursion
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)
> -=C2=A0 =C2=A0 =C2=A0 (let* ((cache (vtable--cache table))
> +=C2=A0 =C2=A0 =C2=A0 (let* ((cache (vtable--ensure-cache table))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-on= ly t)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap (get-tex= t-property (point) 'keymap))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (v= table-ellipsis table)
> @@ -410,11 +457,14 @@ vtable-insert-object
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width = (string-pixel-width ellipsis))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(elem (if locati= on=C2=A0 ; This binding mirrors the binding of `pos' above.
>=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(if (integerp location)
> -=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 location (car cache))
> -=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(or (assq location (car cache))
> +=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 location (vtable--cache-lines cache))
> +=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(or (assoc
> +=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 location
> +=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 (vtable--cache-lines cache)
> +=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 (vtable-object-equal table))
>=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(and before (caar cache))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0(if before (caar cache))))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem (car = cache)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem (vtab= le--cache-lines cache)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons obje= ct (vtable--compute-cached-line table object))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (or before
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (and pos= (integerp location)))
> @@ -433,13 +483,14 @@ vtable-insert-object
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (forward-line 1)=C2=A0 ; Insert *after*.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= vtable-end-of-table)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, append t= he object.
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc (car c= ache) (list line)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc (vtabl= e--cache-lines cache) (list line)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-end-of-table))= )
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((start (point)))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; FIXME: We have to adjust c= olors in lines below this if we
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; have :row-colors.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert-line table li= ne 0
> -=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 1 cache) (vtable--spacer tab= le)
> +=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(vtable--cache-widths cache)
> +=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(vtable--spacer table)
>=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=A0ellipsis ellipsis-width) >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-properties start (p= oint) (list 'keymap keymap
>=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'vtable table)))
> @@ -523,7 +574,8 @@ vtable--ensure-cache
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-cache table)))
>=C2=A0
>=C2=A0 (defun vtable-insert (table)
> -=C2=A0 (let* ((spacer (vtable--spacer table))
> +=C2=A0 (let* ((cache (vtable--ensure-cache table))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(spacer (vtable--spacer table))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(start (point))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (vtable-ellipsis= table)
>=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(propertize (truncate-string-ellipsis)
> @@ -533,7 +585,7 @@ vtable-insert
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; We maintain a cache per scr= een/window width, so that we render
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; correctly if Emacs is open = on two different screens (or the
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; user resizes the frame). > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(widths (nth 1 (vtable--ensure-cach= e table))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(widths (vtable--cache-widths cache= )))
>=C2=A0 =C2=A0 =C2=A0 ;; Don't insert any header or header line if t= he user hasn't
>=C2=A0 =C2=A0 =C2=A0 ;; specified the columns.
>=C2=A0 =C2=A0 =C2=A0 (when (slot-value table '-has-column-spec)
> @@ -551,7 +603,7 @@ vtable-insert
>=C2=A0 =C2=A0 =C2=A0 (vtable--sort table)
>=C2=A0 =C2=A0 =C2=A0 ;; Insert the data.
>=C2=A0 =C2=A0 =C2=A0 (let ((line-number 0))
> -=C2=A0 =C2=A0 =C2=A0 (dolist (line (car (vtable--cache table)))
> +=C2=A0 =C2=A0 =C2=A0 (dolist (line (vtable--cache-lines cache))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert-line table line line= -number widths spacer
>=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=A0ellipsis ellipsis-width)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq line-number (1+ line-number)))= )
> @@ -667,18 +719,26 @@ vtable--clear-cache
>=C2=A0
>=C2=A0 (defun vtable--sort (table)
>=C2=A0 =C2=A0 (pcase-dolist (`(,index . ,direction) (vtable-sort-by tab= le))
> -=C2=A0 =C2=A0 (let ((cache (vtable--cache table))
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (numerical (vtable-column--numeric= al
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 (elt (vtable-columns table) index)))
> +=C2=A0 =C2=A0 (let* ((cache (vtable--ensure-cache table))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(column (elt (vtable-columns= table) index))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(numerical (vtable-column--n= umerical column))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(numcomp (if (eq direct= ion 'descend)
>=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 =C2=A0(stringcomp (if (eq dir= ection 'descend)
> -=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 #'string> #'string<)))
> +=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#'string> #'string<))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(comparator (vtable-column-c= omparator column))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(comparator-func (when compa= rator
> +=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 (if (eq direction 'descend)
> +=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 (lambda (v1 v2)
> +=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 (funcall comparato= r v2 v1))
> +=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 comparator))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (sort (car cache) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (sort (vtable--cache= -lines cache)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (lambda (e1 e2)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 (let ((c1 (elt e1 (1+ index)))
>=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 (elt e2 (1+ index))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (if comparator-func
> +=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 (funcall comparator-func (car c1) (car c2)) >=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 (if numerical
>=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 (funcall numcomp (car c1) (car c2= ))
>=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 (funcall
> @@ -688,7 +748,7 @@ vtable--sort
>=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(format "%s" (car= c1)))
>=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(if (stringp (car c2))
>=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 c2)
> -=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(format "%s" (car c2))))))))))= ))
> +=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(format "%s" (car c2)))= ))))))))))
>=C2=A0
>=C2=A0 (defun vtable--indicator (table index)
>=C2=A0 =C2=A0 (let ((order (car (last (vtable-sort-by table)))))
> @@ -860,7 +920,8 @@ vtable--compute-width
>=C2=A0 =C2=A0 =C2=A0 (/ (* (string-to-number (match-string 1 spec)) (wi= ndow-width nil t))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0100))
>=C2=A0 =C2=A0 =C2=A0(t
> -=C2=A0 =C2=A0 (error "Invalid spec: %s" spec))))
> +=C2=A0 =C2=A0 (error "Invalid spec: %s (vtable `%s')" > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0spec (vtable-name table)))))=
>=C2=A0
>=C2=A0 (defun vtable--compute-widths (table cache)
>=C2=A0 =C2=A0 "Compute the display widths for TABLE.
> @@ -972,7 +1033,13 @@ vtable-revert
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-column column))))
>=C2=A0
>=C2=A0 (defun vtable--widths (table)
> -=C2=A0 (nth 1 (vtable--ensure-cache table)))
> +=C2=A0 (vtable--cache-widths (vtable--ensure-cache table)))
> +
> +(defun vtable--cache-widths (cache)
> +=C2=A0 (nth 1 cache))
> +
> +(defun vtable--cache-lines (cache)
> +=C2=A0 (car cache))
>=C2=A0 ;;; Commands.
>=C2=A0
> diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-li= sp/vtable-tests.el
> index 74fb8cc8139..6e3c09e14de 100644
> --- a/test/lisp/emacs-lisp/vtable-tests.el
> +++ b/test/lisp/emacs-lisp/vtable-tests.el
> @@ -27,7 +27,7 @@
>=C2=A0 (require 'ert)
>=C2=A0 (require 'ert-x)
>=C2=A0
> -(ert-deftest test-vstable-compute-columns ()
> +(ert-deftest test-vtable-compute-columns ()
>=C2=A0 =C2=A0 (should
>=C2=A0 =C2=A0 =C2=A0(equal (mapcar
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lambda (column)
> @@ -69,4 +69,108 @@ test-vtable-insert-object
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (mapcar #'c= adr (vtable-objects table))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (number-sequence 0 11))))
>=C2=A0
> +(ert-deftest test-vtable-update-object ()
> +=C2=A0 (let ((buffer (get-buffer-create "*vtable-test*")))<= br> > +=C2=A0 =C2=A0 (pop-to-buffer buffer)
> +=C2=A0 =C2=A0 (erase-buffer)
> +=C2=A0 =C2=A0 (let* ((object1 (cons "XXX" 1))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 (cons "YYY&quo= t; 2))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-line nil<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal #'e= q ; Identity.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns '((:name= "XXX"))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list object= 1 object2))))
> +=C2=A0 =C2=A0 =C2=A0 (should-error (vtable-update-object table "= ZZZ"))
> +=C2=A0 =C2=A0 =C2=A0 (setcdr object1 3)
> +=C2=A0 =C2=A0 =C2=A0 (vtable-update-object table object1)
> +=C2=A0 =C2=A0 =C2=A0 (should (eq 3 (cdr (assoc "XXX" (vtabl= e-objects table))))))))
> +
> +(ert-deftest test-vtable-remove-object ()
> +=C2=A0 (let ((buffer (get-buffer-create "*vtable-test*")))<= br> > +=C2=A0 =C2=A0 (pop-to-buffer buffer)
> +=C2=A0 =C2=A0 (erase-buffer)
> +=C2=A0 =C2=A0 (let* ((object1 (cons "XXX" 1))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 (cons "YYY&quo= t; 2))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-line nil<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal #'e= q ; Identity.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns '((:name= "XXX"))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list object= 1 object2))))
> +=C2=A0 =C2=A0 =C2=A0 (should-error (vtable-remove-object table "= ZZZ"))
> +=C2=A0 =C2=A0 =C2=A0 (vtable-remove-object table object1)
> +=C2=A0 =C2=A0 =C2=A0 (should (eq 1 (length (vtable-objects table)))))= ))
> +
> +(ert-deftest test-vtable-object-equal ()
> +=C2=A0 (let ((buffer (get-buffer-create "*vtable-test*")))<= br> > +=C2=A0 =C2=A0 (pop-to-buffer buffer)
> +=C2=A0 =C2=A0 (erase-buffer)
> +=C2=A0 =C2=A0 (let* ((object1 "XXX")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 "XXX") > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table-eq
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char (point-ma= x))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-li= ne nil
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns '= ((:name "table-eq" :width 20))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal = #'eq ; Identity.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list= object1 object2))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table-equal
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char (point-ma= x))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-li= ne nil
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns '= ((:name "table-equal" :width 20))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal = #'equal ; Value.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list= object1 object2)))))
> +=C2=A0 =C2=A0 =C2=A0 (should
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-eq)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object object2)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object2 (get-text-property (= point) 'vtable-object))))
> +=C2=A0 =C2=A0 =C2=A0 (should-not
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-eq)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object "ZZZ"= )
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (= point) 'vtable-object))))
> +=C2=A0 =C2=A0 =C2=A0 (should
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-equal)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object object2)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (= point) 'vtable-object))))
> +=C2=A0 =C2=A0 =C2=A0 (should-not
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-equal)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object "ZZZ"= )
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (= point) 'vtable-object)))))))
> +
> +(ert-deftest test-vtable-column-comparator ()
> +=C2=A0 (let ((buffer (get-buffer-create "*vtable-test*")))<= br> > +=C2=A0 =C2=A0 (pop-to-buffer buffer)
> +=C2=A0 =C2=A0 (erase-buffer)
> +=C2=A0 =C2=A0 (let ((table
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-vtable
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :use-header-line t
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :getter (lambda (object _in= dex _table) object)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :columns '(( :name &quo= t;Date"
> +=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:primary ascend
> +=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:width 40
> +=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:formatter (lambda (object)
> +=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 (let ((time= (date-to-time object)))
> +=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 =C2=A0 (for= mat "%s (%d)"
> +=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 (format-time-string "%A, %B %d %Y" time)=
> +=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 (car time))))
> +=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:comparator (lambda (object1 object2)
> +=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 =C2=A0(let = ((time1 (date-to-time object1))
> +=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 =C2=A0 =C2= =A0 =C2=A0 =C2=A0(time2 (date-to-time object2)))
> +=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 =C2=A0 =C2= =A0(< (car time1)
> +=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 =C2=A0 =C2= =A0 =C2=A0 (car time2))))))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects '("Fri, 1= 1 Jul 2025"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0"Thu, 10 Jul 2025"))))
> +=C2=A0 =C2=A0 =C2=A0 (should
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(string=3D
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 "Thursday"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (thing-at-point 'word))))))
> +
>=C2=A0 ;;; vtable-tests.el ends here

Thank you very much for adding tests.

Overall this patch looks good, I am in favor of this landing soon (after feedback is addressed of course).

Thank you for your suppo= rt.

<= /div>
(One other thing: Could you try to tell your mail client to attach the
patch in "inline" mode?=C2=A0 This makes the patch somewhat easie= r to review
in debbugs.=C2=A0 (This may be easiest if you use Gnus to send the patch, perhaps using debbugs-gnu-post-patch))

I'm a gmail use= r, for good or for bad.=C2=A0 I could probably just copy/paste the patch co= ntent into the body of the message, unless there are recipes to follow that= make gmail do what you suggest.=C2=A0 I fear gmail considers body text fai= r game to screw with formatting, etc., so attachments seem safest.=C2=A0 I = could spend some time making gnus work (I haven't been a gnus user for = 25 years) with my gmail account (but I really really don't want to impo= rt my entire gmail account content into gnus just to send a few email messa= ges with inline patches).=C2=A0 Perhaps you can make your gnus recognize pa= tch attachments and treat them specially?=C2=A0 As I say, it's been 3 d= og generations since I touched gnus.=C2=A0 Feel free to contact me off line= from this bug report if you have some configuration/guidelines you'd l= ike me to look at.
--000000000000ac73390639f5e534--