From unknown Thu Jun 19 14:03:22 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#39078 <39078@debbugs.gnu.org> To: bug#39078 <39078@debbugs.gnu.org> Subject: Status: Path.pm change -> deltree.pl -> t/uninstall-fail failure Reply-To: bug#39078 <39078@debbugs.gnu.org> Date: Thu, 19 Jun 2025 21:03:22 +0000 retitle 39078 Path.pm change -> deltree.pl -> t/uninstall-fail failure reassign 39078 automake submitter 39078 Karl Berry severity 39078 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Fri Jan 10 21:37:52 2020 Received: (at submit) by debbugs.gnu.org; 11 Jan 2020 02:37:52 +0000 Received: from localhost ([127.0.0.1]:55187 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iq6eu-0004FV-H5 for submit@debbugs.gnu.org; Fri, 10 Jan 2020 21:37:52 -0500 Received: from lists.gnu.org ([209.51.188.17]:48081) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iq6es-0004FN-KV for submit@debbugs.gnu.org; Fri, 10 Jan 2020 21:37:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:48242) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iq6eq-0001NF-Rr for bug-automake@gnu.org; Fri, 10 Jan 2020 21:37:50 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_MED, URIBL_BLOCKED autolearn=disabled version=3.3.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iq6eo-0000YS-UW for bug-automake@gnu.org; Fri, 10 Jan 2020 21:37:48 -0500 Received: from freefriends.org ([96.88.95.60]:35744) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iq6eo-0000VO-9f for bug-automake@gnu.org; Fri, 10 Jan 2020 21:37:46 -0500 X-Envelope-From: karl@freefriends.org X-Envelope-To: Received: from freefriends.org (freefriends.org [96.88.95.60]) by freefriends.org (8.14.7/8.14.7) with ESMTP id 00B2bi9I013983 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 10 Jan 2020 19:37:44 -0700 Received: (from apache@localhost) by freefriends.org (8.14.7/8.14.7/Submit) id 00B2bi2n013982; Fri, 10 Jan 2020 19:37:44 -0700 Date: Fri, 10 Jan 2020 19:37:44 -0700 Message-Id: <202001110237.00B2bi2n013982@freefriends.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="NYw5+LhiCV" Content-Transfer-Encoding: 7bit From: Karl Berry To: bug-automake@gnu.org Subject: Path.pm change -> deltree.pl -> t/uninstall-fail failure X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 96.88.95.60 X-Debbugs-Envelope-To: submit 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" --NYw5+LhiCV Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit t/ax/deltree.pl is used in t/ax/test-lib.sh's rm_rf_ function to recursively remove a directory tree, even given directories with zero permissions, such as intentionally created by uninstall-failsh. Version 2.15 of Perl's File::Path (released with perl-5.28.0) has changed behavior such that this no longer works. The result is that the test fails with these errors: cannot chdir to child for t/uninstall-fail.dir/__inst-dir__/share: Permission denied at /u/karl/gnu/src/akarl/t/ax/deltree.pl line 29. cannot remove directory for t/uninstall-fail.dir/__inst-dir__: Directory not empty at /u/karl/gnu/src/akarl/t/ax/deltree.pl line 29. cannot remove directory for t/uninstall-fail.dir: Directory not empty at /u/karl/gnu/src/akarl/t/ax/deltree.pl line 29. (That .../share dir is the one that is intentionally mode zero.) The relevant change in Path.pm appears to be the one below. (I'll also attach the two Path.pm's in full, for the record.) As you can see, it mentions a CVE (CVE-2017-6512), and thus the change is presumably entirely intentional. I find the new long condition hard to be sure of without a lot of experimentation, but it appears to me it is intentionally no longer changing the mode of directories. This incompatibility seems highly unfortunate, but I doubt it is a mistake. So, the question is what to do about this in Automake. One option would be to make deltree.pl notice the failure and do the chmod itself in Perl, then redo the rmtree. Or just do the chmod before the first rmtree. Then I wondered, why not just do the same in the shell: chmod -R u+rwx "$@" || true rm -rf "$@" # If don't want to rely on rm exit status, # could then check if any of "$@" still exist. Looking at the ChangeLog, Stefano made the original switch to Perl was precisely because it was "more reliable and portable" than the previous shell implementation, but unfortunately this is no longer the case. The CL entry is also below. Re use of find (in the CL entry) vs. chmod (above), personally I don't see the need for the fancy find conditions, since all we're going to do is remove everything anyway, so why not blindly u+rwx everything? The Portable Shell node in the manual does not warn about chmod -R being problematic, and afaik it's in POSIX, for whatever that may be worth. But nevertheless we could use find if deemed better. On the other hand, doing it in Perl also seems perfectly feasible. It feels a bit simpler to me to do it in sh than to call a Perl helper script that calls a Path.pm function, but I don't have strong feelings about it. I don't see that there is an overwhelming technical argument one way or the other. Jim, anyone, wdyt? We have to do something ... --thanks, karl ----------------------------------------------------------------------------- 2013-05-16 Stefano Lattarini tests: use perl, not find+rm, to remove temporary directories The File::Path::rmtree function from perl, if used right, is more reliable and more portable of our past idiom: find $dirs -type d ! -perm -700 -exec chmod u+rwx {} ';'; rm -rf $$dirs || exit 1 at least of the face of unreadable dirs/files and other similar permission issues (and we have those in our test directories). In fact, this change fixes some spurious failures seen in "make distcheck" on Solaris 10. * t/ax/deltree.pl: New. * Makefile.am (EXTRA_DIST): Add it. (clean-local-check): Use it. * t/ax/test-lib.sh (rm_rf_): Use it. ----------------------------------------------------------------------------- --- /usr/local/lib/perl5/5.24.0/File/Path.pm 2016-11-13 09:06:35.640002177 -0800 +++ /usr/local/lib/perl5/5.28.0/File/Path.pm 2018-08-02 17:41:00.645374266 -0700 @@ -354,29 +400,40 @@ # see if we can escalate privileges to get in # (e.g. funny protection mask such as -w- instead of rwx) - $perm &= oct '7777'; - my $nperm = $perm | oct '700'; - if ( - !( - $arg->{safe} - or $nperm == $perm - or chmod( $nperm, $root ) - ) - ) - { - _error( $arg, - "cannot make child directory read-write-exec", $canon ); - next ROOT_DIR; + # This uses fchmod to avoid traversing outside of the proper + # location (CVE-2017-6512) + my $root_fh; + if (open($root_fh, '<', $root)) { + my ($fh_dev, $fh_inode) = (stat $root_fh )[0,1]; + $perm &= oct '7777'; + my $nperm = $perm | oct '700'; + local $@; + if ( + !( + $data->{safe} + or $nperm == $perm + or !-d _ + or $fh_dev ne $ldev + or $fh_inode ne $lino + or eval { chmod( $nperm, $root_fh ) } + ) + ) + { + _error( $data, + "cannot make child directory read-write-exec", $canon ); + next ROOT_DIR; + } + close $root_fh; } - elsif ( !chdir($root) ) { - _error( $arg, "cannot chdir to child", $canon ); + if ( !chdir($root) ) { + _error( $data, "cannot chdir to child", $canon ); next ROOT_DIR; } } --NYw5+LhiCV Content-Type: application/octet-stream Content-Disposition: attachment; filename="Path.pm-2.12_01" Content-Transfer-Encoding: base64 cGFja2FnZSBGaWxlOjpQYXRoOwoKdXNlIDUuMDA1XzA0Owp1c2Ugc3RyaWN0OwoKdXNlIEN3ZCAn Z2V0Y3dkJzsKdXNlIEZpbGU6OkJhc2VuYW1lICgpOwp1c2UgRmlsZTo6U3BlYyAgICAgKCk7CgpC RUdJTiB7CiAgICBpZiAoICRdIDwgNS4wMDYgKSB7CgogICAgICAgICMgY2FuJ3Qgc2F5ICdvcGVu ZGlyIG15ICRkaCwgJGRpcm5hbWUnCiAgICAgICAgIyBuZWVkIHRvIGluaXRpYWxpc2UgJGRoCiAg ICAgICAgZXZhbCAndXNlIFN5bWJvbCc7CiAgICB9Cn0KCnVzZSBFeHBvcnRlciAoKTsKdXNlIHZh cnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JUIEBFWFBPUlRfT0spOwokVkVSU0lPTiAgID0gJzIu MTJfMDEnOwokVkVSU0lPTiAgID0gZXZhbCAkVkVSU0lPTjsKQElTQSAgICAgICA9IHF3KEV4cG9y dGVyKTsKQEVYUE9SVCAgICA9IHF3KG1rcGF0aCBybXRyZWUpOwpARVhQT1JUX09LID0gcXcobWFr ZV9wYXRoIHJlbW92ZV90cmVlKTsKCkJFR0lOIHsKICBmb3IgKHF3KFZNUyBNYWNPUyBNU1dpbjMy IG9zMikpIHsKICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAqeyJfSVNfXFUkXyJ9ID0gJF5PIGVx ICRfID8gc3ViICgpIHsgMSB9IDogc3ViICgpIHsgMCB9OwogIH0KCiAgIyBUaGVzZSBPU2VzIGNv bXBsYWluIGlmIHlvdSB3YW50IHRvIHJlbW92ZSBhIGZpbGUgdGhhdCB5b3UgaGF2ZSBubwogICMg d3JpdGUgcGVybWlzc2lvbiB0bzoKICAqX0ZPUkNFX1dSSVRBQkxFID0gKAogICAgZ3JlcCB7ICRe TyBlcSAkXyB9IHF3KGFtaWdhb3MgZG9zIGVwb2MgTVNXaW4zMiBNYWNPUyBvczIpCiAgKSA/IHN1 YiAoKSB7IDEgfSA6IHN1YiAoKSB7IDAgfTsKCiAgIyBVbml4LWxpa2Ugc3lzdGVtcyBuZWVkIHRv IHN0YXQgZWFjaCBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gZGV0ZWN0CiAgIyByYWNlIGNvbmRpdGlv bi4gTVMtV2luZG93cyBpcyBpbW11bmUgdG8gdGhpcyBwYXJ0aWN1bGFyIGF0dGFjay4KICAqX05F RURfU1RBVF9DSEVDSyA9ICEoX0lTX01TV0lOMzIoKSkgPyBzdWIgKCkgeyAxIH0gOiBzdWIgKCkg eyAwIH07Cn0KCnN1YiBfY2FycCB7CiAgICByZXF1aXJlIENhcnA7CiAgICBnb3RvICZDYXJwOjpj YXJwOwp9CgpzdWIgX2Nyb2FrIHsKICAgIHJlcXVpcmUgQ2FycDsKICAgIGdvdG8gJkNhcnA6OmNy b2FrOwp9CgpzdWIgX2Vycm9yIHsKICAgIG15ICRhcmcgICAgID0gc2hpZnQ7CiAgICBteSAkbWVz c2FnZSA9IHNoaWZ0OwogICAgbXkgJG9iamVjdCAgPSBzaGlmdDsKCiAgICBpZiAoICRhcmctPntl cnJvcn0gKSB7CiAgICAgICAgJG9iamVjdCA9ICcnIHVubGVzcyBkZWZpbmVkICRvYmplY3Q7CiAg ICAgICAgJG1lc3NhZ2UgLj0gIjogJCEiIGlmICQhOwogICAgICAgIHB1c2ggQHsgJHsgJGFyZy0+ e2Vycm9yfSB9IH0sIHsgJG9iamVjdCA9PiAkbWVzc2FnZSB9OwogICAgfQogICAgZWxzZSB7CiAg ICAgICAgX2NhcnAoIGRlZmluZWQoJG9iamVjdCkgPyAiJG1lc3NhZ2UgZm9yICRvYmplY3Q6ICQh IiA6ICIkbWVzc2FnZTogJCEiICk7CiAgICB9Cn0KCnN1YiBfX2lzX2FyZyB7CiAgICBteSAoJGFy ZykgPSBAXzsKCiAgICAjIElmIGNsaWVudCBjb2RlIGJsZXNzZWQgYW4gYXJyYXkgcmVmIHRvIEhB U0gsIHRoaXMgd2lsbCBub3Qgd29yawogICAgIyBwcm9wZXJseS4gV2UgY291bGQgaGF2ZSBkb25l ICRhcmctPmlzYSgpIHdyYXBwZWQgaW4gZXZhbCwgYnV0CiAgICAjIHRoYXQgd291bGQgYmUgZXhw ZW5zaXZlLiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBzdWZmaWNlLgogICAgIyBXZSBjb3Vs ZCBoYXZlIGFsc28gdXNlZCBTY2FsYXI6OlV0aWw6Ymxlc3NlZCwgYnV0IHdlIGNob29zZSBub3QK ICAgICMgdG8gYWRkIHRoaXMgZGVwZW5kZW5jeQogICAgcmV0dXJuICggcmVmICRhcmcgZXEgJ0hB U0gnICk7Cn0KCnN1YiBtYWtlX3BhdGggewogICAgcHVzaCBAXywge30gdW5sZXNzIEBfIGFuZCBf X2lzX2FyZyggJF9bLTFdICk7CiAgICBnb3RvICZta3BhdGg7Cn0KCnN1YiBta3BhdGggewogICAg bXkgJG9sZF9zdHlsZSA9ICEoIEBfIGFuZCBfX2lzX2FyZyggJF9bLTFdICkgKTsKCiAgICBteSAk YXJnOwogICAgbXkgJHBhdGhzOwoKICAgIGlmICgkb2xkX3N0eWxlKSB7CiAgICAgICAgbXkgKCAk dmVyYm9zZSwgJG1vZGUgKTsKICAgICAgICAoICRwYXRocywgJHZlcmJvc2UsICRtb2RlICkgPSBA XzsKICAgICAgICAkcGF0aHMgPSBbJHBhdGhzXSB1bmxlc3MgVU5JVkVSU0FMOjppc2EoICRwYXRo cywgJ0FSUkFZJyApOwogICAgICAgICRhcmctPnt2ZXJib3NlfSA9ICR2ZXJib3NlOwogICAgICAg ICRhcmctPnttb2RlfSA9IGRlZmluZWQgJG1vZGUgPyAkbW9kZSA6IG9jdCAnNzc3JzsKICAgIH0K ICAgIGVsc2UgewogICAgICAgIG15ICVhcmdzX3Blcm1pdHRlZCA9IG1hcCB7ICRfID0+IDEgfSAo IHF3fAogICAgICAgICAgICBjaG1vZAogICAgICAgICAgICBlcnJvcgogICAgICAgICAgICBncm91 cAogICAgICAgICAgICBtYXNrCiAgICAgICAgICAgIG1vZGUKICAgICAgICAgICAgb3duZXIKICAg ICAgICAgICAgdWlkCiAgICAgICAgICAgIHVzZXIKICAgICAgICAgICAgdmVyYm9zZQogICAgICAg IHwgKTsKICAgICAgICBteSBAYmFkX2FyZ3MgPSAoKTsKICAgICAgICAkYXJnID0gcG9wIEBfOwog ICAgICAgIGZvciBteSAkayAoc29ydCBrZXlzICV7JGFyZ30pIHsKICAgICAgICAgICAgcHVzaCBA YmFkX2FyZ3MsICRrIHVubGVzcyAkYXJnc19wZXJtaXR0ZWR7JGt9OwogICAgICAgIH0KICAgICAg ICBfY2FycCgiVW5yZWNvZ25pemVkIG9wdGlvbihzKSBwYXNzZWQgdG8gbWFrZV9wYXRoKCk6IEBi YWRfYXJncyIpCiAgICAgICAgICAgIGlmIEBiYWRfYXJnczsKICAgICAgICAkYXJnLT57bW9kZX0g PSBkZWxldGUgJGFyZy0+e21hc2t9IGlmIGV4aXN0cyAkYXJnLT57bWFza307CiAgICAgICAgJGFy Zy0+e21vZGV9ID0gb2N0ICc3NzcnIHVubGVzcyBleGlzdHMgJGFyZy0+e21vZGV9OwogICAgICAg ICR7ICRhcmctPntlcnJvcn0gfSA9IFtdIGlmIGV4aXN0cyAkYXJnLT57ZXJyb3J9OwogICAgICAg ICRhcmctPntvd25lcn0gPSBkZWxldGUgJGFyZy0+e3VzZXJ9IGlmIGV4aXN0cyAkYXJnLT57dXNl cn07CiAgICAgICAgJGFyZy0+e293bmVyfSA9IGRlbGV0ZSAkYXJnLT57dWlkfSAgaWYgZXhpc3Rz ICRhcmctPnt1aWR9OwogICAgICAgIGlmICggZXhpc3RzICRhcmctPntvd25lcn0gYW5kICRhcmct Pntvd25lcn0gPX4gL1xELyApIHsKICAgICAgICAgICAgbXkgJHVpZCA9ICggZ2V0cHduYW0gJGFy Zy0+e293bmVyfSApWzJdOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJHVpZCApIHsKICAgICAg ICAgICAgICAgICRhcmctPntvd25lcn0gPSAkdWlkOwogICAgICAgICAgICB9CiAgICAgICAgICAg IGVsc2UgewogICAgICAgICAgICAgICAgX2Vycm9yKCAkYXJnLAoidW5hYmxlIHRvIG1hcCAkYXJn LT57b3duZXJ9IHRvIGEgdWlkLCBvd25lcnNoaXAgbm90IGNoYW5nZWQiCiAgICAgICAgICAgICAg ICApOwogICAgICAgICAgICAgICAgZGVsZXRlICRhcmctPntvd25lcn07CiAgICAgICAgICAgIH0K ICAgICAgICB9CiAgICAgICAgaWYgKCBleGlzdHMgJGFyZy0+e2dyb3VwfSBhbmQgJGFyZy0+e2dy b3VwfSA9fiAvXEQvICkgewogICAgICAgICAgICBteSAkZ2lkID0gKCBnZXRncm5hbSAkYXJnLT57 Z3JvdXB9IClbMl07CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkZ2lkICkgewogICAgICAgICAg ICAgICAgJGFyZy0+e2dyb3VwfSA9ICRnaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZSB7CiAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcsCiJ1bmFibGUgdG8gbWFwICRhcmctPntn cm91cH0gdG8gYSBnaWQsIGdyb3VwIG93bmVyc2hpcCBub3QgY2hhbmdlZCIKICAgICAgICAgICAg ICAgICk7CiAgICAgICAgICAgICAgICBkZWxldGUgJGFyZy0+e2dyb3VwfTsKICAgICAgICAgICAg fQogICAgICAgIH0KICAgICAgICBpZiAoIGV4aXN0cyAkYXJnLT57b3duZXJ9IGFuZCBub3QgZXhp c3RzICRhcmctPntncm91cH0gKSB7CiAgICAgICAgICAgICRhcmctPntncm91cH0gPSAtMTsgICAg IyBjaG93biB3aWxsIGxlYXZlIGdyb3VwIHVuY2hhbmdlZAogICAgICAgIH0KICAgICAgICBpZiAo IGV4aXN0cyAkYXJnLT57Z3JvdXB9IGFuZCBub3QgZXhpc3RzICRhcmctPntvd25lcn0gKSB7CiAg ICAgICAgICAgICRhcmctPntvd25lcn0gPSAtMTsgICAgIyBjaG93biB3aWxsIGxlYXZlIG93bmVy IHVuY2hhbmdlZAogICAgICAgIH0KICAgICAgICAkcGF0aHMgPSBbQF9dOwogICAgfQogICAgcmV0 dXJuIF9ta3BhdGgoICRhcmcsICRwYXRocyApOwp9CgpzdWIgX21rcGF0aCB7CiAgICBteSAkYXJn ICAgPSBzaGlmdDsKICAgIG15ICRwYXRocyA9IHNoaWZ0OwoKICAgIG15ICggQGNyZWF0ZWQgKTsK ICAgIGZvcmVhY2ggbXkgJHBhdGggKCBAeyRwYXRoc30gKSB7CiAgICAgICAgbmV4dCB1bmxlc3Mg ZGVmaW5lZCgkcGF0aCkgYW5kIGxlbmd0aCgkcGF0aCk7CiAgICAgICAgJHBhdGggLj0gJy8nIGlm IF9JU19PUzIgYW5kICRwYXRoID1+IC9eXHc6XHovczsgIyBmZWF0dXJlIG9mIENSVAoKICAgICAg ICAjIExvZ2ljIHdhbnRzIFVuaXggcGF0aHMsIHNvIGdvIHdpdGggdGhlIGZsb3cuCiAgICAgICAg aWYgKF9JU19WTVMpIHsKICAgICAgICAgICAgbmV4dCBpZiAkcGF0aCBlcSAnLyc7CiAgICAgICAg ICAgICRwYXRoID0gVk1TOjpGaWxlc3BlYzo6dW5peGlmeSgkcGF0aCk7CiAgICAgICAgfQogICAg ICAgIG5leHQgaWYgLWQgJHBhdGg7CiAgICAgICAgbXkgJHBhcmVudCA9IEZpbGU6OkJhc2VuYW1l OjpkaXJuYW1lKCRwYXRoKTsKICAgICAgICB1bmxlc3MgKCAtZCAkcGFyZW50IG9yICRwYXRoIGVx ICRwYXJlbnQgKSB7CiAgICAgICAgICAgIHB1c2goIEBjcmVhdGVkLCBfbWtwYXRoKCAkYXJnLCBb JHBhcmVudF0gKSApOwogICAgICAgIH0KICAgICAgICBwcmludCAibWtkaXIgJHBhdGhcbiIgaWYg JGFyZy0+e3ZlcmJvc2V9OwogICAgICAgIGlmICggbWtkaXIoICRwYXRoLCAkYXJnLT57bW9kZX0g KSApIHsKICAgICAgICAgICAgcHVzaCggQGNyZWF0ZWQsICRwYXRoICk7CiAgICAgICAgICAgIGlm ICggZXhpc3RzICRhcmctPntvd25lcn0gKSB7CgogICAgICAgICAgICAgICAgIyBOQjogJGFyZy0+ e2dyb3VwfSBndWFyYW50ZWVkIHRvIGJlIHNldCBkdXJpbmcgaW5pdGlhbGlzYXRpb24KICAgICAg ICAgICAgICAgIGlmICggIWNob3duICRhcmctPntvd25lcn0sICRhcmctPntncm91cH0sICRwYXRo ICkgewogICAgICAgICAgICAgICAgICAgIF9lcnJvciggJGFyZywKIkNhbm5vdCBjaGFuZ2Ugb3du ZXJzaGlwIG9mICRwYXRoIHRvICRhcmctPntvd25lcn06JGFyZy0+e2dyb3VwfSIKICAgICAgICAg ICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAg IGlmICggZXhpc3RzICRhcmctPntjaG1vZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICFjaG1v ZCAkYXJnLT57Y2htb2R9LCAkcGF0aCApIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRh cmcsCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2hhbmdlIHBlcm1pc3Npb25zIG9m ICRwYXRoIHRvICRhcmctPntjaG1vZH0iICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg IH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRzYXZlX2JhbmcgPSAk ITsKICAgICAgICAgICAgbXkgKCAkZSwgJGUxICkgPSAoICRzYXZlX2JhbmcsICReRSApOwogICAg ICAgICAgICAkZSAuPSAiOyAkZTEiIGlmICRlIG5lICRlMTsKCiAgICAgICAgICAgICMgYWxsb3cg Zm9yIGFub3RoZXIgcHJvY2VzcyB0byBoYXZlIGNyZWF0ZWQgaXQgbWVhbndoaWxlCiAgICAgICAg ICAgIGlmICggISAtZCAkcGF0aCApIHsKICAgICAgICAgICAgICAgICQhID0gJHNhdmVfYmFuZzsK ICAgICAgICAgICAgICAgIGlmICggJGFyZy0+e2Vycm9yfSApIHsKICAgICAgICAgICAgICAgICAg ICBwdXNoIEB7ICR7ICRhcmctPntlcnJvcn0gfSB9LCB7ICRwYXRoID0+ICRlIH07CiAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBfY3Jv YWsoIm1rZGlyICRwYXRoOiAkZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAg ICAgICAgfQogICAgfQogICAgcmV0dXJuIEBjcmVhdGVkOwp9CgpzdWIgcmVtb3ZlX3RyZWUgewog ICAgcHVzaCBAXywge30gdW5sZXNzIEBfIGFuZCBfX2lzX2FyZyggJF9bLTFdICk7CiAgICBnb3Rv ICZybXRyZWU7Cn0KCnN1YiBfaXNfc3ViZGlyIHsKICAgIG15ICggJGRpciwgJHRlc3QgKSA9IEBf OwoKICAgIG15ICggJGR2LCAkZGQgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJGRpciwgIDEg KTsKICAgIG15ICggJHR2LCAkdGQgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHRlc3QsIDEg KTsKCiAgICAjIG5vdCBvbiBzYW1lIHZvbHVtZQogICAgcmV0dXJuIDAgaWYgJGR2IG5lICR0djsK CiAgICBteSBAZCA9IEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCRkZCk7CiAgICBteSBAdCA9IEZpbGU6 OlNwZWMtPnNwbGl0ZGlyKCR0ZCk7CgogICAgIyBAdCBjYW4ndCBiZSBhIHN1YmRpciBpZiBpdCdz IHNob3J0ZXIgdGhhbiBAZAogICAgcmV0dXJuIDAgaWYgQHQgPCBAZDsKCiAgICByZXR1cm4gam9p biggJy8nLCBAZCApIGVxIGpvaW4oICcvJywgc3BsaWNlIEB0LCAwLCArQGQgKTsKfQoKc3ViIHJt dHJlZSB7CiAgICBteSAkb2xkX3N0eWxlID0gISggQF8gYW5kIF9faXNfYXJnKCAkX1stMV0gKSAp OwoKICAgIG15ICRhcmc7CiAgICBteSAkcGF0aHM7CgogICAgaWYgKCRvbGRfc3R5bGUpIHsKICAg ICAgICBteSAoICR2ZXJib3NlLCAkc2FmZSApOwogICAgICAgICggJHBhdGhzLCAkdmVyYm9zZSwg JHNhZmUgKSA9IEBfOwogICAgICAgICRhcmctPnt2ZXJib3NlfSA9ICR2ZXJib3NlOwogICAgICAg ICRhcmctPntzYWZlfSA9IGRlZmluZWQgJHNhZmUgPyAkc2FmZSA6IDA7CgogICAgICAgIGlmICgg ZGVmaW5lZCgkcGF0aHMpIGFuZCBsZW5ndGgoJHBhdGhzKSApIHsKICAgICAgICAgICAgJHBhdGhz ID0gWyRwYXRoc10gdW5sZXNzIFVOSVZFUlNBTDo6aXNhKCAkcGF0aHMsICdBUlJBWScgKTsKICAg ICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIF9jYXJwKCJObyByb290IHBhdGgocykg c3BlY2lmaWVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAg ZWxzZSB7CiAgICAgICAgbXkgJWFyZ3NfcGVybWl0dGVkID0gbWFwIHsgJF8gPT4gMSB9ICggcXd8 CiAgICAgICAgICAgIGVycm9yCiAgICAgICAgICAgIGtlZXBfcm9vdAogICAgICAgICAgICByZXN1 bHQKICAgICAgICAgICAgc2FmZQogICAgICAgICAgICB2ZXJib3NlCiAgICAgICAgfCApOwogICAg ICAgIG15IEBiYWRfYXJncyA9ICgpOwogICAgICAgICRhcmcgPSBwb3AgQF87CiAgICAgICAgZm9y IG15ICRrIChzb3J0IGtleXMgJXskYXJnfSkgewogICAgICAgICAgICBwdXNoIEBiYWRfYXJncywg JGsgdW5sZXNzICRhcmdzX3Blcm1pdHRlZHska307CiAgICAgICAgfQogICAgICAgIF9jYXJwKCJV bnJlY29nbml6ZWQgb3B0aW9uKHMpIHBhc3NlZCB0byByZW1vdmVfdHJlZSgpOiBAYmFkX2FyZ3Mi KQogICAgICAgICAgICBpZiBAYmFkX2FyZ3M7CiAgICAgICAgJHsgJGFyZy0+e2Vycm9yfSB9ICA9 IFtdIGlmIGV4aXN0cyAkYXJnLT57ZXJyb3J9OwogICAgICAgICR7ICRhcmctPntyZXN1bHR9IH0g PSBbXSBpZiBleGlzdHMgJGFyZy0+e3Jlc3VsdH07CiAgICAgICAgJHBhdGhzID0gW0BfXTsKICAg IH0KCiAgICAkYXJnLT57cHJlZml4fSA9ICcnOwogICAgJGFyZy0+e2RlcHRofSAgPSAwOwoKICAg IG15IEBjbGVhbl9wYXRoOwogICAgJGFyZy0+e2N3ZH0gPSBnZXRjd2QoKSBvciBkbyB7CiAgICAg ICAgX2Vycm9yKCAkYXJnLCAiY2Fubm90IGZldGNoIGluaXRpYWwgd29ya2luZyBkaXJlY3Rvcnki ICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgZm9yICggJGFyZy0+e2N3ZH0gKSB7IC9c QSguKilcWi9zOyAkXyA9ICQxIH0gICAgIyB1bnRhaW50CgogICAgZm9yIG15ICRwIChAJHBhdGhz KSB7CgogICAgICAgICMgbmVlZCB0byBmaXh1cCBjYXNlIGFuZCBtYXAgXCB0byAvIG9uIFdpbmRv d3MKICAgICAgICBteSAkb3J0aG9fcm9vdCA9IF9JU19NU1dJTjMyID8gX3NsYXNoX2xjKCRwKSA6 ICRwOwogICAgICAgIG15ICRvcnRob19jd2QgPQogICAgICAgICAgX0lTX01TV0lOMzIgPyBfc2xh c2hfbGMoICRhcmctPntjd2R9ICkgOiAkYXJnLT57Y3dkfTsKICAgICAgICBteSAkb3J0aG9fcm9v dF9sZW5ndGggPSBsZW5ndGgoJG9ydGhvX3Jvb3QpOwogICAgICAgICRvcnRob19yb290X2xlbmd0 aC0tIGlmIF9JU19WTVM7ICAgIyBkb24ndCBjb21wYXJlICcuJyB3aXRoICddJwogICAgICAgIGlm ICggJG9ydGhvX3Jvb3RfbGVuZ3RoICYmIF9pc19zdWJkaXIoICRvcnRob19yb290LCAkb3J0aG9f Y3dkICkgKSB7CiAgICAgICAgICAgIGxvY2FsICQhID0gMDsKICAgICAgICAgICAgX2Vycm9yKCAk YXJnLCAiY2Fubm90IHJlbW92ZSBwYXRoIHdoZW4gY3dkIGlzICRhcmctPntjd2R9IiwgJHAgKTsK ICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgIGlmIChfSVNfTUFDT1MpIHsKICAg ICAgICAgICAgJHAgPSAiOiRwIiB1bmxlc3MgJHAgPX4gLzovOwogICAgICAgICAgICAkcCAuPSAi OiIgdW5sZXNzICRwID1+IC86XHovOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoIF9JU19NU1dJ TjMyICkgewogICAgICAgICAgICAkcCA9fiBze1svXFxdXHp9e307CiAgICAgICAgfQogICAgICAg IGVsc2UgewogICAgICAgICAgICAkcCA9fiBzey9cen17fTsKICAgICAgICB9CiAgICAgICAgcHVz aCBAY2xlYW5fcGF0aCwgJHA7CiAgICB9CgogICAgQHskYXJnfXtxdyhkZXZpY2UgaW5vZGUgcGVy bSl9ID0gKCBsc3RhdCAkYXJnLT57Y3dkfSApWyAwLCAxIF0gb3IgZG8gewogICAgICAgIF9lcnJv ciggJGFyZywgImNhbm5vdCBzdGF0IGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiLCAkYXJnLT57 Y3dkfSApOwogICAgICAgIHJldHVybiAwOwogICAgfTsKCiAgICByZXR1cm4gX3JtdHJlZSggJGFy ZywgXEBjbGVhbl9wYXRoICk7Cn0KCnN1YiBfcm10cmVlIHsKICAgIG15ICRhcmcgICA9IHNoaWZ0 OwogICAgbXkgJHBhdGhzID0gc2hpZnQ7CgogICAgbXkgJGNvdW50ICA9IDA7CiAgICBteSAkY3Vy ZGlyID0gRmlsZTo6U3BlYy0+Y3VyZGlyKCk7CiAgICBteSAkdXBkaXIgID0gRmlsZTo6U3BlYy0+ dXBkaXIoKTsKCiAgICBteSAoIEBmaWxlcywgJHJvb3QgKTsKICBST09UX0RJUjoKICAgIGZvcmVh Y2ggbXkgJHJvb3QgKEAkcGF0aHMpIHsKCiAgICAgICAgIyBzaW5jZSB3ZSBjaGRpciBpbnRvIGVh Y2ggZGlyZWN0b3J5LCBpdCBtYXkgbm90IGJlIG9idmlvdXMKICAgICAgICAjIHRvIGZpZ3VyZSBv dXQgd2hlcmUgd2UgYXJlIGlmIHdlIGdlbmVyYXRlIGEgbWVzc2FnZSBhYm91dAogICAgICAgICMg YSBmaWxlIG5hbWUuIFdlIHRoZXJlZm9yZSBjb25zdHJ1Y3QgYSBzZW1pLWNhbm9uaWNhbAogICAg ICAgICMgZmlsZW5hbWUsIGFuY2hvcmVkIGZyb20gdGhlIGRpcmVjdG9yeSBiZWluZyB1bmxpbmtl ZCAoYXMKICAgICAgICAjIG9wcG9zZWQgdG8gYmVpbmcgdHJ1bHkgY2Fub25pY2FsLCBhbmNob3Jl ZCBmcm9tIHRoZSByb290ICgvKS4KCiAgICAgICAgbXkgJGNhbm9uID0KICAgICAgICAgICRhcmct PntwcmVmaXh9CiAgICAgICAgICA/IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRhcmctPntwcmVmaXh9 LCAkcm9vdCApCiAgICAgICAgICA6ICRyb290OwoKICAgICAgICBteSAoICRsZGV2LCAkbGlubywg JHBlcm0gKSA9ICggbHN0YXQgJHJvb3QgKVsgMCwgMSwgMiBdCiAgICAgICAgICBvciBuZXh0IFJP T1RfRElSOwoKICAgICAgICBpZiAoIC1kIF8gKSB7CiAgICAgICAgICAgICRyb290ID0gVk1TOjpG aWxlc3BlYzo6dm1zcGF0aCggVk1TOjpGaWxlc3BlYzo6cGF0aGlmeSgkcm9vdCkgKQogICAgICAg ICAgICAgIGlmIF9JU19WTVM7CgogICAgICAgICAgICBpZiAoICFjaGRpcigkcm9vdCkgKSB7Cgog ICAgICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGVzY2FsYXRlIHByaXZpbGVnZXMgdG8gZ2V0 IGluCiAgICAgICAgICAgICAgICAjIChlLmcuIGZ1bm55IHByb3RlY3Rpb24gbWFzayBzdWNoIGFz IC13LSBpbnN0ZWFkIG9mIHJ3eCkKICAgICAgICAgICAgICAgICRwZXJtICY9IG9jdCAnNzc3Nyc7 CiAgICAgICAgICAgICAgICBteSAkbnBlcm0gPSAkcGVybSB8IG9jdCAnNzAwJzsKICAgICAgICAg ICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhKAogICAgICAgICAgICAgICAgICAgICAg ICAgICAkYXJnLT57c2FmZX0KICAgICAgICAgICAgICAgICAgICAgICAgb3IgJG5wZXJtID09ICRw ZXJtCiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNobW9kKCAkbnBlcm0sICRyb290ICkKICAg ICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcsCiAgICAgICAgICAgICAgICAgICAgICAg ICJjYW5ub3QgbWFrZSBjaGlsZCBkaXJlY3RvcnkgcmVhZC13cml0ZS1leGVjIiwgJGNhbm9uICk7 CiAgICAgICAgICAgICAgICAgICAgbmV4dCBST09UX0RJUjsKICAgICAgICAgICAgICAgIH0KICAg ICAgICAgICAgICAgIGVsc2lmICggIWNoZGlyKCRyb290KSApIHsKICAgICAgICAgICAgICAgICAg ICBfZXJyb3IoICRhcmcsICJjYW5ub3QgY2hkaXIgdG8gY2hpbGQiLCAkY2Fub24gKTsKICAgICAg ICAgICAgICAgICAgICBuZXh0IFJPT1RfRElSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg ICB9CgogICAgICAgICAgICBteSAoICRjdXJfZGV2LCAkY3VyX2lub2RlLCAkcGVybSApID0gKCBz dGF0ICRjdXJkaXIgKVsgMCwgMSwgMiBdCiAgICAgICAgICAgICAgb3IgZG8gewogICAgICAgICAg ICAgICAgX2Vycm9yKCAkYXJnLCAiY2Fubm90IHN0YXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9y eSIsICRjYW5vbiApOwogICAgICAgICAgICAgICAgbmV4dCBST09UX0RJUjsKICAgICAgICAgICAg ICB9OwoKICAgICAgICAgICAgaWYgKF9ORUVEX1NUQVRfQ0hFQ0spIHsKICAgICAgICAgICAgICAg ICggJGxkZXYgZXEgJGN1cl9kZXYgYW5kICRsaW5vIGVxICRjdXJfaW5vZGUgKQogICAgICAgICAg ICAgICAgICBvciBfY3JvYWsoCiJkaXJlY3RvcnkgJGNhbm9uIGNoYW5nZWQgYmVmb3JlIGNoZGly LCBleHBlY3RlZCBkZXY9JGxkZXYgaW5vPSRsaW5vLCBhY3R1YWwgZGV2PSRjdXJfZGV2IGlubz0k Y3VyX2lub2RlLCBhYm9ydGluZy4iCiAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0K CiAgICAgICAgICAgICRwZXJtICY9IG9jdCAnNzc3Nyc7ICAgICMgZG9uJ3QgZm9yZ2V0IHNldHVp ZCwgc2V0Z2lkLCBzdGlja3kgYml0cwogICAgICAgICAgICBteSAkbnBlcm0gPSAkcGVybSB8IG9j dCAnNzAwJzsKCiAgICAgICAgICAgICMgbm90YWJlbmU6IDA3MDAgaXMgZm9yIG1ha2luZyByZWFk YWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UsCiAgICAgICAgICAgICMgaXQncyBhbHNvIGludGVuZGVk IHRvIGNoYW5nZSBpdCB0byB3cml0YWJsZSBpbiBjYXNlIHdlIGhhdmUKICAgICAgICAgICAgIyB0 byByZWN1cnNlIGluIHdoaWNoIGNhc2Ugd2UgYXJlIGJldHRlciB0aGFuIHJtIC1yZiBmb3IKICAg ICAgICAgICAgIyBzdWJ0cmVlcyB3aXRoIHN0cmFuZ2UgcGVybWlzc2lvbnMKCiAgICAgICAgICAg IGlmICgKICAgICAgICAgICAgICAgICEoCiAgICAgICAgICAgICAgICAgICAgICAgJGFyZy0+e3Nh ZmV9CiAgICAgICAgICAgICAgICAgICAgb3IgJG5wZXJtID09ICRwZXJtCiAgICAgICAgICAgICAg ICAgICAgb3IgY2htb2QoICRucGVybSwgJGN1cmRpciApCiAgICAgICAgICAgICAgICApCiAgICAg ICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcsICJj YW5ub3QgbWFrZSBkaXJlY3RvcnkgcmVhZCt3cml0ZWFibGUiLCAkY2Fub24gKTsKICAgICAgICAg ICAgICAgICRucGVybSA9ICRwZXJtOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkZDsK ICAgICAgICAgICAgJGQgPSBnZW5zeW0oKSBpZiAkXSA8IDUuMDA2OwogICAgICAgICAgICBpZiAo ICFvcGVuZGlyICRkLCAkY3VyZGlyICkgewogICAgICAgICAgICAgICAgX2Vycm9yKCAkYXJnLCAi Y2Fubm90IG9wZW5kaXIiLCAkY2Fub24gKTsKICAgICAgICAgICAgICAgIEBmaWxlcyA9ICgpOwog ICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCAhZGVm aW5lZCAke15UQUlOVH0gb3IgJHteVEFJTlR9ICkgewogICAgICAgICAgICAgICAgICAgICMgQmxp bmRseSB1bnRhaW50IGRpciBuYW1lcyBpZiB0YWludCBtb2RlIGlzIGFjdGl2ZQogICAgICAgICAg ICAgICAgICAgIEBmaWxlcyA9IG1hcCB7IC9cQSguKilcei9zOyAkMSB9IHJlYWRkaXIgJGQ7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAg ICBAZmlsZXMgPSByZWFkZGlyICRkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg Y2xvc2VkaXIgJGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfSVNfVk1TKSB7Cgog ICAgICAgICAgICAgICAgIyBEZWxldGluZyBsYXJnZSBudW1iZXJzIG9mIGZpbGVzIGZyb20gVk1T IEZpbGVzLTExCiAgICAgICAgICAgICAgICAjIGZpbGVzeXN0ZW1zIGlzIGZhc3RlciBpZiBkb25l IGluIHJldmVyc2UgQVNDSUliZXRpY2FsIG9yZGVyLgogICAgICAgICAgICAgICAgIyBpbmNsdWRl ICcuJyB0byAnLjsnIGZyb20gYmxlYWQgcGF0Y2ggIzMxNzc1CiAgICAgICAgICAgICAgICBAZmls ZXMgPSBtYXAgeyAkXyBlcSAnLicgPyAnLjsnIDogJF8gfSByZXZlcnNlIEBmaWxlczsKICAgICAg ICAgICAgfQoKICAgICAgICAgICAgQGZpbGVzID0gZ3JlcCB7ICRfIG5lICR1cGRpciBhbmQgJF8g bmUgJGN1cmRpciB9IEBmaWxlczsKCiAgICAgICAgICAgIGlmIChAZmlsZXMpIHsKCiAgICAgICAg ICAgICAgICAjIHJlbW92ZSB0aGUgY29udGFpbmVkIGZpbGVzIGJlZm9yZSB0aGUgZGlyZWN0b3J5 IGl0c2VsZgogICAgICAgICAgICAgICAgbXkgJG5hcmcgPSB7JSRhcmd9OwogICAgICAgICAgICAg ICAgQHskbmFyZ317cXcoZGV2aWNlIGlub2RlIGN3ZCBwcmVmaXggZGVwdGgpfSA9CiAgICAgICAg ICAgICAgICAgICggJGN1cl9kZXYsICRjdXJfaW5vZGUsICR1cGRpciwgJGNhbm9uLCAkYXJnLT57 ZGVwdGh9ICsgMSApOwogICAgICAgICAgICAgICAgJGNvdW50ICs9IF9ybXRyZWUoICRuYXJnLCBc QGZpbGVzICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzdG9yZSBkaXJlY3Rvcnkg cGVybWlzc2lvbnMgb2YgcmVxdWlyZWQgbm93IChpbiBjYXNlIHRoZSBybWRpcgogICAgICAgICAg ICAjIGJlbG93IGZhaWxzKSwgd2hpbGUgd2UgYXJlIHN0aWxsIGluIHRoZSBkaXJlY3RvcnkgYW5k IG1heSBkbyBzbwogICAgICAgICAgICAjIHdpdGhvdXQgYSByYWNlIHZpYSAnLicKICAgICAgICAg ICAgaWYgKCAkbnBlcm0gIT0gJHBlcm0gYW5kIG5vdCBjaG1vZCggJHBlcm0sICRjdXJkaXIgKSAp IHsKICAgICAgICAgICAgICAgIF9lcnJvciggJGFyZywgImNhbm5vdCByZXNldCBjaG1vZCIsICRj YW5vbiApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRvbid0IGxlYXZlIHRoZSBjbGll bnQgY29kZSBpbiBhbiB1bmV4cGVjdGVkIGRpcmVjdG9yeQogICAgICAgICAgICBjaGRpciggJGFy Zy0+e2N3ZH0gKQogICAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgX2Nyb2FrKCJjYW5ub3Qg Y2hkaXIgdG8gJGFyZy0+e2N3ZH0gZnJvbSAkY2Fub246ICQhLCBhYm9ydGluZy4iKTsKCiAgICAg ICAgICAgICMgZW5zdXJlIHRoYXQgYSBjaGRpciB1cHdhcmRzIGRpZG4ndCB0YWtlIHVzIHNvbWV3 aGVyZSBvdGhlcgogICAgICAgICAgICAjIHRoYW4gd2UgZXhwZWN0ZWQgKHNlZSBDVkUtMjAwMi0w NDM1KQogICAgICAgICAgICAoICRjdXJfZGV2LCAkY3VyX2lub2RlICkgPSAoIHN0YXQgJGN1cmRp ciApWyAwLCAxIF0KICAgICAgICAgICAgICBvciBfY3JvYWsoCiAgICAgICAgICAgICAgICAiY2Fu bm90IHN0YXQgcHJpb3Igd29ya2luZyBkaXJlY3RvcnkgJGFyZy0+e2N3ZH06ICQhLCBhYm9ydGlu Zy4iCiAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmIChfTkVFRF9TVEFUX0NIRUNLKSB7 CiAgICAgICAgICAgICAgICAoICRhcmctPntkZXZpY2V9IGVxICRjdXJfZGV2IGFuZCAkYXJnLT57 aW5vZGV9IGVxICRjdXJfaW5vZGUgKQogICAgICAgICAgICAgICAgICBvciBfY3JvYWsoICAicHJl dmlvdXMgZGlyZWN0b3J5ICRhcmctPntjd2R9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAg IC4gImNoYW5nZWQgYmVmb3JlIGVudGVyaW5nICRjYW5vbiwgIgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgLiAiZXhwZWN0ZWQgZGV2PSRsZGV2IGlubz0kbGlubywgIgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgLiAiYWN0dWFsIGRldj0kY3VyX2RldiBpbm89JGN1cl9pbm9kZSwgYWJv cnRpbmcuIgogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBp ZiAoICRhcmctPntkZXB0aH0gb3IgISRhcmctPntrZWVwX3Jvb3R9ICkgewogICAgICAgICAgICAg ICAgaWYgKCAkYXJnLT57c2FmZX0KICAgICAgICAgICAgICAgICAgICAmJiAoIF9JU19WTVMKICAg ICAgICAgICAgICAgICAgICAgICAgPyAhJlZNUzo6RmlsZXNwZWM6OmNhbmRlbGV0ZSgkcm9vdCkK ICAgICAgICAgICAgICAgICAgICAgICAgOiAhLXcgJHJvb3QgKSApCiAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNraXBwZWQgJHJvb3RcbiIgaWYgJGFyZy0+e3Zl cmJvc2V9OwogICAgICAgICAgICAgICAgICAgIG5leHQgUk9PVF9ESVI7CiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICBpZiAoIF9GT1JDRV9XUklUQUJMRSBhbmQgIWNobW9kICRwZXJt IHwgb2N0ICc3MDAnLCAkcm9vdCApIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcs ICJjYW5ub3QgbWFrZSBkaXJlY3Rvcnkgd3JpdGVhYmxlIiwgJGNhbm9uICk7CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICBwcmludCAicm1kaXIgJHJvb3RcbiIgaWYgJGFyZy0+e3Zl cmJvc2V9OwogICAgICAgICAgICAgICAgaWYgKCBybWRpciAkcm9vdCApIHsKICAgICAgICAgICAg ICAgICAgICBwdXNoIEB7ICR7ICRhcmctPntyZXN1bHR9IH0gfSwgJHJvb3QgaWYgJGFyZy0+e3Jl c3VsdH07CiAgICAgICAgICAgICAgICAgICAgKyskY291bnQ7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcsICJj YW5ub3QgcmVtb3ZlIGRpcmVjdG9yeSIsICRjYW5vbiApOwogICAgICAgICAgICAgICAgICAgIGlm ICgKICAgICAgICAgICAgICAgICAgICAgICAgX0ZPUkNFX1dSSVRBQkxFCiAgICAgICAgICAgICAg ICAgICAgICAgICYmICFjaG1vZCggJHBlcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAo IF9JU19WTVMgPyBWTVM6OkZpbGVzcGVjOjpmaWxlaWZ5KCRyb290KSA6ICRyb290ICkKICAgICAg ICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgX2Vycm9yKAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgJGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICJj YW5ub3QgcmVzdG9yZSBwZXJtaXNzaW9ucyB0byAwJW8iLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICRwZXJtICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2Fub24KICAg ICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAg ICMgbm90IGEgZGlyZWN0b3J5CiAgICAgICAgICAgICRyb290ID0gVk1TOjpGaWxlc3BlYzo6dm1z aWZ5KCIuLyRyb290IikKICAgICAgICAgICAgICBpZiBfSVNfVk1TCiAgICAgICAgICAgICAgJiYg IUZpbGU6OlNwZWMtPmZpbGVfbmFtZV9pc19hYnNvbHV0ZSgkcm9vdCkKICAgICAgICAgICAgICAm JiAoICRyb290ICF+IG0vKD88IVxeKVtcXT5dKy8gKTsgICAgIyBub3QgYWxyZWFkeSBpbiBWTVMg c3ludGF4CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkYXJnLT57c2FmZX0KICAg ICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICBfSVNfVk1TCiAgICAgICAgICAg ICAgICAgICAgPyAhJlZNUzo6RmlsZXNwZWM6OmNhbmRlbGV0ZSgkcm9vdCkKICAgICAgICAgICAg ICAgICAgICA6ICEoIC1sICRyb290IHx8IC13ICRyb290ICkKICAgICAgICAgICAgICAgICkKICAg ICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ICJza2lwcGVk ICRyb290XG4iIGlmICRhcmctPnt2ZXJib3NlfTsKICAgICAgICAgICAgICAgIG5leHQgUk9PVF9E SVI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRucGVybSA9ICRwZXJtICYgb2N0ICc3 Nzc3JyB8IG9jdCAnNjAwJzsKICAgICAgICAgICAgaWYgKCAgICBfRk9SQ0VfV1JJVEFCTEUKICAg ICAgICAgICAgICAgIGFuZCAkbnBlcm0gIT0gJHBlcm0KICAgICAgICAgICAgICAgIGFuZCBub3Qg Y2htb2QgJG5wZXJtLCAkcm9vdCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9lcnJv ciggJGFyZywgImNhbm5vdCBtYWtlIGZpbGUgd3JpdGVhYmxlIiwgJGNhbm9uICk7CiAgICAgICAg ICAgIH0KICAgICAgICAgICAgcHJpbnQgInVubGluayAkY2Fub25cbiIgaWYgJGFyZy0+e3ZlcmJv c2V9OwoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHZlcnNpb25zIHVuZGVyIFZNUwogICAgICAg ICAgICBmb3IgKCA7IDsgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHVubGluayAkcm9vdCApIHsK ICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICR7ICRhcmctPntyZXN1bHR9IH0gfSwgJHJvb3Qg aWYgJGFyZy0+e3Jlc3VsdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNl IHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRhcmcsICJjYW5ub3QgdW5saW5rIGZpbGUi LCAkY2Fub24gKTsKICAgICAgICAgICAgICAgICAgICBfRk9SQ0VfV1JJVEFCTEUgYW5kIGNobW9k KCAkcGVybSwgJHJvb3QgKQogICAgICAgICAgICAgICAgICAgICAgb3IgX2Vycm9yKCAkYXJnLAog ICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiY2Fubm90IHJlc3RvcmUgcGVybWlzc2lv bnMgdG8gMCVvIiwgJHBlcm0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgJGNhbm9uICk7CiAg ICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg ICsrJGNvdW50OwogICAgICAgICAgICAgICAgbGFzdCB1bmxlc3MgX0lTX1ZNUyAmJiBsc3RhdCAk cm9vdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkY291bnQ7Cn0K CnN1YiBfc2xhc2hfbGMgewoKICAgICMgZml4IHVwIHNsYXNoZXMgYW5kIGNhc2Ugb24gTVNXaW4z MiBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgdGhhdAogICAgIyBjOlxwYXRoXHRvXGRpciBpcyB1 bmRlcm5lYXRoIEM6L1BhdGgvVG8KICAgIG15ICRwYXRoID0gc2hpZnQ7CiAgICAkcGF0aCA9fiB0 cntcXH17L307CiAgICByZXR1cm4gbGMoJHBhdGgpOwp9CgoxOwoKX19FTkRfXwoKPWhlYWQxIE5B TUUKCkZpbGU6OlBhdGggLSBDcmVhdGUgb3IgcmVtb3ZlIGRpcmVjdG9yeSB0cmVlcwoKPWhlYWQx IFZFUlNJT04KClRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHZlcnNpb24gMi4xMiBvZiBGaWxlOjpQ YXRoLgoKPWhlYWQxIFNZTk9QU0lTCgogIHVzZSBGaWxlOjpQYXRoIHF3KG1ha2VfcGF0aCByZW1v dmVfdHJlZSk7CgogIEBjcmVhdGVkID0gbWFrZV9wYXRoKCdmb28vYmFyL2JheicsICcvenVnL3p3 YW5nJyk7CiAgQGNyZWF0ZWQgPSBtYWtlX3BhdGgoJ2Zvby9iYXIvYmF6JywgJy96dWcvendhbmcn LCB7CiAgICAgIHZlcmJvc2UgPT4gMSwKICAgICAgbW9kZSA9PiAwNzExLAogIH0pOwogIG1ha2Vf cGF0aCgnZm9vL2Jhci9iYXonLCAnL3p1Zy96d2FuZycsIHsKICAgICAgY2htb2QgPT4gMDc3NywK ICB9KTsKCiAgJHJlbW92ZWRfY291bnQgPSByZW1vdmVfdHJlZSgnZm9vL2Jhci9iYXonLCAnL3p1 Zy96d2FuZycpOwogICRyZW1vdmVkX2NvdW50ID0gcmVtb3ZlX3RyZWUoJ2Zvby9iYXIvYmF6Jywg Jy96dWcvendhbmcnLCB7CiAgICAgIHZlcmJvc2UgPT4gMSwKICAgICAgZXJyb3IgID0+IFxteSAk ZXJyX2xpc3QsCiAgfSk7CgogICMgbGVnYWN5IChpbnRlcmZhY2UgcHJvbW90ZWQgYmVmb3JlIHYy LjAwKQogIEBjcmVhdGVkID0gbWtwYXRoKCcvZm9vL2Jhci9iYXonKTsKICBAY3JlYXRlZCA9IG1r cGF0aCgnL2Zvby9iYXIvYmF6JywgMSwgMDcxMSk7CiAgQGNyZWF0ZWQgPSBta3BhdGgoWycvZm9v L2Jhci9iYXonLCAnYmx1cmZsL3F1dXgnXSwgMSwgMDcxMSk7CiAgJHJlbW92ZWRfY291bnQgPSBy bXRyZWUoJ2Zvby9iYXIvYmF6JywgMSwgMSk7CiAgJHJlbW92ZWRfY291bnQgPSBybXRyZWUoWydm b28vYmFyL2JheicsICdibHVyZmwvcXV1eCddLCAxLCAxKTsKCiAgIyBsZWdhY3kgKGludGVyZmFj ZSBwcm9tb3RlZCBiZWZvcmUgdjIuMDYpCiAgQGNyZWF0ZWQgPSBta3BhdGgoJ2Zvby9iYXIvYmF6 JywgJy96dWcvendhbmcnLCB7IHZlcmJvc2UgPT4gMSwgbW9kZSA9PiAwNzExIH0pOwogICRyZW1v dmVkX2NvdW50ID0gcm10cmVlKCdmb28vYmFyL2JheicsICcvenVnL3p3YW5nJywgeyB2ZXJib3Nl ID0+IDEsIG1vZGUgPT4gMDcxMSB9KTsKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUg cHJvdmlkZSBhIGNvbnZlbmllbnQgd2F5IHRvIGNyZWF0ZSBkaXJlY3RvcmllcyBvZgphcmJpdHJh cnkgZGVwdGggYW5kIHRvIGRlbGV0ZSBhbiBlbnRpcmUgZGlyZWN0b3J5IHN1YnRyZWUgZnJvbSB0 aGUKZmlsZXN5c3RlbS4KClRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKCj1v dmVyCgo9aXRlbSBtYWtlX3BhdGgoICRkaXIxLCAkZGlyMiwgLi4uLiApCgo9aXRlbSBtYWtlX3Bh dGgoICRkaXIxLCAkZGlyMiwgLi4uLiwgXCVvcHRzICkKClRoZSBDPG1ha2VfcGF0aD4gZnVuY3Rp b24gY3JlYXRlcyB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgaWYgdGhleSBkb24ndApleGlzdHMgYmVm b3JlLCBtdWNoIGxpa2UgdGhlIFVuaXggY29tbWFuZCBDPG1rZGlyIC1wPi4KClRoZSBmdW5jdGlv biBhY2NlcHRzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLiBJdHMKYmVoYXZp b3VyIG1heSBiZSB0dW5lZCBieSBhbiBvcHRpb25hbCBoYXNocmVmIGFwcGVhcmluZyBhcyB0aGUg bGFzdApwYXJhbWV0ZXIgb24gdGhlIGNhbGwuCgpUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlz dCBvZiBkaXJlY3RvcmllcyBhY3R1YWxseSBjcmVhdGVkIGR1cmluZwp0aGUgY2FsbDsgaW4gc2Nh bGFyIGNvbnRleHQgdGhlIG51bWJlciBvZiBkaXJlY3RvcmllcyBjcmVhdGVkLgoKVGhlIGZvbGxv d2luZyBrZXlzIGFyZSByZWNvZ25pc2VkIGluIHRoZSBvcHRpb24gaGFzaDoKCj1vdmVyCgo9aXRl bSBtb2RlID0+ICRudW0KClRoZSBudW1lcmljIHBlcm1pc3Npb25zIG1vZGUgdG8gYXBwbHkgdG8g ZWFjaCBjcmVhdGVkIGRpcmVjdG9yeQooZGVmYXVsdHMgdG8gMDc3NyksIHRvIGJlIG1vZGlmaWVk IGJ5IHRoZSBjdXJyZW50IEM8dW1hc2s+LiBJZiB0aGUKZGlyZWN0b3J5IGFscmVhZHkgZXhpc3Rz IChhbmQgdGh1cyBkb2VzIG5vdCBuZWVkIHRvIGJlIGNyZWF0ZWQpLAp0aGUgcGVybWlzc2lvbnMg d2lsbCBub3QgYmUgbW9kaWZpZWQuCgpDPG1hc2s+IGlzIHJlY29nbmlzZWQgYXMgYW4gYWxpYXMg Zm9yIHRoaXMgcGFyYW1ldGVyLgoKPWl0ZW0gY2htb2QgPT4gJG51bQoKVGFrZXMgYSBudW1lcmlj IG1vZGUgdG8gYXBwbHkgdG8gZWFjaCBjcmVhdGVkIGRpcmVjdG9yeSAobm90Cm1vZGlmaWVkIGJ5 IHRoZSBjdXJyZW50IEM8dW1hc2s+KS4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cwoo YW5kIHRodXMgZG9lcyBub3QgbmVlZCB0byBiZSBjcmVhdGVkKSwgdGhlIHBlcm1pc3Npb25zIHdp bGwKbm90IGJlIG1vZGlmaWVkLgoKPWl0ZW0gdmVyYm9zZSA9PiAkYm9vbAoKSWYgcHJlc2VudCwg d2lsbCBjYXVzZSBDPG1ha2VfcGF0aD4gdG8gcHJpbnQgdGhlIG5hbWUgb2YgZWFjaCBkaXJlY3Rv cnkKYXMgaXQgaXMgY3JlYXRlZC4gQnkgZGVmYXVsdCBub3RoaW5nIGlzIHByaW50ZWQuCgo9aXRl bSBlcnJvciA9PiBcJGVycgoKSWYgcHJlc2VudCwgaXQgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRv IGEgc2NhbGFyLgpUaGlzIHNjYWxhciB3aWxsIGJlIG1hZGUgdG8gcmVmZXJlbmNlIGFuIGFycmF5 LCB3aGljaCB3aWxsCmJlIHVzZWQgdG8gc3RvcmUgYW55IGVycm9ycyB0aGF0IGFyZSBlbmNvdW50 ZXJlZC4gIFNlZSB0aGUgTDwvIkVSUk9SCkhBTkRMSU5HIj4gc2VjdGlvbiBmb3IgbW9yZSBpbmZv cm1hdGlvbi4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCBjZXJ0YWluIGVycm9yIGNv bmRpdGlvbnMgbWF5IHJhaXNlCmEgZmF0YWwgZXJyb3IgdGhhdCB3aWxsIGNhdXNlIHRoZSBwcm9n cmFtIHRvIGhhbHQsIHVubGVzcyB0cmFwcGVkCmluIGFuIEM8ZXZhbD4gYmxvY2suCgo9aXRlbSBv d25lciA9PiAkb3duZXIKCj1pdGVtIHVzZXIgPT4gJG93bmVyCgo9aXRlbSB1aWQgPT4gJG93bmVy CgpJZiBwcmVzZW50LCB3aWxsIGNhdXNlIGFueSBjcmVhdGVkIGRpcmVjdG9yeSB0byBiZSBvd25l ZCBieSBDPCRvd25lcj4uCklmIHRoZSB2YWx1ZSBpcyBudW1lcmljLCBpdCB3aWxsIGJlIGludGVy cHJldGVkIGFzIGEgdWlkLCBvdGhlcndpc2UKYXMgdXNlcm5hbWUgaXMgYXNzdW1lZC4gQW4gZXJy b3Igd2lsbCBiZSBpc3N1ZWQgaWYgdGhlIHVzZXJuYW1lIGNhbm5vdCBiZQptYXBwZWQgdG8gYSB1 aWQsIG9yIHRoZSB1aWQgZG9lcyBub3QgZXhpc3QsIG9yIHRoZSBwcm9jZXNzIGxhY2tzIHRoZQpw cml2aWxlZ2VzIHRvIGNoYW5nZSBvd25lcnNoaXAuCgpPd25lcnNoaXAgb2YgZGlyZWN0b3JpZXMg dGhhdCBhbHJlYWR5IGV4aXN0IHdpbGwgbm90IGJlIGNoYW5nZWQuCgpDPHVzZXI+IGFuZCBDPHVp ZD4gYXJlIGFsaWFzZXMgb2YgQzxvd25lcj4uCgo9aXRlbSBncm91cCA9PiAkZ3JvdXAKCklmIHBy ZXNlbnQsIHdpbGwgY2F1c2UgYW55IGNyZWF0ZWQgZGlyZWN0b3J5IHRvIGJlIG93bmVkIGJ5IHRo ZSBncm91cCBDPCRncm91cD4uCklmIHRoZSB2YWx1ZSBpcyBudW1lcmljLCBpdCB3aWxsIGJlIGlu dGVycHJldGVkIGFzIGEgZ2lkLCBvdGhlcndpc2UKYXMgZ3JvdXAgbmFtZSBpcyBhc3N1bWVkLiBB biBlcnJvciB3aWxsIGJlIGlzc3VlZCBpZiB0aGUgZ3JvdXAgbmFtZSBjYW5ub3QgYmUKbWFwcGVk IHRvIGEgZ2lkLCBvciB0aGUgZ2lkIGRvZXMgbm90IGV4aXN0LCBvciB0aGUgcHJvY2VzcyBsYWNr cyB0aGUKcHJpdmlsZWdlcyB0byBjaGFuZ2UgZ3JvdXAgb3duZXJzaGlwLgoKR3JvdXAgb3duZXJz aGlwIG9mIGRpcmVjdG9yaWVzIHRoYXQgYWxyZWFkeSBleGlzdCB3aWxsIG5vdCBiZSBjaGFuZ2Vk LgoKICAgIG1ha2VfcGF0aCAnL3Zhci90bXAvd2ViY2FjaGUnLCB7b3duZXI9Pidub2JvZHknLCBn cm91cD0+J25vZ3JvdXAnfTsKCj1iYWNrCgo9aXRlbSBta3BhdGgoICRkaXIgKQoKPWl0ZW0gbWtw YXRoKCAkZGlyLCAkdmVyYm9zZSwgJG1vZGUgKQoKPWl0ZW0gbWtwYXRoKCBbJGRpcjEsICRkaXIy LC4uLl0sICR2ZXJib3NlLCAkbW9kZSApCgo9aXRlbSBta3BhdGgoICRkaXIxLCAkZGlyMiwuLi4s IFwlb3B0ICkKClRoZSBta3BhdGgoKSBmdW5jdGlvbiBwcm92aWRlIHRoZSBsZWdhY3kgaW50ZXJm YWNlIG9mIG1ha2VfcGF0aCgpIHdpdGgKYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gb2YgdGhl IGFyZ3VtZW50cyBwYXNzZWQuICBUaGUgYmVoYXZpb3VyIGFuZApyZXR1cm4gdmFsdWUgb2YgdGhl IGZ1bmN0aW9uIGlzIG90aGVyd2lzZSBpZGVudGljYWwgdG8gbWFrZV9wYXRoKCkuCgo9aXRlbSBy ZW1vdmVfdHJlZSggJGRpcjEsICRkaXIyLCAuLi4uICkKCj1pdGVtIHJlbW92ZV90cmVlKCAkZGly MSwgJGRpcjIsIC4uLi4sIFwlb3B0cyApCgpUaGUgQzxyZW1vdmVfdHJlZT4gZnVuY3Rpb24gZGVs ZXRlcyB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYW5kIGFueQpmaWxlcyBhbmQgc3ViZGlyZWN0b3Jp ZXMgdGhleSBtaWdodCBjb250YWluLCBtdWNoIGxpa2UgdGhlIFVuaXgKY29tbWFuZCBDPHJtIC1y PiBvciB0aGUgV2luZG93cyBjb21tYW5kcyBDPHJtZGlyIC9zPiBhbmQgQzxyZCAvcz4uIFRoZQpv bmx5IGV4Y2VwdGlvbiB0byB0aGUgZnVuY3Rpb24gc2ltaWxhcml0eSBpcyBDPHJlbW92ZV90cmVl PiBhY2NlcHRzCm9ubHkgZGlyZWN0b3JpZXMgd2hlcmVhcyBDPHJtIC1yPiBhbHNvIGFjY2VwdHMg ZmlsZXMuCgpUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUK cmVtb3ZlZC4gSXRzIGJlaGF2aW91ciBtYXkgYmUgdHVuZWQgYnkgYW4gb3B0aW9uYWwgaGFzaHJl ZgphcHBlYXJpbmcgYXMgdGhlIGxhc3QgcGFyYW1ldGVyIG9uIHRoZSBjYWxsLiAgSWYgYW4gZW1w dHkgc3RyaW5nIGlzCnBhc3NlZCB0byBDPHJlbW92ZV90cmVlPiwgYW4gZXJyb3Igd2lsbCBvY2N1 ci4KClRoZSBmdW5jdGlvbnMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIHN1Y2Nlc3NmdWxs eSBkZWxldGVkLgoKVGhlIGZvbGxvd2luZyBrZXlzIGFyZSByZWNvZ25pc2VkIGluIHRoZSBvcHRp b24gaGFzaDoKCj1vdmVyCgo9aXRlbSB2ZXJib3NlID0+ICRib29sCgpJZiBwcmVzZW50LCB3aWxs IGNhdXNlIEM8cmVtb3ZlX3RyZWU+IHRvIHByaW50IHRoZSBuYW1lIG9mIGVhY2ggZmlsZSBhcwpp dCBpcyB1bmxpbmtlZC4gQnkgZGVmYXVsdCBub3RoaW5nIGlzIHByaW50ZWQuCgo9aXRlbSBzYWZl ID0+ICRib29sCgpXaGVuIHNldCB0byBhIHRydWUgdmFsdWUsIHdpbGwgY2F1c2UgQzxyZW1vdmVf dHJlZT4gdG8gc2tpcCB0aGUgZmlsZXMKZm9yIHdoaWNoIHRoZSBwcm9jZXNzIGxhY2tzIHRoZSBy ZXF1aXJlZCBwcml2aWxlZ2VzIG5lZWRlZCB0byBkZWxldGUKZmlsZXMsIHN1Y2ggYXMgZGVsZXRl IHByaXZpbGVnZXMgb24gVk1TLiBJbiBvdGhlciB3b3JkcywgdGhlIGNvZGUKd2lsbCBtYWtlIG5v IGF0dGVtcHQgdG8gYWx0ZXIgZmlsZSBwZXJtaXNzaW9ucy4gVGh1cywgaWYgdGhlIHByb2Nlc3MK aXMgaW50ZXJydXB0ZWQsIG5vIGZpbGVzeXN0ZW0gb2JqZWN0IHdpbGwgYmUgbGVmdCBpbiBhIG1v cmUKcGVybWlzc2l2ZSBtb2RlLgoKPWl0ZW0ga2VlcF9yb290ID0+ICRib29sCgpXaGVuIHNldCB0 byBhIHRydWUgdmFsdWUsIHdpbGwgY2F1c2UgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllcwp0 byBiZSByZW1vdmVkLCBleGNlcHQgdGhlIGluaXRpYWxseSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMu IFRoaXMgY29tZXMKaW4gaGFuZHkgd2hlbiBjbGVhbmluZyBvdXQgYW4gYXBwbGljYXRpb24ncyBz Y3JhdGNoIGRpcmVjdG9yeS4KCiAgcmVtb3ZlX3RyZWUoICcvdG1wJywge2tlZXBfcm9vdCA9PiAx fSApOwoKPWl0ZW0gcmVzdWx0ID0+IFwkcmVzCgpJZiBwcmVzZW50LCBpdCBzaG91bGQgYmUgYSBy ZWZlcmVuY2UgdG8gYSBzY2FsYXIuClRoaXMgc2NhbGFyIHdpbGwgYmUgbWFkZSB0byByZWZlcmVu Y2UgYW4gYXJyYXksIHdoaWNoIHdpbGwKYmUgdXNlZCB0byBzdG9yZSBhbGwgZmlsZXMgYW5kIGRp cmVjdG9yaWVzIHVubGlua2VkCmR1cmluZyB0aGUgY2FsbC4gSWYgbm90aGluZyBpcyB1bmxpbmtl ZCwgdGhlIGFycmF5IHdpbGwgYmUgZW1wdHkuCgogIHJlbW92ZV90cmVlKCAnL3RtcCcsIHtyZXN1 bHQgPT4gXG15ICRsaXN0fSApOwogIHByaW50ICJ1bmxpbmtlZCAkX1xuIiBmb3IgQCRsaXN0OwoK VGhpcyBpcyBhIHVzZWZ1bCBhbHRlcm5hdGl2ZSB0byB0aGUgQzx2ZXJib3NlPiBrZXkuCgo9aXRl bSBlcnJvciA9PiBcJGVycgoKSWYgcHJlc2VudCwgaXQgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRv IGEgc2NhbGFyLgpUaGlzIHNjYWxhciB3aWxsIGJlIG1hZGUgdG8gcmVmZXJlbmNlIGFuIGFycmF5 LCB3aGljaCB3aWxsCmJlIHVzZWQgdG8gc3RvcmUgYW55IGVycm9ycyB0aGF0IGFyZSBlbmNvdW50 ZXJlZC4gIFNlZSB0aGUgTDwvIkVSUk9SCkhBTkRMSU5HIj4gc2VjdGlvbiBmb3IgbW9yZSBpbmZv cm1hdGlvbi4KClJlbW92aW5nIHRoaW5ncyBpcyBhIG11Y2ggbW9yZSBkYW5nZXJvdXMgcHJvcG9z aXRpb24gdGhhbgpjcmVhdGluZyB0aGluZ3MuIEFzIHN1Y2gsIHRoZXJlIGFyZSBjZXJ0YWluIGNv bmRpdGlvbnMgdGhhdApDPHJlbW92ZV90cmVlPiBtYXkgZW5jb3VudGVyIHRoYXQgYXJlIHNvIGRh bmdlcm91cyB0aGF0IHRoZSBvbmx5CnNhbmUgYWN0aW9uIGxlZnQgaXMgdG8ga2lsbCB0aGUgcHJv Z3JhbS4KClVzZSBDPGVycm9yPiB0byB0cmFwIGFsbCB0aGF0IGlzIHJlYXNvbmFibGUgKHByb2Js ZW1zIHdpdGgKcGVybWlzc2lvbnMgYW5kIHRoZSBsaWtlKSwgYW5kIGxldCBpdCBkaWUgaWYgdGhp bmdzIGdldCBvdXQKb2YgaGFuZC4gVGhpcyBpcyB0aGUgc2FmZXN0IGNvdXJzZSBvZiBhY3Rpb24u Cgo9YmFjawoKPWl0ZW0gcm10cmVlKCAkZGlyICkKCj1pdGVtIHJtdHJlZSggJGRpciwgJHZlcmJv c2UsICRzYWZlICkKCj1pdGVtIHJtdHJlZSggWyRkaXIxLCAkZGlyMiwuLi5dLCAkdmVyYm9zZSwg JHNhZmUgKQoKPWl0ZW0gcm10cmVlKCAkZGlyMSwgJGRpcjIsLi4uLCBcJW9wdCApCgpUaGUgcm10 cmVlKCkgZnVuY3Rpb24gcHJvdmlkZSB0aGUgbGVnYWN5IGludGVyZmFjZSBvZiByZW1vdmVfdHJl ZSgpCndpdGggYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGFyZ3VtZW50cyBwYXNz ZWQuIFRoZSBiZWhhdmlvdXIKYW5kIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgb3Ro ZXJ3aXNlIGlkZW50aWNhbCB0bwpyZW1vdmVfdHJlZSgpLgoKPWJhY2sKCj1oZWFkMiBFUlJPUiBI QU5ETElORwoKPW92ZXIgNAoKPWl0ZW0gQjxOT1RFOj4KClRoZSBmb2xsb3dpbmcgZXJyb3IgaGFu ZGxpbmcgbWVjaGFuaXNtIGlzIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwKY29kZSBwYXRocyBF WENFUFQgaW4gY2FzZXMgd2hlcmUgdGhlIFJPT1Qgbm9kZSBpcyBub25leGlzdGVudC4gIEluCnZl cnNpb24gMi4xMSB0aGUgbWFpbnRhaW5lcnMgYXR0ZW1wdGVkIHRvIHJlY3RpZnkgdGhpcyBpbmNv bnNpc3RlbmN5CmJ1dCB0b28gbWFueSBkb3duc3RyZWFtIG1vZHVsZXMgZW5jb3VudGVyZWQgcHJv YmxlbXMuICBJbiBzdWNoIGNhc2UsCmlmIHlvdSByZXF1aXJlIHJvb3Qgbm9kZSBldmFsdWF0aW9u IG9yIGVycm9yIGNoZWNraW5nIHByaW9yIHRvIGNhbGxpbmcKQzxtYWtlX3BhdGg+IG9yIEM8cmVt b3ZlX3RyZWU+LCB5b3Ugc2hvdWxkIHRha2UgYWRkaXRpb25hbCBwcmVjYXV0aW9ucy4KCj1iYWNr CgpJZiBDPG1ha2VfcGF0aD4gb3IgQzxyZW1vdmVfdHJlZT4gZW5jb3VudGVyIGFuIGVycm9yLCBh IGRpYWdub3N0aWMKbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQgdG8gQzxTVERFUlI+IHZpYSBDPGNh cnA+IChmb3Igbm9uLWZhdGFsCmVycm9ycyksIG9yIHZpYSBDPGNyb2FrPiAoZm9yIGZhdGFsIGVy cm9ycykuCgpJZiB0aGlzIGJlaGF2aW91ciBpcyBub3QgZGVzaXJhYmxlLCB0aGUgQzxlcnJvcj4g YXR0cmlidXRlIG1heSBiZQp1c2VkIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZSwg d2hpY2ggd2lsbCBiZSB1c2VkIHRvIHN0b3JlCnRoZSBkaWFnbm9zdGljcy4gVGhlIHZhcmlhYmxl IGlzIG1hZGUgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgb2YgaGFzaApyZWZlcmVuY2VzLiAgRWFj aCBoYXNoIGNvbnRhaW4gYSBzaW5nbGUga2V5L3ZhbHVlIHBhaXIgd2hlcmUgdGhlIGtleQppcyB0 aGUgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZXJyb3IgbWVzc2FnZSAo aW5jbHVkaW5nCnRoZSBjb250ZW50cyBvZiBDPCQhPiB3aGVuIGFwcHJvcHJpYXRlKS4gIElmIGEg Z2VuZXJhbCBlcnJvciBpcwplbmNvdW50ZXJlZCB0aGUgZGlhZ25vc3RpYyBrZXkgd2lsbCBiZSBl bXB0eS4KCkFuIGV4YW1wbGUgdXNhZ2UgbG9va3MgbGlrZToKCiAgcmVtb3ZlX3RyZWUoICdmb28v YmFyJywgJ2Jhci9yYXQnLCB7ZXJyb3IgPT4gXG15ICRlcnJ9ICk7CiAgaWYgKEAkZXJyKSB7CiAg ICAgIGZvciBteSAkZGlhZyAoQCRlcnIpIHsKICAgICAgICAgIG15ICgkZmlsZSwgJG1lc3NhZ2Up ID0gJSRkaWFnOwogICAgICAgICAgaWYgKCRmaWxlIGVxICcnKSB7CiAgICAgICAgICAgICAgcHJp bnQgImdlbmVyYWwgZXJyb3I6ICRtZXNzYWdlXG4iOwogICAgICAgICAgfQogICAgICAgICAgZWxz ZSB7CiAgICAgICAgICAgICAgcHJpbnQgInByb2JsZW0gdW5saW5raW5nICRmaWxlOiAkbWVzc2Fn ZVxuIjsKICAgICAgICAgIH0KICAgICAgfQogIH0KICBlbHNlIHsKICAgICAgcHJpbnQgIk5vIGVy cm9yIGVuY291bnRlcmVkXG4iOwogIH0KCk5vdGUgdGhhdCBpZiBubyBlcnJvcnMgYXJlIGVuY291 bnRlcmVkLCBDPCRlcnI+IHdpbGwgcmVmZXJlbmNlIGFuCmVtcHR5IGFycmF5LiAgVGhpcyBtZWFu cyB0aGF0IEM8JGVycj4gd2lsbCBhbHdheXMgZW5kIHVwIFRSVUU7IHNvIHlvdQpuZWVkIHRvIHRl c3QgQzxAJGVycj4gdG8gZGV0ZXJtaW5lIGlmIGVycm9ycyBvY2N1cnJlZC4KCj1oZWFkMiBOT1RF UwoKQzxGaWxlOjpQYXRoPiBibGluZGx5IGV4cG9ydHMgQzxta3BhdGg+IGFuZCBDPHJtdHJlZT4g aW50byB0aGUKY3VycmVudCBuYW1lc3BhY2UuIFRoZXNlIGRheXMsIHRoaXMgaXMgY29uc2lkZXJl ZCBiYWQgc3R5bGUsIGJ1dAp0byBjaGFuZ2UgaXQgbm93IHdvdWxkIGJyZWFrIHRvbyBtdWNoIGNv ZGUuIE5vbmV0aGVsZXNzLCB5b3UgYXJlCmludml0ZWQgdG8gc3BlY2lmeSB3aGF0IGl0IGlzIHlv dSBhcmUgZXhwZWN0aW5nIHRvIHVzZToKCiAgdXNlIEZpbGU6OlBhdGggJ3JtdHJlZSc7CgpUaGUg cm91dGluZXMgQzxtYWtlX3BhdGg+IGFuZCBDPHJlbW92ZV90cmVlPiBhcmUgQjxub3Q+IGV4cG9y dGVkCmJ5IGRlZmF1bHQuIFlvdSBtdXN0IHNwZWNpZnkgd2hpY2ggb25lcyB5b3Ugd2FudCB0byB1 c2UuCgogIHVzZSBGaWxlOjpQYXRoICdyZW1vdmVfdHJlZSc7CgpOb3RlIHRoYXQgYSBzaWRlLWVm ZmVjdCBvZiB0aGUgYWJvdmUgaXMgdGhhdCBDPG1rcGF0aD4gYW5kIEM8cm10cmVlPgphcmUgbm8g bG9uZ2VyIGV4cG9ydGVkIGF0IGFsbC4gVGhpcyBpcyBkdWUgdG8gdGhlIHdheSB0aGUgQzxFeHBv cnRlcj4KbW9kdWxlIHdvcmtzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBhIGNvZGViYXNlIHRvIHVz ZSB0aGUgbmV3CmludGVyZmFjZSwgeW91IHdpbGwgaGF2ZSB0byBsaXN0IGV2ZXJ5dGhpbmcgZXhw bGljaXRseS4gQnV0IHRoYXQncwpqdXN0IGdvb2QgcHJhY3RpY2UgYW55d2F5LgoKICB1c2UgRmls ZTo6UGF0aCBxdyhyZW1vdmVfdHJlZSBybXRyZWUpOwoKPWhlYWQzIEFQSSBDSEFOR0VTCgpUaGUg QVBJIHdhcyBjaGFuZ2VkIGluIHRoZSAyLjAgYnJhbmNoLiBGb3IgYSB0aW1lLCBDPG1rcGF0aD4g YW5kCkM8cm10cmVlPiB0cmllZCwgdW5zdWNjZXNzZnVsbHksIHRvIGRlYWwgd2l0aCB0aGUgdHdv IGRpZmZlcmVudApjYWxsaW5nIG1lY2hhbmlzbXMuIFRoaXMgYXBwcm9hY2ggd2FzIGNvbnNpZGVy ZWQgYSBmYWlsdXJlLgoKVGhlIG5ldyBzZW1hbnRpY3MgYXJlIG5vdyBvbmx5IGF2YWlsYWJsZSB3 aXRoIEM8bWFrZV9wYXRoPiBhbmQKQzxyZW1vdmVfdHJlZT4uIFRoZSBvbGQgc2VtYW50aWNzIGFy ZSBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoCkM8bWtwYXRoPiBhbmQgQzxybXRyZWU+LiBVc2VycyBh cmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1cGdyYWRlCnRvIGF0IGxlYXN0IDIuMDggaW4gb3Jk ZXIgdG8gYXZvaWQgc3VycHJpc2VzLgoKPWhlYWQzIFNFQ1VSSVRZIENPTlNJREVSQVRJT05TCgpU aGVyZSB3ZXJlIHJhY2UgY29uZGl0aW9ucyAxLnggaW1wbGVtZW50YXRpb25zIG9mIEZpbGU6OlBh dGgncwpDPHJtdHJlZT4gZnVuY3Rpb24gKGFsdGhvdWdoIHNvbWV0aW1lcyBwYXRjaGVkIGRlcGVu ZGluZyBvbiB0aGUgT1MKZGlzdHJpYnV0aW9uIG9yIHBsYXRmb3JtKS4gVGhlIDIuMCB2ZXJzaW9u IGNvbnRhaW5zIGNvZGUgdG8gYXZvaWQgdGhlCnByb2JsZW0gbWVudGlvbmVkIGluIENWRS0yMDAy LTA0MzUuCgpTZWUgdGhlIGZvbGxvd2luZyBwYWdlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKCiAg aHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTI4NjkwNQog IGh0dHA6Ly93d3cubm50cC5wZXJsLm9yZy9ncm91cC9wZXJsLnBlcmw1LnBvcnRlcnMvMjAwNS8w MS9tc2c5NzYyMy5odG1sCiAgaHR0cDovL3d3dy5kZWJpYW4ub3JnL3NlY3VyaXR5LzIwMDUvZHNh LTY5NgoKQWRkaXRpb25hbGx5LCB1bmxlc3MgdGhlIEM8c2FmZT4gcGFyYW1ldGVyIGlzIHNldCAo b3IgdGhlCnRoaXJkIHBhcmFtZXRlciBpbiB0aGUgdHJhZGl0aW9uYWwgaW50ZXJmYWNlIGlzIFRS VUUpLCBzaG91bGQgYQpDPHJlbW92ZV90cmVlPiBiZSBpbnRlcnJ1cHRlZCwgZmlsZXMgdGhhdCB3 ZXJlIG9yaWdpbmFsbHkgaW4gcmVhZC1vbmx5Cm1vZGUgbWF5IG5vdyBoYXZlIHRoZWlyIHBlcm1p c3Npb25zIHNldCB0byBhIHJlYWQtd3JpdGUgKG9yICJkZWxldGUKT0siKSBtb2RlLgoKPWhlYWQx IERJQUdOT1NUSUNTCgpGQVRBTCBlcnJvcnMgd2lsbCBjYXVzZSB0aGUgcHJvZ3JhbSB0byBoYWx0 IChDPGNyb2FrPiksIHNpbmNlIHRoZQpwcm9ibGVtIGlzIHNvIHNldmVyZSB0aGF0IGl0IHdvdWxk IGJlIGRhbmdlcm91cyB0byBjb250aW51ZS4gKFRoaXMKY2FuIGFsd2F5cyBiZSB0cmFwcGVkIHdp dGggQzxldmFsPiwgYnV0IGl0J3Mgbm90IGEgZ29vZCBpZGVhLiBVbmRlcgp0aGUgY2lyY3Vtc3Rh bmNlcywgZHlpbmcgaXMgdGhlIGJlc3QgdGhpbmcgdG8gZG8pLgoKU0VWRVJFIGVycm9ycyBtYXkg YmUgdHJhcHBlZCB1c2luZyB0aGUgbW9kZXJuIGludGVyZmFjZS4gSWYgdGhlCnRoZXkgYXJlIG5v dCB0cmFwcGVkLCBvciB0aGUgb2xkIGludGVyZmFjZSBpcyB1c2VkLCBzdWNoIGFuIGVycm9yCndp bGwgY2F1c2UgdGhlIHByb2dyYW0gd2lsbCBoYWx0LgoKQWxsIG90aGVyIGVycm9ycyBtYXkgYmUg dHJhcHBlZCB1c2luZyB0aGUgbW9kZXJuIGludGVyZmFjZSwgb3RoZXJ3aXNlCnRoZXkgd2lsbCBi ZSBDPGNhcnA+ZWQgYWJvdXQuIFByb2dyYW0gZXhlY3V0aW9uIHdpbGwgbm90IGJlIGhhbHRlZC4K Cj1vdmVyIDQKCj1pdGVtIG1rZGlyIFtwYXRoXTogW2Vycm1zZ10gKFNFVkVSRSkKCkM8bWFrZV9w YXRoPiB3YXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGF0aC4gUHJvYmFibHkgc29tZSBzb3J0IG9m CnBlcm1pc3Npb25zIGVycm9yIGF0IHRoZSBwb2ludCBvZiBkZXBhcnR1cmUsIG9yIGluc3VmZmlj aWVudCByZXNvdXJjZXMKKHN1Y2ggYXMgZnJlZSBpbm9kZXMgb24gVW5peCkuCgo9aXRlbSBObyBy b290IHBhdGgocykgc3BlY2lmaWVkCgpDPG1ha2VfcGF0aD4gd2FzIG5vdCBnaXZlbiBhbnkgcGF0 aHMgdG8gY3JlYXRlLiBUaGlzIG1lc3NhZ2UgaXMgb25seQplbWl0dGVkIGlmIHRoZSByb3V0aW5l IGlzIGNhbGxlZCB3aXRoIHRoZSB0cmFkaXRpb25hbCBpbnRlcmZhY2UuClRoZSBtb2Rlcm4gaW50 ZXJmYWNlIHdpbGwgcmVtYWluIHNpbGVudCBpZiBnaXZlbiBub3RoaW5nIHRvIGRvLgoKPWl0ZW0g Tm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQoKT24gV2luZG93cywgaWYgQzxtYWtlX3BhdGg+IGdp dmVzIHlvdSB0aGlzIHdhcm5pbmcsIGl0IG1heSBtZWFuIHRoYXQKeW91IGhhdmUgZXhjZWVkZWQg eW91ciBmaWxlc3lzdGVtJ3MgbWF4aW11bSBwYXRoIGxlbmd0aC4KCj1pdGVtIGNhbm5vdCBmZXRj aCBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5OiBbZXJybXNnXQoKQzxyZW1vdmVfdHJlZT4gYXR0 ZW1wdGVkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBkaXJlY3RvcnkgYnkgY2FsbGluZwpDPEN3 ZDo6Z2V0Y3dkPiwgYnV0IHRoZSBjYWxsIGZhaWxlZCBmb3Igc29tZSByZWFzb24uIE5vIGF0dGVt cHQKd2lsbCBiZSBtYWRlIHRvIGRlbGV0ZSBhbnl0aGluZy4KCj1pdGVtIGNhbm5vdCBzdGF0IGlu aXRpYWwgd29ya2luZyBkaXJlY3Rvcnk6IFtlcnJtc2ddCgpDPHJlbW92ZV90cmVlPiBhdHRlbXB0 ZWQgdG8gc3RhdCB0aGUgaW5pdGlhbCBkaXJlY3RvcnkgKGFmdGVyIGhhdmluZwpzdWNjZXNzZnVs bHkgb2J0YWluZWQgaXRzIG5hbWUgdmlhIEM8Z2V0Y3dkPiksIGhvd2V2ZXIsIHRoZSBjYWxsCmZh aWxlZCBmb3Igc29tZSByZWFzb24uIE5vIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGRlbGV0ZSBh bnl0aGluZy4KCj1pdGVtIGNhbm5vdCBjaGRpciB0byBbZGlyXTogW2Vycm1zZ10KCkM8cmVtb3Zl X3RyZWU+IGF0dGVtcHRlZCB0byBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGluIG9yZGVyIHRv CmJlZ2luIGRlbGV0aW5nIHRoZSBvYmplY3RzIHRoZXJlaW4sIGJ1dCB3YXMgdW5zdWNjZXNzZnVs LiBUaGlzIGlzCnVzdWFsbHkgYSBwZXJtaXNzaW9ucyBpc3N1ZS4gVGhlIHJvdXRpbmUgd2lsbCBj b250aW51ZSB0byBkZWxldGUKb3RoZXIgdGhpbmdzLCBidXQgdGhpcyBkaXJlY3Rvcnkgd2lsbCBi ZSBsZWZ0IGludGFjdC4KCj1pdGVtIGRpcmVjdG9yeSBbZGlyXSBjaGFuZ2VkIGJlZm9yZSBjaGRp ciwgZXhwZWN0ZWQgZGV2PVtuXSBpbm89W25dLCBhY3R1YWwgZGV2PVtuXSBpbm89W25dLCBhYm9y dGluZy4gKEZBVEFMKQoKQzxyZW1vdmVfdHJlZT4gcmVjb3JkZWQgdGhlIGRldmljZSBhbmQgaW5v ZGUgb2YgYSBkaXJlY3RvcnksIGFuZCB0aGVuCm1vdmVkIGludG8gaXQuIEl0IHRoZW4gcGVyZm9y bWVkIGEgQzxzdGF0PiBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKYW5kIGRldGVjdGVkIHRoYXQg dGhlIGRldmljZSBhbmQgaW5vZGUgd2VyZSBubyBsb25nZXIgdGhlIHNhbWUuIEFzCnRoaXMgaXMg YXQgdGhlIGhlYXJ0IG9mIHRoZSByYWNlIGNvbmRpdGlvbiBwcm9ibGVtLCB0aGUgcHJvZ3JhbQp3 aWxsIGRpZSBhdCB0aGlzIHBvaW50LgoKPWl0ZW0gY2Fubm90IG1ha2UgZGlyZWN0b3J5IFtkaXJd IHJlYWQrd3JpdGVhYmxlOiBbZXJybXNnXQoKQzxyZW1vdmVfdHJlZT4gYXR0ZW1wdGVkIHRvIGNo YW5nZSB0aGUgcGVybWlzc2lvbnMgb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CnRvIGVuc3VyZSB0 aGF0IHN1YnNlcXVlbnQgdW5saW5raW5ncyB3b3VsZCBub3QgcnVuIGludG8gcHJvYmxlbXMsCmJ1 dCB3YXMgdW5hYmxlIHRvIGRvIHNvLiBUaGUgcGVybWlzc2lvbnMgcmVtYWluIGFzIHRoZXkgd2Vy ZSwgYW5kCnRoZSBwcm9ncmFtIHdpbGwgY2Fycnkgb24sIGRvaW5nIHRoZSBiZXN0IGl0IGNhbi4K Cj1pdGVtIGNhbm5vdCByZWFkIFtkaXJdOiBbZXJybXNnXQoKQzxyZW1vdmVfdHJlZT4gdHJpZWQg dG8gcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBpbiBvcmRlcgp0byBhY3F1aXJl IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3J5IGVudHJpZXMgdG8gYmUgdW5saW5rZWQsIGJ1dAp3 YXMgdW5zdWNjZXNzZnVsLiBUaGlzIGlzIHVzdWFsbHkgYSBwZXJtaXNzaW9ucyBpc3N1ZS4gVGhl CnByb2dyYW0gd2lsbCBjb250aW51ZSwgYnV0IHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB3 aWxsIHJlbWFpbgphZnRlciB0aGUgY2FsbC4KCj1pdGVtIGNhbm5vdCByZXNldCBjaG1vZCBbZGly XTogW2Vycm1zZ10KCkM8cmVtb3ZlX3RyZWU+LCBhZnRlciBoYXZpbmcgZGVsZXRlZCBldmVyeXRo aW5nIGluIGEgZGlyZWN0b3J5LCBhdHRlbXB0ZWQKdG8gcmVzdG9yZSBpdHMgcGVybWlzc2lvbnMg dG8gdGhlIG9yaWdpbmFsIHN0YXRlIGJ1dCBmYWlsZWQuIFRoZQpkaXJlY3RvcnkgbWF5IHdpbmQg dXAgYmVpbmcgbGVmdCBiZWhpbmQuCgo9aXRlbSBjYW5ub3QgcmVtb3ZlIFtkaXJdIHdoZW4gY3dk IGlzIFtkaXJdCgpUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvZ3JhbSBp cyBGPC9zb21lL3BhdGgvdG8vaGVyZT4KYW5kIHlvdSBhcmUgYXR0ZW1wdGluZyB0byByZW1vdmUg YW4gYW5jZXN0b3IsIHN1Y2ggYXMgRjwvc29tZS9wYXRoPi4KVGhlIGRpcmVjdG9yeSB0cmVlIGlz IGxlZnQgdW50b3VjaGVkLgoKVGhlIHNvbHV0aW9uIGlzIHRvIEM8Y2hkaXI+IG91dCBvZiB0aGUg Y2hpbGQgZGlyZWN0b3J5IHRvIGEgcGxhY2UKb3V0c2lkZSB0aGUgZGlyZWN0b3J5IHRyZWUgdG8g YmUgcmVtb3ZlZC4KCj1pdGVtIGNhbm5vdCBjaGRpciB0byBbcGFyZW50LWRpcl0gZnJvbSBbY2hp bGQtZGlyXTogW2Vycm1zZ10sIGFib3J0aW5nLiAoRkFUQUwpCgpDPHJlbW92ZV90cmVlPiwgYWZ0 ZXIgaGF2aW5nIGRlbGV0ZWQgZXZlcnl0aGluZyBhbmQgcmVzdG9yZWQgdGhlIHBlcm1pc3Npb25z Cm9mIGEgZGlyZWN0b3J5LCB3YXMgdW5hYmxlIHRvIGNoZGlyIGJhY2sgdG8gdGhlIHBhcmVudC4g VGhlIHByb2dyYW0KaGFsdHMgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBmcm9tIG9jY3Vycmlu Zy4KCj1pdGVtIGNhbm5vdCBzdGF0IHByaW9yIHdvcmtpbmcgZGlyZWN0b3J5IFtkaXJdOiBbZXJy bXNnXSwgYWJvcnRpbmcuIChGQVRBTCkKCkM8cmVtb3ZlX3RyZWU+IHdhcyB1bmFibGUgdG8gc3Rh dCB0aGUgcGFyZW50IGRpcmVjdG9yeSBhZnRlciBoYXZlIHJldHVybmVkCmZyb20gdGhlIGNoaWxk LiBTaW5jZSB0aGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBpZiB3ZSByZXR1cm5lZCB0bwp3aGVy ZSB3ZSB0aGluayB3ZSBzaG91bGQgYmUgKGJ5IGNvbXBhcmluZyBkZXZpY2UgYW5kIGlub2RlKSB0 aGUgb25seQp3YXkgb3V0IGlzIHRvIEM8Y3JvYWs+LgoKPWl0ZW0gcHJldmlvdXMgZGlyZWN0b3J5 IFtwYXJlbnQtZGlyXSBjaGFuZ2VkIGJlZm9yZSBlbnRlcmluZyBbY2hpbGQtZGlyXSwgZXhwZWN0 ZWQgZGV2PVtuXSBpbm89W25dLCBhY3R1YWwgZGV2PVtuXSBpbm89W25dLCBhYm9ydGluZy4gKEZB VEFMKQoKV2hlbiBDPHJlbW92ZV90cmVlPiByZXR1cm5lZCBmcm9tIGRlbGV0aW5nIGZpbGVzIGlu IGEgY2hpbGQgZGlyZWN0b3J5LCBhCmNoZWNrIHJldmVhbGVkIHRoYXQgdGhlIHBhcmVudCBkaXJl Y3RvcnkgaXQgcmV0dXJuZWQgdG8gd2Fzbid0IHRoZSBvbmUKaXQgc3RhcnRlZCBvdXQgZnJvbS4g VGhpcyBpcyBjb25zaWRlcmVkIGEgc2lnbiBvZiBtYWxpY2lvdXMgYWN0aXZpdHkuCgo9aXRlbSBj YW5ub3QgbWFrZSBkaXJlY3RvcnkgW2Rpcl0gd3JpdGVhYmxlOiBbZXJybXNnXQoKSnVzdCBiZWZv cmUgcmVtb3ZpbmcgYSBkaXJlY3RvcnkgKGFmdGVyIGhhdmluZyBzdWNjZXNzZnVsbHkgcmVtb3Zl ZApldmVyeXRoaW5nIGl0IGNvbnRhaW5lZCksIEM8cmVtb3ZlX3RyZWU+IGF0dGVtcHRlZCB0byBz ZXQgdGhlIHBlcm1pc3Npb25zCm9uIHRoZSBkaXJlY3RvcnkgdG8gZW5zdXJlIGl0IGNvdWxkIGJl IHJlbW92ZWQgYW5kIGZhaWxlZC4gUHJvZ3JhbQpleGVjdXRpb24gY29udGludWVzLCBidXQgdGhl IGRpcmVjdG9yeSBtYXkgcG9zc2libHkgbm90IGJlIGRlbGV0ZWQuCgo9aXRlbSBjYW5ub3QgcmVt b3ZlIGRpcmVjdG9yeSBbZGlyXTogW2Vycm1zZ10KCkM8cmVtb3ZlX3RyZWU+IGF0dGVtcHRlZCB0 byByZW1vdmUgYSBkaXJlY3RvcnksIGJ1dCBmYWlsZWQuIFRoaXMgbWF5IGJlY2F1c2UKc29tZSBv YmplY3RzIHRoYXQgd2VyZSB1bmFibGUgdG8gYmUgcmVtb3ZlZCByZW1haW4gaW4gdGhlIGRpcmVj dG9yeSwgb3IKYSBwZXJtaXNzaW9ucyBpc3N1ZS4gVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGxlZnQg YmVoaW5kLgoKPWl0ZW0gY2Fubm90IHJlc3RvcmUgcGVybWlzc2lvbnMgb2YgW2Rpcl0gdG8gWzBu bm5dOiBbZXJybXNnXQoKQWZ0ZXIgaGF2aW5nIGZhaWxlZCB0byByZW1vdmUgYSBkaXJlY3Rvcnks IEM8cmVtb3ZlX3RyZWU+IHdhcyB1bmFibGUgdG8KcmVzdG9yZSBpdHMgcGVybWlzc2lvbnMgZnJv bSBhIHBlcm1pc3NpdmUgc3RhdGUgYmFjayB0byBhIHBvc3NpYmx5Cm1vcmUgcmVzdHJpY3RpdmUg c2V0dGluZy4gKFBlcm1pc3Npb25zIGdpdmVuIGluIG9jdGFsKS4KCj1pdGVtIGNhbm5vdCBtYWtl IGZpbGUgW2ZpbGVdIHdyaXRlYWJsZTogW2Vycm1zZ10KCkM8cmVtb3ZlX3RyZWU+IGF0dGVtcHRl ZCB0byBmb3JjZSB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIHRvIGVuc3VyZSBpdApjb3VsZCBi ZSBkZWxldGVkLCBidXQgZmFpbGVkIHRvIGRvIHNvLiBJdCB3aWxsLCBob3dldmVyLCBzdGlsbCBh dHRlbXB0CnRvIHVubGluayB0aGUgZmlsZS4KCj1pdGVtIGNhbm5vdCB1bmxpbmsgZmlsZSBbZmls ZV06IFtlcnJtc2ddCgpDPHJlbW92ZV90cmVlPiBmYWlsZWQgdG8gcmVtb3ZlIGEgZmlsZS4gUHJv YmFibHkgYSBwZXJtaXNzaW9ucyBpc3N1ZS4KCj1pdGVtIGNhbm5vdCByZXN0b3JlIHBlcm1pc3Np b25zIG9mIFtmaWxlXSB0byBbMG5ubl06IFtlcnJtc2ddCgpBZnRlciBoYXZpbmcgZmFpbGVkIHRv IHJlbW92ZSBhIGZpbGUsIEM8cmVtb3ZlX3RyZWU+IHdhcyBhbHNvIHVuYWJsZQp0byByZXN0b3Jl IHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgZmlsZSB0byBhIHBvc3NpYmx5IGxlc3MgcGVybWlzc2l2 ZQpzZXR0aW5nLiAoUGVybWlzc2lvbnMgZ2l2ZW4gaW4gb2N0YWwpLgoKPWl0ZW0gdW5hYmxlIHRv IG1hcCBbb3duZXJdIHRvIGEgdWlkLCBvd25lcnNoaXAgbm90IGNoYW5nZWQiKTsKCkM8bWFrZV9w YXRoPiB3YXMgaW5zdHJ1Y3RlZCB0byBnaXZlIHRoZSBvd25lcnNoaXAgb2YgY3JlYXRlZApkaXJl Y3RvcmllcyB0byB0aGUgc3ltYm9saWMgbmFtZSBbb3duZXJdLCBidXQgQzxnZXRwd25hbT4gZGlk Cm5vdCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpYyB1aWQuIFRoZSBkaXJlY3Rvcnkg d2lsbApiZSBjcmVhdGVkLCBidXQgb3duZXJzaGlwIHdpbGwgbm90IGJlIGNoYW5nZWQuCgo9aXRl bSB1bmFibGUgdG8gbWFwIFtncm91cF0gdG8gYSBnaWQsIGdyb3VwIG93bmVyc2hpcCBub3QgY2hh bmdlZAoKQzxtYWtlX3BhdGg+IHdhcyBpbnN0cnVjdGVkIHRvIGdpdmUgdGhlIGdyb3VwIG93bmVy c2hpcCBvZiBjcmVhdGVkCmRpcmVjdG9yaWVzIHRvIHRoZSBzeW1ib2xpYyBuYW1lIFtncm91cF0s IGJ1dCBDPGdldGdybmFtPiBkaWQKbm90IHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBudW1lcmlj IGdpZC4gVGhlIGRpcmVjdG9yeSB3aWxsCmJlIGNyZWF0ZWQsIGJ1dCBncm91cCBvd25lcnNoaXAg d2lsbCBub3QgYmUgY2hhbmdlZC4KCj1iYWNrCgo9aGVhZDEgU0VFIEFMU08KCj1vdmVyIDQKCj1p dGVtICoKCkw8RmlsZTo6UmVtb3ZlPgoKQWxsb3dzIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBi ZSBtb3ZlZCB0byB0aGUgVHJhc2hjYW4vUmVjeWNsZQpCaW4gKHdoZXJlIHRoZXkgbWF5IGxhdGVy IGJlIHJlc3RvcmVkIGlmIG5lY2Vzc2FyeSkgaWYgdGhlIG9wZXJhdGluZwpzeXN0ZW0gc3VwcG9y dHMgc3VjaCBmdW5jdGlvbmFsaXR5LiBUaGlzIGZlYXR1cmUgbWF5IG9uZSBkYXkgYmUKbWFkZSBh dmFpbGFibGUgZGlyZWN0bHkgaW4gQzxGaWxlOjpQYXRoPi4KCj1pdGVtICoKCkw8RmlsZTo6Rmlu ZDo6UnVsZT4KCldoZW4gcmVtb3ZpbmcgZGlyZWN0b3J5IHRyZWVzLCBpZiB5b3Ugd2FudCB0byBl eGFtaW5lIGVhY2ggZmlsZSB0bwpkZWNpZGUgd2hldGhlciB0byBkZWxldGUgaXQgKGFuZCBwb3Nz aWJseSBsZWF2aW5nIGxhcmdlIHN3YXRoZXMKYWxvbmUpLCBGPEZpbGU6OkZpbmQ6OlJ1bGU+IG9m ZmVycyBhIGNvbnZlbmllbnQgYW5kIGZsZXhpYmxlIGFwcHJvYWNoCnRvIGV4YW1pbmluZyBkaXJl Y3RvcnkgdHJlZXMuCgo9YmFjawoKPWhlYWQxIEJVR1MgQU5EIExJTUlUQVRJT05TCgpUaGUgZm9s bG93aW5nIGRlc2NyaWJlcyBGPEZpbGU6OlBhdGg+IGxpbWl0YXRpb25zIGFuZCBob3cgdG8gcmVw b3J0IGJ1Z3MuCgo9aGVhZDIgTVVMVElUSFJFQUQgQVBQTElDQVRJT05TCgpGPEZpbGU6OlBhdGg+ IEI8cm10cmVlPiBhbmQgQjxyZW1vdmVfdHJlZT4gd2lsbCBub3Qgd29yayB3aXRoIG11bHRpdGhy ZWFkZWQKYXBwbGljYXRpb25zIGR1ZSB0byBpdHMgdXNlIG9mIEI8Y2hkaXI+LiAgQXQgdGhpcyB0 aW1lLCBubyB3YXJuaW5nIG9yIGVycm9yCnJlc3VsdHMgYW5kIHlvdSB3aWxsIGNlcnRhaW5seSBl bmNvdW50ZXIgdW5leHBlY3RlZCByZXN1bHRzLgoKVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgc3Vy ZmFjZXMgdGhpcyBsaW1pdGF0aW9uIG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUKcmVsZWFzZS4KCj1o ZWFkMiBORlMgTW91bnQgUG9pbnRzCgpGPEZpbGU6OlBhdGg+IGlzIG5vdCByZXNwb25zaWJsZSBm b3IgdHJpZ2dlcmluZyB0aGUgYXV0b21vdW50cywgbWlycm9yIG1vdW50cywKYW5kIHRoZSBjb250 ZW50cyBvZiBuZXR3b3JrIG1vdW50ZWQgZmlsZXN5c3RlbXMuICBJZiB5b3VyIE5GUyBpbXBsZW1l bnRhdGlvbgpyZXF1aXJlcyBhbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBmaWxlc3lz dGVtIGluIG9yZGVyIGZvcgpGPEZpbGU6OlBhdGg+IHRvIHBlcmZvcm0gb3BlcmF0aW9ucywgaXQg aXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHlvdSBhc3N1cmUKZmlsZXN5c3RlbSBhdmFpbGFiaWxpdHkg YnkgcmVhZGluZyB0aGUgcm9vdCBvZiB0aGUgbW91bnRlZCBmaWxlc3lzdGVtLgoKPWhlYWQyIFJF UE9SVElORyBCVUdTCgpQbGVhc2UgcmVwb3J0IGFsbCBidWdzIG9uIHRoZSBSVCBxdWV1ZSwgZWl0 aGVyIHZpYSB0aGUgd2ViIGludGVyZmFjZToKCkw8aHR0cDovL3J0LmNwYW4ub3JnL05vQXV0aC9C dWdzLmh0bWw/RGlzdD1GaWxlLVBhdGg+CgpvciBieSBlbWFpbDoKCiAgICBidWctRmlsZS1QYXRo QHJ0LmNwYW4ub3JnCgpJbiBlaXRoZXIgY2FzZSwgcGxlYXNlIEI8YXR0YWNoPiBwYXRjaGVzIHRv IHRoZSBidWcgcmVwb3J0IHJhdGhlciB0aGFuCmluY2x1ZGluZyB0aGVtIGlubGluZSBpbiB0aGUg d2ViIHBvc3Qgb3IgdGhlIGJvZHkgb2YgdGhlIGVtYWlsLgoKWW91IGNhbiBhbHNvIHNlbmQgcHVs bCByZXF1ZXN0cyB0byB0aGUgR2l0aHViIHJlcG9zaXRvcnk6CgpMPGh0dHBzOi8vZ2l0aHViLmNv bS9ycGNtZS9GaWxlLVBhdGg+Cgo9aGVhZDEgQUNLTk9XTEVER0VNRU5UUwoKUGF1bCBTemFibyBp ZGVudGlmaWVkIHRoZSByYWNlIGNvbmRpdGlvbiBvcmlnaW5hbGx5LCBhbmQgQnJlbmRhbgpPJ0Rl YSB3cm90ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgRGViaWFuIHRoYXQgYWRkcmVzc2VkIHRoZSBw cm9ibGVtLgpUaGF0IGNvZGUgd2FzIHVzZWQgYXMgYSBiYXNpcyBmb3IgdGhlIGN1cnJlbnQgY29k ZS4gVGhlaXIgZWZmb3J0cwphcmUgZ3JlYXRseSBhcHByZWNpYXRlZC4KCkdpc2xlIEFhcyBtYWRl IGEgbnVtYmVyIG9mIGltcHJvdmVtZW50cyB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKMi4wNyBh bmQgaGlzIGFkdmljZSBhbmQgYXNzaXN0YW5jZSBpcyBhbHNvIGdyZWF0bHkgYXBwcmVjaWF0ZWQu Cgo9aGVhZDEgQVVUSE9SUwoKUHJpb3IgYXV0aG9ycyBhbmQgbWFpbnRhaW5lcnM6IFRpbSBCdW5j ZSwgQ2hhcmxlcyBCYWlsZXksIGFuZApEYXZpZCBMYW5kZ3JlbiA8RjxkYXZpZEBsYW5kZ3Jlbi5u ZXQ+Pi4KCkN1cnJlbnQgbWFpbnRhaW5lcnMgYXJlIFJpY2hhcmQgRWxiZXJnZXIgPEY8cmljaGVA Y3Bhbi5vcmc+PiBhbmQKSmFtZXMgKEppbSkgS2VlbmFuIDxGPGprZWVuYW5AY3Bhbi5vcmc+Pi4K Cj1oZWFkMSBDT05UUklCVVRPUlMKCkNvbnRyaWJ1dG9ycyB0byBGaWxlOjpQYXRoLCBpbiBhbHBo YWJldGljYWwgb3JkZXIuCgo9b3ZlciAxCgo9aXRlbSA8RjxidWxrZGRAY3Bhbi5vcmc+PgoKPWl0 ZW0gQ3JhaWcgQS4gQmVycnkgPEY8Y3JhaWdiZXJyeUBtYWMuY29tPj4KCj1pdGVtIFJpY2hhcmQg RWxiZXJnZXIgPEY8cmljaGVAY3Bhbi5vcmc+PgoKPWl0ZW0gUnlhbiBZZWUgPEY8cnllZUBjcGFu Lm9yZz4+Cgo9aXRlbSBTa3llIFNoYXcgPEY8c2hhd0BjcGFuLm9yZz4+Cgo9aXRlbSBUb20gTHV0 eiA8Rjx0b21teWx1dHpAZ21haWwuY29tPj4KCj1iYWNrCgo9aGVhZDEgQ09QWVJJR0hUCgpUaGlz IG1vZHVsZSBpcyBjb3B5cmlnaHQgKEMpIENoYXJsZXMgQmFpbGV5LCBUaW0gQnVuY2UsIERhdmlk IExhbmRncmVuLApKYW1lcyBLZWVuYW4sIGFuZCBSaWNoYXJkIEVsYmVyZ2VyIDE5OTUtMjAxNS4g QWxsIHJpZ2h0cyByZXNlcnZlZC4KCj1oZWFkMSBMSUNFTlNFCgpUaGlzIGxpYnJhcnkgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRl ciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KCj1jdXQK --NYw5+LhiCV Content-Type: application/octet-stream Content-Disposition: attachment; filename="Path.pm-2.15" Content-Transfer-Encoding: base64 cGFja2FnZSBGaWxlOjpQYXRoOwoKdXNlIDUuMDA1XzA0Owp1c2Ugc3RyaWN0OwoKdXNlIEN3ZCAn Z2V0Y3dkJzsKdXNlIEZpbGU6OkJhc2VuYW1lICgpOwp1c2UgRmlsZTo6U3BlYyAgICAgKCk7CgpC RUdJTiB7CiAgICBpZiAoICRdIDwgNS4wMDYgKSB7CgogICAgICAgICMgY2FuJ3Qgc2F5ICdvcGVu ZGlyIG15ICRkaCwgJGRpcm5hbWUnCiAgICAgICAgIyBuZWVkIHRvIGluaXRpYWxpc2UgJGRoCiAg ICAgICAgZXZhbCAndXNlIFN5bWJvbCc7CiAgICB9Cn0KCnVzZSBFeHBvcnRlciAoKTsKdXNlIHZh cnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JUIEBFWFBPUlRfT0spOwokVkVSU0lPTiAgID0gJzIu MTUnOwokVkVSU0lPTiAgID0gZXZhbCAkVkVSU0lPTjsKQElTQSAgICAgICA9IHF3KEV4cG9ydGVy KTsKQEVYUE9SVCAgICA9IHF3KG1rcGF0aCBybXRyZWUpOwpARVhQT1JUX09LID0gcXcobWFrZV9w YXRoIHJlbW92ZV90cmVlKTsKCkJFR0lOIHsKICBmb3IgKHF3KFZNUyBNYWNPUyBNU1dpbjMyIG9z MikpIHsKICAgIG5vIHN0cmljdCAncmVmcyc7CiAgICAqeyJfSVNfXFUkXyJ9ID0gJF5PIGVxICRf ID8gc3ViICgpIHsgMSB9IDogc3ViICgpIHsgMCB9OwogIH0KCiAgIyBUaGVzZSBPU2VzIGNvbXBs YWluIGlmIHlvdSB3YW50IHRvIHJlbW92ZSBhIGZpbGUgdGhhdCB5b3UgaGF2ZSBubwogICMgd3Jp dGUgcGVybWlzc2lvbiB0bzoKICAqX0ZPUkNFX1dSSVRBQkxFID0gKAogICAgZ3JlcCB7ICReTyBl cSAkXyB9IHF3KGFtaWdhb3MgZG9zIGVwb2MgTVNXaW4zMiBNYWNPUyBvczIpCiAgKSA/IHN1YiAo KSB7IDEgfSA6IHN1YiAoKSB7IDAgfTsKCiAgIyBVbml4LWxpa2Ugc3lzdGVtcyBuZWVkIHRvIHN0 YXQgZWFjaCBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gZGV0ZWN0CiAgIyByYWNlIGNvbmRpdGlvbi4g TVMtV2luZG93cyBpcyBpbW11bmUgdG8gdGhpcyBwYXJ0aWN1bGFyIGF0dGFjay4KICAqX05FRURf U1RBVF9DSEVDSyA9ICEoX0lTX01TV0lOMzIoKSkgPyBzdWIgKCkgeyAxIH0gOiBzdWIgKCkgeyAw IH07Cn0KCnN1YiBfY2FycCB7CiAgICByZXF1aXJlIENhcnA7CiAgICBnb3RvICZDYXJwOjpjYXJw Owp9CgpzdWIgX2Nyb2FrIHsKICAgIHJlcXVpcmUgQ2FycDsKICAgIGdvdG8gJkNhcnA6OmNyb2Fr Owp9CgpzdWIgX2Vycm9yIHsKICAgIG15ICRhcmcgICAgID0gc2hpZnQ7CiAgICBteSAkbWVzc2Fn ZSA9IHNoaWZ0OwogICAgbXkgJG9iamVjdCAgPSBzaGlmdDsKCiAgICBpZiAoICRhcmctPntlcnJv cn0gKSB7CiAgICAgICAgJG9iamVjdCA9ICcnIHVubGVzcyBkZWZpbmVkICRvYmplY3Q7CiAgICAg ICAgJG1lc3NhZ2UgLj0gIjogJCEiIGlmICQhOwogICAgICAgIHB1c2ggQHsgJHsgJGFyZy0+e2Vy cm9yfSB9IH0sIHsgJG9iamVjdCA9PiAkbWVzc2FnZSB9OwogICAgfQogICAgZWxzZSB7CiAgICAg ICAgX2NhcnAoIGRlZmluZWQoJG9iamVjdCkgPyAiJG1lc3NhZ2UgZm9yICRvYmplY3Q6ICQhIiA6 ICIkbWVzc2FnZTogJCEiICk7CiAgICB9Cn0KCnN1YiBfX2lzX2FyZyB7CiAgICBteSAoJGFyZykg PSBAXzsKCiAgICAjIElmIGNsaWVudCBjb2RlIGJsZXNzZWQgYW4gYXJyYXkgcmVmIHRvIEhBU0gs IHRoaXMgd2lsbCBub3Qgd29yawogICAgIyBwcm9wZXJseS4gV2UgY291bGQgaGF2ZSBkb25lICRh cmctPmlzYSgpIHdyYXBwZWQgaW4gZXZhbCwgYnV0CiAgICAjIHRoYXQgd291bGQgYmUgZXhwZW5z aXZlLiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBzdWZmaWNlLgogICAgIyBXZSBjb3VsZCBo YXZlIGFsc28gdXNlZCBTY2FsYXI6OlV0aWw6Ymxlc3NlZCwgYnV0IHdlIGNob29zZSBub3QKICAg ICMgdG8gYWRkIHRoaXMgZGVwZW5kZW5jeQogICAgcmV0dXJuICggcmVmICRhcmcgZXEgJ0hBU0gn ICk7Cn0KCnN1YiBtYWtlX3BhdGggewogICAgcHVzaCBAXywge30gdW5sZXNzIEBfIGFuZCBfX2lz X2FyZyggJF9bLTFdICk7CiAgICBnb3RvICZta3BhdGg7Cn0KCnN1YiBta3BhdGggewogICAgbXkg JG9sZF9zdHlsZSA9ICEoIEBfIGFuZCBfX2lzX2FyZyggJF9bLTFdICkgKTsKCiAgICBteSAkZGF0 YTsKICAgIG15ICRwYXRoczsKCiAgICBpZiAoJG9sZF9zdHlsZSkgewogICAgICAgIG15ICggJHZl cmJvc2UsICRtb2RlICk7CiAgICAgICAgKCAkcGF0aHMsICR2ZXJib3NlLCAkbW9kZSApID0gQF87 CiAgICAgICAgJHBhdGhzID0gWyRwYXRoc10gdW5sZXNzIFVOSVZFUlNBTDo6aXNhKCAkcGF0aHMs ICdBUlJBWScgKTsKICAgICAgICAkZGF0YS0+e3ZlcmJvc2V9ID0gJHZlcmJvc2U7CiAgICAgICAg JGRhdGEtPnttb2RlfSA9IGRlZmluZWQgJG1vZGUgPyAkbW9kZSA6IG9jdCAnNzc3JzsKICAgIH0K ICAgIGVsc2UgewogICAgICAgIG15ICVhcmdzX3Blcm1pdHRlZCA9IG1hcCB7ICRfID0+IDEgfSAo IHF3fAogICAgICAgICAgICBjaG1vZAogICAgICAgICAgICBlcnJvcgogICAgICAgICAgICBncm91 cAogICAgICAgICAgICBtYXNrCiAgICAgICAgICAgIG1vZGUKICAgICAgICAgICAgb3duZXIKICAg ICAgICAgICAgdWlkCiAgICAgICAgICAgIHVzZXIKICAgICAgICAgICAgdmVyYm9zZQogICAgICAg IHwgKTsKICAgICAgICBteSAlbm90X29uX3dpbjMyX2FyZ3MgPSBtYXAgeyAkXyA9PiAxIH0gKCBx d3wKICAgICAgICAgICAgZ3JvdXAKICAgICAgICAgICAgb3duZXIKICAgICAgICAgICAgdWlkCiAg ICAgICAgICAgIHVzZXIKICAgICAgICB8ICk7CiAgICAgICAgbXkgQGJhZF9hcmdzID0gKCk7CiAg ICAgICAgbXkgQHdpbjMyX2ltcGxhdXNpYmxlX2FyZ3MgPSAoKTsKICAgICAgICBteSAkYXJnID0g cG9wIEBfOwogICAgICAgIGZvciBteSAkayAoc29ydCBrZXlzICV7JGFyZ30pIHsKICAgICAgICAg ICAgaWYgKCEgJGFyZ3NfcGVybWl0dGVkeyRrfSkgewogICAgICAgICAgICAgICAgcHVzaCBAYmFk X2FyZ3MsICRrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkbm90X29uX3dpbjMy X2FyZ3N7JGt9IGFuZCBfSVNfTVNXSU4zMikgewogICAgICAgICAgICAgICAgcHVzaCBAd2luMzJf aW1wbGF1c2libGVfYXJncywgJGs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAg ICAgICAgICAgICAgICAkZGF0YS0+eyRrfSA9ICRhcmctPnska307CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICAgICAgX2NhcnAoIlVucmVjb2duaXplZCBvcHRpb24ocykgcGFzc2VkIHRvIG1r cGF0aCgpIG9yIG1ha2VfcGF0aCgpOiBAYmFkX2FyZ3MiKQogICAgICAgICAgICBpZiBAYmFkX2Fy Z3M7CiAgICAgICAgX2NhcnAoIk9wdGlvbihzKSBpbXBsYXVzaWJsZSBvbiBXaW4zMiBwYXNzZWQg dG8gbWtwYXRoKCkgb3IgbWFrZV9wYXRoKCk6IEB3aW4zMl9pbXBsYXVzaWJsZV9hcmdzIikKICAg ICAgICAgICAgaWYgQHdpbjMyX2ltcGxhdXNpYmxlX2FyZ3M7CiAgICAgICAgJGRhdGEtPnttb2Rl fSA9IGRlbGV0ZSAkZGF0YS0+e21hc2t9IGlmIGV4aXN0cyAkZGF0YS0+e21hc2t9OwogICAgICAg ICRkYXRhLT57bW9kZX0gPSBvY3QgJzc3NycgdW5sZXNzIGV4aXN0cyAkZGF0YS0+e21vZGV9Owog ICAgICAgICR7ICRkYXRhLT57ZXJyb3J9IH0gPSBbXSBpZiBleGlzdHMgJGRhdGEtPntlcnJvcn07 CiAgICAgICAgdW5sZXNzIChAd2luMzJfaW1wbGF1c2libGVfYXJncykgewogICAgICAgICAgICAk ZGF0YS0+e293bmVyfSA9IGRlbGV0ZSAkZGF0YS0+e3VzZXJ9IGlmIGV4aXN0cyAkZGF0YS0+e3Vz ZXJ9OwogICAgICAgICAgICAkZGF0YS0+e293bmVyfSA9IGRlbGV0ZSAkZGF0YS0+e3VpZH0gIGlm IGV4aXN0cyAkZGF0YS0+e3VpZH07CiAgICAgICAgICAgIGlmICggZXhpc3RzICRkYXRhLT57b3du ZXJ9IGFuZCAkZGF0YS0+e293bmVyfSA9fiAvXEQvICkgewogICAgICAgICAgICAgICAgbXkgJHVp ZCA9ICggZ2V0cHduYW0gJGRhdGEtPntvd25lcn0gKVsyXTsKICAgICAgICAgICAgICAgIGlmICgg ZGVmaW5lZCAkdWlkICkgewogICAgICAgICAgICAgICAgICAgICRkYXRhLT57b3duZXJ9ID0gJHVp ZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAg ICAgICAgIF9lcnJvciggJGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5hYmxl IHRvIG1hcCAkZGF0YS0+e293bmVyfSB0byBhIHVpZCwgb3duZXJzaGlwIG5vdCBjaGFuZ2VkIgog ICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRk YXRhLT57b3duZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAg IGlmICggZXhpc3RzICRkYXRhLT57Z3JvdXB9IGFuZCAkZGF0YS0+e2dyb3VwfSA9fiAvXEQvICkg ewogICAgICAgICAgICAgICAgbXkgJGdpZCA9ICggZ2V0Z3JuYW0gJGRhdGEtPntncm91cH0gKVsy XTsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkZ2lkICkgewogICAgICAgICAgICAgICAg ICAgICRkYXRhLT57Z3JvdXB9ID0gJGdpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIF9lcnJvciggJGRhdGEsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIG1hcCAkZGF0YS0+e2dyb3VwfSB0byBhIGdpZCwg Z3JvdXAgb3duZXJzaGlwIG5vdCBjaGFuZ2VkIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAg ICAgICAgICAgICAgICAgZGVsZXRlICRkYXRhLT57Z3JvdXB9OwogICAgICAgICAgICAgICAgfQog ICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZXhpc3RzICRkYXRhLT57b3duZXJ9IGFuZCBu b3QgZXhpc3RzICRkYXRhLT57Z3JvdXB9ICkgewogICAgICAgICAgICAgICAgJGRhdGEtPntncm91 cH0gPSAtMTsgICAgIyBjaG93biB3aWxsIGxlYXZlIGdyb3VwIHVuY2hhbmdlZAogICAgICAgICAg ICB9CiAgICAgICAgICAgIGlmICggZXhpc3RzICRkYXRhLT57Z3JvdXB9IGFuZCBub3QgZXhpc3Rz ICRkYXRhLT57b3duZXJ9ICkgewogICAgICAgICAgICAgICAgJGRhdGEtPntvd25lcn0gPSAtMTsg ICAgIyBjaG93biB3aWxsIGxlYXZlIG93bmVyIHVuY2hhbmdlZAogICAgICAgICAgICB9CiAgICAg ICAgfQogICAgICAgICRwYXRocyA9IFtAX107CiAgICB9CiAgICByZXR1cm4gX21rcGF0aCggJGRh dGEsICRwYXRocyApOwp9CgpzdWIgX21rcGF0aCB7CiAgICBteSAkZGF0YSAgID0gc2hpZnQ7CiAg ICBteSAkcGF0aHMgPSBzaGlmdDsKCiAgICBteSAoIEBjcmVhdGVkICk7CiAgICBmb3JlYWNoIG15 ICRwYXRoICggQHskcGF0aHN9ICkgewogICAgICAgIG5leHQgdW5sZXNzIGRlZmluZWQoJHBhdGgp IGFuZCBsZW5ndGgoJHBhdGgpOwogICAgICAgICRwYXRoIC49ICcvJyBpZiBfSVNfT1MyIGFuZCAk cGF0aCA9fiAvXlx3Olx6L3M7ICMgZmVhdHVyZSBvZiBDUlQKCiAgICAgICAgIyBMb2dpYyB3YW50 cyBVbml4IHBhdGhzLCBzbyBnbyB3aXRoIHRoZSBmbG93LgogICAgICAgIGlmIChfSVNfVk1TKSB7 CiAgICAgICAgICAgIG5leHQgaWYgJHBhdGggZXEgJy8nOwogICAgICAgICAgICAkcGF0aCA9IFZN Uzo6RmlsZXNwZWM6OnVuaXhpZnkoJHBhdGgpOwogICAgICAgIH0KICAgICAgICBuZXh0IGlmIC1k ICRwYXRoOwogICAgICAgIG15ICRwYXJlbnQgPSBGaWxlOjpCYXNlbmFtZTo6ZGlybmFtZSgkcGF0 aCk7CiAgICAgICAgIyBDb3ZlcmFnZSBub3RlOiAgSXQncyBub3QgY2xlYXIgaG93IHdlIHdvdWxk IHRlc3QgdGhlIGNvbmRpdGlvbjoKICAgICAgICAjICctZCAkcGFyZW50IG9yICRwYXRoIGVxICRw YXJlbnQnCiAgICAgICAgdW5sZXNzICggLWQgJHBhcmVudCBvciAkcGF0aCBlcSAkcGFyZW50ICkg ewogICAgICAgICAgICBwdXNoKCBAY3JlYXRlZCwgX21rcGF0aCggJGRhdGEsIFskcGFyZW50XSAp ICk7CiAgICAgICAgfQogICAgICAgIHByaW50ICJta2RpciAkcGF0aFxuIiBpZiAkZGF0YS0+e3Zl cmJvc2V9OwogICAgICAgIGlmICggbWtkaXIoICRwYXRoLCAkZGF0YS0+e21vZGV9ICkgKSB7CiAg ICAgICAgICAgIHB1c2goIEBjcmVhdGVkLCAkcGF0aCApOwogICAgICAgICAgICBpZiAoIGV4aXN0 cyAkZGF0YS0+e293bmVyfSApIHsKCiAgICAgICAgICAgICAgICAjIE5COiAkZGF0YS0+e2dyb3Vw fSBndWFyYW50ZWVkIHRvIGJlIHNldCBkdXJpbmcgaW5pdGlhbGlzYXRpb24KICAgICAgICAgICAg ICAgIGlmICggIWNob3duICRkYXRhLT57b3duZXJ9LCAkZGF0YS0+e2dyb3VwfSwgJHBhdGggKSB7 CiAgICAgICAgICAgICAgICAgICAgX2Vycm9yKCAkZGF0YSwKICAgICAgICAgICAgICAgICAgICAg ICAgIkNhbm5vdCBjaGFuZ2Ugb3duZXJzaGlwIG9mICRwYXRoIHRvICRkYXRhLT57b3duZXJ9OiRk YXRhLT57Z3JvdXB9IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBleGlzdHMgJGRhdGEtPntjaG1vZH0gKSB7CiAg ICAgICAgICAgICAgICAjIENvdmVyYWdlIG5vdGU6ICBJdCdzIG5vdCBjbGVhciBob3cgd2Ugd291 bGQgdHJpZ2dlciB0aGUgbmV4dAogICAgICAgICAgICAgICAgIyAnaWYnIGJsb2NrLiAgRmFpbHVy ZSBvZiAnY2htb2QnIG1pZ2h0IGZpcnN0IHJlc3VsdCBpbiBhCiAgICAgICAgICAgICAgICAjIHN5 c3RlbSBlcnJvcjogIlBlcm1pc3Npb24gZGVuaWVkIi4KICAgICAgICAgICAgICAgIGlmICggIWNo bW9kICRkYXRhLT57Y2htb2R9LCAkcGF0aCApIHsKICAgICAgICAgICAgICAgICAgICBfZXJyb3Io ICRkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSBwZXJtaXNzaW9u cyBvZiAkcGF0aCB0byAkZGF0YS0+e2NobW9kfSIgKTsKICAgICAgICAgICAgICAgIH0KICAgICAg ICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJHNhdmVfYmFu ZyA9ICQhOwoKICAgICAgICAgICAgIyBGcm9tICdwZXJsZG9jIHBlcmx2YXInOiAkRVhURU5ERURf T1NfRVJST1IgKCReRSkgaXMgZG9jdW1lbnRlZAogICAgICAgICAgICAjIGFzOgogICAgICAgICAg ICAjIEVycm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50IG9wZXJhdGluZyBz eXN0ZW0uIEF0IHRoZQogICAgICAgICAgICAjIG1vbWVudCwgdGhpcyBkaWZmZXJzIGZyb20gIiQh IiB1bmRlciBvbmx5IFZNUywgT1MvMiwgYW5kIFdpbjMyCiAgICAgICAgICAgICMgKGFuZCBmb3Ig TWFjUGVybCkuIE9uIGFsbCBvdGhlciBwbGF0Zm9ybXMsICReRSBpcyBhbHdheXMganVzdCB0aGUK ICAgICAgICAgICAgIyBzYW1lIGFzICQhLgoKICAgICAgICAgICAgbXkgKCAkZSwgJGUxICkgPSAo ICRzYXZlX2JhbmcsICReRSApOwogICAgICAgICAgICAkZSAuPSAiOyAkZTEiIGlmICRlIG5lICRl MTsKCiAgICAgICAgICAgICMgYWxsb3cgZm9yIGFub3RoZXIgcHJvY2VzcyB0byBoYXZlIGNyZWF0 ZWQgaXQgbWVhbndoaWxlCiAgICAgICAgICAgIGlmICggISAtZCAkcGF0aCApIHsKICAgICAgICAg ICAgICAgICQhID0gJHNhdmVfYmFuZzsKICAgICAgICAgICAgICAgIGlmICggJGRhdGEtPntlcnJv cn0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkeyAkZGF0YS0+e2Vycm9yfSB9IH0s IHsgJHBhdGggPT4gJGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2Ug ewogICAgICAgICAgICAgICAgICAgIF9jcm9haygibWtkaXIgJHBhdGg6ICRlIik7CiAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gQGNyZWF0 ZWQ7Cn0KCnN1YiByZW1vdmVfdHJlZSB7CiAgICBwdXNoIEBfLCB7fSB1bmxlc3MgQF8gYW5kIF9f aXNfYXJnKCAkX1stMV0gKTsKICAgIGdvdG8gJnJtdHJlZTsKfQoKc3ViIF9pc19zdWJkaXIgewog ICAgbXkgKCAkZGlyLCAkdGVzdCApID0gQF87CgogICAgbXkgKCAkZHYsICRkZCApID0gRmlsZTo6 U3BlYy0+c3BsaXRwYXRoKCAkZGlyLCAgMSApOwogICAgbXkgKCAkdHYsICR0ZCApID0gRmlsZTo6 U3BlYy0+c3BsaXRwYXRoKCAkdGVzdCwgMSApOwoKICAgICMgbm90IG9uIHNhbWUgdm9sdW1lCiAg ICByZXR1cm4gMCBpZiAkZHYgbmUgJHR2OwoKICAgIG15IEBkID0gRmlsZTo6U3BlYy0+c3BsaXRk aXIoJGRkKTsKICAgIG15IEB0ID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoJHRkKTsKCiAgICAjIEB0 IGNhbid0IGJlIGEgc3ViZGlyIGlmIGl0J3Mgc2hvcnRlciB0aGFuIEBkCiAgICByZXR1cm4gMCBp ZiBAdCA8IEBkOwoKICAgIHJldHVybiBqb2luKCAnLycsIEBkICkgZXEgam9pbiggJy8nLCBzcGxp Y2UgQHQsIDAsICtAZCApOwp9CgpzdWIgcm10cmVlIHsKICAgIG15ICRvbGRfc3R5bGUgPSAhKCBA XyBhbmQgX19pc19hcmcoICRfWy0xXSApICk7CgogICAgbXkgKCRhcmcsICRkYXRhLCAkcGF0aHMp OwoKICAgIGlmICgkb2xkX3N0eWxlKSB7CiAgICAgICAgbXkgKCAkdmVyYm9zZSwgJHNhZmUgKTsK ICAgICAgICAoICRwYXRocywgJHZlcmJvc2UsICRzYWZlICkgPSBAXzsKICAgICAgICAkZGF0YS0+ e3ZlcmJvc2V9ID0gJHZlcmJvc2U7CiAgICAgICAgJGRhdGEtPntzYWZlfSA9IGRlZmluZWQgJHNh ZmUgPyAkc2FmZSA6IDA7CgogICAgICAgIGlmICggZGVmaW5lZCgkcGF0aHMpIGFuZCBsZW5ndGgo JHBhdGhzKSApIHsKICAgICAgICAgICAgJHBhdGhzID0gWyRwYXRoc10gdW5sZXNzIFVOSVZFUlNB TDo6aXNhKCAkcGF0aHMsICdBUlJBWScgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAg ICAgICAgIF9jYXJwKCJObyByb290IHBhdGgocykgc3BlY2lmaWVkXG4iKTsKICAgICAgICAgICAg cmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJWFyZ3NfcGVy bWl0dGVkID0gbWFwIHsgJF8gPT4gMSB9ICggcXd8CiAgICAgICAgICAgIGVycm9yCiAgICAgICAg ICAgIGtlZXBfcm9vdAogICAgICAgICAgICByZXN1bHQKICAgICAgICAgICAgc2FmZQogICAgICAg ICAgICB2ZXJib3NlCiAgICAgICAgfCApOwogICAgICAgIG15IEBiYWRfYXJncyA9ICgpOwogICAg ICAgIG15ICRhcmcgPSBwb3AgQF87CiAgICAgICAgZm9yIG15ICRrIChzb3J0IGtleXMgJXskYXJn fSkgewogICAgICAgICAgICBpZiAoISAkYXJnc19wZXJtaXR0ZWR7JGt9KSB7CiAgICAgICAgICAg ICAgICBwdXNoIEBiYWRfYXJncywgJGs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7 CiAgICAgICAgICAgICAgICAkZGF0YS0+eyRrfSA9ICRhcmctPnska307CiAgICAgICAgICAgIH0K ICAgICAgICB9CiAgICAgICAgX2NhcnAoIlVucmVjb2duaXplZCBvcHRpb24ocykgcGFzc2VkIHRv IHJlbW92ZV90cmVlKCk6IEBiYWRfYXJncyIpCiAgICAgICAgICAgIGlmIEBiYWRfYXJnczsKICAg ICAgICAkeyAkZGF0YS0+e2Vycm9yfSB9ICA9IFtdIGlmIGV4aXN0cyAkZGF0YS0+e2Vycm9yfTsK ICAgICAgICAkeyAkZGF0YS0+e3Jlc3VsdH0gfSA9IFtdIGlmIGV4aXN0cyAkZGF0YS0+e3Jlc3Vs dH07CgogICAgICAgICMgV291bGRuJ3QgaXQgbWFrZSBzZW5zZSB0byBkbyBzb21lIHZhbGlkYXRp b24gb24gQF8gYmVmb3JlIGFzc2lnbmluZwogICAgICAgICMgdG8gJHBhdGhzIGhlcmU/CiAgICAg ICAgIyBJbiB0aGUgJG9sZF9zdHlsZSBjYXNlIHdlIGd1YXJhbnRlZSB0aGF0IGVhY2ggcGF0aCBp cyBib3RoIGRlZmluZWQKICAgICAgICAjIGFuZCBub24tZW1wdHkuICBXZSBkb24ndCBjaGVjayB0 aGF0IGhlcmUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8KICAgICAgICAjIGNoZWNrIGl0IGxhdGVy IGluIHRoZSBmaXJzdCBjb25kaXRpb24gaW4gdGhpcyBsaW5lOgogICAgICAgICMgICAgIGlmICgg JG9ydGhvX3Jvb3RfbGVuZ3RoICYmIF9pc19zdWJkaXIoICRvcnRob19yb290LCAkb3J0aG9fY3dk ICkgKSB7CiAgICAgICAgIyBHcmFudGVkLCB0aGF0IHdvdWxkIGJlIGEgY2hhbmdlIGluIGJlaGF2 aW9yIGZvciB0aGUgdHdvCiAgICAgICAgIyBub24tb2xkLXN0eWxlIGludGVyZmFjZXMuCgogICAg ICAgICRwYXRocyA9IFtAX107CiAgICB9CgogICAgJGRhdGEtPntwcmVmaXh9ID0gJyc7CiAgICAk ZGF0YS0+e2RlcHRofSAgPSAwOwoKICAgIG15IEBjbGVhbl9wYXRoOwogICAgJGRhdGEtPntjd2R9 ID0gZ2V0Y3dkKCkgb3IgZG8gewogICAgICAgIF9lcnJvciggJGRhdGEsICJjYW5ub3QgZmV0Y2gg aW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH07CiAg ICBmb3IgKCAkZGF0YS0+e2N3ZH0gKSB7IC9cQSguKilcWi9zOyAkXyA9ICQxIH0gICAgIyB1bnRh aW50CgogICAgZm9yIG15ICRwIChAJHBhdGhzKSB7CgogICAgICAgICMgbmVlZCB0byBmaXh1cCBj YXNlIGFuZCBtYXAgXCB0byAvIG9uIFdpbmRvd3MKICAgICAgICBteSAkb3J0aG9fcm9vdCA9IF9J U19NU1dJTjMyID8gX3NsYXNoX2xjKCRwKSA6ICRwOwogICAgICAgIG15ICRvcnRob19jd2QgPQog ICAgICAgICAgX0lTX01TV0lOMzIgPyBfc2xhc2hfbGMoICRkYXRhLT57Y3dkfSApIDogJGRhdGEt Pntjd2R9OwogICAgICAgIG15ICRvcnRob19yb290X2xlbmd0aCA9IGxlbmd0aCgkb3J0aG9fcm9v dCk7CiAgICAgICAgJG9ydGhvX3Jvb3RfbGVuZ3RoLS0gaWYgX0lTX1ZNUzsgICAjIGRvbid0IGNv bXBhcmUgJy4nIHdpdGggJ10nCiAgICAgICAgaWYgKCAkb3J0aG9fcm9vdF9sZW5ndGggJiYgX2lz X3N1YmRpciggJG9ydGhvX3Jvb3QsICRvcnRob19jd2QgKSApIHsKICAgICAgICAgICAgbG9jYWwg JCEgPSAwOwogICAgICAgICAgICBfZXJyb3IoICRkYXRhLCAiY2Fubm90IHJlbW92ZSBwYXRoIHdo ZW4gY3dkIGlzICRkYXRhLT57Y3dkfSIsICRwICk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAg fQoKICAgICAgICBpZiAoX0lTX01BQ09TKSB7CiAgICAgICAgICAgICRwID0gIjokcCIgdW5sZXNz ICRwID1+IC86LzsKICAgICAgICAgICAgJHAgLj0gIjoiIHVubGVzcyAkcCA9fiAvOlx6LzsKICAg ICAgICB9CiAgICAgICAgZWxzaWYgKCBfSVNfTVNXSU4zMiApIHsKICAgICAgICAgICAgJHAgPX4g c3tbL1xcXVx6fXt9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHAgPX4g c3svXHp9e307CiAgICAgICAgfQogICAgICAgIHB1c2ggQGNsZWFuX3BhdGgsICRwOwogICAgfQoK ICAgIEB7JGRhdGF9e3F3KGRldmljZSBpbm9kZSl9ID0gKCBsc3RhdCAkZGF0YS0+e2N3ZH0gKVsg MCwgMSBdIG9yIGRvIHsKICAgICAgICBfZXJyb3IoICRkYXRhLCAiY2Fubm90IHN0YXQgaW5pdGlh bCB3b3JraW5nIGRpcmVjdG9yeSIsICRkYXRhLT57Y3dkfSApOwogICAgICAgIHJldHVybiAwOwog ICAgfTsKCiAgICByZXR1cm4gX3JtdHJlZSggJGRhdGEsIFxAY2xlYW5fcGF0aCApOwp9CgpzdWIg X3JtdHJlZSB7CiAgICBteSAkZGF0YSAgID0gc2hpZnQ7CiAgICBteSAkcGF0aHMgPSBzaGlmdDsK CiAgICBteSAkY291bnQgID0gMDsKICAgIG15ICRjdXJkaXIgPSBGaWxlOjpTcGVjLT5jdXJkaXIo KTsKICAgIG15ICR1cGRpciAgPSBGaWxlOjpTcGVjLT51cGRpcigpOwoKICAgIG15ICggQGZpbGVz LCAkcm9vdCApOwogIFJPT1RfRElSOgogICAgZm9yZWFjaCBteSAkcm9vdCAoQCRwYXRocykgewoK ICAgICAgICAjIHNpbmNlIHdlIGNoZGlyIGludG8gZWFjaCBkaXJlY3RvcnksIGl0IG1heSBub3Qg YmUgb2J2aW91cwogICAgICAgICMgdG8gZmlndXJlIG91dCB3aGVyZSB3ZSBhcmUgaWYgd2UgZ2Vu ZXJhdGUgYSBtZXNzYWdlIGFib3V0CiAgICAgICAgIyBhIGZpbGUgbmFtZS4gV2UgdGhlcmVmb3Jl IGNvbnN0cnVjdCBhIHNlbWktY2Fub25pY2FsCiAgICAgICAgIyBmaWxlbmFtZSwgYW5jaG9yZWQg ZnJvbSB0aGUgZGlyZWN0b3J5IGJlaW5nIHVubGlua2VkIChhcwogICAgICAgICMgb3Bwb3NlZCB0 byBiZWluZyB0cnVseSBjYW5vbmljYWwsIGFuY2hvcmVkIGZyb20gdGhlIHJvb3QgKC8pLgoKICAg ICAgICBteSAkY2Fub24gPQogICAgICAgICAgJGRhdGEtPntwcmVmaXh9CiAgICAgICAgICA/IEZp bGU6OlNwZWMtPmNhdGZpbGUoICRkYXRhLT57cHJlZml4fSwgJHJvb3QgKQogICAgICAgICAgOiAk cm9vdDsKCiAgICAgICAgbXkgKCAkbGRldiwgJGxpbm8sICRwZXJtICkgPSAoIGxzdGF0ICRyb290 IClbIDAsIDEsIDIgXQogICAgICAgICAgb3IgbmV4dCBST09UX0RJUjsKCiAgICAgICAgaWYgKCAt ZCBfICkgewogICAgICAgICAgICAkcm9vdCA9IFZNUzo6RmlsZXNwZWM6OnZtc3BhdGgoIFZNUzo6 RmlsZXNwZWM6OnBhdGhpZnkoJHJvb3QpICkKICAgICAgICAgICAgICBpZiBfSVNfVk1TOwoKICAg ICAgICAgICAgaWYgKCAhY2hkaXIoJHJvb3QpICkgewoKICAgICAgICAgICAgICAgICMgc2VlIGlm IHdlIGNhbiBlc2NhbGF0ZSBwcml2aWxlZ2VzIHRvIGdldCBpbgogICAgICAgICAgICAgICAgIyAo ZS5nLiBmdW5ueSBwcm90ZWN0aW9uIG1hc2sgc3VjaCBhcyAtdy0gaW5zdGVhZCBvZiByd3gpCiAg ICAgICAgICAgICAgICAjIFRoaXMgdXNlcyBmY2htb2QgdG8gYXZvaWQgdHJhdmVyc2luZyBvdXRz aWRlIG9mIHRoZSBwcm9wZXIKICAgICAgICAgICAgICAgICMgbG9jYXRpb24gKENWRS0yMDE3LTY1 MTIpCiAgICAgICAgICAgICAgICBteSAkcm9vdF9maDsKICAgICAgICAgICAgICAgIGlmIChvcGVu KCRyb290X2ZoLCAnPCcsICRyb290KSkgewogICAgICAgICAgICAgICAgICAgIG15ICgkZmhfZGV2 LCAkZmhfaW5vZGUpID0gKHN0YXQgJHJvb3RfZmggKVswLDFdOwogICAgICAgICAgICAgICAgICAg ICRwZXJtICY9IG9jdCAnNzc3Nyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJG5wZXJtID0gJHBl cm0gfCBvY3QgJzcwMCc7CiAgICAgICAgICAgICAgICAgICAgbG9jYWwgJEA7CiAgICAgICAgICAg ICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhKAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgJGRhdGEtPntzYWZlfQogICAgICAgICAgICAgICAgICAgICAgICAgICBvciAk bnBlcm0gPT0gJHBlcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgIS1kIF8KICAgICAg ICAgICAgICAgICAgICAgICAgICAgb3IgJGZoX2RldiBuZSAkbGRldgogICAgICAgICAgICAgICAg ICAgICAgICAgICBvciAkZmhfaW5vZGUgbmUgJGxpbm8KICAgICAgICAgICAgICAgICAgICAgICAg ICAgb3IgZXZhbCB7IGNobW9kKCAkbnBlcm0sICRyb290X2ZoICkgfQogICAgICAgICAgICAgICAg ICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3IoICRkYXRhLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgImNhbm5vdCBtYWtlIGNoaWxkIGRpcmVjdG9yeSByZWFkLXdyaXRlLWV4ZWMiLCAk Y2Fub24gKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBST09UX0RJUjsKICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2xvc2UgJHJvb3RfZmg7CiAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICFjaGRpcigkcm9vdCkgKSB7CiAgICAgICAg ICAgICAgICAgICAgX2Vycm9yKCAkZGF0YSwgImNhbm5vdCBjaGRpciB0byBjaGlsZCIsICRjYW5v biApOwogICAgICAgICAgICAgICAgICAgIG5leHQgUk9PVF9ESVI7CiAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICggJGN1cl9kZXYsICRjdXJfaW5vZGUsICRw ZXJtICkgPSAoIHN0YXQgJGN1cmRpciApWyAwLCAxLCAyIF0KICAgICAgICAgICAgICBvciBkbyB7 CiAgICAgICAgICAgICAgICBfZXJyb3IoICRkYXRhLCAiY2Fubm90IHN0YXQgY3VycmVudCB3b3Jr aW5nIGRpcmVjdG9yeSIsICRjYW5vbiApOwogICAgICAgICAgICAgICAgbmV4dCBST09UX0RJUjsK ICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKF9ORUVEX1NUQVRfQ0hFQ0spIHsKICAg ICAgICAgICAgICAgICggJGxkZXYgZXEgJGN1cl9kZXYgYW5kICRsaW5vIGVxICRjdXJfaW5vZGUg KQogICAgICAgICAgICAgICAgICBvciBfY3JvYWsoCiJkaXJlY3RvcnkgJGNhbm9uIGNoYW5nZWQg YmVmb3JlIGNoZGlyLCBleHBlY3RlZCBkZXY9JGxkZXYgaW5vPSRsaW5vLCBhY3R1YWwgZGV2PSRj dXJfZGV2IGlubz0kY3VyX2lub2RlLCBhYm9ydGluZy4iCiAgICAgICAgICAgICAgICAgICk7CiAg ICAgICAgICAgIH0KCiAgICAgICAgICAgICRwZXJtICY9IG9jdCAnNzc3Nyc7ICAgICMgZG9uJ3Qg Zm9yZ2V0IHNldHVpZCwgc2V0Z2lkLCBzdGlja3kgYml0cwogICAgICAgICAgICBteSAkbnBlcm0g PSAkcGVybSB8IG9jdCAnNzAwJzsKCiAgICAgICAgICAgICMgbm90YWJlbmU6IDA3MDAgaXMgZm9y IG1ha2luZyByZWFkYWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UsCiAgICAgICAgICAgICMgaXQncyBh bHNvIGludGVuZGVkIHRvIGNoYW5nZSBpdCB0byB3cml0YWJsZSBpbiBjYXNlIHdlIGhhdmUKICAg ICAgICAgICAgIyB0byByZWN1cnNlIGluIHdoaWNoIGNhc2Ugd2UgYXJlIGJldHRlciB0aGFuIHJt IC1yZiBmb3IKICAgICAgICAgICAgIyBzdWJ0cmVlcyB3aXRoIHN0cmFuZ2UgcGVybWlzc2lvbnMK CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEoCiAgICAgICAgICAgICAgICAgICAg ICAgJGRhdGEtPntzYWZlfQogICAgICAgICAgICAgICAgICAgIG9yICRucGVybSA9PSAkcGVybQog ICAgICAgICAgICAgICAgICAgIG9yIGNobW9kKCAkbnBlcm0sICRjdXJkaXIgKQogICAgICAgICAg ICAgICAgKQogICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2Vy cm9yKCAkZGF0YSwgImNhbm5vdCBtYWtlIGRpcmVjdG9yeSByZWFkK3dyaXRlYWJsZSIsICRjYW5v biApOwogICAgICAgICAgICAgICAgJG5wZXJtID0gJHBlcm07CiAgICAgICAgICAgIH0KCiAgICAg ICAgICAgIG15ICRkOwogICAgICAgICAgICAkZCA9IGdlbnN5bSgpIGlmICRdIDwgNS4wMDY7CiAg ICAgICAgICAgIGlmICggIW9wZW5kaXIgJGQsICRjdXJkaXIgKSB7CiAgICAgICAgICAgICAgICBf ZXJyb3IoICRkYXRhLCAiY2Fubm90IG9wZW5kaXIiLCAkY2Fub24gKTsKICAgICAgICAgICAgICAg IEBmaWxlcyA9ICgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAg ICAgICAgaWYgKCAhZGVmaW5lZCAke15UQUlOVH0gb3IgJHteVEFJTlR9ICkgewogICAgICAgICAg ICAgICAgICAgICMgQmxpbmRseSB1bnRhaW50IGRpciBuYW1lcyBpZiB0YWludCBtb2RlIGlzIGFj dGl2ZQogICAgICAgICAgICAgICAgICAgIEBmaWxlcyA9IG1hcCB7IC9cQSguKilcei9zOyAkMSB9 IHJlYWRkaXIgJGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAg ICAgICAgICAgICAgICAgICBAZmlsZXMgPSByZWFkZGlyICRkOwogICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgICAgY2xvc2VkaXIgJGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlm IChfSVNfVk1TKSB7CgogICAgICAgICAgICAgICAgIyBEZWxldGluZyBsYXJnZSBudW1iZXJzIG9m IGZpbGVzIGZyb20gVk1TIEZpbGVzLTExCiAgICAgICAgICAgICAgICAjIGZpbGVzeXN0ZW1zIGlz IGZhc3RlciBpZiBkb25lIGluIHJldmVyc2UgQVNDSUliZXRpY2FsIG9yZGVyLgogICAgICAgICAg ICAgICAgIyBpbmNsdWRlICcuJyB0byAnLjsnIGZyb20gYmxlYWQgcGF0Y2ggIzMxNzc1CiAgICAg ICAgICAgICAgICBAZmlsZXMgPSBtYXAgeyAkXyBlcSAnLicgPyAnLjsnIDogJF8gfSByZXZlcnNl IEBmaWxlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQGZpbGVzID0gZ3JlcCB7ICRfIG5l ICR1cGRpciBhbmQgJF8gbmUgJGN1cmRpciB9IEBmaWxlczsKCiAgICAgICAgICAgIGlmIChAZmls ZXMpIHsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSB0aGUgY29udGFpbmVkIGZpbGVzIGJlZm9y ZSB0aGUgZGlyZWN0b3J5IGl0c2VsZgogICAgICAgICAgICAgICAgbXkgJG5hcmcgPSB7JSRkYXRh fTsKICAgICAgICAgICAgICAgIEB7JG5hcmd9e3F3KGRldmljZSBpbm9kZSBjd2QgcHJlZml4IGRl cHRoKX0gPQogICAgICAgICAgICAgICAgICAoICRjdXJfZGV2LCAkY3VyX2lub2RlLCAkdXBkaXIs ICRjYW5vbiwgJGRhdGEtPntkZXB0aH0gKyAxICk7CiAgICAgICAgICAgICAgICAkY291bnQgKz0g X3JtdHJlZSggJG5hcmcsIFxAZmlsZXMgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBy ZXN0b3JlIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyBvZiByZXF1aXJlZCBub3cgKGluIGNhc2UgdGhl IHJtZGlyCiAgICAgICAgICAgICMgYmVsb3cgZmFpbHMpLCB3aGlsZSB3ZSBhcmUgc3RpbGwgaW4g dGhlIGRpcmVjdG9yeSBhbmQgbWF5IGRvIHNvCiAgICAgICAgICAgICMgd2l0aG91dCBhIHJhY2Ug dmlhICcuJwogICAgICAgICAgICBpZiAoICRucGVybSAhPSAkcGVybSBhbmQgbm90IGNobW9kKCAk cGVybSwgJGN1cmRpciApICkgewogICAgICAgICAgICAgICAgX2Vycm9yKCAkZGF0YSwgImNhbm5v dCByZXNldCBjaG1vZCIsICRjYW5vbiApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRv bid0IGxlYXZlIHRoZSBjbGllbnQgY29kZSBpbiBhbiB1bmV4cGVjdGVkIGRpcmVjdG9yeQogICAg ICAgICAgICBjaGRpciggJGRhdGEtPntjd2R9ICkKICAgICAgICAgICAgICBvcgogICAgICAgICAg ICAgIF9jcm9haygiY2Fubm90IGNoZGlyIHRvICRkYXRhLT57Y3dkfSBmcm9tICRjYW5vbjogJCEs IGFib3J0aW5nLiIpOwoKICAgICAgICAgICAgIyBlbnN1cmUgdGhhdCBhIGNoZGlyIHVwd2FyZHMg ZGlkbid0IHRha2UgdXMgc29tZXdoZXJlIG90aGVyCiAgICAgICAgICAgICMgdGhhbiB3ZSBleHBl Y3RlZCAoc2VlIENWRS0yMDAyLTA0MzUpCiAgICAgICAgICAgICggJGN1cl9kZXYsICRjdXJfaW5v ZGUgKSA9ICggc3RhdCAkY3VyZGlyIClbIDAsIDEgXQogICAgICAgICAgICAgIG9yIF9jcm9haygK ICAgICAgICAgICAgICAgICJjYW5ub3Qgc3RhdCBwcmlvciB3b3JraW5nIGRpcmVjdG9yeSAkZGF0 YS0+e2N3ZH06ICQhLCBhYm9ydGluZy4iCiAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlm IChfTkVFRF9TVEFUX0NIRUNLKSB7CiAgICAgICAgICAgICAgICAoICRkYXRhLT57ZGV2aWNlfSBl cSAkY3VyX2RldiBhbmQgJGRhdGEtPntpbm9kZX0gZXEgJGN1cl9pbm9kZSApCiAgICAgICAgICAg ICAgICAgIG9yIF9jcm9hayggICJwcmV2aW91cyBkaXJlY3RvcnkgJGRhdGEtPntjd2R9ICIKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC4gImNoYW5nZWQgYmVmb3JlIGVudGVyaW5nICRjYW5v biwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiZXhwZWN0ZWQgZGV2PSRsZGV2IGlu bz0kbGlubywgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiYWN0dWFsIGRldj0kY3Vy X2RldiBpbm89JGN1cl9pbm9kZSwgYWJvcnRpbmcuIgogICAgICAgICAgICAgICAgICApOwogICAg ICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRkYXRhLT57ZGVwdGh9IG9yICEkZGF0YS0+e2tl ZXBfcm9vdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRkYXRhLT57c2FmZX0KICAgICAgICAg ICAgICAgICAgICAmJiAoIF9JU19WTVMKICAgICAgICAgICAgICAgICAgICAgICAgPyAhJlZNUzo6 RmlsZXNwZWM6OmNhbmRlbGV0ZSgkcm9vdCkKICAgICAgICAgICAgICAgICAgICAgICAgOiAhLXcg JHJvb3QgKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNr aXBwZWQgJHJvb3RcbiIgaWYgJGRhdGEtPnt2ZXJib3NlfTsKICAgICAgICAgICAgICAgICAgICBu ZXh0IFJPT1RfRElSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCBfRk9S Q0VfV1JJVEFCTEUgYW5kICFjaG1vZCAkcGVybSB8IG9jdCAnNzAwJywgJHJvb3QgKSB7CiAgICAg ICAgICAgICAgICAgICAgX2Vycm9yKCAkZGF0YSwgImNhbm5vdCBtYWtlIGRpcmVjdG9yeSB3cml0 ZWFibGUiLCAkY2Fub24gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByaW50 ICJybWRpciAkcm9vdFxuIiBpZiAkZGF0YS0+e3ZlcmJvc2V9OwogICAgICAgICAgICAgICAgaWYg KCBybWRpciAkcm9vdCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICR7ICRkYXRhLT57 cmVzdWx0fSB9IH0sICRyb290IGlmICRkYXRhLT57cmVzdWx0fTsKICAgICAgICAgICAgICAgICAg ICArKyRjb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAg ICAgICAgICAgICAgICAgIF9lcnJvciggJGRhdGEsICJjYW5ub3QgcmVtb3ZlIGRpcmVjdG9yeSIs ICRjYW5vbiApOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAg ICAgX0ZPUkNFX1dSSVRBQkxFCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFjaG1vZCggJHBl cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIF9JU19WTVMgPyBWTVM6OkZpbGVzcGVj OjpmaWxlaWZ5KCRyb290KSA6ICRyb290ICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAg ICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICAgICAgX2Vycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGEsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiY2Fubm90IHJlc3RvcmUgcGVybWlzc2lv bnMgdG8gMCVvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVybSApLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgJGNhbm9uCiAgICAgICAgICAgICAgICAgICAgICAgICk7 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAg ICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIG5vdCBhIGRpcmVjdG9yeQogICAg ICAgICAgICAkcm9vdCA9IFZNUzo6RmlsZXNwZWM6OnZtc2lmeSgiLi8kcm9vdCIpCiAgICAgICAg ICAgICAgaWYgX0lTX1ZNUwogICAgICAgICAgICAgICYmICFGaWxlOjpTcGVjLT5maWxlX25hbWVf aXNfYWJzb2x1dGUoJHJvb3QpCiAgICAgICAgICAgICAgJiYgKCAkcm9vdCAhfiBtLyg/PCFcXilb XF0+XSsvICk7ICAgICMgbm90IGFscmVhZHkgaW4gVk1TIHN5bnRheAoKICAgICAgICAgICAgaWYg KAogICAgICAgICAgICAgICAgJGRhdGEtPntzYWZlfQogICAgICAgICAgICAgICAgJiYgKAogICAg ICAgICAgICAgICAgICAgIF9JU19WTVMKICAgICAgICAgICAgICAgICAgICA/ICEmVk1TOjpGaWxl c3BlYzo6Y2FuZGVsZXRlKCRyb290KQogICAgICAgICAgICAgICAgICAgIDogISggLWwgJHJvb3Qg fHwgLXcgJHJvb3QgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICkKICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgcHJpbnQgInNraXBwZWQgJHJvb3RcbiIgaWYgJGRhdGEtPnt2 ZXJib3NlfTsKICAgICAgICAgICAgICAgIG5leHQgUk9PVF9ESVI7CiAgICAgICAgICAgIH0KCiAg ICAgICAgICAgIG15ICRucGVybSA9ICRwZXJtICYgb2N0ICc3Nzc3JyB8IG9jdCAnNjAwJzsKICAg ICAgICAgICAgaWYgKCAgICBfRk9SQ0VfV1JJVEFCTEUKICAgICAgICAgICAgICAgIGFuZCAkbnBl cm0gIT0gJHBlcm0KICAgICAgICAgICAgICAgIGFuZCBub3QgY2htb2QgJG5wZXJtLCAkcm9vdCAp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9lcnJvciggJGRhdGEsICJjYW5ub3QgbWFr ZSBmaWxlIHdyaXRlYWJsZSIsICRjYW5vbiApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBy aW50ICJ1bmxpbmsgJGNhbm9uXG4iIGlmICRkYXRhLT57dmVyYm9zZX07CgogICAgICAgICAgICAj IGRlbGV0ZSBhbGwgdmVyc2lvbnMgdW5kZXIgVk1TCiAgICAgICAgICAgIGZvciAoIDsgOyApIHsK ICAgICAgICAgICAgICAgIGlmICggdW5saW5rICRyb290ICkgewogICAgICAgICAgICAgICAgICAg IHB1c2ggQHsgJHsgJGRhdGEtPntyZXN1bHR9IH0gfSwgJHJvb3QgaWYgJGRhdGEtPntyZXN1bHR9 OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAg ICAgICAgX2Vycm9yKCAkZGF0YSwgImNhbm5vdCB1bmxpbmsgZmlsZSIsICRjYW5vbiApOwogICAg ICAgICAgICAgICAgICAgIF9GT1JDRV9XUklUQUJMRSBhbmQgY2htb2QoICRwZXJtLCAkcm9vdCAp CiAgICAgICAgICAgICAgICAgICAgICBvciBfZXJyb3IoICRkYXRhLAogICAgICAgICAgICAgICAg ICAgICAgICBzcHJpbnRmKCAiY2Fubm90IHJlc3RvcmUgcGVybWlzc2lvbnMgdG8gMCVvIiwgJHBl cm0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgJGNhbm9uICk7CiAgICAgICAgICAgICAgICAg ICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICsrJGNvdW50OwogICAg ICAgICAgICAgICAgbGFzdCB1bmxlc3MgX0lTX1ZNUyAmJiBsc3RhdCAkcm9vdDsKICAgICAgICAg ICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkY291bnQ7Cn0KCnN1YiBfc2xhc2hfbGMg ewoKICAgICMgZml4IHVwIHNsYXNoZXMgYW5kIGNhc2Ugb24gTVNXaW4zMiBzbyB0aGF0IHdlIGNh biBkZXRlcm1pbmUgdGhhdAogICAgIyBjOlxwYXRoXHRvXGRpciBpcyB1bmRlcm5lYXRoIEM6L1Bh dGgvVG8KICAgIG15ICRwYXRoID0gc2hpZnQ7CiAgICAkcGF0aCA9fiB0cntcXH17L307CiAgICBy ZXR1cm4gbGMoJHBhdGgpOwp9CgoxOwoKX19FTkRfXwoKPWhlYWQxIE5BTUUKCkZpbGU6OlBhdGgg LSBDcmVhdGUgb3IgcmVtb3ZlIGRpcmVjdG9yeSB0cmVlcwoKPWhlYWQxIFZFUlNJT04KCjIuMTUg LSByZWxlYXNlZCBKdW5lIDA3IDIwMTcuCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgRmlsZTo6 UGF0aCBxdyhtYWtlX3BhdGggcmVtb3ZlX3RyZWUpOwoKICAgIEBjcmVhdGVkID0gbWFrZV9wYXRo KCdmb28vYmFyL2JheicsICcvenVnL3p3YW5nJyk7CiAgICBAY3JlYXRlZCA9IG1ha2VfcGF0aCgn Zm9vL2Jhci9iYXonLCAnL3p1Zy96d2FuZycsIHsKICAgICAgICB2ZXJib3NlID0+IDEsCiAgICAg ICAgbW9kZSA9PiAwNzExLAogICAgfSk7CiAgICBtYWtlX3BhdGgoJ2Zvby9iYXIvYmF6JywgJy96 dWcvendhbmcnLCB7CiAgICAgICAgY2htb2QgPT4gMDc3NywKICAgIH0pOwoKICAgICRyZW1vdmVk X2NvdW50ID0gcmVtb3ZlX3RyZWUoJ2Zvby9iYXIvYmF6JywgJy96dWcvendhbmcnLCB7CiAgICAg ICAgdmVyYm9zZSA9PiAxLAogICAgICAgIGVycm9yICA9PiBcbXkgJGVycl9saXN0LAogICAgICAg IHNhZmUgPT4gMSwKICAgIH0pOwoKICAgICMgbGVnYWN5IChpbnRlcmZhY2UgcHJvbW90ZWQgYmVm b3JlIHYyLjAwKQogICAgQGNyZWF0ZWQgPSBta3BhdGgoJy9mb28vYmFyL2JheicpOwogICAgQGNy ZWF0ZWQgPSBta3BhdGgoJy9mb28vYmFyL2JheicsIDEsIDA3MTEpOwogICAgQGNyZWF0ZWQgPSBt a3BhdGgoWycvZm9vL2Jhci9iYXonLCAnYmx1cmZsL3F1dXgnXSwgMSwgMDcxMSk7CiAgICAkcmVt b3ZlZF9jb3VudCA9IHJtdHJlZSgnZm9vL2Jhci9iYXonLCAxLCAxKTsKICAgICRyZW1vdmVkX2Nv dW50ID0gcm10cmVlKFsnZm9vL2Jhci9iYXonLCAnYmx1cmZsL3F1dXgnXSwgMSwgMSk7CgogICAg IyBsZWdhY3kgKGludGVyZmFjZSBwcm9tb3RlZCBiZWZvcmUgdjIuMDYpCiAgICBAY3JlYXRlZCA9 IG1rcGF0aCgnZm9vL2Jhci9iYXonLCAnL3p1Zy96d2FuZycsIHsgdmVyYm9zZSA9PiAxLCBtb2Rl ID0+IDA3MTEgfSk7CiAgICAkcmVtb3ZlZF9jb3VudCA9IHJtdHJlZSgnZm9vL2Jhci9iYXonLCAn L3p1Zy96d2FuZycsIHsgdmVyYm9zZSA9PiAxLCBtb2RlID0+IDA3MTEgfSk7Cgo9aGVhZDEgREVT Q1JJUFRJT04KClRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRl IGRpcmVjdG9yaWVzIG9mCmFyYml0cmFyeSBkZXB0aCBhbmQgdG8gZGVsZXRlIGFuIGVudGlyZSBk aXJlY3Rvcnkgc3VidHJlZSBmcm9tIHRoZQpmaWxlc3lzdGVtLgoKVGhlIGZvbGxvd2luZyBmdW5j dGlvbnMgYXJlIHByb3ZpZGVkOgoKPW92ZXIKCj1pdGVtIG1ha2VfcGF0aCggJGRpcjEsICRkaXIy LCAuLi4uICkKCj1pdGVtIG1ha2VfcGF0aCggJGRpcjEsICRkaXIyLCAuLi4uLCBcJW9wdHMgKQoK VGhlIEM8bWFrZV9wYXRoPiBmdW5jdGlvbiBjcmVhdGVzIHRoZSBnaXZlbiBkaXJlY3RvcmllcyBp ZiB0aGV5IGRvbid0CmV4aXN0IGJlZm9yZSwgbXVjaCBsaWtlIHRoZSBVbml4IGNvbW1hbmQgQzxt a2RpciAtcD4uCgpUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8g YmUgY3JlYXRlZC4gSXRzCmJlaGF2aW91ciBtYXkgYmUgdHVuZWQgYnkgYW4gb3B0aW9uYWwgaGFz aHJlZiBhcHBlYXJpbmcgYXMgdGhlIGxhc3QKcGFyYW1ldGVyIG9uIHRoZSBjYWxsLgoKVGhlIGZ1 bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYWN0dWFsbHkgY3JlYXRlZCBk dXJpbmcKdGhlIGNhbGw7IGluIHNjYWxhciBjb250ZXh0IHRoZSBudW1iZXIgb2YgZGlyZWN0b3Jp ZXMgY3JlYXRlZC4KClRoZSBmb2xsb3dpbmcga2V5cyBhcmUgcmVjb2duaXNlZCBpbiB0aGUgb3B0 aW9uIGhhc2g6Cgo9b3ZlcgoKPWl0ZW0gbW9kZSA9PiAkbnVtCgpUaGUgbnVtZXJpYyBwZXJtaXNz aW9ucyBtb2RlIHRvIGFwcGx5IHRvIGVhY2ggY3JlYXRlZCBkaXJlY3RvcnkKKGRlZmF1bHRzIHRv IEM8MDc3Nz4pLCB0byBiZSBtb2RpZmllZCBieSB0aGUgY3VycmVudCBDPHVtYXNrPi4gSWYgdGhl CmRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyAoYW5kIHRodXMgZG9lcyBub3QgbmVlZCB0byBiZSBj cmVhdGVkKSwKdGhlIHBlcm1pc3Npb25zIHdpbGwgbm90IGJlIG1vZGlmaWVkLgoKQzxtYXNrPiBp cyByZWNvZ25pc2VkIGFzIGFuIGFsaWFzIGZvciB0aGlzIHBhcmFtZXRlci4KCj1pdGVtIGNobW9k ID0+ICRudW0KClRha2VzIGEgbnVtZXJpYyBtb2RlIHRvIGFwcGx5IHRvIGVhY2ggY3JlYXRlZCBk aXJlY3RvcnkgKG5vdAptb2RpZmllZCBieSB0aGUgY3VycmVudCBDPHVtYXNrPikuIElmIHRoZSBk aXJlY3RvcnkgYWxyZWFkeSBleGlzdHMKKGFuZCB0aHVzIGRvZXMgbm90IG5lZWQgdG8gYmUgY3Jl YXRlZCksIHRoZSBwZXJtaXNzaW9ucyB3aWxsCm5vdCBiZSBtb2RpZmllZC4KCj1pdGVtIHZlcmJv c2UgPT4gJGJvb2wKCklmIHByZXNlbnQsIHdpbGwgY2F1c2UgQzxtYWtlX3BhdGg+IHRvIHByaW50 IHRoZSBuYW1lIG9mIGVhY2ggZGlyZWN0b3J5CmFzIGl0IGlzIGNyZWF0ZWQuIEJ5IGRlZmF1bHQg bm90aGluZyBpcyBwcmludGVkLgoKPWl0ZW0gZXJyb3IgPT4gXCRlcnIKCklmIHByZXNlbnQsIGl0 IHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhci4KVGhpcyBzY2FsYXIgd2lsbCBiZSBt YWRlIHRvIHJlZmVyZW5jZSBhbiBhcnJheSwgd2hpY2ggd2lsbApiZSB1c2VkIHRvIHN0b3JlIGFu eSBlcnJvcnMgdGhhdCBhcmUgZW5jb3VudGVyZWQuICBTZWUgdGhlIEw8LyJFUlJPUgpIQU5ETElO RyI+IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpJZiB0aGlzIHBhcmFtZXRlciBpcyBu b3QgdXNlZCwgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIG1heSByYWlzZQphIGZhdGFsIGVycm9y IHRoYXQgd2lsbCBjYXVzZSB0aGUgcHJvZ3JhbSB0byBoYWx0LCB1bmxlc3MgdHJhcHBlZAppbiBh biBDPGV2YWw+IGJsb2NrLgoKPWl0ZW0gb3duZXIgPT4gJG93bmVyCgo9aXRlbSB1c2VyID0+ICRv d25lcgoKPWl0ZW0gdWlkID0+ICRvd25lcgoKSWYgcHJlc2VudCwgd2lsbCBjYXVzZSBhbnkgY3Jl YXRlZCBkaXJlY3RvcnkgdG8gYmUgb3duZWQgYnkgQzwkb3duZXI+LgpJZiB0aGUgdmFsdWUgaXMg bnVtZXJpYywgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIHVpZDsgb3RoZXJ3aXNlIGEKdXNl cm5hbWUgaXMgYXNzdW1lZC4gQW4gZXJyb3Igd2lsbCBiZSBpc3N1ZWQgaWYgdGhlIHVzZXJuYW1l IGNhbm5vdCBiZQptYXBwZWQgdG8gYSB1aWQsIHRoZSB1aWQgZG9lcyBub3QgZXhpc3Qgb3IgdGhl IHByb2Nlc3MgbGFja3MgdGhlCnByaXZpbGVnZXMgdG8gY2hhbmdlIG93bmVyc2hpcC4KCk93bmVy c2hpcCBvZiBkaXJlY3RvcmllcyB0aGF0IGFscmVhZHkgZXhpc3Qgd2lsbCBub3QgYmUgY2hhbmdl ZC4KCkM8dXNlcj4gYW5kIEM8dWlkPiBhcmUgYWxpYXNlcyBvZiBDPG93bmVyPi4KCj1pdGVtIGdy b3VwID0+ICRncm91cAoKSWYgcHJlc2VudCwgd2lsbCBjYXVzZSBhbnkgY3JlYXRlZCBkaXJlY3Rv cnkgdG8gYmUgb3duZWQgYnkgdGhlIGdyb3VwCkM8JGdyb3VwPi4gIElmIHRoZSB2YWx1ZSBpcyBu dW1lcmljLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgZ2lkOwpvdGhlcndpc2UgYSBncm91 cCBuYW1lIGlzIGFzc3VtZWQuIEFuIGVycm9yIHdpbGwgYmUgaXNzdWVkIGlmIHRoZQpncm91cCBu YW1lIGNhbm5vdCBiZSBtYXBwZWQgdG8gYSBnaWQsIHRoZSBnaWQgZG9lcyBub3QgZXhpc3Qgb3Ig dGhlCnByb2Nlc3MgbGFja3MgdGhlIHByaXZpbGVnZXMgdG8gY2hhbmdlIGdyb3VwIG93bmVyc2hp cC4KCkdyb3VwIG93bmVyc2hpcCBvZiBkaXJlY3RvcmllcyB0aGF0IGFscmVhZHkgZXhpc3Qgd2ls bCBub3QgYmUgY2hhbmdlZC4KCiAgICBtYWtlX3BhdGggJy92YXIvdG1wL3dlYmNhY2hlJywge293 bmVyPT4nbm9ib2R5JywgZ3JvdXA9Pidub2dyb3VwJ307Cgo9YmFjawoKPWl0ZW0gbWtwYXRoKCAk ZGlyICkKCj1pdGVtIG1rcGF0aCggJGRpciwgJHZlcmJvc2UsICRtb2RlICkKCj1pdGVtIG1rcGF0 aCggWyRkaXIxLCAkZGlyMiwuLi5dLCAkdmVyYm9zZSwgJG1vZGUgKQoKPWl0ZW0gbWtwYXRoKCAk ZGlyMSwgJGRpcjIsLi4uLCBcJW9wdCApCgpUaGUgQzxta3BhdGgoKT4gZnVuY3Rpb24gcHJvdmlk ZSB0aGUgbGVnYWN5IGludGVyZmFjZSBvZgpDPG1ha2VfcGF0aCgpPiB3aXRoIGEgZGlmZmVyZW50 IGludGVycHJldGF0aW9uIG9mIHRoZSBhcmd1bWVudHMKcGFzc2VkLiAgVGhlIGJlaGF2aW91ciBh bmQgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBvdGhlcndpc2UKaWRlbnRpY2FsIHRv IEM8bWFrZV9wYXRoKCk+LgoKPWl0ZW0gcmVtb3ZlX3RyZWUoICRkaXIxLCAkZGlyMiwgLi4uLiAp Cgo9aXRlbSByZW1vdmVfdHJlZSggJGRpcjEsICRkaXIyLCAuLi4uLCBcJW9wdHMgKQoKVGhlIEM8 cmVtb3ZlX3RyZWU+IGZ1bmN0aW9uIGRlbGV0ZXMgdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFuZCBh bnkKZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHRoZXkgbWlnaHQgY29udGFpbiwgbXVjaCBsaWtl IHRoZSBVbml4CmNvbW1hbmQgQzxybSAtcmY+IG9yIHRoZSBXaW5kb3dzIGNvbW1hbmRzIEM8cm1k aXIgL3M+IGFuZCBDPHJkIC9zPi4KClRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgbGlzdCBvZiBkaXJl Y3RvcmllcyB0byBiZSByZW1vdmVkLiAoSW4gcG9pbnQgb2YgZmFjdCwKaXQgd2lsbCBhbHNvIGFj Y2VwdCBmaWxlc3lzdGVtIGVudHJpZXMgd2hpY2ggYXJlIG5vdCBkaXJlY3Rvcmllcywgc3VjaCBh cwpyZWd1bGFyIGZpbGVzIGFuZCBzeW1saW5rcy4gIEJ1dCwgYXMgaXRzIG5hbWUgc3VnZ2VzdHMs IGl0cyBpbnRlbnQgaXMgdG8KcmVtb3ZlIHRyZWVzIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgZmls ZXMuKQoKQzxyZW1vdmVfdHJlZSgpPidzIGJlaGF2aW91ciBtYXkgYmUgdHVuZWQgYnkgYW4gb3B0 aW9uYWwgaGFzaHJlZgphcHBlYXJpbmcgYXMgdGhlIGxhc3QgcGFyYW1ldGVyIG9uIHRoZSBjYWxs LiAgSWYgYW4gZW1wdHkgc3RyaW5nIGlzCnBhc3NlZCB0byBDPHJlbW92ZV90cmVlPiwgYW4gZXJy b3Igd2lsbCBvY2N1ci4KCkI8Tk9URTo+ICBGb3Igc2VjdXJpdHkgcmVhc29ucywgd2Ugc3Ryb25n bHkgYWR2aXNlIHVzZSBvZiB0aGUKaGFzaHJlZi1hcy1maW5hbC1hcmd1bWVudCBzeW50YXggLS0g c3BlY2lmaWNhbGx5LCB3aXRoIGEgc2V0dGluZyBvZiB0aGUgQzxzYWZlPgplbGVtZW50IHRvIGEg dHJ1ZSB2YWx1ZS4KCiAgICByZW1vdmVfdHJlZSggJGRpcjEsICRkaXIyLCAuLi4uLAogICAgICAg IHsKICAgICAgICAgICAgc2FmZSA9PiAxLAogICAgICAgICAgICAuLi4gICAgICAgICAjIG90aGVy IGtleS12YWx1ZSBwYWlycwogICAgICAgIH0sCiAgICApOwoKVGhlIGZ1bmN0aW9uIHJldHVybnMg dGhlIG51bWJlciBvZiBmaWxlcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4KClRoZSBmb2xsb3dpbmcg a2V5cyBhcmUgcmVjb2duaXNlZCBpbiB0aGUgb3B0aW9uIGhhc2g6Cgo9b3ZlcgoKPWl0ZW0gdmVy Ym9zZSA9PiAkYm9vbAoKSWYgcHJlc2VudCwgd2lsbCBjYXVzZSBDPHJlbW92ZV90cmVlPiB0byBw cmludCB0aGUgbmFtZSBvZiBlYWNoIGZpbGUgYXMKaXQgaXMgdW5saW5rZWQuIEJ5IGRlZmF1bHQg bm90aGluZyBpcyBwcmludGVkLgoKPWl0ZW0gc2FmZSA9PiAkYm9vbAoKV2hlbiBzZXQgdG8gYSB0 cnVlIHZhbHVlLCB3aWxsIGNhdXNlIEM8cmVtb3ZlX3RyZWU+IHRvIHNraXAgdGhlIGZpbGVzCmZv ciB3aGljaCB0aGUgcHJvY2VzcyBsYWNrcyB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlcyBuZWVkZWQg dG8gZGVsZXRlCmZpbGVzLCBzdWNoIGFzIGRlbGV0ZSBwcml2aWxlZ2VzIG9uIFZNUy4gSW4gb3Ro ZXIgd29yZHMsIHRoZSBjb2RlCndpbGwgbWFrZSBubyBhdHRlbXB0IHRvIGFsdGVyIGZpbGUgcGVy bWlzc2lvbnMuIFRodXMsIGlmIHRoZSBwcm9jZXNzCmlzIGludGVycnVwdGVkLCBubyBmaWxlc3lz dGVtIG9iamVjdCB3aWxsIGJlIGxlZnQgaW4gYSBtb3JlCnBlcm1pc3NpdmUgbW9kZS4KCj1pdGVt IGtlZXBfcm9vdCA9PiAkYm9vbAoKV2hlbiBzZXQgdG8gYSB0cnVlIHZhbHVlLCB3aWxsIGNhdXNl IGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMKdG8gYmUgcmVtb3ZlZCwgZXhjZXB0IHRoZSBp bml0aWFsbHkgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBUaGlzIGNvbWVzCmluIGhhbmR5IHdoZW4g Y2xlYW5pbmcgb3V0IGFuIGFwcGxpY2F0aW9uJ3Mgc2NyYXRjaCBkaXJlY3RvcnkuCgogICAgcmVt b3ZlX3RyZWUoICcvdG1wJywge2tlZXBfcm9vdCA9PiAxfSApOwoKPWl0ZW0gcmVzdWx0ID0+IFwk cmVzCgpJZiBwcmVzZW50LCBpdCBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIuClRo aXMgc2NhbGFyIHdpbGwgYmUgbWFkZSB0byByZWZlcmVuY2UgYW4gYXJyYXksIHdoaWNoIHdpbGwK YmUgdXNlZCB0byBzdG9yZSBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHVubGlua2VkCmR1cmlu ZyB0aGUgY2FsbC4gSWYgbm90aGluZyBpcyB1bmxpbmtlZCwgdGhlIGFycmF5IHdpbGwgYmUgZW1w dHkuCgogICAgcmVtb3ZlX3RyZWUoICcvdG1wJywge3Jlc3VsdCA9PiBcbXkgJGxpc3R9ICk7CiAg ICBwcmludCAidW5saW5rZWQgJF9cbiIgZm9yIEAkbGlzdDsKClRoaXMgaXMgYSB1c2VmdWwgYWx0 ZXJuYXRpdmUgdG8gdGhlIEM8dmVyYm9zZT4ga2V5LgoKPWl0ZW0gZXJyb3IgPT4gXCRlcnIKCklm IHByZXNlbnQsIGl0IHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhIHNjYWxhci4KVGhpcyBzY2Fs YXIgd2lsbCBiZSBtYWRlIHRvIHJlZmVyZW5jZSBhbiBhcnJheSwgd2hpY2ggd2lsbApiZSB1c2Vk IHRvIHN0b3JlIGFueSBlcnJvcnMgdGhhdCBhcmUgZW5jb3VudGVyZWQuICBTZWUgdGhlIEw8LyJF UlJPUgpIQU5ETElORyI+IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgpSZW1vdmluZyB0 aGluZ3MgaXMgYSBtdWNoIG1vcmUgZGFuZ2Vyb3VzIHByb3Bvc2l0aW9uIHRoYW4KY3JlYXRpbmcg dGhpbmdzLiBBcyBzdWNoLCB0aGVyZSBhcmUgY2VydGFpbiBjb25kaXRpb25zIHRoYXQKQzxyZW1v dmVfdHJlZT4gbWF5IGVuY291bnRlciB0aGF0IGFyZSBzbyBkYW5nZXJvdXMgdGhhdCB0aGUgb25s eQpzYW5lIGFjdGlvbiBsZWZ0IGlzIHRvIGtpbGwgdGhlIHByb2dyYW0uCgpVc2UgQzxlcnJvcj4g dG8gdHJhcCBhbGwgdGhhdCBpcyByZWFzb25hYmxlIChwcm9ibGVtcyB3aXRoCnBlcm1pc3Npb25z IGFuZCB0aGUgbGlrZSksIGFuZCBsZXQgaXQgZGllIGlmIHRoaW5ncyBnZXQgb3V0Cm9mIGhhbmQu IFRoaXMgaXMgdGhlIHNhZmVzdCBjb3Vyc2Ugb2YgYWN0aW9uLgoKPWJhY2sKCj1pdGVtIHJtdHJl ZSggJGRpciApCgo9aXRlbSBybXRyZWUoICRkaXIsICR2ZXJib3NlLCAkc2FmZSApCgo9aXRlbSBy bXRyZWUoIFskZGlyMSwgJGRpcjIsLi4uXSwgJHZlcmJvc2UsICRzYWZlICkKCj1pdGVtIHJtdHJl ZSggJGRpcjEsICRkaXIyLC4uLiwgXCVvcHQgKQoKVGhlIEM8cm10cmVlKCk+IGZ1bmN0aW9uIHBy b3ZpZGUgdGhlIGxlZ2FjeSBpbnRlcmZhY2Ugb2YKQzxyZW1vdmVfdHJlZSgpPiB3aXRoIGEgZGlm ZmVyZW50IGludGVycHJldGF0aW9uIG9mIHRoZSBhcmd1bWVudHMKcGFzc2VkLiBUaGUgYmVoYXZp b3VyIGFuZCByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGlzIG90aGVyd2lzZQppZGVudGlj YWwgdG8gQzxyZW1vdmVfdHJlZSgpPi4KCkI8Tk9URTo+ICBGb3Igc2VjdXJpdHkgcmVhc29ucywg d2Ugc3Ryb25nbHkgYWR2aXNlIHVzZSBvZiB0aGUKaGFzaHJlZi1hcy1maW5hbC1hcmd1bWVudCBz eW50YXgsIHNwZWNpZmljYWxseSB3aXRoIGEgc2V0dGluZyBvZiB0aGUgQzxzYWZlPgplbGVtZW50 IHRvIGEgdHJ1ZSB2YWx1ZS4KCiAgICBybXRyZWUoICRkaXIxLCAkZGlyMiwgLi4uLiwKICAgICAg ICB7CiAgICAgICAgICAgIHNhZmUgPT4gMSwKICAgICAgICAgICAgLi4uICAgICAgICAgIyBvdGhl ciBrZXktdmFsdWUgcGFpcnMKICAgICAgICB9LAogICAgKTsKCj1iYWNrCgo9aGVhZDIgRVJST1Ig SEFORExJTkcKCj1vdmVyIDQKCj1pdGVtIEI8Tk9URTo+CgpUaGUgZm9sbG93aW5nIGVycm9yIGhh bmRsaW5nIG1lY2hhbmlzbSBpcyBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsCmNvZGUgcGF0aHMg RVhDRVBUIGluIGNhc2VzIHdoZXJlIHRoZSBST09UIG5vZGUgaXMgbm9uZXhpc3RlbnQuICBJbgp2 ZXJzaW9uIDIuMTEgdGhlIG1haW50YWluZXJzIGF0dGVtcHRlZCB0byByZWN0aWZ5IHRoaXMgaW5j b25zaXN0ZW5jeQpidXQgdG9vIG1hbnkgZG93bnN0cmVhbSBtb2R1bGVzIGVuY291bnRlcmVkIHBy b2JsZW1zLiAgSW4gc3VjaCBjYXNlLAppZiB5b3UgcmVxdWlyZSByb290IG5vZGUgZXZhbHVhdGlv biBvciBlcnJvciBjaGVja2luZyBwcmlvciB0byBjYWxsaW5nCkM8bWFrZV9wYXRoPiBvciBDPHJl bW92ZV90cmVlPiwgeW91IHNob3VsZCB0YWtlIGFkZGl0aW9uYWwgcHJlY2F1dGlvbnMuCgo9YmFj awoKSWYgQzxtYWtlX3BhdGg+IG9yIEM8cmVtb3ZlX3RyZWU+IGVuY291bnRlcnMgYW4gZXJyb3Is IGEgZGlhZ25vc3RpYwptZXNzYWdlIHdpbGwgYmUgcHJpbnRlZCB0byBDPFNUREVSUj4gdmlhIEM8 Y2FycD4gKGZvciBub24tZmF0YWwKZXJyb3JzKSBvciB2aWEgQzxjcm9haz4gKGZvciBmYXRhbCBl cnJvcnMpLgoKSWYgdGhpcyBiZWhhdmlvdXIgaXMgbm90IGRlc2lyYWJsZSwgdGhlIEM8ZXJyb3I+ IGF0dHJpYnV0ZSBtYXkgYmUKdXNlZCB0byBob2xkIGEgcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUs IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzdG9yZQp0aGUgZGlhZ25vc3RpY3MuIFRoZSB2YXJpYWJs ZSBpcyBtYWRlIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IG9mIGhhc2gKcmVmZXJlbmNlcy4gIEVh Y2ggaGFzaCBjb250YWluIGEgc2luZ2xlIGtleS92YWx1ZSBwYWlyIHdoZXJlIHRoZSBrZXkKaXMg dGhlIG5hbWUgb2YgdGhlIGZpbGUsIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGVycm9yIG1lc3NhZ2Ug KGluY2x1ZGluZwp0aGUgY29udGVudHMgb2YgQzwkIT4gd2hlbiBhcHByb3ByaWF0ZSkuICBJZiBh IGdlbmVyYWwgZXJyb3IgaXMKZW5jb3VudGVyZWQgdGhlIGRpYWdub3N0aWMga2V5IHdpbGwgYmUg ZW1wdHkuCgpBbiBleGFtcGxlIHVzYWdlIGxvb2tzIGxpa2U6CgogIHJlbW92ZV90cmVlKCAnZm9v L2JhcicsICdiYXIvcmF0Jywge2Vycm9yID0+IFxteSAkZXJyfSApOwogIGlmICgkZXJyICYmIEAk ZXJyKSB7CiAgICAgIGZvciBteSAkZGlhZyAoQCRlcnIpIHsKICAgICAgICAgIG15ICgkZmlsZSwg JG1lc3NhZ2UpID0gJSRkaWFnOwogICAgICAgICAgaWYgKCRmaWxlIGVxICcnKSB7CiAgICAgICAg ICAgICAgcHJpbnQgImdlbmVyYWwgZXJyb3I6ICRtZXNzYWdlXG4iOwogICAgICAgICAgfQogICAg ICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgcHJpbnQgInByb2JsZW0gdW5saW5raW5nICRmaWxl OiAkbWVzc2FnZVxuIjsKICAgICAgICAgIH0KICAgICAgfQogIH0KICBlbHNlIHsKICAgICAgcHJp bnQgIk5vIGVycm9yIGVuY291bnRlcmVkXG4iOwogIH0KCk5vdGUgdGhhdCBpZiBubyBlcnJvcnMg YXJlIGVuY291bnRlcmVkLCBDPCRlcnI+IHdpbGwgcmVmZXJlbmNlIGFuCmVtcHR5IGFycmF5LiAg VGhpcyBtZWFucyB0aGF0IEM8JGVycj4gd2lsbCBhbHdheXMgZW5kIHVwIFRSVUU7IHNvIHlvdQpu ZWVkIHRvIHRlc3QgQzxAJGVycj4gdG8gZGV0ZXJtaW5lIGlmIGVycm9ycyBvY2N1cnJlZC4KCj1o ZWFkMiBOT1RFUwoKQzxGaWxlOjpQYXRoPiBibGluZGx5IGV4cG9ydHMgQzxta3BhdGg+IGFuZCBD PHJtdHJlZT4gaW50byB0aGUKY3VycmVudCBuYW1lc3BhY2UuIFRoZXNlIGRheXMsIHRoaXMgaXMg Y29uc2lkZXJlZCBiYWQgc3R5bGUsIGJ1dAp0byBjaGFuZ2UgaXQgbm93IHdvdWxkIGJyZWFrIHRv byBtdWNoIGNvZGUuIE5vbmV0aGVsZXNzLCB5b3UgYXJlCmludml0ZWQgdG8gc3BlY2lmeSB3aGF0 IGl0IGlzIHlvdSBhcmUgZXhwZWN0aW5nIHRvIHVzZToKCiAgdXNlIEZpbGU6OlBhdGggJ3JtdHJl ZSc7CgpUaGUgcm91dGluZXMgQzxtYWtlX3BhdGg+IGFuZCBDPHJlbW92ZV90cmVlPiBhcmUgQjxu b3Q+IGV4cG9ydGVkCmJ5IGRlZmF1bHQuIFlvdSBtdXN0IHNwZWNpZnkgd2hpY2ggb25lcyB5b3Ug d2FudCB0byB1c2UuCgogIHVzZSBGaWxlOjpQYXRoICdyZW1vdmVfdHJlZSc7CgpOb3RlIHRoYXQg YSBzaWRlLWVmZmVjdCBvZiB0aGUgYWJvdmUgaXMgdGhhdCBDPG1rcGF0aD4gYW5kIEM8cm10cmVl PgphcmUgbm8gbG9uZ2VyIGV4cG9ydGVkIGF0IGFsbC4gVGhpcyBpcyBkdWUgdG8gdGhlIHdheSB0 aGUgQzxFeHBvcnRlcj4KbW9kdWxlIHdvcmtzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBhIGNvZGVi YXNlIHRvIHVzZSB0aGUgbmV3CmludGVyZmFjZSwgeW91IHdpbGwgaGF2ZSB0byBsaXN0IGV2ZXJ5 dGhpbmcgZXhwbGljaXRseS4gQnV0IHRoYXQncwpqdXN0IGdvb2QgcHJhY3RpY2UgYW55d2F5LgoK ICB1c2UgRmlsZTo6UGF0aCBxdyhyZW1vdmVfdHJlZSBybXRyZWUpOwoKPWhlYWQzIEFQSSBDSEFO R0VTCgpUaGUgQVBJIHdhcyBjaGFuZ2VkIGluIHRoZSAyLjAgYnJhbmNoLiBGb3IgYSB0aW1lLCBD PG1rcGF0aD4gYW5kCkM8cm10cmVlPiB0cmllZCwgdW5zdWNjZXNzZnVsbHksIHRvIGRlYWwgd2l0 aCB0aGUgdHdvIGRpZmZlcmVudApjYWxsaW5nIG1lY2hhbmlzbXMuIFRoaXMgYXBwcm9hY2ggd2Fz IGNvbnNpZGVyZWQgYSBmYWlsdXJlLgoKVGhlIG5ldyBzZW1hbnRpY3MgYXJlIG5vdyBvbmx5IGF2 YWlsYWJsZSB3aXRoIEM8bWFrZV9wYXRoPiBhbmQKQzxyZW1vdmVfdHJlZT4uIFRoZSBvbGQgc2Vt YW50aWNzIGFyZSBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoCkM8bWtwYXRoPiBhbmQgQzxybXRyZWU+ LiBVc2VycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1cGdyYWRlCnRvIGF0IGxlYXN0IDIu MDggaW4gb3JkZXIgdG8gYXZvaWQgc3VycHJpc2VzLgoKPWhlYWQzIFNFQ1VSSVRZIENPTlNJREVS QVRJT05TCgpUaGVyZSB3ZXJlIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgMS54IGltcGxlbWVudGF0 aW9ucyBvZiBGaWxlOjpQYXRoJ3MKQzxybXRyZWU+IGZ1bmN0aW9uIChhbHRob3VnaCBzb21ldGlt ZXMgcGF0Y2hlZCBkZXBlbmRpbmcgb24gdGhlIE9TCmRpc3RyaWJ1dGlvbiBvciBwbGF0Zm9ybSku IFRoZSAyLjAgdmVyc2lvbiBjb250YWlucyBjb2RlIHRvIGF2b2lkIHRoZQpwcm9ibGVtIG1lbnRp b25lZCBpbiBDVkUtMjAwMi0wNDM1LgoKU2VlIHRoZSBmb2xsb3dpbmcgcGFnZXMgZm9yIG1vcmUg aW5mb3JtYXRpb246CgogICAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9y dC5jZ2k/YnVnPTI4NjkwNQogICAgaHR0cDovL3d3dy5ubnRwLnBlcmwub3JnL2dyb3VwL3Blcmwu cGVybDUucG9ydGVycy8yMDA1LzAxL21zZzk3NjIzLmh0bWwKICAgIGh0dHA6Ly93d3cuZGViaWFu Lm9yZy9zZWN1cml0eS8yMDA1L2RzYS02OTYKCkFkZGl0aW9uYWxseSwgdW5sZXNzIHRoZSBDPHNh ZmU+IHBhcmFtZXRlciBpcyBzZXQgKG9yIHRoZQp0aGlyZCBwYXJhbWV0ZXIgaW4gdGhlIHRyYWRp dGlvbmFsIGludGVyZmFjZSBpcyBUUlVFKSwgc2hvdWxkIGEKQzxyZW1vdmVfdHJlZT4gYmUgaW50 ZXJydXB0ZWQsIGZpbGVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGluIHJlYWQtb25seQptb2RlIG1h eSBub3cgaGF2ZSB0aGVpciBwZXJtaXNzaW9ucyBzZXQgdG8gYSByZWFkLXdyaXRlIChvciAiZGVs ZXRlCk9LIikgbW9kZS4KClRoZSBmb2xsb3dpbmcgQ1ZFIHJlcG9ydHMgd2VyZSBwcmV2aW91c2x5 IGZpbGVkIGFnYWluc3QgRmlsZS1QYXRoIGFuZCBhcmUKYmVsaWV2ZWQgdG8gaGF2ZSBiZWVuIGFk ZHJlc3NlZDoKCj1vdmVyIDQKCj1pdGVtICogTDxodHRwOi8vY3ZlLmNpcmNsLmx1L2N2ZS9DVkUt MjAwNC0wNDUyPgoKPWl0ZW0gKiBMPGh0dHA6Ly9jdmUuY2lyY2wubHUvY3ZlL0NWRS0yMDA1LTA0 NDg+Cgo9YmFjawoKSW4gRmVicnVhcnkgMjAxNyB0aGUgY1BhbmVsIFNlY3VyaXR5IFRlYW0gcmVw b3J0ZWQgYW4gYWRkaXRpb25hbCB2dWxuZXJhYmlsaXR5CmluIEZpbGUtUGF0aC4gIFRoZSBDPGNo bW9kKCk+IGxvZ2ljIHRvIG1ha2UgZGlyZWN0b3JpZXMgdHJhdmVyc2FibGUgY2FuIGJlCmFidXNl ZCB0byBzZXQgdGhlIG1vZGUgb24gYW4gYXR0YWNrZXItY2hvc2VuIGZpbGUgdG8gYW4gYXR0YWNr ZXItY2hvc2VuIHZhbHVlLgpUaGlzIGlzIGR1ZSB0byB0aGUgdGltZS1vZi1jaGVjay10by10aW1l LW9mLXVzZSAoVE9DVFRPVSkgcmFjZSBjb25kaXRpb24KKEw8aHR0cHM6Ly9lbi53aWtpcGVkaWEu b3JnL3dpa2kvVGltZV9vZl9jaGVja190b190aW1lX29mX3VzZT4pIGJldHdlZW4gdGhlCkM8c3Rh dCgpPiB0aGF0IGRlY2lkZXMgdGhlIGlub2RlIGlzIGEgZGlyZWN0b3J5IGFuZCB0aGUgQzxjaG1v ZCgpPiB0aGF0IHRyaWVzCnRvIG1ha2UgaXQgdXNlci1yd3guICBDUEFOIHZlcnNpb25zIDIuMTMg YW5kIGxhdGVyIGluY29ycG9yYXRlIGEgcGF0Y2gKcHJvdmlkZWQgYnkgSm9obiBMaWdodHNleSB0 byBhZGRyZXNzIHRoaXMgcHJvYmxlbS4gIFRoaXMgdnVsbmVyYWJpbGl0eSBoYXMKYmVlbiByZXBv cnRlZCBhcyBDVkUtMjAxNy02NTEyLgoKPWhlYWQxIERJQUdOT1NUSUNTCgpGQVRBTCBlcnJvcnMg d2lsbCBjYXVzZSB0aGUgcHJvZ3JhbSB0byBoYWx0IChDPGNyb2FrPiksIHNpbmNlIHRoZQpwcm9i bGVtIGlzIHNvIHNldmVyZSB0aGF0IGl0IHdvdWxkIGJlIGRhbmdlcm91cyB0byBjb250aW51ZS4g KFRoaXMKY2FuIGFsd2F5cyBiZSB0cmFwcGVkIHdpdGggQzxldmFsPiwgYnV0IGl0J3Mgbm90IGEg Z29vZCBpZGVhLiBVbmRlcgp0aGUgY2lyY3Vtc3RhbmNlcywgZHlpbmcgaXMgdGhlIGJlc3QgdGhp bmcgdG8gZG8pLgoKU0VWRVJFIGVycm9ycyBtYXkgYmUgdHJhcHBlZCB1c2luZyB0aGUgbW9kZXJu IGludGVyZmFjZS4gSWYgdGhlCnRoZXkgYXJlIG5vdCB0cmFwcGVkLCBvciBpZiB0aGUgb2xkIGlu dGVyZmFjZSBpcyB1c2VkLCBzdWNoIGFuIGVycm9yCndpbGwgY2F1c2UgdGhlIHByb2dyYW0gd2ls bCBoYWx0LgoKQWxsIG90aGVyIGVycm9ycyBtYXkgYmUgdHJhcHBlZCB1c2luZyB0aGUgbW9kZXJu IGludGVyZmFjZSwgb3RoZXJ3aXNlCnRoZXkgd2lsbCBiZSBDPGNhcnA+ZWQgYWJvdXQuIFByb2dy YW0gZXhlY3V0aW9uIHdpbGwgbm90IGJlIGhhbHRlZC4KCj1vdmVyIDQKCj1pdGVtIG1rZGlyIFtw YXRoXTogW2Vycm1zZ10gKFNFVkVSRSkKCkM8bWFrZV9wYXRoPiB3YXMgdW5hYmxlIHRvIGNyZWF0 ZSB0aGUgcGF0aC4gUHJvYmFibHkgc29tZSBzb3J0IG9mCnBlcm1pc3Npb25zIGVycm9yIGF0IHRo ZSBwb2ludCBvZiBkZXBhcnR1cmUgb3IgaW5zdWZmaWNpZW50IHJlc291cmNlcwooc3VjaCBhcyBm cmVlIGlub2RlcyBvbiBVbml4KS4KCj1pdGVtIE5vIHJvb3QgcGF0aChzKSBzcGVjaWZpZWQKCkM8 bWFrZV9wYXRoPiB3YXMgbm90IGdpdmVuIGFueSBwYXRocyB0byBjcmVhdGUuIFRoaXMgbWVzc2Fn ZSBpcyBvbmx5CmVtaXR0ZWQgaWYgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggdGhlIHRyYWRp dGlvbmFsIGludGVyZmFjZS4KVGhlIG1vZGVybiBpbnRlcmZhY2Ugd2lsbCByZW1haW4gc2lsZW50 IGlmIGdpdmVuIG5vdGhpbmcgdG8gZG8uCgo9aXRlbSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5 CgpPbiBXaW5kb3dzLCBpZiBDPG1ha2VfcGF0aD4gZ2l2ZXMgeW91IHRoaXMgd2FybmluZywgaXQg bWF5IG1lYW4gdGhhdAp5b3UgaGF2ZSBleGNlZWRlZCB5b3VyIGZpbGVzeXN0ZW0ncyBtYXhpbXVt IHBhdGggbGVuZ3RoLgoKPWl0ZW0gY2Fubm90IGZldGNoIGluaXRpYWwgd29ya2luZyBkaXJlY3Rv cnk6IFtlcnJtc2ddCgpDPHJlbW92ZV90cmVlPiBhdHRlbXB0ZWQgdG8gZGV0ZXJtaW5lIHRoZSBp bml0aWFsIGRpcmVjdG9yeSBieSBjYWxsaW5nCkM8Q3dkOjpnZXRjd2Q+LCBidXQgdGhlIGNhbGwg ZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTm8gYXR0ZW1wdAp3aWxsIGJlIG1hZGUgdG8gZGVsZXRl IGFueXRoaW5nLgoKPWl0ZW0gY2Fubm90IHN0YXQgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeTog W2Vycm1zZ10KCkM8cmVtb3ZlX3RyZWU+IGF0dGVtcHRlZCB0byBzdGF0IHRoZSBpbml0aWFsIGRp cmVjdG9yeSAoYWZ0ZXIgaGF2aW5nCnN1Y2Nlc3NmdWxseSBvYnRhaW5lZCBpdHMgbmFtZSB2aWEg QzxnZXRjd2Q+KSwgaG93ZXZlciwgdGhlIGNhbGwKZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTm8g YXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZGVsZXRlIGFueXRoaW5nLgoKPWl0ZW0gY2Fubm90IGNo ZGlyIHRvIFtkaXJdOiBbZXJybXNnXQoKQzxyZW1vdmVfdHJlZT4gYXR0ZW1wdGVkIHRvIHNldCB0 aGUgd29ya2luZyBkaXJlY3RvcnkgaW4gb3JkZXIgdG8KYmVnaW4gZGVsZXRpbmcgdGhlIG9iamVj dHMgdGhlcmVpbiwgYnV0IHdhcyB1bnN1Y2Nlc3NmdWwuIFRoaXMgaXMKdXN1YWxseSBhIHBlcm1p c3Npb25zIGlzc3VlLiBUaGUgcm91dGluZSB3aWxsIGNvbnRpbnVlIHRvIGRlbGV0ZQpvdGhlciB0 aGluZ3MsIGJ1dCB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGxlZnQgaW50YWN0LgoKPWl0ZW0gZGly ZWN0b3J5IFtkaXJdIGNoYW5nZWQgYmVmb3JlIGNoZGlyLCBleHBlY3RlZCBkZXY9W25dIGlubz1b bl0sIGFjdHVhbCBkZXY9W25dIGlubz1bbl0sIGFib3J0aW5nLiAoRkFUQUwpCgpDPHJlbW92ZV90 cmVlPiByZWNvcmRlZCB0aGUgZGV2aWNlIGFuZCBpbm9kZSBvZiBhIGRpcmVjdG9yeSwgYW5kIHRo ZW4KbW92ZWQgaW50byBpdC4gSXQgdGhlbiBwZXJmb3JtZWQgYSBDPHN0YXQ+IG9uIHRoZSBjdXJy ZW50IGRpcmVjdG9yeQphbmQgZGV0ZWN0ZWQgdGhhdCB0aGUgZGV2aWNlIGFuZCBpbm9kZSB3ZXJl IG5vIGxvbmdlciB0aGUgc2FtZS4gQXMKdGhpcyBpcyBhdCB0aGUgaGVhcnQgb2YgdGhlIHJhY2Ug Y29uZGl0aW9uIHByb2JsZW0sIHRoZSBwcm9ncmFtCndpbGwgZGllIGF0IHRoaXMgcG9pbnQuCgo9 aXRlbSBjYW5ub3QgbWFrZSBkaXJlY3RvcnkgW2Rpcl0gcmVhZCt3cml0ZWFibGU6IFtlcnJtc2dd CgpDPHJlbW92ZV90cmVlPiBhdHRlbXB0ZWQgdG8gY2hhbmdlIHRoZSBwZXJtaXNzaW9ucyBvbiB0 aGUgY3VycmVudCBkaXJlY3RvcnkKdG8gZW5zdXJlIHRoYXQgc3Vic2VxdWVudCB1bmxpbmtpbmdz IHdvdWxkIG5vdCBydW4gaW50byBwcm9ibGVtcywKYnV0IHdhcyB1bmFibGUgdG8gZG8gc28uIFRo ZSBwZXJtaXNzaW9ucyByZW1haW4gYXMgdGhleSB3ZXJlLCBhbmQKdGhlIHByb2dyYW0gd2lsbCBj YXJyeSBvbiwgZG9pbmcgdGhlIGJlc3QgaXQgY2FuLgoKPWl0ZW0gY2Fubm90IHJlYWQgW2Rpcl06 IFtlcnJtc2ddCgpDPHJlbW92ZV90cmVlPiB0cmllZCB0byByZWFkIHRoZSBjb250ZW50cyBvZiB0 aGUgZGlyZWN0b3J5IGluIG9yZGVyCnRvIGFjcXVpcmUgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3Rv cnkgZW50cmllcyB0byBiZSB1bmxpbmtlZCwgYnV0CndhcyB1bnN1Y2Nlc3NmdWwuIFRoaXMgaXMg dXN1YWxseSBhIHBlcm1pc3Npb25zIGlzc3VlLiBUaGUKcHJvZ3JhbSB3aWxsIGNvbnRpbnVlLCBi dXQgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgcmVtYWluCmFmdGVyIHRoZSBjYWxs LgoKPWl0ZW0gY2Fubm90IHJlc2V0IGNobW9kIFtkaXJdOiBbZXJybXNnXQoKQzxyZW1vdmVfdHJl ZT4sIGFmdGVyIGhhdmluZyBkZWxldGVkIGV2ZXJ5dGhpbmcgaW4gYSBkaXJlY3RvcnksIGF0dGVt cHRlZAp0byByZXN0b3JlIGl0cyBwZXJtaXNzaW9ucyB0byB0aGUgb3JpZ2luYWwgc3RhdGUgYnV0 IGZhaWxlZC4gVGhlCmRpcmVjdG9yeSBtYXkgd2luZCB1cCBiZWluZyBsZWZ0IGJlaGluZC4KCj1p dGVtIGNhbm5vdCByZW1vdmUgW2Rpcl0gd2hlbiBjd2QgaXMgW2Rpcl0KClRoZSBjdXJyZW50IHdv cmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9ncmFtIGlzIEY8L3NvbWUvcGF0aC90by9oZXJlPgph bmQgeW91IGFyZSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhbiBhbmNlc3Rvciwgc3VjaCBhcyBGPC9z b21lL3BhdGg+LgpUaGUgZGlyZWN0b3J5IHRyZWUgaXMgbGVmdCB1bnRvdWNoZWQuCgpUaGUgc29s dXRpb24gaXMgdG8gQzxjaGRpcj4gb3V0IG9mIHRoZSBjaGlsZCBkaXJlY3RvcnkgdG8gYSBwbGFj ZQpvdXRzaWRlIHRoZSBkaXJlY3RvcnkgdHJlZSB0byBiZSByZW1vdmVkLgoKPWl0ZW0gY2Fubm90 IGNoZGlyIHRvIFtwYXJlbnQtZGlyXSBmcm9tIFtjaGlsZC1kaXJdOiBbZXJybXNnXSwgYWJvcnRp bmcuIChGQVRBTCkKCkM8cmVtb3ZlX3RyZWU+LCBhZnRlciBoYXZpbmcgZGVsZXRlZCBldmVyeXRo aW5nIGFuZCByZXN0b3JlZCB0aGUgcGVybWlzc2lvbnMKb2YgYSBkaXJlY3RvcnksIHdhcyB1bmFi bGUgdG8gY2hkaXIgYmFjayB0byB0aGUgcGFyZW50LiBUaGUgcHJvZ3JhbQpoYWx0cyB0byBhdm9p ZCBhIHJhY2UgY29uZGl0aW9uIGZyb20gb2NjdXJyaW5nLgoKPWl0ZW0gY2Fubm90IHN0YXQgcHJp b3Igd29ya2luZyBkaXJlY3RvcnkgW2Rpcl06IFtlcnJtc2ddLCBhYm9ydGluZy4gKEZBVEFMKQoK QzxyZW1vdmVfdHJlZT4gd2FzIHVuYWJsZSB0byBzdGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFm dGVyIGhhdmluZyByZXR1cm5lZApmcm9tIHRoZSBjaGlsZC4gU2luY2UgdGhlcmUgaXMgbm8gd2F5 IG9mIGtub3dpbmcgaWYgd2UgcmV0dXJuZWQgdG8Kd2hlcmUgd2UgdGhpbmsgd2Ugc2hvdWxkIGJl IChieSBjb21wYXJpbmcgZGV2aWNlIGFuZCBpbm9kZSkgdGhlIG9ubHkKd2F5IG91dCBpcyB0byBD PGNyb2FrPi4KCj1pdGVtIHByZXZpb3VzIGRpcmVjdG9yeSBbcGFyZW50LWRpcl0gY2hhbmdlZCBi ZWZvcmUgZW50ZXJpbmcgW2NoaWxkLWRpcl0sIGV4cGVjdGVkIGRldj1bbl0gaW5vPVtuXSwgYWN0 dWFsIGRldj1bbl0gaW5vPVtuXSwgYWJvcnRpbmcuIChGQVRBTCkKCldoZW4gQzxyZW1vdmVfdHJl ZT4gcmV0dXJuZWQgZnJvbSBkZWxldGluZyBmaWxlcyBpbiBhIGNoaWxkIGRpcmVjdG9yeSwgYQpj aGVjayByZXZlYWxlZCB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGl0IHJldHVybmVkIHRvIHdh c24ndCB0aGUgb25lCml0IHN0YXJ0ZWQgb3V0IGZyb20uIFRoaXMgaXMgY29uc2lkZXJlZCBhIHNp Z24gb2YgbWFsaWNpb3VzIGFjdGl2aXR5LgoKPWl0ZW0gY2Fubm90IG1ha2UgZGlyZWN0b3J5IFtk aXJdIHdyaXRlYWJsZTogW2Vycm1zZ10KCkp1c3QgYmVmb3JlIHJlbW92aW5nIGEgZGlyZWN0b3J5 IChhZnRlciBoYXZpbmcgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQKZXZlcnl0aGluZyBpdCBjb250YWlu ZWQpLCBDPHJlbW92ZV90cmVlPiBhdHRlbXB0ZWQgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucwpvbiB0 aGUgZGlyZWN0b3J5IHRvIGVuc3VyZSBpdCBjb3VsZCBiZSByZW1vdmVkIGFuZCBmYWlsZWQuIFBy b2dyYW0KZXhlY3V0aW9uIGNvbnRpbnVlcywgYnV0IHRoZSBkaXJlY3RvcnkgbWF5IHBvc3NpYmx5 IG5vdCBiZSBkZWxldGVkLgoKPWl0ZW0gY2Fubm90IHJlbW92ZSBkaXJlY3RvcnkgW2Rpcl06IFtl cnJtc2ddCgpDPHJlbW92ZV90cmVlPiBhdHRlbXB0ZWQgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LCBi dXQgZmFpbGVkLiBUaGlzIG1heSBiZSBiZWNhdXNlCnNvbWUgb2JqZWN0cyB0aGF0IHdlcmUgdW5h YmxlIHRvIGJlIHJlbW92ZWQgcmVtYWluIGluIHRoZSBkaXJlY3RvcnksIG9yCml0IGNvdWxkIGJl IGEgcGVybWlzc2lvbnMgaXNzdWUuIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBsZWZ0IGJlaGluZC4K Cj1pdGVtIGNhbm5vdCByZXN0b3JlIHBlcm1pc3Npb25zIG9mIFtkaXJdIHRvIFswbm5uXTogW2Vy cm1zZ10KCkFmdGVyIGhhdmluZyBmYWlsZWQgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LCBDPHJlbW92 ZV90cmVlPiB3YXMgdW5hYmxlIHRvCnJlc3RvcmUgaXRzIHBlcm1pc3Npb25zIGZyb20gYSBwZXJt aXNzaXZlIHN0YXRlIGJhY2sgdG8gYSBwb3NzaWJseQptb3JlIHJlc3RyaWN0aXZlIHNldHRpbmcu IChQZXJtaXNzaW9ucyBnaXZlbiBpbiBvY3RhbCkuCgo9aXRlbSBjYW5ub3QgbWFrZSBmaWxlIFtm aWxlXSB3cml0ZWFibGU6IFtlcnJtc2ddCgpDPHJlbW92ZV90cmVlPiBhdHRlbXB0ZWQgdG8gZm9y Y2UgdGhlIHBlcm1pc3Npb25zIG9mIGEgZmlsZSB0byBlbnN1cmUgaXQKY291bGQgYmUgZGVsZXRl ZCwgYnV0IGZhaWxlZCB0byBkbyBzby4gSXQgd2lsbCwgaG93ZXZlciwgc3RpbGwgYXR0ZW1wdAp0 byB1bmxpbmsgdGhlIGZpbGUuCgo9aXRlbSBjYW5ub3QgdW5saW5rIGZpbGUgW2ZpbGVdOiBbZXJy bXNnXQoKQzxyZW1vdmVfdHJlZT4gZmFpbGVkIHRvIHJlbW92ZSBhIGZpbGUuIFByb2JhYmx5IGEg cGVybWlzc2lvbnMgaXNzdWUuCgo9aXRlbSBjYW5ub3QgcmVzdG9yZSBwZXJtaXNzaW9ucyBvZiBb ZmlsZV0gdG8gWzBubm5dOiBbZXJybXNnXQoKQWZ0ZXIgaGF2aW5nIGZhaWxlZCB0byByZW1vdmUg YSBmaWxlLCBDPHJlbW92ZV90cmVlPiB3YXMgYWxzbyB1bmFibGUKdG8gcmVzdG9yZSB0aGUgcGVy bWlzc2lvbnMgb24gdGhlIGZpbGUgdG8gYSBwb3NzaWJseSBsZXNzIHBlcm1pc3NpdmUKc2V0dGlu Zy4gKFBlcm1pc3Npb25zIGdpdmVuIGluIG9jdGFsKS4KCj1pdGVtIHVuYWJsZSB0byBtYXAgW293 bmVyXSB0byBhIHVpZCwgb3duZXJzaGlwIG5vdCBjaGFuZ2VkIik7CgpDPG1ha2VfcGF0aD4gd2Fz IGluc3RydWN0ZWQgdG8gZ2l2ZSB0aGUgb3duZXJzaGlwIG9mIGNyZWF0ZWQKZGlyZWN0b3JpZXMg dG8gdGhlIHN5bWJvbGljIG5hbWUgW293bmVyXSwgYnV0IEM8Z2V0cHduYW0+IGRpZApub3QgcmV0 dXJuIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWMgdWlkLiBUaGUgZGlyZWN0b3J5IHdpbGwKYmUg Y3JlYXRlZCwgYnV0IG93bmVyc2hpcCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgoKPWl0ZW0gdW5hYmxl IHRvIG1hcCBbZ3JvdXBdIHRvIGEgZ2lkLCBncm91cCBvd25lcnNoaXAgbm90IGNoYW5nZWQKCkM8 bWFrZV9wYXRoPiB3YXMgaW5zdHJ1Y3RlZCB0byBnaXZlIHRoZSBncm91cCBvd25lcnNoaXAgb2Yg Y3JlYXRlZApkaXJlY3RvcmllcyB0byB0aGUgc3ltYm9saWMgbmFtZSBbZ3JvdXBdLCBidXQgQzxn ZXRncm5hbT4gZGlkCm5vdCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpYyBnaWQuIFRo ZSBkaXJlY3Rvcnkgd2lsbApiZSBjcmVhdGVkLCBidXQgZ3JvdXAgb3duZXJzaGlwIHdpbGwgbm90 IGJlIGNoYW5nZWQuCgo9YmFjawoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSAqCgpM PEZpbGU6OlJlbW92ZT4KCkFsbG93cyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gYmUgbW92ZWQg dG8gdGhlIFRyYXNoY2FuL1JlY3ljbGUKQmluICh3aGVyZSB0aGV5IG1heSBsYXRlciBiZSByZXN0 b3JlZCBpZiBuZWNlc3NhcnkpIGlmIHRoZSBvcGVyYXRpbmcKc3lzdGVtIHN1cHBvcnRzIHN1Y2gg ZnVuY3Rpb25hbGl0eS4gVGhpcyBmZWF0dXJlIG1heSBvbmUgZGF5IGJlCm1hZGUgYXZhaWxhYmxl IGRpcmVjdGx5IGluIEM8RmlsZTo6UGF0aD4uCgo9aXRlbSAqCgpMPEZpbGU6OkZpbmQ6OlJ1bGU+ CgpXaGVuIHJlbW92aW5nIGRpcmVjdG9yeSB0cmVlcywgaWYgeW91IHdhbnQgdG8gZXhhbWluZSBl YWNoIGZpbGUgdG8KZGVjaWRlIHdoZXRoZXIgdG8gZGVsZXRlIGl0IChhbmQgcG9zc2libHkgbGVh dmluZyBsYXJnZSBzd2F0aGVzCmFsb25lKSwgRjxGaWxlOjpGaW5kOjpSdWxlPiBvZmZlcnMgYSBj b252ZW5pZW50IGFuZCBmbGV4aWJsZSBhcHByb2FjaAp0byBleGFtaW5pbmcgZGlyZWN0b3J5IHRy ZWVzLgoKPWJhY2sKCj1oZWFkMSBCVUdTIEFORCBMSU1JVEFUSU9OUwoKVGhlIGZvbGxvd2luZyBk ZXNjcmliZXMgRjxGaWxlOjpQYXRoPiBsaW1pdGF0aW9ucyBhbmQgaG93IHRvIHJlcG9ydCBidWdz LgoKPWhlYWQyIE1VTFRJVEhSRUFERUQgQVBQTElDQVRJT05TCgpGPEZpbGU6OlBhdGg+IEM8cm10 cmVlPiBhbmQgQzxyZW1vdmVfdHJlZT4gd2lsbCBub3Qgd29yayB3aXRoCm11bHRpdGhyZWFkZWQg YXBwbGljYXRpb25zIGR1ZSB0byBpdHMgdXNlIG9mIEM8Y2hkaXI+LiAgQXQgdGhpcyB0aW1lLApu byB3YXJuaW5nIG9yIGVycm9yIGlzIGdlbmVyYXRlZCBpbiB0aGlzIHNpdHVhdGlvbi4gIFlvdSB3 aWxsCmNlcnRhaW5seSBlbmNvdW50ZXIgdW5leHBlY3RlZCByZXN1bHRzLgoKVGhlIGltcGxlbWVu dGF0aW9uIHRoYXQgc3VyZmFjZXMgdGhpcyBsaW1pdGF0aW9uIHdpbGwgbm90IGJlIGNoYW5nZWQu IFNlZSB0aGUKRjxGaWxlOjpQYXRoOjpUaW55PiBtb2R1bGUgZm9yIGZ1bmN0aW9uYWxpdHkgc2lt aWxhciB0byBGPEZpbGU6OlBhdGg+IGJ1dCB3aGljaCBkb2VzCm5vdCBDPGNoZGlyPi4KCj1oZWFk MiBORlMgTW91bnQgUG9pbnRzCgpGPEZpbGU6OlBhdGg+IGlzIG5vdCByZXNwb25zaWJsZSBmb3Ig dHJpZ2dlcmluZyB0aGUgYXV0b21vdW50cywgbWlycm9yIG1vdW50cywKYW5kIHRoZSBjb250ZW50 cyBvZiBuZXR3b3JrIG1vdW50ZWQgZmlsZXN5c3RlbXMuICBJZiB5b3VyIE5GUyBpbXBsZW1lbnRh dGlvbgpyZXF1aXJlcyBhbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBmaWxlc3lzdGVt IGluIG9yZGVyIGZvcgpGPEZpbGU6OlBhdGg+IHRvIHBlcmZvcm0gb3BlcmF0aW9ucywgaXQgaXMg c3Ryb25nbHkgc3VnZ2VzdGVkIHlvdSBhc3N1cmUKZmlsZXN5c3RlbSBhdmFpbGFiaWxpdHkgYnkg cmVhZGluZyB0aGUgcm9vdCBvZiB0aGUgbW91bnRlZCBmaWxlc3lzdGVtLgoKPWhlYWQyIFJFUE9S VElORyBCVUdTCgpQbGVhc2UgcmVwb3J0IGFsbCBidWdzIG9uIHRoZSBSVCBxdWV1ZSwgZWl0aGVy IHZpYSB0aGUgd2ViIGludGVyZmFjZToKCkw8aHR0cDovL3J0LmNwYW4ub3JnL05vQXV0aC9CdWdz Lmh0bWw/RGlzdD1GaWxlLVBhdGg+CgpvciBieSBlbWFpbDoKCiAgICBidWctRmlsZS1QYXRoQHJ0 LmNwYW4ub3JnCgpJbiBlaXRoZXIgY2FzZSwgcGxlYXNlIEI8YXR0YWNoPiBwYXRjaGVzIHRvIHRo ZSBidWcgcmVwb3J0IHJhdGhlciB0aGFuCmluY2x1ZGluZyB0aGVtIGlubGluZSBpbiB0aGUgd2Vi IHBvc3Qgb3IgdGhlIGJvZHkgb2YgdGhlIGVtYWlsLgoKWW91IGNhbiBhbHNvIHNlbmQgcHVsbCBy ZXF1ZXN0cyB0byB0aGUgR2l0aHViIHJlcG9zaXRvcnk6CgpMPGh0dHBzOi8vZ2l0aHViLmNvbS9y cGNtZS9GaWxlLVBhdGg+Cgo9aGVhZDEgQUNLTk9XTEVER0VNRU5UUwoKUGF1bCBTemFibyBpZGVu dGlmaWVkIHRoZSByYWNlIGNvbmRpdGlvbiBvcmlnaW5hbGx5LCBhbmQgQnJlbmRhbgpPJ0RlYSB3 cm90ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgRGViaWFuIHRoYXQgYWRkcmVzc2VkIHRoZSBwcm9i bGVtLgpUaGF0IGNvZGUgd2FzIHVzZWQgYXMgYSBiYXNpcyBmb3IgdGhlIGN1cnJlbnQgY29kZS4g VGhlaXIgZWZmb3J0cwphcmUgZ3JlYXRseSBhcHByZWNpYXRlZC4KCkdpc2xlIEFhcyBtYWRlIGEg bnVtYmVyIG9mIGltcHJvdmVtZW50cyB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKMi4wNyBhbmQg aGlzIGFkdmljZSBhbmQgYXNzaXN0YW5jZSBpcyBhbHNvIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCgo9 aGVhZDEgQVVUSE9SUwoKUHJpb3IgYXV0aG9ycyBhbmQgbWFpbnRhaW5lcnM6IFRpbSBCdW5jZSwg Q2hhcmxlcyBCYWlsZXksIGFuZApEYXZpZCBMYW5kZ3JlbiA8RjxkYXZpZEBsYW5kZ3Jlbi5uZXQ+ Pi4KCkN1cnJlbnQgbWFpbnRhaW5lcnMgYXJlIFJpY2hhcmQgRWxiZXJnZXIgPEY8cmljaGVAY3Bh bi5vcmc+PiBhbmQKSmFtZXMgKEppbSkgS2VlbmFuIDxGPGprZWVuYW5AY3Bhbi5vcmc+Pi4KCj1o ZWFkMSBDT05UUklCVVRPUlMKCkNvbnRyaWJ1dG9ycyB0byBGaWxlOjpQYXRoLCBpbiBhbHBoYWJl dGljYWwgb3JkZXIgYnkgZmlyc3QgbmFtZS4KCj1vdmVyIDEKCj1pdGVtIDxGPGJ1bGtkZEBjcGFu Lm9yZz4+Cgo9aXRlbSBDaGFybGllIEdvbnphbGV6IDxGPGl0Y2hhcmxpZUBjcGFuLm9yZz4+Cgo9 aXRlbSBDcmFpZyBBLiBCZXJyeSA8RjxjcmFpZ2JlcnJ5QG1hYy5jb20+PgoKPWl0ZW0gSmFtZXMg RSBLZWVuYW4gPEY8amtlZW5hbkBjcGFuLm9yZz4+Cgo9aXRlbSBKb2huIExpZ2h0c2V5IDxGPGpv aG5AcGVybHNlYy5vcmc+PgoKPWl0ZW0gTmlnZWwgSG9ybmUgPEY8bmpoQGJhbmRzbWFuLmNvLnVr Pj4KCj1pdGVtIFJpY2hhcmQgRWxiZXJnZXIgPEY8cmljaGVAY3Bhbi5vcmc+PgoKPWl0ZW0gUnlh biBZZWUgPEY8cnllZUBjcGFuLm9yZz4+Cgo9aXRlbSBTa3llIFNoYXcgPEY8c2hhd0BjcGFuLm9y Zz4+Cgo9aXRlbSBUb20gTHV0eiA8Rjx0b21teWx1dHpAZ21haWwuY29tPj4KCj1pdGVtIFdpbGwg U2hlcHBhcmQgPEY8d2lsbHNoZXBwYXJkQGdpdGh1Yj4+Cgo9YmFjawoKPWhlYWQxIENPUFlSSUdI VAoKVGhpcyBtb2R1bGUgaXMgY29weXJpZ2h0IChDKSBDaGFybGVzIEJhaWxleSwgVGltIEJ1bmNl LCBEYXZpZCBMYW5kZ3JlbiwKSmFtZXMgS2VlbmFuIGFuZCBSaWNoYXJkIEVsYmVyZ2VyIDE5OTUt MjAxNy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCj1oZWFkMSBMSUNFTlNFCgpUaGlzIGxpYnJhcnkg aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpp dCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KCj1jdXQK --NYw5+LhiCV-- From debbugs-submit-bounces@debbugs.gnu.org Sun Jan 12 21:40:12 2020 Received: (at 39078) by debbugs.gnu.org; 13 Jan 2020 02:40:12 +0000 Received: from localhost ([127.0.0.1]:58512 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iqpeG-0000WC-Am for submit@debbugs.gnu.org; Sun, 12 Jan 2020 21:40:12 -0500 Received: from freefriends.org ([96.88.95.60]:38824) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iqpeD-0000W2-Uh for 39078@debbugs.gnu.org; Sun, 12 Jan 2020 21:40:10 -0500 X-Envelope-From: karl@freefriends.org X-Envelope-To: <39078@debbugs.gnu.org> Received: from freefriends.org (freefriends.org [96.88.95.60]) by freefriends.org (8.14.7/8.14.7) with ESMTP id 00D2e8bw023444 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for <39078@debbugs.gnu.org>; Sun, 12 Jan 2020 19:40:09 -0700 Received: (from apache@localhost) by freefriends.org (8.14.7/8.14.7/Submit) id 00D2e8Jl023443; Sun, 12 Jan 2020 19:40:08 -0700 Date: Sun, 12 Jan 2020 19:40:08 -0700 Message-Id: <202001130240.00D2e8Jl023443@freefriends.org> From: Karl Berry To: 39078@debbugs.gnu.org Subject: Re: bug#39078: Path.pm change -> deltree.pl -> t/uninstall-fail failure In-Reply-To: <202001110237.00B2bi2n013982@freefriends.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 39078 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 (---) Regarding the new failure of Path.pm:rmtree to do removals, here is the change I had in mind to use chmod and rm instead. The previously-"ERROR" tests (uninstall-fail and instspc) work for me with this change. Before I bother spending time on all the related overhead changes, any objections, improvements, comments on this approach? The rest of the patch is unrelated to the functional change: checking for any of the elements existing after the purported removal. In my testing I found it useful for this to be reported, and the abort to occur, right away. Then, the recursive ls report on failure might be overkill, but I found it useful to understand the failing situation, so here it is for consideration. (I guess it would be better to prepend the prefix to every line of the ls output, which would be easy enough.) --thanks, karl. diff --git a/t/ax/test-lib.sh b/t/ax/test-lib.sh index 57afc07..9312bbb 100644 --- a/t/ax/test-lib.sh +++ b/t/ax/test-lib.sh @@ -197,7 +197,18 @@ seq_ () rm_rf_ () { test $# -gt 0 || return 0 - $PERL "$am_testaux_srcdir"/deltree.pl "$@" + chmod -R u+rwx "$@" || : + rm -rf "$@" + _am_rmrf_status=$? + for _am_rmrf_v + do + if test -e "$_am_rmrf_v"; then + echo "$me (test-lib.sh:rm_rf_): tree not removed: $_am_rmrf_v" >&2 + echo "$me (test-lib.sh:rm_rf_): $(ls -alR $_am_rmrf_v 2>&1)" >&2 + _am_rmrf_status=2 + fi + done + return $_am_rmrf_status } commented_sed_unindent_prog=' From debbugs-submit-bounces@debbugs.gnu.org Thu Jan 16 23:05:21 2020 Received: (at 39078) by debbugs.gnu.org; 17 Jan 2020 04:05:21 +0000 Received: from localhost ([127.0.0.1]:38723 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1isIsr-0007kP-GN for submit@debbugs.gnu.org; Thu, 16 Jan 2020 23:05:21 -0500 Received: from mail-wm1-f54.google.com ([209.85.128.54]:36666) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1isIsp-0007kB-Hg for 39078@debbugs.gnu.org; Thu, 16 Jan 2020 23:05:20 -0500 Received: by mail-wm1-f54.google.com with SMTP id p17so6133292wma.1 for <39078@debbugs.gnu.org>; Thu, 16 Jan 2020 20:05:19 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=QqI5PCfJ9WVZwC7tu3C1b3UAaqcnE4CKUevFDPwOdgw=; b=nyv8wQMl28dJqemSozSikNIh6w4nmkNesL4hYHrCTkOGGhWXsCVhYFSVTUMOsbWrBF 4b+2O2yHrCtzk9g1djh/Cr3+SoQGjEbsAjXQNCIdwFKk0T7xebeDw14NjlkAjusITkPN NCFs7O7XwBtrb8XNBh923X5i/gN3yraklwuCZbCf26DJrmDnzUcHtibHN8iD+TDFXYRr bOJg/HlRbHQfM3+h2K5y/trfFXpufo/VB4/RaDuusWNtSC/cgbKL/4tMWAlgyYMCTsuK 629vy5pBUy3U37PgpHREWgp03OD9NsCjY27ydEBftvP/Xa1XBSkW//MBQZE16jWn66MN asdw== X-Gm-Message-State: APjAAAUq1cTBojxDhI12S6xnZ28R7NzVUBoVHS2xubuR/uiDnVpRDGcL C0gL2C0FQQk1AhGX3I8Gk1d5bBavu7Wq/L21P7u4KQ== X-Google-Smtp-Source: APXvYqy+FuJ41id9LFq5Pq8iCVn+URFVDMrDqZJ9mX3csN7tkpKTj/8dkIC33dlIsOI5ku2pdhw+sf+rFADz4HbmMNU= X-Received: by 2002:a1c:7715:: with SMTP id t21mr2307811wmi.149.1579233913781; Thu, 16 Jan 2020 20:05:13 -0800 (PST) MIME-Version: 1.0 References: <202001110237.00B2bi2n013982@freefriends.org> <202001130240.00D2e8Jl023443@freefriends.org> In-Reply-To: <202001130240.00D2e8Jl023443@freefriends.org> From: Jim Meyering Date: Thu, 16 Jan 2020 20:05:02 -0800 Message-ID: Subject: Re: bug#39078: Path.pm change -> deltree.pl -> t/uninstall-fail failure To: Karl Berry Content-Type: text/plain; charset="UTF-8" X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 39078 Cc: 39078@debbugs.gnu.org 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.5 (/) On Sun, Jan 12, 2020 at 6:41 PM Karl Berry wrote: > > Regarding the new failure of Path.pm:rmtree to do removals, here is the > change I had in mind to use chmod and rm instead. The previously-"ERROR" > tests (uninstall-fail and instspc) work for me with this change. > > Before I bother spending time on all the related overhead changes, any > objections, improvements, comments on this approach? > > The rest of the patch is unrelated to the functional change: checking > for any of the elements existing after the purported removal. In my > testing I found it useful for this to be reported, and the abort to > occur, right away. > > Then, the recursive ls report on failure might be overkill, but I found > it useful to understand the failing situation, so here it is for > consideration. (I guess it would be better to prepend the prefix to > every line of the ls output, which would be easy enough.) --thanks, karl. Hi Karl, I like your patch. With our without prefixes. Thanks for working on this! From debbugs-submit-bounces@debbugs.gnu.org Sun Jan 19 21:22:05 2020 Received: (at 39078) by debbugs.gnu.org; 20 Jan 2020 02:22:05 +0000 Received: from localhost ([127.0.0.1]:44229 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1itMhY-0005JN-VX for submit@debbugs.gnu.org; Sun, 19 Jan 2020 21:22:05 -0500 Received: from freefriends.org ([96.88.95.60]:35682) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1itMhW-0005JC-CO; Sun, 19 Jan 2020 21:22:03 -0500 X-Envelope-From: karl@freefriends.org Received: from freefriends.org (freefriends.org [96.88.95.60]) by freefriends.org (8.14.7/8.14.7) with ESMTP id 00K2M1CS013593 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 19 Jan 2020 19:22:01 -0700 Received: (from apache@localhost) by freefriends.org (8.14.7/8.14.7/Submit) id 00K2M0QP013592; Sun, 19 Jan 2020 19:22:00 -0700 Date: Sun, 19 Jan 2020 19:22:00 -0700 Message-Id: <202001200222.00K2M0QP013592@freefriends.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="1X5RiOfRaB" Content-Transfer-Encoding: 7bit From: Karl Berry To: 39078@debbugs.gnu.org Subject: Re: bug#39078: Path.pm change -> deltree.pl -> t/uninstall-fail failure In-Reply-To: X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 39078 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 (---) --1X5RiOfRaB Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit Pushed attached patch, closing here. --1X5RiOfRaB Content-Type: application/octet-stream Content-Disposition: attachment; filename="rmrf.diff" Content-Transfer-Encoding: base64 RnJvbSA0MDQxNWIyMWMxYWIxYzQwMzZlMTUzZTRlNDNkOGEzNzMxMzRiMjI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBLYXJsIEJlcnJ5IDxrYXJsQGZyZWVmcmllbmRzLm9yZz4KRGF0 ZTogU2F0LCAxOCBKYW4gMjAyMCAxODowNjoyMyAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIHRlc3Rz OiB1c2UgZmluZCtybSwgbm90IHBlcmwsIHRvIHJlbW92ZSB0ZW1wb3JhcnkKIGRpcmVjdG9yaWVz LgoKVGhpcyBjaGFuZ2UgZml4ZXMgYXV0b21ha2UgYnVnIzM5MDc4OgpodHRwczovL2RlYmJ1Z3Mu Z251Lm9yZy8zOTA3OAoKKiB0L2F4L3Rlc3QtbGliLnNoIChybV9yZl8pOiBydW4gY2htb2QgLVIg dStyd3ggYW5kIHJtIC1yZiwKaW5zdGVhZCBvZiBjYWxsaW5nIG91ciB0L2F4L2RlbHRyZWUucGwg c2NyaXB0LiAgVGhpcyByZXZlcnNlcyB0aGUKY2hhbmdlIG9mIDIwMTMtMDUtMTYuICBJdCBtYWRl IHNlbnNlIHRvIHdyaXRlIGFuZCB1c2UgZGVsdHJlZQphdCB0aGF0IHBvaW50LCBidXQgdW5mb3J0 dW5hdGVseSBhcyBvZiBwZXJsLTUuMjguMAooRmlsZTo6UGF0aC5wbSB2ZXJzaW9uIDIuMTUpLCBy bXRyZWUgbm8gbG9uZ2VyIHJlbW92ZXMgYSB0cmVlIHdpdGgKdW5yZWFkYWJsZSBzdWJkaXJlY3Rv cmllcywgc3VjaCBhcyB3ZSAoaW50ZW50aW9uYWxseSkgaGF2ZS4gIFNvIHdlCm1pZ2h0IGFzIHdl bGwgZ28gYmFjayB0byBybSAtcmYuICBUaGUgdW5jb25kaXRpb25hbCByZWN1cnNpdmUgY2htb2QK aW5zdGVhZCBvZiB0aGUgcHJldmlvdXNseS11c2VkIG1vcmUgY29tcGxleCBmaW5kIGNvbW1hbmQg d2lsbApob3BlZnVsbHkgcHJvdmUgcG9ydGFibGUuICBTZWUgdGhlIGJ1ZyByZXBvcnQgZm9yIG1v cmUgZGV0YWlscy4KCk91ciBkZWx0cmVlLnBsIGlzIG5vdCB1c2VkIGZvciBhbnl0aGluZyBlbHNl LCBidXQgbmV2ZXJ0aGVsZXNzCmxlYXZpbmcgaXQgaW4gb3VyIHNvdXJjZSB0cmVlIGZvciBub3cs IGZvciBlYXNlIG9mIHJldmVyc2lvbgphbmQgY29tcGFyaXNvbi4KLS0tCiB0L2F4L3Rlc3QtbGli LnNoIHwgMjIgKysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDIxIGluc2Vy dGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS90L2F4L3Rlc3QtbGliLnNoIGIv dC9heC90ZXN0LWxpYi5zaAppbmRleCA1N2FmYzA3Li42OWU5OGZiIDEwMDY0NAotLS0gYS90L2F4 L3Rlc3QtbGliLnNoCisrKyBiL3QvYXgvdGVzdC1saWIuc2gKQEAgLTE5Nyw3ICsxOTcsMjcgQEAg c2VxXyAoKQogcm1fcmZfICgpCiB7CiAgIHRlc3QgJCMgLWd0IDAgfHwgcmV0dXJuIDAKLSAgJFBF UkwgIiRhbV90ZXN0YXV4X3NyY2RpciIvZGVsdHJlZS5wbCAiJEAiCisgIGNobW9kIC1SIHUrcnd4 ICIkQCIgfHwgOgorICBybSAtcmYgIiRAIiAjIGlmIGl0IGZhaWxzLCBvaywgd2UgZmFpbAorICBf YW1fcm1yZl9zdGF0dXM9JD8KKyAgIworICAjIEluIHRoZSBwYXN0LCB3ZSByYW4gdGhpcyBQZXJs IHNjcmlwdCBpbnN0ZWFkIG9mIHRoZSBhYm92ZQorICAjIGNobW9kICYmIHJtLiAgU2VlIHRoZSBD aGFuZ2VMb2cgZm9yIGRldGFpbHMuCisgICMkUEVSTCAiJGFtX3Rlc3RhdXhfc3JjZGlyIi9kZWx0 cmVlLnBsICIkQCIKKyAgIworICAjIExldCdzIGZhaWwgdXAgZnJvbnQgaWYgYW55dGhpbmcgcmVt YWlucyBhZnRlciB0aGUgc3VwcG9zZWQgcmVtb3ZhbC4KKyAgZm9yIF9hbV9ybXJmX3YKKyAgZG8K KyAgICBpZiB0ZXN0IC1lICIkX2FtX3JtcmZfdiI7IHRoZW4KKyAgICAgIGVjaG8gIiRtZSAodGVz dC1saWIuc2g6cm1fcmZfKTogdHJlZSBub3QgcmVtb3ZlZDogJF9hbV9ybXJmX3YiID4mMgorICAg ICAgZWNobyAiJG1lICh0ZXN0LWxpYi5zaDpybV9yZl8pOiBscyAtYWxSIGZvbGxvd3M6IiA+JjIK KyAgICAgIGxzIC1hbFIgJF9hbV9ybXJmX3YgPiYyICMgc2hvdWxkIGFsd2F5cyBiZSB0aGVyZQor ICAgICAgZWNobyAiJG1lICh0ZXN0LWxpYi5zaDpybV9yZl8pOiAiIFwKKyAgICAgICAgICAgImVu ZCBscyBvZiB0cmVlIG5vdCByZW1vdmVkICgkX2FtX3JtcmZfdikuIiA+JjIKKyAgICAgIF9hbV9y bXJmX3N0YXR1cz0yCisgICAgZmkKKyAgZG9uZQorICByZXR1cm4gJF9hbV9ybXJmX3N0YXR1cwog fQogCiBjb21tZW50ZWRfc2VkX3VuaW5kZW50X3Byb2c9JwotLSAKMS44LjMuMQoK --1X5RiOfRaB-- From unknown Thu Jun 19 14:03:22 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Mon, 17 Feb 2020 12:24:05 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator