From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 26165 invoked from network); 12 Dec 2022 16:04:13 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 12 Dec 2022 16:04:13 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1670861054; b=NPqrnik9lsk2F9a/Yg2c284d2wazfqXwZdRZOqTJAEAum5bkD4DTWF0t7D04zT0ClsolkcLGvL DQSQZlGGCieDLPvJCNVk3cCgS66G+kibXJlWq45Y+1+1q0ygpIPrpJS62gbdLdxAQPLIY/Y7vu x6MPIcBey3+UP9Ev7tebjMHXp5+3eoklTdigq6QAVBwQkzlP7GQw/9QI3aj6i1kfprEVrMG0te CjzfnXSzyD5RavcjX91Ook7V7bl+ybgm/DSfGzEH894c4ZW4RqB3uS7yd9KkxOspo5B8+sRisM DsBjE1Dg9Ij/eJvIpUL1RYN5tHONdEsmpXL1mFiKN1LIaw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-vs1-f44.google.com) smtp.remote-ip=209.85.217.44; dkim=pass header.d=gmail.com header.s=20210112 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1670861054; bh=HTcFSZxl5zN7a4aKcjSimoQ4+PhT2MHYRpOcmMURHN8=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:To:Subject:Message-ID:Date:From:MIME-Version: DKIM-Signature:DKIM-Signature; b=mzX61qyr6KgnEVns+231kLlKjHT+DN7ddhHDKz8bwfsC0Bidc2J5lyAe0WfU7KrCN/F952o8zs atCJCQOo+jOAaJIIda81z2capwyNrxJQ6ppvWFdOn9FwqNI6Lq10haa27eJqSDdHUe4bmpdNdz P2R8NxcZ2Ni4LYRnTs8XC/G40OFvNCmV30rC/6zBtIHpvBWIml4/f9Sq986DjpVudREim0YmXI Vi7zqRnCGGZ5JpORWrvCL7vooKeBzJX5EzFsr54ZT2S5ax5XvTfP18V1nTFpJc37n3CBWP/sSs 6l/knysPo80jvDSzFJMMAum7CSpV9k4ygUxtkM4JH229iw==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:To:Subject:Message-ID: Date:From:MIME-Version:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References; bh=VZE+PVK3vpdc8h3Cb73HXQFw1LseL7ZhV9ieslyqLDI=; b=StDVsXmzKZQjFFdMkLH8Qv3e7o O5q9rpga6RJA3kkoUVmaOA9Xb7yzSW8s1a5ghP95Hukgc2LXhO9ODwKrPj2nb3Yd2LOjGVOrWKL1I tUycTLWpZilZFLfsanRmxsStYo4UuvGMfWGZB/W0d1QsMz5K77s+YQivGoE3Ju7NOp3EyNbN1b1m1 Y3R0w3RkKZGjJI4dQqVGJ1jeII55zQd7TgfQBF0cP6yt073n0n9yj0kYjgTZKgd2sn88SsKkyDkDo zgitdDFLTQDoxToMfJxkg1IlFwUsqAkQgVk723BtS0tEiZaHWo3f0Byd0UU+rsANfrKkpq649TGUW pd1IHNYA==; Received: by zero.zsh.org with local id 1p4lHp-000KW0-Ba; Mon, 12 Dec 2022 16:04:13 +0000 Authentication-Results: zsh.org; iprev=pass (mail-vs1-f44.google.com) smtp.remote-ip=209.85.217.44; dkim=pass header.d=gmail.com header.s=20210112 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-vs1-f44.google.com ([209.85.217.44]:36695) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1p4lHD-000KBw-7k; Mon, 12 Dec 2022 16:03:36 +0000 Received: by mail-vs1-f44.google.com with SMTP id c184so11695150vsc.3 for ; Mon, 12 Dec 2022 08:03:35 -0800 (PST) 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=VZE+PVK3vpdc8h3Cb73HXQFw1LseL7ZhV9ieslyqLDI=; b=l5WNmnNy9Su9Q9ki+r7NKpu3PqECIFUkf4Ftj9LJMbZBImAPJKV2GqwIW8W6/eUaSX R5baSC2cxGnaqMMXRF0r38sJoszk1eEBN+VzJ8pS8xaaNv5ppq5Wm0rGln7g74b1TnHJ hBgoQZdI7rRYLGuNQUcAgMzmWw2iGPlph4WhDjPOV/97Jga3g17+SxVeLR0gyL+KCX2u SEPZIS78UTh8e6stYcmyA3gQTjrsD59V1itrhUVIMwYvHX6uSMOT1t7GwHDN0HY+WQp7 iy+ddgnNxFO0DlC5LBkNjvLhL46+ET3A+XbqB9aA74Fnh0itVAMP2Wqavbi1quut5ysG Fkbg== 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=VZE+PVK3vpdc8h3Cb73HXQFw1LseL7ZhV9ieslyqLDI=; b=Hn5vUiOi4nHrKEXM3J6Bwapoahv7D3AWtq5tfFLj4eEyqxlP2SR88RG/lNBkIDp+sr n+7HhtOi1Z3dXyq8N9+C+jn1DsZTmiWMvutyCJH86uvuXLCEXxLRfIFZhq30wPPai+S+ +iOmEdZwYamt1QGi2I5jnK5g3WpsZbWW6tNnQMr6QhfCKu24T3VnrDIjvBFndpaXvzwP pENx81fE45OwFTPtdPxOxmPbPqqu9eBa6iozpC4mQNq0XE1MlJu3GX3dGYuWq9K7tr2l lgrpY3fKJc9bVNiqae89TG+rltcahX6YwZDp/6coUJdw+YxuQZjOMmhfqP8QBqALsvMv 5atw== X-Gm-Message-State: ANoB5pk3QW2JkGI4Wu2TR3HfTtGcNSCNQ45h2qNOPkZHg4Rkb1V3GBrW Z0lNYP/55VHOAHN5Q/we03S4SE2bkKd7Q3IXe7ZO+P+pPd4= X-Google-Smtp-Source: AA0mqf7a+v6EJAyWkMTl90pxaBuN4gJf0Qp/K5kHxv/FpWUEXD5fowTkcX4BS5x00NCMQynXHai0VIEOp1V1Nqqks3k= X-Received: by 2002:a05:6102:3da2:b0:3b5:f9a:7fae with SMTP id h34-20020a0561023da200b003b50f9a7faemr124945vsv.81.1670861013413; Mon, 12 Dec 2022 08:03:33 -0800 (PST) MIME-Version: 1.0 From: Philippe Altherr Date: Mon, 12 Dec 2022 17:03:22 +0100 Message-ID: Subject: [PATCH] Better ERR_EXIT and ERR_RETURN documentation To: Zsh hackers list Content-Type: multipart/mixed; boundary="0000000000002cd9c705efa3a56f" X-Seq: 51192 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: --0000000000002cd9c705efa3a56f Content-Type: multipart/alternative; boundary="0000000000002cd9c505efa3a56d" --0000000000002cd9c505efa3a56d Content-Type: text/plain; charset="UTF-8" Here is a patch that updates the documentation of the ERR_EXIT and ERR_RETURN options. The main improvement is to better explain when these options are ignored. As it may be a bit difficult to read it directly in the patch, I reproduced below the updated documentation: *ERR_EXIT* > If a command has a non-zero exit status, execute the tt(ZERR) > trap, if set, and exit. > The option is ignored when executing the commands following tt(while), tt(until), tt(if), or tt(elif), a pipeline beginning with tt(!), or > any command other than the last in command list containing tt(&&) or > tt(||). Hence neither `tt(if foo; then true; fi)', nor `tt(foo && > true)' trigger exit when tt(foo) returns with a non-zero exit status. > Note that if tt(foo) is a function, the option is also ignored during > its whole execution. > The option is also ignored when executing a complex command (tt(if), > tt(for), tt(while), tt(until), tt(repeat), tt(case), tt(select), > tt(always), or a list in braces) if its exit status comes from a > command executed while the option is ignored. Hence, the tt(if) > command in `tt(if true; then false && true; fi)' does not trigger > exit. > Finally, the option is also ignored while running initialization > scripts and inside tt(DEBUG) traps. In the latter case, the option is > handled specially: it is unset on entry to the trap. If the option > tt(DEBUG_BEFORE_CMD) is set, as it is by default, and the option > tt(ERR_EXIT) is found to have been set on exit, then the command for > which the tt(DEBUG) trap is being executed is skipped. The option is > restored after the trap exits. Exiting due to tt(ERR_EXIT) has certain interactions with asynchronous > jobs noted in > ifzman(the section JOBS in zmanref(zshmisc))\ > ifnzman(noderef(Jobs & Signals)). > Note this behaviour is not disabled in interactive shells --- > a non-zero status on the command line causes the shell to exit. *ERR_RETURN* If a command has a non-zero exit status, return immediately from the > enclosing function. Except for the exceptions described below, the > logic is the same as that for tt(ERR_EXIT), except that an implicit > tt(return) statement is executed instead of an tt(exit). This will > trigger an exit at the outermost level of a non-interactive script. > At the top level of an interactive shell, it will trigger a return to > the command prompt; in other words, the sequence of commands typed by > the user may be thought of as a function for this purpose. > Unlike for tt(ERR_EXIT), when a function is called while the option is > being ignored, the option is NOT ignored during the execution of the > function. Hence, if tt(foo) in `tt(foo && true)' is a function, code > inside it is considered separately: it may force a return from tt(foo) > (assuming the option remains set within tt(foo)). > Like for tt(ERR_EXIT), the option is ignored inside tt(DEBUG) traps > but it's not unset on entry to the trap and setting or unsetting it > inside the trap has no special effect. > If tt(ERR_RETURN) and tt(ERR_EXIT) are both set, the latter takes > precedence. Hence, exit rather than return is triggered when a command > has a non-zero exit status. Philippe --0000000000002cd9c505efa3a56d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Here is a patch that updates the documentation of the= =C2=A0ERR_EXIT and ERR_RETURN options. The main improvement is to better ex= plain when these options are ignored.

As it may be= a bit difficult to read it directly in the patch, I reproduced below the u= pdated documentation:

ERR_EXIT
=C2=A0
If a command has a no= n-zero exit status, execute the tt(ZERR)
trap, if set, and exit.

The option is ignored when e= xecuting the commands following tt(while),
tt(until), tt(if), or tt(elif), a pipeline be= ginning with tt(!), or
any command other than the last in command list c= ontaining tt(&&) or
tt(||).=C2=A0 Hence neither `tt(if foo; then= true; fi)', nor `tt(foo &&
true)' trigger exit when tt(= foo) returns with a non-zero exit status.
Note that if tt(foo) is a func= tion, the option is also ignored during
its whole execution.

