From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: =?UTF-8?Q?Jo=C3=A3o_Paulo_Labegalini_de_Carvalho?= Newsgroups: gmane.emacs.devel Subject: Implementation direction for shell-script-mode with tree-sitter Date: Tue, 25 Oct 2022 09:05:10 -0600 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000afdb3005ebdd3c7e" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29364"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel@gnu.org, Yuan Fu , Theodor Thornhill , Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Oct 25 17:07:12 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1onLWK-0007Nx-5D for ged-emacs-devel@m.gmane-mx.org; Tue, 25 Oct 2022 17:07:12 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1onLV6-0003jH-EL; Tue, 25 Oct 2022 11:06:00 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1onLUo-00030w-PM for emacs-devel@gnu.org; Tue, 25 Oct 2022 11:05:44 -0400 Original-Received: from mail-ot1-x330.google.com ([2607:f8b0:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1onLUa-0002Bg-9X; Tue, 25 Oct 2022 11:05:37 -0400 Original-Received: by mail-ot1-x330.google.com with SMTP id d18-20020a05683025d200b00661c6f1b6a4so7883192otu.1; Tue, 25 Oct 2022 08:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=4gIqjdsAIiDkGOjzOrFlniR5QKycM15NXIHGEViI7UM=; b=CJK2Bq428hxaoIRKKf/aSE0wJshBT9KB7ugax7Q4RH1boF8XtzWGk9Alua/t6sD7bG yTfjSa/5yBzppFUO91nbxx69XR/lIy1/1zrx9qGls1rtdninZf3m6QFrvPiMWlA1aMeA Au3ePqlI7FIseREdogtpWeICAuixkdonOhc2rrtpzu6Aj5/UH7Lxlp7SKLFRFx7/9NcC xCbEAEwmjbnWdvSvAjM9iW/rSReUJTH3NCz5/IWu8go5ntjh7xeClYU1PBYcG98nbeoK q7KC8n/XIg3fkNqUtfPvwM1v/2m4EUS8ZH0CQfeNcz7N4JH192LaQkfhBXAPPj14dxw1 3SXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=4gIqjdsAIiDkGOjzOrFlniR5QKycM15NXIHGEViI7UM=; b=dvIZ3ymCeKziDBo4nORsPcUwuqcWmKmUP4BsOKrm781Tj2MbF+QCZ7WR0CCqaG+Ep5 OGg19bixMaBOntWgCb2idmAovAfxTOAvQo/fv+5tLD8NBLmA+m88PRpXF5DMj1yTYo3N PRnfxHwH/jNw0I8M+jJRdyiJHJB13i0vbWi56lB/3kLnbAr8AA3Tsov6hQ5btccDQmEC zyRfENEUJv3pSBDjLEEFAivACdqQIASBp5a+zJN0/EiB50pPACBs3lek101clRB7dX/W /Cb6mINpOyGVeircQcdZDZRmcgyL54jiYvphNcbsQtQLS1Rmoz50Mc7AWWn5cnaB0tPS g2jQ== X-Gm-Message-State: ACrzQf1H66chHg73asszBxged6DtaR/dfwkS/zxppwMsB8mhTzuOmsD1 jXexU99jHmbPw2RInaJMESY29YDoylpU+sSZwyGJNNqnTfE= X-Google-Smtp-Source: AMsMyM7LtEPpu+PIVpKs7kYM7t8/yDaO9VvI/okzkaJcW2a0+5HGrmS4tboSorm3/HwO0cnlsg17BvGL89hp5JYOPY4= X-Received: by 2002:a05:6830:1098:b0:667:97cc:7a30 with SMTP id y24-20020a056830109800b0066797cc7a30mr778237oto.102.1666710321992; Tue, 25 Oct 2022 08:05:21 -0700 (PDT) Received-SPF: pass client-ip=2607:f8b0:4864:20::330; envelope-from=jaopaulolc@gmail.com; helo=mail-ot1-x330.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, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: "Emacs-devel" Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:298472 Archived-At: --000000000000afdb3005ebdd3c7e Content-Type: multipart/alternative; boundary="000000000000afdb2d05ebdd3c7c" --000000000000afdb2d05ebdd3c7c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, The tree-sitter-bash grammar does not include many reserved words and builtin commands that are currently fontified by the regex based fontication in shell-script-mode. Here a list of the ones that tree-sitter-bash does not recognize: ("time" "coproc" "type" "trap" "exit" "exec" "continue" "break" "return" "logout" "bye") According to the Bash Reference Manual, all of the above are reserved words= . Should I make a PR to tree-sitter-bash to incorporate the missing keywords or should I just filter them out of the list that I obtain through (and other variables in `shell-script-mode'): (append (sh-feature sh-leading-keywords) (sh-feature sh-other-keywords)) I am attaching the patch so everyone can see code and understand better what I did. I welcome all criticism and feedback. PS.: I am looking at the tree-sitter-bash and it does not seem very complicated to extend it to recognize the missing keywords. But I can definitely keep working independently of that. --=20 Jo=C3=A3o Paulo L. de Carvalho Ph.D Computer Science | IC-UNICAMP | Campinas , SP - Brazil Postdoctoral Research Fellow | University of Alberta | Edmonton, AB - Canad= a joao.carvalho@ic.unicamp.br joao.carvalho@ualberta.ca --000000000000afdb2d05ebdd3c7c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

T= he tree-sitter-bash grammar does not include many reserved=C2=A0words and b= uiltin=C2=A0commands that are currently fontified by the regex based fontic= ation in shell-script-mode.

Here a list of the ones that tree-sitter= -bash does not recognize:

("time"= "coproc" "type" "trap" "exit" &quo= t;exec" "continue" "break" "return" &quo= t;logout" "bye")

According=C2=A0to the Bash Reference Manual, all of the above are reserved= words.

Should I make a PR to tree-sitter-bash to incorporate the mi= ssing keywords or should I just filter them out of the list that I obtain t= hrough (and other variables in `shell-script-mode'):

(append (sh-feature sh-leading-keywords)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (sh-feature sh-other-key= words))

I am attaching the patch so everyone can see c= ode and understand better what I did. I welcome all criticism=C2=A0and feed= back.

PS.: I am looking at the tree-sitter-bash and it does not seem= very complicated to extend it to recognize the missing keywords. But I can= definitely=C2=A0keep working independently of that.
--
Jo=C3=A3o Paulo L. de Carvalho
Ph.D Computer Science | =C2=A0IC-UN= ICAMP | Campinas , SP - Brazil
Postdoctoral Research Fellow | University= of Alberta | Edmonton, AB - Canada
--000000000000afdb2d05ebdd3c7c-- --000000000000afdb3005ebdd3c7e Content-Type: text/x-patch; charset="x-binaryenc"; name="sh-script-treesit.patch" Content-Disposition: attachment; filename="sh-script-treesit.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l9oc6it70 G1szM21kaWZmIC0tZ2l0IGEvbGlzcC9wcm9nbW9kZXMvc2gtc2NyaXB0LmVsIGIvbGlzcC9wcm9n bW9kZXMvc2gtc2NyaXB0LmVsG1ttChtbMzNtaW5kZXggNTU4YjYyYjIwYS4uYzdjYzY3Njg0MyAx MDA2NDQbW20KG1szM20tLS0gYS9saXNwL3Byb2dtb2Rlcy9zaC1zY3JpcHQuZWwbW20KG1szM20r KysgYi9saXNwL3Byb2dtb2Rlcy9zaC1zY3JpcHQuZWwbW20KG1szNm1AQCAtMTQ4LDYgKzE0OCw3 IEBAG1ttCiAgIChyZXF1aXJlICdsZXQtYWxpc3QpG1ttCiAgIChyZXF1aXJlICdzdWJyLXgpKRtb bQogKHJlcXVpcmUgJ2V4ZWN1dGFibGUpG1ttChtbMzJtKxtbbRtbMzJtKHJlcXVpcmUgJ3RyZWVz aXQpG1ttCiAbW20KIChhdXRvbG9hZCAnY29taW50LWNvbXBsZXRpb24tYXQtcG9pbnQgImNvbWlu dCIpG1ttCiAoYXV0b2xvYWQgJ2NvbWludC1maWxlbmFtZS1jb21wbGV0aW9uICJjb21pbnQiKRtb bQobWzM2bUBAIC0xNzAsNiArMTcxLDEyIEBAG1ttIBtbbXNoLXNjcmlwdBtbbQogICA6Z3JvdXAg J3NoG1ttCiAgIDpwcmVmaXggInNoLSIpG1ttCiAbW20KG1szMm0rG1ttG1szMm0oZGVmY3VzdG9t IHNoLXNjcmlwdC11c2UtdHJlZS1zaXR0ZXIgbmlsG1ttChtbMzJtKxtbbRtbMzJtICAiSWYgbm9u LW5pbCwgYHNoLXNjcmlwdC1tb2RlJyB0cmllcyB0byB1c2UgdHJlZS1zaXR0ZXIuG1ttChtbMzJt KxtbbRtbMzJtQ3VycmVudGx5IGBzaC1zY3JpcHQtbW9kZScgdXNlcyB0cmVlLXNpdHRlciBmb3Ig Zm9udC1sb2NraW5nLCBpbWVudSwbW20KG1szMm0rG1ttG1szMm1hbmQgbW92ZW1lbnQgZnVuY3Rp b25zLiIbW20KG1szMm0rG1ttG1szMm0gIDp0eXBlICdib29sZWFuG1ttChtbMzJtKxtbbRtbMzJt ICA6dmVyc2lvbiAiMjkuMSIpG1ttCiAbW20KIChkZWZjdXN0b20gc2gtYW5jZXN0b3ItYWxpc3Qb W20KICAgJygoYXNoIC4gc2gpG1ttChtbMzZtQEAgLTE1MzQsMTMgKzE1NDEsMjQgQEAbW20gG1tt c2gtbW9kZRtbbQogICA7OyB3ZSBjYW4ndCBsb29rIGlmIHByZXZpb3VzIGxpbmUgZW5kZWQgd2l0 aCBgXCcbW20KICAgKHNldHEtbG9jYWwgY29taW50LXByb21wdC1yZWdleHAgIl5bIFx0XSoiKRtb bQogICAoc2V0cS1sb2NhbCBpbWVudS1jYXNlLWZvbGQtc2VhcmNoIG5pbCkbW20KG1szMW0tICAo c2V0cSBmb250LWxvY2stZGVmYXVsdHMbW20KG1szMW0tCWAoKHNoLWZvbnQtbG9jay1rZXl3b3Jk cxtbbQobWzMxbS0JICAgc2gtZm9udC1sb2NrLWtleXdvcmRzLTEgc2gtZm9udC1sb2NrLWtleXdv cmRzLTIpG1ttChtbMzFtLQkgIG5pbCBuaWwbW20KG1szMW0tCSAgKCg/LyAuICJ3IikgKD9+IC4g InciKSAoPy4gLiAidyIpICg/LSAuICJ3IikgKD9fIC4gInciKSkgbmlsG1ttChtbMzFtLQkgIChm b250LWxvY2stc3ludGFjdGljLWZhY2UtZnVuY3Rpb24bW20KG1szMW0tCSAgIC4gLCMnc2gtZm9u dC1sb2NrLXN5bnRhY3RpYy1mYWNlLWZ1bmN0aW9uKSkpG1ttChtbMzJtKxtbbQobWzMybSsbW20b WzMybSAgKGlmIChhbmQgc2gtc2NyaXB0LXVzZS10cmVlLXNpdHRlchtbbQobWzMybSsbW20bWzMy bSAgICAgICAgICAgKHRyZWVzaXQtY2FuLWVuYWJsZS1wKSkbW20KG1szMm0rG1ttG1szMm0gICAg ICAocHJvZ24bW20KG1szMm0rG1ttG1szMm0gICAgICAgIChzZXRxLWxvY2FsIGZvbnQtbG9jay1r ZXl3b3Jkcy1vbmx5IHQpG1ttChtbMzJtKxtbbRtbMzJtICAgICAgICAoc2V0cS1sb2NhbCB0cmVl c2l0LWZvbnQtbG9jay1mZWF0dXJlLWxpc3QbW20KG1szMm0rG1ttG1szMm0gICAgICAgICAgICAg ICAgICAgICcoKGJhc2ljKSAobW9kZXJhdGUpIChlbGFib3JhdGUpKSkbW20KG1szMm0rG1ttG1sz Mm0gICAgICAgIChzZXRxLWxvY2FsIHRyZWVzaXQtZm9udC1sb2NrLXNldHRpbmdzG1ttChtbMzJt KxtbbRtbMzJtICAgICAgICAgICAgICAgICAgICBzaC1zY3JpcHQtLXRyZWVzaXQtc2V0dGluZ3Mp G1ttChtbMzJtKxtbbRtbMzJtICAgICAgICAodHJlZXNpdC1mb250LWxvY2stZW5hYmxlKSkbW20K G1szMm0rG1ttG1szMm0gICAgKHNldHEgZm9udC1sb2NrLWRlZmF1bHRzG1ttChtbMzJtKxtbbRtb MzJtICAgICAgICAgIGAoKHNoLWZvbnQtbG9jay1rZXl3b3JkcxtbbQobWzMybSsbW20bWzMybSAg ICAgICAgICAgICBzaC1mb250LWxvY2sta2V5d29yZHMtMSBzaC1mb250LWxvY2sta2V5d29yZHMt MikbW20KG1szMm0rG1ttG1szMm0gICAgICAgICAgICBuaWwgbmlsG1ttChtbMzJtKxtbbRtbMzJt ICAgICAgICAgICAgKCg/LyAuICJ3IikgKD9+IC4gInciKSAoPy4gLiAidyIpICg/LSAuICJ3Iikg KD9fIC4gInciKSkgbmlsG1ttChtbMzJtKxtbbRtbMzJtICAgICAgICAgICAgKGZvbnQtbG9jay1z eW50YWN0aWMtZmFjZS1mdW5jdGlvbhtbbQobWzMybSsbW20bWzMybSAgICAgICAgICAgICAuICwj J3NoLWZvbnQtbG9jay1zeW50YWN0aWMtZmFjZS1mdW5jdGlvbikpKSkbW20KG1szMm0rG1ttCiAg IChzZXRxLWxvY2FsIHN5bnRheC1wcm9wZXJ0aXplLWZ1bmN0aW9uICMnc2gtc3ludGF4LXByb3Bl cnRpemUtZnVuY3Rpb24pG1ttCiAgIChhZGQtaG9vayAnc3ludGF4LXByb3BlcnRpemUtZXh0ZW5k LXJlZ2lvbi1mdW5jdGlvbnMbW20KICAgICAgICAgICAgICMnc3ludGF4LXByb3BlcnRpemUtbXVs dGlsaW5lICdhcHBlbmQgJ2xvY2FsKRtbbQobWzM2bUBAIC0zMTkxLDYgKzMyMDksNTEgQEAbW20g G1ttc2gtc2hlbGxjaGVjay1mbHltYWtlG1ttCiAgICAgICAocHJvY2Vzcy1zZW5kLXJlZ2lvbiBz aC0tc2hlbGxjaGVjay1wcm9jZXNzIChwb2ludC1taW4pIChwb2ludC1tYXgpKRtbbQogICAgICAg KHByb2Nlc3Mtc2VuZC1lb2Ygc2gtLXNoZWxsY2hlY2stcHJvY2VzcykpKSkbW20KIBtbbQobWzMx bS0ocHJvdmlkZSAnc2gtc2NyaXB0KRtbbQobWzMybSsbW20bWzMybTs7OyBUcmVlLXNpdHRlciBm b250LWxvY2sbW20KG1szMm0rG1ttChtbMzJtKxtbbRtbMzJtKGRlZnZhciBzaC1zY3JpcHQtLXRy ZWVzaXQtYmFzaC1rZXl3b3JkcxtbbQobWzMybSsbW20bWzMybSAgJygiY2FzZSIgImRvIiAiZG9u ZSIgImVsaWYiICJlbHNlIiAiZXNhYyIgImV4cG9ydCIgImZpIiAiZm9yIhtbbQobWzMybSsbW20b WzMybSAgICAiZnVuY3Rpb24iICJpZiIgImluIiAidW5zZXQiICJ3aGlsZSIgInRoZW4iKSkbW20K G1szMm0rG1ttChtbMzJtKxtbbRtbMzJtKGRlZnVuIHNoLXNjcmlwdC0tdHJlZXNpdC1maWx0ZXJl ZC1rZXl3b3JkcyAoYmxhY2tsaXN0KRtbbQobWzMybSsbW20bWzMybSAgIkRvY3N0cmluZyBnb2Vz IGhlcmUiG1ttChtbMzJtKxtbbRtbMzJtICAobGV0ICgoa2V5d29yZHMgKGFwcGVuZCAoc2gtZmVh dHVyZSBzaC1sZWFkaW5nLWtleXdvcmRzKRtbbQobWzMybSsbW20bWzMybSAgICAgICAgICAgICAg ICAgICAgICAgICAgKHNoLWZlYXR1cmUgc2gtb3RoZXIta2V5d29yZHMpKSkbW20KG1szMm0rG1tt G1szMm0gICAgICAgIChmaWx0ZXJlZC1saXN0KSkbW20KG1szMm0rG1ttG1szMm0gICAgKGRvbGlz dCAoaXRlbSBrZXl3b3JkcyBmaWx0ZXJlZC1saXN0KRtbbQobWzMybSsbW20bWzMybSAgICAgIChp ZiAobm90IChtZW1iZXIgaXRlbSBibGFja2xpc3QpKRtbbQobWzMybSsbW20bWzMybSAgICAgICAg ICAoc2V0cSBmaWx0ZXJlZC1saXN0IChjb25zIGl0ZW0gZmlsdGVyZWQtbGlzdCkpG1ttChtbMzJt KxtbbRtbMzJtICAgICAgICBuaWwpKSkpG1ttChtbMzJtKxtbbQobWzMybSsbW20bWzMybShkZWZ2 YXIgc2gtc2NyaXB0LS10cmVlc2l0LWJsYWNrbGlzdGVkLWtleXdvcmRzG1ttChtbMzJtKxtbbRtb MzJtICAiRG9jc3RyaW5nIGdvZXMgaGVyZSIbW20KG1szMm0rG1ttG1szMm0gICcoInRpbWUiICJj b3Byb2MiICJ0eXBlIiAidHJhcCIgImV4aXQiICJleGVjIiAiY29udGludWUiICJicmVhayIbW20K G1szMm0rG1ttG1szMm0gICJyZXR1cm4iICJsb2dvdXQiICJieWUiKSkbW20KG1szMm0rG1ttChtb MzJtKxtbbRtbMzJtKGRlZnZhciBzaC1zY3JpcHQtLXRyZWVzaXQtc2V0dGluZ3MbW20KG1szMm0r G1ttG1szMm0gICh0cmVlc2l0LWZvbnQtbG9jay1ydWxlcxtbbQobWzMybSsbW20bWzMybSAgIDps YW5ndWFnZSAnYmFzaBtbbQobWzMybSsbW20bWzMybSAgIDpmZWF0dXJlICdiYXNpYxtbbQobWzMy bSsbW20bWzMybSAgICcoOzsgUXVlcmllcyBmb3IgZnVuY3Rpb24sIHN0cmluZ3MsIGNvbW1lbnRz LCBhbmQgaGVyZWRvY3MbW20KG1szMm0rG1ttG1szMm0gICAgIChmdW5jdGlvbl9kZWZpbml0aW9u IG5hbWU6ICh3b3JkKSBAZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkbW20KG1szMm0rG1tt G1szMm0gICAgIChjb21tZW50KSBAZm9udC1sb2NrLWNvbW1lbnQtZmFjZRtbbQobWzMybSsbW20b WzMybSAgICAgWyAoc3RyaW5nKSAocmF3X3N0cmluZykoaGVyZWRvY19ib2R5KSAoaGVyZWRvY19z dGFydCkgXSBAZm9udC1sb2NrLXN0cmluZy1mYWNlKRtbbQobWzMybSsbW20bWzMybSAgIDpsYW5n dWFnZSAnYmFzaBtbbQobWzMybSsbW20bWzMybSAgIDpmZWF0dXJlICdtb2RlcmF0ZRtbbQobWzMy bSsbW20bWzMybSAgIDpvdmVycmlkZSB0G1ttChtbMzJtKxtbbRtbMzJtICAgYCg7OyBRdWVyaWVz IGZvciBrZXl3b3JkcyBhbmQgYnVpbHRpbiBjb21tYW5kcxtbbQobWzMybSsbW20bWzMybSAgICAg WyAsQChzaC1zY3JpcHQtLXRyZWVzaXQtZmlsdGVyZWQta2V5d29yZHMgc2gtc2NyaXB0LS1ibGFj a2xpc3RlZC1rZXl3b3JkcykgXSBAZm9udC1sb2NrLWtleXdvcmQtZmFjZRtbbQobWzMybSsbW20b WzMybSAgICAgKGNvbW1hbmQgbmFtZTogKGNvbW1hbmRfbmFtZRtbbQobWzMybSsbW20bWzMybSAg ICAgICgod29yZCkgQGZvbnQtbG9jay1idWlsdGluLWZhY2UbW20KG1szMm0rG1ttG1szMm0gICAg ICAgKDptYXRjaCAsKGxldCAoKGJ1aWx0aW5zIChzaC1mZWF0dXJlIHNoLWJ1aWx0aW5zKSkpG1tt ChtbMzJtKxtbbRtbMzJtICAgICAgICAgICAgICAgICAgKHJ4LXRvLXN0cmluZxtbbQobWzMybSsb W20bWzMybSAgICAgICAgICAgICAgICAgICBgKHNlcSBib2wbW20KG1szMm0rG1ttG1szMm0gICAg ICAgICAgICAgICAgICAgICAgICAgKG9yICxAYnVpbHRpbnMpG1ttChtbMzJtKxtbbRtbMzJtICAg ICAgICAgICAgICAgICAgICAgICAgIGVvbCkpKRtbbQobWzMybSsbW20bWzMybSAgICAgICAgICAg ICAgIEBmb250LWxvY2stYnVpbHRpbi1mYWNlKSkpKRtbbQobWzMybSsbW20bWzMybSAgICAgKRtb bQobWzMybSsbW20bWzMybSAgICkbW20KG1szMm0rG1ttG1szMm0gICJUcmVlLXNpdHRlciBmb250 LWxvY2sgc2V0dGluZ3MuIikbW20KIBtbbQobWzMybSsbW20bWzMybShwcm92aWRlICdzaC1zY3Jp cHQpG1ttCiA7Ozsgc2gtc2NyaXB0LmVsIGVuZHMgaGVyZRtbbQo= --000000000000afdb3005ebdd3c7e--