From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: from zero.zsh.org (zero.zsh.org [IPv6:2a02:898:31:0:48:4558:7a:7368]) by inbox.vuxu.org (Postfix) with ESMTP id D2E1421632 for ; Sat, 30 Mar 2024 22:47:39 +0100 (CET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1711835259; b=ADyi/VSyt9AgnubysZ3j9izyt7PkZqThfpi4UaYGwalXPHWU1kQckXhT7CevuRTF1kWlMgX537 d6hbAQLNvhD2K5iW5gRU3Bb/KnkmWycpJiQfMKmpbHPWbnFTRNlleFy8h1epOf7RzWysyo8Ibv +pwSI1xudVF4FEdL6djvvK3Zjcd3WggxxE5p2V5Ui9/PH3sHOMwmtiUIpMqQlJtJ3Dr7tm0l2/ Vn9bOc/TCrzBtPyJkoo79GH8NXsrp40xXYEmrSZ4T0ZTv5ixiF4ax8sK0ss4bqutQmHrKSjeKP ujhT44HlvnTBeIuSy+n5ARXDxDsOGKI3oZ8+jR1ITg7AYg==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ej1-f42.google.com) smtp.remote-ip=209.85.218.42; dkim=pass header.d=brasslantern-com.20230601.gappssmtp.com header.s=20230601 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1711835259; bh=EE/nNxPiTFxq4/ZZO1pZjdvQD70PV/Lawn8bwEvsYMw=; 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=V5fMPceEWde3h6yC6IVjPK7MlKfTlSRS4y1u3pbLEEmWFuB4Iw4kPXxEmsbp91yb+AbKJnGyCY lOwqrD5eCi/l8VzWk4dO/c3ocHtFDdy8G5CHEXFb1lb5gdW+iSvg1MOjAfy071yrhBE9Ll9/Rk 49lnqjQF5DVhX4Gq1lBtWgvRGkm0SeyWS87N7QD3a8haZ4rrykbHg/LY75oP4EGpldHW9a25/o 0LcvXfc8Blw5od2fkBxjq/DqAxNvLPqBoxMo84196zO/Xev0h3ijB61BJlx20WBvvaYjeXzzkJ qzk2a8BoaqD7VXr/dypyPoBLVS4QpVtxSMwca7DPTkH7Hg==; 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=tlmuIWgXJjvA1YRuu/oB+nJDOJ1RpX0VjPmJYnm8hfQ=; b=c7t8iIYycCQtmFk0rGkoueFsEq flA8LYnkKWQaEimT9IpPdK2NrtiFZnQoAOnKtjJ39cSNpwDZauhdTdyUMF57lj603PqmoKG0HIPmp HmYM71F4h8M5kKsYmPOLExK9rw4H2UPFRYYqU6TjXmH10sihkBZn6CCUAR54hnex+bTxBjlQbFJu2 NJWMqxVeeoeau1lQsl8a3of4P0m+M53d6QqaKF2L/Mn9AJ6yOkQcwmW74TFCRh2pnAX+aap25Vzv6 7M8x5IsR5mrkvhgF1jYT71Ok3PHbmxiuki8QlGPlkrUnar2Fyizeq4Yho1FIpVK4Pwpb9IbuLnF0+ icE0qBiA==; Received: by zero.zsh.org with local id 1rqgY7-0000qI-DD; Sat, 30 Mar 2024 21:47:39 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ej1-f42.google.com) smtp.remote-ip=209.85.218.42; dkim=pass header.d=brasslantern-com.20230601.gappssmtp.com header.s=20230601 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none Received: from mail-ej1-f42.google.com ([209.85.218.42]:55706) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1rqgXm-0000XB-2k; Sat, 30 Mar 2024 21:47:19 +0000 Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-a4644bde1d4so384812766b.3 for ; Sat, 30 Mar 2024 14:47:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20230601.gappssmtp.com; s=20230601; t=1711835237; x=1712440037; darn=zsh.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=tlmuIWgXJjvA1YRuu/oB+nJDOJ1RpX0VjPmJYnm8hfQ=; b=FJYWyFUvdV7BwkUKX8YuNbzq+Sd+Klz+jOb6ot/JvHF60oRWicnXA3ExCtGeVeRpa7 2ptFNsYx+MVFQ7cdUTplCXxLzkU/h1+yjEkCDaNiIjhkBRDMXPyBZbKbR79sw0fgF+W4 dIWQPKJaYRC7yvzK4nUpBQXctKnTQr+Rr0qYAXLf4SADPWN26rTSKBh5T27gVc9UrndS rZqUSDoXLI57KmFi+FQUeHhp2f5fz/xijDh4NhCyIBPb1yRPt713iTB50+6lUGZXO+f1 QFiH8b3pK5Jk+ON/Z7k40m6b8WdUCm2eiyjolY5EJyVbgxgKrKM5Lfi5r75UyikGjsLU A29w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711835237; x=1712440037; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=tlmuIWgXJjvA1YRuu/oB+nJDOJ1RpX0VjPmJYnm8hfQ=; b=HMwxsnVJnvF7NaTCnCwyfrGDCgNXUM7kPEbF8Wb8EBqriiiqGyZ7az0ZUS9mHuoolr 5xW8OIOcPX+yubE1O0wHXv1BSZJdb/zzxefRezLhPOejE4ehVGxuVVb31fgOEFSIN8EF Tidxii2iiILVMhqiAMuvmuC93m+rSJYPIHh6uu0ReMz6ihaWi1x+LGu/eW9+tRyl1V0t PiWSmBDaA57Zy2GdvNcCSuQ+5FKyVC1vEivtXQGVMzLav3alpvtl7HHudIXIkw2el++Z kkWbql6FL18l7emi7Kef5I0w2+tLb+ZQ7gFdfAOoA1KXPuVoPB0aDWUkkL1/nqHYds1W GOhQ== X-Gm-Message-State: AOJu0YwelYU/UMbBg61rWFvRERKqgfM7NfYBHbwvLlXC29UQINxjO+x/ Hi93IpKS+SiIp6TbDS5VYNsl6lhn1jZ1DGrGlq089is4Y7P9laA3LC+NsFOwwFpL1o27GPhm2jx 2Dq62B2GNS66yhJTE8iAAX58z5sP+DJSZn+pOumU9yk1E3D5yJ2J8 X-Google-Smtp-Source: AGHT+IFXKBg7/XED7k6A9qsSJ+GUfCEqq5MRp0Xyv0XLaq8VGRVpFcjNU8/P/EinLkmaBvD0yJRbfoTw9lPC4l7dq+A= X-Received: by 2002:a17:906:d299:b0:a4e:1c94:aaa4 with SMTP id ay25-20020a170906d29900b00a4e1c94aaa4mr3592940ejb.63.1711835237033; Sat, 30 Mar 2024 14:47:17 -0700 (PDT) MIME-Version: 1.0 From: Bart Schaefer Date: Sat, 30 Mar 2024 14:47:06 -0700 Message-ID: Subject: [PATCH] Improved implementation of ${{var} cmd} etc. To: Zsh hackers list Content-Type: multipart/mixed; boundary="00000000000037d5950614e7b3f4" X-Seq: 52864 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: --00000000000037d5950614e7b3f4 Content-Type: text/plain; charset="UTF-8" This REPLACES the patch in workers/52831 for changing ${|var|cmd} to ${{var} cmd}. Besides generally that, it implements the following (also mentioning changes vs 52831): Clarify or expand comments, use more meaningful variable names. Refactor to avoid scanning "{var} cmd" three times to separate "var" from "cmd". Require space after {var} to limit vulnerability to ${{var}} vs ${${var}} typos. Lift tokenize() block to avoid code duplication. Signal handling paranoia. Update tests and add additional special case tests. Now only ${|cmd} has magic local $REPLY, rather than all 3 forms. Some details about the latter: I've stepped onto the slippery slope of having a ".zsh" namespace for internal parameters. ${{var} cmd} doesn't use a local at all now, and ${|cmd} creates a local $REPLY as before, but ${ cmd } creates a local readonly ${.zsh.cmdsubst}. Making it readonly (and unset) prevents user code in cmd from attempting to use that name nefariously. After executing the cmd, the readonly state is cleared and the output is assigned to it. Then later when we're ready to substitute the value and apply any state passed down from ${(flags)${|cmd}} etc., each of {var} or REPLY or .zsh.cmdsubst can be referenced the same way. There's probably some optimization to be had, i.e., avoid assignment only to fetch the value back immediately, but the two forms where user code assigns to a parameter are required to work that way, so it's no worse to have the stdout branch do the same under the hood. RE the "edge cases" in the other thread: ${{var}} is a bad substitution because of the required space, noted above. ${{var} }, ${{var};}, ${{} }, etc., substitute the empty string rather than erroring. ${{REPLY[2]} REPLY=abc} now substitutes "b" because REPLY is not implicitly local. This does not yet update the Doc, nor do anything about the "break" situation. --00000000000037d5950614e7b3f4 Content-Type: text/plain; charset="US-ASCII"; name="nofork-doublecurly-p2.txt" Content-Disposition: attachment; filename="nofork-doublecurly-p2.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_luekfdmq0 ZGlmZiAtLWdpdCBhL1NyYy9sZXguYyBiL1NyYy9sZXguYwppbmRleCAzMWIxMzBiMDcuLjcwMGFm MmRhMSAxMDA2NDQKLS0tIGEvU3JjL2xleC5jCisrKyBiL1NyYy9sZXguYwpAQCAtMTQyMyw3ICsx NDIzLDcgQEAgZ2V0dG9rc3RyKGludCBjLCBpbnQgc3ViKQogCWlmIChsZXhzdG9wKQogCSAgICBi cmVhazsKIAlpZiAoIWNtZHN1YnN0ICYmIGluX2JyYWNlX3BhcmFtICYmIGFjdCA9PSBMWDJfU1RS SU5HICYmCi0JICAgIChjID09ICd8JyB8fCBjID09IEJhciB8fCBpbmJsYW5rKGMpKSkgeworCSAg ICAoYyA9PSAnfCcgfHwgYyA9PSBCYXIgfHwgYyA9PSAneycgfHwgYyA9PSBJbmJyYWNlIHx8IGlu YmxhbmsoYykpKSB7CiAJICAgIGNtZHN1YnN0ID0gaW5fYnJhY2VfcGFyYW07CiAJICAgIGNtZHB1 c2goQ1NfQ1VSU0gpOwogCX0gZWxzZSBpZiAoaW5fcGF0dGVybiA9PSAyICYmIGMgIT0gJy8nKQpk aWZmIC0tZ2l0IGEvU3JjL3N1YnN0LmMgYi9TcmMvc3Vic3QuYwppbmRleCA5ZDIwYTJkMGUuLmYw ZDZjN2E3YiAxMDA2NDQKLS0tIGEvU3JjL3N1YnN0LmMKKysrIGIvU3JjL3N1YnN0LmMKQEAgLTE4 NjYsMTAgKzE4NjYsMTEgQEAgcGFyYW1zdWJzdChMaW5rTGlzdCBsLCBMaW5rTm9kZSBuLCBjaGFy ICoqc3RyLCBpbnQgcXQsIGludCBwZl9mbGFncywKICAgICAgKiBqb2luaW5nIHRoZSBhcnJheSBp bnRvIGEgc3RyaW5nIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGtzaC9iYXNoKS4KICAgICAgKi8K ICAgICBpbnQgcXVvdGVkX2FycmF5X3dpdGhfb2Zmc2V0ID0gMDsKLSAgICAvKiBJbmRpY2F0ZXMg JHt8Li4uO30gKi8KLSAgICBjaGFyICpycGx5dmFyID0gTlVMTDsKLSAgICAvKiBJbmRpY2F0ZXMg JHsgLi4uIDt9ICovCi0gICAgY2hhciAqcnBseXRtcCA9IE5VTEw7CisgICAgLyoKKyAgICAgKiBO b2Zvcmsgc3Vic3RpdHV0aW9uIGNvbnRyb2xzCisgICAgICovCisgICAgY2hhciAqcnBseXZhciA9 IE5VTEw7ICAgIC8qIEluZGljYXRlcyAke3wuLi47fSBvciAke3t2YXJ9IC4uLjt9ICovCisgICAg Y2hhciAqcnBseXRtcCA9IE5VTEw7ICAgIC8qIEluZGljYXRlcyAkeyAuLi4gO30gKi8KIAogICAg ICpzKysgPSAnXDAnOwogICAgIC8qCkBAIC0xODk3LDE0ICsxODk4LDE2IEBAIHBhcmFtc3Vic3Qo TGlua0xpc3QgbCwgTGlua05vZGUgbiwgY2hhciAqKnN0ciwgaW50IHF0LCBpbnQgcGZfZmxhZ3Ms CiAgICAgICogZmxhZ3MgaW4gcGFyZW50aGVzZXMsIGJ1dCBhbHNvIG9uZSBrc2ggaGFjay4KICAg ICAgKi8KICAgICBpZiAoYyA9PSBJbmJyYWNlKSB7Ci0JLyogVGhlIGNvbW1hbmQgc3RyaW5nIHRv IGJlIHJ1biBieSAke3wuLi47fSAqLwotCWNoYXIgKmNtZGFyZyA9IE5VTEw7CisJLyogRm9yIHBy b2Nlc3Npbmcgbm9mb3JrIGNvbW1hbmQgc3Vic3RpdHV0aW9uIHN0cmluZyAqLworCWNoYXIgKmNt ZGFyZyA9IE5VTEwsICplbmR2YXIgPSBOVUxMLCBpbmNoYXIgPSAqKytzOworCWNoYXIgKm91dGJy YWNlcCA9IHMsIHNhdiA9ICpzOworCVBhcmFtIHJwbHlwbSA9IE5VTEw7CiAJc2l6ZV90IHNsZW4g PSAwOwogCWludCB0cmltID0gKCFFTVVMQVRJT04oRU1VTEFURV9aU0gpKSA/IDIgOiAhcXQ7Ci0J aW5icmFjZSA9IDE7Ci0JcysrOwogCi0gICAgICAgIC8qIFNob3J0LXBhdGggZm9yIHRoZSBub2Zv cmsgY29tbWFuZCBzdWJzdGl0dXRpb24gJHt8Y21kO30KKwlpbmJyYWNlID0gMTsJLyogT3V0ZXIg c2NvcGUgYm9vbGVhbiwgc2VlIGFib3ZlICovCisKKyAgICAgICAgLyogSGFuZGxpbmcgZm9yIG5v Zm9yayBjb21tYW5kIHN1YnN0aXR1dGlvbiBlLmcuICR7fGNtZDt9CiAJICogU2VlIG90aGVyIGNv bW1lbnRzIGFib3V0IGtsdWRnZXMgZm9yIHdoeSB0aGlzIGlzIGhlcmUuCiAJICoKICAgICAgICAg ICogVGhlIGNvbW1hbmQgc3RyaW5nIGlzIGV4dHJhY3RlZCBhbmQgZXhlY3V0ZWQsIGFuZCB0aGUK QEAgLTE5MTMsNDggKzE5MTYsNzcgQEAgcGFyYW1zdWJzdChMaW5rTGlzdCBsLCBMaW5rTm9kZSBu LCBjaGFyICoqc3RyLCBpbnQgcXQsIGludCBwZl9mbGFncywKICAgICAgICAgICogc2hvdWxkIG5v dCBiZSBwYXJ0IG9mIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGluIGFueSBjYXNlLgogICAgICAgICAg KiBVc2UgJHsoVSkke3xjbWQ7fX0gYXMgeW91IHdvdWxkIGZvciAkeyhVKSQoY21kOyl9LgogCSAq LwotCWlmICgqcyA9PSAnfCcgfHwgKnMgPT0gQmFyIHx8IGluYmxhbmsoKnMpKSB7Ci0JICAgIGNo YXIgKm91dGJyYWNlcCA9IHM7Ci0JICAgIGNoYXIgc2F2ID0gKnM7CisJaWYgKGluY2hhciA9PSAn fCcgfHwgaW5jaGFyID09IEJhciB8fCBpbmJsYW5rKGluY2hhcikpIHsKIAkgICAgKnMgPSBJbmJy YWNlOwotCSAgICBpZiAoc2tpcHBhcmVucyhJbmJyYWNlLCBPdXRicmFjZSwgJm91dGJyYWNlcCkg PT0gMCkgeworCSAgICBpZiAoc2tpcHBhcmVucyhJbmJyYWNlLCBPdXRicmFjZSwgJm91dGJyYWNl cCkgPT0gMCkKIAkJc2xlbiA9IG91dGJyYWNlcCAtIHMgLSAxOwotCQlpZiAoKCpzID0gc2F2KSAh PSBCYXIpIHsKLQkJICAgIHNhdiA9ICpvdXRicmFjZXA7Ci0JCSAgICAqb3V0YnJhY2VwID0gJ1ww JzsKLQkJICAgIHRva2VuaXplKHMpOwotCQkgICAgKm91dGJyYWNlcCA9IHNhdjsKKwkgICAgKnMg PSBzYXY7CisJICAgIGlmIChpbmNoYXIgPT0gJ3wnKQorCQlpbmNoYXIgPSBCYXI7CS8qIFNpbXBs aWZ5IGxhdGVyIGNvbXBhcmVzICovCisJfSBlbHNlIGlmIChpbmNoYXIgPT0gJ3snIHx8IGluY2hh ciA9PSBJbmJyYWNlKSB7CisJICAgICpzID0gSW5icmFjZTsKKwkgICAgaWYgKChvdXRicmFjZXAg PSBpdHlwZV9lbmQocysxLCBJTkFNRVNQQywgMCkpKSB7CisJCWlmICgqb3V0YnJhY2VwID09IElu YnJhY2sgJiYKKwkJICAgIChvdXRicmFjZXAgPSBwYXJzZV9zdWJzY3JpcHQoKytvdXRicmFjZXAs IDEsICddJykpKQorCQkgICAgKytvdXRicmFjZXA7CisJICAgIH0KKworCSAgICAvKiBJZiB3ZSBy ZWFjaGVkIHRoZSBmaXJzdCBjbG9zZSBicmFjZSwgZmluZCB0aGUgbGFzdCAqLworCSAgICBpZiAo b3V0YnJhY2VwICYmICpvdXRicmFjZXAgPT0gT3V0YnJhY2UpIHsKKwkJY2hhciBvdXRjaGFyID0g aW5jaGFyID09IEluYnJhY2UgPyBPdXRicmFjZSA6ICd9JzsKKwkJZW5kdmFyID0gb3V0YnJhY2Vw Kys7CisKKwkJLyogUmVxdWlyZSBzcGFjZSB0byBhdm9pZCAke3t2YXJ9fSB0eXBvIGZvciAkeyR7 dmFyfX0gKi8KKwkJaWYgKCFpbmJsYW5rKCpvdXRicmFjZXApKSB7CisJCSAgICB6ZXJyKCJiYWQg c3Vic3RpdHV0aW9uIik7CisJCSAgICByZXR1cm4gTlVMTDsKIAkJfQorCisJCSplbmR2YXIgPSAn fCc7CS8qIEFsbW9zdCBhbnl0aGluZyBidXQgYnJhY2VzL2JyYWNrZXRzICovCisJCW91dGJyYWNl cCA9IHM7CisJCWlmIChza2lwcGFyZW5zKEluYnJhY2UsIG91dGNoYXIsICZvdXRicmFjZXApID09 IDApCisJCSAgICAqZW5kdmFyID0gT3V0YnJhY2U7CisJCWVsc2UgewkvKiBOZXZlciBoYXBwZW5z PyAqLworCQkgICAgKmVuZHZhciA9IG91dGNoYXI7CisJCSAgICBvdXRicmFjZXAgPSBlbmR2YXIg KyAxOworCQl9CisJCXNsZW4gPSBvdXRicmFjZXAgLSBzIC0gMTsKKwkJaWYgKGluY2hhciAhPSBJ bmJyYWNlKQorCQkgICAgb3V0YnJhY2VwWy0xXSA9IE91dGJyYWNlOworCQkqcyA9IHNhdjsKKwkJ aW5jaGFyID0gSW5icmFjZTsJLyogU2ltcGxpZnkgbGF0ZXIgY29tcGFyZXMgKi8KKwkgICAgfSBl bHNlIHsKKwkJemVycigiYmFkIHN1YnN0aXR1dGlvbiIpOworCQlyZXR1cm4gTlVMTDsKIAkgICAg fQogCX0KIAlpZiAoc2xlbiA+IDEpIHsKIAkgICAgY2hhciAqb3V0YnJhY2VwID0gcyArIHNsZW47 CisJICAgIGlmICghaXRvaygqcykgfHwgaW5ibGFuayhpbmNoYXIpKSB7CisJCS8qIFRoaXMgdG9r ZW5pemUoKSBpcyBpbXBvcnRhbnQgKi8KKwkJY2hhciBzYXYgPSAqb3V0YnJhY2VwOworCQkqb3V0 YnJhY2VwID0gJ1wwJzsKKwkJdG9rZW5pemUocyk7CisJCSpvdXRicmFjZXAgPSBzYXY7CisJICAg IH0KIAkgICAgaWYgKCpvdXRicmFjZXAgPT0gT3V0YnJhY2UpIHsKLQkJaWYgKChycGx5dmFyID0g aXR5cGVfZW5kKHMrMSwgSU5BTUVTUEMsIDApKSkgewotCQkgICAgaWYgKCpycGx5dmFyID09IElu YnJhY2sgJiYKLQkJCShycGx5dmFyID0gcGFyc2Vfc3Vic2NyaXB0KCsrcnBseXZhciwgMSwgJ10n KSkpCi0JCQkrK3JwbHl2YXI7Ci0JCX0KLQkJaWYgKHJwbHl2YXIgPT0gcysxICYmICpycGx5dmFy ID09IEJhcikgewotCQkgICAgLyogSXMgJHt8fC4uLn0gYSBzdWJ0aXR1dGlvbiBlcnJvciBvciBh IHN5bnRheCBlcnJvcj8KLQkJICAgIHplcnIoImJhZCBzdWJzdGl0dXRpb24iKTsKLQkJICAgIHJl dHVybiBOVUxMOwotCQkgICAgKi8KKwkJaWYgKGVuZHZhciA9PSBzKzEpIHsKKwkJICAgIC8qIEZv ciBjb25zaXN0ZW5jeSB3aXRoICR7fSB3ZSBhbGxvdyAke3t9Li4ufSAqLwogCQkgICAgcnBseXZh ciA9IE5VTEw7CiAJCX0KLQkJaWYgKHJwbHl2YXIgJiYgKnJwbHl2YXIgPT0gQmFyKSB7Ci0JCSAg ICBjbWRhcmcgPSBkdXBzdHJwZngocnBseXZhcisxLCBvdXRicmFjZXAtcnBseXZhci0xKTsKLQkJ ICAgIHJwbHl2YXIgPSBkdXBzdHJwZngocysxLHJwbHl2YXItcy0xKTsKKwkJaWYgKGVuZHZhciAm JiAqZW5kdmFyID09IE91dGJyYWNlKSB7CisJCSAgICBjbWRhcmcgPSBkdXBzdHJwZngoZW5kdmFy KzEsIG91dGJyYWNlcC1lbmR2YXItMSk7CisJCSAgICBycGx5dmFyID0gZHVwc3RycGZ4KHMrMSxl bmR2YXItcy0xKTsKIAkJfSBlbHNlIHsKIAkJICAgIGNtZGFyZyA9IGR1cHN0cnBmeChzKzEsIG91 dGJyYWNlcC1zLTEpOwogCQkgICAgcnBseXZhciA9ICJSRVBMWSI7CiAJCX0KLQkJaWYgKGluYmxh bmsoKnMpKSB7CisJCWlmIChpbmJsYW5rKGluY2hhcikpIHsKIAkJICAgIC8qCi0JCSAgICAgKiBB ZG1pdHRlZGx5IGEgaGFjay4gIFRha2UgYWR2YW50YWdlIG9mIHRoZSBlbmZvcmNlZAotCQkgICAg ICogbG9jYWxpdHkgb2YgUkVQTFkgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgJCg8ZmlsZSkgdG8KKwkJ ICAgICAqIEFkbWl0dGVkbHkgYSBoYWNrLiAgVGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGFkZGVkCisJ CSAgICAgKiBwYXJhbWV0ZXIgc2NvcGUgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgJCg8ZmlsZSkgdG8K IAkJICAgICAqIGNvbnN0cnVjdCBhIGNvbW1hbmQgdG8gd3JpdGUvcmVhZCBhIHRlbXBvcmFyeSBm aWxlLgotCQkgICAgICogVGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgaGFuZGxpbmcg b2YgJFJFUExZCisJCSAgICAgKiBUaGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBwYXJh bWV0ZXIgaGFuZGxpbmcKIAkJICAgICAqIHRvIG1hbmFnZSB3b3JkIHNwbGl0dGluZywgZXhwYW5z aW9uIGZsYWdzLCBldGMuCiAJCSAgICAgKi8KIAkJICAgIGNoYXIgKm91dGZtdCA9ICI+fCAlcyB7 XG4lc1xuO30iOwkvKiAxMyAqLwpAQCAtMTk3NywyMiArMjAwOSwzOSBAQCBwYXJhbXN1YnN0KExp bmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIgKipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAog CX0KIAogCWlmIChycGx5dmFyKSB7Ci0JICAgIFBhcmFtIHBtOwotCSAgICAvKiBjaGFyICpycGx5 dmFsID0gZ2V0c3BhcmFtKCJSRVBMWSIpOyAqLworCSAgICAvKiBjaGFyICpycGx5dmFsID0gZ2V0 c3BhcmFtKCJSRVBMWSIpOyAgY2YuIEZ1dHVyZT8gYmVsb3cgKi8KIAkgICAgc3RhcnRwYXJhbXNj b3BlKCk7IC8qICJsb2NhbCIgYmVoYXZlcyBhcyBpZiBpbiBhIGZ1bmN0aW9uICovCi0JICAgIHBt ID0gY3JlYXRlcGFyYW0oIlJFUExZIiwgUE1fTE9DQUx8UE1fVU5TRVQpOwotCSAgICBpZiAocG0p CS8qIFNob3VsZG4ndCBjcmVhdGVwYXJhbSgpIGRvIHRoaXM/ICovCi0JCXBtLT5sZXZlbCA9IGxv Y2FsbGV2ZWw7Ci0JICAgIC8qIGlmIChycGx5dmFsKSBzZXRzcGFyYW0oIlJFUExZIiwgenRyZHVw KHJwbHl2YWwpKTsgKi8KKwkgICAgaWYgKGluY2hhciA9PSBCYXIpIHsKKwkJLyogcnBseXZhciBz aG91bGQgYmUgUkVQTFkgYXQgdGhpcyBwb2ludCwgYnV0IGNyZWF0ZQorCQkgKiBoYXJkd2lyZWQg bmFtZSBhbnl3YXkgdG8gZXhwb3NlIGFueSBidWdzIGVsc2V3aGVyZQorCQkgKi8KKwkJcnBseXBt ID0gY3JlYXRlcGFyYW0oIlJFUExZIiwgUE1fTE9DQUx8UE1fVU5TRVR8UE1fSElERSk7CisJCWlm IChycGx5cG0pCS8qIFNob3VsZG4ndCBjcmVhdGVwYXJhbSgpIGRvIHRoaXM/ICovCisJCSAgICBy cGx5cG0tPmxldmVsID0gbG9jYWxsZXZlbDsKKwkJLyogRnV0dXJlPyAgRXhwb3NlIGdsb2JhbCB2 YWx1ZSBvZiAkUkVQTFkgaWYgYW55PyAqLworCQkvKiBpZiAocnBseXZhbCkgc2V0c3BhcmFtKCJS RVBMWSIsIHp0cmR1cChycGx5dmFsKSk7ICovCisJICAgIH0gZWxzZSBpZiAoaW5ibGFuayhpbmNo YXIpKSB7CisJCXJwbHlwbSA9IGNyZWF0ZXBhcmFtKCIuenNoLmNtZHN1YnN0IiwKKwkJCQkgICAg IFBNX0xPQ0FMfFBNX1VOU0VUfFBNX0hJREV8CisJCQkJICAgICBQTV9SRUFET05MWV9TUEVDSUFM KTsKKwkJaWYgKHJwbHlwbSkKKwkJICAgIHJwbHlwbS0+bGV2ZWwgPSBsb2NhbGxldmVsOworCSAg ICB9CisJICAgIGlmIChpbmNoYXIgIT0gSW5icmFjZSAmJiAhcnBseXBtKSB7CisJCXplcnIoImZh aWxlZCB0byBjcmVhdGUgc2NvcGUgZm9yIGNvbW1hbmQgc3Vic3RpdHV0aW9uIik7CisJCXJldHVy biBOVUxMOworCSAgICB9CiAJfQogCiAJaWYgKHJwbHl2YXIgJiYgY21kYXJnICYmICpjbWRhcmcp IHsKIAkgICAgaW50IG9icmVha3MgPSBicmVha3M7CiAJICAgIEVwcm9nIGNtZHByb2c7CiAJICAg IC8qIEV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgKi8KKwkgICAgcXVldWVfc2lnbmFscygpOwog CSAgICB1bnRva2VuaXplKGNtZGFyZyk7CiAJICAgIGNtZHByb2cgPSBwYXJzZV9zdHJpbmcoY21k YXJnLCAwKTsKIAkgICAgaWYgKGNtZHByb2cpIHsKKwkJLyogZXhlYy5jIGhhbmRsZXMgZG9udF9x dWV1ZV9zaWduYWxzKCkgKi8KIAkJZXhlY29kZShjbWRwcm9nLCAxLCAwLCAiY21kc3Vic3QiKTsK IAkJY21kb3V0dmFsID0gbGFzdHZhbDsKIAkJLyogInJldHVybiIgYmVoYXZlcyBhcyBpZiBpbiBh IGZ1bmN0aW9uICovCkBAIC0yMDAyLDYgKzIwNTEsOCBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGws IExpbmtOb2RlIG4sIGNoYXIgKipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogCQl9CiAJICAg IH0gZWxzZQkvKiBwYXJzZSBlcnJvciAqLwogCQllcnJmbGFnIHw9IEVSUkZMQUdfRVJST1I7CisJ ICAgIGlmIChycGx5cG0pCisJCXJwbHlwbS0+bm9kZS5mbGFncyAmPSB+UE1fUkVBRE9OTFlfU1BF Q0lBTDsKIAkgICAgaWYgKHJwbHl0bXAgJiYgIWVycmZsYWcpIHsKIAkJaW50IG9ub2VycnMgPSBu b2VycnMsIHJwbHlsZW47CiAJCW5vZXJycyA9IDI7CkBAIC0yMDE3LDE1ICsyMDY4LDE2IEBAIHBh cmFtc3Vic3QoTGlua0xpc3QgbCwgTGlua05vZGUgbiwgY2hhciAqKnN0ciwgaW50IHF0LCBpbnQg cGZfZmxhZ3MsCiAJCX0KIAkJbm9lcnJzID0gb25vZXJyczsKIAkJaWYgKHJwbHlsZW4gPj0gMCkK LQkJICAgIHNldHNwYXJhbSgiUkVQTFkiLCBtZXRhZnkoY21kYXJnLCBycGx5bGVuLCBNRVRBX1JF QUxMT0MpKTsKKwkJICAgIHNldHNwYXJhbShycGx5dmFyLCBtZXRhZnkoY21kYXJnLCBycGx5bGVu LCBNRVRBX1JFQUxMT0MpKTsKIAkgICAgfQorCSAgICB1bnF1ZXVlX3NpZ25hbHMoKTsKIAl9CiAK IAlpZiAocnBseXRtcCkKIAkgICAgdW5saW5rKHJwbHl0bXApOwogCWlmIChycGx5dmFyKSB7Ci0J ICAgIGlmIChzdHJjbXAocnBseXZhciwgIlJFUExZIikgPT0gMCkgewotCQlpZiAoKHZhbCA9IGR1 cHN0cmluZyhnZXRzcGFyYW0oIlJFUExZIikpKSkKKwkgICAgaWYgKGluY2hhciAhPSBJbmJyYWNl KSB7CisJCWlmICgodmFsID0gZHVwc3RyaW5nKGdldHNwYXJhbShycGx5dmFyKSkpKQogCQkgICAg dnVuc2V0ID0gMDsKIAkJZWxzZSB7CiAJCSAgICB2dW5zZXQgPSAxOwpkaWZmIC0tZ2l0IGEvVGVz dC9EMTBub2ZvcmsuenRzdCBiL1Rlc3QvRDEwbm9mb3JrLnp0c3QKaW5kZXggZmM2Yjg0NjEzLi41 YmIxMDI2NmYgMTAwNjQ0Ci0tLSBhL1Rlc3QvRDEwbm9mb3JrLnp0c3QKKysrIGIvVGVzdC9EMTBu b2ZvcmsuenRzdApAQCAtMTQsNiArMTQsMjggQEAKIDA6QmFzaWMgc3Vic3RpdHV0aW9uIGFuZCBS RVBMWSBzY29waW5nCiA+SU5ORVIgT1VURVIKIAorICByZXBseT0oeCBPVVRFUiB4KQorICBwdXJs ICR7e3JlcGx5fSByZXBseT0oXHsgSU5ORVIgXH0pfSAkcmVwbHkKKzA6QmFzaWMgc3Vic3RpdHV0 aW9uLCBicmFjZSBxdW90aW5nLCBhbmQgYXJyYXkgcmVzdWx0Cis+eworPklOTkVSCis+fQorPnsK Kz5JTk5FUgorPn0KKworICAoKSB7CisgICAgc2V0b3B0IGxvY2Fsb3B0aW9ucyBpZ25vcmVicmFj ZXMKKyAgICBwdXJsICR7e3JlcGx5fSByZXBseT0oeyBJTk5FUiB9KX0gJHJlcGx5CisgIH0KKzA6 QmFzaWMgc3Vic3RpdHV0aW9uLCBpZ25vcmVicmFjZXMsIGFuZCBhcnJheSByZXN1bHQKKz57Cis+ SU5ORVIKKz59Cis+eworPklOTkVSCis+fQorCiAgIHB1cnIgJHt8IFJFUExZPWZpcnN0fToke3wg UkVQTFk9c2Vjb25kfTokUkVQTFkKIDA6cmUtc2NvcGluZyBvZiBSRVBMWSBpbiBvbmUgc3RhdGVt ZW50CiA+Zmlyc3Q6c2Vjb25kOk9VVEVSCkBAIC0yMjksNyArMjUxLDcgQEAgRjpXaHkgbm90IHVz ZSB0aGlzIGVycm9yIGluIHRoZSBwcmV2aW91cyBjYXNlIGFzIHdlbGw/CiA+MjYKIAogICB1bnNl dCByZXBseQotICBwdXJsICR7fHJlcGx5fCByZXBseT0oMSAyICR7fCBSRVBMWT0zIH0gNCkgfQor ICBwdXJsICR7e3JlcGx5fSByZXBseT0oMSAyICR7fCBSRVBMWT0zIH0gNCkgfQogICB0eXBlc2V0 IC1wIHJlcGx5CiAwOmFycmF5IGJlaGF2aW9yIHdpdGggZ2xvYmFsIGFzc2lnbm1lbnQKID4xCkBA IC0zMTUsNyArMzM3LDcgQEAgRjpzdGF0dXMgb2YgInByaW50IiBzaG91bGQgaGlkZSByZXR1cm4K IAogICB1bnNldCB6egogICBvdXRlcj1HTE9CQUwKLSAgcHVyciAiJHt8enp8CisgIHB1cnIgIiR7 e3p6fQogICAgbG9jYWwgb3V0ZXI9TE9DQUwKICAgIHp6PU5PTkxPQ0FMCiAgIH0gJG91dGVyICQ/ IgpAQCAtNDQwLDcgKzQ2Miw4IEBAIEY6bXVzdCBkbyB0aGlzIGJlZm9yZSBldmFsdWF0aW5nIHRo ZSBuZXh0IHRlc3QgYmxvY2sKIDA6aWdub3JlZCBicmFjZXMsIHBhcnQgMQogPmJ1cmllZH0KIAot ICBwdXJyICIkeyBwdXJyICR7UkVQTFk6LWJ1cmllZH19fSIKKyAgIyBHbG9iYWwgJFJFUExZIHN0 aWxsIHNldCBmcm9tIGVhcmxpZXIgdGVzdAorICBwdXJyICIkeyBwdXJyICR7UkVQTFk6K2J1cmll ZH19fSIKIDA6aWdub3JlZCBicmFjZXMsIHBhcnQgMgogPmJ1cmllZAogPn0KQEAgLTQ1Myw2ICs0 NzYsNyBAQCBGOm11c3QgZG8gdGhpcyBiZWZvcmUgZXZhbHVhdGluZyB0aGUgbmV4dCB0ZXN0IGJs b2NrCiAxOmlnbm9yZWQgYnJhY2VzLCBwYXJ0IDQKID8oZXZhbCk6MzogcGFyc2UgZXJyb3IgbmVh ciBgfScKIAorICB1bnNldG9wdCBpZ25vcmVicmFjZXMKICAgIyAiYnJlYWsiIGJsb2NrcyBmdW5j dGlvbiBjYWxscyBpbiBvdXRlciBsb29wCiAgICMgQ291bGQgdXNlIHByaW50LCBidXQgdGhhdCBt aWdodCBnZXQgZml4ZWQKICAgcmVwZWF0IDMgZG8gcHVyciAkewpAQCAtNDY3LDExICs0OTEsMjUg QEAgRjptdXN0IGRvIHRoaXMgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIG5leHQgdGVzdCBibG9jawog PzEKID8yCiAKLSAgcHJpbnQgLXUgJFpUU1RfZmQgJHtaVFNUX3Rlc3RuYW1lfTogVEVTVCBDT01Q TEVURQotMDptYWtlIHN1cmUgd2UgZ290IHRvIHRoZSBlbmQKLUY6c29tZSB0ZXN0cyBtaWdodCBz aWxlbnRseSBicmVhayB0aGUgdGVzdCBoYXJuZXNzCisgIyBDYW5ub3QgInB1cnIiOiBicmVhayBz a2lwcyBwZW5kaW5nIGZ1bmN0aW9uIGNhbGxzCisgIyBVc2UgInJlcGVhdCIgdG8gYXZvaWQgaW5m aW5pdGUgbG9vcCBvbiBmYWlsdXJlIAorIHJlcGVhdCAzIGRvOyBlY2hvICR7fFJFUExZPXg7IGJy ZWFrIH07IGRvbmUKKyByZXBlYXQgMyBkbzsgZWNobyAke3t4fSB4PXk7IGJyZWFrIH07IGRvbmUK KyByZXBlYXQgMyBkbzsgZWNobyAkeyBlY2hvIHo7IGJyZWFrIH07IGRvbmUKKzA6YnJlYWsgYWZ0 ZXIgYXNzaWdubWVudCBjb21wbGV0ZXMgdGhlIGFzc2lnbm1lbnQKKz54Cis+eQorPnoKKworICMg U3Vic2hlbGwgYmVjYXVzZSBlcnJvciBleGl0cworICggcHVyciAkeyBlY2hvICR7dW5zZXQ/b29w c30gfSApCisxOmVycm9yIGhhbmRsaW5nICh3aXRob3V0IGNyYXNoaW5nKQorKj8qdW5zZXQ6IG9v cHMKKworIHB1cnIgJHsgLnpzaC5jbWRzdWJzdD1lcnJvciB9CisxOnJlc2VydmVkIHBhcmFtZXRl ciBuYW1lICh3aXRob3V0IGNyYXNoaW5nKQorKj8qLnpzaC5jbWRzdWJzdDogY2FuJ3QgbW9kaWZ5 IHJlYWQtb25seSBwYXJhbWV0ZXIKIAogJWNsZWFuCiAKICAgdW5mdW5jdGlvbiBwdXJyIHB1cmwK LSAgdW5zZXRvcHQgaWdub3JlYnJhY2VzCmRpZmYgLS1naXQgYS9UZXN0L1YxMHByaXZhdGUuenRz dCBiL1Rlc3QvVjEwcHJpdmF0ZS56dHN0CmluZGV4IGVkNTEzMTZmMy4uMjYwMDRhMmRjIDEwMDY0 NAotLS0gYS9UZXN0L1YxMHByaXZhdGUuenRzdAorKysgYi9UZXN0L1YxMHByaXZhdGUuenRzdApA QCAtNDk3LDcgKzQ5Nyw3IEBAIEY6QmV0dGVyIGlmIGNhdWdodCBpbiBjaGVja2Nsb2JiZXJwYXJh bSgpIGJ1dCBleGVjLmMgZG9lc24ndCBrbm93IHNjb3BlCiAgKCkgewogICAgcHJpdmF0ZSB6PW91 dGVyCiAgICBwcmludCAkeyh0KXp9ICR6Ci0gICBwcmludCAke3wgUkVQTFk9JHt8enwgej1ub2Zv cmt9IH0KKyAgIHByaW50ICR7fCBSRVBMWT0ke3t6fSB6PW5vZm9ya30gfQogICAgcHJpbnQgJHso dCl6fSAkegogIH0KIDA6bm9mb3JrIG1heSB3cml0ZSB0byBwcml2YXRlIGluIGNhbGxpbmcgZnVu Y3Rpb24KQEAgLTUxOCw5ICs1MTgsOSBAQCBGOkJldHRlciBpZiBjYXVnaHQgaW4gY2hlY2tjbG9i YmVycGFyYW0oKSBidXQgZXhlYy5jIGRvZXNuJ3Qga25vdyBzY29wZQogICgpIHsKICAgIHByaXZh dGUgej1vdXRlcgogICAgcHJpbnQgJHsodCl6fSAkegotICAgcHJpbnQgJHt8enwKKyAgIHByaW50 ICR7e3p9CiAgICAgIHByaXZhdGUgcQotICAgICB6PSR7fHF8IHE9bm9mb3JrfQorICAgICB6PSR7 e3F9IHE9bm9mb3JrfQogICAgfQogICAgcHJpbnQgJHsodCl6fSAkegogIH0KQEAgLTUzMyw3ICs1 MzMsNyBAQCBGOkJldHRlciBpZiBjYXVnaHQgaW4gY2hlY2tjbG9iYmVycGFyYW0oKSBidXQgZXhl Yy5jIGRvZXNuJ3Qga25vdyBzY29wZQogICAgcHJpbnQgJHt8CiAgICAgICgpIHsgUkVQTFk9Insk cX0iIH0KICAgIH0KLSAgIHByaW50ICR7fHF8CisgICBwcmludCAke3txfQogICAgICAoKSB7IHE9 bm9mb3JrIH0KICAgIH0KICB9Cg== --00000000000037d5950614e7b3f4--