The option is also ignored when = executing a complex command (tt(if),
tt(for), tt(while), tt(until), tt(r= epeat), tt(case), tt(select),
tt(always), or a list in braces) if its ex= it status comes from a
command executed while the option is ignored. Hen= ce, the tt(if)
command in `tt(if true; then false && true; fi)&#= 39; does not trigger
exit.

Finally, the option is also ignored while running initialization=
scripts and inside tt(DEBUG) traps.=C2=A0 In the latter case, the optio= n is
handled specially: it is unset on entry to the trap.=C2=A0 If the o= ption
tt(DEBUG_BEFORE_CMD) is set, as it is by default, and the optiontt(ERR_EXIT) is found to have been set on exit, then the command for
w= hich the tt(DEBUG) trap is being executed is skipped.=C2=A0 The option isrestored after the trap exits.

Exiting due to tt(ERR_EXIT) has certain interaction= s with asynchronous
jobs noted in
ifzman(the section JOBS in zmanref(= zshmisc))\
ifnzman(noderef(Jobs & Signals)).

Note this behaviour is not disabled in int= eractive shells ---
a non-zero status on the command line causes the she= ll to exit.

ERR_RETURN

= If a command has a non-zero exit status, return immediately from the
enc= losing function.=C2=A0 Except for the exceptions described below, the
lo= gic is the same as that for tt(ERR_EXIT), except that an implicit
tt(ret= urn) statement is executed instead of an tt(exit).=C2=A0 This will
trigg= er an exit at the outermost level of a non-interactive script.
At the to= p level of an interactive shell, it will trigger a return to
the command= prompt; in other words, the sequence of commands typed by
the user may = be thought of as a function for this purpose.

Unlike for tt(ERR_EXIT), when a function is called= while the option is
being ignored, the option is NOT ignored during the= execution of the
function.=C2=A0 Hence, if tt(foo) in `tt(foo &&= ; true)' is a function, code
inside it is considered separately: it = may force a return from tt(foo)
(assuming the option remains set within = tt(foo)).
Like for tt= (ERR_EXIT), the option is ignored inside tt(DEBUG) traps
but it's no= t unset on entry to the trap and setting or unsetting it
inside the trap= has no special effect.

