From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Stephane Zermatten Original-Sender: "Debbugs-submit" Resent-CC: dann@ics.uci.edu, per@bothner.com, bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 May 2025 15:21:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 78263@debbugs.gnu.org Cc: Dan Nicolaescu , Per Bothner X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: Dan Nicolaescu , Per Bothner Received: via spool by submit@debbugs.gnu.org id=B.174645842319095 (code B ref -1); Mon, 05 May 2025 15:21:02 +0000 Received: (at submit) by debbugs.gnu.org; 5 May 2025 15:20:23 +0000 Received: from localhost ([127.0.0.1]:41619 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uBxcE-0004xu-Dn for submit@debbugs.gnu.org; Mon, 05 May 2025 11:20:23 -0400 Received: from lists.gnu.org ([2001:470:142::17]:51164) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uBwqH-0002Fp-En for submit@debbugs.gnu.org; Mon, 05 May 2025 10:30:50 -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 1uBwqB-0007f3-Qx for bug-gnu-emacs@gnu.org; Mon, 05 May 2025 10:30:43 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uBwq9-0002o2-Rp for bug-gnu-emacs@gnu.org; Mon, 05 May 2025 10:30:43 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-4394a0c65fcso41125955e9.1 for ; Mon, 05 May 2025 07:30:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746455438; x=1747060238; darn=gnu.org; h=mime-version:message-id:date:subject:to:from:from:to:cc:subject :date:message-id:reply-to; bh=R8uu0pE4UNgV3Bd5k/tGEeSUEdfyHpPIJeOuP6kPczw=; b=N6wdxs2yOT7yHioGtlZYL5jCEnpowei1zE8ppxSGIQkLq3EfcTzI2lPHSDTqgMtVfy 74FGxAyu/OIvDtcNuDgel7wnXWN35t7eNF7pxig+HzJoJ8cEFUJYLc1etw6rGW9k7+yj L+/0LTSPwPbuqsPX6DcD+nNx61LaIUrQHm3UUqd/B8Ch9Pjbh1iXbDBbJHmNZP/Eu59l zRZIwGt68tzNCgoZL8Q8FX7agcgfTRAcuXAZX6Z/Gx0bPVYyBmiJLUbvEo6jEbtkxHf7 gHvHV/gD+PQNyelwyE1GxfNDvEuWcN4nRILmDRmhdaOOokbuzhekKTFzFeQ3ET5ohiXs oCIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746455438; x=1747060238; h=mime-version:message-id:date:subject:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=R8uu0pE4UNgV3Bd5k/tGEeSUEdfyHpPIJeOuP6kPczw=; b=nYnbiY4kh8/BmpNZ/Un8DS0EOdXCLjFmPcAHovY840uI9/VXnOzXQRNKYiM7muU5CL 1Vc5h1PnbM3x7xEa10wKT96JWgo0pRIOOFBcmJKIz2Dn+7u0KdttVlzw7YZp3yQqxVhy 8/O6EbcSTLYz1dDncwSqNMRfTbFG9BRQa+03Vfl6KSI3w/99Ddq2cDzNyuH9d83vRNqq Pi00N2zWjS+HmT4ZJ/zkofggrwgyB33sGditJjyv0rW8XwAio7k1HyqtgMM6yG4eKW/Z RND41PKLda2LeU19dZvmiKFPR1ajD0ZeHXongEJYs4ZiBuYnU5gxgm3oUwCcwQesDmMZ UBTg== X-Gm-Message-State: AOJu0YzdBIZh5wdFrW+Lw/Y7DeIayBmj441fRXVr0hpVmFU5LhOoP4PS BkvJlwcj3/hqDQAIWDV/B/UKVNB+buKED4UWwMGD3izKBBpdfsRD1Z/ed+x9 X-Gm-Gg: ASbGncsI7DQql6WOFqZIwWeRa/OXIRXYpbA3wdYh1K3UX3FdORU45cUlJpgbsr8/Vkl GwvYLwibiBSH/cQ8PcgQTP6ziGz6EeuPsjpCWzyexY2ayY8CPoWo8bhnNEBXoTbd8EYo+//jWvm 7262EvOveZPoDuKAos8SYdWUO0MF2a+LV0ImxzokD1qwbYNO8ZoMIjuqBi7Ooh29oTXzQk0xMcN AwMrBg4owThBtvXC+1FlDael7nASpaucJLbUYK0wdS78ezL3yiodY+CrvaUGWIutfbUGpvSAUbk IbWW3s6qJtccMQulg6pblsFcVNwAI4RV3oJZEQDXjetMsU7rQzQqsGMrPbp1CjXyC/4qQQ== X-Google-Smtp-Source: AGHT+IEDBweUf1RX4JLXD/LRo3qSZIMBSzD1oMaQFj1VMMw7TkppHlU9kuzwBExSMjpAe+JPON759w== X-Received: by 2002:a05:600c:1c8e:b0:43d:3df:42d8 with SMTP id 5b1f17b1804b1-441c48af178mr60746885e9.6.1746455437828; Mon, 05 May 2025 07:30:37 -0700 (PDT) Received: from boomer.zia ([62.74.17.219]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-441b2ad76a2sm181418895e9.6.2025.05.05.07.30.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 May 2025 07:30:37 -0700 (PDT) From: Stephane Zermatten Date: Mon, 05 May 2025 17:30:35 +0300 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=2a00:1450:4864:20::331; envelope-from=szermatt@gmail.com; helo=mail-wm1-x331.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, 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-Mailman-Approved-At: Mon, 05 May 2025 11:20:21 -0400 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 (/) --=-=-= Content-Type: text/plain Tags: patch This change detects OSC sequences and ignores them. This is what's normally expected and avoids strange outputs. Starting with version 4, the fish shell has started sending out OSC sequences by default, which looks pretty bad on term. This change avoids this particular problem. This is PATCH 1/3, because I'd like to propose making it possible to handle OSC sequences in term in follow-up changes. Emacs already has handlers for OSC sequences in ansi-osc, why not make use of them? In GNU Emacs 31.0.50 (build 5, x86_64-apple-darwin23.6.0, NS appkit-2487.70 Version 14.7.5 (Build 23H527)) of 2025-05-02 built on boomer.zia Repository revision: 99ca41b6ef300653a0d15b73a0c0d446a9a9e059 Repository branch: master Windowing system distributor 'Apple', version 10.3.2487 System Description: macOS 14.7.5 Configured using: 'configure --program-suffix=-head --with-tree-sitter --with-native-compilation=aot' --=-=-= Content-Type: text/patch Content-Disposition: attachment; filename=0001-Ignore-OSC-sequences-in-term-instead-of-printing-the.patch >From 818736960d03ea8be254f81e5267e54c9ad27806 Mon Sep 17 00:00:00 2001 From: Stephane Zermatten Date: Sat, 3 May 2025 00:03:12 +0300 Subject: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Terminals are expected to just skip unknown OSC sequences. Doing this avoids strange output, for example when fish4 is run inside of term. * lisp/term.el (term-emulate-terminal) skip OSC sequences --- lisp/term.el | 17 +++++++++++++++++ test/lisp/term-tests.el | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/lisp/term.el b/lisp/term.el index a971300c055..fa609058d77 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -3030,6 +3030,10 @@ term-control-seq-regexp "\e\\(?:[DM78c]\\|" ;; another Emacs specific control sequence, "AnSiT[^\n]+\n\\|" + ;; OSC (see [ECMA-48] section 8.3.89 "Operation System Command") In + ;; addition to the range defined there, this regexp allows non-ascii + ;; (UTF-8) characters. + "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|" ;; or an escape sequence (section 5.4 "Control Sequences"), "\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)") "Regexp matching control sequences handled by term.el.") @@ -3232,6 +3236,19 @@ term-emulate-terminal (split-string ctl-params ";")) (aref str (1- ctl-end)) private)))) + (?\] ;; An OSC sequence that's just skipped for now + (when (and + (>= ctl-end str-length) + (not + (or (eq ?\a (aref str (1- ctl-end))) + (string= + "\e\\" + (substring + str (max i (- ctl-end 2)) ctl-end))))) + ;; Continue ignoring until the end marker. + (setq term-terminal-undecoded-bytes "\e]")) + ;; Consume everything + (setq i ctl-end)) (?D ;; Scroll forward (apparently not documented in ;; [ECMA-48], [ctlseqs] mentions it as C1 ;; character "Index" though). diff --git a/test/lisp/term-tests.el b/test/lisp/term-tests.el index ffb341f3b52..f70245c6af3 100644 --- a/test/lisp/term-tests.el +++ b/test/lisp/term-tests.el @@ -419,6 +419,37 @@ term-undecodable-input (term-test-screen-from-input 40 1 bytes))))) +(ert-deftest term-ignore-osc() + ;; BEL-terminated OSC sequence + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;window title\ast"))) + ;; ESC \-terminated OSC sequence + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;window title\e\\st"))) + ;; Long OSC sequence split into multiple chunks + (should (equal "test" + (term-test-screen-from-input + 40 1 '("te\e]0;win" "dow " " title\ast")))) + ;; OSC sequence that start and ends with the chunk + (should (equal "test" + (term-test-screen-from-input + 40 1 '("te" "\e]0;window " "title\a" "st")))) + + ;; Invalid control characters break out of the OSC sequence, for + ;; safety. + (should (equal "tetitlest" + (term-test-screen-from-input + 40 1 '("te\e]0;window\x05title\ast")))) + + (let ((locale-coding-system 'utf-8-unix)) + ;; An OSC sequence with multibyte UTF-8 characters. Not exactly + ;; standard-compliant, but too common not to support. + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;\xce\xb1\xce\xb2\e\\st"))))) + (provide 'term-tests) ;;; term-tests.el ends here -- 2.47.0 --=-=-=-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 May 2025 15:56:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Stephane Zermatten Cc: per@bothner.com, dann@ics.uci.edu, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.17464605185889 (code B ref 78263); Mon, 05 May 2025 15:56:02 +0000 Received: (at 78263) by debbugs.gnu.org; 5 May 2025 15:55:18 +0000 Received: from localhost ([127.0.0.1]:41933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uByA2-0001Wu-2h for submit@debbugs.gnu.org; Mon, 05 May 2025 11:55:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58316) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uBy9z-0001Vq-7B for 78263@debbugs.gnu.org; Mon, 05 May 2025 11:55:16 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uBy9s-0004C7-E1; Mon, 05 May 2025 11:55:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=53RaNJcVEN3zYPH22F8TjU42CbUIN8rFsBx5EMF/RdE=; b=Eyxir5w6CbP9 FZNwpHPlzhwDmuOsGhaYnMfkW4M55oxGl7+538y+4byam/1QT0luV45/l67rW/dqc0Ai+RIxvhpxf 9aMiWEyr/tiC4k9OWzVBWUGttiCyA21DGh4buk6wbihdzID8pOL7+78t2fX3ByFeY4Ytxot8WGeLw nwQipGS1sVo8O1u5+GK9lOXWiuf6KxtR/cEfGz1aC5JJDUlEaMrRdATj1hiQXnOnj5Z0O2DG5OGy6 eksLHM3d4JhqnyrEoIF8wpS+KPoW1A3Psy6Oz854jrId5/U2rgud4hetYPpu+wMDNb2N9xJkHe868 2SmS/GMTP1e0HvZf589NUA==; Date: Mon, 05 May 2025 18:55:06 +0300 Message-Id: <86ldrbgihx.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: (message from Stephane Zermatten on Mon, 05 May 2025 17:30:35 +0300) References: 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 (---) > Cc: Dan Nicolaescu , Per Bothner > From: Stephane Zermatten > Date: Mon, 05 May 2025 17:30:35 +0300 > > This change detects OSC sequences and ignores them. This is what's > normally expected and avoids strange outputs. > > Starting with version 4, the fish shell has started sending out OSC > sequences by default, which looks pretty bad on term. This change avoids > this particular problem. > > This is PATCH 1/3, because I'd like to propose making it possible to > handle OSC sequences in term in follow-up changes. Emacs already has > handlers for OSC sequences in ansi-osc, why not make use of them? I indeed think that teaching Emacs about these sequences is better than filtering them out. Since you seem to think the same, and will follow up with patches to that effect, why do we need this patch at all? From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Per Bothner Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 May 2025 16:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Stephane Zermatten , 78263@debbugs.gnu.org Cc: Eli Zaretskii , Dan Nicolaescu Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174646303014879 (code B ref 78263); Mon, 05 May 2025 16:38:02 +0000 Received: (at 78263) by debbugs.gnu.org; 5 May 2025 16:37:10 +0000 Received: from localhost ([127.0.0.1]:42200 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uByoY-0003ru-1F for submit@debbugs.gnu.org; Mon, 05 May 2025 12:37:10 -0400 Received: from mailtransmit05.runbox.com ([2a0c:5a00:149::26]:39426) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uByoV-0003rI-1i for 78263@debbugs.gnu.org; Mon, 05 May 2025 12:37:07 -0400 Received: from mailtransmit02.runbox ([10.9.9.162] helo=aibo.runbox.com) by mailtransmit05.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1uByoM-006fo6-P7; Mon, 05 May 2025 18:36:58 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=bothner.com ; s=selector2; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From: References:Cc:To:Subject:MIME-Version:Date:Message-ID; bh=17+RcaW+eta1giN+cbe1nRe0KcsaI3+Oo2wYM0om8LY=; b=RlPnOm1er0s3oBaw1nnIfUWeRp D8C/FJ0uZsP9bpLEce0zHfPybNACTeUAsRybjozeFiO3Ol1Q/Lj+i7IJZeDyuQH3p2q1idfiOZwDV irzfprfMbWP8tYO61P/UBJdAjHQMlIuWa65imeaA+NshP0h0/R1snUplEMLhRdybBZySuHwDwxvj/ 6tQEdzzQ4IgnL6hX9bk64zTgayEu52ydpHBeffgGgbf9WLz3uU/iaeCdSh86Q+GJJhbXMyB8Zi0YZ i7RXGEbgzez2RbNCDEixxGfhm5SMPR9iZarZ1n/tZqecrEGY7pFY3ZucubL/U+arH3OOIbTHGMPjp eu0vBNBg==; Received: from [10.9.9.73] (helo=submission02.runbox) by mailtransmit02.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1uByoM-0008Nc-79; Mon, 05 May 2025 18:36:58 +0200 Received: by submission02.runbox with esmtpsa [Authenticated ID (524175)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1uByoD-008uUm-C4; Mon, 05 May 2025 18:36:50 +0200 Message-ID: Date: Mon, 5 May 2025 09:36:45 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird References: Content-Language: en-US From: Per Bothner In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) 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.7 (-) The whole term-control-seq-regexp is fundamentally broken, and does not appear in any version of term.el I have worked on or blessed. It assumes all relevant sequences are complete in a single call to term-emulate-terminal. That is not a safe assumption. The correct way to parse terminal escape sequences is using a state machine, as in my original implementation. Alternatively, if you really want to use pattern matching, it is possible to recognize "incomplete escape sequence", and save that until the next call. However, I don't see any code to handle that; it is possible I'm missing something. (That approach can in theory lead to O(n^2) behavior, which the state machine approach avoids, but I don't think that is a major problem.) I agree with Eli that term should when possible handle OSC sequences rather than ignoring them. (Ones it can't handle should of course be ignored.) On 5/5/25 7:30 AM, Stephane Zermatten wrote: > Tags: patch > > > This change detects OSC sequences and ignores them. This is what's > normally expected and avoids strange outputs. > > Starting with version 4, the fish shell has started sending out OSC > sequences by default, which looks pretty bad on term. This change avoids > this particular problem. > > This is PATCH 1/3, because I'd like to propose making it possible to > handle OSC sequences in term in follow-up changes. Emacs already has > handlers for OSC sequences in ansi-osc, why not make use of them? > > In GNU Emacs 31.0.50 (build 5, x86_64-apple-darwin23.6.0, NS > appkit-2487.70 Version 14.7.5 (Build 23H527)) of 2025-05-02 built on > boomer.zia > Repository revision: 99ca41b6ef300653a0d15b73a0c0d446a9a9e059 > Repository branch: master > Windowing system distributor 'Apple', version 10.3.2487 > System Description: macOS 14.7.5 > > Configured using: > 'configure --program-suffix=-head --with-tree-sitter > --with-native-compilation=aot' > -- --Per Bothner per@bothner.com http://per.bothner.com/ From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 May 2025 16:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Per Bothner Cc: Eli Zaretskii , Dan Nicolaescu , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174646429019292 (code B ref 78263); Mon, 05 May 2025 16:59:02 +0000 Received: (at 78263) by debbugs.gnu.org; 5 May 2025 16:58:10 +0000 Received: from localhost ([127.0.0.1]:42362 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uBz8s-000515-Bp for submit@debbugs.gnu.org; Mon, 05 May 2025 12:58:10 -0400 Received: from mail-wr1-x42f.google.com ([2a00:1450:4864:20::42f]:54315) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uBz8p-00050Q-04 for 78263@debbugs.gnu.org; Mon, 05 May 2025 12:58:08 -0400 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-39c13fa05ebso2830066f8f.0 for <78263@debbugs.gnu.org>; Mon, 05 May 2025 09:58:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746464280; x=1747069080; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=vH7Wce8wojAFiFG1mS8GB19tcCS/9TbfhNovancFnHE=; b=j3sRrTgxgu7DGQGLjatKqlXNaEEWYekEg2mgrbpzk4T/aQ66kXxVvYM0CzLVKqyZxx WLUvQEFuS8bTndvg6TDp5O2nz+fS7ElniA3I5uarjQOwa8xqGNDRavJB2Z0NYZDXRTAm hI9mK/NU5r85QJHHtykimva/SCKkTOTL3MUXsLDO8+92h3N2pFo8Yeyt4tizVJg12pBc PyG/CU2ZwFSE9m9CPVUUrY9R5UeUd7iqU7OldWCXGTIFnvrC3eAyJTvGORnSP0T5D3+z ZqacdI9Ju8QzX59Bku8oISAowLHea7iW31A+tk0FIJWUyjCuOeKlhafuJC9QX0uokVth MHyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746464280; x=1747069080; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vH7Wce8wojAFiFG1mS8GB19tcCS/9TbfhNovancFnHE=; b=mOj5y8cVANieYcvgFjqZPOBFe6NRkC9PFZ2Zyf5HMxIyTArhwXQK47LM1hlZHuvwLp 6nJNuomgcAvU+Gjy+q3J+0BSntzc6Yg3bQEZLqrKiT7szmSCgmjKLVO/nw98+DWPKC3N 4s/Zo8ucKrlqCNbGxtlJXohJWiKhzj4vViriTbdWdrfcfHhkggOdTmybgrBTZxBadRGi tK0R9Dj+Vgd/eaCRSrO2brrWHQ4eySICNH0ZkJgVd6u5KHwbizH3VtbOhL7gT4Or6qbA 96ZyWhI4tdWEXi8SX4WLSuEtznPzyD5fV5XdAUKw+Q1xlA7QjDoLKI7HzyJ9K+dC3Bvd vaaA== X-Gm-Message-State: AOJu0Yx+FuYh5ZSeD5X9ejweTkC7Y4Jpu6FDLWFxBLMnc/uF70LpYHuj ck92gVM3PIGOhXc9N81iTWY2AqCQVQ3hEvPQTJWtMVTWZhmuWSUP2aVRhSn71Po= X-Gm-Gg: ASbGnct6OBdE1A3+gUY3GPT2ZaU7ltKiXtq3CTGYt/6kTkdhASpoTv43pr4dtKuOuw3 rLhbPOQ5HnvxrFfN7HExauhwJHEnu8WrI0QBbetHNcfEEb1VP0RG2eTcoLWsnroqqpT8E9evqCj 9KzMoBFXCdw8cH1NH2XkdiaBJYG+lKVeHJjn9w7uzWaHv7vI28rMoW1mS4/p9UOqnh3LfrpxZc1 QleF0v00p3MyvFXnsH4JbbtUBVuRAtY+mJSYb8oTT3mPtj7ZqmomZF1pXZOIxUFA5V+Ymvz3uoV ySpRHuj2jTCy6NjHnubCZF5WZ69fnyqE6T5F+y7HQatrDO5+hu+P0WoQkgneh6lUGvY= X-Google-Smtp-Source: AGHT+IEQaTDOhHAhJ0/9nkdM7lg9zJK7UoJZskWRl3259Fm+Q2LRwhNjZ45jAtYTmQbnnMw7KKC1Lg== X-Received: by 2002:a05:6000:4383:b0:3a0:8311:c455 with SMTP id ffacd0b85a97d-3a09fd7c570mr6005921f8f.34.1746464280193; Mon, 05 May 2025 09:58:00 -0700 (PDT) Received: from smtpclient.apple ([62.74.17.219]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a09a002899sm10522245f8f.0.2025.05.05.09.57.58 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 05 May 2025 09:57:59 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_B38465D0-76EA-427E-8BB9-9DB62A6EC220" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.2\)) Date: Mon, 5 May 2025 19:57:45 +0300 In-Reply-To: References: X-Mailer: Apple Mail (2.3776.700.51.11.2) 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 (-) --Apple-Mail=_B38465D0-76EA-427E-8BB9-9DB62A6EC220 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I attached a merged version of all 3 patches to this e-mail that handles = OSC sequences, so they=E2=80=99re handled right away. I=E2=80=99m happy = to do it that way, if it=E2=80=99s more convenient.=20 --Apple-Mail=_B38465D0-76EA-427E-8BB9-9DB62A6EC220 Content-Disposition: attachment; filename=0001-Handle-OSC-sequences-in-term.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Handle-OSC-sequences-in-term.patch" Content-Transfer-Encoding: quoted-printable =46rom=20fb1bd0262dd7e25fd675075d5e9d636274fda353=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Sat,=203=20May=202025=2000:03:12=20+0300=0ASubject:=20[PATCH]=20= Handle=20OSC=20sequences=20in=20term.=0A=0AAdd=20support=20for=20OSC=20= sequences=20to=20term.el.=20Handlers=20can=20be=20registered=20to=0A= term-osc-handler,=20which=20by=20defaults,=20supports=20OSC=200,=202,=20= 7=20and=208,=20using=0Ahandlers=20defined=20in=20ansi-osc.=20Unknown=20= OSC=20sequences=20are=20properly=0Aignored.=0A=0A*=20lisp/term.el=20= (term-emulate-terminal)=20handle=20OSC=20sequences=0A---=0A=20= lisp/term.el=20=20=20=20=20=20=20=20=20=20=20=20|=2060=20= ++++++++++++++++++++++++++++=0A=20test/lisp/term-tests.el=20|=2086=20= +++++++++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20= 146=20insertions(+)=0A=0Adiff=20--git=20a/lisp/term.el=20b/lisp/term.el=0A= index=20a971300c055..ff6b1106a9d=20100644=0A---=20a/lisp/term.el=0A+++=20= b/lisp/term.el=0A@@=20-304,6=20+304,7=20@@=20term-protocol-version=0A=20=20= =20(require=20'cl-lib))=0A=20(require=20'comint)=20;=20Password=20= regexp.=0A=20(require=20'ansi-color)=0A+(require=20'ansi-osc)=0A=20= (require=20'ehelp)=0A=20(require=20'ring)=0A=20(require=20'shell)=0A@@=20= -603,6=20+604,33=20@@=20term-exec-hook=0A=20=20=20:type=20'hook=0A=20=20=20= :group=20'term)=0A=20=0A+(defcustom=20term-osc-handlers=20'(("0"=20.=20= ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("2"=20.=20= ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("7"=20.=20= ansi-osc-directory-tracker)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("8"=20.=20= ansi-osc-hyperlink-handler))=0A+=20=20"OSC=20sequence=20handler=20= function=20alist.=0A+=0A+OSC=20(Operating=20System=20Command)=20is=20a=20= category=20of=20ANSI=20escape=20sequence=0A+used=20in=20terminal=20= application=20to=20introduce=20custom=20commands.=20Terminals=0A+ignore=20= unknown=20OSC=20sequences=20by=20default.=20Handlers=20can=20be=20= registered=20here=0A+to=20add=20support=20for=20new=20OSC=20sequences=20= to=20`term'.=0A+=0A+Functions=20in=20this=20alist=20are=20passed=20= matching=20valid=20OSC=20sequences=20as=0A+they're=20sent=20to=20the=20= terminal.=0A+=0A+Valid=20OSC=20sequences=20are=20of=20the=20form=0A+=20=20= ESC=20]=20code=20;=20text=20BEL=0A+=20=20ESC=20]=20code=20;=20text=20ESC=20= \=0A+=0A+Each=20entry=20has=20the=20form=20(CODE=20.=20FUNCTION),=20= where=20CODE=20is=20the=20string=20that=0A+appears=20before=20the=20= semicolon.=0A+=0A+FUNCTION=20is=20called=20with=20two=20arguments=20CODE=20= and=20TEXT=20with=20the=20term=20buffer=0A+active=20and=20its=20point=20= and=20state=20active=20at=20the=20time=20the=20OSC=20sequence=0A= +appeared=20in=20the=20stream."=0A+=20=20:type=20'(alist=20:key-type=20= string=20:value-type=20function)=0A+=20=20:group=20'term)=0A+=0A=20= (defvar=20term-mode-map=0A=20=20=20(let=20((map=20(make-sparse-keymap)))=0A= =20=20=20=20=20(define-key=20map=20"\ep"=20'term-previous-input)=0A@@=20= -3030,6=20+3058,10=20@@=20term-control-seq-regexp=0A=20=20=20=20= "\e\\(?:[DM78c]\\|"=0A=20=20=20=20;;=20another=20Emacs=20specific=20= control=20sequence,=0A=20=20=20=20"AnSiT[^\n]+\n\\|"=0A+=20=20=20;;=20= OSC=20(see=20[ECMA-48]=20section=208.3.89=20"Operation=20System=20= Command")=20The=0A+=20=20=20;;=20spec=20only=20allows=200x08-0x0d=20= 0x20-7e,=20but=20this=20regexp=20also=20allows=0A+=20=20=20;;=20= non-ascii=20(UTF-8)=20characters.=0A+=20=20=20= "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|"=0A=20=20=20=20;;=20= or=20an=20escape=20sequence=20(section=205.4=20"Control=20Sequences"),=0A= =20=20=20=20"\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)")=0A=20=20= =20"Regexp=20matching=20control=20sequences=20handled=20by=20term.el.")=0A= @@=20-3037,6=20+3069,9=20@@=20term-control-seq-regexp=0A=20(defconst=20= term-control-seq-prefix-regexp=0A=20=20=20"[\032\e]")=0A=20=0A+(defconst=20= term-osc--max-bytes=20(*=2032=201024=201024)=0A+=20=20"Limit=20the=20= length=20of=20OSC=20sequences=20to=20keep=20in=20memory.")=0A+=0A=20= (defun=20term-emulate-terminal=20(proc=20str)=0A=20=20=20(when=20= (buffer-live-p=20(process-buffer=20proc))=0A=20=20=20=20=20= (with-current-buffer=20(process-buffer=20proc)=0A@@=20-3232,6=20+3267,31=20= @@=20term-emulate-terminal=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(split-string=20ctl-params=20= ";"))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(aref=20str=20(1-=20ctl-end))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20private))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?\]=20= ;;=20An=20OSC=20sequence=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((seq-str=20(substring=20str=20(+=20i=202)=20= ctl-end)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(string-match=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20= "\\`\\(\\([0-9A-Za-z]+\\);\\)?.*?\\(\a\\|\e\\\\\\)?\\'"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20seq-str)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((code=20(match-string=202=20seq-str))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (text-start=20(match-end=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(end-mark=20= (match-beginning=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20(and=20code=20end-mark)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (when-let*=20((func=20(cdr=20(assoc-string=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20code=20= term-osc-handlers))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(with-demoted-errors=20"term=20= OSC=20error:=20%S"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20func=20code=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(decode-coding-string=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(substring=20seq-str=20text-start=20end-mark)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20locale-coding-system=20t)))))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20= (and=20(not=20end-mark)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(>=3D=20= ctl-end=20str-length)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(<=20(-=20= ctl-end=20i)=20term-osc--max-bytes))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Continue=20= ignoring=20until=20the=20end=20marker.=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20= term-terminal-undecoded-bytes=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(substring=20= str=20i)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20Consume=20everything=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(setq=20i=20ctl-end))=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?D=20;;=20Scroll=20forward=20= (apparently=20not=20documented=20in=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20;;=20[ECMA-48],=20[ctlseqs]=20mentions=20= it=20as=20C1=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20character=20"Index"=20though).=0Adiff=20--git=20= a/test/lisp/term-tests.el=20b/test/lisp/term-tests.el=0Aindex=20= ffb341f3b52..2d8dd3ae959=20100644=0A---=20a/test/lisp/term-tests.el=0A= +++=20b/test/lisp/term-tests.el=0A@@=20-419,6=20+419,92=20@@=20= term-undecodable-input=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20bytes)))))=0A=20=0A= +(ert-deftest=20term-ignore-osc()=0A+=20=20;;=20BEL-terminated=20OSC=20= sequence=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20"te\e]0;window=20= title\ast")))=0A+=20=20;;=20ESC=20\-terminated=20OSC=20sequence=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;window=20title\e\\st")))=0A+=20=20;;=20= Long=20OSC=20sequence=20split=20into=20multiple=20chunks=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20'("te\e]0;win"=20"dow=20"=20"=20= title\ast"))))=0A+=20=20;;=20OSC=20sequence=20that=20start=20and=20ends=20= with=20the=20chunk=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20'("te"=20= "\e]0;window=20"=20"title\a"=20"st"))))=0A+=0A+=20=20;;=20Invalid=20= control=20characters=20break=20out=20of=20the=20OSC=20sequence,=20for=0A= +=20=20;;=20safety.=0A+=20=20(should=20(equal=20"tetitlest"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= '("te\e]0;window\x05title\ast"))))=0A+=0A+=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20;;=20An=20OSC=20= sequence=20with=20multibyte=20UTF-8=20characters.=20Not=20exactly=0A+=20=20= =20=20;;=20standard-compliant,=20but=20too=20common=20not=20to=20= support.=0A+=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]0;\xce\xb1\xce\xb2\e\\st")))))=0A+=0A+(ert-deftest=20= term-handle-osc()=0A+=20=20(let*=20((captured=20nil)=0A+=20=20=20=20=20=20= =20=20=20(handler=20(lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20code=20text)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= captured)))=0A+=20=20=20=20=20=20=20=20=20(term-osc-handlers=20`(("2"=20= .=20,handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20,handler))))=0A+=0A+=20=20= =20=20;;=20Send=20OSC=20sequences=20to=20handler=0A+=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=2040=201=20"te\e]2;foo\as\e]1994;bar\at")))=0A+=20=20=20= =20(should=20(equal=20'(("2"=20.=20"foo")=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"bar"))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A+=0A= +=20=20=20=20;;=20OSC=20sequences=20and=20code=20can=20be=20chunked=0A+=20= =20=20=20(setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=20= "test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20`("te\e]2;chunked=20fo"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"o\as\e]19"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"94;chunked=20ba"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20"r\at"))))=0A+=20=20=20=20(should=20= (equal=20'(("2"=20.=20"chunked=20foo")=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20("1994"=20.=20"chunked=20bar"))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A= +=0A+=20=20=20=20;;=20OSC=20sequences=20can=20contain=20multibyte=20= characters=0A+=20=20=20=20(let=20((locale-coding-system=20'utf-8-unix))=0A= +=20=20=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A+=20=20=20=20=20=20(should=20(equal=20= '(("2"=20.=20"=CE=B1=CE=B2"))=20captured)))=0A+=0A+=20=20=20=20;;=20= Ignore=20unhandled=20and=20invalid=20OSC=20sequences=0A+=20=20=20=20= (setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]3;unhandled\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2missing=20semicolon\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2;not=20ended\003est")))=0A+=20=20=20=20(should-not=20= captured)))=0A+=0A=20(provide=20'term-tests)=0A=20=0A=20;;;=20= term-tests.el=20ends=20here=0A--=20=0A2.47.0=0A=0A= --Apple-Mail=_B38465D0-76EA-427E-8BB9-9DB62A6EC220 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On 5 May 2025, at 19:36, Per Bothner wrote: >=20 > The whole term-control-seq-regexp is fundamentally broken, and does = not appear > in any version of term.el I have worked on or blessed. It assumes all = relevant sequences > are complete in a single call to term-emulate-terminal. That is not a = safe assumption. >=20 > The correct way to parse terminal escape sequences is using a state = machine, as in > my original implementation. Alternatively, if you really want to use = pattern matching, > it is possible to recognize "incomplete escape sequence", and save = that until the > next call. However, I don't see any code to handle that; it is = possible I'm missing something. > (That approach can in theory lead to O(n^2) behavior, which the state = machine approach avoids, > but I don't think that is a major problem.) A state machine is indeed the right way of handling terminal escape = sequences, and it would be a great idea to refactor term.el to do it = that way. I don=E2=80=99t really want to use pattern matching. I=E2=80=99m= using it here because it integrates with the current code.=20 The current implementation does indeed recognize incomplete escape = sequence, See term-control-seq-prefix-regexp and its use in = term-emulate-terminal. It=E2=80=99s a bit, well, funny, but it seems to = work. It keeps incomplete sequences in term-terminal-undecoded-bytes for = the next call.=20 In the patch attached to this e-mail, you=E2=80=99ll notice that I had = to add some code that detects whether a sequence is terminated and = buffers it for next time, in term-terminal-undecoded-bytes to be = consistent with the current implementation. This is covered by the = tests.=20 If you guys think it=E2=80=99s time to refactor term.el to use a state = machine and have time to spend on it, I=E2=80=99d be happy to help as = much as I can. It=E2=80=99s a bit scary, because, unless I missed = something, test coverage of the existing code isn=E2=80=99t very high, = so adding more tests would be, I think, a good first step before = engaging in larger changes.=20 =20 >=20 > I agree with Eli that term should when possible handle OSC sequences = rather than ignoring them. > (Ones it can't handle should of course be ignored.) >=20 > On 5/5/25 7:30 AM, Stephane Zermatten wrote: >> Tags: patch >> This change detects OSC sequences and ignores them. This is what's >> normally expected and avoids strange outputs. >> Starting with version 4, the fish shell has started sending out OSC >> sequences by default, which looks pretty bad on term. This change = avoids >> this particular problem. >> This is PATCH 1/3, because I'd like to propose making it possible to >> handle OSC sequences in term in follow-up changes. Emacs already has >> handlers for OSC sequences in ansi-osc, why not make use of them? >> In GNU Emacs 31.0.50 (build 5, x86_64-apple-darwin23.6.0, NS >> appkit-2487.70 Version 14.7.5 (Build 23H527)) of 2025-05-02 built on >> boomer.zia >> Repository revision: 99ca41b6ef300653a0d15b73a0c0d446a9a9e059 >> Repository branch: master >> Windowing system distributor 'Apple', version 10.3.2487 >> System Description: macOS 14.7.5 >> Configured using: >> 'configure --program-suffix=3D-head --with-tree-sitter >> --with-native-compilation=3Daot' >=20 > --=20 > --Per Bothner > per@bothner.com http://per.bothner.com/ >=20 --Apple-Mail=_B38465D0-76EA-427E-8BB9-9DB62A6EC220-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Per Bothner Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 May 2025 18:47:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: Eli Zaretskii , Dan Nicolaescu , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.17464708179619 (code B ref 78263); Mon, 05 May 2025 18:47:02 +0000 Received: (at 78263) by debbugs.gnu.org; 5 May 2025 18:46:57 +0000 Received: from localhost ([127.0.0.1]:43003 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uC0q9-0002V5-3s for submit@debbugs.gnu.org; Mon, 05 May 2025 14:46:57 -0400 Received: from mailtransmit05.runbox.com ([2a0c:5a00:149::26]:56840) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uC0q6-0002Um-4k for 78263@debbugs.gnu.org; Mon, 05 May 2025 14:46:55 -0400 Received: from mailtransmit03.runbox ([10.9.9.163] helo=aibo.runbox.com) by mailtransmit05.runbox.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1uC0px-006x0y-A7; Mon, 05 May 2025 20:46:45 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=bothner.com ; s=selector2; h=In-Reply-To:From:References:Cc:To:Subject:MIME-Version:Date: Message-ID:Content-Type; bh=sNhSd+c6HcWObvF/hEEXJ0b9//7Tg3C4nGkaHUeB3TI=; b=N ARoJkBgPkYn1ZyG0NRoyXiXMC+YxjcvbOugPUPJaqc+j+uEUa2s2lv4pYU2JrsLiXjQxtU4B1305j j8sUMRTVmoLWcALl3KdYwyflQeQ3YJbdrxJhACFSNcEVnkIno/ci1kO9Dx9kk9utgw5lU8e7PJRQt sSdW20FnWL6OvZSNGLfUPl9in5QovDMMH8/nO37LhRnBljPINflPhle5wpejGvCwxXKeckzMd5p3W ZRQCygZI+yzkkbUKmwEk+ywG4GrTsUNRoVeRGOwXFWG54CtDh5QMLXTz4TcY0oEkCGTFQLW+UuiS6 4h5ERDxKx1/rup9IZmhWj3y+hZl5ujekw==; Received: from [10.9.9.74] (helo=submission03.runbox) by mailtransmit03.runbox with esmtp (Exim 4.86_2) (envelope-from ) id 1uC0pw-0005fS-HX; Mon, 05 May 2025 20:46:44 +0200 Received: by submission03.runbox with esmtpsa [Authenticated ID (524175)] (TLS1.2:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.93) id 1uC0pf-00DQ4q-KU; Mon, 05 May 2025 20:46:28 +0200 Content-Type: multipart/mixed; boundary="------------oIp3wbIUN8Emz9bZT3073nhj" Message-ID: <08fda204-1ea1-48c9-b18d-4f1cb1c7fdbc@bothner.com> Date: Mon, 5 May 2025 11:46:24 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> Content-Language: en-US From: Per Bothner In-Reply-To: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> 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" This is a multi-part message in MIME format. --------------oIp3wbIUN8Emz9bZT3073nhj Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 5/5/25 9:57 AM, Stéphane Zermatten wrote: > A state machine is indeed the right way of handling terminal escape sequences, and it would be a great idea to refactor term.el to do it that way. I don’t really want to use pattern matching. I’m using it here because it integrates with the current code. > > The current implementation does indeed recognize incomplete escape sequence, See term-control-seq-prefix-regexp and its use in term-emulate-terminal. It’s a bit, well, funny, but it seems to work. It keeps incomplete sequences in term-terminal-undecoded-bytes for the next call. > > In the patch attached to this e-mail, you’ll notice that I had to add some code that detects whether a sequence is terminated and buffers it for next time, in term-terminal-undecoded-bytes to be consistent with the current implementation. This is covered by the tests. > > If you guys think it’s time to refactor term.el to use a state machine and have time to spend on it, I’d be happy to help as much as I can. It’s a bit scary, because, unless I missed something, test coverage of the existing code isn’t very high, so adding more tests would be, I think, a good first step before engaging in larger changes. I don't feel stronly about state machines - I think it would be more robust, but I don't know if that justifies the effort. In principle using the term-terminal-undecoded-bytes logic is fine; however I'm not sure how "complete" the logic is in terms of unusual unhandled escape sequences or garbled inputs. If somebody does re-write term to use a state machine, it might save a little time and thought to re-use the code from my original term.el (attached). -- --Per Bothner per@bothner.com http://per.bothner.com/ --------------oIp3wbIUN8Emz9bZT3073nhj Content-Type: text/x-emacs-lisp; charset=UTF-8; name="term.el" Content-Disposition: attachment; filename="term.el" Content-Transfer-Encoding: base64 Ozs7IHRlcm0uZWwgLS0tIGdlbmVyYWwgY29tbWFuZCBpbnRlcnByZXRlciBpbiBhIHdpbmRv dyBzdHVmZgoKOzsgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkyLCAxOTk0LCAxOTk1 LCAyMDAxLCAyMDAyLCAyMDAzLAo7OyAgIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgs IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgo7OyBBdXRob3I6IFBlciBC b3RobmVyIDxwZXJAYm90aG5lci5jb20+Cjs7IE1haW50YWluZXI6IERhbiBOaWNvbGFlc2N1 IDxkYW5uQGljcy51Y2kuZWR1PiwgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4KOzsg QmFzZWQgb24gY29taW50IG1vZGUgd3JpdHRlbiBieTogT2xpbiBTaGl2ZXJzIDxzaGl2ZXJz QGNzLmNtdS5lZHU+Cjs7IEtleXdvcmRzOiBwcm9jZXNzZXMKCjs7IFRoaXMgZmlsZSBpcyBw YXJ0IG9mIEdOVSBFbWFjcy4KCjs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cjs7IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cjs7 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhl IExpY2Vuc2UsIG9yCjs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7 OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0 aCBHTlUgRW1hY3MuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCgo7OzsgTWFyY2sgMTMgMjAwMQo7OzsgRml4ZXMgZm9yIENKSyBzdXBwb3J0IGJ5IFlv bmcgTHUgPGx5b25ndUB5YWhvby5jb20+LgoKOzs7IERpci9Ib3N0bmFtZSB0cmFja2luZyBh bmQgQU5TSSBjb2xvcml6YXRpb24gYnkKOzs7IE1hcmNvIE1lbGdhenppIDxtYXJjb0B0ZWNo aWUuY29tPi4KCjs7OyBUbyBzZWUgd2hhdCBJJ3ZlIG1vZGlmaWVkIGFuZCB3aGVyZSBpdCBj YW1lIGZyb20gc2VhcmNoIGZvciAnLW1tJwoKOzs7IENvbW1lbnRhcnk6Cgo7OzsgU3BlZWQg Y29uc2lkZXJhdGlvbnMgYW5kIGEgZmV3IGNhdmVhdHMKOzs7IC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCjs7Owo7OzsgV2hpbGUgdGhlIG1lc3NhZ2UgcGFzc2lu ZyBhbmQgdGhlIGNvbG9yaXphdGlvbiBzdXJlbHkgaW50cm9kdWNlIHNvbWUKOzs7IG92ZXJo ZWFkIHRoaXMgaGFzIGJlY2FtZSBzbyBzbWFsbCB0aGF0IElNSE8gaXMgc3VyZWx5IG91dHdl aWdodGVkIGJ5Cjs7OyB0aGUgYmVuZWZpdHMgeW91IGdldCBidXQsIGFzIHVzdWFsLCBZTU1W Cjs7Owo7OzsgSW1wb3J0YW50IGNhdmVhdCwgd2hlbiBkZWNpZGluZyB0aGUgY3Vyc29yLydn cmV5IGtleXMnIGtleWNvZGVzIEkgaGFkIHRvCjs7OyBtYWtlIGEgY2hvaWNlOiBvbiBteSBM aW51eCBib3ggdGhpcyBjaG9pY2UgYWxsb3dzIG1lIHRvIHJ1biBhbGwgdGhlCjs7OyBuY3Vy c2VzIGFwcGxpY2F0aW9ucyB3aXRob3V0IHByb2JsZW1zIGJ1dCBtYWtlIHRoZXNlIGtleXMK Ozs7IHVuY29tcHJlaGVuc2libGUgdG8gYWxsIHRoZSBjdXJzZXNYIHByb2dyYW1zLiAgWW91 ciBtaWxlYWdlIG1heSB2YXJ5IHNvCjs7OyB5b3UgbWF5IGNvbnNpZGVyIGNoYW5naW5nIHRo ZSBkZWZhdWx0ICdlbXVsYXRpb24nLiAgSnVzdCBzZWFyY2ggZm9yIHRoaXMKOzs7IHBpZWNl IG9mIGNvZGUgYW5kIG1vZGlmeSBpdCBhcyB5b3UgbGlrZToKOzs7Cjs7OyA7OyBXaGljaCB3 b3VsZCBiZSBiZXR0ZXI6ICAiXGVbQSIgb3IgIlxlT0EiPyByZWFkbGluZSBhY2NlcHRzIGVp dGhlci4KOzs7IDs7IEZvciBteSBjb25maWd1cmF0aW9uIGl0J3MgZGVmaW5pdGVseSBiZXR0 ZXIgXGVPQSBidXQgWU1NVi4gIC1tbQo7OzsgOzsgRm9yIGV4YW1wbGU6IHZpIHdvcmtzIHdp dGggXGVPQSB3aGlsZSBlbG0gd2FudHMgXGVbQSAuLi4KOzs7IChkZWZ1biB0ZXJtLXNlbmQt dXAgICAgKCkgKGludGVyYWN0aXZlKSAodGVybS1zZW5kLXJhdy1zdHJpbmcgIlxlT0EiKSkK Ozs7IChkZWZ1biB0ZXJtLXNlbmQtZG93biAgKCkgKGludGVyYWN0aXZlKSAodGVybS1zZW5k LXJhdy1zdHJpbmcgIlxlT0IiKSkKOzs7IChkZWZ1biB0ZXJtLXNlbmQtcmlnaHQgKCkgKGlu dGVyYWN0aXZlKSAodGVybS1zZW5kLXJhdy1zdHJpbmcgIlxlT0MiKSkKOzs7IChkZWZ1biB0 ZXJtLXNlbmQtbGVmdCAgKCkgKGludGVyYWN0aXZlKSAodGVybS1zZW5kLXJhdy1zdHJpbmcg IlxlT0QiKSkKOzs7Cjs7Owo7OzsgSU1QT1JUQU5UOiBhZGRpdGlvbnMgJiBjaGFuZ2VzCjs7 OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7OyAgV2l0aCB0aGlzIGVu aGFuY2VkIGFuc2ktdGVybS5lbCB5b3Ugd2lsbCBnZXQgYSByZWxpYWJsZSBtZWNoYW5pc20g b2YKOzs7IGRpcmVjdG9yeS91c2VybmFtZS9ob3N0IHRyYWNraW5nOiB0aGUgb25seSBkcmF3 YmFjayBpcyB0aGF0IHlvdSB3aWxsCjs7OyBoYXZlIHRvIG1vZGlmeSB5b3VyIHNoZWxsIHN0 YXJ0LXVwIHNjcmlwdC4gIEl0J3Mgd29ydGggaXQsIGJlbGlldmUgbWUgOikuCjs7Owo7Ozsg V2hlbiB5b3UgcmxvZ2luL3N1L3RlbG5ldCBhbmQgdGhlIGFjY291bnQgeW91IGFjY2VzcyBo YXMgYSBtb2RpZmllZAo7Ozsgc3RhcnR1cCBzY3JpcHQsIHlvdSB3aWxsIGJlIGFibGUgdG8g YWNjZXNzIHRoZSByZW1vdGUgZmlsZXMgYXMgdXN1YWwKOzs7IHdpdGggQy14IEMtZiwgaWYg aXQncyBuZWVkZWQgeW91IHdpbGwgaGF2ZSB0byBlbnRlciBhIHBhc3N3b3JkLAo7Ozsgb3Ro ZXJ3aXNlIHRoZSBmaWxlIHNob3VsZCBnZXQgbG9hZGVkIHN0cmFpZ2h0IGF3YXkuCjs7Owo7 OzsgVGhpcyBpcyB1c2VmdWwgZXZlbiBpZiB5b3Ugd29yayBvbmx5IG9uIG9uZSBob3N0OiBp dCBvZnRlbiBoYXBwZW5zIHRoYXQsCjs7OyBmb3IgbWFpbnRlbmFuY2UgcmVhc29ucywgeW91 IGhhdmUgdG8gZWRpdCBmaWxlcyAnYXMgcm9vdCc6IGJlZm9yZQo7OzsgcGF0Y2hpbmcgdGVy bS5lbCwgSSBzdS1lZCBpbiBhIHRlcm0uZWwgYnVmZmVyIGFuZCB1c2VkIHZpIDopLCBub3cg SQo7Ozsgc2ltcGx5IGRvIGEgQy14IEMtZiBhbmQsIHZpYSBhbmdlLWZ0cCwgdGhlIGZpbGUg aXMgYXV0b21hdGljYWxseSBsb2FkZWQKOzs7ICdhcy1yb290Jy4gICggSWYgeW91IGRvbid0 IHdhbnQgdG8gZW50ZXIgdGhlIHJvb3QgcGFzc3dvcmQgZXZlcnkgdGltZSB5b3UKOzs7IGNh biBwdXQgaXQgaW4geW91ciAubmV0cmM6IG5vdGUgdGhhdCB0aGlzIGlzIC1ub3QtIGFkdmlz YWJsZSBpZiB5b3UncmUKOzs7IGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQgb3IgaWYgc29t ZWJvZHkgZWxzZSB3b3JrcyBvbiB5b3VyIHdvcmtzdGF0aW9uISkKOzs7Cjs7OyBJZiB5b3Ug dXNlIHd1LWZ0cGQgeW91IGNhbiB1c2Ugc29tZSBvZiBpdHMgZmVhdHVyZXMgdG8gYXZvaWQg cm9vdCBmdHAKOzs7IGFjY2VzcyB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQ6IGp1c3QgcHV0 IGluIC9ldGMvZnRwaG9zdHMgc29tZXRoaW5nIGxpa2UKOzs7Cjs7OyAjIExvY2FsIGFjY2Vz cwo7OzsgYWxsb3cJcm9vdAkJMTI3LjAuMC4xCjs7Owo7OzsgIyBCeSBkZWZhdWx0IG5vYm9k eSBjYW4ndCBkbyBhbnl0aGluZwo7OzsgZGVueQlyb290CQkqCjs7Owo7OzsKOzs7ICAgICAg ICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7 OyAgSWYsIGluc3RlYWQgb2YgJ3Rlcm0nLCB5b3UgY2FsbCAnYW5zaS10ZXJtJywgeW91IGdl dCBtdWx0aXBsZSB0ZXJtCjs7OyBidWZmZXJzLCBhZnRlciBldmVyeSBuZXcgY2FsbCBhbnNp LXRlcm0gb3BlbnMgYSBuZXcgKmFuc2ktdGVybSo8eHg+IHdpbmRvdywKOzs7IHdoZXJlIDx4 eD4gaXMsIGFzIHVzdWFsLCBhIG51bWJlci4uLgo7OzsKOzs7ICAgICAgICAgICAgIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7OyAgV2l0aCB0aGUg dGVybS1idWZmZXItbWF4aW11bS1zaXplIHlvdSBjYW4gZmluYWxseSBkZWNpZGUgaG93IG1h bnkKOzs7IHNjcm9sbGJhY2sgbGluZXMgdG8ga2VlcDogaXRzIGRlZmF1bHQgaXMgMjA0OCBi dXQgeW91IGNhbiBjaGFuZ2UgaXQgYXMKOzs7IHVzdWFsLgo7OzsKOzs7ICAgICAgICAgICAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7Owo7Ozsg IEFOU0kgY29sb3JpemF0aW9uIHNob3VsZCB3b3JrIHdlbGwsIEkndmUgZGVjaWRlZCB0byBs aW1pdCB0aGUgaW50ZXJwcmV0ZXIKOzs7IHRvIGZpdmUgb3V0c3RhbmRpbmcgY29tbWFuZHMg KGxpa2UgRVNDIFsgMDE7MDQ7MzI7NDE7MDdtLgo7OzsgIFlvdSBzaG91bGRuJ3QgbmVlZCBt b3JlLCBpZiB5b3UgZG8sIHRlbGwgbWUgYW5kIEknbGwgaW5jcmVhc2UgaXQuICBJdCdzCjs7 OyBzbyBlYXN5IHlvdSBjb3VsZCBkbyBpdCB5b3Vyc2VsZi4uLgo7OzsKOzs7ICBCbGluaywg aXMgbm90IHN1cHBvcnRlZC4gIEN1cnJlbnRseSBpdCdzIG1hcHBlZCBhcyBib2xkLgo7OzsK Ozs7IEltcG9ydGFudCBjYXZlYXQ6Cjs7OyAtLS0tLS0tLS0tLS0tLS0tLQo7OzsgICBpZiB5 b3Ugd2FudCBjdXN0b20gY29sb3JzIGluIHRlcm0uZWwgcmVkZWZpbmUgdGVybS1kZWZhdWx0 LWZnLWNvbG9yCjs7OyAgYW5kIHRlcm0tZGVmYXVsdC1iZy1jb2xvciBCRUZPUkUgbG9hZGlu ZyBpdC4KOzs7Cjs7OyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCjs7Owo7OzsgIElmIHlvdSdkIGxpa2UgdG8gY2hlY2sgb3V0IG15IGNv bXBsZXRlIGNvbmZpZ3VyYXRpb24sIHlvdSBjYW4gZG93bmxvYWQKOzs7IGl0IGZyb20gaHR0 cDovL3d3dy5wb2xpdG8uaXQvfnM2NDkxMi90aGluZ3MuaHRtbCwgaXQncyB+NTAwayBpbiBz aXplIGFuZAo7OzsgY29udGFpbnMgbXkgLmNzaHJjLCAuZW1hY3MgYW5kIG15IHdob2xlIHNp dGUtbGlzcCBzdWJkaXJlY3RvcnkuICAobm90aWNlCjs7OyB0aGF0IHRoaXMgdGVybS5lbCBt YXkgYmUgbmV3ZXIvb2xkZXIgdGhhbiB0aGUgb25lIGluIHRoZXJlLCBwbGVhc2UKOzs7IGNo ZWNrISkKOzs7Cjs7OyAgVGhpcyBjb21wbGV0ZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zLCBh bW9uZyBvdGhlciB0aGluZ3MsIGEgY29tcGxldGUKOzs7IHJlY3Rhbmd1bGFyIG1hcmtpbmcg c29sdXRpb24gKGJhc2VkIG9uIHJlY3QtbWFyay5lbCBhbmQKOzs7IHBjLWJpbmRpbmdzLmVs KSBhbmQgc2hvdWxkIGJlIGEgZ29vZCBleGFtcGxlIG9mIGhvdyBleHRlbnNpdmVseSBFbWFj cwo7OzsgY2FuIGJlIGNvbmZpZ3VyZWQgb24gYSBwcHAtY29ubmVjdGVkIHdzLgo7OzsKOzs7 ICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K Ozs7Cjs7OyAgVE9ETzoKOzs7Cjs7OyAgLSBBZGQgaG9va3MgdG8gYWxsb3cgcmF3LW1vZGUg a2V5cyB0byBiZSBjb25maWd1cmFibGUKOzs7ICAtIFdoaWNoIGtleXMgYXJlIGJldHRlciA/ IFxlT0Egb3IgXGVbQSA/Cjs7Owo7OzsKOzs7ICBDaGFuZ2VzOgo7OzsKOzs7IFY0LjAgSmFu dWFyeSAxOTk3Cjs7Owo7OzsgICAtIEh1Z2UgcmV3b3JraW5nIG9mIHRoZSBmYWNlcyBjb2Rl OiBub3cgd2Ugb25seSBoYXZlIHJvdWdobHkgMjAtMzAKOzs7ICAgICBmYWNlcyBmb3IgZXZl cnl0aGluZyBzbyB3ZSdyZSBldmVuIGZhc3RlciB0aGFuIHRoZSBvbGQgbWQtdGVybS5lbCAh Cjs7OyAgIC0gRmluaXNoZWQgcmVtb3ZpbmcgYWxsIHRoZSBKLVNoZWxsIGNvZGUuCjs7Owo7 OzsgIFYzLjAgSmFudWFyeSAxOTk3Cjs7Owo7OzsgIC0gTm93IGFsbCB0aGUgc3VwcG9ydGFi bGUgQU5TSSBjb21tYW5kcyB3b3JrIHdlbGwuCjs7OyAgLSBSZXdvcmtlZCBhIGxpdHRsZSB0 aGUgY29kZTogbXVjaCBsZXNzIGpzaC1pbnNwaXJlZCBzdHVmZgo7OzsKOzs7ICBWMi4zIE5v dmVtYmVyCjs7Owo7OzsgIC0gTm93IGFsbCB0aGUgZmFjZXMgYXJlIGFjY2Vzc2VkIHRocm91 Z2ggYW4gYXJyYXk6IG11Y2ggY2xlYW5lciBjb2RlLgo7OzsKOzs7ICBWMi4yIE5vdmVtYmVy IDQgMTk5Ngo7OzsKOzs7ICAtIEltcGxlbWVudGVkIEFOU0kgb3V0cHV0IGNvbG9yaXphdGlv biAoIGEgYml0IHJvdWdoIGJ1dCBlbm91Z2ggZm9yCjs7OyAgICBjb2xvcl9scyApCjs7Owo7 OzsgIC0gSW1wbGVtZW50ZWQgYSBtYXhpbXVtIGxpbWl0IGZvciB0aGUgc2Nyb2xsIGJ1ZmZl ciAoc3RvbGVuIGZyb20KOzs7ICAgIGNvbWludC5lbCkKOzs7Cjs7OyAgdjIuMSBPY3RvYmVy IDI4IDE5OTYsIGZpcnN0IHB1YmxpYyByZWxlYXNlCjs7Owo7OzsgIC0gU29tZSBuZXcga2V5 YmluZGluZ3MgZm9yIHRlcm0tY2hhciBtb2RlICggbm90YWJseSBob21lL2VuZC8uLi4pCjs7 OyAgLSBEaXJlY3RvcnksIGhvc3RuYW1lIGFuZCB1c2VybmFtZSB0cmFja2luZyB2aWEgYW5n ZS1mdHAKOzs7ICAtIE11bHRpLXRlcm0gY2FwYWJpbGl0eSB2aWEgdGhlIGFuc2ktdGVybSBj YWxsCjs7Owo7OzsgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7ICBZb3Ugc2hvdWxkL2NvdWxkIGhhdmUgc29t ZXRoaW5nIGxpa2UgdGhpcyBpbiB5b3VyIC5lbWFjcyB0byB0YWtlCjs7OyAgZnVsbCBhZHZh bnRhZ2Ugb2YgdGhpcyBwYWNrYWdlCjs7Owo7OzsgIChhZGQtaG9vayAndGVybS1tb2RlLWhv b2sKOzs7ICAJCSAgKGZ1bmN0aW9uCjs7OyAgCQkgICAobGFtYmRhICgpCjs7OyAgCQkJIChz ZXRxIHRlcm0tcHJvbXB0LXJlZ2V4cCAiXlteIyQlPlxuXSpbIyQlPl0gKiIpCjs7OyAgCQkJ IChtYWtlLWxvY2FsLXZhcmlhYmxlICdtb3VzZS15YW5rLWF0LXBvaW50KQo7OzsgIAkJCSAo bWFrZS1sb2NhbC12YXJpYWJsZSAndHJhbnNpZW50LW1hcmstbW9kZSkKOzs7ICAJCQkgKHNl dHEgbW91c2UteWFuay1hdC1wb2ludCB0KQo7OzsgIAkJCSAoc2V0cSB0cmFuc2llbnQtbWFy ay1tb2RlIG5pbCkKOzs7ICAJCQkgKGF1dG8tZmlsbC1tb2RlIC0xKQo7OzsgIAkJCSAoc2V0 cSB0YWItd2lkdGggOCApKSkpCjs7Owo7OzsKOzs7ICAgICAgICAgICAgIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7OyAgSWYgeW91IHdhbnQgdG8g dXNlIGNvbG9yIGxzIHRoZSBiZXN0IHNldHVwIGlzIHRvIGhhdmUgYSBkaWZmZXJlbnQgZmls ZQo7Ozsgd2hlbiB5b3UgdXNlIGV0ZXJtICggc2VlIGFib3ZlLCBtaW5lIGlzIG5hbWVkIC5l bWFjc19kaXJjb2xvcnMgKS4gIFRoaXMKOzs7IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUg dGVybWluYWxzLCByeHZ0IGZvciBleGFtcGxlLCBuZWVkIG5vbi1hbnNpCjs7OyBoYWNrcyB0 byB3b3JrICggZm9yIGV4YW1wbGUgb24gbXkgcnh2dCB3aGl0ZSBpcyB3aXJlZCB0byBmZywg YW5kIHRvCjs7OyBvYnRhaW4gbm9ybWFsIHdoaXRlIEkgaGF2ZSB0byBkbyBib2xkLXdoaXRl IDopCjs7Owo7OzsgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo7OzsKOzs7Cjs7OyAgIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBj b2xvciBscyB1dGlsaXR5Cjs7OyAgIyBUaGlzIGZpbGUgZ29lcyBpbiB0aGUgL2V0YyBkaXJl Y3RvcnksIGFuZCBtdXN0IGJlIHdvcmxkIHJlYWRhYmxlLgo7OzsgICMgWW91IGNhbiBjb3B5 IHRoaXMgZmlsZSB0byAuZGlyX2NvbG9ycyBpbiB5b3VyICRIT01FIGRpcmVjdG9yeSB0bwo7 OzsgICMgb3ZlcnJpZGUgdGhlIHN5c3RlbSBkZWZhdWx0cy4KOzs7Cjs7OyAgIyBDT0xPUiBu ZWVkcyBvbmUgb2YgdGhlc2UgYXJndW1lbnRzOiAndHR5JyBjb2xvcml6ZXMgb3V0cHV0IHRv IHR0eXMsIGJ1dAo7OzsgICMgbm90IHBpcGVzLiAgJ2FsbCcgYWRkcyBjb2xvciBjaGFyYWN0 ZXJzIHRvIGFsbCBvdXRwdXQuICAnbm9uZScgc2h1dHMKOzs7ICAjIGNvbG9yaXphdGlvbiBv ZmYuCjs7OyAgQ09MT1IgdHR5Cjs7OyAgT1BUSU9OUyAtRgo7OzsKOzs7ICAjIEJlbG93LCB0 aGVyZSBzaG91bGQgYmUgb25lIFRFUk0gZW50cnkgZm9yIGVhY2ggdGVybXR5cGUgdGhhdCBp cwo7OzsgICMgY29sb3JpemFibGUKOzs7ICBURVJNIGV0ZXJtCjs7Owo7OzsgICMgRUlHSFRC SVQsIGZvbGxvd2VkIGJ5ICcxJyBmb3Igb24sICcwJyBmb3Igb2ZmLiAgKDgtYml0IG91dHB1 dCkKOzs7ICBFSUdIVEJJVCAxCjs7Owo7OzsgICMgQmVsb3cgYXJlIHRoZSBjb2xvciBpbml0 IHN0cmluZ3MgZm9yIHRoZSBiYXNpYyBmaWxlIHR5cGVzLiAgQSBjb2xvciBpbml0Cjs7OyAg IyBzdHJpbmcgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBudW1l cmljIGNvZGVzOgo7OzsgICMgQXR0cmlidXRlIGNvZGVzOgo7OzsgICMgMDA9bm9uZSAwMT1i b2xkIDA0PXVuZGVyc2NvcmUgMDU9YmxpbmsgMDc9cmV2ZXJzZSAwOD1jb25jZWFsZWQKOzs7 ICAjIFRleHQgY29sb3IgY29kZXM6Cjs7OyAgIyAzMD1ibGFjayAzMT1yZWQgMzI9Z3JlZW4g MzM9eWVsbG93IDM0PWJsdWUgMzU9bWFnZW50YSAzNj1jeWFuIDM3PXdoaXRlCjs7OyAgIyBC YWNrZ3JvdW5kIGNvbG9yIGNvZGVzOgo7OzsgICMgNDA9YmxhY2sgNDE9cmVkIDQyPWdyZWVu IDQzPXllbGxvdyA0ND1ibHVlIDQ1PW1hZ2VudGEgNDY9Y3lhbiA0Nz13aGl0ZQo7OzsgIE5P Uk1BTCAwMAkjIGdsb2JhbCBkZWZhdWx0LCBhbHRob3VnaCBldmVyeXRoaW5nIHNob3VsZCBi ZSBzb21ldGhpbmcuCjs7OyAgRklMRSAwMCAJCSMgbm9ybWFsIGZpbGUKOzs7ICBESVIgMDA7 MzcgCSMgZGlyZWN0b3J5Cjs7OyAgTElOSyAwMDszNiAJIyBzeW1ib2xpYyBsaW5rCjs7OyAg RklGTyAwMDszNwkjIHBpcGUKOzs7ICBTT0NLIDQwOzM1CSMgc29ja2V0Cjs7OyAgQkxLIDMz OzAxCSMgYmxvY2sgZGV2aWNlIGRyaXZlcgo7OzsgIENIUiAzMzswMSAJIyBjaGFyYWN0ZXIg ZGV2aWNlIGRyaXZlcgo7OzsKOzs7ICAjIFRoaXMgaXMgZm9yIGZpbGVzIHdpdGggZXhlY3V0 ZSBwZXJtaXNzaW9uOgo7OzsgIEVYRUMgMDA7MzIKOzs7Cjs7OyAgIyBMaXN0IGFueSBmaWxl IGV4dGVuc2lvbnMgbGlrZSAnLmd6JyBvciAnLnRhcicgdGhhdCB5b3Ugd291bGQgbGlrZSBs cwo7OzsgICMgdG8gY29sb3JpemUgYmVsb3cuICBQdXQgdGhlIGV4dGVuc2lvbiwgYSBzcGFj ZSwgYW5kIHRoZSBjb2xvciBpbml0Cjs7OyAgIyBzdHJpbmcuICAoYW5kIGFueSBjb21tZW50 cyB5b3Ugd2FudCB0byBhZGQgYWZ0ZXIgYSAnIycpCjs7OyAgLnRhciAwMTszMyAjIGFyY2hp dmVzIG9yIGNvbXByZXNzZWQKOzs7ICAudGd6IDAxOzMzCjs7OyAgLmFyaiAwMTszMwo7Ozsg IC50YXogMDE7MzMKOzs7ICAubHpoIDAxOzMzCjs7OyAgLnppcCAwMTszMwo7OzsgIC56ICAg MDE7MzMKOzs7ICAuWiAgIDAxOzMzCjs7OyAgLmd6ICAwMTszMwo7OzsgIC5qcGcgMDE7MzUg IyBpbWFnZSBmb3JtYXRzCjs7OyAgLmdpZiAwMTszNQo7OzsgIC5ibXAgMDE7MzUKOzs7ICAu eGJtIDAxOzM1Cjs7OyAgLnhwbSAwMTszNQo7OzsKOzs7Cjs7OyAgICAgICAgICAgICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjs7Owo7OzsgIE5vdGljZTog Zm9yIGRpcmVjdG9yeS9ob3N0L3VzZXIgdHJhY2tpbmcgeW91IG5lZWQgdG8gaGF2ZSBzb21l dGhpbmcKOzs7IGxpa2UgdGhpcyBpbiB5b3VyIHNoZWxsIHN0YXJ0dXAgc2NyaXB0ICggdGhp cyBpcyBmb3IgdGNzaCBidXQgc2hvdWxkCjs7OyBiZSBxdWl0ZSBlYXN5IHRvIHBvcnQgdG8g b3RoZXIgc2hlbGxzICkKOzs7Cjs7OyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCjs7Owo7OzsKOzs7ICAJIHNldCBvcyA9IGB1bmFtZWAK Ozs7ICAJIHNldCBob3N0ID0gYGhvc3RuYW1lYAo7OzsgIAkgc2V0IGRhdGUgPSBgZGF0ZWAK Ozs7Cjs7OyAgIyBzdSBkb2VzIG5vdCBjaGFuZ2UgdGhpcyBidXQgSSdkIGxpa2UgaXQgdG8K Ozs7Cjs7OyAgCSBzZXQgdXNlciA9IGB3aG9hbWlgCjs7Owo7OzsgICMgLi4uCjs7Owo7Ozsg IAkgaWYgKCBldGVybSA9fiAkVEVSTSApIHRoZW4KOzs7Cjs7OyAgCQllY2hvIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cjs7OyAgCQllY2hvIEhlbGxvICR1c2VyCjs7OyAgCQllY2hvIFRvZGF5IGlzICRkYXRlCjs7 OyAgCQllY2hvIFdlIGFyZSBvbiAkaG9zdCBydW5uaW5nICRvcyB1bmRlciBFbWFjcyB0ZXJt IG1vZGUKOzs7ICAJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOzs7Cjs7OyAgCQlzZXRlbnYgRURJVE9SIGVt YWNzY2xpZW50Cjs7Owo7OzsgICAjIE5vdGljZTogJGhvc3QgYW5kICR1c2VyIGhhdmUgYmVl biBzZXQgYmVmb3JlIHRvICdob3N0bmFtZScgYW5kICd3aG9hbWknCjs7OyAgICMgdGhpcyBp cyBuZWNlc3NhcnkgYmVjYXVzZSwgZi5lLiwgY2VydGFpbiB2ZXJzaW9ucyBvZiAnc3UnIGRv IG5vdCBjaGFuZ2UKOzs7ICAgIyAkdXNlciwgWU1NVjogaWYgeW91IGRvbid0IHdhbnQgdG8g ZmlkZGxlIHdpdGggdGhlbSBkZWZpbmUgYSBjb3VwbGUKOzs7ICAgIyBvZiBuZXcgdmFyaWFi bGVzIGFuZCB1c2UgdGhlc2UgaW5zdGVhZC4KOzs7ICAgIyBOT1RJQ0UgdGhhdCB0aGVyZSBp cyBhIHNwYWNlIGJldHdlZW4gIkFuU2lUPyIgYW5kICR3aGF0ZXZlciBOT1RJQ0UKOzs7Cjs7 OyAgICMgVGhlc2UgYXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgcmVhbCBjd2QgaW4gdGhlIG1l c3NhZ2VzLCBub3QgdGhlIGxvZ2luCjs7OyAgICMgdGltZSBvbmUgIQo7OzsKOzs7IAkJc2V0 IGN3ZF9oYWNrPSckY3dkJwo7OzsgCQlzZXQgaG9zdF9oYWNrPSckaG9zdCcKOzs7IAkJc2V0 IHVzZXJfaGFjaz0nJHVzZXInCjs7Owo7OzsgICAjIE5vdGljZSB0aGF0IHRoZSBeWyBjaGFy YWN0ZXIgaXMgYW4gRVNDLCBub3QgdHdvIGNoYXJzLiAgWW91IGNhbgo7OzsgICAjIGdldCBp dCBpbiB2YXJpb3VzIHdheXMsIGZvciBleGFtcGxlIGJ5IHR5cGluZwo7OzsgICAjIGVjaG8g LWUgJ1wwMzMnID4gZXNjYXBlLmZpbGUKOzs7ICAgIyBvciBieSB1c2luZyB5b3VyIGZhdm91 cml0ZSBlZGl0b3IKOzs7Cjs7OyAJCWZvcmVhY2ggdGVtcCAoY2QgcHVzaGQpCjs7OyAJCQlh bGlhcyAkdGVtcCAiJHRlbXAgXCEqIDsgZWNobyAnG0FuU2lUYycgJGN3ZF9oYWNrIgo7Ozsg CQllbmQKOzs7ICAgCQlhbGlhcyBwb3BkICdwb3BkIDtlY2hvICIbQW5TaVRjIiAkY3dkJwo7 OzsKOzs7ICAgIyBFdmVyeSBjb21tYW5kIHRoYXQgY2FuIG1vZGlmeSB0aGUgdXNlci9ob3N0 L2RpcmVjdG9yeSBzaG91bGQgYmUgYWxpYXNlZAo7OzsgICAjIGFzIGZvbGxvd3MgZm9yIHRo ZSB0cmFja2luZyBtZWNoYW5pc20gdG8gd29yay4KOzs7Cjs7OyAJCWZvcmVhY2ggdGVtcCAo IHJsb2dpbiB0ZWxuZXQgcnNoIHNoIGtzaCBjc2ggdGNzaCB6c2ggYmFzaCB0Y2wgc3UgKQo7 OzsgCQkJYWxpYXMgJHRlbXAgIiR0ZW1wIFwhKiA7IGVjaG8gJxtBblNpVGgnICRob3N0X2hh Y2sgOyBcCjs7OyAJCQkJCWVjaG8gJxtBblNpVHUnICR1c2VyX2hhY2sgO2VjaG8gJxtBblNp VGMnICRjd2RfaGFjayIKOzs7IAkJZW5kCjs7Owo7OzsgICAjIFN0YXJ0IHVwICYgdXNlIGNv bG9yIGxzCjs7Owo7OzsgCQllY2hvICIbQW5TaVRoIiAkaG9zdAo7OzsgCQllY2hvICIbQW5T aVR1IiAkdXNlcgo7OzsgCQllY2hvICIbQW5TaVRjIiAkY3dkCjs7Owo7OzsgICAjIHNvbWUg aG91c2VrZWVwaW5nCjs7Owo7OzsgCQl1bnNldCBjd2RfaGFjawo7OzsgCQl1bnNldCBob3N0 X2hhY2sKOzs7IAkJdW5zZXQgdXNlcl9oYWNrCjs7OyAJCXVuc2V0IHRlbXAKOzs7Cjs7OyAJ CWV2YWwgYC9iaW4vZGlyY29sb3JzIC9ob21lL21hcmNvLy5lbWFjc19kaXJjb2xvcnNgCjs7 OyAgICBlbmRpZgo7OzsKOzs7ICAjIC4uLgo7OzsKOzs7ICAjIExldCdzIG5vdCBjbHV0dGVy IHVzZXIgc3BhY2UKOzs7Cjs7OyAgCSB1bnNldCBvcwo7OzsgIAkgdW5zZXQgZGF0ZQo7OzsK Ozs7Cgo7OzsgT3JpZ2luYWwgQ29tbWVudGFyeToKOzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0t Cgo7OyBUaGUgY2hhbmdlbG9nIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgoKOzsgUGxl YXNlIHNlbmQgbWUgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgYW5kIGV4dGVuc2lvbnMsIHNv IHRoYXQgSSBjYW4KOzsgbWVyZ2UgdGhlbSBpbnRvIHRoZSBtYXN0ZXIgc291cmNlLgo7OyAg ICAgLSBQZXIgQm90aG5lciAoYm90aG5lckBjeWdudXMuY29tKQoKOzsgVGhpcyBmaWxlIGRl ZmluZXMgYSBnZW5lcmFsIGNvbW1hbmQtaW50ZXJwcmV0ZXItaW4tYS1idWZmZXIgcGFja2Fn ZQo7OyAodGVybSBtb2RlKS4gIFRoZSBpZGVhIGlzIHRoYXQgeW91IGNhbiBidWlsZCBzcGVj aWZpYyBwcm9jZXNzLWluLWEtYnVmZmVyCjs7IG1vZGVzIG9uIHRvcCBvZiB0ZXJtIG1vZGUg LS0gZS5nLiwgbGlzcCwgc2hlbGwsIHNjaGVtZSwgVCwgc29hciwgLi4uLgo7OyBUaGlzIHdh eSwgYWxsIHRoZXNlIHNwZWNpZmljIHBhY2thZ2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgZnVu Y3Rpb25hbGl0eSwKOzsgYW5kIGEgY29tbW9uIHNldCBvZiBiaW5kaW5ncywgd2hpY2ggbWFr ZXMgdGhlbSBlYXNpZXIgdG8gdXNlIChhbmQKOzsgc2F2ZXMgY29kZSwgaW1wbGVtZW50YXRp b24gdGltZSwgZXRjLiwgZXRjLikuCgo7OyBGb3IgaGludHMgb24gY29udmVydGluZyBleGlz dGluZyBwcm9jZXNzIG1vZGVzIChlLmcuLCB0ZXgtbW9kZSwKOzsgYmFja2dyb3VuZCwgZGJ4 LCBnZGIsIGtlcm1pdCwgcHJvbG9nLCB0ZWxuZXQpIHRvIHVzZSB0ZXJtLW1vZGUKOzsgaW5z dGVhZCBvZiBzaGVsbC1tb2RlLCBzZWUgdGhlIG5vdGVzIGF0IHRoZSBlbmQgb2YgdGhpcyBm aWxlLgoKDAo7OyBCcmllZiBDb21tYW5kIERvY3VtZW50YXRpb246Cjs7PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQo7OyBUZXJtIE1vZGUgQ29tbWFuZHM6IChjb21tb24gdG8gYWxsIGRlcml2 ZWQgbW9kZXMsIGxpa2UgY211c2hlbGwgJiBjbXVsaXNwCjs7IG1vZGUpCjs7Cjs7IG0tcAkg ICAgdGVybS1wcmV2aW91cy1pbnB1dCAgICAJICBDeWNsZSBiYWNrd2FyZHMgaW4gaW5wdXQg aGlzdG9yeQo7OyBtLW4JICAgIHRlcm0tbmV4dC1pbnB1dCAgCSAgICAJICBDeWNsZSBmb3J3 YXJkcwo7OyBtLXIgICAgIHRlcm0tcHJldmlvdXMtbWF0Y2hpbmctaW5wdXQgIFByZXZpb3Vz IGlucHV0IG1hdGNoaW5nIGEgcmVnZXhwCjs7IG0tcyAgICAgY29taW50LW5leHQtbWF0Y2hp bmctaW5wdXQgICAgICBOZXh0IGlucHV0IHRoYXQgbWF0Y2hlcwo7OyByZXR1cm4gIHRlcm0t c2VuZC1pbnB1dAo7OyBjLWMgYy1hIHRlcm0tYm9sICAgICAgICAgICAgICAgICAgICAgIEJl Z2lubmluZyBvZiBsaW5lOyBza2lwIHByb21wdC4KOzsgYy1kCSAgICB0ZXJtLWRlbGNoYXIt b3ItbWF5YmUtZW9mICAgICBEZWxldGUgY2hhciB1bmxlc3MgYXQgZW5kIG9mIGJ1ZmYuCjs7 IGMtYyBjLXUgdGVybS1raWxsLWlucHV0CSAgICAJICAgIF51Cjs7IGMtYyBjLXcgYmFja3dh cmQta2lsbC13b3JkICAgIAkgICAgXncKOzsgYy1jIGMtYyB0ZXJtLWludGVycnVwdC1zdWJq b2IgCSAgICBeYwo7OyBjLWMgYy16IHRlcm0tc3RvcC1zdWJqb2IJICAgIAkgICAgXnoKOzsg Yy1jIGMtXCB0ZXJtLXF1aXQtc3Viam9iCSAgICAJICAgIF5cCjs7IGMtYyBjLW8gdGVybS1r aWxsLW91dHB1dAkJICAgIERlbGV0ZSBsYXN0IGJhdGNoIG9mIHByb2Nlc3Mgb3V0cHV0Cjs7 IGMtYyBjLXIgdGVybS1zaG93LW91dHB1dAkJICAgIFNob3cgbGFzdCBiYXRjaCBvZiBwcm9j ZXNzIG91dHB1dAo7OyBjLWMgYy1oIHRlcm0tZHluYW1pYy1saXN0LWlucHV0LXJpbmcgIExp c3QgaW5wdXQgaGlzdG9yeQo7Owo7OyBOb3QgYm91bmQgYnkgZGVmYXVsdCBpbiB0ZXJtLW1v ZGUKOzsgdGVybS1zZW5kLWludmlzaWJsZQkJCVJlYWQgYSBsaW5lIHcvbyBlY2hvLCBhbmQg c2VuZCB0byBwcm9jCjs7IChUaGVzZSBhcmUgYm91bmQgaW4gc2hlbGwtbW9kZSkKOzsgdGVy bS1keW5hbWljLWNvbXBsZXRlCQlDb21wbGV0ZSBmaWxlbmFtZSBhdCBwb2ludC4KOzsgdGVy bS1keW5hbWljLWxpc3QtY29tcGxldGlvbnMJTGlzdCBjb21wbGV0aW9ucyBpbiBoZWxwIGJ1 ZmZlci4KOzsgdGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWZpbGVuYW1lCUV4cGFuZCBhbmQg Y29tcGxldGUgZmlsZW5hbWUgYXQgcG9pbnQ7Cjs7CQkJCQlyZXBsYWNlIHdpdGggZXhwYW5k ZWQvY29tcGxldGVkIG5hbWUuCjs7IHRlcm0ta2lsbC1zdWJqb2IJCQlObyBtZXJjeS4KOzsg dGVybS1zaG93LW1heGltdW0tb3V0cHV0ICAgICAgICAgICAgU2hvdyBhcyBtdWNoIG91dHB1 dCBhcyBwb3NzaWJsZS4KOzsgdGVybS1jb250aW51ZS1zdWJqb2IJCVNlbmQgQ09OVCBzaWdu YWwgdG8gYnVmZmVyJ3MgcHJvY2Vzcwo7OwkJCQkJZ3JvdXAuICBVc2VmdWwgaWYgeW91IGFj Y2lkZW50YWxseQo7OwkJCQkJc3VzcGVuZCB5b3VyIHByb2Nlc3MgKHdpdGggQy1jIEMteiku Cgo7OyB0ZXJtLW1vZGUtaG9vayBpcyB0aGUgdGVybSBtb2RlIGhvb2suICBCYXNpY2FsbHkg Zm9yIHlvdXIga2V5YmluZGluZ3MuCjs7IHRlcm0tbG9hZC1ob29rIGlzIHJ1biBhZnRlciBs b2FkaW5nIGluIHRoaXMgcGFja2FnZS4KCjs7OyBDb2RlOgoKOzsgVGhpcyBpcyBwYXNzZWQg dG8gdGhlIGluZmVyaW9yIGluIHRoZSBFTUFDUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwKOzsg c28gaXQgaXMgaW1wb3J0YW50IHRvIGluY3JlYXNlIGl0IGlmIHRoZXJlIGFyZSBwcm90b2Nv bC1yZWxldmFudCBjaGFuZ2VzLgooZGVmY29uc3QgdGVybS1wcm90b2NvbC12ZXJzaW9uICIw Ljk2IikKCihldmFsLXdoZW4tY29tcGlsZQogIChyZXF1aXJlICdhbmdlLWZ0cCkpCihyZXF1 aXJlICdyaW5nKQoocmVxdWlyZSAnZWhlbHApCgooZGVmZ3JvdXAgdGVybSBuaWwKICAiR2Vu ZXJhbCBjb21tYW5kIGludGVycHJldGVyIGluIGEgd2luZG93LiIKICA6Z3JvdXAgJ3Byb2Nl c3NlcykKCgwKOzs7IEJ1ZmZlciBMb2NhbCBWYXJpYWJsZXM6Cjs7Oz09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KOzs7IFRlcm0gbW9kZSBidWZmZXIgbG9jYWwgdmFyaWFibGVzOgo7OzsgICAg IHRlcm0tcHJvbXB0LXJlZ2V4cCAgICAtIHN0cmluZyAgICAgICB0ZXJtLWJvbCB1c2VzIHRv IG1hdGNoIHByb21wdC4KOzs7ICAgICB0ZXJtLWRlbGltaXRlci1hcmd1bWVudC1saXN0IC0g bGlzdCAgRm9yIGRlbGltaXRlcnMgYW5kIGFyZ3VtZW50cwo7OzsgICAgIHRlcm0tbGFzdC1p bnB1dC1zdGFydCAtIG1hcmtlciAgICAgICBIYW5keSBpZiBpbmZlcmlvciBhbHdheXMgZWNo b2VzCjs7OyAgICAgdGVybS1sYXN0LWlucHV0LWVuZCAgIC0gbWFya2VyICAgICAgIEZvciB0 ZXJtLWtpbGwtb3V0cHV0IGNvbW1hbmQKOzsgRm9yIHRoZSBpbnB1dCBoaXN0b3J5IG1lY2hh bmlzbToKKGRlZnZhciB0ZXJtLWlucHV0LXJpbmctc2l6ZSAzMiAiU2l6ZSBvZiBpbnB1dCBo aXN0b3J5IHJpbmcuIikKOzs7ICAgICB0ZXJtLWlucHV0LXJpbmctc2l6ZSAgLSBpbnRlZ2Vy Cjs7OyAgICAgdGVybS1pbnB1dC1yaW5nICAgICAgIC0gcmluZwo7OzsgICAgIHRlcm0taW5w dXQtcmluZy1pbmRleCAtIG51bWJlciAgICAgICAgICAgLi4uCjs7OyAgICAgdGVybS1pbnB1 dC1hdXRvZXhwYW5kIC0gc3ltYm9sICAgICAgICAgICAuLi4KOzs7ICAgICB0ZXJtLWlucHV0 LWlnbm9yZWR1cHMgLSBib29sZWFuICAgICAgICAgIC4uLgo7OzsgICAgIHRlcm0tbGFzdC1p bnB1dC1tYXRjaCAtIHN0cmluZyAgICAgICAgICAgLi4uCjs7OyAgICAgdGVybS1keW5hbWlj LWNvbXBsZXRlLWZ1bmN0aW9ucyAtIGhvb2sgICBGb3IgdGhlIGNvbXBsZXRpb24gbWVjaGFu aXNtCjs7OyAgICAgdGVybS1jb21wbGV0aW9uLWZpZ25vcmUgLSBsaXN0ICAgICAgICAgICAu Li4KOzs7ICAgICB0ZXJtLWdldC1vbGQtaW5wdXQgICAgLSBmdW5jdGlvbiAgICAgSG9va3Mg Zm9yIHNwZWNpZmljCjs7OyAgICAgdGVybS1pbnB1dC1maWx0ZXItZnVuY3Rpb25zIC0gaG9v ayAgICAgcHJvY2Vzcy1pbi1hLWJ1ZmZlcgo7OzsgICAgIHRlcm0taW5wdXQtZmlsdGVyICAg ICAtIGZ1bmN0aW9uICAgICAgICAgbW9kZXMuCjs7OyAgICAgdGVybS1pbnB1dC1zZW5kCS0g ZnVuY3Rpb24KOzs7ICAgICB0ZXJtLXNjcm9sbC10by1ib3R0b20tb24tb3V0cHV0IC0gc3lt Ym9sIC4uLgo7OzsgICAgIHRlcm0tc2Nyb2xsLXNob3ctbWF4aW11bS1vdXRwdXQgLSBib29s ZWFuLi4uCihkZWZ2YXIgdGVybS1oZWlnaHQpIDs7IE51bWJlciBvZiBsaW5lcyBpbiB3aW5k b3cuCihkZWZ2YXIgdGVybS13aWR0aCkgOzsgTnVtYmVyIG9mIGNvbHVtbnMgaW4gd2luZG93 LgooZGVmdmFyIHRlcm0taG9tZS1tYXJrZXIpIDs7IE1hcmtzIHRoZSAiaG9tZSIgcG9zaXRp b24gZm9yIGN1cnNvciBhZGRyZXNzaW5nLgooZGVmdmFyIHRlcm0tc2F2ZWQtaG9tZS1tYXJr ZXIgbmlsKSA7OyBXaGVuIHVzaW5nIGFsdGVybmF0ZSBzdWItYnVmZmVyLAo7OwkJY29udGFp bnMgc2F2ZWQgdGVybS1ob21lLW1hcmtlciBmcm9tIG9yaWdpbmFsIHN1Yi1idWZmZXIgLgoo ZGVmdmFyIHRlcm0tc3RhcnQtbGluZS1jb2x1bW4gMCkgOzsgKGN1cnJlbnQtY29sdW1uKSBh dCBzdGFydCBvZiBzY3JlZW4gbGluZSwKOzsJCW9yIG5pbCBpZiB1bmtub3duLgooZGVmdmFy IHRlcm0tY3VycmVudC1jb2x1bW4gMCkgOzsgSWYgbm9uLW5pbCwgaXMgY2FjaGUgZm9yIChj dXJyZW50LWNvbHVtbikuCihkZWZ2YXIgdGVybS1jdXJyZW50LXJvdyAwKSA7OyBDdXJyZW50 IHZlcnRpY2FsIHJvdyAocmVsYXRpdmUgdG8gaG9tZS1tYXJrZXIpCjs7CQlvciBuaWwgaWYg dW5rbm93bi4KKGRlZnZhciB0ZXJtLWluc2VydC1tb2RlIG5pbCkKKGRlZnZhciB0ZXJtLXZl cnRpY2FsLW1vdGlvbikKKGRlZnZhciB0ZXJtLXRlcm1pbmFsLXN0YXRlIDApIDs7IFN0YXRl IG9mIHRoZSB0ZXJtaW5hbCBlbXVsYXRvcjoKOzsJCXN0YXRlIDA6IE5vcm1hbCBzdGF0ZQo7 OwkJc3RhdGUgMTogTGFzdCBjaGFyYWN0ZXIgd2FzIGEgZ3JhcGhpYyBpbiB0aGUgbGFzdCBj b2x1bW4uCjs7CQlJZiBuZXh0IGNoYXIgaXMgZ3JhcGhpYywgZmlyc3QgbW92ZSBvbmUgY29s dW1uIHJpZ2h0Cjs7CQkoYW5kIGxpbmUgd2FycCkgYmVmb3JlIGRpc3BsYXlpbmcgaXQuCjs7 CQlUaGlzIGVtdWxhdGVzIChtb3JlIG9yIGxlc3MpIHRoZSBiZWhhdmlvciBvZiB4dGVybS4K OzsJCXN0YXRlIDI6IHNlZW4gRVNDCjs7CQlzdGF0ZSAzOiBzZWVuIEVTQyBbIChvciBFU0Mg WyA/KQo7OwkJc3RhdGUgNDogdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIgY29udGFpbnMgcGVu ZGluZyBvdXRwdXQuCihkZWZ2YXIgdGVybS1raWxsLWVjaG8tbGlzdCBuaWwpIDs7IEEgcXVl dWUgb2Ygc3RyaW5ncyB3aG9zZSBlY2hvCjs7CQl3ZSB3YW50IHN1cHByZXNzZWQuCihkZWZ2 YXIgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIpCihkZWZ2YXIgdGVybS10ZXJtaW5hbC1wcmV2 aW91cy1wYXJhbWV0ZXIpCihkZWZ2YXIgdGVybS1jdXJyZW50LWZhY2UgJ2RlZmF1bHQpCihk ZWZ2YXIgdGVybS1zY3JvbGwtc3RhcnQgMCkgOzsgVG9wLW1vc3QgbGluZSAoaW5jbHVzaXZl KSBvZiBzY3JvbGxpbmcgcmVnaW9uLgooZGVmdmFyIHRlcm0tc2Nyb2xsLWVuZCkgOzsgTnVt YmVyIG9mIGxpbmUgKHplcm8tYmFzZWQpIGFmdGVyIHNjcm9sbGluZyByZWdpb24uCihkZWZ2 YXIgdGVybS1wYWdlci1jb3VudCBuaWwpIDs7IElmIG5pbCwgcGFnaW5nIGlzIGRpc2FibGVk Lgo7OwkJT3RoZXJ3aXNlLCBudW1iZXIgb2YgbGluZXMgYmVmb3JlIHdlIG5lZWQgdG8gcGFn ZS4KKGRlZnZhciB0ZXJtLXNhdmVkLWN1cnNvciBuaWwpCihkZWZ2YXIgdGVybS1jb21tYW5k LWhvb2spCihkZWZ2YXIgdGVybS1sb2ctYnVmZmVyIG5pbCkKKGRlZnZhciB0ZXJtLXNjcm9s bC13aXRoLWRlbGV0ZSBuaWwpIDs7IHRlcm0tc2Nyb2xsLXdpdGgtZGVsZXRlIGlzIHQgaWYK OzsJCWZvcndhcmQgc2Nyb2xsaW5nIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBkZWxldGUg dG8KOzsJCXRvcC1tb3N0IGxpbmUocyk7IGFuZCBuaWwgaWYgc2Nyb2xsaW5nIHNob3VsZCBi ZSBpbXBsZW1lbnRlZAo7OwkJYnkgbW92aW5nIHRlcm0taG9tZS1tYXJrZXIuICBJdCBpcyBz ZXQgdG8gdCBpZiB0aGVyZSBpcyBhCjs7CQkobm9uLWRlZmF1bHQpIHNjcm9sbC1yZWdpb24g T1IgdGhlIGFsdGVybmF0ZSBidWZmZXIgaXMgdXNlZC4KKGRlZnZhciB0ZXJtLXBlbmRpbmct ZGVsZXRlLW1hcmtlcikgOzsgTmV3IHVzZXIgaW5wdXQgaW4gbGluZSBtb2RlIG5lZWRzIHRv Cjs7CQliZSBkZWxldGVkLCBiZWNhdXNlIGl0IGdldHMgZWNob2VkIGJ5IHRoZSBpbmZlcmlv ci4KOzsJCVRvIHJlZHVjZSBmbGlja2VyLCB3ZSBkZWZlciB0aGUgZGVsZXRlIHVudGlsIHRo ZSBuZXh0IG91dHB1dC4KKGRlZnZhciB0ZXJtLW9sZC1tb2RlLW1hcCBuaWwpIDs7IFNhdmVz IHRoZSBvbGQga2V5bWFwIHdoZW4gaW4gY2hhciBtb2RlLgooZGVmdmFyIHRlcm0tb2xkLW1v ZGUtbGluZS1mb3JtYXQpIDs7IFNhdmVzIG9sZCBtb2RlLWxpbmUtZm9ybWF0IHdoaWxlIHBh Z2luZy4KKGRlZnZhciB0ZXJtLXBhZ2VyLW9sZC1sb2NhbC1tYXAgbmlsKSA7OyBTYXZlcyBv bGQga2V5bWFwIHdoaWxlIHBhZ2luZy4KKGRlZnZhciB0ZXJtLXBhZ2VyLW9sZC1maWx0ZXIp IDs7IFNhdmVkIHByb2Nlc3MtZmlsdGVyIHdoaWxlIHBhZ2luZy4KCihkZWZjdXN0b20gZXhw bGljaXQtc2hlbGwtZmlsZS1uYW1lIG5pbAogICJJZiBub24tbmlsLCBpcyBmaWxlIG5hbWUg dG8gdXNlIGZvciBleHBsaWNpdGx5IHJlcXVlc3RlZCBpbmZlcmlvciBzaGVsbC4iCiAgOnR5 cGUgJyhjaG9pY2UgKGNvbnN0IG5pbCkgZmlsZSkKICA6Z3JvdXAgJ3Rlcm0pCgooZGVmdmFy IHRlcm0tcHJvbXB0LXJlZ2V4cCAiXiIKICAiUmVnZXhwIHRvIHJlY29nbml6ZSBwcm9tcHRz IGluIHRoZSBpbmZlcmlvciBwcm9jZXNzLgpEZWZhdWx0cyB0byBcIl5cIiwgdGhlIG51bGwg c3RyaW5nIGF0IEJPTC4KCkdvb2QgY2hvaWNlczoKICBDYW5vbmljYWwgTGlzcDogXCJeW14+ IFxcbl0qPis6PyAqXCIgKEx1Y2lkLCBmcmFueiwga2NsLCBULCBjc2NoZW1lLCBvYWtsaXNw KQogIEx1Y2lkIENvbW1vbiBMaXNwOiBcIl5cXFxcKD5cXFxcfFxcXFwoLT5cXFxcKStcXFxc KSAqXCIKICBmcmFuejogXCJeXFxcXCgtPlxcXFx8PFswLTldKj46XFxcXCkgKlwiCiAga2Ns OiBcIl4+KyAqXCIKICBzaGVsbDogXCJeW14jJCU+XFxuXSpbIyQlPl0gKlwiCiAgVDogXCJe PisgKlwiCgpUaGlzIGlzIGEgZ29vZCB0aGluZyB0byBzZXQgaW4gbW9kZSBob29rcy4iKQoK KGRlZnZhciB0ZXJtLWRlbGltaXRlci1hcmd1bWVudC1saXN0ICgpCiAgIkxpc3Qgb2YgY2hh cmFjdGVycyB0byByZWNvZ25pemUgYXMgc2VwYXJhdGUgYXJndW1lbnRzIGluIGlucHV0LgpT dHJpbmdzIGNvbXByaXNpbmcgYSBjaGFyYWN0ZXIgaW4gdGhpcyBsaXN0IHdpbGwgc2VwYXJh dGUgdGhlIGFyZ3VtZW50cwpzdXJyb3VuZGluZyB0aGVtLCBhbmQgYWxzbyBiZSByZWdhcmRl ZCBhcyBhcmd1bWVudHMgaW4gdGhlaXIgb3duIHJpZ2h0ICh1bmxpa2UKd2hpdGVzcGFjZSku ICBTZWUgYHRlcm0tYXJndW1lbnRzJy4KRGVmYXVsdHMgdG8gdGhlIGVtcHR5IGxpc3QuCgpG b3Igc2hlbGxzLCBhIGdvb2QgdmFsdWUgaXMgKD9cXHwgPyYgPzwgPz4gP1xcKCA/XFwpID9c XDspLgoKVGhpcyBpcyBhIGdvb2QgdGhpbmcgdG8gc2V0IGluIG1vZGUgaG9va3MuIikKCihk ZWZjdXN0b20gdGVybS1pbnB1dC1hdXRvZXhwYW5kIG5pbAogICJJZiBub24tbmlsLCBleHBh bmQgaW5wdXQgY29tbWFuZCBoaXN0b3J5IHJlZmVyZW5jZXMgb24gY29tcGxldGlvbi4KVGhp cyBtaXJyb3JzIHRoZSBvcHRpb25hbCBiZWhhdmlvciBvZiB0Y3NoIChpdHMgYXV0b2V4cGFu ZCBhbmQgaGlzdGxpdCkuCgpJZiB0aGUgdmFsdWUgaXMgYGlucHV0JywgdGhlbiB0aGUgZXhw YW5zaW9uIGlzIHNlZW4gb24gaW5wdXQuCklmIHRoZSB2YWx1ZSBpcyBgaGlzdG9yeScsIHRo ZW4gdGhlIGV4cGFuc2lvbiBpcyBvbmx5IHdoZW4gaW5zZXJ0aW5nCmludG8gdGhlIGJ1ZmZl cidzIGlucHV0IHJpbmcuICBTZWUgYWxzbyBgdGVybS1tYWdpYy1zcGFjZScgYW5kCmB0ZXJt LWR5bmFtaWMtY29tcGxldGUnLgoKVGhpcyB2YXJpYWJsZSBpcyBidWZmZXItbG9jYWwuIgog IDp0eXBlICcoY2hvaWNlIChjb25zdCBuaWwpIChjb25zdCB0KSAoY29uc3QgaW5wdXQpIChj b25zdCBoaXN0b3J5KSkKICA6Z3JvdXAgJ3Rlcm0pCgooZGVmY3VzdG9tIHRlcm0taW5wdXQt aWdub3JlZHVwcyBuaWwKICAiSWYgbm9uLW5pbCwgZG9uJ3QgYWRkIGlucHV0IG1hdGNoaW5n IHRoZSBsYXN0IG9uIHRoZSBpbnB1dCByaW5nLgpUaGlzIG1pcnJvcnMgdGhlIG9wdGlvbmFs IGJlaGF2aW9yIG9mIGJhc2guCgpUaGlzIHZhcmlhYmxlIGlzIGJ1ZmZlci1sb2NhbC4iCiAg OnR5cGUgJ2Jvb2xlYW4KICA6Z3JvdXAgJ3Rlcm0pCgooZGVmY3VzdG9tIHRlcm0taW5wdXQt cmluZy1maWxlLW5hbWUgbmlsCiAgIklmIG5vbi1uaWwsIG5hbWUgb2YgdGhlIGZpbGUgdG8g cmVhZC93cml0ZSBpbnB1dCBoaXN0b3J5LgpTZWUgYWxzbyBgdGVybS1yZWFkLWlucHV0LXJp bmcnIGFuZCBgdGVybS13cml0ZS1pbnB1dC1yaW5nJy4KClRoaXMgdmFyaWFibGUgaXMgYnVm ZmVyLWxvY2FsLCBhbmQgaXMgYSBnb29kIHRoaW5nIHRvIHNldCBpbiBtb2RlIGhvb2tzLiIK ICA6dHlwZSAnYm9vbGVhbgogIDpncm91cCAndGVybSkKCihkZWZjdXN0b20gdGVybS1zY3Jv bGwtdG8tYm90dG9tLW9uLW91dHB1dCBuaWwKICAiQ29udHJvbHMgd2hldGhlciBpbnRlcnBy ZXRlciBvdXRwdXQgY2F1c2VzIHdpbmRvdyB0byBzY3JvbGwuCklmIG5pbCwgdGhlbiBkbyBu b3Qgc2Nyb2xsLiAgSWYgdCBvciBgYWxsJywgc2Nyb2xsIGFsbCB3aW5kb3dzIHNob3dpbmcg YnVmZmVyLgpJZiBgdGhpcycsIHNjcm9sbCBvbmx5IHRoZSBzZWxlY3RlZCB3aW5kb3cuCklm IGBvdGhlcnMnLCBzY3JvbGwgb25seSB0aG9zZSB0aGF0IGFyZSBub3QgdGhlIHNlbGVjdGVk IHdpbmRvdy4KClRoZSBkZWZhdWx0IGlzIG5pbC4KClNlZSB2YXJpYWJsZSBgdGVybS1zY3Jv bGwtc2hvdy1tYXhpbXVtLW91dHB1dCcuClRoaXMgdmFyaWFibGUgaXMgYnVmZmVyLWxvY2Fs LiIKICA6dHlwZSAnYm9vbGVhbgogIDpncm91cCAndGVybSkKCihkZWZjdXN0b20gdGVybS1z Y3JvbGwtc2hvdy1tYXhpbXVtLW91dHB1dCBuaWwKICAiQ29udHJvbHMgaG93IGludGVycHJl dGVyIG91dHB1dCBjYXVzZXMgd2luZG93IHRvIHNjcm9sbC4KSWYgbm9uLW5pbCwgdGhlbiBz aG93IHRoZSBtYXhpbXVtIG91dHB1dCB3aGVuIHRoZSB3aW5kb3cgaXMgc2Nyb2xsZWQuCgpT ZWUgdmFyaWFibGUgYHRlcm0tc2Nyb2xsLXRvLWJvdHRvbS1vbi1vdXRwdXQnLgpUaGlzIHZh cmlhYmxlIGlzIGJ1ZmZlci1sb2NhbC4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6Z3JvdXAgJ3Rl cm0pCgo7OyBXaGVyZSBndWQtZGlzcGxheS1mcmFtZSBzaG91bGQgcHV0IHRoZSBkZWJ1Z2dp bmcgYXJyb3cuICBUaGlzIGlzCjs7IHNldCBieSB0aGUgbWFya2VyLWZpbHRlciwgd2hpY2gg c2NhbnMgdGhlIGRlYnVnZ2VyJ3Mgb3V0cHV0IGZvcgo7OyBpbmRpY2F0aW9ucyBvZiB0aGUg Y3VycmVudCBwYy4KKGRlZnZhciB0ZXJtLXBlbmRpbmctZnJhbWUgbmlsKQoKOzs7IEhlcmUg YXJlIHRoZSBwZXItaW50ZXJwcmV0ZXIgaG9va3MuCihkZWZ2YXIgdGVybS1nZXQtb2xkLWlu cHV0IChmdW5jdGlvbiB0ZXJtLWdldC1vbGQtaW5wdXQtZGVmYXVsdCkKICAiRnVuY3Rpb24g dGhhdCBzdWJtaXRzIG9sZCB0ZXh0IGluIHRlcm0gbW9kZS4KVGhpcyBmdW5jdGlvbiBpcyBj YWxsZWQgd2hlbiByZXR1cm4gaXMgdHlwZWQgd2hpbGUgdGhlIHBvaW50IGlzIGluIG9sZCB0 ZXh0LgpJdCByZXR1cm5zIHRoZSB0ZXh0IHRvIGJlIHN1Ym1pdHRlZCBhcyBwcm9jZXNzIGlu cHV0LiAgVGhlIGRlZmF1bHQgaXMKYHRlcm0tZ2V0LW9sZC1pbnB1dC1kZWZhdWx0Jywgd2hp Y2ggZ3JhYnMgdGhlIGN1cnJlbnQgbGluZSwgYW5kIHN0cmlwcyBvZmYKbGVhZGluZyB0ZXh0 IG1hdGNoaW5nIGB0ZXJtLXByb21wdC1yZWdleHAnLiIpCgooZGVmdmFyIHRlcm0tZHluYW1p Yy1jb21wbGV0ZS1mdW5jdGlvbnMKICAnKHRlcm0tcmVwbGFjZS1ieS1leHBhbmRlZC1oaXN0 b3J5IHRlcm0tZHluYW1pYy1jb21wbGV0ZS1maWxlbmFtZSkKICAiTGlzdCBvZiBmdW5jdGlv bnMgY2FsbGVkIHRvIHBlcmZvcm0gY29tcGxldGlvbi4KRnVuY3Rpb25zIHNob3VsZCByZXR1 cm4gbm9uLW5pbCBpZiBjb21wbGV0aW9uIHdhcyBwZXJmb3JtZWQuClNlZSBhbHNvIGB0ZXJt LWR5bmFtaWMtY29tcGxldGUnLgoKVGhpcyBpcyBhIGdvb2QgdGhpbmcgdG8gc2V0IGluIG1v ZGUgaG9va3MuIikKCihkZWZ2YXIgdGVybS1pbnB1dC1maWx0ZXIKICAoZnVuY3Rpb24gKGxh bWJkYSAoc3RyKSAobm90IChzdHJpbmctbWF0Y2ggIlxcYFxccyAqXFwnIiBzdHIpKSkpCiAg IlByZWRpY2F0ZSBmb3IgZmlsdGVyaW5nIGFkZGl0aW9ucyB0byBpbnB1dCBoaXN0b3J5LgpP bmx5IGlucHV0cyBhbnN3ZXJpbmcgdHJ1ZSB0byB0aGlzIGZ1bmN0aW9uIGFyZSBzYXZlZCBv biB0aGUgaW5wdXQKaGlzdG9yeSBsaXN0LiAgRGVmYXVsdCBpcyB0byBzYXZlIGFueXRoaW5n IHRoYXQgaXNuJ3QgYWxsIHdoaXRlc3BhY2UuIikKCihkZWZ2YXIgdGVybS1pbnB1dC1maWx0 ZXItZnVuY3Rpb25zICcoKQogICJGdW5jdGlvbnMgdG8gY2FsbCBiZWZvcmUgaW5wdXQgaXMg c2VudCB0byB0aGUgcHJvY2Vzcy4KVGhlc2UgZnVuY3Rpb25zIGdldCBvbmUgYXJndW1lbnQs IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgdG8gc2VuZC4KClRoaXMgdmFyaWFibGUg aXMgYnVmZmVyLWxvY2FsLiIpCgooZGVmdmFyIHRlcm0taW5wdXQtc2VuZGVyIChmdW5jdGlv biB0ZXJtLXNpbXBsZS1zZW5kKQogICJGdW5jdGlvbiB0byBhY3R1YWxseSBzZW5kIHRvIFBS T0NFU1MgdGhlIFNUUklORyBzdWJtaXR0ZWQgYnkgdXNlci4KVXN1YWxseSB0aGlzIGlzIGp1 c3QgYHRlcm0tc2ltcGxlLXNlbmQnLCBidXQgaWYgeW91ciBtb2RlIG5lZWRzIHRvCm1hc3Nh Z2UgdGhlIGlucHV0IHN0cmluZywgdGhpcyBpcyB5b3VyIGhvb2suICBUaGlzIGlzIGNhbGxl ZCBmcm9tCnRoZSB1c2VyIGNvbW1hbmQgYHRlcm0tc2VuZC1pbnB1dCcuICBgdGVybS1zaW1w bGUtc2VuZCcganVzdCBzZW5kcwp0aGUgc3RyaW5nIHBsdXMgYSBuZXdsaW5lLiIpCgooZGVm Y3VzdG9tIHRlcm0tZW9sLW9uLXNlbmQgdAogICJOb24tbmlsIG1lYW5zIGdvIHRvIHRoZSBl bmQgb2YgdGhlIGxpbmUgYmVmb3JlIHNlbmRpbmcgaW5wdXQuClNlZSBgdGVybS1zZW5kLWlu cHV0Jy4iCiAgOnR5cGUgJ2Jvb2xlYW4KICA6Z3JvdXAgJ3Rlcm0pCgooZGVmY3VzdG9tIHRl cm0tbW9kZS1ob29rICcoKQogICJDYWxsZWQgdXBvbiBlbnRyeSBpbnRvIHRlcm0gbW9kZS4K VGhpcyBpcyBydW4gYmVmb3JlIHRoZSBwcm9jZXNzIGlzIGNyYW5rZWQgdXAuIgogIDp0eXBl ICdob29rCiAgOmdyb3VwICd0ZXJtKQoKKGRlZmN1c3RvbSB0ZXJtLWV4ZWMtaG9vayAnKCkK ICAiQ2FsbGVkIGVhY2ggdGltZSBhIHByb2Nlc3MgaXMgZXhlYydkIGJ5IGB0ZXJtLWV4ZWMn LgpUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgcHJvY2VzcyBpcyBjcmFua2VkIHVwLiAgSXQg aXMgdXNlZnVsIGZvciB0aGluZ3MgdGhhdAptdXN0IGJlIGRvbmUgZWFjaCB0aW1lIGEgcHJv Y2VzcyBpcyBleGVjdXRlZCBpbiBhIHRlcm0gbW9kZSBidWZmZXIgKGUuZy4sCmBwcm9jZXNz LWtpbGwtd2l0aG91dC1xdWVyeScpLiAgSW4gY29udHJhc3QsIGB0ZXJtLW1vZGUtaG9vaycg aXMgb25seQpleGVjdXRlZCBvbmNlIHdoZW4gdGhlIGJ1ZmZlciBpcyBjcmVhdGVkLiIKICA6 dHlwZSAnaG9vawogIDpncm91cCAndGVybSkKCihkZWZ2YXIgdGVybS1tb2RlLW1hcAogIChs ZXQgKChtYXAgKG1ha2Utc3BhcnNlLWtleW1hcCkpKQogICAgKGRlZmluZS1rZXkgbWFwICJc ZXAiICd0ZXJtLXByZXZpb3VzLWlucHV0KQogICAgKGRlZmluZS1rZXkgbWFwICJcZW4iICd0 ZXJtLW5leHQtaW5wdXQpCiAgICAoZGVmaW5lLWtleSBtYXAgIlxlciIgJ3Rlcm0tcHJldmlv dXMtbWF0Y2hpbmctaW5wdXQpCiAgICAoZGVmaW5lLWtleSBtYXAgIlxlcyIgJ3Rlcm0tbmV4 dC1tYXRjaGluZy1pbnB1dCkKICAgICh1bmxlc3MgKGZlYXR1cmVwICd4ZW1hY3MpCiAgICAg IChkZWZpbmUta2V5IG1hcCBbP1xBLVxNLXJdCgkndGVybS1wcmV2aW91cy1tYXRjaGluZy1p bnB1dC1mcm9tLWlucHV0KQogICAgICAoZGVmaW5lLWtleSBtYXAgWz9cQS1cTS1zXSAndGVy bS1uZXh0LW1hdGNoaW5nLWlucHV0LWZyb20taW5wdXQpKQogICAgKGRlZmluZS1rZXkgbWFw ICJcZVxDLWwiICd0ZXJtLXNob3ctb3V0cHV0KQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1t IiAndGVybS1zZW5kLWlucHV0KQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1kIiAndGVybS1k ZWxjaGFyLW9yLW1heWJlLWVvZikKICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWEiICd0 ZXJtLWJvbCkKICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXUiICd0ZXJtLWtpbGwtaW5w dXQpCiAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy13IiAnYmFja3dhcmQta2lsbC13b3Jk KQogICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtYyIgJ3Rlcm0taW50ZXJydXB0LXN1Ympv YikKICAgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXoiICd0ZXJtLXN0b3Atc3Viam9iKQog ICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtXFwiICd0ZXJtLXF1aXQtc3Viam9iKQogICAg KGRlZmluZS1rZXkgbWFwICJcQy1jXEMtbSIgJ3Rlcm0tY29weS1vbGQtaW5wdXQpCiAgICAo ZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1vIiAndGVybS1raWxsLW91dHB1dCkKICAgIChkZWZp bmUta2V5IG1hcCAiXEMtY1xDLXIiICd0ZXJtLXNob3ctb3V0cHV0KQogICAgKGRlZmluZS1r ZXkgbWFwICJcQy1jXEMtZSIgJ3Rlcm0tc2hvdy1tYXhpbXVtLW91dHB1dCkKICAgIChkZWZp bmUta2V5IG1hcCAiXEMtY1xDLWwiICd0ZXJtLWR5bmFtaWMtbGlzdC1pbnB1dC1yaW5nKQog ICAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtbiIgJ3Rlcm0tbmV4dC1wcm9tcHQpCiAgICAo ZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1wIiAndGVybS1wcmV2aW91cy1wcm9tcHQpCiAgICAo ZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1kIiAndGVybS1zZW5kLWVvZikKICAgIChkZWZpbmUt a2V5IG1hcCAiXEMtY1xDLWsiICd0ZXJtLWNoYXItbW9kZSkKICAgIChkZWZpbmUta2V5IG1h cCAiXEMtY1xDLWoiICd0ZXJtLWxpbmUtbW9kZSkKICAgIChkZWZpbmUta2V5IG1hcCAiXEMt Y1xDLXEiICd0ZXJtLXBhZ2VyLXRvZ2dsZSkKCiAgICA7OyAgOzsgY29tcGxldGlvbjoKICAg IDs7ICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIGNvbXBsZXRpb25dCiAgICA7OyAgICAo Y29ucyAiQ29tcGxldGUiIChtYWtlLXNwYXJzZS1rZXltYXAgIkNvbXBsZXRlIikpKQogICAg OzsgIChkZWZpbmUta2V5IG1hcCBbbWVudS1iYXIgY29tcGxldGlvbiBjb21wbGV0ZS1leHBh bmRdCiAgICA7OyAgICAnKCJFeHBhbmQgRmlsZSBOYW1lIiAuIHRlcm0tcmVwbGFjZS1ieS1l eHBhbmRlZC1maWxlbmFtZSkpCiAgICA7OyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBj b21wbGV0aW9uIGNvbXBsZXRlLWxpc3RpbmddCiAgICA7OyAgICAnKCJGaWxlIENvbXBsZXRp b24gTGlzdGluZyIgLiB0ZXJtLWR5bmFtaWMtbGlzdC1maWxlbmFtZS1jb21wbGV0aW9ucykp CiAgICA7OyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBjb21wbGV0aW9uIGNvbXBsZXRl LWZpbGVdCiAgICA7OyAgICAnKCJDb21wbGV0ZSBGaWxlIE5hbWUiIC4gdGVybS1keW5hbWlj LWNvbXBsZXRlLWZpbGVuYW1lKSkKICAgIDs7ICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFy IGNvbXBsZXRpb24gY29tcGxldGVdCiAgICA7OyAgICAnKCJDb21wbGV0ZSBCZWZvcmUgUG9p bnQiIC4gdGVybS1keW5hbWljLWNvbXBsZXRlKSkKICAgIDs7ICA7OyBQdXQgdGhlbSBpbiB0 aGUgbWVudSBiYXI6CiAgICA7OyAgKHNldHEgbWVudS1iYXItZmluYWwtaXRlbXMgKGFwcGVu ZCAnKHRlcm1pbmFsIGNvbXBsZXRpb24gaW5vdXQgc2lnbmFscykKICAgIDs7CQkJCSAgICAg bWVudS1iYXItZmluYWwtaXRlbXMpKQogICAgbWFwKSkKCihkZWZ2YXIgdGVybS1yYXctbWFw IG5pbAogICJLZXlib2FyZCBtYXAgZm9yIHNlbmRpbmcgY2hhcmFjdGVycyBkaXJlY3RseSB0 byB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4iKQooZGVmdmFyIHRlcm0tZXNjYXBlLWNoYXIgbmls CiAgIkVzY2FwZSBjaGFyYWN0ZXIgZm9yIGNoYXIgc3ViLW1vZGUgb2YgdGVybSBtb2RlLgpE byBub3QgY2hhbmdlIGl0IGRpcmVjdGx5OyB1c2UgYHRlcm0tc2V0LWVzY2FwZS1jaGFyJyBp bnN0ZWFkLiIpCihkZWZ2YXIgdGVybS1yYXctZXNjYXBlLW1hcCBuaWwpCgooZGVmdmFyIHRl cm0tcGFnZXItYnJlYWstbWFwIG5pbCkKCihkZWZ2YXIgdGVybS1wdHlwIHQKICAiVHJ1ZSBp ZiBjb21tdW5pY2F0aW9ucyB2aWEgcHR5OyBmYWxzZSBpZiBieSBwaXBlLiAgQnVmZmVyIGxv Y2FsLgpUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIEVtYWNzIHByb2Nlc3Mgc2ln bmFsaW5nLiIpCgooZGVmdmFyIHRlcm0tbGFzdC1pbnB1dC1tYXRjaCAiIgogICJMYXN0IHN0 cmluZyBzZWFyY2hlZCBmb3IgYnkgdGVybSBpbnB1dCBoaXN0b3J5IHNlYXJjaCwgZm9yIGRl ZmF1bHRpbmcuCkJ1ZmZlciBsb2NhbCB2YXJpYWJsZS4iKQoKKGRlZnZhciB0ZXJtLWlucHV0 LXJpbmcgbmlsKQooZGVmdmFyIHRlcm0tbGFzdC1pbnB1dC1zdGFydCkKKGRlZnZhciB0ZXJt LWxhc3QtaW5wdXQtZW5kKQooZGVmdmFyIHRlcm0taW5wdXQtcmluZy1pbmRleCBuaWwKICAi SW5kZXggb2YgbGFzdCBtYXRjaGVkIGhpc3RvcnkgZWxlbWVudC4iKQooZGVmdmFyIHRlcm0t bWF0Y2hpbmctaW5wdXQtZnJvbS1pbnB1dC1zdHJpbmcgIiIKICAiSW5wdXQgcHJldmlvdXNs eSB1c2VkIHRvIG1hdGNoIGlucHV0IGhpc3RvcnkuIikKOyBUaGlzIGFyZ3VtZW50IHRvIHNl dC1wcm9jZXNzLWZpbHRlciBkaXNhYmxlcyByZWFkaW5nIGZyb20gdGhlIHByb2Nlc3MsCjsg YXNzdW1pbmcgdGhpcyBpcyBFbWFjcyAxOS4yMCBvciBuZXdlci4KKGRlZnZhciB0ZXJtLXBh Z2VyLWZpbHRlciB0KQoKKHB1dCAndGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWhpc3Rvcnkg J21lbnUtZW5hYmxlICd0ZXJtLWlucHV0LWF1dG9leHBhbmQpCihwdXQgJ3Rlcm0taW5wdXQt cmluZyAncGVybWFuZW50LWxvY2FsIHQpCihwdXQgJ3Rlcm0taW5wdXQtcmluZy1pbmRleCAn cGVybWFuZW50LWxvY2FsIHQpCihwdXQgJ3Rlcm0taW5wdXQtYXV0b2V4cGFuZCAncGVybWFu ZW50LWxvY2FsIHQpCihwdXQgJ3Rlcm0taW5wdXQtZmlsdGVyLWZ1bmN0aW9ucyAncGVybWFu ZW50LWxvY2FsIHQpCihwdXQgJ3Rlcm0tc2Nyb2xsLXRvLWJvdHRvbS1vbi1vdXRwdXQgJ3Bl cm1hbmVudC1sb2NhbCB0KQoocHV0ICd0ZXJtLXNjcm9sbC1zaG93LW1heGltdW0tb3V0cHV0 ICdwZXJtYW5lbnQtbG9jYWwgdCkKKHB1dCAndGVybS1wdHlwICdwZXJtYW5lbnQtbG9jYWwg dCkKCihkZWZtYWNybyB0ZXJtLWluLWNoYXItbW9kZSAoKSAnKGVxIChjdXJyZW50LWxvY2Fs LW1hcCkgdGVybS1yYXctbWFwKSkKKGRlZm1hY3JvIHRlcm0taW4tbGluZS1tb2RlICgpICco bm90ICh0ZXJtLWluLWNoYXItbW9kZSkpKQo7OyBUcnVlIGlmIGN1cnJlbnRseSBkb2luZyBQ QUdFUiBoYW5kbGluZy4KKGRlZm1hY3JvIHRlcm0tcGFnZXItZW5hYmxlZCAoKSAndGVybS1w YWdlci1jb3VudCkKKGRlZm1hY3JvIHRlcm0taGFuZGxpbmctcGFnZXIgKCkgJ3Rlcm0tcGFn ZXItb2xkLWxvY2FsLW1hcCkKKGRlZm1hY3JvIHRlcm0tdXNpbmctYWx0ZXJuYXRlLXN1Yi1i dWZmZXIgKCkgJ3Rlcm0tc2F2ZWQtaG9tZS1tYXJrZXIpCgooZGVmdmFyIHRlcm0tc2lnbmFs cy1tZW51KQooZGVmdmFyIHRlcm0tdGVybWluYWwtbWVudSkKCjs7OyBMZXQncyBzaWxlbmNl IHRoZSBieXRlLWNvbXBpbGVyIC1tbQooZGVmdmFyIHRlcm0tYW5zaS1hdC1ob3N0IG5pbCkK KGRlZnZhciB0ZXJtLWFuc2ktYXQtZGlyIG5pbCkKKGRlZnZhciB0ZXJtLWFuc2ktYXQtdXNl ciBuaWwpCihkZWZ2YXIgdGVybS1hbnNpLWF0LW1lc3NhZ2UgbmlsKQooZGVmdmFyIHRlcm0t YW5zaS1hdC1zYXZlLXVzZXIgbmlsKQooZGVmdmFyIHRlcm0tYW5zaS1hdC1zYXZlLXB3ZCBu aWwpCihkZWZ2YXIgdGVybS1hbnNpLWF0LXNhdmUtYW5vbiBuaWwpCihkZWZ2YXIgdGVybS1h bnNpLWN1cnJlbnQtYm9sZCBuaWwpCihkZWZ2YXIgdGVybS1hbnNpLWN1cnJlbnQtY29sb3Ig MCkKKGRlZnZhciB0ZXJtLWFuc2ktZmFjZS1hbHJlYWR5LWRvbmUgbmlsKQooZGVmdmFyIHRl cm0tYW5zaS1jdXJyZW50LWJnLWNvbG9yIDApCihkZWZ2YXIgdGVybS1hbnNpLWN1cnJlbnQt dW5kZXJsaW5lIG5pbCkKKGRlZnZhciB0ZXJtLWFuc2ktY3VycmVudC1yZXZlcnNlIG5pbCkK KGRlZnZhciB0ZXJtLWFuc2ktY3VycmVudC1pbnZpc2libGUgbmlsKQoKOzs7IEZvdXIgc2hv dWxkIGJlIGVub3VnaCwgaWYgeW91IHdhbnQgbW9yZSwganVzdCBhZGQuIC1tbQooZGVmdmFy IHRlcm0tdGVybWluYWwtbW9yZS1wYXJhbWV0ZXJzIDApCihkZWZ2YXIgdGVybS10ZXJtaW5h bC1wcmV2aW91cy1wYXJhbWV0ZXItMiAtMSkKKGRlZnZhciB0ZXJtLXRlcm1pbmFsLXByZXZp b3VzLXBhcmFtZXRlci0zIC0xKQooZGVmdmFyIHRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFy YW1ldGVyLTQgLTEpCjs7OwoKOzs7IGZhY2VzIC1tbQoKKGRlZmN1c3RvbSB0ZXJtLWRlZmF1 bHQtZmctY29sb3IgKGZhY2UtZm9yZWdyb3VuZCB0ZXJtLWN1cnJlbnQtZmFjZSkKICAiRGVm YXVsdCBjb2xvciBmb3IgZm9yZWdyb3VuZCBpbiBgdGVybScuIgogIDpncm91cCAndGVybQog IDp0eXBlICdzdHJpbmcpCgooZGVmY3VzdG9tIHRlcm0tZGVmYXVsdC1iZy1jb2xvciAoZmFj ZS1iYWNrZ3JvdW5kIHRlcm0tY3VycmVudC1mYWNlKQogICJEZWZhdWx0IGNvbG9yIGZvciBi YWNrZ3JvdW5kIGluIGB0ZXJtJy4iCiAgOmdyb3VwICd0ZXJtCiAgOnR5cGUgJ3N0cmluZykK Cjs7OyBVc2UgdGhlIHNhbWUgY29sb3JzIHRoYXQgeHRlcm0gdXNlcywgc2VlIGB4dGVybS1z dGFuZGFyZC1jb2xvcnMnLgooZGVmdmFyIGFuc2ktdGVybS1jb2xvci12ZWN0b3IKICBbdW5z cGVjaWZpZWQgImJsYWNrIiAicmVkMyIgImdyZWVuMyIgInllbGxvdzMiICJibHVlMiIKICAg Im1hZ2VudGEzIiAiY3lhbjMiICJ3aGl0ZSJdKQoKOzs7IEluc3BpcmF0aW9uIGNhbWUgZnJv bSBjb21pbnQuZWwgLW1tCihkZWZ2YXIgdGVybS1idWZmZXItbWF4aW11bS1zaXplIDIwNDgK ICAiKlRoZSBtYXhpbXVtIHNpemUgaW4gbGluZXMgZm9yIHRlcm0gYnVmZmVycy4KVGVybSBi dWZmZXJzIGFyZSB0cnVuY2F0ZWQgZnJvbSB0aGUgdG9wIHRvIGJlIG5vIGdyZWF0ZXIgdGhh biB0aGlzIG51bWJlci4KTm90aWNlIHRoYXQgYSBzZXR0aW5nIG9mIDAgbWVhbnMgXCJkb24n dCB0cnVuY2F0ZSBhbnl0aGluZ1wiLiAgVGhpcyB2YXJpYWJsZQppcyBidWZmZXItbG9jYWwu IikKOzs7CgwKKHdoZW4gKGZlYXR1cmVwICd4ZW1hY3MpCiAgKGRlZnZhciB0ZXJtLXRlcm1p bmFsLW1lbnUKICAgICcoIlRlcm1pbmFsIgogICAgICBbICJDaGFyYWN0ZXIgbW9kZSIgdGVy bS1jaGFyLW1vZGUgKHRlcm0taW4tbGluZS1tb2RlKV0KICAgICAgWyAiTGluZSBtb2RlIiB0 ZXJtLWxpbmUtbW9kZSAodGVybS1pbi1jaGFyLW1vZGUpXQogICAgICBbICJFbmFibGUgcGFn aW5nIiB0ZXJtLXBhZ2VyLXRvZ2dsZSAobm90IHRlcm0tcGFnZXItY291bnQpXQogICAgICBb ICJEaXNhYmxlIHBhZ2luZyIgdGVybS1wYWdlci10b2dnbGUgdGVybS1wYWdlci1jb3VudF0p KSkKCjs7IE1lbnUgYmFyczoKKHVubGVzcyAoZmVhdHVyZXAgJ3hlbWFjcykKICA7OyB0ZXJt aW5hbDoKICAobGV0IChuZXdtYXApCiAgICAoc2V0cSBuZXdtYXAgKG1ha2Utc3BhcnNlLWtl eW1hcCAiVGVybWluYWwiKSkKICAgIChkZWZpbmUta2V5IG5ld21hcCBbdGVybWluYWwtcGFn ZXItZW5hYmxlXQogICAgICAnKG1lbnUtaXRlbSAiRW5hYmxlIHBhZ2luZyIgdGVybS1mYWtl LXBhZ2VyLWVuYWJsZQoJCSAgOmhlbHAgIkVuYWJsZSBwYWdpbmcgZmVhdHVyZSIpKQogICAg KGRlZmluZS1rZXkgbmV3bWFwIFt0ZXJtaW5hbC1wYWdlci1kaXNhYmxlXQogICAgICAnKG1l bnUtaXRlbSAiRGlzYWJsZSBwYWdpbmciIHRlcm0tZmFrZS1wYWdlci1kaXNhYmxlCgkJICA6 aGVscCAiRGlzYWJsZSBwYWdpbmcgZmVhdHVyZSIpKQogICAgKGRlZmluZS1rZXkgbmV3bWFw IFt0ZXJtaW5hbC1jaGFyLW1vZGVdCiAgICAgICcobWVudS1pdGVtICJDaGFyYWN0ZXIgbW9k ZSIgdGVybS1jaGFyLW1vZGUKCQkgIDpoZWxwICJTd2l0Y2ggdG8gY2hhciAocmF3KSBzdWIt bW9kZSBvZiB0ZXJtIG1vZGUiKSkKICAgIChkZWZpbmUta2V5IG5ld21hcCBbdGVybWluYWwt bGluZS1tb2RlXQogICAgICAnKG1lbnUtaXRlbSAiTGluZSBtb2RlIiB0ZXJtLWxpbmUtbW9k ZQoJCSAgOmhlbHAgIlN3aXRjaCB0byBsaW5lIChjb29rZWQpIHN1Yi1tb2RlIG9mIHRlcm0g bW9kZSIpKQogICAgKHNldHEgdGVybS10ZXJtaW5hbC1tZW51IChjb25zICJUZXJtaW5hbCIg bmV3bWFwKSkKCiAgICA7OyBjb21wbGV0aW9uOiAgKGxpbmUgbW9kZSBvbmx5KQogICAgKGRl ZnZhciB0ZXJtLWNvbXBsZXRpb24tbWVudSAobWFrZS1zcGFyc2Uta2V5bWFwICJDb21wbGV0 ZSIpKQogICAgKGRlZmluZS1rZXkgdGVybS1tb2RlLW1hcCBbbWVudS1iYXIgY29tcGxldGlv bl0KICAgICAgKGNvbnMgIkNvbXBsZXRlIiB0ZXJtLWNvbXBsZXRpb24tbWVudSkpCiAgICAo ZGVmaW5lLWtleSB0ZXJtLWNvbXBsZXRpb24tbWVudSBbY29tcGxldGUtZXhwYW5kXQogICAg ICAnKCJFeHBhbmQgRmlsZSBOYW1lIiAuIHRlcm0tcmVwbGFjZS1ieS1leHBhbmRlZC1maWxl bmFtZSkpCiAgICAoZGVmaW5lLWtleSB0ZXJtLWNvbXBsZXRpb24tbWVudSBbY29tcGxldGUt bGlzdGluZ10KICAgICAgJygiRmlsZSBDb21wbGV0aW9uIExpc3RpbmciIC4gdGVybS1keW5h bWljLWxpc3QtZmlsZW5hbWUtY29tcGxldGlvbnMpKQogICAgKGRlZmluZS1rZXkgdGVybS1j b21wbGV0aW9uLW1lbnUgW21lbnUtYmFyIGNvbXBsZXRpb24gY29tcGxldGUtZmlsZV0KICAg ICAgJygiQ29tcGxldGUgRmlsZSBOYW1lIiAuIHRlcm0tZHluYW1pYy1jb21wbGV0ZS1maWxl bmFtZSkpCiAgICAoZGVmaW5lLWtleSB0ZXJtLWNvbXBsZXRpb24tbWVudSBbbWVudS1iYXIg Y29tcGxldGlvbiBjb21wbGV0ZV0KICAgICAgJygiQ29tcGxldGUgQmVmb3JlIFBvaW50IiAu IHRlcm0tZHluYW1pYy1jb21wbGV0ZSkpCgogICAgOzsgSW5wdXQgaGlzdG9yeTogKGxpbmUg bW9kZSBvbmx5KQogICAgKGRlZnZhciB0ZXJtLWlub3V0LW1lbnUgKG1ha2Utc3BhcnNlLWtl eW1hcCAiSW4vT3V0IikpCiAgICAoZGVmaW5lLWtleSB0ZXJtLW1vZGUtbWFwIFttZW51LWJh ciBpbm91dF0KICAgICAgKGNvbnMgIkluL091dCIgdGVybS1pbm91dC1tZW51KSkKICAgIChk ZWZpbmUta2V5IHRlcm0taW5vdXQtbWVudSBba2lsbC1vdXRwdXRdCiAgICAgICcoIktpbGwg Q3VycmVudCBPdXRwdXQgR3JvdXAiIC4gdGVybS1raWxsLW91dHB1dCkpCiAgICAoZGVmaW5l LWtleSB0ZXJtLWlub3V0LW1lbnUgW25leHQtcHJvbXB0XQogICAgICAnKCJGb3J3YXJkIE91 dHB1dCBHcm91cCIgLiB0ZXJtLW5leHQtcHJvbXB0KSkKICAgIChkZWZpbmUta2V5IHRlcm0t aW5vdXQtbWVudSBbcHJldmlvdXMtcHJvbXB0XQogICAgICAnKCJCYWNrd2FyZCBPdXRwdXQg R3JvdXAiIC4gdGVybS1wcmV2aW91cy1wcm9tcHQpKQogICAgKGRlZmluZS1rZXkgdGVybS1p bm91dC1tZW51IFtzaG93LW1heGltdW0tb3V0cHV0XQogICAgICAnKCJTaG93IE1heGltdW0g T3V0cHV0IiAuIHRlcm0tc2hvdy1tYXhpbXVtLW91dHB1dCkpCiAgICAoZGVmaW5lLWtleSB0 ZXJtLWlub3V0LW1lbnUgW3Nob3ctb3V0cHV0XQogICAgICAnKCJTaG93IEN1cnJlbnQgT3V0 cHV0IEdyb3VwIiAuIHRlcm0tc2hvdy1vdXRwdXQpKQogICAgKGRlZmluZS1rZXkgdGVybS1p bm91dC1tZW51IFtraWxsLWlucHV0XQogICAgICAnKCJLaWxsIEN1cnJlbnQgSW5wdXQiIC4g dGVybS1raWxsLWlucHV0KSkKICAgIChkZWZpbmUta2V5IHRlcm0taW5vdXQtbWVudSBbY29w eS1pbnB1dF0KICAgICAgJygiQ29weSBPbGQgSW5wdXQiIC4gdGVybS1jb3B5LW9sZC1pbnB1 dCkpCiAgICAoZGVmaW5lLWtleSB0ZXJtLWlub3V0LW1lbnUgW2ZvcndhcmQtbWF0Y2hpbmct aGlzdG9yeV0KICAgICAgJygiRm9yd2FyZCBNYXRjaGluZyBJbnB1dC4uLiIgLiB0ZXJtLWZv cndhcmQtbWF0Y2hpbmctaW5wdXQpKQogICAgKGRlZmluZS1rZXkgdGVybS1pbm91dC1tZW51 IFtiYWNrd2FyZC1tYXRjaGluZy1oaXN0b3J5XQogICAgICAnKCJCYWNrd2FyZCBNYXRjaGlu ZyBJbnB1dC4uLiIgLiB0ZXJtLWJhY2t3YXJkLW1hdGNoaW5nLWlucHV0KSkKICAgIChkZWZp bmUta2V5IHRlcm0taW5vdXQtbWVudSBbbmV4dC1tYXRjaGluZy1oaXN0b3J5XQogICAgICAn KCJOZXh0IE1hdGNoaW5nIElucHV0Li4uIiAuIHRlcm0tbmV4dC1tYXRjaGluZy1pbnB1dCkp CiAgICAoZGVmaW5lLWtleSB0ZXJtLWlub3V0LW1lbnUgW3ByZXZpb3VzLW1hdGNoaW5nLWhp c3RvcnldCiAgICAgICcoIlByZXZpb3VzIE1hdGNoaW5nIElucHV0Li4uIiAuIHRlcm0tcHJl dmlvdXMtbWF0Y2hpbmctaW5wdXQpKQogICAgKGRlZmluZS1rZXkgdGVybS1pbm91dC1tZW51 IFtuZXh0LW1hdGNoaW5nLWhpc3RvcnktZnJvbS1pbnB1dF0KICAgICAgJygiTmV4dCBNYXRj aGluZyBDdXJyZW50IElucHV0IiAuIHRlcm0tbmV4dC1tYXRjaGluZy1pbnB1dC1mcm9tLWlu cHV0KSkKICAgIChkZWZpbmUta2V5IHRlcm0taW5vdXQtbWVudSBbcHJldmlvdXMtbWF0Y2hp bmctaGlzdG9yeS1mcm9tLWlucHV0XQogICAgICAnKCJQcmV2aW91cyBNYXRjaGluZyBDdXJy ZW50IElucHV0IiAuCgkJdGVybS1wcmV2aW91cy1tYXRjaGluZy1pbnB1dC1mcm9tLWlucHV0 KSkKICAgIChkZWZpbmUta2V5IHRlcm0taW5vdXQtbWVudSBbbmV4dC1oaXN0b3J5XQogICAg ICAnKCJOZXh0IElucHV0IiAuIHRlcm0tbmV4dC1pbnB1dCkpCiAgICAoZGVmaW5lLWtleSB0 ZXJtLWlub3V0LW1lbnUgW3ByZXZpb3VzLWhpc3RvcnldCiAgICAgICcoIlByZXZpb3VzIElu cHV0IiAuIHRlcm0tcHJldmlvdXMtaW5wdXQpKQogICAgKGRlZmluZS1rZXkgdGVybS1pbm91 dC1tZW51IFtsaXN0LWhpc3RvcnldCiAgICAgICcoIkxpc3QgSW5wdXQgSGlzdG9yeSIgLiB0 ZXJtLWR5bmFtaWMtbGlzdC1pbnB1dC1yaW5nKSkKICAgIChkZWZpbmUta2V5IHRlcm0taW5v dXQtbWVudSBbZXhwYW5kLWhpc3RvcnldCiAgICAgICcoIkV4cGFuZCBIaXN0b3J5IEJlZm9y ZSBQb2ludCIgLiB0ZXJtLXJlcGxhY2UtYnktZXhwYW5kZWQtaGlzdG9yeSkpCgogICAgOzsg U2lnbmFscwogICAgKHNldHEgbmV3bWFwIChtYWtlLXNwYXJzZS1rZXltYXAgIlNpZ25hbHMi KSkKICAgIChkZWZpbmUta2V5IHRlcm0tbW9kZS1tYXAgW21lbnUtYmFyIHNpZ25hbHNdCiAg ICAgIChzZXRxIHRlcm0tc2lnbmFscy1tZW51IChjb25zICJTaWduYWxzIiBuZXdtYXApKSkK ICAgIChkZWZpbmUta2V5IG5ld21hcCBbZW9mXQogICAgICAnKG1lbnUtaXRlbSAiRU9GIiB0 ZXJtLXNlbmQtZW9mCgkJICA6aGVscCAiU2VuZCBhbiBFT0YgdG8gdGhlIGN1cnJlbnQgYnVm ZmVyJ3MgcHJvY2VzcyIpKQogICAgKGRlZmluZS1rZXkgbmV3bWFwIFtraWxsXQogICAgICAn KG1lbnUtaXRlbSAiS0lMTCIgdGVybS1raWxsLXN1YmpvYgoJCSAgOmhlbHAgIlNlbmQga2ls bCBzaWduYWwgdG8gdGhlIGN1cnJlbnQgc3Viam9iIikpCiAgICAoZGVmaW5lLWtleSBuZXdt YXAgW3F1aXRdCiAgICAgICcobWVudS1pdGVtICJRVUlUIiB0ZXJtLXF1aXQtc3Viam9iCgkJ ICA6aGVscCAiU2VuZCBxdWl0IHNpZ25hbCB0byB0aGUgY3VycmVudCBzdWJqb2IuIikpCiAg ICAoZGVmaW5lLWtleSBuZXdtYXAgW2NvbnRdCiAgICAgICcobWVudS1pdGVtICJDT05UIiB0 ZXJtLWNvbnRpbnVlLXN1YmpvYgoJCSAgOmhlbHAgIlNlbmQgQ09OVCBzaWduYWwgdG8gcHJv Y2VzcyBidWZmZXIncyBwcm9jZXNzIGdyb3VwIikpCiAgICAoZGVmaW5lLWtleSBuZXdtYXAg W3N0b3BdCiAgICAgICcobWVudS1pdGVtICJTVE9QIiB0ZXJtLXN0b3Atc3Viam9iCgkJICA6 aGVscCAiU3RvcCB0aGUgY3VycmVudCBzdWJqb2IiKSkKICAgIChkZWZpbmUta2V5IG5ld21h cCBbYnJrXQogICAgICAnKG1lbnUtaXRlbSAiQlJFQUsiIHRlcm0taW50ZXJydXB0LXN1Ympv YgoJCSAgOmhlbHAgIkludGVycnVwdCB0aGUgY3VycmVudCBzdWJqb2IiKSkKICAgICkpCgwK OzsgU2V0IHVwIHRlcm0tcmF3LW1hcCwgZXRjLgoKKGRlZnVuIHRlcm0tc2V0LWVzY2FwZS1j aGFyIChjKQogICJDaGFuZ2UgYHRlcm0tZXNjYXBlLWNoYXInIGFuZCBrZXltYXBzIHRoYXQg ZGVwZW5kIG9uIGl0LiIKICAod2hlbiB0ZXJtLWVzY2FwZS1jaGFyCiAgICAoZGVmaW5lLWtl eSB0ZXJtLXJhdy1tYXAgdGVybS1lc2NhcGUtY2hhciAndGVybS1zZW5kLXJhdykpCiAgKHNl dHEgYyAobWFrZS1zdHJpbmcgMSBjKSkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgYyB0 ZXJtLXJhdy1lc2NhcGUtbWFwKQogIDs7IERlZmluZSBzdGFuZGFyZCBiaW5kaW5ncyBpbiB0 ZXJtLXJhdy1lc2NhcGUtbWFwCiAgKGRlZmluZS1rZXkgdGVybS1yYXctZXNjYXBlLW1hcCAi XEMtdiIKICAgIChsb29rdXAta2V5IChjdXJyZW50LWdsb2JhbC1tYXApICJcQy12IikpCiAg KGRlZmluZS1rZXkgdGVybS1yYXctZXNjYXBlLW1hcCAiXEMtdSIKICAgIChsb29rdXAta2V5 IChjdXJyZW50LWdsb2JhbC1tYXApICJcQy11IikpCiAgKGRlZmluZS1rZXkgdGVybS1yYXct ZXNjYXBlLW1hcCBjICd0ZXJtLXNlbmQtcmF3KQogIChkZWZpbmUta2V5IHRlcm0tcmF3LWVz Y2FwZS1tYXAgIlxDLXEiICd0ZXJtLXBhZ2VyLXRvZ2dsZSkKICA7OyBUaGUga2V5YmluZGlu ZyBmb3IgdGVybS1jaGFyLW1vZGUgaXMgbmVlZGVkIGJ5IHRoZSBtZW51YmFyIGNvZGUuCiAg KGRlZmluZS1rZXkgdGVybS1yYXctZXNjYXBlLW1hcCAiXEMtayIgJ3Rlcm0tY2hhci1tb2Rl KQogIChkZWZpbmUta2V5IHRlcm0tcmF3LWVzY2FwZS1tYXAgIlxDLWoiICd0ZXJtLWxpbmUt bW9kZSkKICA7OyBJdCdzIGNvbnZlbmllbnQgdG8gaGF2ZSBleGVjdXRlLWV4dGVuZGVkLWNv bW1hbmQgaGVyZS4KICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1lc2NhcGUtbWFwIFs/XE0teF0g J2V4ZWN1dGUtZXh0ZW5kZWQtY29tbWFuZCkpCgoobGV0KiAoKG1hcCAobWFrZS1rZXltYXAp KQogICAgICAgKGVzYy1tYXAgKG1ha2Uta2V5bWFwKSkKICAgICAgIChpIDApKQogICh3aGls ZSAoPCBpIDEyOCkKICAgIChkZWZpbmUta2V5IG1hcCAobWFrZS1zdHJpbmcgMSBpKSAndGVy bS1zZW5kLXJhdykKICAgIDs7IEF2b2lkIE8gYW5kIFsuIFRoZXkgYXJlIHVzZWQgaW4gZXNj YXBlIHNlcXVlbmNlcyBmb3IgdmFyaW91cyBrZXlzLgogICAgKHVubGVzcyAob3IgKGVxIGkg P08pIChlcSBpIDkxKSkKCQkoZGVmaW5lLWtleSBlc2MtbWFwIChtYWtlLXN0cmluZyAxIGkp ICd0ZXJtLXNlbmQtcmF3LW1ldGEpKQogICAgKHNldHEgaSAoMSsgaSkpKQogIChkZWZpbmUt a2V5IG1hcCBbcmVtYXAgc2VsZi1pbnNlcnQtY29tbWFuZF0gJ3Rlcm0tc2VuZC1yYXcpCiAg KGRlZmluZS1rZXkgbWFwICJcZSIgZXNjLW1hcCkKICAoc2V0cSB0ZXJtLXJhdy1tYXAgbWFw KQogIChzZXRxIHRlcm0tcmF3LWVzY2FwZS1tYXAKCShjb3B5LWtleW1hcCAobG9va3VwLWtl eSAoY3VycmVudC1nbG9iYWwtbWFwKSAiXEMteCIpKSkKCjs7OyBBZGRlZCBuZWFybHkgYWxs IHRoZSAnZ3JleSBrZXlzJyAtbW0KCiAgKGlmIChmZWF0dXJlcCAneGVtYWNzKQogICAgICAo ZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW2J1dHRvbjJdICd0ZXJtLW1vdXNlLXBhc3RlKQog ICAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFttb3VzZS0yXSAndGVybS1tb3VzZS1wYXN0 ZSkKICAgIChkZWZpbmUta2V5IHRlcm0tcmF3LW1hcCBbbWVudS1iYXIgdGVybWluYWxdIHRl cm0tdGVybWluYWwtbWVudSkKICAgIChkZWZpbmUta2V5IHRlcm0tcmF3LW1hcCBbbWVudS1i YXIgc2lnbmFsc10gdGVybS1zaWduYWxzLW1lbnUpKQogIChkZWZpbmUta2V5IHRlcm0tcmF3 LW1hcCBbdXBdICd0ZXJtLXNlbmQtdXApCiAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFtk b3duXSAndGVybS1zZW5kLWRvd24pCiAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFtyaWdo dF0gJ3Rlcm0tc2VuZC1yaWdodCkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW2xlZnRd ICd0ZXJtLXNlbmQtbGVmdCkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW2RlbGV0ZV0g J3Rlcm0tc2VuZC1kZWwpCiAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFtkZWxldGVjaGFy XSAndGVybS1zZW5kLWRlbCkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW2JhY2tzcGFj ZV0gJ3Rlcm0tc2VuZC1iYWNrc3BhY2UpCiAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFto b21lXSAndGVybS1zZW5kLWhvbWUpCiAgKGRlZmluZS1rZXkgdGVybS1yYXctbWFwIFtlbmRd ICd0ZXJtLXNlbmQtZW5kKQogIChkZWZpbmUta2V5IHRlcm0tcmF3LW1hcCBbaW5zZXJ0XSAn dGVybS1zZW5kLWluc2VydCkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW1MtcHJpb3Jd ICdzY3JvbGwtZG93bikKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW1MtbmV4dF0gJ3Nj cm9sbC11cCkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW1MtaW5zZXJ0XSAndGVybS1w YXN0ZSkKICAoZGVmaW5lLWtleSB0ZXJtLXJhdy1tYXAgW3ByaW9yXSAndGVybS1zZW5kLXBy aW9yKQogIChkZWZpbmUta2V5IHRlcm0tcmF3LW1hcCBbbmV4dF0gJ3Rlcm0tc2VuZC1uZXh0 KSkKCih0ZXJtLXNldC1lc2NhcGUtY2hhciA/XEMtYykKCihkZWZ2YXIgb3ZlcmZsb3ctbmV3 bGluZS1pbnRvLWZyaW5nZSkKCihkZWZ1biB0ZXJtLXdpbmRvdy13aWR0aCAoKQogIChpZiAo ZmVhdHVyZXAgJ3hlbWFjcykKICAgICAgKDEtICh3aW5kb3ctd2lkdGgpKQogICAgKGlmIChh bmQgd2luZG93LXN5c3RlbSBvdmVyZmxvdy1uZXdsaW5lLWludG8tZnJpbmdlKQoJKHdpbmRv dy13aWR0aCkKICAgICAgKDEtICh3aW5kb3ctd2lkdGgpKSkpKQoKDAoocHV0ICd0ZXJtLW1v ZGUgJ21vZGUtY2xhc3MgJ3NwZWNpYWwpCgoKOzs7IFVzZSB0aGlzIHZhcmlhYmxlIGFzIGEg ZGlzcGxheSB0YWJsZSBmb3IgYHRlcm0tbW9kZScuCihkZWZ2YXIgdGVybS1kaXNwbGF5LXRh YmxlCiAgKGxldCAoKGR0IChvciAoY29weS1zZXF1ZW5jZSBzdGFuZGFyZC1kaXNwbGF5LXRh YmxlKQoJCShtYWtlLWRpc3BsYXktdGFibGUpKSkKICAgICAgICBpKQogICAgOzsgYXZvaWQg Y2hhbmdpbmcgdGhlIGRpc3BsYXkgdGFibGUgZm9yIF5KCiAgICAoc2V0cSBpIDApCiAgICAo d2hpbGUgKDwgaSAxMCkKICAgICAgKGFzZXQgZHQgaSAodmVjdG9yIGkpKQogICAgICAoc2V0 cSBpICgxKyBpKSkpCiAgICAoc2V0cSBpIDExKQogICAgKHdoaWxlICg8IGkgMzIpCiAgICAg IChhc2V0IGR0IGkgKHZlY3RvciBpKSkKICAgICAgKHNldHEgaSAoMSsgaSkpKQogICAgKHNl dHEgaSAxMjgpCiAgICAod2hpbGUgKDwgaSAyNTYpCiAgICAgIChhc2V0IGR0IGkgKHZlY3Rv ciBpKSkKICAgICAgKHNldHEgaSAoMSsgaSkpKQogICAgZHQpKQoKKGRlZnVuIHRlcm0tbW9k ZSAoKQogICJNYWpvciBtb2RlIGZvciBpbnRlcmFjdGluZyB3aXRoIGFuIGluZmVyaW9yIGlu dGVycHJldGVyLgpUaGUgaW50ZXJwcmV0ZXIgbmFtZSBpcyBzYW1lIGFzIGJ1ZmZlciBuYW1l LCBzYW5zIHRoZSBhc3Rlcmlza3MuCgpUaGVyZSBhcmUgdHdvIHN1Ym1vZGVzOiBsaW5lIG1v ZGUgYW5kIGNoYXIgbW9kZS4gIEJ5IGRlZmF1bHQsIHlvdSBhcmUKaW4gY2hhciBtb2RlLiAg SW4gY2hhciBzdWItbW9kZSwgZWFjaCBjaGFyYWN0ZXIgKGV4Y2VwdApgdGVybS1lc2NhcGUt Y2hhcicpIGlzIHNlbnQgaW1tZWRpYXRlbHkgdG8gdGhlIHN1YnByb2Nlc3MuClRoZSBlc2Nh cGUgY2hhcmFjdGVyIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHVzdWFsIG1lYW5pbmcgb2YgQy14 LgoKSW4gbGluZSBtb2RlLCB5b3Ugc2VuZCBhIGxpbmUgb2YgaW5wdXQgYXQgYSB0aW1lOyB1 c2UKXFxbdGVybS1zZW5kLWlucHV0XSB0byBzZW5kLgoKSW4gbGluZSBtb2RlLCB0aGlzIG1h aW50YWlucyBhbiBpbnB1dCBoaXN0b3J5IG9mIHNpemUKYHRlcm0taW5wdXQtcmluZy1zaXpl JywgYW5kIHlvdSBjYW4gYWNjZXNzIGl0IHdpdGggdGhlIGNvbW1hbmRzClxcW3Rlcm0tbmV4 dC1pbnB1dF0sIFxcW3Rlcm0tcHJldmlvdXMtaW5wdXRdLCBhbmQKXFxbdGVybS1keW5hbWlj LWxpc3QtaW5wdXQtcmluZ10uICBJbnB1dCByaW5nIGhpc3RvcnkgZXhwYW5zaW9uIGNhbiBi ZQphY2hpZXZlZCB3aXRoIHRoZSBjb21tYW5kcyBcXFt0ZXJtLXJlcGxhY2UtYnktZXhwYW5k ZWQtaGlzdG9yeV0gb3IKXFxbdGVybS1tYWdpYy1zcGFjZV0uICBJbnB1dCByaW5nIGV4cGFu c2lvbiBpcyBjb250cm9sbGVkIGJ5IHRoZQp2YXJpYWJsZSBgdGVybS1pbnB1dC1hdXRvZXhw YW5kJywgYW5kIGFkZGl0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlCnZhcmlhYmxlIGB0ZXJt LWlucHV0LWlnbm9yZWR1cHMnLgoKSW5wdXQgdG8sIGFuZCBvdXRwdXQgZnJvbSwgdGhlIHN1 YnByb2Nlc3MgY2FuIGNhdXNlIHRoZSB3aW5kb3cgdG8gc2Nyb2xsIHRvCnRoZSBlbmQgb2Yg dGhlIGJ1ZmZlci4gIFNlZSB2YXJpYWJsZXMgYHRlcm0tc2Nyb2xsLXRvLWJvdHRvbS1vbi1p bnB1dCcsCmFuZCBgdGVybS1zY3JvbGwtdG8tYm90dG9tLW9uLW91dHB1dCcuCgpJZiB5b3Ug YWNjaWRlbnRhbGx5IHN1c3BlbmQgeW91ciBwcm9jZXNzLCB1c2UgXFxbdGVybS1jb250aW51 ZS1zdWJqb2JdCnRvIGNvbnRpbnVlIGl0LgoKVGhpcyBtb2RlIGNhbiBiZSBjdXN0b21pemVk IHRvIGNyZWF0ZSBzcGVjaWZpYyBtb2RlcyBmb3IgcnVubmluZwpwYXJ0aWN1bGFyIHN1YnBy b2Nlc3Nlcy4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUgaG9va3MKYHRlcm0t aW5wdXQtZmlsdGVyLWZ1bmN0aW9ucycsIGB0ZXJtLWlucHV0LWZpbHRlcicsCmB0ZXJtLWlu cHV0LXNlbmRlcicgYW5kIGB0ZXJtLWdldC1vbGQtaW5wdXQnIHRvIGFwcHJvcHJpYXRlIGZ1 bmN0aW9ucywKYW5kIHRoZSB2YXJpYWJsZSBgdGVybS1wcm9tcHQtcmVnZXhwJyB0byB0aGUg YXBwcm9wcmlhdGUgcmVndWxhcgpleHByZXNzaW9uLgoKQ29tbWFuZHMgaW4gcmF3IG1vZGU6 CgpcXHt0ZXJtLXJhdy1tYXB9CgpDb21tYW5kcyBpbiBsaW5lIG1vZGU6CgpcXHt0ZXJtLW1v ZGUtbWFwfQoKRW50cnkgdG8gdGhpcyBtb2RlIHJ1bnMgdGhlIGhvb2tzIG9uIGB0ZXJtLW1v ZGUtaG9vaycuIgogIChpbnRlcmFjdGl2ZSkKICA7OyBEbyBub3QgcmVtb3ZlIHRoaXMuICBB bGwgbWFqb3IgbW9kZXMgbXVzdCBkbyB0aGlzLgogIChraWxsLWFsbC1sb2NhbC12YXJpYWJs ZXMpCiAgKHNldHEgbWFqb3ItbW9kZSAndGVybS1tb2RlKQogIChzZXRxIG1vZGUtbmFtZSAi VGVybSIpCiAgKHVzZS1sb2NhbC1tYXAgdGVybS1tb2RlLW1hcCkKICA7OyB3ZSBkbyBub3Qg d2FudCBpbmRlbnQgdG8gc25lYWsgaW4gYW55IHRhYnMKICAoc2V0cSBpbmRlbnQtdGFicy1t b2RlIG5pbCkKICAoc2V0cSBidWZmZXItZGlzcGxheS10YWJsZSB0ZXJtLWRpc3BsYXktdGFi bGUpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0taG9tZS1tYXJrZXIpCiAgKHNldHEg dGVybS1ob21lLW1hcmtlciAoY29weS1tYXJrZXIgMCkpCiAgKG1ha2UtbG9jYWwtdmFyaWFi bGUgJ3Rlcm0tc2F2ZWQtaG9tZS1tYXJrZXIpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rl cm0taGVpZ2h0KQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXdpZHRoKQogIChzZXRx IHRlcm0td2lkdGggKHRlcm0td2luZG93LXdpZHRoKSkKICAoc2V0cSB0ZXJtLWhlaWdodCAo MS0gKHdpbmRvdy1oZWlnaHQpKSkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS10ZXJt aW5hbC1wYXJhbWV0ZXIpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tc2F2ZWQtY3Vy c29yKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWxhc3QtaW5wdXQtc3RhcnQpCiAg KHNldHEgdGVybS1sYXN0LWlucHV0LXN0YXJ0IChtYWtlLW1hcmtlcikpCiAgKG1ha2UtbG9j YWwtdmFyaWFibGUgJ3Rlcm0tbGFzdC1pbnB1dC1lbmQpCiAgKHNldHEgdGVybS1sYXN0LWlu cHV0LWVuZCAobWFrZS1tYXJrZXIpKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWxh c3QtaW5wdXQtbWF0Y2gpCiAgKHNldHEgdGVybS1sYXN0LWlucHV0LW1hdGNoICIiKQogICht YWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXByb21wdC1yZWdleHApIDsgRG9uJ3Qgc2V0OyBk ZWZhdWx0CiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0taW5wdXQtcmluZy1zaXplKSA7 IC4uLnRvIGdsb2JhbCB2YWwuCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0taW5wdXQt cmluZykKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1pbnB1dC1yaW5nLWZpbGUtbmFt ZSkKICAob3IgKGFuZCAoYm91bmRwICd0ZXJtLWlucHV0LXJpbmcpIHRlcm0taW5wdXQtcmlu ZykKICAgICAgKHNldHEgdGVybS1pbnB1dC1yaW5nIChtYWtlLXJpbmcgdGVybS1pbnB1dC1y aW5nLXNpemUpKSkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1pbnB1dC1yaW5nLWlu ZGV4KQogIChvciAoYW5kIChib3VuZHAgJ3Rlcm0taW5wdXQtcmluZy1pbmRleCkgdGVybS1p bnB1dC1yaW5nLWluZGV4KQogICAgICAoc2V0cSB0ZXJtLWlucHV0LXJpbmctaW5kZXggbmls KSkKCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tY29tbWFuZC1ob29rKQogIChzZXRx IHRlcm0tY29tbWFuZC1ob29rIChzeW1ib2wtZnVuY3Rpb24gJ3Rlcm0tY29tbWFuZC1ob29r KSkKCjs7OyBJJ20gbm90IHN1cmUgdGhlc2Ugc2F2ZXMgYXJlIG5lY2Vzc2FyeSBidXQsIHNp bmNlIEkKOzs7IGhhdmVuJ3QgdGVzdGVkIHRoZSB3aG9sZSB0aGluZyBvbiBhIG5ldCBjb25u ZWN0ZWQgbWFjaGluZSB3aXRoCjs7OyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgYW5nZS1mdHAs IEkndmUgZGVjaWRlZCB0byBiZSBjb25zZXJ2YXRpdmUKOzs7IGFuZCBwdXQgdGhlbSBpbi4g LW1tCgogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWFuc2ktYXQtaG9zdCkKICAoc2V0 cSB0ZXJtLWFuc2ktYXQtaG9zdCAoc3lzdGVtLW5hbWUpKQoKICAobWFrZS1sb2NhbC12YXJp YWJsZSAndGVybS1hbnNpLWF0LWRpcikKICAoc2V0cSB0ZXJtLWFuc2ktYXQtZGlyIGRlZmF1 bHQtZGlyZWN0b3J5KQoKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1hbnNpLWF0LW1l c3NhZ2UpCiAgKHNldHEgdGVybS1hbnNpLWF0LW1lc3NhZ2UgbmlsKQoKOzs7IEZvciB1c2Vy IHRyYWNraW5nIHB1cnBvc2VzIC1tbQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICdhbmdlLWZ0 cC1kZWZhdWx0LXVzZXIpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2FuZ2UtZnRwLWRlZmF1 bHQtcGFzc3dvcmQpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2FuZ2UtZnRwLWdlbmVyYXRl LWFub255bW91cy1wYXNzd29yZCkKCjs7OyBZb3UgbWF5IHdhbnQgdG8gaGF2ZSBkaWZmZXJl bnQgc2Nyb2xsLWJhY2sgc2l6ZXMgLW1tCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0t YnVmZmVyLW1heGltdW0tc2l6ZSkKCjs7OyBPZiBjb3Vyc2UgdGhlc2UgaGF2ZSB0byBiZSBi dWZmZXItbG9jYWwgLW1tCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tYW5zaS1jdXJy ZW50LWJvbGQpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tYW5zaS1jdXJyZW50LWNv bG9yKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWFuc2ktZmFjZS1hbHJlYWR5LWRv bmUpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tYW5zaS1jdXJyZW50LWJnLWNvbG9y KQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWFuc2ktY3VycmVudC11bmRlcmxpbmUp CiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tYW5zaS1jdXJyZW50LXJldmVyc2UpCiAg KG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tYW5zaS1jdXJyZW50LWludmlzaWJsZSkKCiAg KG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tdGVybWluYWwtcGFyYW1ldGVyKQogIChtYWtl LWxvY2FsLXZhcmlhYmxlICd0ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlcikKICAo bWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXIt MikKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJh bWV0ZXItMykKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS10ZXJtaW5hbC1wcmV2aW91 cy1wYXJhbWV0ZXItNCkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS10ZXJtaW5hbC1t b3JlLXBhcmFtZXRlcnMpCgogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXRlcm1pbmFs LXN0YXRlKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWtpbGwtZWNoby1saXN0KQog IChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXN0YXJ0LWxpbmUtY29sdW1uKQogIChtYWtl LWxvY2FsLXZhcmlhYmxlICd0ZXJtLWN1cnJlbnQtY29sdW1uKQogIChtYWtlLWxvY2FsLXZh cmlhYmxlICd0ZXJtLWN1cnJlbnQtcm93KQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJt LWxvZy1idWZmZXIpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tc2Nyb2xsLXN0YXJ0 KQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXNjcm9sbC1lbmQpCiAgKHNldHEgdGVy bS1zY3JvbGwtZW5kIHRlcm0taGVpZ2h0KQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJt LXNjcm9sbC13aXRoLWRlbGV0ZSkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1wYWdl ci1jb3VudCkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1wYWdlci1vbGQtbG9jYWwt bWFwKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLW9sZC1tb2RlLW1hcCkKICAobWFr ZS1sb2NhbC12YXJpYWJsZSAndGVybS1pbnNlcnQtbW9kZSkKICAobWFrZS1sb2NhbC12YXJp YWJsZSAndGVybS1keW5hbWljLWNvbXBsZXRlLWZ1bmN0aW9ucykKICAobWFrZS1sb2NhbC12 YXJpYWJsZSAndGVybS1jb21wbGV0aW9uLWZpZ25vcmUpCiAgKG1ha2UtbG9jYWwtdmFyaWFi bGUgJ3Rlcm0tZ2V0LW9sZC1pbnB1dCkKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1t YXRjaGluZy1pbnB1dC1mcm9tLWlucHV0LXN0cmluZykKICAobWFrZS1sb2NhbC12YXJpYWJs ZSAndGVybS1pbnB1dC1hdXRvZXhwYW5kKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJt LWlucHV0LWlnbm9yZWR1cHMpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0tZGVsaW1p dGVyLWFyZ3VtZW50LWxpc3QpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0taW5wdXQt ZmlsdGVyLWZ1bmN0aW9ucykKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1pbnB1dC1m aWx0ZXIpCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0taW5wdXQtc2VuZGVyKQogICht YWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLWVvbC1vbi1zZW5kKQogIChtYWtlLWxvY2FsLXZh cmlhYmxlICd0ZXJtLXNjcm9sbC10by1ib3R0b20tb24tb3V0cHV0KQogIChtYWtlLWxvY2Fs LXZhcmlhYmxlICd0ZXJtLXNjcm9sbC1zaG93LW1heGltdW0tb3V0cHV0KQogIChtYWtlLWxv Y2FsLXZhcmlhYmxlICd0ZXJtLXB0eXApCiAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3Rlcm0t ZXhlYy1ob29rKQogIChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZXJtLXZlcnRpY2FsLW1vdGlv bikKICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1wZW5kaW5nLWRlbGV0ZS1tYXJrZXIp CiAgKHNldHEgdGVybS1wZW5kaW5nLWRlbGV0ZS1tYXJrZXIgKG1ha2UtbWFya2VyKSkKICAo bWFrZS1sb2NhbC12YXJpYWJsZSAndGVybS1jdXJyZW50LWZhY2UpCiAgKHNldHEgdGVybS1j dXJyZW50LWZhY2UgKGxpc3QgOmJhY2tncm91bmQgdGVybS1kZWZhdWx0LWJnLWNvbG9yCgkJ CQk6Zm9yZWdyb3VuZCB0ZXJtLWRlZmF1bHQtZmctY29sb3IpKQogIChtYWtlLWxvY2FsLXZh cmlhYmxlICd0ZXJtLXBlbmRpbmctZnJhbWUpCiAgKHNldHEgdGVybS1wZW5kaW5nLWZyYW1l IG5pbCkKICA7OyBDdWEtbW9kZSdzIGtleWJpbmRpbmdzIGludGVyZmVyZSB3aXRoIHRoZSB0 ZXJtIGtleWJpbmRpbmdzLCBkaXNhYmxlIGl0LgogIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFi bGUgJ2N1YS1tb2RlKSBuaWwpCiAgKHJ1bi1tb2RlLWhvb2tzICd0ZXJtLW1vZGUtaG9vaykK ICAod2hlbiAoZmVhdHVyZXAgJ3hlbWFjcykKICAgIChzZXQtYnVmZmVyLW1lbnViYXIKICAg ICAoYXBwZW5kIGN1cnJlbnQtbWVudWJhciAobGlzdCB0ZXJtLXRlcm1pbmFsLW1lbnUpKSkp CiAgKG9yIHRlcm0taW5wdXQtcmluZwogICAgICAoc2V0cSB0ZXJtLWlucHV0LXJpbmcgKG1h a2UtcmluZyB0ZXJtLWlucHV0LXJpbmctc2l6ZSkpKQogICh0ZXJtLXVwZGF0ZS1tb2RlLWxp bmUpKQoMCihkZWZ1biB0ZXJtLXJlc2V0LXNpemUgKGhlaWdodCB3aWR0aCkKICAoc2V0cSB0 ZXJtLWhlaWdodCBoZWlnaHQpCiAgKHNldHEgdGVybS13aWR0aCB3aWR0aCkKICAoc2V0cSB0 ZXJtLXN0YXJ0LWxpbmUtY29sdW1uIG5pbCkKICAoc2V0cSB0ZXJtLWN1cnJlbnQtcm93IG5p bCkKICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIG5pbCkKICAodGVybS1zZXQtc2Nyb2xs LXJlZ2lvbiAwIGhlaWdodCkpCgo7OyBSZWN1cnNpdmUgcm91dGluZSB1c2VkIHRvIGNoZWNr IGlmIGFueSBzdHJpbmcgaW4gdGVybS1raWxsLWVjaG8tbGlzdAo7OyBtYXRjaGVzIHBhcnQg b2YgdGhlIGJ1ZmZlciBiZWZvcmUgcG9pbnQuCjs7IElmIHNvLCBkZWxldGUgdGhhdCBtYXRj aGVkIHBhcnQgb2YgdGhlIGJ1ZmZlciAtIHRoaXMgc3VwcHJlc3NlcyBlY2hvLgo7OyBBbHNv LCByZW1vdmUgdGhhdCBzdHJpbmcgZnJvbSB0aGUgdGVybS1raWxsLWVjaG8tbGlzdC4KOzsg V2UgKmFsc28qIHJlbW92ZSBhbnkgb2xkZXIgc3RyaW5nIG9uIHRoZSBsaXN0LCBhcyBhIHNh bml0eSBtZWFzdXJlLAo7OyBpbiBjYXNlIHNvbWV0aGluZyBnZXRzIG91dCBvZiBzeW5jLiAg KEV4Y2VwdCBmb3IgdHlwZS1haGVhZCwgdGhlcmUKOzsgc2hvdWxkIG9ubHkgYmUgb25lIGVs ZW1lbnQgaW4gdGhlIGxpc3QuKQoKKGRlZnVuIHRlcm0tY2hlY2sta2lsbC1lY2hvLWxpc3Qg KCkKICAobGV0ICgoY3VyIHRlcm0ta2lsbC1lY2hvLWxpc3QpIChmb3VuZCBuaWwpIChzYXZl LXBvaW50IChwb2ludCkpKQogICAgKHVud2luZC1wcm90ZWN0CgkocHJvZ24KCSAgKGVuZC1v Zi1saW5lKQoJICAod2hpbGUgY3VyCgkgICAgKGxldCogKChzdHIgKGNhciBjdXIpKSAobGVu IChsZW5ndGggc3RyKSkgKHN0YXJ0ICgtIChwb2ludCkgbGVuKSkpCgkgICAgICAoaWYgKGFu ZCAoPj0gc3RhcnQgKHBvaW50LW1pbikpCgkJICAgICAgIChzdHJpbmc9IHN0ciAoYnVmZmVy LXN1YnN0cmluZyBzdGFydCAocG9pbnQpKSkpCgkJICAocHJvZ24gKGRlbGV0ZS1iYWNrd2Fy ZC1jaGFyIGxlbikKCQkJIChzZXRxIHRlcm0ta2lsbC1lY2hvLWxpc3QgKGNkciBjdXIpKQoJ CQkgKHNldHEgdGVybS1jdXJyZW50LWNvbHVtbiBuaWwpCgkJCSAoc2V0cSB0ZXJtLWN1cnJl bnQtcm93IG5pbCkKCQkJIChzZXRxIHRlcm0tc3RhcnQtbGluZS1jb2x1bW4gbmlsKQoJCQkg KHNldHEgY3VyIG5pbCBmb3VuZCB0KSkKCQkoc2V0cSBjdXIgKGNkciBjdXIpKSkpKSkKICAg ICAgKHdoZW4gKG5vdCBmb3VuZCkKCShnb3RvLWNoYXIgc2F2ZS1wb2ludCkpKQogICAgZm91 bmQpKQoKKGRlZnVuIHRlcm0tY2hlY2stc2l6ZSAocHJvY2VzcykKICAod2hlbiAob3IgKC89 IHRlcm0taGVpZ2h0ICgxLSAod2luZG93LWhlaWdodCkpKQoJICAgICgvPSB0ZXJtLXdpZHRo ICh0ZXJtLXdpbmRvdy13aWR0aCkpKQogICAgKHRlcm0tcmVzZXQtc2l6ZSAoMS0gKHdpbmRv dy1oZWlnaHQpKSAodGVybS13aW5kb3ctd2lkdGgpKQogICAgKHNldC1wcm9jZXNzLXdpbmRv dy1zaXplIHByb2Nlc3MgdGVybS1oZWlnaHQgdGVybS13aWR0aCkpKQoKKGRlZnVuIHRlcm0t c2VuZC1yYXctc3RyaW5nIChjaGFycykKICAoZGVhY3RpdmF0ZS1tYXJrKQogIChsZXQgKChw cm9jIChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkpKQogICAgKGlmIChu b3QgcHJvYykKCShlcnJvciAiQ3VycmVudCBidWZmZXIgaGFzIG5vIHByb2Nlc3MiKQogICAg ICA7OyBOb3RlIHRoYXQgKHRlcm0tY3VycmVudC1yb3cpIG11c3QgYmUgY2FsbGVkICphZnRl cioKICAgICAgOzsgKHBvaW50KSBoYXMgYmVlbiB1cGRhdGVkIHRvIChwcm9jZXNzLW1hcmsg cHJvYykuCiAgICAgIChnb3RvLWNoYXIgKHByb2Nlc3MtbWFyayBwcm9jKSkKICAgICAgKHdo ZW4gKHRlcm0tcGFnZXItZW5hYmxlZCkKCShzZXRxIHRlcm0tcGFnZXItY291bnQgKHRlcm0t Y3VycmVudC1yb3cpKSkKICAgICAgKHByb2Nlc3Mtc2VuZC1zdHJpbmcgcHJvYyBjaGFycykp KSkKCihkZWZ1biB0ZXJtLXNlbmQtcmF3ICgpCiAgIlNlbmQgdGhlIGxhc3QgY2hhcmFjdGVy IHR5cGVkIHRocm91Z2ggdGhlIHRlcm1pbmFsLWVtdWxhdG9yCndpdGhvdXQgYW55IGludGVy cHJldGF0aW9uLiIKICAoaW50ZXJhY3RpdmUpCiAgOzsgQ29udmVydCBgcmV0dXJuJyB0byBD LW0sIGV0Yy4KICAod2hlbiAoYW5kIChzeW1ib2xwIGxhc3QtaW5wdXQtZXZlbnQpCgkgICAg IChnZXQgbGFzdC1pbnB1dC1ldmVudCAnYXNjaWktY2hhcmFjdGVyKSkKICAgIChzZXRxIGxh c3QtaW5wdXQtZXZlbnQgKGdldCBsYXN0LWlucHV0LWV2ZW50ICdhc2NpaS1jaGFyYWN0ZXIp KSkKICAodGVybS1zZW5kLXJhdy1zdHJpbmcgKG1ha2Utc3RyaW5nIDEgbGFzdC1pbnB1dC1l dmVudCkpKQoKKGRlZnVuIHRlcm0tc2VuZC1yYXctbWV0YSAoKQogIChpbnRlcmFjdGl2ZSkK ICAobGV0ICgoY2hhciBsYXN0LWlucHV0LWV2ZW50KSkKICAgICh3aGVuIChzeW1ib2xwIGxh c3QtaW5wdXQtZXZlbnQpCiAgICAgIDs7IENvbnZlcnQgYHJldHVybicgdG8gQy1tLCBldGMu CiAgICAgIChsZXQgKCh0bXAgKGdldCBjaGFyICdldmVudC1zeW1ib2wtZWxlbWVudHMpKSkK CSh3aGVuIHRtcAoJICAoc2V0cSBjaGFyIChjYXIgdG1wKSkpCgkod2hlbiAoc3ltYm9scCBj aGFyKQoJICAoc2V0cSB0bXAgKGdldCBjaGFyICdhc2NpaS1jaGFyYWN0ZXIpKQoJICAod2hl biB0bXAKCSAgICAoc2V0cSBjaGFyIHRtcCkpKSkpCiAgICAoc2V0cSBjaGFyIChldmVudC1i YXNpYy10eXBlIGNoYXIpKQogICAgKHRlcm0tc2VuZC1yYXctc3RyaW5nIChpZiAoYW5kIChu dW1iZXJwIGNoYXIpCgkJCQkgICAoPiBjaGFyIDEyNykKCQkJCSAgICg8IGNoYXIgMjU2KSkK CQkJICAgICAgKG1ha2Utc3RyaW5nIDEgY2hhcikKCQkJICAgIChmb3JtYXQgIlxlJWMiIGNo YXIpKSkpKQoKKGRlZnVuIHRlcm0tbW91c2UtcGFzdGUgKGNsaWNrIGFyZykKICAiSW5zZXJ0 IHRoZSBsYXN0IHN0cmV0Y2ggb2Yga2lsbGVkIHRleHQgYXQgdGhlIHBvc2l0aW9uIGNsaWNr ZWQgb24uIgogIChpbnRlcmFjdGl2ZSAiZVxuUCIpCiAgKGlmIChmZWF0dXJlcCAneGVtYWNz KQogICAgICAodGVybS1zZW5kLXJhdy1zdHJpbmcKICAgICAgIChvciAoY29uZGl0aW9uLWNh c2UgKCkgKHgtZ2V0LXNlbGVjdGlvbikgKGVycm9yICgpKSkKCSAgICh4LWdldC1jdXRidWZm ZXIpCgkgICAoZXJyb3IgIk5vIHNlbGVjdGlvbiBvciBjdXQgYnVmZmVyIGF2YWlsYWJsZSIp KSkKICAgIDs7IEdpdmUgdGVtcG9yYXJ5IG1vZGVzIHN1Y2ggYXMgaXNlYXJjaCBhIGNoYW5j ZSB0byB0dXJuIG9mZi4KICAgIChydW4taG9va3MgJ21vdXNlLWxlYXZlLWJ1ZmZlci1ob29r KQogICAgKHNldHEgdGhpcy1jb21tYW5kICd5YW5rKQogICAgKG1vdXNlLXNldC1wb2ludCBj bGljaykKICAgICh0ZXJtLXNlbmQtcmF3LXN0cmluZyAoY3VycmVudC1raWxsIChjb25kCgkJ CQkJICgobGlzdHAgYXJnKSAwKQoJCQkJCSAoKGVxIGFyZyAnLSkgLTEpCgkJCQkJICh0ICgx LSBhcmcpKSkpKSkpCgooZGVmdW4gdGVybS1wYXN0ZSAoKQogICJJbnNlcnQgdGhlIGxhc3Qg c3RyZXRjaCBvZiBraWxsZWQgdGV4dCBhdCBwb2ludC4iCiAgKGludGVyYWN0aXZlKQogICAo dGVybS1zZW5kLXJhdy1zdHJpbmcgKGN1cnJlbnQta2lsbCAwKSkpCgo7OyBXaGljaCB3b3Vs ZCBiZSBiZXR0ZXI6ICAiXGVbQSIgb3IgIlxlT0EiPyByZWFkbGluZSBhY2NlcHRzIGVpdGhl ci4KOzsgRm9yIG15IGNvbmZpZ3VyYXRpb24gaXQncyBkZWZpbml0ZWx5IGJldHRlciBcZU9B IGJ1dCBZTU1WLiAtbW0KOzsgRm9yIGV4YW1wbGU6IHZpIHdvcmtzIHdpdGggXGVPQSB3aGls ZSBlbG0gd2FudHMgXGVbQSAuLi4KOzs7ICh0ZXJtaW5mbzoga2N1dTEsIGtjdWQxLCBrY3Vm MSwga2N1YjEsIGtob21lLCBrZW5kLCBrcHAsIGtucCwga2RjaDEsIGticykKKGRlZnVuIHRl cm0tc2VuZC11cCAgICAoKSAoaW50ZXJhY3RpdmUpICh0ZXJtLXNlbmQtcmF3LXN0cmluZyAi XGVPQSIpKQooZGVmdW4gdGVybS1zZW5kLWRvd24gICgpIChpbnRlcmFjdGl2ZSkgKHRlcm0t c2VuZC1yYXctc3RyaW5nICJcZU9CIikpCihkZWZ1biB0ZXJtLXNlbmQtcmlnaHQgKCkgKGlu dGVyYWN0aXZlKSAodGVybS1zZW5kLXJhdy1zdHJpbmcgIlxlT0MiKSkKKGRlZnVuIHRlcm0t c2VuZC1sZWZ0ICAoKSAoaW50ZXJhY3RpdmUpICh0ZXJtLXNlbmQtcmF3LXN0cmluZyAiXGVP RCIpKQooZGVmdW4gdGVybS1zZW5kLWhvbWUgICgpIChpbnRlcmFjdGl2ZSkgKHRlcm0tc2Vu ZC1yYXctc3RyaW5nICJcZVsxfiIpKQooZGVmdW4gdGVybS1zZW5kLWluc2VydCgpIChpbnRl cmFjdGl2ZSkgKHRlcm0tc2VuZC1yYXctc3RyaW5nICJcZVsyfiIpKQooZGVmdW4gdGVybS1z ZW5kLWVuZCAgICgpIChpbnRlcmFjdGl2ZSkgKHRlcm0tc2VuZC1yYXctc3RyaW5nICJcZVs0 fiIpKQooZGVmdW4gdGVybS1zZW5kLXByaW9yICgpIChpbnRlcmFjdGl2ZSkgKHRlcm0tc2Vu ZC1yYXctc3RyaW5nICJcZVs1fiIpKQooZGVmdW4gdGVybS1zZW5kLW5leHQgICgpIChpbnRl cmFjdGl2ZSkgKHRlcm0tc2VuZC1yYXctc3RyaW5nICJcZVs2fiIpKQooZGVmdW4gdGVybS1z ZW5kLWRlbCAgICgpIChpbnRlcmFjdGl2ZSkgKHRlcm0tc2VuZC1yYXctc3RyaW5nICJcZVsz fiIpKQooZGVmdW4gdGVybS1zZW5kLWJhY2tzcGFjZSAgKCkgKGludGVyYWN0aXZlKSAodGVy bS1zZW5kLXJhdy1zdHJpbmcgIlxDLT8iKSkKDAooZGVmdW4gdGVybS1jaGFyLW1vZGUgKCkK ICAiU3dpdGNoIHRvIGNoYXIgKFwicmF3XCIpIHN1Yi1tb2RlIG9mIHRlcm0gbW9kZS4KRWFj aCBjaGFyYWN0ZXIgeW91IHR5cGUgaXMgc2VudCBkaXJlY3RseSB0byB0aGUgaW5mZXJpb3Ig d2l0aG91dAppbnRlcnZlbnRpb24gZnJvbSBFbWFjcywgZXhjZXB0IGZvciB0aGUgZXNjYXBl IGNoYXJhY3RlciAodXN1YWxseSBDLWMpLiIKICAoaW50ZXJhY3RpdmUpCiAgOzsgRklYTUU6 IEVtaXQgbWVzc2FnZT8gQ2ZyIGlsaXNwLXJhdy1tZXNzYWdlCiAgKHdoZW4gKHRlcm0taW4t bGluZS1tb2RlKQogICAgKHNldHEgdGVybS1vbGQtbW9kZS1tYXAgKGN1cnJlbnQtbG9jYWwt bWFwKSkKICAgICh1c2UtbG9jYWwtbWFwIHRlcm0tcmF3LW1hcCkKCiAgICA7OyBTZW5kIGV4 aXN0aW5nIHBhcnRpYWwgbGluZSB0byBpbmZlcmlvciAod2l0aG91dCBuZXdsaW5lKS4KICAg IChsZXQgKChwbWFyayAocHJvY2Vzcy1tYXJrIChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJl bnQtYnVmZmVyKSkpKQoJICAoc2F2ZS1pbnB1dC1zZW5kZXIgdGVybS1pbnB1dC1zZW5kZXIp KQogICAgICAod2hlbiAoPiAocG9pbnQpIHBtYXJrKQoJKHVud2luZC1wcm90ZWN0CgkgICAg KHByb2duCgkgICAgICAoc2V0cSB0ZXJtLWlucHV0LXNlbmRlcgoJCSAgICAoc3ltYm9sLWZ1 bmN0aW9uICd0ZXJtLXNlbmQtc3RyaW5nKSkKCSAgICAgIChlbmQtb2YtbGluZSkKCSAgICAg ICh0ZXJtLXNlbmQtaW5wdXQpKQoJICAoc2V0cSB0ZXJtLWlucHV0LXNlbmRlciBzYXZlLWlu cHV0LXNlbmRlcikpKSkKICAgICh0ZXJtLXVwZGF0ZS1tb2RlLWxpbmUpKSkKCihkZWZ1biB0 ZXJtLWxpbmUtbW9kZSAgKCkKICAiU3dpdGNoIHRvIGxpbmUgKFwiY29va2VkXCIpIHN1Yi1t b2RlIG9mIHRlcm0gbW9kZS4KVGhpcyBtZWFucyB0aGF0IEVtYWNzIGVkaXRpbmcgY29tbWFu ZHMgd29yayBhcyBub3JtYWxseSwgdW50aWwKeW91IHR5cGUgXFxbdGVybS1zZW5kLWlucHV0 XSB3aGljaCBzZW5kcyB0aGUgY3VycmVudCBsaW5lIHRvIHRoZSBpbmZlcmlvci4iCiAgKGlu dGVyYWN0aXZlKQogICh3aGVuICh0ZXJtLWluLWNoYXItbW9kZSkKICAgICh1c2UtbG9jYWwt bWFwIHRlcm0tb2xkLW1vZGUtbWFwKQogICAgKHRlcm0tdXBkYXRlLW1vZGUtbGluZSkpKQoK KGRlZnVuIHRlcm0tdXBkYXRlLW1vZGUtbGluZSAoKQogIChsZXQgKCh0ZXJtLW1vZGUgKGlm ICh0ZXJtLWluLWNoYXItbW9kZSkgImNoYXIiICJsaW5lIikpCiAgICAgICAgKHRlcm0tcGFn ZSAod2hlbiAodGVybS1wYWdlci1lbmFibGVkKSAiIHBhZ2UiKSkKICAgICAgICAoc2VyaWFs LWl0ZW0tc3BlZWQpCiAgICAgICAgKHNlcmlhbC1pdGVtLWNvbmZpZykKICAgICAgICAodGVt cCkKICAgICAgICAocHJvYyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZlcikp KSkKICAgICh3aGVuIChhbmQgKHRlcm0tY2hlY2stcHJvYyAoY3VycmVudC1idWZmZXIpKQog ICAgICAgICAgICAgICAoZXF1YWwgKHByb2Nlc3MtdHlwZSBuaWwpICdzZXJpYWwpKQogICAg ICAobGV0ICgodGVtcCAoc2VyaWFsLXNwZWVkKSkpCiAgICAgICAgKHNldHEgc2VyaWFsLWl0 ZW0tc3BlZWQKICAgICAgICAgICAgYCg6cHJvcGVydGl6ZQogICAgICAgICAgICAgICwob3Ig KGFuZCB0ZW1wIChmb3JtYXQgIiAlZCIgdGVtcCkpICIiKQogICAgICAgICAgICAgIGhlbHAt ZWNobyAibW91c2UtMTogQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQiCiAg ICAgICAgICAgICAgbW91c2UtZmFjZSBtb2RlLWxpbmUtaGlnaGxpZ2h0CiAgICAgICAgICAg ICAgbG9jYWwtbWFwIChrZXltYXAgKG1vZGUtbGluZSBrZXltYXAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoZG93bi1tb3VzZS0xIC4gc2VyaWFsLW1vZGUtbGluZS1zcGVl ZC1tZW51LTEpKSkpKSkKICAgICAgKGxldCAoKHRlbXAgKHByb2Nlc3MtY29udGFjdCBwcm9j IDpzdW1tYXJ5KSkpCiAgICAgICAgKHNldHEgc2VyaWFsLWl0ZW0tY29uZmlnCiAgICAgICAg ICAgICAgYCg6cHJvcGVydGl6ZQogICAgICAgICAgICAgICAgLChvciAoYW5kIHRlbXAgKGZv cm1hdCAiICVzIiB0ZW1wKSkgIiIpCiAgICAgICAgICAgICAgICBoZWxwLWVjaG8gIm1vdXNl LTE6IENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VyaWFsIHBvcnQiCiAgICAg ICAgICAgICAgICBtb3VzZS1mYWNlIG1vZGUtbGluZS1oaWdobGlnaHQKICAgICAgICAgICAg ICAgIGxvY2FsLW1hcCAoa2V5bWFwIChtb2RlLWxpbmUga2V5bWFwCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIChkb3duLW1vdXNlLTEgLiBzZXJpYWwtbW9kZS1saW5lLWNvbmZpZy1t ZW51LTEpKSkpKSkpCiAgICAoc2V0cSBtb2RlLWxpbmUtcHJvY2VzcwogICAgICAgICAgKGxp c3QgIjogIiB0ZXJtLW1vZGUgdGVybS1wYWdlCiAgICAgICAgICAgICAgICBzZXJpYWwtaXRl bS1zcGVlZAogICAgICAgICAgICAgICAgc2VyaWFsLWl0ZW0tY29uZmlnCiAgICAgICAgICAg ICAgICAiICVzIikpKQogIChmb3JjZS1tb2RlLWxpbmUtdXBkYXRlKSkKCihkZWZ1biB0ZXJt LWNoZWNrLXByb2MgKGJ1ZmZlcikKICAiVHJ1ZSBpZiB0aGVyZSBpcyBhIHByb2Nlc3MgYXNz b2NpYXRlZCB3L2J1ZmZlciBCVUZGRVIsIGFuZCBpdAppcyBhbGl2ZS4gIEJVRkZFUiBjYW4g YmUgZWl0aGVyIGEgYnVmZmVyIG9yIHRoZSBuYW1lIG9mIG9uZS4iCiAgKGxldCAoKHByb2Mg KGdldC1idWZmZXItcHJvY2VzcyBidWZmZXIpKSkKICAgIChhbmQgcHJvYyAobWVtcSAocHJv Y2Vzcy1zdGF0dXMgcHJvYykgJyhydW4gc3RvcCBvcGVuIGxpc3RlbiBjb25uZWN0KSkpKSkK Cjs7OyMjI2F1dG9sb2FkCihkZWZ1biBtYWtlLXRlcm0gKG5hbWUgcHJvZ3JhbSAmb3B0aW9u YWwgc3RhcnRmaWxlICZyZXN0IHN3aXRjaGVzKQoiTWFrZSBhIHRlcm0gcHJvY2VzcyBOQU1F IGluIGEgYnVmZmVyLCBydW5uaW5nIFBST0dSQU0uClRoZSBuYW1lIG9mIHRoZSBidWZmZXIg aXMgbWFkZSBieSBzdXJyb3VuZGluZyBOQU1FIHdpdGggYConcy4KSWYgdGhlcmUgaXMgYWxy ZWFkeSBhIHJ1bm5pbmcgcHJvY2VzcyBpbiB0aGF0IGJ1ZmZlciwgaXQgaXMgbm90IHJlc3Rh cnRlZC4KT3B0aW9uYWwgdGhpcmQgYXJnIFNUQVJURklMRSBpcyB0aGUgbmFtZSBvZiBhIGZp bGUgdG8gc2VuZCB0aGUgY29udGVudHMgb2YgdG8KdGhlIHByb2Nlc3MuICBBbnkgbW9yZSBh cmdzIGFyZSBhcmd1bWVudHMgdG8gUFJPR1JBTS4iCiAgKGxldCAoKGJ1ZmZlciAoZ2V0LWJ1 ZmZlci1jcmVhdGUgKGNvbmNhdCAiKiIgbmFtZSAiKiIpKSkpCiAgICA7OyBJZiBubyBwcm9j ZXNzLCBvciBudWtlZCBwcm9jZXNzLCBjcmFuayB1cCBhIG5ldyBvbmUgYW5kIHB1dCBidWZm ZXIgaW4KICAgIDs7IHRlcm0gbW9kZS4gIE90aGVyd2lzZSwgbGVhdmUgYnVmZmVyIGFuZCBl eGlzdGluZyBwcm9jZXNzIGFsb25lLgogICAgKGNvbmQgKChub3QgKHRlcm0tY2hlY2stcHJv YyBidWZmZXIpKQoJICAgKHNhdmUtZXhjdXJzaW9uCgkgICAgIChzZXQtYnVmZmVyIGJ1ZmZl cikKCSAgICAgKHRlcm0tbW9kZSkpIDsgSW5zdGFsbCBsb2NhbCB2YXJzLCBtb2RlLCBrZXlt YXAsIC4uLgoJICAgKHRlcm0tZXhlYyBidWZmZXIgbmFtZSBwcm9ncmFtIHN0YXJ0ZmlsZSBz d2l0Y2hlcykpKQogICAgYnVmZmVyKSkKCjs7OyMjI2F1dG9sb2FkCihkZWZ1biB0ZXJtIChw cm9ncmFtKQogICJTdGFydCBhIHRlcm1pbmFsLWVtdWxhdG9yIGluIGEgbmV3IGJ1ZmZlci4K VGhlIGJ1ZmZlciBpcyBpbiBUZXJtIG1vZGU7IHNlZSBgdGVybS1tb2RlJyBmb3IgdGhlCmNv bW1hbmRzIHRvIHVzZSBpbiB0aGF0IGJ1ZmZlci4KClxcPHRlcm0tcmF3LW1hcD5UeXBlIFxc W3N3aXRjaC10by1idWZmZXJdIHRvIHN3aXRjaCB0byBhbm90aGVyIGJ1ZmZlci4iCiAgKGlu dGVyYWN0aXZlIChsaXN0IChyZWFkLWZyb20tbWluaWJ1ZmZlciAiUnVuIHByb2dyYW06ICIK CQkJCQkgICAob3IgZXhwbGljaXQtc2hlbGwtZmlsZS1uYW1lCgkJCQkJICAgICAgIChnZXRl bnYgIkVTSEVMTCIpCgkJCQkJICAgICAgIChnZXRlbnYgIlNIRUxMIikKCQkJCQkgICAgICAg Ii9iaW4vc2giKSkpKQogIChzZXQtYnVmZmVyIChtYWtlLXRlcm0gInRlcm1pbmFsIiBwcm9n cmFtKSkKICAodGVybS1tb2RlKQogICh0ZXJtLWNoYXItbW9kZSkKICAoc3dpdGNoLXRvLWJ1 ZmZlciAiKnRlcm1pbmFsKiIpKQoKKGRlZnVuIHRlcm0tZXhlYyAoYnVmZmVyIG5hbWUgY29t bWFuZCBzdGFydGZpbGUgc3dpdGNoZXMpCiAgIlN0YXJ0IHVwIGEgcHJvY2VzcyBpbiBidWZm ZXIgZm9yIHRlcm0gbW9kZXMuCkJsYXN0cyBhbnkgb2xkIHByb2Nlc3MgcnVubmluZyBpbiB0 aGUgYnVmZmVyLiAgRG9lc24ndCBzZXQgdGhlIGJ1ZmZlciBtb2RlLgpZb3UgY2FuIHVzZSB0 aGlzIHRvIGNoZWFwbHkgcnVuIGEgc2VyaWVzIG9mIHByb2Nlc3NlcyBpbiB0aGUgc2FtZSB0 ZXJtCmJ1ZmZlci4gIFRoZSBob29rIGB0ZXJtLWV4ZWMtaG9vaycgaXMgcnVuIGFmdGVyIGVh Y2ggZXhlYy4iCiAgKHNhdmUtZXhjdXJzaW9uCiAgICAoc2V0LWJ1ZmZlciBidWZmZXIpCiAg ICAobGV0ICgocHJvYyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIGJ1ZmZlcikpKQk7IEJsYXN0IGFu eSBvbGQgcHJvY2Vzcy4KICAgICAgKHdoZW4gcHJvYyAoZGVsZXRlLXByb2Nlc3MgcHJvYykp KQogICAgOzsgQ3JhbmsgdXAgYSBuZXcgcHJvY2VzcwogICAgKGxldCAoKHByb2MgKHRlcm0t ZXhlYy0xIG5hbWUgYnVmZmVyIGNvbW1hbmQgc3dpdGNoZXMpKSkKICAgICAgKG1ha2UtbG9j YWwtdmFyaWFibGUgJ3Rlcm0tcHR5cCkKICAgICAgKHNldHEgdGVybS1wdHlwIHByb2Nlc3Mt Y29ubmVjdGlvbi10eXBlKSA7IHQgaWYgcHR5LCBuaWwgaWYgcGlwZS4KICAgICAgOzsgSnVt cCB0byB0aGUgZW5kLCBhbmQgc2V0IHRoZSBwcm9jZXNzIG1hcmsuCiAgICAgIChnb3RvLWNo YXIgKHBvaW50LW1heCkpCiAgICAgIChzZXQtbWFya2VyIChwcm9jZXNzLW1hcmsgcHJvYykg KHBvaW50KSkKICAgICAgKHNldC1wcm9jZXNzLWZpbHRlciBwcm9jICd0ZXJtLWVtdWxhdGUt dGVybWluYWwpCiAgICAgIChzZXQtcHJvY2Vzcy1zZW50aW5lbCBwcm9jICd0ZXJtLXNlbnRp bmVsKQogICAgICA7OyBGZWVkIGl0IHRoZSBzdGFydGZpbGUuCiAgICAgIChjb25kIChzdGFy dGZpbGUKCSAgICAgOztUaGlzIGlzIGd1YXJhbnRlZWQgdG8gd2FpdCBsb25nIGVub3VnaAoJ ICAgICA7O2J1dCBoYXMgYmFkIHJlc3VsdHMgaWYgdGhlIHRlcm0gZG9lcyBub3QgcHJvbXB0 IGF0IGFsbAoJICAgICA7OwkgICAgICh3aGlsZSAoPSBzaXplIChidWZmZXItc2l6ZSkpCgkg ICAgIDs7CSAgICAgICAoc2xlZXAtZm9yIDEpKQoJICAgICA7O0kgaG9wZSAxIHNlY29uZCBp cyBlbm91Z2ghCgkgICAgIChzbGVlcC1mb3IgMSkKCSAgICAgKGdvdG8tY2hhciAocG9pbnQt bWF4KSkKCSAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIHN0YXJ0ZmlsZSkKCSAgICAgKHNl dHEgc3RhcnRmaWxlIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKQoJ ICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChwb2ludC1tYXgpKQoJICAgICAodGVybS1z ZW5kLXN0cmluZyBwcm9jIHN0YXJ0ZmlsZSkpKQogICAgKHJ1bi1ob29rcyAndGVybS1leGVj LWhvb2spCiAgICBidWZmZXIpKSkKCihkZWZ1biB0ZXJtLXNlbnRpbmVsIChwcm9jIG1zZykK ICAiU2VudGluZWwgZm9yIHRlcm0gYnVmZmVycy4KVGhlIG1haW4gcHVycG9zZSBpcyB0byBn ZXQgcmlkIG9mIHRoZSBsb2NhbCBrZXltYXAuIgogIChsZXQgKChidWZmZXIgKHByb2Nlc3Mt YnVmZmVyIHByb2MpKSkKICAgICh3aGVuIChtZW1xIChwcm9jZXNzLXN0YXR1cyBwcm9jKSAn KHNpZ25hbCBleGl0KSkKICAgICAgKGlmIChudWxsIChidWZmZXItbmFtZSBidWZmZXIpKQoJ ICA7OyBidWZmZXIga2lsbGVkCgkgIChzZXQtcHJvY2Vzcy1idWZmZXIgcHJvYyBuaWwpCgko bGV0ICgob2J1ZiAoY3VycmVudC1idWZmZXIpKSkKCSAgOzsgc2F2ZS1leGN1cnNpb24gaXNu J3QgdGhlIHJpZ2h0IHRoaW5nIGlmCgkgIDs7IHByb2Nlc3MtYnVmZmVyIGlzIGN1cnJlbnQt YnVmZmVyCgkgICh1bndpbmQtcHJvdGVjdAoJICAgICAgKHByb2duCgkJOzsgV3JpdGUgc29t ZXRoaW5nIGluIHRoZSBjb21waWxhdGlvbiBidWZmZXIKCQk7OyBhbmQgaGFjayBpdHMgbW9k ZSBsaW5lLgoJCShzZXQtYnVmZmVyIGJ1ZmZlcikKCQk7OyBHZXQgcmlkIG9mIGxvY2FsIGtl eW1hcC4KCQkodXNlLWxvY2FsLW1hcCBuaWwpCgkJKHRlcm0taGFuZGxlLWV4aXQgKHByb2Nl c3MtbmFtZSBwcm9jKQoJCQkJICBtc2cpCgkJOzsgU2luY2UgdGhlIGJ1ZmZlciBhbmQgbW9k ZSBsaW5lIHdpbGwgc2hvdyB0aGF0IHRoZQoJCTs7IHByb2Nlc3MgaXMgZGVhZCwgd2UgY2Fu IGRlbGV0ZSBpdCBub3cuICBPdGhlcndpc2UgaXQKCQk7OyB3aWxsIHN0YXkgYXJvdW5kIHVu dGlsIE0teCBsaXN0LXByb2Nlc3Nlcy4KCQkoZGVsZXRlLXByb2Nlc3MgcHJvYykpCgkgICAg KHNldC1idWZmZXIgb2J1ZikpKQoJKSkpKQoKKGRlZnVuIHRlcm0taGFuZGxlLWV4aXQgKHBy b2Nlc3MtbmFtZSBtc2cpCiAgIldyaXRlIHByb2Nlc3MgZXhpdCAob3Igb3RoZXIgY2hhbmdl KSBtZXNzYWdlIE1TRyBpbiB0aGUgY3VycmVudCBidWZmZXIuIgogIChsZXQgKChidWZmZXIt cmVhZC1vbmx5IG5pbCkKCShvbWF4IChwb2ludC1tYXgpKQoJKG9wb2ludCAocG9pbnQpKSkK ICAgIDs7IFJlY29yZCB3aGVyZSB3ZSBwdXQgdGhlIG1lc3NhZ2UsIHNvIHdlIGNhbiBpZ25v cmUgaXQKICAgIDs7IGxhdGVyIG9uLgogICAgKGdvdG8tY2hhciBvbWF4KQogICAgKGluc2Vy dCA/XG4gIlByb2Nlc3MgIiBwcm9jZXNzLW5hbWUgIiAiIG1zZykKICAgIDs7IEZvcmNlIG1v ZGUgbGluZSByZWRpc3BsYXkgc29vbi4KICAgIChmb3JjZS1tb2RlLWxpbmUtdXBkYXRlKQog ICAgKHdoZW4gKGFuZCBvcG9pbnQgKDwgb3BvaW50IG9tYXgpKQogICAgICAoZ290by1jaGFy IG9wb2ludCkpKSkKCgo7OzsgTmFtZSB0byB1c2UgZm9yIFRFUk0uCjs7OyBVc2luZyAiZW1h Y3MiIGxvc2VzLCBiZWNhdXNlIGJhc2ggZGlzYWJsZXMgZWRpdGluZyBpZiBURVJNID09IGVt YWNzLgooZGVmdmFyIHRlcm0tdGVybS1uYW1lICJldGVybS1jb2xvciIpCjsgRm9ybWF0IHN0 cmluZywgdXNhZ2U6CjsgKGZvcm1hdCB0ZXJtLXRlcm1jYXAtc3RyaW5nIGVtYWNzLXRlcm0t bmFtZSAiVEVSTUNBUD0iIDI0IDgwKQooZGVmdmFyIHRlcm0tdGVybWNhcC1mb3JtYXQKICAi JXMlczpsaSMlZDpjbyMlZDpjbD1cXEVbSFxcRVtKOmNkPVxcRVtKOmJzOmFtOnhuOmNtPVxc RVslJWklJWQ7JSVkSFwKOm5kPVxcRVtDOnVwPVxcRVtBOmNlPVxcRVtLOmhvPVxcRVtIOnB0 XAo6YWw9XFxFW0w6ZGw9XFxFW006REw9XFxFWyUlZE06QUw9XFxFWyUlZEw6Y3M9XFxFWyUl aSUlZDslJWRyOnNmPV5KXAo6ZGM9XFxFW1A6REM9XFxFWyUlZFA6SUM9XFxFWyUlZEA6aW09 XFxFWzRoOmVpPVxcRVs0bDptaTpcCjpzbz1cXEVbN206c2U9XFxFW206dXM9XFxFWzRtOnVl PVxcRVttOm1kPVxcRVsxbTptcj1cXEVbN206bWU9XFxFW21cCjpVUD1cXEVbJSVkQTpETz1c XEVbJSVkQjpMRT1cXEVbJSVkRDpSST1cXEVbJSVkQ1wKOmtsPVxcRU9EOmtkPVxcRU9COmty PVxcRU9DOmt1PVxcRU9BOmtOPVxcRVs2fjprUD1cXEVbNX46QDc9XFxFWzR+OmtoPVxcRVsx flwKOm1rPVxcRVs4bTpjYj1cXEVbMUs6b3A9XFxFWzM5OzQ5bTpDbyM4OnBhIzY0OkFCPVxc RVs0JSVkbTpBRj1cXEVbMyUlZG06Y3I9Xk1cCjpibD1eRzpkbz1eSjpsZT1eSDp0YT1eSTpz ZT1cXEVbMjdtOnVlPVxcRTI0bVwKOmtiPV4/OmtEPV5bWzN+OnNjPVxcRTc6cmM9XFxFODpy MT1cXEVjOiIKOzs7IDogLXVuZGVmaW5lIGljCjs7OyBkb24ndCBkZWZpbmUgOnRlPVxcRVsy SlxcRVs/NDdsXFxFODp0aT1cXEU3XFxFWz80N2hcCiAgIlRlcm1jYXAgY2FwYWJpbGl0aWVz IHN1cHBvcnRlZC4iKQoKOzs7IFRoaXMgYXV4aWxpYXJ5IGZ1bmN0aW9uIGNyYW5rcyB1cCB0 aGUgcHJvY2VzcyBmb3IgdGVybS1leGVjIGluCjs7OyB0aGUgYXBwcm9wcmlhdGUgZW52aXJv bm1lbnQuCgooZGVmdW4gdGVybS1leGVjLTEgKG5hbWUgYnVmZmVyIGNvbW1hbmQgc3dpdGNo ZXMpCiAgOzsgV2UgbmVlZCB0byBkbyBhbiBleHRyYSAoZm9yay1sZXNzKSBleGVjIHRvIHJ1 biBzdHR5LgogIDs7IChUaGlzIHdvdWxkIG5vdCBiZSBuZWVkZWQgaWYgd2UgaGFkIHN1aXRh YmxlIEVtYWNzIHByaW1pdGl2ZXMuKQogIDs7IFRoZSAnaWYgLi4uOyB0aGVuIHNoaWZ0OyBm aScgaGFjayBpcyBiZWNhdXNlIEJvdXJuZSBzaGVsbAogIDs7IGxvc2VzIG9uZSBhcmcgd2hl biBjYWxsZWQgd2l0aCAtYywgYW5kIG5ld2VyIHNoZWxscyAoYmFzaCwgIGtzaCkgZG9uJ3Qu CiAgOzsgVGh1cyB3ZSBhZGQgYW4gZXh0cmEgZHVtbXkgYXJndW1lbnQgIi4uIiwgYW5kIHRo ZW4gcmVtb3ZlIGl0LgogIChsZXQgKChwcm9jZXNzLWVudmlyb25tZW50CgkgKG5jb25jCgkg IChsaXN0CgkgICAoZm9ybWF0ICJURVJNPSVzIiB0ZXJtLXRlcm0tbmFtZSkKCSAgIChmb3Jt YXQgIlRFUk1JTkZPPSVzIiBkYXRhLWRpcmVjdG9yeSkKCSAgIChmb3JtYXQgdGVybS10ZXJt Y2FwLWZvcm1hdCAiVEVSTUNBUD0iCgkJICAgdGVybS10ZXJtLW5hbWUgdGVybS1oZWlnaHQg dGVybS13aWR0aCkKCSAgIDs7IFdlIGFyZSBnb2luZyB0byBnZXQgcmlkIG9mIHRoZSBiaW5k aW5nIGZvciBFTUFDUywKCSAgIDs7IHByb2JhYmx5IGluIEVtYWNzIDIzLCBiZWNhdXNlIGl0 IGJyZWFrcwoJICAgOzsgYC4vY29uZmlndXJlJyBvZiBzb21lIHBhY2thZ2VzIHRoYXQgZXhw ZWN0IGl0IHRvCgkgICA7OyBzYXkgd2hlcmUgdG8gZmluZCBFTUFDUy4KCSAgIChmb3JtYXQg IkVNQUNTPSVzICh0ZXJtOiVzKSIgZW1hY3MtdmVyc2lvbiB0ZXJtLXByb3RvY29sLXZlcnNp b24pCgkgICAoZm9ybWF0ICJJTlNJREVfRU1BQ1M9JXMsdGVybTolcyIgZW1hY3MtdmVyc2lv biB0ZXJtLXByb3RvY29sLXZlcnNpb24pCgkgICAoZm9ybWF0ICJMSU5FUz0lZCIgdGVybS1o ZWlnaHQpCgkgICAoZm9ybWF0ICJDT0xVTU5TPSVkIiB0ZXJtLXdpZHRoKSkKCSAgcHJvY2Vz cy1lbnZpcm9ubWVudCkpCgkocHJvY2Vzcy1jb25uZWN0aW9uLXR5cGUgdCkKCTs7IFdlIHNo b3VsZCBzdXBwcmVzcyBjb252ZXJzaW9uIG9mIGVuZC1vZi1saW5lIGZvcm1hdC4KCShpbmhp Yml0LWVvbC1jb252ZXJzaW9uIHQpCgk7OyBUaGUgcHJvY2VzcydzIG91dHB1dCBjb250YWlu cyBub3QganVzdCBjaGFycyBidXQgYWxzbyBiaW5hcnkKCTs7IGVzY2FwZSBjb2Rlcywgc28g d2UgbmVlZCB0byBzZWUgdGhlIHJhdyBvdXRwdXQuICBXZSB3aWxsIGhhdmUgdG8KCTs7IGRv IHRoZSBkZWNvZGluZyBieSBoYW5kIG9uIHRoZSBwYXJ0cyB0aGF0IGFyZSBtYWRlIG9mIGNo YXJzLgoJKGNvZGluZy1zeXN0ZW0tZm9yLXJlYWQgJ2JpbmFyeSkpCiAgICAoYXBwbHkgJ3N0 YXJ0LXByb2Nlc3MgbmFtZSBidWZmZXIKCSAgICIvYmluL3NoIiAiLWMiCgkgICAoZm9ybWF0 ICJzdHR5IC1ubCBlY2hvIHJvd3MgJWQgY29sdW1ucyAlZCBzYW5lIDI+L2Rldi9udWxsO1wK aWYgWyAkMSA9IC4uIF07IHRoZW4gc2hpZnQ7IGZpOyBleGVjIFwiJEBcIiIKCQkgICB0ZXJt LWhlaWdodCB0ZXJtLXdpZHRoKQoJICAgIi4uIgoJICAgY29tbWFuZCBzd2l0Y2hlcykpKQoK DAo7OzsgSW5wdXQgaGlzdG9yeSBwcm9jZXNzaW5nIGluIGEgYnVmZmVyCjs7OyA9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KOzs7IFVzZWZ1bCBpbnB1dCBoaXN0b3J5IGZ1bmN0aW9ucywgY291 cnRlc3kgb2YgdGhlIEVyZ28gZ3JvdXAuCgo7OzsgRWxldmVuIGNvbW1hbmRzOgo7OzsgdGVy bS1keW5hbWljLWxpc3QtaW5wdXQtcmluZwlMaXN0IGhpc3RvcnkgaW4gaGVscCBidWZmZXIu Cjs7OyB0ZXJtLXByZXZpb3VzLWlucHV0CQlQcmV2aW91cyBpbnB1dC4uLgo7OzsgdGVybS1w cmV2aW91cy1tYXRjaGluZy1pbnB1dAkuLi5tYXRjaGluZyBhIHN0cmluZy4KOzs7IHRlcm0t cHJldmlvdXMtbWF0Y2hpbmctaW5wdXQtZnJvbS1pbnB1dCAuLi4gbWF0Y2hpbmcgdGhlIGN1 cnJlbnQgaW5wdXQuCjs7OyB0ZXJtLW5leHQtaW5wdXQJCQlOZXh0IGlucHV0Li4uCjs7OyB0 ZXJtLW5leHQtbWF0Y2hpbmctaW5wdXQJCS4uLm1hdGNoaW5nIGEgc3RyaW5nLgo7OzsgdGVy bS1uZXh0LW1hdGNoaW5nLWlucHV0LWZyb20taW5wdXQgICAgIC4uLiBtYXRjaGluZyB0aGUg Y3VycmVudCBpbnB1dC4KOzs7IHRlcm0tYmFja3dhcmQtbWF0Y2hpbmctaW5wdXQgICAgICBC YWNrd2FyZHMgaW5wdXQuLi4KOzs7IHRlcm0tZm9yd2FyZC1tYXRjaGluZy1pbnB1dCAgICAg ICAuLi5tYXRjaGluZyBhIHN0cmluZy4KOzs7IHRlcm0tcmVwbGFjZS1ieS1leHBhbmRlZC1o aXN0b3J5CUV4cGFuZCBoaXN0b3J5IGF0IHBvaW50Owo7OzsJCQkJCXJlcGxhY2Ugd2l0aCBl eHBhbmRlZCBoaXN0b3J5Lgo7OzsgdGVybS1tYWdpYy1zcGFjZQkJCUV4cGFuZCBoaXN0b3J5 IGFuZCBpbnNlcnQgc3BhY2UuCjs7Owo7OzsgVGhyZWUgZnVuY3Rpb25zOgo7OzsgdGVybS1y ZWFkLWlucHV0LXJpbmcgICAgICAgICAgICAgIFJlYWQgaW50byB0ZXJtLWlucHV0LXJpbmcu Li4KOzs7IHRlcm0td3JpdGUtaW5wdXQtcmluZyAgICAgICAgICAgICBXcml0ZSB0byB0ZXJt LWlucHV0LXJpbmctZmlsZS1uYW1lLgo7OzsgdGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWhp c3RvcnktYmVmb3JlLXBvaW50IFdvcmtob3JzZSBmdW5jdGlvbi4KCihkZWZ1biB0ZXJtLXJl YWQtaW5wdXQtcmluZyAoJm9wdGlvbmFsIHNpbGVudCkKICAiU2V0cyB0aGUgYnVmZmVyJ3Mg YHRlcm0taW5wdXQtcmluZycgZnJvbSBhIGhpc3RvcnkgZmlsZS4KVGhlIG5hbWUgb2YgdGhl IGZpbGUgaXMgZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlIGB0ZXJtLWlucHV0LXJpbmctZmlsZS1u YW1lJy4KVGhlIGhpc3RvcnkgcmluZyBpcyBvZiBzaXplIGB0ZXJtLWlucHV0LXJpbmctc2l6 ZScsIHJlZ2FyZGxlc3Mgb2YgZmlsZSBzaXplLgpJZiBgdGVybS1pbnB1dC1yaW5nLWZpbGUt bmFtZScgaXMgbmlsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgoKSWYgdGhlIG9wdGlv bmFsIGFyZ3VtZW50IFNJTEVOVCBpcyBub24tbmlsLCB3ZSBzYXkgbm90aGluZyBhYm91dCBh CmZhaWx1cmUgdG8gcmVhZCB0aGUgaGlzdG9yeSBmaWxlLgoKVGhpcyBmdW5jdGlvbiBpcyB1 c2VmdWwgZm9yIG1ham9yIG1vZGUgY29tbWFuZHMgYW5kIG1vZGUgaG9va3MuCgpUaGUgc3Ry dWN0dXJlIG9mIHRoZSBoaXN0b3J5IGZpbGUgc2hvdWxkIGJlIG9uZSBpbnB1dCBjb21tYW5k IHBlciBsaW5lLAp3aXRoIHRoZSBtb3N0IHJlY2VudCBjb21tYW5kIGxhc3QuClNlZSBhbHNv IGB0ZXJtLWlucHV0LWlnbm9yZWR1cHMnIGFuZCBgdGVybS13cml0ZS1pbnB1dC1yaW5nJy4i CiAgKGNvbmQgKChvciAobnVsbCB0ZXJtLWlucHV0LXJpbmctZmlsZS1uYW1lKQoJICAgICAo ZXF1YWwgdGVybS1pbnB1dC1yaW5nLWZpbGUtbmFtZSAiIikpCgkgbmlsKQoJKChub3QgKGZp bGUtcmVhZGFibGUtcCB0ZXJtLWlucHV0LXJpbmctZmlsZS1uYW1lKSkKCSAob3Igc2lsZW50 CgkgICAgIChtZXNzYWdlICJDYW5ub3QgcmVhZCBoaXN0b3J5IGZpbGUgJXMiCgkJICAgICAg dGVybS1pbnB1dC1yaW5nLWZpbGUtbmFtZSkpKQoJKHQKCSAobGV0ICgoaGlzdG9yeS1idWYg KGdldC1idWZmZXItY3JlYXRlICIgKnRlbXAqIikpCgkgICAgICAgKGZpbGUgdGVybS1pbnB1 dC1yaW5nLWZpbGUtbmFtZSkKCSAgICAgICAoY291bnQgMCkKCSAgICAgICAocmluZyAobWFr ZS1yaW5nIHRlcm0taW5wdXQtcmluZy1zaXplKSkpCgkgICAodW53aW5kLXByb3RlY3QKCSAg ICAgICAoc2F2ZS1leGN1cnNpb24KCQkgKHNldC1idWZmZXIgaGlzdG9yeS1idWYpCgkJICh3 aWRlbikKCQkgKGVyYXNlLWJ1ZmZlcikKCQkgKGluc2VydC1maWxlLWNvbnRlbnRzIGZpbGUp CgkJIDs7IFNhdmUgcmVzdHJpY3Rpb24gaW4gY2FzZSBmaWxlIGlzIGFscmVhZHkgdmlzaXRl ZC4uLgoJCSA7OyBXYXRjaCBmb3IgdGhvc2UgZGF0ZSBzdGFtcHMgaW4gaGlzdG9yeSBmaWxl cyEKCQkgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKCQkgKHdoaWxlIChhbmQgKDwgY291bnQg dGVybS1pbnB1dC1yaW5nLXNpemUpCgkJCSAgICAgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXlsg XHRdKlxcKFteI1xuXS4qXFwpWyBcdF0qJCIKCQkJCQkJIG5pbCB0KSkKCQkgICAobGV0ICgo aGlzdG9yeSAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCgkJCQkJCSAg ICAobWF0Y2gtZW5kIDEpKSkpCgkJICAgICAod2hlbiAob3IgKG51bGwgdGVybS1pbnB1dC1p Z25vcmVkdXBzKQoJCQkgICAgICAgKHJpbmctZW1wdHktcCByaW5nKQoJCQkgICAgICAgKG5v dCAoc3RyaW5nLWVxdWFsIChyaW5nLXJlZiByaW5nIDApIGhpc3RvcnkpKSkKCQkJIChyaW5n LWluc2VydC1hdC1iZWdpbm5pbmcgcmluZyBoaXN0b3J5KSkpCgkJICAgKHNldHEgY291bnQg KDErIGNvdW50KSkpKQoJICAgICAoa2lsbC1idWZmZXIgaGlzdG9yeS1idWYpKQoJICAgKHNl dHEgdGVybS1pbnB1dC1yaW5nIHJpbmcKCQkgdGVybS1pbnB1dC1yaW5nLWluZGV4IG5pbCkp KSkpCgooZGVmdW4gdGVybS13cml0ZS1pbnB1dC1yaW5nICgpCiAgIldyaXRlcyB0aGUgYnVm ZmVyJ3MgYHRlcm0taW5wdXQtcmluZycgdG8gYSBoaXN0b3J5IGZpbGUuClRoZSBuYW1lIG9m IHRoZSBmaWxlIGlzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSBgdGVybS1pbnB1dC1yaW5nLWZp bGUtbmFtZScuClRoZSBvcmlnaW5hbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgbG9zdCBp ZiBgdGVybS1pbnB1dC1yaW5nJyBpcyBub3QgZW1wdHkuCklmIGB0ZXJtLWlucHV0LXJpbmct ZmlsZS1uYW1lJyBpcyBuaWwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCgpVc2VmdWwg d2l0aGluIHByb2Nlc3Mgc2VudGluZWxzLgoKU2VlIGFsc28gYHRlcm0tcmVhZC1pbnB1dC1y aW5nJy4iCiAgKGNvbmQgKChvciAobnVsbCB0ZXJtLWlucHV0LXJpbmctZmlsZS1uYW1lKQoJ ICAgICAoZXF1YWwgdGVybS1pbnB1dC1yaW5nLWZpbGUtbmFtZSAiIikKCSAgICAgKG51bGwg dGVybS1pbnB1dC1yaW5nKSAocmluZy1lbXB0eS1wIHRlcm0taW5wdXQtcmluZykpCgkgbmls KQoJKChub3QgKGZpbGUtd3JpdGFibGUtcCB0ZXJtLWlucHV0LXJpbmctZmlsZS1uYW1lKSkK CSAobWVzc2FnZSAiQ2Fubm90IHdyaXRlIGhpc3RvcnkgZmlsZSAlcyIgdGVybS1pbnB1dC1y aW5nLWZpbGUtbmFtZSkpCgkodAoJIChsZXQqICgoaGlzdG9yeS1idWYgKGdldC1idWZmZXIt Y3JlYXRlICIgKlRlbXAgSW5wdXQgSGlzdG9yeSoiKSkKCQkocmluZyB0ZXJtLWlucHV0LXJp bmcpCgkJKGZpbGUgdGVybS1pbnB1dC1yaW5nLWZpbGUtbmFtZSkKCQkoaW5kZXggKHJpbmct bGVuZ3RoIHJpbmcpKSkKCSAgIDs7IFdyaXRlIGl0IGFsbCBvdXQgaW50byBhIGJ1ZmZlciBm aXJzdC4gIE11Y2ggZmFzdGVyLCBidXQgbWVzc2llciwKCSAgIDs7IHRoYW4gd3JpdGluZyBp dCBvbmUgbGluZSBhdCBhIHRpbWUuCgkgICAoc2F2ZS1leGN1cnNpb24KCSAgICAgKHNldC1i dWZmZXIgaGlzdG9yeS1idWYpCgkgICAgIChlcmFzZS1idWZmZXIpCgkgICAgICh3aGlsZSAo PiBpbmRleCAwKQoJICAgICAgIChzZXRxIGluZGV4ICgxLSBpbmRleCkpCgkgICAgICAgKGlu c2VydCAocmluZy1yZWYgcmluZyBpbmRleCkgP1xuKSkKCSAgICAgKHdyaXRlLXJlZ2lvbiAo YnVmZmVyLXN0cmluZykgbmlsIGZpbGUgbmlsICduby1tZXNzYWdlKQoJICAgICAoa2lsbC1i dWZmZXIgbmlsKSkpKSkpCgoKKGRlZnVuIHRlcm0tZHluYW1pYy1saXN0LWlucHV0LXJpbmcg KCkKICAiTGlzdCBpbiBoZWxwIGJ1ZmZlciB0aGUgYnVmZmVyJ3MgaW5wdXQgaGlzdG9yeS4i CiAgKGludGVyYWN0aXZlKQogIChpZiAob3IgKG5vdCAocmluZy1wIHRlcm0taW5wdXQtcmlu ZykpCgkgIChyaW5nLWVtcHR5LXAgdGVybS1pbnB1dC1yaW5nKSkKICAgICAgKG1lc3NhZ2Ug Ik5vIGhpc3RvcnkiKQogICAgKGxldCAoKGhpc3RvcnkgbmlsKQoJICAoaGlzdG9yeS1idWZm ZXIgIiAqSW5wdXQgSGlzdG9yeSoiKQoJICAoaW5kZXggKDEtIChyaW5nLWxlbmd0aCB0ZXJt LWlucHV0LXJpbmcpKSkKCSAgKGNvbmYgKGN1cnJlbnQtd2luZG93LWNvbmZpZ3VyYXRpb24p KSkKICAgICAgOzsgV2UgaGF2ZSB0byBidWlsZCB1cCBhIGxpc3Qgb3Vyc2VsdmVzIGZyb20g dGhlIHJpbmcgdmVjdG9yLgogICAgICAod2hpbGUgKD49IGluZGV4IDApCgkoc2V0cSBoaXN0 b3J5IChjb25zIChyaW5nLXJlZiB0ZXJtLWlucHV0LXJpbmcgaW5kZXgpIGhpc3RvcnkpCgkg ICAgICBpbmRleCAoMS0gaW5kZXgpKSkKICAgICAgOzsgQ2hhbmdlICJjb21wbGV0aW9uIiB0 byAiaGlzdG9yeSByZWZlcmVuY2UiCiAgICAgIDs7IHRvIG1ha2UgdGhlIGRpc3BsYXkgYWNj dXJhdGUuCiAgICAgICh3aXRoLW91dHB1dC10by10ZW1wLWJ1ZmZlciBoaXN0b3J5LWJ1ZmZl cgoJKGRpc3BsYXktY29tcGxldGlvbi1saXN0IGhpc3RvcnkpCgkoc2V0LWJ1ZmZlciBoaXN0 b3J5LWJ1ZmZlcikKCShmb3J3YXJkLWxpbmUgMykKCSh3aGlsZSAoc2VhcmNoLWJhY2t3YXJk ICJjb21wbGV0aW9uIiBuaWwgJ21vdmUpCgkgIChyZXBsYWNlLW1hdGNoICJoaXN0b3J5IHJl ZmVyZW5jZSIpKSkKICAgICAgKHNpdC1mb3IgMCkKICAgICAgKG1lc3NhZ2UgIkhpdCBzcGFj ZSB0byBmbHVzaCIpCiAgICAgIChsZXQgKChjaCAocmVhZC1ldmVudCkpKQoJKGlmIChlcSBj aCA/XHMpCgkgICAgKHNldC13aW5kb3ctY29uZmlndXJhdGlvbiBjb25mKQoJICAoc2V0cSB1 bnJlYWQtY29tbWFuZC1ldmVudHMgKGxpc3QgY2gpKSkpKSkpCgoKKGRlZnVuIHRlcm0tcmVn ZXhwLWFyZyAocHJvbXB0KQogIDs7IFJldHVybiBsaXN0IG9mIHJlZ2V4cCBhbmQgcHJlZml4 IGFyZyB1c2luZyBQUk9NUFQuCiAgKGxldCogKDs7IERvbid0IGNsb2JiZXIgdGhpcy4KCSAo bGFzdC1jb21tYW5kIGxhc3QtY29tbWFuZCkKCSAocmVnZXhwIChyZWFkLWZyb20tbWluaWJ1 ZmZlciBwcm9tcHQgbmlsIG5pbCBuaWwKCQkJCSAgICAgICAnbWluaWJ1ZmZlci1oaXN0b3J5 LXNlYXJjaC1oaXN0b3J5KSkpCiAgICAobGlzdCAoaWYgKHN0cmluZy1lcXVhbCByZWdleHAg IiIpCgkgICAgICAoc2V0Y2FyIG1pbmlidWZmZXItaGlzdG9yeS1zZWFyY2gtaGlzdG9yeQoJ CSAgICAgIChudGggMSBtaW5pYnVmZmVyLWhpc3Rvcnktc2VhcmNoLWhpc3RvcnkpKQoJICAg IHJlZ2V4cCkKCSAgKHByZWZpeC1udW1lcmljLXZhbHVlIGN1cnJlbnQtcHJlZml4LWFyZykp KSkKCihkZWZ1biB0ZXJtLXNlYXJjaC1hcmcgKGFyZykKICA7OyBGaXJzdCBtYWtlIHN1cmUg dGhlcmUgaXMgYSByaW5nIGFuZCB0aGF0IHdlIGFyZSBhZnRlciB0aGUgcHJvY2VzcyBtYXJr CiAgKGNvbmQgKChub3QgKHRlcm0tYWZ0ZXItcG1hcmstcCkpCgkgKGVycm9yICJOb3QgYXQg Y29tbWFuZCBsaW5lIikpCgkoKG9yIChudWxsIHRlcm0taW5wdXQtcmluZykKCSAgICAgKHJp bmctZW1wdHktcCB0ZXJtLWlucHV0LXJpbmcpKQoJIChlcnJvciAiRW1wdHkgaW5wdXQgcmlu ZyIpKQoJKCh6ZXJvcCBhcmcpCgkgOzsgYXJnIG9mIHplcm8gcmVzZXRzIHNlYXJjaCBmcm9t IGJlZ2lubmluZywgYW5kIHVzZXMgYXJnIG9mIDEKCSAoc2V0cSB0ZXJtLWlucHV0LXJpbmct aW5kZXggbmlsKQoJIDEpCgkodAoJIGFyZykpKQoKKGRlZnVuIHRlcm0tc2VhcmNoLXN0YXJ0 IChhcmcpCiAgOzsgSW5kZXggdG8gc3RhcnQgYSBkaXJlY3Rpb25hbCBzZWFyY2gsIHN0YXJ0 aW5nIGF0IHRlcm0taW5wdXQtcmluZy1pbmRleAogIChpZiB0ZXJtLWlucHV0LXJpbmctaW5k ZXgKICAgICAgOzsgSWYgYSBzZWFyY2ggaXMgcnVubmluZywgb2Zmc2V0IGJ5IDEgaW4gZGly ZWN0aW9uIG9mIGFyZwogICAgICAobW9kICgrIHRlcm0taW5wdXQtcmluZy1pbmRleCAoaWYg KD4gYXJnIDApIDEgLTEpKQoJICAgKHJpbmctbGVuZ3RoIHRlcm0taW5wdXQtcmluZykpCiAg ICA7OyBGb3IgYSBuZXcgc2VhcmNoLCBzdGFydCBmcm9tIGJlZ2lubmluZyBvciBlbmQsIGFz IGFwcHJvcHJpYXRlCiAgICAoaWYgKD49IGFyZyAwKQoJMAkJCQkgICAgICAgOyBGaXJzdCBl bHQgZm9yIGZvcndhcmQgc2VhcmNoCiAgICAgICgxLSAocmluZy1sZW5ndGggdGVybS1pbnB1 dC1yaW5nKSkpKSkgIDsgTGFzdCBlbHQgZm9yIGJhY2t3YXJkIHNlYXJjaAoKKGRlZnVuIHRl cm0tcHJldmlvdXMtaW5wdXQtc3RyaW5nIChhcmcpCiAgIlJldHVybiB0aGUgc3RyaW5nIEFS RyBwbGFjZXMgYWxvbmcgdGhlIGlucHV0IHJpbmcuCk1vdmVzIHJlbGF0aXZlIHRvIGB0ZXJt LWlucHV0LXJpbmctaW5kZXgnLiIKICAocmluZy1yZWYgdGVybS1pbnB1dC1yaW5nIChpZiB0 ZXJtLWlucHV0LXJpbmctaW5kZXgKCQkJCSAgKG1vZCAoKyBhcmcgdGVybS1pbnB1dC1yaW5n LWluZGV4KQoJCQkJICAgICAgIChyaW5nLWxlbmd0aCB0ZXJtLWlucHV0LXJpbmcpKQoJCQkJ YXJnKSkpCgooZGVmdW4gdGVybS1wcmV2aW91cy1pbnB1dCAoYXJnKQogICJDeWNsZSBiYWNr d2FyZHMgdGhyb3VnaCBpbnB1dCBoaXN0b3J5LiIKICAoaW50ZXJhY3RpdmUgIipwIikKICAo dGVybS1wcmV2aW91cy1tYXRjaGluZy1pbnB1dCAiLiIgYXJnKSkKCihkZWZ1biB0ZXJtLW5l eHQtaW5wdXQgKGFyZykKICAiQ3ljbGUgZm9yd2FyZHMgdGhyb3VnaCBpbnB1dCBoaXN0b3J5 LiIKICAoaW50ZXJhY3RpdmUgIipwIikKICAodGVybS1wcmV2aW91cy1pbnB1dCAoLSBhcmcp KSkKCihkZWZ1biB0ZXJtLXByZXZpb3VzLW1hdGNoaW5nLWlucHV0LXN0cmluZyAocmVnZXhw IGFyZykKICAiUmV0dXJuIHRoZSBzdHJpbmcgbWF0Y2hpbmcgUkVHRVhQIEFSRyBwbGFjZXMg YWxvbmcgdGhlIGlucHV0IHJpbmcuCk1vdmVzIHJlbGF0aXZlIHRvIGB0ZXJtLWlucHV0LXJp bmctaW5kZXgnLiIKICAobGV0KiAoKHBvcyAodGVybS1wcmV2aW91cy1tYXRjaGluZy1pbnB1 dC1zdHJpbmctcG9zaXRpb24gcmVnZXhwIGFyZykpKQogICAgKHdoZW4gcG9zIChyaW5nLXJl ZiB0ZXJtLWlucHV0LXJpbmcgcG9zKSkpKQoKKGRlZnVuIHRlcm0tcHJldmlvdXMtbWF0Y2hp bmctaW5wdXQtc3RyaW5nLXBvc2l0aW9uCiAgKHJlZ2V4cCBhcmcgJm9wdGlvbmFsIHN0YXJ0 KQogICJSZXR1cm4gdGhlIGluZGV4IG1hdGNoaW5nIFJFR0VYUCBBUkcgcGxhY2VzIGFsb25n IHRoZSBpbnB1dCByaW5nLgpNb3ZlcyByZWxhdGl2ZSB0byBTVEFSVCwgb3IgYHRlcm0taW5w dXQtcmluZy1pbmRleCcuIgogICh3aGVuIChvciAobm90IChyaW5nLXAgdGVybS1pbnB1dC1y aW5nKSkKCSAgICAocmluZy1lbXB0eS1wIHRlcm0taW5wdXQtcmluZykpCiAgICAoZXJyb3Ig Ik5vIGhpc3RvcnkiKSkKICAobGV0KiAoKGxlbiAocmluZy1sZW5ndGggdGVybS1pbnB1dC1y aW5nKSkKCSAobW90aW9uIChpZiAoPiBhcmcgMCkgMSAtMSkpCgkgKG4gKG1vZCAoLSAob3Ig c3RhcnQgKHRlcm0tc2VhcmNoLXN0YXJ0IGFyZykpIG1vdGlvbikgbGVuKSkKCSAodHJpZWQt ZWFjaC1yaW5nLWl0ZW0gbmlsKQoJIChwcmV2IG5pbCkpCiAgICA7OyBEbyB0aGUgd2hvbGUg c2VhcmNoIGFzIG1hbnkgdGltZXMgYXMgdGhlIGFyZ3VtZW50IHNheXMuCiAgICAod2hpbGUg KGFuZCAoLz0gYXJnIDApIChub3QgdHJpZWQtZWFjaC1yaW5nLWl0ZW0pKQogICAgICA7OyBT dGVwIG9uY2UuCiAgICAgIChzZXRxIHByZXYgbgoJICAgIG4gKG1vZCAoKyBuIG1vdGlvbikg bGVuKSkKICAgICAgOzsgSWYgd2UgaGF2ZW4ndCByZWFjaGVkIGEgbWF0Y2gsIHN0ZXAgc29t ZSBtb3JlLgogICAgICAod2hpbGUgKGFuZCAoPCBuIGxlbikgKG5vdCB0cmllZC1lYWNoLXJp bmctaXRlbSkKCQkgIChub3QgKHN0cmluZy1tYXRjaCByZWdleHAgKHJpbmctcmVmIHRlcm0t aW5wdXQtcmluZyBuKSkpKQoJKHNldHEgbiAobW9kICgrIG4gbW90aW9uKSBsZW4pCgkgICAg ICA7OyBJZiB3ZSBoYXZlIGdvbmUgYWxsIHRoZSB3YXkgYXJvdW5kIGluIHRoaXMgc2VhcmNo LgoJICAgICAgdHJpZWQtZWFjaC1yaW5nLWl0ZW0gKD0gbiBwcmV2KSkpCiAgICAgIChzZXRx IGFyZyAoaWYgKD4gYXJnIDApICgxLSBhcmcpICgxKyBhcmcpKSkpCiAgICA7OyBOb3cgdGhh dCB3ZSBrbm93IHdoaWNoIHJpbmcgZWxlbWVudCB0byB1c2UsIGlmIHdlIGZvdW5kIGl0LCBy ZXR1cm4gdGhhdC4KICAgICh3aGVuIChzdHJpbmctbWF0Y2ggcmVnZXhwIChyaW5nLXJlZiB0 ZXJtLWlucHV0LXJpbmcgbikpCiAgICAgIG4pKSkKCihkZWZ1biB0ZXJtLXByZXZpb3VzLW1h dGNoaW5nLWlucHV0IChyZWdleHAgbikKICAiU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIGlu cHV0IGhpc3RvcnkgZm9yIG1hdGNoIGZvciBSRUdFWFAuClwoUHJldmlvdXMgaGlzdG9yeSBl bGVtZW50cyBhcmUgZWFybGllciBjb21tYW5kcy4pCldpdGggcHJlZml4IGFyZ3VtZW50IE4s IHNlYXJjaCBmb3IgTnRoIHByZXZpb3VzIG1hdGNoLgpJZiBOIGlzIG5lZ2F0aXZlLCBmaW5k IHRoZSBuZXh0IG9yIE50aCBuZXh0IG1hdGNoLiIKICAoaW50ZXJhY3RpdmUgKHRlcm0tcmVn ZXhwLWFyZyAiUHJldmlvdXMgaW5wdXQgbWF0Y2hpbmcgKHJlZ2V4cCk6ICIpKQogIChzZXRx IG4gKHRlcm0tc2VhcmNoLWFyZyBuKSkKICAobGV0ICgocG9zICh0ZXJtLXByZXZpb3VzLW1h dGNoaW5nLWlucHV0LXN0cmluZy1wb3NpdGlvbiByZWdleHAgbikpKQogICAgOzsgSGFzIGEg bWF0Y2ggYmVlbiBmb3VuZD8KICAgIChpZiAobnVsbCBwb3MpCgkoZXJyb3IgIk5vdCBmb3Vu ZCIpCiAgICAgIChzZXRxIHRlcm0taW5wdXQtcmluZy1pbmRleCBwb3MpCiAgICAgIChtZXNz YWdlICJIaXN0b3J5IGl0ZW06ICVkIiAoMSsgcG9zKSkKICAgICAgKGRlbGV0ZS1yZWdpb24K ICAgICAgIDs7IENhbid0IHVzZSBraWxsLXJlZ2lvbiBhcyBpdCBzZXRzIHRoaXMtY29tbWFu ZAogICAgICAgKHByb2Nlc3MtbWFyayAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1 ZmZlcikpKSAocG9pbnQpKQogICAgICAoaW5zZXJ0IChyaW5nLXJlZiB0ZXJtLWlucHV0LXJp bmcgcG9zKSkpKSkKCihkZWZ1biB0ZXJtLW5leHQtbWF0Y2hpbmctaW5wdXQgKHJlZ2V4cCBu KQogICJTZWFyY2ggZm9yd2FyZHMgdGhyb3VnaCBpbnB1dCBoaXN0b3J5IGZvciBtYXRjaCBm b3IgUkVHRVhQLgpcKExhdGVyIGhpc3RvcnkgZWxlbWVudHMgYXJlIG1vcmUgcmVjZW50IGNv bW1hbmRzLikKV2l0aCBwcmVmaXggYXJndW1lbnQgTiwgc2VhcmNoIGZvciBOdGggZm9sbG93 aW5nIG1hdGNoLgpJZiBOIGlzIG5lZ2F0aXZlLCBmaW5kIHRoZSBwcmV2aW91cyBvciBOdGgg cHJldmlvdXMgbWF0Y2guIgogIChpbnRlcmFjdGl2ZSAodGVybS1yZWdleHAtYXJnICJOZXh0 IGlucHV0IG1hdGNoaW5nIChyZWdleHApOiAiKSkKICAodGVybS1wcmV2aW91cy1tYXRjaGlu Zy1pbnB1dCByZWdleHAgKC0gbikpKQoKKGRlZnVuIHRlcm0tcHJldmlvdXMtbWF0Y2hpbmct aW5wdXQtZnJvbS1pbnB1dCAobikKICAiU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIGlucHV0 IGhpc3RvcnkgZm9yIG1hdGNoIGZvciBjdXJyZW50IGlucHV0LgpcKFByZXZpb3VzIGhpc3Rv cnkgZWxlbWVudHMgYXJlIGVhcmxpZXIgY29tbWFuZHMuKQpXaXRoIHByZWZpeCBhcmd1bWVu dCBOLCBzZWFyY2ggZm9yIE50aCBwcmV2aW91cyBtYXRjaC4KSWYgTiBpcyBuZWdhdGl2ZSwg c2VhcmNoIGZvcndhcmRzIGZvciB0aGUgLU50aCBmb2xsb3dpbmcgbWF0Y2guIgogIChpbnRl cmFjdGl2ZSAicCIpCiAgKHdoZW4gKG5vdCAobWVtcSBsYXN0LWNvbW1hbmQgJyh0ZXJtLXBy ZXZpb3VzLW1hdGNoaW5nLWlucHV0LWZyb20taW5wdXQKCQkJCXRlcm0tbmV4dC1tYXRjaGlu Zy1pbnB1dC1mcm9tLWlucHV0KSkpCiAgICA7OyBTdGFydGluZyBhIG5ldyBzZWFyY2gKICAg IChzZXRxIHRlcm0tbWF0Y2hpbmctaW5wdXQtZnJvbS1pbnB1dC1zdHJpbmcKCSAgKGJ1ZmZl ci1zdWJzdHJpbmcKCSAgIChwcm9jZXNzLW1hcmsgKGdldC1idWZmZXItcHJvY2VzcyAoY3Vy cmVudC1idWZmZXIpKSkKCSAgIChwb2ludCkpCgkgIHRlcm0taW5wdXQtcmluZy1pbmRleCBu aWwpKQogICh0ZXJtLXByZXZpb3VzLW1hdGNoaW5nLWlucHV0CiAgIChjb25jYXQgIl4iIChy ZWdleHAtcXVvdGUgdGVybS1tYXRjaGluZy1pbnB1dC1mcm9tLWlucHV0LXN0cmluZykpCiAg IG4pKQoKKGRlZnVuIHRlcm0tbmV4dC1tYXRjaGluZy1pbnB1dC1mcm9tLWlucHV0IChuKQog ICJTZWFyY2ggZm9yd2FyZHMgdGhyb3VnaCBpbnB1dCBoaXN0b3J5IGZvciBtYXRjaCBmb3Ig Y3VycmVudCBpbnB1dC4KXChGb2xsb3dpbmcgaGlzdG9yeSBlbGVtZW50cyBhcmUgbW9yZSBy ZWNlbnQgY29tbWFuZHMuKQpXaXRoIHByZWZpeCBhcmd1bWVudCBOLCBzZWFyY2ggZm9yIE50 aCBmb2xsb3dpbmcgbWF0Y2guCklmIE4gaXMgbmVnYXRpdmUsIHNlYXJjaCBiYWNrd2FyZHMg Zm9yIHRoZSAtTnRoIHByZXZpb3VzIG1hdGNoLiIKICAoaW50ZXJhY3RpdmUgInAiKQogICh0 ZXJtLXByZXZpb3VzLW1hdGNoaW5nLWlucHV0LWZyb20taW5wdXQgKC0gbikpKQoKCihkZWZ1 biB0ZXJtLXJlcGxhY2UtYnktZXhwYW5kZWQtaGlzdG9yeSAoJm9wdGlvbmFsIHNpbGVudCkK ICAiRXhwYW5kIGlucHV0IGNvbW1hbmQgaGlzdG9yeSByZWZlcmVuY2VzIGJlZm9yZSBwb2lu dC4KRXhwYW5zaW9uIGlzIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYHRlcm0taW5wdXQt YXV0b2V4cGFuZCcuCgpUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIGJ1ZmZlcidzIGlk ZWEgb2YgdGhlIGlucHV0IGhpc3RvcnksIHdoaWNoIG1heSBub3QKbWF0Y2ggdGhlIGNvbW1h bmQgaW50ZXJwcmV0ZXIncyBpZGVhLCBhc3N1bWluZyBpdCBoYXMgb25lLgoKQXNzdW1lcyBo aXN0b3J5IHN5bnRheCBpcyBsaWtlIHR5cGljYWwgVW4qeCBzaGVsbHMnLiAgSG93ZXZlciwg c2luY2UgRW1hY3MKY2Fubm90IGtub3cgdGhlIGludGVycHJldGVyJ3MgaWRlYSBvZiBpbnB1 dCBsaW5lIG51bWJlcnMsIGFzc3VtaW5nIGl0IGhhcyBvbmUsCml0IGNhbm5vdCBleHBhbmQg YWJzb2x1dGUgaW5wdXQgbGluZSBudW1iZXIgcmVmZXJlbmNlcy4KCklmIHRoZSBvcHRpb25h bCBhcmd1bWVudCBTSUxFTlQgaXMgbm9uLW5pbCwgbmV2ZXIgY29tcGxhaW4KZXZlbiBpZiBo aXN0b3J5IHJlZmVyZW5jZSBzZWVtcyBlcnJvbmVvdXMuCgpTZWUgYHRlcm0tbWFnaWMtc3Bh Y2UnIGFuZCBgdGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWhpc3RvcnktYmVmb3JlLXBvaW50 Jy4KClJldHVybnMgdCBpZiBzdWNjZXNzZnVsLiIKICAoaW50ZXJhY3RpdmUpCiAgKHdoZW4g KGFuZCB0ZXJtLWlucHV0LWF1dG9leHBhbmQKCSAgICAgKHN0cmluZy1tYXRjaCAiWyFeXSIg KGZ1bmNhbGwgdGVybS1nZXQtb2xkLWlucHV0KSkKCSAgICAgKHNhdmUtZXhjdXJzaW9uIChi ZWdpbm5pbmctb2YtbGluZSkKCQkJICAgICAobG9va2luZy1hdCB0ZXJtLXByb21wdC1yZWdl eHApKSkKICAgIDs7IExvb2tzIGxpa2UgdGhlcmUgbWlnaHQgYmUgaGlzdG9yeSByZWZlcmVu Y2VzIGluIHRoZSBjb21tYW5kLgogICAgKGxldCAoKHByZXZpb3VzLW1vZGlmaWVkLXRpY2sg KGJ1ZmZlci1tb2RpZmllZC10aWNrKSkpCiAgICAgIChtZXNzYWdlICJFeHBhbmRpbmcgaGlz dG9yeSByZWZlcmVuY2VzLi4uIikKICAgICAgKHRlcm0tcmVwbGFjZS1ieS1leHBhbmRlZC1o aXN0b3J5LWJlZm9yZS1wb2ludCBzaWxlbnQpCiAgICAgICgvPSBwcmV2aW91cy1tb2RpZmll ZC10aWNrIChidWZmZXItbW9kaWZpZWQtdGljaykpKSkpCgoKKGRlZnVuIHRlcm0tcmVwbGFj ZS1ieS1leHBhbmRlZC1oaXN0b3J5LWJlZm9yZS1wb2ludCAoc2lsZW50KQogICJFeHBhbmQg ZGlyZWN0b3J5IHN0YWNrIHJlZmVyZW5jZSBiZWZvcmUgcG9pbnQuClNlZSBgdGVybS1yZXBs YWNlLWJ5LWV4cGFuZGVkLWhpc3RvcnknLiAgUmV0dXJucyB0IGlmIHN1Y2Nlc3NmdWwuIgog IChzYXZlLWV4Y3Vyc2lvbgogICAgKGxldCAoKHRvZW5kICgtIChzYXZlLWV4Y3Vyc2lvbiAo ZW5kLW9mLWxpbmUgbmlsKSAocG9pbnQpKSAocG9pbnQpKSkKCSAgKHN0YXJ0IChwcm9nbiAo dGVybS1ib2wgbmlsKSAocG9pbnQpKSkpCiAgICAgICh3aGlsZSAocHJvZ24KCSAgICAgICAo c2tpcC1jaGFycy1mb3J3YXJkICJeIV4iCgkJCQkgICAoc2F2ZS1leGN1cnNpb24KCQkJCSAg ICAgKGVuZC1vZi1saW5lIG5pbCkgKC0gKHBvaW50KSB0b2VuZCkpKQoJICAgICAgICg8IChw b2ludCkKCQkgIChzYXZlLWV4Y3Vyc2lvbgoJCSAgICAoZW5kLW9mLWxpbmUgbmlsKSAoLSAo cG9pbnQpIHRvZW5kKSkpKQoJOzsgVGhpcyBzZWVtcyBhIGJpdCBjb21wbGV4LiAgV2UgbG9v ayBmb3IgcmVmZXJlbmNlcyBzdWNoIGFzICEhLCAhLW51bSwKCTs7ICFmb28sICE/Zm9vLCAh e2Jhcn0sICE/e2Jhcn0sIF5vaCwgXm15XiwgXmdvZF5pdCwgXm5ldmVyXmVuZHNeLgoJOzsg SWYgdGhhdCB3YXNuJ3QgZW5vdWdoLCB0aGUgcGxpbmdzIGNhbiBiZSBzdWZmaXhlZCB3aXRo IGFyZ3VtZW50Cgk7OyByYW5nZSBzcGVjaWZpZXJzLgoJOzsgQXJndW1lbnQgcmFuZ2VzIGFy ZSBjb21wbGV4IHRvbywgc28gd2UgaGl2ZSBvZmYgdGhlIGlucHV0IGxpbmUsCgk7OyByZWZl cmVuY2VkIHdpdGggcGxpbmdzLCB3aXRoIHRoZSByYW5nZSBzdHJpbmcgdG8gYHRlcm0tYXJn cycuCgkoc2V0cSB0ZXJtLWlucHV0LXJpbmctaW5kZXggbmlsKQoJKGNvbmQgKChvciAoPSAo cHJlY2VkaW5nLWNoYXIpID9cXCkKCQkgICAodGVybS13aXRoaW4tcXVvdGVzIHN0YXJ0IChw b2ludCkpKQoJICAgICAgIDs7IFRoZSBoaXN0b3J5IGlzIHF1b3RlZCwgb3Igd2UncmUgaW4g cXVvdGVzLgoJICAgICAgIChnb3RvLWNoYXIgKDErIChwb2ludCkpKSkKCSAgICAgICgobG9v a2luZy1hdCAiIVswLTldK1xcKCRcXHxbXi1dXFwpIikKCSAgICAgICA7OyBXZSBjYW5ub3Qg a25vdyB0aGUgaW50ZXJwcmV0ZXIncyBpZGVhIG9mIGlucHV0IGxpbmUgbnVtYmVycy4KCSAg ICAgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpCgkgICAgICAgKG1lc3NhZ2UgIkFic29s dXRlIHJlZmVyZW5jZSBjYW5ub3QgYmUgZXhwYW5kZWQiKSkKCSAgICAgICgobG9va2luZy1h dCAiIS1cXChbMC05XStcXClcXCg6P1swLTleJCotXStcXCk/IikKCSAgICAgICA7OyBKdXN0 IGEgbnVtYmVyIG9mIGFyZ3MgZnJvbSBgbnVtYmVyJyBsaW5lcyBiYWNrd2FyZC4KCSAgICAg ICAobGV0ICgobnVtYmVyICgxLSAoc3RyaW5nLXRvLW51bWJlcgoJCQkJICAoYnVmZmVyLXN1 YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCgkJCQkJCSAgICAobWF0Y2gtZW5kIDEpKSkp KSkKCQkgKGlmICg8PSBudW1iZXIgKHJpbmctbGVuZ3RoIHRlcm0taW5wdXQtcmluZykpCgkJ ICAgICAocHJvZ24KCQkgICAgICAgKHJlcGxhY2UtbWF0Y2gKCQkJKHRlcm0tYXJncyAodGVy bS1wcmV2aW91cy1pbnB1dC1zdHJpbmcgbnVtYmVyKQoJCQkJICAgICAobWF0Y2gtYmVnaW5u aW5nIDIpIChtYXRjaC1lbmQgMikpCgkJCXQgdCkKCQkgICAgICAgKHNldHEgdGVybS1pbnB1 dC1yaW5nLWluZGV4IG51bWJlcikKCQkgICAgICAgKG1lc3NhZ2UgIkhpc3RvcnkgaXRlbTog JWQiICgxKyBudW1iZXIpKSkKCQkgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpCgkJICAg KG1lc3NhZ2UgIlJlbGF0aXZlIHJlZmVyZW5jZSBleGNlZWRzIGlucHV0IGhpc3Rvcnkgc2l6 ZSIpKSkpCgkgICAgICAoKG9yIChsb29raW5nLWF0ICIhIT86P1xcKFswLTleJCotXStcXCki KSAobG9va2luZy1hdCAiISEiKSkKCSAgICAgICA7OyBKdXN0IGEgbnVtYmVyIG9mIGFyZ3Mg ZnJvbSB0aGUgcHJldmlvdXMgaW5wdXQgbGluZS4KCSAgICAgICAocmVwbGFjZS1tYXRjaAoJ CSh0ZXJtLWFyZ3MgKHRlcm0tcHJldmlvdXMtaW5wdXQtc3RyaW5nIDApCgkJCSAgICAgKG1h dGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKQoJCXQgdCkKCSAgICAgICAobWVzc2Fn ZSAiSGlzdG9yeSBpdGVtOiBwcmV2aW91cyIpKQoJICAgICAgKChsb29raW5nLWF0CgkJIiFc XD8/XFwoe1xcKC4rXFwpfVxcfFxcKFxcc3crXFwpXFwpXFwoOj9bMC05XiQqLV0rXFwpPyIp CgkgICAgICAgOzsgTW9zdCByZWNlbnQgaW5wdXQgc3RhcnRpbmcgd2l0aCBvciBjb250YWlu aW5nIChwb3NzaWJseQoJICAgICAgIDs7IHByb3RlY3RlZCkgc3RyaW5nLCBtYXliZSBqdXN0 IGEgbnVtYmVyIG9mIGFyZ3MuICBQaGV3LgoJICAgICAgIChsZXQqICgobWIxIChtYXRjaC1i ZWdpbm5pbmcgMSkpIChtZTEgKG1hdGNoLWVuZCAxKSkKCQkgICAgICAobWIyIChtYXRjaC1i ZWdpbm5pbmcgMikpIChtZTIgKG1hdGNoLWVuZCAyKSkKCQkgICAgICAoZXhwIChidWZmZXIt c3Vic3RyaW5nIChvciBtYjIgbWIxKSAob3IgbWUyIG1lMSkpKQoJCSAgICAgIChwcmVmIChp ZiAoc2F2ZS1tYXRjaC1kYXRhIChsb29raW5nLWF0ICIhXFw/IikpICIiICJeIikpCgkJICAg ICAgKHBvcyAoc2F2ZS1tYXRjaC1kYXRhCgkJCSAgICAgKHRlcm0tcHJldmlvdXMtbWF0Y2hp bmctaW5wdXQtc3RyaW5nLXBvc2l0aW9uCgkJCSAgICAgIChjb25jYXQgcHJlZiAocmVnZXhw LXF1b3RlIGV4cCkpIDEpKSkpCgkJIChpZiAobnVsbCBwb3MpCgkJICAgICAocHJvZ24KCQkg ICAgICAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKQoJCSAgICAgICAob3Igc2lsZW50CgkJ CSAgIChwcm9nbiAobWVzc2FnZSAiTm90IGZvdW5kIikKCQkJCSAgKGRpbmcpKSkpCgkJICAg KHNldHEgdGVybS1pbnB1dC1yaW5nLWluZGV4IHBvcykKCQkgICAocmVwbGFjZS1tYXRjaAoJ CSAgICAodGVybS1hcmdzIChyaW5nLXJlZiB0ZXJtLWlucHV0LXJpbmcgcG9zKQoJCQkJICht YXRjaC1iZWdpbm5pbmcgNCkgKG1hdGNoLWVuZCA0KSkKCQkgICAgdCB0KQoJCSAgIChtZXNz YWdlICJIaXN0b3J5IGl0ZW06ICVkIiAoMSsgcG9zKSkpKSkKCSAgICAgICgobG9va2luZy1h dCAiXFxeXFwoW15eXStcXClcXF4/XFwoW15eXSpcXClcXF4/IikKCSAgICAgICA7OyBRdWlj ayBzdWJzdGl0dXRpb24gb24gdGhlIHByZXZpb3VzIGlucHV0IGxpbmUuCgkgICAgICAgKGxl dCAoKG9sZCAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1l bmQgMSkpKQoJCSAgICAgKG5ldyAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5n IDIpIChtYXRjaC1lbmQgMikpKQoJCSAgICAgKHBvcyBuaWwpKQoJCSAocmVwbGFjZS1tYXRj aCAodGVybS1wcmV2aW91cy1pbnB1dC1zdHJpbmcgMCkgdCB0KQoJCSAoc2V0cSBwb3MgKHBv aW50KSkKCQkgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQoJCSAoaWYgKG5vdCAo c2VhcmNoLWZvcndhcmQgb2xkIHBvcyB0KSkKCQkgICAgIChvciBzaWxlbnQKCQkJIChlcnJv ciAiTm90IGZvdW5kIikpCgkJICAgKHJlcGxhY2UtbWF0Y2ggbmV3IHQgdCkKCQkgICAobWVz c2FnZSAiSGlzdG9yeSBpdGVtOiBzdWJzdGl0dXRlZCIpKSkpCgkgICAgICAodAoJICAgICAg IChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkpKSkpKSkKCgooZGVmdW4gdGVybS1tYWdpYy1z cGFjZSAoYXJnKQogICJFeHBhbmQgaW5wdXQgaGlzdG9yeSByZWZlcmVuY2VzIGJlZm9yZSBw b2ludCBhbmQgaW5zZXJ0IEFSRyBzcGFjZXMuCkEgdXNlZnVsIGNvbW1hbmQgdG8gYmluZCB0 byBTUEMuICBTZWUgYHRlcm0tcmVwbGFjZS1ieS1leHBhbmRlZC1oaXN0b3J5Jy4iCiAgKGlu dGVyYWN0aXZlICJwIikKICAodGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWhpc3RvcnkpCiAg KHNlbGYtaW5zZXJ0LWNvbW1hbmQgYXJnKSkKDAooZGVmdW4gdGVybS13aXRoaW4tcXVvdGVz IChiZWcgZW5kKQogICJSZXR1cm4gdCBpZiB0aGUgbnVtYmVyIG9mIHF1b3RlcyBiZXR3ZWVu IEJFRyBhbmQgRU5EIGlzIG9kZC4KUXVvdGVzIGFyZSBzaW5nbGUgYW5kIGRvdWJsZS4iCiAg KGxldCAoKGNvdW50c3EgKHRlcm0taG93LW1hbnktcmVnaW9uICJcXCheXFx8W15cXFxcXVxc KVwnIiBiZWcgZW5kKSkKCShjb3VudGRxICh0ZXJtLWhvdy1tYW55LXJlZ2lvbiAiXFwoXlxc fFteXFxcXF1cXClcIiIgYmVnIGVuZCkpKQogICAgKG9yICg9IChtb2QgY291bnRzcSAyKSAx KSAoPSAobW9kIGNvdW50ZHEgMikgMSkpKSkKCihkZWZ1biB0ZXJtLWhvdy1tYW55LXJlZ2lv biAocmVnZXhwIGJlZyBlbmQpCiAgIlJldHVybiBudW1iZXIgb2YgbWF0Y2hlcyBmb3IgUkVH RVhQIGZyb20gQkVHIHRvIEVORC4iCiAgKGxldCAoKGNvdW50IDApKQogICAgKHNhdmUtZXhj dXJzaW9uCiAgICAgIChzYXZlLW1hdGNoLWRhdGEKCShnb3RvLWNoYXIgYmVnKQoJKHdoaWxl IChyZS1zZWFyY2gtZm9yd2FyZCByZWdleHAgZW5kIHQpCgkgIChzZXRxIGNvdW50ICgxKyBj b3VudCkpKSkpCiAgICBjb3VudCkpCgooZGVmdW4gdGVybS1hcmdzIChzdHJpbmcgYmVnaW4g ZW5kKQogIDs7IEZyb20gU1RSSU5HLCByZXR1cm4gdGhlIGFyZ3MgZGVwZW5kaW5nIG9uIHRo ZSByYW5nZSBzcGVjaWZpZWQgaW4gdGhlIHRleHQKICA7OyBmcm9tIEJFR0lOIHRvIEVORC4g IElmIEJFR0lOIGlzIG5pbCwgYXNzdW1lIGFsbCBhcmdzLiAgSWdub3JlIGxlYWRpbmcgYDon LgogIDs7IFJhbmdlIGNhbiBiZSB4LXksIHgtLCAteSwgd2hlcmUgeC95IGNhbiBiZSBbMC05 XSwgKiwgXiwgJC4KICAoc2F2ZS1tYXRjaC1kYXRhCiAgICAoaWYgKG51bGwgYmVnaW4pCgko dGVybS1hcmd1bWVudHMgc3RyaW5nIDAgbmlsKQogICAgICAobGV0KiAoKHJhbmdlIChidWZm ZXItc3Vic3RyaW5nCgkJICAgICAoaWYgKGVxIChjaGFyLWFmdGVyIGJlZ2luKSA/OikgKDEr IGJlZ2luKSBiZWdpbikgZW5kKSkKCSAgICAgKG50aCAoY29uZCAoKHN0cmluZy1tYXRjaCAi XlsqXl0iIHJhbmdlKSAxKQoJCQkoKHN0cmluZy1tYXRjaCAiXi0iIHJhbmdlKSAwKQoJCQko KHN0cmluZy1lcXVhbCByYW5nZSAiJCIpIG5pbCkKCQkJKHQgKHN0cmluZy10by1udW1iZXIg cmFuZ2UpKSkpCgkgICAgIChtdGggKGNvbmQgKChzdHJpbmctbWF0Y2ggIlstKiRdJCIgcmFu Z2UpIG5pbCkKCQkJKChzdHJpbmctbWF0Y2ggIi0iIHJhbmdlKQoJCQkgKHN0cmluZy10by1u dW1iZXIgKHN1YnN0cmluZyByYW5nZSAobWF0Y2gtZW5kIDApKSkpCgkJCSh0IG50aCkpKSkK CSh0ZXJtLWFyZ3VtZW50cyBzdHJpbmcgbnRoIG10aCkpKSkpCgo7OyBSZXR1cm4gYSBsaXN0 IG9mIGFyZ3VtZW50cyBmcm9tIEFSRy4gIEJyZWFrIGl0IHVwIGF0IHRoZQo7OyBkZWxpbWl0 ZXJzIGluIHRlcm0tZGVsaW1pdGVyLWFyZ3VtZW50LWxpc3QuICBSZXR1cm5lZCBsaXN0IGlz IGJhY2t3YXJkcy4KKGRlZnVuIHRlcm0tZGVsaW0tYXJnIChhcmcpCiAgKGlmIChudWxsIHRl cm0tZGVsaW1pdGVyLWFyZ3VtZW50LWxpc3QpCiAgICAgIChsaXN0IGFyZykKICAgIChsZXQg KChhcmdzIG5pbCkKCSAgKHBvcyAwKQoJICAobGVuIChsZW5ndGggYXJnKSkpCiAgICAgICh3 aGlsZSAoPCBwb3MgbGVuKQoJKGxldCAoKGNoYXIgKGFyZWYgYXJnIHBvcykpCgkgICAgICAo c3RhcnQgcG9zKSkKCSAgKGlmIChtZW1xIGNoYXIgdGVybS1kZWxpbWl0ZXItYXJndW1lbnQt bGlzdCkKCSAgICAgICh3aGlsZSAoYW5kICg8IHBvcyBsZW4pIChlcSAoYXJlZiBhcmcgcG9z KSBjaGFyKSkKCQkoc2V0cSBwb3MgKDErIHBvcykpKQoJICAgICh3aGlsZSAoYW5kICg8IHBv cyBsZW4pCgkJCShub3QgKG1lbXEgKGFyZWYgYXJnIHBvcykKCQkJCSAgIHRlcm0tZGVsaW1p dGVyLWFyZ3VtZW50LWxpc3QpKSkKCSAgICAgIChzZXRxIHBvcyAoMSsgcG9zKSkpKQoJICAo c2V0cSBhcmdzIChjb25zIChzdWJzdHJpbmcgYXJnIHN0YXJ0IHBvcykgYXJncykpKSkKICAg ICAgYXJncykpKQoKKGRlZnVuIHRlcm0tYXJndW1lbnRzIChzdHJpbmcgbnRoIG10aCkKICAi UmV0dXJuIGZyb20gU1RSSU5HIHRoZSBOVEggdG8gTVRIIGFyZ3VtZW50cy4KTlRIIGFuZC9v ciBNVEggY2FuIGJlIG5pbCwgd2hpY2ggbWVhbnMgdGhlIGxhc3QgYXJndW1lbnQuClJldHVy bmVkIGFyZ3VtZW50cyBhcmUgc2VwYXJhdGVkIGJ5IHNpbmdsZSBzcGFjZXMuCldlIGFzc3Vt ZSB3aGl0ZXNwYWNlIHNlcGFyYXRlcyBhcmd1bWVudHMsIGV4Y2VwdCB3aXRoaW4gcXVvdGVz LgpBbHNvLCBhIHJ1biBvZiBvbmUgb3IgbW9yZSBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIKaW4g YHRlcm0tZGVsaW1pdGVyLWFyZ3VtZW50LWxpc3QnIGlzIGEgc2VwYXJhdGUgYXJndW1lbnQu CkFyZ3VtZW50IDAgaXMgdGhlIGNvbW1hbmQgbmFtZS4iCiAgKGxldCAoKGFyZ3BhcnQgIlte IFxuXHRcIidgXStcXHxcXChcIlteXCJdKlwiXFx8J1teJ10qJ1xcfGBbXmBdKmBcXCkiKQoJ KGFyZ3MgKCkpIChwb3MgMCkKCShjb3VudCAwKQoJYmVnIHN0ciBxdW90ZXMpCiAgICA7OyBC dWlsZCBhIGxpc3Qgb2YgYWxsIHRoZSBhcmdzIHVudGlsIHdlIGhhdmUgYXMgbWFueSBhcyB3 ZSB3YW50LgogICAgKHdoaWxlIChhbmQgKG9yIChudWxsIG10aCkgKDw9IGNvdW50IG10aCkp CgkJKHN0cmluZy1tYXRjaCBhcmdwYXJ0IHN0cmluZyBwb3MpKQogICAgICAoaWYgKGFuZCBi ZWcgKD0gcG9zIChtYXRjaC1iZWdpbm5pbmcgMCkpKQoJICA7OyBJdCdzIGNvbnRpZ3VvdXMs IHBhcnQgb2YgdGhlIHNhbWUgYXJnLgoJICAoc2V0cSBwb3MgKG1hdGNoLWVuZCAwKQoJCXF1 b3RlcyAob3IgcXVvdGVzIChtYXRjaC1iZWdpbm5pbmcgMSkpKQoJOzsgSXQncyBhIG5ldyBz ZXBhcmF0ZSBhcmcuCgkoaWYgYmVnCgkgICAgOzsgUHV0IHRoZSBwcmV2aW91cyBhcmcsIGlm IHRoZXJlIHdhcyBvbmUsIG9udG8gQVJHUy4KCSAgICAoc2V0cSBzdHIgKHN1YnN0cmluZyBz dHJpbmcgYmVnIHBvcykKCQkgIGFyZ3MgKGlmIHF1b3RlcyAoY29ucyBzdHIgYXJncykKCQkJ IChuY29uYyAodGVybS1kZWxpbS1hcmcgc3RyKSBhcmdzKSkKCQkgIGNvdW50ICgxKyBjb3Vu dCkpKQoJKHNldHEgcXVvdGVzIChtYXRjaC1iZWdpbm5pbmcgMSkpCgkoc2V0cSBiZWcgKG1h dGNoLWJlZ2lubmluZyAwKSkKCShzZXRxIHBvcyAobWF0Y2gtZW5kIDApKSkpCiAgICAoaWYg YmVnCgkoc2V0cSBzdHIgKHN1YnN0cmluZyBzdHJpbmcgYmVnIHBvcykKCSAgICAgIGFyZ3Mg KGlmIHF1b3RlcyAoY29ucyBzdHIgYXJncykKCQkgICAgIChuY29uYyAodGVybS1kZWxpbS1h cmcgc3RyKSBhcmdzKSkKCSAgICAgIGNvdW50ICgxKyBjb3VudCkpKQogICAgKGxldCAoKG4g KG9yIG50aCAoMS0gY291bnQpKSkKCSAgKG0gKGlmIG10aCAoMS0gKC0gY291bnQgbXRoKSkg MCkpKQogICAgICAobWFwY29uY2F0CiAgICAgICAoZnVuY3Rpb24gKGxhbWJkYSAoYSkgYSkp IChudGhjZHIgbiAobnJldmVyc2UgKG50aGNkciBtIGFyZ3MpKSkgIiAiKSkpKQoMCjs7Owo7 OzsgSW5wdXQgcHJvY2Vzc2luZyBzdHVmZiBbbGluZSBtb2RlXQo7OzsKCihkZWZ1biB0ZXJt LXNlbmQtaW5wdXQgKCkKICAiU2VuZCBpbnB1dCB0byBwcm9jZXNzLgpBZnRlciB0aGUgcHJv Y2VzcyBvdXRwdXQgbWFyaywgc2VuZHMgYWxsIHRleHQgZnJvbSB0aGUgcHJvY2VzcyBtYXJr IHRvCnBvaW50IGFzIGlucHV0IHRvIHRoZSBwcm9jZXNzLiAgQmVmb3JlIHRoZSBwcm9jZXNz IG91dHB1dCBtYXJrLCBjYWxscyB2YWx1ZQpvZiB2YXJpYWJsZSB0ZXJtLWdldC1vbGQtaW5w dXQgdG8gcmV0cmlldmUgb2xkIGlucHV0LCBjb3BpZXMgaXQgdG8gdGhlCnByb2Nlc3MgbWFy aywgYW5kIHNlbmRzIGl0LiAgQSB0ZXJtaW5hbCBuZXdsaW5lIGlzIGFsc28gaW5zZXJ0ZWQg aW50byB0aGUKYnVmZmVyIGFuZCBzZW50IHRvIHRoZSBwcm9jZXNzLiAgVGhlIGxpc3Qgb2Yg ZnVuY3Rpb24gbmFtZXMgY29udGFpbmVkIGluIHRoZQp2YWx1ZSBvZiBgdGVybS1pbnB1dC1m aWx0ZXItZnVuY3Rpb25zJyBpcyBjYWxsZWQgb24gdGhlIGlucHV0IGJlZm9yZSBzZW5kaW5n Cml0LiAgVGhlIGlucHV0IGlzIGVudGVyZWQgaW50byB0aGUgaW5wdXQgaGlzdG9yeSByaW5n LCBpZiB0aGUgdmFsdWUgb2YgdmFyaWFibGUKdGVybS1pbnB1dC1maWx0ZXIgcmV0dXJucyBu b24tbmlsIHdoZW4gY2FsbGVkIG9uIHRoZSBpbnB1dC4KCkFueSBoaXN0b3J5IHJlZmVyZW5j ZSBtYXkgYmUgZXhwYW5kZWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFi bGUKYHRlcm0taW5wdXQtYXV0b2V4cGFuZCcuICBUaGUgbGlzdCBvZiBmdW5jdGlvbiBuYW1l cyBjb250YWluZWQgaW4gdGhlIHZhbHVlCm9mIGB0ZXJtLWlucHV0LWZpbHRlci1mdW5jdGlv bnMnIGlzIGNhbGxlZCBvbiB0aGUgaW5wdXQgYmVmb3JlIHNlbmRpbmcgaXQuClRoZSBpbnB1 dCBpcyBlbnRlcmVkIGludG8gdGhlIGlucHV0IGhpc3RvcnkgcmluZywgaWYgdGhlIHZhbHVl IG9mIHZhcmlhYmxlCmB0ZXJtLWlucHV0LWZpbHRlcicgcmV0dXJucyBub24tbmlsIHdoZW4g Y2FsbGVkIG9uIHRoZSBpbnB1dC4KCklmIHZhcmlhYmxlIGB0ZXJtLWVvbC1vbi1zZW5kJyBp cyBub24tbmlsLCB0aGVuIHBvaW50IGlzIG1vdmVkIHRvIHRoZQplbmQgb2YgbGluZSBiZWZv cmUgc2VuZGluZyB0aGUgaW5wdXQuCgpUaGUgdmFsdWVzIG9mIGB0ZXJtLWdldC1vbGQtaW5w dXQnLCBgdGVybS1pbnB1dC1maWx0ZXItZnVuY3Rpb25zJywgYW5kCmB0ZXJtLWlucHV0LWZp bHRlcicgYXJlIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIg cnVubmluZwppbiB0aGUgYnVmZmVyLiAgRS5nLiwKCklmIHRoZSBpbnRlcnByZXRlciBpcyB0 aGUgY3NoLAogICAgdGVybS1nZXQtb2xkLWlucHV0IGlzIHRoZSBkZWZhdWx0OiB0YWtlIHRo ZSBjdXJyZW50IGxpbmUsIGRpc2NhcmQgYW55CiAgICAgICAgaW5pdGlhbCBzdHJpbmcgbWF0 Y2hpbmcgcmVnZXhwIHRlcm0tcHJvbXB0LXJlZ2V4cC4KICAgIHRlcm0taW5wdXQtZmlsdGVy LWZ1bmN0aW9ucyBtb25pdG9ycyBpbnB1dCBmb3IgXCJjZFwiLCBcInB1c2hkXCIsIGFuZAoJ XCJwb3BkXCIgY29tbWFuZHMuICBXaGVuIGl0IHNlZXMgb25lLCBpdCBjZCdzIHRoZSBidWZm ZXIuCiAgICB0ZXJtLWlucHV0LWZpbHRlciBpcyB0aGUgZGVmYXVsdDogcmV0dXJucyB0IGlm IHRoZSBpbnB1dCBpc24ndCBhbGwgd2hpdGUKCXNwYWNlLgoKSWYgdGhlIHRlcm0gaXMgTHVj aWQgQ29tbW9uIExpc3AsCiAgICB0ZXJtLWdldC1vbGQtaW5wdXQgc25hcmZzIHRoZSBzZXhw IGVuZGluZyBhdCBwb2ludC4KICAgIHRlcm0taW5wdXQtZmlsdGVyLWZ1bmN0aW9ucyBkb2Vz IG5vdGhpbmcuCiAgICB0ZXJtLWlucHV0LWZpbHRlciByZXR1cm5zIG5pbCBpZiB0aGUgaW5w dXQgbWF0Y2hlcyBpbnB1dC1maWx0ZXItcmVnZXhwLAogICAgICAgIHdoaWNoIG1hdGNoZXMg KDEpIGFsbCB3aGl0ZXNwYWNlICgyKSA6YSwgOmMsIGV0Yy4KClNpbWlsYXJseSBmb3IgU29h ciwgU2NoZW1lLCBldGMuIgogIChpbnRlcmFjdGl2ZSkKICA7OyBOb3RlIHRoYXQgdGhlIGlu cHV0IHN0cmluZyBkb2VzIG5vdCBpbmNsdWRlIGl0cyB0ZXJtaW5hbCBuZXdsaW5lLgogIChs ZXQgKChwcm9jIChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkpKQogICAg KGlmIChub3QgcHJvYykgKGVycm9yICJDdXJyZW50IGJ1ZmZlciBoYXMgbm8gcHJvY2VzcyIp CiAgICAgIChsZXQqICgocG1hcmsgKHByb2Nlc3MtbWFyayBwcm9jKSkKCSAgICAgKHBtYXJr LXZhbCAobWFya2VyLXBvc2l0aW9uIHBtYXJrKSkKCSAgICAgKGlucHV0LWlzLW5ldyAoPj0g KHBvaW50KSBwbWFyay12YWwpKQoJICAgICAoaW50eHQgKGlmIGlucHV0LWlzLW5ldwoJCQko cHJvZ24gKGlmIHRlcm0tZW9sLW9uLXNlbmQgKGVuZC1vZi1saW5lKSkKCQkJICAgICAgIChi dWZmZXItc3Vic3RyaW5nIHBtYXJrIChwb2ludCkpKQoJCSAgICAgIChmdW5jYWxsIHRlcm0t Z2V0LW9sZC1pbnB1dCkpKQoJICAgICAoaW5wdXQgKGlmIChub3QgKGVxIHRlcm0taW5wdXQt YXV0b2V4cGFuZCAnaW5wdXQpKQoJCQk7OyBKdXN0IHdoYXRldmVyJ3MgYWxyZWFkeSB0aGVy ZQoJCQlpbnR4dAoJCSAgICAgIDs7IEV4cGFuZCBhbmQgbGVhdmUgaXQgdmlzaWJsZSBpbiBi dWZmZXIKCQkgICAgICAodGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWhpc3RvcnkgdCkKCQkg ICAgICAoYnVmZmVyLXN1YnN0cmluZyBwbWFyayAocG9pbnQpKSkpCgkgICAgIChoaXN0b3J5 IChpZiAobm90IChlcSB0ZXJtLWlucHV0LWF1dG9leHBhbmQgJ2hpc3RvcnkpKQoJCQkgIGlu cHV0CgkJCTs7IFRoaXMgaXMgbWVzc3kgJ2NvcyB1bHRpbWF0ZWx5IHRoZSBvcmlnaW5hbAoJ CQk7OyBmdW5jdGlvbnMgdXNlZCBkbyBpbnNlcnRpb24sIHJhdGhlciB0aGFuIHJldHVybgoJ CQk7OyBzdHJpbmdzLiAgV2UgaGF2ZSB0byBleHBhbmQsIHRoZW4gaW5zZXJ0IGJhY2suCgkJ CSh0ZXJtLXJlcGxhY2UtYnktZXhwYW5kZWQtaGlzdG9yeSB0KQoJCQkobGV0ICgoY29weSAo YnVmZmVyLXN1YnN0cmluZyBwbWFyayAocG9pbnQpKSkpCgkJCSAgKGRlbGV0ZS1yZWdpb24g cG1hcmsgKHBvaW50KSkKCQkJICAoaW5zZXJ0IGlucHV0KQoJCQkgIGNvcHkpKSkpCgkod2hl biAodGVybS1wYWdlci1lbmFibGVkKQoJICAoc2F2ZS1leGN1cnNpb24KCSAgICAoZ290by1j aGFyIChwcm9jZXNzLW1hcmsgcHJvYykpCgkgICAgKHNldHEgdGVybS1wYWdlci1jb3VudCAo dGVybS1jdXJyZW50LXJvdykpKSkKCSh3aGVuIChhbmQgKGZ1bmNhbGwgdGVybS1pbnB1dC1m aWx0ZXIgaGlzdG9yeSkKCQkgICAob3IgKG51bGwgdGVybS1pbnB1dC1pZ25vcmVkdXBzKQoJ CSAgICAgICAobm90IChyaW5nLXAgdGVybS1pbnB1dC1yaW5nKSkKCQkgICAgICAgKHJpbmct ZW1wdHktcCB0ZXJtLWlucHV0LXJpbmcpCgkJICAgICAgIChub3QgKHN0cmluZy1lcXVhbCAo cmluZy1yZWYgdGVybS1pbnB1dC1yaW5nIDApCgkJCQkJICBoaXN0b3J5KSkpKQoJICAocmlu Zy1pbnNlcnQgdGVybS1pbnB1dC1yaW5nIGhpc3RvcnkpKQoJKGxldCAoKGZ1bmN0aW9ucyB0 ZXJtLWlucHV0LWZpbHRlci1mdW5jdGlvbnMpKQoJICAod2hpbGUgZnVuY3Rpb25zCgkgICAg KGZ1bmNhbGwgKGNhciBmdW5jdGlvbnMpIChjb25jYXQgaW5wdXQgIlxuIikpCgkgICAgKHNl dHEgZnVuY3Rpb25zIChjZHIgZnVuY3Rpb25zKSkpKQoJKHNldHEgdGVybS1pbnB1dC1yaW5n LWluZGV4IG5pbCkKCgk7OyBVcGRhdGUgdGhlIG1hcmtlcnMgYmVmb3JlIHdlIHNlbmQgdGhl IGlucHV0Cgk7OyBpbiBjYXNlIHdlIGdldCBvdXRwdXQgYW1pZHN0IHNlbmRpbmcgdGhlIGlu cHV0LgoJKHNldC1tYXJrZXIgdGVybS1sYXN0LWlucHV0LXN0YXJ0IHBtYXJrKQoJKHNldC1t YXJrZXIgdGVybS1sYXN0LWlucHV0LWVuZCAocG9pbnQpKQoJKHdoZW4gaW5wdXQtaXMtbmV3 CgkgIDs7IFNldCB1cCB0byBkZWxldGUsIGJlY2F1c2UgaW5mZXJpb3Igc2hvdWxkIGVjaG8u CgkgICh3aGVuIChtYXJrZXItYnVmZmVyIHRlcm0tcGVuZGluZy1kZWxldGUtbWFya2VyKQoJ ICAgIChkZWxldGUtcmVnaW9uIHRlcm0tcGVuZGluZy1kZWxldGUtbWFya2VyIHBtYXJrKSkK CSAgKHNldC1tYXJrZXIgdGVybS1wZW5kaW5nLWRlbGV0ZS1tYXJrZXIgcG1hcmstdmFsKQoJ ICAoc2V0LW1hcmtlciAocHJvY2Vzcy1tYXJrIHByb2MpIChwb2ludCkpKQoJKGdvdG8tY2hh ciBwbWFyaykKCShmdW5jYWxsIHRlcm0taW5wdXQtc2VuZGVyIHByb2MgaW5wdXQpKSkpKQoK KGRlZnVuIHRlcm0tZ2V0LW9sZC1pbnB1dC1kZWZhdWx0ICgpCiAgIkRlZmF1bHQgZm9yIGB0 ZXJtLWdldC1vbGQtaW5wdXQnLgpUYWtlIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBkaXNjYXJk IGFueSBpbml0aWFsIHRleHQgbWF0Y2hpbmcKYHRlcm0tcHJvbXB0LXJlZ2V4cCcuIgogIChz YXZlLWV4Y3Vyc2lvbgogICAgKGJlZ2lubmluZy1vZi1saW5lKQogICAgKHRlcm0tc2tpcC1w cm9tcHQpCiAgICAobGV0ICgoYmVnIChwb2ludCkpKQogICAgICAoZW5kLW9mLWxpbmUpCiAg ICAgIChidWZmZXItc3Vic3RyaW5nIGJlZyAocG9pbnQpKSkpKQoKKGRlZnVuIHRlcm0tY29w eS1vbGQtaW5wdXQgKCkKICAiSW5zZXJ0IGFmdGVyIHByb21wdCBvbGQgaW5wdXQgYXQgcG9p bnQgYXMgbmV3IGlucHV0IHRvIGJlIGVkaXRlZC4KQ2FsbHMgYHRlcm0tZ2V0LW9sZC1pbnB1 dCcgdG8gZ2V0IG9sZCBpbnB1dC4iCiAgKGludGVyYWN0aXZlKQogIChsZXQgKChpbnB1dCAo ZnVuY2FsbCB0ZXJtLWdldC1vbGQtaW5wdXQpKQogCShwcm9jZXNzIChnZXQtYnVmZmVyLXBy b2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkpKQogICAgKGlmIChub3QgcHJvY2VzcykKCShlcnJv ciAiQ3VycmVudCBidWZmZXIgaGFzIG5vIHByb2Nlc3MiKQogICAgICAoZ290by1jaGFyIChw cm9jZXNzLW1hcmsgcHJvY2VzcykpCiAgICAgIChpbnNlcnQgaW5wdXQpKSkpCgooZGVmdW4g dGVybS1za2lwLXByb21wdCAoKQogICJTa2lwIHBhc3QgdGhlIHRleHQgbWF0Y2hpbmcgcmVn ZXhwIGB0ZXJtLXByb21wdC1yZWdleHAnLgpJZiB0aGlzIHRha2VzIHVzIHBhc3QgdGhlIGVu ZCBvZiB0aGUgY3VycmVudCBsaW5lLCBkb24ndCBza2lwIGF0IGFsbC4iCiAgKGxldCAoKGVv bCAoc2F2ZS1leGN1cnNpb24gKGVuZC1vZi1saW5lKSAocG9pbnQpKSkpCiAgICAod2hlbiAo YW5kIChsb29raW5nLWF0IHRlcm0tcHJvbXB0LXJlZ2V4cCkKCSAgICAgICAoPD0gKG1hdGNo LWVuZCAwKSBlb2wpKQogICAgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpKSkpCgoKKGRl ZnVuIHRlcm0tYWZ0ZXItcG1hcmstcCAoKQogICJJcyBwb2ludCBhZnRlciB0aGUgcHJvY2Vz cyBvdXRwdXQgbWFya2VyPyIKICA7OyBTaW5jZSBvdXRwdXQgY291bGQgY29tZSBpbnRvIHRo ZSBidWZmZXIgYWZ0ZXIgd2UgbG9va2VkIGF0IHRoZSBwb2ludAogIDs7IGJ1dCBiZWZvcmUg d2UgbG9va2VkIGF0IHRoZSBwcm9jZXNzIG1hcmtlcidzIHZhbHVlLCB3ZSBleHBsaWNpdGx5 CiAgOzsgc2VyaWFsaXNlLiAgVGhpcyBpcyBqdXN0IGJlY2F1c2UgSSBkb24ndCBrbm93IHdo ZXRoZXIgb3Igbm90IEVtYWNzCiAgOzsgc2VydmljZXMgaW5wdXQgZHVyaW5nIGV4ZWN1dGlv biBvZiBsaXNwIGNvbW1hbmRzLgogIChsZXQgKChwcm9jLXBvcyAobWFya2VyLXBvc2l0aW9u CgkJICAgKHByb2Nlc3MtbWFyayAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZl cikpKSkpKQogICAgKDw9IHByb2MtcG9zIChwb2ludCkpKSkKCihkZWZ1biB0ZXJtLXNpbXBs ZS1zZW5kIChwcm9jIHN0cmluZykKICAiRGVmYXVsdCBmdW5jdGlvbiBmb3Igc2VuZGluZyB0 byBQUk9DIGlucHV0IFNUUklORy4KVGhpcyBqdXN0IHNlbmRzIFNUUklORyBwbHVzIGEgbmV3 bGluZS4gIFRvIG92ZXJyaWRlIHRoaXMsCnNldCB0aGUgaG9vayBgdGVybS1pbnB1dC1zZW5k ZXInLiIKICAodGVybS1zZW5kLXN0cmluZyBwcm9jIHN0cmluZykKICAodGVybS1zZW5kLXN0 cmluZyBwcm9jICJcbiIpKQoKKGRlZnVuIHRlcm0tYm9sIChhcmcpCiAgIkdvZXMgdG8gdGhl IGJlZ2lubmluZyBvZiBsaW5lLCB0aGVuIHNraXBzIHBhc3QgdGhlIHByb21wdCwgaWYgYW55 LgpJZiBhIHByZWZpeCBhcmd1bWVudCBpcyBnaXZlbiAoXFxbdW5pdmVyc2FsLWFyZ3VtZW50 XSksIHRoZW4gbm8gcHJvbXB0IHNraXAKLS0gZ28gc3RyYWlnaHQgdG8gY29sdW1uIDAuCgpU aGUgcHJvbXB0IHNraXAgaXMgZG9uZSBieSBza2lwcGluZyB0ZXh0IG1hdGNoaW5nIHRoZSBy ZWd1bGFyIGV4cHJlc3Npb24KYHRlcm0tcHJvbXB0LXJlZ2V4cCcsIGEgYnVmZmVyIGxvY2Fs IHZhcmlhYmxlLiIKICAoaW50ZXJhY3RpdmUgIlAiKQogIChiZWdpbm5pbmctb2YtbGluZSkK ICAod2hlbiAobnVsbCBhcmcpICh0ZXJtLXNraXAtcHJvbXB0KSkpCgo7OzsgVGhlc2UgdHdv IGZ1bmN0aW9ucyBhcmUgZm9yIGVudGVyaW5nIHRleHQgeW91IGRvbid0IHdhbnQgZWNob2Vk IG9yCjs7OyBzYXZlZCAtLSB0eXBpY2FsbHkgcGFzc3dvcmRzIHRvIGZ0cCwgdGVsbmV0LCBv ciBzb21lc3VjaC4KOzs7IEp1c3QgZW50ZXIgbS14IHRlcm0tc2VuZC1pbnZpc2libGUgYW5k IHR5cGUgaW4geW91ciBsaW5lLgoKKGRlZnVuIHRlcm0tcmVhZC1ub2VjaG8gKHByb21wdCAm b3B0aW9uYWwgc3RhcnMpCiAgIlJlYWQgYSBzaW5nbGUgbGluZSBvZiB0ZXh0IGZyb20gdXNl ciB3aXRob3V0IGVjaG9pbmcsIGFuZCByZXR1cm4gaXQuClByb21wdCB3aXRoIGFyZ3VtZW50 IFBST01QVCwgYSBzdHJpbmcuICBPcHRpb25hbCBhcmd1bWVudCBTVEFSUyBjYXVzZXMKaW5w dXQgdG8gYmUgZWNob2VkIHdpdGggJyonIGNoYXJhY3RlcnMgb24gdGhlIHByb21wdCBsaW5l LiAgSW5wdXQgZW5kcyB3aXRoClJFVCwgTEZELCBvciBFU0MuICBERUwgb3IgQy1oIHJ1YnMg b3V0LiAgQy11IGtpbGxzIGxpbmUuICBDLWcgYWJvcnRzIChpZgpgaW5oaWJpdC1xdWl0JyBp cyBzZXQgYmVjYXVzZSBlLmcuIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tIGEgcHJv Y2VzcwpmaWx0ZXIgYW5kIEMtZyBpcyBwcmVzc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMg bmlsIHJhdGhlciB0aGFuIGEgc3RyaW5nKS4KCk5vdGUgdGhhdCB0aGUga2V5c3Ryb2tlcyBj b21wcmlzaW5nIHRoZSB0ZXh0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQKXCh0ZW1wb3Jhcmls eSkgd2l0aCBcXFt2aWV3LWxvc3NhZ2VdLiAgVGhpcyBtYXkgYmUgYSBzZWN1cml0eSBidWcg Zm9yIHNvbWUKYXBwbGljYXRpb25zLiIKICAobGV0ICgoYW5zICIiKQoJKGMgMCkKCShlY2hv LWtleXN0cm9rZXMgMCkKCShjdXJzb3ItaW4tZWNoby1hcmVhIHQpCiAgICAgICAgKGRvbmUg bmlsKSkKICAgICh3aGlsZSAobm90IGRvbmUpCiAgICAgIChpZiBzdGFycwogICAgICAgICAg KG1lc3NhZ2UgIiVzJXMiIHByb21wdCAobWFrZS1zdHJpbmcgKGxlbmd0aCBhbnMpID8qKSkK ICAgICAgICAobWVzc2FnZSAiJXMiIHByb21wdCkpCiAgICAgIChzZXRxIGMgKHJlYWQtY2hh cikpCiAgICAgIChjb25kICgoPSBjID9cQy1nKQogICAgICAgICAgICAgOzsgVGhpcyBmdW5j dGlvbiBtYXkgZ2V0IGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBmaWx0ZXIsIHdoZXJlCiAgICAg ICAgICAgICA7OyBpbmhpYml0LXF1aXQgaXMgc2V0LiAgSW4gbGF0ZXIgdmVyc2lvbnMgb2Yg RW1hY3MgcmVhZC1jaGFyCiAgICAgICAgICAgICA7OyBtYXkgY2xlYXIgcXVpdC1mbGFnIGl0 c2VsZiBhbmQgcmV0dXJuIEMtZy4gIFRoYXQgd291bGQgbWFrZQogICAgICAgICAgICAgOzsg aXQgaW1wb3NzaWJsZSB0byBxdWl0IHRoaXMgbG9vcCBpbiBhIHNpbXBsZSB3YXksIHNvCiAg ICAgICAgICAgICA7OyByZS1lbmFibGUgaXQgaGVyZSAoZm9yIGJhY2t3YXJkLWNvbXBhdGli aWxpdHkgdGhlIGNoZWNrIGZvcgogICAgICAgICAgICAgOzsgcXVpdC1mbGFnIGJlbG93IHdv dWxkIHN0aWxsIGJlIG5lY2Vzc2FyeSwgc28gdGhpcyBzZWVtcwogICAgICAgICAgICAgOzsg bGlrZSB0aGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaW5ncykuCiAgICAgICAgICAgICAoc2V0 cSBxdWl0LWZsYWcgdAogICAgICAgICAgICAgICAgICAgZG9uZSB0KSkKICAgICAgICAgICAg KChvciAoPSBjID9ccikgKD0gYyA/XG4pICg9IGMgP1xlKSkKICAgICAgICAgICAgIChzZXRx IGRvbmUgdCkpCiAgICAgICAgICAgICgoPSBjID9cQy11KQogICAgICAgICAgICAgKHNldHEg YW5zICIiKSkKICAgICAgICAgICAgKChhbmQgKC89IGMgP1xiKSAoLz0gYyA/XDE3NykpCiAg ICAgICAgICAgICAoc2V0cSBhbnMgKGNvbmNhdCBhbnMgKGNoYXItdG8tc3RyaW5nIGMpKSkp CiAgICAgICAgICAgICgoPiAobGVuZ3RoIGFucykgMCkKICAgICAgICAgICAgIChzZXRxIGFu cyAoc3Vic3RyaW5nIGFucyAwIC0xKSkpKSkKICAgIChpZiBxdWl0LWZsYWcKICAgICAgICA7 OyBFbXVsYXRlIGEgdHJ1ZSBxdWl0LCBleGNlcHQgdGhhdCB3ZSBoYXZlIHRvIHJldHVybiBh IHZhbHVlLgogICAgICAgIChwcm9nMQogICAgICAgICAgICAoc2V0cSBxdWl0LWZsYWcgbmls KQogICAgICAgICAgKG1lc3NhZ2UgIlF1aXQiKQogICAgICAgICAgKGJlZXAgdCkpCiAgICAg IChtZXNzYWdlICIiKQogICAgICBhbnMpKSkKCihkZWZ1biB0ZXJtLXNlbmQtaW52aXNpYmxl IChzdHIgJm9wdGlvbmFsIHByb2MpCiAgIlJlYWQgYSBzdHJpbmcgd2l0aG91dCBlY2hvaW5n LgpUaGVuIHNlbmQgaXQgdG8gdGhlIHByb2Nlc3MgcnVubmluZyBpbiB0aGUgY3VycmVudCBi dWZmZXIuICBBIG5ldy1saW5lCmlzIGFkZGl0aW9uYWxseSBzZW50LiAgU3RyaW5nIGlzIG5v dCBzYXZlZCBvbiB0ZXJtIGlucHV0IGhpc3RvcnkgbGlzdC4KU2VjdXJpdHkgYnVnOiB5b3Vy IHN0cmluZyBjYW4gc3RpbGwgYmUgdGVtcG9yYXJpbHkgcmVjb3ZlcmVkIHdpdGgKXFxbdmll dy1sb3NzYWdlXS4iCiAgKGludGVyYWN0aXZlICJQIikgOyBEZWZlYXQgc25vb3Bpbmcgdmlh IEMteCBlc2MKICAod2hlbiAobm90IChzdHJpbmdwIHN0cikpCiAgICAoc2V0cSBzdHIgKHRl cm0tcmVhZC1ub2VjaG8gIk5vbi1lY2hvZWQgdGV4dDogIiB0KSkpCiAgKHdoZW4gKG5vdCBw cm9jKQogICAgKHNldHEgcHJvYyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZl cikpKSkKICAoaWYgKG5vdCBwcm9jKSAoZXJyb3IgIkN1cnJlbnQgYnVmZmVyIGhhcyBubyBw cm9jZXNzIikKICAgIChzZXRxIHRlcm0ta2lsbC1lY2hvLWxpc3QgKG5jb25jIHRlcm0ta2ls bC1lY2hvLWxpc3QKCQkJCSAgICAgKGNvbnMgc3RyIG5pbCkpKQogICAgKHRlcm0tc2VuZC1z dHJpbmcgcHJvYyBzdHIpCiAgICAodGVybS1zZW5kLXN0cmluZyBwcm9jICJcbiIpKSkKCgwK Ozs7IExvdy1sZXZlbCBwcm9jZXNzIGNvbW11bmljYXRpb24KCihkZWZ2YXIgdGVybS1pbnB1 dC1jaHVuay1zaXplIDUxMgogICIqTG9uZyBpbnB1dHMgc2VuZCB0byB0ZXJtIHByb2Nlc3Nl cyBhcmUgYnJva2VuIHVwIGludG8gY2h1bmtzIG9mIHRoaXMgc2l6ZS4KSWYgeW91ciBwcm9j ZXNzIGlzIGNob2tpbmcgb24gYmlnIGlucHV0cywgdHJ5IGxvd2VyaW5nIHRoZSB2YWx1ZS4i KQoKKGRlZnVuIHRlcm0tc2VuZC1zdHJpbmcgKHByb2Mgc3RyKQogICJTZW5kIHRvIFBST0Mg dGhlIGNvbnRlbnRzIG9mIFNUUiBhcyBpbnB1dC4KVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBw cm9jZXNzLXNlbmQtc3RyaW5nJywgZXhjZXB0IHRoYXQgbG9uZyBpbnB1dCBzdHJpbmdzCmFy ZSBicm9rZW4gdXAgaW50byBjaHVua3Mgb2Ygc2l6ZSBgdGVybS1pbnB1dC1jaHVuay1zaXpl Jy4gIFByb2Nlc3NlcwphcmUgZ2l2ZW4gYSBjaGFuY2UgdG8gb3V0cHV0IGJldHdlZW4gY2h1 bmtzLiAgVGhpcyBjYW4gaGVscCBwcmV2ZW50IHByb2Nlc3Nlcwpmcm9tIGhhbmdpbmcgd2hl biB5b3Ugc2VuZCB0aGVtIGxvbmcgaW5wdXRzIG9uIHNvbWUgT1Mncy4iCiAgKGxldCogKChs ZW4gKGxlbmd0aCBzdHIpKQoJIChpIChtaW4gbGVuIHRlcm0taW5wdXQtY2h1bmstc2l6ZSkp KQogICAgKHByb2Nlc3Mtc2VuZC1zdHJpbmcgcHJvYyAoc3Vic3RyaW5nIHN0ciAwIGkpKQog ICAgKHdoaWxlICg8IGkgbGVuKQogICAgICAobGV0ICgobmV4dC1pICgrIGkgdGVybS1pbnB1 dC1jaHVuay1zaXplKSkpCgkoYWNjZXB0LXByb2Nlc3Mtb3V0cHV0KQoJKHByb2Nlc3Mtc2Vu ZC1zdHJpbmcgcHJvYyAoc3Vic3RyaW5nIHN0ciBpIChtaW4gbGVuIG5leHQtaSkpKQoJKHNl dHEgaSBuZXh0LWkpKSkpKQoKKGRlZnVuIHRlcm0tc2VuZC1yZWdpb24gKHByb2Mgc3RhcnQg ZW5kKQogICJTZW5kIHRvIFBST0MgdGhlIHJlZ2lvbiBkZWxpbWl0ZWQgYnkgU1RBUlQgYW5k IEVORC4KVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBgcHJvY2Vzcy1zZW5kLXJlZ2lvbicg dGhhdCB0cmllcyB0byBrZWVwCnlvdXIgcHJvY2VzcyBmcm9tIGhhbmdpbmcgb24gbG9uZyBp bnB1dHMuICBTZWUgYHRlcm0tc2VuZC1zdHJpbmcnLiIKICAodGVybS1zZW5kLXN0cmluZyBw cm9jIChidWZmZXItc3Vic3RyaW5nIHN0YXJ0IGVuZCkpKQoKDAo7OzsgUmFuZG9tIGlucHV0 IGhhY2thZ2UKCihkZWZ1biB0ZXJtLWtpbGwtb3V0cHV0ICgpCiAgIktpbGwgYWxsIG91dHB1 dCBmcm9tIGludGVycHJldGVyIHNpbmNlIGxhc3QgaW5wdXQuIgogIChpbnRlcmFjdGl2ZSkK ICAobGV0ICgocG1hcmsgKHByb2Nlc3MtbWFyayAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJy ZW50LWJ1ZmZlcikpKSkpCiAgICAoa2lsbC1yZWdpb24gdGVybS1sYXN0LWlucHV0LWVuZCBw bWFyaykKICAgIChnb3RvLWNoYXIgcG1hcmspCiAgICAoaW5zZXJ0ICIqKiogb3V0cHV0IGZs dXNoZWQgKioqXG4iKQogICAgKHNldC1tYXJrZXIgcG1hcmsgKHBvaW50KSkpKQoKKGRlZnVu IHRlcm0tc2hvdy1vdXRwdXQgKCkKICAiRGlzcGxheSBzdGFydCBvZiB0aGlzIGJhdGNoIG9m IGludGVycHJldGVyIG91dHB1dCBhdCB0b3Agb2Ygd2luZG93LgpTZXRzIG1hcmsgdG8gdGhl IHZhbHVlIG9mIHBvaW50IHdoZW4gdGhpcyBjb21tYW5kIGlzIHJ1bi4iCiAgKGludGVyYWN0 aXZlKQogIChnb3RvLWNoYXIgdGVybS1sYXN0LWlucHV0LWVuZCkKICAoYmFja3dhcmQtY2hh cikKICAoYmVnaW5uaW5nLW9mLWxpbmUpCiAgKHNldC13aW5kb3ctc3RhcnQgKHNlbGVjdGVk LXdpbmRvdykgKHBvaW50KSkKICAoZW5kLW9mLWxpbmUpKQoKKGRlZnVuIHRlcm0taW50ZXJy dXB0LXN1YmpvYiAoKQogICJJbnRlcnJ1cHQgdGhlIGN1cnJlbnQgc3Viam9iLiIKICAoaW50 ZXJhY3RpdmUpCiAgKGludGVycnVwdC1wcm9jZXNzIG5pbCB0ZXJtLXB0eXApKQoKKGRlZnVu IHRlcm0ta2lsbC1zdWJqb2IgKCkKICAiU2VuZCBraWxsIHNpZ25hbCB0byB0aGUgY3VycmVu dCBzdWJqb2IuIgogIChpbnRlcmFjdGl2ZSkKICAoa2lsbC1wcm9jZXNzIG5pbCB0ZXJtLXB0 eXApKQoKKGRlZnVuIHRlcm0tcXVpdC1zdWJqb2IgKCkKICAiU2VuZCBxdWl0IHNpZ25hbCB0 byB0aGUgY3VycmVudCBzdWJqb2IuIgogIChpbnRlcmFjdGl2ZSkKICAocXVpdC1wcm9jZXNz IG5pbCB0ZXJtLXB0eXApKQoKKGRlZnVuIHRlcm0tc3RvcC1zdWJqb2IgKCkKICAiU3RvcCB0 aGUgY3VycmVudCBzdWJqb2IuCldBUk5JTkc6IGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc3Vi am9iLCB5b3UgY2FuIGVuZCB1cCBzdXNwZW5kaW5nCnRoZSB0b3AtbGV2ZWwgcHJvY2VzcyBy dW5uaW5nIGluIHRoZSBidWZmZXIuICBJZiB5b3UgYWNjaWRlbnRhbGx5IGRvCnRoaXMsIHVz ZSBcXFt0ZXJtLWNvbnRpbnVlLXN1YmpvYl0gdG8gcmVzdW1lIHRoZSBwcm9jZXNzLiAgKFRo aXMKaXMgbm90IGEgcHJvYmxlbSB3aXRoIG1vc3Qgc2hlbGxzLCBzaW5jZSB0aGV5IGlnbm9y ZSB0aGlzIHNpZ25hbC4pIgogIChpbnRlcmFjdGl2ZSkKICAoc3RvcC1wcm9jZXNzIG5pbCB0 ZXJtLXB0eXApKQoKKGRlZnVuIHRlcm0tY29udGludWUtc3Viam9iICgpCiAgIlNlbmQgQ09O VCBzaWduYWwgdG8gcHJvY2VzcyBidWZmZXIncyBwcm9jZXNzIGdyb3VwLgpVc2VmdWwgaWYg eW91IGFjY2lkZW50YWxseSBzdXNwZW5kIHRoZSB0b3AtbGV2ZWwgcHJvY2Vzcy4iCiAgKGlu dGVyYWN0aXZlKQogIChjb250aW51ZS1wcm9jZXNzIG5pbCB0ZXJtLXB0eXApKQoKKGRlZnVu IHRlcm0ta2lsbC1pbnB1dCAoKQogICJLaWxsIGFsbCB0ZXh0IGZyb20gbGFzdCBzdHVmZiBv dXRwdXQgYnkgaW50ZXJwcmV0ZXIgdG8gcG9pbnQuIgogIChpbnRlcmFjdGl2ZSkKICAobGV0 KiAoKHBtYXJrIChwcm9jZXNzLW1hcmsgKGdldC1idWZmZXItcHJvY2VzcyAoY3VycmVudC1i dWZmZXIpKSkpCgkgKHAtcG9zIChtYXJrZXItcG9zaXRpb24gcG1hcmspKSkKICAgICh3aGVu ICg+IChwb2ludCkgcC1wb3MpCiAgICAgIChraWxsLXJlZ2lvbiBwbWFyayAocG9pbnQpKSkp KQoKKGRlZnVuIHRlcm0tZGVsY2hhci1vci1tYXliZS1lb2YgKGFyZykKICAiRGVsZXRlIEFS RyBjaGFyYWN0ZXJzIGZvcndhcmQsIG9yIHNlbmQgYW4gRU9GIHRvIHByb2Nlc3MgaWYgYXQg ZW5kIG9mCmJ1ZmZlci4iCiAgKGludGVyYWN0aXZlICJwIikKICAoaWYgKGVvYnApCiAgICAg IChwcm9jZXNzLXNlbmQtZW9mKQogICAgKGRlbGV0ZS1jaGFyIGFyZykpKQoKKGRlZnVuIHRl cm0tc2VuZC1lb2YgKCkKICAiU2VuZCBhbiBFT0YgdG8gdGhlIGN1cnJlbnQgYnVmZmVyJ3Mg cHJvY2Vzcy4iCiAgKGludGVyYWN0aXZlKQogIChwcm9jZXNzLXNlbmQtZW9mKSkKCihkZWZ1 biB0ZXJtLWJhY2t3YXJkLW1hdGNoaW5nLWlucHV0IChyZWdleHAgbikKICAiU2VhcmNoIGJh Y2t3YXJkIHRocm91Z2ggYnVmZmVyIGZvciBtYXRjaCBmb3IgUkVHRVhQLgpNYXRjaGVzIGFy ZSBzZWFyY2hlZCBmb3Igb24gbGluZXMgdGhhdCBtYXRjaCBgdGVybS1wcm9tcHQtcmVnZXhw Jy4KV2l0aCBwcmVmaXggYXJndW1lbnQgTiwgc2VhcmNoIGZvciBOdGggcHJldmlvdXMgbWF0 Y2guCklmIE4gaXMgbmVnYXRpdmUsIGZpbmQgdGhlIG5leHQgb3IgTnRoIG5leHQgbWF0Y2gu IgogIChpbnRlcmFjdGl2ZSAodGVybS1yZWdleHAtYXJnICJCYWNrd2FyZCBpbnB1dCBtYXRj aGluZyAocmVnZXhwKTogIikpCiAgKGxldCogKChyZSAoY29uY2F0IHRlcm0tcHJvbXB0LXJl Z2V4cCAiLioiIHJlZ2V4cCkpCgkgKHBvcyAoc2F2ZS1leGN1cnNpb24gKGVuZC1vZi1saW5l IChpZiAoPiBuIDApIDAgMSkpCgkJCSAgICAgICh3aGVuIChyZS1zZWFyY2gtYmFja3dhcmQg cmUgbmlsIHQgbikKCQkJCShwb2ludCkpKSkpCiAgICAoaWYgKG51bGwgcG9zKQoJKHByb2du IChtZXNzYWdlICJOb3QgZm91bmQiKQoJICAgICAgIChkaW5nKSkKICAgICAgKGdvdG8tY2hh ciBwb3MpCiAgICAgICh0ZXJtLWJvbCBuaWwpKSkpCgooZGVmdW4gdGVybS1mb3J3YXJkLW1h dGNoaW5nLWlucHV0IChyZWdleHAgbikKICAiU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBidWZm ZXIgZm9yIG1hdGNoIGZvciBSRUdFWFAuCk1hdGNoZXMgYXJlIHNlYXJjaGVkIGZvciBvbiBs aW5lcyB0aGF0IG1hdGNoIGB0ZXJtLXByb21wdC1yZWdleHAnLgpXaXRoIHByZWZpeCBhcmd1 bWVudCBOLCBzZWFyY2ggZm9yIE50aCBmb2xsb3dpbmcgbWF0Y2guCklmIE4gaXMgbmVnYXRp dmUsIGZpbmQgdGhlIHByZXZpb3VzIG9yIE50aCBwcmV2aW91cyBtYXRjaC4iCiAgKGludGVy YWN0aXZlICh0ZXJtLXJlZ2V4cC1hcmcgIkZvcndhcmQgaW5wdXQgbWF0Y2hpbmcgKHJlZ2V4 cCk6ICIpKQogICh0ZXJtLWJhY2t3YXJkLW1hdGNoaW5nLWlucHV0IHJlZ2V4cCAoLSBuKSkp CgoKKGRlZnVuIHRlcm0tbmV4dC1wcm9tcHQgKG4pCiAgIk1vdmUgdG8gZW5kIG9mIE50aCBu ZXh0IHByb21wdCBpbiB0aGUgYnVmZmVyLgpTZWUgYHRlcm0tcHJvbXB0LXJlZ2V4cCcuIgog IChpbnRlcmFjdGl2ZSAicCIpCiAgKGxldCAoKHBhcmFncmFwaC1zdGFydCB0ZXJtLXByb21w dC1yZWdleHApKQogICAgKGVuZC1vZi1saW5lIChpZiAoPiBuIDApIDEgMCkpCiAgICAoZm9y d2FyZC1wYXJhZ3JhcGggbikKICAgICh0ZXJtLXNraXAtcHJvbXB0KSkpCgooZGVmdW4gdGVy bS1wcmV2aW91cy1wcm9tcHQgKG4pCiAgIk1vdmUgdG8gZW5kIG9mIE50aCBwcmV2aW91cyBw cm9tcHQgaW4gdGhlIGJ1ZmZlci4KU2VlIGB0ZXJtLXByb21wdC1yZWdleHAnLiIKICAoaW50 ZXJhY3RpdmUgInAiKQogICh0ZXJtLW5leHQtcHJvbXB0ICgtIG4pKSkKDAo7OzsgU3VwcG9y dCBmb3Igc291cmNlLWZpbGUgcHJvY2Vzc2luZyBjb21tYW5kcy4KOzs7PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQo7OzsgTWFueSBjb21tYW5kLWludGVycHJldGVycyAoZS5nLiwgTGlzcCwg U2NoZW1lLCBTb2FyKSBoYXZlCjs7OyBjb21tYW5kcyB0aGF0IHByb2Nlc3MgZmlsZXMgb2Yg c291cmNlIHRleHQgKGUuZy4gbG9hZGluZyBvciBjb21waWxpbmcKOzs7IGZpbGVzKS4gIFNv IHRoZSBjb3JyZXNwb25kaW5nIHByb2Nlc3MtaW4tYS1idWZmZXIgbW9kZXMgaGF2ZSBjb21t YW5kcwo7OzsgZm9yIGRvaW5nIHRoaXMgKGUuZy4sIGxpc3AtbG9hZC1maWxlKS4gIFRoZSBm dW5jdGlvbnMgYmVsb3cgYXJlIHVzZWZ1bAo7OzsgZm9yIGRlZmluaW5nIHRoZXNlIGNvbW1h bmRzLgo7OzsKOzs7IEFsYXMsIHRoZXNlIGd1eXMgZG9uJ3QgZG8gZXhhY3RseSB0aGUgcmln aHQgdGhpbmcgZm9yIExpc3AsIFNjaGVtZQo7OzsgYW5kIFNvYXIsIGluIHRoYXQgdGhleSBk b24ndCBrbm93IGFueXRoaW5nIGFib3V0IGZpbGUgZXh0ZW5zaW9ucy4KOzs7IFNvIHRoZSBj b21waWxlL2xvYWQgaW50ZXJmYWNlIGdldHMgdGhlIHdyb25nIGRlZmF1bHQgb2NjYXNpb25h bGx5Lgo7OzsgVGhlIGxvYWQtZmlsZS9jb21waWxlLWZpbGUgZGVmYXVsdCBtZWNoYW5pc20g Y291bGQgYmUgc21hcnRlciAtLSBpdAo7OzsgZG9lc24ndCBrbm93IGFib3V0IHRoZSByZWxh dGlvbnNoaXAgYmV0d2VlbiBmaWxlbmFtZSBleHRlbnNpb25zIGFuZAo7Ozsgd2hldGhlciB0 aGUgZmlsZSBpcyBzb3VyY2Ugb3IgZXhlY3V0YWJsZS4gIElmIHlvdSBjb21waWxlIGZvby5s aXNwCjs7OyB3aXRoIGNvbXBpbGUtZmlsZSwgdGhlbiB0aGUgbmV4dCBsb2FkLWZpbGUgc2hv dWxkIHVzZSBmb28uYmluIGZvcgo7OzsgdGhlIGRlZmF1bHQsIG5vdCBmb28ubGlzcC4gIFRo aXMgaXMgdHJpY2t5IHRvIGRvIHJpZ2h0LCBwYXJ0aWN1bGFybHkKOzs7IGJlY2F1c2UgdGhl IGV4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZSBmaWxlcyB2YXJpZXMgc28gbXVjaCAoLm8sIC5i aW4sCjs7OyAubGJpbiwgLm1vLCAudm8sIC5hbywgLi4uKS4KCgo7OzsgVEVSTS1TT1VSQ0Ut REVGQVVMVCAtLSBkZXRlcm1pbmVzIGRlZmF1bHRzIGZvciBzb3VyY2UtZmlsZSBwcm9jZXNz aW5nCjs7OyBjb21tYW5kcy4KOzs7Cjs7OyBURVJNLUNIRUNLLVNPVVJDRSAtLSBpZiBGTkFN RSBpcyBpbiBhIG1vZGlmaWVkIGJ1ZmZlciwgYXNrcyB5b3UgaWYgeW91Cjs7OyB3YW50IHRv IHNhdmUgdGhlIGJ1ZmZlciBiZWZvcmUgaXNzdWluZyBhbnkgcHJvY2VzcyByZXF1ZXN0cyB0 byB0aGUgY29tbWFuZAo7OzsgaW50ZXJwcmV0ZXIuCjs7Owo7OzsgVEVSTS1HRVQtU09VUkNF IC0tIHVzZWQgYnkgdGhlIHNvdXJjZS1maWxlIHByb2Nlc3NpbmcgY29tbWFuZHMgdG8gcHJv bXB0Cjs7OyBmb3IgdGhlIGZpbGUgdG8gcHJvY2Vzcy4KCjs7OyAoVEVSTS1TT1VSQ0UtREVG QVVMVCBwcmV2aW91cy1kaXIvZmlsZSBzb3VyY2UtbW9kZXMpCjs7Oz09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KOzs7IFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRlZmF1bHRzIGZvciB0 aGUgbG9hZC1maWxlIGFuZCBjb21waWxlLWZpbGUKOzs7IGNvbW1hbmRzIGZvciB0ZWEsIHNv YXIsIGNtdWxpc3AsIGFuZCBjbXVzY2hlbWUgbW9kZXMuCjs7Owo7OzsgLSBQUkVWSU9VUy1E SVIvRklMRSBpcyBhIHBhaXIgKGRpcmVjdG9yeSAuIGZpbGVuYW1lKSBmcm9tIHRoZSBsYXN0 Cjs7OyBzb3VyY2UtZmlsZSBwcm9jZXNzaW5nIGNvbW1hbmQsIG9yIG5pbCBpZiB0aGVyZSBo YXNuJ3QgYmVlbiBvbmUgeWV0Lgo7OzsgLSBTT1VSQ0UtTU9ERVMgaXMgYSBsaXN0IHVzZWQg dG8gZGV0ZXJtaW5lIHdoYXQgYnVmZmVycyBjb250YWluIHNvdXJjZQo7OzsgZmlsZXM6IGlm IHRoZSBtYWpvciBtb2RlIG9mIHRoZSBidWZmZXIgaXMgaW4gU09VUkNFLU1PREVTLCBpdCdz IHNvdXJjZS4KOzs7IFR5cGljYWxseSwgKGxpc3AtbW9kZSkgb3IgKHNjaGVtZS1tb2RlKS4K Ozs7Cjs7OyBJZiB0aGUgY29tbWFuZCBpcyBnaXZlbiB3aGlsZSB0aGUgY3Vyc29yIGlzIGlu c2lkZSBhIHN0cmluZywgKmFuZCoKOzs7IHRoZSBzdHJpbmcgaXMgYW4gZXhpc3RpbmcgZmls ZW5hbWUsICphbmQqIHRoZSBmaWxlbmFtZSBpcyBub3QgYSBkaXJlY3RvcnksCjs7OyB0aGVu IHRoZSBzdHJpbmcgaXMgdGFrZW4gYXMgZGVmYXVsdC4gIFRoaXMgYWxsb3dzIHlvdSB0byBq dXN0IHBvc2l0aW9uCjs7OyB5b3VyIGN1cnNvciBvdmVyIGEgc3RyaW5nIHRoYXQncyBhIGZp bGVuYW1lIGFuZCBoYXZlIGl0IHRha2VuIGFzIGRlZmF1bHQuCjs7Owo7OzsgSWYgdGhlIGNv bW1hbmQgaXMgZ2l2ZW4gaW4gYSBmaWxlIGJ1ZmZlciB3aG9zZSBtYWpvciBtb2RlIGlzIGlu Cjs7OyBTT1VSQ0UtTU9ERVMsIHRoZW4gdGhlIGZpbGVuYW1lIGlzIHRoZSBkZWZhdWx0IGZp bGUsIGFuZCB0aGUKOzs7IGZpbGUncyBkaXJlY3RvcnkgaXMgdGhlIGRlZmF1bHQgZGlyZWN0 b3J5Lgo7OzsKOzs7IElmIHRoZSBidWZmZXIgaXNuJ3QgYSBzb3VyY2UgZmlsZSBidWZmZXIg KGUuZy4sIGl0J3MgdGhlIHByb2Nlc3MgYnVmZmVyKSwKOzs7IHRoZW4gdGhlIGRlZmF1bHQg ZGlyZWN0b3J5ICYgZmlsZSBhcmUgd2hhdCB3YXMgdXNlZCBpbiB0aGUgbGFzdCBzb3VyY2Ut ZmlsZQo7OzsgcHJvY2Vzc2luZyBjb21tYW5kIChpLmUuLCBQUkVWSU9VUy1ESVIvRklMRSku ICBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lCjs7OyB0aGUgY29tbWFuZCBoYXMgYmVlbiBy dW4gKFBSRVZJT1VTLURJUi9GSUxFIGlzIG5pbCksIHRoZSBkZWZhdWx0IGRpcmVjdG9yeQo7 OzsgaXMgdGhlIGN3ZCwgd2l0aCBubyBkZWZhdWx0IGZpbGUuICAoXCJubyBkZWZhdWx0IGZp bGVcIiA9IG5pbCkKOzs7Cjs7OyBTT1VSQ0UtUkVHRVhQIGlzIHR5cGljYWxseSBnb2luZyB0 byBiZSBzb21ldGhpbmcgbGlrZSAodGVhLW1vZGUpCjs7OyBmb3IgVCBwcm9ncmFtcywgKGxp c3AtbW9kZSkgZm9yIExpc3AgcHJvZ3JhbXMsIChzb2FyLW1vZGUgbGlzcC1tb2RlKQo7Ozsg Zm9yIFNvYXIgcHJvZ3JhbXMsIGV0Yy4KOzs7Cjs7OyBUaGUgZnVuY3Rpb24gcmV0dXJucyBh IHBhaXI6IChkZWZhdWx0LWRpcmVjdG9yeSAuIGRlZmF1bHQtZmlsZSkuCgooZGVmdW4gdGVy bS1zb3VyY2UtZGVmYXVsdCAocHJldmlvdXMtZGlyL2ZpbGUgc291cmNlLW1vZGVzKQogIChj b25kICgoYW5kIGJ1ZmZlci1maWxlLW5hbWUgKG1lbXEgbWFqb3ItbW9kZSBzb3VyY2UtbW9k ZXMpKQoJIChjb25zIChmaWxlLW5hbWUtZGlyZWN0b3J5ICAgIGJ1ZmZlci1maWxlLW5hbWUp CgkgICAgICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgYnVmZmVyLWZpbGUtbmFtZSkpKQoJ KHByZXZpb3VzLWRpci9maWxlKQoJKHQKCSAoY29ucyBkZWZhdWx0LWRpcmVjdG9yeSBuaWwp KSkpCgoKOzs7IChURVJNLUNIRUNLLVNPVVJDRSBmbmFtZSkKOzs7PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQo7OzsgUHJpb3IgdG8gbG9hZGluZyBvciBjb21waWxpbmcgKG9yIG90aGVyd2lz ZSBwcm9jZXNzaW5nKSBhIGZpbGUgKGluIHRoZSBDTVUKOzs7IHByb2Nlc3MtaW4tYS1idWZm ZXIgbW9kZXMpLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgb24gdGhlIGZpbGVuYW1l Lgo7OzsgSWYgdGhlIGZpbGUgaXMgbG9hZGVkIGludG8gYSBidWZmZXIsIGFuZCB0aGUgYnVm ZmVyIGlzIG1vZGlmaWVkLCB0aGUgdXNlcgo7OzsgaXMgcXVlcmllZCB0byBzZWUgaWYgaGUg d2FudHMgdG8gc2F2ZSB0aGUgYnVmZmVyIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGgKOzs7IHRo ZSBsb2FkIG9yIGNvbXBpbGUuCgooZGVmdW4gdGVybS1jaGVjay1zb3VyY2UgKGZuYW1lKQog IChsZXQgKChidWZmIChnZXQtZmlsZS1idWZmZXIgZm5hbWUpKSkKICAgICh3aGVuIChhbmQg YnVmZgoJICAgICAgIChidWZmZXItbW9kaWZpZWQtcCBidWZmKQoJICAgICAgICh5LW9yLW4t cCAoZm9ybWF0ICJTYXZlIGJ1ZmZlciAlcyBmaXJzdD8gIgoJCQkJIChidWZmZXItbmFtZSBi dWZmKSkpKQogICAgICA7OyBzYXZlIEJVRkYuCiAgICAgIChsZXQgKChvbGQtYnVmZmVyIChj dXJyZW50LWJ1ZmZlcikpKQoJKHNldC1idWZmZXIgYnVmZikKCShzYXZlLWJ1ZmZlcikKCShz ZXQtYnVmZmVyIG9sZC1idWZmZXIpKSkpKQoKCjs7OyAoVEVSTS1HRVQtU09VUkNFIHByb21w dCBwcmV2LWRpci9maWxlIHNvdXJjZS1tb2RlcyBtdXN0bWF0Y2gtcCkKOzs7PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQo7OzsgVEVSTS1HRVQtU09VUkNFIGlzIHVzZWQgdG8gcHJvbXB0IGZv ciBmaWxlbmFtZXMgaW4gY29tbWFuZC1pbnRlcnByZXRlcgo7OzsgY29tbWFuZHMgdGhhdCBw cm9jZXNzIHNvdXJjZSBmaWxlcyAobGlrZSBsb2FkaW5nIG9yIGNvbXBpbGluZyBhIGZpbGUp Lgo7OzsgSXQgcHJvbXB0cyBmb3IgdGhlIGZpbGVuYW1lLCBwcm92aWRlcyBhIGRlZmF1bHQs IGlmIHRoZXJlIGlzIG9uZSwKOzs7IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZmlsZW5hbWUu Cjs7Owo7OzsgU2VlIFRFUk0tU09VUkNFLURFRkFVTFQgZm9yIG1vcmUgb24gZGV0ZXJtaW5p bmcgZGVmYXVsdHMuCjs7Owo7OzsgUFJPTVBUIGlzIHRoZSBwcm9tcHQgc3RyaW5nLiAgUFJF Vi1ESVIvRklMRSBpcyB0aGUgKGRpcmVjdG9yeSAuIGZpbGUpIHBhaXIKOzs7IGZyb20gdGhl IGxhc3Qgc291cmNlIHByb2Nlc3NpbmcgY29tbWFuZC4gIFNPVVJDRS1NT0RFUyBpcyBhIGxp c3Qgb2YgbWFqb3IKOzs7IG1vZGVzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgZmlsZSBidWZm ZXJzIGNvbnRhaW4gc291cmNlIGZpbGVzLiAgKFRoZXNlCjs7OyB0d28gYXJndW1lbnRzIGFy ZSB1c2VkIGZvciBkZXRlcm1pbmluZyBkZWZhdWx0cykuICBJZiBNVVNUTUFUQ0gtUCBpcyB0 cnVlLAo7OzsgdGhlbiB0aGUgZmlsZW5hbWUgcmVhZGVyIHdpbGwgb25seSBhY2NlcHQgYSBm aWxlIHRoYXQgZXhpc3RzLgo7OzsKOzs7IEEgdHlwaWNhbCB1c2U6Cjs7OyAoaW50ZXJhY3Rp dmUgKHRlcm0tZ2V0LXNvdXJjZSAiQ29tcGlsZSBmaWxlOiAiIHByZXYtbGlzcC1kaXIvZmls ZQo7OzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKGxpc3AtbW9kZSkgdCkp Cgo7OzsgVGhpcyBpcyBwcmV0dHkgc3R1cGlkIGFib3V0IHN0cmluZ3MuICBJdCBkZWNpZGVz IHdlJ3JlIGluIGEgc3RyaW5nCjs7OyBpZiB0aGVyZSdzIGEgcXVvdGUgb24gYm90aCBzaWRl cyBvZiBwb2ludCBvbiB0aGUgY3VycmVudCBsaW5lLgooZGVmdW4gdGVybS1leHRyYWN0LXN0 cmluZyAoKQogICJSZXR1cm4gc3RyaW5nIGFyb3VuZCBgcG9pbnQnIHRoYXQgc3RhcnRzIHRo ZSBjdXJyZW50IGxpbmUgb3IgbmlsLiIKICAoc2F2ZS1leGN1cnNpb24KICAgIChsZXQqICgo cG9pbnQgKHBvaW50KSkKCSAgIChib2wgKHByb2duIChiZWdpbm5pbmctb2YtbGluZSkgKHBv aW50KSkpCgkgICAoZW9sIChwcm9nbiAoZW5kLW9mLWxpbmUpIChwb2ludCkpKQoJICAgKHN0 YXJ0IChwcm9nbiAoZ290by1jaGFyIHBvaW50KQoJCQkgKGFuZCAoc2VhcmNoLWJhY2t3YXJk ICJcIiIgYm9sIHQpCgkJCSAgICAgICgxKyAocG9pbnQpKSkpKQoJICAgKGVuZCAocHJvZ24g KGdvdG8tY2hhciBwb2ludCkKCQkgICAgICAgKGFuZCAoc2VhcmNoLWZvcndhcmQgIlwiIiBl b2wgdCkKCQkJICAgICgxLSAocG9pbnQpKSkpKSkKICAgICAgKGFuZCBzdGFydCBlbmQKCSAg IChidWZmZXItc3Vic3RyaW5nIHN0YXJ0IGVuZCkpKSkpCgooZGVmdW4gdGVybS1nZXQtc291 cmNlIChwcm9tcHQgcHJldi1kaXIvZmlsZSBzb3VyY2UtbW9kZXMgbXVzdG1hdGNoLXApCiAg KGxldCogKChkZWYgKHRlcm0tc291cmNlLWRlZmF1bHQgcHJldi1kaXIvZmlsZSBzb3VyY2Ut bW9kZXMpKQogICAgICAgICAoc3RyaW5nZmlsZSAodGVybS1leHRyYWN0LXN0cmluZykpCgkg KHNmaWxlLXAgKGFuZCBzdHJpbmdmaWxlCgkJICAgICAgIChjb25kaXRpb24tY2FzZSAoKQoJ CQkgICAoZmlsZS1leGlzdHMtcCBzdHJpbmdmaWxlKQoJCQkgKGVycm9yIG5pbCkpCgkJICAg ICAgIChub3QgKGZpbGUtZGlyZWN0b3J5LXAgc3RyaW5nZmlsZSkpKSkKCSAoZGVmZGlyICAo aWYgc2ZpbGUtcCAoZmlsZS1uYW1lLWRpcmVjdG9yeSBzdHJpbmdmaWxlKQogICAgICAgICAg ICAgICAgICAgICAgKGNhciBkZWYpKSkKCSAoZGVmZmlsZSAoaWYgc2ZpbGUtcCAoZmlsZS1u YW1lLW5vbmRpcmVjdG9yeSBzdHJpbmdmaWxlKQogICAgICAgICAgICAgICAgICAgICAgKGNk ciBkZWYpKSkKCSAoYW5zIChyZWFkLWZpbGUtbmFtZSAoaWYgZGVmZmlsZSAoZm9ybWF0ICIl cyhkZWZhdWx0ICVzKSAiCgkJCQkJCSAgcHJvbXB0ICAgIGRlZmZpbGUpCgkJCQkgIHByb21w dCkKCQkJICAgICAgZGVmZGlyCgkJCSAgICAgIChjb25jYXQgZGVmZGlyIGRlZmZpbGUpCgkJ CSAgICAgIG11c3RtYXRjaC1wKSkpCiAgICAobGlzdCAoZXhwYW5kLWZpbGUtbmFtZSAoc3Vi c3RpdHV0ZS1pbi1maWxlLW5hbWUgYW5zKSkpKSkKCjs7OyBJIGFtIHNvbWV3aGF0IGRpdmlk ZWQgb24gdGhpcyBzdHJpbmctZGVmYXVsdCBmZWF0dXJlLiAgSXQgc2VlbXMKOzs7IHRvIHZp b2xhdGUgdGhlIHByaW5jaXBsZS1vZi1sZWFzdC1hc3RvbmlzaG1lbnQsIGluIHRoYXQgaXQg bWFrZXMKOzs7IHRoZSBkZWZhdWx0IGhhcmRlciB0byBwcmVkaWN0LCBzbyB5b3UgYWN0dWFs bHkgaGF2ZSB0byBsb29rIGFuZCBzZWUKOzs7IHdoYXQgdGhlIGRlZmF1bHQgcmVhbGx5IGlz IGJlZm9yZSBjaG9vc2luZyBpdC4gIFRoaXMgY2FuIHRyaXAgeW91IHVwLgo7OzsgT24gdGhl IG90aGVyIGhhbmQsIGl0IGNhbiBiZSB1c2VmdWwsIEkgZ3Vlc3MuICBJIHdvdWxkIGFwcHJl Y2lhdGUgZmVlZGJhY2sKOzs7IG9uIHRoaXMuCjs7OyAgICAgLU9saW4KCgwKOzs7IFNpbXBs ZSBwcm9jZXNzIHF1ZXJ5IGZhY2lsaXR5Lgo7OzsgPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cjs7 OyBUaGlzIGZ1bmN0aW9uIGlzIGZvciBjb21tYW5kcyB0aGF0IHdhbnQgdG8gc2VuZCBhIHF1 ZXJ5IHRvIHRoZSBwcm9jZXNzCjs7OyBhbmQgc2hvdyB0aGUgcmVzcG9uc2UgdG8gdGhlIHVz ZXIuICBGb3IgZXhhbXBsZSwgYSBjb21tYW5kIHRvIGdldCB0aGUKOzs7IGFyZ2xpc3QgZm9y IGEgQ29tbW9uIExpc3AgZnVuY3Rpb24gbWlnaHQgc2VuZCBhICIoYXJnbGlzdCAnZm9vKSIg cXVlcnkKOzs7IHRvIGFuIGluZmVyaW9yIENvbW1vbiBMaXNwIHByb2Nlc3MuCjs7Owo7Ozsg VGhpcyBzaW1wbGUgZmFjaWxpdHkganVzdCBzZW5kcyBzdHJpbmdzIHRvIHRoZSBpbmZlcmlv ciBwcm9jZXNzIGFuZCBwb3BzCjs7OyB1cCBhIHdpbmRvdyBmb3IgdGhlIHByb2Nlc3MgYnVm ZmVyIHNvIHlvdSBjYW4gc2VlIHdoYXQgdGhlIHByb2Nlc3MKOzs7IHJlc3BvbmRzIHdpdGgu ICBXZSBkb24ndCBkbyBhbnl0aGluZyBmYW5jeSBsaWtlIHRyeSB0byBpbnRlcmNlcHQgd2hh dCB0aGUKOzs7IHByb2Nlc3MgcmVzcG9uZHMgd2l0aCBhbmQgcHV0IGl0IGluIGEgcG9wLXVw IHdpbmRvdyBvciBvbiB0aGUgbWVzc2FnZQo7OzsgbGluZS4gIFdlIGp1c3QgZGlzcGxheSB0 aGUgYnVmZmVyLiAgTG93IHRlY2guICBTaW1wbGUuICBXb3JrcyBnb29kLgoKOzs7IFNlbmQg dG8gdGhlIGluZmVyaW9yIHByb2Nlc3MgUFJPQyB0aGUgc3RyaW5nIFNUUi4gIFBvcC11cCBi dXQgZG8gbm90IHNlbGVjdAo7OzsgYSB3aW5kb3cgZm9yIHRoZSBpbmZlcmlvciBwcm9jZXNz IHNvIHRoYXQgaXRzIHJlc3BvbnNlIGNhbiBiZSBzZWVuLgooZGVmdW4gdGVybS1wcm9jLXF1 ZXJ5IChwcm9jIHN0cikKICAobGV0KiAoKHByb2MtYnVmIChwcm9jZXNzLWJ1ZmZlciBwcm9j KSkKCSAocHJvYy1tYXJrIChwcm9jZXNzLW1hcmsgcHJvYykpKQogICAgKGRpc3BsYXktYnVm ZmVyIHByb2MtYnVmKQogICAgKHNldC1idWZmZXIgcHJvYy1idWYpIDsgYnV0IGl0J3Mgbm90 IHRoZSBzZWxlY3RlZCAqd2luZG93KgogICAgKGxldCAoKHByb2Mtd2luIChnZXQtYnVmZmVy LXdpbmRvdyBwcm9jLWJ1ZikpCgkgIChwcm9jLXB0IChtYXJrZXItcG9zaXRpb24gcHJvYy1t YXJrKSkpCiAgICAgICh0ZXJtLXNlbmQtc3RyaW5nIHByb2Mgc3RyKSA7IHNlbmQgdGhlIHF1 ZXJ5CiAgICAgIChhY2NlcHQtcHJvY2Vzcy1vdXRwdXQgcHJvYykgIDsgd2FpdCBmb3Igc29t ZSBvdXRwdXQKICAgICAgOzsgVHJ5IHRvIHBvc2l0aW9uIHRoZSBwcm9jIHdpbmRvdyBzbyB5 b3UgY2FuIHNlZSB0aGUgYW5zd2VyLgogICAgICA7OyBUaGlzIGlzIGJvZ3VzIGNvZGUuICBJ ZiB5b3UgZGVsZXRlIHRoZSAoc2l0LWZvciAwKSwgaXQgYnJlYWtzLgogICAgICA7OyBJIGRv bid0IGtub3cgd2h5LiAgV2l6YXJkcyBpbnZpdGVkIHRvIGltcHJvdmUgaXQuCiAgICAgICh3 aGVuIChub3QgKHBvcy12aXNpYmxlLWluLXdpbmRvdy1wIHByb2MtcHQgcHJvYy13aW4pKQoJ KGxldCAoKG9wb2ludCAod2luZG93LXBvaW50IHByb2Mtd2luKSkpCgkgIChzZXQtd2luZG93 LXBvaW50IHByb2Mtd2luIHByb2MtbWFyaykgKHNpdC1mb3IgMCkKCSAgKGlmIChub3QgKHBv cy12aXNpYmxlLWluLXdpbmRvdy1wIG9wb2ludCBwcm9jLXdpbikpCgkgICAgICAocHVzaC1t YXJrIG9wb2ludCkKCSAgICAoc2V0LXdpbmRvdy1wb2ludCBwcm9jLXdpbiBvcG9pbnQpKSkp KSkpCgwKOzs7IFJldHVybnMgdGhlIGN1cnJlbnQgY29sdW1uIGluIHRoZSBjdXJyZW50IHNj cmVlbiBsaW5lLgo7OzsgTm90ZTogKGN1cnJlbnQtY29sdW1uKSB5aWVsZHMgY29sdW1uIGlu IGJ1ZmZlciBsaW5lLgoKKGRlZnVuIHRlcm0taG9yaXpvbnRhbC1jb2x1bW4gKCkKICAoLSAo dGVybS1jdXJyZW50LWNvbHVtbikgKHRlcm0tc3RhcnQtbGluZS1jb2x1bW4pKSkKCjs7IENh bGxzIGVpdGhlciB2ZXJ0aWNhbC1tb3Rpb24gb3IgdGVybS1idWZmZXItdmVydGljYWwtbW90 aW9uCihkZWZtYWNybyB0ZXJtLXZlcnRpY2FsLW1vdGlvbiAoY291bnQpCiAgKGxpc3QgJ2Z1 bmNhbGwgJ3Rlcm0tdmVydGljYWwtbW90aW9uIGNvdW50KSkKCjs7IEFuIGVtdWxhdGlvbiBv ZiB2ZXJ0aWNhbC1tb3Rpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBoYXZpbmcgYSB3aW5k b3cuCjs7IEluc3RlYWQsIGl0IHVzZXMgdGhlIHRlcm0td2lkdGggdmFyaWFibGUgYXMgdGhl IGxvZ2ljYWwgd2luZG93IHdpZHRoLgoKKGRlZnVuIHRlcm0tYnVmZmVyLXZlcnRpY2FsLW1v dGlvbiAoY291bnQpCiAgKGNvbmQgKCg9IGNvdW50IDApCgkgKG1vdmUtdG8tY29sdW1uICgq IHRlcm0td2lkdGggKC8gKGN1cnJlbnQtY29sdW1uKSB0ZXJtLXdpZHRoKSkpCgkgMCkKCSgo PiBjb3VudCAwKQoJIChsZXQgKChIKQoJICAgICAgICh0b2RvICgrIGNvdW50ICgvIChjdXJy ZW50LWNvbHVtbikgdGVybS13aWR0aCkpKSkKCSAgIChlbmQtb2YtbGluZSkKCSAgIDs7IFRo ZSBsb29wIGl0ZXJhdGVzIG92ZXIgYnVmZmVyIGxpbmVzOwoJICAgOzsgSCBpcyB0aGUgbnVt YmVyIG9mIHNjcmVlbiBsaW5lcyBpbiB0aGUgY3VycmVudCBsaW5lLCBpLmUuCgkgICA7OyB0 aGUgY2VpbGluZyBvZiBkaXZpZGluZyB0aGUgYnVmZmVyIGxpbmUgd2lkdGggYnkgdGVybS13 aWR0aC4KCSAgICh3aGlsZSAoYW5kICg8PSAoc2V0cSBIIChtYXggKC8gKCsgKGN1cnJlbnQt Y29sdW1uKSB0ZXJtLXdpZHRoIC0xKQoJCQkJCSAgIHRlcm0td2lkdGgpCgkJCQkJMSkpCgkJ CSAgIHRvZG8pCgkJICAgICAgIChub3QgKGVvYnApKSkKCSAgICAgKHNldHEgdG9kbyAoLSB0 b2RvIEgpKQoJICAgICAoZm9yd2FyZC1jaGFyKSA7OyBNb3ZlIHBhc3QgdGhlID9cbgoJICAg ICAoZW5kLW9mLWxpbmUpKSA7OyBhbmQgb24gdG8gdGhlIGVuZCBvZiB0aGUgbmV4dCBsaW5l LgoJICAgKGlmIChhbmQgKD49IHRvZG8gSCkgKD4gdG9kbyAwKSkKCSAgICAgICAoKyAoLSBj b3VudCB0b2RvKSBIIC0xKSA7OyBIaXQgZW5kIG9mIGJ1ZmZlci4KCSAgICAgKG1vdmUtdG8t Y29sdW1uICgqIHRvZG8gdGVybS13aWR0aCkpCgkgICAgIGNvdW50KSkpCgkodCA7OyAoPCBj b3VudCAwKSA7OyBTaW1pbGFyIGFsZ29yaXRobSwgYnV0IGZvciB1cHdhcmQgbW90aW9uLgoJ IChsZXQgKChIKQoJICAgICAgICh0b2RvICgtIGNvdW50KSkpCgkgICAod2hpbGUgKGFuZCAo PD0gKHNldHEgSCAobWF4ICgvICgrIChjdXJyZW50LWNvbHVtbikgdGVybS13aWR0aCAtMSkK CQkJCQkgICB0ZXJtLXdpZHRoKQoJCQkJCTEpKQoJCQkgICB0b2RvKQoJCSAgICAgICAocHJv Z24gKGJlZ2lubmluZy1vZi1saW5lKQoJCQkgICAgICAobm90IChib2JwKSkpKQoJICAgICAo c2V0cSB0b2RvICgtIHRvZG8gSCkpCgkgICAgIChiYWNrd2FyZC1jaGFyKSkgOzsgTW92ZSB0 byBlbmQgb2YgcHJldmlvdXMgbGluZS4KCSAgIChpZiAoYW5kICg+PSB0b2RvIEgpICg+IHRv ZG8gMCkpCgkgICAgICAgKCsgY291bnQgdG9kbyAoLSAxIEgpKSA7OyBIaXQgYmVnaW5uaW5n IG9mIGJ1ZmZlci4KCSAgICAgKG1vdmUtdG8tY29sdW1uICgqICgtIEggdG9kbyAxKSB0ZXJt LXdpZHRoKSkKCSAgICAgY291bnQpKSkpKQoKOzs7IFRoZSB0ZXJtLXN0YXJ0LWxpbmUtY29s dW1uIHZhcmlhYmxlIGlzIHVzZWQgYXMgYSBjYWNoZS4KKGRlZnVuIHRlcm0tc3RhcnQtbGlu ZS1jb2x1bW4gKCkKICAoY29uZCAodGVybS1zdGFydC1saW5lLWNvbHVtbikKCSgobGV0ICgo c2F2ZS1wb3MgKHBvaW50KSkpCgkgICAodGVybS12ZXJ0aWNhbC1tb3Rpb24gMCkKCSAgIChz ZXRxIHRlcm0tc3RhcnQtbGluZS1jb2x1bW4gKGN1cnJlbnQtY29sdW1uKSkKCSAgIChnb3Rv LWNoYXIgc2F2ZS1wb3MpCgkgICB0ZXJtLXN0YXJ0LWxpbmUtY29sdW1uKSkpKQoKOzs7IFNh bWUgYXMgKGN1cnJlbnQtY29sdW1uKSwgYnV0IHVzZXMgdGVybS1jdXJyZW50LWNvbHVtbiBh cyBhIGNhY2hlLgooZGVmdW4gdGVybS1jdXJyZW50LWNvbHVtbiAoKQogIChjb25kICh0ZXJt LWN1cnJlbnQtY29sdW1uKQoJKChzZXRxIHRlcm0tY3VycmVudC1jb2x1bW4gKGN1cnJlbnQt Y29sdW1uKSkpKSkKCjs7OyBNb3ZlIERFTFRBIGNvbHVtbiByaWdodCAob3IgbGVmdCBpZiBk ZWx0YSA8IDAgbGltaXRpbmcgYXQgY29sdW1uIDApLgoKKGRlZnVuIHRlcm0tbW92ZS1jb2x1 bW5zIChkZWx0YSkKICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIChtYXggMCAoKyAodGVy bS1jdXJyZW50LWNvbHVtbikgZGVsdGEpKSkKICAobGV0IChwb2ludC1hdC1lb2wpCiAgICAo c2F2ZS1leGN1cnNpb24KICAgICAgKGVuZC1vZi1saW5lKQogICAgICAoc2V0cSBwb2ludC1h dC1lb2wgKHBvaW50KSkpCiAgICAobW92ZS10by1jb2x1bW4gdGVybS1jdXJyZW50LWNvbHVt biB0KQogICAgOzsgSWYgbW92ZS10by1jb2x1bW4gZXh0ZW5kcyB0aGUgY3VycmVudCBsaW5l IGl0IHdpbGwgdXNlIHRoZSBmYWNlCiAgICA7OyBmcm9tIHRoZSBsYXN0IGNoYXJhY3RlciBv biB0aGUgbGluZSwgc2V0IHRoZSBmYWNlIGZvciB0aGUgY2hhcnMKICAgIDs7IHRvIGRlZmF1 bHQuCiAgICAod2hlbiAoPiAocG9pbnQpIHBvaW50LWF0LWVvbCkKICAgICAgKHB1dC10ZXh0 LXByb3BlcnR5IHBvaW50LWF0LWVvbCAocG9pbnQpICdmYWNlICdkZWZhdWx0KSkpKQoKOzsg SW5zZXJ0IENPVU5UIGNvcGllcyBvZiBDSEFSIGluIHRoZSBkZWZhdWx0IGZhY2UuCihkZWZ1 biB0ZXJtLWluc2VydC1jaGFyIChjaGFyIGNvdW50KQogIChsZXQgKChvbGQtcG9pbnQgKHBv aW50KSkpCiAgICAoaW5zZXJ0LWNoYXIgY2hhciBjb3VudCkKICAgIChwdXQtdGV4dC1wcm9w ZXJ0eSBvbGQtcG9pbnQgKHBvaW50KSAnZmFjZSAnZGVmYXVsdCkpKQoKKGRlZnVuIHRlcm0t Y3VycmVudC1yb3cgKCkKICAoY29uZCAodGVybS1jdXJyZW50LXJvdykKCSgoc2V0cSB0ZXJt LWN1cnJlbnQtcm93CgkgICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KCQkgKHNhdmUtZXhjdXJz aW9uCgkJICAgKG5hcnJvdy10by1yZWdpb24gdGVybS1ob21lLW1hcmtlciAocG9pbnQtbWF4 KSkKCQkgICAoLSAodGVybS12ZXJ0aWNhbC1tb3Rpb24gLTk5OTkpKSkpKSkpKQoKKGRlZnVu IHRlcm0tYWRqdXN0LWN1cnJlbnQtcm93LWNhY2hlIChkZWx0YSkKICAod2hlbiB0ZXJtLWN1 cnJlbnQtcm93CiAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtcm93CgkgIChtYXggMCAoKyB0ZXJt LWN1cnJlbnQtcm93IGRlbHRhKSkpKSkKCihkZWZ1biB0ZXJtLXRlcm1pbmFsLXBvcyAoKQog IChzYXZlLWV4Y3Vyc2lvbiA7ICAgIHNhdmUtcmVzdHJpY3Rpb24KICAgIChsZXQgKChzYXZl LWNvbCAodGVybS1jdXJyZW50LWNvbHVtbikpCgkgIHggeSkKICAgICAgKHRlcm0tdmVydGlj YWwtbW90aW9uIDApCiAgICAgIChzZXRxIHggKC0gc2F2ZS1jb2wgKGN1cnJlbnQtY29sdW1u KSkpCiAgICAgIChzZXRxIHkgKHRlcm0tdmVydGljYWwtbW90aW9uIHRlcm0taGVpZ2h0KSkK ICAgICAgKGNvbnMgeCB5KSkpKQoKOzs7RnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRlcm0gbWVz c2FnZXM6IGNvZGUgYnkgcm1zICggYW5kIHlvdSBjYW4gc2VlIHRoZQo7OztkaWZmZXJlbmNl IDstKSAtbW0KCihkZWZ1biB0ZXJtLWhhbmRsZS1hbnNpLXRlcm1pbmFsLW1lc3NhZ2VzICht ZXNzYWdlKQogIDs7IElzIHRoZXJlIGEgY29tbWFuZCBoZXJlPwogICh3aGlsZSAoc3RyaW5n LW1hdGNoICJcZUFuU2lULitcbiIgbWVzc2FnZSkKICAgIDs7IEV4dHJhY3QgdGhlIGNvbW1h bmQgY29kZSBhbmQgdGhlIGFyZ3VtZW50LgogICAgKGxldCogKChzdGFydCAobWF0Y2gtYmVn aW5uaW5nIDApKQoJICAgKGVuZCAobWF0Y2gtZW5kIDApKQoJICAgKGNvbW1hbmQtY29kZSAo YXJlZiBtZXNzYWdlICgrIHN0YXJ0IDYpKSkKCSAgIChhcmd1bWVudAoJICAgIChzYXZlLW1h dGNoLWRhdGEKCSAgICAgIChzdWJzdHJpbmcgbWVzc2FnZQoJCQkgKCsgc3RhcnQgOCkKCQkJ IChzdHJpbmctbWF0Y2ggIlxyP1xuIiBtZXNzYWdlCgkJCQkgICAgICAgKCsgc3RhcnQgOCkp KSkpCgkgICBpZ25vcmUpCiAgICAgIDs7IERlbGV0ZSB0aGlzIGNvbW1hbmQgZnJvbSBNRVNT QUdFLgogICAgICAoc2V0cSBtZXNzYWdlIChyZXBsYWNlLW1hdGNoICIiIHQgdCBtZXNzYWdl KSkKCiAgICAgIDs7IElmIHdlIHJlY29nbml6ZSB0aGUgdHlwZSBvZiBjb21tYW5kLCBzZXQg dGhlIGFwcHJvcHJpYXRlIHZhcmlhYmxlLgogICAgICAoY29uZCAoKD0gY29tbWFuZC1jb2Rl ID9jKQoJICAgICAoc2V0cSB0ZXJtLWFuc2ktYXQtZGlyIGFyZ3VtZW50KSkKCSAgICAoKD0g Y29tbWFuZC1jb2RlID9oKQoJICAgICAoc2V0cSB0ZXJtLWFuc2ktYXQtaG9zdCBhcmd1bWVu dCkpCgkgICAgKCg9IGNvbW1hbmQtY29kZSA/dSkKCSAgICAgKHNldHEgdGVybS1hbnNpLWF0 LXVzZXIgYXJndW1lbnQpKQoJICAgIDs7IE90aGVyd2lzZSBpZ25vcmUgdGhpcyBvbmUuCgkg ICAgKHQKCSAgICAgKHNldHEgaWdub3JlIHQpKSkKCiAgICAgIDs7IFVwZGF0ZSBkZWZhdWx0 LWRpcmVjdG9yeSBiYXNlZCBvbiB0aGUgY2hhbmdlcyB0aGlzIGNvbW1hbmQgbWFkZS4KICAg ICAgKGlmIGlnbm9yZQoJICBuaWwKCShzZXRxIGRlZmF1bHQtZGlyZWN0b3J5CgkgICAgICAo ZmlsZS1uYW1lLWFzLWRpcmVjdG9yeQoJICAgICAgIChpZiAoYW5kIChzdHJpbmc9IHRlcm0t YW5zaS1hdC1ob3N0IChzeXN0ZW0tbmFtZSkpCgkJCQkJKHN0cmluZz0gdGVybS1hbnNpLWF0 LXVzZXIgKHVzZXItcmVhbC1sb2dpbi1uYW1lKSkpCgkJICAgKGV4cGFuZC1maWxlLW5hbWUg dGVybS1hbnNpLWF0LWRpcikKCQkgKGlmIChzdHJpbmc9IHRlcm0tYW5zaS1hdC11c2VyICh1 c2VyLXJlYWwtbG9naW4tbmFtZSkpCgkJICAgICAoY29uY2F0ICIvIiB0ZXJtLWFuc2ktYXQt aG9zdCAiOiIgdGVybS1hbnNpLWF0LWRpcikKCQkgICAoY29uY2F0ICIvIiB0ZXJtLWFuc2kt YXQtdXNlciAiQCIgdGVybS1hbnNpLWF0LWhvc3QgIjoiCgkJCSAgIHRlcm0tYW5zaS1hdC1k aXIpKSkpKQoKCTs7IEknbSBub3Qgc3VyZSB0aGlzIGlzIG5lY2Vzc2FyeSwKCTs7IGJ1dCBp dCdzIGJlc3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4KCShpZiAoc3RyaW5nPSB0ZXJtLWFu c2ktYXQtaG9zdCAoc3lzdGVtLW5hbWUpKQoJICAgIChwcm9nbgoJICAgICAgKHNldHEgYW5n ZS1mdHAtZGVmYXVsdC11c2VyIHRlcm0tYW5zaS1hdC1zYXZlLXVzZXIpCgkgICAgICAoc2V0 cSBhbmdlLWZ0cC1kZWZhdWx0LXBhc3N3b3JkIHRlcm0tYW5zaS1hdC1zYXZlLXB3ZCkKCSAg ICAgIChzZXRxIGFuZ2UtZnRwLWdlbmVyYXRlLWFub255bW91cy1wYXNzd29yZCB0ZXJtLWFu c2ktYXQtc2F2ZS1hbm9uKSkKCSAgKHNldHEgdGVybS1hbnNpLWF0LXNhdmUtdXNlciBhbmdl LWZ0cC1kZWZhdWx0LXVzZXIpCgkgIChzZXRxIHRlcm0tYW5zaS1hdC1zYXZlLXB3ZCBhbmdl LWZ0cC1kZWZhdWx0LXBhc3N3b3JkKQoJICAoc2V0cSB0ZXJtLWFuc2ktYXQtc2F2ZS1hbm9u IGFuZ2UtZnRwLWdlbmVyYXRlLWFub255bW91cy1wYXNzd29yZCkKCSAgKHNldHEgYW5nZS1m dHAtZGVmYXVsdC11c2VyIG5pbCkKCSAgKHNldHEgYW5nZS1mdHAtZGVmYXVsdC1wYXNzd29y ZCBuaWwpCgkgIChzZXRxIGFuZ2UtZnRwLWdlbmVyYXRlLWFub255bW91cy1wYXNzd29yZCBu aWwpKSkpKQogIG1lc3NhZ2UpCgoKOzs7IFRlcm1pbmFsIGVtdWxhdGlvbgo7OzsgVGhpcyBp cyB0aGUgc3RhbmRhcmQgcHJvY2VzcyBmaWx0ZXIgZm9yIHRlcm0gYnVmZmVycy4KOzs7IEl0 IGVtdWxhdGVzIChtb3N0IG9mIHRoZSBmZWF0dXJlcyBvZikgYSBWVDEwMC9BTlNJLXN0eWxl IHRlcm1pbmFsLgoKKGRlZnVuIHRlcm0tZW11bGF0ZS10ZXJtaW5hbCAocHJvYyBzdHIpCiAg KHdpdGgtY3VycmVudC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpCiAgICAobGV0KiAo KGkgMCkgY2hhciBmdW5ueQoJICAgY291bnQgICAgICAgOyBudW1iZXIgb2YgZGVjb2RlZCBj aGFycyBpbiBzdWJzdHJpbmcKCSAgIGNvdW50LWJ5dGVzIDsgbnVtYmVyIG9mIGJ5dGVzCgkg ICBkZWNvZGVkLXN1YnN0cmluZwoJICAgc2F2ZS1wb2ludCBzYXZlLW1hcmtlciBvbGQtcG9p bnQgdGVtcCB3aW4KCSAgIChidWZmZXItdW5kby1saXN0IHQpCgkgICAoc2VsZWN0ZWQgKHNl bGVjdGVkLXdpbmRvdykpCgkgICBsYXN0LXdpbgogICAgICAgICAgIGhhbmRsZWQtYW5zaS1t ZXNzYWdlCgkgICAoc3RyLWxlbmd0aCAobGVuZ3RoIHN0cikpKQogICAgICAoc2F2ZS1zZWxl Y3RlZC13aW5kb3cKCgk7OyBMZXQncyBoYW5kbGUgdGhlIG1lc3NhZ2VzLiAtbW0KCiAgICAg ICAgKGxldCogKChuZXdzdHIgKHRlcm0taGFuZGxlLWFuc2ktdGVybWluYWwtbWVzc2FnZXMg c3RyKSkpCiAgICAgICAgICAod2hlbiAobm90IChlcSBzdHIgbmV3c3RyKSkKCSAgICAoc2V0 cSBoYW5kbGVkLWFuc2ktbWVzc2FnZSB0CgkJICBzdHIgbmV3c3RyKSkpCiAgICAgICAgKHNl dHEgc3RyLWxlbmd0aCAobGVuZ3RoIHN0cikpCgoJKHdoZW4gKG1hcmtlci1idWZmZXIgdGVy bS1wZW5kaW5nLWRlbGV0ZS1tYXJrZXIpCgkgIDs7IERlbGV0ZSB0ZXh0IGZvbGxvd2luZyB0 ZXJtLXBlbmRpbmctZGVsZXRlLW1hcmtlci4KCSAgKGRlbGV0ZS1yZWdpb24gdGVybS1wZW5k aW5nLWRlbGV0ZS1tYXJrZXIgKHByb2Nlc3MtbWFyayBwcm9jKSkKCSAgKHNldC1tYXJrZXIg dGVybS1wZW5kaW5nLWRlbGV0ZS1tYXJrZXIgbmlsKSkKCgkoaWYgKGVxICh3aW5kb3ctYnVm ZmVyKSAoY3VycmVudC1idWZmZXIpKQoJICAgIChwcm9nbgoJICAgICAgKHNldHEgdGVybS12 ZXJ0aWNhbC1tb3Rpb24gKHN5bWJvbC1mdW5jdGlvbiAndmVydGljYWwtbW90aW9uKSkKCSAg ICAgICh0ZXJtLWNoZWNrLXNpemUgcHJvYykpCgkgIChzZXRxIHRlcm0tdmVydGljYWwtbW90 aW9uCgkJKHN5bWJvbC1mdW5jdGlvbiAndGVybS1idWZmZXItdmVydGljYWwtbW90aW9uKSkp CgoJKHNldHEgc2F2ZS1tYXJrZXIgKGNvcHktbWFya2VyIChwcm9jZXNzLW1hcmsgcHJvYykp KQoKCSh3aGVuICgvPSAocG9pbnQpIChwcm9jZXNzLW1hcmsgcHJvYykpCgkgIChzZXRxIHNh dmUtcG9pbnQgKHBvaW50LW1hcmtlcikpCgkgIChnb3RvLWNoYXIgKHByb2Nlc3MtbWFyayBw cm9jKSkpCgoJKHNhdmUtcmVzdHJpY3Rpb24KCSAgOzsgSWYgdGhlIGJ1ZmZlciBpcyBpbiBs aW5lIG1vZGUsIGFuZCB0aGVyZSBpcyBhIHBhcnRpYWwKCSAgOzsgaW5wdXQgbGluZSwgc2F2 ZSB0aGUgbGluZSAoYnkgbmFycm93aW5nIHRvIGxlYXZlIGl0CgkgIDs7IG91dHNpZGUgdGhl IHJlc3RyaWN0aW9uICkgdW50aWwgd2UncmUgZG9uZSB3aXRoIG91dHB1dC4KCSAgKHdoZW4g KGFuZCAoPiAocG9pbnQtbWF4KSAocHJvY2Vzcy1tYXJrIHByb2MpKQoJCSAgICAgKHRlcm0t aW4tbGluZS1tb2RlKSkKCSAgICAobmFycm93LXRvLXJlZ2lvbiAocG9pbnQtbWluKSAocHJv Y2Vzcy1tYXJrIHByb2MpKSkKCgkgICh3aGVuIHRlcm0tbG9nLWJ1ZmZlcgoJICAgIChwcmlu YyBzdHIgdGVybS1sb2ctYnVmZmVyKSkKCSAgKGNvbmQgKChlcSB0ZXJtLXRlcm1pbmFsLXN0 YXRlIDQpIDs7IEhhdmUgc2F2ZWQgcGVuZGluZyBvdXRwdXQuCgkJIChzZXRxIHN0ciAoY29u Y2F0IHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIHN0cikpCgkJIChzZXRxIHRlcm0tdGVybWlu YWwtcGFyYW1ldGVyIG5pbCkKCQkgKHNldHEgc3RyLWxlbmd0aCAobGVuZ3RoIHN0cikpCgkJ IChzZXRxIHRlcm0tdGVybWluYWwtc3RhdGUgMCkpKQoKCSAgKHdoaWxlICg8IGkgc3RyLWxl bmd0aCkKCSAgICAoc2V0cSBjaGFyIChhcmVmIHN0ciBpKSkKCSAgICAoY29uZCAoKDwgdGVy bS10ZXJtaW5hbC1zdGF0ZSAyKQoJCSAgIDs7IExvb2sgZm9yIHByZWZpeCBvZiByZWd1bGFy IGNoYXJzCgkJICAgKHNldHEgZnVubnkKCQkJIChzdHJpbmctbWF0Y2ggIltcclxuXDAwMFww MDdcMDMzXHRcYlwwMzJcMDE2XDAxN10iCgkJCQkgICAgICAgc3RyIGkpKQoJCSAgICh3aGVu IChub3QgZnVubnkpIChzZXRxIGZ1bm55IHN0ci1sZW5ndGgpKQoJCSAgIChjb25kICgoPiBm dW5ueSBpKQoJCQkgIDs7IERlY29kZSB0aGUgc3RyaW5nIGJlZm9yZSBjb3VudGluZwoJCQkg IDs7IGNoYXJhY3RlcnMsIHRvIGF2b2lkIGdhcmJsaW5nIG9mIGNlcnRhaW4KCQkJICA7OyBt dWx0aWJ5dGUgY2hhcmFjdGVycyAoYnVnIzEwMDYpLgoJCQkgIChzZXRxIGRlY29kZWQtc3Vi c3RyaW5nCgkJCQkoZGVjb2RlLWNvZGluZy1zdHJpbmcKCQkJCSAoc3Vic3RyaW5nIHN0ciBp IGZ1bm55KQoJCQkJIGxvY2FsZS1jb2Rpbmctc3lzdGVtKSkKCQkJICAoY29uZCAoKGVxIHRl cm0tdGVybWluYWwtc3RhdGUgMSkKCQkJCSA7OyBXZSBhcmUgaW4gc3RhdGUgMSwgd2UgbmVl ZCB0byB3cmFwCgkJCQkgOzsgYXJvdW5kLiAgR28gdG8gdGhlIGJlZ2lubmluZyBvZgoJCQkJ IDs7IHRoZSBuZXh0IGxpbmUgYW5kIHN3aXRjaCB0byBzdGF0ZQoJCQkJIDs7IDAuCgkJCQkg KHRlcm0tZG93biAxIHQpCgkJCQkgKHRlcm0tbW92ZS1jb2x1bW5zICgtICh0ZXJtLWN1cnJl bnQtY29sdW1uKSkpCgkJCQkgKHNldHEgdGVybS10ZXJtaW5hbC1zdGF0ZSAwKSkpCgkJCSAg KHNldHEgY291bnQgKGxlbmd0aCBkZWNvZGVkLXN1YnN0cmluZykpCgkJCSAgKHNldHEgdGVt cCAoLSAoKyAodGVybS1ob3Jpem9udGFsLWNvbHVtbikgY291bnQpCgkJCQkJdGVybS13aWR0 aCkpCgkJCSAgKGNvbmQgKCg8PSB0ZW1wIDApKSA7OyBBbGwgY291bnQgY2hhcnMgZml0IGlu IGxpbmUuCgkJCQkoKD4gY291bnQgdGVtcCkJOzsgU29tZSBjaGFycyBmaXQuCgkJCQkgOzsg VGhpcyBpdGVyYXRpb24sIGhhbmRsZSBvbmx5IHdoYXQgZml0cy4KCQkJCSAoc2V0cSBjb3Vu dCAoLSBjb3VudCB0ZW1wKSkKCQkJCSAoc2V0cSBjb3VudC1ieXRlcwoJCQkJICAgICAgIChs ZW5ndGgKCQkJCQkoZW5jb2RlLWNvZGluZy1zdHJpbmcKCQkJCQkgKHN1YnN0cmluZyBkZWNv ZGVkLXN1YnN0cmluZyAwIGNvdW50KQoJCQkJCSAnYmluYXJ5KSkpCgkJCQkgKHNldHEgdGVt cCAwKQoJCQkJIChzZXRxIGZ1bm55ICgrIGNvdW50LWJ5dGVzIGkpKSkKCQkJCSgob3IgKG5v dCAob3IgdGVybS1wYWdlci1jb3VudAoJCQkJCSAgICAgIHRlcm0tc2Nyb2xsLXdpdGgtZGVs ZXRlKSkKCQkJCSAgICAgKD4gICh0ZXJtLWhhbmRsZS1zY3JvbGwgMSkgMCkpCgkJCQkgKHRl cm0tYWRqdXN0LWN1cnJlbnQtcm93LWNhY2hlIDEpCgkJCQkgKHNldHEgY291bnQgKG1pbiBj b3VudCB0ZXJtLXdpZHRoKSkKCQkJCSAoc2V0cSBjb3VudC1ieXRlcwoJCQkJICAgICAgIChs ZW5ndGgKCQkJCQkoZW5jb2RlLWNvZGluZy1zdHJpbmcKCQkJCQkgKHN1YnN0cmluZyBkZWNv ZGVkLXN1YnN0cmluZyAwIGNvdW50KQoJCQkJCSAnYmluYXJ5KSkpCgkJCQkgKHNldHEgZnVu bnkgKCsgY291bnQtYnl0ZXMgaSkpCgkJCQkgKHNldHEgdGVybS1zdGFydC1saW5lLWNvbHVt bgoJCQkJICAgICAgIHRlcm0tY3VycmVudC1jb2x1bW4pKQoJCQkJKHQgOzsgRG9pbmcgUEFH RVIgcHJvY2Vzc2luZy4KCQkJCSAoc2V0cSBjb3VudCAwIGZ1bm55IGkpCgkJCQkgKHNldHEg dGVybS1jdXJyZW50LWNvbHVtbiBuaWwpCgkJCQkgKHNldHEgdGVybS1zdGFydC1saW5lLWNv bHVtbiBuaWwpKSkKCQkJICAoc2V0cSBvbGQtcG9pbnQgKHBvaW50KSkKCgkJCSAgOzsgSW5z ZXJ0IGEgc3RyaW5nLCBjaGVjayBob3cgbWFueSBjb2x1bW5zCgkJCSAgOzsgd2UgbW92ZWQs IHRoZW4gZGVsZXRlIHRoYXQgbWFueSBjb2x1bW5zCgkJCSAgOzsgZm9sbG93aW5nIHBvaW50 IGlmIG5vdCBlb2Igbm9yIGluc2VydC1tb2RlLgoJCQkgIChsZXQgKChvbGQtY29sdW1uIChj dXJyZW50LWNvbHVtbikpCgkJCQljb2x1bW5zIHBvcykKCQkJICAgIChpbnNlcnQgKGRlY29k ZS1jb2Rpbmctc3RyaW5nIChzdWJzdHJpbmcgc3RyIGkgZnVubnkpIGxvY2FsZS1jb2Rpbmct c3lzdGVtKSkKCQkJICAgIChzZXRxIHRlcm0tY3VycmVudC1jb2x1bW4gKGN1cnJlbnQtY29s dW1uKQoJCQkJICBjb2x1bW5zICgtIHRlcm0tY3VycmVudC1jb2x1bW4gb2xkLWNvbHVtbikp CgkJCSAgICAod2hlbiAobm90IChvciAoZW9icCkgdGVybS1pbnNlcnQtbW9kZSkpCgkJCSAg ICAgIChzZXRxIHBvcyAocG9pbnQpKQoJCQkgICAgICAodGVybS1tb3ZlLWNvbHVtbnMgY29s dW1ucykKCQkJICAgICAgKGRlbGV0ZS1yZWdpb24gcG9zIChwb2ludCkpKQoJCQkgICAgOzsg SW4gaW5zZXJ0IG1vZGUgaWYgdGhlIGN1cnJlbnQgbGluZQoJCQkgICAgOzsgaGFzIGJlY29t ZSB0b28gbG9uZyBpdCBuZWVkcyB0byBiZQoJCQkgICAgOzsgY2hvcHBlZCBvZmYuCgkJCSAg ICAod2hlbiB0ZXJtLWluc2VydC1tb2RlCgkJCSAgICAgIChzZXRxIHBvcyAocG9pbnQpKQoJ CQkgICAgICAoZW5kLW9mLWxpbmUpCgkJCSAgICAgICh3aGVuICg+IChjdXJyZW50LWNvbHVt bikgdGVybS13aWR0aCkKCQkJCShkZWxldGUtcmVnaW9uICgtIChwb2ludCkgKC0gKGN1cnJl bnQtY29sdW1uKSB0ZXJtLXdpZHRoKSkKCQkJCQkgICAgICAgKHBvaW50KSkpCgkJCSAgICAg IChnb3RvLWNoYXIgcG9zKSkpCgkJCSAgKHNldHEgdGVybS1jdXJyZW50LWNvbHVtbiBuaWwp CgoJCQkgIChwdXQtdGV4dC1wcm9wZXJ0eSBvbGQtcG9pbnQgKHBvaW50KQoJCQkJCSAgICAg J2ZhY2UgdGVybS1jdXJyZW50LWZhY2UpCgkJCSAgOzsgSWYgdGhlIGxhc3QgY2hhciB3YXMg d3JpdHRlbiBpbiBsYXN0IGNvbHVtbiwKCQkJICA7OyBiYWNrIHVwIG9uZSBjb2x1bW4sIGJ1 dCByZW1lbWJlciB3ZSBkaWQgc28uCgkJCSAgOzsgVGh1cyB3ZSBlbXVsYXRlIHh0ZXJtL3Z0 MTAwLXN0eWxlIGxpbmUtd3JhcHBpbmcuCgkJCSAgKGNvbmQgKChlcSB0ZW1wIDApCgkJCQkg KHRlcm0tbW92ZS1jb2x1bW5zIC0xKQoJCQkJIChzZXRxIHRlcm0tdGVybWluYWwtc3RhdGUg MSkpKQoJCQkgIChzZXRxIGkgKDEtIGZ1bm55KSkpCgkJCSAoKGFuZCAoc2V0cSB0ZXJtLXRl cm1pbmFsLXN0YXRlIDApCgkJCSAgICAgICAoZXEgY2hhciA/XF5JKSkgOyBUQUIgKHRlcm1p bmZvOiBodCkKCQkJICAoc2V0cSBjb3VudCAodGVybS1jdXJyZW50LWNvbHVtbikpCgkJCSAg OzsgVGhlIGxpbmUgY2Fubm90IGV4Y2VlZCB0ZXJtLXdpZHRoLiBUQUIgYXQKCQkJICA7OyB0 aGUgZW5kIG9mIGEgbGluZSBzaG91bGQgbm90IGNhdXNlIHdyYXBwaW5nLgoJCQkgIChzZXRx IGNvdW50IChtaW4gdGVybS13aWR0aAoJCQkJCSAgICgrIGNvdW50IDggKC0gKG1vZCBjb3Vu dCA4KSkpKSkKCQkJICAoaWYgKD4gdGVybS13aWR0aCBjb3VudCkKCQkJICAgICAgKHByb2du CgkJCQkodGVybS1tb3ZlLWNvbHVtbnMKCQkJCSAoLSBjb3VudCAodGVybS1jdXJyZW50LWNv bHVtbikpKQoJCQkJKHNldHEgdGVybS1jdXJyZW50LWNvbHVtbiBjb3VudCkpCgkJCSAgICAo d2hlbiAoPiB0ZXJtLXdpZHRoICh0ZXJtLWN1cnJlbnQtY29sdW1uKSkKCQkJICAgICAgKHRl cm0tbW92ZS1jb2x1bW5zCgkJCSAgICAgICAoMS0gKC0gdGVybS13aWR0aCAodGVybS1jdXJy ZW50LWNvbHVtbikpKSkpCgkJCSAgICAod2hlbiAoPSB0ZXJtLXdpZHRoICh0ZXJtLWN1cnJl bnQtY29sdW1uKSkKCQkJICAgICAgKHRlcm0tbW92ZS1jb2x1bW5zIC0xKSkpKQoJCQkgKChl cSBjaGFyID9ccikgIDs7ICh0ZXJtaW5mbzogY3IpCgkJCSAgKHRlcm0tdmVydGljYWwtbW90 aW9uIDApCgkJCSAgKHNldHEgdGVybS1jdXJyZW50LWNvbHVtbiB0ZXJtLXN0YXJ0LWxpbmUt Y29sdW1uKSkKCQkJICgoZXEgY2hhciA/XG4pICA7OyAodGVybWluZm86IGN1ZDEsIGluZCkK CQkJICAodW5sZXNzIChhbmQgdGVybS1raWxsLWVjaG8tbGlzdAoJCQkJICAgICAgICh0ZXJt LWNoZWNrLWtpbGwtZWNoby1saXN0KSkKCQkJICAgICh0ZXJtLWRvd24gMSB0KSkpCgkJCSAo KGVxIGNoYXIgP1xiKSAgOzsgKHRlcm1pbmZvOiBjdWIxKQoJCQkgICh0ZXJtLW1vdmUtY29s dW1ucyAtMSkpCgkJCSAoKGVxIGNoYXIgP1wwMzMpIDsgRXNjYXBlCgkJCSAgKHNldHEgdGVy bS10ZXJtaW5hbC1zdGF0ZSAyKSkKCQkJICgoZXEgY2hhciAwKSkJICAgICAgIDsgTlVMOiBE byBub3RoaW5nCgkJCSAoKGVxIGNoYXIgP1wwMTYpKSAgICAgOyBTaGlmdCBPdXQgLSBpZ25v cmVkCgkJCSAoKGVxIGNoYXIgP1wwMTcpKSAgICAgOyBTaGlmdCBJbiAtIGlnbm9yZWQKCQkJ ICgoZXEgY2hhciA/XF5HKSA7OyAodGVybWluZm86IGJlbCkKCQkJICAoYmVlcCB0KSkKCQkJ ICgoYW5kIChlcSBjaGFyID9cMDMyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KG5vdCBoYW5kbGVkLWFuc2ktbWVzc2FnZSkpCgkJCSAgKGxldCAoKGVuZCAoc3RyaW5nLW1h dGNoICJccj8kIiBzdHIgaSkpKQoJCQkgICAgKGlmIGVuZAoJCQkJKGZ1bmNhbGwgdGVybS1j b21tYW5kLWhvb2sKCQkJCQkgKHByb2cxIChzdWJzdHJpbmcgc3RyICgxKyBpKSBlbmQpCgkJ CQkJICAgKHNldHEgaSAobWF0Y2gtZW5kIDApKSkpCgkJCSAgICAgIChzZXRxIHRlcm0tdGVy bWluYWwtcGFyYW1ldGVyIChzdWJzdHJpbmcgc3RyIGkpKQoJCQkgICAgICAoc2V0cSB0ZXJt LXRlcm1pbmFsLXN0YXRlIDQpCgkJCSAgICAgIChzZXRxIGkgc3RyLWxlbmd0aCkpKSkKCQkJ ICh0ICAgOyBpbnNlcnQgY2hhciBGSVhNRTogU2hvdWxkIG5ldmVyIGhhcHBlbgoJCQkgICh0 ZXJtLW1vdmUtY29sdW1ucyAxKQoJCQkgIChiYWNrd2FyZC1kZWxldGUtY2hhciAxKQoJCQkg IChpbnNlcnQgY2hhcikpKSkKCQkgICgoZXEgdGVybS10ZXJtaW5hbC1zdGF0ZSAyKQkgIDsg U2VlbiBFc2MKCQkgICAoY29uZCAoKGVxIGNoYXIgP1wxMzMpCSAgOzsgP1wxMzMgPSA/WwoK Ozs7IFNvbWUgbW9kaWZpY2F0aW9ucyB0byBjb3BlIHdpdGggbXVsdGlwbGUgc2V0dGluZ3Mg bGlrZSBeW1swMTszMjs0M20gLW1tCjs7OyBOb3RlIHRoYXQgbm93IHRoZSBpbml0IHZhbHVl IG9mIHRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyIGhhcwo7OzsgYmVlbiBjaGFu Z2VkIHRvIC0xCgoJCQkgIChzZXRxIHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIDApCgkJCSAg KHNldHEgdGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXIgLTEpCgkJCSAgKHNldHEg dGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXItMiAtMSkKCQkJICAoc2V0cSB0ZXJt LXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlci0zIC0xKQoJCQkgIChzZXRxIHRlcm0tdGVy bWluYWwtcHJldmlvdXMtcGFyYW1ldGVyLTQgLTEpCgkJCSAgKHNldHEgdGVybS10ZXJtaW5h bC1tb3JlLXBhcmFtZXRlcnMgMCkKCQkJICAoc2V0cSB0ZXJtLXRlcm1pbmFsLXN0YXRlIDMp KQoJCQkgKChlcSBjaGFyID9EKSA7OyBzY3JvbGwgZm9yd2FyZAoJCQkgICh0ZXJtLWhhbmRs ZS1kZWZlcnJlZC1zY3JvbGwpCgkJCSAgKHRlcm0tZG93biAxIHQpCgkJCSAgKHNldHEgdGVy bS10ZXJtaW5hbC1zdGF0ZSAwKSkKCQkJIDs7ICgoZXEgY2hhciA/RSkgOzsgKHRlcm1pbmZv OiBudyksIG5vdCB1c2VkIGZvcgoJCQkgOzsgCSAgICAgICA7OyBub3csIGJ1dCB0aGlzIGlz IGEgd29ya2luZwoJCQkgOzsgCSAgICAgICA7OyBpbXBsZW1lbnRhdGlvbgoJCQkgOzsgICh0 ZXJtLWRvd24gMSkKCQkJIDs7ICAodGVybS1nb3RvIHRlcm0tY3VycmVudC1yb3cgMCkKCQkJ IDs7ICAoc2V0cSB0ZXJtLXRlcm1pbmFsLXN0YXRlIDApKQoJCQkgKChlcSBjaGFyID9NKSA7 OyBzY3JvbGwgcmV2ZXJzZWQgKHRlcm1pbmZvOiByaSkKCQkJICAoaWYgKG9yICg8ICh0ZXJt LWN1cnJlbnQtcm93KSB0ZXJtLXNjcm9sbC1zdGFydCkKCQkJCSAgKD49ICgxLSAodGVybS1j dXJyZW50LXJvdykpCgkJCQkgICAgICB0ZXJtLXNjcm9sbC1zdGFydCkpCgkJCSAgICAgIDs7 IFNjcm9sbGluZyB1cCB3aWxsIG5vdCBtb3ZlIG91dHNpZGUKCQkJICAgICAgOzsgdGhlIHNj cm9sbCByZWdpb24uCgkJCSAgICAgICh0ZXJtLWRvd24gLTEpCgkJCSAgICA7OyBTY3JvbGxp bmcgdGhlIHNjcm9sbCByZWdpb24gaXMgbmVlZGVkLgoJCQkgICAgKHRlcm0tZG93biAtMSB0 KSkKCQkJICAoc2V0cSB0ZXJtLXRlcm1pbmFsLXN0YXRlIDApKQoJCQkgKChlcSBjaGFyID83 KSA7OyBTYXZlIGN1cnNvciAodGVybWluZm86IHNjKQoJCQkgICh0ZXJtLWhhbmRsZS1kZWZl cnJlZC1zY3JvbGwpCgkJCSAgKHNldHEgdGVybS1zYXZlZC1jdXJzb3IKCQkJCShsaXN0ICh0 ZXJtLWN1cnJlbnQtcm93KQoJCQkJICAgICAgKHRlcm0taG9yaXpvbnRhbC1jb2x1bW4pCgkJ CQkgICAgICB0ZXJtLWFuc2ktY3VycmVudC1iZy1jb2xvcgoJCQkJICAgICAgdGVybS1hbnNp LWN1cnJlbnQtYm9sZAoJCQkJICAgICAgdGVybS1hbnNpLWN1cnJlbnQtY29sb3IKCQkJCSAg ICAgIHRlcm0tYW5zaS1jdXJyZW50LWludmlzaWJsZQoJCQkJICAgICAgdGVybS1hbnNpLWN1 cnJlbnQtcmV2ZXJzZQoJCQkJICAgICAgdGVybS1hbnNpLWN1cnJlbnQtdW5kZXJsaW5lCgkJ CQkgICAgICB0ZXJtLWN1cnJlbnQtZmFjZSkKCQkJCSkKCQkJICAoc2V0cSB0ZXJtLXRlcm1p bmFsLXN0YXRlIDApKQoJCQkgKChlcSBjaGFyID84KSA7OyBSZXN0b3JlIGN1cnNvciAodGVy bWluZm86IHJjKQoJCQkgICh3aGVuIHRlcm0tc2F2ZWQtY3Vyc29yCgkJCSAgICAodGVybS1n b3RvIChudGggMCB0ZXJtLXNhdmVkLWN1cnNvcikKCQkJCSAgICAgICAobnRoIDEgdGVybS1z YXZlZC1jdXJzb3IpKQoJCQkgICAgKHNldHEgdGVybS1hbnNpLWN1cnJlbnQtYmctY29sb3IK CQkJCSAgKG50aCAyIHRlcm0tc2F2ZWQtY3Vyc29yKQoJCQkJICB0ZXJtLWFuc2ktY3VycmVu dC1ib2xkCgkJCQkgIChudGggMyB0ZXJtLXNhdmVkLWN1cnNvcikKCQkJCSAgdGVybS1hbnNp LWN1cnJlbnQtY29sb3IKCQkJCSAgKG50aCA0IHRlcm0tc2F2ZWQtY3Vyc29yKQoJCQkJICB0 ZXJtLWFuc2ktY3VycmVudC1pbnZpc2libGUKCQkJCSAgKG50aCA1IHRlcm0tc2F2ZWQtY3Vy c29yKQoJCQkJICB0ZXJtLWFuc2ktY3VycmVudC1yZXZlcnNlCgkJCQkgIChudGggNiB0ZXJt LXNhdmVkLWN1cnNvcikKCQkJCSAgdGVybS1hbnNpLWN1cnJlbnQtdW5kZXJsaW5lCgkJCQkg IChudGggNyB0ZXJtLXNhdmVkLWN1cnNvcikKCQkJCSAgdGVybS1jdXJyZW50LWZhY2UKCQkJ CSAgKG50aCA4IHRlcm0tc2F2ZWQtY3Vyc29yKSkpCgkJCSAgKHNldHEgdGVybS10ZXJtaW5h bC1zdGF0ZSAwKSkKCQkJICgoZXEgY2hhciA/YykgOzsgXEVjIC0gUmVzZXQgKHRlcm1pbmZv OiByczEpCgkJCSAgOzsgVGhpcyBpcyB1c2VkIGJ5IHRoZSAiY2xlYXIiIHByb2dyYW0uCgkJ CSAgKHNldHEgdGVybS10ZXJtaW5hbC1zdGF0ZSAwKQoJCQkgICh0ZXJtLXJlc2V0LXRlcm1p bmFsKSkKCQkJIDs7IFRoZSBcRSM4IHJlc2V0IHNlcXVlbmNlIGZvciB4dGVybS4gV2UKCQkJ IDs7IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gaGFuZGxlIGl0LCBidXQgdGhpcwoJCQkgOzsg aXMgdGhlIGNvZGUgdG8gcGFyc2UgaXQuCgkJCSA7OyAoKGVxIGNoYXIgPyMpCgkJCSA7OyAg KHdoZW4gKGVxIChhcmVmIHN0ciAoMSsgaSkpID84KQoJCQkgOzsgICAgKHNldHEgaSAoMSsg aSkpCgkJCSA7OyAgICAoc2V0cSB0ZXJtLXNjcm9sbC1zdGFydCAwKQoJCQkgOzsgICAgKHNl dHEgdGVybS1zY3JvbGwtZW5kIHRlcm0taGVpZ2h0KQoJCQkgOzsgICAgKHNldHEgdGVybS10 ZXJtaW5hbC1zdGF0ZSAwKSkpCgkJCSAoKHNldHEgdGVybS10ZXJtaW5hbC1zdGF0ZSAwKSkp KQoJCSAgKChlcSB0ZXJtLXRlcm1pbmFsLXN0YXRlIDMpIDsgU2VlbiBFc2MgWwoJCSAgIChj b25kICgoYW5kICg+PSBjaGFyID8wKSAoPD0gY2hhciA/OSkpCgkJCSAgKHNldHEgdGVybS10 ZXJtaW5hbC1wYXJhbWV0ZXIKCQkJCSgrICgqIDEwIHRlcm0tdGVybWluYWwtcGFyYW1ldGVy KSAoLSBjaGFyID8wKSkpKQoJCQkgKChlcSBjaGFyID9cOykKOzs7IFNvbWUgbW9kaWZpY2F0 aW9ucyB0byBjb3BlIHdpdGggbXVsdGlwbGUgc2V0dGluZ3MgbGlrZSBeW1swMTszMjs0M20g LW1tCgkJCSAgKHNldHEgdGVybS10ZXJtaW5hbC1tb3JlLXBhcmFtZXRlcnMgMSkKCQkJICAo c2V0cSB0ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlci00CgkJCQl0ZXJtLXRlcm1p bmFsLXByZXZpb3VzLXBhcmFtZXRlci0zKQoJCQkgIChzZXRxIHRlcm0tdGVybWluYWwtcHJl dmlvdXMtcGFyYW1ldGVyLTMKCQkJCXRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVy LTIpCgkJCSAgKHNldHEgdGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXItMgoJCQkJ dGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXIpCgkJCSAgKHNldHEgdGVybS10ZXJt aW5hbC1wcmV2aW91cy1wYXJhbWV0ZXIKCQkJCXRlcm0tdGVybWluYWwtcGFyYW1ldGVyKQoJ CQkgIChzZXRxIHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIDApKQoJCQkgKChlcSBjaGFyID8/ KSkgOyBJZ25vcmUgPwoJCQkgKHQKCQkJICAodGVybS1oYW5kbGUtYW5zaS1lc2NhcGUgcHJv YyBjaGFyKQoJCQkgIChzZXRxIHRlcm0tdGVybWluYWwtbW9yZS1wYXJhbWV0ZXJzIDApCgkJ CSAgKHNldHEgdGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXItNCAtMSkKCQkJICAo c2V0cSB0ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlci0zIC0xKQoJCQkgIChzZXRx IHRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyLTIgLTEpCgkJCSAgKHNldHEgdGVy bS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXIgLTEpCgkJCSAgKHNldHEgdGVybS10ZXJt aW5hbC1zdGF0ZSAwKSkpKSkKCSAgICAod2hlbiAodGVybS1oYW5kbGluZy1wYWdlcikKCSAg ICAgIDs7IEZpbmlzaCBzdHVmZiB0byBnZXQgcmVhZHkgdG8gaGFuZGxlIFBBR0VSLgoJICAg ICAgKGlmICg+ICglIChjdXJyZW50LWNvbHVtbikgdGVybS13aWR0aCkgMCkKCQkgIChzZXRx IHRlcm0tdGVybWluYWwtcGFyYW1ldGVyCgkJCShzdWJzdHJpbmcgc3RyIGkpKQoJCTs7IFdl J3JlIGF0IGNvbHVtbiAwLiAgR290byBlbmQgb2YgYnVmZmVyOyB0byBjb21wZW5zYXRlLAoJ CTs7IHByZXBlbmQgYSA/XHIgZm9yIGxhdGVyLiAgVGhpcyBsb29rcyBtb3JlIGNvbnNpc3Rl bnQuCgkJKGlmICh6ZXJvcCBpKQoJCSAgICAoc2V0cSB0ZXJtLXRlcm1pbmFsLXBhcmFtZXRl cgoJCQkgIChjb25jYXQgIlxyIiAoc3Vic3RyaW5nIHN0ciBpKSkpCgkJICAoc2V0cSB0ZXJt LXRlcm1pbmFsLXBhcmFtZXRlciAoc3Vic3RyaW5nIHN0ciAoMS0gaSkpKQoJCSAgKGFzZXQg dGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIgMCA/XHIpKQoJCShnb3RvLWNoYXIgKHBvaW50LW1h eCkpKQoJICAgICAgKHNldHEgdGVybS10ZXJtaW5hbC1zdGF0ZSA0KQoJICAgICAgKG1ha2Ut bG9jYWwtdmFyaWFibGUgJ3Rlcm0tcGFnZXItb2xkLWZpbHRlcikKCSAgICAgIChzZXRxIHRl cm0tcGFnZXItb2xkLWZpbHRlciAocHJvY2Vzcy1maWx0ZXIgcHJvYykpCgkgICAgICAoc2V0 LXByb2Nlc3MtZmlsdGVyIHByb2MgdGVybS1wYWdlci1maWx0ZXIpCgkgICAgICAoc2V0cSBp IHN0ci1sZW5ndGgpKQoJICAgIChzZXRxIGkgKDErIGkpKSkpCgoJKHdoZW4gKD49ICh0ZXJt LWN1cnJlbnQtcm93KSB0ZXJtLWhlaWdodCkKCSAgKHRlcm0taGFuZGxlLWRlZmVycmVkLXNj cm9sbCkpCgoJKHNldC1tYXJrZXIgKHByb2Nlc3MtbWFyayBwcm9jKSAocG9pbnQpKQoJKHdo ZW4gc2F2ZS1wb2ludAoJICAoZ290by1jaGFyIHNhdmUtcG9pbnQpCgkgIChzZXQtbWFya2Vy IHNhdmUtcG9pbnQgbmlsKSkKCgk7OyBDaGVjayBmb3IgYSBwZW5kaW5nIGZpbGVuYW1lLWFu ZC1saW5lIG51bWJlciB0byBkaXNwbGF5LgoJOzsgV2UgZG8gdGhpcyBiZWZvcmUgc2Nyb2xs aW5nLCBiZWNhdXNlIHdlIG1pZ2h0IGNyZWF0ZSBhIG5ldyB3aW5kb3cuCgkod2hlbiAoYW5k IHRlcm0tcGVuZGluZy1mcmFtZQoJCSAgIChlcSAod2luZG93LWJ1ZmZlciBzZWxlY3RlZCkg KGN1cnJlbnQtYnVmZmVyKSkpCgkgICh0ZXJtLWRpc3BsYXktbGluZSAoY2FyIHRlcm0tcGVu ZGluZy1mcmFtZSkKCQkJICAgICAoY2RyIHRlcm0tcGVuZGluZy1mcmFtZSkpCgkgIChzZXRx IHRlcm0tcGVuZGluZy1mcmFtZSBuaWwpCgkgIDs7IFdlIGhhdmUgY3JlYXRlZCBhIG5ldyB3 aW5kb3csIHNvIGNoZWNrIHRoZSB3aW5kb3cgc2l6ZS4KCSAgKHRlcm0tY2hlY2stc2l6ZSBw cm9jKSkKCgk7OyBTY3JvbGwgZWFjaCB3aW5kb3cgZGlzcGxheWluZyB0aGUgYnVmZmVyIGJ1 dCAoYnkgZGVmYXVsdCkKCTs7IG9ubHkgaWYgdGhlIHBvaW50IG1hdGNoZXMgdGhlIHByb2Nl c3MtbWFyayB3ZSBzdGFydGVkIHdpdGguCgkoc2V0cSB3aW4gc2VsZWN0ZWQpCgk7OyBBdm9p ZCBpbmZpbml0ZSBsb29wIGluIHN0cmFuZ2UgY2FzZSB3aGVyZSBtaW5pYnVmZmVyIHdpbmRv dwoJOzsgaXMgc2VsZWN0ZWQgYnV0IG5vdCBhY3RpdmUuCgkod2hpbGUgKHdpbmRvdy1taW5p YnVmZmVyLXAgd2luKQoJICAoc2V0cSB3aW4gKG5leHQtd2luZG93IHdpbiBuaWwgdCkpKQoJ KHNldHEgbGFzdC13aW4gd2luKQoJKHdoaWxlIChwcm9nbgoJCSAoc2V0cSB3aW4gKG5leHQt d2luZG93IHdpbiBuaWwgdCkpCgkJICh3aGVuIChlcSAod2luZG93LWJ1ZmZlciB3aW4pIChw cm9jZXNzLWJ1ZmZlciBwcm9jKSkKCQkgICAobGV0ICgoc2Nyb2xsIHRlcm0tc2Nyb2xsLXRv LWJvdHRvbS1vbi1vdXRwdXQpKQoJCSAgICAgKHNlbGVjdC13aW5kb3cgd2luKQoJCSAgICAg KHdoZW4gKG9yICg9IChwb2ludCkgc2F2ZS1tYXJrZXIpCgkJCSAgICAgICAoZXEgc2Nyb2xs IHQpIChlcSBzY3JvbGwgJ2FsbCkKCQkJICAgICAgIDs7IE1heWJlIHVzZXIgd2FudHMgcG9p bnQgdG8ganVtcCB0byB0aGUgZW5kLgoJCQkgICAgICAgKGFuZCAoZXEgc2VsZWN0ZWQgd2lu KQoJCQkJICAgIChvciAoZXEgc2Nyb2xsICd0aGlzKSAobm90IHNhdmUtcG9pbnQpKSkKCQkJ ICAgICAgIChhbmQgKGVxIHNjcm9sbCAnb3RoZXJzKQoJCQkJICAgIChub3QgKGVxIHNlbGVj dGVkIHdpbikpKSkKCQkgICAgICAgKGdvdG8tY2hhciB0ZXJtLWhvbWUtbWFya2VyKQoJCSAg ICAgICAocmVjZW50ZXIgMCkKCQkgICAgICAgKGdvdG8tY2hhciAocHJvY2Vzcy1tYXJrIHBy b2MpKQoJCSAgICAgICAoaWYgKG5vdCAocG9zLXZpc2libGUtaW4td2luZG93LXAgKHBvaW50 KSB3aW4pKQoJCQkgICAocmVjZW50ZXIgLTEpKSkKCQkgICAgIDs7IE9wdGlvbmFsbHkgc2Ny b2xsIHNvIHRoYXQgdGhlIHRleHQKCQkgICAgIDs7IGVuZHMgYXQgdGhlIGJvdHRvbSBvZiB0 aGUgd2luZG93LgoJCSAgICAgKHdoZW4gKGFuZCB0ZXJtLXNjcm9sbC1zaG93LW1heGltdW0t b3V0cHV0CgkJCQkoPj0gKHBvaW50KSAocHJvY2Vzcy1tYXJrIHByb2MpKSkKCQkgICAgICAg KHNhdmUtZXhjdXJzaW9uCgkJCSAoZ290by1jaGFyIChwb2ludC1tYXgpKQoJCQkgKHJlY2Vu dGVyIC0xKSkpKSkKCQkgKG5vdCAoZXEgd2luIGxhc3Qtd2luKSkpKQoKOzs7IFN0b2xlbiBm cm9tIGNvbWludC5lbCBhbmQgYWRhcHRlZCAtbW0KCSh3aGVuICg+IHRlcm0tYnVmZmVyLW1h eGltdW0tc2l6ZSAwKQoJICAoc2F2ZS1leGN1cnNpb24KCSAgICAoZ290by1jaGFyIChwcm9j ZXNzLW1hcmsgKGdldC1idWZmZXItcHJvY2VzcyAoY3VycmVudC1idWZmZXIpKSkpCgkgICAg KGZvcndhcmQtbGluZSAoLSB0ZXJtLWJ1ZmZlci1tYXhpbXVtLXNpemUpKQoJICAgIChiZWdp bm5pbmctb2YtbGluZSkKCSAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQtbWluKSAocG9pbnQp KSkpCgkoc2V0LW1hcmtlciBzYXZlLW1hcmtlciBuaWwpKSkKICAgIDs7IFRoaXMgbWlnaHQg YmUgZXhwZW5zaXZlLCBidXQgd2UgbmVlZCBpdCB0byBoYW5kbGUgc29tZXRoaW5nCiAgICA7 OyBsaWtlIGBzbGVlcCA1IHwgbGVzcyAtYycgaW4gbW9yZS1vci1sZXNzIHJlYWwgdGltZS4K ICAgICh3aGVuIChnZXQtYnVmZmVyLXdpbmRvdyAoY3VycmVudC1idWZmZXIpKQogICAgICAo cmVkaXNwbGF5KSkpKQoKKGRlZnVuIHRlcm0taGFuZGxlLWRlZmVycmVkLXNjcm9sbCAoKQog IChsZXQgKChjb3VudCAoLSAodGVybS1jdXJyZW50LXJvdykgdGVybS1oZWlnaHQpKSkKICAg ICh3aGVuICg+PSBjb3VudCAwKQogICAgICAoc2F2ZS1leGN1cnNpb24KCShnb3RvLWNoYXIg dGVybS1ob21lLW1hcmtlcikKCSh0ZXJtLXZlcnRpY2FsLW1vdGlvbiAoMSsgY291bnQpKQoJ KHNldC1tYXJrZXIgdGVybS1ob21lLW1hcmtlciAocG9pbnQpKQoJKHNldHEgdGVybS1jdXJy ZW50LXJvdyAoMS0gdGVybS1oZWlnaHQpKSkpKSkKCjs7OyBSZXNldCB0aGUgdGVybWluYWws IGRlbGV0ZSBhbGwgdGhlIGNvbnRlbnQgYW5kIHNldCB0aGUgZmFjZSB0byB0aGUKOzs7IGRl ZmF1bHQgb25lLgooZGVmdW4gdGVybS1yZXNldC10ZXJtaW5hbCAoKQogIChlcmFzZS1idWZm ZXIpCiAgKHNldHEgdGVybS1jdXJyZW50LXJvdyAwKQogIChzZXRxIHRlcm0tY3VycmVudC1j b2x1bW4gMSkKICAoc2V0cSB0ZXJtLXNjcm9sbC1zdGFydCAwKQogIChzZXRxIHRlcm0tc2Ny b2xsLWVuZCB0ZXJtLWhlaWdodCkKICAoc2V0cSB0ZXJtLWluc2VydC1tb2RlIG5pbCkKICAo c2V0cSB0ZXJtLWN1cnJlbnQtZmFjZSAobGlzdCA6YmFja2dyb3VuZCB0ZXJtLWRlZmF1bHQt YmctY29sb3IKCQkJCTpmb3JlZ3JvdW5kIHRlcm0tZGVmYXVsdC1mZy1jb2xvcikpCiAgKHNl dHEgdGVybS1hbnNpLWN1cnJlbnQtdW5kZXJsaW5lIG5pbCkKICAoc2V0cSB0ZXJtLWFuc2kt Y3VycmVudC1ib2xkIG5pbCkKICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVudC1yZXZlcnNlIG5p bCkKICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVudC1jb2xvciAwKQogIChzZXRxIHRlcm0tYW5z aS1jdXJyZW50LWludmlzaWJsZSBuaWwpCiAgKHNldHEgdGVybS1hbnNpLWZhY2UtYWxyZWFk eS1kb25lIG5pbCkKICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVudC1iZy1jb2xvciAwKSkKCjs7 OyBOZXcgZnVuY3Rpb24gdG8gZGVhbCB3aXRoIGFuc2kgY29sb3JpemVkIG91dHB1dCwgYXMg eW91IGNhbiBzZWUgeW91IGNhbgo7OzsgaGF2ZSBhbnkgYm9sZC91bmRlcmxpbmUvZmcvYmcv cmV2ZXJzZSBjb21iaW5hdGlvbi4gLW1tCgooZGVmdW4gdGVybS1oYW5kbGUtY29sb3JzLWFy cmF5IChwYXJhbWV0ZXIpCiAgKGNvbmQKCjs7OyBCb2xkICAodGVybWluZm86IGJvbGQpCiAg ICgoZXEgcGFyYW1ldGVyIDEpCiAgICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVudC1ib2xkIHQp KQoKOzs7IFVuZGVybGluZQogICAoKGVxIHBhcmFtZXRlciA0KQogICAgKHNldHEgdGVybS1h bnNpLWN1cnJlbnQtdW5kZXJsaW5lIHQpKQoKOzs7IEJsaW5rICh1bnN1cHBvcnRlZCBieSBF bWFjcyksIHdpbGwgYmUgdHJhbnNsYXRlZCB0byBib2xkLgo7OzsgVGhpcyBtYXkgY2hhbmdl IGluIHRoZSBmdXR1cmUgdGhvdWdoLgogICAoKGVxIHBhcmFtZXRlciA1KQogICAgKHNldHEg dGVybS1hbnNpLWN1cnJlbnQtYm9sZCB0KSkKCjs7OyBSZXZlcnNlICh0ZXJtaW5mbzogc21z bykKICAgKChlcSBwYXJhbWV0ZXIgNykKICAgIChzZXRxIHRlcm0tYW5zaS1jdXJyZW50LXJl dmVyc2UgdCkpCgo7OzsgSW52aXNpYmxlCiAgICgoZXEgcGFyYW1ldGVyIDgpCiAgICAoc2V0 cSB0ZXJtLWFuc2ktY3VycmVudC1pbnZpc2libGUgdCkpCgo7OzsgUmVzZXQgdW5kZXJsaW5l ICh0ZXJtaW5mbzogcm11bCkKICAgKChlcSBwYXJhbWV0ZXIgMjQpCiAgICAoc2V0cSB0ZXJt LWFuc2ktY3VycmVudC11bmRlcmxpbmUgbmlsKSkKCjs7OyBSZXNldCByZXZlcnNlICh0ZXJt aW5mbzogcm1zbykKICAgKChlcSBwYXJhbWV0ZXIgMjcpCiAgICAoc2V0cSB0ZXJtLWFuc2kt Y3VycmVudC1yZXZlcnNlIG5pbCkpCgo7OzsgRm9yZWdyb3VuZAogICAoKGFuZCAoPj0gcGFy YW1ldGVyIDMwKSAoPD0gcGFyYW1ldGVyIDM3KSkKICAgIChzZXRxIHRlcm0tYW5zaS1jdXJy ZW50LWNvbG9yICgtIHBhcmFtZXRlciAyOSkpKQoKOzs7IFJlc2V0IGZvcmVncm91bmQKICAg KChlcSBwYXJhbWV0ZXIgMzkpCiAgICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVudC1jb2xvciAw KSkKCjs7OyBCYWNrZ3JvdW5kCiAgICgoYW5kICg+PSBwYXJhbWV0ZXIgNDApICg8PSBwYXJh bWV0ZXIgNDcpKQogICAgKHNldHEgdGVybS1hbnNpLWN1cnJlbnQtYmctY29sb3IgKC0gcGFy YW1ldGVyIDM5KSkpCgo7OzsgUmVzZXQgYmFja2dyb3VuZAogICAoKGVxIHBhcmFtZXRlciA0 OSkKICAgIChzZXRxIHRlcm0tYW5zaS1jdXJyZW50LWJnLWNvbG9yIDApKQoKOzs7IDAgKFJl c2V0KSBvciB1bmtub3duIChyZXNldCBhbnl3YXkpCiAgICh0CiAgICAoc2V0cSB0ZXJtLWN1 cnJlbnQtZmFjZSAobGlzdCA6YmFja2dyb3VuZCB0ZXJtLWRlZmF1bHQtYmctY29sb3IKCQkJ CSAgOmZvcmVncm91bmQgdGVybS1kZWZhdWx0LWZnLWNvbG9yKSkKICAgIChzZXRxIHRlcm0t YW5zaS1jdXJyZW50LXVuZGVybGluZSBuaWwpCiAgICAoc2V0cSB0ZXJtLWFuc2ktY3VycmVu dC1ib2xkIG5pbCkKICAgIChzZXRxIHRlcm0tYW5zaS1jdXJyZW50LXJldmVyc2UgbmlsKQog ICAgKHNldHEgdGVybS1hbnNpLWN1cnJlbnQtY29sb3IgMCkKICAgIChzZXRxIHRlcm0tYW5z aS1jdXJyZW50LWludmlzaWJsZSBuaWwpCiAgICAoc2V0cSB0ZXJtLWFuc2ktZmFjZS1hbHJl YWR5LWRvbmUgdCkKICAgIChzZXRxIHRlcm0tYW5zaS1jdXJyZW50LWJnLWNvbG9yIDApKSkK CjsJKG1lc3NhZ2UgIkRlYnVnOiBVLSVkIFItJWQgQi0lZCBJLSVkIEQtJWQgRi0lZCBCLSVk Igo7CQkgICB0ZXJtLWFuc2ktY3VycmVudC11bmRlcmxpbmUKOwkJICAgdGVybS1hbnNpLWN1 cnJlbnQtcmV2ZXJzZQo7CQkgICB0ZXJtLWFuc2ktY3VycmVudC1ib2xkCjsJCSAgIHRlcm0t YW5zaS1jdXJyZW50LWludmlzaWJsZQo7CQkgICB0ZXJtLWFuc2ktZmFjZS1hbHJlYWR5LWRv bmUKOwkJICAgdGVybS1hbnNpLWN1cnJlbnQtY29sb3IKOwkJICAgdGVybS1hbnNpLWN1cnJl bnQtYmctY29sb3IpCgoKICAodW5sZXNzIHRlcm0tYW5zaS1mYWNlLWFscmVhZHktZG9uZQog ICAgICAoaWYgdGVybS1hbnNpLWN1cnJlbnQtcmV2ZXJzZQoJICAoaWYgdGVybS1hbnNpLWN1 cnJlbnQtaW52aXNpYmxlCgkgICAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtZmFjZQoJCSAgICAo aWYgKD0gdGVybS1hbnNpLWN1cnJlbnQtY29sb3IgMCkKCQkJKGxpc3QgOmJhY2tncm91bmQK CQkJICAgICAgdGVybS1kZWZhdWx0LWZnLWNvbG9yCgkJCSAgICAgIDpmb3JlZ3JvdW5kCgkJ CSAgICAgIHRlcm0tZGVmYXVsdC1mZy1jb2xvcikKCQkgICAgICAobGlzdCA6YmFja2dyb3Vu ZAoJCQkgICAgKGVsdCBhbnNpLXRlcm0tY29sb3ItdmVjdG9yIHRlcm0tYW5zaS1jdXJyZW50 LWNvbG9yKQoJCQkgICAgOmZvcmVncm91bmQKCQkJICAgIChlbHQgYW5zaS10ZXJtLWNvbG9y LXZlY3RvciB0ZXJtLWFuc2ktY3VycmVudC1jb2xvcikpKQoJCSAgICA7OyBObyBuZWVkIHRv IGJvdGhlciB3aXRoIGFueXRoaW5nIGVsc2UgaWYgaXQncyBpbnZpc2libGUKCQkgICAgKQoJ ICAgIChzZXRxIHRlcm0tY3VycmVudC1mYWNlCgkJICAobGlzdCA6YmFja2dyb3VuZAoJCQko aWYgKD0gdGVybS1hbnNpLWN1cnJlbnQtY29sb3IgMCkKCQkJICAgIHRlcm0tZGVmYXVsdC1m Zy1jb2xvcgoJCQkgIChlbHQgYW5zaS10ZXJtLWNvbG9yLXZlY3RvciB0ZXJtLWFuc2ktY3Vy cmVudC1jb2xvcikpCgkJCTpmb3JlZ3JvdW5kCgkJCShpZiAoPSB0ZXJtLWFuc2ktY3VycmVu dC1iZy1jb2xvciAwKQoJCQkgICAgdGVybS1kZWZhdWx0LWJnLWNvbG9yCgkJCSAgKGVsdCBh bnNpLXRlcm0tY29sb3ItdmVjdG9yIHRlcm0tYW5zaS1jdXJyZW50LWJnLWNvbG9yKSkpKQoJ ICAgICh3aGVuIHRlcm0tYW5zaS1jdXJyZW50LWJvbGQKCSAgICAgIChzZXRxIHRlcm0tY3Vy cmVudC1mYWNlCgkJICAgIChhcHBlbmQgJyg6d2VpZ2h0IGJvbGQpIHRlcm0tY3VycmVudC1m YWNlKSkpCgkgICAgKHdoZW4gdGVybS1hbnNpLWN1cnJlbnQtdW5kZXJsaW5lCgkgICAgICAo c2V0cSB0ZXJtLWN1cnJlbnQtZmFjZQoJCSAgICAoYXBwZW5kICcoOnVuZGVybGluZSB0KSB0 ZXJtLWN1cnJlbnQtZmFjZSkpKSkKCShpZiB0ZXJtLWFuc2ktY3VycmVudC1pbnZpc2libGUK CSAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtZmFjZQoJCSAgKGlmICg9IHRlcm0tYW5zaS1jdXJy ZW50LWJnLWNvbG9yIDApCgkJICAgICAgKGxpc3QgOmJhY2tncm91bmQKCQkJICAgIHRlcm0t ZGVmYXVsdC1iZy1jb2xvcgoJCQkgICAgOmZvcmVncm91bmQKCQkJICAgIHRlcm0tZGVmYXVs dC1iZy1jb2xvcikKCQkgICAgKGxpc3QgOmZvcmVncm91bmQKCQkJICAoZWx0IGFuc2ktdGVy bS1jb2xvci12ZWN0b3IgdGVybS1hbnNpLWN1cnJlbnQtYmctY29sb3IpCgkJCSAgOmJhY2tn cm91bmQKCQkJICAoZWx0IGFuc2ktdGVybS1jb2xvci12ZWN0b3IgdGVybS1hbnNpLWN1cnJl bnQtYmctY29sb3IpKSkKCQkgIDs7IE5vIG5lZWQgdG8gYm90aGVyIHdpdGggYW55dGhpbmcg ZWxzZSBpZiBpdCdzIGludmlzaWJsZQoJCSAgKQoJICAoc2V0cSB0ZXJtLWN1cnJlbnQtZmFj ZQoJCShsaXN0IDpmb3JlZ3JvdW5kCgkJICAgICAgKGlmICg9IHRlcm0tYW5zaS1jdXJyZW50 LWNvbG9yIDApCgkJCSAgdGVybS1kZWZhdWx0LWZnLWNvbG9yCgkJCShlbHQgYW5zaS10ZXJt LWNvbG9yLXZlY3RvciB0ZXJtLWFuc2ktY3VycmVudC1jb2xvcikpCgkJICAgICAgOmJhY2tn cm91bmQKCQkgICAgICAoaWYgKD0gdGVybS1hbnNpLWN1cnJlbnQtYmctY29sb3IgMCkKCQkJ ICB0ZXJtLWRlZmF1bHQtYmctY29sb3IKCQkJKGVsdCBhbnNpLXRlcm0tY29sb3ItdmVjdG9y IHRlcm0tYW5zaS1jdXJyZW50LWJnLWNvbG9yKSkpKQoJICAod2hlbiB0ZXJtLWFuc2ktY3Vy cmVudC1ib2xkCgkgICAgKHNldHEgdGVybS1jdXJyZW50LWZhY2UKCQkgIChhcHBlbmQgJyg6 d2VpZ2h0IGJvbGQpIHRlcm0tY3VycmVudC1mYWNlKSkpCgkgICh3aGVuIHRlcm0tYW5zaS1j dXJyZW50LXVuZGVybGluZQoJICAgIChzZXRxIHRlcm0tY3VycmVudC1mYWNlCgkJICAoYXBw ZW5kICcoOnVuZGVybGluZSB0KSB0ZXJtLWN1cnJlbnQtZmFjZSkpKSkpKQoKOzs7CShtZXNz YWdlICJEZWJ1ZyAlUyIgdGVybS1jdXJyZW50LWZhY2UpCiAgKHNldHEgdGVybS1hbnNpLWZh Y2UtYWxyZWFkeS1kb25lIG5pbCkpCgoKOzs7IEhhbmRsZSBhIGNoYXJhY3RlciBhc3N1bWlu ZyAoZXEgdGVybWluYWwtc3RhdGUgMikgLQo7OzsgaS5lLiB3ZSBoYXZlIHByZXZpb3VzbHkg c2VlbiBFc2NhcGUgZm9sbG93ZWQgYnkgP1suCgooZGVmdW4gdGVybS1oYW5kbGUtYW5zaS1l c2NhcGUgKHByb2MgY2hhcikKICAoY29uZAogICAoKG9yIChlcSBjaGFyID9IKSAgOzsgY3Vy c29yIG1vdGlvbiAodGVybWluZm86IGN1cCxob21lKQoJOzsgKGVxIGNoYXIgP2YpIDs7IHh0 ZXJtIHNlZW1zIHRvIGhhbmRsZSB0aGlzIHNlcXVlbmNlIHRvbywgbm90Cgk7OyBuZWVkZWQg Zm9yIG5vdwoJKQogICAgKHdoZW4gKDw9IHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIDApCiAg ICAgIChzZXRxIHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIDEpKQogICAgKHdoZW4gKDw9IHRl cm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyIDApCiAgICAgIChzZXRxIHRlcm0tdGVy bWluYWwtcHJldmlvdXMtcGFyYW1ldGVyIDEpKQogICAgKHdoZW4gKD4gdGVybS10ZXJtaW5h bC1wcmV2aW91cy1wYXJhbWV0ZXIgdGVybS1oZWlnaHQpCiAgICAgIChzZXRxIHRlcm0tdGVy bWluYWwtcHJldmlvdXMtcGFyYW1ldGVyIHRlcm0taGVpZ2h0KSkKICAgICh3aGVuICg+IHRl cm0tdGVybWluYWwtcGFyYW1ldGVyIHRlcm0td2lkdGgpCiAgICAgIChzZXRxIHRlcm0tdGVy bWluYWwtcGFyYW1ldGVyIHRlcm0td2lkdGgpKQogICAgKHRlcm0tZ290bwogICAgICgxLSB0 ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlcikKICAgICAoMS0gdGVybS10ZXJtaW5h bC1wYXJhbWV0ZXIpKSkKICAgOzsgXEVbQSAtIGN1cnNvciB1cCAodGVybWluZm86IGN1dSwg Y3V1MSkKICAgKChlcSBjaGFyID9BKQogICAgKHRlcm0taGFuZGxlLWRlZmVycmVkLXNjcm9s bCkKICAgIChsZXQgKCh0Y3IgKHRlcm0tY3VycmVudC1yb3cpKSkKICAgICAgKHRlcm0tZG93 bgogICAgICAgKGlmICg8ICgtIHRjciB0ZXJtLXRlcm1pbmFsLXBhcmFtZXRlcikgdGVybS1z Y3JvbGwtc3RhcnQpCgkgICA7OyBJZiB0aGUgYW1vdW50IHRvIG1vdmUgaXMgYmVmb3JlIHNj cm9sbCBzdGFydCwgbW92ZQoJICAgOzsgdG8gc2Nyb2xsIHN0YXJ0LgoJICAgKC0gdGVybS1z Y3JvbGwtc3RhcnQgdGNyKQoJIChpZiAoPj0gdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIgdGNy KQoJICAgICAoLSB0Y3IpCgkgICAoLSAobWF4IDEgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIp KSkpIHQpKSkKICAgOzsgXEVbQiAtIGN1cnNvciBkb3duICh0ZXJtaW5mbzogY3VkKQogICAo KGVxIGNoYXIgP0IpCiAgICAobGV0ICgodGNyICh0ZXJtLWN1cnJlbnQtcm93KSkpCiAgICAg ICh1bmxlc3MgKD0gdGNyICgxLSB0ZXJtLXNjcm9sbC1lbmQpKQoJKHRlcm0tZG93bgoJIChp ZiAoPiAoKyB0Y3IgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIpIHRlcm0tc2Nyb2xsLWVuZCkK CSAgICAgKC0gdGVybS1zY3JvbGwtZW5kIDEgdGNyKQoJICAgKG1heCAxIHRlcm0tdGVybWlu YWwtcGFyYW1ldGVyKSkgdCkpKSkKICAgOzsgXEVbQyAtIGN1cnNvciByaWdodCAodGVybWlu Zm86IGN1ZiwgY3VmMSkKICAgKChlcSBjaGFyID9DKQogICAgKHRlcm0tbW92ZS1jb2x1bW5z CiAgICAgKG1heCAxCgkgIChpZiAoPj0gKCsgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIgKHRl cm0tY3VycmVudC1jb2x1bW4pKSB0ZXJtLXdpZHRoKQoJICAgICAgKC0gdGVybS13aWR0aCAo dGVybS1jdXJyZW50LWNvbHVtbikgIDEpCgkgICAgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIp KSkpCiAgIDs7IFxFW0QgLSBjdXJzb3IgbGVmdCAodGVybWluZm86IGN1YikKICAgKChlcSBj aGFyID9EKQogICAgKHRlcm0tbW92ZS1jb2x1bW5zICgtIChtYXggMSB0ZXJtLXRlcm1pbmFs LXBhcmFtZXRlcikpKSkKICAgOzsgXEVbSiAtIGNsZWFyIHRvIGVuZCBvZiBzY3JlZW4gKHRl cm1pbmZvOiBlZCwgY2xlYXIpCiAgICgoZXEgY2hhciA/SikKICAgICh0ZXJtLWVyYXNlLWlu LWRpc3BsYXkgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIpKQogICA7OyBcRVtLIC0gY2xlYXIg dG8gZW5kIG9mIGxpbmUgKHRlcm1pbmZvOiBlbCwgZWwxKQogICAoKGVxIGNoYXIgP0spCiAg ICAodGVybS1lcmFzZS1pbi1saW5lIHRlcm0tdGVybWluYWwtcGFyYW1ldGVyKSkKICAgOzsg XEVbTCAtIGluc2VydCBsaW5lcyAodGVybWluZm86IGlsLCBpbDEpCiAgICgoZXEgY2hhciA/ TCkKICAgICh0ZXJtLWluc2VydC1saW5lcyAobWF4IDEgdGVybS10ZXJtaW5hbC1wYXJhbWV0 ZXIpKSkKICAgOzsgXEVbTSAtIGRlbGV0ZSBsaW5lcyAodGVybWluZm86IGRsLCBkbDEpCiAg ICgoZXEgY2hhciA/TSkKICAgICh0ZXJtLWRlbGV0ZS1saW5lcyAobWF4IDEgdGVybS10ZXJt aW5hbC1wYXJhbWV0ZXIpKSkKICAgOzsgXEVbUCAtIGRlbGV0ZSBjaGFycyAodGVybWluZm86 IGRjaCwgZGNoMSkKICAgKChlcSBjaGFyID9QKQogICAgKHRlcm0tZGVsZXRlLWNoYXJzICht YXggMSB0ZXJtLXRlcm1pbmFsLXBhcmFtZXRlcikpKQogICA7OyBcRVtAIC0gaW5zZXJ0IHNw YWNlcyAodGVybWluZm86IGljaCkKICAgKChlcSBjaGFyID9AKQogICAgKHRlcm0taW5zZXJ0 LXNwYWNlcyAobWF4IDEgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIpKSkKICAgOzsgXEVbP2gg LSBERUMgUHJpdmF0ZSBNb2RlIFNldAogICAoKGVxIGNoYXIgP2gpCiAgICAoY29uZCAoKGVx IHRlcm0tdGVybWluYWwtcGFyYW1ldGVyIDQpICA7OyAodGVybWluZm86IHNtaXIpCgkgICAo c2V0cSB0ZXJtLWluc2VydC1tb2RlIHQpKQoJICA7OyAoKGVxIHRlcm0tdGVybWluYWwtcGFy YW1ldGVyIDQ3KSA7OyAodGVybWluZm86IHNtY3VwKQoJICA7OyAodGVybS1zd2l0Y2gtdG8t YWx0ZXJuYXRlLXN1Yi1idWZmZXIgdCkpCgkgICkpCiAgIDs7IFxFWz9sIC0gREVDIFByaXZh dGUgTW9kZSBSZXNldAogICAoKGVxIGNoYXIgP2wpCiAgICAoY29uZCAoKGVxIHRlcm0tdGVy bWluYWwtcGFyYW1ldGVyIDQpICA7OyAodGVybWluZm86IHJtaXIpCgkgICAoc2V0cSB0ZXJt LWluc2VydC1tb2RlIG5pbCkpCgkgIDs7ICgoZXEgdGVybS10ZXJtaW5hbC1wYXJhbWV0ZXIg NDcpIDs7ICh0ZXJtaW5mbzogcm1jdXApCgkgIDs7ICh0ZXJtLXN3aXRjaC10by1hbHRlcm5h dGUtc3ViLWJ1ZmZlciBuaWwpKQoJICApKQoKOzs7IE1vZGlmaWVkIHRvIGFsbG93IGFuc2kg Y29sb3JpbmcgLW1tCiAgIDs7IFxFW20gLSBTZXQvcmVzZXQgbW9kZXMsIHNldCBiZy9mZwog ICA7Oyh0ZXJtaW5mbzogc21zbyxybXNvLHNtdWwscm11bCxyZXYsYm9sZCxzZ3IwLGludmlz LG9wLHNldGFiLHNldGFmKQogICAoKGVxIGNoYXIgP20pCiAgICAod2hlbiAoPSB0ZXJtLXRl cm1pbmFsLW1vcmUtcGFyYW1ldGVycyAxKQogICAgICAod2hlbiAoPj0gdGVybS10ZXJtaW5h bC1wcmV2aW91cy1wYXJhbWV0ZXItNCAwKQoJKHRlcm0taGFuZGxlLWNvbG9ycy1hcnJheSB0 ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlci00KSkKICAgICAgKHdoZW4gKD49IHRl cm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyLTMgMCkKCSh0ZXJtLWhhbmRsZS1jb2xv cnMtYXJyYXkgdGVybS10ZXJtaW5hbC1wcmV2aW91cy1wYXJhbWV0ZXItMykpCiAgICAgICh3 aGVuICg+PSB0ZXJtLXRlcm1pbmFsLXByZXZpb3VzLXBhcmFtZXRlci0yIDApCgkodGVybS1o YW5kbGUtY29sb3JzLWFycmF5IHRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyLTIp KQogICAgICAodGVybS1oYW5kbGUtY29sb3JzLWFycmF5IHRlcm0tdGVybWluYWwtcHJldmlv dXMtcGFyYW1ldGVyKSkKICAgICh0ZXJtLWhhbmRsZS1jb2xvcnMtYXJyYXkgdGVybS10ZXJt aW5hbC1wYXJhbWV0ZXIpKQoKICAgOzsgXEVbNm4gLSBSZXBvcnQgY3Vyc29yIHBvc2l0aW9u CiAgICgoZXEgY2hhciA/bikKICAgICh0ZXJtLWhhbmRsZS1kZWZlcnJlZC1zY3JvbGwpCiAg ICAocHJvY2Vzcy1zZW5kLXN0cmluZyBwcm9jCgkJCSAoZm9ybWF0ICJcZVslczslc1IiCgkJ CQkgKDErICh0ZXJtLWN1cnJlbnQtcm93KSkKCQkJCSAoMSsgKHRlcm0taG9yaXpvbnRhbC1j b2x1bW4pKSkpKQogICA7OyBcRVtyIC0gU2V0IHNjcm9sbGluZyByZWdpb24gKHRlcm1pbmZv OiBjc3IpCiAgICgoZXEgY2hhciA/cikKICAgICh0ZXJtLXNldC1zY3JvbGwtcmVnaW9uCiAg ICAgKDEtIHRlcm0tdGVybWluYWwtcHJldmlvdXMtcGFyYW1ldGVyKQogICAgICgxLSB0ZXJt LXRlcm1pbmFsLXBhcmFtZXRlcikpKQogICAodCkpKQoKKGRlZnVuIHRlcm0tc2V0LXNjcm9s bC1yZWdpb24gKHRvcCBib3R0b20pCiAgIlNldCBzY3JvbGxpbmcgcmVnaW9uLgpUT1AgaXMg dGhlIHRvcC1tb3N0IGxpbmUgKGluY2x1c2l2ZSkgb2YgdGhlIG5ldyBzY3JvbGxpbmcgcmVn aW9uLAp3aGlsZSBCT1RUT00gaXMgdGhlIGxpbmUgZm9sbG93aW5nIHRoZSBuZXcgc2Nyb2xs aW5nIHJlZ2lvbiAoZS5nLiBleGNsdXNpdmUpLgpUaGUgdG9wLW1vc3QgbGluZSBpcyBsaW5l IDAuIgogIChzZXRxIHRlcm0tc2Nyb2xsLXN0YXJ0CgkoaWYgKG9yICg8IHRvcCAwKSAoPj0g dG9wIHRlcm0taGVpZ2h0KSkKCSAgICAwCgkgIHRvcCkpCiAgKHNldHEgdGVybS1zY3JvbGwt ZW5kCgkoaWYgKG9yICg8PSBib3R0b20gdGVybS1zY3JvbGwtc3RhcnQpICg+IGJvdHRvbSB0 ZXJtLWhlaWdodCkpCgkgICAgdGVybS1oZWlnaHQKCSAgYm90dG9tKSkKICAoc2V0cSB0ZXJt LXNjcm9sbC13aXRoLWRlbGV0ZQoJKG9yICh0ZXJtLXVzaW5nLWFsdGVybmF0ZS1zdWItYnVm ZmVyKQoJICAgIChub3QgKGFuZCAoPSB0ZXJtLXNjcm9sbC1zdGFydCAwKQoJCSAgICAgICg9 IHRlcm0tc2Nyb2xsLWVuZCB0ZXJtLWhlaWdodCkpKSkpCiAgKHRlcm0tbW92ZS1jb2x1bW5z ICgtICh0ZXJtLWN1cnJlbnQtY29sdW1uKSkpCiAgKHRlcm0tZ290byAwIDApKQoKOzsgKGRl ZnVuIHRlcm0tc3dpdGNoLXRvLWFsdGVybmF0ZS1zdWItYnVmZmVyIChzZXQpCjs7ICAgOzsg SWYgYXNrZWQgdG8gc3dpdGNoIHRvIChmcm9tKSB0aGUgYWx0ZXJuYXRlIHN1Yi1idWZmZXIs IGFuZCBhbHJlYWR5IChub3QpCjs7ICAgOzsgdXNpbmcgaXQsIGRvIG5vdGhpbmcuICBUaGlz IHRlc3QgaXMgbmVlZGVkIGZvciBzb21lIHByb2dyYW1zIChpbmNsdWRpbmcKOzsgICA7OyBF bWFjcykgdGhhdCBlbWl0IHRoZSB0aSB0ZXJtY2FwIHN0cmluZyB0d2ljZSwgZm9yIHVua25v d24gcmVhc29uLgo7OyAgICh0ZXJtLWhhbmRsZS1kZWZlcnJlZC1zY3JvbGwpCjs7ICAgKGlm IChlcSBzZXQgKG5vdCAodGVybS11c2luZy1hbHRlcm5hdGUtc3ViLWJ1ZmZlcikpKQo7OyAg ICAgICAobGV0ICgocm93ICh0ZXJtLWN1cnJlbnQtcm93KSkKOzsgCSAgICAoY29sICh0ZXJt LWhvcml6b250YWwtY29sdW1uKSkpCjs7IAkoY29uZCAoc2V0Cjs7IAkgICAgICAgKGdvdG8t Y2hhciAocG9pbnQtbWF4KSkKOzsgCSAgICAgICAoaWYgKG5vdCAoZXEgKHByZWNlZGluZy1j aGFyKSA/XG4pKQo7OyAJCSAgICh0ZXJtLWluc2VydC1jaGFyID9cbiAxKSkKOzsgCSAgICAg ICAoc2V0cSB0ZXJtLXNjcm9sbC13aXRoLWRlbGV0ZSB0KQo7OyAJICAgICAgIChzZXRxIHRl cm0tc2F2ZWQtaG9tZS1tYXJrZXIgKGNvcHktbWFya2VyIHRlcm0taG9tZS1tYXJrZXIpKQo7 OyAJICAgICAgIChzZXQtbWFya2VyIHRlcm0taG9tZS1tYXJrZXIgKHBvaW50KSkpCjs7IAkg ICAgICAodAo7OyAJICAgICAgIChzZXRxIHRlcm0tc2Nyb2xsLXdpdGgtZGVsZXRlCjs7IAkJ ICAgICAobm90IChhbmQgKD0gdGVybS1zY3JvbGwtc3RhcnQgMCkKOzsgCQkJICAgICAgICg9 IHRlcm0tc2Nyb2xsLWVuZCB0ZXJtLWhlaWdodCkpKSkKOzsgCSAgICAgICAoc2V0LW1hcmtl ciB0ZXJtLWhvbWUtbWFya2VyIHRlcm0tc2F2ZWQtaG9tZS1tYXJrZXIpCjs7IAkgICAgICAg KHNldC1tYXJrZXIgdGVybS1zYXZlZC1ob21lLW1hcmtlciBuaWwpCjs7IAkgICAgICAgKHNl dHEgdGVybS1zYXZlZC1ob21lLW1hcmtlciBuaWwpCjs7IAkgICAgICAgKGdvdG8tY2hhciB0 ZXJtLWhvbWUtbWFya2VyKSkpCjs7IAkoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIG5pbCkK OzsgCShzZXRxIHRlcm0tY3VycmVudC1yb3cgMCkKOzsgCSh0ZXJtLWdvdG8gcm93IGNvbCkp KSkKCjs7IERlZmF1bHQgdmFsdWUgZm9yIHRoZSBzeW1ib2wgdGVybS1jb21tYW5kLWhvb2su CgooZGVmdW4gdGVybS1jb21tYW5kLWhvb2sgKHN0cmluZykKICAoY29uZCAoKGVxdWFsIHN0 cmluZyAiIikKCSB0KQoJKCg9IChhcmVmIHN0cmluZyAwKSA/XDAzMikKCSA7OyBnZGIgKHdo ZW4gaW52b2tlZCB3aXRoIC1mdWxsbmFtZSkgcHJpbnRzOgoJIDs7IFwwMzJcMDMyRlVMTEZJ TEVOQU1FOkxJTkVOVU1CRVI6Q0hBUlBPUzpCRUdfT1JfTUlERExFOlBDXG4KCSAobGV0KiAo KGZpcnN0LWNvbG9uIChzdHJpbmctbWF0Y2ggIjoiIHN0cmluZyAxKSkKCQkoc2Vjb25kLWNv bG9uCgkJIChzdHJpbmctbWF0Y2ggIjoiIHN0cmluZyAoMSsgZmlyc3QtY29sb24pKSkKCQko ZmlsZW5hbWUgKHN1YnN0cmluZyBzdHJpbmcgMSBmaXJzdC1jb2xvbikpCgkJKGZpbGVsaW5l IChzdHJpbmctdG8tbnVtYmVyCgkJCSAgIChzdWJzdHJpbmcgc3RyaW5nICgxKyBmaXJzdC1j b2xvbikgc2Vjb25kLWNvbG9uKSkpKQoJICAgKHNldHEgdGVybS1wZW5kaW5nLWZyYW1lIChj b25zIGZpbGVuYW1lIGZpbGVsaW5lKSkpKQoJKCg9IChhcmVmIHN0cmluZyAwKSA/LykKCSAo Y2QgKHN1YnN0cmluZyBzdHJpbmcgMSkpKQoJOzsgQWxsb3dpbmcgdGhlIGluZmVyaW9yIHRv IGNhbGwgZnVuY3Rpb25zIGluIEVtYWNzIGlzCgk7OyBwcm9iYWJseSB0b28gYmlnIGEgc2Vj dXJpdHkgaG9sZS4KCTs7ICgoPSAoYXJlZiBzdHJpbmcgMCkgPyEpCgk7OyAoZXZhbCAoY2Fy IChyZWFkLWZyb20tc3RyaW5nIHN0cmluZyAxKSkpKQoJKHQpKSk7OyBPdGhlcndpc2UgaWdu b3JlIGl0Cgo7OyBNYWtlIHN1cmUgdGhlIGZpbGUgbmFtZWQgVFJVRS1GSUxFIGlzIGluIGEg YnVmZmVyIHRoYXQgYXBwZWFycyBvbiB0aGUgc2NyZWVuCjs7IGFuZCB0aGF0IGl0cyBsaW5l IExJTkUgaXMgdmlzaWJsZS4KOzsgUHV0IHRoZSBvdmVybGF5LWFycm93IG9uIHRoZSBsaW5l IExJTkUgaW4gdGhhdCBidWZmZXIuCjs7IFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgZ2RiLgoK KGRlZnVuIHRlcm0tZGlzcGxheS1saW5lICh0cnVlLWZpbGUgbGluZSkKICAodGVybS1kaXNw bGF5LWJ1ZmZlci1saW5lIChmaW5kLWZpbGUtbm9zZWxlY3QgdHJ1ZS1maWxlKSBsaW5lKSkK CihkZWZ1biB0ZXJtLWRpc3BsYXktYnVmZmVyLWxpbmUgKGJ1ZmZlciBsaW5lKQogIChsZXQq ICgod2luZG93IChkaXNwbGF5LWJ1ZmZlciBidWZmZXIgdCkpCgkgKHBvcykpCiAgICAoc2F2 ZS1leGN1cnNpb24KICAgICAgKHNldC1idWZmZXIgYnVmZmVyKQogICAgICAoc2F2ZS1yZXN0 cmljdGlvbgoJKHdpZGVuKQoJKGdvdG8tbGluZSBsaW5lKQoJKHNldHEgcG9zIChwb2ludCkp Cgkoc2V0cSBvdmVybGF5LWFycm93LXN0cmluZyAiPT4iKQoJKG9yIG92ZXJsYXktYXJyb3ct cG9zaXRpb24KCSAgICAoc2V0cSBvdmVybGF5LWFycm93LXBvc2l0aW9uIChtYWtlLW1hcmtl cikpKQoJKHNldC1tYXJrZXIgb3ZlcmxheS1hcnJvdy1wb3NpdGlvbiAocG9pbnQpIChjdXJy ZW50LWJ1ZmZlcikpKQogICAgICAoY29uZCAoKG9yICg8IHBvcyAocG9pbnQtbWluKSkgKD4g cG9zIChwb2ludC1tYXgpKSkKCSAgICAgKHdpZGVuKQoJICAgICAoZ290by1jaGFyIHBvcykp KSkKICAgIChzZXQtd2luZG93LXBvaW50IHdpbmRvdyBvdmVybGF5LWFycm93LXBvc2l0aW9u KSkpCgo7OzsgVGhlIGJ1ZmZlci1sb2NhbCBtYXJrZXIgdGVybS1ob21lLW1hcmtlciBkZWZp bmVzIHRoZSAiaG9tZSBwb3NpdGlvbiIKOzs7IChpbiB0ZXJtcyBvZiBjdXJzb3IgbW90aW9u KS4gIEhvd2V2ZXIsIHdlIG1vdmUgdGhlIHRlcm0taG9tZS1tYXJrZXIKOzs7ICJkb3duIiBh cyBuZWVkZWQgc28gdGhhdCBpcyBubyBtb3JlIHRoYXQgYSB3aW5kb3ctZnVsbCBhYm92ZSAo cG9pbnQtbWF4KS4KCihkZWZ1biB0ZXJtLWdvdG8taG9tZSAoKQogICh0ZXJtLWhhbmRsZS1k ZWZlcnJlZC1zY3JvbGwpCiAgKGdvdG8tY2hhciB0ZXJtLWhvbWUtbWFya2VyKQogIChzZXRx IHRlcm0tY3VycmVudC1yb3cgMCkKICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIChjdXJy ZW50LWNvbHVtbikpCiAgKHNldHEgdGVybS1zdGFydC1saW5lLWNvbHVtbiB0ZXJtLWN1cnJl bnQtY29sdW1uKSkKCihkZWZ1biB0ZXJtLWdvdG8gKHJvdyBjb2wpCiAgKHRlcm0taGFuZGxl LWRlZmVycmVkLXNjcm9sbCkKICAoY29uZCAoKGFuZCB0ZXJtLWN1cnJlbnQtcm93ICg+PSBy b3cgdGVybS1jdXJyZW50LXJvdykpCgkgOzsgSSBhc3N1bWUgdGhpcyBpcyBhIHdvcnRod2hp bGUgb3B0aW1pemF0aW9uLgoJICh0ZXJtLXZlcnRpY2FsLW1vdGlvbiAwKQoJIChzZXRxIHRl cm0tY3VycmVudC1jb2x1bW4gdGVybS1zdGFydC1saW5lLWNvbHVtbikKCSAoc2V0cSByb3cg KC0gcm93IHRlcm0tY3VycmVudC1yb3cpKSkKCSh0CgkgKHRlcm0tZ290by1ob21lKSkpCiAg KHRlcm0tZG93biByb3cpCiAgKHRlcm0tbW92ZS1jb2x1bW5zIGNvbCkpCgo7IFRoZSBwYWdl IGlzIGZ1bGwsIHNvIGVudGVyICJwYWdlciIgbW9kZSwgYW5kIHdhaXQgZm9yIGlucHV0LgoK KGRlZnVuIHRlcm0tcHJvY2Vzcy1wYWdlciAoKQogICh3aGVuIChub3QgdGVybS1wYWdlci1i cmVhay1tYXApCiAgICAobGV0KiAoKG1hcCAobWFrZS1rZXltYXApKQoJICAgKGkgMCkgdG1w KQo7CSh3aGlsZSAoPCBpIDEyOCkKOwkgIChkZWZpbmUta2V5IG1hcCAobWFrZS1zdHJpbmcg MSBpKSAndGVybS1zZW5kLXJhdykKOwkgIChzZXRxIGkgKDErIGkpKSkKICAgICAgKGRlZmlu ZS1rZXkgbWFwICJcZSIKCShsb29rdXAta2V5IChjdXJyZW50LWdsb2JhbC1tYXApICJcZSIp KQogICAgICAoZGVmaW5lLWtleSBtYXAgIlxDLXgiCgkobG9va3VwLWtleSAoY3VycmVudC1n bG9iYWwtbWFwKSAiXEMteCIpKQogICAgICAoZGVmaW5lLWtleSBtYXAgIlxDLXUiCgkobG9v a3VwLWtleSAoY3VycmVudC1nbG9iYWwtbWFwKSAiXEMtdSIpKQogICAgICAoZGVmaW5lLWtl eSBtYXAgIiAiICd0ZXJtLXBhZ2VyLXBhZ2UpCiAgICAgIChkZWZpbmUta2V5IG1hcCAiXHIi ICd0ZXJtLXBhZ2VyLWxpbmUpCiAgICAgIChkZWZpbmUta2V5IG1hcCAiPyIgJ3Rlcm0tcGFn ZXItaGVscCkKICAgICAgKGRlZmluZS1rZXkgbWFwICJoIiAndGVybS1wYWdlci1oZWxwKQog ICAgICAoZGVmaW5lLWtleSBtYXAgImIiICd0ZXJtLXBhZ2VyLWJhY2stcGFnZSkKICAgICAg KGRlZmluZS1rZXkgbWFwICJcMTc3IiAndGVybS1wYWdlci1iYWNrLWxpbmUpCiAgICAgIChk ZWZpbmUta2V5IG1hcCAicSIgJ3Rlcm0tcGFnZXItZGlzY2FyZCkKICAgICAgKGRlZmluZS1r ZXkgbWFwICJEIiAndGVybS1wYWdlci1kaXNhYmxlKQogICAgICAoZGVmaW5lLWtleSBtYXAg IjwiICd0ZXJtLXBhZ2VyLWJvYikKICAgICAgKGRlZmluZS1rZXkgbWFwICI+IiAndGVybS1w YWdlci1lb2IpCgogICAgICA7OyBBZGQgbWVudSBiYXIuCiAgICAgICh1bmxlc3MgKGZlYXR1 cmVwICd4ZW1hY3MpCgkoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIHRlcm1pbmFsXSB0ZXJt LXRlcm1pbmFsLW1lbnUpCgkoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIHNpZ25hbHNdIHRl cm0tc2lnbmFscy1tZW51KQoJKHNldHEgdG1wIChtYWtlLXNwYXJzZS1rZXltYXAgIk1vcmUg cGFnZXM/IikpCgkoZGVmaW5lLWtleSB0bXAgW2hlbHBdICcoIkhlbHAiIC4gdGVybS1wYWdl ci1oZWxwKSkKCShkZWZpbmUta2V5IHRtcCBbZGlzYWJsZV0KCSAgJygiRGlzYWJsZSBwYWdp bmciIC4gdGVybS1mYWtlLXBhZ2VyLWRpc2FibGUpKQoJKGRlZmluZS1rZXkgdG1wIFtkaXNj YXJkXQoJICAnKCJEaXNjYXJkIHJlbWFpbmluZyBvdXRwdXQiIC4gdGVybS1wYWdlci1kaXNj YXJkKSkKCShkZWZpbmUta2V5IHRtcCBbZW9iXSAnKCJHb3RvIHRvIGVuZCIgLiB0ZXJtLXBh Z2VyLWVvYikpCgkoZGVmaW5lLWtleSB0bXAgW2JvYl0gJygiR290byB0byBiZWdpbm5pbmci IC4gdGVybS1wYWdlci1ib2IpKQoJKGRlZmluZS1rZXkgdG1wIFtsaW5lXSAnKCIxIGxpbmUg Zm9yd2FyZHMiIC4gdGVybS1wYWdlci1saW5lKSkKCShkZWZpbmUta2V5IHRtcCBbYmxpbmVd ICcoIjEgbGluZSBiYWNrd2FyZHMiIC4gdGVybS1wYWdlci1iYWNrLWxpbmUpKQoJKGRlZmlu ZS1rZXkgdG1wIFtiYWNrXSAnKCIxIHBhZ2UgYmFja3dhcmRzIiAuIHRlcm0tcGFnZXItYmFj ay1wYWdlKSkKCShkZWZpbmUta2V5IHRtcCBbcGFnZV0gJygiMSBwYWdlIGZvcndhcmRzIiAu IHRlcm0tcGFnZXItcGFnZSkpCgkoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIHBhZ2VdIChj b25zICJNb3JlIHBhZ2VzPyIgdG1wKSkKCSkKCiAgICAgIChzZXRxIHRlcm0tcGFnZXItYnJl YWstbWFwIG1hcCkpKQo7ICAobGV0ICgocHJvY2VzcyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChj dXJyZW50LWJ1ZmZlcikpKSkKOyAgICAoc3RvcC1wcm9jZXNzIHByb2Nlc3MpKQogIChzZXRx IHRlcm0tcGFnZXItb2xkLWxvY2FsLW1hcCAoY3VycmVudC1sb2NhbC1tYXApKQogICh1c2Ut bG9jYWwtbWFwIHRlcm0tcGFnZXItYnJlYWstbWFwKQogIChtYWtlLWxvY2FsLXZhcmlhYmxl ICd0ZXJtLW9sZC1tb2RlLWxpbmUtZm9ybWF0KQogIChzZXRxIHRlcm0tb2xkLW1vZGUtbGlu ZS1mb3JtYXQgbW9kZS1saW5lLWZvcm1hdCkKICAoc2V0cSBtb2RlLWxpbmUtZm9ybWF0Cgko bGlzdCAiLS0gICoqTU9SRSoqICAiCgkgICAgICBtb2RlLWxpbmUtYnVmZmVyLWlkZW50aWZp Y2F0aW9uCgkgICAgICAiIFtUeXBlID8gZm9yIGhlbHBdICIKCSAgICAgICIlLSIpKQogIChm b3JjZS1tb2RlLWxpbmUtdXBkYXRlKSkKCihkZWZ1biB0ZXJtLXBhZ2VyLWxpbmUgKGxpbmVz KQogIChpbnRlcmFjdGl2ZSAicCIpCiAgKGxldCogKChtb3ZlZCAodmVydGljYWwtbW90aW9u ICgxKyBsaW5lcykpKQoJIChkZWZpY2l0ICgtIGxpbmVzIG1vdmVkKSkpCiAgICAod2hlbiAo PiBtb3ZlZCBsaW5lcykKICAgICAgKGJhY2t3YXJkLWNoYXIpKQogICAgKGNvbmQgKCg8PSBk ZWZpY2l0IDApIDs7IE9LLCBoYWQgZW5vdWdoIGluIHRoZSBidWZmZXIgZm9yIHJlcXVlc3Qu CgkgICAocmVjZW50ZXIgKDEtIHRlcm0taGVpZ2h0KSkpCgkgICgodGVybS1wYWdlci1jb250 aW51ZSBkZWZpY2l0KSkpKSkKCihkZWZ1biB0ZXJtLXBhZ2VyLXBhZ2UgKGFyZykKICAiUHJv Y2VlZCBwYXN0IHRoZSAqKk1PUkUqKiBicmVhaywgYWxsb3dpbmcgdGhlIG5leHQgcGFnZSBv ZiBvdXRwdXQgdG8gYXBwZWFyLiIKICAoaW50ZXJhY3RpdmUgInAiKQogICh0ZXJtLXBhZ2Vy LWxpbmUgKCogYXJnIHRlcm0taGVpZ2h0KSkpCgo7IFBhZ2VyIG1vZGUgY29tbWFuZCB0byBn byB0byBiZWdpbm5pbmcgb2YgYnVmZmVyCihkZWZ1biB0ZXJtLXBhZ2VyLWJvYiAoKQogIChp bnRlcmFjdGl2ZSkKICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICh3aGVuICg9ICh2ZXJ0 aWNhbC1tb3Rpb24gdGVybS1oZWlnaHQpIHRlcm0taGVpZ2h0KQogICAgKGJhY2t3YXJkLWNo YXIpKQogIChyZWNlbnRlciAoMS0gdGVybS1oZWlnaHQpKSkKCjsgcGFnZXIgbW9kZSBjb21t YW5kIHRvIGdvIHRvIGVuZCBvZiBidWZmZXIKKGRlZnVuIHRlcm0tcGFnZXItZW9iICgpCiAg KGludGVyYWN0aXZlKQogIChnb3RvLWNoYXIgdGVybS1ob21lLW1hcmtlcikKICAocmVjZW50 ZXIgMCkKICAoZ290by1jaGFyIChwcm9jZXNzLW1hcmsgKGdldC1idWZmZXItcHJvY2VzcyAo Y3VycmVudC1idWZmZXIpKSkpKQoKKGRlZnVuIHRlcm0tcGFnZXItYmFjay1saW5lIChsaW5l cykKICAoaW50ZXJhY3RpdmUgInAiKQogICh2ZXJ0aWNhbC1tb3Rpb24gKC0gMSBsaW5lcykp CiAgKGlmIChub3QgKGJvYnApKQogICAgICAoYmFja3dhcmQtY2hhcikKICAgIChiZWVwKQog ICAgOzsgTW92ZSBjdXJzb3IgdG8gZW5kIG9mIHdpbmRvdy4KICAgICh2ZXJ0aWNhbC1tb3Rp b24gdGVybS1oZWlnaHQpCiAgICAoYmFja3dhcmQtY2hhcikpCiAgKHJlY2VudGVyICgxLSB0 ZXJtLWhlaWdodCkpKQoKKGRlZnVuIHRlcm0tcGFnZXItYmFjay1wYWdlIChhcmcpCiAgKGlu dGVyYWN0aXZlICJwIikKICAodGVybS1wYWdlci1iYWNrLWxpbmUgKCogYXJnIHRlcm0taGVp Z2h0KSkpCgooZGVmdW4gdGVybS1wYWdlci1kaXNjYXJkICgpCiAgKGludGVyYWN0aXZlKQog IChzZXRxIHRlcm0tdGVybWluYWwtcGFyYW1ldGVyICIiKQogIChpbnRlcnJ1cHQtcHJvY2Vz cyBuaWwgdCkKICAodGVybS1wYWdlci1jb250aW51ZSB0ZXJtLWhlaWdodCkpCgo7IERpc2Fi bGUgcGFnZXIgcHJvY2Vzc2luZy4KOyBPbmx5IGNhbGxhYmxlIHdoaWxlIGluIHBhZ2VyIG1v ZGUuICAoQ29udHJhc3QgdGVybS1kaXNhYmxlLXBhZ2VyLikKKGRlZnVuIHRlcm0tcGFnZXIt ZGlzYWJsZSAoKQogIChpbnRlcmFjdGl2ZSkKICAoaWYgKHRlcm0taGFuZGxpbmctcGFnZXIp CiAgICAgICh0ZXJtLXBhZ2VyLWNvbnRpbnVlIG5pbCkKICAgIChzZXRxIHRlcm0tcGFnZXIt Y291bnQgbmlsKSkKICAodGVybS11cGRhdGUtbW9kZS1saW5lKSkKCjsgRW5hYmxlIHBhZ2Vy IHByb2Nlc3NpbmcuCihkZWZ1biB0ZXJtLXBhZ2VyLWVuYWJsZSAoKQogIChpbnRlcmFjdGl2 ZSkKICAob3IgKHRlcm0tcGFnZXItZW5hYmxlZCkKICAgICAgKHNldHEgdGVybS1wYWdlci1j b3VudCAwKSkgOzsgT3IgbWF5YmUgc2V0IHRvICh0ZXJtLWN1cnJlbnQtcm93KSA/PwogICh0 ZXJtLXVwZGF0ZS1tb2RlLWxpbmUpKQoKKGRlZnVuIHRlcm0tcGFnZXItdG9nZ2xlICgpCiAg KGludGVyYWN0aXZlKQogIChpZiAodGVybS1wYWdlci1lbmFibGVkKSAodGVybS1wYWdlci1k aXNhYmxlKSAodGVybS1wYWdlci1lbmFibGUpKSkKCih1bmxlc3MgKGZlYXR1cmVwICd4ZW1h Y3MpCiAoZGVmYWxpYXMgJ3Rlcm0tZmFrZS1wYWdlci1lbmFibGUgJ3Rlcm0tcGFnZXItdG9n Z2xlKQogKGRlZmFsaWFzICd0ZXJtLWZha2UtcGFnZXItZGlzYWJsZSAndGVybS1wYWdlci10 b2dnbGUpCiAocHV0ICd0ZXJtLWNoYXItbW9kZSAnbWVudS1lbmFibGUgJyh0ZXJtLWluLWxp bmUtbW9kZSkpCiAocHV0ICd0ZXJtLWxpbmUtbW9kZSAnbWVudS1lbmFibGUgJyh0ZXJtLWlu LWNoYXItbW9kZSkpCiAocHV0ICd0ZXJtLWZha2UtcGFnZXItZW5hYmxlICdtZW51LWVuYWJs ZSAnKG5vdCB0ZXJtLXBhZ2VyLWNvdW50KSkKIChwdXQgJ3Rlcm0tZmFrZS1wYWdlci1kaXNh YmxlICdtZW51LWVuYWJsZSAndGVybS1wYWdlci1jb3VudCkpCgooZGVmdW4gdGVybS1wYWdl ci1oZWxwICgpCiAgIlByb3ZpZGUgaGVscCBvbiBjb21tYW5kcyBhdmFpbGFibGUgaW4gYSB0 ZXJtaW5hbC1lbXVsYXRvciAqKk1PUkUqKiBicmVhay4iCiAgKGludGVyYWN0aXZlKQogICht ZXNzYWdlICJUZXJtaW5hbC1lbXVsYXRvciBwYWdlciBicmVhayBoZWxwLi4uIikKICAoc2l0 LWZvciAwKQogICh3aXRoLWVsZWN0cmljLWhlbHAKICAgIChmdW5jdGlvbiAobGFtYmRhICgp CgkJKHByaW5jIChzdWJzdGl0dXRlLWNvbW1hbmQta2V5cwoiXFw8dGVybS1wYWdlci1icmVh ay1tYXA+XApUZXJtaW5hbC1lbXVsYXRvciBNT1JFIGJyZWFrLlxuXApUeXBlIG9uZSBvZiB0 aGUgZm9sbG93aW5nIGtleXM6XG5cblwKXFxbdGVybS1wYWdlci1wYWdlXVx0XHRNb3ZlIGZv cndhcmQgb25lIHBhZ2UuXG5cClxcW3Rlcm0tcGFnZXItbGluZV1cdFx0TW92ZSBmb3J3YXJk IG9uZSBsaW5lLlxuXApcXFt1bml2ZXJzYWwtYXJndW1lbnRdIE4gXFxbdGVybS1wYWdlci1w YWdlXVx0TW92ZSBOIHBhZ2VzIGZvcndhcmQuXG5cClxcW3VuaXZlcnNhbC1hcmd1bWVudF0g TiBcXFt0ZXJtLXBhZ2VyLWxpbmVdXHRNb3ZlIE4gbGluZXMgZm9yd2FyZC5cblwKXFxbdW5p dmVyc2FsLWFyZ3VtZW50XSBOIFxcW3Rlcm0tcGFnZXItYmFjay1saW5lXVx0TW92ZSBOIGxp bmVzIGJhY2suXG5cClxcW3VuaXZlcnNhbC1hcmd1bWVudF0gTiBcXFt0ZXJtLXBhZ2VyLWJh Y2stcGFnZV1cdFx0TW92ZSBOIHBhZ2VzIGJhY2suXG5cClxcW3Rlcm0tcGFnZXItYm9iXVx0 XHRNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci5cblwKXFxbdGVybS1wYWdl ci1lb2JdXHRcdE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLlxuXApcXFt0ZXJtLXBh Z2VyLWRpc2NhcmRdXHRcdEtpbGwgcGVuZGluZyBvdXRwdXQgYW5kIGtpbGwgcHJvY2Vzcy5c blwKXFxbdGVybS1wYWdlci1kaXNhYmxlXVx0XHREaXNhYmxlIFBBR0VSIGhhbmRsaW5nLlxu XG5cClxce3Rlcm0tcGFnZXItYnJlYWstbWFwfVxuXApBbnkgb3RoZXIga2V5IGlzIHBhc3Nl ZCB0aHJvdWdoIHRvIHRoZSBwcm9ncmFtCnJ1bm5pbmcgdW5kZXIgdGhlIHRlcm1pbmFsIGVt dWxhdG9yIGFuZCBkaXNhYmxlcyBwYWdlciBwcm9jZXNzaW5nIHVudGlsCmFsbCBwZW5kaW5n IG91dHB1dCBoYXMgYmVlbiBkZWFsdCB3aXRoLiIpKQoJCW5pbCkpKSkKCihkZWZ1biB0ZXJt LXBhZ2VyLWNvbnRpbnVlIChuZXctY291bnQpCiAgKGxldCAoKHByb2Nlc3MgKGdldC1idWZm ZXItcHJvY2VzcyAoY3VycmVudC1idWZmZXIpKSkpCiAgICAodXNlLWxvY2FsLW1hcCB0ZXJt LXBhZ2VyLW9sZC1sb2NhbC1tYXApCiAgICAoc2V0cSB0ZXJtLXBhZ2VyLW9sZC1sb2NhbC1t YXAgbmlsKQogICAgKHNldHEgbW9kZS1saW5lLWZvcm1hdCB0ZXJtLW9sZC1tb2RlLWxpbmUt Zm9ybWF0KQogICAgKGZvcmNlLW1vZGUtbGluZS11cGRhdGUpCiAgICAoc2V0cSB0ZXJtLXBh Z2VyLWNvdW50IG5ldy1jb3VudCkKICAgIChzZXQtcHJvY2Vzcy1maWx0ZXIgcHJvY2VzcyB0 ZXJtLXBhZ2VyLW9sZC1maWx0ZXIpCiAgICAoZnVuY2FsbCB0ZXJtLXBhZ2VyLW9sZC1maWx0 ZXIgcHJvY2VzcyAiIikKICAgIChjb250aW51ZS1wcm9jZXNzIHByb2Nlc3MpKSkKCjs7IE1h a2Ugc3VyZSB0aGVyZSBhcmUgRE9XTiBibGFuayBsaW5lcyBiZWxvdyB0aGUgY3VycmVudCBv bmUuCjs7IFJldHVybiAwIGlmIHdlJ3JlIHVuYWJsZSAoYmVjYXVzZSBvZiBQQUdFUiBoYW5k bGluZyksIGVsc2UgcmV0dXJuIERPV04uCgooZGVmdW4gdGVybS1oYW5kbGUtc2Nyb2xsIChk b3duKQogIChsZXQgKChzY3JvbGwtbmVlZGVkCgkgKC0gKCsgKHRlcm0tY3VycmVudC1yb3cp IGRvd24pCgkgICAgKGlmICg8IGRvd24gMCkgdGVybS1zY3JvbGwtc3RhcnQgdGVybS1zY3Jv bGwtZW5kKSkpKQogICAgKHdoZW4gKG9yIChhbmQgKDwgZG93biAwKSAoPCBzY3JvbGwtbmVl ZGVkIDApKQoJICAgICAgKGFuZCAoPiBkb3duIDApICg+IHNjcm9sbC1uZWVkZWQgMCkpKQog ICAgICAobGV0ICgoc2F2ZS1wb2ludCAoY29weS1tYXJrZXIgKHBvaW50KSkpIChzYXZlLXRv cCkpCgkoZ290by1jaGFyIHRlcm0taG9tZS1tYXJrZXIpCgkoY29uZCAodGVybS1zY3JvbGwt d2l0aC1kZWxldGUKCSAgICAgICAoaWYgKDwgZG93biAwKQoJCSAgIChwcm9nbgoJCSAgICAg OzsgRGVsZXRlIHNjcm9sbC1uZWVkZWQgbGluZXMgYXQgdGVybS1zY3JvbGwtZW5kLAoJCSAg ICAgOzsgdGhlbiBpbnNlcnQgc2Nyb2xsLW5lZWRlZCBsaW5lcy4KCQkgICAgICh0ZXJtLXZl cnRpY2FsLW1vdGlvbiB0ZXJtLXNjcm9sbC1lbmQpCgkJICAgICAoZW5kLW9mLWxpbmUpCgkJ ICAgICAoc2V0cSBzYXZlLXRvcCAocG9pbnQpKQoJCSAgICAgKHRlcm0tdmVydGljYWwtbW90 aW9uIHNjcm9sbC1uZWVkZWQpCgkJICAgICAoZW5kLW9mLWxpbmUpCgkJICAgICAoZGVsZXRl LXJlZ2lvbiBzYXZlLXRvcCAocG9pbnQpKQoJCSAgICAgKGdvdG8tY2hhciBzYXZlLXBvaW50 KQoJCSAgICAgKHNldHEgZG93biAoLSBzY3JvbGwtbmVlZGVkIGRvd24pKQoJCSAgICAgKHRl cm0tdmVydGljYWwtbW90aW9uIGRvd24pKQoJCSA7OyBEZWxldGUgc2Nyb2xsLW5lZWRlZCBs aW5lcyBhdCB0ZXJtLXNjcm9sbC1zdGFydC4KCQkgKHRlcm0tdmVydGljYWwtbW90aW9uIHRl cm0tc2Nyb2xsLXN0YXJ0KQoJCSAoc2V0cSBzYXZlLXRvcCAocG9pbnQpKQoJCSAodGVybS12 ZXJ0aWNhbC1tb3Rpb24gc2Nyb2xsLW5lZWRlZCkKCQkgKGRlbGV0ZS1yZWdpb24gc2F2ZS10 b3AgKHBvaW50KSkKCQkgKGdvdG8tY2hhciBzYXZlLXBvaW50KQoJCSAodGVybS12ZXJ0aWNh bC1tb3Rpb24gZG93bikKCQkgKHRlcm0tYWRqdXN0LWN1cnJlbnQtcm93LWNhY2hlICgtIHNj cm9sbC1uZWVkZWQpKSkKCSAgICAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIG5pbCkK CSAgICAgICAodGVybS1pbnNlcnQtY2hhciA/XG4gKGFicyBzY3JvbGwtbmVlZGVkKSkpCgkg ICAgICAoKGFuZCAobnVtYmVycCB0ZXJtLXBhZ2VyLWNvdW50KQoJCSAgICAoPCAoc2V0cSB0 ZXJtLXBhZ2VyLWNvdW50ICgtIHRlcm0tcGFnZXItY291bnQgZG93bikpCgkJICAgICAgIDAp KQoJICAgICAgIChzZXRxIGRvd24gMCkKCSAgICAgICAodGVybS1wcm9jZXNzLXBhZ2VyKSkK CSAgICAgICh0CgkgICAgICAgKHRlcm0tYWRqdXN0LWN1cnJlbnQtcm93LWNhY2hlICgtIHNj cm9sbC1uZWVkZWQpKQoJICAgICAgICh0ZXJtLXZlcnRpY2FsLW1vdGlvbiBzY3JvbGwtbmVl ZGVkKQoJICAgICAgIChzZXQtbWFya2VyIHRlcm0taG9tZS1tYXJrZXIgKHBvaW50KSkpKQoJ KGdvdG8tY2hhciBzYXZlLXBvaW50KQoJKHNldC1tYXJrZXIgc2F2ZS1wb2ludCBuaWwpKSkp CiAgZG93bikKCihkZWZ1biB0ZXJtLWRvd24gKGRvd24gJm9wdGlvbmFsIGNoZWNrLWZvci1z Y3JvbGwpCiAgIk1vdmUgZG93biBET1dOIHNjcmVlbiBsaW5lcyB2ZXJ0aWNhbGx5LiIKICAo bGV0ICgoc3RhcnQtY29sdW1uICh0ZXJtLWhvcml6b250YWwtY29sdW1uKSkpCiAgICAod2hl biAoYW5kIGNoZWNrLWZvci1zY3JvbGwgKG9yIHRlcm0tc2Nyb2xsLXdpdGgtZGVsZXRlIHRl cm0tcGFnZXItY291bnQpKQogICAgICAoc2V0cSBkb3duICh0ZXJtLWhhbmRsZS1zY3JvbGwg ZG93bikpKQogICAgKHVubGVzcyAoYW5kICg9IHRlcm0tY3VycmVudC1yb3cgMCkgKDwgZG93 biAwKSkKICAgICAgKHRlcm0tYWRqdXN0LWN1cnJlbnQtcm93LWNhY2hlIGRvd24pCiAgICAg ICh3aGVuIChvciAoLz0gKHBvaW50KSAocG9pbnQtbWF4KSkgKDwgZG93biAwKSkKCShzZXRx IGRvd24gKC0gZG93biAodGVybS12ZXJ0aWNhbC1tb3Rpb24gZG93bikpKSkpCiAgICAoY29u ZCAoKD49IGRvd24gMCkKCSAgIDs7IEV4dGVuZCBidWZmZXIgd2l0aCBleHRyYSBibGFuayBs aW5lcyBpZiBuZWVkZWQuCgkgICAodGVybS1pbnNlcnQtY2hhciA/XG4gZG93bikKCSAgIChz ZXRxIHRlcm0tY3VycmVudC1jb2x1bW4gMCkKCSAgIChzZXRxIHRlcm0tc3RhcnQtbGluZS1j b2x1bW4gMCkpCgkgICh0CgkgICAod2hlbiAoPSB0ZXJtLWN1cnJlbnQtcm93IDApCgkgICAg IDs7IEluc2VydCBsaW5lcyBpZiBhdCB0aGUgYmVnaW5uaW5nLgoJICAgICAoc2F2ZS1leGN1 cnNpb24gKHRlcm0taW5zZXJ0LWNoYXIgP1xuICgtIGRvd24pKSkKCSAgICAgKHNhdmUtZXhj dXJzaW9uCgkgICAgICAgKGxldCAocCkKCQkgOzsgRGVsZXRlIGxpbmVzIGZyb20gdGhlIGVu ZC4KCQkgKGZvcndhcmQtbGluZSB0ZXJtLWhlaWdodCkKCQkgKHNldHEgcCAocG9pbnQpKQoJ CSAoZm9yd2FyZC1saW5lICgtIGRvd24pKQoJCSAoZGVsZXRlLXJlZ2lvbiBwIChwb2ludCkp KSkpCgkgICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIDApCgkgICAoc2V0cSB0ZXJtLXN0 YXJ0LWxpbmUtY29sdW1uIChjdXJyZW50LWNvbHVtbikpKSkKICAgICh3aGVuIHN0YXJ0LWNv bHVtbgogICAgICAodGVybS1tb3ZlLWNvbHVtbnMgc3RhcnQtY29sdW1uKSkpKQoKOzsgQXNz dW1pbmcgcG9pbnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNjcmVlbiBsaW5lLAo7OyBp ZiB0aGUgbGluZSBhYm92ZSBwb2ludCB3cmFwcyBhcm91bmQsIGFkZCBhID9cbiB0byB1bmRv IHRoZSB3cmFwcGluZy4KOzsgRklYTUU6ICBQcm9iYWJseSBzaG91bGQgYmUgY2FsbGVkIG1v cmUgdGhhbiBpdCBpcy4KKGRlZnVuIHRlcm0tdW53cmFwLWxpbmUgKCkKICAod2hlbiAobm90 IChib2xwKSkgKGluc2VydC1iZWZvcmUtbWFya2VycyA/XG4pKSkKCihkZWZ1biB0ZXJtLWVy YXNlLWluLWxpbmUgKGtpbmQpCiAgKHdoZW4gKD0ga2luZCAxKSA7OyBlcmFzZSBsZWZ0IG9m IHBvaW50CiAgICAobGV0ICgoY29scyAodGVybS1ob3Jpem9udGFsLWNvbHVtbikpIChzYXZl ZC1wb2ludCAocG9pbnQpKSkKICAgICAgKHRlcm0tdmVydGljYWwtbW90aW9uIDApCiAgICAg IChkZWxldGUtcmVnaW9uIChwb2ludCkgc2F2ZWQtcG9pbnQpCiAgICAgICh0ZXJtLWluc2Vy dC1jaGFyID8gIGNvbHMpKSkKICAod2hlbiAobm90IChlcSBraW5kIDEpKSA7OyBlcmFzZSBy aWdodCBvZiBwb2ludAogICAgKGxldCAoKHNhdmVkLXBvaW50IChwb2ludCkpCgkgICh3cmFw cGVkIChhbmQgKHplcm9wICh0ZXJtLWhvcml6b250YWwtY29sdW1uKSkKCQkJKG5vdCAoemVy b3AgKHRlcm0tY3VycmVudC1jb2x1bW4pKSkpKSkKICAgICAgKHRlcm0tdmVydGljYWwtbW90 aW9uIDEpCiAgICAgIChkZWxldGUtcmVnaW9uIHNhdmVkLXBvaW50IChwb2ludCkpCiAgICAg IDs7IHdyYXBwZWQgaXMgdHJ1ZSBpZiB3ZSdyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHNjcmVl biBsaW5lLAogICAgICA7OyBidXQgbm90IGEgYnVmZmVyIGxpbmUuICBJZiB3ZSBkZWxldGUg dGhlIGN1cnJlbnQgc2NyZWVuIGxpbmUKICAgICAgOzsgdGhhdCB3aWxsIG1ha2UgdGhlIHBy ZXZpb3VzIGxpbmUgbm8gbG9uZ2VyIHdyYXAsIGFuZCAoYmVjYXVzZQogICAgICA7OyBvZiB0 aGUgd2F5IEVtYWNzIGRpc3BsYXkgd29ya3MpIHBvaW50IHdpbGwgYmUgYXQgdGhlIGVuZCBv ZgogICAgICA7OyB0aGUgcHJldmlvdXMgc2NyZWVuIGxpbmUgcmF0aGVyIHRoZW4gdGhlIGJl Z2lubmluZyBvZiB0aGUKICAgICAgOzsgY3VycmVudCBvbmUuICBUbyBhdm9pZCB0aGF0LCB3 ZSBtYWtlIHN1cmUgdGhhdCBjdXJyZW50IGxpbmUKICAgICAgOzsgY29udGFpbiBhIHNwYWNl LCB0byBmb3JjZSB0aGUgcHJldmlvdXMgbGluZSB0byBjb250aW51ZSB0byB3cmFwLgogICAg ICA7OyBXZSBjb3VsZCBkbyB0aGlzIGFsd2F5cywgYnV0IGl0IHNlZW1zIHByZWZlcmFibGUg dG8gbm90IGFkZCB0aGUKICAgICAgOzsgZXh0cmEgc3BhY2Ugd2hlbiB3cmFwcGVkIGlzIGZh bHNlLgogICAgICAod2hlbiB3cmFwcGVkCgkoaW5zZXJ0ID8gKSkKICAgICAgKGluc2VydCA/ XG4pCiAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSBzYXZlZC1wb2ludCAocG9pbnQpICdmYWNl ICdkZWZhdWx0KQogICAgICAoZ290by1jaGFyIHNhdmVkLXBvaW50KSkpKQoKKGRlZnVuIHRl cm0tZXJhc2UtaW4tZGlzcGxheSAoa2luZCkKICAiRXJhc2VzICh0aGF0IGlzIGJsYW5rcyBv dXQpIHBhcnQgb2YgdGhlIHdpbmRvdy4KSWYgS0lORCBpcyAwLCBlcmFzZSBmcm9tIChwb2lu dCkgdG8gKHBvaW50LW1heCk7CmlmIEtJTkQgaXMgMSwgZXJhc2UgZnJvbSBob21lIHRvIHBv aW50OyBlbHNlIGVyYXNlIGZyb20gaG9tZSB0byBwb2ludC1tYXguIgogICh0ZXJtLWhhbmRs ZS1kZWZlcnJlZC1zY3JvbGwpCiAgKGNvbmQgKChlcSB0ZXJtLXRlcm1pbmFsLXBhcmFtZXRl ciAwKQoJIChsZXQgKChuZWVkLXVud3JhcCAoYm9scCkpKQoJICAgKGRlbGV0ZS1yZWdpb24g KHBvaW50KSAocG9pbnQtbWF4KSkKCSAgICh3aGVuIG5lZWQtdW53cmFwICh0ZXJtLXVud3Jh cC1saW5lKSkpKQoJKChsZXQgKChyb3cgKHRlcm0tY3VycmVudC1yb3cpKQoJICAgICAgKGNv bCAodGVybS1ob3Jpem9udGFsLWNvbHVtbikpCgkgICAgICAoc3RhcnQtcmVnaW9uIHRlcm0t aG9tZS1tYXJrZXIpCgkgICAgICAoZW5kLXJlZ2lvbiAoaWYgKGVxIGtpbmQgMSkgKHBvaW50 KSAocG9pbnQtbWF4KSkpKQoJICAgKGRlbGV0ZS1yZWdpb24gc3RhcnQtcmVnaW9uIGVuZC1y ZWdpb24pCgkgICAodGVybS11bndyYXAtbGluZSkKCSAgICh3aGVuIChlcSBraW5kIDEpCgkg ICAgICh0ZXJtLWluc2VydC1jaGFyID9cbiByb3cpKQoJICAgKHNldHEgdGVybS1jdXJyZW50 LWNvbHVtbiBuaWwpCgkgICAoc2V0cSB0ZXJtLWN1cnJlbnQtcm93IG5pbCkKCSAgICh0ZXJt LWdvdG8gcm93IGNvbCkpKSkpCgooZGVmdW4gdGVybS1kZWxldGUtY2hhcnMgKGNvdW50KQog IChsZXQgKChzYXZlLXBvaW50IChwb2ludCkpKQogICAgKHRlcm0tdmVydGljYWwtbW90aW9u IDEpCiAgICAodGVybS11bndyYXAtbGluZSkKICAgIChnb3RvLWNoYXIgc2F2ZS1wb2ludCkK ICAgIChtb3ZlLXRvLWNvbHVtbiAoKyAodGVybS1jdXJyZW50LWNvbHVtbikgY291bnQpIHQp CiAgICAoZGVsZXRlLXJlZ2lvbiBzYXZlLXBvaW50IChwb2ludCkpKSkKCjs7OyBJbnNlcnQg Q09VTlQgc3BhY2VzIGFmdGVyIHBvaW50LCBidXQgZG8gbm90IGNoYW5nZSBhbnkgb2YKOzs7 IGZvbGxvd2luZyBzY3JlZW4gbGluZXMuICBIZW5jZSB3ZSBtYXkgaGF2ZSB0byBkZWxldGUg Y2hhcmFjdGVycwo7OzsgYXQgdGhlIGVuZCBvZiB0aGlzIHNjcmVlbiBsaW5lIHRvIG1ha2Ug cm9vbS4KCihkZWZ1biB0ZXJtLWluc2VydC1zcGFjZXMgKGNvdW50KQogIChsZXQgKChzYXZl LXBvaW50IChwb2ludCkpIChzYXZlLWVvbCkgKHBudC1hdC1lb2wpKQogICAgKHRlcm0tdmVy dGljYWwtbW90aW9uIDEpCiAgICAod2hlbiAoYm9scCkKICAgICAgKGJhY2t3YXJkLWNoYXIp KQogICAgKHNldHEgc2F2ZS1lb2wgKHBvaW50KSkKICAgIChzYXZlLWV4Y3Vyc2lvbgogICAg ICAoZW5kLW9mLWxpbmUpCiAgICAgIChzZXRxIHBudC1hdC1lb2wgKHBvaW50KSkpCiAgICAo bW92ZS10by1jb2x1bW4gKCsgKHRlcm0tc3RhcnQtbGluZS1jb2x1bW4pICgtIHRlcm0td2lk dGggY291bnQpKSB0KQogICAgOzsgSWYgbW92ZS10by1jb2x1bW4gZXh0ZW5kcyB0aGUgY3Vy cmVudCBsaW5lIGl0IHdpbGwgdXNlIHRoZSBmYWNlCiAgICA7OyBmcm9tIHRoZSBsYXN0IGNo YXJhY3RlciBvbiB0aGUgbGluZSwgc2V0IHRoZSBmYWNlIGZvciB0aGUgY2hhcnMKICAgIDs7 IHRvIGRlZmF1bHQuCiAgICAod2hlbiAoPj0gKHBvaW50KSBwbnQtYXQtZW9sKQogICAgICAo cHV0LXRleHQtcHJvcGVydHkgcG50LWF0LWVvbCAocG9pbnQpICdmYWNlICdkZWZhdWx0KSkK ICAgICh3aGVuICg+IHNhdmUtZW9sIChwb2ludCkpCiAgICAgIChkZWxldGUtcmVnaW9uIChw b2ludCkgc2F2ZS1lb2wpKQogICAgKGdvdG8tY2hhciBzYXZlLXBvaW50KQogICAgKHRlcm0t aW5zZXJ0LWNoYXIgPyAgY291bnQpCiAgICAoZ290by1jaGFyIHNhdmUtcG9pbnQpKSkKCihk ZWZ1biB0ZXJtLWRlbGV0ZS1saW5lcyAobGluZXMpCiAgKGxldCAoKHN0YXJ0IChwb2ludCkp Cgkoc2F2ZS1jdXJyZW50LWNvbHVtbiB0ZXJtLWN1cnJlbnQtY29sdW1uKQoJKHNhdmUtc3Rh cnQtbGluZS1jb2x1bW4gdGVybS1zdGFydC1saW5lLWNvbHVtbikKCShzYXZlLWN1cnJlbnQt cm93ICh0ZXJtLWN1cnJlbnQtcm93KSkpCiAgICA7OyBUaGUgbnVtYmVyIG9mIGluc2VydGVk IGxpbmVzIHNob3VsZG4ndCBleGNlZWQgdGhlIHNjcm9sbCByZWdpb24gZW5kLgogICAgOzsg VGhlIGB0ZXJtLXNjcm9sbC1lbmQnIGxpbmUgaXMgcGFydCBvZiB0aGUgc2Nyb2xsaW5nIHJl Z2lvbiwgc28KICAgIDs7IHdlIG5lZWQgdG8gZ28gb25lIGxpbmUgcGFzdCBpdCBpbiBvcmRl ciB0byBlbnN1cmUgY29ycmVjdAogICAgOzsgc2Nyb2xsaW5nLgogICAgKHdoZW4gKD4gKCsg c2F2ZS1jdXJyZW50LXJvdyBsaW5lcykgKDErIHRlcm0tc2Nyb2xsLWVuZCkpCiAgICAgIChz ZXRxIGxpbmVzICgtIGxpbmVzICgtICgrIHNhdmUtY3VycmVudC1yb3cgbGluZXMpICgxKyB0 ZXJtLXNjcm9sbC1lbmQpKSkpKQogICAgKHRlcm0tZG93biBsaW5lcykKICAgIChkZWxldGUt cmVnaW9uIHN0YXJ0IChwb2ludCkpCiAgICAodGVybS1kb3duICgtICgxKyB0ZXJtLXNjcm9s bC1lbmQpIHNhdmUtY3VycmVudC1yb3cgbGluZXMpKQogICAgKHRlcm0taW5zZXJ0LWNoYXIg P1xuIGxpbmVzKQogICAgKHNldHEgdGVybS1jdXJyZW50LWNvbHVtbiBzYXZlLWN1cnJlbnQt Y29sdW1uKQogICAgKHNldHEgdGVybS1zdGFydC1saW5lLWNvbHVtbiBzYXZlLXN0YXJ0LWxp bmUtY29sdW1uKQogICAgKHNldHEgdGVybS1jdXJyZW50LXJvdyBzYXZlLWN1cnJlbnQtcm93 KQogICAgKGdvdG8tY2hhciBzdGFydCkpKQoKKGRlZnVuIHRlcm0taW5zZXJ0LWxpbmVzIChs aW5lcykKICAobGV0ICgoc3RhcnQgKHBvaW50KSkKCShzdGFydC1kZWxldGVkKQoJKHNhdmUt Y3VycmVudC1jb2x1bW4gdGVybS1jdXJyZW50LWNvbHVtbikKCShzYXZlLXN0YXJ0LWxpbmUt Y29sdW1uIHRlcm0tc3RhcnQtbGluZS1jb2x1bW4pCgkoc2F2ZS1jdXJyZW50LXJvdyAodGVy bS1jdXJyZW50LXJvdykpKQogICAgOzsgSW5zZXJ0aW5nIGxpbmVzIHNob3VsZCB0YWtlIGlu dG8gYWNjb3VudCB0aGUgc2Nyb2xsIHJlZ2lvbi4KICAgIDs7IFRoZSBgdGVybS1zY3JvbGwt ZW5kJyBsaW5lIGlzIHBhcnQgb2YgdGhlIHNjcm9sbGluZyByZWdpb24sIHNvCiAgICA7OyB3 ZSBuZWVkIHRvIGdvIG9uZSBsaW5lIHBhc3QgaXQgaW4gb3JkZXIgdG8gZW5zdXJlIGNvcnJl Y3QKICAgIDs7IHNjcm9sbGluZy4KICAgIChpZiAoPCBzYXZlLWN1cnJlbnQtcm93IHRlcm0t c2Nyb2xsLXN0YXJ0KQoJOzsgSWYgcG9pbnQgaXMgYmVmb3JlIHNjcm9sbCBzdGFydCwKCShw cm9nbgoJICAoc2V0cSBsaW5lcyAoLSBsaW5lcyAoLSB0ZXJtLXNjcm9sbC1zdGFydCBzYXZl LWN1cnJlbnQtcm93KSkpCgkgICh0ZXJtLWRvd24gKC0gdGVybS1zY3JvbGwtc3RhcnQgc2F2 ZS1jdXJyZW50LXJvdykpCgkgIChzZXRxIHN0YXJ0IChwb2ludCkpKQogICAgICA7OyBUaGUg bnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIHNob3VsZG4ndCBleGNlZWQgdGhlIHNjcm9sbCBy ZWdpb24gZW5kLgogICAgICAod2hlbiAoPiAoKyBzYXZlLWN1cnJlbnQtcm93IGxpbmVzKSAo MSsgdGVybS1zY3JvbGwtZW5kKSkKCShzZXRxIGxpbmVzICgtIGxpbmVzICgtICgrIHNhdmUt Y3VycmVudC1yb3cgbGluZXMpKDErIHRlcm0tc2Nyb2xsLWVuZCkpKSkpCiAgICAgICh0ZXJt LWRvd24gKC0gKDErIHRlcm0tc2Nyb2xsLWVuZCkgc2F2ZS1jdXJyZW50LXJvdyBsaW5lcykp KQogICAgKHNldHEgc3RhcnQtZGVsZXRlZCAocG9pbnQpKQogICAgKHRlcm0tZG93biBsaW5l cykKICAgIChkZWxldGUtcmVnaW9uIHN0YXJ0LWRlbGV0ZWQgKHBvaW50KSkKICAgIChnb3Rv LWNoYXIgc3RhcnQpCiAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtY29sdW1uIHNhdmUtY3VycmVu dC1jb2x1bW4pCiAgICAoc2V0cSB0ZXJtLXN0YXJ0LWxpbmUtY29sdW1uIHNhdmUtc3RhcnQt bGluZS1jb2x1bW4pCiAgICAoc2V0cSB0ZXJtLWN1cnJlbnQtcm93IHNhdmUtY3VycmVudC1y b3cpCiAgICAodGVybS1pbnNlcnQtY2hhciA/XG4gbGluZXMpCiAgICAoZ290by1jaGFyIHN0 YXJ0KSkpCgwKKGRlZnVuIHRlcm0tc3RhcnQtb3V0cHV0LWxvZyAobmFtZSkKICAiUmVjb3Jk IHJhdyBpbmZlcmlvciBwcm9jZXNzIG91dHB1dCBpbiBhIGJ1ZmZlci4iCiAgKGludGVyYWN0 aXZlIChsaXN0IChpZiB0ZXJtLWxvZy1idWZmZXIKCQkJIG5pbAoJCSAgICAgICAocmVhZC1i dWZmZXIgIlJlY29yZCBvdXRwdXQgaW4gYnVmZmVyOiAiCgkJCQkgICAgKGZvcm1hdCAiJXMg b3V0cHV0LWxvZyIKCQkJCQkgICAgKGJ1ZmZlci1uYW1lIChjdXJyZW50LWJ1ZmZlcikpKQoJ CQkJICAgIG5pbCkpKSkKICAoaWYgKG9yIChudWxsIG5hbWUpIChlcXVhbCBuYW1lICIiKSkK ICAgICAgKHByb2duIChzZXRxIHRlcm0tbG9nLWJ1ZmZlciBuaWwpCgkgICAgIChtZXNzYWdl ICJPdXRwdXQgbG9nZ2luZyBvZmYuIikpCiAgICAoaWYgKGdldC1idWZmZXIgbmFtZSkKCW5p bAogICAgICAoc2F2ZS1leGN1cnNpb24KCShzZXQtYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0 ZSBuYW1lKSkKCShmdW5kYW1lbnRhbC1tb2RlKQoJKGJ1ZmZlci1kaXNhYmxlLXVuZG8gKGN1 cnJlbnQtYnVmZmVyKSkKCShlcmFzZS1idWZmZXIpKSkKICAgIChzZXRxIHRlcm0tbG9nLWJ1 ZmZlciAoZ2V0LWJ1ZmZlciBuYW1lKSkKICAgIChtZXNzYWdlICJSZWNvcmRpbmcgdGVybWlu YWwgZW11bGF0b3Igb3V0cHV0IGludG8gYnVmZmVyIFwiJXNcIiIKCSAgICAgKGJ1ZmZlci1u YW1lIHRlcm0tbG9nLWJ1ZmZlcikpKSkKCihkZWZ1biB0ZXJtLXN0b3Atb3V0cHV0LWxvZyAo KQogICJEaXNjb250aW51ZSByYXcgaW5mZXJpb3IgcHJvY2VzcyBsb2dnaW5nLiIKICAoaW50 ZXJhY3RpdmUpCiAgKHRlcm0tc3RhcnQtb3V0cHV0LWxvZyBuaWwpKQoKKGRlZnVuIHRlcm0t c2hvdy1tYXhpbXVtLW91dHB1dCAoKQogICJQdXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGF0 IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdy4iCiAgKGludGVyYWN0aXZlKQogIChnb3RvLWNo YXIgKHBvaW50LW1heCkpCiAgKHJlY2VudGVyIC0xKSkKDAo7OzsgRG8gdGhlIHVzZXIncyBj dXN0b21pc2F0aW9uLi4uCgooZGVmdmFyIHRlcm0tbG9hZC1ob29rIG5pbAogICJUaGlzIGhv b2sgaXMgcnVuIHdoZW4gdGVybSBpcyBsb2FkZWQgaW4uClRoaXMgaXMgYSBnb29kIHBsYWNl IHRvIHB1dCBrZXliaW5kaW5ncy4iKQoKKHJ1bi1ob29rcyAndGVybS1sb2FkLWhvb2spCgoM Cjs7OyBGaWxlbmFtZS9jb21tYW5kL2hpc3RvcnkgY29tcGxldGlvbiBpbiBhIGJ1ZmZlcgo7 OzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Cjs7OyBVc2VmdWwgY29tcGxldGlvbiBmdW5jdGlv bnMsIGNvdXJ0ZXN5IG9mIHRoZSBFcmdvIGdyb3VwLgoKOzs7IFNpeCBjb21tYW5kczoKOzs7 IHRlcm0tZHluYW1pYy1jb21wbGV0ZQkJQ29tcGxldGUgb3IgZXhwYW5kIGNvbW1hbmQsIGZp bGVuYW1lLAo7OzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9y eSBhdCBwb2ludC4KOzs7IHRlcm0tZHluYW1pYy1jb21wbGV0ZS1maWxlbmFtZQlDb21wbGV0 ZSBmaWxlbmFtZSBhdCBwb2ludC4KOzs7IHRlcm0tZHluYW1pYy1saXN0LWZpbGVuYW1lLWNv bXBsZXRpb25zIExpc3QgY29tcGxldGlvbnMgaW4gaGVscCBidWZmZXIuCjs7OyB0ZXJtLXJl cGxhY2UtYnktZXhwYW5kZWQtZmlsZW5hbWUJRXhwYW5kIGFuZCBjb21wbGV0ZSBmaWxlbmFt ZSBhdCBwb2ludDsKOzs7CQkJCQlyZXBsYWNlIHdpdGggZXhwYW5kZWQvY29tcGxldGVkIG5h bWUuCjs7OyB0ZXJtLWR5bmFtaWMtc2ltcGxlLWNvbXBsZXRlCUNvbXBsZXRlIHN0dWIgZ2l2 ZW4gY2FuZGlkYXRlcy4KCjs7OyBUaGVzZSBhcmUgbm90IGluc3RhbGxlZCBpbiB0aGUgdGVy bS1tb2RlIGtleW1hcC4gIEJ1dCB0aGV5IGFyZQo7OzsgYXZhaWxhYmxlIGZvciBwZW9wbGUg d2hvIHdhbnQgdGhlbS4gIFNoZWxsLW1vZGUgaW5zdGFsbHMgdGhlbToKOzs7IChkZWZpbmUt a2V5IHNoZWxsLW1vZGUtbWFwICJcdCIgJ3Rlcm0tZHluYW1pYy1jb21wbGV0ZSkKOzs7IChk ZWZpbmUta2V5IHNoZWxsLW1vZGUtbWFwICJcTS0/Igo7OzsgICAgICAgICAgICAgJ3Rlcm0t ZHluYW1pYy1saXN0LWZpbGVuYW1lLWNvbXBsZXRpb25zKSkpCjs7Owo7OzsgQ29tbWFuZHMg bGlrZSB0aGlzIGFyZSBmaW5lIHRoaW5ncyB0byBwdXQgaW4gbG9hZCBob29rcyBpZiB5b3UK Ozs7IHdhbnQgdGhlbSBwcmVzZW50IGluIHNwZWNpZmljIG1vZGVzLgoKKGRlZnZhciB0ZXJt LWNvbXBsZXRpb24tYXV0b2xpc3QgbmlsCiAgIipJZiBub24tbmlsLCBhdXRvbWF0aWNhbGx5 IGxpc3QgcG9zc2liaWxpdGllcyBvbiBwYXJ0aWFsIGNvbXBsZXRpb24uClRoaXMgbWlycm9y cyB0aGUgb3B0aW9uYWwgYmVoYXZpb3Igb2YgdGNzaC4iKQoKKGRlZnZhciB0ZXJtLWNvbXBs ZXRpb24tYWRkc3VmZml4IHQKICAiKklmIG5vbi1uaWwsIGFkZCBhIGAvJyB0byBjb21wbGV0 ZWQgZGlyZWN0b3JpZXMsIGAgJyB0byBmaWxlIG5hbWVzLgpJZiBhIGNvbnMgcGFpciwgaXQg c2hvdWxkIGJlIG9mIHRoZSBmb3JtIChESVJTVUZGSVggLiBGSUxFU1VGRklYKSB3aGVyZQpE SVJTVUZGSVggYW5kIEZJTEVTVUZGSVggYXJlIHN0cmluZ3MgYWRkZWQgb24gdW5hbWJpZ3Vv dXMgb3IgZXhhY3QKY29tcGxldGlvbi4gIFRoaXMgbWlycm9ycyB0aGUgb3B0aW9uYWwgYmVo YXZpb3Igb2YgdGNzaC4iKQoKKGRlZnZhciB0ZXJtLWNvbXBsZXRpb24tcmVjZXhhY3Qgbmls CiAgIipJZiBub24tbmlsLCB1c2Ugc2hvcnRlc3QgY29tcGxldGlvbiBpZiBjaGFyYWN0ZXJz IGNhbm5vdCBiZSBhZGRlZC4KVGhpcyBtaXJyb3JzIHRoZSBvcHRpb25hbCBiZWhhdmlvciBv ZiB0Y3NoLgoKQSBub24tbmlsIHZhbHVlIGlzIHVzZWZ1bCBpZiBgdGVybS1jb21wbGV0aW9u LWF1dG9saXN0JyBpcyBub24tbmlsIHRvby4iKQoKKGRlZnZhciB0ZXJtLWNvbXBsZXRpb24t Zmlnbm9yZSBuaWwKICAiKkxpc3Qgb2Ygc3VmZml4ZXMgdG8gYmUgZGlzcmVnYXJkZWQgZHVy aW5nIGZpbGUgY29tcGxldGlvbi4KVGhpcyBtaXJyb3JzIHRoZSBvcHRpb25hbCBiZWhhdmlv ciBvZiBiYXNoIGFuZCB0Y3NoLgoKTm90ZSB0aGF0IHRoaXMgYXBwbGllcyB0byBgdGVybS1k eW5hbWljLWNvbXBsZXRlLWZpbGVuYW1lJyBvbmx5LiIpCgooZGVmdmFyIHRlcm0tZmlsZS1u YW1lLXByZWZpeCAiIgogICJQcmVmaXggcHJlcGVuZGVkIHRvIGFic29sdXRlIGZpbGUgbmFt ZXMgdGFrZW4gZnJvbSBwcm9jZXNzIGlucHV0LgpUaGlzIGlzIHVzZWQgYnkgdGVybSdzIGFu ZCBzaGVsbCdzIGNvbXBsZXRpb24gZnVuY3Rpb25zLCBhbmQgYnkgc2hlbGwncwpkaXJlY3Rv cnkgdHJhY2tpbmcgZnVuY3Rpb25zLiIpCgoKKGRlZnVuIHRlcm0tZGlyZWN0b3J5IChkaXJl Y3RvcnkpCiAgOzsgUmV0dXJuIGV4cGFuZGVkIERJUkVDVE9SWSwgd2l0aCBgdGVybS1maWxl LW5hbWUtcHJlZml4JyBpZiBhYnNvbHV0ZS4KICAoZXhwYW5kLWZpbGUtbmFtZSAoaWYgKGZp bGUtbmFtZS1hYnNvbHV0ZS1wIGRpcmVjdG9yeSkKCQkJKGNvbmNhdCB0ZXJtLWZpbGUtbmFt ZS1wcmVmaXggZGlyZWN0b3J5KQoJCSAgICAgIGRpcmVjdG9yeSkpKQoKCihkZWZ1biB0ZXJt LXdvcmQgKHdvcmQtY2hhcnMpCiAgIlJldHVybiB0aGUgd29yZCBvZiBXT1JELUNIQVJTIGF0 IHBvaW50LCBvciBuaWwgaWYgbm9uZSBpcyBmb3VuZC4KV29yZCBjb25zdGl0dWVudHMgYXJl IGNvbnNpZGVyZWQgdG8gYmUgdGhvc2UgaW4gV09SRC1DSEFSUywgd2hpY2ggaXMgbGlrZSB0 aGUKaW5zaWRlIG9mIGEgXCJbLi4uXVwiIChzZWUgYHNraXAtY2hhcnMtZm9yd2FyZCcpLiIK ICAoc2F2ZS1leGN1cnNpb24KICAgIChsZXQgKChsaW1pdCAocG9pbnQpKQoJICAod29yZCAo Y29uY2F0ICJbIiB3b3JkLWNoYXJzICJdIikpCgkgIChub24td29yZCAoY29uY2F0ICJbXiIg d29yZC1jaGFycyAiXSIpKSkKICAgICAgKHdoZW4gKHJlLXNlYXJjaC1iYWNrd2FyZCBub24t d29yZCBuaWwgJ21vdmUpCgkoZm9yd2FyZC1jaGFyIDEpKQogICAgICA7OyBBbmNob3IgdGhl IHNlYXJjaCBmb3J3YXJkcy4KICAgICAgKGlmIChvciAoZW9scCkgKGxvb2tpbmctYXQgbm9u LXdvcmQpKQoJICBuaWwKCShyZS1zZWFyY2gtZm9yd2FyZCAoY29uY2F0IHdvcmQgIisiKSBs aW1pdCkKCShidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMCkgKG1hdGNoLWVu ZCAwKSkpKSkpCgoKKGRlZnVuIHRlcm0tbWF0Y2gtcGFydGlhbC1maWxlbmFtZSAoKQogICJS ZXR1cm4gdGhlIGZpbGVuYW1lIGF0IHBvaW50LCBvciBuaWwgaWYgbm9uZSBpcyBmb3VuZC4K RW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdWJzdGl0dXRlZC4gIFNlZSBgdGVybS13b3Jk Jy4iCiAgKGxldCAoKGZpbGVuYW1lICh0ZXJtLXdvcmQgIn4vQS1aYS16MC05K0A6Xy4kIyw9 e30tIikpKQogICAgKGFuZCBmaWxlbmFtZSAoc3Vic3RpdHV0ZS1pbi1maWxlLW5hbWUgZmls ZW5hbWUpKSkpCgoKKGRlZnVuIHRlcm0tZHluYW1pYy1jb21wbGV0ZSAoKQogICJEeW5hbWlj YWxseSBwZXJmb3JtIGNvbXBsZXRpb24gYXQgcG9pbnQuCkNhbGxzIHRoZSBmdW5jdGlvbnMg aW4gYHRlcm0tZHluYW1pYy1jb21wbGV0ZS1mdW5jdGlvbnMnIHRvIHBlcmZvcm0KY29tcGxl dGlvbiB1bnRpbCBhIGZ1bmN0aW9uIHJldHVybnMgbm9uLW5pbCwgYXQgd2hpY2ggcG9pbnQg Y29tcGxldGlvbiBpcwphc3N1bWVkIHRvIGhhdmUgb2NjdXJyZWQuIgogIChpbnRlcmFjdGl2 ZSkKICAobGV0ICgoZnVuY3Rpb25zIHRlcm0tZHluYW1pYy1jb21wbGV0ZS1mdW5jdGlvbnMp KQogICAgKHdoaWxlIChhbmQgZnVuY3Rpb25zIChudWxsIChmdW5jYWxsIChjYXIgZnVuY3Rp b25zKSkpKQogICAgICAoc2V0cSBmdW5jdGlvbnMgKGNkciBmdW5jdGlvbnMpKSkpKQoKCihk ZWZ1biB0ZXJtLWR5bmFtaWMtY29tcGxldGUtZmlsZW5hbWUgKCkKICAiRHluYW1pY2FsbHkg Y29tcGxldGUgdGhlIGZpbGVuYW1lIGF0IHBvaW50LgpDb21wbGV0ZXMgaWYgYWZ0ZXIgYSBm aWxlbmFtZS4gIFNlZSBgdGVybS1tYXRjaC1wYXJ0aWFsLWZpbGVuYW1lJyBhbmQKYHRlcm0t ZHluYW1pYy1jb21wbGV0ZS1hcy1maWxlbmFtZScuClRoaXMgZnVuY3Rpb24gaXMgc2ltaWxh ciB0byBgdGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWZpbGVuYW1lJywgZXhjZXB0IHRoYXQK aXQgd29uJ3QgY2hhbmdlIHBhcnRzIG9mIHRoZSBmaWxlbmFtZSBhbHJlYWR5IGVudGVyZWQg aW4gdGhlIGJ1ZmZlcjsgaXQganVzdAphZGRzIGNvbXBsZXRpb24gY2hhcmFjdGVycyB0byB0 aGUgZW5kIG9mIHRoZSBmaWxlbmFtZS4gIEEgY29tcGxldGlvbnMgbGlzdGluZwptYXkgYmUg c2hvd24gaW4gYSBoZWxwIGJ1ZmZlciBpZiBjb21wbGV0aW9uIGlzIGFtYmlndW91cy4KCkNv bXBsZXRpb24gaXMgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZiBgdGVybS1jb21wbGV0aW9u LWFkZHN1ZmZpeCcsCmB0ZXJtLWNvbXBsZXRpb24tcmVjZXhhY3QnIGFuZCBgdGVybS1jb21w bGV0aW9uLWZpZ25vcmUnLCBhbmQgdGhlIHRpbWluZyBvZgpjb21wbGV0aW9ucyBsaXN0aW5n IGlzIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYHRlcm0tY29tcGxldGlvbi1hdXRvbGlz dCcuCgpSZXR1cm5zIHQgaWYgc3VjY2Vzc2Z1bC4iCiAgKGludGVyYWN0aXZlKQogICh3aGVu ICh0ZXJtLW1hdGNoLXBhcnRpYWwtZmlsZW5hbWUpCiAgICAocHJvZzIgKG9yIChlcSAoc2Vs ZWN0ZWQtd2luZG93KSAobWluaWJ1ZmZlci13aW5kb3cpKQoJICAgICAgIChtZXNzYWdlICJD b21wbGV0aW5nIGZpbGUgbmFtZS4uLiIpKQoJKHRlcm0tZHluYW1pYy1jb21wbGV0ZS1hcy1m aWxlbmFtZSkpKSkKCihkZWZ1biB0ZXJtLWR5bmFtaWMtY29tcGxldGUtYXMtZmlsZW5hbWUg KCkKICAiRHluYW1pY2FsbHkgY29tcGxldGUgYXQgcG9pbnQgYXMgYSBmaWxlbmFtZS4KU2Vl IGB0ZXJtLWR5bmFtaWMtY29tcGxldGUtZmlsZW5hbWUnLiAgUmV0dXJucyB0IGlmIHN1Y2Nl c3NmdWwuIgogIChsZXQqICgoY29tcGxldGlvbi1pZ25vcmUtY2FzZSBuaWwpCgkgKGNvbXBs ZXRpb24taWdub3JlZC1leHRlbnNpb25zIHRlcm0tY29tcGxldGlvbi1maWdub3JlKQoJIChz dWNjZXNzIHQpCgkgKGRpcnN1ZmZpeCAoY29uZCAoKG5vdCB0ZXJtLWNvbXBsZXRpb24tYWRk c3VmZml4KSAiIikKCQkJICAoKG5vdCAoY29uc3AgdGVybS1jb21wbGV0aW9uLWFkZHN1ZmZp eCkpICIvIikKCQkJICAodCAoY2FyIHRlcm0tY29tcGxldGlvbi1hZGRzdWZmaXgpKSkpCgkg KGZpbGVzdWZmaXggKGNvbmQgKChub3QgdGVybS1jb21wbGV0aW9uLWFkZHN1ZmZpeCkgIiIp CgkJCSAgICgobm90IChjb25zcCB0ZXJtLWNvbXBsZXRpb24tYWRkc3VmZml4KSkgIiAiKQoJ CQkgICAodCAoY2RyIHRlcm0tY29tcGxldGlvbi1hZGRzdWZmaXgpKSkpCgkgKGZpbGVuYW1l IChvciAodGVybS1tYXRjaC1wYXJ0aWFsLWZpbGVuYW1lKSAiIikpCgkgKHBhdGhkaXIgKGZp bGUtbmFtZS1kaXJlY3RvcnkgZmlsZW5hbWUpKQoJIChwYXRobm9uZGlyIChmaWxlLW5hbWUt bm9uZGlyZWN0b3J5IGZpbGVuYW1lKSkKCSAoZGlyZWN0b3J5IChpZiBwYXRoZGlyICh0ZXJt LWRpcmVjdG9yeSBwYXRoZGlyKSBkZWZhdWx0LWRpcmVjdG9yeSkpCgkgKGNvbXBsZXRpb24g KGZpbGUtbmFtZS1jb21wbGV0aW9uIHBhdGhub25kaXIgZGlyZWN0b3J5KSkKCSAobWluaS1m bGFnIChlcSAoc2VsZWN0ZWQtd2luZG93KSAobWluaWJ1ZmZlci13aW5kb3cpKSkpCiAgICAo Y29uZCAoKG51bGwgY29tcGxldGlvbikKICAgICAgICAgICAobWVzc2FnZSAiTm8gY29tcGxl dGlvbnMgb2YgJXMiIGZpbGVuYW1lKQoJICAgKHNldHEgc3VjY2VzcyBuaWwpKQogICAgICAg ICAgKChlcSBjb21wbGV0aW9uIHQpICAgICAgICAgICAgOyBNZWFucyBhbHJlYWR5IGNvbXBs ZXRlZCAiZmlsZSIuCiAgICAgICAgICAgKHdoZW4gdGVybS1jb21wbGV0aW9uLWFkZHN1ZmZp eCAoaW5zZXJ0ICIgIikpCiAgICAgICAgICAgKG9yIG1pbmktZmxhZyAobWVzc2FnZSAiU29s ZSBjb21wbGV0aW9uIikpKQogICAgICAgICAgKChzdHJpbmctZXF1YWwgY29tcGxldGlvbiAi IikgOyBNZWFucyBjb21wbGV0aW9uIG9uICJkaXJlY3RvcnkvIi4KICAgICAgICAgICAodGVy bS1keW5hbWljLWxpc3QtZmlsZW5hbWUtY29tcGxldGlvbnMpKQogICAgICAgICAgKHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOyBDb21wbGV0aW9uIHN0cmluZyByZXR1cm5lZC4K ICAgICAgICAgICAobGV0ICgoZmlsZSAoY29uY2F0IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5 IGRpcmVjdG9yeSkgY29tcGxldGlvbikpKQogICAgICAgICAgICAgKGluc2VydCAoc3Vic3Ry aW5nIChkaXJlY3RvcnktZmlsZS1uYW1lIGNvbXBsZXRpb24pCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGxlbmd0aCBwYXRobm9uZGlyKSkpCiAgICAgICAgICAgICAoY29u ZCAoKHN5bWJvbHAgKGZpbGUtbmFtZS1jb21wbGV0aW9uIGNvbXBsZXRpb24gZGlyZWN0b3J5 KSkKICAgICAgICAgICAgICAgICAgICA7OyBXZSBpbnNlcnRlZCBhIHVuaXF1ZSBjb21wbGV0 aW9uLgoJCSAgICAoaW5zZXJ0IChpZiAoZmlsZS1kaXJlY3RvcnktcCBmaWxlKSBkaXJzdWZm aXggZmlsZXN1ZmZpeCkpCiAgICAgICAgICAgICAgICAgICAgKG9yIG1pbmktZmxhZyAobWVz c2FnZSAiQ29tcGxldGVkIikpKQogICAgICAgICAgICAgICAgICAgKChhbmQgdGVybS1jb21w bGV0aW9uLXJlY2V4YWN0IHRlcm0tY29tcGxldGlvbi1hZGRzdWZmaXgKICAgICAgICAgICAg ICAgICAgICAgICAgIChzdHJpbmctZXF1YWwgcGF0aG5vbmRpciBjb21wbGV0aW9uKQogICAg ICAgICAgICAgICAgICAgICAgICAgKGZpbGUtZXhpc3RzLXAgZmlsZSkpCiAgICAgICAgICAg ICAgICAgICAgOzsgSXQncyBub3QgdW5pcXVlLCBidXQgdXNlciB3YW50cyBzaG9ydGVzdCBt YXRjaC4KCQkgICAgKGluc2VydCAoaWYgKGZpbGUtZGlyZWN0b3J5LXAgZmlsZSkgZGlyc3Vm Zml4IGZpbGVzdWZmaXgpKQogICAgICAgICAgICAgICAgICAgIChvciBtaW5pLWZsYWcgKG1l c3NhZ2UgIkNvbXBsZXRlZCBzaG9ydGVzdCIpKSkKICAgICAgICAgICAgICAgICAgICgob3Ig dGVybS1jb21wbGV0aW9uLWF1dG9saXN0CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJp bmctZXF1YWwgcGF0aG5vbmRpciBjb21wbGV0aW9uKSkKICAgICAgICAgICAgICAgICAgICA7 OyBJdCdzIG5vdCB1bmlxdWUsIGxpc3QgcG9zc2libGUgY29tcGxldGlvbnMuCiAgICAgICAg ICAgICAgICAgICAgKHRlcm0tZHluYW1pYy1saXN0LWZpbGVuYW1lLWNvbXBsZXRpb25zKSkK ICAgICAgICAgICAgICAgICAgICh0CiAgICAgICAgICAgICAgICAgICAgKG9yIG1pbmktZmxh ZyAobWVzc2FnZSAiUGFydGlhbGx5IGNvbXBsZXRlZCIpKSkpKSkpCiAgICBzdWNjZXNzKSkK CgooZGVmdW4gdGVybS1yZXBsYWNlLWJ5LWV4cGFuZGVkLWZpbGVuYW1lICgpCiAgIkR5bmFt aWNhbGx5IGV4cGFuZCBhbmQgY29tcGxldGUgdGhlIGZpbGVuYW1lIGF0IHBvaW50LgpSZXBs YWNlIHRoZSBmaWxlbmFtZSB3aXRoIGFuIGV4cGFuZGVkLCBjYW5vbmljYWxpemVkIGFuZCBj b21wbGV0ZWQgcmVwbGFjZW1lbnQuClwiRXhwYW5kZWRcIiBtZWFucyBlbnZpcm9ubWVudCB2 YXJpYWJsZXMgKGUuZy4sICRIT01FKSBhbmQgYH4ncyBhcmUgcmVwbGFjZWQKd2l0aCB0aGUg Y29ycmVzcG9uZGluZyBkaXJlY3Rvcmllcy4gIFwiQ2Fub25pY2FsaXplZFwiIG1lYW5zIGAu LicgIGFuZCBgLicgYXJlCnJlbW92ZWQsIGFuZCB0aGUgZmlsZW5hbWUgaXMgbWFkZSBhYnNv bHV0ZSBpbnN0ZWFkIG9mIHJlbGF0aXZlLiAgRm9yIGV4cGFuc2lvbgpzZWUgYGV4cGFuZC1m aWxlLW5hbWUnIGFuZCBgc3Vic3RpdHV0ZS1pbi1maWxlLW5hbWUnLiAgRm9yIGNvbXBsZXRp b24gc2VlCmB0ZXJtLWR5bmFtaWMtY29tcGxldGUtZmlsZW5hbWUnLiIKICAoaW50ZXJhY3Rp dmUpCiAgKHJlcGxhY2UtbWF0Y2ggKGV4cGFuZC1maWxlLW5hbWUgKHRlcm0tbWF0Y2gtcGFy dGlhbC1maWxlbmFtZSkpIHQgdCkKICAodGVybS1keW5hbWljLWNvbXBsZXRlLWZpbGVuYW1l KSkKCgooZGVmdW4gdGVybS1keW5hbWljLXNpbXBsZS1jb21wbGV0ZSAoc3R1YiBjYW5kaWRh dGVzKQogICJEeW5hbWljYWxseSBjb21wbGV0ZSBTVFVCIGZyb20gQ0FORElEQVRFUyBsaXN0 LgpUaGlzIGZ1bmN0aW9uIGluc2VydHMgY29tcGxldGlvbiBjaGFyYWN0ZXJzIGF0IHBvaW50 IGJ5IGNvbXBsZXRpbmcgU1RVQiBmcm9tCnRoZSBzdHJpbmdzIGluIENBTkRJREFURVMuICBB IGNvbXBsZXRpb25zIGxpc3RpbmcgbWF5IGJlIHNob3duIGluIGEgaGVscCBidWZmZXIKaWYg Y29tcGxldGlvbiBpcyBhbWJpZ3VvdXMuCgpSZXR1cm5zIG5pbCBpZiBubyBjb21wbGV0aW9u IHdhcyBpbnNlcnRlZC4KUmV0dXJucyBgc29sZScgaWYgY29tcGxldGVkIHdpdGggdGhlIG9u bHkgY29tcGxldGlvbiBtYXRjaC4KUmV0dXJucyBgc2hvcnRlc3QnIGlmIGNvbXBsZXRlZCB3 aXRoIHRoZSBzaG9ydGVzdCBvZiB0aGUgY29tcGxldGlvbiBtYXRjaGVzLgpSZXR1cm5zIGBw YXJ0aWFsJyBpZiBjb21wbGV0ZWQgYXMgZmFyIGFzIHBvc3NpYmxlIHdpdGggdGhlIGNvbXBs ZXRpb24gbWF0Y2hlcy4KUmV0dXJucyBgbGlzdGVkJyBpZiBhIGNvbXBsZXRpb24gbGlzdGlu ZyB3YXMgc2hvd24uCgpTZWUgYWxzbyBgdGVybS1keW5hbWljLWNvbXBsZXRlLWZpbGVuYW1l Jy4iCiAgKGxldCogKChjb21wbGV0aW9uLWlnbm9yZS1jYXNlIG5pbCkKCSAoY2FuZGlkYXRl cyAobWFwY2FyIChmdW5jdGlvbiAobGFtYmRhICh4KSAobGlzdCB4KSkpIGNhbmRpZGF0ZXMp KQoJIChjb21wbGV0aW9ucyAoYWxsLWNvbXBsZXRpb25zIHN0dWIgY2FuZGlkYXRlcykpKQog ICAgKGNvbmQgKChudWxsIGNvbXBsZXRpb25zKQogCSAgIChtZXNzYWdlICJObyBjb21wbGV0 aW9ucyBvZiAlcyIgc3R1YikKCSAgIG5pbCkKIAkgICgoPSAxIChsZW5ndGggY29tcGxldGlv bnMpKQk7IEdvdGNoYSEKIAkgICAobGV0ICgoY29tcGxldGlvbiAoY2FyIGNvbXBsZXRpb25z KSkpCiAJICAgICAoaWYgKHN0cmluZy1lcXVhbCBjb21wbGV0aW9uIHN0dWIpCiAJCSAobWVz c2FnZSAiU29sZSBjb21wbGV0aW9uIikKIAkgICAgICAgKGluc2VydCAoc3Vic3RyaW5nIGNv bXBsZXRpb24gKGxlbmd0aCBzdHViKSkpCiAJICAgICAgIChtZXNzYWdlICJDb21wbGV0ZWQi KSkKCSAgICAgKHdoZW4gdGVybS1jb21wbGV0aW9uLWFkZHN1ZmZpeCAoaW5zZXJ0ICIgIikp CgkgICAgICdzb2xlKSkKIAkgICh0CQkJCTsgVGhlcmUncyBubyB1bmlxdWUgY29tcGxldGlv bi4KIAkgICAobGV0ICgoY29tcGxldGlvbiAodHJ5LWNvbXBsZXRpb24gc3R1YiBjYW5kaWRh dGVzKSkpCiAJICAgICA7OyBJbnNlcnQgdGhlIGxvbmdlc3Qgc3Vic3RyaW5nLgogCSAgICAg KGluc2VydCAoc3Vic3RyaW5nIGNvbXBsZXRpb24gKGxlbmd0aCBzdHViKSkpCiAJICAgICAo Y29uZCAoKGFuZCB0ZXJtLWNvbXBsZXRpb24tcmVjZXhhY3QgdGVybS1jb21wbGV0aW9uLWFk ZHN1ZmZpeAogCQkJIChzdHJpbmctZXF1YWwgc3R1YiBjb21wbGV0aW9uKQogCQkJIChtZW1i ZXIgY29tcGxldGlvbiBjb21wbGV0aW9ucykpCiAJCSAgICA7OyBJdCdzIG5vdCB1bmlxdWUs IGJ1dCB1c2VyIHdhbnRzIHNob3J0ZXN0IG1hdGNoLgogCQkgICAgKGluc2VydCAiICIpCiAJ CSAgICAobWVzc2FnZSAiQ29tcGxldGVkIHNob3J0ZXN0IikKCQkgICAgJ3Nob3J0ZXN0KQog CQkgICAoKG9yIHRlcm0tY29tcGxldGlvbi1hdXRvbGlzdAogCQkJKHN0cmluZy1lcXVhbCBz dHViIGNvbXBsZXRpb24pKQogCQkgICAgOzsgSXQncyBub3QgdW5pcXVlLCBsaXN0IHBvc3Np YmxlIGNvbXBsZXRpb25zLgogCQkgICAgKHRlcm0tZHluYW1pYy1saXN0LWNvbXBsZXRpb25z IGNvbXBsZXRpb25zKQoJCSAgICAnbGlzdGVkKQogCQkgICAodAoJCSAgICAobWVzc2FnZSAi UGFydGlhbGx5IGNvbXBsZXRlZCIpCgkJICAgICdwYXJ0aWFsKSkpKSkpKQoKCihkZWZ1biB0 ZXJtLWR5bmFtaWMtbGlzdC1maWxlbmFtZS1jb21wbGV0aW9ucyAoKQogICJMaXN0IGluIGhl bHAgYnVmZmVyIHBvc3NpYmxlIGNvbXBsZXRpb25zIG9mIHRoZSBmaWxlbmFtZSBhdCBwb2lu dC4iCiAgKGludGVyYWN0aXZlKQogIChsZXQqICgoY29tcGxldGlvbi1pZ25vcmUtY2FzZSBu aWwpCgkgKGZpbGVuYW1lIChvciAodGVybS1tYXRjaC1wYXJ0aWFsLWZpbGVuYW1lKSAiIikp CgkgKHBhdGhkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZW5hbWUpKQoJIChwYXRobm9u ZGlyIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGVuYW1lKSkKCSAoZGlyZWN0b3J5IChp ZiBwYXRoZGlyICh0ZXJtLWRpcmVjdG9yeSBwYXRoZGlyKSBkZWZhdWx0LWRpcmVjdG9yeSkp CgkgKGNvbXBsZXRpb25zIChmaWxlLW5hbWUtYWxsLWNvbXBsZXRpb25zIHBhdGhub25kaXIg ZGlyZWN0b3J5KSkpCiAgICAoaWYgY29tcGxldGlvbnMKCSh0ZXJtLWR5bmFtaWMtbGlzdC1j b21wbGV0aW9ucyBjb21wbGV0aW9ucykKICAgICAgKG1lc3NhZ2UgIk5vIGNvbXBsZXRpb25z IG9mICVzIiBmaWxlbmFtZSkpKSkKCgooZGVmdW4gdGVybS1keW5hbWljLWxpc3QtY29tcGxl dGlvbnMgKGNvbXBsZXRpb25zKQogICJMaXN0IGluIGhlbHAgYnVmZmVyIHNvcnRlZCBDT01Q TEVUSU9OUy4KVHlwaW5nIFNQQyBmbHVzaGVzIHRoZSBoZWxwIGJ1ZmZlci4iCiAgKGxldCAo KGNvbmYgKGN1cnJlbnQtd2luZG93LWNvbmZpZ3VyYXRpb24pKSkKICAgICh3aXRoLW91dHB1 dC10by10ZW1wLWJ1ZmZlciAiKkNvbXBsZXRpb25zKiIKICAgICAgKGRpc3BsYXktY29tcGxl dGlvbi1saXN0IChzb3J0IGNvbXBsZXRpb25zICdzdHJpbmctbGVzc3ApKSkKICAgIChtZXNz YWdlICJIaXQgc3BhY2UgdG8gZmx1c2giKQogICAgKGxldCAoa2V5IGZpcnN0KQogICAgICAo aWYgKHNhdmUtZXhjdXJzaW9uCgkgICAgKHNldC1idWZmZXIgKGdldC1idWZmZXIgIipDb21w bGV0aW9ucyoiKSkKCSAgICAoc2V0cSBrZXkgKHJlYWQta2V5LXNlcXVlbmNlIG5pbCkKCQkg IGZpcnN0IChhcmVmIGtleSAwKSkKCSAgICAoYW5kIChjb25zcCBmaXJzdCkKCQkgKGVxICh3 aW5kb3ctYnVmZmVyIChwb3NuLXdpbmRvdyAoZXZlbnQtc3RhcnQgZmlyc3QpKSkKCQkgICAg IChnZXQtYnVmZmVyICIqQ29tcGxldGlvbnMqIikpCgkJIChlcSAoa2V5LWJpbmRpbmcga2V5 KSAnbW91c2UtY2hvb3NlLWNvbXBsZXRpb24pKSkKCSAgOzsgSWYgdGhlIHVzZXIgZG9lcyBt b3VzZS1jaG9vc2UtY29tcGxldGlvbiB3aXRoIHRoZSBtb3VzZSwKCSAgOzsgZXhlY3V0ZSB0 aGUgY29tbWFuZCwgdGhlbiBkZWxldGUgdGhlIGNvbXBsZXRpb24gd2luZG93LgoJICAocHJv Z24KCSAgICAobW91c2UtY2hvb3NlLWNvbXBsZXRpb24gZmlyc3QpCgkgICAgKHNldC13aW5k b3ctY29uZmlndXJhdGlvbiBjb25mKSkKCShpZiAoZXEgZmlyc3QgP1xzKQoJICAgIChzZXQt d2luZG93LWNvbmZpZ3VyYXRpb24gY29uZikKCSAgKHNldHEgdW5yZWFkLWNvbW1hbmQtZXZl bnRzIChsaXN0aWZ5LWtleS1zZXF1ZW5jZSBrZXkpKSkpKSkpCgo7OzsgSSBuZWVkIGEgbWFr ZS10ZXJtIHRoYXQgZG9lc24ndCBzdXJyb3VuZCB3aXRoICpzIC1tbQooZGVmdW4gdGVybS1h bnNpLW1ha2UtdGVybSAobmFtZSBwcm9ncmFtICZvcHRpb25hbCBzdGFydGZpbGUgJnJlc3Qg c3dpdGNoZXMpCiJNYWtlIGEgdGVybSBwcm9jZXNzIE5BTUUgaW4gYSBidWZmZXIsIHJ1bm5p bmcgUFJPR1JBTS4KVGhlIG5hbWUgb2YgdGhlIGJ1ZmZlciBpcyBOQU1FLgpJZiB0aGVyZSBp cyBhbHJlYWR5IGEgcnVubmluZyBwcm9jZXNzIGluIHRoYXQgYnVmZmVyLCBpdCBpcyBub3Qg cmVzdGFydGVkLgpPcHRpb25hbCB0aGlyZCBhcmcgU1RBUlRGSUxFIGlzIHRoZSBuYW1lIG9m IGEgZmlsZSB0byBzZW5kIHRoZSBjb250ZW50cyBvZiB0bwp0aGUgcHJvY2Vzcy4gIEFueSBt b3JlIGFyZ3MgYXJlIGFyZ3VtZW50cyB0byBQUk9HUkFNLiIKICAobGV0ICgoYnVmZmVyIChn ZXQtYnVmZmVyLWNyZWF0ZSBuYW1lICkpKQogICAgOzsgSWYgbm8gcHJvY2Vzcywgb3IgbnVr ZWQgcHJvY2VzcywgY3JhbmsgdXAgYSBuZXcgb25lIGFuZCBwdXQgYnVmZmVyIGluCiAgICA7 OyB0ZXJtIG1vZGUuICBPdGhlcndpc2UsIGxlYXZlIGJ1ZmZlciBhbmQgZXhpc3RpbmcgcHJv Y2VzcyBhbG9uZS4KICAgIChjb25kICgobm90ICh0ZXJtLWNoZWNrLXByb2MgYnVmZmVyKSkK CSAgIChzYXZlLWV4Y3Vyc2lvbgoJICAgICAoc2V0LWJ1ZmZlciBidWZmZXIpCgkgICAgICh0 ZXJtLW1vZGUpKSA7IEluc3RhbGwgbG9jYWwgdmFycywgbW9kZSwga2V5bWFwLCAuLi4KCSAg ICh0ZXJtLWV4ZWMgYnVmZmVyIG5hbWUgcHJvZ3JhbSBzdGFydGZpbGUgc3dpdGNoZXMpKSkK ICAgIGJ1ZmZlcikpCgooZGVmdmFyIHRlcm0tYW5zaS1idWZmZXItbmFtZSBuaWwpCihkZWZ2 YXIgdGVybS1hbnNpLWRlZmF1bHQtcHJvZ3JhbSBuaWwpCihkZWZ2YXIgdGVybS1hbnNpLWJ1 ZmZlci1iYXNlLW5hbWUgbmlsKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIGFuc2ktdGVybSAo cHJvZ3JhbSAmb3B0aW9uYWwgbmV3LWJ1ZmZlci1uYW1lKQogICJTdGFydCBhIHRlcm1pbmFs LWVtdWxhdG9yIGluIGEgbmV3IGJ1ZmZlci4iCiAgKGludGVyYWN0aXZlIChsaXN0IChyZWFk LWZyb20tbWluaWJ1ZmZlciAiUnVuIHByb2dyYW06ICIKCQkJCQkgICAob3IgZXhwbGljaXQt c2hlbGwtZmlsZS1uYW1lCgkJCQkJICAgICAgIChnZXRlbnYgIkVTSEVMTCIpCgkJCQkJICAg ICAgIChnZXRlbnYgIlNIRUxMIikKCQkJCQkgICAgICAgIi9iaW4vc2giKSkpKQoKICA7OyBQ aWNrIHRoZSBuYW1lIG9mIHRoZSBuZXcgYnVmZmVyLgogIChzZXRxIHRlcm0tYW5zaS1idWZm ZXItbmFtZQoJKGlmIG5ldy1idWZmZXItbmFtZQoJICAgIG5ldy1idWZmZXItbmFtZQoJICAo aWYgdGVybS1hbnNpLWJ1ZmZlci1iYXNlLW5hbWUKCSAgICAgIChpZiAoZXEgdGVybS1hbnNp LWJ1ZmZlci1iYXNlLW5hbWUgdCkKCQkgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IHByb2dy YW0pCgkJdGVybS1hbnNpLWJ1ZmZlci1iYXNlLW5hbWUpCgkgICAgImFuc2ktdGVybSIpKSkK CiAgKHNldHEgdGVybS1hbnNpLWJ1ZmZlci1uYW1lIChjb25jYXQgIioiIHRlcm0tYW5zaS1i dWZmZXItbmFtZSAiKiIpKQoKICA7OyBJbiBvcmRlciB0byBoYXZlIG1vcmUgdGhhbiBvbmUg dGVybSBhY3RpdmUgYXQgYSB0aW1lCiAgOzsgSSdkIGxpa2UgdG8gaGF2ZSB0aGUgdGVybSBu YW1lcyBoYXZlIHRoZSAqdGVybS1hbnNpLXRlcm08Pz4qIGZvcm0sCiAgOzsgZm9yIG5vdyB0 aGV5IGhhdmUgdGhlICp0ZXJtLWFuc2ktdGVybSo8Pz4gZm9ybSBidXQgd2UnbGwgc2VlLi4u CgogIChzZXRxIHRlcm0tYW5zaS1idWZmZXItbmFtZSAoZ2VuZXJhdGUtbmV3LWJ1ZmZlci1u YW1lIHRlcm0tYW5zaS1idWZmZXItbmFtZSkpCiAgKHNldHEgdGVybS1hbnNpLWJ1ZmZlci1u YW1lICh0ZXJtLWFuc2ktbWFrZS10ZXJtIHRlcm0tYW5zaS1idWZmZXItbmFtZSBwcm9ncmFt KSkKCiAgKHNldC1idWZmZXIgdGVybS1hbnNpLWJ1ZmZlci1uYW1lKQogICh0ZXJtLW1vZGUp CiAgKHRlcm0tY2hhci1tb2RlKQoKOzsgSSB3YW5uYSBoYXZlIGZpbmQtZmlsZSBvbiBDLXgg Qy1mIC1tbQo7OyB5b3VyIG1pbGVhZ2UgbWF5IGRlZmluaXRlbHkgdmFyeSwgbWF5YmUgaXQn cyBiZXR0ZXIgdG8gcHV0IHRoaXMgaW4geW91cgo7OyAuZW1hY3MgLi4uCgogICh0ZXJtLXNl dC1lc2NhcGUtY2hhciA/XEMteCkKCiAgKHN3aXRjaC10by1idWZmZXIgdGVybS1hbnNpLWJ1 ZmZlci1uYW1lKSkKCgwKOzs7IFNlcmlhbCB0ZXJtaW5hbHMKOzs7ID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQooZGVmdW4gc2VyaWFsLXBvcnQtaXMtZmlsZS1wICgpCiAgIkd1ZXNzIHdoZXRo ZXIgc2VyaWFsIHBvcnRzIGFyZSBmaWxlcyBvbiB0aGlzIHN5c3RlbS4KUmV0dXJuIHQgaWYg dGhpcyBpcyBhIFVuaXgtYmFzZWQgc3lzdGVtLCB3aGVyZSBzZXJpYWwgcG9ydHMgYXJlCmZp bGVzLCBzdWNoIGFzIC9kZXYvdHR5UzAuClJldHVybiBuaWwgaWYgdGhpcyBpcyBXaW5kb3dz IG9yIERPUywgd2hlcmUgc2VyaWFsIHBvcnRzIGhhdmUKc3BlY2lhbCBpZGVudGlmaWVycyBz dWNoIGFzIENPTTEuIgogIChub3QgKG1lbWJlciBzeXN0ZW0tdHlwZSAobGlzdCAnd2luZG93 cy1udCAnY3lnd2luICdtcy1kb3MpKSkpCgooZGVmdmFyIHNlcmlhbC1uYW1lLWhpc3RvcnkK ICAoaWYgKHNlcmlhbC1wb3J0LWlzLWZpbGUtcCkKICAgICAgKG9yICh3aGVuIChmaWxlLWV4 aXN0cy1wICIvZGV2L3R0eXMwIikgKGxpc3QgIi9kZXYvdHR5czAiKSkKICAgICAgICAgICh3 aGVuIChmaWxlLWV4aXN0cy1wICIvZGV2L3R0eVMwIikgKGxpc3QgIi9kZXYvdHR5UzAiKSkp CiAgICAobGlzdCAiQ09NMSIpKQogICJIaXN0b3J5IG9mIHNlcmlhbCBwb3J0cyB1c2VkIGJ5 IGBzZXJpYWwtcmVhZC1uYW1lJy4iKQoKKGRlZnZhciBzZXJpYWwtc3BlZWQtaGlzdG9yeQog IDs7IEluaXRpYWxpc2VkIHdpdGggcmVhc29uYWJsZSB2YWx1ZXMgZm9yIG5ld2JpZXMuCiAg KGxpc3QgIjk2MDAiIDs7IEdpdmVuIHR3aWNlIGJlY2F1c2UgOTYwMCBiL3MgaXMgdGhlIG1v c3QgY29tbW9uIHNwZWVkCiAgICAgICAgIjEyMDAiICIyNDAwIiAiNDgwMCIgIjk2MDAiICIx NDQwMCIgIjE5MjAwIgogICAgICAgICIyODgwMCIgIjM4NDAwIiAiNTc2MDAiICIxMTUyMDAi KQogICJIaXN0b3J5IG9mIHNlcmlhbCBwb3J0IHNwZWVkcyB1c2VkIGJ5IGBzZXJpYWwtcmVh ZC1zcGVlZCcuIikKCihkZWZ1biBzZXJpYWwtbmljZS1zcGVlZC1oaXN0b3J5ICgpCiAgIlJl dHVybiBgc2VyaWFsLXNwZWVkLWhpc3RvcnknIGNsZWFuZWQgdXAgZm9yIGEgbW91c2UtbWVu dS4iCiAgKGxldCAoKHgpICh5KSkKICAgIChzZXRxIHgKICAgICAgICAgKHNvcnQKICAgICAg ICAgIChjb3B5LXNlcXVlbmNlIHNlcmlhbC1zcGVlZC1oaXN0b3J5KQogICAgICAgICAgJyhs YW1iZGEgKGEgYikgKHdoZW4gKGFuZCAoc3RyaW5ncCBhKSAoc3RyaW5ncCBiKSkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgKD4gKHN0cmluZy10by1udW1iZXIgYSkgKHN0cmluZy10 by1udW1iZXIgYikpKSkpKQogICAgKGRvbGlzdCAoaSB4KSAod2hlbiAobm90IChlcXVhbCBp IChjYXIgeSkpKSAocHVzaCBpIHkpKSkKICAgIHkpKQoKKGRlZmNvbnN0IHNlcmlhbC1uby1z cGVlZCAibmlsIgogICJTdHJpbmcgZm9yIGBzZXJpYWwtcmVhZC1zcGVlZCcgZm9yIHNwZWNp YWwgc2VyaWFsIHBvcnRzLgpJZiBgc2VyaWFsLXJlYWQtc3BlZWQnIHJlYWRzIHRoaXMgc3Ry aW5nIGZyb20gdGhlIHVzZXIsIGl0CnJldHVybnMgbmlsLCB3aGljaCBpcyByZWNvZ25pemVk IGJ5IGBzZXJpYWwtcHJvY2Vzcy1jb25maWd1cmUnCmZvciBzcGVjaWFsIHNlcmlhbCBwb3J0 cyB0aGF0IGNhbm5vdCBiZSBjb25maWd1cmVkLiIpCgooZGVmdW4gc2VyaWFsLXN1cHBvcnRl ZC1vci1iYXJmICgpCiAgIlNpZ25hbCBhbiBlcnJvciBpZiBzZXJpYWwgcHJvY2Vzc2VzIGFy ZSBub3Qgc3VwcG9ydGVkIgogICh1bmxlc3MgKGZib3VuZHAgJ21ha2Utc2VyaWFsLXByb2Nl c3MpCiAgICAoZXJyb3IgIlNlcmlhbCBwcm9jZXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24g dGhpcyBzeXN0ZW0iKSkpCgooZGVmdW4gc2VyaWFsLXJlYWQtbmFtZSAoKQogICJSZWFkIGEg c2VyaWFsIHBvcnQgbmFtZSBmcm9tIHRoZSB1c2VyLgpUcnkgdG8gYmUgbmljZSBieSBwcm92 aWRpbmcgdXNlZnVsIGRlZmF1bHRzIGFuZCBoaXN0b3J5LgpPbiBXaW5kb3dzLCBwcmVwZW5k IFxcLlwgdG8gdGhlIHBvcnQgbmFtZSB1bmxlc3MgaXQgYWxyZWFkeQpjb250YWlucyBhIGJh Y2tzbGFzaC4gIFRoaXMgaGFuZGxlcyB0aGUgbGVnYWN5IHBvcnRzIENPTTEtQ09NOSBhcwp3 ZWxsIGFzIHRoZSBuZXdlciBwb3J0cyBDT00xMCBhbmQgaGlnaGVyLiIKICAoc2VyaWFsLXN1 cHBvcnRlZC1vci1iYXJmKQogIChsZXQqICgoZmlsZS1uYW1lLWhpc3Rvcnkgc2VyaWFsLW5h bWUtaGlzdG9yeSkKICAgICAgICAgKGggKGNhciBmaWxlLW5hbWUtaGlzdG9yeSkpCiAgICAg ICAgICh4IChpZiAoc2VyaWFsLXBvcnQtaXMtZmlsZS1wKQogICAgICAgICAgICAgICAgKHJl YWQtZmlsZS1uYW1lCiAgICAgICAgICAgICAgICAgOzsgYHByb21wdCc6IFRoZSBtb3N0IHJl Y2VudGx5IHVzZWQgcG9ydCBpcyBwcm92aWRlZCBhcwogICAgICAgICAgICAgICAgIDs7IHRo ZSBkZWZhdWx0IHZhbHVlLCB3aGljaCBpcyB1c2VkIHdoZW4gdGhlIHVzZXIKICAgICAgICAg ICAgICAgICA7OyBzaW1wbHkgcHJlc3NlcyByZXR1cm4uCiAgICAgICAgICAgICAgICAgKGlm IChzdHJpbmdwIGgpIChmb3JtYXQgIlNlcmlhbCBwb3J0IChkZWZhdWx0ICVzKTogIiBoKQog ICAgICAgICAgICAgICAgICAgIlNlcmlhbCBwb3J0OiAiKQogICAgICAgICAgICAgICAgIDs7 IGBkaXJlY3RvcnknOiBNb3N0IHN5c3RlbXMgaGF2ZSB0aGVpciBzZXJpYWwgcG9ydHMKICAg ICAgICAgICAgICAgICA7OyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHNvIHN0YXJ0IGluIHRo ZSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICA7OyBvZiB0aGUgbW9zdCByZWNlbnRseSB1 c2VkIHBvcnQsIG9yIGluIGEgcmVhc29uYWJsZQogICAgICAgICAgICAgICAgIDs7IGRlZmF1 bHQgZGlyZWN0b3J5LgogICAgICAgICAgICAgICAgIChvciAoYW5kIGggKGZpbGUtbmFtZS1k aXJlY3RvcnkgaCkpCiAgICAgICAgICAgICAgICAgICAgIChhbmQgKGZpbGUtZXhpc3RzLXAg Ii9kZXYvIikgIi9kZXYvIikKICAgICAgICAgICAgICAgICAgICAgKGFuZCAoZmlsZS1leGlz dHMtcCAiLyIpICIvIikpCiAgICAgICAgICAgICAgICAgOzsgYGRlZmF1bHQnOiBUaGlzIGNh dXNlcyAocmVhZC1maWxlLW5hbWUpIHRvIHJldHVybgogICAgICAgICAgICAgICAgIDs7IHRo ZSBlbXB0eSBzdHJpbmcgaWYgaGUgdXNlciBzaW1wbHkgcHJlc3NlcyByZXR1cm4uCiAgICAg ICAgICAgICAgICAgOzsgVXNpbmcgbmlsIGhlcmUgbWF5IHJlc3VsdCBpbiBhIGRlZmF1bHQg ZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgOzsgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLCB3 aGljaCBpcyBub3QgdXNlZnVsIGZvcgogICAgICAgICAgICAgICAgIDs7IHNlcmlhbCBwb3J0 LgogICAgICAgICAgICAgICAgICIiKQogICAgICAgICAgICAgIChyZWFkLWZyb20tbWluaWJ1 ZmZlcgogICAgICAgICAgICAgICAoaWYgKHN0cmluZ3AgaCkgKGZvcm1hdCAiU2VyaWFsIHBv cnQgKGRlZmF1bHQgJXMpOiAiIGgpCiAgICAgICAgICAgICAgICAgIlNlcmlhbCBwb3J0OiAi KQogICAgICAgICAgICAgICBuaWwgbmlsIG5pbCAnKGZpbGUtbmFtZS1oaXN0b3J5IC4gMSkg bmlsIG5pbCkpKSkKICAgIChpZiAob3IgKG51bGwgeCkgKGFuZCAoc3RyaW5ncCB4KSAoemVy b3AgKGxlbmd0aCB4KSkpKQogICAgICAgIChzZXRxIHggaCkKICAgICAgKHNldHEgc2VyaWFs LW5hbWUtaGlzdG9yeSBmaWxlLW5hbWUtaGlzdG9yeSkpCiAgICAod2hlbiAob3IgKG51bGwg eCkgKGFuZCAoc3RyaW5ncCB4KSAoemVyb3AgKGxlbmd0aCB4KSkpKQogICAgICAoZXJyb3Ig Ik5vIHNlcmlhbCBwb3J0IHNlbGVjdGVkIikpCiAgICAod2hlbiAoYW5kIChub3QgKHNlcmlh bC1wb3J0LWlzLWZpbGUtcCkpCiAgICAgICAgICAgICAgIChub3QgKHN0cmluZy1tYXRjaCAi XFxcXCIgeCkpKQogICAgICAoc2V0ICd4IChjb25jYXQgIlxcXFwuXFwiIHgpKSkKICAgIHgp KQoKKGRlZnVuIHNlcmlhbC1yZWFkLXNwZWVkICgpCiAgIlJlYWQgYSBzZXJpYWwgcG9ydCBz cGVlZCAoaW4gYml0cyBwZXIgc2Vjb25kKSBmcm9tIHRoZSB1c2VyLgpUcnkgdG8gYmUgbmlj ZSBieSBwcm92aWRpbmcgdXNlZnVsIGRlZmF1bHRzIGFuZCBoaXN0b3J5LiIKICAoc2VyaWFs LXN1cHBvcnRlZC1vci1iYXJmKQogIChsZXQqICgoaGlzdG9yeSBzZXJpYWwtc3BlZWQtaGlz dG9yeSkKICAgICAgICAgKGggKGNhciBoaXN0b3J5KSkKICAgICAgICAgKHggKHJlYWQtZnJv bS1taW5pYnVmZmVyCiAgICAgICAgICAgICAoY29uZCAoKHN0cmluZz0gaCBzZXJpYWwtbm8t c3BlZWQpCiAgICAgICAgICAgICAgICAgICAgIlNwZWVkIChkZWZhdWx0IG5pbCA9IHNldCBi eSBwb3J0KTogIikKICAgICAgICAgICAgICAgICAgIChoCiAgICAgICAgICAgICAgICAgICAg KGZvcm1hdCAiU3BlZWQgKGRlZmF1bHQgJXMgYi9zKTogIiBoKSkKICAgICAgICAgICAgICAg ICAgICh0CgkJICAgIChmb3JtYXQgIlNwZWVkIChiL3MpOiAiKSkpCiAgICAgICAgICAgICBu aWwgbmlsIG5pbCAnKGhpc3RvcnkgLiAxKSBuaWwgbmlsKSkpCiAgICAod2hlbiAob3IgKG51 bGwgeCkgKGFuZCAoc3RyaW5ncCB4KSAoemVyb3AgKGxlbmd0aCB4KSkpKQogICAgICAoc2V0 cSB4IGgpKQogICAgKHdoZW4gKG9yIChudWxsIHgpIChub3QgKHN0cmluZ3AgeCkpICh6ZXJv cCAobGVuZ3RoIHgpKSkKICAgICAgKGVycm9yICJJbnZhbGlkIHNwZWVkIikpCiAgICAoaWYg KHN0cmluZz0geCBzZXJpYWwtbm8tc3BlZWQpCiAgICAgICAgKHNldHEgeCBuaWwpCiAgICAg IChzZXRxIHggKHN0cmluZy10by1udW1iZXIgeCkpCiAgICAgICh3aGVuIChvciAobnVsbCB4 KSAobm90IChpbnRlZ2VycCB4KSkgKDw9IHggMCkpCiAgICAgICAgKGVycm9yICJJbnZhbGlk IHNwZWVkIikpKQogICAgKHNldHEgc2VyaWFsLXNwZWVkLWhpc3RvcnkgaGlzdG9yeSkKICAg IHgpKQoKOzs7IyMjYXV0b2xvYWQKKGRlZnVuIHNlcmlhbC10ZXJtIChwb3J0IHNwZWVkKQog ICJTdGFydCBhIHRlcm1pbmFsLWVtdWxhdG9yIGZvciBhIHNlcmlhbCBwb3J0IGluIGEgbmV3 IGJ1ZmZlci4KUE9SVCBpcyB0aGUgcGF0aCBvciBuYW1lIG9mIHRoZSBzZXJpYWwgcG9ydC4g IEZvciBleGFtcGxlLCB0aGlzCmNvdWxkIGJlIFwiL2Rldi90dHlTMFwiIG9uIFVuaXguICBP biBXaW5kb3dzLCB0aGlzIGNvdWxkIGJlClwiQ09NMVwiIG9yIFwiXFxcXC5cXENPTTEwXCIu ClNQRUVEIGlzIHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQgaW4gYml0cyBwZXIgc2Vj b25kLiAgOTYwMAppcyBhIGNvbW1vbiB2YWx1ZS4gIFNQRUVEIGNhbiBiZSBuaWwsIHNlZQpg c2VyaWFsLXByb2Nlc3MtY29uZmlndXJlJyBmb3IgZGV0YWlscy4KVGhlIGJ1ZmZlciBpcyBp biBUZXJtIG1vZGU7IHNlZSBgdGVybS1tb2RlJyBmb3IgdGhlIGNvbW1hbmRzIHRvCnVzZSBp biB0aGF0IGJ1ZmZlci4KXFw8dGVybS1yYXctbWFwPlR5cGUgXFxbc3dpdGNoLXRvLWJ1ZmZl cl0gdG8gc3dpdGNoIHRvIGFub3RoZXIgYnVmZmVyLiIKICAoaW50ZXJhY3RpdmUgKGxpc3Qg KHNlcmlhbC1yZWFkLW5hbWUpIChzZXJpYWwtcmVhZC1zcGVlZCkpKQogIChzZXJpYWwtc3Vw cG9ydGVkLW9yLWJhcmYpCiAgKGxldCogKChwcm9jZXNzIChtYWtlLXNlcmlhbC1wcm9jZXNz CiAgICAgICAgICAgICAgICAgICA6cG9ydCBwb3J0CiAgICAgICAgICAgICAgICAgICA6c3Bl ZWQgc3BlZWQKICAgICAgICAgICAgICAgICAgIDpjb2RpbmcgJ25vLWNvbnZlcnNpb24KICAg ICAgICAgICAgICAgICAgIDpub3F1ZXJ5IHQpKQogICAgICAgICAoYnVmZmVyIChwcm9jZXNz LWJ1ZmZlciBwcm9jZXNzKSkpCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKHNldC1idWZm ZXIgYnVmZmVyKQogICAgICAodGVybS1tb2RlKQogICAgICAodGVybS1jaGFyLW1vZGUpCiAg ICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCiAgICAgIChzZXQtbWFya2VyIChwcm9jZXNz LW1hcmsgcHJvY2VzcykgKHBvaW50KSkKICAgICAgKHNldC1wcm9jZXNzLWZpbHRlciBwcm9j ZXNzICd0ZXJtLWVtdWxhdGUtdGVybWluYWwpCiAgICAgIChzZXQtcHJvY2Vzcy1zZW50aW5l bCBwcm9jZXNzICd0ZXJtLXNlbnRpbmVsKSkKICAgIChzd2l0Y2gtdG8tYnVmZmVyIGJ1ZmZl cikKICAgIGJ1ZmZlcikpCgooZGVmdmFyIHNlcmlhbC1tb2RlLWxpbmUtc3BlZWQtbWVudSBu aWwpCihkZWZ2YXIgc2VyaWFsLW1vZGUtbGluZS1jb25maWctbWVudSBuaWwpCgooZGVmdW4g c2VyaWFsLXNwZWVkICgpCiAgIlJldHVybiB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0 IG9mIHRoZSBjdXJyZW50IGJ1ZmZlcidzIHByb2Nlc3MuClRoZSByZXR1cm4gdmFsdWUgbWF5 IGJlIG5pbCBmb3IgYSBzcGVjaWFsIHNlcmlhbCBwb3J0LiIKICAocHJvY2Vzcy1jb250YWN0 IChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkgOnNwZWVkKSkKCihkZWZ1 biBzZXJpYWwtbW9kZS1saW5lLXNwZWVkLW1lbnUtMSAoZXZlbnQpCiAgKGludGVyYWN0aXZl ICJlIikKICAoc2F2ZS1zZWxlY3RlZC13aW5kb3cKICAgIChzZWxlY3Qtd2luZG93IChwb3Nu LXdpbmRvdyAoZXZlbnQtc3RhcnQgZXZlbnQpKSkKICAgIChzZXJpYWwtdXBkYXRlLXNwZWVk LW1lbnUpCiAgICAobGV0KiAoKHNlbGVjdGlvbiAoc2VyaWFsLW1vZGUtbGluZS1zcGVlZC1t ZW51IGV2ZW50KSkKCSAgIChiaW5kaW5nIChhbmQgc2VsZWN0aW9uIChsb29rdXAta2V5IHNl cmlhbC1tb2RlLWxpbmUtc3BlZWQtbWVudQoJCQkJCSAgICAgICAodmVjdG9yIChjYXIgc2Vs ZWN0aW9uKSkpKSkpCiAgICAgICh3aGVuIGJpbmRpbmcgKGNhbGwtaW50ZXJhY3RpdmVseSBi aW5kaW5nKSkpKSkKCihkZWZ1biBzZXJpYWwtbW9kZS1saW5lLXNwZWVkLW1lbnUgKGV2ZW50 KQogICh4LXBvcHVwLW1lbnUgZXZlbnQgc2VyaWFsLW1vZGUtbGluZS1zcGVlZC1tZW51KSkK CihkZWZ1biBzZXJpYWwtdXBkYXRlLXNwZWVkLW1lbnUgKCkKICAoc2V0cSBzZXJpYWwtbW9k ZS1saW5lLXNwZWVkLW1lbnUgKG1ha2Utc3BhcnNlLWtleW1hcCAiU3BlZWQgKGIvcykiKSkK ICAoZGVmaW5lLWtleSBzZXJpYWwtbW9kZS1saW5lLXNwZWVkLW1lbnUgW3NlcmlhbC1tb2Rl LWxpbmUtc3BlZWQtbWVudS1vdGhlcl0KICAgICcobWVudS1pdGVtICJPdGhlci4uLiIKICAg ICAgICAgICAgICAgIChsYW1iZGEgKGV2ZW50KSAoaW50ZXJhY3RpdmUgImUiKQogICAgICAg ICAgICAgICAgICAobGV0ICgoc3BlZWQgKHNlcmlhbC1yZWFkLXNwZWVkKSkpCiAgICAgICAg ICAgICAgICAgICAgKHNlcmlhbC1wcm9jZXNzLWNvbmZpZ3VyZSA6c3BlZWQgc3BlZWQpCiAg ICAgICAgICAgICAgICAgICAgKHRlcm0tdXBkYXRlLW1vZGUtbGluZSkKICAgICAgICAgICAg ICAgICAgICAobWVzc2FnZSAiU3BlZWQgc2V0IHRvICVkIGIvcyIgc3BlZWQpKSkpKQogIChk b2xpc3QgKHN0ciAoc2VyaWFsLW5pY2Utc3BlZWQtaGlzdG9yeSkpCiAgICAobGV0ICgobnVt IChvciAoYW5kIChzdHJpbmdwIHN0cikgKHN0cmluZy10by1udW1iZXIgc3RyKSkgMCkpKQog ICAgICAoZGVmaW5lLWtleQogICAgICAgIHNlcmlhbC1tb2RlLWxpbmUtc3BlZWQtbWVudQog ICAgICAgICh2ZWN0b3IgKG1ha2Utc3ltYm9sIChmb3JtYXQgInNlcmlhbC1tb2RlLWxpbmUt c3BlZWQtbWVudS0lcyIgc3RyKSkpCiAgICAgICAgYChtZW51LWl0ZW0KICAgICAgICAgICxz dHIKICAgICAgICAgIChsYW1iZGEgKGV2ZW50KSAoaW50ZXJhY3RpdmUgImUiKQogICAgICAg ICAgICAoc2VyaWFsLXByb2Nlc3MtY29uZmlndXJlIDpzcGVlZCAsbnVtKQogICAgICAgICAg ICAodGVybS11cGRhdGUtbW9kZS1saW5lKQogICAgICAgICAgICAobWVzc2FnZSAiU3BlZWQg c2V0IHRvICVkIGIvcyIgLG51bSkpCiAgICAgICAgICA6YnV0dG9uICg6dG9nZ2xlIC4gKD0g KHNlcmlhbC1zcGVlZCkgLG51bSkpKSkpKSkKCihkZWZ1biBzZXJpYWwtbW9kZS1saW5lLWNv bmZpZy1tZW51LTEgKGV2ZW50KQogIChpbnRlcmFjdGl2ZSAiZSIpCiAgKHNhdmUtc2VsZWN0 ZWQtd2luZG93CiAgICAoc2VsZWN0LXdpbmRvdyAocG9zbi13aW5kb3cgKGV2ZW50LXN0YXJ0 IGV2ZW50KSkpCiAgICAoc2VyaWFsLXVwZGF0ZS1jb25maWctbWVudSkKICAgIChsZXQqICgo c2VsZWN0aW9uIChzZXJpYWwtbW9kZS1saW5lLWNvbmZpZy1tZW51IGV2ZW50KSkKICAgICAg ICAgICAoYmluZGluZyAoYW5kIHNlbGVjdGlvbiAobG9va3VwLWtleSBzZXJpYWwtbW9kZS1s aW5lLWNvbmZpZy1tZW51CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHZlY3RvciAoY2FyIHNlbGVjdGlvbikpKSkpKQogICAgICAod2hlbiBiaW5k aW5nIChjYWxsLWludGVyYWN0aXZlbHkgYmluZGluZykpKSkpCgooZGVmdW4gc2VyaWFsLW1v ZGUtbGluZS1jb25maWctbWVudSAoZXZlbnQpCiAgKHgtcG9wdXAtbWVudSBldmVudCBzZXJp YWwtbW9kZS1saW5lLWNvbmZpZy1tZW51KSkKCihkZWZ1biBzZXJpYWwtdXBkYXRlLWNvbmZp Zy1tZW51ICgpCiAgKHNldHEgc2VyaWFsLW1vZGUtbGluZS1jb25maWctbWVudSAobWFrZS1z cGFyc2Uta2V5bWFwICJDb25maWd1cmF0aW9uIikpCiAgKGxldCAoKGNvbmZpZyAocHJvY2Vz cy1jb250YWN0CiAgICAgICAgICAgICAgICAgKGdldC1idWZmZXItcHJvY2VzcyAoY3VycmVu dC1idWZmZXIpKSB0KSkKICAgICAgICAoeSkKICAgICAgICAoc3RyKSkKICAgIChkb2xpc3Qg KHkgJygoOmZsb3djb250cm9sIGh3ICAgIkhhcmR3YXJlIGZsb3djb250cm9sIChSVFMvQ1RT KSIpCiAgICAgICAgICAgICAgICAgKDpmbG93Y29udHJvbCBzdyAgICJTb2Z0d2FyZSBmbG93 Y29udHJvbCAoWE9OL1hPRkYpIikKICAgICAgICAgICAgICAgICAoOmZsb3djb250cm9sIG5p bCAgIk5vIGZsb3djb250cm9sIikKICAgICAgICAgICAgICAgICAoOnN0b3BiaXRzICAgIDIg ICAgIjIgc3RvcGJpdHMiKQogICAgICAgICAgICAgICAgICg6c3RvcGJpdHMgICAgMSAgICAi MSBzdG9wYml0IikKICAgICAgICAgICAgICAgICAoOnBhcml0eSAgICAgIG9kZCAgIk9kZCBw YXJpdHkiKQogICAgICAgICAgICAgICAgICg6cGFyaXR5ICAgICAgZXZlbiAiRXZlbiBwYXJp dHkiKQogICAgICAgICAgICAgICAgICg6cGFyaXR5ICAgICAgbmlsICAiTm8gcGFyaXR5IikK ICAgICAgICAgICAgICAgICAoOmJ5dGVzaXplICAgIDcgICAgIjcgYml0cyBwZXIgYnl0ZSIp CiAgICAgICAgICAgICAgICAgKDpieXRlc2l6ZSAgICA4ICAgICI4IGJpdHMgcGVyIGJ5dGUi KSkpCiAgICAgIChkZWZpbmUta2V5IHNlcmlhbC1tb2RlLWxpbmUtY29uZmlnLW1lbnUKICAg ICAgICAodmVjdG9yIChtYWtlLXN5bWJvbCAoZm9ybWF0ICIlcy0lcyIgKG50aCAwIHkpIChu dGggMSB5KSkpKQogICAgICAgIGAobWVudS1pdGVtCiAgICAgICAgICAsKG50aCAyIHkpCiAg ICAgICAgICAobGFtYmRhIChldmVudCkgKGludGVyYWN0aXZlICJlIikKICAgICAgICAgICAg KHNlcmlhbC1wcm9jZXNzLWNvbmZpZ3VyZSAsKG50aCAwIHkpICcsKG50aCAxIHkpKQogICAg ICAgICAgICAodGVybS11cGRhdGUtbW9kZS1saW5lKQogICAgICAgICAgICAobWVzc2FnZSAi JXMiICwobnRoIDIgeSkpKQogICAgICAgICAgOzsgVXNlIDp0b2dnbGUgaW5zdGVhZCBvZiA6 cmFkaW8gYmVjYXVzZSBhIG5vbi1zdGFuZGFyZCBwb3J0CiAgICAgICAgICA7OyBjb25maWd1 cmF0aW9uIG1heSBub3QgbWF0Y2ggYW55IG1lbnUgaXRlbXMuCiAgICAgICAgICA6YnV0dG9u ICg6dG9nZ2xlIC4gLChlcXVhbCAocGxpc3QtZ2V0IGNvbmZpZyAobnRoIDAgeSkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIDEgeSkpKSkpKSkpCgoMCjs7 OyBDb252ZXJ0aW5nIHByb2Nlc3MgbW9kZXMgdG8gdXNlIHRlcm0gbW9kZQo7OzsgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Cjs7OyBSZW5hbWluZyB2YXJpYWJsZXMKOzs7IE1vc3Qgb2YgdGhl IHdvcmsgaXMgcmVuYW1pbmcgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMuICBUaGVzZSBhcmUg dGhlIGNvbW1vbgo7Ozsgb25lczoKOzs7IExvY2FsIHZhcmlhYmxlczoKOzs7CWxhc3QtaW5w dXQtc3RhcnQJdGVybS1sYXN0LWlucHV0LXN0YXJ0Cjs7OyAJbGFzdC1pbnB1dC1lbmQJCXRl cm0tbGFzdC1pbnB1dC1lbmQKOzs7CXNoZWxsLXByb21wdC1wYXR0ZXJuCXRlcm0tcHJvbXB0 LXJlZ2V4cAo7OzsgICAgIHNoZWxsLXNldC1kaXJlY3RvcnktZXJyb3ItaG9vayA8bm8gZXF1 aXZhbGVudD4KOzs7IE1pc2NlbGxhbmVvdXM6Cjs7OwlzaGVsbC1zZXQtZGlyZWN0b3J5CTx1 bm5lY2Vzc2FyeT4KOzs7IAlzaGVsbC1tb2RlLW1hcAkJdGVybS1tb2RlLW1hcAo7OzsgQ29t bWFuZHM6Cjs7OwlzaGVsbC1zZW5kLWlucHV0CXRlcm0tc2VuZC1pbnB1dAo7OzsJc2hlbGwt c2VuZC1lb2YJCXRlcm0tZGVsY2hhci1vci1tYXliZS1lb2YKOzs7IAlraWxsLXNoZWxsLWlu cHV0CXRlcm0ta2lsbC1pbnB1dAo7OzsJaW50ZXJydXB0LXNoZWxsLXN1YmpvYgl0ZXJtLWlu dGVycnVwdC1zdWJqb2IKOzs7CXN0b3Atc2hlbGwtc3Viam9iCXRlcm0tc3RvcC1zdWJqb2IK Ozs7CXF1aXQtc2hlbGwtc3Viam9iCXRlcm0tcXVpdC1zdWJqb2IKOzs7CWtpbGwtc2hlbGwt c3Viam9iCXRlcm0ta2lsbC1zdWJqb2IKOzs7CWtpbGwtb3V0cHV0LWZyb20tc2hlbGwJdGVy bS1raWxsLW91dHB1dAo7OzsJc2hvdy1vdXRwdXQtZnJvbS1zaGVsbAl0ZXJtLXNob3ctb3V0 cHV0Cjs7Owljb3B5LWxhc3Qtc2hlbGwtaW5wdXQJVXNlIHRlcm0tcHJldmlvdXMtaW5wdXQv dGVybS1uZXh0LWlucHV0Cjs7Owo7OzsgU0hFTEwtU0VULURJUkVDVE9SWSBpcyBnb25lLCBp dHMgZnVuY3Rpb25hbGl0eSB0YWtlbiBvdmVyIGJ5Cjs7OyBTSEVMTC1ESVJFQ1RPUlktVFJB Q0tFUiwgdGhlIHNoZWxsIG1vZGUncyB0ZXJtLWlucHV0LWZpbHRlci1mdW5jdGlvbnMuCjs7 OyBUZXJtIG1vZGUgZG9lcyBub3QgcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGVxdWl2YWxlbnQg dG8KOzs7IHNoZWxsLXNldC1kaXJlY3RvcnktZXJyb3ItaG9vazsgaXQgaXMgZ29uZS4KOzs7 Cjs7OyB0ZXJtLWxhc3QtaW5wdXQtc3RhcnQgaXMgcHJvdmlkZWQgZm9yIG1vZGVzIHdoaWNo IHdhbnQgdG8gbXVuZ2UKOzs7IHRoZSBidWZmZXIgYWZ0ZXIgaW5wdXQgaXMgc2VudCwgcGVy aGFwcyBiZWNhdXNlIHRoZSBpbmZlcmlvcgo7OzsgaW5zaXN0cyBvbiBlY2hvaW5nIHRoZSBp bnB1dC4gIFRoZSBMQVNULUlOUFVULVNUQVJUIHZhcmlhYmxlIGluCjs7OyB0aGUgb2xkIHNo ZWxsIHBhY2thZ2Ugd2FzIHVzZWQgdG8gaW1wbGVtZW50IGEgaGlzdG9yeSBtZWNoYW5pc20s Cjs7OyBidXQgeW91IHNob3VsZCB0aGluayB0d2ljZSBiZWZvcmUgdXNpbmcgdGVybS1sYXN0 LWlucHV0LXN0YXJ0Cjs7OyBmb3IgdGhpczsgdGhlIGlucHV0IGhpc3RvcnkgcmluZyBvZnRl biBkb2VzIHRoZSBqb2IgYmV0dGVyLgo7OzsKOzs7IElmIHlvdSBhcmUgaW1wbGVtZW50aW5n IHNvbWUgcHJvY2Vzcy1pbi1hLWJ1ZmZlciBtb2RlLCBjYWxsZWQgZm9vLW1vZGUsIGRvCjs7 OyAqbm90KiBjcmVhdGUgdGhlIHRlcm0tbW9kZSBsb2NhbCB2YXJpYWJsZXMgaW4geW91ciBm b28tbW9kZSBmdW5jdGlvbi4KOzs7IFRoaXMgaXMgbm90IG1vZHVsYXIuICBJbnN0ZWFkLCBj YWxsIHRlcm0tbW9kZSwgYW5kIGxldCAqaXQqIGNyZWF0ZSB0aGUKOzs7IG5lY2Vzc2FyeSB0 ZXJtLXNwZWNpZmljIGxvY2FsIHZhcmlhYmxlcy4gIFRoZW4gY3JlYXRlIHRoZQo7OzsgZm9v LW1vZGUtc3BlY2lmaWMgbG9jYWwgdmFyaWFibGVzIGluIGZvby1tb2RlLiAgU2V0IHRoZSBi dWZmZXIncyBrZXltYXAgdG8KOzs7IGJlIGZvby1tb2RlLW1hcCwgYW5kIGl0cyBtb2RlIHRv IGJlIGZvby1tb2RlLiAgU2V0IHRoZSB0ZXJtLW1vZGUgaG9va3MKOzs7ICh0ZXJtLXtwcm9t cHQtcmVnZXhwLCBpbnB1dC1maWx0ZXIsIGlucHV0LWZpbHRlci1mdW5jdGlvbnMsCjs7OyBn ZXQtb2xkLWlucHV0KSB0aGF0IG5lZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1 bHRzLiAgQ2FsbAo7OzsgZm9vLW1vZGUtaG9vaywgYW5kIHlvdSdyZSBkb25lLiAgRG9uJ3Qg cnVuIHRoZSB0ZXJtLW1vZGUgaG9vayB5b3Vyc2VsZjsKOzs7IHRlcm0tbW9kZSB3aWxsIHRh a2UgY2FyZSBvZiBpdC4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZnJvbSBzaGVsbC5lbCwK Ozs7IGlzIHR5cGljYWw6Cjs7Owo7OzsgKGRlZnZhciBzaGVsbC1tb2RlLW1hcCAnKCkpCjs7 OyAoY29uZCAoKG5vdCBzaGVsbC1tb2RlLW1hcCkKOzs7ICAgICAgICAoc2V0cSBzaGVsbC1t b2RlLW1hcCAoY29weS1rZXltYXAgdGVybS1tb2RlLW1hcCkpCjs7OyAgICAgICAgKGRlZmlu ZS1rZXkgc2hlbGwtbW9kZS1tYXAgIlxDLWNcQy1mIiAnc2hlbGwtZm9yd2FyZC1jb21tYW5k KQo7OzsgICAgICAgIChkZWZpbmUta2V5IHNoZWxsLW1vZGUtbWFwICJcQy1jXEMtYiIgJ3No ZWxsLWJhY2t3YXJkLWNvbW1hbmQpCjs7OyAgICAgICAgKGRlZmluZS1rZXkgc2hlbGwtbW9k ZS1tYXAgIlx0IiAndGVybS1keW5hbWljLWNvbXBsZXRlKQo7OzsgICAgICAgIChkZWZpbmUt a2V5IHNoZWxsLW1vZGUtbWFwICJcTS0/Igo7OzsgICAgICAgICAgJ3Rlcm0tZHluYW1pYy1s aXN0LWZpbGVuYW1lLWNvbXBsZXRpb25zKSkpCjs7Owo7OzsgKGRlZnVuIHNoZWxsLW1vZGUg KCkKOzs7ICAgKGludGVyYWN0aXZlKQo7OzsgICAodGVybS1tb2RlKQo7OzsgICAoc2V0cSB0 ZXJtLXByb21wdC1yZWdleHAgc2hlbGwtcHJvbXB0LXBhdHRlcm4pCjs7OyAgIChzZXRxIG1h am9yLW1vZGUgJ3NoZWxsLW1vZGUpCjs7OyAgIChzZXRxIG1vZGUtbmFtZSAiU2hlbGwiKQo7 OzsgICAodXNlLWxvY2FsLW1hcCBzaGVsbC1tb2RlLW1hcCkKOzs7ICAgKG1ha2UtbG9jYWwt dmFyaWFibGUgJ3NoZWxsLWRpcmVjdG9yeS1zdGFjaykKOzs7ICAgKHNldHEgc2hlbGwtZGly ZWN0b3J5LXN0YWNrIG5pbCkKOzs7ICAgKGFkZC1ob29rICd0ZXJtLWlucHV0LWZpbHRlci1m dW5jdGlvbnMgJ3NoZWxsLWRpcmVjdG9yeS10cmFja2VyKQo7OzsgICAocnVuLW1vZGUtaG9v a3MgJ3NoZWxsLW1vZGUtaG9vaykpCjs7Owo7OzsKOzs7IENvbXBsZXRpb24gZm9yIHRlcm0t bW9kZSB1c2Vycwo7OzsKOzs7IEZvciBtb2RlcyB0aGF0IHVzZSB0ZXJtLW1vZGUsIHRlcm0t ZHluYW1pYy1jb21wbGV0ZS1mdW5jdGlvbnMgaXMgdGhlCjs7OyBob29rIHRvIGFkZCBjb21w bGV0aW9uIGZ1bmN0aW9ucyB0by4gIEZ1bmN0aW9ucyBvbiB0aGlzIGxpc3Qgc2hvdWxkIHJl dHVybgo7Ozsgbm9uLW5pbCBpZiBjb21wbGV0aW9uIG9jY3VycyAoaS5lLiwgZnVydGhlciBj b21wbGV0aW9uIHNob3VsZCBub3Qgb2NjdXIpLgo7OzsgWW91IGNvdWxkIHVzZSB0ZXJtLWR5 bmFtaWMtc2ltcGxlLWNvbXBsZXRlIHRvIGRvIHRoZSBidWxrIG9mIHRoZQo7OzsgY29tcGxl dGlvbiBqb2IuCgwKKHByb3ZpZGUgJ3Rlcm0pCgo7OyBhcmNoLXRhZzogZWVlMTZiYzgtMmNk Ny00MTQ3LTk1MzQtYTU2OTQ3NTJmNzE2Cjs7OyB0ZXJtLmVsIGVuZHMgaGVyZQo= --------------oIp3wbIUN8Emz9bZT3073nhj-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 08 May 2025 10:04:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten , Jared Finder Cc: per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174669861919858 (code B ref 78263); Thu, 08 May 2025 10:04:01 +0000 Received: (at 78263) by debbugs.gnu.org; 8 May 2025 10:03:39 +0000 Received: from localhost ([127.0.0.1]:54413 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uCy6N-0005AD-A4 for submit@debbugs.gnu.org; Thu, 08 May 2025 06:03:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49332) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uCy6K-00059y-5o for 78263@debbugs.gnu.org; Thu, 08 May 2025 06:03:37 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uCy6D-00024i-GX; Thu, 08 May 2025 06:03:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=/8G/e3yxjnvaz1+LIM2Guo5NTT9pbKnGmo1OVNDvRXg=; b=eyRJYRss9C98JzmsX9Ds z/ba6zUCuzdx3uEfEKZnWk3sUngXlQdJhJzCPU/gy4a0qjQ+55RFstyAJQFCYw+sBUGHbpI2bS4iR 7rupgmUURmUi6osHVAEQyq2V0dBTOafW42V4VWe2ObftskC/PgkTItBK6ASa9UVons64cFOgZJ97i 8QngLUlbFMFlkv84Jk7HOHOwO7mL3dAo4/GHShSKBlqXD3Jvll8S/Mu3VILfNJL8+JBBdPgsvVEIg 1o2uIF/rPzwV6XNLkEYdJl0cacZ1YvxXz8aE9G7vC/MdZWDhnrKqv5sPW7+RqThLNmmtUz67NxK9B w9JKOxDLRzgWCQ==; Date: Thu, 08 May 2025 13:03:26 +0300 Message-Id: <86ecwze7wx.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> (message from =?UTF-8?Q?St=C3=A9phane?= Zermatten on Mon, 5 May 2025 19:57:45 +0300) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) > From: Stéphane Zermatten > Date: Mon, 5 May 2025 19:57:45 +0300 > Cc: 78263@debbugs.gnu.org, > Dan Nicolaescu , > Eli Zaretskii > > I attached a merged version of all 3 patches to this e-mail that handles OSC sequences, so they’re handled right away. I’m happy to do it that way, if it’s more convenient. Thanks, see some minor comments below. Jared, any further comments about the issue or the patch? > * lisp/term.el (term-emulate-terminal) handle OSC sequences The log message should mention all the functions/variables where you make changes, with a short description of each change. Please also mention the bug number. > +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) > + ("2" . ansi-osc-window-title-handler) > + ("7" . ansi-osc-directory-tracker) > + ("8" . ansi-osc-hyperlink-handler)) > + "OSC sequence handler function alist. > + > +OSC (Operating System Command) is a category of ANSI escape sequence > +used in terminal application to introduce custom commands. Terminals > +ignore unknown OSC sequences by default. Handlers can be registered here > +to add support for new OSC sequences to `term'. > + > +Functions in this alist are passed matching valid OSC sequences as > +they're sent to the terminal. > + > +Valid OSC sequences are of the form > + ESC ] code ; text BEL > + ESC ] code ; text ESC \ > + > +Each entry has the form (CODE . FUNCTION), where CODE is the string that > +appears before the semicolon. > + > +FUNCTION is called with two arguments CODE and TEXT with the term buffer > +active and its point and state active at the time the OSC sequence > +appeared in the stream." > + :type '(alist :key-type string :value-type function) > + :group 'term) New defcustoms should have a :version tag. > +(defconst term-osc--max-bytes (* 32 1024 1024) > + "Limit the length of OSC sequences to keep in memory.") This begs the question: what happens with longer sequences? Can the doc string answer that question? > + (with-demoted-errors "term OSC error: %S" > + (funcall > + func code > + (decode-coding-string > + (substring seq-str text-start end-mark) > + locale-coding-system t))))) Why locale-coding-system? Wouldn't the result of calling process-coding-system with the process running in term.el be a better candidate? Last, but not least: you don't seem to have a copyright assignment on file, without which we cannot accept such a large contribution. Would you like to start the paperwork of copyright assignment at this time? If yes, I will send you the form to fill and the instructions. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 13 May 2025 14:25:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: Per Bothner , Jared Finder , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.17471462933495 (code B ref 78263); Tue, 13 May 2025 14:25:01 +0000 Received: (at 78263) by debbugs.gnu.org; 13 May 2025 14:24:53 +0000 Received: from localhost ([127.0.0.1]:60771 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uEqYv-0000uI-2i for submit@debbugs.gnu.org; Tue, 13 May 2025 10:24:53 -0400 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]:50410) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uEqYq-0000ts-Om for 78263@debbugs.gnu.org; Tue, 13 May 2025 10:24:49 -0400 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-3a1c85e77d7so3291455f8f.0 for <78263@debbugs.gnu.org>; Tue, 13 May 2025 07:24:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747146283; x=1747751083; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=mETlioJbVgyj6b9YW+E+Ku/CpjmlC400n+hkQIpTf7U=; b=SNReqz+tjlTKpvitzX5FRZ+pUrJK1UHRHo+2bNPM8fgNdbwJBsVYFAtcBdl0WL6f60 pXPY7KTNx/+JtLwSnHRvQhq6pTnR3i9YNCSCPG+RCdO0esXD6Wvkp56gr7ij09MOgl+6 QxMa9tgkWC4oQOxJsNeZyVpbuxteyNtJ4S07TyNjdvU9vF6hjYB5WKl6EbtoBfmxEY/f lf+kiEOExup0zybipKkG26YoZKVCzCv3iQojXpSfVyH+5XOSv0nAE4BNrVeNyGkUfx6u Er79K90Z899f3tSxPqYRjPy78Lo57xehG+VEhKHriqQ1fXdthyPFdPCW3sqInnqjwlLV WDUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747146283; x=1747751083; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mETlioJbVgyj6b9YW+E+Ku/CpjmlC400n+hkQIpTf7U=; b=mjV/GUjRAIGjmMaZn+EH6GOtitShiK3Kw/QyswiGFdDjc5D68T5f1Ciq34Ih42DFfg Qg69WsVLSWcWHxkR89rum2/rrycOnBmxT4oiOU2nDGSWjUO0oOXw9XPAN5130Sgyl8dh 9RnxYdKmOgzNjEcXfO+hBbr0vXj22NR/Erm8sQDB6OjzCjTltozc/ZlF/KiTGx+E3ta/ 7nWlIKxq181M8KjVwFN/1N/q5bAUztDLEu2LoKtNATWR3D2tcxrqWQ94TsmW3hPWhf4O 4kjcR7J0Xfv7w8xtcFhRp8UyH9V2tshamMd9k1iBKhn5uAY9sHoCveBm5i0lnldBPhy0 w2KA== X-Forwarded-Encrypted: i=1; AJvYcCX/sN2ir/8+hUFAweIRyDKvbImrRG5Y9l+6nT3q0R7j/1TghR8cayMoYz7SQk7pPebi9VZOOA==@debbugs.gnu.org X-Gm-Message-State: AOJu0YyD6snTwar2oF+nNAGczmcl3ZNlznRr9vCa5XWInWW9PlpCoX65 //bocQgVmIo6NBSK01DKRAHjZq7dC1xOmSbaKw8JrnvNEnW+6ytb X-Gm-Gg: ASbGncspgx84LoiyGDMZz0QymI2L8/gp46rAocnkZnzhjg7SNL4fqC/oMxuPQK3NAC7 mLp7AkCVg78dkJaYdepbQGUPrwfHvR9WRPat9j1DRdavihR6oyEWwXD4qYSq05MKVM0EhmT+aCE hNlVDKGFchKjzmTUnc4GyebpfblDagDQ+KYNU1xcnGVs2bD3KJzFh5L6bj5r3zKF1JnXXIUElOt n2kWU1FijZpssbim1QGoHel9mMfQWvOWB2DDqE+DEpsAj6r9po/wb5RSjUqQ2zwhWnOt4VnLrjA eyNG2054Dv4pcvnK5rsge+TvWozZsHH2+rDY26L8NpCXUnRhvQwc/ftVV0Na9YyrLBXozy+sPX4 IZfR4XC3cbP6i X-Google-Smtp-Source: AGHT+IE7LK381IdBWL+DsPOJCd5PJxlUrZDGeXw2Npd6JcfvGX1i8kVKUlhm+O5IHKwNjPU4C1whaQ== X-Received: by 2002:a05:6000:2909:b0:391:2f15:c1f4 with SMTP id ffacd0b85a97d-3a1f64f16abmr15422829f8f.55.1747146282334; Tue, 13 May 2025 07:24:42 -0700 (PDT) Received: from smtpclient.apple ([62.74.15.107]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a1f58ecaeasm16253769f8f.28.2025.05.13.07.24.40 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 May 2025 07:24:41 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> Content-Type: multipart/alternative; boundary="Apple-Mail=_602CF24F-C442-4856-AB92-35764191AABA" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.2\)) Date: Tue, 13 May 2025 17:24:29 +0300 In-Reply-To: <86ecwze7wx.fsf@gnu.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51.11.2) 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 (-) --Apple-Mail=_602CF24F-C442-4856-AB92-35764191AABA Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Thank you for the review! I addressed the points you mentioned. See the = updated patch attached to this e-mail.=20 > On 8 May 2025, at 13:03, Eli Zaretskii wrote: >=20 >> From: St=C3=A9phane Zermatten >> Date: Mon, 5 May 2025 19:57:45 +0300 >> Cc: 78263@debbugs.gnu.org, >> Dan Nicolaescu , >> Eli Zaretskii >>=20 >> I attached a merged version of all 3 patches to this e-mail that = handles OSC sequences, so they=E2=80=99re handled right away. I=E2=80=99m= happy to do it that way, if it=E2=80=99s more convenient. >=20 > Thanks, see some minor comments below. >=20 > Jared, any further comments about the issue or the patch? >=20 >> * lisp/term.el (term-emulate-terminal) handle OSC sequences >=20 > The log message should mention all the functions/variables where you > make changes, with a short description of each change. Please also > mention the bug number. I updated the description, trying to follow the format of older commits. >=20 >> +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) >> + ("2" . ansi-osc-window-title-handler) >> + ("7" . ansi-osc-directory-tracker) >> + ("8" . ansi-osc-hyperlink-handler)) >> + "OSC sequence handler function alist. >> + >> +OSC (Operating System Command) is a category of ANSI escape sequence >> +used in terminal application to introduce custom commands. Terminals >> +ignore unknown OSC sequences by default. Handlers can be registered = here >> +to add support for new OSC sequences to `term'. >> + >> +Functions in this alist are passed matching valid OSC sequences as >> +they're sent to the terminal. >> + >> +Valid OSC sequences are of the form >> + ESC ] code ; text BEL >> + ESC ] code ; text ESC \ >> + >> +Each entry has the form (CODE . FUNCTION), where CODE is the string = that >> +appears before the semicolon. >> + >> +FUNCTION is called with two arguments CODE and TEXT with the term = buffer >> +active and its point and state active at the time the OSC sequence >> +appeared in the stream." >> + :type '(alist :key-type string :value-type function) >> + :group 'term) >=20 > New defcustoms should have a :version tag. I added one. I guess we=E2=80=99re at 31.1, now.=20 >=20 >> +(defconst term-osc--max-bytes (* 32 1024 1024) >> + "Limit the length of OSC sequences to keep in memory.") >=20 > This begs the question: what happens with longer sequences? Can the > doc string answer that question? emulate-terminal goes back into its normal state, because presumably the = end tag was lost. I tried to describe that. =20 >=20 >> + (with-demoted-errors "term OSC error: = %S" >> + (funcall >> + func code >> + (decode-coding-string >> + (substring seq-str text-start = end-mark) >> + locale-coding-system t))))) >=20 > Why locale-coding-system? Wouldn't the result of calling > process-coding-system with the process running in term.el be a better > candidate? process-coding-system is just 'binary because emulate-terminal want to = process the escape sequences before the string is decoded. Using = locale-coding-system is the way strings are decoded everywhere in = emulate-terminal. >=20 > Last, but not least: you don't seem to have a copyright assignment on > file, without which we cannot accept such a large contribution. Would > you like to start the paperwork of copyright assignment at this time? > If yes, I will send you the form to fill and the instructions. Yes, I still need to do that. I sent out a request to assign@gnu.org = following the instructions in = etc/copyright-assign.txt but have yet to hear back from them.=20 =EF=BF=BC= --Apple-Mail=_602CF24F-C442-4856-AB92-35764191AABA Content-Type: multipart/mixed; boundary="Apple-Mail=_63AEF71D-7EEF-4CB9-824E-F61D02CD9831" --Apple-Mail=_63AEF71D-7EEF-4CB9-824E-F61D02CD9831 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Thank you for = the review! I addressed the points you mentioned. See the updated patch = attached to this e-mail. 

On 8 May 2025, at 13:03, Eli Zaretskii = <eliz@gnu.org> wrote:

From: St=C3=A9phane Zermatten = <szermatt@gmail.com>
Date: Mon, 5 May 2025 19:57:45 = +0300
Cc: 78263@debbugs.gnu.org,
Dan Nicolaescu = <dann@ics.uci.edu>,
Eli Zaretskii = <eliz@gnu.org>

I attached a merged version of all 3 patches = to this e-mail that handles OSC sequences, so they=E2=80=99re handled = right away.  I=E2=80=99m happy to do it that way, if it=E2=80=99s = more convenient.

Thanks, see some minor comments = below.

Jared, any further comments about the issue or the = patch?

* lisp/term.el = (term-emulate-terminal) handle OSC sequences

The log = message should mention all the functions/variables where you
make = changes, with a short description of each change.  Please = also
mention the bug = number.

I updated the = description, trying to follow the format of older = commits.


+(defcustom term-osc-handlers '(("0" . = ansi-osc-window-title-handler)
+ =             &n= bsp;           &nbs= p;     ("2" . = ansi-osc-window-title-handler)
+ =             &n= bsp;           &nbs= p;     ("7" . ansi-osc-directory-tracker)
+ =             &n= bsp;           &nbs= p;     ("8" . ansi-osc-hyperlink-handler))
+ =  "OSC sequence handler function alist.
+
+OSC (Operating = System Command) is a category of ANSI escape sequence
+used in = terminal application to introduce custom commands. Terminals
+ignore = unknown OSC sequences by default. Handlers can be registered here
+to = add support for new OSC sequences to `term'.
+
+Functions in this = alist are passed matching valid OSC sequences as
+they're sent to the = terminal.
+
+Valid OSC sequences are of the form
+  ESC ] = code ; text BEL
+  ESC ] code ; text ESC \
+
+Each entry = has the form (CODE . FUNCTION), where CODE is the string = that
+appears before the semicolon.
+
+FUNCTION is called with = two arguments CODE and TEXT with the term buffer
+active and its = point and state active at the time the OSC sequence
+appeared in the = stream."
+  :type '(alist :key-type string :value-type = function)
+  :group 'term)

New defcustoms = should have a :version = tag.

I added one. I = guess we=E2=80=99re at 31.1, now. 


+(defconst = term-osc--max-bytes (* 32 1024 1024)
+  "Limit the length of OSC = sequences to keep in memory.")

This begs the = question: what happens with longer sequences?  Can the
doc = string answer that = question?

emulate-terminal= goes back into its normal state, because presumably the end tag was = lost.
I tried to describe that.  


+ =             &n= bsp;           &nbs= p;    (with-demoted-errors "term OSC error: %S"
+ =             &n= bsp;           &nbs= p;      (funcall
+ =             &n= bsp;           &nbs= p;       func code
+ =             &n= bsp;           &nbs= p;       (decode-coding-string
+ =             &n= bsp;           &nbs= p;        (substring seq-str = text-start end-mark)
+ =             &n= bsp;           &nbs= p;        locale-coding-system = t)))))

Why locale-coding-system?  Wouldn't the = result of calling
process-coding-system with the process running in = term.el be a = better
candidate?

proce= ss-coding-system is just 'binary because emulate-terminal want to = process the escape sequences before the string is decoded. Using = locale-coding-system is the way strings are decoded everywhere in = emulate-terminal.


Last, = but not least: you don't seem to have a copyright assignment on
file, = without which we cannot accept such a large contribution. =  Would
you like to start the paperwork of copyright assignment = at this time?
If yes, I will send you the form to fill and the = instructions.

Yes, I still = need to do that. I sent out a request to assign@gnu.org following the = instructions in etc/copyright-assign.txt but have yet to hear back from = them. 

= --Apple-Mail=_63AEF71D-7EEF-4CB9-824E-F61D02CD9831 Content-Disposition: attachment; filename=0001-Handle-OSC-sequences-in-term-bug-78263.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Handle-OSC-sequences-in-term-bug-78263.patch" Content-Transfer-Encoding: quoted-printable =46rom=20ed6b5050ce05bc8c2cf827a06553a7456a260bff=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Sat,=203=20May=202025=2000:03:12=20+0300=0ASubject:=20[PATCH]=20= Handle=20OSC=20sequences=20in=20term=20(bug#78263)=0A=0AHandlers=20can=20= be=20registered=20to=20term-osc-handler,=20which=20by=20defaults,=0A= supports=20OSC=200,=202,=207=20and=208,=20using=20handlers=20defined=20= in=20ansi-osc.=20Unknown=0AOSC=20sequences=20are=20properly=20ignored.=0A= =0A*=20lisp/term.el:=0A=20=20(term-emulate-terminal):=20handle=20OSC=20= sequences=0A=20=20term-osc-handler:=20new=20custom=20option=0A=20=20= term-control-seq-regexp:=20extended=20regexp=0A=20=20term--osc-max-byte:=20= new=20private=20constant=0A---=0A=20lisp/term.el=20=20=20=20=20=20=20=20=20= =20=20=20|=2065=20+++++++++++++++++++++++++++++++=0A=20= test/lisp/term-tests.el=20|=2086=20= +++++++++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20= 151=20insertions(+)=0A=0Adiff=20--git=20a/lisp/term.el=20b/lisp/term.el=0A= index=20a971300c055..0151acee2ff=20100644=0A---=20a/lisp/term.el=0A+++=20= b/lisp/term.el=0A@@=20-304,6=20+304,7=20@@=20term-protocol-version=0A=20=20= =20(require=20'cl-lib))=0A=20(require=20'comint)=20;=20Password=20= regexp.=0A=20(require=20'ansi-color)=0A+(require=20'ansi-osc)=0A=20= (require=20'ehelp)=0A=20(require=20'ring)=0A=20(require=20'shell)=0A@@=20= -603,6=20+604,34=20@@=20term-exec-hook=0A=20=20=20:type=20'hook=0A=20=20=20= :group=20'term)=0A=20=0A+(defcustom=20term-osc-handlers=20'(("0"=20.=20= ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("2"=20.=20= ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("7"=20.=20= ansi-osc-directory-tracker)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("8"=20.=20= ansi-osc-hyperlink-handler))=0A+=20=20"OSC=20sequence=20handler=20= function=20alist.=0A+=0A+OSC=20(Operating=20System=20Command)=20is=20a=20= category=20of=20ANSI=20escape=20sequence=0A+used=20in=20terminal=20= application=20to=20introduce=20custom=20commands.=20Terminals=0A+ignore=20= unknown=20OSC=20sequences=20by=20default.=20Handlers=20can=20be=20= registered=20here=0A+to=20add=20support=20for=20new=20OSC=20sequences=20= to=20`term'.=0A+=0A+Functions=20in=20this=20alist=20are=20passed=20= matching=20valid=20OSC=20sequences=20as=0A+they're=20sent=20to=20the=20= terminal.=0A+=0A+Valid=20OSC=20sequences=20are=20of=20the=20form=0A+=20=20= ESC=20]=20code=20;=20text=20BEL=0A+=20=20ESC=20]=20code=20;=20text=20ESC=20= \=0A+=0A+Each=20entry=20has=20the=20form=20(CODE=20.=20FUNCTION),=20= where=20CODE=20is=20the=20string=20that=0A+appears=20before=20the=20= semicolon.=0A+=0A+FUNCTION=20is=20called=20with=20two=20arguments=20CODE=20= and=20TEXT=20with=20the=20term=20buffer=0A+active=20and=20its=20point=20= and=20state=20active=20at=20the=20time=20the=20OSC=20sequence=0A= +appeared=20in=20the=20stream."=0A+=20=20:type=20'(alist=20:key-type=20= string=20:value-type=20function)=0A+=20=20:group=20'term=0A+=20=20= :version=20"31.1")=0A+=0A=20(defvar=20term-mode-map=0A=20=20=20(let=20= ((map=20(make-sparse-keymap)))=0A=20=20=20=20=20(define-key=20map=20= "\ep"=20'term-previous-input)=0A@@=20-3030,6=20+3059,10=20@@=20= term-control-seq-regexp=0A=20=20=20=20"\e\\(?:[DM78c]\\|"=0A=20=20=20=20= ;;=20another=20Emacs=20specific=20control=20sequence,=0A=20=20=20=20= "AnSiT[^\n]+\n\\|"=0A+=20=20=20;;=20OSC=20(see=20[ECMA-48]=20section=20= 8.3.89=20"Operation=20System=20Command")=20The=0A+=20=20=20;;=20spec=20= only=20allows=200x08-0x0d=200x20-7e,=20but=20this=20regexp=20also=20= allows=0A+=20=20=20;;=20non-ascii=20(UTF-8)=20characters.=0A+=20=20=20= "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|"=0A=20=20=20=20;;=20= or=20an=20escape=20sequence=20(section=205.4=20"Control=20Sequences"),=0A= =20=20=20=20"\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)")=0A=20=20= =20"Regexp=20matching=20control=20sequences=20handled=20by=20term.el.")=0A= @@=20-3037,6=20+3070,13=20@@=20term-control-seq-regexp=0A=20(defconst=20= term-control-seq-prefix-regexp=0A=20=20=20"[\032\e]")=0A=20=0A+(defconst=20= term--osc-max-bytes=20(*=2032=201024=201024)=0A+=20=20"Limit=20the=20= length=20of=20OSC=20sequences=20to=20keep=20in=20memory.=0A+=0A+Once=20= this=20limit=20is=20reached,=20terminal=20input=20is=20processed=20= normally=20again=0A+and=20text=20written=20to=20the=20terminal.=20=20= This=20guards=20against=20missing=20end=0A+sequence=20holding=20up=20the=20= terminal.")=0A+=0A=20(defun=20term-emulate-terminal=20(proc=20str)=0A=20=20= =20(when=20(buffer-live-p=20(process-buffer=20proc))=0A=20=20=20=20=20= (with-current-buffer=20(process-buffer=20proc)=0A@@=20-3232,6=20+3272,31=20= @@=20term-emulate-terminal=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(split-string=20ctl-params=20= ";"))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(aref=20str=20(1-=20ctl-end))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20private))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?\]=20= ;;=20An=20OSC=20sequence=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((seq-str=20(substring=20str=20(+=20i=202)=20= ctl-end)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(string-match=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20= "\\`\\(\\([0-9A-Za-z]+\\);\\)?.*?\\(\a\\|\e\\\\\\)?\\'"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20seq-str)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((code=20(match-string=202=20seq-str))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (text-start=20(match-end=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(end-mark=20= (match-beginning=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20(and=20code=20end-mark)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (when-let*=20((func=20(cdr=20(assoc-string=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20code=20= term-osc-handlers))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(with-demoted-errors=20"term=20= OSC=20error:=20%S"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(funcall=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20func=20code=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(decode-coding-string=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(substring=20seq-str=20text-start=20end-mark)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20locale-coding-system=20t)))))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20= (and=20(not=20end-mark)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(>=3D=20= ctl-end=20str-length)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(<=20(-=20= ctl-end=20i)=20term--osc-max-bytes))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Continue=20= ignoring=20until=20the=20end=20marker.=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20= term-terminal-undecoded-bytes=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(substring=20= str=20i)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20Consume=20everything=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(setq=20i=20ctl-end))=0A=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?D=20;;=20Scroll=20forward=20= (apparently=20not=20documented=20in=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20;;=20[ECMA-48],=20[ctlseqs]=20mentions=20= it=20as=20C1=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20character=20"Index"=20though).=0Adiff=20--git=20= a/test/lisp/term-tests.el=20b/test/lisp/term-tests.el=0Aindex=20= ffb341f3b52..2d8dd3ae959=20100644=0A---=20a/test/lisp/term-tests.el=0A= +++=20b/test/lisp/term-tests.el=0A@@=20-419,6=20+419,92=20@@=20= term-undecodable-input=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20bytes)))))=0A=20=0A= +(ert-deftest=20term-ignore-osc()=0A+=20=20;;=20BEL-terminated=20OSC=20= sequence=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20"te\e]0;window=20= title\ast")))=0A+=20=20;;=20ESC=20\-terminated=20OSC=20sequence=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;window=20title\e\\st")))=0A+=20=20;;=20= Long=20OSC=20sequence=20split=20into=20multiple=20chunks=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20'("te\e]0;win"=20"dow=20"=20"=20= title\ast"))))=0A+=20=20;;=20OSC=20sequence=20that=20start=20and=20ends=20= with=20the=20chunk=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20'("te"=20= "\e]0;window=20"=20"title\a"=20"st"))))=0A+=0A+=20=20;;=20Invalid=20= control=20characters=20break=20out=20of=20the=20OSC=20sequence,=20for=0A= +=20=20;;=20safety.=0A+=20=20(should=20(equal=20"tetitlest"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= '("te\e]0;window\x05title\ast"))))=0A+=0A+=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20;;=20An=20OSC=20= sequence=20with=20multibyte=20UTF-8=20characters.=20Not=20exactly=0A+=20=20= =20=20;;=20standard-compliant,=20but=20too=20common=20not=20to=20= support.=0A+=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]0;\xce\xb1\xce\xb2\e\\st")))))=0A+=0A+(ert-deftest=20= term-handle-osc()=0A+=20=20(let*=20((captured=20nil)=0A+=20=20=20=20=20=20= =20=20=20(handler=20(lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20code=20text)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= captured)))=0A+=20=20=20=20=20=20=20=20=20(term-osc-handlers=20`(("2"=20= .=20,handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20,handler))))=0A+=0A+=20=20= =20=20;;=20Send=20OSC=20sequences=20to=20handler=0A+=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=2040=201=20"te\e]2;foo\as\e]1994;bar\at")))=0A+=20=20=20= =20(should=20(equal=20'(("2"=20.=20"foo")=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"bar"))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A+=0A= +=20=20=20=20;;=20OSC=20sequences=20and=20code=20can=20be=20chunked=0A+=20= =20=20=20(setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=20= "test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20`("te\e]2;chunked=20fo"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"o\as\e]19"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"94;chunked=20ba"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20"r\at"))))=0A+=20=20=20=20(should=20= (equal=20'(("2"=20.=20"chunked=20foo")=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20("1994"=20.=20"chunked=20bar"))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A= +=0A+=20=20=20=20;;=20OSC=20sequences=20can=20contain=20multibyte=20= characters=0A+=20=20=20=20(let=20((locale-coding-system=20'utf-8-unix))=0A= +=20=20=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A+=20=20=20=20=20=20(should=20(equal=20= '(("2"=20.=20"=CE=B1=CE=B2"))=20captured)))=0A+=0A+=20=20=20=20;;=20= Ignore=20unhandled=20and=20invalid=20OSC=20sequences=0A+=20=20=20=20= (setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]3;unhandled\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2missing=20semicolon\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2;not=20ended\003est")))=0A+=20=20=20=20(should-not=20= captured)))=0A+=0A=20(provide=20'term-tests)=0A=20=0A=20;;;=20= term-tests.el=20ends=20here=0A--=20=0A2.47.0=0A=0A= --Apple-Mail=_63AEF71D-7EEF-4CB9-824E-F61D02CD9831 Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii
--Apple-Mail=_63AEF71D-7EEF-4CB9-824E-F61D02CD9831-- --Apple-Mail=_602CF24F-C442-4856-AB92-35764191AABA-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 24 May 2025 09:07:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: per@bothner.com, jared@finder.org, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174807760229296 (code B ref 78263); Sat, 24 May 2025 09:07:02 +0000 Received: (at 78263) by debbugs.gnu.org; 24 May 2025 09:06:42 +0000 Received: from localhost ([127.0.0.1]:56960 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uIkq1-0007cS-Tb for submit@debbugs.gnu.org; Sat, 24 May 2025 05:06:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60622) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uIkpz-0007cD-1v for 78263@debbugs.gnu.org; Sat, 24 May 2025 05:06:39 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uIkps-0000gj-IT; Sat, 24 May 2025 05:06:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=g9aAfBCk0y923BEqRlNyI2I3+p0Ij4itKMCitVmQKNc=; b=rzhGPb7940gyL/9rjzxd iyOKsWfXsY9WJELrWo97ItFoGppRGF+vVtMIhLr2GG3y0OLJ5dCtS6HHCrpIQsC4BXW3tbV5U6dmn eGpCPloXJvPRFWQz+IFH6ySQ1DZ+sAqDOTNNlBB//R3D6p6Fu+mM+8w0cAj5gmqkZyNXj2SQp5jwW rAsd4l1qg0EMFDJzIaPgQmtam0+tGTBRbIgfJtubw9cycqJYv7ywdDghx1FrtqLzSesjH8ZH6lqZv c79W369ejEYVGFWkfehW7bFuka+45UV2TCJZjUg1pCU+Xry1TgG2/AbaeGT0Sjhla6rr3e4Fcjjlb eq0UVIAAnJxAmw==; Date: Sat, 24 May 2025 12:06:29 +0300 Message-Id: <86y0um1ip6.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> (message from =?UTF-8?Q?St=C3=A9phane?= Zermatten on Tue, 13 May 2025 17:24:29 +0300) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) > From: Stéphane Zermatten > Date: Tue, 13 May 2025 17:24:29 +0300 > Cc: Jared Finder , > Per Bothner , > 78263@debbugs.gnu.org > > > Last, but not least: you don't seem to have a copyright assignment on > > file, without which we cannot accept such a large contribution. Would > > you like to start the paperwork of copyright assignment at this time? > > If yes, I will send you the form to fill and the instructions. > > Yes, I still need to do that. I sent out a request to assign@gnu.org following the instructions in etc/copyright-assign.txt but have yet to hear back from them. Any progress in this matter? If you still haven't heard from assign@gnu.org, please ping them and CC me. Jared, would you please review the patch and comment on it? Thanks. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 31 May 2025 08:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: Per Bothner , Jared Finder , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174868066526584 (code B ref 78263); Sat, 31 May 2025 08:38:02 +0000 Received: (at 78263) by debbugs.gnu.org; 31 May 2025 08:37:45 +0000 Received: from localhost ([127.0.0.1]:55386 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uLHir-0006ui-Az for submit@debbugs.gnu.org; Sat, 31 May 2025 04:37:45 -0400 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]:45393) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uLHio-0006uG-Nw for 78263@debbugs.gnu.org; Sat, 31 May 2025 04:37:44 -0400 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-3a363d15c64so1853158f8f.3 for <78263@debbugs.gnu.org>; Sat, 31 May 2025 01:37:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748680656; x=1749285456; darn=debbugs.gnu.org; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=wptTDNxQ5VtqjOgKsicwGfAWQ/qHUh8v9AiHJZjkEAU=; b=moZxWlTKZmM8qEy8Hj2ho3SoFp2DoyjXOMZW+xaEQwXsMUaQgH8GsNWB/WXmg+Vqzi SJ5OT3nK48hFWIIJuh+zOiEzpuKtI2uFWx937szw1FM+HqsgpTWbhAt0U93U4V629Drr 7w4706qSXBM1MK7xhSnDFN+1mh1B6VCbBem/ExBVvrGE2eQVErW36YhNnTCaA2CKKUP5 f1rrpDTDjIR/TfdGBweWR2NaIkjRu6h09qrAocGg0o/dSICkQ2tXNIE0k/4H4kTj284e jE9pzwONZn4FJZLvMV8Z4qgNVIoBJjlJK24k+CUW440POSRBl/iIdNHx9z7juc3roqIC RVgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748680656; x=1749285456; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wptTDNxQ5VtqjOgKsicwGfAWQ/qHUh8v9AiHJZjkEAU=; b=ejwzcWDlpqeuYUKiLBs2nV0NGzd4PXOn6Oe+UQpbVICwLqkyUF5z2mV7Rg50nYhrAX K7ebv1JHoiRiicyLPu0SaeMGsg1oPH0CVYcJG7ot5LOyiaKda0E+m5/dr5TMrMTqyuH0 FrJAYXm7v2PLoVKZmvnUU3OQxlTGQOUkCDXT0OrtJDNr+GpTf6WVWzKwHp/ZEhGOPW7K m76LtCQAaLxULKnk3pFk2WWK//pWJRtUR8OGQ3StwqXk5HcEoBap4Y6SxbmV25G8+8KR cQY+bASIeZGrOU+S+2oJqTCIpxIuWsoFW+qMt579yQY7iwAYIoIieFhYz9kET0s+SDOm lFZw== X-Forwarded-Encrypted: i=1; AJvYcCWci3pf4Y0mvPnhOBFypNf/rrWGPGDcmI+G3n1zvlgbO6dCkLPVkDw0rCyizgnPEmufC5pjmg==@debbugs.gnu.org X-Gm-Message-State: AOJu0YyZYbafHbO9ms51TX0iAEQBMs1jfp0A5Np1yCbFssvK7hiYULlv VclGpvG9acbKE3etlfbnpFhqu5CvHFRCIz0jhir6SGiQhDD6QD7bPLZg X-Gm-Gg: ASbGncuXDE6p19JtHJmTkL0Gqo3d3w/wnh9Srj5T27NNO9bHh81ZMsxAIl0iQaJDrFI 3kiqH67GgvIDb6hbOY0JhKHKa1qbIECEoGGbU68v/5bby1XujTgYJtWJnSjG71EQKRIvBd6EzbR e7BfB5FYHtlpArX6njeXwF4uv3U1kIhXNNCMrxKYyr+d31gk4vegfp0flTgq8UjC9zt/UyRNTvI R79Zry55r95hOC8Cjx8QPcPrdb3v+uAVURYwYMIXdbUVmYSG7Ls41ynDxLOL1ndgAl5/tmAFdPQ CpegdijFvUOy+zpdEwygsoJ3P0TUOOoFB5IFC+55hIyDSLQ822GdgLosH0Ah6a1svFY/WtGlInu dlQ== X-Google-Smtp-Source: AGHT+IG9PkPD9zEmAAi4bXx1cStg2PtrqTHPbkYdTTY9HUwKBclY5RSzeix0MEKs0q6Pm9GWSPdS1w== X-Received: by 2002:a05:6000:2485:b0:3a4:c614:4c1f with SMTP id ffacd0b85a97d-3a4f7a0254emr4695545f8f.3.1748680656192; Sat, 31 May 2025 01:37:36 -0700 (PDT) Received: from smtpclient.apple ([62.74.16.134]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-450d7fa27b4sm41290815e9.15.2025.05.31.01.37.34 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 31 May 2025 01:37:35 -0700 (PDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.4\)) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten In-Reply-To: <86y0um1ip6.fsf@gnu.org> Date: Sat, 31 May 2025 11:37:23 +0300 Content-Transfer-Encoding: quoted-printable Message-Id: <40F7BE95-CCCC-463A-A91B-2CEDDEB3B297@gmail.com> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86y0um1ip6.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51.11.4) 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 (-) There=E2=80=99s been some progress on the copyright assignment front: I = got the document from assign@gnu.org and sent it back 3 days ago. Just = waiting for the confirmation. I=E2=80=99ll ping this bug once I get it.=20= > On 24 May 2025, at 12:06, Eli Zaretskii wrote: >=20 >> From: St=C3=A9phane Zermatten >> Date: Tue, 13 May 2025 17:24:29 +0300 >> Cc: Jared Finder , >> Per Bothner , >> 78263@debbugs.gnu.org >>=20 >>> Last, but not least: you don't seem to have a copyright assignment = on >>> file, without which we cannot accept such a large contribution. = Would >>> you like to start the paperwork of copyright assignment at this = time? >>> If yes, I will send you the form to fill and the instructions. >>=20 >> Yes, I still need to do that. I sent out a request to assign@gnu.org = following the instructions in = etc/copyright-assign.txt but have yet to hear back from them. >=20 > Any progress in this matter? If you still haven't heard from > assign@gnu.org, please ping them and CC me. >=20 > Jared, would you please review the patch and comment on it? >=20 > Thanks. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 31 May 2025 09:19:06 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: jared@finder.org, =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174868313814030 (code B ref 78263); Sat, 31 May 2025 09:19:06 +0000 Received: (at 78263) by debbugs.gnu.org; 31 May 2025 09:18:58 +0000 Received: from localhost ([127.0.0.1]:55542 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uLIMf-0003dt-Nz for submit@debbugs.gnu.org; Sat, 31 May 2025 05:18:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40484) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uLIMY-0003cS-PI for 78263@debbugs.gnu.org; Sat, 31 May 2025 05:18:51 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uLIMS-0001ZR-S0; Sat, 31 May 2025 05:18:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=7gBy6Q7iyczGX0Y6Hol75se5WNmI9/T4dt7zVGTGbhs=; b=SUcS4vkNOZhpvHaUipSR gwGXH3vAxAwk0Ast8JzQzAcdrxI+fjYMM8b+RaQUVkqw7LwOFJ8o3WXn/xZsDfF489/pHDbyarR1C M3MZcvtz5InAXK9SR7tiEd99Y4F6xW30PcX0HV2+UbhRM7kwc9ccMOP0/DHAb2+cfvutpACIba6r4 Ee0cq/xVwaXSveCB7OR9nWmQN7zd3OfO0jlXs3pAnrB2mWePxerqjygivKoMxjbTLJEcxGmvRsCqu PFf7HhUKJ20TBfc074TfFS1aIN9/4tbZNDPvQ91WJX+BsBPgHY9EdvqhA37NJ7eakVFnxCuvW70Zn hH+6PPVhKiCjXw==; Date: Sat, 31 May 2025 12:18:09 +0300 Message-Id: <86msatrve6.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> (message from =?UTF-8?Q?St=C3=A9phane?= Zermatten on Tue, 13 May 2025 17:24:29 +0300) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) Ping! We are waiting for the copyright assignment, but meanwhile, Jared, could you please review the patch and comment? > From: Stéphane Zermatten > Date: Tue, 13 May 2025 17:24:29 +0300 > Cc: Jared Finder , > Per Bothner , > 78263@debbugs.gnu.org > > Thank you for the review! I addressed the points you mentioned. See the updated patch attached to this e-mail. > > > On 8 May 2025, at 13:03, Eli Zaretskii wrote: > > > >> From: Stéphane Zermatten > >> Date: Mon, 5 May 2025 19:57:45 +0300 > >> Cc: 78263@debbugs.gnu.org, > >> Dan Nicolaescu , > >> Eli Zaretskii > >> > >> I attached a merged version of all 3 patches to this e-mail that handles OSC sequences, so they’re handled right away. I’m happy to do it that way, if it’s more convenient. > > > > Thanks, see some minor comments below. > > > > Jared, any further comments about the issue or the patch? > > > >> * lisp/term.el (term-emulate-terminal) handle OSC sequences > > > > The log message should mention all the functions/variables where you > > make changes, with a short description of each change. Please also > > mention the bug number. > > I updated the description, trying to follow the format of older commits. > > > > >> +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) > >> + ("2" . ansi-osc-window-title-handler) > >> + ("7" . ansi-osc-directory-tracker) > >> + ("8" . ansi-osc-hyperlink-handler)) > >> + "OSC sequence handler function alist. > >> + > >> +OSC (Operating System Command) is a category of ANSI escape sequence > >> +used in terminal application to introduce custom commands. Terminals > >> +ignore unknown OSC sequences by default. Handlers can be registered here > >> +to add support for new OSC sequences to `term'. > >> + > >> +Functions in this alist are passed matching valid OSC sequences as > >> +they're sent to the terminal. > >> + > >> +Valid OSC sequences are of the form > >> + ESC ] code ; text BEL > >> + ESC ] code ; text ESC \ > >> + > >> +Each entry has the form (CODE . FUNCTION), where CODE is the string that > >> +appears before the semicolon. > >> + > >> +FUNCTION is called with two arguments CODE and TEXT with the term buffer > >> +active and its point and state active at the time the OSC sequence > >> +appeared in the stream." > >> + :type '(alist :key-type string :value-type function) > >> + :group 'term) > > > > New defcustoms should have a :version tag. > > I added one. I guess we’re at 31.1, now. > > > > >> +(defconst term-osc--max-bytes (* 32 1024 1024) > >> + "Limit the length of OSC sequences to keep in memory.") > > > > This begs the question: what happens with longer sequences? Can the > > doc string answer that question? > > emulate-terminal goes back into its normal state, because presumably the end tag was lost. > I tried to describe that. > > > > >> + (with-demoted-errors "term OSC error: %S" > >> + (funcall > >> + func code > >> + (decode-coding-string > >> + (substring seq-str text-start end-mark) > >> + locale-coding-system t))))) > > > > Why locale-coding-system? Wouldn't the result of calling > > process-coding-system with the process running in term.el be a better > > candidate? > > process-coding-system is just 'binary because emulate-terminal want to process the escape sequences before the string is decoded. Using locale-coding-system is the way strings are decoded everywhere in emulate-terminal. > > > > > Last, but not least: you don't seem to have a copyright assignment on > > file, without which we cannot accept such a large contribution. Would > > you like to start the paperwork of copyright assignment at this time? > > If yes, I will send you the form to fill and the instructions. > > Yes, I still need to do that. I sent out a request to assign@gnu.org following the instructions in etc/copyright-assign.txt but have yet to hear back from them. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Jared Finder Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 31 May 2025 19:53:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: =?UTF-8?Q?St=C3=A9phane?= Zermatten , per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174872112210718 (code B ref 78263); Sat, 31 May 2025 19:53:02 +0000 Received: (at 78263) by debbugs.gnu.org; 31 May 2025 19:52:02 +0000 Received: from localhost ([127.0.0.1]:60185 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uLSFN-0002mf-3I for submit@debbugs.gnu.org; Sat, 31 May 2025 15:52:01 -0400 Received: from greenhill.hpalace.com ([192.155.80.58]:43070) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uLSFI-0002mA-E5 for 78263@debbugs.gnu.org; Sat, 31 May 2025 15:51:58 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=finder.org; s=2018; t=1748720547; bh=hybQTPIBw7GfZSUQPcKrq2VSikd6tzDfK8iJTnUBXfk=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=p13Eqwaipk2HbJwMDbbuQJGVBHKUUNUO8DlAcYc6bF3iCvATDzRzx3qlYFWbOULVt iQXXOA8nUKO9PAu+WGm6TXayWKTmINHpw5oc7hpysi1I3/HwCpGjhvdAK1BnysuKJM ngbo7loflynwNTd7wbFCRSvwwzVYF0P6Z/lVPRU4yrFNwU+We6xYrN+mM3HGzODKCs cLiCD5xJnzDZWH3NLVEuKTqp/bHljzvNqk5Qg7Y+01I26MOduVB5++/RaAcigt1gLw xI/QIyoJDSMuvbM+yyhgHRL6oC/WSOb8ci3EAVNvvew4Wt/pBufhVKHikCdWox0frd 8Rrs1EkwYj78w== Received: from mail.finder.org (unknown [192.155.80.58]) by greenhill.hpalace.com (Postfix) with ESMTPSA id 502B21151; Sat, 31 May 2025 19:42:27 +0000 (UTC) MIME-Version: 1.0 Date: Sat, 31 May 2025 12:42:27 -0700 From: Jared Finder In-Reply-To: <86msatrve6.fsf@gnu.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> Message-ID: <86b134df52395832f9ba491de8f8442a@finder.org> X-Sender: jared@finder.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 (-) Sorry for being quiet. I was on work travel and am back now. I will take a look! -- MJF On 2025-05-31 02:18, Eli Zaretskii wrote: > Ping! We are waiting for the copyright assignment, but meanwhile, > Jared, could you please review the patch and comment? > >> From: Stéphane Zermatten >> Date: Tue, 13 May 2025 17:24:29 +0300 >> Cc: Jared Finder , >> Per Bothner , >> 78263@debbugs.gnu.org >> >> Thank you for the review! I addressed the points you mentioned. See >> the updated patch attached to this e-mail. >> >> > On 8 May 2025, at 13:03, Eli Zaretskii wrote: >> > >> >> From: Stéphane Zermatten >> >> Date: Mon, 5 May 2025 19:57:45 +0300 >> >> Cc: 78263@debbugs.gnu.org, >> >> Dan Nicolaescu , >> >> Eli Zaretskii >> >> >> >> I attached a merged version of all 3 patches to this e-mail that handles OSC sequences, so they’re handled right away. I’m happy to do it that way, if it’s more convenient. >> > >> > Thanks, see some minor comments below. >> > >> > Jared, any further comments about the issue or the patch? >> > >> >> * lisp/term.el (term-emulate-terminal) handle OSC sequences >> > >> > The log message should mention all the functions/variables where you >> > make changes, with a short description of each change. Please also >> > mention the bug number. >> >> I updated the description, trying to follow the format of older >> commits. >> >> > >> >> +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) >> >> + ("2" . ansi-osc-window-title-handler) >> >> + ("7" . ansi-osc-directory-tracker) >> >> + ("8" . ansi-osc-hyperlink-handler)) >> >> + "OSC sequence handler function alist. >> >> + >> >> +OSC (Operating System Command) is a category of ANSI escape sequence >> >> +used in terminal application to introduce custom commands. Terminals >> >> +ignore unknown OSC sequences by default. Handlers can be registered here >> >> +to add support for new OSC sequences to `term'. >> >> + >> >> +Functions in this alist are passed matching valid OSC sequences as >> >> +they're sent to the terminal. >> >> + >> >> +Valid OSC sequences are of the form >> >> + ESC ] code ; text BEL >> >> + ESC ] code ; text ESC \ >> >> + >> >> +Each entry has the form (CODE . FUNCTION), where CODE is the string that >> >> +appears before the semicolon. >> >> + >> >> +FUNCTION is called with two arguments CODE and TEXT with the term buffer >> >> +active and its point and state active at the time the OSC sequence >> >> +appeared in the stream." >> >> + :type '(alist :key-type string :value-type function) >> >> + :group 'term) >> > >> > New defcustoms should have a :version tag. >> >> I added one. I guess we’re at 31.1, now. >> >> > >> >> +(defconst term-osc--max-bytes (* 32 1024 1024) >> >> + "Limit the length of OSC sequences to keep in memory.") >> > >> > This begs the question: what happens with longer sequences? Can the >> > doc string answer that question? >> >> emulate-terminal goes back into its normal state, because presumably >> the end tag was lost. >> I tried to describe that. >> >> > >> >> + (with-demoted-errors "term OSC error: %S" >> >> + (funcall >> >> + func code >> >> + (decode-coding-string >> >> + (substring seq-str text-start end-mark) >> >> + locale-coding-system t))))) >> > >> > Why locale-coding-system? Wouldn't the result of calling >> > process-coding-system with the process running in term.el be a better >> > candidate? >> >> process-coding-system is just 'binary because emulate-terminal want to >> process the escape sequences before the string is decoded. Using >> locale-coding-system is the way strings are decoded everywhere in >> emulate-terminal. >> >> > >> > Last, but not least: you don't seem to have a copyright assignment on >> > file, without which we cannot accept such a large contribution. Would >> > you like to start the paperwork of copyright assignment at this time? >> > If yes, I will send you the form to fill and the instructions. >> >> Yes, I still need to do that. I sent out a request to assign@gnu.org >> following the instructions in >> etc/copyright-assign.txt but have yet to hear back from them. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Jared Finder Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 02 Jun 2025 05:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: =?UTF-8?Q?St=C3=A9phane?= Zermatten , per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174884293517275 (code B ref 78263); Mon, 02 Jun 2025 05:43:02 +0000 Received: (at 78263) by debbugs.gnu.org; 2 Jun 2025 05:42:15 +0000 Received: from localhost ([127.0.0.1]:46085 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uLxw6-0004UP-H4 for submit@debbugs.gnu.org; Mon, 02 Jun 2025 01:42:15 -0400 Received: from greenhill.hpalace.com ([192.155.80.58]:48112) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uLxbr-0002tv-8t for 78263@debbugs.gnu.org; Mon, 02 Jun 2025 01:21:22 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=finder.org; s=2018; t=1748841676; bh=1v4t8K15oSuKbUK2Df4fCPWfAuQV9Q/BZ/mZx059UFE=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=STHqUTEHmRWYzT1SN1zQy3L55GcNZn487ift5n9Lh3uh7SINjR5iGZanxg0ChQsnZ DAKTV1Tx84a7gvXXA+HpC5FcgT+ZTwzpvLcpItZaA2VEaQrpveb+ptB1iV7ucgII6e ln9cvnr8qNG0PhworD9Fij/ZsGcihl2zYhD+jKa3bFvMg5HVl9m/Kor6wTY843ZSWl LV39woXpUWgtvP4fv6lpVUOEnaU/v4SwSgtTOwnSVZdJY7ZuykmUE1en8zniCHsyYo LmFtdm9PtH9KBzYcjJpT9dbyg57J2UdfZiHx1JNWiM2IO8fJXS1LlNwkKFOiG8dXT7 eYCM3cNwhu6oQ== Received: from mail.finder.org (unknown [192.155.80.58]) by greenhill.hpalace.com (Postfix) with ESMTPSA id EB66B48F; Mon, 2 Jun 2025 05:21:15 +0000 (UTC) MIME-Version: 1.0 Date: Sun, 01 Jun 2025 22:21:15 -0700 From: Jared Finder In-Reply-To: <86b134df52395832f9ba491de8f8442a@finder.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> Message-ID: X-Sender: jared@finder.org Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit 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 (-) Only minor comments, otherwise the patch generally looks good. > +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) > + ("2" . ansi-osc-window-title-handler) > + ("7" . ansi-osc-directory-tracker) > + ("8" . ansi-osc-hyperlink-handler)) The variable ansi-osc-handlers in ansi-osc.el doesn't handle OSC 0 (set icon and title), but here it's handled. I would think the two should be identical. Also what's the rationale for duplicating ansi-osc-handlers instead of just adding a new custom variable that tells term to look at asci-osc-handlers? > +(ert-deftest term-ignore-osc() Style nit: there should be a space between the symbol term-ignore-osc and the (). This should look like a defun of no arguments. Apologies for taking so long to get to this. -- MJF From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 02 Jun 2025 17:02:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Jared Finder Cc: Eli Zaretskii , Per Bothner , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.17488837169044 (code B ref 78263); Mon, 02 Jun 2025 17:02:02 +0000 Received: (at 78263) by debbugs.gnu.org; 2 Jun 2025 17:01:56 +0000 Received: from localhost ([127.0.0.1]:53845 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uM8Xr-0002Lc-3b for submit@debbugs.gnu.org; Mon, 02 Jun 2025 13:01:56 -0400 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]:56656) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uM8Xo-0002L2-FL for 78263@debbugs.gnu.org; Mon, 02 Jun 2025 13:01:53 -0400 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-43edecbfb94so51029995e9.1 for <78263@debbugs.gnu.org>; Mon, 02 Jun 2025 10:01:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748883706; x=1749488506; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=0IABx/vZKTT5oEmPTdcOdRjei0Woi4MchtR5OUeumCk=; b=JFpCPULcuALMYtvAdUj3jsir0CZ+NCLGgjwcdSZ+ZiLhiDE1+5yFAzmmsB++fie93m INGQS9XsuxGm0X4w7i9pUVE/tFDvv83W99Pg0iF9EDYSwC1MEMWQx2sfytSsMEyLKSgn chjQROI8uE+zGxI7zmstTRdLLP0WVhYTHagF12ZysvR76FbHk3NB1VrE+SsgjbFxxEHp ee8ypQJR/kzG4Dn73/MRvid8QXoB1+w+r0w8YJkD3ePQHuswcssOPDFNtUINE+wNKIyk xkz0ECit5msdHAE1wHmvMiQV/O1H+yDOvneeolvMCuK/MVd7uumqvT5LmA9KiqywqMIy LWtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748883706; x=1749488506; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0IABx/vZKTT5oEmPTdcOdRjei0Woi4MchtR5OUeumCk=; b=pFDEIsFTxbtsXlaSzCJOE8Dlz3AqsUiGt8hepWD8+KU5chiLbyGzx5zXTd2XlvyIEp EmNAPqodW9dIh+2jRjRe574IgEmxbHrOHSXmwB/T4UuKiWPAxgeYP/ndzZLr5+Njnr8V yWzPRWpAhxM3rUaKQ6oOfetjgLt9mfxlBjRjrif4uO8bvIWNJpyPNPJSifR4Z+MBut5X Eb0Th9isSFQ4xhOxdpiv7BypEgtM8qTb7ZES3IPX5Wf5l+ywGNvxYL0p2NBs+b+KO/dJ 6S8+XhX/UUOysaLfvQipWjyWoodcLtp1hUinfP77fYTcURai0V++DJKiQZfPm7/oZcIE yL4w== X-Forwarded-Encrypted: i=1; AJvYcCWEo2rlatZmU3KYIZWmBYGW6E/FQYqYQTNHlNDEEsk3ntSyY1+6X5as8mUY7N7iXIEUcFy/Uw==@debbugs.gnu.org X-Gm-Message-State: AOJu0YyT38lxD2thssQphigAOAZNzLr9XDBi4oaenDF688O0keNVKaVS e2ls/0Wb/sMOlGZwK/upnT2aHB7hVLGyyiyUlaTifTtp+akG7x6WXmR7LobSKtWX X-Gm-Gg: ASbGncu1NHnhMJ4mcIIvcSbAHPGHYR8GQ9YBXOj+imysF0pUIfRBFAjUAVqhMkG7xsJ H5FR+AjBY7RfCpF5/9aRTUQ/+5k7r/BHiVE/UuL6kE8X9YLOzvMoQbLBJyNmUshJ1ji6el8hf1X x+/kbAdlwuodeRXJTCiIxNeRRL0b0SW9dl/Bfp4lYD+Ly6GaGdBA5Df7gxnzD1v9vpONlOH4TIv ZCApwgoncQi3KE2d/POulDHbnbKFBkL71lk5WDr35JOAJTRCusw2NyMGlo6EVIgNmnlkchb8NjZ LjwO2HYYCBmhu4eAZxUqbnIT9BwkajXC9TRPaVe+7Rilo7iR0UAGbMywaMZ637JTcg2ZnUNS9W8 C4bmUFCtds4q3 X-Google-Smtp-Source: AGHT+IH5tWtgRqZenNnUptKiHDqRoCe0SeeFPFcyjVD4fVs5F79QHRWfrb+xpMW6/XajQkL7pDJTlg== X-Received: by 2002:a05:600c:1914:b0:442:e147:bea7 with SMTP id 5b1f17b1804b1-4512655c3bcmr74665465e9.29.1748883706044; Mon, 02 Jun 2025 10:01:46 -0700 (PDT) Received: from smtpclient.apple ([62.74.17.233]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4efe74072sm15875899f8f.52.2025.06.02.10.01.44 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 02 Jun 2025 10:01:45 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: Content-Type: multipart/alternative; boundary="Apple-Mail=_CB22D33C-43C5-41D8-AEFA-E41F00083C03" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.4\)) Date: Mon, 2 Jun 2025 20:01:32 +0300 In-Reply-To: References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> X-Mailer: Apple Mail (2.3776.700.51.11.4) 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 (-) --Apple-Mail=_CB22D33C-43C5-41D8-AEFA-E41F00083C03 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I updated the change, see the new version attached. No news from the copyright assignment front yet. > On 2 Jun 2025, at 08:21, Jared Finder wrote: >=20 > Only minor comments, otherwise the patch generally looks good. >=20 >> +(defcustom term-osc-handlers '(("0" . ansi-osc-window-title-handler) >> + ("2" . ansi-osc-window-title-handler) >> + ("7" . ansi-osc-directory-tracker) >> + ("8" . ansi-osc-hyperlink-handler)) >=20 > The variable ansi-osc-handlers in ansi-osc.el doesn't handle OSC 0 = (set icon and title), but here it's handled. I OSC 0 is the code I saw most commonly used in the wild and it works well = with ansi-osc-window-title-handler, so I propose, in the new version of = this patch, to add it to ansi-osc-handlers (which term now calls).=20 Should this particular change be in another patch instead, with another = set of reviewers?=20 > would think the two should be identical. Also what's the rationale = for duplicating ansi-osc-handlers instead of just adding a new custom = variable that tells term to look at asci-osc-handlers? OSC handlers run in different environments when called by term than when = called by ansi-osc. ansi-osc is typically called on a compilation = buffer, during or even after compilation.=20 That said, it=E2=80=99s true that, in many cases, OSC handlers, if = they=E2=80=99re written correctly and especially if they=E2=80=99re just = cosmetic, will work in both environments, so it might be convenient to = be able to configure them once for both environments, as long as we can = configure them differently if needed. It=E2=80=99s not a straightforward situation. I thought that a solution = with two separate configurations variable would be simpler and safer.=20 I updated the patch to allow delegating to ansi-osc-handlers, but still = allow overriding if necessary. I find this delegation part a bit complicated.=20 The root of the problem is that we can=E2=80=99t assume that handlers = written for one environment work in the other environment, or even that = they make sense. When called by term: - they are run at the time they appear in the stream, at the position = the cursor is in (not necessarily at the end of the text) - they have access to a process they can communicate with When called by ansi-osc: - they are run at the position they appear in a buffer containing a mix = of text and uninterpreted terminal sequences followig it=20 - they cannot assume that there is a process to communicate with The first point means that a handler written for ansi-osc might very = well be confused when run in a terminal, depending on what they need to = do. The current handlers happen to all work in both environment, but = that=E2=80=99s not a given.=20 The second point means that a handler written for term might also be = confused not having access to a real terminal and process to communicate = with. =20 For example, a handler for OSC 4;c;spec written for the compilation = buffer mightimplement "Change Color Number c to the color specified by = spec=E2=80=9D but it would not implement "If a "?" is given rather than = a name or RGB specification, xterm replies with a control sequence of = the same form which can be used to set the corresponding color.=E2=80=9D = while a handler for term could implement both.=20 (quotes from https://www.xfree86.org/current/ctlseqs.html) >=20 >> +(ert-deftest term-ignore-osc() >=20 > Style nit: there should be a space between the symbol term-ignore-osc = and the (). This should look like a defun of no arguments. I fixed this. =EF=BF=BC= --Apple-Mail=_CB22D33C-43C5-41D8-AEFA-E41F00083C03 Content-Type: multipart/mixed; boundary="Apple-Mail=_60407CBB-3A70-446F-AE7F-57BFA708E74A" --Apple-Mail=_60407CBB-3A70-446F-AE7F-57BFA708E74A Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8
I updated the change, see the new = version attached.

No = news from the copyright assignment front yet.

On 2 Jun 2025, at 08:21, Jared Finder = <jared@finder.org> wrote:

Only minor comments, = otherwise the patch generally looks good.

+(defcustom term-osc-handlers '(("0" . = ansi-osc-window-title-handler)
+ =             &n= bsp;           &nbs= p;     ("2" . = ansi-osc-window-title-handler)
+ =             &n= bsp;           &nbs= p;     ("7" . ansi-osc-directory-tracker)
+ =             &n= bsp;           &nbs= p;     ("8" . = ansi-osc-hyperlink-handler))

The variable = ansi-osc-handlers in ansi-osc.el doesn't handle OSC 0 (set icon and = title), but here it's handled.  I =

OSC 0 is the code I saw = most commonly used in the wild and it works well with = ansi-osc-window-title-handler, so I propose, in the new version of this = patch, to add it to ansi-osc-handlers (which term now = calls). 

Should this particular change be = in another patch instead, with another set of = reviewers? 

would = think the two should be identical.  Also what's the rationale for = duplicating ansi-osc-handlers instead of just adding a new custom = variable that tells term to look at = asci-osc-handlers?

OSC = handlers run in different environments when called by term than when = called by ansi-osc. ansi-osc is typically called on a compilation = buffer, during or even after = compilation. 

That said, it=E2=80=99= s true that, in many cases, OSC handlers, if they=E2=80=99re written = correctly and especially if they=E2=80=99re just cosmetic, will work in = both environments, so it might be convenient to be able to configure = them once for both environments, as long as we can configure them = differently if needed.

It=E2=80=99s not a = straightforward situation. I thought that a solution with two separate = configurations variable would be simpler and = safer. 

I updated the patch to allow = delegating to ansi-osc-handlers, but still allow overriding if = necessary.
I find this delegation part a bit = complicated. 

The root of the = problem is that we can=E2=80=99t assume that handlers written for one = environment work in the other environment, or even that they make = sense.

When called by term:
 - = they are run at the time they appear in the stream, at the position the = cursor is in (not necessarily at the end of the text)
 - = they have access to a process they can communicate = with

When called by ansi-osc:
 - = they are run at the position they appear in a buffer containing a mix of = text and uninterpreted terminal sequences followig = it 
 - they cannot assume that there is a process to = communicate with

The first point means that a = handler written for ansi-osc might very well be confused when run in a = terminal, depending on what they need to do. The current handlers happen = to all work in both environment, but that=E2=80=99s not a = given. 

The second point means that a = handler written for term might also be confused not having access to a = real terminal and process to communicate with. =  

For example, a handler for OSC 4;c;spec = written for the compilation buffer mightimplement "Change Color = Number c to the color specified = by spec=E2=80=9D but it would not implement "If a "?" is = given rather than a name or RGB specification, xterm replies with a = control sequence of the same form which can be used to set the = corresponding color.=E2=80= =9D while a handler for term could implement = both. 
(quotes = from https://www.xfree86.org/current/ctlseqs.html)
<= br>


+(ert-deftest term-ignore-osc()

Style = nit: there should be a space between the symbol term-ignore-osc and the = ().  This should look like a defun of no = arguments.

I fixed = this.

= --Apple-Mail=_60407CBB-3A70-446F-AE7F-57BFA708E74A Content-Disposition: attachment; filename=0001-Handle-OSC-sequences-in-term-bug-78263.patch Content-Type: application/octet-stream; x-unix-mode=0700; name="0001-Handle-OSC-sequences-in-term-bug-78263.patch" Content-Transfer-Encoding: quoted-printable =46rom=20aa64b3127316074cfe32ccf6edbe26985c8c0d50=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Sat,=203=20May=202025=2000:03:12=20+0300=0ASubject:=20[PATCH]=20= Handle=20OSC=20sequences=20in=20term=20(bug#78263)=0A=0AHandlers=20can=20= be=20registered=20to=20term-osc-handler,=20which=20by=20defaults,=0A= supports=20OSC=200,=202,=207=20and=208,=20using=20handlers=20defined=20= in=20ansi-osc.=20Unknown=0AOSC=20sequences=20are=20properly=20ignored.=0A= =0A*=20lisp/term.el:=0A=20=20(term-emulate-terminal):=20handle=20OSC=20= sequences=0A=20=20term-osc-handler:=20new=20custom=20option=0A=20=20= term-control-seq-regexp:=20extended=20regexp=0A=20=20term--osc-max-byte:=20= new=20private=20constant=0A*=20lisp/ansi-osc.el:=0A=20=20= ansi-osc-handler:=20handle=20OSC=200=20(like=20OSC=202)=0A=0Areview2:=20= fix=20ert-deftest=20style=0A=0Areview2:=20delegate=20to=20ansi=0A=0A= review2:add=20osc=200=0A---=0A=20lisp/ansi-osc.el=20=20=20=20=20=20=20=20= |=20=20=203=20+-=0A=20lisp/term.el=20=20=20=20=20=20=20=20=20=20=20=20|=20= =2068=20+++++++++++++++++++++++=0A=20test/lisp/term-tests.el=20|=20117=20= ++++++++++++++++++++++++++++++++++++++++=0A=203=20files=20changed,=20187=20= insertions(+),=201=20deletion(-)=0A=0Adiff=20--git=20a/lisp/ansi-osc.el=20= b/lisp/ansi-osc.el=0Aindex=2006359779823..83fcd0d184a=20100644=0A---=20= a/lisp/ansi-osc.el=0A+++=20b/lisp/ansi-osc.el=0A@@=20-62,7=20+62,8=20@@=20= ansi-osc-filter-region=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (delete-region=20pos0=20(point))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20ansi-osc--marker=20(copy-marker=20pos0))))))))=0A=20=0A= -(defvar-local=20ansi-osc-handlers=20'(("2"=20.=20= ansi-osc-window-title-handler)=0A+(defvar-local=20ansi-osc-handlers=20= '(("0"=20.=20ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("2"=20.=20ansi-osc-window-title-handler)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("7"=20.=20ansi-osc-directory-tracker)=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("8"=20.=20ansi-osc-hyperlink-handler))=0A=20=20=20"Alist=20of=20= handlers=20for=20OSC=20escape=20sequences.=0Adiff=20--git=20= a/lisp/term.el=20b/lisp/term.el=0Aindex=20a971300c055..2d5ec6e7374=20= 100644=0A---=20a/lisp/term.el=0A+++=20b/lisp/term.el=0A@@=20-304,6=20= +304,7=20@@=20term-protocol-version=0A=20=20=20(require=20'cl-lib))=0A=20= (require=20'comint)=20;=20Password=20regexp.=0A=20(require=20= 'ansi-color)=0A+(require=20'ansi-osc)=0A=20(require=20'ehelp)=0A=20= (require=20'ring)=0A=20(require=20'shell)=0A@@=20-603,6=20+604,35=20@@=20= term-exec-hook=0A=20=20=20:type=20'hook=0A=20=20=20:group=20'term)=0A=20=0A= +(defcustom=20term-osc-handlers=20nil=0A+=20=20"Terminal-specific=20OSC=20= sequence=20handler=20function=20alist.=0A+=0A+OSC=20(Operating=20System=20= Command)=20is=20a=20category=20of=20ANSI=20escape=20sequence=0A+used=20= in=20terminal=20application=20to=20introduce=20custom=20commands.=20= Terminals=0A+ignore=20unknown=20OSC=20sequences=20by=20default.=20= Handlers=20can=20be=20registered=20here=0A+to=20add=20support=20for=20= new=20OSC=20sequences=20to=20`term'.=0A+=0A+Functions=20in=20this=20= alist=20are=20passed=20matching=20valid=20OSC=20sequences=20as=0A= +they're=20sent=20to=20the=20terminal.=0A+=0A+Valid=20OSC=20sequences=20= are=20of=20the=20form=0A+=20=20ESC=20]=20code=20;=20text=20BEL=0A+=20=20= ESC=20]=20code=20;=20text=20ESC=20\=0A+=0A+Each=20entry=20has=20the=20= form=20(CODE=20.=20FUNCTION),=20where=20CODE=20is=20the=20string=20that=0A= +appears=20before=20the=20semicolon.=0A+=0A+FUNCTION=20is=20called=20= with=20two=20arguments=20CODE=20and=20TEXT=20with=20the=20term=20buffer=0A= +active=20and=20its=20point=20and=20state=20active=20at=20the=20time=20= the=20OSC=20sequence=0A+appeared=20in=20the=20stream.=0A+=0A+Any=20code=20= not=20on=20this=20alist=20is=20further=20looked=20up=20in=20= `ansi-osc-handlers',=0A+which=20collects=20OSC=20handlers=20that=20can=20= also=20work=20outside=20of=20a=20terminal=0A+context.=20For=20details,=20= see=20`ansi-osc-apply-on-region'."=0A+=20=20:type=20'(alist=20:key-type=20= string=20:value-type=20function)=0A+=20=20:group=20'term=0A+=20=20= :version=20"31.1")=0A+=0A=20(defvar=20term-mode-map=0A=20=20=20(let=20= ((map=20(make-sparse-keymap)))=0A=20=20=20=20=20(define-key=20map=20= "\ep"=20'term-previous-input)=0A@@=20-3030,6=20+3060,10=20@@=20= term-control-seq-regexp=0A=20=20=20=20"\e\\(?:[DM78c]\\|"=0A=20=20=20=20= ;;=20another=20Emacs=20specific=20control=20sequence,=0A=20=20=20=20= "AnSiT[^\n]+\n\\|"=0A+=20=20=20;;=20OSC=20(see=20[ECMA-48]=20section=20= 8.3.89=20"Operation=20System=20Command")=20The=0A+=20=20=20;;=20spec=20= only=20allows=200x08-0x0d=200x20-7e,=20but=20this=20regexp=20also=20= allows=0A+=20=20=20;;=20non-ascii=20(UTF-8)=20characters.=0A+=20=20=20= "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|"=0A=20=20=20=20;;=20= or=20an=20escape=20sequence=20(section=205.4=20"Control=20Sequences"),=0A= =20=20=20=20"\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)")=0A=20=20= =20"Regexp=20matching=20control=20sequences=20handled=20by=20term.el.")=0A= @@=20-3037,6=20+3071,13=20@@=20term-control-seq-regexp=0A=20(defconst=20= term-control-seq-prefix-regexp=0A=20=20=20"[\032\e]")=0A=20=0A+(defconst=20= term--osc-max-bytes=20(*=2032=201024=201024)=0A+=20=20"Limit=20the=20= length=20of=20OSC=20sequences=20to=20keep=20in=20memory.=0A+=0A+Once=20= this=20limit=20is=20reached,=20terminal=20input=20is=20processed=20= normally=20again=0A+and=20text=20written=20to=20the=20terminal.=20=20= This=20guards=20against=20missing=20end=0A+sequence=20holding=20up=20the=20= terminal.")=0A+=0A=20(defun=20term-emulate-terminal=20(proc=20str)=0A=20=20= =20(when=20(buffer-live-p=20(process-buffer=20proc))=0A=20=20=20=20=20= (with-current-buffer=20(process-buffer=20proc)=0A@@=20-3232,6=20+3273,33=20= @@=20term-emulate-terminal=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(split-string=20ctl-params=20= ";"))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(aref=20str=20(1-=20ctl-end))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20private))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?\]=20= ;;=20An=20OSC=20sequence=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((seq-str=20(substring=20str=20(+=20i=202)=20= ctl-end)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(string-match=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20= "\\`\\(\\([0-9A-Za-z]+\\);\\)?.*?\\(\a\\|\e\\\\\\)?\\'"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20seq-str)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((code=20(match-string=202=20seq-str))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (text-start=20(match-end=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(end-mark=20= (match-beginning=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20(and=20code=20end-mark)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (when-let*=20((func=20(cdr=20(or=20(assoc-string=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= code=20term-osc-handlers)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(assoc-string=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20code=20ansi-osc-handlers)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (with-demoted-errors=20"term=20OSC=20error:=20%S"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (funcall=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20func=20code=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (decode-coding-string=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(substring=20= seq-str=20text-start=20end-mark)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= locale-coding-system=20t)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(when=20(and=20(not=20end-mark)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(>=3D=20ctl-end=20str-length)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(<=20(-=20ctl-end=20i)=20= term--osc-max-bytes))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20Continue=20ignoring=20until=20= the=20end=20marker.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20term-terminal-undecoded-bytes=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(substring=20str=20i)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Consume=20= everything=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(setq=20i=20ctl-end))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(?D=20;;=20Scroll=20forward=20(apparently=20not=20= documented=20in=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20[ECMA-48],=20[ctlseqs]=20mentions=20it=20as=20C1=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= character=20"Index"=20though).=0Adiff=20--git=20= a/test/lisp/term-tests.el=20b/test/lisp/term-tests.el=0Aindex=20= ffb341f3b52..065cd549bad=20100644=0A---=20a/test/lisp/term-tests.el=0A= +++=20b/test/lisp/term-tests.el=0A@@=20-419,6=20+419,123=20@@=20= term-undecodable-input=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20bytes)))))=0A=20=0A= +(ert-deftest=20term-ignore-osc=20()=0A+=20=20;;=20BEL-terminated=20OSC=20= sequence=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20"te\e]0;window=20= title\ast")))=0A+=20=20;;=20ESC=20\-terminated=20OSC=20sequence=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;window=20title\e\\st")))=0A+=20=20;;=20= Long=20OSC=20sequence=20split=20into=20multiple=20chunks=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20'("te\e]0;win"=20"dow=20"=20"=20= title\ast"))))=0A+=20=20;;=20OSC=20sequence=20that=20start=20and=20ends=20= with=20the=20chunk=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20'("te"=20= "\e]0;window=20"=20"title\a"=20"st"))))=0A+=0A+=20=20;;=20Invalid=20= control=20characters=20break=20out=20of=20the=20OSC=20sequence,=20for=0A= +=20=20;;=20safety.=0A+=20=20(should=20(equal=20"tetitlest"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= '("te\e]0;window\x05title\ast"))))=0A+=0A+=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20;;=20An=20OSC=20= sequence=20with=20multibyte=20UTF-8=20characters.=20Not=20exactly=0A+=20=20= =20=20;;=20standard-compliant,=20but=20too=20common=20not=20to=20= support.=0A+=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]0;\xce\xb1\xce\xb2\e\\st")))))=0A+=0A+(ert-deftest=20= term-handle-osc=20()=0A+=20=20(let*=20((captured=20nil)=0A+=20=20=20=20=20= =20=20=20=20(handler=20(lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20code=20text)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= captured)))=0A+=20=20=20=20=20=20=20=20=20(term-osc-handlers=20`(("2"=20= .=20,handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20,handler))))=0A+=0A+=20=20= =20=20;;=20Send=20OSC=20sequences=20to=20handler=0A+=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=2040=201=20"te\e]2;foo\as\e]1994;bar\at")))=0A+=20=20=20= =20(should=20(equal=20'(("2"=20.=20"foo")=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"bar"))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A+=0A= +=20=20=20=20;;=20OSC=20sequences=20and=20code=20can=20be=20chunked=0A+=20= =20=20=20(setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=20= "test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20`("te\e]2;chunked=20fo"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"o\as\e]19"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"94;chunked=20ba"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20"r\at"))))=0A+=20=20=20=20(should=20= (equal=20'(("2"=20.=20"chunked=20foo")=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20("1994"=20.=20"chunked=20bar"))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20captured)))=0A= +=0A+=20=20=20=20;;=20OSC=20sequences=20can=20contain=20multibyte=20= characters=0A+=20=20=20=20(let=20((locale-coding-system=20'utf-8-unix))=0A= +=20=20=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20=20=20(should=20= (equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A+=20=20=20=20=20=20(should=20(equal=20= '(("2"=20.=20"=CE=B1=CE=B2"))=20captured)))=0A+=0A+=20=20=20=20;;=20= Ignore=20unhandled=20and=20invalid=20OSC=20sequences=0A+=20=20=20=20= (setq=20captured=20nil)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]3;unhandled\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2missing=20semicolon\aest")))=0A+=20=20=20=20(should-not=20= captured)=0A+=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 40=201=20"t\e]2;not=20ended\003est")))=0A+=20=20=20=20(should-not=20= captured)))=0A+=0A+(ert-deftest=20term-call-ansi-osc-handlers=20()=0A+=20= =20(let*=20((captured=20nil)=0A+=20=20=20=20=20=20=20=20=20(osc-handler=20= (lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(push=20(list=20'osc=20code=20text)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(term-handler=20(lambda=20= (code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(push=20(list=20'term=20code=20text)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(ansi-osc-handlers=20`(("1"=20= .=20,osc-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20("2"=20.=20,osc-handler)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20("3"=20.=20,osc-handler)))=0A+=20=20=20=20=20=20=20=20=20= (term-osc-handlers=20`(("2"=20.=20,term-handler)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("3"=20.=20nil))))=0A+=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A= +=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=2040=201=20(concat=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20"te"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20"\e]1;a\a"=20;;=20sent=20to=20osc-handler=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20"\e]2;b\a"=20;;=20sent=20to=20term-handler=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20"\e]3;c\a"=20;;=20ignored;=20disabled=20= in=20term=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20"\e]4;d\a"=20;;=20= ignored;=20not=20registered=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= "st"))))=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A+=20=20=20=20=20= =20'((osc=20"1"=20"a")=0A+=20=20=20=20=20=20=20=20(term=20"2"=20"b"))=0A= +=20=20=20=20=20=20(nreverse=20captured)))))=0A+=0A=20(provide=20= 'term-tests)=0A=20=0A=20;;;=20term-tests.el=20ends=20here=0A--=20=0A= 2.47.2=0A=0A= --Apple-Mail=_60407CBB-3A70-446F-AE7F-57BFA708E74A Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii
--Apple-Mail=_60407CBB-3A70-446F-AE7F-57BFA708E74A-- --Apple-Mail=_CB22D33C-43C5-41D8-AEFA-E41F00083C03-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 03 Jun 2025 11:10:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: per@bothner.com, jared@finder.org, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174894898324448 (code B ref 78263); Tue, 03 Jun 2025 11:10:04 +0000 Received: (at 78263) by debbugs.gnu.org; 3 Jun 2025 11:09:43 +0000 Received: from localhost ([127.0.0.1]:60864 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uMPWY-0006MA-5O for submit@debbugs.gnu.org; Tue, 03 Jun 2025 07:09:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53546) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uMPWW-0006LW-0V for 78263@debbugs.gnu.org; Tue, 03 Jun 2025 07:09:40 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uMPWP-0003Mj-MP; Tue, 03 Jun 2025 07:09:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=ZK8AtINupjiP93T2qfeV05t3nW18vA4U08VPFHZKn9k=; b=XTt9F6BY7cRFbIQdtQ+d +U+q3/mkh5qcWTnB9RNGpRiDyOgcSUjCFEbEi/yDNthz+iUE8mSsmTYkGYRoIsygJnVc6XM2hWtij SM7VGQsVB+fDjR2LPLzErCJyNklMQO2wPaAyCEXhDu5WIVt9yNWHbPthnwHouiNy4yh0NiV+LrkgH Elekxxj0KC0DGwfgCNOk9BrY1tmgVjaD2spel3qqukkveTTFwQP6WsN5g8EanYns3HOIHGZNsrQP0 sxWxGttqaPwxcRCBPwURuzMRaD9bHiy/DXjB0eyrLDOcmyYVIFjdBjnFOKCnOjIrT/TYTeW4RHTto oJmz0mTyB6x41A==; Date: Tue, 03 Jun 2025 14:09:17 +0300 Message-Id: <86y0u9nkte.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: (message from =?UTF-8?Q?St=C3=A9phane?= Zermatten on Mon, 2 Jun 2025 20:01:32 +0300) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) > From: Stéphane Zermatten > Date: Mon, 2 Jun 2025 20:01:32 +0300 > Cc: Eli Zaretskii , > Per Bothner , > 78263@debbugs.gnu.org > > I updated the change, see the new version attached. I have a few minor comments below. > No news from the copyright assignment front yet. It will take around two weeks. > Handlers can be registered to term-osc-handler, which by defaults, > supports OSC 0, 2, 7 and 8, using handlers defined in ansi-osc. Unknown > OSC sequences are properly ignored. > > * lisp/term.el: > (term-emulate-terminal): handle OSC sequences > term-osc-handler: new custom option > term-control-seq-regexp: extended regexp > term--osc-max-byte: new private constant > * lisp/ansi-osc.el: > ansi-osc-handler: handle OSC 0 (like OSC 2) Please reformat the log message according to our conventions: function and variable names in parentheses, 2 spaces between sentences, etc. For the details see CONTRIBUTE and also consult the many examples of log messages in Git. > +(defcustom term-osc-handlers nil > + "Terminal-specific OSC sequence handler function alist. > + > +OSC (Operating System Command) is a category of ANSI escape sequence > +used in terminal application to introduce custom commands. Terminals > +ignore unknown OSC sequences by default. Handlers can be registered here > +to add support for new OSC sequences to `term'. Two spaces between sentences, here and elsewhere. > +Functions in this alist are passed matching valid OSC sequences as > +they're sent to the terminal. > + > +Valid OSC sequences are of the form > + ESC ] code ; text BEL > + ESC ] code ; text ESC \ > + > +Each entry has the form (CODE . FUNCTION), where CODE is the string that > +appears before the semicolon. > + > +FUNCTION is called with two arguments CODE and TEXT with the term buffer > +active and its point and state active at the time the OSC sequence > +appeared in the stream. This should clarify what is TEXT in this context. Thanks. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 04 Jun 2025 18:06:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: Per Bothner , Jared Finder , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174906032124320 (code B ref 78263); Wed, 04 Jun 2025 18:06:01 +0000 Received: (at 78263) by debbugs.gnu.org; 4 Jun 2025 18:05:21 +0000 Received: from localhost ([127.0.0.1]:52142 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uMsUK-0006KB-Ua for submit@debbugs.gnu.org; Wed, 04 Jun 2025 14:05:21 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]:59562) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uMsUI-0006J9-Cb for 78263@debbugs.gnu.org; Wed, 04 Jun 2025 14:05:19 -0400 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-451ebd3d149so429205e9.2 for <78263@debbugs.gnu.org>; Wed, 04 Jun 2025 11:05:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749060312; x=1749665112; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=4TmibyEudIpjhW8lZvBUxZrAy5JAeVLcQ1qVD1aEH8c=; b=hbeTWqm3jLJLKq0z0cPX/K62VnnSC0NyJEitR/2wEE469bSYYIBhd9kOwReO3D9ikW 20j55AFfDIA8M4MNEFwR+3Fl2qTYriOCHzNsCs/8s3DQGokJz0Jb4HBz/E0zbTLliXNu jS37FEQcQMyJUqdxej455D8G8b1W8cop4FLqkn1YX1NjLHCEZOiWod7yd96aRSRXAXGq Ge/M+E7TMDMc/4WbPsmGtpMqS1fRXiM7t+o5coFDwzGmYzpjAuARIKhC6AFOPPRgLioJ R4GrBmVMz/KTnpuRjqpyrfq0UssVDz8EjvUfbei6adqRQnC45otWarNHJNLzkVwhj/Ln 1hZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749060312; x=1749665112; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4TmibyEudIpjhW8lZvBUxZrAy5JAeVLcQ1qVD1aEH8c=; b=WeNqMqEIiG6nToWGui7CxDYYYxdiBNJNK+8CDYdQGlCFvN9/LtmxYZ6TDs8QfwlVFV VO5I1Zvy26sdQA87M225wS0T9DLSX1pCLwSExM/wA0mnFh/mX9WV5aeF7rugZMBx3jL8 ZoymTiGGpfYb1IPG7LdTOLEtKUSxl54gf4FR4DnnT2EpUgbTDZCFHwSjl+vWAE8Z5lOa BLUtJyZA98Ma6m8AmzaswnOoYZNy+Kg6LBx7o9yQ0ApjYl1HcoU9uHv4mYI4epl9KQwt JYtX7fftBqWQIr3zAehoYei2D2p5PXsJXgNu2GHDOaFUFlG9hXJFNXt4wOGCHGNhHMr6 RyqA== X-Forwarded-Encrypted: i=1; AJvYcCV1DBuToUI6YjUiyCQx5BI/SFVnopYtUdZqPGq5z9hHtePIB60TfeQlW/q3Rz1kBEKyb6Ab+g==@debbugs.gnu.org X-Gm-Message-State: AOJu0Yz2uCuL8sW43CSkaWh9nf2VjmOAyrxzHQ0hjrj38ehYRLNE2tjx jkS6m7PdwYQE4E0FCGt8jOuuRHzcZ4qrJ1ZrPkIyBGEPHaBx20mq91g/ X-Gm-Gg: ASbGnctrLY+x5lieWblkfv5fLFnK8FD7RsxTjfKwRvdpm4JZqKrExzp1yh1iKJ7OftE 2RtQnR3WU/fQUmYEpvWqnVewlCTKeRHde8VD3T2gZAmqRevGmFGeDnV9pQhSSwnfy+DvNyEg3xW cvLiIAEzG2dTdjQ8OSaI/z0h+F47jw/3eBH93y37XJbIEzI2D6msumFBSd52/bdTHq2Rb2KpV8X h0jwCzzC//0XsLtpqPQB+fRkGgv0QdHzYHc90b1IDX1Z6Nl4kEAGk3NY9Hd9ADgdHba3LEtIxbv C18wPF7rrAhWaidXlxAyCWvSM+WEreSsVsWJqWXzGscQAjg2R8mC3SQQPdLHaxoIURwh3LE2ESz NHbQYoDcbq/Iz X-Google-Smtp-Source: AGHT+IGv0dndyuMjtUiS8vAFRN7uu+VZLg6zy8ntDcSPpZmGWWzH3O6laDmndYWisT5W1taM+zroHQ== X-Received: by 2002:a05:6000:1a8d:b0:3a4:d02e:84af with SMTP id ffacd0b85a97d-3a51d985091mr3020635f8f.58.1749060311799; Wed, 04 Jun 2025 11:05:11 -0700 (PDT) Received: from smtpclient.apple ([62.74.15.144]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-450d8000e9asm207816345e9.21.2025.06.04.11.05.10 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Jun 2025 11:05:11 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_4BE2708A-B847-4C9A-99CD-71702ED69721" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.4\)) Date: Wed, 4 Jun 2025 21:04:58 +0300 In-Reply-To: <86y0u9nkte.fsf@gnu.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51.11.4) 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 (-) --Apple-Mail=_4BE2708A-B847-4C9A-99CD-71702ED69721 Content-Disposition: attachment; filename=0001-Handle-OSC-sequences-in-term-bug-78263.patch Content-Type: application/octet-stream; x-unix-mode=0700; name="0001-Handle-OSC-sequences-in-term-bug-78263.patch" Content-Transfer-Encoding: quoted-printable =46rom=201937ae46c92c926bfa8feb64036e6550dd06eb9e=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Wed,=204=20Jun=202025=2021:00:42=20+0300=0ASubject:=20[PATCH]=20= Handle=20OSC=20sequences=20in=20term=20(bug#78263)=0A=0AHandlers=20can=20= be=20registered=20to=20term-osc-handler,=20which=20by=20defaults,=0A= supports=20OSC=200,=202,=207=20and=208,=20using=20handlers=20defined=20= in=20ansi-osc.=20=20Unknown=0AOSC=20sequences=20are=20ignored.=0A=0A*=20= lisp/term.el=20(term-emulate-terminal):=20Handle=20OSC=20sequences.=0A= (term-osc-handler):=20New=20custom=20option.=0A= (term-control-seq-regexp):=20Extended=20regexp.=0A(term--osc-max-byte):=20= New=20private=20constant.=0A*=20lisp/ansi-osc.el=20(ansi-osc-handler):=20= Handle=20OSC=200=20like=20OSC=202.=0A*=20test/lisp/term-tests.el=20= (term-ignore-osc,=20term-handle-osc)=0A(term-call-ansi-osc-handlers):=20= New=20tests=0A---=0A=20lisp/ansi-osc.el=20=20=20=20=20=20=20=20|=20=20=20= 3=20+-=0A=20lisp/term.el=20=20=20=20=20=20=20=20=20=20=20=20|=20=2062=20= +++++++++++++++++++++=0A=20test/lisp/term-tests.el=20|=20117=20= ++++++++++++++++++++++++++++++++++++++++=0A=203=20files=20changed,=20181=20= insertions(+),=201=20deletion(-)=0A=0Adiff=20--git=20a/lisp/ansi-osc.el=20= b/lisp/ansi-osc.el=0Aindex=2006359779823..83fcd0d184a=20100644=0A---=20= a/lisp/ansi-osc.el=0A+++=20b/lisp/ansi-osc.el=0A@@=20-62,7=20+62,8=20@@=20= ansi-osc-filter-region=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (delete-region=20pos0=20(point))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20ansi-osc--marker=20(copy-marker=20pos0))))))))=0A=20=0A= -(defvar-local=20ansi-osc-handlers=20'(("2"=20.=20= ansi-osc-window-title-handler)=0A+(defvar-local=20ansi-osc-handlers=20= '(("0"=20.=20ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("2"=20.=20ansi-osc-window-title-handler)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("7"=20.=20ansi-osc-directory-tracker)=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("8"=20.=20ansi-osc-hyperlink-handler))=0A=20=20=20"Alist=20of=20= handlers=20for=20OSC=20escape=20sequences.=0Adiff=20--git=20= a/lisp/term.el=20b/lisp/term.el=0Aindex=20a971300c055..3513d1bb485=20= 100644=0A---=20a/lisp/term.el=0A+++=20b/lisp/term.el=0A@@=20-304,6=20= +304,7=20@@=20term-protocol-version=0A=20=20=20(require=20'cl-lib))=0A=20= (require=20'comint)=20;=20Password=20regexp.=0A=20(require=20= 'ansi-color)=0A+(require=20'ansi-osc)=0A=20(require=20'ehelp)=0A=20= (require=20'ring)=0A=20(require=20'shell)=0A@@=20-603,6=20+604,36=20@@=20= term-exec-hook=0A=20=20=20:type=20'hook=0A=20=20=20:group=20'term)=0A=20=0A= +(defcustom=20term-osc-handlers=20nil=0A+=20=20"Terminal-specific=20OSC=20= sequence=20handler=20function=20alist.=0A+=0A+OSC=20(Operating=20System=20= Command)=20is=20a=20category=20of=20ANSI=20escape=20sequence=0A+used=20= in=20terminal=20application=20to=20introduce=20custom=20commands.=20= Terminals=0A+ignore=20unknown=20OSC=20sequences=20by=20default.=20=20= Handlers=20can=20be=20registered=20here=0A+to=20add=20support=20for=20= new=20OSC=20sequences=20to=20`term'.=0A+=0A+Functions=20in=20this=20= alist=20are=20passed=20matching=20valid=20OSC=20sequences=20as=0A= +they're=20sent=20to=20the=20terminal.=0A+=0A+Valid=20OSC=20sequences=20= are=20of=20the=20form=0A+=20=20ESC=20]=20code=20;=20text=20BEL=0A+=20=20= ESC=20]=20code=20;=20text=20ESC=20\=0A+=0A+Each=20entry=20has=20the=20= form=20(CODE=20.=20FUNCTION),=20where=20CODE=20is=20the=20string=20that=0A= +appears=20before=20the=20semicolon.=0A+=0A+FUNCTION=20is=20called=20= with=20two=20arguments=20CODE=20and=20TEXT,=20with=20TEXT=20being=20the=0A= +content=20of=20the=20OSC=20sequence=20after=20the=20semicolon.=20=20= When=20the=20function=20is=0A+called,=20the=20term=20buffer=20is=20= active=20and=20with=20point=20and=20content=20valid=20at=0A+the=20time=20= the=20OSC=20sequence=20appears=20in=20the=20stream.=0A+=0A+Any=20code=20= not=20on=20this=20alist=20is=20further=20looked=20up=20in=20= `ansi-osc-handlers',=0A+which=20collects=20OSC=20handlers=20that=20can=20= also=20work=20outside=20of=20a=20terminal=0A+context.=20=20For=20= details,=20see=20`ansi-osc-apply-on-region'."=0A+=20=20:type=20'(alist=20= :key-type=20string=20:value-type=20function)=0A+=20=20:group=20'term=0A+=20= =20:version=20"31.1")=0A+=0A=20(defvar=20term-mode-map=0A=20=20=20(let=20= ((map=20(make-sparse-keymap)))=0A=20=20=20=20=20(define-key=20map=20= "\ep"=20'term-previous-input)=0A@@=20-3030,6=20+3061,10=20@@=20= term-control-seq-regexp=0A=20=20=20=20"\e\\(?:[DM78c]\\|"=0A=20=20=20=20= ;;=20another=20Emacs=20specific=20control=20sequence,=0A=20=20=20=20= "AnSiT[^\n]+\n\\|"=0A+=20=20=20;;=20OSC=20(see=20[ECMA-48]=20section=20= 8.3.89=20"Operation=20System=20Command")=20The=0A+=20=20=20;;=20spec=20= only=20allows=200x08-0x0d=200x20-7e,=20but=20this=20regexp=20also=20= allows=0A+=20=20=20;;=20non-ascii=20(UTF-8)=20characters.=0A+=20=20=20= "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|"=0A=20=20=20=20;;=20= or=20an=20escape=20sequence=20(section=205.4=20"Control=20Sequences"),=0A= =20=20=20=20"\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)")=0A=20=20= =20"Regexp=20matching=20control=20sequences=20handled=20by=20term.el.")=0A= @@=20-3232,6=20+3267,33=20@@=20term-emulate-terminal=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (split-string=20ctl-params=20";"))=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(aref=20str=20(1-=20= ctl-end))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20private))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(?\]=20;;=20An=20OSC=20sequence=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((seq-str=20= (substring=20str=20(+=20i=202)=20ctl-end)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(string-match=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "\\`\\(\\([0-9A-Za-z]+\\);\\)?.*?\\(\a\\|\e\\\\\\)?\\'"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20seq-str)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((code=20(match-string=202=20seq-str))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (text-start=20(match-end=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(end-mark=20= (match-beginning=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20(and=20code=20end-mark)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (when-let*=20((func=20(cdr=20(or=20(assoc-string=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= code=20term-osc-handlers)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(assoc-string=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20code=20ansi-osc-handlers)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (with-demoted-errors=20"term=20OSC=20error:=20%S"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (funcall=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20func=20code=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (decode-coding-string=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(substring=20= seq-str=20text-start=20end-mark)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= locale-coding-system=20t)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(when=20(and=20(not=20end-mark)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(>=3D=20ctl-end=20str-length)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(<=20(-=20ctl-end=20i)=20= term--osc-max-bytes))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20Continue=20ignoring=20until=20= the=20end=20marker.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20term-terminal-undecoded-bytes=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(substring=20str=20i)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Consume=20= everything=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(setq=20i=20ctl-end))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(?D=20;;=20Scroll=20forward=20(apparently=20not=20= documented=20in=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20[ECMA-48],=20[ctlseqs]=20mentions=20it=20as=20C1=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= character=20"Index"=20though).=0Adiff=20--git=20= a/test/lisp/term-tests.el=20b/test/lisp/term-tests.el=0Aindex=20= ffb341f3b52..e6ea42631fd=20100644=0A---=20a/test/lisp/term-tests.el=0A= +++=20b/test/lisp/term-tests.el=0A@@=20-419,6=20+419,123=20@@=20= term-undecodable-input=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20bytes)))))=0A=20=0A= +(ert-deftest=20term-ignore-osc=20()=0A+=20=20;;=20BEL-terminated=20OSC=20= sequence=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20"te\e]0;window=20= title\ast")))=0A+=20=20;;=20ESC=20\-terminated=20OSC=20sequence=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;window=20title\e\\st")))=0A+=20=20;;=20= Long=20OSC=20sequence=20split=20into=20multiple=20chunks=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20'("te\e]0;win"=20"dow=20"=20"=20= title\ast"))))=0A+=20=20;;=20OSC=20sequence=20that=20start=20and=20ends=20= with=20the=20chunk=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20'("te"=20= "\e]0;window=20"=20"title\a"=20"st"))))=0A+=0A+=20=20;;=20Invalid=20= control=20characters=20break=20out=20of=20the=20OSC=20sequence,=20for=0A= +=20=20;;=20safety.=0A+=20=20(should=20(equal=20"tetitlest"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= '("te\e]0;window\x05title\ast"))))=0A+=0A+=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20;;=20An=20OSC=20= sequence=20with=20multibyte=20UTF-8=20characters.=20=20This=20is=20not=0A= +=20=20=20=20;;=20exactly=20standard-compliant,=20but=20too=20common=20= not=20to=20support.=0A+=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;\xce\xb1\xce\xb2\e\\st")))))=0A+=0A= +(ert-deftest=20term-handle-osc=20()=0A+=20=20(let*=20((captured=20nil)=0A= +=20=20=20=20=20=20=20=20=20(handler=20(lambda=20(code=20text)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20code=20= text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20captured)))=0A+=20=20=20=20=20=20=20=20=20(term-osc-handlers=20= `(("2"=20.=20,handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20,handler))))=0A+=0A= +=20=20=20=20;;=20Send=20OSC=20sequences=20to=20handler=0A+=20=20=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=2040=201=20"te\e]2;foo\as\e]1994;bar\at")))=0A= +=20=20=20=20(should=20(equal=20'(("2"=20.=20"foo")=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"bar"))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20= captured)))=0A+=0A+=20=20=20=20;;=20OSC=20sequences=20and=20code=20can=20= be=20chunked=0A+=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=2040=201=20`("te\e]2;chunked=20fo"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "o\as\e]19"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20"94;chunked=20ba"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"r\at"))))=0A+=20=20=20=20= (should=20(equal=20'(("2"=20.=20"chunked=20foo")=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"chunked=20= bar"))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (nreverse=20captured)))=0A+=0A+=20=20=20=20;;=20OSC=20sequences=20can=20= contain=20multibyte=20characters=0A+=20=20=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20=20=20(setq=20= captured=20nil)=0A+=20=20=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=2040=201=20"te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A+=20= =20=20=20=20=20(should=20(equal=20'(("2"=20.=20"=CE=B1=CE=B2"))=20= captured)))=0A+=0A+=20=20=20=20;;=20Ignore=20unhandled=20and=20invalid=20= OSC=20sequences=0A+=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20= (should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20"test"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20"t\e]3;unhandled\aest")))=0A+=20= =20=20=20(should-not=20captured)=0A+=20=20=20=20(should=20(equal=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=2040=201=20"t\e]2missing=20semicolon\aest")))=0A+=20=20=20=20= (should-not=20captured)=0A+=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =2040=201=20"t\e]2;not=20ended\003est")))=0A+=20=20=20=20(should-not=20= captured)))=0A+=0A+(ert-deftest=20term-call-ansi-osc-handlers=20()=0A+=20= =20(let*=20((captured=20nil)=0A+=20=20=20=20=20=20=20=20=20(osc-handler=20= (lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(push=20(list=20'osc=20code=20text)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(term-handler=20(lambda=20= (code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(push=20(list=20'term=20code=20text)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(ansi-osc-handlers=20`(("1"=20= .=20,osc-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20("2"=20.=20,osc-handler)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20("3"=20.=20,osc-handler)))=0A+=20=20=20=20=20=20=20=20=20= (term-osc-handlers=20`(("2"=20.=20,term-handler)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("3"=20.=20nil))))=0A+=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A= +=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=2040=201=20(concat=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20"te"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20"\e]1;a\a"=20;;=20sent=20to=20osc-handler=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20"\e]2;b\a"=20;;=20sent=20to=20term-handler=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20"\e]3;c\a"=20;;=20ignored;=20disabled=20= in=20term=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20"\e]4;d\a"=20;;=20= ignored;=20not=20registered=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= "st"))))=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A+=20=20=20=20=20= =20'((osc=20"1"=20"a")=0A+=20=20=20=20=20=20=20=20(term=20"2"=20"b"))=0A= +=20=20=20=20=20=20(nreverse=20captured)))))=0A+=0A=20(provide=20= 'term-tests)=0A=20=0A=20;;;=20term-tests.el=20ends=20here=0A--=20=0A= 2.47.2=0A=0A= --Apple-Mail=_4BE2708A-B847-4C9A-99CD-71702ED69721 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On 3 Jun 2025, at 14:09, Eli Zaretskii wrote: >=20 >> From: St=C3=A9phane Zermatten >> Date: Mon, 2 Jun 2025 20:01:32 +0300 >> Cc: Eli Zaretskii , >> Per Bothner , >> 78263@debbugs.gnu.org >>=20 >> I updated the change, see the new version attached. >=20 > I have a few minor comments below. >=20 >> No news from the copyright assignment front yet. >=20 > It will take around two weeks. >=20 >> Handlers can be registered to term-osc-handler, which by defaults, >> supports OSC 0, 2, 7 and 8, using handlers defined in ansi-osc. = Unknown >> OSC sequences are properly ignored. >>=20 >> * lisp/term.el: >> (term-emulate-terminal): handle OSC sequences >> term-osc-handler: new custom option >> term-control-seq-regexp: extended regexp >> term--osc-max-byte: new private constant >> * lisp/ansi-osc.el: >> ansi-osc-handler: handle OSC 0 (like OSC 2) >=20 > Please reformat the log message according to our conventions: function > and variable names in parentheses, 2 spaces between sentences, etc. > For the details see CONTRIBUTE and also consult the many examples of > log messages in Git. Done (Correctly, this time, hopefully) >=20 >> +(defcustom term-osc-handlers nil >> + "Terminal-specific OSC sequence handler function alist. >> + >> +OSC (Operating System Command) is a category of ANSI escape sequence >> +used in terminal application to introduce custom commands. Terminals >> +ignore unknown OSC sequences by default. Handlers can be registered = here >> +to add support for new OSC sequences to `term'. >=20 > Two spaces between sentences, here and elsewhere. Done=20 >=20 >> +Functions in this alist are passed matching valid OSC sequences as >> +they're sent to the terminal. >> + >> +Valid OSC sequences are of the form >> + ESC ] code ; text BEL >> + ESC ] code ; text ESC \ >> + >> +Each entry has the form (CODE . FUNCTION), where CODE is the string = that >> +appears before the semicolon. >> + >> +FUNCTION is called with two arguments CODE and TEXT with the term = buffer >> +active and its point and state active at the time the OSC sequence >> +appeared in the stream. >=20 > This should clarify what is TEXT in this context. A rephrased it a bit. Hopefully it is clearer. >=20 > Thanks. --Apple-Mail=_4BE2708A-B847-4C9A-99CD-71702ED69721-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 Jun 2025 05:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: per@bothner.com, jared@finder.org, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174910137823826 (code B ref 78263); Thu, 05 Jun 2025 05:30:01 +0000 Received: (at 78263) by debbugs.gnu.org; 5 Jun 2025 05:29:38 +0000 Received: from localhost ([127.0.0.1]:57268 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uN3AY-0006CE-5b for submit@debbugs.gnu.org; Thu, 05 Jun 2025 01:29:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54062) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uN3AV-0006Bo-3h for 78263@debbugs.gnu.org; Thu, 05 Jun 2025 01:29:35 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uN3AO-0007db-Ai; Thu, 05 Jun 2025 01:29:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=ndrbkd1X/AZwF6V9e8n1KOuuCAZQeMmnvJ8OOLW1x/A=; b=XP57E5NpBqSUseO+1/bR w3FVR58xDQZa4z719ZccFDXl7175g+1A2dDvGF28B9kkh8Bx08FJ0sX1XZ8qRa6hQDqtLtdb5ayoE G5Tcv4YBQMUqz0HWHj1evqI7zxWfRzLEUsKedcNSZCdz5uVjca8geqdFWp8u76Px7/gbaVSk+82QY EGEHpiZOuarnBNMCdUxQFvprGUh1pfyPj8//sxyoD1vZPlvXUH5ShuBDXe22KIzA+r45dN9/Pjlyx VbXtYUMhXj5jlkyQ5xjE3W3u+JaMRgtvHnkAcM+iGbo5mGGgc081HomvYbVVR+MjX2QrwGCMCe6Y7 e4lXEDfAZfkeAw==; Date: Thu, 05 Jun 2025 08:29:25 +0300 Message-Id: <86wm9qn4cq.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> (message from =?UTF-8?Q?St=C3=A9phane?= Zermatten on Wed, 4 Jun 2025 21:04:58 +0300) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) > From: Stéphane Zermatten > Date: Wed, 4 Jun 2025 21:04:58 +0300 > Cc: Jared Finder , > Per Bothner , > 78263@debbugs.gnu.org > > > Please reformat the log message according to our conventions: function > > and variable names in parentheses, 2 spaces between sentences, etc. > > For the details see CONTRIBUTE and also consult the many examples of > > log messages in Git. > > Done (Correctly, this time, hopefully) Yes, thanks. > >> +(defcustom term-osc-handlers nil > >> + "Terminal-specific OSC sequence handler function alist. > >> + > >> +OSC (Operating System Command) is a category of ANSI escape sequence > >> +used in terminal application to introduce custom commands. Terminals > >> +ignore unknown OSC sequences by default. Handlers can be registered here > >> +to add support for new OSC sequences to `term'. > > > > Two spaces between sentences, here and elsewhere. > > Done Not in all the cases. Here's one: > +(defcustom term-osc-handlers nil > + "Terminal-specific OSC sequence handler function alist. > + > +OSC (Operating System Command) is a category of ANSI escape sequence > +used in terminal application to introduce custom commands. Terminals ^^ Here's another: > + ;; OSC (see [ECMA-48] section 8.3.89 "Operation System Command") The ^^^ Here, a period is missing as well. > >> +FUNCTION is called with two arguments CODE and TEXT with the term buffer > >> +active and its point and state active at the time the OSC sequence > >> +appeared in the stream. > > > > This should clarify what is TEXT in this context. > > A rephrased it a bit. Hopefully it is clearer. It is, thanks. Please fix those nits, and then we should wait for your copyright-assignment paperwork to be completed, and for Jared to respond to your previous message. From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Jared Finder Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 Jun 2025 05:45:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: Eli Zaretskii , Per Bothner , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174910226529853 (code B ref 78263); Thu, 05 Jun 2025 05:45:02 +0000 Received: (at 78263) by debbugs.gnu.org; 5 Jun 2025 05:44:25 +0000 Received: from localhost ([127.0.0.1]:57383 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uN3Oq-0007lR-TW for submit@debbugs.gnu.org; Thu, 05 Jun 2025 01:44:25 -0400 Received: from greenhill.hpalace.com ([192.155.80.58]:42858) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uN3On-0007ko-Qw for 78263@debbugs.gnu.org; Thu, 05 Jun 2025 01:44:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=finder.org; s=2018; t=1749102260; bh=EbawGExhOP2rF+cDq4RpnrvIcWjxvHHGl5Lt9ZddsvQ=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=CD2QOXvsj4RZdhKkuVZyfDCVFZ7u7VxGL+tMVCbNXOkpIEXEhuTyp1k3MiHMb9/Rq dTFn2f8cnl54NkL/sov1k8iy0PuS+m5XmeCNDbgy88LrB+WNR3AvhAUyCNvz35FMMO yqstPN9UAO2yKx+afr5yQ9b0kJDfNQ06Eyg1fvkAA1GP7a2R9HoYkPqcRxCteVznMa 45C3XDj8WXNdA41aAAfQ9jc3V1/OkH1N/C82DczaWHMViQ4NgCtwvduywrxDD/kHU7 gDAGCxMtjBNaBcaFB4HKC74kBC/nmAh0Yocw3sR36wW1gN4WHup8RDWRerkJsD/ber 151SxYC/L0kHQ== Received: from mail.finder.org (unknown [192.155.80.58]) by greenhill.hpalace.com (Postfix) with ESMTPSA id 9DB684B3; Thu, 5 Jun 2025 05:44:20 +0000 (UTC) MIME-Version: 1.0 Date: Wed, 04 Jun 2025 22:44:20 -0700 From: Jared Finder In-Reply-To: <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> Message-ID: X-Sender: jared@finder.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 (-) On 2025-06-04 11:04, Stéphane Zermatten wrote: >> On 3 Jun 2025, at 14:09, Eli Zaretskii wrote: >> >>> From: Stéphane Zermatten >>> Date: Mon, 2 Jun 2025 20:01:32 +0300 >>> Cc: Eli Zaretskii , >>> Per Bothner , >>> 78263@debbugs.gnu.org >>> >>> I updated the change, see the new version attached. One additional comment -- why is term-osc-handlers a defcustom at all? It seems to me like a variable that is used just to implement the OSC handlers and not something I'd expect users to customize. Looking at ansi-osc-handlers, it's just a defvar. I can't think of a case where I would expect a user to add or remove a custom handler. I do think users may want to enable or disable certain features, but that would affect multiple handlers like if a user wanted to not allow changing dynamic colors (OSC 10 to 19). That seems better served with separate defcustom variables for each feature, like a term-allow-color-ops defcustom. I'm otherwise ok with the patch. -- MJF From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Jared Finder Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 Jun 2025 05:50:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: =?UTF-8?Q?St=C3=A9phane?= Zermatten , per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174910255131301 (code B ref 78263); Thu, 05 Jun 2025 05:50:01 +0000 Received: (at 78263) by debbugs.gnu.org; 5 Jun 2025 05:49:11 +0000 Received: from localhost ([127.0.0.1]:57425 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uN3TS-00088n-UX for submit@debbugs.gnu.org; Thu, 05 Jun 2025 01:49:11 -0400 Received: from greenhill.hpalace.com ([192.155.80.58]:45042) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uN3TQ-00088Z-J6 for 78263@debbugs.gnu.org; Thu, 05 Jun 2025 01:49:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=finder.org; s=2018; t=1749102547; bh=oNgSxz7RyGwBSUkgYUcuiNpOIbJ4xhO8h4Uk4Hopjk4=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=trNBqrmudFDybyqtu8H3doBlZcZj1cL7q8vV/IvUTV4FaVFW7VykEeuz/6hxQlnPO mBUifB9AGTHH3jZqSO8JsZv/35N/93tJz9KwsLEys6eVxDUVVotMRhvVMwQ5o5HJ9q Wmjt7IexaUmdh2rhsyfxcObseNlJ1IrscdrTbOU7NcZwxSXbnR3Y2+ZdO2hCXNx6rh cWjP6rAXRAZijI+gtH+VCO8XJqw82P9ZpMU8rNgqwy+87C5Qg/LT0hlAfgDxFcc3Vt c0zaKPXMDTqzi+W+XiOv576LJbWF8J5IShOY9H373NaPNWX8rVo2lmnKef98mWny1C +xgDARa6OhFAg== Received: from mail.finder.org (unknown [192.155.80.58]) by greenhill.hpalace.com (Postfix) with ESMTPSA id BCFFF4B3; Thu, 5 Jun 2025 05:49:07 +0000 (UTC) MIME-Version: 1.0 Date: Wed, 04 Jun 2025 22:49:07 -0700 From: Jared Finder In-Reply-To: <86wm9qn4cq.fsf@gnu.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> Message-ID: X-Sender: jared@finder.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 (-) On 2025-06-04 22:29, Eli Zaretskii wrote: > Please fix those nits, and then we should wait for your > copyright-assignment paperwork to be completed, and for Jared to > respond to your previous message. I think Stéphane's latest patch addressed my question about using ansi-osc-handlers in term. I saw this new code in it: + (when-let* ((func (cdr (or (assoc-string + code term-osc-handlers) + (assoc-string + code ansi-osc-handlers))))) Which looks right to me. When we want to have different handlers for term vs *compilation* buffers, we can just add a different handler to each variable. -- MJF From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 06 Jun 2025 08:29:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Jared Finder Cc: Eli Zaretskii , Per Bothner , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174919853713047 (code B ref 78263); Fri, 06 Jun 2025 08:29:01 +0000 Received: (at 78263) by debbugs.gnu.org; 6 Jun 2025 08:28:57 +0000 Received: from localhost ([127.0.0.1]:41623 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uNSRd-0003OK-Cy for submit@debbugs.gnu.org; Fri, 06 Jun 2025 04:28:57 -0400 Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]:57526) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uNSRZ-0003Nz-Vo for 78263@debbugs.gnu.org; Fri, 06 Jun 2025 04:28:55 -0400 Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-3a4ef2c2ef3so1530912f8f.2 for <78263@debbugs.gnu.org>; Fri, 06 Jun 2025 01:28:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749198527; x=1749803327; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=plyMq5oLBbC8emAZr7HRhV7w3X/XPs/BNhCBNzQaAq8=; b=APFwJSTbhUavGKCBXq8NAeqYagUzkVEW79DJlPtouMca2ZvKXOQcrpYBvY+UH54C9j jFzbzKfMvt1zreN2MLTQFrreLoFGEPCoRsI3CSi+OjeYlVid9sTVZvNVVZAodm0YzNSh P6s3Ua//lmlhKXVVhQX3jXtorOBImUVUm0H4kuU3BlbTaZI2qw8NubHzk3FPwa/KP3Z4 kYB+ncWPDNitMuaZqHvrD4iKeheHDnI263bd6GoqLu9F197ceqksU/j2FZ3/9d4EAOgI bJ0a79IvxlwL5idjw6lv2QYD+c/Yt1Y8lU3ulkRMtXpvA2e4xq0Q/kBlcidAUCvhPFsv 03ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749198527; x=1749803327; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=plyMq5oLBbC8emAZr7HRhV7w3X/XPs/BNhCBNzQaAq8=; b=IcC3VxmqvFklC1du7upCuBrBOowjJuoeU9voImJUCunof/6weZ8NEbarrUpembLkP+ S66M3LeDyCtfZS7zg+7reO1OYhRne6buledQ0ekum8uSD8YV8VqZtTk3WoRHojvNTytn v4D8jOvcNTtAUQzJ7ydepxsYkTusWrLV3SJsLI5fJoLujXnOJxXiTy0RUuqUeeM+eGqL +ybqpxPWmbd69d14c/+r1jzxsA4VEW9fhVs9ias5qsrSB+8gE1bUJvYADhjAPxEvzetA tzyXxn8Oy18H4hfxDkO9UixYHqulKuGlUycoKxcrWDwZMPhhy6iTpP5v/+k95ALYSCud 3Zzw== X-Forwarded-Encrypted: i=1; AJvYcCXwwjhNtR42ErxsOjXiavQSulRCBBqSnLxSdf5mwmxR2/HJp1G8V5EoADHcsB4W9/9XNiJU4g==@debbugs.gnu.org X-Gm-Message-State: AOJu0YxlVtEerURhvQO72BKmA4nLOuOtmch1yOVrhl/KBNOqJP9MVdES dexDN1VUtahFGLLnSauAMkiU0ckuRxVn1fM1e1nI6QM0bK0fI2xzduFw X-Gm-Gg: ASbGncuxXPYx/5f7Mlf94wFqUlx8UCbP/TF7gPPJZIBobaq6t0wV8f96lUGEiAn18xP 4ykf0rwDbSS90IMoMmgdFYHSqUo1brvBqLBaihOlaw17ujWNJuAKw0F9MprwYDVnGDSPBmPi52L KTaFJIwqIBjSo/vf4br2WmR09n87LzsmFZ0lA/A9QSOlfxuvYLBrujEoh8peYtcMCep3xodT2wQ tet/CWrJqcMnzcNMFHFBhIhvATDIp5P9bI+Zhm7U+ZcPqKwVacEnoB4YE91VxeQEqArHeaWYOop +DaszFexV20o47a/f9OpLUav66dGS8AA/7Gy8d88EFMi+PxIu0ciYgbGRuOa236L3NRQoGkT5Ye 3Uean3Rwxyhur X-Google-Smtp-Source: AGHT+IG1b0kqppE/aOZ+vVB3gLdCewmc10Stw5fRjXbIBArxk72jSjF6/GUfxsyoqD9JaQSUMX0t5w== X-Received: by 2002:a05:6000:240e:b0:3a4:fc07:f453 with SMTP id ffacd0b85a97d-3a5319b6a11mr1876144f8f.8.1749198527194; Fri, 06 Jun 2025 01:28:47 -0700 (PDT) Received: from smtpclient.apple ([62.74.12.127]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a53229de48sm1206100f8f.10.2025.06.06.01.28.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jun 2025 01:28:46 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_7E25F15D-6997-448C-B0E0-6BF013904F21" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.4\)) Date: Fri, 6 Jun 2025 11:28:33 +0300 In-Reply-To: References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51.11.4) X-Spam-Score: 3.6 (+++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: I just got confirmation that the copyright assignent paperwork is complete. =?UTF-8?Q?Here=E2=80=99s?= an updated version of the patch, with: - 2 sentence formatting fixes - term-osc-handlers just a defvar instead of a defcustom Content analysis details: (3.6 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [62.74.12.127 listed in zen.spamhaus.org] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2a00:1450:4864:20:0:0:0:429 listed in] [list.dnswl.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (szermatt[at]gmail.com) -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 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: 2.6 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: I just got confirmation that the copyright assignent paperwork is complete. =?UTF-8?Q?Here=E2=80=99s?= an updated version of the patch, with: - 2 sentence formatting fixes - term-osc-handlers just a defvar instead of a defcustom Content analysis details: (2.6 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2a00:1450:4864:20:0:0:0:429 listed in] [list.dnswl.org] 3.6 RCVD_IN_SBL_CSS RBL: Received via a relay in Spamhaus SBL-CSS [62.74.12.127 listed in zen.spamhaus.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (szermatt[at]gmail.com) -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -1.0 MAILING_LIST_MULTI Multiple indicators imply a widely-seen list manager --Apple-Mail=_7E25F15D-6997-448C-B0E0-6BF013904F21 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I just got confirmation that the copyright assignent paperwork is = complete. Here=E2=80=99s an updated version of the patch, with:=20 - 2 sentence formatting fixes - term-osc-handlers just a defvar instead of a defcustom --Apple-Mail=_7E25F15D-6997-448C-B0E0-6BF013904F21 Content-Disposition: attachment; filename=0001-Handle-OSC-sequences-in-term-bug-78263.patch Content-Type: application/octet-stream; x-unix-mode=0700; name="0001-Handle-OSC-sequences-in-term-bug-78263.patch" Content-Transfer-Encoding: quoted-printable =46rom=202ab3b6b2f86c9a3142a320f97d52a3839c5af711=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Wed,=204=20Jun=202025=2021:00:42=20+0300=0ASubject:=20[PATCH]=20= Handle=20OSC=20sequences=20in=20term=20(bug#78263)=0A=0AHandlers=20can=20= be=20registered=20to=20term-osc-handler,=20which=20by=20defaults,=0A= supports=20OSC=200,=202,=207=20and=208,=20using=20handlers=20defined=20= in=20ansi-osc.=20=20Unknown=0AOSC=20sequences=20are=20ignored.=0A=0A*=20= lisp/term.el=20(term-emulate-terminal):=20Handle=20OSC=20sequences.=0A= (term-osc-handler):=20New=20configuration=20variable.=0A= (term-control-seq-regexp):=20Extended=20regexp.=0A(term--osc-max-byte):=20= New=20private=20constant.=0A*=20lisp/ansi-osc.el=20(ansi-osc-handler):=20= Handle=20OSC=200=20like=20OSC=202.=0A*=20test/lisp/term-tests.el=20= (term-ignore-osc,=20term-handle-osc)=0A(term-call-ansi-osc-handlers):=20= New=20tests=0A---=0A=20lisp/ansi-osc.el=20=20=20=20=20=20=20=20|=20=20=20= 3=20+-=0A=20lisp/term.el=20=20=20=20=20=20=20=20=20=20=20=20|=20=2059=20= ++++++++++++++++++++=0A=20test/lisp/term-tests.el=20|=20117=20= ++++++++++++++++++++++++++++++++++++++++=0A=203=20files=20changed,=20178=20= insertions(+),=201=20deletion(-)=0A=0Adiff=20--git=20a/lisp/ansi-osc.el=20= b/lisp/ansi-osc.el=0Aindex=2006359779823..83fcd0d184a=20100644=0A---=20= a/lisp/ansi-osc.el=0A+++=20b/lisp/ansi-osc.el=0A@@=20-62,7=20+62,8=20@@=20= ansi-osc-filter-region=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (delete-region=20pos0=20(point))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20ansi-osc--marker=20(copy-marker=20pos0))))))))=0A=20=0A= -(defvar-local=20ansi-osc-handlers=20'(("2"=20.=20= ansi-osc-window-title-handler)=0A+(defvar-local=20ansi-osc-handlers=20= '(("0"=20.=20ansi-osc-window-title-handler)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("2"=20.=20ansi-osc-window-title-handler)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("7"=20.=20ansi-osc-directory-tracker)=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("8"=20.=20ansi-osc-hyperlink-handler))=0A=20=20=20"Alist=20of=20= handlers=20for=20OSC=20escape=20sequences.=0Adiff=20--git=20= a/lisp/term.el=20b/lisp/term.el=0Aindex=20a971300c055..e46c2a965c3=20= 100644=0A---=20a/lisp/term.el=0A+++=20b/lisp/term.el=0A@@=20-304,6=20= +304,7=20@@=20term-protocol-version=0A=20=20=20(require=20'cl-lib))=0A=20= (require=20'comint)=20;=20Password=20regexp.=0A=20(require=20= 'ansi-color)=0A+(require=20'ansi-osc)=0A=20(require=20'ehelp)=0A=20= (require=20'ring)=0A=20(require=20'shell)=0A@@=20-603,6=20+604,33=20@@=20= term-exec-hook=0A=20=20=20:type=20'hook=0A=20=20=20:group=20'term)=0A=20=0A= +(defvar=20term-osc-handlers=20nil=0A+=20=20"Terminal-specific=20OSC=20= sequence=20handler=20function=20alist.=0A+=0A+OSC=20(Operating=20System=20= Command)=20is=20a=20category=20of=20ANSI=20escape=20sequence=0A+used=20= in=20terminal=20application=20to=20introduce=20custom=20commands.=20=20= Terminals=0A+ignore=20unknown=20OSC=20sequences=20by=20default.=20=20= Handlers=20can=20be=20registered=20here=0A+to=20add=20support=20for=20= new=20OSC=20sequences=20to=20`term'.=0A+=0A+Functions=20in=20this=20= alist=20are=20passed=20matching=20valid=20OSC=20sequences=20as=0A= +they're=20sent=20to=20the=20terminal.=0A+=0A+Valid=20OSC=20sequences=20= are=20of=20the=20form=0A+=20=20ESC=20]=20code=20;=20text=20BEL=0A+=20=20= ESC=20]=20code=20;=20text=20ESC=20\=0A+=0A+Each=20entry=20has=20the=20= form=20(CODE=20.=20FUNCTION),=20where=20CODE=20is=20the=20string=20that=0A= +appears=20before=20the=20semicolon.=0A+=0A+FUNCTION=20is=20called=20= with=20two=20arguments=20CODE=20and=20TEXT,=20with=20TEXT=20being=20the=0A= +content=20of=20the=20OSC=20sequence=20after=20the=20semicolon.=20=20= When=20the=20function=20is=0A+called,=20the=20term=20buffer=20is=20= active=20and=20with=20point=20and=20content=20valid=20at=0A+the=20time=20= the=20OSC=20sequence=20appears=20in=20the=20stream.=0A+=0A+Any=20code=20= not=20on=20this=20alist=20is=20further=20looked=20up=20in=20= `ansi-osc-handlers',=0A+which=20collects=20OSC=20handlers=20that=20can=20= also=20work=20outside=20of=20a=20terminal=0A+context.=20=20For=20= details,=20see=20`ansi-osc-apply-on-region'.")=0A+=0A=20(defvar=20= term-mode-map=0A=20=20=20(let=20((map=20(make-sparse-keymap)))=0A=20=20=20= =20=20(define-key=20map=20"\ep"=20'term-previous-input)=0A@@=20-3030,6=20= +3058,10=20@@=20term-control-seq-regexp=0A=20=20=20=20= "\e\\(?:[DM78c]\\|"=0A=20=20=20=20;;=20another=20Emacs=20specific=20= control=20sequence,=0A=20=20=20=20"AnSiT[^\n]+\n\\|"=0A+=20=20=20;;=20= OSC=20(See=20[ECMA-48]=20section=208.3.89=20"Operation=20System=20= Command".)=0A+=20=20=20;;=20The=20spec=20only=20allows=200x08-0x0d=20= 0x20-7e,=20but=20this=20regexp=20also=0A+=20=20=20;;=20allows=20= non-ascii=20(UTF-8)=20characters.=0A+=20=20=20= "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|"=0A=20=20=20=20;;=20= or=20an=20escape=20sequence=20(section=205.4=20"Control=20Sequences"),=0A= =20=20=20=20"\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)")=0A=20=20= =20"Regexp=20matching=20control=20sequences=20handled=20by=20term.el.")=0A= @@=20-3232,6=20+3264,33=20@@=20term-emulate-terminal=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (split-string=20ctl-params=20";"))=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(aref=20str=20(1-=20= ctl-end))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20private))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(?\]=20;;=20An=20OSC=20sequence=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((seq-str=20= (substring=20str=20(+=20i=202)=20ctl-end)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(string-match=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "\\`\\(\\([0-9A-Za-z]+\\);\\)?.*?\\(\a\\|\e\\\\\\)?\\'"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20seq-str)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((code=20(match-string=202=20seq-str))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (text-start=20(match-end=201))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(end-mark=20= (match-beginning=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(when=20(and=20code=20end-mark)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (when-let*=20((func=20(cdr=20(or=20(assoc-string=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= code=20term-osc-handlers)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(assoc-string=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20code=20ansi-osc-handlers)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (with-demoted-errors=20"term=20OSC=20error:=20%S"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (funcall=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20func=20code=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (decode-coding-string=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(substring=20= seq-str=20text-start=20end-mark)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= locale-coding-system=20t)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(when=20(and=20(not=20end-mark)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(>=3D=20ctl-end=20str-length)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(<=20(-=20ctl-end=20i)=20= term--osc-max-bytes))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20Continue=20ignoring=20until=20= the=20end=20marker.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20term-terminal-undecoded-bytes=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(substring=20str=20i)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Consume=20= everything=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(setq=20i=20ctl-end))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(?D=20;;=20Scroll=20forward=20(apparently=20not=20= documented=20in=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20[ECMA-48],=20[ctlseqs]=20mentions=20it=20as=20C1=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= character=20"Index"=20though).=0Adiff=20--git=20= a/test/lisp/term-tests.el=20b/test/lisp/term-tests.el=0Aindex=20= ffb341f3b52..e6ea42631fd=20100644=0A---=20a/test/lisp/term-tests.el=0A= +++=20b/test/lisp/term-tests.el=0A@@=20-419,6=20+419,123=20@@=20= term-undecodable-input=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20bytes)))))=0A=20=0A= +(ert-deftest=20term-ignore-osc=20()=0A+=20=20;;=20BEL-terminated=20OSC=20= sequence=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20"te\e]0;window=20= title\ast")))=0A+=20=20;;=20ESC=20\-terminated=20OSC=20sequence=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;window=20title\e\\st")))=0A+=20=20;;=20= Long=20OSC=20sequence=20split=20into=20multiple=20chunks=0A+=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20'("te\e]0;win"=20"dow=20"=20"=20= title\ast"))))=0A+=20=20;;=20OSC=20sequence=20that=20start=20and=20ends=20= with=20the=20chunk=0A+=20=20(should=20(equal=20"test"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20'("te"=20= "\e]0;window=20"=20"title\a"=20"st"))))=0A+=0A+=20=20;;=20Invalid=20= control=20characters=20break=20out=20of=20the=20OSC=20sequence,=20for=0A= +=20=20;;=20safety.=0A+=20=20(should=20(equal=20"tetitlest"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2040=201=20= '("te\e]0;window\x05title\ast"))))=0A+=0A+=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20;;=20An=20OSC=20= sequence=20with=20multibyte=20UTF-8=20characters.=20=20This=20is=20not=0A= +=20=20=20=20;;=20exactly=20standard-compliant,=20but=20too=20common=20= not=20to=20support.=0A+=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=2040=201=20"te\e]0;\xce\xb1\xce\xb2\e\\st")))))=0A+=0A= +(ert-deftest=20term-handle-osc=20()=0A+=20=20(let*=20((captured=20nil)=0A= +=20=20=20=20=20=20=20=20=20(handler=20(lambda=20(code=20text)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20(cons=20code=20= text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20captured)))=0A+=20=20=20=20=20=20=20=20=20(term-osc-handlers=20= `(("2"=20.=20,handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20,handler))))=0A+=0A= +=20=20=20=20;;=20Send=20OSC=20sequences=20to=20handler=0A+=20=20=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=2040=201=20"te\e]2;foo\as\e]1994;bar\at")))=0A= +=20=20=20=20(should=20(equal=20'(("2"=20.=20"foo")=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"bar"))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(nreverse=20= captured)))=0A+=0A+=20=20=20=20;;=20OSC=20sequences=20and=20code=20can=20= be=20chunked=0A+=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20= (should=20(equal=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=2040=201=20`("te\e]2;chunked=20fo"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "o\as\e]19"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20"94;chunked=20ba"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"r\at"))))=0A+=20=20=20=20= (should=20(equal=20'(("2"=20.=20"chunked=20foo")=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20("1994"=20.=20"chunked=20= bar"))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (nreverse=20captured)))=0A+=0A+=20=20=20=20;;=20OSC=20sequences=20can=20= contain=20multibyte=20characters=0A+=20=20=20=20(let=20= ((locale-coding-system=20'utf-8-unix))=0A+=20=20=20=20=20=20(setq=20= captured=20nil)=0A+=20=20=20=20=20=20(should=20(equal=20"test"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=2040=201=20"te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A+=20= =20=20=20=20=20(should=20(equal=20'(("2"=20.=20"=CE=B1=CE=B2"))=20= captured)))=0A+=0A+=20=20=20=20;;=20Ignore=20unhandled=20and=20invalid=20= OSC=20sequences=0A+=20=20=20=20(setq=20captured=20nil)=0A+=20=20=20=20= (should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20"test"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20(term-test-screen-from-input=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=2040=201=20"t\e]3;unhandled\aest")))=0A+=20= =20=20=20(should-not=20captured)=0A+=20=20=20=20(should=20(equal=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=2040=201=20"t\e]2missing=20semicolon\aest")))=0A+=20=20=20=20= (should-not=20captured)=0A+=0A+=20=20=20=20(should=20(equal=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20(term-test-screen-from-input=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =2040=201=20"t\e]2;not=20ended\003est")))=0A+=20=20=20=20(should-not=20= captured)))=0A+=0A+(ert-deftest=20term-call-ansi-osc-handlers=20()=0A+=20= =20(let*=20((captured=20nil)=0A+=20=20=20=20=20=20=20=20=20(osc-handler=20= (lambda=20(code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(push=20(list=20'osc=20code=20text)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(term-handler=20(lambda=20= (code=20text)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(push=20(list=20'term=20code=20text)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20captured)))=0A+=20=20=20=20=20=20=20=20=20(ansi-osc-handlers=20`(("1"=20= .=20,osc-handler)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20("2"=20.=20,osc-handler)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20("3"=20.=20,osc-handler)))=0A+=20=20=20=20=20=20=20=20=20= (term-osc-handlers=20`(("2"=20.=20,term-handler)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("3"=20.=20nil))))=0A+=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A= +=20=20=20=20=20=20"test"=0A+=20=20=20=20=20=20= (term-test-screen-from-input=0A+=20=20=20=20=20=20=2040=201=20(concat=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20"te"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20"\e]1;a\a"=20;;=20sent=20to=20osc-handler=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20"\e]2;b\a"=20;;=20sent=20to=20term-handler=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20"\e]3;c\a"=20;;=20ignored;=20disabled=20= in=20term=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20"\e]4;d\a"=20;;=20= ignored;=20not=20registered=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= "st"))))=0A+=20=20=20=20(should=0A+=20=20=20=20=20(equal=0A+=20=20=20=20=20= =20'((osc=20"1"=20"a")=0A+=20=20=20=20=20=20=20=20(term=20"2"=20"b"))=0A= +=20=20=20=20=20=20(nreverse=20captured)))))=0A+=0A=20(provide=20= 'term-tests)=0A=20=0A=20;;;=20term-tests.el=20ends=20here=0A--=20=0A= 2.47.2=0A=0A= --Apple-Mail=_7E25F15D-6997-448C-B0E0-6BF013904F21 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On 5 Jun 2025, at 08:49, Jared Finder wrote: >=20 > On 2025-06-04 22:29, Eli Zaretskii wrote: >> Please fix those nits, and then we should wait for your >> copyright-assignment paperwork to be completed, and for Jared to >> respond to your previous message. >=20 > I think St=C3=A9phane's latest patch addressed my question about using = ansi-osc-handlers in term. I saw this new code in it: >=20 > + (when-let* ((func (cdr (or (assoc-string > + code = term-osc-handlers) > + (assoc-string > + code = ansi-osc-handlers))))) >=20 > Which looks right to me. When we want to have different handlers for = term vs *compilation* buffers, we can just add a different handler to = each variable. >=20 > -- MJF --Apple-Mail=_7E25F15D-6997-448C-B0E0-6BF013904F21-- From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Jared Finder Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 10 Jun 2025 04:00:05 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: =?UTF-8?Q?St=C3=A9phane?= Zermatten Cc: Eli Zaretskii , Per Bothner , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174952795022604 (code B ref 78263); Tue, 10 Jun 2025 04:00:05 +0000 Received: (at 78263) by debbugs.gnu.org; 10 Jun 2025 03:59:10 +0000 Received: from localhost ([127.0.0.1]:59815 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uOq8i-0005sE-3N for submit@debbugs.gnu.org; Mon, 09 Jun 2025 23:59:09 -0400 Received: from greenhill.hpalace.com ([192.155.80.58]:52774) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uOq8e-0005r8-1f for 78263@debbugs.gnu.org; Mon, 09 Jun 2025 23:59:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=finder.org; s=2018; t=1749527942; bh=A3PW5eEX0zj9PMWJv0N2nPVo3RTSGlI8SbbH1VrXHlk=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=QLa9I61K7CUO22hfC7HFj/HvkU5MKKGmHJQfx1TmHuUzpH0VoW4h7A3T+GzPms8wW 9IQsuqOi4trBObbk9dYMbKA0yQXE/CVV46h8MljrLf76SkW3OdkStLLcokn/wUVg5y 7CqsyQMm4GkSJWVCK5bGksJit9ZBovPAg/RHi4hR+Rg/jq7rA89jPSGk1MP4/mEllc N0kW82mcnvEN809XWjQPYl4yJnrowVJqNs9T42lva46ouoA3G3+x1HSL/XdlWo393M NUF5ZpIWalUxPLELlNp+Id5kE/gH+T2sVrgBK2VvzHvi3t8iUf1MEcGw4QM/l9Qkwi uYjD6LI62t4sA== Received: from mail.finder.org (unknown [192.155.80.58]) by greenhill.hpalace.com (Postfix) with ESMTPSA id 9AC9EC95; Tue, 10 Jun 2025 03:59:02 +0000 (UTC) MIME-Version: 1.0 Date: Mon, 09 Jun 2025 20:59:02 -0700 From: Jared Finder In-Reply-To: <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> Message-ID: <75afe8b56c43887c54e166517851d2a2@finder.org> X-Sender: jared@finder.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 (-) On 2025-06-06 01:28, Stéphane Zermatten wrote: > I just got confirmation that the copyright assignent paperwork is > complete. > > Here’s an updated version of the patch, with: > - 2 sentence formatting fixes > - term-osc-handlers just a defvar instead of a defcustom This patch looks good to me. -- MJF From unknown Sun Jun 15 08:54:20 2025 X-Loop: help-debbugs@gnu.org Subject: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 12 Jun 2025 07:11:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: szermatt@gmail.com, Jared Finder Cc: per@bothner.com, 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.1749712222709 (code B ref 78263); Thu, 12 Jun 2025 07:11:02 +0000 Received: (at 78263) by debbugs.gnu.org; 12 Jun 2025 07:10:22 +0000 Received: from localhost ([127.0.0.1]:55628 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uPc4s-0000BM-25 for submit@debbugs.gnu.org; Thu, 12 Jun 2025 03:10:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37108) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uPc4p-00007T-FV for 78263@debbugs.gnu.org; Thu, 12 Jun 2025 03:10:20 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uPc4j-0003Eb-39; Thu, 12 Jun 2025 03:10:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=Y963TVgW73a5bDO7S1UR7M1zUt/57R0r/o9SPtHQMxQ=; b=oyPpmTISC0cyDNb7LP7O u89iLeFnlyQjcvg5rvvsa8phBaOQSntq7J8mLSK99iT302e80ZF55rs0DtZECsC/hZrcHIiooh3hb B3EU37uTLpwodEiWgciqKCsYSXsvs0XFXfJq0fbDjrE7pA1etA/OQ5nOqia1VyfSSHmhbgfH5jzuT /lJ3rQzU7BpbC/GwuAn4TqDi3t5RYmdujf23YlSbbb1Jms5ZBZcVjoib2AUpDQDArFa9Sr+bQTiTW lkBIgWs02mIzb06/xxhzvDIR2oy9CuFs5PgXn0L9KcETVhvNH9nuN7hBLUbYUEFE8k3pPsrCT166O VOabUZYi9yq/Sg==; Date: Thu, 12 Jun 2025 10:10:09 +0300 Message-Id: <86y0txfnam.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <75afe8b56c43887c54e166517851d2a2@finder.org> (message from Jared Finder on Mon, 09 Jun 2025 20:59:02 -0700) References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> <75afe8b56c43887c54e166517851d2a2@finder.org> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 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 (---) > Date: Mon, 09 Jun 2025 20:59:02 -0700 > From: Jared Finder > Cc: Eli Zaretskii , Per Bothner , > 78263@debbugs.gnu.org > > On 2025-06-06 01:28, Stéphane Zermatten wrote: > > I just got confirmation that the copyright assignent paperwork is > > complete. > > > > Here’s an updated version of the patch, with: > > - 2 sentence formatting fixes > > - term-osc-handlers just a defvar instead of a defcustom > > This patch looks good to me. Thanks, I've now installed it on the master branch. I needed a followup change, though: the definition of term--osc-max-bytes was missing from the patch. In addition, the new test term-handle-osc fails: Test term-handle-osc backtrace: signal(ert-test-failed (((should (equal '(("2" . "αβ")) captured)) ert-fail(((should (equal '(("2" . "αβ")) captured)) :form (equal ( (if (unwind-protect (setq value-279 (apply fn-277 args-278)) (setq f (let (form-description-281) (if (unwind-protect (setq value-279 (app (let ((value-279 'ert-form-evaluation-aborted-280)) (let (form-descr (let* ((fn-277 #'equal) (args-278 (condition-case err (list '(("2" . (let ((locale-coding-system 'utf-8-unix)) (setq captured nil) (let* (let* ((captured nil) (handler #'(lambda (code text) (setq captured #f(lambda () [term-width term-height t] (let* ((captured nil) (handl #f(compiled-function () #)() handler-bind-1(#f(compiled-function () # Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 12 Jun 2025 08:36:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 78263 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: Per Bothner , Jared Finder , 78263@debbugs.gnu.org Received: via spool by 78263-submit@debbugs.gnu.org id=B78263.174971735722940 (code B ref 78263); Thu, 12 Jun 2025 08:36:01 +0000 Received: (at 78263) by debbugs.gnu.org; 12 Jun 2025 08:35:57 +0000 Received: from localhost ([127.0.0.1]:56126 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uPdPf-0005xp-Ry for submit@debbugs.gnu.org; Thu, 12 Jun 2025 04:35:57 -0400 Received: from mail-ed1-x530.google.com ([2a00:1450:4864:20::530]:57359) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1uPdPc-0005xH-JS for 78263@debbugs.gnu.org; Thu, 12 Jun 2025 04:35:53 -0400 Received: by mail-ed1-x530.google.com with SMTP id 4fb4d7f45d1cf-60780d74c8cso1349631a12.2 for <78263@debbugs.gnu.org>; Thu, 12 Jun 2025 01:35:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749717346; x=1750322146; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=bvHtm93s9XZERx9WxaZsoE8Kb547oino+Nta2U9Rpoc=; b=g/JpwC/21nrFYLnfieO5XBTOvNS4uvKDDITEQhSItWGFT/V7soiXkP695MVuc2WJ0n pc51gsvPALMShvkyUPSjz3zjCtCjAqMRKHGHf4eJ1wBGc45w96OLd7k5SJJnuXjLK0W8 5Lgx7XmYLHXiZJYEqXNpeCQjo7Fl1vYBgZDVx1EQLzfLaD/iJq/C6aF1M+u8wED7cbrv 1kMnW/JcVds6AMt/MRs+F2G4xPHr/RRhWTpKCHkd2cMSshkNKm0Uf0oTsz1E6Fny6vc1 /o2niv40pCR/LTcvWncej0z+VUV88lRhsqAZnFsuRgq4fkAsvdLKS6LMkfnucdObRdul YsLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749717346; x=1750322146; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bvHtm93s9XZERx9WxaZsoE8Kb547oino+Nta2U9Rpoc=; b=dXBP5jIMxhcBNtIwzx5S6G/hYQTCsKxeAFePvbVFO22Sp3wTFiQPRWXuQ/uDftBPsg KSk5Vo9f+YFPeWxBb0Bb7bCpRCmFWLYhacjO7SGMJfK1digkYpshzXVXECLV4aboTYVO 7CE7mjvpEESbj3pjLjyENM+rixwmKTWltdy7MM6FEjt8MW3JjipTEyoeICWaQHsOS/aj 9+4GnQelv8HI4tagVchDQWiWo6W7tTo8qvn2hkiZlTgDIletAkiBNis8+nYtvqqaOdRH dEXM1+sxmMUcXsA17JobytsfLpCiiqRj0sobpO6TN/6ljlEYtMzrVLWZ3oP03dw02vV8 2jxA== X-Forwarded-Encrypted: i=1; AJvYcCXKo0Eu/lmejyBLgiW3Fmqxm5MWe/kASERRiVqRnajSq8vAmfLbxYWrmg3lmuuheDu0jOVSxQ==@debbugs.gnu.org X-Gm-Message-State: AOJu0Yz1xL2QyOr6B9N9n9XYE9SbPz70Yi4PZyQ0tVvv3pjEJIefc5DA sBFl74SPVi09UkuW4LqaqDHhhLlhBhokVnRBPE+bXfwiZhYL7UDq9GV7 X-Gm-Gg: ASbGncud9Et6vMysBCgSZ689eXzS6zN3q1h6JzDyUhFDbKL4RV2RJu3v0MZQPwdEFnw Rx2PvcAXdtlX6J21Ym04sbahs1YGPO8rVB3fFYsc0lP2bNfT5ngi8EnmFcu6XtL27vFBUGB0UOh 0c1BwpbbVxMKEf87aRm1WbzewRLCyRva+SrOa+GLhXPhiqVA+vOrOaQcyFvx5isrt5RAmCB7Cv+ 361pMJkshJiQ6g+LGMAhvh3rFVFfJe+b3k311H1nHTb/N7nnYQzHxAEWUihxP77VOVgeTZxUEr+ Iih48oJI+a4JLZAgLhJ5d0KEOrjQuWpq/puVx+huofmNKDXp+o1g0tNnCUNVToE467mdXHe7LX0 fyGrvboK6HFAoO0XxtbaUow== X-Google-Smtp-Source: AGHT+IGepq/wX9UrRKATNUNIpb9LHjyYz9xFnFqzHUJ4fk1/X7B4nMyfkj24PT37OYaPGu8dauy/Lg== X-Received: by 2002:a17:907:d16:b0:ad5:d0e:9605 with SMTP id a640c23a62f3a-adea93e07c2mr223918566b.32.1749717345987; Thu, 12 Jun 2025 01:35:45 -0700 (PDT) Received: from smtpclient.apple ([62.74.18.50]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-adeadb229d5sm93684166b.73.2025.06.12.01.35.44 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Jun 2025 01:35:45 -0700 (PDT) From: =?UTF-8?Q?St=C3=A9phane?= Zermatten Message-Id: Content-Type: multipart/alternative; boundary="Apple-Mail=_10E09BD7-210B-42C8-B430-0914440ED0FF" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51.11.4\)) Date: Thu, 12 Jun 2025 11:35:31 +0300 In-Reply-To: <86y0txfnam.fsf@gnu.org> References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> <75afe8b56c43887c54e166517851d2a2@finder.org> <86y0txfnam.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51.11.4) 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 (-) --Apple-Mail=_10E09BD7-210B-42C8-B430-0914440ED0FF Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 +CC 78263@debbugs.gnu.org , Per Bothner = I=E2=80=99m sorry I messed up the patch. I thought I had been careful, = but not enough =F0=9F=99=81 My workflow needs work.=20 I attached a patch that fixes the breaking test on the main branch. The = unicode characters hardcoded in the test file were messed up somehow, so = in the patch I propose using the \u notation instead of hardcoding = =E2=80=9C=CE=B1=CE=B2=E2=80=9D. =EF=BF=BC > On 12 Jun 2025, at 10:10, Eli Zaretskii wrote: >=20 >> Date: Mon, 09 Jun 2025 20:59:02 -0700 >> From: Jared Finder >> Cc: Eli Zaretskii , Per Bothner , >> 78263@debbugs.gnu.org >>=20 >> On 2025-06-06 01:28, St=C3=A9phane Zermatten wrote: >>> I just got confirmation that the copyright assignent paperwork is=20 >>> complete. >>>=20 >>> Here=E2=80=99s an updated version of the patch, with: >>> - 2 sentence formatting fixes >>> - term-osc-handlers just a defvar instead of a defcustom >>=20 >> This patch looks good to me. >=20 > Thanks, I've now installed it on the master branch. I needed a > followup change, though: the definition of term--osc-max-bytes was > missing from the patch. In addition, the new test term-handle-osc > fails: >=20 > Test term-handle-osc backtrace: > signal(ert-test-failed (((should (equal '(("2" . "=C3=8E=C2=B1=C3=8E=C2= =B2")) captured)) > ert-fail(((should (equal '(("2" . "=C3=8E=C2=B1=C3=8E=C2=B2")) = captured)) :form (equal ( > (if (unwind-protect (setq value-279 (apply fn-277 args-278)) (setq = f > (let (form-description-281) (if (unwind-protect (setq value-279 = (app > (let ((value-279 'ert-form-evaluation-aborted-280)) (let = (form-descr > (let* ((fn-277 #'equal) (args-278 (condition-case err (list '(("2" = . > (let ((locale-coding-system 'utf-8-unix)) (setq captured nil) (let* > (let* ((captured nil) (handler #'(lambda (code text) (setq captured > #f(lambda () [term-width term-height t] (let* ((captured nil) = (handl > #f(compiled-function () #)() > handler-bind-1(#f(compiled-function () # ert--run-test-internal(#s(ert--test-execution-info :test = #s(ert-test > ert-run-test(#s(ert-test :name term-handle-osc :documentation nil = :b > ert-run-or-rerun-test(#s(ert--stats :selector ... :tests ... = :test-m > ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) = #f(compil > ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp)))) > ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag = :nativeco > eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag = :n > command-line-1(("-L" ":." "-l" "ert" "--eval" "(setq = treesit-extra-l > command-line() > normal-top-level() > Test term-handle-osc condition: > (ert-test-failed > ((should (equal '(...) captured)) :form > (equal (("2" . "=C3=8E=C2=B1=C3=8E=C2=B2")) (("2" . "=CE=B1=CE=B2"= ))) :value nil :explanation > (list-elt 0 > (cdr > (arrays-of-different-length 4 2 "=C3=8E=C2=B1=C3=8E=C2=B2= " "=CE=B1=CE=B2" > first-mismatch-at 0))))) > FAILED 7/16 term-handle-osc (0.003910 sec) at = lisp/term-tests.el:453 >=20 > St=C3=A9phane, could you please look at the test failure and tell how = to > fix it? Or maybe I goofed when I installed your changes (as indicated > by the problem with term--osc-max-bytes)? --Apple-Mail=_10E09BD7-210B-42C8-B430-0914440ED0FF Content-Type: multipart/mixed; boundary="Apple-Mail=_4336EC44-73AB-4375-A5F7-BFC14BC21ED3" --Apple-Mail=_4336EC44-73AB-4375-A5F7-BFC14BC21ED3 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8
+CC 78263@debbugs.gnu.org, Per = Bothner <per@bothner.com>

I=E2=80=99m sorry I messed up the patch. I thought I had = been careful, but not enough =F0=9F=99=81 My workflow needs = work. 

I attached a patch that fixes the = breaking test on the main branch. The unicode characters hardcoded in = the test file were messed up somehow, so in the patch I propose using = the \u notation instead of hardcoding =E2=80=9C=CE=B1=CE=B2=E2=80=9D.

= --Apple-Mail=_4336EC44-73AB-4375-A5F7-BFC14BC21ED3 Content-Disposition: attachment; filename=0001-Fix-char-encoding-in-term-tests.el.patch Content-Type: application/octet-stream; x-unix-mode=0700; name="0001-Fix-char-encoding-in-term-tests.el.patch" Content-Transfer-Encoding: quoted-printable =46rom=20433734c2a6689853d853410d30c3b51beabd4a21=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Stephane=20Zermatten=20=0A= Date:=20Thu,=2012=20Jun=202025=2011:10:05=20+0300=0ASubject:=20[PATCH]=20= ;=20Fix=20char=20encoding=20in=20term-tests.el=0A=0A*=20= test/lisp/term-tests.el=20(term-handle-osc):=20Fix=20unicode=0A= characters=20using=20\u=20notation.=0A---=0A=20test/lisp/term-tests.el=20= |=202=20+-=0A=201=20file=20changed,=201=20insertion(+),=201=20= deletion(-)=0A=0Adiff=20--git=20a/test/lisp/term-tests.el=20= b/test/lisp/term-tests.el=0Aindex=204fcc564cc5d..53701fad1eb=20100644=0A= ---=20a/test/lisp/term-tests.el=0A+++=20b/test/lisp/term-tests.el=0A@@=20= -484,7=20+484,7=20@@=20term-handle-osc=0A=20=20=20=20=20=20=20(should=20= (equal=20"test"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(term-test-screen-from-input=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=2040=201=20= "te\e]2;\xce\xb1\xce\xb2\e\\st")))=0A-=20=20=20=20=20=20(should=20(equal=20= '(("2"=20.=20"=C3=8E=C2=B1=C3=8E=C2=B2"))=20captured)))=0A+=20=20=20=20=20= =20(should=20(equal=20'(("2"=20.=20"\u03b1\u03b2"))=20captured)))=0A=20=0A= =20=20=20=20=20;;=20Ignore=20unhandled=20and=20invalid=20OSC=20sequences=0A= =20=20=20=20=20(setq=20captured=20nil)=0A--=20=0A2.47.2=0A=0A= --Apple-Mail=_4336EC44-73AB-4375-A5F7-BFC14BC21ED3 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8


On 12 Jun 2025, at 10:10, Eli Zaretskii = <eliz@gnu.org> wrote:

Date: Mon, 09 Jun 2025 20:59:02 -0700
From: Jared = Finder <jared@finder.org>
Cc: Eli Zaretskii = <eliz@gnu.org>, Per Bothner <per@bothner.com>,
= 78263@debbugs.gnu.org

On 2025-06-06 01:28, St=C3=A9phane = Zermatten wrote:
I just got confirmation = that the copyright assignent paperwork is
complete.

Here=E2=80=99= s an updated version of the patch, with:
- 2 sentence formatting = fixes
- term-osc-handlers just a defvar instead of a = defcustom

This patch looks good to = me.

Thanks, I've now installed it on the master = branch.  I needed a
followup change, though: the definition of = term--osc-max-bytes was
missing from the patch.  In addition, = the new test  term-handle-osc
fails:

 Test = term-handle-osc backtrace:
   signal(ert-test-failed = (((should (equal '(("2" . "=C3=8E=C2=B1=C3=8E=C2=B2")) captured))
=    ert-fail(((should (equal '(("2" . "=C3=8E=C2=B1=C3=8E=C2= =B2")) captured)) :form (equal (
   (if = (unwind-protect (setq value-279 (apply fn-277 args-278)) (setq f
=    (let (form-description-281) (if (unwind-protect (setq = value-279 (app
   (let ((value-279 = 'ert-form-evaluation-aborted-280)) (let (form-descr
=    (let* ((fn-277 #'equal) (args-278 (condition-case err = (list '(("2" .
   (let ((locale-coding-system = 'utf-8-unix)) (setq captured nil) (let*
   (let* = ((captured nil) (handler #'(lambda (code text) (setq captured
=    #f(lambda () [term-width term-height t] (let* = ((captured nil) (handl
   #f(compiled-function () = #<bytecode -0x180335fbec92162c>)()
=    handler-bind-1(#f(compiled-function () #<bytecode = -0x180335fbec92162
=    ert--run-test-internal(#s(ert--test-execution-info = :test #s(ert-test
   ert-run-test(#s(ert-test :name = term-handle-osc :documentation nil :b
=    ert-run-or-rerun-test(#s(ert--stats :selector ... = :tests ... :test-m
   ert-run-tests((not (or (tag = :unstable) (tag :nativecomp))) #f(compil
=    ert-run-tests-batch((not (or (tag :unstable) (tag = :nativecomp))))
   ert-run-tests-batch-and-exit((not = (or (tag :unstable) (tag :nativeco
=    eval((ert-run-tests-batch-and-exit '(not (or (tag = :unstable) (tag :n
   command-line-1(("-L" ":." "-l" = "ert" "--eval" "(setq treesit-extra-l
=    command-line()
=    normal-top-level()
 Test term-handle-osc = condition:
     (ert-test-failed
=       ((should (equal '(...) captured)) = :form
= (equal (("2" . "=C3=8E=C2=B1=C3=8E=C2=B2")) (("2" . "=CE=B1=CE=B2")= )) :value nil :explanation
(list-elt 0
=  (cdr
= =   (arrays-of-different-length 4 2 "=C3=8E=C2=B1=C3=8E=C2= =B2" "=CE=B1=CE=B2"
=       first-mismatch-at 0)))))
=     FAILED   7/16  term-handle-osc = (0.003910 sec) at lisp/term-tests.el:453

St=C3=A9phane, could you = please look at the test failure and tell how to
fix it?  Or = maybe I goofed when I installed your changes (as indicated
by the = problem with = term--osc-max-bytes)?

<= /html>= --Apple-Mail=_4336EC44-73AB-4375-A5F7-BFC14BC21ED3-- --Apple-Mail=_10E09BD7-210B-42C8-B430-0914440ED0FF-- From unknown Sun Jun 15 08:54:20 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Stephane Zermatten Subject: bug#78263: closed (Re: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them) Message-ID: References: <86plf9fj4s.fsf@gnu.org> X-Gnu-PR-Message: they-closed 78263 X-Gnu-PR-Package: emacs X-Gnu-PR-Keywords: patch Reply-To: 78263@debbugs.gnu.org Date: Thu, 12 Jun 2025 08:41:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1749717662-24399-1" This is a multi-part message in MIME format... ------------=_1749717662-24399-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them which was filed against the emacs package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 78263@debbugs.gnu.org. --=20 78263: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D78263 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1749717662-24399-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 78263-done) by debbugs.gnu.org; 12 Jun 2025 08:40:22 +0000 Received: from localhost ([127.0.0.1]:56170 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uPdTx-0006Jn-Dk for submit@debbugs.gnu.org; Thu, 12 Jun 2025 04:40:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47660) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uPdTq-0006DY-4i for 78263-done@debbugs.gnu.org; Thu, 12 Jun 2025 04:40:14 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uPdTj-0005wz-A3; Thu, 12 Jun 2025 04:40:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=DPjYGFwug9l7/IThcBtt1i1z6i/oot1aIDf1ZuitVpQ=; b=JCSK55lANikPlzbFQzKa fgaiOmESTio2EmfWXmY9Y0MeCC7VTtUeN6EVPjNOQRsPOpnWhP4GSJe6zqfYjNzupPuv1tBbTibTX AructsY7K0Tb31SjaFPDoNoA+LFaGpIZMJwT2qQBboTjlGFqyxEdKVC5qj1tfVTRlie/lNUbo/tz6 x/jvdAoP1rj2qL2lIt9mRT5NT0XqGL2+NEtmuA/proIf/wbCZq10iMcCOddrmn6AHejvQI6OndsEz rs6LuQdmDqcDQKVbJ/Tn6G84EPYV+HYpMCFxi1X0o7Fjl6ZGNJtI2Df/gnHO/0IJlt0X5gKizRHs9 mO7cOdMveN3MJQ==; Date: Thu, 12 Jun 2025 11:40:03 +0300 Message-Id: <86plf9fj4s.fsf@gnu.org> From: Eli Zaretskii To: =?utf-8?Q?St=C3=A9phane?= Zermatten In-Reply-To: <9608462E-68C9-463F-ADAF-CE53AF83FD7D@gmail.com> (message from =?utf-8?Q?St=C3=A9phane?= Zermatten on Thu, 12 Jun 2025 11:25:15 +0300) Subject: Re: bug#78263: [PATCH 1/3] Ignore OSC sequences in term instead of printing them References: <0E8AAA1C-EC9A-4AD3-B693-59617AD23089@gmail.com> <86ecwze7wx.fsf@gnu.org> <656B1FE9-782F-4929-A63C-8994E1C564C4@gmail.com> <86msatrve6.fsf@gnu.org> <86b134df52395832f9ba491de8f8442a@finder.org> <86y0u9nkte.fsf@gnu.org> <0A5AEC31-2714-4D6D-AC8B-071BADDFFBE6@gmail.com> <86wm9qn4cq.fsf@gnu.org> <579469BE-CA0A-47B4-8852-7DD56EC5F2BF@gmail.com> <75afe8b56c43887c54e166517851d2a2@finder.org> <86y0txfnam.fsf@gnu.org> <9608462E-68C9-463F-ADAF-CE53AF83FD7D@gmail.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 78263-done Cc: 78263-done@debbugs.gnu.org, per@bothner.com, Jared Finder 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 (---) > From: Stéphane Zermatten > Date: Thu, 12 Jun 2025 11:25:15 +0300 > > I’m sorry I messed up the patch. I thought I had been careful, but not enough 🙁 My workflow needs work. > > I attached a patch that fixes the breaking test on the main branch. The unicode characters hardcoded in the test file were messed up somehow, so in the patch I propose using the \u notation instead of hardcoding “αβ”. Thanks, the test now passes. Installed on the master branch, and closing the bug. ------------=_1749717662-24399-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 5 May 2025 15:20:23 +0000 Received: from localhost ([127.0.0.1]:41619 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uBxcE-0004xu-Dn for submit@debbugs.gnu.org; Mon, 05 May 2025 11:20:23 -0400 Received: from lists.gnu.org ([2001:470:142::17]:51164) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uBwqH-0002Fp-En for submit@debbugs.gnu.org; Mon, 05 May 2025 10:30:50 -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 1uBwqB-0007f3-Qx for bug-gnu-emacs@gnu.org; Mon, 05 May 2025 10:30:43 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uBwq9-0002o2-Rp for bug-gnu-emacs@gnu.org; Mon, 05 May 2025 10:30:43 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-4394a0c65fcso41125955e9.1 for ; Mon, 05 May 2025 07:30:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1746455438; x=1747060238; darn=gnu.org; h=mime-version:message-id:date:subject:to:from:from:to:cc:subject :date:message-id:reply-to; bh=R8uu0pE4UNgV3Bd5k/tGEeSUEdfyHpPIJeOuP6kPczw=; b=N6wdxs2yOT7yHioGtlZYL5jCEnpowei1zE8ppxSGIQkLq3EfcTzI2lPHSDTqgMtVfy 74FGxAyu/OIvDtcNuDgel7wnXWN35t7eNF7pxig+HzJoJ8cEFUJYLc1etw6rGW9k7+yj L+/0LTSPwPbuqsPX6DcD+nNx61LaIUrQHm3UUqd/B8Ch9Pjbh1iXbDBbJHmNZP/Eu59l zRZIwGt68tzNCgoZL8Q8FX7agcgfTRAcuXAZX6Z/Gx0bPVYyBmiJLUbvEo6jEbtkxHf7 gHvHV/gD+PQNyelwyE1GxfNDvEuWcN4nRILmDRmhdaOOokbuzhekKTFzFeQ3ET5ohiXs oCIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746455438; x=1747060238; h=mime-version:message-id:date:subject:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=R8uu0pE4UNgV3Bd5k/tGEeSUEdfyHpPIJeOuP6kPczw=; b=nYnbiY4kh8/BmpNZ/Un8DS0EOdXCLjFmPcAHovY840uI9/VXnOzXQRNKYiM7muU5CL 1Vc5h1PnbM3x7xEa10wKT96JWgo0pRIOOFBcmJKIz2Dn+7u0KdttVlzw7YZp3yQqxVhy 8/O6EbcSTLYz1dDncwSqNMRfTbFG9BRQa+03Vfl6KSI3w/99Ddq2cDzNyuH9d83vRNqq Pi00N2zWjS+HmT4ZJ/zkofggrwgyB33sGditJjyv0rW8XwAio7k1HyqtgMM6yG4eKW/Z RND41PKLda2LeU19dZvmiKFPR1ajD0ZeHXongEJYs4ZiBuYnU5gxgm3oUwCcwQesDmMZ UBTg== X-Gm-Message-State: AOJu0YzdBIZh5wdFrW+Lw/Y7DeIayBmj441fRXVr0hpVmFU5LhOoP4PS BkvJlwcj3/hqDQAIWDV/B/UKVNB+buKED4UWwMGD3izKBBpdfsRD1Z/ed+x9 X-Gm-Gg: ASbGncsI7DQql6WOFqZIwWeRa/OXIRXYpbA3wdYh1K3UX3FdORU45cUlJpgbsr8/Vkl GwvYLwibiBSH/cQ8PcgQTP6ziGz6EeuPsjpCWzyexY2ayY8CPoWo8bhnNEBXoTbd8EYo+//jWvm 7262EvOveZPoDuKAos8SYdWUO0MF2a+LV0ImxzokD1qwbYNO8ZoMIjuqBi7Ooh29oTXzQk0xMcN AwMrBg4owThBtvXC+1FlDael7nASpaucJLbUYK0wdS78ezL3yiodY+CrvaUGWIutfbUGpvSAUbk IbWW3s6qJtccMQulg6pblsFcVNwAI4RV3oJZEQDXjetMsU7rQzQqsGMrPbp1CjXyC/4qQQ== X-Google-Smtp-Source: AGHT+IEDBweUf1RX4JLXD/LRo3qSZIMBSzD1oMaQFj1VMMw7TkppHlU9kuzwBExSMjpAe+JPON759w== X-Received: by 2002:a05:600c:1c8e:b0:43d:3df:42d8 with SMTP id 5b1f17b1804b1-441c48af178mr60746885e9.6.1746455437828; Mon, 05 May 2025 07:30:37 -0700 (PDT) Received: from boomer.zia ([62.74.17.219]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-441b2ad76a2sm181418895e9.6.2025.05.05.07.30.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 May 2025 07:30:37 -0700 (PDT) From: Stephane Zermatten To: bug-gnu-emacs@gnu.org Subject: [PATCH 1/3] Ignore OSC sequences in term instead of printing them X-Debbugs-Cc: Dan Nicolaescu , Per Bothner Date: Mon, 05 May 2025 17:30:35 +0300 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=2a00:1450:4864:20::331; envelope-from=szermatt@gmail.com; helo=mail-wm1-x331.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, 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-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Mon, 05 May 2025 11:20:21 -0400 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 (/) --=-=-= Content-Type: text/plain Tags: patch This change detects OSC sequences and ignores them. This is what's normally expected and avoids strange outputs. Starting with version 4, the fish shell has started sending out OSC sequences by default, which looks pretty bad on term. This change avoids this particular problem. This is PATCH 1/3, because I'd like to propose making it possible to handle OSC sequences in term in follow-up changes. Emacs already has handlers for OSC sequences in ansi-osc, why not make use of them? In GNU Emacs 31.0.50 (build 5, x86_64-apple-darwin23.6.0, NS appkit-2487.70 Version 14.7.5 (Build 23H527)) of 2025-05-02 built on boomer.zia Repository revision: 99ca41b6ef300653a0d15b73a0c0d446a9a9e059 Repository branch: master Windowing system distributor 'Apple', version 10.3.2487 System Description: macOS 14.7.5 Configured using: 'configure --program-suffix=-head --with-tree-sitter --with-native-compilation=aot' --=-=-= Content-Type: text/patch Content-Disposition: attachment; filename=0001-Ignore-OSC-sequences-in-term-instead-of-printing-the.patch >From 818736960d03ea8be254f81e5267e54c9ad27806 Mon Sep 17 00:00:00 2001 From: Stephane Zermatten Date: Sat, 3 May 2025 00:03:12 +0300 Subject: [PATCH 1/3] Ignore OSC sequences in term instead of printing them Terminals are expected to just skip unknown OSC sequences. Doing this avoids strange output, for example when fish4 is run inside of term. * lisp/term.el (term-emulate-terminal) skip OSC sequences --- lisp/term.el | 17 +++++++++++++++++ test/lisp/term-tests.el | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/lisp/term.el b/lisp/term.el index a971300c055..fa609058d77 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -3030,6 +3030,10 @@ term-control-seq-regexp "\e\\(?:[DM78c]\\|" ;; another Emacs specific control sequence, "AnSiT[^\n]+\n\\|" + ;; OSC (see [ECMA-48] section 8.3.89 "Operation System Command") In + ;; addition to the range defined there, this regexp allows non-ascii + ;; (UTF-8) characters. + "\\][^\x00-\x07\x0e-\x1f\x7f]*\\(?:\a\\|\e\\\\\\)?\\|" ;; or an escape sequence (section 5.4 "Control Sequences"), "\\[\\([\x30-\x3F]*\\)[\x20-\x2F]*[\x40-\x7E]\\)\\)") "Regexp matching control sequences handled by term.el.") @@ -3232,6 +3236,19 @@ term-emulate-terminal (split-string ctl-params ";")) (aref str (1- ctl-end)) private)))) + (?\] ;; An OSC sequence that's just skipped for now + (when (and + (>= ctl-end str-length) + (not + (or (eq ?\a (aref str (1- ctl-end))) + (string= + "\e\\" + (substring + str (max i (- ctl-end 2)) ctl-end))))) + ;; Continue ignoring until the end marker. + (setq term-terminal-undecoded-bytes "\e]")) + ;; Consume everything + (setq i ctl-end)) (?D ;; Scroll forward (apparently not documented in ;; [ECMA-48], [ctlseqs] mentions it as C1 ;; character "Index" though). diff --git a/test/lisp/term-tests.el b/test/lisp/term-tests.el index ffb341f3b52..f70245c6af3 100644 --- a/test/lisp/term-tests.el +++ b/test/lisp/term-tests.el @@ -419,6 +419,37 @@ term-undecodable-input (term-test-screen-from-input 40 1 bytes))))) +(ert-deftest term-ignore-osc() + ;; BEL-terminated OSC sequence + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;window title\ast"))) + ;; ESC \-terminated OSC sequence + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;window title\e\\st"))) + ;; Long OSC sequence split into multiple chunks + (should (equal "test" + (term-test-screen-from-input + 40 1 '("te\e]0;win" "dow " " title\ast")))) + ;; OSC sequence that start and ends with the chunk + (should (equal "test" + (term-test-screen-from-input + 40 1 '("te" "\e]0;window " "title\a" "st")))) + + ;; Invalid control characters break out of the OSC sequence, for + ;; safety. + (should (equal "tetitlest" + (term-test-screen-from-input + 40 1 '("te\e]0;window\x05title\ast")))) + + (let ((locale-coding-system 'utf-8-unix)) + ;; An OSC sequence with multibyte UTF-8 characters. Not exactly + ;; standard-compliant, but too common not to support. + (should (equal "test" + (term-test-screen-from-input + 40 1 "te\e]0;\xce\xb1\xce\xb2\e\\st"))))) + (provide 'term-tests) ;;; term-tests.el ends here -- 2.47.0 --=-=-=-- ------------=_1749717662-24399-1--