From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.bugs Subject: bug#12632: file permissions checking mishandled when setuid Date: Sun, 14 Oct 2012 11:14:39 -0700 Organization: UCLA Computer Science Department Message-ID: <507B010F.20105@cs.ucla.edu> References: <5078CAB6.7020509@cs.ucla.edu> <83fw5i7s4p.fsf@gnu.org> <83a9vq7oqh.fsf@gnu.org> <507A58CC.10209@cs.ucla.edu> <83fw5h5yo6.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050908060507070408020208" X-Trace: ger.gmane.org 1350238576 12131 80.91.229.3 (14 Oct 2012 18:16:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 14 Oct 2012 18:16:16 +0000 (UTC) Cc: 12632@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Oct 14 20:16:22 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1TNSjb-0004dZ-E4 for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Oct 2012 20:16:19 +0200 Original-Received: from localhost ([::1]:45952 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNSjU-0001Nb-H7 for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Oct 2012 14:16:12 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:54998) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNSjM-0001NU-Ug for bug-gnu-emacs@gnu.org; Sun, 14 Oct 2012 14:16:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TNSjI-0004WW-4v for bug-gnu-emacs@gnu.org; Sun, 14 Oct 2012 14:16:04 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:33819) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNSjI-0004WQ-0H for bug-gnu-emacs@gnu.org; Sun, 14 Oct 2012 14:16:00 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1TNSkH-0003um-T9 for bug-gnu-emacs@gnu.org; Sun, 14 Oct 2012 14:17:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Paul Eggert Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Oct 2012 18:17:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 12632 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 12632-submit@debbugs.gnu.org id=B12632.135023856314971 (code B ref 12632); Sun, 14 Oct 2012 18:17:01 +0000 Original-Received: (at 12632) by debbugs.gnu.org; 14 Oct 2012 18:16:03 +0000 Original-Received: from localhost ([127.0.0.1]:44070 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNSjH-0003t0-FI for submit@debbugs.gnu.org; Sun, 14 Oct 2012 14:16:03 -0400 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:34498) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNSj9-0003si-Rw for 12632@debbugs.gnu.org; Sun, 14 Oct 2012 14:15:57 -0400 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id AF207A60002; Sun, 14 Oct 2012 11:14:43 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id c2rSlKn-i5Xx; Sun, 14 Oct 2012 11:14:39 -0700 (PDT) Original-Received: from [192.168.1.3] (pool-108-23-119-2.lsanca.fios.verizon.net [108.23.119.2]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 99C63A60001; Sun, 14 Oct 2012 11:14:39 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20121011 Thunderbird/16.0.1 In-Reply-To: <83fw5h5yo6.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:65601 Archived-At: This is a multi-part message in MIME format. --------------050908060507070408020208 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 10/13/2012 11:56 PM, Eli Zaretskii wrote: > This won't compile on Windows, since there's no 'euidaccess' (yet). Thanks, that should be easy enough to fix, so I gave it a whirl (patch below). > Emacs should be able to test whether a file exists even if it > will be unable to access it later. Emacs cannot do that. What 'access' does is ask, "If Emacs were to issue the seteuid system call, and change the effective user ID to the real user ID, would Emacs then be able to see that the file exists?" This does not test whether the file exists; it tests only whether Emacs could see that the file exists in a hypothetical situation that never actually happens (because Emacs never issues the seteuid system call). But this isn't what is wanted here: what is wanted is a test whether Emacs can currently see that the file exists, and that is what euidaccess does. > In any case, using 'euidaccess' here subtly changes the semantics of > file-exists-p Currently file-exists-p uses 'stat', and 'euidaccess' uses the same access check that 'stat' does -- they both use the effective uid. So the semantics aren't changing here. >> > 'dir' can't be nil there. > file-name-directory can return nil It's an absolute file name, so file-name-directory can't return nil. (This point is moot now, since the patch doesn't remove the unnecessary NILP check.) Here's the incremental patch to add euidaccess to Windows. I'm attaching the entire revised patch, relative to trunk bzr 110544. =3D=3D=3D modified file 'nt/ChangeLog' --- nt/ChangeLog 2012-10-08 14:14:22 +0000 +++ nt/ChangeLog 2012-10-14 18:06:01 +0000 @@ -1,3 +1,9 @@ +2012-10-14 Paul Eggert + + Use euidaccess, not access, when checking file permissions (Bug#12632). + * inc/ms-w32.h (euidaccess): Define this, not 'access', since + the mainline code now uses euidaccess. + 2012-10-08 Juanma Barranquero =20 * config.nt: Sync with autogen/config.in. =3D=3D=3D modified file 'nt/inc/ms-w32.h' --- nt/inc/ms-w32.h 2012-09-30 21:36:42 +0000 +++ nt/inc/ms-w32.h 2012-10-14 18:06:01 +0000 @@ -160,8 +160,6 @@ #endif =20 /* Calls that are emulated or shadowed. */ -#undef access -#define access sys_access #undef chdir #define chdir sys_chdir #undef chmod @@ -176,6 +174,7 @@ #define dup sys_dup #undef dup2 #define dup2 sys_dup2 +#define euidaccess sys_access #define fopen sys_fopen #define link sys_link #define localtime sys_localtime =3D=3D=3D modified file 'src/ChangeLog' --- src/ChangeLog 2012-10-14 06:02:52 +0000 +++ src/ChangeLog 2012-10-14 18:06:01 +0000 @@ -5,14 +5,13 @@ (LIBES): Use it. * callproc.c (init_callproc): * charset.c (init_charset): - * fileio.c (check_existing) [!DOS_NT]: - (check_executable) [!DOS_NT && !HAVE_EUIDACCESS]: + * fileio.c (check_existing, check_executable): * lread.c (openp, load_path_check): * process.c (allocate_pty): * xrdb.c (file_p): Use euidaccess, not access. Use symbolic names instead of integers for the flags, as they're portable now. - * fileio.c (Ffile_readable_p) [!DOS_NT && !macintosh]: + * fileio.c (Ffile_readable_p): Use euidaccess, not stat + open + close. (file_directory_p): New function, which uses 'stat' on most places but 'access' (for efficiency) if WINDOWSNT. @@ -21,6 +20,7 @@ * lread.c (openp): When opening a file, use fstat rather than stat, as that avoids a permissions race. When not opening a file, use file_directory_p rather than stat. + * msdos.c (init_environment, readlink): Use sys_access, not access. =20 2012-10-13 Jan Dj=C3=A4rv =20 =3D=3D=3D modified file 'src/fileio.c' --- src/fileio.c 2012-10-14 06:02:52 +0000 +++ src/fileio.c 2012-10-14 18:06:01 +0000 @@ -2424,16 +2424,7 @@ bool check_existing (const char *filename) { -#ifdef DOS_NT - /* The full emulation of Posix 'stat' is too expensive on - DOS/Windows, when all we want to know is whether the file exists. - So we use 'access' instead, which is much more lightweight. */ - /* FIXME: an euidaccess implementation should be added to the - DOS/Windows ports and this #ifdef branch should be removed. */ - return (access (filename, F_OK) >=3D 0); -#else return euidaccess (filename, F_OK) =3D=3D 0; -#endif } =20 /* Return true if file FILENAME exists and can be executed. */ @@ -2441,16 +2432,7 @@ static bool check_executable (char *filename) { -#ifdef DOS_NT - /* FIXME: an euidaccess implementation should be added to the - DOS/Windows ports and this #ifdef branch should be removed. */ - struct stat st; - if (stat (filename, &st) < 0) - return 0; - return ((st.st_mode & S_IEXEC) !=3D 0); -#else /* not DOS_NT */ return euidaccess (filename, X_OK) =3D=3D 0; -#endif /* not DOS_NT */ } =20 /* Return true if file FILENAME exists and can be written. */ @@ -2546,16 +2528,7 @@ return call2 (handler, Qfile_readable_p, absname); =20 absname =3D ENCODE_FILE (absname); - -#if defined (DOS_NT) || defined (macintosh) - /* FIXME: an euidaccess implementation should be added to the - DOS/Windows ports and this #ifdef branch should be removed. */ - if (access (SDATA (absname), 0) =3D=3D 0) - return Qt; - return Qnil; -#else /* not DOS_NT and not macintosh */ return euidaccess (SSDATA (absname), R_OK) =3D=3D 0 ? Qt : Qnil; -#endif /* not DOS_NT and not macintosh */ } =20 /* Having this before file-symlink-p mysteriously caused it to be forgot= ten @@ -2592,7 +2565,7 @@ /* The read-only attribute of the parent directory doesn't affect whether a file or directory can be created within it. Some day we should check ACLs though, which do affect this. */ - return (access (SDATA (dir), D_OK) < 0) ? Qnil : Qt; + return file_directory_p (SDATA (dir)) ? Qt : Qnil; #else return (check_writable (!NILP (dir) ? SSDATA (dir) : "") ? Qt : Qnil); @@ -2694,8 +2667,8 @@ file_directory_p (char const *file) { #ifdef WINDOWSNT - /* 'access' is cheaper than 'stat'. */ - return access (file, D_OK) =3D=3D 0; + /* This is cheaper than 'stat'. */ + return euidaccess (file, D_OK) =3D=3D 0; #else struct stat st; return stat (file, &st) =3D=3D 0 && S_ISDIR (st.st_mode); =3D=3D=3D modified file 'src/msdos.c' --- src/msdos.c 2012-09-23 08:44:20 +0000 +++ src/msdos.c 2012-10-14 18:06:01 +0000 @@ -3557,7 +3557,7 @@ read-only filesystem, like CD-ROM or a write-protected floppy. The only way to be really sure is to actually create a file and see if it succeeds. But I think that's too much to ask. */ - if (tmp && access (tmp, D_OK) =3D=3D 0) + if (tmp && sys_access (tmp, D_OK) =3D=3D 0) { setenv ("TMPDIR", tmp, 1); break; @@ -3935,7 +3935,7 @@ readlink (const char *name, char *dummy1, size_t dummy2) { /* `access' is much faster than `stat' on MS-DOS. */ - if (access (name, F_OK) =3D=3D 0) + if (sys_access (name, F_OK) =3D=3D 0) errno =3D EINVAL; return -1; } --------------050908060507070408020208 Content-Type: text/plain; charset=UTF-8; name="euidaccess.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="euidaccess.txt" PT09IG1vZGlmaWVkIGZpbGUgJ0NoYW5nZUxvZycKLS0tIENoYW5nZUxvZwkyMDEyLTEwLTEx IDExOjI5OjQ3ICswMDAwCisrKyBDaGFuZ2VMb2cJMjAxMi0xMC0xNCAwNjowMzo1MCArMDAw MApAQCAtMSwzICsxLDEyIEBACisyMDEyLTEwLTE0ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEBj cy51Y2xhLmVkdT4KKworCVVzZSBldWlkYWNjZXNzLCBub3QgYWNjZXNzLCB3aGVuIGNoZWNr aW5nIGZpbGUgcGVybWlzc2lvbnMgKEJ1ZyMxMjYzMikuCisJKiBjb25maWd1cmUuYWMgKGV1 aWRhY2Nlc3MpOiBSZW1vdmUgY2hlY2s7IGdudWxpYiBkb2VzIHRoaXMgZm9yIHVzIG5vdy4K KwkqIGxpYi9ldWlkYWNjZXNzLmMsIGxpYi9nZXRncm91cHMuYywgbGliL2dyb3VwLW1lbWJl ci5jOgorCSogbGliL3Jvb3QtdWlkLmgsIGxpYi94YWxsb2Mtb3ZlcnNpemVkLmgsIG00L2V1 aWRhY2Nlc3MubTQ6CisJKiBtNC9nZXRncm91cHMubTQsIG00L2dyb3VwLW1lbWJlci5tNDog TmV3IGZpbGVzLCBmcm9tIGdudWxpYi4KKwkqIGxpYi9nbnVsaWIubWssIG00L2dudWxpYi1j b21wLm00OiBSZWdlbmVyYXRlLgorCiAyMDEyLTEwLTExICBLZW5pY2hpIEhhbmRhICA8aGFu ZGFAZ251Lm9yZz4KIAogCSogLmJ6cmlnbm9yZTogQWRkIHNldmVyYWwgZmlsZXMgdW5kZXIg YWRtaW4vY2hhcnNldHMuCgo9PT0gbW9kaWZpZWQgZmlsZSAnYWRtaW4vQ2hhbmdlTG9nJwot LS0gYWRtaW4vQ2hhbmdlTG9nCTIwMTItMTAtMTQgMDg6MDE6MzAgKzAwMDAKKysrIGFkbWlu L0NoYW5nZUxvZwkyMDEyLTEwLTE0IDE4OjA4OjMwICswMDAwCkBAIC0xLDMgKzEsOSBAQAor MjAxMi0xMC0xNCAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAY3MudWNsYS5lZHU+CisKKwlVc2Ug ZXVpZGFjY2Vzcywgbm90IGFjY2Vzcywgd2hlbiBjaGVja2luZyBmaWxlIHBlcm1pc3Npb25z IChCdWcjMTI2MzIpLgorCSogbWVyZ2UtZ251bGliIChHTlVMSUJfTU9EVUxFUyk6IEFkZCBl dWlkYWNjZXNzLgorCShHTlVMSUJfVE9PTF9GTEFHUyk6IEF2b2lkIG1hbGxvYy1wb3NpeC4K KwogMjAxMi0xMC0xMiAgS2VuaWNoaSBIYW5kYSAgPGhhbmRhQGdudS5vcmc+CiAKIAkqIGNo YXJzZXRzL01ha2VmaWxlIChKSVNDNjIyNi5tYXApOiBBZGQgbWlzc2luZyBtYXBwaW5ncy4K Cj09PSBtb2RpZmllZCBmaWxlICdhZG1pbi9tZXJnZS1nbnVsaWInCi0tLSBhZG1pbi9tZXJn ZS1nbnVsaWIJMjAxMi0wOS0yNyAwMTowNjoyMyArMDAwMAorKysgYWRtaW4vbWVyZ2UtZ251 bGliCTIwMTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAgLTI4LDcgKzI4LDcgQEAKIEdOVUxJ Ql9NT0RVTEVTPScKICAgYWxsb2NhLW9wdCBjLWN0eXBlIGMtc3RyY2FzZQogICBjYXJlYWRs aW5rYXQgY3J5cHRvL21kNSBjcnlwdG8vc2hhMSBjcnlwdG8vc2hhMjU2IGNyeXB0by9zaGE1 MTIKLSAgZHRvYXN0ciBkdG90aW1lc3BlYyBkdXAyIGVudmlyb24gZXhlY2luZm8KKyAgZHRv YXN0ciBkdG90aW1lc3BlYyBkdXAyIGVudmlyb24gZXVpZGFjY2VzcyBleGVjaW5mbwogICBm aWxlbW9kZSBnZXRsb2FkYXZnIGdldG9wdC1nbnUgZ2V0dGltZSBnZXR0aW1lb2ZkYXkKICAg aWdub3JlLXZhbHVlIGludHByb3BzIGxhcmdlZmlsZSBsc3RhdAogICBtYW55d2FybmluZ3Mg bWt0aW1lIHBzZWxlY3QgcHRocmVhZF9zaWdtYXNrIHJlYWRsaW5rCkBAIC00MCw3ICs0MCw3 IEBACiAKIEdOVUxJQl9UT09MX0ZMQUdTPScKICAgLS1hdm9pZD1lcnJubyAtLWF2b2lkPWZj bnRsIC0tYXZvaWQ9ZmNudGwtaCAtLWF2b2lkPWZzdGF0Ci0gIC0tYXZvaWQ9bXN2Yy1pbnZh bCAtLWF2b2lkPW1zdmMtbm90aHJvdworICAtLWF2b2lkPW1hbGxvYy1wb3NpeCAtLWF2b2lk PW1zdmMtaW52YWwgLS1hdm9pZD1tc3ZjLW5vdGhyb3cKICAgLS1hdm9pZD1yYWlzZSAtLWF2 b2lkPXNlbGVjdCAtLWF2b2lkPXNpZ3Byb2NtYXNrIC0tYXZvaWQ9c3lzX3R5cGVzCiAgIC0t YXZvaWQ9dGhyZWFkbGliCiAgIC0tY29uZGl0aW9uYWwtZGVwZW5kZW5jaWVzIC0taW1wb3J0 IC0tbm8tY2hhbmdlbG9nIC0tbm8tdmMtZmlsZXMKCj09PSBtb2RpZmllZCBmaWxlICdjb25m aWd1cmUuYWMnCi0tLSBjb25maWd1cmUuYWMJMjAxMi0xMC0wOCAxNjowOTowMCArMDAwMAor KysgY29uZmlndXJlLmFjCTIwMTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAgLTI4NzIsNyAr Mjg3Miw3IEBACiBBQ19DSEVDS19GVU5DUyhnZXRob3N0bmFtZSBcCiBjbG9zZWRpciBnZXRy dXNhZ2UgZ2V0X2N1cnJlbnRfZGlyX25hbWUgXAogbHJhbmQ0OCBzZXRzaWQgXAotZnBhdGhj b25mIHNlbGVjdCBldWlkYWNjZXNzIGdldHBhZ2VzaXplIHNldGxvY2FsZSBcCitmcGF0aGNv bmYgc2VsZWN0IGdldHBhZ2VzaXplIHNldGxvY2FsZSBcCiB1dGltZXMgZ2V0cmxpbWl0IHNl dHJsaW1pdCBzZXRwZ2lkIGdldGN3ZCBzaHV0ZG93biBnZXRhZGRyaW5mbyBcCiBfX2ZwZW5k aW5nIHN0cnNpZ25hbCBzZXRpdGltZXIgXAogc2VuZHRvIHJlY3Zmcm9tIGdldHNvY2tuYW1l IGdldHBlZXJuYW1lIGdldGlmYWRkcnMgZnJlZWlmYWRkcnMgXAoKPT09IGFkZGVkIGZpbGUg J2xpYi9ldWlkYWNjZXNzLmMnCi0tLSBsaWIvZXVpZGFjY2Vzcy5jCTE5NzAtMDEtMDEgMDA6 MDA6MDAgKzAwMDAKKysrIGxpYi9ldWlkYWNjZXNzLmMJMjAxMi0xMC0xMiAyMzoyODozMSAr MDAwMApAQCAtMCwwICsxLDIyMSBAQAorLyogZXVpZGFjY2VzcyAtLSBjaGVjayBpZiBlZmZl Y3RpdmUgdXNlciBpZCBjYW4gYWNjZXNzIGZpbGUKKworICAgQ29weXJpZ2h0IChDKSAxOTkw LTE5OTEsIDE5OTUsIDE5OTgsIDIwMDAsIDIwMDMtMjAwNiwgMjAwOC0yMDEyIEZyZWUKKyAg IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg dGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g MyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRw Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFdyaXR0ZW4gYnkgRGF2aWQg TWFjS2VuemllIGFuZCBUb3Jiam9ybiBHcmFubHVuZC4KKyAgIEFkYXB0ZWQgZm9yIEdOVSBD IGxpYnJhcnkgYnkgUm9sYW5kIE1jR3JhdGguICAqLworCisjaWZuZGVmIF9MSUJDCisjIGlu Y2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1 ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5p c3RkLmg+CisKKyNpbmNsdWRlICJyb290LXVpZC5oIgorCisjaWYgSEFWRV9MSUJHRU5fSAor IyBpbmNsdWRlIDxsaWJnZW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNp Zm5kZWYgX19zZXRfZXJybm8KKyMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAo dmFsKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEVBQ0NFUyAmJiAhZGVmaW5lZCBFQUNDRVNT CisjIGRlZmluZSBFQUNDRVNTIEVBQ0NFUworI2VuZGlmCisKKyNpZm5kZWYgRl9PSworIyBk ZWZpbmUgRl9PSyAwCisjIGRlZmluZSBYX09LIDEKKyMgZGVmaW5lIFdfT0sgMgorIyBkZWZp bmUgUl9PSyA0CisjZW5kaWYKKworCisjaWZkZWYgX0xJQkMKKworIyBkZWZpbmUgYWNjZXNz IF9fYWNjZXNzCisjIGRlZmluZSBnZXR1aWQgX19nZXR1aWQKKyMgZGVmaW5lIGdldGdpZCBf X2dldGdpZAorIyBkZWZpbmUgZ2V0ZXVpZCBfX2dldGV1aWQKKyMgZGVmaW5lIGdldGVnaWQg X19nZXRlZ2lkCisjIGRlZmluZSBncm91cF9tZW1iZXIgX19ncm91cF9tZW1iZXIKKyMgZGVm aW5lIGV1aWRhY2Nlc3MgX19ldWlkYWNjZXNzCisjIHVuZGVmIHN0YXQKKyMgZGVmaW5lIHN0 YXQgc3RhdDY0CisKKyNlbmRpZgorCisvKiBSZXR1cm4gMCBpZiB0aGUgdXNlciBoYXMgcGVy bWlzc2lvbiBvZiB0eXBlIE1PREUgb24gRklMRTsKKyAgIG90aGVyd2lzZSwgcmV0dXJuIC0x IGFuZCBzZXQgJ2Vycm5vJy4KKyAgIExpa2UgYWNjZXNzLCBleGNlcHQgdGhhdCBpdCB1c2Vz IHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgZ3JvdXAKKyAgIGlkJ3MgaW5zdGVhZCBvZiB0aGUg cmVhbCBvbmVzLCBhbmQgaXQgZG9lcyBub3QgYWx3YXlzIGNoZWNrIGZvciByZWFkLW9ubHkK KyAgIGZpbGUgc3lzdGVtLCB0ZXh0IGJ1c3ksIGV0Yy4gICovCisKK2ludAorZXVpZGFjY2Vz cyAoY29uc3QgY2hhciAqZmlsZSwgaW50IG1vZGUpCit7CisjaWYgSEFWRV9GQUNDRVNTQVQg ICAgICAgICAgICAgICAgICAgLyogZ2xpYmMsIEFJWCA3LCBTb2xhcmlzIDExLCBDeWd3aW4g MS43ICovCisgIHJldHVybiBmYWNjZXNzYXQgKEFUX0ZEQ1dELCBmaWxlLCBtb2RlLCBBVF9F QUNDRVNTKTsKKyNlbGlmIGRlZmluZWQgRUZGX09OTFlfT0sgICAgICAgICAgICAgICAvKiBJ UklYLCBPU0YvMSwgSW50ZXJpeCAqLworICByZXR1cm4gYWNjZXNzIChmaWxlLCBtb2RlIHwg RUZGX09OTFlfT0spOworI2VsaWYgZGVmaW5lZCBBQ0NfU0VMRiAgICAgICAgICAgICAgICAg IC8qIEFJWCAqLworICByZXR1cm4gYWNjZXNzeCAoZmlsZSwgbW9kZSwgQUNDX1NFTEYpOwor I2VsaWYgSEFWRV9FQUNDRVNTICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWVCU0QgKi8K KyAgcmV0dXJuIGVhY2Nlc3MgKGZpbGUsIG1vZGUpOworI2Vsc2UgICAgICAgLyogTWFjIE9T IFgsIE5ldEJTRCwgT3BlbkJTRCwgSFAtVVgsIFNvbGFyaXMsIEN5Z3dpbiwgbWluZ3csIEJl T1MgKi8KKworICB1aWRfdCB1aWQgPSBnZXR1aWQgKCk7CisgIGdpZF90IGdpZCA9IGdldGdp ZCAoKTsKKyAgdWlkX3QgZXVpZCA9IGdldGV1aWQgKCk7CisgIGdpZF90IGVnaWQgPSBnZXRl Z2lkICgpOworICBzdHJ1Y3Qgc3RhdCBzdGF0czsKKworIyBpZiBIQVZFX0RFQ0xfU0VUUkVH SUQgJiYgUFJFRkVSX05PTlJFRU5UUkFOVF9FVUlEQUNDRVNTCisKKyAgLyogRGVmaW5lIFBS RUZFUl9OT05SRUVOVFJBTlRfRVVJREFDQ0VTUyBpZiB5b3UgcHJlZmVyIGV1aWRhY2Nlc3Mg dG8KKyAgICAgcmV0dXJuIHRoZSBjb3JyZWN0IHJlc3VsdCBldmVuIGlmIHRoaXMgd291bGQg bWFrZSBpdAorICAgICBub25yZWVudHJhbnQuICBEZWZpbmUgdGhpcyBvbmx5IGlmIHlvdXIg ZW50aXJlIGFwcGxpY2F0aW9uIGlzCisgICAgIHNhZmUgZXZlbiBpZiB0aGUgdWlkIG9yIGdp ZCBtaWdodCB0ZW1wb3JhcmlseSBjaGFuZ2UuICBJZiB5b3VyCisgICAgIGFwcGxpY2F0aW9u IHVzZXMgc2lnbmFsIGhhbmRsZXJzIG9yIHRocmVhZHMgaXQgaXMgcHJvYmFibHkgbm90Cisg ICAgIHNhZmUuICAqLworCisgIGlmIChtb2RlID09IEZfT0spCisgICAgcmV0dXJuIHN0YXQg KGZpbGUsICZzdGF0cyk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgcmVzdWx0OworICAg ICAgaW50IHNhdmVkX2Vycm5vOworCisgICAgICBpZiAodWlkICE9IGV1aWQpCisgICAgICAg IHNldHJldWlkIChldWlkLCB1aWQpOworICAgICAgaWYgKGdpZCAhPSBlZ2lkKQorICAgICAg ICBzZXRyZWdpZCAoZWdpZCwgZ2lkKTsKKworICAgICAgcmVzdWx0ID0gYWNjZXNzIChmaWxl LCBtb2RlKTsKKyAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisKKyAgICAgIC8qIFJlc3Rv cmUgdGhlbS4gICovCisgICAgICBpZiAodWlkICE9IGV1aWQpCisgICAgICAgIHNldHJldWlk ICh1aWQsIGV1aWQpOworICAgICAgaWYgKGdpZCAhPSBlZ2lkKQorICAgICAgICBzZXRyZWdp ZCAoZ2lkLCBlZ2lkKTsKKworICAgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgICAgIHJl dHVybiByZXN1bHQ7CisgICAgfQorCisjIGVsc2UKKworICAvKiBUaGUgZm9sbG93aW5nIGNv ZGUgYXNzdW1lcyB0aGUgdHJhZGl0aW9uYWwgVW5peCBtb2RlbCwgYW5kIGlzIG5vdAorICAg ICBjb3JyZWN0IG9uIHN5c3RlbXMgdGhhdCBoYXZlIEFDTHMgb3IgdGhlIGxpa2UuICBIb3dl dmVyLCBpdCdzCisgICAgIGJldHRlciB0aGFuIG5vdGhpbmcsIGFuZCBpdCBpcyByZWVudHJh bnQuICAqLworCisgIHVuc2lnbmVkIGludCBncmFudGVkOworICBpZiAodWlkID09IGV1aWQg JiYgZ2lkID09IGVnaWQpCisgICAgLyogSWYgd2UgYXJlIG5vdCBzZXQtdWlkIG9yIHNldC1n aWQsIGFjY2VzcyBkb2VzIHRoZSBzYW1lLiAgKi8KKyAgICByZXR1cm4gYWNjZXNzIChmaWxl LCBtb2RlKTsKKworICBpZiAoc3RhdCAoZmlsZSwgJnN0YXRzKSAhPSAwKQorICAgIHJldHVy biAtMTsKKworICAvKiBUaGUgc3VwZXItdXNlciBjYW4gcmVhZCBhbmQgd3JpdGUgYW55IGZp bGUsIGFuZCBleGVjdXRlIGFueSBmaWxlCisgICAgIHRoYXQgYW55b25lIGNhbiBleGVjdXRl LiAgKi8KKyAgaWYgKGV1aWQgPT0gUk9PVF9VSUQKKyAgICAgICYmICgobW9kZSAmIFhfT0sp ID09IDAKKyAgICAgICAgICB8fCAoc3RhdHMuc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdS UCB8IFNfSVhPVEgpKSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ29udmVydCB0aGUgbW9k ZSB0byB0cmFkaXRpb25hbCBmb3JtLCBjbGVhcmluZyBhbnkgYm9ndXMgYml0cy4gICovCisg IGlmIChSX09LID09IDQgJiYgV19PSyA9PSAyICYmIFhfT0sgPT0gMSAmJiBGX09LID09IDAp CisgICAgbW9kZSAmPSA3OworICBlbHNlCisgICAgbW9kZSA9ICgobW9kZSAmIFJfT0sgPyA0 IDogMCkKKyAgICAgICAgICAgICsgKG1vZGUgJiBXX09LID8gMiA6IDApCisgICAgICAgICAg ICArIChtb2RlICYgWF9PSyA/IDEgOiAwKSk7CisKKyAgaWYgKG1vZGUgPT0gMCkKKyAgICBy ZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpbGUgZXhpc3RzLiAgKi8KKwor ICAvKiBDb252ZXJ0IHRoZSBmaWxlJ3MgcGVybWlzc2lvbiBiaXRzIHRvIHRyYWRpdGlvbmFs IGZvcm0uICAqLworICBpZiAoU19JUlVTUiA9PSAoNCA8PCA2KSAmJiBTX0lXVVNSID09ICgy IDw8IDYpICYmIFNfSVhVU1IgPT0gKDEgPDwgNikKKyAgICAgICYmIFNfSVJHUlAgPT0gKDQg PDwgMykgJiYgU19JV0dSUCA9PSAoMiA8PCAzKSAmJiBTX0lYR1JQID09ICgxIDw8IDMpCisg ICAgICAmJiBTX0lST1RIID09ICg0IDw8IDApICYmIFNfSVdPVEggPT0gKDIgPDwgMCkgJiYg U19JWE9USCA9PSAoMSA8PCAwKSkKKyAgICBncmFudGVkID0gc3RhdHMuc3RfbW9kZTsKKyAg ZWxzZQorICAgIGdyYW50ZWQgPSAoKHN0YXRzLnN0X21vZGUgJiBTX0lSVVNSID8gNCA8PCA2 IDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUgJiBTX0lXVVNSID8gMiA8 PCA2IDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUgJiBTX0lYVVNSID8g MSA8PCA2IDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUgJiBTX0lSR1JQ ID8gNCA8PCAzIDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUgJiBTX0lX R1JQID8gMiA8PCAzIDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUgJiBT X0lYR1JQID8gMSA8PCAzIDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21vZGUg JiBTX0lST1RIID8gNCA8PCAwIDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0X21v ZGUgJiBTX0lXT1RIID8gMiA8PCAwIDogMCkKKyAgICAgICAgICAgICAgICsgKHN0YXRzLnN0 X21vZGUgJiBTX0lYT1RIID8gMSA8PCAwIDogMCkpOworCisgIGlmIChldWlkID09IHN0YXRz LnN0X3VpZCkKKyAgICBncmFudGVkID4+PSA2OworICBlbHNlIGlmIChlZ2lkID09IHN0YXRz LnN0X2dpZCB8fCBncm91cF9tZW1iZXIgKHN0YXRzLnN0X2dpZCkpCisgICAgZ3JhbnRlZCA+ Pj0gMzsKKworICBpZiAoKG1vZGUgJiB+Z3JhbnRlZCkgPT0gMCkKKyAgICByZXR1cm4gMDsK KyAgX19zZXRfZXJybm8gKEVBQ0NFU1MpOworICByZXR1cm4gLTE7CisKKyMgZW5kaWYKKyNl bmRpZgorfQorI3VuZGVmIGV1aWRhY2Nlc3MKKyNpZmRlZiB3ZWFrX2FsaWFzCit3ZWFrX2Fs aWFzIChfX2V1aWRhY2Nlc3MsIGV1aWRhY2Nlc3MpCisjZW5kaWYKKwwKKyNpZmRlZiBURVNU CisjIGluY2x1ZGUgPGVycm9yLmg+CisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjIGluY2x1ZGUg PHN0ZGxpYi5oPgorCitjaGFyICpwcm9ncmFtX25hbWU7CisKK2ludAorbWFpbiAoaW50IGFy Z2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICpmaWxlOworICBpbnQgbW9kZTsKKyAgaW50 IGVycjsKKworICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworICBpZiAoYXJnYyA8IDMpCisg ICAgYWJvcnQgKCk7CisgIGZpbGUgPSBhcmd2WzFdOworICBtb2RlID0gYXRvaSAoYXJndlsy XSk7CisKKyAgZXJyID0gZXVpZGFjY2VzcyAoZmlsZSwgbW9kZSk7CisgIHByaW50ZiAoIiVk XG4iLCBlcnIpOworICBpZiAoZXJyICE9IDApCisgICAgZXJyb3IgKDAsIGVycm5vLCAiJXMi LCBmaWxlKTsKKyAgZXhpdCAoMCk7Cit9CisjZW5kaWYKCj09PSBhZGRlZCBmaWxlICdsaWIv Z2V0Z3JvdXBzLmMnCi0tLSBsaWIvZ2V0Z3JvdXBzLmMJMTk3MC0wMS0wMSAwMDowMDowMCAr MDAwMAorKysgbGliL2dldGdyb3Vwcy5jCTIwMTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAg LTAsMCArMSwxMTYgQEAKKy8qIHByb3ZpZGUgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gZ2V0 Z3JvdXBzIGZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgYWxsb3cgTj09MAorCisgICBDb3B5cmln aHQgKEMpIDE5OTYsIDE5OTksIDIwMDMsIDIwMDYtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cisg ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K KworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK KyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogd3JpdHRlbiBieSBKaW0gTWV5ZXJpbmcg Ki8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNp bmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlu dC5oPgorCisjaWYgIUhBVkVfR0VUR1JPVVBTCisKKy8qIFByb3ZpZGUgYSBzdHViIHRoYXQg ZmFpbHMgd2l0aCBFTk9TWVMsIHNpbmNlIHRoZXJlIGlzIG5vIGdyb3VwCisgICBpbmZvcm1h dGlvbiBhdmFpbGFibGUgb24gbWluZ3cuICAqLworaW50CitnZXRncm91cHMgKGludCBuIF9H TF9VTlVTRUQsIEdFVEdST1VQU19UICpncm91cHMgX0dMX1VOVVNFRCkKK3sKKyAgZXJybm8g PSBFTk9TWVM7CisgIHJldHVybiAtMTsKK30KKworI2Vsc2UgLyogSEFWRV9HRVRHUk9VUFMg Ki8KKworIyB1bmRlZiBnZXRncm91cHMKKyMgaWZuZGVmIEdFVEdST1VQU19aRVJPX0JVRwor IyAgZGVmaW5lIEdFVEdST1VQU19aRVJPX0JVRyAwCisjIGVuZGlmCisKKy8qIE9uIGF0IGxl YXN0IFVsdHJpeCA0LjMgYW5kIE5leHRTdGVwIDMuMiwgZ2V0Z3JvdXBzICgwLCBOVUxMKSBh bHdheXMKKyAgIGZhaWxzLiAgT24gb3RoZXIgc3lzdGVtcywgaXQgcmV0dXJucyB0aGUgbnVt YmVyIG9mIHN1cHBsZW1lbnRhbAorICAgZ3JvdXBzIGZvciB0aGUgcHJvY2Vzcy4gIFRoaXMg ZnVuY3Rpb24gaGFuZGxlcyB0aGF0IHNwZWNpYWwgY2FzZQorICAgYW5kIGxldHMgdGhlIHN5 c3RlbS1wcm92aWRlZCBmdW5jdGlvbiBoYW5kbGUgYWxsIG90aGVycy4gIEhvd2V2ZXIsCisg ICBpdCBjYW4gZmFpbCB3aXRoIEVOT01FTSBpZiBtZW1vcnkgaXMgdGlnaHQuICBJdCBpcyB1 bnNwZWNpZmllZAorICAgd2hldGhlciB0aGUgZWZmZWN0aXZlIGdyb3VwIGlkIGlzIGluY2x1 ZGVkIGluIHRoZSBsaXN0LiAgKi8KKworaW50CitycGxfZ2V0Z3JvdXBzIChpbnQgbiwgZ2lk X3QgKmdyb3VwKQoreworICBpbnQgbl9ncm91cHM7CisgIEdFVEdST1VQU19UICpnYnVmOwor ICBpbnQgc2F2ZWRfZXJybm87CisKKyAgaWYgKG4gPCAwKQorICAgIHsKKyAgICAgIGVycm5v ID0gRUlOVkFMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobiAhPSAwIHx8 ICFHRVRHUk9VUFNfWkVST19CVUcpCisgICAgeworICAgICAgaW50IHJlc3VsdDsKKyAgICAg IGlmIChzaXplb2YgKmdyb3VwID09IHNpemVvZiAqZ2J1ZikKKyAgICAgICAgcmV0dXJuIGdl dGdyb3VwcyAobiwgKEdFVEdST1VQU19UICopIGdyb3VwKTsKKworICAgICAgaWYgKFNJWkVf TUFYIC8gc2l6ZW9mICpnYnVmIDw9IG4pCisgICAgICAgIHsKKyAgICAgICAgICBlcnJubyA9 IEVOT01FTTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIGdidWYg PSBtYWxsb2MgKG4gKiBzaXplb2YgKmdidWYpOworICAgICAgaWYgKCFnYnVmKQorICAgICAg ICByZXR1cm4gLTE7CisgICAgICByZXN1bHQgPSBnZXRncm91cHMgKG4sIGdidWYpOworICAg ICAgaWYgKDAgPD0gcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgbiA9IHJlc3VsdDsK KyAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgZ3JvdXBbbl0gPSBnYnVmW25d OworICAgICAgICB9CisgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgZnJlZSAo Z2J1Zik7CisgICAgICBlcnJubyA9PSBzYXZlZF9lcnJubzsKKyAgICAgIHJldHVybiByZXN1 bHQ7CisgICAgfQorCisgIG4gPSAyMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyog Tm8gbmVlZCB0byB3b3JyeSBhYm91dCBhZGRyZXNzIGFyaXRobWV0aWMgb3ZlcmZsb3cgaGVy ZSwKKyAgICAgICAgIHNpbmNlIHRoZSBhbmNpZW50IHN5c3RlbXMgdGhhdCB3ZSdyZSBydW5u aW5nIG9uIGhhdmUgbG93CisgICAgICAgICBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBzZWNv bmRhcnkgZ3JvdXBzLiAgKi8KKyAgICAgIGdidWYgPSBtYWxsb2MgKG4gKiBzaXplb2YgKmdi dWYpOworICAgICAgaWYgKCFnYnVmKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBuX2dy b3VwcyA9IGdldGdyb3VwcyAobiwgZ2J1Zik7CisgICAgICBpZiAobl9ncm91cHMgPT0gLTEg PyBlcnJubyAhPSBFSU5WQUwgOiBuX2dyb3VwcyA8IG4pCisgICAgICAgIGJyZWFrOworICAg ICAgZnJlZSAoZ2J1Zik7CisgICAgICBuICo9IDI7CisgICAgfQorCisgIHNhdmVkX2Vycm5v ID0gZXJybm87CisgIGZyZWUgKGdidWYpOworICBlcnJubyA9IHNhdmVkX2Vycm5vOworCisg IHJldHVybiBuX2dyb3VwczsKK30KKworI2VuZGlmIC8qIEhBVkVfR0VUR1JPVVBTICovCgo9 PT0gbW9kaWZpZWQgZmlsZSAnbGliL2dudWxpYi5taycKLS0tIGxpYi9nbnVsaWIubWsJMjAx Mi0xMC0wNCAwNzoxNTo0MiArMDAwMAorKysgbGliL2dudWxpYi5tawkyMDEyLTEwLTEyIDIz OjI4OjMxICswMDAwCkBAIC0yMSw3ICsyMSw3IEBACiAjIHRoZSBzYW1lIGRpc3RyaWJ1dGlv biB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCiAjCiAjIEdlbmVyYXRlZCBi eSBnbnVsaWItdG9vbC4KLSMgUmVwcm9kdWNlIGJ5OiBnbnVsaWItdG9vbCAtLWltcG9ydCAt LWRpcj0uIC0tbGliPWxpYmdudSAtLXNvdXJjZS1iYXNlPWxpYiAtLW00LWJhc2U9bTQgLS1k b2MtYmFzZT1kb2MgLS10ZXN0cy1iYXNlPXRlc3RzIC0tYXV4LWRpcj1idWlsZC1hdXggLS1h dm9pZD1lcnJubyAtLWF2b2lkPWZjbnRsIC0tYXZvaWQ9ZmNudGwtaCAtLWF2b2lkPWZzdGF0 IC0tYXZvaWQ9bXN2Yy1pbnZhbCAtLWF2b2lkPW1zdmMtbm90aHJvdyAtLWF2b2lkPXJhaXNl IC0tYXZvaWQ9c2VsZWN0IC0tYXZvaWQ9c2lncHJvY21hc2sgLS1hdm9pZD1zeXNfdHlwZXMg LS1hdm9pZD10aHJlYWRsaWIgLS1tYWtlZmlsZS1uYW1lPWdudWxpYi5tayAtLWNvbmRpdGlv bmFsLWRlcGVuZGVuY2llcyAtLW5vLWxpYnRvb2wgLS1tYWNyby1wcmVmaXg9Z2wgLS1uby12 Yy1maWxlcyBhbGxvY2Etb3B0IGMtY3R5cGUgYy1zdHJjYXNlIGNhcmVhZGxpbmthdCBjcnlw dG8vbWQ1IGNyeXB0by9zaGExIGNyeXB0by9zaGEyNTYgY3J5cHRvL3NoYTUxMiBkdG9hc3Ry IGR0b3RpbWVzcGVjIGR1cDIgZW52aXJvbiBleGVjaW5mbyBmaWxlbW9kZSBnZXRsb2FkYXZn IGdldG9wdC1nbnUgZ2V0dGltZSBnZXR0aW1lb2ZkYXkgaWdub3JlLXZhbHVlIGludHByb3Bz IGxhcmdlZmlsZSBsc3RhdCBtYW55d2FybmluZ3MgbWt0aW1lIHBzZWxlY3QgcHRocmVhZF9z aWdtYXNrIHJlYWRsaW5rIHNvY2tsZW4gc3RhdC10aW1lIHN0ZGFsaWduIHN0ZGFyZyBzdGRi b29sIHN0ZGlvIHN0cmZ0aW1lIHN0cnRvaW1heCBzdHJ0b3VtYXggc3ltbGluayBzeXNfc3Rh dCBzeXNfdGltZSB0aW1lIHRpbWVyLXRpbWUgdGltZXNwZWMtYWRkIHRpbWVzcGVjLXN1YiB1 dGltZW5zIHdhcm5pbmdzCisjIFJlcHJvZHVjZSBieTogZ251bGliLXRvb2wgLS1pbXBvcnQg LS1kaXI9LiAtLWxpYj1saWJnbnUgLS1zb3VyY2UtYmFzZT1saWIgLS1tNC1iYXNlPW00IC0t ZG9jLWJhc2U9ZG9jIC0tdGVzdHMtYmFzZT10ZXN0cyAtLWF1eC1kaXI9YnVpbGQtYXV4IC0t YXZvaWQ9ZXJybm8gLS1hdm9pZD1mY250bCAtLWF2b2lkPWZjbnRsLWggLS1hdm9pZD1mc3Rh dCAtLWF2b2lkPW1hbGxvYy1wb3NpeCAtLWF2b2lkPW1zdmMtaW52YWwgLS1hdm9pZD1tc3Zj LW5vdGhyb3cgLS1hdm9pZD1yYWlzZSAtLWF2b2lkPXNlbGVjdCAtLWF2b2lkPXNpZ3Byb2Nt YXNrIC0tYXZvaWQ9c3lzX3R5cGVzIC0tYXZvaWQ9dGhyZWFkbGliIC0tbWFrZWZpbGUtbmFt ZT1nbnVsaWIubWsgLS1jb25kaXRpb25hbC1kZXBlbmRlbmNpZXMgLS1uby1saWJ0b29sIC0t bWFjcm8tcHJlZml4PWdsIC0tbm8tdmMtZmlsZXMgYWxsb2NhLW9wdCBjLWN0eXBlIGMtc3Ry Y2FzZSBjYXJlYWRsaW5rYXQgY3J5cHRvL21kNSBjcnlwdG8vc2hhMSBjcnlwdG8vc2hhMjU2 IGNyeXB0by9zaGE1MTIgZHRvYXN0ciBkdG90aW1lc3BlYyBkdXAyIGVudmlyb24gZXVpZGFj Y2VzcyBleGVjaW5mbyBmaWxlbW9kZSBnZXRsb2FkYXZnIGdldG9wdC1nbnUgZ2V0dGltZSBn ZXR0aW1lb2ZkYXkgaWdub3JlLXZhbHVlIGludHByb3BzIGxhcmdlZmlsZSBsc3RhdCBtYW55 d2FybmluZ3MgbWt0aW1lIHBzZWxlY3QgcHRocmVhZF9zaWdtYXNrIHJlYWRsaW5rIHNvY2ts ZW4gc3RhdC10aW1lIHN0ZGFsaWduIHN0ZGFyZyBzdGRib29sIHN0ZGlvIHN0cmZ0aW1lIHN0 cnRvaW1heCBzdHJ0b3VtYXggc3ltbGluayBzeXNfc3RhdCBzeXNfdGltZSB0aW1lIHRpbWVy LXRpbWUgdGltZXNwZWMtYWRkIHRpbWVzcGVjLXN1YiB1dGltZW5zIHdhcm5pbmdzCiAKIAog TU9TVExZQ0xFQU5GSUxFUyArPSBjb3JlICouc3RhY2tkdW1wCkBAIC0xNTAsNiArMTUwLDE1 IEBACiAKICMjIGVuZCAgIGdudWxpYiBtb2R1bGUgZHVwMgogCisjIyBiZWdpbiBnbnVsaWIg bW9kdWxlIGV1aWRhY2Nlc3MKKworCitFWFRSQV9ESVNUICs9IGV1aWRhY2Nlc3MuYworCitF WFRSQV9saWJnbnVfYV9TT1VSQ0VTICs9IGV1aWRhY2Nlc3MuYworCisjIyBlbmQgICBnbnVs aWIgbW9kdWxlIGV1aWRhY2Nlc3MKKwogIyMgYmVnaW4gZ251bGliIG1vZHVsZSBleGVjaW5m bwogCiBCVUlMVF9TT1VSQ0VTICs9ICQoRVhFQ0lORk9fSCkKQEAgLTE4Myw2ICsxOTIsMTcg QEAKIAogIyMgZW5kICAgZ251bGliIG1vZHVsZSBmaWxlbW9kZQogCisjIyBiZWdpbiBnbnVs aWIgbW9kdWxlIGdldGdyb3VwcworCitpZiBnbF9HTlVMSUJfRU5BQkxFRF9nZXRncm91cHMK KworZW5kaWYKK0VYVFJBX0RJU1QgKz0gZ2V0Z3JvdXBzLmMKKworRVhUUkFfbGliZ251X2Ff U09VUkNFUyArPSBnZXRncm91cHMuYworCisjIyBlbmQgICBnbnVsaWIgbW9kdWxlIGdldGdy b3VwcworCiAjIyBiZWdpbiBnbnVsaWIgbW9kdWxlIGdldGxvYWRhdmcKIAogCkBAIC0yNDIs NiArMjYyLDE3IEBACiAKICMjIGVuZCAgIGdudWxpYiBtb2R1bGUgZ2V0dGltZW9mZGF5CiAK KyMjIGJlZ2luIGdudWxpYiBtb2R1bGUgZ3JvdXAtbWVtYmVyCisKK2lmIGdsX0dOVUxJQl9F TkFCTEVEX2E5Nzg2ODUwZTk5OWFlNjVhODM2YTYwNDFlOGU1ZWQxCisKK2VuZGlmCitFWFRS QV9ESVNUICs9IGdyb3VwLW1lbWJlci5jCisKK0VYVFJBX2xpYmdudV9hX1NPVVJDRVMgKz0g Z3JvdXAtbWVtYmVyLmMKKworIyMgZW5kICAgZ251bGliIG1vZHVsZSBncm91cC1tZW1iZXIK KwogIyMgYmVnaW4gZ251bGliIG1vZHVsZSBpZ25vcmUtdmFsdWUKIAogCkBAIC0zNTQsNiAr Mzg1LDEzIEBACiAKICMjIGVuZCAgIGdudWxpYiBtb2R1bGUgcmVhZGxpbmsKIAorIyMgYmVn aW4gZ251bGliIG1vZHVsZSByb290LXVpZAorCisKK0VYVFJBX0RJU1QgKz0gcm9vdC11aWQu aAorCisjIyBlbmQgICBnbnVsaWIgbW9kdWxlIHJvb3QtdWlkCisKICMjIGJlZ2luIGdudWxp YiBtb2R1bGUgc2lnbmFsLWgKIAogQlVJTFRfU09VUkNFUyArPSBzaWduYWwuaApAQCAtMTMx Miw2ICsxMzUwLDE1IEBACiAKICMjIGVuZCAgIGdudWxpYiBtb2R1bGUgdmVyaWZ5CiAKKyMj IGJlZ2luIGdudWxpYiBtb2R1bGUgeGFsbG9jLW92ZXJzaXplZAorCitpZiBnbF9HTlVMSUJf RU5BQkxFRF82ODJlNjA5NjA0Y2NhYWM2YmUzODJlNGVlM2E0ZWFlYworCitlbmRpZgorRVhU UkFfRElTVCArPSB4YWxsb2Mtb3ZlcnNpemVkLmgKKworIyMgZW5kICAgZ251bGliIG1vZHVs ZSB4YWxsb2Mtb3ZlcnNpemVkCisKIAogbW9zdGx5Y2xlYW4tbG9jYWw6IG1vc3RseWNsZWFu LWdlbmVyaWMKIAlAZm9yIGRpciBpbiAnJyAkKE1PU1RMWUNMRUFORElSUyk7IGRvIFwKCj09 PSBhZGRlZCBmaWxlICdsaWIvZ3JvdXAtbWVtYmVyLmMnCi0tLSBsaWIvZ3JvdXAtbWVtYmVy LmMJMTk3MC0wMS0wMSAwMDowMDowMCArMDAwMAorKysgbGliL2dyb3VwLW1lbWJlci5jCTIw MTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAgLTAsMCArMSwxMTkgQEAKKy8qIGdyb3VwLW1l bWJlci5jIC0tIGRldGVybWluZSB3aGV0aGVyIGdyb3VwIGlkIGlzIGluIGNhbGxpbmcgdXNl cidzIGdyb3VwIGxpc3QKKworICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk3LTE5OTgsIDIw MDMsIDIwMDUtMjAwNiwgMjAwOS0yMDEyIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24s IEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNl bnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAg VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+LiAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvKiBTcGVjaWZp Y2F0aW9uLiAgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+ CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNs dWRlICJ4YWxsb2Mtb3ZlcnNpemVkLmgiCisKKy8qIE1vc3QgcHJvY2Vzc2VzIGhhdmUgbm8g bW9yZSB0aGFuIHRoaXMgbWFueSBncm91cHMsIGFuZCBmb3IgdGhlc2UKKyAgIHByb2Nlc3Nl cyB3ZSBjYW4gYXZvaWQgdXNpbmcgbWFsbG9jLiAgKi8KK2VudW0geyBHUk9VUEJVRl9TSVpF ID0gMTAwIH07CisKK3N0cnVjdCBncm91cF9pbmZvCisgIHsKKyAgICBnaWRfdCAqZ3JvdXA7 CisgICAgZ2lkX3QgZ3JvdXBidWZbR1JPVVBCVUZfU0laRV07CisgIH07CisKK3N0YXRpYyB2 b2lkCitmcmVlX2dyb3VwX2luZm8gKHN0cnVjdCBncm91cF9pbmZvIGNvbnN0ICpnKQorewor ICBpZiAoZy0+Z3JvdXAgIT0gZy0+Z3JvdXBidWYpCisgICAgZnJlZSAoZy0+Z3JvdXApOwor fQorCitzdGF0aWMgaW50CitnZXRfZ3JvdXBfaW5mbyAoc3RydWN0IGdyb3VwX2luZm8gKmdp KQoreworICBpbnQgbl9ncm91cHMgPSBnZXRncm91cHMgKEdST1VQQlVGX1NJWkUsIGdpLT5n cm91cGJ1Zik7CisgIGdpLT5ncm91cCA9IGdpLT5ncm91cGJ1ZjsKKworICBpZiAobl9ncm91 cHMgPCAwKQorICAgIHsKKyAgICAgIGludCBuX2dyb3VwX3Nsb3RzID0gZ2V0Z3JvdXBzICgw LCBOVUxMKTsKKyAgICAgIGlmICgwIDw9IG5fZ3JvdXBfc2xvdHMKKyAgICAgICAgICAmJiAh IHhhbGxvY19vdmVyc2l6ZWQgKG5fZ3JvdXBfc2xvdHMsIHNpemVvZiAqZ2ktPmdyb3VwKSkK KyAgICAgICAgeworICAgICAgICAgIGdpLT5ncm91cCA9IG1hbGxvYyAobl9ncm91cF9zbG90 cyAqIHNpemVvZiAqZ2ktPmdyb3VwKTsKKyAgICAgICAgICBpZiAoZ2ktPmdyb3VwKQorICAg ICAgICAgICAgbl9ncm91cHMgPSBnZXRncm91cHMgKG5fZ3JvdXBfc2xvdHMsIGdpLT5ncm91 cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogSW4gY2FzZSBvZiBlcnJvciwgdGhlIHVz ZXIgbG9zZXMuICAqLworICByZXR1cm4gbl9ncm91cHM7Cit9CisKKy8qIFJldHVybiBub24t emVybyBpZiBHSUQgaXMgb25lIHRoYXQgd2UgaGF2ZSBpbiBvdXIgZ3JvdXBzIGxpc3QuCisg ICBOb3RlIHRoYXQgdGhlIGdyb3VwcyBsaXN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbnRh aW4gdGhlIGN1cnJlbnQKKyAgIG9yIGVmZmVjdGl2ZSBncm91cCBJRCwgc28gdGhleSBzaG91 bGQgZ2VuZXJhbGx5IGJlIGNoZWNrZWQKKyAgIHNlcGFyYXRlbHkuICAqLworCitpbnQKK2dy b3VwX21lbWJlciAoZ2lkX3QgZ2lkKQoreworICBpbnQgaTsKKyAgaW50IGZvdW5kOworICBz dHJ1Y3QgZ3JvdXBfaW5mbyBnaTsKKyAgaW50IG5fZ3JvdXBzID0gZ2V0X2dyb3VwX2luZm8g KCZnaSk7CisKKyAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgbG9va2luZyBmb3IgR0lE LiAqLworICBmb3VuZCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBuX2dyb3VwczsgaSsrKQor ICAgIHsKKyAgICAgIGlmIChnaWQgPT0gZ2kuZ3JvdXBbaV0pCisgICAgICAgIHsKKyAgICAg ICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisK KyAgZnJlZV9ncm91cF9pbmZvICgmZ2kpOworCisgIHJldHVybiBmb3VuZDsKK30KKworI2lm ZGVmIFRFU1QKKworY2hhciAqcHJvZ3JhbV9uYW1lOworCitpbnQKK21haW4gKGludCBhcmdj LCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlsw XTsKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGdpZF90 IGdpZDsKKworICAgICAgZ2lkID0gYXRvaSAoYXJndltpXSk7CisgICAgICBwcmludGYgKCIl ZDogJXNcbiIsIGdpZCwgZ3JvdXBfbWVtYmVyIChnaWQpID8gInllcyIgOiAibm8iKTsKKyAg ICB9CisgIGV4aXQgKDApOworfQorCisjZW5kaWYgLyogVEVTVCAqLwoKPT09IGFkZGVkIGZp bGUgJ2xpYi9yb290LXVpZC5oJwotLS0gbGliL3Jvb3QtdWlkLmgJMTk3MC0wMS0wMSAwMDow MDowMCArMDAwMAorKysgbGliL3Jvb3QtdWlkLmgJMjAxMi0xMC0xMiAyMzoyODozMSArMDAw MApAQCAtMCwwICsxLDMwIEBACisvKiBUaGUgdXNlciBJRCB0aGF0IGFsd2F5cyBoYXMgYXBw cm9wcmlhdGUgcHJpdmlsZWdlcyBpbiB0aGUgUE9TSVggc2Vuc2UuCisKKyAgIENvcHlyaWdo dCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0u ICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgIFdy aXR0ZW4gYnkgUGF1bCBFZ2dlcnQuICAqLworCisjaWZuZGVmIFJPT1RfVUlEX0hfCisjZGVm aW5lIFJPT1RfVUlEX0hfCisKKy8qIFRoZSB1c2VyIElEIHRoYXQgYWx3YXlzIGhhcyBhcHBy b3ByaWF0ZSBwcml2aWxlZ2VzIGluIHRoZSBQT1NJWCBzZW5zZS4gICovCisjaWZkZWYgX19U QU5ERU0KKyMgZGVmaW5lIFJPT1RfVUlEIDY1NTM1CisjZWxzZQorIyBkZWZpbmUgUk9PVF9V SUQgMAorI2VuZGlmCisKKyNlbmRpZgoKPT09IGFkZGVkIGZpbGUgJ2xpYi94YWxsb2Mtb3Zl cnNpemVkLmgnCi0tLSBsaWIveGFsbG9jLW92ZXJzaXplZC5oCTE5NzAtMDEtMDEgMDA6MDA6 MDAgKzAwMDAKKysrIGxpYi94YWxsb2Mtb3ZlcnNpemVkLmgJMjAxMi0xMC0xMiAyMzoyODoz MSArMDAwMApAQCAtMCwwICsxLDM4IEBACisvKiB4YWxsb2Mtb3ZlcnNpemVkLmggLS0gbWVt b3J5IGFsbG9jYXRpb24gc2l6ZSBjaGVja2luZworCisgICBDb3B5cmlnaHQgKEMpIDE5OTAt MjAwMCwgMjAwMy0yMDA0LCAyMDA2LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5z ZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9u ZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgWEFMTE9DX09WRVJTSVpFRF9IXworIyBkZWZp bmUgWEFMTE9DX09WRVJTSVpFRF9IXworCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBS ZXR1cm4gMSBpZiBhbiBhcnJheSBvZiBOIG9iamVjdHMsIGVhY2ggb2Ygc2l6ZSBTLCBjYW5u b3QgZXhpc3QgZHVlCisgICB0byBzaXplIGFyaXRobWV0aWMgb3ZlcmZsb3cuICBTIG11c3Qg YmUgcG9zaXRpdmUgYW5kIE4gbXVzdCBiZQorICAgbm9ubmVnYXRpdmUuICBUaGlzIGlzIGEg bWFjcm8sIG5vdCBhIGZ1bmN0aW9uLCBzbyB0aGF0IGl0CisgICB3b3JrcyBjb3JyZWN0bHkg ZXZlbiB3aGVuIFNJWkVfTUFYIDwgTi4KKworICAgQnkgZ251bGliIGNvbnZlbnRpb24sIFNJ WkVfTUFYIHJlcHJlc2VudHMgb3ZlcmZsb3cgaW4gc2l6ZQorICAgY2FsY3VsYXRpb25zLCBz byB0aGUgY29uc2VydmF0aXZlIGRpdmlkZW5kIHRvIHVzZSBoZXJlIGlzCisgICBTSVpFX01B WCAtIDEsIHNpbmNlIFNJWkVfTUFYIG1pZ2h0IHJlcHJlc2VudCBhbiBvdmVyZmxvd2VkIHZh bHVlLgorICAgSG93ZXZlciwgbWFsbG9jIChTSVpFX01BWCkgZmFpbHMgb24gYWxsIGtub3du IGhvc3RzIHdoZXJlCisgICBzaXplb2YgKHB0cmRpZmZfdCkgPD0gc2l6ZW9mIChzaXplX3Qp LCBzbyBkbyBub3QgYm90aGVyIHRvIHRlc3QgZm9yCisgICBleGFjdGx5LVNJWkVfTUFYIGFs bG9jYXRpb25zIG9uIHN1Y2ggaG9zdHM7IHRoaXMgYXZvaWRzIGEgdGVzdCBhbmQKKyAgIGJy YW5jaCB3aGVuIFMgaXMga25vd24gdG8gYmUgMS4gICovCisjIGRlZmluZSB4YWxsb2Nfb3Zl cnNpemVkKG4sIHMpIFwKKyAgICAoKHNpemVfdCkgKHNpemVvZiAocHRyZGlmZl90KSA8PSBz aXplb2YgKHNpemVfdCkgPyAtMSA6IC0yKSAvIChzKSA8IChuKSkKKworI2VuZGlmIC8qICFY QUxMT0NfT1ZFUlNJWkVEX0hfICovCgo9PT0gYWRkZWQgZmlsZSAnbTQvZXVpZGFjY2Vzcy5t NCcKLS0tIG00L2V1aWRhY2Nlc3MubTQJMTk3MC0wMS0wMSAwMDowMDowMCArMDAwMAorKysg bTQvZXVpZGFjY2Vzcy5tNAkyMDEyLTEwLTEyIDIzOjI4OjMxICswMDAwCkBAIC0wLDAgKzEs NTIgQEAKKyMgZXVpZGFjY2Vzcy5tNCBzZXJpYWwgMTQKK2RubCBDb3B5cmlnaHQgKEMpIDIw MDItMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUg aXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdp dmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQs Citkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBu b3RpY2UgaXMgcHJlc2VydmVkLgorCitBQ19ERUZVTihbZ2xfRlVOQ19OT05SRUVOVFJBTlRf RVVJREFDQ0VTU10sCitbCisgIEFDX1JFUVVJUkUoW2dsX0ZVTkNfRVVJREFDQ0VTU10pCisg IEFDX0RFRklORShbUFJFRkVSX05PTlJFRU5UUkFOVF9FVUlEQUNDRVNTXSwgWzFdLAorICAg IFtEZWZpbmUgdGhpcyBpZiB5b3UgcHJlZmVyIGV1aWRhY2Nlc3MgdG8gcmV0dXJuIHRoZSBj b3JyZWN0IHJlc3VsdAorICAgICBldmVuIGlmIHRoaXMgd291bGQgbWFrZSBpdCBub25yZWVu dHJhbnQuICBEZWZpbmUgdGhpcyBvbmx5IGlmIHlvdXIKKyAgICAgZW50aXJlIGFwcGxpY2F0 aW9uIGlzIHNhZmUgZXZlbiBpZiB0aGUgdWlkIG9yIGdpZCBtaWdodCB0ZW1wb3JhcmlseQor ICAgICBjaGFuZ2UuICBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgc2lnbmFsIGhhbmRsZXJz IG9yIHRocmVhZHMgaXQKKyAgICAgaXMgcHJvYmFibHkgbm90IHNhZmUuXSkKK10pCisKK0FD X0RFRlVOKFtnbF9GVU5DX0VVSURBQ0NFU1NdLAorWworICBBQ19SRVFVSVJFKFtnbF9VTklT VERfSF9ERUZBVUxUU10pCisKKyAgZG5sIFBlcnN1YWRlIGdsaWJjIDx1bmlzdGQuaD4gdG8g ZGVjbGFyZSBldWlkYWNjZXNzKCkuCisgIEFDX1JFUVVJUkUoW0FDX1VTRV9TWVNURU1fRVhU RU5TSU9OU10pCisKKyAgQUNfQ0hFQ0tfRlVOQ1MoW2V1aWRhY2Nlc3NdKQorICBpZiB0ZXN0 ICRhY19jdl9mdW5jX2V1aWRhY2Nlc3MgPSBubzsgdGhlbgorICAgIEhBVkVfRVVJREFDQ0VT Uz0wCisgIGZpCitdKQorCisjIFByZXJlcXVpc2l0ZXMgb2YgbGliL2V1aWRhY2Nlc3MuYy4K K0FDX0RFRlVOKFtnbF9QUkVSRVFfRVVJREFDQ0VTU10sIFsKKyAgZG5sIFByZWZlciBQT1NJ WCBmYWNjZXNzYXQgb3ZlciBub24tc3RhbmRhcmQgZXVpZGFjY2Vzcy4KKyAgQUNfQ0hFQ0tf RlVOQ1NfT05DRShbZmFjY2Vzc2F0XSkKKyAgZG5sIFRyeSB2YXJpb3VzIG90aGVyIG5vbi1z dGFuZGFyZCBmYWxsYmFja3MuCisgIEFDX0NIRUNLX0hFQURFUlNfT05DRShbbGliZ2VuLmhd KQorICBBQ19DSEVDS19ERUNMU19PTkNFKFtzZXRyZWdpZF0pCisgIEFDX1JFUVVJUkUoW0FD X0ZVTkNfR0VUR1JPVVBTXSkKKworICAjIFNvbGFyaXMgOSBhbmQgMTAgbmVlZCAtbGdlbiB0 byBnZXQgdGhlIGVhY2Nlc3MgZnVuY3Rpb24uCisgICMgU2F2ZSBhbmQgcmVzdG9yZSBMSUJT IHNvIC1sZ2VuIGlzbid0IGFkZGVkIHRvIGl0LiAgT3RoZXJ3aXNlLCAqYWxsKgorICAjIHBy b2dyYW1zIGluIHRoZSBwYWNrYWdlIHdvdWxkIGVuZCB1cCBsaW5rZWQgd2l0aCB0aGF0IHBv dGVudGlhbGx5LXNoYXJlZAorICAjIGxpYnJhcnksIGluZHVjaW5nIHVubmVjZXNzYXJ5IHJ1 bi10aW1lIG92ZXJoZWFkLgorICBMSUJfRUFDQ0VTUz0KKyAgQUNfU1VCU1QoW0xJQl9FQUND RVNTXSkKKyAgZ2xfc2F2ZWRfbGlicz0kTElCUworICAgIEFDX1NFQVJDSF9MSUJTKFtlYWNj ZXNzXSwgW2dlbl0sCisgICAgICAgICAgICAgICAgICAgW3Rlc3QgIiRhY19jdl9zZWFyY2hf ZWFjY2VzcyIgPSAibm9uZSByZXF1aXJlZCIgfHwKKyAgICAgICAgICAgICAgICAgICAgTElC X0VBQ0NFU1M9JGFjX2N2X3NlYXJjaF9lYWNjZXNzXSkKKyAgICBBQ19DSEVDS19GVU5DUyhb ZWFjY2Vzc10pCisgIExJQlM9JGdsX3NhdmVkX2xpYnMKK10pCgo9PT0gYWRkZWQgZmlsZSAn bTQvZ2V0Z3JvdXBzLm00JwotLS0gbTQvZ2V0Z3JvdXBzLm00CTE5NzAtMDEtMDEgMDA6MDA6 MDAgKzAwMDAKKysrIG00L2dldGdyb3Vwcy5tNAkyMDEyLTEwLTEyIDIzOjI4OjMxICswMDAw CkBAIC0wLDAgKzEsMTA3IEBACisjIHNlcmlhbCAxOAorCitkbmwgRnJvbSBKaW0gTWV5ZXJp bmcuCitkbmwgQSB3cmFwcGVyIGFyb3VuZCBBQ19GVU5DX0dFVEdST1VQUy4KKworIyBDb3B5 cmlnaHQgKEMpIDE5OTYtMTk5NywgMTk5OS0yMDA0LCAyMDA4LTIwMTIgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNz aW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBt b2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKwor bTRfdmVyc2lvbl9wcmVyZXEoWzIuNzBdLCBbXSAsWworCisjIFRoaXMgaXMgdGFrZW4gZnJv bSB0aGUgZm9sbG93aW5nIEF1dG9jb25mIHBhdGNoOgorIyBodHRwOi8vZ2l0LnNhdmFubmFo LmdudS5vcmcvZ2l0d2ViLz9wPWF1dG9jb25mLmdpdDthPWNvbW1pdGRpZmY7aD03ZmJiNTUz NzI3ZWQ3ZTBlNjg5YTE3NTk0YjU4NTU5ZWNmM2VhNmU5CitBQ19ERUZVTihbQUNfRlVOQ19H RVRHUk9VUFNdLAorWworICBBQ19SRVFVSVJFKFtBQ19UWVBFX0dFVEdST1VQU10pZG5sCisg IEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfQ0FO T05JQ0FMX0hPU1RdKWRubCBmb3IgY3Jvc3MtY29tcGlsZXMKKyAgQUNfQ0hFQ0tfRlVOQyhb Z2V0Z3JvdXBzXSkKKworICAjIElmIHdlIGRvbid0IHlldCBoYXZlIGdldGdyb3Vwcywgc2Vl IGlmIGl0J3MgaW4gLWxic2QuCisgICMgVGhpcyBpcyByZXBvcnRlZCB0byBiZSBuZWNlc3Nh cnkgb24gYW4gSVRPUyAzMDAwV1MgcnVubmluZyBTRUlVWCAzLjEuCisgIGFjX3NhdmVfTElC Uz0kTElCUworICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGdyb3VwcyA9IG5vOyB0aGVuCisg ICAgQUNfQ0hFQ0tfTElCKGJzZCwgZ2V0Z3JvdXBzLCBbR0VUR1JPVVBTX0xJQj0tbGJzZF0p CisgIGZpCisKKyAgIyBSdW4gdGhlIHByb2dyYW0gdG8gdGVzdCB0aGUgZnVuY3Rpb25hbGl0 eSBvZiB0aGUgc3lzdGVtLXN1cHBsaWVkCisgICMgZ2V0Z3JvdXBzIGZ1bmN0aW9uIG9ubHkg aWYgdGhlcmUgaXMgc3VjaCBhIGZ1bmN0aW9uLgorICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dl dGdyb3VwcyA9IHllczsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBn ZXRncm91cHNdLCBbYWNfY3ZfZnVuY19nZXRncm91cHNfd29ya3NdLAorICAgICAgW0FDX1JV Tl9JRkVMU0UoCisgICAgICAgICBbQUNfTEFOR19QUk9HUkFNKAorICAgICAgICAgICAgW0FD X0lOQ0xVREVTX0RFRkFVTFRdLAorICAgICAgICAgICAgW1svKiBPbiBVbHRyaXggNC4zLCBn ZXRncm91cHMgKDAsIDApIGFsd2F5cyBmYWlscy4gICovCisgICAgICAgICAgICAgIHJldHVy biBnZXRncm91cHMgKDAsIDApID09IC0xO11dKQorICAgICAgICAgXSwKKyAgICAgICAgIFth Y19jdl9mdW5jX2dldGdyb3Vwc193b3Jrcz15ZXNdLAorICAgICAgICAgW2FjX2N2X2Z1bmNf Z2V0Z3JvdXBzX3dvcmtzPW5vXSwKKyAgICAgICAgIFtjYXNlICIkaG9zdF9vcyIgaW4gIyAo KAorICAgICAgICAgICAgICAgICAgICAjIEd1ZXNzIHllcyBvbiBnbGliYyBzeXN0ZW1zLgor ICAgICAgICAgICAgKi1nbnUqKSBhY19jdl9mdW5jX2dldGdyb3Vwc193b3Jrcz0iZ3Vlc3Np bmcgeWVzIiA7OworICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGRvbid0IGtub3csIGFz c3VtZSB0aGUgd29yc3QuCisgICAgICAgICAgICAqKSAgICAgIGFjX2N2X2Z1bmNfZ2V0Z3Jv dXBzX3dvcmtzPSJndWVzc2luZyBubyIgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICBd KQorICAgICAgXSkKKyAgZWxzZQorICAgIGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPW5v CisgIGZpCisgIGNhc2UgIiRhY19jdl9mdW5jX2dldGdyb3Vwc193b3JrcyIgaW4KKyAgICAq eWVzKQorICAgICAgQUNfREVGSU5FKFtIQVZFX0dFVEdST1VQU10sIFsxXSwKKyAgICAgICAg W0RlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIHdvcmtpbmcgYGdldGdyb3Vwcycg ZnVuY3Rpb24uXSkKKyAgICAgIDs7CisgIGVzYWMKKyAgTElCUz0kYWNfc2F2ZV9MSUJTCitd KSMgQUNfRlVOQ19HRVRHUk9VUFMKKworXSkKKworQUNfREVGVU4oW2dsX0ZVTkNfR0VUR1JP VVBTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfVFlQRV9HRVRHUk9VUFNdKQorICBBQ19SRVFV SVJFKFtnbF9VTklTVERfSF9ERUZBVUxUU10pCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNB TF9IT1NUXSkgZG5sIGZvciBjcm9zcy1jb21waWxlcworCisgIEFDX0ZVTkNfR0VUR1JPVVBT CisgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzICE9IHllczsgdGhlbgorICAgIEhB VkVfR0VUR1JPVVBTPTAKKyAgZWxzZQorICAgIGlmIHRlc3QgIiRhY19jdl90eXBlX2dldGdy b3VwcyIgIT0gZ2lkX3QgXAorICAgICAgIHx8IHsgY2FzZSAiJGFjX2N2X2Z1bmNfZ2V0Z3Jv dXBzX3dvcmtzIiBpbgorICAgICAgICAgICAgICAqeWVzKSBmYWxzZTs7CisgICAgICAgICAg ICAgICopIHRydWU7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgIH07IHRoZW4KKyAg ICAgIFJFUExBQ0VfR0VUR1JPVVBTPTEKKyAgICAgIEFDX0RFRklORShbR0VUR1JPVVBTX1pF Uk9fQlVHXSwgWzFdLCBbRGVmaW5lIHRoaXMgdG8gMSBpZgorICAgICAgICBnZXRncm91cHMo MCxOVUxMKSBkb2VzIG5vdCByZXR1cm4gdGhlIG51bWJlciBvZiBncm91cHMuXSkKKyAgICBl bHNlCisgICAgICBkbmwgRGV0ZWN0IEZyZWVCU0QgYnVnOyBQT1NJWCByZXF1aXJlcyBnZXRn cm91cHMoLTEscHRyKSB0byBmYWlsLgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIg Z2V0Z3JvdXBzIGhhbmRsZXMgbmVnYXRpdmUgdmFsdWVzXSwKKyAgICAgICAgW2dsX2N2X2Z1 bmNfZ2V0Z3JvdXBzX3dvcmtzXSwKKyAgICAgICAgW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdf UFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCisgICAgICAgICAgW1tpbnQgc2l6ZSA9 IGdldGdyb3VwcyAoMCwgMCk7CisgICAgICAgICAgICBnaWRfdCAqbGlzdCA9IG1hbGxvYyAo c2l6ZSAqIHNpemVvZiAqbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0Z3JvdXBzICgt MSwgbGlzdCkgIT0gLTE7XV0pXSwKKyAgICAgICAgICBbZ2xfY3ZfZnVuY19nZXRncm91cHNf d29ya3M9eWVzXSwKKyAgICAgICAgICBbZ2xfY3ZfZnVuY19nZXRncm91cHNfd29ya3M9bm9d LAorICAgICAgICAgIFtjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgICAgICAgICAgICAgICAg ICMgR3Vlc3MgeWVzIG9uIGdsaWJjIHN5c3RlbXMuCisgICAgICAgICAgICAgKi1nbnUqKSBn bF9jdl9mdW5jX2dldGdyb3Vwc193b3Jrcz0iZ3Vlc3NpbmcgeWVzIiA7OworICAgICAgICAg ICAgICAgICAgICAgIyBJZiB3ZSBkb24ndCBrbm93LCBhc3N1bWUgdGhlIHdvcnN0LgorICAg ICAgICAgICAgICopICAgICAgZ2xfY3ZfZnVuY19nZXRncm91cHNfd29ya3M9Imd1ZXNzaW5n IG5vIiA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICAgXSldKQorICAgICAgY2FzZSAi JGdsX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzIiBpbgorICAgICAgICAqeWVzKSA7OworICAg ICAgICAqKSBSRVBMQUNFX0dFVEdST1VQUz0xIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAg ZmkKKyAgdGVzdCAtbiAiJEdFVEdST1VQU19MSUIiICYmIExJQlM9IiRHRVRHUk9VUFNfTElC ICRMSUJTIgorXSkKCj09PSBtb2RpZmllZCBmaWxlICdtNC9nbnVsaWItY29tcC5tNCcKLS0t IG00L2dudWxpYi1jb21wLm00CTIwMTItMDktMjcgMDE6MDY6MjMgKzAwMDAKKysrIG00L2du dWxpYi1jb21wLm00CTIwMTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAgLTUzLDE3ICs1Mywy MCBAQAogICAjIENvZGUgZnJvbSBtb2R1bGUgZHRvdGltZXNwZWM6CiAgICMgQ29kZSBmcm9t IG1vZHVsZSBkdXAyOgogICAjIENvZGUgZnJvbSBtb2R1bGUgZW52aXJvbjoKKyAgIyBDb2Rl IGZyb20gbW9kdWxlIGV1aWRhY2Nlc3M6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBleGVjaW5m bzoKICAgIyBDb2RlIGZyb20gbW9kdWxlIGV4dGVuc2lvbnM6CiAgIEFDX1JFUVVJUkUoW2ds X1VTRV9TWVNURU1fRVhURU5TSU9OU10pCiAgICMgQ29kZSBmcm9tIG1vZHVsZSBleHRlcm4t aW5saW5lOgogICAjIENvZGUgZnJvbSBtb2R1bGUgZmlsZW1vZGU6CisgICMgQ29kZSBmcm9t IG1vZHVsZSBnZXRncm91cHM6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBnZXRsb2FkYXZnOgog ICAjIENvZGUgZnJvbSBtb2R1bGUgZ2V0b3B0LWdudToKICAgIyBDb2RlIGZyb20gbW9kdWxl IGdldG9wdC1wb3NpeDoKICAgIyBDb2RlIGZyb20gbW9kdWxlIGdldHRleHQtaDoKICAgIyBD b2RlIGZyb20gbW9kdWxlIGdldHRpbWU6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBnZXR0aW1l b2ZkYXk6CisgICMgQ29kZSBmcm9tIG1vZHVsZSBncm91cC1tZW1iZXI6CiAgICMgQ29kZSBm cm9tIG1vZHVsZSBpZ25vcmUtdmFsdWU6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBpbmNsdWRl X25leHQ6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBpbnRwcm9wczoKQEAgLTc5LDYgKzgyLDcg QEAKICAgIyBDb2RlIGZyb20gbW9kdWxlIHBzZWxlY3Q6CiAgICMgQ29kZSBmcm9tIG1vZHVs ZSBwdGhyZWFkX3NpZ21hc2s6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSByZWFkbGluazoKKyAg IyBDb2RlIGZyb20gbW9kdWxlIHJvb3QtdWlkOgogICAjIENvZGUgZnJvbSBtb2R1bGUgc2ln bmFsLWg6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSBzbmlwcGV0L19Ob3JldHVybjoKICAgIyBD b2RlIGZyb20gbW9kdWxlIHNuaXBwZXQvYXJnLW5vbm51bGw6CkBAIC0xMjAsNiArMTI0LDcg QEAKICAgIyBDb2RlIGZyb20gbW9kdWxlIHV0aW1lbnM6CiAgICMgQ29kZSBmcm9tIG1vZHVs ZSB2ZXJpZnk6CiAgICMgQ29kZSBmcm9tIG1vZHVsZSB3YXJuaW5nczoKKyAgIyBDb2RlIGZy b20gbW9kdWxlIHhhbGxvYy1vdmVyc2l6ZWQ6CiBdKQogCiAjIFRoaXMgbWFjcm8gc2hvdWxk IGJlIGludm9rZWQgZnJvbSAuL2NvbmZpZ3VyZS5hYywgaW4gdGhlIHNlY3Rpb24KQEAgLTE1 NCw2ICsxNTksMTIgQEAKICAgZ2xfVU5JU1REX01PRFVMRV9JTkRJQ0FUT1IoW2R1cDJdKQog ICBnbF9FTlZJUk9OCiAgIGdsX1VOSVNURF9NT0RVTEVfSU5ESUNBVE9SKFtlbnZpcm9uXSkK KyAgZ2xfRlVOQ19FVUlEQUNDRVNTCisgIGlmIHRlc3QgJEhBVkVfRVVJREFDQ0VTUyA9IDA7 IHRoZW4KKyAgICBBQ19MSUJPQkooW2V1aWRhY2Nlc3NdKQorICAgIGdsX1BSRVJFUV9FVUlE QUNDRVNTCisgIGZpCisgIGdsX1VOSVNURF9NT0RVTEVfSU5ESUNBVE9SKFtldWlkYWNjZXNz XSkKICAgZ2xfRVhFQ0lORk9fSAogICBBQ19SRVFVSVJFKFtnbF9FWFRFUk5fSU5MSU5FXSkK ICAgZ2xfRklMRU1PREUKQEAgLTI2OSwxOCArMjgwLDMyIEBACiAgIGdsX1VOSVNURF9ICiAg IGdsX1VUSU1FTlMKICAgZ2xfZ251bGliX2VuYWJsZWRfZG9zbmFtZT1mYWxzZQorICBnbF9n bnVsaWJfZW5hYmxlZF9nZXRncm91cHM9ZmFsc2UKICAgZ2xfZ251bGliX2VuYWJsZWRfYmU0 NTNjZWM1ZWVjZjU3MzFhMjc0ZjJkZTdmMmRiMzY9ZmFsc2UKKyAgZ2xfZ251bGliX2VuYWJs ZWRfYTk3ODY4NTBlOTk5YWU2NWE4MzZhNjA0MWU4ZTVlZDE9ZmFsc2UKICAgZ2xfZ251bGli X2VuYWJsZWRfcGF0aG1heD1mYWxzZQogICBnbF9nbnVsaWJfZW5hYmxlZF9zdGF0PWZhbHNl CiAgIGdsX2dudWxpYl9lbmFibGVkX3N0cnRvbGw9ZmFsc2UKICAgZ2xfZ251bGliX2VuYWJs ZWRfc3RydG91bGw9ZmFsc2UKICAgZ2xfZ251bGliX2VuYWJsZWRfdmVyaWZ5PWZhbHNlCisg IGdsX2dudWxpYl9lbmFibGVkXzY4MmU2MDk2MDRjY2FhYzZiZTM4MmU0ZWUzYTRlYWVjPWZh bHNlCiAgIGZ1bmNfZ2xfZ251bGliX200Y29kZV9kb3NuYW1lICgpCiAgIHsKICAgICBpZiAh ICRnbF9nbnVsaWJfZW5hYmxlZF9kb3NuYW1lOyB0aGVuCiAgICAgICBnbF9nbnVsaWJfZW5h YmxlZF9kb3NuYW1lPXRydWUKICAgICBmaQogICB9CisgIGZ1bmNfZ2xfZ251bGliX200Y29k ZV9nZXRncm91cHMgKCkKKyAgeworICAgIGlmICEgJGdsX2dudWxpYl9lbmFibGVkX2dldGdy b3VwczsgdGhlbgorICAgICAgZ2xfRlVOQ19HRVRHUk9VUFMKKyAgICAgIGlmIHRlc3QgJEhB VkVfR0VUR1JPVVBTID0gMCB8fCB0ZXN0ICRSRVBMQUNFX0dFVEdST1VQUyA9IDE7IHRoZW4K KyAgICAgICAgQUNfTElCT0JKKFtnZXRncm91cHNdKQorICAgICAgZmkKKyAgICAgIGdsX1VO SVNURF9NT0RVTEVfSU5ESUNBVE9SKFtnZXRncm91cHNdKQorICAgICAgZ2xfZ251bGliX2Vu YWJsZWRfZ2V0Z3JvdXBzPXRydWUKKyAgICBmaQorICB9CiAgIGZ1bmNfZ2xfZ251bGliX200 Y29kZV9iZTQ1M2NlYzVlZWNmNTczMWEyNzRmMmRlN2YyZGIzNiAoKQogICB7CiAgICAgaWYg ISAkZ2xfZ251bGliX2VuYWJsZWRfYmU0NTNjZWM1ZWVjZjU3MzFhMjc0ZjJkZTdmMmRiMzY7 IHRoZW4KQEAgLTI4OSw2ICszMTQsMjQgQEAKICAgICAgIGdsX2dudWxpYl9lbmFibGVkX2Jl NDUzY2VjNWVlY2Y1NzMxYTI3NGYyZGU3ZjJkYjM2PXRydWUKICAgICBmaQogICB9CisgIGZ1 bmNfZ2xfZ251bGliX200Y29kZV9hOTc4Njg1MGU5OTlhZTY1YTgzNmE2MDQxZThlNWVkMSAo KQorICB7CisgICAgaWYgISAkZ2xfZ251bGliX2VuYWJsZWRfYTk3ODY4NTBlOTk5YWU2NWE4 MzZhNjA0MWU4ZTVlZDE7IHRoZW4KKyAgICAgIGdsX0ZVTkNfR1JPVVBfTUVNQkVSCisgICAg ICBpZiB0ZXN0ICRIQVZFX0dST1VQX01FTUJFUiA9IDA7IHRoZW4KKyAgICAgICAgQUNfTElC T0JKKFtncm91cC1tZW1iZXJdKQorICAgICAgICBnbF9QUkVSRVFfR1JPVVBfTUVNQkVSCisg ICAgICBmaQorICAgICAgZ2xfVU5JU1REX01PRFVMRV9JTkRJQ0FUT1IoW2dyb3VwLW1lbWJl cl0pCisgICAgICBnbF9nbnVsaWJfZW5hYmxlZF9hOTc4Njg1MGU5OTlhZTY1YTgzNmE2MDQx ZThlNWVkMT10cnVlCisgICAgICBpZiB0ZXN0ICRIQVZFX0dST1VQX01FTUJFUiA9IDA7IHRo ZW4KKyAgICAgICAgZnVuY19nbF9nbnVsaWJfbTRjb2RlX2dldGdyb3VwcworICAgICAgZmkK KyAgICAgIGlmIHRlc3QgJEhBVkVfR1JPVVBfTUVNQkVSID0gMDsgdGhlbgorICAgICAgICBm dW5jX2dsX2dudWxpYl9tNGNvZGVfNjgyZTYwOTYwNGNjYWFjNmJlMzgyZTRlZTNhNGVhZWMK KyAgICAgIGZpCisgICAgZmkKKyAgfQogICBmdW5jX2dsX2dudWxpYl9tNGNvZGVfcGF0aG1h eCAoKQogICB7CiAgICAgaWYgISAkZ2xfZ251bGliX2VuYWJsZWRfcGF0aG1heDsgdGhlbgpA QCAtMzQ3LDYgKzM5MCwxOCBAQAogICAgICAgZ2xfZ251bGliX2VuYWJsZWRfdmVyaWZ5PXRy dWUKICAgICBmaQogICB9CisgIGZ1bmNfZ2xfZ251bGliX200Y29kZV82ODJlNjA5NjA0Y2Nh YWM2YmUzODJlNGVlM2E0ZWFlYyAoKQorICB7CisgICAgaWYgISAkZ2xfZ251bGliX2VuYWJs ZWRfNjgyZTYwOTYwNGNjYWFjNmJlMzgyZTRlZTNhNGVhZWM7IHRoZW4KKyAgICAgIGdsX2du dWxpYl9lbmFibGVkXzY4MmU2MDk2MDRjY2FhYzZiZTM4MmU0ZWUzYTRlYWVjPXRydWUKKyAg ICBmaQorICB9CisgIGlmIHRlc3QgJEhBVkVfRVVJREFDQ0VTUyA9IDA7IHRoZW4KKyAgICBm dW5jX2dsX2dudWxpYl9tNGNvZGVfYTk3ODY4NTBlOTk5YWU2NWE4MzZhNjA0MWU4ZTVlZDEK KyAgZmkKKyAgaWYgdGVzdCAkSEFWRV9FVUlEQUNDRVNTID0gMDsgdGhlbgorICAgIGZ1bmNf Z2xfZ251bGliX200Y29kZV9zdGF0CisgIGZpCiAgIGlmIHRlc3QgJFJFUExBQ0VfR0VUT1BU ID0gMTsgdGhlbgogICAgIGZ1bmNfZ2xfZ251bGliX200Y29kZV9iZTQ1M2NlYzVlZWNmNTcz MWEyNzRmMmRlN2YyZGIzNgogICBmaQpAQCAtMzczLDEyICs0MjgsMTUgQEAKICAgZmkKICAg bTRfcGF0dGVybl9hbGxvdyhbXmdsX0dOVUxJQl9FTkFCTEVEX10pCiAgIEFNX0NPTkRJVElP TkFMKFtnbF9HTlVMSUJfRU5BQkxFRF9kb3NuYW1lXSwgWyRnbF9nbnVsaWJfZW5hYmxlZF9k b3NuYW1lXSkKKyAgQU1fQ09ORElUSU9OQUwoW2dsX0dOVUxJQl9FTkFCTEVEX2dldGdyb3Vw c10sIFskZ2xfZ251bGliX2VuYWJsZWRfZ2V0Z3JvdXBzXSkKICAgQU1fQ09ORElUSU9OQUwo W2dsX0dOVUxJQl9FTkFCTEVEX2JlNDUzY2VjNWVlY2Y1NzMxYTI3NGYyZGU3ZjJkYjM2XSwg WyRnbF9nbnVsaWJfZW5hYmxlZF9iZTQ1M2NlYzVlZWNmNTczMWEyNzRmMmRlN2YyZGIzNl0p CisgIEFNX0NPTkRJVElPTkFMKFtnbF9HTlVMSUJfRU5BQkxFRF9hOTc4Njg1MGU5OTlhZTY1 YTgzNmE2MDQxZThlNWVkMV0sIFskZ2xfZ251bGliX2VuYWJsZWRfYTk3ODY4NTBlOTk5YWU2 NWE4MzZhNjA0MWU4ZTVlZDFdKQogICBBTV9DT05ESVRJT05BTChbZ2xfR05VTElCX0VOQUJM RURfcGF0aG1heF0sIFskZ2xfZ251bGliX2VuYWJsZWRfcGF0aG1heF0pCiAgIEFNX0NPTkRJ VElPTkFMKFtnbF9HTlVMSUJfRU5BQkxFRF9zdGF0XSwgWyRnbF9nbnVsaWJfZW5hYmxlZF9z dGF0XSkKICAgQU1fQ09ORElUSU9OQUwoW2dsX0dOVUxJQl9FTkFCTEVEX3N0cnRvbGxdLCBb JGdsX2dudWxpYl9lbmFibGVkX3N0cnRvbGxdKQogICBBTV9DT05ESVRJT05BTChbZ2xfR05V TElCX0VOQUJMRURfc3RydG91bGxdLCBbJGdsX2dudWxpYl9lbmFibGVkX3N0cnRvdWxsXSkK ICAgQU1fQ09ORElUSU9OQUwoW2dsX0dOVUxJQl9FTkFCTEVEX3ZlcmlmeV0sIFskZ2xfZ251 bGliX2VuYWJsZWRfdmVyaWZ5XSkKKyAgQU1fQ09ORElUSU9OQUwoW2dsX0dOVUxJQl9FTkFC TEVEXzY4MmU2MDk2MDRjY2FhYzZiZTM4MmU0ZWUzYTRlYWVjXSwgWyRnbF9nbnVsaWJfZW5h YmxlZF82ODJlNjA5NjA0Y2NhYWM2YmUzODJlNGVlM2E0ZWFlY10pCiAgICMgRW5kIG9mIGNv ZGUgZnJvbSBtb2R1bGVzCiAgIG00X2lmdmFsKGdsX0xJQlNPVVJDRVNfTElTVCwgWwogICAg IG00X3N5c2NtZChbdGVzdCAhIC1kIF1tNF9kZWZuKFtnbF9MSUJTT1VSQ0VTX0RJUl0pWyB8 fApAQCAtNTM4LDEyICs1OTYsMTQgQEAKICAgbGliL2R0b2FzdHIuYwogICBsaWIvZHRvdGlt ZXNwZWMuYwogICBsaWIvZHVwMi5jCisgIGxpYi9ldWlkYWNjZXNzLmMKICAgbGliL2V4ZWNp bmZvLmMKICAgbGliL2V4ZWNpbmZvLmluLmgKICAgbGliL2ZpbGVtb2RlLmMKICAgbGliL2Zp bGVtb2RlLmgKICAgbGliL2Z0b2FzdHIuYwogICBsaWIvZnRvYXN0ci5oCisgIGxpYi9nZXRn cm91cHMuYwogICBsaWIvZ2V0bG9hZGF2Zy5jCiAgIGxpYi9nZXRvcHQuYwogICBsaWIvZ2V0 b3B0LmluLmgKQEAgLTU1Miw2ICs2MTIsNyBAQAogICBsaWIvZ2V0dGV4dC5oCiAgIGxpYi9n ZXR0aW1lLmMKICAgbGliL2dldHRpbWVvZmRheS5jCisgIGxpYi9ncm91cC1tZW1iZXIuYwog ICBsaWIvaWdub3JlLXZhbHVlLmgKICAgbGliL2ludHByb3BzLmgKICAgbGliL2ludHR5cGVz LmluLmgKQEAgLTU2NCw2ICs2MjUsNyBAQAogICBsaWIvcHNlbGVjdC5jCiAgIGxpYi9wdGhy ZWFkX3NpZ21hc2suYwogICBsaWIvcmVhZGxpbmsuYworICBsaWIvcm9vdC11aWQuaAogICBs aWIvc2hhMS5jCiAgIGxpYi9zaGExLmgKICAgbGliL3NoYTI1Ni5jCkBAIC02MDUsMjEgKzY2 NywyNSBAQAogICBsaWIvdXRpbWVucy5jCiAgIGxpYi91dGltZW5zLmgKICAgbGliL3Zlcmlm eS5oCisgIGxpYi94YWxsb2Mtb3ZlcnNpemVkLmgKICAgbTQvMDBnbnVsaWIubTQKICAgbTQv YWxsb2NhLm00CiAgIG00L2Mtc3RydG9kLm00CiAgIG00L2Nsb2NrX3RpbWUubTQKICAgbTQv ZHVwMi5tNAogICBtNC9lbnZpcm9uLm00CisgIG00L2V1aWRhY2Nlc3MubTQKICAgbTQvZXhl Y2luZm8ubTQKICAgbTQvZXh0ZW5zaW9ucy5tNAogICBtNC9leHRlcm4taW5saW5lLm00CiAg IG00L2ZpbGVtb2RlLm00CisgIG00L2dldGdyb3Vwcy5tNAogICBtNC9nZXRsb2FkYXZnLm00 CiAgIG00L2dldG9wdC5tNAogICBtNC9nZXR0aW1lLm00CiAgIG00L2dldHRpbWVvZmRheS5t NAogICBtNC9nbnVsaWItY29tbW9uLm00CisgIG00L2dyb3VwLW1lbWJlci5tNAogICBtNC9p bmNsdWRlX25leHQubTQKICAgbTQvaW50dHlwZXMubTQKICAgbTQvbGFyZ2VmaWxlLm00Cgo9 PT0gYWRkZWQgZmlsZSAnbTQvZ3JvdXAtbWVtYmVyLm00JwotLS0gbTQvZ3JvdXAtbWVtYmVy Lm00CTE5NzAtMDEtMDEgMDA6MDA6MDAgKzAwMDAKKysrIG00L2dyb3VwLW1lbWJlci5tNAky MDEyLTEwLTEyIDIzOjI4OjMxICswMDAwCkBAIC0wLDAgKzEsMjkgQEAKKyMgc2VyaWFsIDE0 CisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEsIDIwMDMtMjAwNywgMjAwOS0yMDEyIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNv ZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRl ZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Ig d2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNl cnZlZC4KKworZG5sIFdyaXR0ZW4gYnkgSmltIE1leWVyaW5nCisKK0FDX0RFRlVOKFtnbF9G VU5DX0dST1VQX01FTUJFUl0sCitbCisgIEFDX1JFUVVJUkUoW2dsX1VOSVNURF9IX0RFRkFV TFRTXSkKKworICBkbmwgUGVyc3VhZGUgZ2xpYmMgPHVuaXN0ZC5oPiB0byBkZWNsYXJlIGdy b3VwX21lbWJlcigpLgorICBBQ19SRVFVSVJFKFtBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlNd KQorCisgIGRubCBEbyB0aGlzIHJlcGxhY2VtZW50IGNoZWNrIG1hbnVhbGx5IGJlY2F1c2Ug SSB3YW50IHRoZSBoeXBoZW4KKyAgZG5sIChub3QgdGhlIHVuZGVyc2NvcmUpIGluIHRoZSBm aWxlbmFtZS4KKyAgQUNfQ0hFQ0tfRlVOQyhbZ3JvdXBfbWVtYmVyXSwgLCBbCisgICAgSEFW RV9HUk9VUF9NRU1CRVI9MAorICBdKQorXSkKKworIyBQcmVyZXF1aXNpdGVzIG9mIGxpYi9n cm91cC1tZW1iZXIuYy4KK0FDX0RFRlVOKFtnbF9QUkVSRVFfR1JPVVBfTUVNQkVSXSwKK1sK KyAgQUNfUkVRVUlSRShbQUNfRlVOQ19HRVRHUk9VUFNdKQorXSkKCj09PSBtb2RpZmllZCBm aWxlICdudC9DaGFuZ2VMb2cnCi0tLSBudC9DaGFuZ2VMb2cJMjAxMi0xMC0wOCAxNDoxNDoy MiArMDAwMAorKysgbnQvQ2hhbmdlTG9nCTIwMTItMTAtMTQgMTg6MDY6MDEgKzAwMDAKQEAg LTEsMyArMSw5IEBACisyMDEyLTEwLTE0ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEBjcy51Y2xh LmVkdT4KKworCVVzZSBldWlkYWNjZXNzLCBub3QgYWNjZXNzLCB3aGVuIGNoZWNraW5nIGZp bGUgcGVybWlzc2lvbnMgKEJ1ZyMxMjYzMikuCisJKiBpbmMvbXMtdzMyLmggKGV1aWRhY2Nl c3MpOiBEZWZpbmUgdGhpcywgbm90ICdhY2Nlc3MnLCBzaW5jZQorCXRoZSBtYWlubGluZSBj b2RlIG5vdyB1c2VzIGV1aWRhY2Nlc3MuCisKIDIwMTItMTAtMDggIEp1YW5tYSBCYXJyYW5x dWVybyAgPGxla2t0dUBnbWFpbC5jb20+CiAKIAkqIGNvbmZpZy5udDogU3luYyB3aXRoIGF1 dG9nZW4vY29uZmlnLmluLgoKPT09IG1vZGlmaWVkIGZpbGUgJ250L2luYy9tcy13MzIuaCcK LS0tIG50L2luYy9tcy13MzIuaAkyMDEyLTA5LTMwIDIxOjM2OjQyICswMDAwCisrKyBudC9p bmMvbXMtdzMyLmgJMjAxMi0xMC0xNCAxODowNjowMSArMDAwMApAQCAtMTYwLDggKzE2MCw2 IEBACiAjZW5kaWYKIAogLyogQ2FsbHMgdGhhdCBhcmUgZW11bGF0ZWQgb3Igc2hhZG93ZWQu ICAqLwotI3VuZGVmIGFjY2VzcwotI2RlZmluZSBhY2Nlc3MgIHN5c19hY2Nlc3MKICN1bmRl ZiBjaGRpcgogI2RlZmluZSBjaGRpciAgIHN5c19jaGRpcgogI3VuZGVmIGNobW9kCkBAIC0x NzYsNiArMTc0LDcgQEAKICNkZWZpbmUgZHVwICAgICBzeXNfZHVwCiAjdW5kZWYgZHVwMgog I2RlZmluZSBkdXAyICAgIHN5c19kdXAyCisjZGVmaW5lIGV1aWRhY2Nlc3MgIHN5c19hY2Nl c3MKICNkZWZpbmUgZm9wZW4gICBzeXNfZm9wZW4KICNkZWZpbmUgbGluayAgICBzeXNfbGlu awogI2RlZmluZSBsb2NhbHRpbWUgc3lzX2xvY2FsdGltZQoKPT09IG1vZGlmaWVkIGZpbGUg J3NyYy9DaGFuZ2VMb2cnCi0tLSBzcmMvQ2hhbmdlTG9nCTIwMTItMTAtMTQgMDA6MTc6MDcg KzAwMDAKKysrIHNyYy9DaGFuZ2VMb2cJMjAxMi0xMC0xNCAxODowNjowMSArMDAwMApAQCAt MSwzICsxLDI3IEBACisyMDEyLTEwLTE0ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEBjcy51Y2xh LmVkdT4KKworCVVzZSBldWlkYWNjZXNzLCBub3QgYWNjZXNzLCB3aGVuIGNoZWNraW5nIGZp bGUgcGVybWlzc2lvbnMgKEJ1ZyMxMjYzMikuCisJKiBNYWtlZmlsZS5pbiAoTElCX0VBQ0NF U1MpOiBOZXcgbWFjcm8uCisJKExJQkVTKTogVXNlIGl0LgorCSogY2FsbHByb2MuYyAoaW5p dF9jYWxscHJvYyk6CisJKiBjaGFyc2V0LmMgKGluaXRfY2hhcnNldCk6CisJKiBmaWxlaW8u YyAoY2hlY2tfZXhpc3RpbmcsIGNoZWNrX2V4ZWN1dGFibGUpOgorCSogbHJlYWQuYyAob3Bl bnAsIGxvYWRfcGF0aF9jaGVjayk6CisJKiBwcm9jZXNzLmMgKGFsbG9jYXRlX3B0eSk6CisJ KiB4cmRiLmMgKGZpbGVfcCk6CisJVXNlIGV1aWRhY2Nlc3MsIG5vdCBhY2Nlc3MuICBVc2Ug c3ltYm9saWMgbmFtZXMgaW5zdGVhZCBvZiBpbnRlZ2VycworCWZvciB0aGUgZmxhZ3MsIGFz IHRoZXkncmUgcG9ydGFibGUgbm93LgorCSogZmlsZWlvLmMgKEZmaWxlX3JlYWRhYmxlX3Ap OgorCVVzZSBldWlkYWNjZXNzLCBub3Qgc3RhdCArIG9wZW4gKyBjbG9zZS4KKwkoZmlsZV9k aXJlY3RvcnlfcCk6IE5ldyBmdW5jdGlvbiwgd2hpY2ggdXNlcyAnc3RhdCcgb24gbW9zdCBw bGFjZXMKKwlidXQgJ2FjY2VzcycgKGZvciBlZmZpY2llbmN5KSBpZiBXSU5ET1dTTlQuCisJ KEZmaWxlX2RpcmVjdG9yeV9wKTogVXNlIGl0LgorCSogbGlzcC5oIChmaWxlX2RpcmVjdG9y eV9wKTogTmV3IGRlY2wuCisJKiBscmVhZC5jIChvcGVucCk6IFdoZW4gb3BlbmluZyBhIGZp bGUsIHVzZSBmc3RhdCByYXRoZXIgdGhhbgorCXN0YXQsIGFzIHRoYXQgYXZvaWRzIGEgcGVy bWlzc2lvbnMgcmFjZS4gIFdoZW4gbm90IG9wZW5pbmcgYSBmaWxlLAorCXVzZSBmaWxlX2Rp cmVjdG9yeV9wIHJhdGhlciB0aGFuIHN0YXQuCisJKiBtc2Rvcy5jIChpbml0X2Vudmlyb25t ZW50LCByZWFkbGluayk6IFVzZSBzeXNfYWNjZXNzLCBub3QgYWNjZXNzLgorCiAyMDEyLTEw LTEzICBKYW4gRGrDpHJ2ICA8amFuLmguZEBzd2lwbmV0LnNlPgogCiAJKiBndGt1dGlsLmMg KHhnX3NldF93aWRnZXRfYmcpOiBEaXZpZGUgYnkgNjU1MzUgKEJ1ZyMxMjYxMikuCgo9PT0g bW9kaWZpZWQgZmlsZSAnc3JjL01ha2VmaWxlLmluJwotLS0gc3JjL01ha2VmaWxlLmluCTIw MTItMTAtMDggMTI6NTM6MTggKzAwMDAKKysrIHNyYy9NYWtlZmlsZS5pbgkyMDEyLTEwLTEz IDAxOjQ5OjQxICswMDAwCkBAIC0xNTAsNiArMTUwLDcgQEAKIE0xN05fRkxUX0xJQlMgPSBA TTE3Tl9GTFRfTElCU0AKIAogTElCX0NMT0NLX0dFVFRJTUU9QExJQl9DTE9DS19HRVRUSU1F QAorTElCX0VBQ0NFU1M9QExJQl9FQUNDRVNTQAogTElCX1RJTUVSX1RJTUU9QExJQl9USU1F Ul9USU1FQAogCiBEQlVTX0NGTEFHUyA9IEBEQlVTX0NGTEFHU0AKQEAgLTM5Miw3ICszOTMs NyBAQAogTElCRVMgPSAkKExJQlMpICQoVzMyX0xJQlMpICQoTElCWF9CQVNFKSAkKExJQklN QUdFKSBcCiAgICAkKExJQlhfT1RIRVIpICQoTElCU09VTkQpIFwKICAgICQoUlNWR19MSUJT KSAkKElNQUdFTUFHSUNLX0xJQlMpICQoTElCX0NMT0NLX0dFVFRJTUUpIFwKLSAgICQoTElC X1RJTUVSX1RJTUUpICQoREJVU19MSUJTKSBcCisgICAkKExJQl9FQUNDRVNTKSAkKExJQl9U SU1FUl9USU1FKSAkKERCVVNfTElCUykgXAogICAgJChMSUJfRVhFQ0lORk8pIFwKICAgICQo TElCWE1MMl9MSUJTKSAkKExJQkdQTSkgJChMSUJSRVNPTFYpICQoTElCU19TWVNURU0pIFwK ICAgICQoTElCU19URVJNQ0FQKSAkKEdFVExPQURBVkdfTElCUykgJChTRVRUSU5HU19MSUJT KSAkKExJQlNFTElOVVhfTElCUykgXAoKPT09IG1vZGlmaWVkIGZpbGUgJ3NyYy9jYWxscHJv Yy5jJwotLS0gc3JjL2NhbGxwcm9jLmMJMjAxMi0wOS0yMyAyMjoyNToyMiArMDAwMAorKysg c3JjL2NhbGxwcm9jLmMJMjAxMi0xMC0xMiAyMzoyODozMSArMDAwMApAQCAtMTU5NywxMyAr MTU5NywxMyBAQAogI2VuZGlmCiAgICAgewogICAgICAgdGVtcGRpciA9IEZkaXJlY3Rvcnlf ZmlsZV9uYW1lIChWZXhlY19kaXJlY3RvcnkpOwotICAgICAgaWYgKGFjY2VzcyAoU1NEQVRB ICh0ZW1wZGlyKSwgMCkgPCAwKQorICAgICAgaWYgKGV1aWRhY2Nlc3MgKFNTREFUQSAodGVt cGRpciksIEZfT0spIDwgMCkKIAlkaXJfd2FybmluZyAoIldhcm5pbmc6IGFyY2gtZGVwZW5k ZW50IGRhdGEgZGlyICglcykgZG9lcyBub3QgZXhpc3QuXG4iLAogCQkgICAgIFZleGVjX2Rp cmVjdG9yeSk7CiAgICAgfQogCiAgIHRlbXBkaXIgPSBGZGlyZWN0b3J5X2ZpbGVfbmFtZSAo VmRhdGFfZGlyZWN0b3J5KTsKLSAgaWYgKGFjY2VzcyAoU1NEQVRBICh0ZW1wZGlyKSwgMCkg PCAwKQorICBpZiAoZXVpZGFjY2VzcyAoU1NEQVRBICh0ZW1wZGlyKSwgRl9PSykgPCAwKQog ICAgIGRpcl93YXJuaW5nICgiV2FybmluZzogYXJjaC1pbmRlcGVuZGVudCBkYXRhIGRpciAo JXMpIGRvZXMgbm90IGV4aXN0LlxuIiwKIAkJIFZkYXRhX2RpcmVjdG9yeSk7CiAKCj09PSBt b2RpZmllZCBmaWxlICdzcmMvY2hhcnNldC5jJwotLS0gc3JjL2NoYXJzZXQuYwkyMDEyLTEw LTAxIDA2OjM2OjU0ICswMDAwCisrKyBzcmMvY2hhcnNldC5jCTIwMTItMTAtMTIgMjM6Mjg6 MzEgKzAwMDAKQEAgLTIyOTMsNyArMjI5Myw3IEBACiB7CiAgIExpc3BfT2JqZWN0IHRlbXBk aXI7CiAgIHRlbXBkaXIgPSBGZXhwYW5kX2ZpbGVfbmFtZSAoYnVpbGRfc3RyaW5nICgiY2hh cnNldHMiKSwgVmRhdGFfZGlyZWN0b3J5KTsKLSAgaWYgKGFjY2VzcyAoU1NEQVRBICh0ZW1w ZGlyKSwgMCkgPCAwKQorICBpZiAoZXVpZGFjY2VzcyAoU1NEQVRBICh0ZW1wZGlyKSwgRl9P SykgIT0gMCkKICAgICB7CiAgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgbm9uLWZhdGFsIChk aXJfd2FybmluZyksIGJ1dCBpdCBzaG91bGQgbm90CiAgICAgICAgICBoYXBwZW4sIGFuZCBp ZiBpdCBkb2VzIHNvb25lciBvciBsYXRlciBpdCB3aWxsIGNhdXNlIHNvbWUKCj09PSBtb2Rp ZmllZCBmaWxlICdzcmMvZmlsZWlvLmMnCi0tLSBzcmMvZmlsZWlvLmMJMjAxMi0xMC0xMyAw ODo1NToyNiArMDAwMAorKysgc3JjL2ZpbGVpby5jCTIwMTItMTAtMTQgMTg6MDY6MDEgKzAw MDAKQEAgLTI0MjQsMTUgKzI0MjQsNyBAQAogYm9vbAogY2hlY2tfZXhpc3RpbmcgKGNvbnN0 IGNoYXIgKmZpbGVuYW1lKQogewotI2lmZGVmIERPU19OVAotICAvKiBUaGUgZnVsbCBlbXVs YXRpb24gb2YgUG9zaXggJ3N0YXQnIGlzIHRvbyBleHBlbnNpdmUgb24KLSAgICAgRE9TL1dp bmRvd3MsIHdoZW4gYWxsIHdlIHdhbnQgdG8ga25vdyBpcyB3aGV0aGVyIHRoZSBmaWxlIGV4 aXN0cy4KLSAgICAgU28gd2UgdXNlICdhY2Nlc3MnIGluc3RlYWQsIHdoaWNoIGlzIG11Y2gg bW9yZSBsaWdodHdlaWdodC4gICovCi0gIHJldHVybiAoYWNjZXNzIChmaWxlbmFtZSwgRl9P SykgPj0gMCk7Ci0jZWxzZQotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgcmV0dXJuIChzdGF0IChm aWxlbmFtZSwgJnN0KSA+PSAwKTsKLSNlbmRpZgorICByZXR1cm4gZXVpZGFjY2VzcyAoZmls ZW5hbWUsIEZfT0spID09IDA7CiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIGZpbGUgRklMRU5B TUUgZXhpc3RzIGFuZCBjYW4gYmUgZXhlY3V0ZWQuICAqLwpAQCAtMjQ0MCwyMSArMjQzMiw3 IEBACiBzdGF0aWMgYm9vbAogY2hlY2tfZXhlY3V0YWJsZSAoY2hhciAqZmlsZW5hbWUpCiB7 Ci0jaWZkZWYgRE9TX05UCi0gIHN0cnVjdCBzdGF0IHN0OwotICBpZiAoc3RhdCAoZmlsZW5h bWUsICZzdCkgPCAwKQotICAgIHJldHVybiAwOwotICByZXR1cm4gKChzdC5zdF9tb2RlICYg U19JRVhFQykgIT0gMCk7Ci0jZWxzZSAvKiBub3QgRE9TX05UICovCi0jaWZkZWYgSEFWRV9F VUlEQUNDRVNTCi0gIHJldHVybiAoZXVpZGFjY2VzcyAoZmlsZW5hbWUsIDEpID49IDApOwot I2Vsc2UKLSAgLyogQWNjZXNzIGlzbid0IHF1aXRlIHJpZ2h0IGJlY2F1c2UgaXQgdXNlcyB0 aGUgcmVhbCB1aWQKLSAgICAgYW5kIHdlIHJlYWxseSB3YW50IHRvIHRlc3Qgd2l0aCB0aGUg ZWZmZWN0aXZlIHVpZC4KLSAgICAgQnV0IFVuaXggZG9lc24ndCBnaXZlIHVzIGEgcmlnaHQg d2F5IHRvIGRvIGl0LiAgKi8KLSAgcmV0dXJuIChhY2Nlc3MgKGZpbGVuYW1lLCAxKSA+PSAw KTsKLSNlbmRpZgotI2VuZGlmIC8qIG5vdCBET1NfTlQgKi8KKyAgcmV0dXJuIGV1aWRhY2Nl c3MgKGZpbGVuYW1lLCBYX09LKSA9PSAwOwogfQogCiAvKiBSZXR1cm4gdHJ1ZSBpZiBmaWxl IEZJTEVOQU1FIGV4aXN0cyBhbmQgY2FuIGJlIHdyaXR0ZW4uICAqLwpAQCAtMjQ2MywxMyAr MjQ0MSwxNCBAQAogY2hlY2tfd3JpdGFibGUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewog I2lmZGVmIE1TRE9TCisgIC8qIEZJWE1FOiBhbiBldWlkYWNjZXNzIGltcGxlbWVudGF0aW9u IHNob3VsZCBiZSBhZGRlZCB0byB0aGUKKyAgICAgRE9TL1dpbmRvd3MgcG9ydHMgYW5kIHRo aXMgI2lmZGVmIGJyYW5jaCBzaG91bGQgYmUgcmVtb3ZlZC4gICovCiAgIHN0cnVjdCBzdGF0 IHN0OwogICBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdCkgPCAwKQogICAgIHJldHVybiAwOwog ICByZXR1cm4gKHN0LnN0X21vZGUgJiBTX0lXUklURSB8fCBTX0lTRElSIChzdC5zdF9tb2Rl KSk7CiAjZWxzZSAvKiBub3QgTVNET1MgKi8KLSNpZmRlZiBIQVZFX0VVSURBQ0NFU1MKLSAg Ym9vbCByZXMgPSAoZXVpZGFjY2VzcyAoZmlsZW5hbWUsIDIpID49IDApOworICBib29sIHJl cyA9IGV1aWRhY2Nlc3MgKGZpbGVuYW1lLCBXX09LKSA9PSAwOwogI2lmZGVmIENZR1dJTgog ICAvKiBldWlkYWNjZXNzIG1heSBoYXZlIHJldHVybmVkIGZhaWx1cmUgYmVjYXVzZSBDeWd3 aW4gY291bGRuJ3QKICAgICAgZGV0ZXJtaW5lIHRoZSBmaWxlJ3MgVUlEIG9yIEdJRDsgaWYg c28sIHdlIHJldHVybiBzdWNjZXNzLiAqLwpAQCAtMjQ4MiwxNCArMjQ2MSw2IEBACiAgICAg fQogI2VuZGlmIC8qIENZR1dJTiAqLwogICByZXR1cm4gcmVzOwotI2Vsc2UgLyogbm90IEhB VkVfRVVJREFDQ0VTUyAqLwotICAvKiBBY2Nlc3MgaXNuJ3QgcXVpdGUgcmlnaHQgYmVjYXVz ZSBpdCB1c2VzIHRoZSByZWFsIHVpZAotICAgICBhbmQgd2UgcmVhbGx5IHdhbnQgdG8gdGVz dCB3aXRoIHRoZSBlZmZlY3RpdmUgdWlkLgotICAgICBCdXQgVW5peCBkb2Vzbid0IGdpdmUg dXMgYSByaWdodCB3YXkgdG8gZG8gaXQuCi0gICAgIE9wZW5pbmcgd2l0aCBPX1dST05MWSBj b3VsZCB3b3JrIGZvciBhbiBvcmRpbmFyeSBmaWxlLAotICAgICBidXQgd291bGQgbG9zZSBm b3IgZGlyZWN0b3JpZXMuICAqLwotICByZXR1cm4gKGFjY2VzcyAoZmlsZW5hbWUsIDIpID49 IDApOwotI2VuZGlmIC8qIG5vdCBIQVZFX0VVSURBQ0NFU1MgKi8KICNlbmRpZiAvKiBub3Qg TVNET1MgKi8KIH0KIApAQCAtMjU0Niw5ICsyNTE3LDYgQEAKIHsKICAgTGlzcF9PYmplY3Qg YWJzbmFtZTsKICAgTGlzcF9PYmplY3QgaGFuZGxlcjsKLSAgaW50IGRlc2M7Ci0gIGludCBm bGFnczsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKIAogICBDSEVDS19TVFJJTkcgKGZpbGVu YW1lKTsKICAgYWJzbmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmaWxlbmFtZSwgUW5pbCk7 CkBAIC0yNTYwLDMxICsyNTI4LDcgQEAKICAgICByZXR1cm4gY2FsbDIgKGhhbmRsZXIsIFFm aWxlX3JlYWRhYmxlX3AsIGFic25hbWUpOwogCiAgIGFic25hbWUgPSBFTkNPREVfRklMRSAo YWJzbmFtZSk7Ci0KLSNpZiBkZWZpbmVkIChET1NfTlQpIHx8IGRlZmluZWQgKG1hY2ludG9z aCkKLSAgLyogVW5kZXIgTVMtRE9TLCBXaW5kb3dzLCBhbmQgTWFjaW50b3NoLCBvcGVuIGRv ZXMgbm90IHdvcmsgZm9yCi0gICAgIGRpcmVjdG9yaWVzLiAgKi8KLSAgaWYgKGFjY2VzcyAo U0RBVEEgKGFic25hbWUpLCAwKSA9PSAwKQotICAgIHJldHVybiBRdDsKLSAgcmV0dXJuIFFu aWw7Ci0jZWxzZSAvKiBub3QgRE9TX05UIGFuZCBub3QgbWFjaW50b3NoICovCi0gIGZsYWdz ID0gT19SRE9OTFk7Ci0jaWZkZWYgT19OT05CTE9DSwotICAvKiBPcGVuaW5nIGEgZmlmbyB3 aXRob3V0IE9fTk9OQkxPQ0sgY2FuIHdhaXQuCi0gICAgIFdlIGRvbid0IHdhbnQgdG8gd2Fp dC4gIEJ1dCB3ZSBkb24ndCB3YW50IHRvIG1lc3Mgd3RoIE9fTk9OQkxPQ0sKLSAgICAgZXhj ZXB0IGluIHRoZSBjYXNlIG9mIGEgZmlmbywgb24gYSBzeXN0ZW0gd2hpY2ggaGFuZGxlcyBp dC4gICovCi0gIGRlc2MgPSBzdGF0IChTU0RBVEEgKGFic25hbWUpLCAmc3RhdGJ1Zik7Ci0g IGlmIChkZXNjIDwgMCkKLSAgICByZXR1cm4gUW5pbDsKLSAgaWYgKFNfSVNGSUZPIChzdGF0 YnVmLnN0X21vZGUpKQotICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0jZW5kaWYKLSAgZGVz YyA9IGVtYWNzX29wZW4gKFNTREFUQSAoYWJzbmFtZSksIGZsYWdzLCAwKTsKLSAgaWYgKGRl c2MgPCAwKQotICAgIHJldHVybiBRbmlsOwotICBlbWFjc19jbG9zZSAoZGVzYyk7Ci0gIHJl dHVybiBRdDsKLSNlbmRpZiAvKiBub3QgRE9TX05UIGFuZCBub3QgbWFjaW50b3NoICovCisg IHJldHVybiBldWlkYWNjZXNzIChTU0RBVEEgKGFic25hbWUpLCBSX09LKSA9PSAwID8gUXQg OiBRbmlsOwogfQogCiAvKiBIYXZpbmcgdGhpcyBiZWZvcmUgZmlsZS1zeW1saW5rLXAgbXlz dGVyaW91c2x5IGNhdXNlZCBpdCB0byBiZSBmb3Jnb3R0ZW4KQEAgLTI2MjEsNyArMjU2NSw3 IEBACiAgIC8qIFRoZSByZWFkLW9ubHkgYXR0cmlidXRlIG9mIHRoZSBwYXJlbnQgZGlyZWN0 b3J5IGRvZXNuJ3QgYWZmZWN0CiAgICAgIHdoZXRoZXIgYSBmaWxlIG9yIGRpcmVjdG9yeSBj YW4gYmUgY3JlYXRlZCB3aXRoaW4gaXQuICBTb21lIGRheSB3ZQogICAgICBzaG91bGQgY2hl Y2sgQUNMcyB0aG91Z2gsIHdoaWNoIGRvIGFmZmVjdCB0aGlzLiAgKi8KLSAgcmV0dXJuIChh Y2Nlc3MgKFNEQVRBIChkaXIpLCBEX09LKSA8IDApID8gUW5pbCA6IFF0OworICByZXR1cm4g ZmlsZV9kaXJlY3RvcnlfcCAoU0RBVEEgKGRpcikpID8gUXQgOiBRbmlsOwogI2Vsc2UKICAg cmV0dXJuIChjaGVja193cml0YWJsZSAoIU5JTFAgKGRpcikgPyBTU0RBVEEgKGRpcikgOiAi IikKIAkgID8gUXQgOiBRbmlsKTsKQEAgLTI3MDIsOCArMjY0Niw3IEBACiBTZWUgYGZpbGUt c3ltbGluay1wJyB0byBkaXN0aW5ndWlzaCBzeW1saW5rcy4gICovKQogICAoTGlzcF9PYmpl Y3QgZmlsZW5hbWUpCiB7Ci0gIHJlZ2lzdGVyIExpc3BfT2JqZWN0IGFic25hbWU7Ci0gIHN0 cnVjdCBzdGF0IHN0OworICBMaXNwX09iamVjdCBhYnNuYW1lOwogICBMaXNwX09iamVjdCBo YW5kbGVyOwogCiAgIGFic25hbWUgPSBleHBhbmRfYW5kX2Rpcl90b19maWxlIChmaWxlbmFt ZSwgQlZBUiAoY3VycmVudF9idWZmZXIsIGRpcmVjdG9yeSkpOwpAQCAtMjcxNiw5ICsyNjU5 LDIwIEBACiAKICAgYWJzbmFtZSA9IEVOQ09ERV9GSUxFIChhYnNuYW1lKTsKIAotICBpZiAo c3RhdCAoU1NEQVRBIChhYnNuYW1lKSwgJnN0KSA8IDApCi0gICAgcmV0dXJuIFFuaWw7Ci0g IHJldHVybiBTX0lTRElSIChzdC5zdF9tb2RlKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJuIGZp bGVfZGlyZWN0b3J5X3AgKFNTREFUQSAoYWJzbmFtZSkpID8gUXQgOiBRbmlsOworfQorCisv KiBSZXR1cm4gdHJ1ZSBpZiBGSUxFIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBh IGRpcmVjdG9yeS4gICovCitib29sCitmaWxlX2RpcmVjdG9yeV9wIChjaGFyIGNvbnN0ICpm aWxlKQoreworI2lmZGVmIFdJTkRPV1NOVAorICAvKiBUaGlzIGlzIGNoZWFwZXIgdGhhbiAn c3RhdCcuICAqLworICByZXR1cm4gZXVpZGFjY2VzcyAoZmlsZSwgRF9PSykgPT0gMDsKKyNl bHNlCisgIHN0cnVjdCBzdGF0IHN0OworICByZXR1cm4gc3RhdCAoZmlsZSwgJnN0KSA9PSAw ICYmIFNfSVNESVIgKHN0LnN0X21vZGUpOworI2VuZGlmCiB9CiAKIERFRlVOICgiZmlsZS1h Y2Nlc3NpYmxlLWRpcmVjdG9yeS1wIiwgRmZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCwK Cj09PSBtb2RpZmllZCBmaWxlICdzcmMvbGlzcC5oJwotLS0gc3JjL2xpc3AuaAkyMDEyLTEw LTEyIDE1OjE5OjU0ICswMDAwCisrKyBzcmMvbGlzcC5oCTIwMTItMTAtMTQgMDY6MDA6NDAg KzAwMDAKQEAgLTMxNzksNiArMzE3OSw3IEBACiBleHRlcm4gTGlzcF9PYmplY3QgcmVzdG9y ZV9wb2ludF91bndpbmQgKExpc3BfT2JqZWN0KTsKIGV4dGVybiBfTm9yZXR1cm4gdm9pZCBy ZXBvcnRfZmlsZV9lcnJvciAoY29uc3QgY2hhciAqLCBMaXNwX09iamVjdCk7CiBleHRlcm4g dm9pZCBpbnRlcm5hbF9kZWxldGVfZmlsZSAoTGlzcF9PYmplY3QpOworZXh0ZXJuIGJvb2wg ZmlsZV9kaXJlY3RvcnlfcCAoY29uc3QgY2hhciAqKTsKIGV4dGVybiB2b2lkIHN5bXNfb2Zf ZmlsZWlvICh2b2lkKTsKIGV4dGVybiBMaXNwX09iamVjdCBtYWtlX3RlbXBfbmFtZSAoTGlz cF9PYmplY3QsIGJvb2wpOwogZXh0ZXJuIExpc3BfT2JqZWN0IFFkZWxldGVfZmlsZTsKCj09 PSBtb2RpZmllZCBmaWxlICdzcmMvbHJlYWQuYycKLS0tIHNyYy9scmVhZC5jCTIwMTItMTAt MTIgMTU6MTk6NTQgKzAwMDAKKysrIHNyYy9scmVhZC5jCTIwMTItMTAtMTQgMDY6MDA6NDAg KzAwMDAKQEAgLTE0MDQsNyArMTQwNCw3IEBACiBJZiBTVUZGSVhFUyBpcyBub24tbmlsLCBp dCBzaG91bGQgYmUgYSBsaXN0IG9mIHN1ZmZpeGVzIHRvIGFwcGVuZCB0bwogZmlsZSBuYW1l IHdoZW4gc2VhcmNoaW5nLgogSWYgbm9uLW5pbCwgUFJFRElDQVRFIGlzIHVzZWQgaW5zdGVh ZCBvZiBgZmlsZS1yZWFkYWJsZS1wJy4KLVBSRURJQ0FURSBjYW4gYWxzbyBiZSBhbiBpbnRl Z2VyIHRvIHBhc3MgdG8gdGhlIGFjY2VzcygyKSBmdW5jdGlvbiwKK1BSRURJQ0FURSBjYW4g YWxzbyBiZSBhbiBpbnRlZ2VyIHRvIHBhc3MgdG8gdGhlIGV1aWRhY2Nlc3MoMikgZnVuY3Rp b24sCiBpbiB3aGljaCBjYXNlIGZpbGUtbmFtZS1oYW5kbGVycyBhcmUgaWdub3JlZC4KIFRo aXMgZnVuY3Rpb24gd2lsbCBub3JtYWxseSBza2lwIGRpcmVjdG9yaWVzLCBzbyBpZiB5b3Ug d2FudCBpdCB0byBmaW5kCiBkaXJlY3RvcmllcywgbWFrZSBzdXJlIHRoZSBQUkVESUNBVEUg ZnVuY3Rpb24gcmV0dXJucyBgZGlyLW9rJyBmb3IgdGhlbS4gICovKQpAQCAtMTQ0Miw3ICsx NDQyLDYgQEAKIGludAogb3BlbnAgKExpc3BfT2JqZWN0IHBhdGgsIExpc3BfT2JqZWN0IHN0 ciwgTGlzcF9PYmplY3Qgc3VmZml4ZXMsIExpc3BfT2JqZWN0ICpzdG9yZXB0ciwgTGlzcF9P YmplY3QgcHJlZGljYXRlKQogewotICBpbnQgZmQ7CiAgIHB0cmRpZmZfdCBmbl9zaXplID0g MTAwOwogICBjaGFyIGJ1ZlsxMDBdOwogICBjaGFyICpmbiA9IGJ1ZjsKQEAgLTE0OTcsNyAr MTQ5Niw2IEBACiAJewogCSAgcHRyZGlmZl90IGZubGVuLCBsc3VmZml4ID0gU0JZVEVTIChY Q0FSICh0YWlsKSk7CiAJICBMaXNwX09iamVjdCBoYW5kbGVyOwotCSAgYm9vbCBleGlzdHM7 CiAKIAkgIC8qIENvbmNhdGVuYXRlIHBhdGggZWxlbWVudC9zcGVjaWZpZWQgbmFtZSB3aXRo IHRoZSBzdWZmaXguCiAJICAgICBJZiB0aGUgZGlyZWN0b3J5IHN0YXJ0cyB3aXRoIC86LCBy ZW1vdmUgdGhhdC4gICovCkBAIC0xNTIxLDYgKzE1MTksNyBAQAogCSAgaGFuZGxlciA9IEZm aW5kX2ZpbGVfbmFtZV9oYW5kbGVyIChzdHJpbmcsIFFmaWxlX2V4aXN0c19wKTsKIAkgIGlm ICgoIU5JTFAgKGhhbmRsZXIpIHx8ICFOSUxQIChwcmVkaWNhdGUpKSAmJiAhTkFUTlVNUCAo cHJlZGljYXRlKSkKICAgICAgICAgICAgIHsKKwkgICAgICBib29sIGV4aXN0czsKIAkgICAg ICBpZiAoTklMUCAocHJlZGljYXRlKSkKIAkJZXhpc3RzID0gIU5JTFAgKEZmaWxlX3JlYWRh YmxlX3AgKHN0cmluZykpOwogCSAgICAgIGVsc2UKQEAgLTE1NDIsMzcgKzE1NDEsMzggQEAK IAkgICAgfQogCSAgZWxzZQogCSAgICB7Ci0jaWZuZGVmIFdJTkRPV1NOVAotCSAgICAgIHN0 cnVjdCBzdGF0IHN0OwotI2VuZGlmCisJICAgICAgaW50IGZkOwogCSAgICAgIGNvbnN0IGNo YXIgKnBmbjsKIAogCSAgICAgIGVuY29kZWRfZm4gPSBFTkNPREVfRklMRSAoc3RyaW5nKTsK IAkgICAgICBwZm4gPSBTU0RBVEEgKGVuY29kZWRfZm4pOwotI2lmZGVmIFdJTkRPV1NOVAot CSAgICAgIGV4aXN0cyA9IGFjY2VzcyAocGZuLCBGX09LKSA9PSAwICYmIGFjY2VzcyAocGZu LCBEX09LKSA8IDA7Ci0jZWxzZQotCSAgICAgIGV4aXN0cyA9IChzdGF0IChwZm4sICZzdCkg PT0gMCAmJiAhIFNfSVNESVIgKHN0LnN0X21vZGUpKTsKLSNlbmRpZgotCSAgICAgIGlmIChl eGlzdHMpCisKKwkgICAgICAvKiBDaGVjayB0aGF0IHdlIGNhbiBhY2Nlc3Mgb3Igb3BlbiBp dC4gICovCisJICAgICAgaWYgKE5BVE5VTVAgKHByZWRpY2F0ZSkpCisJCWZkID0gKCgoWEZB U1RJTlQgKHByZWRpY2F0ZSkgJiB+SU5UX01BWCkgPT0gMAorCQkgICAgICAgJiYgZXVpZGFj Y2VzcyAocGZuLCBYRkFTVElOVCAocHJlZGljYXRlKSkgPT0gMAorCQkgICAgICAgJiYgISBm aWxlX2RpcmVjdG9yeV9wIChwZm4pKQorCQkgICAgICA/IDEgOiAtMSk7CisJICAgICAgZWxz ZQogCQl7Ci0JCSAgLyogQ2hlY2sgdGhhdCB3ZSBjYW4gYWNjZXNzIG9yIG9wZW4gaXQuICAq LwotCQkgIGlmIChOQVROVU1QIChwcmVkaWNhdGUpKQotCQkgICAgZmQgPSAoKChYRkFTVElO VCAocHJlZGljYXRlKSAmIH5JTlRfTUFYKSA9PSAwCi0JCQkgICAmJiBhY2Nlc3MgKHBmbiwg WEZBU1RJTlQgKHByZWRpY2F0ZSkpID09IDApCi0JCQkgID8gMSA6IC0xKTsKLQkJICBlbHNl Ci0JCSAgICBmZCA9IGVtYWNzX29wZW4gKHBmbiwgT19SRE9OTFksIDApOwotCi0JCSAgaWYg KGZkID49IDApCisJCSAgc3RydWN0IHN0YXQgc3Q7CisJCSAgZmQgPSBlbWFjc19vcGVuIChw Zm4sIE9fUkRPTkxZLCAwKTsKKwkJICBpZiAoMCA8PSBmZAorCQkgICAgICAmJiAoZnN0YXQg KGZkLCAmc3QpICE9IDAgfHwgU19JU0RJUiAoc3Quc3RfbW9kZSkpKQogCQkgICAgewotCQkg ICAgICAvKiBXZSBzdWNjZWVkZWQ7IHJldHVybiB0aGlzIGRlc2NyaXB0b3IgYW5kIGZpbGVu YW1lLiAgKi8KLQkJICAgICAgaWYgKHN0b3JlcHRyKQotCQkJKnN0b3JlcHRyID0gc3RyaW5n OwotCQkgICAgICBVTkdDUFJPOwotCQkgICAgICByZXR1cm4gZmQ7CisJCSAgICAgIGVtYWNz X2Nsb3NlIChmZCk7CisJCSAgICAgIGZkID0gLTE7CiAJCSAgICB9CiAJCX0KKworCSAgICAg IGlmIChmZCA+PSAwKQorCQl7CisJCSAgLyogV2Ugc3VjY2VlZGVkOyByZXR1cm4gdGhpcyBk ZXNjcmlwdG9yIGFuZCBmaWxlbmFtZS4gICovCisJCSAgaWYgKHN0b3JlcHRyKQorCQkgICAg KnN0b3JlcHRyID0gc3RyaW5nOworCQkgIFVOR0NQUk87CisJCSAgcmV0dXJuIGZkOworCQl9 CiAJICAgIH0KIAl9CiAgICAgICBpZiAoYWJzb2x1dGUpCkBAIC00MDg4LDcgKzQwODgsNyBA QAogICAgICAgaWYgKFNUUklOR1AgKGRpcmZpbGUpKQogICAgICAgICB7CiAgICAgICAgICAg ZGlyZmlsZSA9IEZkaXJlY3RvcnlfZmlsZV9uYW1lIChkaXJmaWxlKTsKLSAgICAgICAgICBp ZiAoYWNjZXNzIChTU0RBVEEgKGRpcmZpbGUpLCAwKSA8IDApCisgICAgICAgICAgaWYgKGV1 aWRhY2Nlc3MgKFNTREFUQSAoZGlyZmlsZSksIEZfT0spICE9IDApCiAgICAgICAgICAgICBk aXJfd2FybmluZyAoIldhcm5pbmc6IExpc3AgZGlyZWN0b3J5IGAlcycgZG9lcyBub3QgZXhp c3QuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIFhDQVIgKHBhdGhfdGFpbCkpOwog ICAgICAgICB9Cgo9PT0gbW9kaWZpZWQgZmlsZSAnc3JjL21zZG9zLmMnCi0tLSBzcmMvbXNk b3MuYwkyMDEyLTA5LTIzIDA4OjQ0OjIwICswMDAwCisrKyBzcmMvbXNkb3MuYwkyMDEyLTEw LTE0IDE4OjA2OjAxICswMDAwCkBAIC0zNTU3LDcgKzM1NTcsNyBAQAogCSByZWFkLW9ubHkg ZmlsZXN5c3RlbSwgbGlrZSBDRC1ST00gb3IgYSB3cml0ZS1wcm90ZWN0ZWQgZmxvcHB5Lgog CSBUaGUgb25seSB3YXkgdG8gYmUgcmVhbGx5IHN1cmUgaXMgdG8gYWN0dWFsbHkgY3JlYXRl IGEgZmlsZSBhbmQKIAkgc2VlIGlmIGl0IHN1Y2NlZWRzLiAgQnV0IEkgdGhpbmsgdGhhdCdz IHRvbyBtdWNoIHRvIGFzay4gICovCi0gICAgICBpZiAodG1wICYmIGFjY2VzcyAodG1wLCBE X09LKSA9PSAwKQorICAgICAgaWYgKHRtcCAmJiBzeXNfYWNjZXNzICh0bXAsIERfT0spID09 IDApCiAJewogCSAgc2V0ZW52ICgiVE1QRElSIiwgdG1wLCAxKTsKIAkgIGJyZWFrOwpAQCAt MzkzNSw3ICszOTM1LDcgQEAKIHJlYWRsaW5rIChjb25zdCBjaGFyICpuYW1lLCBjaGFyICpk dW1teTEsIHNpemVfdCBkdW1teTIpCiB7CiAgIC8qIGBhY2Nlc3MnIGlzIG11Y2ggZmFzdGVy IHRoYW4gYHN0YXQnIG9uIE1TLURPUy4gICovCi0gIGlmIChhY2Nlc3MgKG5hbWUsIEZfT0sp ID09IDApCisgIGlmIChzeXNfYWNjZXNzIChuYW1lLCBGX09LKSA9PSAwKQogICAgIGVycm5v ID0gRUlOVkFMOwogICByZXR1cm4gLTE7CiB9Cgo9PT0gbW9kaWZpZWQgZmlsZSAnc3JjL3By b2Nlc3MuYycKLS0tIHNyYy9wcm9jZXNzLmMJMjAxMi0xMC0xMyAwMDo1MjowMSArMDAwMAor Kysgc3JjL3Byb2Nlc3MuYwkyMDEyLTEwLTEzIDAwOjU1OjIwICswMDAwCkBAIC02NjMsNyAr NjYzLDcgQEAKICNlbHNlCiAJICAgIHNwcmludGYgKHB0eV9uYW1lLCAiL2Rldi90dHklYyV4 IiwgYywgaSk7CiAjZW5kaWYgLyogbm8gUFRZX1RUWV9OQU1FX1NQUklOVEYgKi8KLQkgICAg aWYgKGFjY2VzcyAocHR5X25hbWUsIDYpICE9IDApCisJICAgIGlmIChldWlkYWNjZXNzIChw dHlfbmFtZSwgUl9PSyB8IFdfT0spICE9IDApCiAJICAgICAgewogCQllbWFjc19jbG9zZSAo ZmQpOwogIyBpZm5kZWYgX19zZ2kKCj09PSBtb2RpZmllZCBmaWxlICdzcmMveHJkYi5jJwot LS0gc3JjL3hyZGIuYwkyMDEyLTA5LTE1IDA3OjA2OjU2ICswMDAwCisrKyBzcmMveHJkYi5j CTIwMTItMTAtMTIgMjM6Mjg6MzEgKzAwMDAKQEAgLTI2OCw3ICsyNjgsNyBAQAogewogICBz dHJ1Y3Qgc3RhdCBzdGF0dXM7CiAKLSAgcmV0dXJuIChhY2Nlc3MgKGZpbGVuYW1lLCA0KSA9 PSAwICAgICAgICAgICAgIC8qIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUgKi8KKyAgcmV0dXJu IChldWlkYWNjZXNzIChmaWxlbmFtZSwgUl9PSykgPT0gMCAgICAgIC8qIGV4aXN0cyBhbmQg aXMgcmVhZGFibGUgKi8KIAkgICYmIHN0YXQgKGZpbGVuYW1lLCAmc3RhdHVzKSA9PSAwCS8q IGdldCB0aGUgc3RhdHVzICovCiAJICAmJiAoU19JU0RJUiAoc3RhdHVzLnN0X21vZGUpKSA9 PSAwKTsJLyogbm90IGEgZGlyZWN0b3J5ICovCiB9Cgo= --------------050908060507070408020208--