If tt(ERR_RETURN) and tt(ERR_EXIT) are both set, the latter takes
pre= cedence. Hence, exit rather than return is triggered when a command
has = a non-zero exit status.

Philippe

--0000000000002cd9c505efa3a56d-- --0000000000002cd9c705efa3a56f Content-Type: text/plain; charset="US-ASCII"; name="patch-errexit-documentation-update.txt" Content-Disposition: attachment; filename="patch-errexit-documentation-update.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lbkzhe5k0 ZGlmZiAtLWdpdCBhL0RvYy9ac2gvb3B0aW9ucy55byBiL0RvYy9ac2gvb3B0aW9ucy55bwppbmRl eCBlOTI5Njk1MzEuLjY5ODk0M2ZhNyAxMDA2NDQKLS0tIGEvRG9jL1pzaC9vcHRpb25zLnlvCisr KyBiL0RvYy9ac2gvb3B0aW9ucy55bwpAQCAtMTcyMywyMiArMTcyMywzMCBAQCBwaW5kZXgoTk9F UlJFWElUKQogY2luZGV4KGV4aXQgc3RhdHVzLCB0cmFwcGluZykKIGl0ZW0odHQoRVJSX0VYSVQp ICh0dCgtZSksIGtzaDogdHQoLWUpKSkoCiBJZiBhIGNvbW1hbmQgaGFzIGEgbm9uLXplcm8gZXhp dCBzdGF0dXMsIGV4ZWN1dGUgdGhlIHR0KFpFUlIpCi10cmFwLCBpZiBzZXQsIGFuZCBleGl0LiAg VGhpcyBpcyBkaXNhYmxlZCB3aGlsZSBydW5uaW5nIGluaXRpYWxpemF0aW9uCi1zY3JpcHRzLgot Ci1UaGUgYmVoYXZpb3VyIGlzIGFsc28gZGlzYWJsZWQgaW5zaWRlIHR0KERFQlVHKSB0cmFwcy4g IEluIHRoaXMKLWNhc2UgdGhlIG9wdGlvbiBpcyBoYW5kbGVkIHNwZWNpYWxseTogaXQgaXMgdW5z ZXQgb24gZW50cnkgdG8KLXRoZSB0cmFwLiAgSWYgdGhlIG9wdGlvbiB0dChERUJVR19CRUZPUkVf Q01EKSBpcyBzZXQsCi1hcyBpdCBpcyBieSBkZWZhdWx0LCBhbmQgdGhlIG9wdGlvbiB0dChFUlJf RVhJVCkgaXMgZm91bmQgdG8gaGF2ZSBiZWVuIHNldAotb24gZXhpdCwgdGhlbiB0aGUgY29tbWFu ZCBmb3Igd2hpY2ggdGhlIHR0KERFQlVHKSB0cmFwIGlzIGJlaW5nIGV4ZWN1dGVkIGlzCi1za2lw cGVkLiAgVGhlIG9wdGlvbiBpcyByZXN0b3JlZCBhZnRlciB0aGUgdHJhcCBleGl0cy4KLQotTm9u LXplcm8gc3RhdHVzIGluIGEgY29tbWFuZCBsaXN0IGNvbnRhaW5pbmcgdHQoJiYpIG9yIHR0KHx8 KSBpcyBpZ25vcmVkCi1mb3IgY29tbWFuZHMgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuICBI ZW5jZQotCi1leGFtcGxlKGZhbHNlICYmIHRydWUpCi0KLWRvZXMgbm90IHRyaWdnZXIgZXhpdC4K K3RyYXAsIGlmIHNldCwgYW5kIGV4aXQuCisKK1RoZSBvcHRpb24gaXMgaWdub3JlZCB3aGVuIGV4 ZWN1dGluZyB0aGUgY29tbWFuZHMgZm9sbG93aW5nIHR0KHdoaWxlKSwKK3R0KHVudGlsKSwgdHQo aWYpLCBvciB0dChlbGlmKSwgYSBwaXBlbGluZSBiZWdpbm5pbmcgd2l0aCB0dCghKSwgb3IKK2Fu eSBjb21tYW5kIG90aGVyIHRoYW4gdGhlIGxhc3QgaW4gY29tbWFuZCBsaXN0IGNvbnRhaW5pbmcg dHQoJiYpIG9yCit0dCh8fCkuICBIZW5jZSBuZWl0aGVyIGB0dChpZiBmb287IHRoZW4gdHJ1ZTsg ZmkpJywgbm9yIGB0dChmb28gJiYKK3RydWUpJyB0cmlnZ2VyIGV4aXQgd2hlbiB0dChmb28pIHJl dHVybnMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLgorTm90ZSB0aGF0IGlmIHR0KGZvbykg aXMgYSBmdW5jdGlvbiwgdGhlIG9wdGlvbiBpcyBhbHNvIGlnbm9yZWQgZHVyaW5nCitpdHMgd2hv bGUgZXhlY3V0aW9uLgorCitUaGUgb3B0aW9uIGlzIGFsc28gaWdub3JlZCB3aGVuIGV4ZWN1dGlu ZyBhIGNvbXBsZXggY29tbWFuZCAodHQoaWYpLAordHQoZm9yKSwgdHQod2hpbGUpLCB0dCh1bnRp bCksIHR0KHJlcGVhdCksIHR0KGNhc2UpLCB0dChzZWxlY3QpLAordHQoYWx3YXlzKSwgb3IgYSBs aXN0IGluIGJyYWNlcykgaWYgaXRzIGV4aXQgc3RhdHVzIGNvbWVzIGZyb20gYQorY29tbWFuZCBl eGVjdXRlZCB3aGlsZSB0aGUgb3B0aW9uIGlzIGlnbm9yZWQuIEhlbmNlLCB0aGUgdHQoaWYpCitj b21tYW5kIGluIGB0dChpZiB0cnVlOyB0aGVuIGZhbHNlICYmIHRydWU7IGZpKScgZG9lcyBub3Qg dHJpZ2dlcgorZXhpdC4KKworRmluYWxseSwgdGhlIG9wdGlvbiBpcyBhbHNvIGlnbm9yZWQgd2hp bGUgcnVubmluZyBpbml0aWFsaXphdGlvbgorc2NyaXB0cyBhbmQgaW5zaWRlIHR0KERFQlVHKSB0 cmFwcy4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIG9wdGlvbiBpcworaGFuZGxlZCBzcGVjaWFs bHk6IGl0IGlzIHVuc2V0IG9uIGVudHJ5IHRvIHRoZSB0cmFwLiAgSWYgdGhlIG9wdGlvbgordHQo REVCVUdfQkVGT1JFX0NNRCkgaXMgc2V0LCBhcyBpdCBpcyBieSBkZWZhdWx0LCBhbmQgdGhlIG9w dGlvbgordHQoRVJSX0VYSVQpIGlzIGZvdW5kIHRvIGhhdmUgYmVlbiBzZXQgb24gZXhpdCwgdGhl biB0aGUgY29tbWFuZCBmb3IKK3doaWNoIHRoZSB0dChERUJVRykgdHJhcCBpcyBiZWluZyBleGVj dXRlZCBpcyBza2lwcGVkLiAgVGhlIG9wdGlvbiBpcworcmVzdG9yZWQgYWZ0ZXIgdGhlIHRyYXAg ZXhpdHMuCiAKIEV4aXRpbmcgZHVlIHRvIHR0KEVSUl9FWElUKSBoYXMgY2VydGFpbiBpbnRlcmFj dGlvbnMgd2l0aCBhc3luY2hyb25vdXMKIGpvYnMgbm90ZWQgaW4KQEAgLTE3NTYsMjggKzE3NjQs MjcgQEAgY2luZGV4KGZ1bmN0aW9uIHJldHVybiwgb24gZXJyb3IpCiBjaW5kZXgocmV0dXJuIGZy b20gZnVuY3Rpb24sIG9uIGVycm9yKQogaXRlbSh0dChFUlJfUkVUVVJOKSkoCiBJZiBhIGNvbW1h bmQgaGFzIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMsIHJldHVybiBpbW1lZGlhdGVseSBmcm9tIHRo ZQotZW5jbG9zaW5nIGZ1bmN0aW9uLiAgVGhlIGxvZ2ljIGlzIHNpbWlsYXIgdG8gdGhhdCBmb3Ig dHQoRVJSX0VYSVQpLAotZXhjZXB0IHRoYXQgYW4gaW1wbGljaXQgdHQocmV0dXJuKSBzdGF0ZW1l bnQgaXMgZXhlY3V0ZWQgaW5zdGVhZCBvZiBhbgotdHQoZXhpdCkuICBUaGlzIHdpbGwgdHJpZ2dl ciBhbiBleGl0IGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgb2YgYQotbm9uLWludGVyYWN0aXZlIHNj cmlwdC4gIEF0IHRoZSB0b3AgbGV2ZWwgb2YgYW4gaW50ZXJhY3RpdmUgc2hlbGwsCi1pdCB3aWxs IHRyaWdnZXIgYSByZXR1cm4gdG8gdGhlIGNvbW1hbmQgcHJvbXB0OyBpbiBvdGhlcgotd29yZHMs IHRoZSBzZXF1ZW5jZSBvZiBjb21tYW5kcyB0eXBlZCBieSB0aGUgdXNlciBtYXkgYmUKLXRob3Vn aHQgb2YgYXMgYSBmdW5jdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotCi1Ob3JtYWxseSB0aGlzIG9w dGlvbiBpbmhlcml0cyB0aGUgYmVoYXZpb3VyIG9mIHR0KEVSUl9FWElUKSB0aGF0Ci1jb2RlIGZv bGxvd2VkIGJ5IGB0dCgmJiknIGB0dCh8fCknIGRvZXMgbm90IHRyaWdnZXIgYSByZXR1cm4uICBI ZW5jZQotaW4gdGhlIGZvbGxvd2luZzoKLQotZXhhbXBsZShzdW1taXQgfHwgdHJ1ZSkKLQotbm8g cmV0dXJuIGlzIGZvcmNlZCBhcyB0aGUgY29tYmluZWQgZWZmZWN0IGFsd2F5cyBoYXMgYSB6ZXJv IHJldHVybgotc3RhdHVzLgotCi1Ob3RlLiBob3dldmVyLCB0aGF0IGlmIHR0KHN1bW1pdCkgaW4g dGhlIGFib3ZlIGV4YW1wbGUgaXMgaXRzZWxmIGEKLWZ1bmN0aW9uLCBjb2RlIGluc2lkZSBpdCBp cyBjb25zaWRlcmVkIHNlcGFyYXRlbHk6IGl0IG1heSBmb3JjZSBhIHJldHVybgotZnJvbSB0dChz dW1taXQpIChhc3N1bWluZyB0aGUgb3B0aW9uIHJlbWFpbnMgc2V0IHdpdGhpbiB0dChzdW1taXQp KSwgYnV0Ci1ub3QgZnJvbSB0aGUgZW5jbG9zaW5nIGNvbnRleHQuICBUaGlzIGJlaGF2aW91ciBp cyBkaWZmZXJlbnQgZnJvbQotdHQoRVJSX0VYSVQpIHdoaWNoIGlzIHVuYWZmZWN0ZWQgYnkgZnVu Y3Rpb24gc2NvcGUuCitlbmNsb3NpbmcgZnVuY3Rpb24uICBFeGNlcHQgZm9yIHRoZSBleGNlcHRp b25zIGRlc2NyaWJlZCBiZWxvdywgdGhlCitsb2dpYyBpcyB0aGUgc2FtZSBhcyB0aGF0IGZvciB0 dChFUlJfRVhJVCksIGV4Y2VwdCB0aGF0IGFuIGltcGxpY2l0Cit0dChyZXR1cm4pIHN0YXRlbWVu dCBpcyBleGVjdXRlZCBpbnN0ZWFkIG9mIGFuIHR0KGV4aXQpLiAgVGhpcyB3aWxsCit0cmlnZ2Vy IGFuIGV4aXQgYXQgdGhlIG91dGVybW9zdCBsZXZlbCBvZiBhIG5vbi1pbnRlcmFjdGl2ZSBzY3Jp cHQuCitBdCB0aGUgdG9wIGxldmVsIG9mIGFuIGludGVyYWN0aXZlIHNoZWxsLCBpdCB3aWxsIHRy aWdnZXIgYSByZXR1cm4gdG8KK3RoZSBjb21tYW5kIHByb21wdDsgaW4gb3RoZXIgd29yZHMsIHRo ZSBzZXF1ZW5jZSBvZiBjb21tYW5kcyB0eXBlZCBieQordGhlIHVzZXIgbWF5IGJlIHRob3VnaHQg b2YgYXMgYSBmdW5jdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgorCitVbmxpa2UgZm9yIHR0KEVSUl9F WElUKSwgd2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGlsZSB0aGUgb3B0aW9uIGlzCitiZWlu ZyBpZ25vcmVkLCB0aGUgb3B0aW9uIGlzIE5PVCBpZ25vcmVkIGR1cmluZyB0aGUgZXhlY3V0aW9u IG9mIHRoZQorZnVuY3Rpb24uICBIZW5jZSwgaWYgdHQoZm9vKSBpbiBgdHQoZm9vICYmIHRydWUp JyBpcyBhIGZ1bmN0aW9uLCBjb2RlCitpbnNpZGUgaXQgaXMgY29uc2lkZXJlZCBzZXBhcmF0ZWx5 OiBpdCBtYXkgZm9yY2UgYSByZXR1cm4gZnJvbSB0dChmb28pCisoYXNzdW1pbmcgdGhlIG9wdGlv biByZW1haW5zIHNldCB3aXRoaW4gdHQoZm9vKSkuCisKK0xpa2UgZm9yIHR0KEVSUl9FWElUKSwg dGhlIG9wdGlvbiBpcyBpZ25vcmVkIGluc2lkZSB0dChERUJVRykgdHJhcHMKK2J1dCBpdCdzIG5v dCB1bnNldCBvbiBlbnRyeSB0byB0aGUgdHJhcCBhbmQgc2V0dGluZyBvciB1bnNldHRpbmcgaXQK K2luc2lkZSB0aGUgdHJhcCBoYXMgbm8gc3BlY2lhbCBlZmZlY3QuCisKK0lmIHR0KEVSUl9SRVRV Uk4pIGFuZCB0dChFUlJfRVhJVCkgYXJlIGJvdGggc2V0LCB0aGUgbGF0dGVyIHRha2VzCitwcmVj ZWRlbmNlLiBIZW5jZSwgZXhpdCByYXRoZXIgdGhhbiByZXR1cm4gaXMgdHJpZ2dlcmVkIHdoZW4g YSBjb21tYW5kCitoYXMgYSBub24temVybyBleGl0IHN0YXR1cy4KICkKIHBpbmRleChFVkFMX0xJ TkVOTykKIHBpbmRleChOT19FVkFMX0xJTkVOTykK --0000000000002cd9c705efa3a56f--