From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Barry OReilly Newsgroups: gmane.emacs.bugs Subject: bug#17235: Undo in region adjusts past positions incorrectly Date: Wed, 23 Apr 2014 12:20:29 -0400 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=047d7bd6c5e881e97904f7b81c96 X-Trace: ger.gmane.org 1398270091 9205 80.91.229.3 (23 Apr 2014 16:21:31 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 23 Apr 2014 16:21:31 +0000 (UTC) Cc: 17235@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Apr 23 18:21:24 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WczvH-0004rr-WA for geb-bug-gnu-emacs@m.gmane.org; Wed, 23 Apr 2014 18:21:24 +0200 Original-Received: from localhost ([::1]:33723 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WczvH-0002M2-I8 for geb-bug-gnu-emacs@m.gmane.org; Wed, 23 Apr 2014 12:21:23 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46717) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wczv3-00027J-3d for bug-gnu-emacs@gnu.org; Wed, 23 Apr 2014 12:21:15 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wczuw-0002cY-MU for bug-gnu-emacs@gnu.org; Wed, 23 Apr 2014 12:21:08 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:48161) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wczuw-0002cU-HQ for bug-gnu-emacs@gnu.org; Wed, 23 Apr 2014 12:21:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Wczuv-0001hD-TX for bug-gnu-emacs@gnu.org; Wed, 23 Apr 2014 12:21:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Barry OReilly Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 23 Apr 2014 16:21:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17235 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 17235-submit@debbugs.gnu.org id=B17235.13982700386442 (code B ref 17235); Wed, 23 Apr 2014 16:21:01 +0000 Original-Received: (at 17235) by debbugs.gnu.org; 23 Apr 2014 16:20:38 +0000 Original-Received: from localhost ([127.0.0.1]:56315 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WczuU-0001fm-St for submit@debbugs.gnu.org; Wed, 23 Apr 2014 12:20:36 -0400 Original-Received: from mail-ob0-f169.google.com ([209.85.214.169]:43188) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WczuR-0001fb-SB for 17235@debbugs.gnu.org; Wed, 23 Apr 2014 12:20:33 -0400 Original-Received: by mail-ob0-f169.google.com with SMTP id uz6so1298611obc.0 for <17235@debbugs.gnu.org>; Wed, 23 Apr 2014 09:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=TV/2QzU1uHSjI5ekETKQ8394ri6l+QnFGb3kPlYVDGc=; b=T8UeXNQxg075ZLhbkUIhamTFlbU0Q045Sn9QJBKN36afIxsd20SURm179lv8g0CfIx gX6ZaYuX9PFJvVMdVPn7toRUXSEY/AjxUxOzMhgZvNgDddLqv9F+pCXrIpyw223A8vLF t1elvAKfZuzy3GGy78ZpCpTv6RTMacMkB5p8W+q9OTBimIm0z4ARjQIQlkGzah/DC7yh A2YR0lHHWaNeTz6w3wT6QFTx13HjT9BTN0UkHsrZBHPIaxELJI+77D4Fo8r3eZ0zDS8H 4tsHQVfWKIfJqnng/aGyzpDfQV9JePHCwbEm3jv2BIDzWsM5bQM7A1svUXemUM1l61gc WuPw== X-Received: by 10.60.157.202 with SMTP id wo10mr43811196oeb.9.1398270031013; Wed, 23 Apr 2014 09:20:31 -0700 (PDT) Original-Received: by 10.76.6.44 with HTTP; Wed, 23 Apr 2014 09:20:29 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:88259 Archived-At: --047d7bd6c5e881e97904f7b81c96 Content-Type: text/plain; charset=UTF-8 > While looking at that code, can you make that "make-selective-list" > skip redo entries (depending on undo-no-redo, obviously), using the > undo-equiv-table? IOW bug 16411? The reason I was looking at this code was because of that bug. I plan to return to it soon and put my proposition there into code. > I think the algorithm would be simpler to make correct if > adjustments are applied forward chronologically rather than > backwards. That is, the algorithm keeps a list of undo-deltas that > grows as the algorithm iterates backwards through undo history. As > it does so, the positions are adjusted chronologically forward > through the undo-deltas. This approach is O(N**2), as the current > algorithm also is, but the bright side is the proposed algorithm > lends itself to short circuiting better than the current. I attached the patch implementing this. The new undo-test-region-deletion test implements the recipe of this bug report. It fails with the current undo-make-selective-list code, passes with the new. Do you recall why the code ceases to make the selective list when an element cross the region? I did not think of a good reason so I dropped that behavior in favor of deeming the element out of region and continuing. I also attached undo-play.el which I used to benchmark undo-make-selective-list. It basically fills up undo history with small edits and then undos in region of an element on the verge of truncation. The old undo-make-selective-list is about 213ms and the new is 72ms. Since the new code performs better, I didn't make the list lazy. If I did, it would have been as a closure that returns the next element with adjusted positions, or possibly the next change group. I may yet do that as a part of bug 16411, as discussed there. --047d7bd6c5e881e97904f7b81c96 Content-Type: text/plain; charset=US-ASCII; name="undo-in-region.diff" Content-Disposition: attachment; filename="undo-in-region.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: file0 ZGlmZiAtLWdpdCBhL2xpc3Avc2ltcGxlLmVsIGIvbGlzcC9zaW1wbGUuZWwKaW5kZXggMGFmMTUy Ni4uMGQzMGNhOSAxMDA2NDQKLS0tIGEvbGlzcC9zaW1wbGUuZWwKKysrIGIvbGlzcC9zaW1wbGUu ZWwKQEAgLTIzNjAsOTEgKzIzNjAsMTExIEBAIGFyZSBpZ25vcmVkLiAgSWYgQkVHIGFuZCBFTkQg YXJlIG5pbCwgYWxsIHVuZG8gZWxlbWVudHMgYXJlIHVzZWQuIgogCSAgICAodW5kby1tYWtlLXNl bGVjdGl2ZS1saXN0IChtaW4gYmVnIGVuZCkgKG1heCBiZWcgZW5kKSkKIAkgIGJ1ZmZlci11bmRv LWxpc3QpKSkKIAorOzsgVGhlIHBvc2l0aW9ucyBnaXZlbiBpbiBlbGVtZW50cyBvZiB0aGUgdW5k byBsaXN0IGFyZSB0aGUgcG9zaXRpb25zCis7OyBhcyBvZiB0aGUgdGltZSB0aGF0IGVsZW1lbnQg d2FzIHJlY29yZGVkIHRvIHVuZG8gaGlzdG9yeS4gSW4KKzs7IGdlbmVyYWwsIHN1YnNlcXVlbnQg YnVmZmVyIGVkaXRzIHJlbmRlciB0aG9zZSBwb3NpdGlvbnMgaW52YWxpZCBpbgorOzsgdGhlIGN1 cnJlbnQgYnVmZmVyLCB1bmxlc3MgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcnZlbmlu ZworOzsgdW5kbyBlbGVtZW50cy4KKzs7Cis7OyBVbmRvIGluIHJlZ2lvbiBpcyBhIHVzZSBjYXNl IHRoYXQgcmVxdWlyZXMgYWRqdXN0bWVudHMgdG8gdW5kbworOzsgZWxlbWVudHMuIEl0IG11c3Qg YWRqdXN0IHBvc2l0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgcmVnaW9uIGJhc2VkCis7OyBvbiBu ZXdlciBlbGVtZW50cyBub3QgaW4gdGhlIHJlZ2lvbiBzbyBhcyB0aGV5IG1heSBiZSBjb3JyZWN0 bHkKKzs7IGFwcGxpZWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiB1bmRvLW1ha2Utc2VsZWN0aXZl LWxpc3QKKzs7IGFjY29tcGxpc2hlcyB0aGlzIHdpdGggaXRzIHVuZG8tZGVsdGFzIGxpc3Qgb2Yg YWRqdXN0bWVudHMuIEFuCis7OyBleGFtcGxlIHVuZG8gaGlzdG9yeSBmcm9tIG9sZGVzdCB0byBu ZXdlc3Q6Cis7OworOzsgYnVmIHBvczoKKzs7IDEyMzQ1Njc4OSBidWZmZXItdW5kby1saXN0ICB1 bmRvLWRlbHRhcworOzsgLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tCis7 OyBhYWEgICAgICAgKDEgLiA0KSAgICAgICAgICAgKDEgLiAtMykKKzs7IGFhYmEgICAgICAoMyAu IDQpICAgICAgICAgICBOL0EgKGluIHJlZ2lvbikKKzs7IGNjYWFiYSAgICAoMSAuIDMpICAgICAg ICAgICAoMSAuIC0yKQorOzsgY2NhYWJhZGRkICg3IC4gMTApICAgICAgICAgICg3IC4gLTMpCis7 OyBjY2FhYmRkICAgKCJhZCIgLiA2KSAgICAgICAgKDYgLiAyKQorOzsgY2NhYWJhZGRkICg2IC4g OCkgICAgICAgICAgICg2IC4gLTIpCis7OyAgfCAgIHw8LS0gcmVnaW9uOiAiY2FhYiIsIGZyb20g MiB0byA2Cis7OworOzsgV2hlbiB0aGUgdXNlciBzdGFydHMgYSBydW4gb2YgdW5kb3MgaW4gcmVn aW9uLAorOzsgdW5kby1tYWtlLXNlbGVjdGl2ZS1saXN0IGlzIGNhbGxlZCB0byBjcmVhdGUgdGhl IGZ1bGwgbGlzdCBvZiBpbgorOzsgcmVnaW9uIGVsZW1lbnRzLiBFYWNoIGVsZW1lbnQgaXMgYWRq dXN0ZWQgZm9yd2FyZCBjaHJvbm9sb2dpY2FsbHkKKzs7IHRocm91Z2ggdW5kby1kZWx0YXMgdG8g ZGV0ZXJtaW5lIGlmIGl0IGlzIGluIHRoZSByZWdpb24uCis7OworOzsgSW4gdGhlIGFib3ZlIGV4 YW1wbGUsIHRoZSBpbnNlcnRpb24gb2YgImIiIGlzICgzIC4gNCkgaW4gdGhlCis7OyBidWZmZXIt dW5kby1saXN0LiBUaGUgdW5kby1kZWx0YSAoMSAuIC0yKSBjYXVzZXMgKDMgLiA0KSB0byBiZWNv bWUKKzs7ICg1IC4gNikuIFRoZSBuZXh0IHRocmVlIHVuZG8tZGVsdGFzIGNhdXNlIG5vIGFkanVz dG1lbnQsIHNvICg1IC4gNikKKzs7IGlzIGFzc2Vzc2VkIGFzIGluIHRoZSByZWdpb24gYW5kIHBs YWNlZCBpbiB0aGUgc2VsZWN0aXZlCis7OyBsaXN0LiBOb3RhYmx5LCB0aGUgZW5kIG9mIHJlZ2lv biBpdHNlbGYgYWRqdXN0cyBmcm9tICIyIHRvIDYiIHRvICIyCis7OyB0byA1IiBkdWUgdG8gdGhl IHNlbGVjdGVkIGVsZW1lbnQuIFRoZSAiYiIgaW5zZXJ0aW9uIGlzIHRoZSBvbmx5Cis7OyBlbGVt ZW50IGZ1bGx5IGluIHRoZSByZWdpb24sIHNvIGluIHRoaXMgZXhhbXBsZQorOzsgdW5kby1tYWtl LXNlbGVjdGl2ZS1saXN0IHJldHVybnMgKG5pbCAoNSAuIDYpKS4KKzs7Cis7OyBUaGUgYWRqdXN0 bWVudCBvZiB0aGUgKDcgLiAxMCkgaW5zZXJ0aW9uIG9mICJkZGQiIHNob3dzIGFuIGVkZ2UKKzs7 IGNhc2UuIE5vcm1hbGx5IGFuIHVuZG8tZGVsdGEgb2YgKDYgLiAyKSB3b3VsZCBjYXVzZSBwb3Np dGlvbnMgYWZ0ZXIKKzs7IDYgdG8gYWRqdXN0IGJ5IDIuIEhvd2V2ZXIsIHRoZXkgc2hvdWxkbid0 IGFkanVzdCB0byBsZXNzIHRoYW4gNiwgc28KKzs7ICg3IC4gMTApIGFkanVzdHMgdG8gKDYgLiA4 KSBkdWUgdG8gdGhpcyBwYXJ0aWN1bGFyIHVuZG8gZGVsdGEuCis7OworOzsgTW9yZSBpbnRlcmVz dGluZyBpcyBob3cgdG8gYWRqdXN0IHRoZSAiZGRkIiBpbnNlcnRpb24gZHVlIHRvIHRoZQorOzsg bmV4dCB1bmRvLWRlbHRhOiAoNiAuIC0yKS4gSWYgdGhlIHJlaW5zZXJ0aW9uIG9mICJhZCIgd2Fz IGFuIHVuZG8sCis7OyBpdCBpcyBtb3N0IHNlbnNpY2FsIHRoYXQgdGhlIHRvdGFsICJkZGQiIGlu c2VydGlvbiBhZGp1c3RtZW50IGJlICg3Cis7OyAuIDEwKSAtPiAoNiAuIDgpIC0+ICg3IC4gMTAp LiBIb3dldmVyLCBpZiB0aGUgcmVpbnNlcnRpb24gd2FzIGEKKzs7IG5vcm1hbCB1c2VyIGVkaXQs IHRoZW4gbW9zdCBzZW5zaWNhbCBpczogKDcgLiAxMCkgLT4gKDYgLiA4KSAtPiAoOAorOzsgLiAx MCkuIFRoZSB1bmRvIGhpc3RvcnkgaXMgYW1iaWd1b3VzIGFib3V0IHdoaWNoLgorOzsKKzs7IHVu ZG8tbWFrZS1zZWxlY3RpdmUtbGlzdCBhc3N1bWVzIGluIHRoaXMgc2l0dWF0aW9uIHRoYXQgImFk IiB3YXMgYQorOzsgbmV3IGVkaXQuIFRoaXMgbWVhbnMgdGhlIHVuZG8gc3lzdGVtIGNvbnNpZGVy cyB0aGVyZSB0byBiZSBhCis7OyBkZWxldGVkICJhZCIgYXQgcG9zaXRpb24gOCBvZiBidWZmZXIg Y29udGVudCAiY2NhYWJhZGRkIi4gSWYgdGhlCis7OyB1c2VyIHVuZG9zIGluIHJlZ2lvbiAiNyB0 byA5IiwgdGhleSBjb3VsZCBiZSBzdXJwcmlzZWQgdG8gZ2V0Cis7OyBidWZmZXIgY29udGVudDog ImNjYWFiYWRhZGRkIiAuIFRoaXMgaXMgYSBGSVhNRS4gQnVnIDE2NDExCis7OyBkZXNjcmliZXMg dGhlIHBvc3NpYmlsaXR5IG9mIHVuZG8gZWxlbWVudHMgcmVmZXJlbmNpbmcgd2hhdCB0aGV5Cis7 OyB1bmRpZCwgYW5kIHNvIHJlc29sdmluZyB0aGUgcHJvYmxlbWF0aWMgYW1iaWd1aXR5LgorCiAo ZGVmdW4gdW5kby1tYWtlLXNlbGVjdGl2ZS1saXN0IChzdGFydCBlbmQpCiAgICJSZXR1cm4gYSBs aXN0IG9mIHVuZG8gZWxlbWVudHMgZm9yIHRoZSByZWdpb24gU1RBUlQgdG8gRU5ELgotVGhlIGVs ZW1lbnRzIGNvbWUgZnJvbSBgYnVmZmVyLXVuZG8tbGlzdCcsIGJ1dCB3ZSBrZWVwIG9ubHkKLXRo ZSBlbGVtZW50cyBpbnNpZGUgdGhpcyByZWdpb24sIGFuZCBkaXNjYXJkIHRob3NlIG91dHNpZGUg dGhpcyByZWdpb24uCi1JZiB3ZSBmaW5kIGFuIGVsZW1lbnQgdGhhdCBjcm9zc2VzIGFuIGVkZ2Ug b2YgdGhpcyByZWdpb24sCi13ZSBzdG9wIGFuZCBpZ25vcmUgYWxsIGZ1cnRoZXIgZWxlbWVudHMu IgotICAobGV0ICgodW5kby1saXN0LWNvcHkgKHVuZG8tY29weS1saXN0IGJ1ZmZlci11bmRvLWxp c3QpKQotCSh1bmRvLWxpc3QgKGxpc3QgbmlsKSkKLQlzb21lLXJlamVjdGVkCi0JdW5kby1lbHQg dGVtcC11bmRvLWxpc3QgZGVsdGEpCi0gICAgKHdoaWxlIHVuZG8tbGlzdC1jb3B5Ci0gICAgICAo c2V0cSB1bmRvLWVsdCAoY2FyIHVuZG8tbGlzdC1jb3B5KSkKLSAgICAgIChsZXQgKChrZWVwLXRo aXMKLQkgICAgIChjb25kICgoYW5kIChjb25zcCB1bmRvLWVsdCkgKGVxIChjYXIgdW5kby1lbHQp IHQpKQotCQkgICAgOzsgVGhpcyBpcyBhICJ3YXMgdW5tb2RpZmllZCIgZWxlbWVudC4KLQkJICAg IDs7IEtlZXAgaXQgaWYgd2UgaGF2ZSBrZXB0IGV2ZXJ5dGhpbmcgdGh1cyBmYXIuCi0JCSAgICAo bm90IHNvbWUtcmVqZWN0ZWQpKQotICAgICAgICAgICAgICAgICAgIDs7IFNraXAgb3ZlciBtYXJr ZXIgYWRqdXN0bWVudHMsIGluc3RlYWQgcmVseWluZyBvbgotICAgICAgICAgICAgICAgICAgIDs7 IGZpbmRpbmcgdGhlbSBhZnRlciAoVEVYVCAuIFBPUykgZWxlbWVudHMKLSAgICAgICAgICAgICAg ICAgICAoKG1hcmtlcnAgKGNhci1zYWZlIHVuZG8tZWx0KSkKLSAgICAgICAgICAgICAgICAgICAg bmlsKQotCQkgICAodAotCQkgICAgKHVuZG8tZWx0LWluLXJlZ2lvbiB1bmRvLWVsdCBzdGFydCBl bmQpKSkpKQotCShpZiBrZWVwLXRoaXMKLQkgICAgKHByb2duCi0JICAgICAgKHNldHEgZW5kICgr IGVuZCAoY2RyICh1bmRvLWRlbHRhIHVuZG8tZWx0KSkpKQotCSAgICAgIDs7IERvbid0IHB1dCB0 d28gbmlscyB0b2dldGhlciBpbiB0aGUgbGlzdAotCSAgICAgICh3aGVuIChub3QgKGFuZCAoZXEg KGNhciB1bmRvLWxpc3QpIG5pbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcSB1 bmRvLWVsdCBuaWwpKSkKLSAgICAgICAgICAgICAgICAoc2V0cSB1bmRvLWxpc3QgKGNvbnMgdW5k by1lbHQgdW5kby1saXN0KSkKLSAgICAgICAgICAgICAgICA7OyBJZiAoVEVYVCAuIFBPUyksICJr ZWVwIiBpdHMgc3Vic2VxdWVudCAoTUFSS0VSCi0gICAgICAgICAgICAgICAgOzsgLiBBREpVU1RN RU5UKSB3aG9zZSBtYXJrZXJzIGhhdmVuJ3QgbW92ZWQuCi0gICAgICAgICAgICAgICAgKHdoZW4g KGFuZCAoc3RyaW5ncCAoY2FyLXNhZmUgdW5kby1lbHQpKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGludGVnZXJwIChjZHItc2FmZSB1bmRvLWVsdCkpKQotICAgICAgICAgICAgICAgICAg KGxldCAoKGxpc3QtaSAoY2RyIHVuZG8tbGlzdC1jb3B5KSkpCitUaGUgZWxlbWVudHMgY29tZSBm cm9tIGBidWZmZXItdW5kby1saXN0JywgYnV0IHdlIGtlZXAgb25seSB0aGUKK2VsZW1lbnRzIGlu c2lkZSB0aGlzIHJlZ2lvbiwgYW5kIGRpc2NhcmQgdGhvc2Ugb3V0c2lkZSB0aGlzCityZWdpb24u IFRoZSBlbGVtZW50cycgcG9zaXRpb25zIGFyZSBhZGp1c3RlZCBzbyBhcyB0aGUgcmV0dXJuZWQK K2xpc3QgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLiIKKyAgKGxldCAoKHVs aXN0IGJ1ZmZlci11bmRvLWxpc3QpCisgICAgICAgIDs7IEEgbGlzdCBvZiBwb3NpdGlvbiBhZGp1 c3RlZCB1bmRvIGVsZW1lbnRzIGluIHRoZSByZWdpb24uCisgICAgICAgIChzZWxlY3RpdmUtbGlz dCAobGlzdCBuaWwpKQorICAgICAgICA7OyBBIGxpc3Qgb2YgdW5kby1kZWx0YXMgZm9yIG91dCBv ZiByZWdpb24gdW5kbyBlbGVtZW50cy4KKyAgICAgICAgdW5kby1kZWx0YXMKKyAgICAgICAgdW5k by1lbHQpCisgICAgKHdoaWxlIHVsaXN0CisgICAgICAoc2V0cSB1bmRvLWVsdCAoY2FyIHVsaXN0 KSkKKyAgICAgIChjb25kCisgICAgICAgKChudWxsIHVuZG8tZWx0KQorICAgICAgICA7OyBEb24n dCBwdXQgdHdvIG5pbHMgdG9nZXRoZXIgaW4gdGhlIGxpc3QKKyAgICAgICAgKHdoZW4gKGNhciBz ZWxlY3RpdmUtbGlzdCkKKyAgICAgICAgICAocHVzaCBuaWwgc2VsZWN0aXZlLWxpc3QpKSkKKyAg ICAgICAoKGFuZCAoY29uc3AgdW5kby1lbHQpIChlcSAoY2FyIHVuZG8tZWx0KSB0KSkKKyAgICAg ICAgOzsgVGhpcyBpcyBhICJ3YXMgdW5tb2RpZmllZCIgZWxlbWVudC4gIEtlZXAgaXQKKyAgICAg ICAgOzsgaWYgd2UgaGF2ZSBrZXB0IGV2ZXJ5dGhpbmcgdGh1cyBmYXIuCisgICAgICAgICh3aGVu IChub3QgdW5kby1kZWx0YXMpCisgICAgICAgICAgKHB1c2ggdW5kby1lbHQgc2VsZWN0aXZlLWxp c3QpKSkKKyAgICAgICA7OyBTa2lwIG92ZXIgbWFya2VyIGFkanVzdG1lbnRzLCBpbnN0ZWFkIHJl bHlpbmcKKyAgICAgICA7OyBvbiBmaW5kaW5nIHRoZW0gYWZ0ZXIgKFRFWFQgLiBQT1MpIGVsZW1l bnRzCisgICAgICAgKChtYXJrZXJwIChjYXItc2FmZSB1bmRvLWVsdCkpCisgICAgICAgIG5pbCkK KyAgICAgICAodAorICAgICAgICAobGV0ICgoYWRqdXN0ZWQtdW5kby1lbHQgKHVuZG8tYWRqdXN0 LWVsdCB1bmRvLWVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1bmRvLWRlbHRhcykpKQorICAgICAgICAgIChpZiAodW5kby1lbHQtaW4tcmVnaW9u IGFkanVzdGVkLXVuZG8tZWx0IHN0YXJ0IGVuZCkKKyAgICAgICAgICAgICAgKHByb2duCisgICAg ICAgICAgICAgICAgKHNldHEgZW5kICgrIGVuZCAoY2RyICh1bmRvLWRlbHRhIGFkanVzdGVkLXVu ZG8tZWx0KSkpKQorICAgICAgICAgICAgICAgIChwdXNoIGFkanVzdGVkLXVuZG8tZWx0IHNlbGVj dGl2ZS1saXN0KQorICAgICAgICAgICAgICAgIDs7IEtlZXAgKE1BUktFUiAuIEFESlVTVE1FTlQp IGlmIHRoZWlyIChURVhUIC4gUE9TKSB3YXMKKyAgICAgICAgICAgICAgICA7OyBrZXB0LiBwcmlt aXRpdmUtdW5kbyBtYXkgZGlzY2FyZCB0aGVtIGxhdGVyLgorICAgICAgICAgICAgICAgICh3aGVu IChhbmQgKHN0cmluZ3AgKGNhci1zYWZlIGFkanVzdGVkLXVuZG8tZWx0KSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIChpbnRlZ2VycCAoY2RyLXNhZmUgYWRqdXN0ZWQtdW5kby1lbHQpKSkK KyAgICAgICAgICAgICAgICAgIChsZXQgKChsaXN0LWkgKGNkciB1bGlzdCkpKQogICAgICAgICAg ICAgICAgICAgICAod2hpbGUgKG1hcmtlcnAgKGNhci1zYWZlIChjYXIgbGlzdC1pKSkpCi0gICAg ICAgICAgICAgICAgICAgICAgKGxldCogKChhZGotZWx0IChwb3AgbGlzdC1pKSkKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKG0gKGNhciBhZGotZWx0KSkpCi0gICAgICAgICAgICAgICAg ICAgICAgICAoYW5kIChlcSAobWFya2VyLWJ1ZmZlciBtKSAoY3VycmVudC1idWZmZXIpKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoPSAoY2RyIHVuZG8tZWx0KSBtKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAocHVzaCBhZGotZWx0IHVuZG8tbGlzdCkpKSkpKSkpCi0JICAo aWYgKHVuZG8tZWx0LWNyb3NzZXMtcmVnaW9uIHVuZG8tZWx0IHN0YXJ0IGVuZCkKLQkgICAgICAo c2V0cSB1bmRvLWxpc3QtY29weSBuaWwpCi0JICAgIChzZXRxIHNvbWUtcmVqZWN0ZWQgdCkKLQkg ICAgKHNldHEgdGVtcC11bmRvLWxpc3QgKGNkciB1bmRvLWxpc3QtY29weSkpCi0JICAgIChzZXRx IGRlbHRhICh1bmRvLWRlbHRhIHVuZG8tZWx0KSkKLQotCSAgICAod2hlbiAoLz0gKGNkciBkZWx0 YSkgMCkKLQkgICAgICAobGV0ICgocG9zaXRpb24gKGNhciBkZWx0YSkpCi0JCSAgICAob2Zmc2V0 IChjZHIgZGVsdGEpKSkKLQotCQk7OyBMb29wIGRvd24gdGhlIGVhcmxpZXIgZXZlbnRzIGFkanVz dGluZyB0aGVpciBidWZmZXIKLQkJOzsgcG9zaXRpb25zIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhh dCBhIGNoYW5nZSB0byB0aGUgYnVmZmVyCi0JCTs7IGlzbid0IGJlaW5nIHVuZG9uZS4gV2Ugb25s eSBuZWVkIHRvIHByb2Nlc3MgdGhvc2UgZWxlbWVudAotCQk7OyB0eXBlcyB3aGljaCB1bmRvLWVs dC1pbi1yZWdpb24gd2lsbCByZXR1cm4gYXMgYmVpbmcgaW4KLQkJOzsgdGhlIHJlZ2lvbiBzaW5j ZSBvbmx5IHRob3NlIHR5cGVzIGNhbiBldmVyIGdldCBpbnRvIHRoZQotCQk7OyBvdXRwdXQKLQot CQkod2hpbGUgdGVtcC11bmRvLWxpc3QKLQkJICAoc2V0cSB1bmRvLWVsdCAoY2FyIHRlbXAtdW5k by1saXN0KSkKLQkJICAoY29uZCAoKGludGVnZXJwIHVuZG8tZWx0KQotCQkJIChpZiAoPj0gdW5k by1lbHQgcG9zaXRpb24pCi0JCQkgICAgIChzZXRjYXIgdGVtcC11bmRvLWxpc3QgKC0gdW5kby1l bHQgb2Zmc2V0KSkpKQotCQkJKChhdG9tIHVuZG8tZWx0KSBuaWwpCi0JCQkoKHN0cmluZ3AgKGNh ciB1bmRvLWVsdCkpCi0JCQkgOzsgKFRFWFQgLiBQT1NJVElPTikKLQkJCSAobGV0ICgodGV4dC1w b3MgKGFicyAoY2RyIHVuZG8tZWx0KSkpCi0JCQkgICAgICAgKHBvaW50LWF0LWVuZCAoPCAoY2Ry IHVuZG8tZWx0KSAwICkpKQotCQkJICAgKGlmICg+PSB0ZXh0LXBvcyBwb3NpdGlvbikKLQkJCSAg ICAgICAoc2V0Y2RyIHVuZG8tZWx0ICgqIChpZiBwb2ludC1hdC1lbmQgLTEgMSkKLQkJCQkJCSAg ICgtIHRleHQtcG9zIG9mZnNldCkpKSkpKQotCQkJKChpbnRlZ2VycCAoY2FyIHVuZG8tZWx0KSkK LQkJCSA7OyAoQkVHSU4gLiBFTkQpCi0JCQkgKHdoZW4gKD49IChjYXIgdW5kby1lbHQpIHBvc2l0 aW9uKQotCQkJICAgKHNldGNhciB1bmRvLWVsdCAoLSAoY2FyIHVuZG8tZWx0KSBvZmZzZXQpKQot CQkJICAgKHNldGNkciB1bmRvLWVsdCAoLSAoY2RyIHVuZG8tZWx0KSBvZmZzZXQpKSkpCi0JCQko KG51bGwgKGNhciB1bmRvLWVsdCkpCi0JCQkgOzsgKG5pbCBQUk9QRVJUWSBWQUxVRSBCRUcgLiBF TkQpCi0JCQkgKGxldCAoKHRhaWwgKG50aGNkciAzIHVuZG8tZWx0KSkpCi0JCQkgICAod2hlbiAo Pj0gKGNhciB0YWlsKSBwb3NpdGlvbikKLQkJCSAgICAgKHNldGNhciB0YWlsICgtIChjYXIgdGFp bCkgb2Zmc2V0KSkKLQkJCSAgICAgKHNldGNkciB0YWlsICgtIChjZHIgdGFpbCkgb2Zmc2V0KSkp KSkpCi0JCSAgKHNldHEgdGVtcC11bmRvLWxpc3QgKGNkciB0ZW1wLXVuZG8tbGlzdCkpKSkpKSkp Ci0gICAgICAoc2V0cSB1bmRvLWxpc3QtY29weSAoY2RyIHVuZG8tbGlzdC1jb3B5KSkpCi0gICAg KG5yZXZlcnNlIHVuZG8tbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICAgIChwdXNoIChwb3Ag bGlzdC1pKSBzZWxlY3RpdmUtbGlzdCkpKSkpCisgICAgICAgICAgICAobGV0ICgoZGVsdGEgKHVu ZG8tZGVsdGEgdW5kby1lbHQpKSkKKyAgICAgICAgICAgICAgKHdoZW4gKC89IDAgKGNkciBkZWx0 YSkpCisgICAgICAgICAgICAgICAgKHB1c2ggZGVsdGEgdW5kby1kZWx0YXMpKSkpKSkpCisgICAg ICAocG9wIHVsaXN0KSkKKyAgICAobnJldmVyc2Ugc2VsZWN0aXZlLWxpc3QpKSkKIAogKGRlZnVu IHVuZG8tZWx0LWluLXJlZ2lvbiAodW5kby1lbHQgc3RhcnQgZW5kKQogICAiRGV0ZXJtaW5lIHdo ZXRoZXIgVU5ETy1FTFQgZmFsbHMgaW5zaWRlIHRoZSByZWdpb24gU1RBUlQgLi4uIEVORC4KQEAg LTI0OTIsNiArMjUxMiw0MiBAQCBpcyBub3QgKmluc2lkZSogdGhlIHJlZ2lvbiBTVEFSVC4uLkVO RC4iCiAJIDs7IChCRUdJTiAuIEVORCkKIAkgKGFuZCAoPCAoY2FyIHVuZG8tZWx0KSBlbmQpCiAJ ICAgICAgKD4gKGNkciB1bmRvLWVsdCkgc3RhcnQpKSkpKQorKG1ha2Utb2Jzb2xldGUgJ3VuZG8t ZWx0LWNyb3NzZXMtcmVnaW9uIG5pbCAiMjQuNSIpCisKKyhkZWZ1biB1bmRvLWFkanVzdC1lbHQg KGVsdCBkZWx0YXMpCisgICJSZXR1cm4gYWRqdXN0bWVudCBvZiB1bmRvIGVsZW1lbnQgRUxUIGJ5 IHRoZSB1bmRvIERFTFRBUworbGlzdC4iCisgIChwY2FzZSBlbHQKKyAgICA7OyBQT1NJVElPTgor ICAgICgocHJlZCBpbnRlZ2VycCkKKyAgICAgKHVuZG8tYWRqdXN0LXBvcyBlbHQgZGVsdGFzKSkK KyAgICA7OyAoQkVHIC4gRU5EKQorICAgIChgKCwoYW5kIGJlZyAocHJlZCBpbnRlZ2VycCkpIC4g LChhbmQgZW5kIChwcmVkIGludGVnZXJwKSkpCisgICAgIChjb25zICh1bmRvLWFkanVzdC1wb3Mg YmVnIGRlbHRhcykKKyAgICAgICAgICAgKHVuZG8tYWRqdXN0LXBvcyBlbmQgZGVsdGFzIHQpKSkK KyAgICA7OyAoVEVYVCAuIFBPU0lUSU9OKQorICAgIChgKCwoYW5kIHRleHQgKHByZWQgc3RyaW5n cCkpIC4gLChhbmQgcG9zIChwcmVkIGludGVnZXJwKSkpCisgICAgIChjb25zIHRleHQgKHVuZG8t YWRqdXN0LXBvcyBwb3MgZGVsdGFzKSkpCisgICAgOzsgKG5pbCBQUk9QRVJUWSBWQUxVRSBCRUcg LiBFTkQpCisgICAgKGAobmlsIC4gLChvciBgKCxwcm9wICx2YWwgLGJlZyAuICxlbmQpIHBjYXNl LS1kb250Y2FyZSkpCisgICAgIGAobmlsICxwcm9wICx2YWwgLCh1bmRvLWFkanVzdC1wb3MgYmVn IGRlbHRhcykgLiAsKHVuZG8tYWRqdXN0LXBvcyBlbmQgZGVsdGFzIHQpKSkKKyAgICA7OyAoYXBw bHkgREVMVEEgU1RBUlQgRU5EIEZVTiAuIEFSR1MpCisgICAgOzsgRklYTUU6IChQcmlvciB1bmRv IGluIHJlZ2lvbiBjb2RlIGRpZG4ndCBpbXBsZW1lbnQgdGhpcy4pCisgICAgOzsgQWxsIG90aGVy cyByZXR1cm4gc2FtZSBlbHQKKyAgICAoXyBlbHQpKSkKKworKGRlZnVuIHVuZG8tYWRqdXN0LXBv cyAocG9zIGRlbHRhcyAmb3B0aW9uYWwgdXNlLTwpCisgICJSZXR1cm4gYWRqdXN0bWVudCBvZiBQ T1MgYnkgdGhlIHVuZG8gREVMVEFTIGxpc3QsIGNvbXBhcmluZword2l0aCA8IG9yIDw9IGJhc2Vk IG9uIFVTRS08LiIKKyAgKGRvbGlzdCAoZCBkZWx0YXMgcG9zKQorICAgICh3aGVuIChpZiB1c2Ut PAorICAgICAgICAgICAgICAoPCAoY2FyIGQpIHBvcykKKyAgICAgICAgICAgICg8PSAoY2FyIGQp IHBvcykpCisgICAgICAoc2V0cSBwb3MKKyAgICAgICAgICAgIDs7IERvbid0IGFsbG93IHBvcyB0 byBiZWNvbWUgbGVzcyB0aGFuIHRoZSB1bmRvLWRlbHRhCisgICAgICAgICAgICA7OyBwb3NpdGlv bi4gVGhpcyBlZGdlIGNhc2UgaXMgZGVzY3JpYmVkIGluIHRoZSBvdmVydmlldworICAgICAgICAg ICAgOzsgY29tbWVudHMuCisgICAgICAgICAgICAobWF4IChjYXIgZCkgKC0gcG9zIChjZHIgZCkp KSkpKSkKIAogOzsgUmV0dXJuIHRoZSBmaXJzdCBhZmZlY3RlZCBidWZmZXIgcG9zaXRpb24gYW5k IHRoZSBkZWx0YSBmb3IgYW4gdW5kbyBlbGVtZW50CiA7OyBkZWx0YSBpcyBkZWZpbmVkIGFzIHRo ZSBjaGFuZ2UgaW4gc3Vic2VxdWVudCBidWZmZXIgcG9zaXRpb25zIGlmIHdlICpkaWQqCmRpZmYg LS1naXQgYS90ZXN0L2F1dG9tYXRlZC91bmRvLXRlc3RzLmVsIGIvdGVzdC9hdXRvbWF0ZWQvdW5k by10ZXN0cy5lbAppbmRleCA2ZWNhYzM2Li4xNzhlYWYxIDEwMDY0NAotLS0gYS90ZXN0L2F1dG9t YXRlZC91bmRvLXRlc3RzLmVsCisrKyBiL3Rlc3QvYXV0b21hdGVkL3VuZG8tdGVzdHMuZWwKQEAg LTIyNiw3ICsyMjYsNyBAQAogICAgICAgICAgICAgKHNob3VsZC1ub3QgKGJ1ZmZlci1tb2RpZmll ZC1wKSkpKQogICAgICAgKGRlbGV0ZS1maWxlIHRlbXBmaWxlKSkpKQogCi0oZXJ0LWRlZnRlc3Qg dW5kby10ZXN0LWluLXJlZ2lvbi1ub3QtbW9zdC1yZWNlbnQgKCkKKyhlcnQtZGVmdGVzdCB1bmRv LXRlc3QtcmVnaW9uLW5vdC1tb3N0LXJlY2VudCAoKQogICAiVGVzdCB1bmRvIGluIHJlZ2lvbiBv ZiBhbiBlZGl0IG5vdCB0aGUgbW9zdCByZWNlbnQuIgogICAod2l0aC10ZW1wLWJ1ZmZlcgogICAg IChidWZmZXItZW5hYmxlLXVuZG8pCkBAIC0yNDcsNyArMjQ3LDc4IEBACiAgICAgKHNob3VsZCAo c3RyaW5nPSAoYnVmZmVyLXN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICIxMTEzMSIpKSkp CiAKLShlcnQtZGVmdGVzdCB1bmRvLXRlc3QtaW4tcmVnaW9uLWVvYiAoKQorKGVydC1kZWZ0ZXN0 IHVuZG8tdGVzdC1yZWdpb24tZGVsZXRpb24gKCkKKyAgIlRlc3QgdW5kb2luZyBhIGRlbGV0aW9u IHRvIGRlbW9uc3RyYXRlIGJ1ZyAxNzIzNS4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGJ1 ZmZlci1lbmFibGUtdW5kbykKKyAgICAodHJhbnNpZW50LW1hcmstbW9kZSAxKQorICAgIChpbnNl cnQgIjEyMzQ1IikKKyAgICAoc2VhcmNoLWJhY2t3YXJkICI0IikKKyAgICAodW5kby1ib3VuZGFy eSkKKyAgICAoZGVsZXRlLWZvcndhcmQtY2hhciAxKQorICAgIChzZWFyY2gtYmFja3dhcmQgIjEi KQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChpbnNlcnQgInh4eHgiKQorICAgICh1bmRvLWJv dW5kYXJ5KQorICAgIChpbnNlcnQgInl5IikKKyAgICAoc2VhcmNoLWZvcndhcmQgIjM1IikKKyAg ICAodW5kby1ib3VuZGFyeSkKKyAgICA7OyBTZWxlY3QgIjM1IgorICAgIChwdXNoLW1hcmsgKHBv aW50KSB0IHQpCisgICAgKHNldHEgbWFyay1hY3RpdmUgdCkKKyAgICAoZm9yd2FyZC1jaGFyIC0y KQorICAgICh1bmRvKSA7IEV4cGVjdCAiNCIgdG8gY29tZSBiYWNrCisgICAgKHNob3VsZCAoc3Ry aW5nPSAoYnVmZmVyLXN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICJ4eHh4eXkxMjM0NSIp KSkpCisKKyhlcnQtZGVmdGVzdCB1bmRvLXRlc3QtcmVnaW9uLWV4YW1wbGUgKCkKKyAgIlRoZSBz YW1lIGV4YW1wbGUgdGVzdCBjYXNlIGRlc2NyaWJlZCBpbiBjb21tZW50cyBmb3IKK3VuZG8tbWFr ZS1zZWxlY3RpdmUtbGlzdC4iCisgIDs7IGJ1ZiBwb3M6CisgIDs7IDEyMzQ1Njc4OSBidWZmZXIt dW5kby1saXN0ICB1bmRvLWRlbHRhcworICA7OyAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAg LS0tLS0tLS0tLS0KKyAgOzsgYWFhICAgICAgICgxIC4gNCkgICAgICAgICAgICgxIC4gLTMpCisg IDs7IGFhYmEgICAgICAoMyAuIDQpICAgICAgICAgICBOL0EgKGluIHJlZ2lvbikKKyAgOzsgY2Nh YWJhICAgICgxIC4gMykgICAgICAgICAgICgxIC4gLTIpCisgIDs7IGNjYWFiYWRkZCAoNyAuIDEw KSAgICAgICAgICAoNyAuIC0zKQorICA7OyBjY2FhYmRkICAgKCJhZCIgLiA2KSAgICAgICAgKDYg LiAyKQorICA7OyBjY2FhYmFkZGQgKDYgLiA4KSAgICAgICAgICAgKDYgLiAtMikKKyAgOzsgIHwg ICB8PC0tIHJlZ2lvbjogImNhYWIiLCBmcm9tIDIgdG8gNgorICAod2l0aC10ZW1wLWJ1ZmZlcgor ICAgIChidWZmZXItZW5hYmxlLXVuZG8pCisgICAgKHRyYW5zaWVudC1tYXJrLW1vZGUgMSkKKyAg ICAoaW5zZXJ0ICJhYWEiKQorICAgIChnb3RvLWNoYXIgMykKKyAgICAodW5kby1ib3VuZGFyeSkK KyAgICAoaW5zZXJ0ICJiIikKKyAgICAoZ290by1jaGFyIDEpCisgICAgKHVuZG8tYm91bmRhcnkp CisgICAgKGluc2VydCAiY2MiKQorICAgIChnb3RvLWNoYXIgNykKKyAgICAodW5kby1ib3VuZGFy eSkKKyAgICAoaW5zZXJ0ICJkZGQiKQorICAgIChzZWFyY2gtYmFja3dhcmQgImFkIikKKyAgICAo dW5kby1ib3VuZGFyeSkKKyAgICAoZGVsZXRlLWZvcndhcmQtY2hhciAyKQorICAgICh1bmRvLWJv dW5kYXJ5KQorICAgIDs7IFNlbGVjdCAiZGQiCisgICAgKHB1c2gtbWFyayAocG9pbnQpIHQgdCkK KyAgICAoc2V0cSBtYXJrLWFjdGl2ZSB0KQorICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisg ICAgKHVuZG8pCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKHNob3VsZCAoc3RyaW5nPSAoYnVm ZmVyLXN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICJjY2FhYmFkZGQiKSkKKyAgICA7OyBT ZWxlY3QgImNhYWIiCisgICAgKHB1c2gtbWFyayAyIHQgdCkKKyAgICAoc2V0cSBtYXJrLWFjdGl2 ZSB0KQorICAgIChnb3RvLWNoYXIgNikKKyAgICAodW5kbykKKyAgICAodW5kby1ib3VuZGFyeSkK KyAgICAoc2hvdWxkIChzdHJpbmc9IChidWZmZXItc3RyaW5nKQorICAgICAgICAgICAgICAgICAg ICAgImNjYWFhZGRkIikpKSkKKworKGVydC1kZWZ0ZXN0IHVuZG8tdGVzdC1yZWdpb24tZW9iICgp CiAgICJUZXN0IHVuZG8gaW4gcmVnaW9uIG9mIGEgZGVsZXRpb24gYXQgRU9CLCBkZW1vbnN0cmF0 aW5nIGJ1ZyAxNjQxMS4iCiAgICh3aXRoLXRlbXAtYnVmZmVyCiAgICAgKGJ1ZmZlci1lbmFibGUt dW5kbykK --047d7bd6c5e881e97904f7b81c96 Content-Type: application/octet-stream; name="undo-play.el" Content-Disposition: attachment; filename="undo-play.el" Content-Transfer-Encoding: base64 X-Attachment-Id: file2 OzsgVG8gYmVuY2htYXJrIHVuZG8gaW4gcmVnaW9uOgo7OyAgIC0gb3BlbiAqc2NyYXRjaCoKOzsg ICAtIGNhbGwgcGxheS1pbnNlcnQKOzsgICAtIGVscC1pbnN0cnVtZW50LWZ1bmN0aW9uIHVuZG8t bWFrZS1zZWxlY3RpdmUtbGlzdAo7OyAgIC0gc2VsZWN0IHRoaXJkIGxpbmUKOzsgICAtIHVuZG8g aW4gcmVnaW9uIHR3aWNlCjs7ICAgLSBlbHAtcmVzdWx0cwo7Owo7OyBUaHJlZSB0cmlhbHMgd2l0 aCBvbGQgdW5kby1tYWtlLXNlbGVjdGl2ZS1saXN0IGNvZGU6Cjs7ICAgMC4yMjMwNCAwLjIwODE2 IDAuMjA3NjA3Cjs7Cjs7IFRocmVlIHRyaWFscyB3aXRoIG5ldyB1bmRvLW1ha2Utc2VsZWN0aXZl LWxpc3QgY29kZToKOzsgICAwLjA3MjAzMSAwLjA3MjA1MiAwLjA3MTg3NAoKKHJlcXVpcmUgJ2Ns LWxpYikKCjs7IERldGVybWluZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBuZWNlc3NhcnkgdG8gdHJ1 bmF0ZSAiYWFhIiBmcm9tIHVuZG8gaGlzdG9yeQooZGVmdW4gcGxheS1udW0taXRlcnMgKCkKICAo aW50ZXJhY3RpdmUpCiAgKHNhdmUtZXhjdXJzaW9uCiAgICAoZ290by1jaGFyIDE0MSkKICAgIChp bnNlcnQgImFhYSIpCiAgICAodW5kby1ib3VuZGFyeSkKICAgICh1bmRvKQogICAgKHVuZG8tYm91 bmRhcnkpKQogIChsZXQgKChpdGVycyAwKSkKICAgIChpbnNlcnQgImIiKQogICAgKHVuZG8tYm91 bmRhcnkpCiAgICAod2hpbGUgKGNsLWZpbmQgImFhYSIKICAgICAgICAgICAgICAgICAgICBidWZm ZXItdW5kby1saXN0CiAgICAgICAgICAgICAgICAgICAgOnRlc3QKICAgICAgICAgICAgICAgICAg ICAobGFtYmRhIChhYWEgcmhzKQogICAgICAgICAgICAgICAgICAgICAgKGFuZCAobGlzdHAgcmhz KQogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5ncCAoY2FyIHJocykpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIChzdHJpbmc9IGFhYSAoY2FyIHJocykpKSkpCiAgICAgICh1bmRv KSA7IGRlbGV0ZSAiYiIKICAgICAgKHVuZG8tYm91bmRhcnkpCiAgICAgICh1bmRvKSA7IHJlaW5z ZXJ0ICJiIgogICAgICAodW5kby1ib3VuZGFyeSkKICAgICAgKGdhcmJhZ2UtY29sbGVjdCkKICAg ICAgKGNsLWluY2YgaXRlcnMpKQogICAgKG1lc3NhZ2UgIml0ZXJzPSVzIiBpdGVycykpKQoKKGRl ZnVuIHBsYXktaW5zZXJ0ICgpCiAgKGludGVyYWN0aXZlKQogIChzYXZlLWV4Y3Vyc2lvbgogICAg KGdvdG8tY2hhciAxNDEpCiAgICAoaW5zZXJ0ICJhYWEiKQogICAgKHVuZG8tYm91bmRhcnkpCiAg ICAodW5kbykKICAgICh1bmRvLWJvdW5kYXJ5KSkKICAobGV0ICgoaXRlcnMgMCkpCiAgICAoaW5z ZXJ0ICJiIikKICAgICh1bmRvLWJvdW5kYXJ5KQogICAgOzsgNDk5IGlzICgtIChwbGF5LW51bS1p dGVycykgMSkKICAgICh3aGlsZSAoPCBpdGVycyA0OTkpCiAgICAgICh1bmRvKSA7IGRlbGV0ZSAi YiIKICAgICAgKHVuZG8tYm91bmRhcnkpCiAgICAgICh1bmRvKSA7IHJlaW5zZXJ0ICJiIgogICAg ICAodW5kby1ib3VuZGFyeSkKICAgICAgKGNsLWluY2YgaXRlcnMpKQogICAgKGdhcmJhZ2UtY29s bGVjdCkpKQoK --047d7bd6c5e881e97904f7b81c96--