From mboxrd@z Thu Jan 1 00:00:00 1970 From: teemu@torma.org To: gcc-gnats@gcc.gnu.org Subject: c++/3121: ICE whilst compiling omniORB Date: Mon, 11 Jun 2001 04:06:00 -0000 Message-id: <20010611110511.2370.qmail@sourceware.cygnus.com> X-SW-Source: 2001-06/msg00399.html List-Id: >Number: 3121 >Category: c++ >Synopsis: ICE whilst compiling omniORB >Confidential: no >Severity: critical >Priority: high >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Mon Jun 11 04:06:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: teemu@torma.org >Release: 3.0 20010611 >Organization: >Environment: i686-redhat-linux (RedHat 6.2) >Description: Internal compiler error whilst compiling omniORB 3. This is new, it did not exists last week's version, and is regression from 2.95.2. >How-To-Repeat: $ /usr/local/gcc3/bin/g++ -v -c -g -mcpu=i686 -march=i686 -g -D_GNU_SOURCE -D_REENTRANT -DSVR4 -DPOSIX -DLINUX -D_REENTRANT -I. -I./.. -I./../.. -DUSE_omniORB_logStream -D_OMNIORB_LIBRARY -I. -I../../../../include -D__x86__ -D__linux__ -D__OSVERSION__=2 -o portableserver.o portableserver.cc Reading specs from /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/specs Configured with: ../gcc-3.0-branch/configure --with-gcc-version-trigger=/work/tot/gcc/3.0/gcc-3.0-branch/gcc/version.c --host=i686-pc-linux-gnu --prefix=/usr/local/gcc3 --enable-version-specific-runtime-libs --enable-long-long --enable-threads Thread model: posix gcc version 3.0 20010611 (prerelease) /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/cc1plus -v -I. -I./.. -I./../.. -I. -I../../../../include -D__GNUC__=3 -D__GNUC_MINOR__=0 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ -D__tune_i686__ -D__tune_pentiumpro__ -D_GNU_SOURCE -D_REENTRANT -DSVR4 -DPOSIX -DLINUX -D_REENTRANT -DUSE_omniORB_logStream -D_OMNIORB_LIBRARY -D__x86__ -D__linux__ -D__OSVERSION__=2 portableserver.cc -D__GNUG__=3 -D__GXX_DEPRECATED -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -quiet -dumpbase portableserver.cc -mcpu=i686 -march=i686 -g -g -version -o /tmp/ccxcMqd0.s GNU CPP version 3.0 20010611 (prerelease) (cpplib) (i386 Linux/ELF) GNU C++ version 3.0 20010611 (prerelease) (i686-pc-linux-gnu) compiled by GNU C version 3.0 20010611 (prerelease). ignoring duplicate directory "." #include "..." search starts here: #include <...> search starts here: . .. ../.. ../../../../include /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/include/g++ /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/include/g++/i686-pc-linux-gnu /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/include/g++/backward /usr/local/include /usr/local/gcc3/lib/gcc-lib/i686-pc-linux-gnu/3.0/include /usr/local/gcc3/i686-pc-linux-gnu/include /usr/include End of search list. In file included from ../../../../include/omniORB3/CORBA.h:2653, from portableserver.cc:78: ../omniORB3/ir_poa.hh:107: Internal error #20010126. ../omniORB3/ir_poa.hh:107: Internal compiler error in dfs_accumulate_vtbl_inits , at cp/class.c:7620 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/x-csrc; name="portableserver.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="portableserver.ii" IyA3OCAicG9ydGFibGVzZXJ2ZXIuY2MiCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JC My9DT1JCQS5oIiAxCiMgMjU1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgi CiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIgMQojIDEz OSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIKIyAxICIvdXNy L2xvY2FsL2djYzMvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvc3Rk ZGVmLmgiIDEgMwojIDE0NyAiL3Vzci9sb2NhbC9nY2MzL2xpYi9nY2MtbGliL2k2ODYtcGMtbGlu dXgtZ251LzMuMC9pbmNsdWRlL3N0ZGRlZi5oIiAzCnR5cGVkZWYgaW50IHB0cmRpZmZfdDsKIyAx OTkgIi91c3IvbG9jYWwvZ2NjMy9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5j bHVkZS9zdGRkZWYuaCIgMwp0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7CiMgMTQwICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyCgoKIyAxICIvdXNyL2lu Y2x1ZGUvc3RyaW5ncy5oIiAxIDMKIyAyMiAiL3Vzci9pbmNsdWRlL3N0cmluZ3MuaCIgMwojIDEg Ii91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAyNTAgIi91c3IvaW5jbHVkZS9mZWF0dXJl cy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIiAxIDMKIyAyNTEgIi91c3IvaW5j bHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAyNzggIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMg MSAiL3Vzci9pbmNsdWRlL2dudS9zdHVicy5oIiAxIDMKIyAyNzkgIi91c3IvaW5jbHVkZS9mZWF0 dXJlcy5oIiAyIDMKIyAyMyAiL3Vzci9pbmNsdWRlL3N0cmluZ3MuaCIgMiAzCgojIDEgIi91c3Iv bG9jYWwvZ2NjMy9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRk ZWYuaCIgMSAzCiMgMjUgIi91c3IvaW5jbHVkZS9zdHJpbmdzLmgiIDIgMwoKZXh0ZXJuICJDIiB7 CgoKZXh0ZXJuIGludCBiY21wIChfX2NvbnN0IHZvaWQgKiBfX3MxLCBfX2NvbnN0IHZvaWQgKiBf X3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBiY29weSAoX19jb25zdCB2 b2lkICogX19zcmMsIHZvaWQgKiBfX2Rlc3QsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCmV4dGVy biB2b2lkIGJ6ZXJvICh2b2lkICogX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJu IGludCBmZnMgKGludCBfX2kpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICppbmRleCAoX19jb25z dCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpyaW5kZXggKF9f Y29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHN0cmNhc2Vj bXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKSB0aHJvdyAoKTsKCgpl eHRlcm4gaW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAq X19zMiwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKfQojIDE0MyAiLi4vLi4vLi4vLi4vaW5jbHVk ZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIgMgojIDEgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIg MSAzCiMgMjYgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0 dXJlcy5oIiAxIDMKIyAyNyAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAyIDMKCmV4dGVybiAiQyIg ewoKCgoKIyAxICIvdXNyL2xvY2FsL2djYzMvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUv My4wL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM0ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDIg MwoKCgpleHRlcm4gdm9pZCAqIG1lbWNweSAodm9pZCAqIF9fcmVzdHJpY3QgX19kZXN0LCBfX2Nv bnN0IHZvaWQgKiBfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0 ZXJuIHZvaWQgKiBtZW1tb3ZlICh2b2lkICogX19kZXN0LCBfX2NvbnN0IHZvaWQgKiBfX3NyYywg c2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiB2b2lkICogbWVtY2NweSAodm9pZCAq IF9fZGVzdCwgX19jb25zdCB2b2lkICogX19zcmMsIGludCBfX2MsIHNpemVfdCBfX24pIHRocm93 ICgpOwoKCgoKCmV4dGVybiB2b2lkICogbWVtc2V0ICh2b2lkICogX19zLCBpbnQgX19jLCBzaXpl X3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IG1lbWNtcCAoX19jb25zdCB2b2lkICogX19z MSwgX19jb25zdCB2b2lkICogX19zMiwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiB2 b2lkICogbWVtY2hyIChfX2NvbnN0IHZvaWQgKiBfX3MsIGludCBfX2MsIHNpemVfdCBfX24pIHRo cm93ICgpOwoKCgoKZXh0ZXJuIHZvaWQgKiByYXdtZW1jaHIgKF9fY29uc3Qgdm9pZCAqIF9fcywg aW50IF9fYykgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAqc3RyY3B5IChjaGFyICpfX3Jlc3Ry aWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSB0aHJvdyAoKTsKCgpl eHRlcm4gY2hhciAqc3RybmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiBjaGFy ICpzdHJjYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19zcmMpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpzdHJuY2F0IChjaGFyICpfX3Jlc3Ry aWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0 aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBzdHJjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25z dCBjaGFyICpfX3MyKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgc3RybmNtcCAoX19jb25zdCBjaGFy ICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCmV4dGVy biBpbnQgc3RyY29sbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpIHRo cm93ICgpOwoKZXh0ZXJuIHNpemVfdCBzdHJ4ZnJtIChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwg X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoK CgoKIyAxICIvdXNyL2luY2x1ZGUveGxvY2FsZS5oIiAxIDMKIyAyOCAiL3Vzci9pbmNsdWRlL3hs b2NhbGUuaCIgMwp0eXBlZGVmIHN0cnVjdCBfX2xvY2FsZV9zdHJ1Y3QKewogIHN0cnVjdCBsb2Nh bGVfZGF0YSAqX19sb2NhbGVzWzZdOwoKCiAgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICpfX2N0 eXBlX2I7CiAgY29uc3QgaW50ICpfX2N0eXBlX3RvbG93ZXI7CiAgY29uc3QgaW50ICpfX2N0eXBl X3RvdXBwZXI7Cn0gKl9fbG9jYWxlX3Q7CiMgMTAwICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDIg MwoKCmV4dGVybiBpbnQgX19zdHJjb2xsX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBj aGFyICpfX3MyLCBfX2xvY2FsZV90IF9fbCkgdGhyb3cgKCk7CgoKZXh0ZXJuIHNpemVfdCBfX3N0 cnhmcm1fbCAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uLCBf X2xvY2FsZV90IF9fbCkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGNoYXIgKl9fc3RyZHVwIChfX2Nv bnN0IGNoYXIgKl9fcykgdGhyb3cgKCk7CmV4dGVybiBjaGFyICpzdHJkdXAgKF9fY29uc3QgY2hh ciAqX19zKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGNoYXIgKnN0cm5kdXAgKF9fY29uc3QgY2hh ciAqX19zdHJpbmcsIHNpemVfdCBfX24pIHRocm93ICgpOwojIDE0NiAiL3Vzci9pbmNsdWRlL3N0 cmluZy5oIiAzCmV4dGVybiBjaGFyICpzdHJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpzdHJyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50 IF9fYykgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAqc3RyY2hybnVsIChfX2NvbnN0IGNoYXIg Kl9fcywgaW50IF9fYykgdGhyb3cgKCk7CgoKCgpleHRlcm4gc2l6ZV90IHN0cmNzcG4gKF9fY29u c3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KSB0aHJvdyAoKTsKCgpleHRlcm4g c2l6ZV90IHN0cnNwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQp IHRocm93ICgpOwoKZXh0ZXJuIGNoYXIgKnN0cnBicmsgKF9fY29uc3QgY2hhciAqX19zLCBfX2Nv bnN0IGNoYXIgKl9fYWNjZXB0KSB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpzdHJzdHIgKF9fY29u c3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgdGhyb3cgKCk7CgoK CmV4dGVybiBjaGFyICpfX3N0cmNhc2VzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19j b25zdCBjaGFyICpfX25lZWRsZSkgdGhyb3cgKCk7CgpleHRlcm4gY2hhciAqc3RyY2FzZXN0ciAo X19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKSB0aHJvdyAo KTsKCgoKCmV4dGVybiBjaGFyICpzdHJ0b2sgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAqX19z dHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2RlbGltLCBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSB0aHJvdyAoKTsKCgoKZXh0ZXJu IGNoYXIgKnN0cnRva19yIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fZGVsaW0sIGNoYXIgKipfX3Jlc3RyaWN0IF9fc2F2ZV9wdHIpIHRocm93ICgpOwoj IDE5NCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCmV4dGVybiB2b2lkICogbWVtbWVtIChfX2Nv bnN0IHZvaWQgKiBfX2hheXN0YWNrLCBzaXplX3QgX19oYXlzdGFja2xlbiwgX19jb25zdCB2b2lk ICogX19uZWVkbGUsIHNpemVfdCBfX25lZWRsZWxlbikgdGhyb3cgKCk7CgoKCgpleHRlcm4gdm9p ZCAqIF9fbWVtcGNweSAodm9pZCAqIF9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKiBf X3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCmV4dGVybiB2b2lkICogbWVt cGNweSAodm9pZCAqIF9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKiBfX3Jlc3RyaWN0 IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gc2l6ZV90IHN0cmxlbiAo X19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpOwoKCgoKZXh0ZXJuIHNpemVfdCBzdHJubGVuIChf X2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3QgX19tYXhsZW4pIHRocm93ICgpOwoKCgoKZXh0 ZXJuIGNoYXIgKnN0cmVycm9yIChpbnQgX19lcnJudW0pIHRocm93ICgpOwoKCgpleHRlcm4gY2hh ciAqX19zdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZs ZW4pIHRocm93ICgpOwpleHRlcm4gY2hhciAqc3RyZXJyb3JfciAoaW50IF9fZXJybnVtLCBjaGFy ICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSB0aHJvdyAoKTsKCgoKCmV4dGVybiB2b2lkIF9fYnpl cm8gKHZvaWQgKiBfX3MsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCBiY29w eSAoX19jb25zdCB2b2lkICogX19zcmMsIHZvaWQgKiBfX2Rlc3QsIHNpemVfdCBfX24pIHRocm93 ICgpOwoKCmV4dGVybiB2b2lkIGJ6ZXJvICh2b2lkICogX19zLCBzaXplX3QgX19uKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqIF9fczEsIF9fY29uc3Qgdm9pZCAq IF9fczIsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICppbmRleCAoX19jb25z dCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpyaW5kZXggKF9f Y29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfX2ZmcyAo aW50IF9faSkgdGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CmV4dGVybiBpbnQgZmZz IChpbnQgX19pKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKCgoKCmV4dGVybiBp bnQgZmZzbCAobG9uZyBpbnQgX19sKSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsK Cl9fZXh0ZW5zaW9uX18gZXh0ZXJuIGludCBmZnNsbCAobG9uZyBsb25nIGludCBfX2xsKSB0aHJv dyAoKQogICAgIF9fYXR0cmlidXRlX18gKChjb25zdCkpOwoKCgoKZXh0ZXJuIGludCBfX3N0cmNh c2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKSB0aHJvdyAoKTsK ZXh0ZXJuIGludCBzdHJjYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAq X19zMikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoX19jb25zdCBjaGFyICpf X3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgoKCgpleHRl cm4gaW50IF9fc3RyY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAq X19zMiwgX19sb2NhbGVfdCBfX2xvYykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3N0cm5jYXNl Y21wX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBzaXplX3QgX19u LCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGNoYXIgKnN0cnNlcCAo Y2hhciAqKl9fcmVzdHJpY3QgX19zdHJpbmdwLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19k ZWxpbSkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGludCBzdHJ2ZXJzY21wIChfX2NvbnN0IGNoYXIg Kl9fczEsIF9fY29uc3QgY2hhciAqX19zMikgdGhyb3cgKCk7CgoKZXh0ZXJuIGNoYXIgKnN0cnNp Z25hbCAoaW50IF9fc2lnKSB0aHJvdyAoKTsKCgpleHRlcm4gY2hhciAqX19zdHBjcHkgKGNoYXIg Kl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpIHRocm93 ICgpOwoKZXh0ZXJuIGNoYXIgKnN0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29u c3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAqX19z dHBuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpzdHBuY3B5IChjaGFy ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXpl X3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGNoYXIgKnN0cmZyeSAoY2hhciAqX19zdHJpbmcp IHRocm93ICgpOwoKCmV4dGVybiB2b2lkICogbWVtZnJvYiAodm9pZCAqIF9fcywgc2l6ZV90IF9f bikgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBjaGFyICpiYXNlbmFtZSAoX19jb25zdCBjaGFyICpf X2ZpbGVuYW1lKSB0aHJvdyAoKTsKIyAzNTAgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwp9CiMg MTQ0ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyCgoKCiMg MSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pdGhyZWFkLmgiIDEKIyA0MiAiLi4vLi4vLi4vLi4v aW5jbHVkZS9vbW5pdGhyZWFkLmgiCmNsYXNzIG9tbmlfbXV0ZXg7CmNsYXNzIG9tbmlfY29uZGl0 aW9uOwpjbGFzcyBvbW5pX3NlbWFwaG9yZTsKY2xhc3Mgb21uaV90aHJlYWQ7CiMgMTMwICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbml0aHJlYWQuaCIKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29t bml0aHJlYWQvcG9zaXguaCIgMQojIDM4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbml0aHJlYWQv cG9zaXguaCIKIyAxICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAxIDMKIyAxOCAiL3Vzci9pbmNs dWRlL3B0aHJlYWQuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAxOSAi L3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgojIDEgIi91c3IvaW5jbHVkZS9zY2hlZC5oIiAx IDMKIyAyMyAiL3Vzci9pbmNsdWRlL3NjaGVkLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVy ZXMuaCIgMSAzCiMgMjQgIi91c3IvaW5jbHVkZS9zY2hlZC5oIiAyIDMKCgojIDEgIi91c3IvaW5j bHVkZS9iaXRzL3R5cGVzLmgiIDEgMwojIDI2ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAz CiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwojIDI3ICIvdXNyL2luY2x1ZGUvYml0 cy90eXBlcy5oIiAyIDMKCgojIDEgIi91c3IvbG9jYWwvZ2NjMy9saWIvZ2NjLWxpYi9pNjg2LXBj LWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzAgIi91c3IvaW5jbHVkZS9i aXRzL3R5cGVzLmgiIDIgMwoKCnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VfY2hhcjsKdHlwZWRl ZiB1bnNpZ25lZCBzaG9ydCBfX3Vfc2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9fdV9pbnQ7 CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VfbG9uZzsKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1 bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdV9xdWFkX3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBs b25nIGxvbmcgaW50IF9fcXVhZF90OwojIDQ5ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAz CnR5cGVkZWYgc2lnbmVkIGNoYXIgX19pbnQ4X3Q7CnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3Vp bnQ4X3Q7CnR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBfX2ludDE2X3Q7CnR5cGVkZWYgdW5zaWdu ZWQgc2hvcnQgaW50IF9fdWludDE2X3Q7CnR5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7CnR5 cGVkZWYgdW5zaWduZWQgaW50IF9fdWludDMyX3Q7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgc2ln bmVkIGxvbmcgbG9uZyBpbnQgX19pbnQ2NF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWdu ZWQgbG9uZyBsb25nIGludCBfX3VpbnQ2NF90OwoKdHlwZWRlZiBfX3F1YWRfdCAqX19xYWRkcl90 OwoKdHlwZWRlZiBfX3VfcXVhZF90IF9fZGV2X3Q7CnR5cGVkZWYgX191X2ludCBfX3VpZF90Owp0 eXBlZGVmIF9fdV9pbnQgX19naWRfdDsKdHlwZWRlZiBfX3VfbG9uZyBfX2lub190Owp0eXBlZGVm IF9fdV9pbnQgX19tb2RlX3Q7CnR5cGVkZWYgX191X2ludCBfX25saW5rX3Q7CnR5cGVkZWYgbG9u ZyBpbnQgX19vZmZfdDsKdHlwZWRlZiBfX3F1YWRfdCBfX2xvZmZfdDsKdHlwZWRlZiBpbnQgX19w aWRfdDsKdHlwZWRlZiBpbnQgX19zc2l6ZV90Owp0eXBlZGVmIGxvbmcgaW50IF9fcmxpbV90Owp0 eXBlZGVmIF9fcXVhZF90IF9fcmxpbTY0X3Q7CnR5cGVkZWYgX191X2ludCBfX2lkX3Q7Cgp0eXBl ZGVmIHN0cnVjdAogIHsKICAgIGludCBfX3ZhbFsyXTsKICB9IF9fZnNpZF90OwoKCnR5cGVkZWYg aW50IF9fZGFkZHJfdDsKdHlwZWRlZiBjaGFyICpfX2NhZGRyX3Q7CnR5cGVkZWYgbG9uZyBpbnQg X190aW1lX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19zd2Jsa190OwoKdHlwZWRlZiBsb25nIGludCBf X2Nsb2NrX3Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2ZkX21hc2s7CiMgMTAwICIv dXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAzCnR5cGVkZWYgc3RydWN0CiAgewoKCgogICAgX19m ZF9tYXNrIGZkc19iaXRzWzEwMjQgLyAoOCAqIHNpemVvZiAoX19mZF9tYXNrKSldOwoKCgoKCiAg fSBfX2ZkX3NldDsKCgp0eXBlZGVmIGludCBfX2tleV90OwoKCnR5cGVkZWYgdW5zaWduZWQgc2hv cnQgaW50IF9faXBjX3BpZF90OwoKCgoKCnR5cGVkZWYgbG9uZyBpbnQgX19ibGtjbnRfdDsKdHlw ZWRlZiBfX3F1YWRfdCBfX2Jsa2NudDY0X3Q7CgoKdHlwZWRlZiBfX3VfbG9uZyBfX2ZzYmxrY250 X3Q7CnR5cGVkZWYgX191X3F1YWRfdCBfX2ZzYmxrY250NjRfdDsKCgp0eXBlZGVmIF9fdV9sb25n IF9fZnNmaWxjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNmaWxjbnQ2NF90OwoKCnR5cGVk ZWYgX191X2xvbmcgX19pbm82NF90OwoKCnR5cGVkZWYgX19sb2ZmX3QgX19vZmY2NF90OwoKCnR5 cGVkZWYgbG9uZyBpbnQgX190X3NjYWxhcl90Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9f dF91c2NhbGFyX3Q7CgoKdHlwZWRlZiBpbnQgX19pbnRwdHJfdDsKCgoKCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDEgMwojIDIzICIvdXNyL2luY2x1ZGUvYml0cy9wdGhy ZWFkdHlwZXMuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmgiIDEgMwojIDY4ICIv dXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAzCnN0cnVjdCBfX3NjaGVkX3BhcmFtCiAgewogICAg aW50IHNjaGVkX3ByaW9yaXR5OwogIH07CiMgMjQgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0 eXBlcy5oIiAyIDMKCgpzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sKewogIGxvbmcgaW50IF9fc3Rh dHVzOwogIGludCBfX3NwaW5sb2NrOwp9OwoKCgp0eXBlZGVmIHN0cnVjdCBfcHRocmVhZF9kZXNj cl9zdHJ1Y3QgKl9wdGhyZWFkX2Rlc2NyOwoKCgoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19k ZXRhY2hzdGF0ZTsKICBpbnQgX19zY2hlZHBvbGljeTsKICBzdHJ1Y3QgX19zY2hlZF9wYXJhbSBf X3NjaGVkcGFyYW07CiAgaW50IF9faW5oZXJpdHNjaGVkOwogIGludCBfX3Njb3BlOwogIHNpemVf dCBfX2d1YXJkc2l6ZTsKICBpbnQgX19zdGFja2FkZHJfc2V0OwogIHZvaWQgKl9fc3RhY2thZGRy OwogIHNpemVfdCBfX3N0YWNrc2l6ZTsKfSBwdGhyZWFkX2F0dHJfdDsKCgoKdHlwZWRlZiBzdHJ1 Y3QKewogIHN0cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX2NfbG9jazsKICBfcHRocmVhZF9kZXNj ciBfX2Nfd2FpdGluZzsKfSBwdGhyZWFkX2NvbmRfdDsKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIGlu dCBfX2R1bW15Owp9IHB0aHJlYWRfY29uZGF0dHJfdDsKCgp0eXBlZGVmIHVuc2lnbmVkIGludCBw dGhyZWFkX2tleV90OwoKCgoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19tX3Jlc2VydmVkOwog IGludCBfX21fY291bnQ7CiAgX3B0aHJlYWRfZGVzY3IgX19tX293bmVyOwogIGludCBfX21fa2lu ZDsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19tX2xvY2s7Cn0gcHRocmVhZF9tdXRleF90 OwoKCgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbXV0ZXhraW5kOwp9IHB0aHJlYWRfbXV0ZXhh dHRyX3Q7CgoKCnR5cGVkZWYgaW50IHB0aHJlYWRfb25jZV90OwoKCgoKdHlwZWRlZiBzdHJ1Y3Qg X3B0aHJlYWRfcndsb2NrX3QKewogIHN0cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX3J3X2xvY2s7 CiAgaW50IF9fcndfcmVhZGVyczsKICBfcHRocmVhZF9kZXNjciBfX3J3X3dyaXRlcjsKICBfcHRo cmVhZF9kZXNjciBfX3J3X3JlYWRfd2FpdGluZzsKICBfcHRocmVhZF9kZXNjciBfX3J3X3dyaXRl X3dhaXRpbmc7CiAgaW50IF9fcndfa2luZDsKICBpbnQgX19yd19wc2hhcmVkOwp9IHB0aHJlYWRf cndsb2NrX3Q7CgoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19sb2Nra2luZDsKICBpbnQgX19w c2hhcmVkOwp9IHB0aHJlYWRfcndsb2NrYXR0cl90OwoKCgoKdHlwZWRlZiB1bnNpZ25lZCBsb25n IGludCBwdGhyZWFkX3Q7CiMgMTUxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAyIDMKIyAy NyAiL3Vzci9pbmNsdWRlL3NjaGVkLmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIg MSAzCiMgODMgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKc3RydWN0IHRpbWVzcGVjCiAgewogICAg bG9uZyBpbnQgdHZfc2VjOwogICAgbG9uZyBpbnQgdHZfbnNlYzsKICB9OwojIDMwICIvdXNyL2lu Y2x1ZGUvc2NoZWQuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAxIDMK IyA0NyAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMwpzdHJ1Y3Qgc2NoZWRfcGFyYW0KICB7 CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAgfTsKCmV4dGVybiAiQyIgewoKCgpleHRlcm4gaW50 IGNsb25lIChpbnQgKCpfX2ZuKSAodm9pZCAqX19hcmcpLCB2b2lkICpfX2NoaWxkX3N0YWNrLCBp bnQgX19mbGFncywgdm9pZCAqX19hcmcpIHRocm93ICgpOwoKCgp9CiMgMzMgIi91c3IvaW5jbHVk ZS9zY2hlZC5oIiAyIDMKCmV4dGVybiAiQyIgewoKCmV4dGVybiBpbnQgX19zY2hlZF9zZXRwYXJh bSAoX19waWRfdCBfX3BpZCwgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRo cm93ICgpOwoKZXh0ZXJuIGludCBzY2hlZF9zZXRwYXJhbSAoX19waWRfdCBfX3BpZCwgX19jb25z dCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgpOwoKCgpleHRlcm4gaW50IF9f c2NoZWRfZ2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJh bSkgdGhyb3cgKCk7CmV4dGVybiBpbnQgc2NoZWRfZ2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIHN0 cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3NjaGVk X3NldHNjaGVkdWxlciAoX19waWRfdCBfX3BpZCwgaW50IF9fcG9saWN5LCBfX2NvbnN0IHN0cnVj dCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgpleHRlcm4gaW50IHNjaGVkX3NldHNj aGVkdWxlciAoX19waWRfdCBfX3BpZCwgaW50IF9fcG9saWN5LCBfX2NvbnN0IHN0cnVjdCBzY2hl ZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgX19zY2hlZF9nZXRzY2hl ZHVsZXIgKF9fcGlkX3QgX19waWQpIHRocm93ICgpOwpleHRlcm4gaW50IHNjaGVkX2dldHNjaGVk dWxlciAoX19waWRfdCBfX3BpZCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3NjaGVkX3lpZWxk ICh2b2lkKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBzY2hlZF95aWVsZCAodm9pZCkgdGhyb3cgKCk7 CgoKZXh0ZXJuIGludCBfX3NjaGVkX2dldF9wcmlvcml0eV9tYXggKGludCBfX2FsZ29yaXRobSkg dGhyb3cgKCk7CmV4dGVybiBpbnQgc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAoaW50IF9fYWxnb3Jp dGhtKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAoaW50 IF9fYWxnb3JpdGhtKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBzY2hlZF9nZXRfcHJpb3JpdHlfbWlu IChpbnQgX19hbGdvcml0aG0pIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19zY2hlZF9ycl9nZXRf aW50ZXJ2YWwgKF9fcGlkX3QgX19waWQsIHN0cnVjdCB0aW1lc3BlYyAqX190KSB0aHJvdyAoKTsK ZXh0ZXJuIGludCBzY2hlZF9ycl9nZXRfaW50ZXJ2YWwgKF9fcGlkX3QgX19waWQsIHN0cnVjdCB0 aW1lc3BlYyAqX190KSB0aHJvdyAoKTsKCn0KIyAyMSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIg MiAzCiMgMSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMSAzCiMgMjggIi91c3IvaW5jbHVkZS90aW1l LmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMjkgIi91c3IvaW5jbHVk ZS90aW1lLmgiIDIgMwoKZXh0ZXJuICJDIiB7CgoKCgoKCgojIDEgIi91c3IvbG9jYWwvZ2NjMy9s aWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMg MzkgIi91c3IvaW5jbHVkZS90aW1lLmgiIDIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3Rp bWUuaCIgMSAzCiMgNDMgIi91c3IvaW5jbHVkZS90aW1lLmgiIDIgMwojIDU3ICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMSAzCiMgNTggIi91 c3IvaW5jbHVkZS90aW1lLmgiIDIgMwoKCnR5cGVkZWYgX19jbG9ja190IGNsb2NrX3Q7CgoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDEgMwojIDY5ICIvdXNyL2luY2x1ZGUv dGltZS5oIiAyIDMKCgp0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKIyA5NSAiL3Vzci9pbmNsdWRl L3RpbWUuaCIgMwpzdHJ1Y3QgdG0KewogIGludCB0bV9zZWM7CiAgaW50IHRtX21pbjsKICBpbnQg dG1faG91cjsKICBpbnQgdG1fbWRheTsKICBpbnQgdG1fbW9uOwogIGludCB0bV95ZWFyOwogIGlu dCB0bV93ZGF5OwogIGludCB0bV95ZGF5OwogIGludCB0bV9pc2RzdDsKCgogIGxvbmcgaW50IHRt X2dtdG9mZjsKICBfX2NvbnN0IGNoYXIgKnRtX3pvbmU7CgoKCgp9OwoKCgoKZXh0ZXJuIGNsb2Nr X3QgY2xvY2sgKHZvaWQpIHRocm93ICgpOwoKCmV4dGVybiB0aW1lX3QgdGltZSAodGltZV90ICpf X3RpbWVyKSB0aHJvdyAoKTsKCgpleHRlcm4gZG91YmxlIGRpZmZ0aW1lICh0aW1lX3QgX190aW1l MSwgdGltZV90IF9fdGltZTApIHRocm93ICgpCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3Rf XykpOwoKCmV4dGVybiB0aW1lX3QgbWt0aW1lIChzdHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpOwoK CgoKCmV4dGVybiBzaXplX3Qgc3RyZnRpbWUgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3Qg X19tYXhzaXplLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fY29uc3Qgc3Ry dWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIHRocm93ICgpOwoKCgoKCgpleHRlcm4gY2hhciAqc3Ry cHRpbWUgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fZm10LCBzdHJ1Y3QgdG0g Kl9fdHApIHRocm93ICgpOwoKCgoKCgpleHRlcm4gc3RydWN0IHRtICpnbXRpbWUgKF9fY29uc3Qg dGltZV90ICpfX3RpbWVyKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1l IChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgdGhyb3cgKCk7CgoKCgpleHRlcm4gc3RydWN0IHRt ICpfX2dtdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLCBzdHJ1Y3Qg dG0gKl9fcmVzdHJpY3QgX190cCkgdGhyb3cgKCk7CgpleHRlcm4gc3RydWN0IHRtICpnbXRpbWVf ciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwgc3RydWN0IHRtICpfX3Jlc3Ry aWN0IF9fdHApIHRocm93ICgpOwoKCgoKZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lX3IgKF9f Y29uc3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsIHN0cnVjdCB0bSAqX19yZXN0cmljdCBf X3RwKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gY2hhciAqYXNjdGltZSAoX19jb25zdCBzdHJ1Y3Qg dG0gKl9fdHApIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpjdGltZSAoX19jb25zdCB0aW1lX3Qg Kl9fdGltZXIpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gY2hhciAqYXNjdGltZV9yIChfX2NvbnN0 IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJv dyAoKTsKCgoKZXh0ZXJuIGNoYXIgKmN0aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3RyaWN0 IF9fdGltZXIsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgpOwoKCgoKCmV4dGVybiBj aGFyICpfX3R6bmFtZVsyXTsKZXh0ZXJuIGludCBfX2RheWxpZ2h0OwpleHRlcm4gbG9uZyBpbnQg X190aW1lem9uZTsKCgoKCmV4dGVybiBjaGFyICp0em5hbWVbMl07CgoKCmV4dGVybiB2b2lkIHR6 c2V0ICh2b2lkKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBkYXlsaWdodDsKZXh0ZXJuIGxvbmcg aW50IHRpbWV6b25lOwoKCgoKCmV4dGVybiBpbnQgc3RpbWUgKF9fY29uc3QgdGltZV90ICpfX3do ZW4pIHRocm93ICgpOwojIDIyOCAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwpleHRlcm4gdGltZV90 IHRpbWVnbSAoc3RydWN0IHRtICpfX3RwKSB0aHJvdyAoKTsKCgpleHRlcm4gdGltZV90IHRpbWVs b2NhbCAoc3RydWN0IHRtICpfX3RwKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IGR5c2l6ZSAoaW50 IF9feWVhcikgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGludCBuYW5vc2xlZXAgKF9fY29uc3Qgc3Ry dWN0IHRpbWVzcGVjICpfX3JlcXVlc3RlZF90aW1lLCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVtYWlu aW5nKSB0aHJvdyAoKTsKIyAyNTcgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKZXh0ZXJuIGludCBn ZXRkYXRlX2VycjsKCgoKCgpleHRlcm4gc3RydWN0IHRtICpnZXRkYXRlIChfX2NvbnN0IGNoYXIg Kl9fc3RyaW5nKSB0aHJvdyAoKTsKIyAyNzIgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKZXh0ZXJu IGludCBnZXRkYXRlX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgc3RydWN0 IHRtICpfX3Jlc3RyaWN0IF9fcmVzYnVmcCkgdGhyb3cgKCk7CgoKCgp9CiMgMjIgIi91c3IvaW5j bHVkZS9wdGhyZWFkLmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL3NpZ25hbC5oIiAxIDMKIyAy OSAiL3Vzci9pbmNsdWRlL3NpZ25hbC5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgi IDEgMwojIDMwICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDIgMwoKZXh0ZXJuICJDIiB7CgojIDEg Ii91c3IvaW5jbHVkZS9iaXRzL3NpZ3NldC5oIiAxIDMKIyAyMyAiL3Vzci9pbmNsdWRlL2JpdHMv c2lnc2V0LmgiIDMKdHlwZWRlZiBpbnQgX19zaWdfYXRvbWljX3Q7CgoKCgp0eXBlZGVmIHN0cnVj dAogIHsKICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdmFsWygxMDI0IC8gKDggKiBzaXplb2YgKHVu c2lnbmVkIGxvbmcgaW50KSkpXTsKICB9IF9fc2lnc2V0X3Q7CiMgMzQgIi91c3IvaW5jbHVkZS9z aWduYWwuaCIgMiAzCiMgNDkgIi91c3IvaW5jbHVkZS9zaWduYWwuaCIgMwp0eXBlZGVmIF9fc2ln c2V0X3Qgc2lnc2V0X3Q7CiMgMzYyICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMKfQojIDI1ICIv dXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFk dHlwZXMuaCIgMSAzCiMgMjYgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKCmV4dGVybiAi QyIgewojIDQ5ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmVudW0KewogIFBUSFJFQURfQ1JF QVRFX0pPSU5BQkxFLAoKICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRAoKfTsKCmVudW0KewogIFBU SFJFQURfSU5IRVJJVF9TQ0hFRCwKCiAgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRAoKfTsKCmVudW0K ewogIFBUSFJFQURfU0NPUEVfU1lTVEVNLAoKICBQVEhSRUFEX1NDT1BFX1BST0NFU1MKCn07Cgpl bnVtCnsKICBQVEhSRUFEX01VVEVYX0ZBU1RfTlAsCiAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVf TlAsCiAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLX05QCgogICwKICBQVEhSRUFEX01VVEVYX05P Uk1BTCA9IFBUSFJFQURfTVVURVhfRkFTVF9OUCwKICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSA9 IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLAogIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSyA9 IFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwKICBQVEhSRUFEX01VVEVYX0RFRkFVTFQgPSBQ VEhSRUFEX01VVEVYX05PUk1BTAoKfTsKCmVudW0KewogIFBUSFJFQURfUFJPQ0VTU19QUklWQVRF LAoKICBQVEhSRUFEX1BST0NFU1NfU0hBUkVECgp9OwoKCmVudW0KewogIFBUSFJFQURfUldMT0NL X1BSRUZFUl9SRUFERVJfTlAsCiAgUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9OUCwKICBQ VEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCwKICBQVEhSRUFEX1JX TE9DS19ERUZBVUxUX05QID0gUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9OUAp9OwoKCgoK CgpzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIKewogIHZvaWQgKCpfX3JvdXRpbmUpICh2 b2lkICopOwogIHZvaWQgKl9fYXJnOwogIGludCBfX2NhbmNlbHR5cGU7CiAgc3RydWN0IF9wdGhy ZWFkX2NsZWFudXBfYnVmZmVyICpfX3ByZXY7Cn07CgoKCmVudW0KewogIFBUSFJFQURfQ0FOQ0VM X0VOQUJMRSwKCiAgUFRIUkVBRF9DQU5DRUxfRElTQUJMRQoKfTsKZW51bQp7CiAgUFRIUkVBRF9D QU5DRUxfREVGRVJSRUQsCgogIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUwoKfTsKIyAxNDEg Ii91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIGludCBwdGhyZWFkX2NyZWF0ZSAocHRo cmVhZF90ICpfX3RocmVhZCwgX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICoo Kl9fc3RhcnRfcm91dGluZSkgKHZvaWQgKiksIHZvaWQgKl9fYXJnKSB0aHJvdyAoKTsKCgoKCgpl eHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAodm9pZCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2VxdWFsIChwdGhyZWFkX3QgX190aHJlYWQxLCBwdGhyZWFkX3QgX190aHJlYWQy KSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBwdGhyZWFkX2V4aXQgKHZvaWQgKl9fcmV0dmFsKSB0 aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgoKCgpleHRlcm4gaW50IHB0 aHJlYWRfam9pbiAocHRocmVhZF90IF9fdGgsIHZvaWQgKipfX3RocmVhZF9yZXR1cm4pIHRocm93 ICgpOwoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9kZXRhY2ggKHB0aHJlYWRfdCBfX3RoKSB0aHJv dyAoKTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2luaXQgKHB0aHJlYWRfYXR0cl90 ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2Rlc3Ryb3kgKHB0 aHJlYWRfYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRy X3NldGRldGFjaHN0YXRlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgX19kZXRhY2hzdGF0 ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlIChf X2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCAqX19kZXRhY2hzdGF0ZSkgdGhyb3cg KCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKHB0aHJlYWRfYXR0 cl90ICpfX2F0dHIsIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAo KTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSAoX19jb25zdCBwdGhy ZWFkX2F0dHJfdCAqX19hdHRyLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgp OwoKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAocHRocmVhZF9hdHRy X3QgKl9fYXR0ciwgaW50IF9fcG9saWN5KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFk X2F0dHJfZ2V0c2NoZWRwb2xpY3kgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50 ICpfX3BvbGljeSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGluaGVy aXRzY2hlZCAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9faW5oZXJpdCkgdGhyb3cgKCk7 CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAoX19jb25zdCBwdGhy ZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgKl9faW5oZXJpdCkgdGhyb3cgKCk7CgoKCmV4dGVybiBp bnQgcHRocmVhZF9hdHRyX3NldHNjb3BlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgX19z Y29wZSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKF9fY29u c3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50ICpfX3Njb3BlKSB0aHJvdyAoKTsKCgoKCmV4 dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGd1YXJkc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0 ciwgc2l6ZV90IF9fZ3VhcmRzaXplKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0 dHJfZ2V0Z3VhcmRzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIHNpemVfdCAq X19ndWFyZHNpemUpIHRocm93ICgpOwoKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0 c3RhY2thZGRyIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICpfX3N0YWNrYWRkcikgdGhy b3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHN0YWNrYWRkciAoX19jb25zdCBw dGhyZWFkX2F0dHJfdCAqX19hdHRyLCB2b2lkICoqX19zdGFja2FkZHIpIHRocm93ICgpOwoKCgoK CmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9f YXR0ciwgc2l6ZV90IF9fc3RhY2tzaXplKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFk X2F0dHJfZ2V0c3RhY2tzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIHNpemVf dCAqX19zdGFja3NpemUpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IHB0aHJlYWRfc2V0c2No ZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgaW50IF9fcG9saWN5LCBfX2NvbnN0 IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRo cmVhZF9nZXRzY2hlZHBhcmFtIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLCBpbnQgKl9fcG9s aWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgpOwoKCgoKCmV4dGVybiBp bnQgcHRocmVhZF9nZXRjb25jdXJyZW5jeSAodm9pZCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBw dGhyZWFkX3NldGNvbmN1cnJlbmN5IChpbnQgX19sZXZlbCkgdGhyb3cgKCk7CgoKCgoKCmV4dGVy biBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwgX19j b25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpIHRocm93ICgpOwoKZXh0ZXJu IGludCBwdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwgX19jb25z dCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpIHRocm93ICgpOwoKCgpleHRlcm4g aW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRo cm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90 ICpfX211dGV4KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2Nr IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRf bXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsKCgpleHRl cm4gaW50IF9fcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRo cm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfbG9jayAocHRocmVhZF9tdXRleF90ICpf X211dGV4KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2sgKHB0 aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRl eF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cgKCk7CgoKCgoKCmV4dGVy biBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0 dHIpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKHB0aHJlYWRf bXV0ZXhhdHRyX3QgKl9fYXR0cikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0 ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikgdGhyb3cgKCk7CmV4 dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAocHRocmVhZF9tdXRleGF0dHJfdCAq X19hdHRyKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0 dHlwZSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLCBpbnQgX19raW5kKSB0aHJvdyAoKTsK CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAocHRocmVhZF9tdXRleGF0dHJf dCAqX19hdHRyLCBpbnQgX19raW5kKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX211 dGV4YXR0cl9nZXR0eXBlIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwgaW50 ICpfX2tpbmQpIHRocm93ICgpOwojIDMyMyAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRl cm4gaW50IHB0aHJlYWRfY29uZF9pbml0IChwdGhyZWFkX2NvbmRfdCAqX19jb25kLCBfX2NvbnN0 IHB0aHJlYWRfY29uZGF0dHJfdCAqX19jb25kX2F0dHIpIHRocm93ICgpOwoKCgpleHRlcm4gaW50 IHB0aHJlYWRfY29uZF9kZXN0cm95IChwdGhyZWFkX2NvbmRfdCAqX19jb25kKSB0aHJvdyAoKTsK CgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF9zaWduYWwgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQp IHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAocHRocmVhZF9j b25kX3QgKl9fY29uZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3dhaXQg KHB0aHJlYWRfY29uZF90ICpfX2NvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cg KCk7CgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAocHRocmVhZF9jb25k X3QgKl9fY29uZCwgcHRocmVhZF9tdXRleF90ICpfX211dGV4LCBfX2NvbnN0IHN0cnVjdCB0aW1l c3BlYyAqX19hYnN0aW1lKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRh dHRyX2luaXQgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsKCgpleHRlcm4g aW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIp IHRocm93ICgpOwoKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19pbml0IChwdGhyZWFk X3J3bG9ja190ICpfX3J3bG9jaywgX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRy KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19kZXN0cm95IChwdGhyZWFk X3J3bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9j a19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAoKTsKCgpleHRlcm4g aW50IHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2sp IHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfd3Jsb2NrIChwdGhyZWFkX3J3 bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190 cnl3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAoKTsKCgpleHRlcm4g aW50IHB0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spIHRo cm93ICgpOwoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQgKHB0aHJlYWRf cndsb2NrYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xv Y2thdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwoK CmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldHBzaGFyZWQgKF9fY29uc3QgcHRocmVh ZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwgaW50ICpfX3BzaGFyZWQpIHRocm93ICgpOwoKCgoKZXh0 ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9yd2xvY2thdHRy X3QgKl9fYXR0ciwgaW50IF9fcHNoYXJlZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVh ZF9yd2xvY2thdHRyX2dldGtpbmRfbnAgKF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9f YXR0ciwgaW50ICpfX3ByZWYpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9j a2F0dHJfc2V0a2luZF9ucCAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwgaW50IF9fcHJl ZikgdGhyb3cgKCk7CiMgNDIwICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiBpbnQg X19wdGhyZWFkX2tleV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lkICgqX19kZXN0 cl9mdW5jdGlvbikgKHZvaWQgKikpIHRocm93ICgpOwoKZXh0ZXJuIGludCBwdGhyZWFkX2tleV9j cmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LCB2b2lkICgqX19kZXN0cl9mdW5jdGlvbikgKHZv aWQgKikpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfa2V5X2RlbGV0ZSAocHRocmVh ZF9rZXlfdCBfX2tleSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfc2V0c3BlY2lm aWMgKHB0aHJlYWRfa2V5X3QgX19rZXksIF9fY29uc3Qgdm9pZCAqX19wb2ludGVyKSB0aHJvdyAo KTsKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSwg X19jb25zdCB2b2lkICpfX3BvaW50ZXIpIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCAqX19wdGhy ZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KSB0aHJvdyAoKTsKZXh0ZXJuIHZv aWQgKnB0aHJlYWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpIHRocm93ICgpOwoj IDQ0NSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gaW50IF9fcHRocmVhZF9vbmNl IChwdGhyZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2wsIHZvaWQgKCpfX2luaXRfcm91dGluZSkg KHZvaWQpKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRocmVhZF9vbmNlIChwdGhyZWFkX29uY2Vf dCAqX19vbmNlX2NvbnRyb2wsIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQpKSB0aHJvdyAo KTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAoaW50IF9fc3RhdGUs IGludCAqX19vbGRzdGF0ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5j ZWx0eXBlIChpbnQgX190eXBlLCBpbnQgKl9fb2xkdHlwZSkgdGhyb3cgKCk7CgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2NhbmNlbCAocHRocmVhZF90IF9fdGhyZWFkKSB0aHJvdyAoKTsKCgoKCmV4dGVy biB2b2lkIHB0aHJlYWRfdGVzdGNhbmNlbCAodm9pZCkgdGhyb3cgKCk7CiMgNDgxICIvdXNyL2lu Y2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaCAoc3Ry dWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX2J1ZmZlciwgdm9pZCAoKl9fcm91dGluZSkg KHZvaWQgKiksIHZvaWQgKl9fYXJnKSB0aHJvdyAoKTsKIyA0OTEgIi91c3IvaW5jbHVkZS9wdGhy ZWFkLmgiIDMKZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3AgKHN0cnVjdCBfcHRocmVh ZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsIGludCBfX2V4ZWN1dGUpIHRocm93ICgpOwojIDUw MiAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVw X3B1c2hfZGVmZXIgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsIHZv aWQgKCpfX3JvdXRpbmUpICh2b2lkICopLCB2b2lkICpfX2FyZykgdGhyb3cgKCk7CiMgNTEzICIv dXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9w X3Jlc3RvcmUgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsIGludCBf X2V4ZWN1dGUpIHRocm93ICgpOwoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zaWd0aHJlYWQu aCIgMSAzCiMgMzEgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3RocmVhZC5oIiAzCmV4dGVybiBpbnQg cHRocmVhZF9zaWdtYXNrIChpbnQgX19ob3csIF9fY29uc3QgX19zaWdzZXRfdCAqX19uZXdtYXNr LCBfX3NpZ3NldF90ICpfX29sZG1hc2spIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRf a2lsbCAocHRocmVhZF90IF9fdGhyZWFkLCBpbnQgX19zaWdubykgdGhyb3cgKCk7CiMgNTE5ICIv dXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKIyA1MzQgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgi IDMKZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCks IHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLCB2b2lkICgqX19jaGlsZCkgKHZvaWQpKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IHB0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCks IHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLCB2b2lkICgqX19jaGlsZCkgKHZvaWQpKSB0aHJvdyAo KTsKCgoKCgoKZXh0ZXJuIHZvaWQgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAgKHZvaWQp IHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCBfX3B0aHJlYWRfaW5pdGlhbGl6ZSAodm9pZCkgdGhy b3cgKCk7Cgp9CiMgMzkgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaXRocmVhZC9wb3NpeC5oIiAy CgoKCgpleHRlcm4gIkMiIHZvaWQqIG9tbmlfdGhyZWFkX3dyYXBwZXIodm9pZCogcHRyKTsKIyAx MzEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaXRocmVhZC5oIiAyCiMgMTc3ICIuLi8uLi8uLi8u Li9pbmNsdWRlL29tbml0aHJlYWQuaCIKY2xhc3Mgb21uaV90aHJlYWRfZmF0YWwgewpwdWJsaWM6 CiAgICBpbnQgZXJyb3I7CiAgICBvbW5pX3RocmVhZF9mYXRhbChpbnQgZSA9IDApIDogZXJyb3Io ZSkge30KfTsKCgoKCgoKCmNsYXNzIG9tbmlfdGhyZWFkX2ludmFsaWQge307CiMgMTk4ICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbml0aHJlYWQuaCIKY2xhc3Mgb21uaV9tdXRleCB7CgpwdWJsaWM6 CiAgICBvbW5pX211dGV4KHZvaWQpOwogICAgfm9tbmlfbXV0ZXgodm9pZCk7CgogICAgdm9pZCBs b2NrKHZvaWQpOwogICAgdm9pZCB1bmxvY2sodm9pZCk7CiAgICB2b2lkIGFjcXVpcmUodm9pZCkg eyBsb2NrKCk7IH0KICAgIHZvaWQgcmVsZWFzZSh2b2lkKSB7IHVubG9jaygpOyB9CgoKCiAgICBm cmllbmQgY2xhc3Mgb21uaV9jb25kaXRpb247Cgpwcml2YXRlOgoKICAgIG9tbmlfbXV0ZXgoY29u c3Qgb21uaV9tdXRleCYpOwogICAgb21uaV9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IG9tbmlfbXV0 ZXgmKTsKCnByaXZhdGU6CiAgICBwdGhyZWFkX211dGV4X3QgcG9zaXhfbXV0ZXg7Cn07CiMgMjQx ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbml0aHJlYWQuaCIKY2xhc3Mgb21uaV9tdXRleF9sb2Nr IHsKICAgIG9tbmlfbXV0ZXgmIG11dGV4OwpwdWJsaWM6CiAgICBvbW5pX211dGV4X2xvY2sob21u aV9tdXRleCYgbSkgOiBtdXRleChtKSB7IG11dGV4LmxvY2soKTsgfQogICAgfm9tbmlfbXV0ZXhf bG9jayh2b2lkKSB7IG11dGV4LnVubG9jaygpOyB9CnByaXZhdGU6CgogICAgb21uaV9tdXRleF9s b2NrKGNvbnN0IG9tbmlfbXV0ZXhfbG9jayYpOwogICAgb21uaV9tdXRleF9sb2NrJiBvcGVyYXRv cj0oY29uc3Qgb21uaV9tdXRleF9sb2NrJik7Cn07CiMgMjU5ICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbml0aHJlYWQuaCIKY2xhc3Mgb21uaV9jb25kaXRpb24gewoKICAgIG9tbmlfbXV0ZXgqIG11 dGV4OwoKcHVibGljOgogICAgb21uaV9jb25kaXRpb24ob21uaV9tdXRleCogbSk7CgoKCgogICAg fm9tbmlfY29uZGl0aW9uKHZvaWQpOwoKICAgIHZvaWQgd2FpdCh2b2lkKTsKCgoKCgogICAgaW50 IHRpbWVkd2FpdCh1bnNpZ25lZCBsb25nIHNlY3MsIHVuc2lnbmVkIGxvbmcgbmFub3NlY3MgPSAw KTsKCgoKCgoKICAgIHZvaWQgc2lnbmFsKHZvaWQpOwoKCgoKICAgIHZvaWQgYnJvYWRjYXN0KHZv aWQpOwoKCgpwcml2YXRlOgoKICAgIG9tbmlfY29uZGl0aW9uKGNvbnN0IG9tbmlfY29uZGl0aW9u Jik7CiAgICBvbW5pX2NvbmRpdGlvbiYgb3BlcmF0b3I9KGNvbnN0IG9tbmlfY29uZGl0aW9uJik7 Cgpwcml2YXRlOgogICAgcHRocmVhZF9jb25kX3QgcG9zaXhfY29uZDsKfTsKIyAzMDkgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaXRocmVhZC5oIgpjbGFzcyBvbW5pX3NlbWFwaG9yZSB7CgpwdWJs aWM6CiAgICBvbW5pX3NlbWFwaG9yZSh1bnNpZ25lZCBpbnQgaW5pdGlhbCA9IDEpOwogICAgfm9t bmlfc2VtYXBob3JlKHZvaWQpOwoKICAgIHZvaWQgd2FpdCh2b2lkKTsKCgoKICAgIGludCB0cnl3 YWl0KHZvaWQpOwoKCgogICAgdm9pZCBwb3N0KHZvaWQpOwoKCgpwcml2YXRlOgoKICAgIG9tbmlf c2VtYXBob3JlKGNvbnN0IG9tbmlfc2VtYXBob3JlJik7CiAgICBvbW5pX3NlbWFwaG9yZSYgb3Bl cmF0b3I9KGNvbnN0IG9tbmlfc2VtYXBob3JlJik7Cgpwcml2YXRlOgogICAgb21uaV9tdXRleCBt OyBvbW5pX2NvbmRpdGlvbiBjOyBpbnQgdmFsdWU7Cn07CgoKCgoKY2xhc3Mgb21uaV9zZW1hcGhv cmVfbG9jayB7CiAgICBvbW5pX3NlbWFwaG9yZSYgc2VtOwpwdWJsaWM6CiAgICBvbW5pX3NlbWFw aG9yZV9sb2NrKG9tbmlfc2VtYXBob3JlJiBzKSA6IHNlbShzKSB7IHNlbS53YWl0KCk7IH0KICAg IH5vbW5pX3NlbWFwaG9yZV9sb2NrKHZvaWQpIHsgc2VtLnBvc3QoKTsgfQpwcml2YXRlOgoKICAg IG9tbmlfc2VtYXBob3JlX2xvY2soY29uc3Qgb21uaV9zZW1hcGhvcmVfbG9jayYpOwogICAgb21u aV9zZW1hcGhvcmVfbG9jayYgb3BlcmF0b3I9KGNvbnN0IG9tbmlfc2VtYXBob3JlX2xvY2smKTsK fTsKIyAzNTggIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaXRocmVhZC5oIgpjbGFzcyBvbW5pX3Ro cmVhZCB7CgpwdWJsaWM6CgogICAgZW51bSBwcmlvcml0eV90IHsKICAgICAgICBQUklPUklUWV9M T1csCiAgICAgICAgUFJJT1JJVFlfTk9STUFMLAogICAgICAgIFBSSU9SSVRZX0hJR0gKICAgIH07 CgogICAgZW51bSBzdGF0ZV90IHsKICAgICAgICBTVEFURV9ORVcsCgogICAgICAgIFNUQVRFX1JV Tk5JTkcsCiAgICAgICAgU1RBVEVfVEVSTUlOQVRFRAoKICAgIH07CgoKCgoKCgogICAgb21uaV90 aHJlYWQodm9pZCAoKmZuKSh2b2lkKiksIHZvaWQqIGFyZyA9IF9fbnVsbCwKICAgICAgICAgICAg ICAgIHByaW9yaXR5X3QgcHJpID0gUFJJT1JJVFlfTk9STUFMKTsKICAgIG9tbmlfdGhyZWFkKHZv aWQqICgqZm4pKHZvaWQqKSwgdm9pZCogYXJnID0gX19udWxsLAogICAgICAgICAgICAgICAgcHJp b3JpdHlfdCBwcmkgPSBQUklPUklUWV9OT1JNQUwpOwoKCgoKCgoKICAgIHZvaWQgc3RhcnQodm9p ZCk7CgoKCnByb3RlY3RlZDoKCiAgICBvbW5pX3RocmVhZCh2b2lkKiBhcmcgPSBfX251bGwsIHBy aW9yaXR5X3QgcHJpID0gUFJJT1JJVFlfTk9STUFMKTsKCgoKCiAgICB2b2lkIHN0YXJ0X3VuZGV0 YWNoZWQodm9pZCk7CgoKCgogICAgdmlydHVhbCB+b21uaV90aHJlYWQodm9pZCk7CgoKCgoKCgpw dWJsaWM6CgogICAgdm9pZCBqb2luKHZvaWQqKik7CgoKCgoKICAgIHZvaWQgc2V0X3ByaW9yaXR5 KHByaW9yaXR5X3QpOwoKCiAgICBzdGF0aWMgb21uaV90aHJlYWQqIGNyZWF0ZSh2b2lkICgqZm4p KHZvaWQqKSwgdm9pZCogYXJnID0gX19udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcHJpb3JpdHlfdCBwcmkgPSBQUklPUklUWV9OT1JNQUwpOwogICAgc3RhdGljIG9tbmlfdGhy ZWFkKiBjcmVhdGUodm9pZCogKCpmbikodm9pZCopLCB2b2lkKiBhcmcgPSBfX251bGwsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eV90IHByaSA9IFBSSU9SSVRZX05PUk1B TCk7CgoKCgoKICAgIHN0YXRpYyB2b2lkIGV4aXQodm9pZCogcmV0dXJuX3ZhbHVlID0gX19udWxs KTsKCgogICAgc3RhdGljIG9tbmlfdGhyZWFkKiBzZWxmKHZvaWQpOwoKCgoKICAgIHN0YXRpYyB2 b2lkIHlpZWxkKHZvaWQpOwoKCiAgICBzdGF0aWMgdm9pZCBzbGVlcCh1bnNpZ25lZCBsb25nIHNl Y3MsIHVuc2lnbmVkIGxvbmcgbmFub3NlY3MgPSAwKTsKCgogICAgc3RhdGljIHZvaWQgZ2V0X3Rp bWUodW5zaWduZWQgbG9uZyogYWJzX3NlYywgdW5zaWduZWQgbG9uZyogYWJzX25zZWMsCiAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlbF9zZWMgPSAwLCB1bnNpZ25lZCBs b25nIHJlbF9uc2VjPTApOwoKCgoKCiAgICBzdGF0aWMgdm9pZCBzdGFja3NpemUodW5zaWduZWQg bG9uZyBzeik7CiAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGFja3NpemUoKTsKCgoKCnByaXZh dGU6CgogICAgdmlydHVhbCB2b2lkIHJ1bih2b2lkKiBhcmcpIHt9CiAgICB2aXJ0dWFsIHZvaWQq IHJ1bl91bmRldGFjaGVkKHZvaWQqIGFyZykgeyByZXR1cm4gX19udWxsOyB9CgoKCgogICAgdm9p ZCBjb21tb25fY29uc3RydWN0b3Iodm9pZCogYXJnLCBwcmlvcml0eV90IHByaSwgaW50IGRldCk7 CgoKICAgIG9tbmlfbXV0ZXggbXV0ZXg7CgoKCiAgICBzdGF0ZV90IF9zdGF0ZTsKICAgIHByaW9y aXR5X3QgX3ByaW9yaXR5OwoKICAgIHN0YXRpYyBvbW5pX211dGV4KiBuZXh0X2lkX211dGV4Owog ICAgc3RhdGljIGludCBuZXh0X2lkOwogICAgaW50IF9pZDsKCiAgICB2b2lkICgqZm5fdm9pZCko dm9pZCopOwogICAgdm9pZCogKCpmbl9yZXQpKHZvaWQqKTsKICAgIHZvaWQqIHRocmVhZF9hcmc7 CiAgICBpbnQgZGV0YWNoZWQ7CgpwdWJsaWM6CgogICAgcHJpb3JpdHlfdCBwcmlvcml0eSh2b2lk KSB7CgoKCiAgICAgICAgb21uaV9tdXRleF9sb2NrIGwobXV0ZXgpOwogICAgICAgIHJldHVybiBf cHJpb3JpdHk7CiAgICB9CgogICAgc3RhdGVfdCBzdGF0ZSh2b2lkKSB7CgoKCiAgICAgICAgb21u aV9tdXRleF9sb2NrIGwobXV0ZXgpOwogICAgICAgIHJldHVybiBfc3RhdGU7CiAgICB9CgogICAg aW50IGlkKHZvaWQpIHsgcmV0dXJuIF9pZDsgfQoKCgoKCgogICAgY2xhc3MgaW5pdF90IHsKICAg ICAgICBzdGF0aWMgaW50IGNvdW50OwogICAgcHVibGljOgogICAgICAgIGluaXRfdCh2b2lkKTsK ICAgIH07CgogICAgZnJpZW5kIGNsYXNzIGluaXRfdDsKCnByaXZhdGU6CiAgICBwdGhyZWFkX3Qg cG9zaXhfdGhyZWFkOyBzdGF0aWMgaW50IHBvc2l4X3ByaW9yaXR5KHByaW9yaXR5X3QpOyBmcmll bmQgdm9pZCogb21uaV90aHJlYWRfd3JhcHBlcih2b2lkKiBwdHIpOwp9OwoKCnN0YXRpYyBvbW5p X3RocmVhZDo6aW5pdF90IG9tbmlfdGhyZWFkX2luaXQ7CiMgMTQ4ICIuLi8uLi8uLi8uLi9pbmNs dWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9v bW5pT1JCMy9DT1JCQV9zeXNkZXAuaCIgMQojIDE0OSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5p T1JCMy9vbW5pSW50ZXJuYWwuaCIgMgojIDEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMv Q09SQkFfYmFzZXR5cGVzLmgiIDEKIyA3NSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9D T1JCQV9iYXNldHlwZXMuaCIKdHlwZWRlZiBib29sIF9DT1JCQV9Cb29sZWFuOwoKCgoKdHlwZWRl ZiB1bnNpZ25lZCBjaGFyIF9DT1JCQV9DaGFyOwoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9DT1JC QV9PY3RldDsKCnR5cGVkZWYgc2hvcnQgX0NPUkJBX1Nob3J0OwoKdHlwZWRlZiB1bnNpZ25lZCBz aG9ydCBfQ09SQkFfVVNob3J0OwoKCnR5cGVkZWYgbG9uZyBfQ09SQkFfTG9uZzsKCnR5cGVkZWYg dW5zaWduZWQgbG9uZyBfQ09SQkFfVUxvbmc7CiMgMTAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29t bmlPUkIzL0NPUkJBX2Jhc2V0eXBlcy5oIgp0eXBlZGVmIGxvbmcgbG9uZyBfQ09SQkFfTG9uZ0xv bmc7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9DT1JCQV9VTG9uZ0xvbmc7CiMgMTExICIu Li8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJBX2Jhc2V0eXBlcy5oIgp0eXBlZGVmIGZs b2F0IF9DT1JCQV9GbG9hdDsKdHlwZWRlZiBkb3VibGUgX0NPUkJBX0RvdWJsZTsKIyAxNzcgIi4u Ly4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkFfYmFzZXR5cGVzLmgiCmV4dGVybiB2b2lk IF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKZXh0ZXJuIHZvaWQgX0NPUkJBX2Jv dW5kX2NoZWNrX2Vycm9yKCk7CmV4dGVybiB2b2lkIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CmV4 dGVybiBfQ09SQkFfQm9vbGVhbiBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX29ianJlZigpOwpl eHRlcm4gdm9pZCBfQ09SQkFfbnVsbF9zdHJpbmdfcHRyKF9DT1JCQV9Cb29sZWFuKTsKZXh0ZXJu IHZvaWQgX0NPUkJBX2ludm9rZWRfbmlsX3BzZXVkb19yZWYoKTsKZXh0ZXJuIHZvaWQgX0NPUkJB X2ludm9rZWRfbmlsX29ianJlZigpOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4KX0NPUkJBX3VzZV9u aWxfcHRyX2FzX25pbF9wc2V1ZG9fb2JqcmVmKGNvbnN0IGNoYXIqIG9ialR5cGUpOwpleHRlcm4g dm9pZCBfQ09SQkFfYmFkX3BhcmFtX2ZyZWVidWYoKTsKIyAxNTAgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29t bmlPUkIzL3NlcXRlbXBsYXRlcy5oIiAxCiMgOTMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9S QjMvc2VxdGVtcGxhdGVzLmgiCmNsYXNzIE5ldEJ1ZmZlcmVkU3RyZWFtOwpjbGFzcyBNZW1CdWZm ZXJlZFN0cmVhbTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgX0NPUkJBX1NlcXVlbmNl IHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlPFQ+IFRfc2VxOwoKICBpbmxpbmUg X0NPUkJBX1VMb25nIG1heGltdW0oKSBjb25zdCB7IHJldHVybiBwZF9tYXg7IH0KICBpbmxpbmUg X0NPUkJBX1VMb25nIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHBkX2xlbjsgfQogIGlubGluZSB2 b2lkIGxlbmd0aChfQ09SQkFfVUxvbmcgbGVuKQogIHsKICAgIGlmIChwZF9ib3VuZGVkICYmIGxl biA+IHBkX21heCkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKCiAgICB9Cgog ICAgaWYgKGxlbikgewoKCiAgICAgIGlmICghcGRfYnVmIHx8IGxlbiA+IHBkX21heCkgewogICAg ICAgIGNvcHlidWZmZXIoKChsZW4gPiBwZF9tYXgpID8gbGVuIDogcGRfbWF4KSk7CiAgICAgIH0K ICAgIH0KCiAgICBwZF9sZW4gPSBsZW47CiAgfQogIGlubGluZSBUICZvcGVyYXRvcltdIChfQ09S QkFfVUxvbmcgaW5kZXgpIHsKICAgIGlmIChpbmRleCA+PSBwZF9sZW4pIF9DT1JCQV9ib3VuZF9j aGVja19lcnJvcigpOwogICAgcmV0dXJuIHBkX2J1ZltpbmRleF07CiAgfQogIGlubGluZSBjb25z dCBUJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIGNvbnN0IHsKICAgIGlmIChpbmRl eCA+PSBwZF9sZW4pIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwogICAgcmV0dXJuIHBkX2J1 ZltpbmRleF07CiAgfQogIHN0YXRpYyBpbmxpbmUgVCogYWxsb2NidWYoX0NPUkJBX1VMb25nIG5l bGVtcykgewogICAgVCogdG1wID0gMDsKICAgIGlmIChuZWxlbXMpIHsKICAgICAgdG1wID0gbmV3 IFRbbmVsZW1zXTsKICAgIH0KICAgIHJldHVybiB0bXA7CiAgfQogIHN0YXRpYyBpbmxpbmUgdm9p ZCBmcmVlYnVmKFQgKiBiKSB7CiAgICBpZiAoYikgZGVsZXRlIFtdIGI7CiAgfQoKCiAgaW5saW5l IF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UoKSBjb25zdCB7IHJldHVybiBwZF9yZWw7IH0KCiAgaW5s aW5lIFQqIGdldF9idWZmZXIoX0NPUkJBX0Jvb2xlYW4gb3JwaGFuID0gMCkgewogICAgaWYgKHBk X21heCAmJiAhcGRfYnVmKSB7CiAgICAgIGNvcHlidWZmZXIocGRfbWF4KTsKICAgIH0KICAgIGlm ICghb3JwaGFuKSB7CiAgICAgIHJldHVybiBwZF9idWY7CiAgICB9CiAgICBlbHNlIHsKICAgICAg aWYgKCFwZF9yZWwpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgewogICAgICAgIFQqIHRt cCA9IHBkX2J1ZjsKICAgICAgICBwZF9idWYgPSAwOwogICAgICAgIGlmICghcGRfYm91bmRlZCkg ewogICAgICAgICAgcGRfbWF4ID0gMDsKICAgICAgICB9CiAgICAgICAgcGRfbGVuID0gMDsKICAg ICAgICBwZF9yZWwgPSAxOwogICAgICAgIHJldHVybiB0bXA7CiAgICAgIH0KICAgIH0KICB9Cgog IGlubGluZSBjb25zdCBUKiBnZXRfYnVmZmVyKCkgY29uc3QgewogICAgaWYgKHBkX21heCAmJiAh cGRfYnVmKSB7CgogICAgICBUX3NlcSogcyA9IGNvbnN0X2Nhc3Q8VF9zZXEqPih0aGlzKTsKCgoK ICAgICAgcy0+Y29weWJ1ZmZlcihwZF9tYXgpOwogICAgfQogICAgcmV0dXJuIHBkX2J1ZjsKICB9 CgogIGlubGluZSB+X0NPUkJBX1NlcXVlbmNlKCkgewogICAgaWYgKHBkX3JlbCAmJiBwZF9idWYp IGZyZWVidWYocGRfYnVmKTsKICAgIHBkX2J1ZiA9IDA7CiAgfQoKCiAgaW5saW5lIFQqIE5QX2Rh dGEoKSBjb25zdCB7IHJldHVybiBwZF9idWY7IH0KICBpbmxpbmUgdm9pZCBOUF9ub3JlbGVhc2Uo KSB7IHBkX3JlbCA9IDA7IH0KCiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVk U3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRT dHJlYW0gJnMpOwogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAm cykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZz KTsKCnByb3RlY3RlZDoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlKCkgOiBwZF9tYXgoMCksIHBk X2xlbigwKSwgcGRfcmVsKDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkX2JvdW5k ZWQoMCksIHBkX2J1ZigwKSB7IH0KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZShfQ09SQkFfVUxv bmcgbWF4LCBfQ09SQkFfQm9vbGVhbiBib3VuZGVkPTApIDoKICAgIHBkX21heChtYXgpLCBwZF9s ZW4oMCksIHBkX3JlbCgxKSwgcGRfYm91bmRlZChib3VuZGVkKSwgcGRfYnVmKDApIHt9CgogIGlu bGluZSBfQ09SQkFfU2VxdWVuY2UoY29uc3QgX0NPUkJBX1NlcXVlbmNlPFQ+JiBzKQogICAgICAg ICAgICAgIDogcGRfbWF4KHMucGRfbWF4KSwKICAgICAgICAgICAgICAgIHBkX2xlbigwKSwKICAg ICAgICAgICAgICAgIHBkX3JlbCgxKSwKICAgICAgICAgICAgICAgIHBkX2JvdW5kZWQocy5wZF9i b3VuZGVkKSwgcGRfYnVmKDApIHsKICAgIGxlbmd0aChzLnBkX2xlbik7CiAgICBmb3IgKF9DT1JC QV9VTG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewogICAgICBwZF9idWZbaV0gPSBzLnBkX2J1 ZltpXTsKICAgIH0KICB9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1h eCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAg ICAgICAgICAgICAgICBUICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9C b29sZWFuIHJlbGVhc2UgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xl YW4gYm91bmRlZCA9IDAKICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgOiBwZF9tYXgo bWF4KSwKICAgICAgICBwZF9sZW4obGVuKSwKICAgICAgICBwZF9yZWwocmVsZWFzZSksCiAgICAg ICAgcGRfYm91bmRlZChib3VuZGVkKSwKICAgICAgICBwZF9idWYodmFsdWUpCiAgewogICAgaWYg KGxlbiA+IG1heCB8fCAobGVuICYmICF2YWx1ZSkpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNr X2Vycm9yKCk7CgogICAgfQogIH0KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZTxUPiAmb3BlcmF0 b3I9IChjb25zdCBfQ09SQkFfU2VxdWVuY2U8VD4gJnMpCiAgewogICAgbGVuZ3RoKHMucGRfbGVu KTsKICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewogICAgICBw ZF9idWZbaV0gPSBzLnBkX2J1ZltpXTsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgoKCiAg aW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFfVUxvbmcgbGVuLCBU KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAp IHsKICAgIGlmIChsZW4gPiBtYXggfHwgKGxlbiAmJiAhZGF0YSkpIHsKICAgICAgX0NPUkJBX2Jv dW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9idWYpIHsKICAg ICAgZnJlZWJ1ZihwZF9idWYpOwogICAgfQogICAgcGRfbWF4ID0gbWF4OwogICAgcGRfbGVuID0g bGVuOwogICAgcGRfYnVmID0gZGF0YTsKICAgIHBkX3JlbCA9IHJlbGVhc2U7CiAgfQoKCnByaXZh dGU6CgogIHZvaWQgY29weWJ1ZmZlcihfQ09SQkFfVUxvbmcgbmV3bWF4KSB7CgoKCiAgICBUKiBu ZXdidWYgPSBhbGxvY2J1ZihuZXdtYXgpOwogICAgaWYgKCFuZXdidWYpIHsKICAgICAgX0NPUkJB X25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwoKICAgIH0KICAgIGZvciAodW5zaWduZWQgbG9u ZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewogICAgICAgbmV3YnVmW2ldID0gcGRfYnVmW2ldOwog ICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9idWYpIHsKICAgICAgZnJlZWJ1ZihwZF9idWYpOwog ICAgfQogICAgZWxzZSB7CiAgICAgIHBkX3JlbCA9IDE7CiAgICB9CiAgICBwZF9idWYgPSBuZXdi dWY7CiAgICBwZF9tYXggPSBuZXdtYXg7CiAgfQoKICBfQ09SQkFfVUxvbmcgcGRfbWF4OwogIF9D T1JCQV9VTG9uZyBwZF9sZW47CiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIF9DT1JCQV9Cb29s ZWFuIHBkX2JvdW5kZWQ7CiAgVCAqcGRfYnVmOwp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpj bGFzcyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlIDogcHVibGljIF9DT1JCQV9TZXF1ZW5jZTxU PiB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9TZXF1ZW5jZTxUPiBCYXNlVCA7CiAgaW5saW5l IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2UoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlKF9DT1JCQV9VTG9uZyBtYXgpIDogX0NPUkJBX1NlcXVlbmNlPFQ+KG1heCkge30K ICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZShjb25zdCBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlPFQ+JiBzKQogICAgIDogX0NPUkJBX1NlcXVlbmNlPFQ+KHMpIHt9CiAgaW5saW5l IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgIDogX0NPUkJBX1NlcXVlbmNl PFQ+KG1heCxsZW4sdmFsdWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZTxUPiAmb3BlcmF0b3I9IChjb25zdCBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPFQ+ ICZzKSB7CiAgICBfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPSAocyk7CiAgICByZXR1cm4g KnRoaXM7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2UoKSB7fQoKCgog IGlubGluZSB2b2lkIHJlcGxhY2UoX0NPUkJBX1VMb25nIG1heCwgX0NPUkJBX1VMb25nIGxlbiwg VCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAw KSB7CiAgICBfQ09SQkFfU2VxdWVuY2U8VD46OnJlcGxhY2UobWF4LGxlbixkYXRhLHJlbGVhc2Up OwogIH0KCiAgaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZz ZXQpIGNvbnN0IHsKICAgIHNpemVfdCBhbGlnbmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAm IH4oKGludCkzKSkrc2l6ZW9mKF9DT1JCQV9VTG9uZyk7CiAgICBmb3IgKHVuc2lnbmVkIGxvbmcg aT0wOyBpIDwgQmFzZVQ6Omxlbmd0aCgpOyBpKyspIHsKICAgICAgYWxpZ25lZHNpemUgPSBCYXNl VDo6TlBfZGF0YSgpW2ldLl9OUF9hbGlnbmVkU2l6ZShhbGlnbmVkc2l6ZSk7CiAgICB9CiAgICBy ZXR1cm4gYWxpZ25lZHNpemU7CiAgfQp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULGludCBlbG1T aXplLGludCBlbG1BbGlnbm1lbnQ+CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19G aXhTaXplRWxlbWVudAogICA6IHB1YmxpYyBfQ09SQkFfU2VxdWVuY2U8VD4KewpwdWJsaWM6CiAg dHlwZWRlZiBfQ09SQkFfU2VxdWVuY2U8VD4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQoX0NPUkJBX1VMb25nIG1heCkKICAgIDogX0NP UkJBX1NlcXVlbmNlPFQ+KG1heCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZV93X0ZpeFNpemVFbGVtZW50IChjb25zdAogICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZV93X0ZpeFNpemVFbGVtZW50PFQsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+JiBzKQogICAgOiBfQ09S QkFfU2VxdWVuY2U8VD4ocykge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93 X0ZpeFNpemVFbGVtZW50KF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9v bGVhbiByZWxlYXNlID0gMCkKICAgIDogX0NPUkJBX1NlcXVlbmNlPFQ+KG1heCxsZW4sdmFsdWUs cmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVF bGVtZW50PFQsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+ICYKICAgICAgb3BlcmF0b3I9CiAgICAgICAg KGNvbnN0CiAgICAgICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1l bnQ8VCxlbG1TaXplLGVsbUFsaWdubWVudD4gJgogICAgICAgICBzKQogIHsKICAgIF9DT1JCQV9T ZXF1ZW5jZTxUPjo6b3BlcmF0b3I9IChzKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5l IH5fQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQoKSB7fQoKCgogIGlu bGluZSB2b2lkIHJlcGxhY2UoX0NPUkJBX1VMb25nIG1heCwgX0NPUkJBX1VMb25nIGxlbiwgVCog ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7 CiAgICBfQ09SQkFfU2VxdWVuY2U8VD46OnJlcGxhY2UobWF4LGxlbixkYXRhLHJlbGVhc2UpOwog IH0KCiAgaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQp IGNvbnN0IHsKICAgIHNpemVfdCBhbGlnbmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAmIH4o KGludCkzKSkrc2l6ZW9mKF9DT1JCQV9VTG9uZyk7CiAgICBpZiAoQmFzZVQ6Omxlbmd0aCgpKSB7 CiAgICAgIGFsaWduZWRzaXplID0gKChhbGlnbmVkc2l6ZSsoZWxtQWxpZ25tZW50LTEpKSAmIH4o ZWxtQWxpZ25tZW50LTEpKTsKICAgICAgYWxpZ25lZHNpemUgKz0gQmFzZVQ6Omxlbmd0aCgpICog ZWxtU2l6ZTsKICAgIH0KICAgIHJldHVybiBhbGlnbmVkc2l6ZTsKICB9CgogIGlubGluZSB2b2lk IG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQg b3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRv cj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9y PDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7Cn07CgoKCgoKY2xhc3MgX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9fQm9vbGVhbgogICA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X3dfRml4U2l6ZUVsZW1lbnQ8X0NPUkJBX0Jvb2xlYW4sMSwxPgp7CnB1YmxpYzoKICB0eXBlZGVm IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfQm9vbGVh biwxLDE+IEJhc2VUIDsKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVh bigpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4oX0NPUkJB X1VMb25nIG1heCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVt ZW50PF9DT1JCQV9Cb29sZWFuLDEsMT4obWF4KSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX19Cb29sZWFuKF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xl YW4gKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfQm9vbGVhbiwxLDE+KG1heCxsZW4sdmFs dWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVh biAoY29uc3QKICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4mIHMpCiAg ICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfQm9v bGVhbiwxLDE+KHMpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xl YW4mIG9wZXJhdG9yPSAoY29uc3QKICAgICAgICAgICAgICAgICBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX19Cb29sZWFuJiBzKSB7CiAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0Zp eFNpemVFbGVtZW50PF9DT1JCQV9Cb29sZWFuLDEsMT46Om9wZXJhdG9yPSAocyk7CiAgICAgcmV0 dXJuICp0aGlzOwogIH0KICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xl YW4oKSB7fQoKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMp IGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7 CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsK ICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwoKfTsKCgoK CgpjbGFzcyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldAogICA6IHB1YmxpYyBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NPUkJBX09jdGV0LDEsMT4K ewpwdWJsaWM6CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KCkge30K ICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQoX0NPUkJBX1VMb25nIG1h eCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JC QV9PY3RldCwxLDEgPihtYXgpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vf X09jdGV0KF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX09jdGV0ICp2YWx1ZSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9C b29sZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4 U2l6ZUVsZW1lbnQ8X0NPUkJBX09jdGV0LDEsMSA+KG1heCxsZW4sdmFsdWUscmVsZWFzZSkge30K ICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgKGNvbnN0CiAgICAgICBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCYgcykKICAgIDogX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3RldCwxLDEgPihzKSB7fQogIGlu bGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCYgb3BlcmF0b3I9IChjb25zdAog ICAgICAgICAgICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0JiBzKSB7CiAg ICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3Rl dCwxLDE+OjpvcGVyYXRvcj0gKHMpOwogICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIH5f Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCgpIHt9Cn07CgoKCgoKdGVtcGxhdGUgPGNs YXNzIFQsaW50IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2UgOiBwdWJsaWMgX0NP UkJBX1NlcXVlbmNlPFQ+IHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlPFQ+IEJh c2VUIDsKICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2UoKSA6IF9DT1JCQV9TZXF1ZW5j ZTxUPihtYXgsMSkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2UoX0NPUkJBX1VM b25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQog ICAgICAgICAgICA6IF9DT1JCQV9TZXF1ZW5jZTxUPihtYXgsbGVuLHZhbHVlLHJlbGVhc2UsMSkg e30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2UoY29uc3QgX0NPUkJBX0JvdW5kZWRf U2VxdWVuY2U8VCxtYXg+JiBzKQogICAgICAgICAgICA6IF9DT1JCQV9TZXF1ZW5jZTxUPihzKSB7 fQogIGlubGluZSB+X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2UoKSB7fQogIGlubGluZSBfQ09SQkFf Qm91bmRlZF9TZXF1ZW5jZTxULG1heD4gJm9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX0JvdW5kZWRf U2VxdWVuY2U8VCxtYXg+ICZzKSB7CiAgICBfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPSAo cyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFf VUxvbmcgbGVuLCBUKiBkYXRhLF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09S QkFfU2VxdWVuY2U8VD46OnJlcGxhY2UobWF4LGxlbixkYXRhLHJlbGVhc2UpOwogIH0KCgogIGlu bGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdCB7 CiAgICBzaXplX3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQrMykgJiB+KChpbnQpMykp K3NpemVvZihfQ09SQkFfVUxvbmcpOwogICAgZm9yICh1bnNpZ25lZCBsb25nIGk9MDsgaSA8IEJh c2VUOjpsZW5ndGgoKTsgaSsrKSB7CiAgICAgIGFsaWduZWRzaXplID0gQmFzZVQ6Ok5QX2RhdGEo KVtpXS5fTlBfYWxpZ25lZFNpemUoYWxpZ25lZHNpemUpOwogICAgfQogICAgcmV0dXJuIGFsaWdu ZWRzaXplOwogIH0KCn07CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsaW50IG1heCxpbnQgZWxtU2l6 ZSwgaW50IGVsbUFsaWdubWVudD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhT aXplRWxlbWVudAogIDogcHVibGljIF9DT1JCQV9TZXF1ZW5jZTxUPgp7CnB1YmxpYzoKICB0eXBl ZGVmIF9DT1JCQV9TZXF1ZW5jZTxUPiBCYXNlVCA7CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1Nl cXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQoKSA6IF9DT1JCQV9TZXF1ZW5jZTxUPihtYXgsMSkge30K ICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudChfQ09SQkFf VUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAq dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFf Qm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogX0NPUkJBX1NlcXVlbmNlPFQ+KG1heCxsZW4sdmFs dWUscmVsZWFzZSwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNp emVFbGVtZW50KGNvbnN0CiAgICAgIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVs ZW1lbnQ8VCxtYXgsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+JiBzKQogICAgOiBfQ09SQkFfU2VxdWVu Y2U8VD4ocykge30KICBpbmxpbmUgfl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVs ZW1lbnQoKSB7fQoKICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxl bWVudDxULG1heCxlbG1TaXplLGVsbUFsaWdubWVudD4mIG9wZXJhdG9yPShjb25zdCBfQ09SQkFf Qm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PFQsbWF4LGVsbVNpemUsZWxtQWxpZ25t ZW50PiYgcykgewogICAgX0NPUkJBX1NlcXVlbmNlPFQ+OjpvcGVyYXRvcj0gKHMpOwogICAgcmV0 dXJuICp0aGlzOwogIH0KCgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9DT1JCQV9VTG9uZyBsZW4s IFQqIGRhdGEsX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIF9DT1JCQV9TZXF1ZW5j ZTxUPjo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoKCiAgaW5saW5lIHNpemVf dCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0IHsKICAgIHNpemVf dCBhbGlnbmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAmIH4oKGludCkzKSkrc2l6ZW9mKF9D T1JCQV9VTG9uZyk7CiAgICBpZiAoQmFzZVQ6Omxlbmd0aCgpKSB7CiAgICAgIGFsaWduZWRzaXpl ID0gKChhbGlnbmVkc2l6ZSsoZWxtQWxpZ25tZW50LTEpKSAmIH4oZWxtQWxpZ25tZW50LTEpKTsK ICAgICAgYWxpZ25lZHNpemUgKz0gQmFzZVQ6Omxlbmd0aCgpICogZWxtU2l6ZTsKICAgIH0KICAg IHJldHVybiBhbGlnbmVkc2l6ZTsKICB9CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRC dWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1 ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRT dHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0 cmVhbSAmcyk7Cn07CgoKCgoKdGVtcGxhdGUgPGludCBtYXg+CmNsYXNzIF9DT1JCQV9Cb3VuZGVk X1NlcXVlbmNlX19Cb29sZWFuCiAgIDogcHVibGljIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3df Rml4U2l6ZUVsZW1lbnQ8X0NPUkJBX0Jvb2xlYW4sbWF4LDEsMT4KewpwdWJsaWM6CiAgdHlwZWRl ZiBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9Cb29sZWFu LG1heCwxLDE+IEJhc2VUIDsKICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jvb2xl YW4oKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVhbihfQ09SQkFf VUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX0Jvb2xlYW4gKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IEJhc2VUKGxlbix2YWx1ZSxy ZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVhbihjb25z dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf X0Jvb2xlYW48bWF4PiYgcykKICAgIDogX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXpl RWxlbWVudDxfQ09SQkFfQm9vbGVhbixtYXgsMSwxPihzKSB7fQogIGlubGluZSBfQ09SQkFfQm91 bmRlZF9TZXF1ZW5jZV9fQm9vbGVhbiYgb3BlcmF0b3I9IChjb25zdAogICAgICAgICAgICAgICAg IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuJiBzKSB7CiAgICAgQmFzZVQ6Om9wZXJh dG9yPSAocyk7CiAgICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIH5fQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV9fQm9vbGVhbigpIHt9CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRC dWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1 ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRT dHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0 cmVhbSAmcyk7Cgp9OwoKCgoKCnRlbXBsYXRlIDxpbnQgbWF4PgpjbGFzcyBfQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV9fT2N0ZXQKICAgOiBwdWJsaWMgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vfd19G aXhTaXplRWxlbWVudDxfQ09SQkFfT2N0ZXQsbWF4LDEsMT4KewpwdWJsaWM6CiAgaW5saW5lIF9D T1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19PY3RldCgpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVk X1NlcXVlbmNlX19PY3RldChfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX09jdGV0ICp2YWx1ZSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQog ICAgOiBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3Rl dCxtYXgsMSwxPihsZW4sdmFsdWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRf U2VxdWVuY2VfX09jdGV0KGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9D T1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19PY3RldDxtYXg+JiBzKQogICAgOiBfQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3RldCxtYXgsMSwxPihzKSB7fQog IGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQmIG9wZXJhdG9yPSAoY29uc3QK ICAgICAgICAgICAgICAgICBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQmIHMpIHsKICAg ICBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3RldCxt YXgsMSwxPjo6b3BlcmF0b3I9IChzKTsKICAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSB+ X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX09jdGV0KCkge30KfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xh c3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbj4KY2xhc3MgX0NPUkJB X1NlcXVlbmNlX0FycmF5IHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlX0FycmF5 PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gVF9zZXE7CgogIGlubGluZSBfQ09SQkFfVUxvbmcg bWF4aW11bSgpIGNvbnN0IHsgcmV0dXJuIHBkX21heDsgfQogIGlubGluZSBfQ09SQkFfVUxvbmcg bGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gcGRfbGVuOyB9CiAgaW5saW5lIHZvaWQgbGVuZ3RoKF9D T1JCQV9VTG9uZyBsZW4pCiAgewogICAgaWYgKHBkX2JvdW5kZWQgJiYgbGVuID4gcGRfbWF4KSB7 CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwoKICAgIH0KCiAgICBpZiAobGVuKSB7 CgoKICAgICAgaWYgKCFwZF9idWYgfHwgbGVuID4gcGRfbWF4KSB7CiAgICAgICAgY29weWJ1ZmZl cigoKGxlbiA+IHBkX21heCkgPyBsZW4gOiBwZF9tYXgpKTsKICAgICAgfQogICAgfQoKICAgIHBk X2xlbiA9IGxlbjsKCiAgfQoKCiAgaW5saW5lIFRfc2xpY2UqIG9wZXJhdG9yW10gKF9DT1JCQV9V TG9uZyBpbmRleCkKICB7CiAgICBpZiAoaW5kZXggPj0gcGRfbGVuKSBfQ09SQkFfYm91bmRfY2hl Y2tfZXJyb3IoKTsKICAgIHJldHVybiAoVF9zbGljZSopKHBkX2J1ZltpbmRleF0pOwogIH0KICBp bmxpbmUgY29uc3QgVF9zbGljZSogb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSBjb25z dAogIHsKICAgIGlmIChpbmRleCA+PSBwZF9sZW4pIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigp OwogICAgcmV0dXJuIChjb25zdCBUX3NsaWNlKikocGRfYnVmW2luZGV4XSk7CiAgfQogIHN0YXRp YyBpbmxpbmUgVCogYWxsb2NidWYoX0NPUkJBX1VMb25nIG5lbGVtcykKICB7CiAgICBpZiAobmVs ZW1zKSByZXR1cm4gbmV3IFRbbmVsZW1zXTsKICAgIGVsc2UgcmV0dXJuIDA7CiAgfQogIHN0YXRp YyBpbmxpbmUgdm9pZCBmcmVlYnVmKFQgKiBiKQogIHsKICAgIGlmIChiKSBkZWxldGUgW10gYjsK ICAgIHJldHVybjsKICB9CgoKICBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSgpIGNvbnN0 IHsgcmV0dXJuIHBkX3JlbDsgfQoKICBpbmxpbmUgVCogZ2V0X2J1ZmZlcihfQ09SQkFfQm9vbGVh biBvcnBoYW4gPSAwKSB7CiAgICBpZiAocGRfbWF4ICYmICFwZF9idWYpIHsKICAgICAgY29weWJ1 ZmZlcihwZF9tYXgpOwogICAgfQogICAgaWYgKCFvcnBoYW4pIHsKICAgICAgcmV0dXJuIHBkX2J1 ZjsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAoIXBkX3JlbCkKICAgICAgICByZXR1cm4gMDsK ICAgICAgZWxzZSB7CiAgICAgICAgVCogdG1wID0gcGRfYnVmOwogICAgICAgIHBkX2J1ZiA9IDA7 CiAgICAgICAgaWYgKCFwZF9ib3VuZGVkKSB7CiAgICAgICAgICBwZF9tYXggPSAwOwogICAgICAg IH0KICAgICAgICBwZF9sZW4gPSAwOwogICAgICAgIHBkX3JlbCA9IDE7CiAgICAgICAgcmV0dXJu IHRtcDsKICAgICAgfQogICAgfQogIH0KCiAgaW5saW5lIFQqIGdldF9idWZmZXIoKSBjb25zdCB7 CiAgICBpZiAocGRfbWF4ICYmICFwZF9idWYpIHsKCiAgICAgIFRfc2VxKiBzID0gY29uc3RfY2Fz dDxUX3NlcSo+KHRoaXMpOwoKCgogICAgICBzLT5jb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAg ICByZXR1cm4gcGRfYnVmOwogIH0KCiAgaW5saW5lIH5fQ09SQkFfU2VxdWVuY2VfQXJyYXkoKSB7 CiAgICBpZiAocGRfcmVsICYmIHBkX2J1ZikgZnJlZWJ1ZihwZF9idWYpOwogICAgcGRfYnVmID0g MDsKICAgIHJldHVybjsKICB9CgoKICBpbmxpbmUgVCAqTlBfZGF0YSgpIGNvbnN0IHsgcmV0dXJu IHBkX2J1ZjsgfQogIGlubGluZSB2b2lkIE5QX25vcmVsZWFzZSgpIHsgcGRfcmVsID0gMDsgfQog IGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAg aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUg dm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2 b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7Cgpwcm90ZWN0ZWQ6CiAgaW5s aW5lIF9DT1JCQV9TZXF1ZW5jZV9BcnJheSgpIDogcGRfbWF4KDApLCBwZF9sZW4oMCksIHBkX3Jl bCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZF9ib3VuZGVkKDApLCBw ZF9idWYoMCkgeyB9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfQXJyYXkoX0NPUkJBX1VMb25n IG1heCwgX0NPUkJBX0Jvb2xlYW4gYm91bmRlZD0wKSA6CiAgICBwZF9tYXgobWF4KSwgcGRfbGVu KDApLCBwZF9yZWwoMSksIHBkX2JvdW5kZWQoYm91bmRlZCksIHBkX2J1ZigwKSB7fQoKICBpbmxp bmUgX0NPUkJBX1NlcXVlbmNlX0FycmF5KGNvbnN0IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRf c2xpY2UsVGVsbSxkaW1lbnNpb24+JiBzKQogICAgICAgICAgICAgIDogcGRfbWF4KHMucGRfbWF4 KSwKICAgICAgICAgICAgICAgIHBkX2xlbigwKSwKICAgICAgICAgICAgICAgIHBkX3JlbCgxKSwK ICAgICAgICAgICAgICAgIHBkX2JvdW5kZWQocy5wZF9ib3VuZGVkKSwgcGRfYnVmKDApCiAgewog ICAgbGVuZ3RoKHMucGRfbGVuKTsKICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaSA8IHBkX2xl bjsgaSsrKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGo9MDsgaiA8IGRpbWVuc2lvbjsgaisr KSB7CiAgICAgICAgKigoVGVsbSopKHBkX2J1ZltpXSkgKyBqKSA9ICooKFRlbG0qKShzLnBkX2J1 ZltpXSkgKyBqKTsKICAgICAgfQogICAgfQogIH0KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZV9B cnJheShfQ09SQkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX1VMb25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBib3VuZGVkID0g MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICA6IHBkX21heChtYXgpLAog ICAgICAgIHBkX2xlbihsZW4pLAogICAgICAgIHBkX3JlbChyZWxlYXNlKSwKICAgICAgICBwZF9i b3VuZGVkKGJvdW5kZWQpLAogICAgICAgIHBkX2J1Zih2YWx1ZSkKICB7CiAgICBpZiAobGVuID4g bWF4IHx8IChsZW4gJiYgIXZhbHVlKSkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3Io KTsKCiAgICB9CiAgfQoKCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2Us VGVsbSxkaW1lbnNpb24+ICZvcGVyYXRvcj0gKGNvbnN0IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxU LFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+ICZzKQogIHsKICAgIGxlbmd0aChzLnBkX2xlbik7CiAg ICBmb3IgKHVuc2lnbmVkIGxvbmcgaT0wOyBpIDwgcGRfbGVuOyBpKyspIHsKICAgICAgZm9yIChf Q09SQkFfVUxvbmcgaj0wOyBqIDwgZGltZW5zaW9uOyBqKyspIHsKICAgICAgICAqKChUZWxtKiko cGRfYnVmW2ldKSArIGopID0gKigoVGVsbSopKHMucGRfYnVmW2ldKSArIGopOwogICAgICB9CiAg ICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFf VUxvbmcgbWF4LCBfQ09SQkFfVUxvbmcgbGVuLCBUKiBkYXRhLAogICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIGlmIChsZW4gPiBtYXggfHwgKGxl biAmJiAhZGF0YSkpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQog ICAgaWYgKHBkX3JlbCAmJiBwZF9idWYpIHsKICAgICAgZnJlZWJ1ZihwZF9idWYpOwogICAgfQog ICAgcGRfbWF4ID0gbWF4OwogICAgcGRfbGVuID0gbGVuOwogICAgcGRfYnVmID0gZGF0YTsKICAg IHBkX3JlbCA9IHJlbGVhc2U7CiAgfQoKCnByaXZhdGU6CgogIHZvaWQgY29weWJ1ZmZlcihfQ09S QkFfVUxvbmcgbmV3bWF4KSB7CgoKCiAgICBUKiBuZXdidWYgPSBhbGxvY2J1ZihuZXdtYXgpOwog ICAgaWYgKCFuZXdidWYpIHsKICAgICAgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgp OwoKICAgIH0KICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewog ICAgICBmb3IgKF9DT1JCQV9VTG9uZyBqPTA7IGogPCBkaW1lbnNpb247IGorKykgewogICAgICAg ICooKFRlbG0qKShuZXdidWZbaV0pICsgaikgPSAqKChUZWxtKikocGRfYnVmW2ldKSArIGopOwog ICAgICB9CiAgICB9CiAgICBpZiAocGRfcmVsICYmIHBkX2J1ZikgewogICAgICBmcmVlYnVmKHBk X2J1Zik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcGRfcmVsID0gMTsKICAgIH0KICAgIHBkX2J1 ZiA9IG5ld2J1ZjsKICAgIHBkX21heCA9IG5ld21heDsKICB9CgogIF9DT1JCQV9VTG9uZyBwZF9t YXg7CiAgX0NPUkJBX1VMb25nIHBkX2xlbjsKICBfQ09SQkFfQm9vbGVhbiBwZF9yZWw7CiAgX0NP UkJBX0Jvb2xlYW4gcGRfYm91bmRlZDsKICBUKiBwZF9idWY7Cn07CgoKCgoKdGVtcGxhdGUgPGNs YXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24+CmNsYXNzIF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXkgOiBwdWJsaWMgX0NPUkJBX1NlcXVlbmNlX0FycmF5 PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2Vx dWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiBCYXNlVCA7CiAgaW5saW5lIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXkoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX0FycmF5KF9DT1JCQV9VTG9uZyBtYXgpIDogX0NPUkJBX1NlcXVlbmNlX0Fy cmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4KSB7fQogIGlubGluZSBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX0FycmF5KGNvbnN0IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJy YXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiYgcykKICAgICA6IF9DT1JCQV9TZXF1ZW5jZV9B cnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+KHMpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJv dW5kZWRfU2VxdWVuY2VfQXJyYXkoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgIDogX0NP UkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4LGxlbix2YWx1 ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5PFQs VF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gJm9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+ICZzKSB7CiAgICBCYXNl VDo6b3BlcmF0b3I9IChzKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIH5fQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5KCkge30KCgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9D T1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsCiAgICAgICAgICAgICAg ICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkgewogICAgQmFzZVQ6OnJlcGxhY2Uo bWF4LGxlbixkYXRhLHJlbGVhc2UpOwogIH0KCgoKCgoKICBpbmxpbmUgc2l6ZV90IF9OUF9hbGln bmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3QgewogICAgc2l6ZV90IGFsaWduZWRz aXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKStzaXplb2YoX0NPUkJBX1VMb25n KTsKICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsKICAgICAgICAgaSA8IEJhc2VUOjpsZW5ndGgo KTsKICAgICAgICAgaSsrKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGo9MDsgajxkaW1lbnNp b247IGorKykgewogICAgICAgIGFsaWduZWRzaXplID0gKChUZWxtKikoQmFzZVQ6Ok5QX2RhdGEo KVtpXSkgKyBqKS0+X05QX2FsaWduZWRTaXplKGFsaWduZWRzaXplKTsKICAgICAgfQogICAgfQog ICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFz cyBUX3NsaWNlLCBjbGFzcyBUZWxtLGludCBkaW1lbnNpb24saW50IGVsbVNpemUsaW50IGVsbUFs aWdubWVudD4KY2xhc3MgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVF bGVtZW50CiAgIDogcHVibGljIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxk aW1lbnNpb24+CnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9z bGljZSxUZWxtLGRpbWVuc2lvbj4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQoX0NPUkJBX1VMb25nIG1heCkKICAg IDogX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4KSB7 fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1l bnQgKGNvbnN0CiAgICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6 ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLGVsbVNpemUsZWxtQWxpZ25tZW50PiYg cykKICAgIDogX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4o cykge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVF bGVtZW50KF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf Q09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQs VF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGlu ZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3Ns aWNlLFRlbG0sZGltZW5zaW9uLGVsbVNpemUsZWxtQWxpZ25tZW50PiAmCiAgICAgIG9wZXJhdG9y PQogICAgICAgIChjb25zdAogICAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJh eV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbixlbG1TaXplLGVsbUFs aWdubWVudD4gJgogICAgICAgICBzKQogIHsKICAgIEJhc2VUOjpvcGVyYXRvcj0gKHMpOwogICAg cmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJy YXlfd19GaXhTaXplRWxlbWVudCgpIHt9CgoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFf VUxvbmcgbWF4LCBfQ09SQkFfVUxvbmcgbGVuLCBUKiBkYXRhLAogICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIEJhc2VUOjpyZXBsYWNlKG1heCxs ZW4sZGF0YSxyZWxlYXNlKTsKICB9CgoKCgoKCiAgaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNp emUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0IHsKICAgIHNpemVfdCBhbGlnbmVkc2l6ZSA9 ICgoaW5pdGlhbG9mZnNldCszKSAmIH4oKGludCkzKSkrc2l6ZW9mKF9DT1JCQV9VTG9uZyk7CiAg ICBpZiAoQmFzZVQ6Omxlbmd0aCgpKSB7CiAgICAgIGFsaWduZWRzaXplID0gKChhbGlnbmVkc2l6 ZSsoZWxtQWxpZ25tZW50LTEpKSAmIH4oZWxtQWxpZ25tZW50LTEpKTsKICAgICAgYWxpZ25lZHNp emUgKz1CYXNlVDo6bGVuZ3RoKCkgKgogICAgICAgIGRpbWVuc2lvbiAqIGVsbVNpemU7CiAgICB9 CiAgICByZXR1cm4gYWxpZ25lZHNpemU7CiAgfQoKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAo TmV0QnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChO ZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZl cmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVy ZWRTdHJlYW0gJnMpOwp9OwoKCgoKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRfc2xpY2UsIGlu dCBkaW1lbnNpb24+CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xl YW4KICAgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVF bGVtZW50PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1lbnNpb24sMSwxPgp7CnB1YmxpYzoK ICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbigpIHt9CiAg aW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW4oX0NPUkJBX1VM b25nIG1heCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVF bGVtZW50PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1lbnNpb24sMSwxPihtYXgpIHt9CiAg aW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW4oX0NPUkJBX1VM b25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX1VMb25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVh c2UgPSAwKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVs ZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9Cb29sZWFuLGRpbWVuc2lvbiwxLDE+KG1heCxsZW4sdmFs dWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9f Qm9vbGVhbiAoY29uc3QKICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jv b2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbj4mIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGlt ZW5zaW9uLDEsMT4ocykge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJh eV9fQm9vbGVhbjxULFRfc2xpY2UsZGltZW5zaW9uPiYKICAgICAgb3BlcmF0b3I9IChjb25zdAog ICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNl LGRpbWVuc2lvbj4mIHMpIHsKICAgICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJy YXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uLDEs MT46Om9wZXJhdG9yPSAocyk7CiAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUg fl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW4oKSB7fQoKICBpbmxpbmUg dm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2 b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgaW5saW5lIHZvaWQgb3Bl cmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVy YXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwoKfTsKCgoKCgp0ZW1wbGF0ZTxjbGFzcyBU LCBjbGFzcyBUX3NsaWNlLCBpbnQgZGltZW5zaW9uPgpjbGFzcyBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X19PY3RldAogICA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9PY3RldCxkaW1lbnNpb24s MSwxPgp7CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9f T2N0ZXQoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19PY3Rl dChfQ09SQkFfVUxvbmcgbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9PY3RldCxkaW1lbnNpb24sMSwxPiht YXgpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0KF9D T1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVh biByZWxlYXNlID0gMCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0Zp eFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFfT2N0ZXQsZGltZW5zaW9uLDEsMT4obWF4LGxl bix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0Fy cmF5X19PY3RldCAoY29uc3QKICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlf X09jdGV0PFQsVF9zbGljZSxkaW1lbnNpb24+JiBzKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9PY3RldCxkaW1l bnNpb24sMSwxPihzKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X19PY3RldDxULFRfc2xpY2UsZGltZW5zaW9uPiYKICAgICAgb3BlcmF0b3I9IChjb25zdAogICAg ICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0PFQsVF9zbGljZSxkaW1l bnNpb24+JiBzKSB7CiAgICAgICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X3df Rml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9PY3RldCxkaW1lbnNpb24sMSwxPjo6b3Bl cmF0b3I9IChzKTsKICAgICAgICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSB+X0NPUkJB X1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fT2N0ZXQoKSB7fQp9OwoKCgoKCnRlbXBsYXRlIDxj bGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVsbSxpbnQgZGltZW5zaW9uLGludCBtYXg+CmNs YXNzIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5IDogcHVibGljIF9DT1JCQV9TZXF1ZW5j ZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+IHsKcHVibGljOgogIHR5cGVkZWYgX0NP UkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gQmFzZVQgOwogIGlu bGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheSgpIDogX0NPUkJBX1NlcXVlbmNlX0Fy cmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4LDEpIHt9CiAgaW5saW5lIF9DT1JCQV9C b3VuZGVkX1NlcXVlbmNlX0FycmF5KF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgICAgICAgICAgOiBf Q09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihtYXgsbGVuLHZh bHVlLHJlbGVhc2UsMSkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXko Y29uc3QgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5z aW9uLG1heD4mIHMpCiAgICAgICAgICAgIDogX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGlj ZSxUZWxtLGRpbWVuc2lvbj4ocykge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf QXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heD4gJm9wZXJhdG9yPSAoY29uc3QgX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heD4g JnMpIHsKICAgIEJhc2VUOjpvcGVyYXRvcj0gKHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAg aW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheSgpIHt9CgoKCiAgaW5saW5lIHZv aWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbGVuLCBUKiBkYXRhLF9DT1JCQV9Cb29sZWFuIHJlbGVh c2UgPSAwKSB7CiAgICBCYXNlVDo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoK ICBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29u c3QgewogICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50 KTMpKStzaXplb2YoX0NPUkJBX1VMb25nKTsKICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaSA8 IEJhc2VUOjpsZW5ndGgoKTsgaSsrKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGo9MDsgaiA8 IGRpbWVuc2lvbjsgaisrKSB7CiAgICAgICAgYWxpZ25lZHNpemUgPSAoKFRlbG0qKShCYXNlVDo6 TlBfZGF0YSgpW2ldKStqKS0+X05QX2FsaWduZWRTaXplKGFsaWduZWRzaXplKTsKICAgICAgfQog ICAgfQogICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3Mg VCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQgbWF4LGludCBlbG1T aXplLCBpbnQgZWxtQWxpZ25tZW50PgpjbGFzcyBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJh eV93X0ZpeFNpemVFbGVtZW50CiAgOiBwdWJsaWMgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9z bGljZSxUZWxtLGRpbWVuc2lvbj4KewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2Vf QXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiBCYXNlVCA7CiAgaW5saW5lIF9DT1JCQV9C b3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQoKQogICAgOiBfQ09SQkFfU2Vx dWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihtYXgsMSkge30KICBpbmxpbmUg X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudChfQ09SQkFfVUxv bmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU KiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxU LFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+KG1heCxsZW4sdmFsdWUscmVsZWFzZSwxKSB7fQogIGlu bGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50KGNvbnN0 CiAgICAgIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxU X3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heCxlbG1TaXplLGVsbUFsaWdubWVudD4mIHMpCiAgICA6 IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+KHMpIHt9CiAg aW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxU X3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heCxlbG1TaXplLGVsbUFsaWdubWVudD4mIG9wZXJhdG9y PShjb25zdCBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQs VF9zbGljZSxUZWxtLGRpbWVuc2lvbixtYXgsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+JiBzKSB7CiAg ICBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPjo6b3BlcmF0 b3I9IChzKTsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSB+X0NPUkJBX0JvdW5kZWRf U2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudCgpIHt9CgoKCiAgaW5saW5lIHZvaWQgcmVw bGFjZShfQ09SQkFfVUxvbmcgbGVuLCBUKiBkYXRhLF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAw KSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPjo6 cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoKCiAgaW5saW5lIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0IHsKICAgIHNpemVfdCBhbGln bmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAmIH4oKGludCkzKSkrc2l6ZW9mKF9DT1JCQV9V TG9uZyk7CiAgICBpZiAoQmFzZVQ6Omxlbmd0aCgpKSB7CiAgICAgIGFsaWduZWRzaXplID0gKChh bGlnbmVkc2l6ZSsoZWxtQWxpZ25tZW50LTEpKSAmIH4oZWxtQWxpZ25tZW50LTEpKTsKICAgICAg YWxpZ25lZHNpemUgKz0gQmFzZVQ6Omxlbmd0aCgpICogZGltZW5zaW9uICogZWxtU2l6ZTsKICAg IH0KICAgIHJldHVybiBhbGlnbmVkc2l6ZTsKICB9CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49 IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0g KE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVm ZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZm ZXJlZFN0cmVhbSAmcyk7Cn07CgoKCgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwg aW50IGRpbWVuc2lvbiwgaW50IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJy YXlfX0Jvb2xlYW4KICAgOiBwdWJsaWMgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19G aXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uLG1heCwxLDE+ CnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhT aXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uLG1heCwxLDE+IEJh c2VUIDsKICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW4oKSB7 fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbihfQ09SQkFf VUxvbmcgbGVuLCBUKiB2YWx1ZSwgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZT0wKQogICAgOiBCYXNl VCAobGVuLHZhbHVlLHJlbGVhc2UpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNl X0FycmF5X19Cb29sZWFuKGNvbnN0IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29s ZWFuPFQsVF9zbGljZSxkaW1lbnNpb24sbWF4PiYgcykKICAgIDogQmFzZVQgKHMpIHt9CiAgaW5s aW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1l bnNpb24sbWF4PiYKICAgICAgb3BlcmF0b3I9IChjb25zdAogICAgICAgIF9DT1JCQV9Cb3VuZGVk X1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1lbnNpb24sbWF4PiYgcykgewog ICAgICAgICAgQmFzZVQgOjpvcGVyYXRvcj0gKHMpOwogICAgICAgICAgcmV0dXJuICp0aGlzOwog IH0KCiAgaW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbigpIHt9 CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7 CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxp bmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7Cgp9OwoKCgoKCnRlbXBs YXRlPGNsYXNzIFQsIGNsYXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24sIGludCBtYXg+CmNsYXNz IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19PY3RldAogICA6IHB1YmxpYyBfQ09SQkFf Qm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFf T2N0ZXQsZGltZW5zaW9uLG1heCwxLDE+CnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX09jdGV0 LGRpbWVuc2lvbixtYXgsMSwxPiBCYXNlVCA7CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVl bmNlX0FycmF5X19PY3RldCgpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0Fy cmF5X19PY3RldChfQ09SQkFfVUxvbmcgbGVuLCBUICp2YWx1ZSwgX0NPUkJBX0Jvb2xlYW4gcmVs ZWFzZSA9IDApCiAgICA6IEJhc2VUIChsZW4sdmFsdWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0KGNvbnN0IF9DT1JCQV9Cb3VuZGVkX1Nl cXVlbmNlX0FycmF5X19PY3RldDxULFRfc2xpY2UsZGltZW5zaW9uLG1heD4mIHMpCiAgICA6IEJh c2VUIChzKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fT2N0ZXQ8 VCxUX3NsaWNlLGRpbWVuc2lvbixtYXg+JgogICAgICBvcGVyYXRvcj0gKGNvbnN0CiAgICAgICAg X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0PFQsVF9zbGljZSxkaW1lbnNpb24s bWF4PiYgcykgewogICAgICAgICAgQmFzZVQgOjpvcGVyYXRvcj0gKHMpOwogICAgICAgICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9f T2N0ZXQoKSB7fQp9OwoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRWxlbVQsIGNsYXNz IFRfSGVscGVyPgpjbGFzcyBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmIHsKcHVibGljOgogIHR5cGVk ZWYgX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPiBUX3NlcTsKCiAgaW5s aW5lIF9DT1JCQV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5s aW5lIF9DT1JCQV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxp bmUgdm9pZCBsZW5ndGgoX0NPUkJBX1VMb25nIGxlbikgewogICAgaWYgKHBkX2JvdW5kZWQgJiYg bGVuID4gcGRfbWF4KSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwoKICAgIH0K CgogICAgZm9yKCBfQ09SQkFfVUxvbmcgaSA9IGxlbjsgaSA8IHBkX2xlbjsgaSsrICkKICAgICAg b3BlcmF0b3JbXShpKSA9IFRfSGVscGVyOjpfbmlsKCk7CgogICAgaWYgKGxlbikgewoKCiAgICAg IGlmICghcGRfZGF0YSB8fCBsZW4gPiBwZF9tYXgpIHsKICAgICAgICBjb3B5YnVmZmVyKCgobGVu ID4gcGRfbWF4KSA/IGxlbiA6IHBkX21heCkpOwogICAgICB9CiAgICB9CgogICAgcGRfbGVuID0g bGVuOwogIH0KCiAgaW5saW5lIEVsZW1UIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAg ICBpZiggaSA+PSBwZF9sZW4gKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVy biBFbGVtVChwZF9kYXRhW2ldLHBkX3JlbCk7CiAgfQogIGlubGluZSBjb25zdCBFbGVtVCBvcGVy YXRvcltdIChfQ09SQkFfVUxvbmcgaSkgY29uc3QgewogICAgaWYoIGkgPj0gcGRfbGVuICkgX0NP UkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICByZXR1cm4gRWxlbVQocGRfZGF0YVtpXSxwZF9y ZWwpOwogIH0KCgogIHR5cGVkZWYgbG9uZyBwdHJfYXJpdGhfdDsKCgoKCgoKICBzdGF0aWMgaW5s aW5lIFQqKiBhbGxvY2J1ZihfQ09SQkFfVUxvbmcgbmVsZW1zKSB7CiAgICBpZiAoIW5lbGVtcykg cmV0dXJuIDA7CiAgICBUKiogYiA9IG5ldyBUKltuZWxlbXMrMl07CiAgICBwdHJfYXJpdGhfdCBs ID0gbmVsZW1zOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaSA9IDI7IGkgPCBuZWxlbXMrMjsgaSsr KSB7CiAgICAgIGJbaV0gPSBUX0hlbHBlcjo6X25pbCgpOwogICAgfQogICAgYlswXSA9IChUKikg KChwdHJfYXJpdGhfdCkweDUzNTE0RjRBVSk7CiAgICBiWzFdID0gKFQqKSBsOwogICAgcmV0dXJu IGIrMjsKICB9CgogIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlYnVmKFQqKiBidWYpIHsKICAgIGlm ICghYnVmKSByZXR1cm47CiAgICBUKiogYiA9IGJ1Zi0yOwogICAgaWYgKChwdHJfYXJpdGhfdCli WzBdICE9ICgocHRyX2FyaXRoX3QpIDB4NTM1MTRGNEFVKSkgewogICAgICBfQ09SQkFfYmFkX3Bh cmFtX2ZyZWVidWYoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgcHRyX2FyaXRoX3QgbCA9IChw dHJfYXJpdGhfdCkgYlsxXTsKICAgIGZvciAoX0NPUkJBX1VMb25nIGkgPSAwOyBpIDwgKF9DT1JC QV9VTG9uZykgbDsgaSsrKSB7CiAgICAgIGlmICghVF9IZWxwZXI6OmlzX25pbChidWZbaV0pKQog ICAgICAgIFRfSGVscGVyOjpyZWxlYXNlKGJ1ZltpXSk7CiAgICB9CiAgICBiWzBdID0gKFQqKSAw OwogICAgZGVsZXRlIFtdIGI7CiAgfQoKCiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2Uo KSBjb25zdCB7IHJldHVybiBwZF9yZWw7IH0KCiAgaW5saW5lIFQqKiBnZXRfYnVmZmVyKF9DT1JC QV9Cb29sZWFuIG9ycGhhbiA9IDApIHsKICAgIGlmIChwZF9tYXggJiYgIXBkX2RhdGEpIHsKICAg ICAgY29weWJ1ZmZlcihwZF9tYXgpOwogICAgfQogICAgaWYgKCFvcnBoYW4pIHsKICAgICAgcmV0 dXJuIHBkX2RhdGE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKCFwZF9yZWwpCiAgICAgICAg cmV0dXJuIDA7CiAgICAgIGVsc2UgewogICAgICAgIFQqKiB0bXAgPSBwZF9kYXRhOwogICAgICAg IHBkX2RhdGEgPSAwOwogICAgICAgIGlmICghcGRfYm91bmRlZCkgewogICAgICAgICAgcGRfbWF4 ID0gMDsKICAgICAgICB9CiAgICAgICAgcGRfbGVuID0gMDsKICAgICAgICBwZF9yZWwgPSAxOwog ICAgICAgIHJldHVybiB0bXA7CiAgICAgIH0KICAgIH0KICB9CgogIGlubGluZSBUKmNvbnN0ICog Z2V0X2J1ZmZlcigpIGNvbnN0IHsKICAgIGlmIChwZF9tYXggJiYgIXBkX2RhdGEpIHsKCiAgICAg IFRfc2VxKiBzID0gY29uc3RfY2FzdDxUX3NlcSo+KHRoaXMpOwoKCgogICAgICBzLT5jb3B5YnVm ZmVyKHBkX21heCk7CiAgICB9CiAgICByZXR1cm4gcGRfZGF0YTsKICB9CgogIGlubGluZSB+X0NP UkJBX1NlcXVlbmNlX09ialJlZigpIHsKICAgIGlmIChwZF9yZWwgJiYgcGRfZGF0YSkgZnJlZWJ1 ZihwZF9kYXRhKTsKICAgIHBkX2RhdGEgPSAwOwogIH0KCgoKICBpbmxpbmUgc2l6ZV90IF9OUF9h bGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3QgewogICAgc2l6ZV90IGFsaWdu ZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKStzaXplb2YoX0NPUkJBX1VM b25nKTsKICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7CiAg ICAgIGFsaWduZWRzaXplID0gVF9IZWxwZXI6Ok5QX2FsaWduZWRTaXplKHBkX2RhdGFbaV0sYWxp Z25lZHNpemUpOwogICAgfQogICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KCiAgaW5saW5lIHZv aWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9p ZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogIGlubGluZSB2b2lkIG9wZXJh dG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0 b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKCnByb3RlY3RlZDoKICBpbmxpbmUgX0NPUkJB X1NlcXVlbmNlX09ialJlZigpCiAgICA6IHBkX21heCgwKSwgcGRfbGVuKDApLCBwZF9yZWwoMSks IHBkX2JvdW5kZWQoMCksIHBkX2RhdGEoMCkge30KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZV9P YmpSZWYoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf Q09SQkFfQm9vbGVhbiBib3VuZGVkPTApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4oMCksIHBk X3JlbCgxKSwgcGRfYm91bmRlZChib3VuZGVkKSwgcGRfZGF0YSgwKSB7fQoKICBpbmxpbmUgX0NP UkJBX1NlcXVlbmNlX09ialJlZihfQ09SQkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBUKiogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJB X0Jvb2xlYW4gcmVsZWFzZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX0Jvb2xlYW4gYm91bmRlZCA9IDApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4obGVuKSwg cGRfcmVsKHJlbGVhc2UpLAogICAgICBwZF9ib3VuZGVkKGJvdW5kZWQpLCBwZF9kYXRhKHZhbHVl KQogIHsKICAgIGlmIChsZW4gPiBtYXggfHwgKGxlbiAmJiAhdmFsdWUpKSB7CiAgICAgIF9DT1JC QV9ib3VuZF9jaGVja19lcnJvcigpOwoKICAgIH0KICB9CgogIGlubGluZSBfQ09SQkFfU2VxdWVu Y2VfT2JqUmVmKGNvbnN0IFRfc2VxJiBzKQogICAgOiBwZF9tYXgocy5wZF9tYXgpLCBwZF9sZW4o MCksIHBkX3JlbCgxKSwKICAgICAgcGRfYm91bmRlZChzLnBkX2JvdW5kZWQpLCBwZF9kYXRhKDAp IHsKICAgIGxlbmd0aChzLnBkX2xlbik7CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gMDsgaSA8 IHBkX2xlbjsgaSsrICkKICAgICAgb3BlcmF0b3JbXShpKSA9IHNbaV07CiAgfQoKICBpbmxpbmUg VF9zZXEmIG9wZXJhdG9yPSAoY29uc3QgVF9zZXEmIHMpIHsKICAgIGxlbmd0aChzLnBkX2xlbik7 CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gMDsgaSA8IHBkX2xlbjsgaSsrICkKICAgICAgb3Bl cmF0b3JbXShpKSA9IHNbaV07CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIHZvaWQg cmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFfVUxvbmcgbGVuLCBUKiogZGF0YSwKICAg ICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBpZiAo bGVuID4gbWF4IHx8IChsZW4gJiYgIWRhdGEpKSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19l cnJvcigpOwoKICAgIH0KICAgIGlmIChwZF9yZWwgJiYgcGRfZGF0YSkgewogICAgICBmcmVlYnVm KHBkX2RhdGEpOwogICAgfQogICAgcGRfbWF4ID0gbWF4OwogICAgcGRfbGVuID0gbGVuOwogICAg cGRfZGF0YSA9IGRhdGE7CiAgICBwZF9yZWwgPSByZWxlYXNlOwogIH0KCgpwcml2YXRlOgoKICB2 b2lkIGNvcHlidWZmZXIoX0NPUkJBX1VMb25nIG5ld21heCkgewoKCgogICAgVCoqIG5ld2RhdGEg PSBhbGxvY2J1ZihuZXdtYXgpOwogICAgaWYgKCFuZXdkYXRhKSB7CiAgICAgIF9DT1JCQV9uZXdf b3BlcmF0b3JfcmV0dXJuX251bGwoKTsKCiAgICB9CiAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaT0w OyBpIDwgcGRfbGVuOyBpKyspIHsKICAgICAgaWYgKHBkX3JlbCkgewogICAgICAgIG5ld2RhdGFb aV0gPSBwZF9kYXRhW2ldOwogICAgICAgIHBkX2RhdGFbaV0gPSBUX0hlbHBlcjo6X25pbCgpOwog ICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIFRfSGVscGVyOjpkdXBsaWNhdGUocGRfZGF0YVtp XSk7CiAgICAgICAgbmV3ZGF0YVtpXSA9IHBkX2RhdGFbaV07CiAgICAgIH0KICAgIH0KICAgIGlm IChwZF9yZWwgJiYgcGRfZGF0YSkgewogICAgICBmcmVlYnVmKHBkX2RhdGEpOwogICAgfQogICAg ZWxzZSB7CiAgICAgIHBkX3JlbCA9IDE7CiAgICB9CiAgICBwZF9kYXRhID0gbmV3ZGF0YTsKICAg IHBkX21heCA9IG5ld21heDsKICB9CgogIF9DT1JCQV9VTG9uZyBwZF9tYXg7CiAgX0NPUkJBX1VM b25nIHBkX2xlbjsKICBfQ09SQkFfQm9vbGVhbiBwZF9yZWw7CiAgX0NPUkJBX0Jvb2xlYW4gcGRf Ym91bmRlZDsKICBUKiogcGRfZGF0YTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3Mg RWxlbVQsIGNsYXNzIFRfSGVscGVyPgpjbGFzcyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09i alJlZiA6IHB1YmxpYyBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+IHsK cHVibGljOgogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZigpIHt9CiAg aW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKF9DT1JCQV9VTG9uZyBtYXgp CiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxl bVQsVF9IZWxwZXI+KG1heCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9P YmpSZWYoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX1VMb25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVCAqKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgICA6IF9DT1JCQV9TZXF1ZW5j ZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj4obWF4LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlu bGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZihjb25zdCBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPiYgcykKICAgICA6IF9DT1JCQV9T ZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj4ocykge30KICBpbmxpbmUgfl9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj4gJm9wZXJhdG9yPSAoY29uc3QgX0NPUkJB X1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj4gJnMpIHsKICAgIF9D T1JCQV9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj46Om9wZXJhdG9yPSAocyk7CiAg ICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcg bWF4LCBfQ09SQkFfVUxvbmcgbGVuLCBUKiogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIF9D T1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQs RWxlbVQsVF9IZWxwZXI+OjpyZXBsYWNlKG1heCxsZW4sZGF0YSxyZWxlYXNlKTsKICB9Cn07CgoK CgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgRWxlbVQsY2xhc3MgVF9IZWxwZXIsaW50IG1heD4K Y2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfT2JqUmVmCiAgOiBwdWJsaWMgX0NPUkJBX1Nl cXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPgp7CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJB X0JvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKCkgOgogICAgICAgICAgICAgICAgICAgICAgX0NPUkJB X1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPihtYXgsMSl7fQogIGlubGluZSBfQ09S QkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYoX0NPUkJBX1VMb25nIGxlbiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKip2YWx1ZSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgIDog X0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPihtYXgsbGVuLHZhbHVlLHJl bGVhc2UsMSkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKGNvbnN0 IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyLG1heD4mIHMp IDogX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPihzKSB7fQogIGlubGlu ZSB+X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKCkge30KICBpbmxpbmUgX0NPUkJBX0Jv dW5kZWRfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXIsbWF4PiAmb3BlcmF0b3I9IChj b25zdCBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcixtYXg+ ICZzKSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+OjpvcGVy YXRvcj0gKHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCgogIGlubGluZSB2b2lkIHJlcGxhY2Uo X0NPUkJBX1VMb25nIGxlbiwgVCoqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFf Qm9vbGVhbiByZWxlYXNlID0gMCkgewogICAgX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1U LFRfSGVscGVyPjo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQp9OwoKCnR5cGVk ZWYgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZV9PY3RldDsKIyAxNTEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVy bmFsLmgiIDIKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0dJT1AuaCIgMQojIDQ4 ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0dJT1AuaCIKIyAxICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL0NPUkJBX3N5c2RlcC5oIiAxCiMgNDkgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvR0lPUC5oIiAyCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9D T1JCQV9iYXNldHlwZXMuaCIgMQojIDUwICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0dJ T1AuaCIgMgojIDEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvSU9QLmgiIDEKIyA2MiAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9JT1AuaCIKY2xhc3MgSU9QIHsKcHVibGljOgog IHR5cGVkZWYgX0NPUkJBX1VMb25nIFByb2ZpbGVJZDsKICBzdGF0aWMgY29uc3QgUHJvZmlsZUlk IFRBR19JTlRFUk5FVF9JT1A7CiAgc3RhdGljIGNvbnN0IFByb2ZpbGVJZCBUQUdfTVVMVElQTEVf Q09NUE9ORU5UUzsKCiAgc3RydWN0IFRhZ2dlZFByb2ZpbGUgewogICAgUHJvZmlsZUlkIHRhZzsK ICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2N0ZXQgcHJvZmlsZV9kYXRhOwoKCiAgICBz aXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSB7CiAgICAgIHNpemVf dCBhbGlnbmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAmIH4oKGludCkzKSkKICAgICAgICAg ICAgICsgc2l6ZW9mKFByb2ZpbGVJZCk7CiAgICAgIHJldHVybiBwcm9maWxlX2RhdGEuX05QX2Fs aWduZWRTaXplKGFsaWduZWRzaXplKTsKICAgIH0KICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1 ZmZlcmVkU3RyZWFtICZzKTsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFt ICZzKTsKICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKICAgIHZv aWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKICB9OwoKICB0eXBlZGVmIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8VGFnZ2VkUHJvZmlsZT4gVGFnZ2VkUHJvZmlsZUxpc3Q7 CgogIGNsYXNzIFRhZ2dlZFByb2ZpbGVMaXN0X3ZhciB7CiAgcHVibGljOgogICAgVGFnZ2VkUHJv ZmlsZUxpc3RfdmFyKCkgeyBfcHRyID0gMDsgfQogICAgVGFnZ2VkUHJvZmlsZUxpc3RfdmFyKFRh Z2dlZFByb2ZpbGVMaXN0KiBwKSB7IF9wdHIgPSBwOyB9CiAgICBUYWdnZWRQcm9maWxlTGlzdF92 YXIoVGFnZ2VkUHJvZmlsZUxpc3RfdmFyJiBwKTsKICAgIH5UYWdnZWRQcm9maWxlTGlzdF92YXIo KSB7IGlmIChfcHRyKSBkZWxldGUgX3B0cjsgfQogICAgVGFnZ2VkUHJvZmlsZUxpc3RfdmFyJiBv cGVyYXRvcj0gKGNvbnN0IFRhZ2dlZFByb2ZpbGVMaXN0X3ZhciYgcCkgewogICAgICBpZiAocC5f cHRyKSB7CiAgICAgICAgaWYgKCFfcHRyKSB7CiAgICAgICAgICBfcHRyID0gbmV3IFRhZ2dlZFBy b2ZpbGVMaXN0OwogICAgICAgICAgaWYgKCFfcHRyKSB7CiAgICAgICAgICAgIF9DT1JCQV9uZXdf b3BlcmF0b3JfcmV0dXJuX251bGwoKTsKCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICpf cHRyID0gKnAuX3B0cjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoX3B0cikgZGVs ZXRlIF9wdHI7CiAgICAgICAgX3B0ciA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwog ICAgfQogICAgVGFnZ2VkUHJvZmlsZUxpc3RfdmFyJiBvcGVyYXRvcj0gKFRhZ2dlZFByb2ZpbGVM aXN0KiBwKSB7CiAgICAgIGlmIChfcHRyKSBkZWxldGUgX3B0cjsKICAgICAgX3B0ciA9IHA7CiAg ICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIFRhZ2dlZFByb2ZpbGUmIG9wZXJhdG9yW10gKF9D T1JCQV9VTG9uZyBpbmRleCkgewogICAgICByZXR1cm4gKF9wdHItPk5QX2RhdGEoKSlbaW5kZXhd OwogICAgfQogICAgY29uc3QgVGFnZ2VkUHJvZmlsZSYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25n IGluZGV4KSBjb25zdCB7CiAgICAgIHJldHVybiAoX3B0ci0+TlBfZGF0YSgpKVtpbmRleF07CiAg ICB9CiAgICBpbmxpbmUgVGFnZ2VkUHJvZmlsZUxpc3QqIG9wZXJhdG9yLT4oKSBjb25zdCB7CiAg ICAgIHJldHVybiAoVGFnZ2VkUHJvZmlsZUxpc3QqKV9wdHI7CiAgICB9CiAgICBUYWdnZWRQcm9m aWxlTGlzdCogX3B0cjsKICB9OwoKICBzdHJ1Y3QgSU9SIHsKICAgIF9DT1JCQV9DaGFyICp0eXBl X2lkOwogICAgVGFnZ2VkUHJvZmlsZUxpc3QgcHJvZmlsZXM7CgoKICAgIHNpemVfdCBfTlBfYWxp Z25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIHsKICAgICAgc2l6ZV90IGFsaWduZWRzaXpl ID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKQogICAgICAgICAgICAgKyBzaXplb2Yo X0NPUkJBX1VMb25nKTsKICAgICAgYWxpZ25lZHNpemUgKz0gc3RybGVuKChjb25zdCBjaGFyICop dHlwZV9pZCkgKyAxOwogICAgICByZXR1cm4gcHJvZmlsZXMuX05QX2FsaWduZWRTaXplKGFsaWdu ZWRzaXplKTsKICAgIH0KICB9OwoKICB0eXBlZGVmIF9DT1JCQV9VTG9uZyBDb21wb25lbnRJZDsK CiAgc3RydWN0IFRhZ2dlZENvbXBvbmVudCB7CiAgICBDb21wb25lbnRJZCB0YWc7CiAgICBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX09jdGV0IGNvbXBvbmVudF9kYXRhOwoKCiAgICBzaXplX3Qg X05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSB7CiAgICAgIHNpemVfdCBhbGln bmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAmIH4oKGludCkzKSkKICAgICAgICAgICAgICsg c2l6ZW9mKF9DT1JCQV9VTG9uZyk7CiAgICAgIHJldHVybiBjb21wb25lbnRfZGF0YS5fTlBfYWxp Z25lZFNpemUoYWxpZ25lZHNpemUpOwogICAgfQogICAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVm ZmVyZWRTdHJlYW0gJnMpOwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0g JnMpOwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwogICAgdm9p ZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwogIH07CgogIHR5cGVkZWYgX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZTxUYWdnZWRDb21wb25lbnQ+IE11bHRpcGxlQ29tcG9uZW50 UHJvZmlsZTsKCiAgdHlwZWRlZiBfQ09SQkFfVUxvbmcgU2VydmljZUlEOwoKICBzdHJ1Y3QgU2Vy dmljZUNvbnRleHQgewogICAgU2VydmljZUlEIGNvbnRleHRfaWQ7CiAgICBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX19PY3RldCBjb250ZXh0X2RhdGE7CgoKICAgIHNpemVfdCBfTlBfYWxpZ25l ZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIHsKICAgICAgc2l6ZV90IGFsaWduZWRzaXplID0g KChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKQogICAgICAgICAgICAgKyBzaXplb2YoX0NP UkJBX1VMb25nKTsKICAgICAgcmV0dXJuIGNvbnRleHRfZGF0YS5fTlBfYWxpZ25lZFNpemUoYWxp Z25lZHNpemUpOwogICAgfQogICAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0g JnMpOwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogICAgdm9p ZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwogICAgdm9pZCBvcGVyYXRvcjw8 PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwogIH07CgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZTxTZXJ2aWNlQ29udGV4dD4gU2VydmljZUNvbnRleHRMaXN0OwoKICBzdGF0aWMg Y29uc3QgU2VydmljZUlEIFRyYW5zYWN0aW9uU2VydmljZTsKCgoKICBzdGF0aWMgX0NPUkJBX0No YXIgKiBpb3JUb0VuY2FwU3RyKGNvbnN0IF9DT1JCQV9DaGFyICp0eXBlX2lkLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFnZ2VkUHJvZmlsZUxpc3QgKnByb2Zp bGVzKTsKCgoKCiAgc3RhdGljIHZvaWQgRW5jYXBTdHJUb0lvcihjb25zdCBfQ09SQkFfQ2hhciAq c3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0NoYXIgKiZ0eXBlX2lkLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnZ2VkUHJvZmlsZUxpc3QgKiZwcm9maWxlcyk7 CgoKCgoKfTsKIyA1MSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9HSU9QLmgiIDIKCgpj bGFzcyBHSU9QIHsKcHVibGljOgogIGVudW0gTXNnVHlwZSB7CiAgICBSZXF1ZXN0ID0gMCwKICAg IFJlcGx5ID0gMSwKICAgIENhbmNlbFJlcXVlc3QgPSAyLAogICAgTG9jYXRlUmVxdWVzdCA9IDMs CiAgICBMb2NhdGVSZXBseSA9IDQsCiAgICBDbG9zZUNvbm5lY3Rpb24gPSA1LAogICAgTWVzc2Fn ZUVycm9yID0gNgogIH07CgogIHN0cnVjdCBWZXJzaW9uIHsKICAgIF9DT1JCQV9DaGFyIG1ham9y OwogICAgX0NPUkJBX0NoYXIgbWlub3I7CiAgfTsKCiAgc3RydWN0IE1lc3NhZ2VIZWFkZXIgewog ICAgX0NPUkJBX0NoYXIgbWFnaWMgWzRdOwogICAgVmVyc2lvbiBHSU9QX3ZlcnNpb247CiAgICBf Q09SQkFfQm9vbGVhbiBieXRlX29yZGVyOwogICAgX0NPUkJBX09jdGV0IG1lc3NhZ2VfdHlwZTsK ICAgIF9DT1JCQV9VTG9uZyBtZXNzYWdlX3NpemU7CiAgfTsKCiAgY2xhc3MgUmVxdWVzdEhlYWRl ciB7CiAgcHVibGljOgogICAgSU9QOjpTZXJ2aWNlQ29udGV4dExpc3Qgc2VydmljZV9jb250ZXh0 OwogICAgX0NPUkJBX1VMb25nIHJlcXVlc3RfaWQ7CiAgICBfQ09SQkFfQm9vbGVhbiByZXNwb25z ZV9leHBlY3RlZDsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0IG9iamVjdF9r ZXk7CiAgICBfQ09SQkFfQ2hhciogb3BlcmF0aW9uOwogICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZV9fT2N0ZXQgcmVxdWVzdGluZ19wcmluY2lwYWw7CiAgfTsKCiAgZW51bSBSZXBseVN0YXR1 c1R5cGUgewogICAgTk9fRVhDRVBUSU9OLAogICAgVVNFUl9FWENFUFRJT04sCiAgICBTWVNURU1f RVhDRVBUSU9OLAogICAgTE9DQVRJT05fRk9SV0FSRAogIH07CgogIGNsYXNzIFJlcGx5SGVhZGVy IHsKICBwdWJsaWM6CiAgICBJT1A6OlNlcnZpY2VDb250ZXh0TGlzdCBzZXJ2aWNlX2NvbnRleHQ7 CiAgICBfQ09SQkFfVUxvbmcgcmVxdWVzdF9pZDsKICAgIFJlcGx5U3RhdHVzVHlwZSByZXBseV9z dGF0dXM7CiAgfTsKCiAgc3RydWN0IENhbmNlbFJlcXVlc3RIZWFkZXIgewogICAgX0NPUkJBX1VM b25nIHJlcXVlc3RfaWQ7CiAgfTsKCiAgc3RydWN0IExvY2F0ZVJlcXVlc3RIZWFkZXIgewogIHB1 YmxpYzoKICAgIF9DT1JCQV9VTG9uZyByZXF1ZXN0X2lkOwogICAgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fT2N0ZXQgb2JqZWN0X2tleTsKICB9OwoKICBlbnVtIExvY2F0ZVN0YXR1c1R5cGUg ewogICAgVU5LTk9XTl9PQkpFQ1QsCiAgICBPQkpFQ1RfSEVSRSwKICAgIE9CSkVDVF9GT1JXQVJE CiAgfTsKCiAgc3RydWN0IExvY2F0ZVJlcGx5SGVhZGVyIHsKICAgIF9DT1JCQV9VTG9uZyByZXF1 ZXN0X2lkOwogICAgTG9jYXRlU3RhdHVzVHlwZSBsb2NhdGVfc3RhdHVzOwogIH07Cn07CiMgMTUy ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyCiMgMSAiLi4v Li4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9JSU9QLmgiIDEKIyA3NiAiLi4vLi4vLi4vLi4vaW5j bHVkZS9vbW5pT1JCMy9JSU9QLmgiCmNsYXNzIElJT1AgewpwdWJsaWM6CgogIHN0cnVjdCBWZXJz aW9uIHsKICAgIF9DT1JCQV9DaGFyIG1ham9yOwogICAgX0NPUkJBX0NoYXIgbWlub3I7CiAgfTsK CgogIHN0YXRpYyBjb25zdCBfQ09SQkFfQ2hhciBjdXJyZW50X21ham9yOwogIHN0YXRpYyBjb25z dCBfQ09SQkFfQ2hhciBjdXJyZW50X21pbm9yOwoKICBzdHJ1Y3QgUHJvZmlsZUJvZHkgewogICAg VmVyc2lvbiBpaW9wX3ZlcnNpb247CiAgICBfQ09SQkFfQ2hhciogaG9zdDsKICAgIF9DT1JCQV9V U2hvcnQgcG9ydDsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2N0ZXQgb2JqZWN0X2tl eTsKCiAgICB+UHJvZmlsZUJvZHkoKSB7IGlmIChob3N0KSBkZWxldGUgW10gaG9zdDsgfQogIH07 CgogIHN0YXRpYyBjb25zdCBfQ09SQkFfVVNob3J0IERFRkFVTFRfQ09SQkFMT0NfUE9SVDsKfTsK IyAxNTMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIKIyAx ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpLZXkuaCIgMQojIDQwICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpLZXkuaCIKIyAxICIvdXNyL2luY2x1ZGUv c3RyaW5nLmgiIDEgMwojIDQxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpL ZXkuaCIgMgoKCmNsYXNzIE1lbUJ1ZmZlcmVkU3RyZWFtOwpjbGFzcyBOZXRCdWZmZXJlZFN0cmVh bTsKCgoKCgoKY2xhc3Mgb21uaU9iaktleSB7CnB1YmxpYzoKICBpbmxpbmUgb21uaU9iaktleSgp IDogcGRfa2V5KHBkX2lubGluZV9idWYpLCBwZF9zaXplKDApIHt9CgogIGlubGluZSBvbW5pT2Jq S2V5KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LCBpbnQgc2l6ZSkKICAgIDogcGRfa2V5KHBkX2lu bGluZV9idWYpLCBwZF9zaXplKHNpemUpIHsKICAgIGlmKCBzaXplID4gMTQgKSBwZF9rZXkgPSBu ZXcgX0NPUkJBX09jdGV0W3NpemVdOwogICAgbWVtY3B5KHBkX2tleSwga2V5LCBzaXplKTsKICB9 CgoKICBpbmxpbmUgb21uaU9iaktleShfQ09SQkFfT2N0ZXQqIGtleSwgaW50IHNpemUpCiAgICA6 IHBkX2tleShrZXkpLCBwZF9zaXplKHNpemUpIHsKICAgIGlmKCBzaXplIDw9IDE0ICkgewogICAg ICBwZF9rZXkgPSBwZF9pbmxpbmVfYnVmOwogICAgICBtZW1jcHkocGRfa2V5LCBrZXksIHNpemUp OwogICAgICBkZWxldGVbXSBrZXk7CiAgICB9CiAgfQoKCiAgaW5saW5lIG9tbmlPYmpLZXkob21u aU9iaktleSYgaywgaW50IHJlbGVhc2UpCiAgICA6IHBkX3NpemUoay5wZF9zaXplKSB7CiAgICBp ZiggcGRfc2l6ZSA8PSAxNCApIHsKICAgICAgcGRfa2V5ID0gcGRfaW5saW5lX2J1ZjsKICAgIH0K ICAgIGVsc2UgaWYoIHJlbGVhc2UgKSB7CgogICAgICBwZF9rZXkgPSBrLnBkX2tleTsKICAgICAg ay5wZF9rZXkgPSBrLnBkX2lubGluZV9idWY7CiAgICAgIGsucGRfc2l6ZSA9IDA7CiAgICAgIHJl dHVybjsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9rZXkgPSBuZXcgX0NPUkJBX09jdGV0W3Bk X3NpemVdOwogICAgfQogICAgbWVtY3B5KHBkX2tleSwgay5wZF9rZXksIHBkX3NpemUpOwogIH0K CgoKCiAgaW5saW5lIH5vbW5pT2JqS2V5KCkgewogICAgaWYoIHBkX2tleSAhPSBwZF9pbmxpbmVf YnVmICkgZGVsZXRlW10gcGRfa2V5OwogIH0KCiAgaW5saW5lIGNvbnN0IF9DT1JCQV9PY3RldCog a2V5KCkgY29uc3QgeyByZXR1cm4gcGRfa2V5OyB9CiAgaW5saW5lIGludCBzaXplKCkgY29uc3Qg eyByZXR1cm4gcGRfc2l6ZTsgfQoKICBpbmxpbmUgaW50IGlzX2VxdWFsKGNvbnN0IF9DT1JCQV9P Y3RldCoga2V5LCBpbnQga2V5c2l6ZSkgY29uc3QgewogICAgcmV0dXJuIGtleXNpemUgPT0gcGRf c2l6ZSAmJiAhbWVtY21wKGtleSwgcGRfa2V5LCBrZXlzaXplKTsKICB9CgogIGlubGluZSB2b2lk IHNldF9zaXplKGludCBzaXplKSB7CiAgICBpZiggc2l6ZSA+IHBkX3NpemUgJiYgc2l6ZSA+IDE0 ICkgewogICAgICBpZiggcGRfa2V5ICE9IHBkX2lubGluZV9idWYgKSBkZWxldGVbXSBwZF9rZXk7 CiAgICAgIHBkX2tleSA9IG5ldyBfQ09SQkFfT2N0ZXRbc2l6ZV07CiAgICB9CiAgICBwZF9zaXpl ID0gc2l6ZTsKICB9CiAgaW5saW5lIF9DT1JCQV9PY3RldCogd3JpdGVfa2V5KCkgeyByZXR1cm4g cGRfa2V5OyB9CgogIGlubGluZSB2b2lkIGNvcHkoY29uc3QgX0NPUkJBX09jdGV0KiBrZXksIGlu dCBrZXlzaXplKSB7CiAgICBzZXRfc2l6ZShrZXlzaXplKTsKICAgIG1lbWNweShwZF9rZXksIGtl eSwga2V5c2l6ZSk7CiAgfQoKCgoKCgoKICBpbmxpbmUgX0NPUkJBX09jdGV0KiByZXR1cm5fa2V5 KCkgewogICAgaWYoIHBkX2tleSAhPSBwZF9pbmxpbmVfYnVmICkgewogICAgICBfQ09SQkFfT2N0 ZXQqIHRtcCA9IHBkX2tleTsKICAgICAgcGRfa2V5ID0gcGRfaW5saW5lX2J1ZjsKICAgICAgcGRf c2l6ZSA9IDA7CiAgICAgIHJldHVybiB0bXA7CiAgICB9CiAgICBfQ09SQkFfT2N0ZXQqIHRtcCA9 IG5ldyBfQ09SQkFfT2N0ZXRbcGRfc2l6ZV07CiAgICBtZW1jcHkodG1wLCBwZF9rZXksIHBkX3Np emUpOwogICAgcmV0dXJuIHRtcDsKICB9Cgpwcml2YXRlOgogIF9DT1JCQV9PY3RldCBwZF9pbmxp bmVfYnVmWzE0XTsKICBfQ09SQkFfT2N0ZXQqIHBkX2tleTsKICBpbnQgcGRfc2l6ZTsKfTsKIyAx NTQgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIKIyAxICIu Li8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3RyYWNlZHRocmVhZC5oIiAxCiMgNjAgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaU9SQjMvdHJhY2VkdGhyZWFkLmgiCnR5cGVkZWYgb21uaV9tdXRl eCBvbW5pX3RyYWNlZG11dGV4Owp0eXBlZGVmIG9tbmlfbXV0ZXhfbG9jayBvbW5pX3RyYWNlZG11 dGV4X2xvY2s7CnR5cGVkZWYgb21uaV9jb25kaXRpb24gb21uaV90cmFjZWRjb25kaXRpb247CiMg MTQzICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3RyYWNlZHRocmVhZC5oIgpjbGFzcyBv bW5pX29wdGlvbmFsX2xvY2sgewpwdWJsaWM6CiAgaW5saW5lIG9tbmlfb3B0aW9uYWxfbG9jayhv bW5pX3RyYWNlZG11dGV4JiBtLCBpbnQgbG9ja2VkLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgaW50IGxvY2tlZF9vbl9leGl0KQogICAgOiBwZF9sb2NrZWQobG9ja2VkX29uX2V4aXQpLCBw ZF9tKG0pCiAgICB7IGlmKCAhbG9ja2VkICkgcGRfbS5sb2NrKCk7IH0KCiAgaW5saW5lIH5vbW5p X29wdGlvbmFsX2xvY2soKSB7IGlmKCAhcGRfbG9ja2VkICkgcGRfbS51bmxvY2soKTsgfQoKcHJp dmF0ZToKICBvbW5pX29wdGlvbmFsX2xvY2soY29uc3Qgb21uaV9vcHRpb25hbF9sb2NrJik7CiAg b21uaV9vcHRpb25hbF9sb2NrJiBvcGVyYXRvciA9IChjb25zdCBvbW5pX29wdGlvbmFsX2xvY2sm KTsKCiAgaW50IHBkX2xvY2tlZDsKICBvbW5pX3RyYWNlZG11dGV4JiBwZF9tOwp9OwojIDE1NSAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIgMgoKCgpjbGFzcyBS b3BlOwpjbGFzcyBHSU9QX1M7CmNsYXNzIEdJT1BfQzsKY2xhc3Mgb21uaU9ialJlZjsKY2xhc3Mg b21uaVNlcnZhbnQ7CmNsYXNzIG9tbmlJZGVudGl0eTsKY2xhc3Mgb21uaUxvY2FsSWRlbnRpdHk7 CmNsYXNzIG9tbmlPYmpBZGFwdGVyOwpjbGFzcyBOZXRCdWZmZXJlZFN0cmVhbTsKY2xhc3MgTWVt QnVmZmVyZWRTdHJlYW07CiMgMTc5ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlJ bnRlcm5hbC5oIgpleHRlcm4gY29uc3QgY2hhciogb21uaU9SQl8zXzA7CgoKIyAxICIuLi8uLi8u Li8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMQojIDEwNyAiLi4vLi4vLi4vLi4vaW5jbHVk ZS9vbW5pT1JCMy9yb3BlLmgiCmNsYXNzIFJvcGU7CmNsYXNzIEVuZHBvaW50OwpjbGFzcyBOZXRC dWZmZXJlZFN0cmVhbTsKY2xhc3MgU3RyYW5kX2l0ZXJhdG9yOwpjbGFzcyBSb3BlX2l0ZXJhdG9y OwoKY2xhc3MgU3RyYW5kIHsKcHVibGljOgoKICBTdHJhbmQoUm9wZSAqcik7CgoKCgoKCgogIHZp cnR1YWwgflN0cmFuZCgpOwoKCgoKCgoKICB2aXJ0dWFsIHNpemVfdCBNYXhNVFUoKSBjb25zdCA9 IDA7CgoKICBzdHJ1Y3Qgc2J1ZiB7CiAgICB2b2lkICpidWZmZXI7CiAgICBzaXplX3Qgc2l6ZTsK ICB9OwoKICB2aXJ0dWFsIHNidWYgcmVjZWl2ZShzaXplX3Qgc2l6ZSxfQ09SQkFfQm9vbGVhbiBl eGFjdGx5LAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbixfQ09SQkFfQm9vbGVhbiBz dGFydE1UVT0wKT0wOwojIDE3OCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgi CiAgdmlydHVhbCB2b2lkIGdpdmViYWNrX3JlY2VpdmVkKHNpemVfdCBsZWZ0b3Zlcik9MDsKIyAx OTMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZpcnR1YWwgc2l6ZV90 IG1heF9yZWNlaXZlX2J1ZmZlcl9zaXplKCk9MDsKCgoKCiAgdmlydHVhbCB2b2lkIHJlY2VpdmVf YW5kX2NvcHkoc2J1ZiBiLF9DT1JCQV9Cb29sZWFuIHN0YXJ0TVRVPTApID0gMDsKIyAyMjMgIi4u Ly4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZpcnR1YWwgdm9pZCBza2lwKHNp emVfdCBzaXplLF9DT1JCQV9Cb29sZWFuIHN0YXJ0TVRVPTApID0gMDsKIyAyNDEgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZpcnR1YWwgc2J1ZiByZXNlcnZlKHNpemVf dCBzaXplLF9DT1JCQV9Cb29sZWFuIGV4YWN0bHksaW50IGFsaWduLAogICAgICAgICAgICAgICAg ICAgICAgIF9DT1JCQV9Cb29sZWFuIHRyYW5zbWl0PTAsX0NPUkJBX0Jvb2xlYW4gZW5kTVRVPTAp PTA7CiMgMjc1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICB2aXJ0dWFs IHNidWYgcmVzZXJ2ZV9hbmRfc3RhcnRNVFUoc2l6ZV90IHNpemUsX0NPUkJBX0Jvb2xlYW4gZXhh Y3RseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduLF9DT1JC QV9Cb29sZWFuIHRyYW5zbWl0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9DT1JCQV9Cb29sZWFuIGF0X21vc3Rfb25jZT0wKT0wOwoKCgoKICB2aXJ0dWFsIHZvaWQgZ2l2 ZWJhY2tfcmVzZXJ2ZWQoc2l6ZV90IGxlZnRvdmVyLF9DT1JCQV9Cb29sZWFuIHRyYW5zbWl0PTAs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGVuZE1UVT0w KT0wOwojIDMwOCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiCiAgdmlydHVh bCBzaXplX3QgbWF4X3Jlc2VydmVfYnVmZmVyX3NpemUoKSA9IDA7CgoKCgogIHZpcnR1YWwgdm9p ZCByZXNlcnZlX2FuZF9jb3B5KHNidWYgYixfQ09SQkFfQm9vbGVhbiB0cmFuc21pdD0wLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGVuZE1UVT0wKSA9IDA7 CiMgMzM4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICBpbmxpbmUgX0NP UkJBX1VMb25nIHNlcXVlbmNlTnVtYmVyKCkgeyByZXR1cm4gcGRfc2VxTnVtYmVyKys7IH0KIyAz NTAgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZvaWQgc2h1dGRvd24o KTsKIyAzNjIgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZpcnR1YWwg dm9pZCByZWFsX3NodXRkb3duKCkgPSAwOwojIDM3NCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5p T1JCMy9yb3BlLmgiCiAgdm9pZCBpbmNyUmVmQ291bnQoX0NPUkJBX0Jvb2xlYW4gaGVsZF9yb3Bl X211dGV4ID0gMCk7CiMgMzgzICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIK ICB2b2lkIGRlY3JSZWZDb3VudChfQ09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXggPSAwKTsK IyAzOTIgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIF9DT1JCQV9Cb29s ZWFuIGlzX2lkbGUoX0NPUkJBX0Jvb2xlYW4gaGVsZF9yb3BlX211dGV4ID0gMCk7CiMgNDAzICIu Li8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICBfQ09SQkFfQm9vbGVhbiBpc191 bnVzZWQoX0NPUkJBX0Jvb2xlYW4gaGVsZF9yb3BlX211dGV4ID0gMCk7CiMgNDE1ICIuLi8uLi8u Li8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICBjbGFzcyBTeW5jIHsKCiAgcHVibGljOgog ICAgU3luYyhTdHJhbmQgKnMsX0NPUkJBX0Jvb2xlYW4gUmRMb2NrPTEsX0NPUkJBX0Jvb2xlYW4g V3JMb2NrPTEpOwojIDQzNyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiCiAg ICBTeW5jKFJvcGUgKnIsX0NPUkJBX0Jvb2xlYW4gUmRMb2NrPTEsX0NPUkJBX0Jvb2xlYW4gV3JM b2NrPTEpOwojIDQ0OSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiCiAgICB+ U3luYygpOwojIDQ2OCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiCiAgICBf Q09SQkFfQm9vbGVhbiBpc1JlVXNpbmdFeGlzdGluZ0Nvbm5lY3Rpb24oKSBjb25zdDsKIyA0ODEg Ii4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHByb3RlY3RlZDoKICAgIHZv aWQgUmRMb2NrKF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleD0wKTsKICAgIHZvaWQgV3JM b2NrKF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleD0wKTsKICAgIHZvaWQgUmRVbmxvY2so X0NPUkJBX0Jvb2xlYW4gaGVsZF9yb3BlX211dGV4PTApOwogICAgdm9pZCBXclVubG9jayhfQ09S QkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXg9MCk7CiMgNTA1ICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL3JvcGUuaCIKICBwdWJsaWM6CiAgICBzdGF0aWMgaW50IGNsaWNrc0RlY3JBbmRH ZXQoU3RyYW5kKnMpOwojIDUxNSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgi CiAgICBzdGF0aWMgaW50IGNsaWNrc0dldChTdHJhbmQqcyk7CiMgNTI0ICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICBwcm90ZWN0ZWQ6CiAgICB2b2lkIGNsaWNrc1NldChp bnQgY2xpY2tzLCBfQ09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXg9MCk7CiMgNTM1ICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICAgIGlubGluZSBTdHJhbmQgKmdldF9z dHJhbmQoKSB7IHJldHVybiBwZF9zdHJhbmQ7IH0KCgoKICAgIHZvaWQgc2V0U3RyYW5kSXNEeWlu ZygpOwoKCgoKICAgIF9DT1JCQV9Cb29sZWFuIHN0cmFuZElzRHlpbmcoKTsKCgoKCiAgcHJpdmF0 ZToKICAgIFN0cmFuZCogZ2V0TG9ja2FibGVTdHJhbmQoUm9wZSogcm9wZSwgX0NPUkJBX0Jvb2xl YW4mIHNlY29uZEhhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29s ZWFuIHJkbG9jaywgX0NPUkJBX0Jvb2xlYW4gd3Jsb2NrKTsKCgoKCgogICAgU3RyYW5kKiBnZXRM b2NrZWRTdHJhbmQoUm9wZSogcm9wZSwgX0NPUkJBX0Jvb2xlYW4mIHNlY29uZEhhbmQsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZGxvY2ssIF9DT1JCQV9Cb29s ZWFuIHdybG9jayk7CgoKCgogICAgU3RyYW5kICpwZF9zdHJhbmQ7CiAgICBfQ09SQkFfQm9vbGVh biBwZF9zZWNvbmRIYW5kOwogICAgU3luYygpOwogIH07CgogIGlubGluZSBfQ09SQkFfQm9vbGVh biBfc3RyYW5kSXNEeWluZygpIHsgcmV0dXJuIHBkX2R5aW5nOyB9Cgpwcm90ZWN0ZWQ6CgogIGlu bGluZSB2b2lkIF9zZXRTdHJhbmRJc0R5aW5nKCkgeyBwZF9keWluZyA9IDE7IH0KICBpbmxpbmUg X0NPUkJBX0Jvb2xlYW4gaXNPdXRnb2luZygpOwoKICBmcmllbmQgY2xhc3MgU3luYzsKICBmcmll bmQgY2xhc3MgU3RyYW5kX2l0ZXJhdG9yOwogIGZyaWVuZCBjbGFzcyBSb3BlOwogIGZyaWVuZCBj bGFzcyBSb3BlX2l0ZXJhdG9yOwoKcHJpdmF0ZToKICBvbW5pX2NvbmRpdGlvbiBwZF9yZGNvbmQ7 CiAgaW50IHBkX3JkX253YWl0aW5nOwoKICBvbW5pX2NvbmRpdGlvbiBwZF93cmNvbmQ7CiAgaW50 IHBkX3dyX253YWl0aW5nOwoKICBpbnQgcGRfdXNlQ291bnQ7CgoKCiAgU3RyYW5kICpwZF9uZXh0 OwogIFJvcGUgKnBkX3JvcGU7CiAgX0NPUkJBX0Jvb2xlYW4gcGRfZHlpbmc7CiAgaW50IHBkX3Jl ZmNvdW50OwogIF9DT1JCQV9VTG9uZyBwZF9zZXFOdW1iZXI7CiAgaW50IHBkX2NsaWNrczsKCnB1 YmxpYzoKICBTdHJhbmQgKnBkX3JpcHBlcl9uZXh0OwoKCgogIFN0cmFuZCgpOwogIFN0cmFuZChj b25zdCBTdHJhbmQmKTsKICBTdHJhbmQgJm9wZXJhdG9yPShjb25zdCBTdHJhbmQmKTsKfTsKCnR5 cGVkZWYgU3RyYW5kOjpTeW5jIFN0cmFuZF9TeW5jOwoKY2xhc3MgRW5kcG9pbnQgewpwdWJsaWM6 CiAgaW5saW5lIEVuZHBvaW50KF9DT1JCQV9DaGFyICpwcm90b2NvbCkgewogICAgcGRfcHJvdG9j b2xuYW1lID0gbmV3IF9DT1JCQV9DaGFyIFtzdHJsZW4oKGNoYXIgKilwcm90b2NvbCkrMV07CiAg ICBzdHJjcHkoKGNoYXIgKilwZF9wcm90b2NvbG5hbWUsKGNoYXIgKilwcm90b2NvbCk7CiAgICBy ZXR1cm47CiAgfQoKICBpbmxpbmUgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQgJmUpIHsKICAgIHBk X3Byb3RvY29sbmFtZSA9IG5ldyBfQ09SQkFfQ2hhciBbc3RybGVuKChjaGFyICopZS5wZF9wcm90 b2NvbG5hbWUpKzFdOwogICAgc3RyY3B5KChjaGFyICopcGRfcHJvdG9jb2xuYW1lLChjaGFyICop ZS5wZF9wcm90b2NvbG5hbWUpOwogICAgcmV0dXJuOwogIH0KCiAgaW5saW5lIEVuZHBvaW50ICZv cGVyYXRvcj0oY29uc3QgRW5kcG9pbnQgJmUpIHsKICAgIGRlbGV0ZSBbXSBwZF9wcm90b2NvbG5h bWU7CiAgICBwZF9wcm90b2NvbG5hbWUgPSBuZXcgX0NPUkJBX0NoYXIgW3N0cmxlbigoY2hhciAq KWUucGRfcHJvdG9jb2xuYW1lKSsxXTsKICAgIHN0cmNweSgoY2hhciAqKXBkX3Byb3RvY29sbmFt ZSwoY2hhciAqKWUucGRfcHJvdG9jb2xuYW1lKTsKICAgIHJldHVybiAqdGhpczsKICB9CgogIHZp cnR1YWwgfkVuZHBvaW50KCk7CgogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBpc19wcm90b2NvbChj b25zdCBfQ09SQkFfQ2hhciAqbmFtZSkgY29uc3QgewogICAgaWYgKHN0cmNtcCgoY29uc3QgY2hh ciAqKW5hbWUsKGNoYXIgKilwZF9wcm90b2NvbG5hbWUpID09IDApIHsKICAgICAgcmV0dXJuIDE7 CiAgICB9CiAgICBlbHNlIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKICBpbmxpbmUgX0NP UkJBX0NoYXIqIHByb3RvY29sKCkgY29uc3QgewogICAgcmV0dXJuIHBkX3Byb3RvY29sbmFtZTsK ICB9Cgpwcml2YXRlOgogIF9DT1JCQV9DaGFyICogcGRfcHJvdG9jb2xuYW1lOwogIEVuZHBvaW50 KCk7Cn07CgpjbGFzcyBFbmRwb2ludF92YXIgewpwdWJsaWM6CiAgaW5saW5lIEVuZHBvaW50X3Zh cigpIDogcGRfcCgwKSB7fQogIGlubGluZSBFbmRwb2ludF92YXIoRW5kcG9pbnQqIHApIDogcGRf cChwKSB7fQogIGlubGluZSB+RW5kcG9pbnRfdmFyKCkgeyBpZiAocGRfcCkgZGVsZXRlIHBkX3A7 IH0KICBpbmxpbmUgRW5kcG9pbnRfdmFyJiBvcGVyYXRvcj0oRW5kcG9pbnQqIHApIHsKICAgIGlm IChwZF9wKSBkZWxldGUgcGRfcDsKICAgIHBkX3AgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0K ICBpbmxpbmUgb3BlcmF0b3IgRW5kcG9pbnQqKCkgY29uc3QgeyByZXR1cm4gcGRfcDsgfQpwcml2 YXRlOgogIEVuZHBvaW50KiBwZF9wOwogIEVuZHBvaW50X3ZhciYgb3BlcmF0b3I9KGNvbnN0IEVu ZHBvaW50X3ZhciYpOwp9OwoKY2xhc3MgU3RyYW5kX2l0ZXJhdG9yIHsKcHVibGljOgogIFN0cmFu ZF9pdGVyYXRvcihjb25zdCBSb3BlICpyLF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleCA9 IDApOwojIDY3OCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiCiAgflN0cmFu ZF9pdGVyYXRvcigpOwojIDY4NyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgi CiAgU3RyYW5kICpvcGVyYXRvcigpICgpOwoKCgoKcHJpdmF0ZToKICBjb25zdCBSb3BlICpwZF9y b3BlOwogIF9DT1JCQV9Cb29sZWFuIHBkX2xlYXZlX211dGV4OwogIF9DT1JCQV9Cb29sZWFuIHBk X2luaXRpYWxpc2VkOwogIFN0cmFuZCAqcGRfczsKICBTdHJhbmRfaXRlcmF0b3IoKTsKfTsKCmNs YXNzIEFuY2hvciB7CnB1YmxpYzoKICBBbmNob3IoKTsKICB+QW5jaG9yKCk7Cgpwcml2YXRlOgog IGZyaWVuZCBjbGFzcyBSb3BlOwogIGZyaWVuZCBjbGFzcyBSb3BlX2l0ZXJhdG9yOwoKICBvbW5p X211dGV4IHBkX2xvY2s7CiAgUm9wZSAqcGRfaGVhZDsKfTsKCgoKY2xhc3MgUm9wZSB7CnB1Ymxp YzoKICBSb3BlKEFuY2hvciAqYSwKICAgICAgIHVuc2lnbmVkIGludCBtYXhTdHJhbmRzKTsKCgoK CgoKCiAgdmlydHVhbCB+Um9wZSgpOwoKCgoKCgoKICB2aXJ0dWFsIHZvaWQgQ3V0U3RyYW5kcyhf Q09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXggPSAwKTsKIyA3NDMgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvb21uaU9SQjMvcm9wZS5oIgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfaW5jb21p bmcoKSBjb25zdCA9IDA7CgoKCgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfb3V0Z29pbmco KSBjb25zdCA9IDA7CgoKCgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gcmVtb3RlX2lzKEVuZHBv aW50IComZSkgPSAwOwoKCgoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIHRoaXNfaXMoRW5k cG9pbnQgKiZlKSA9IDA7CgoKCgoKCiAgdm9pZCBpbmNyUmVmQ291bnQoX0NPUkJBX0Jvb2xlYW4g aGVsZF9hbmNob3JfbXV0ZXggPSAwKTsKIyA3NzcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9S QjMvcm9wZS5oIgogIHZvaWQgZGVjclJlZkNvdW50KF9DT1JCQV9Cb29sZWFuIGhlbGRfYW5jaG9y X211dGV4ID0gMCk7CiMgNzg2ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIK ICBfQ09SQkFfQm9vbGVhbiBpc19pZGxlKF9DT1JCQV9Cb29sZWFuIGhlbGRfYW5jaG9yX211dGV4 ID0gMCk7CiMgNzk2ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIKICBpbmxp bmUgQW5jaG9yKiBhbmNob3IoKSBjb25zdCB7IHJldHVybiBwZF9hbmNob3I7IH0KCiAgZnJpZW5k IGNsYXNzIFN0cmFuZDsKICBmcmllbmQgY2xhc3MgU3RyYW5kX2l0ZXJhdG9yOwogIGZyaWVuZCBj bGFzcyBSb3BlX2l0ZXJhdG9yOwogIGZyaWVuZCBjbGFzcyBTdHJhbmQ6OlN5bmM7Cgpwcm90ZWN0 ZWQ6CgogIG9tbmlfbXV0ZXggcGRfbG9jazsKICBvbW5pX2NvbmRpdGlvbiBwZF9jb25kOwogIGlu dCBwZF9jb25kX2NvdW50ZXI7CgogIHZpcnR1YWwgU3RyYW5kKiBnZXRTdHJhbmQoX0NPUkJBX0Jv b2xlYW4mIHNlY29uZEhhbmQpOwojIDgyOSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9y b3BlLmgiCiAgdmlydHVhbCBTdHJhbmQgKm5ld1N0cmFuZCgpID0gMDsKIyA4NTMgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIgpwcml2YXRlOgoKCiAgdW5zaWduZWQgaW50IHBk X21heFN0cmFuZHM7CgogIFN0cmFuZCAqcGRfaGVhZDsKICBSb3BlICpwZF9uZXh0OwogIEFuY2hv ciAqcGRfYW5jaG9yOwogIGludCBwZF9yZWZjb3VudDsKCiAgUm9wZSgpOwp9OwoKY2xhc3MgUm9w ZV92YXIgewpwdWJsaWM6CiAgaW5saW5lIFJvcGVfdmFyKCkgOiBfcHRyKDApIHt9CgogIGlubGlu ZSBSb3BlX3ZhcihSb3BlKiBwKSB7IF9wdHIgPSBwOyB9CgogIGlubGluZSB+Um9wZV92YXIoKSB7 CiAgICBpZiAoX3B0cikKICAgICAgX3B0ci0+ZGVjclJlZkNvdW50KCk7CiAgfQoKICBpbmxpbmUg Um9wZV92YXIoY29uc3QgUm9wZV92YXImIHApIHsKICAgIGlmIChwLl9wdHIpIHsKICAgICAgcC5f cHRyLT5pbmNyUmVmQ291bnQoKTsKICAgIH0KICAgIF9wdHIgPSBwLl9wdHI7CiAgfQoKICBpbmxp bmUgUm9wZV92YXImIG9wZXJhdG9yPSAoY29uc3QgUm9wZV92YXImIHApIHsKICAgIGlmIChfcHRy KSB7CiAgICAgIF9wdHItPmRlY3JSZWZDb3VudCgpOwogICAgICBfcHRyID0gMDsKICAgIH0KICAg IGlmIChwLl9wdHIpIHsKICAgICAgcC5fcHRyLT5pbmNyUmVmQ291bnQoKTsKICAgIH0KICAgIF9w dHIgPSBwLl9wdHI7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgUm9wZV92YXImIG9w ZXJhdG9yPSAoUm9wZSogcCkgewogICAgaWYgKF9wdHIpIHsKICAgICAgX3B0ci0+ZGVjclJlZkNv dW50KCk7CiAgICAgIF9wdHIgPSAwOwogICAgfQogICAgX3B0ciA9IHA7CiAgICByZXR1cm4gKnRo aXM7CiAgfQoKICBpbmxpbmUgUm9wZSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIF9wdHI7 IH0KCiAgaW5saW5lIG9wZXJhdG9yIFJvcGUqKCkgY29uc3QgeyByZXR1cm4gX3B0cjsgfQoKICBS b3BlKiBfcHRyOwp9OwoKY2xhc3Mgcm9wZUZhY3Rvcnk7CgpjbGFzcyBSb3BlX2l0ZXJhdG9yIHsK cHVibGljOgogIFJvcGVfaXRlcmF0b3IoY29uc3QgQW5jaG9yICphKTsKCgoKCgoKCiAgUm9wZV9p dGVyYXRvcihyb3BlRmFjdG9yeSogcmYpOwojIDkzMyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5p T1JCMy9yb3BlLmgiCiAgflJvcGVfaXRlcmF0b3IoKTsKCgoKCgoKCiAgUm9wZSAqb3BlcmF0b3Io KSAoKTsKCnByaXZhdGU6CiAgY29uc3QgQW5jaG9yICpwZF9hbmNob3I7CiAgUm9wZSAqcGRfcjsK ICBSb3BlX2l0ZXJhdG9yKCk7Cn07CgoKaW5saW5lCl9DT1JCQV9Cb29sZWFuClN0cmFuZDo6aXNP dXRnb2luZygpIHsKICByZXR1cm4gcGRfcm9wZS0+aXNfb3V0Z29pbmcoKTsKfQojIDE4MyAiLi4v Li4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIgMgoKCgoKCgpjbGFzcyBv bW5pIHsKCnB1YmxpYzoKCgogIHR5cGVkZWYgbG9uZyBwdHJfYXJpdGhfdDsKCgoKCgoKICBlbnVt IGFsaWdubWVudF90IHsgQUxJR05fMSA9IDEsIEFMSUdOXzIgPSAyLCBBTElHTl80ID0gNCwgQUxJ R05fOCA9IDggfTsKCgogIHN0YXRpYyBjb25zdCBfQ09SQkFfQ2hhciBteUJ5dGVPcmRlcjsKICBz dGF0aWMgb21uaV90cmFjZWRtdXRleCogaW50ZXJuYWxMb2NrOwogIHN0YXRpYyBvbW5pX3RyYWNl ZG11dGV4KiBvYmpyZWZfcmNfbG9jazsKCiAgc3RhdGljIG9tbmlfdHJhY2VkbXV0ZXgqIHBvUmNM b2NrOwoKCiAgc3RhdGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0IG15UHJpbmNp cGFsSUQ7CiAgc3RhdGljIGNvbnN0IGFsaWdubWVudF90IG1heF9hbGlnbm1lbnQ7CgoKICBzdGF0 aWMgY29uc3QgY2hhcipjb25zdCBlbXB0eV9zdHJpbmc7CgoKCiAgc3RhdGljIGludCByZW1vdGVJ bnZvY2F0aW9uQ291bnQ7CiAgc3RhdGljIGludCBsb2NhbEludm9jYXRpb25Db3VudDsKCgoKCgog IHN0YXRpYyBpbmxpbmUgcHRyX2FyaXRoX3QgYWxpZ25fdG8ocHRyX2FyaXRoX3QgcCwgYWxpZ25t ZW50X3QgYWxpZ24pIHsKICAgIHJldHVybiAocCArICgoaW50KSBhbGlnbiAtIDEpKSAmIH4oKGlu dCkgYWxpZ24gLSAxKTsKICB9CgogIHN0YXRpYyBfQ09SQkFfVUxvbmcgaGFzaChjb25zdCBfQ09S QkFfT2N0ZXQqIGtleSwgaW50IGtleXNpemUpOwoKCgogIHN0YXRpYyBpbmxpbmUgY2hhciogYWxs b2NTdHJpbmcoaW50IGxlbikgeyByZXR1cm4gbmV3IGNoYXJbbGVuICsgMV07IH0KCgoKCiAgc3Rh dGljIGlubGluZSB2b2lkIGZyZWVTdHJpbmcoY2hhciogcykgewogICAgaWYgKHMgJiYgcyAhPSBl bXB0eV9zdHJpbmcpIGRlbGV0ZVtdIHM7CiAgfQoKCiAgc3RhdGljIG9tbmlfdHJhY2VkbXV0ZXgm IG5pbFJlZkxvY2soKTsKCgoKCiAgc3RhdGljIHZvaWQgZHVwbGljYXRlT2JqUmVmKG9tbmlPYmpS ZWYqKTsKCgogIHN0YXRpYyB2b2lkIHJlbGVhc2VPYmpSZWYob21uaU9ialJlZiopOwoKCiAgc3Rh dGljIG9tbmlTZXJ2YW50KiBvYmpSZWZUb1NlcnZhbnQob21uaU9ialJlZiogb2JqKTsKCgoKCgoK ICBzdGF0aWMgb21uaUxvY2FsSWRlbnRpdHkqIGxvY2F0ZUlkZW50aXR5KGNvbnN0IF9DT1JCQV9P Y3RldCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50 IGtleXNpemUsIF9DT1JCQV9VTG9uZyBoYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gY3JlYXRlX2R1bW15ID0gMCk7CgoKCgoKCiAg c3RhdGljIG9tbmlMb2NhbElkZW50aXR5KiBhY3RpdmF0ZU9iamVjdChvbW5pU2VydmFudCogc2Vy dmFudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlPYmpB ZGFwdGVyKiBhZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgb21uaU9iaktleSYga2V5KTsKIyAyODMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMv b21uaUludGVybmFsLmgiCiAgc3RhdGljIG9tbmlMb2NhbElkZW50aXR5KiBkZWFjdGl2YXRlT2Jq ZWN0KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpbnQga2V5c2l6ZSk7CiMgMzAyICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIgogIHN0YXRpYyBvbW5pT2JqUmVmKiBjcmVhdGVPYmpS ZWYoY29uc3QgY2hhciogbW9zdERlcml2ZWRSZXBvSWQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBjaGFyKiB0YXJnZXRSZXBvSWQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiBwcm9maWxlcywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2VfcHJvZmlsZXMs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBsb2NrZWQp OwoKCgoKCgoKICBzdGF0aWMgb21uaU9ialJlZiogY3JlYXRlT2JqUmVmKGNvbnN0IGNoYXIqIG1v c3REZXJpdmVkUmVwb0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg Y2hhciogdGFyZ2V0UmVwb0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21u aUxvY2FsSWRlbnRpdHkqIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9Q OjpUYWdnZWRQcm9maWxlTGlzdCogcHJvZmlsZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZV9wcm9maWxlcyA9IDAsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfT2N0ZXQqIGtleSA9IDApOwojIDMzMSAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIKICBzdGF0aWMgdm9p ZCByZXZlcnRUb09yaWdpbmFsUHJvZmlsZShvbW5pT2JqUmVmKiBvYmpyZWYpOwoKCgoKCgoKICBz dGF0aWMgdm9pZCBsb2NhdGlvbkZvcndhcmQob21uaU9ialJlZiogb2JqLCBvbW5pT2JqUmVmKiBu ZXdfbG9jYXRpb24pOwojIDM0OSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50 ZXJuYWwuaCIKICBzdGF0aWMgdm9pZCBhc3NlcnRGYWlsKGNvbnN0IGNoYXIqIGZpbGUsIGludCBs aW5lLCBjb25zdCBjaGFyKiBleHApOwogIHN0YXRpYyB2b2lkIHVjaGVja0ZhaWwoY29uc3QgY2hh ciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGV4cCk7Cgp9OwoKCgoKCmNsYXNzIG9tbmlS b3BlQW5kS2V5IHsKcHVibGljOgogIGlubGluZSBvbW5pUm9wZUFuZEtleShSb3BlKiByLCBjb25z dCBfQ09SQkFfT2N0ZXQqIGssIGludCBrc2l6ZSkKICAgIDogcGRfcm9wZShyKSwgcGRfa2V5KGss IGtzaXplKQogICAgeyByLT5pbmNyUmVmQ291bnQoKTsgfQoKICBpbmxpbmUgb21uaVJvcGVBbmRL ZXkoKSA6IHBkX3JvcGUoMCkge30KCiAgaW5saW5lIH5vbW5pUm9wZUFuZEtleSgpIHsgaWYoIHBk X3JvcGUgKSBwZF9yb3BlLT5kZWNyUmVmQ291bnQoKTsgfQoKICBpbmxpbmUgUm9wZSogcm9wZSgp IGNvbnN0IHsgcmV0dXJuIHBkX3JvcGU7IH0KICBpbmxpbmUgY29uc3QgX0NPUkJBX09jdGV0KiBr ZXkoKSBjb25zdCB7CiAgICByZXR1cm4gcGRfa2V5LmtleSgpOwogIH0KICBpbmxpbmUgX0NPUkJB X1VMb25nIGtleXNpemUoKSBjb25zdCB7IHJldHVybiBwZF9rZXkuc2l6ZSgpOyB9CgogIGlubGlu ZSB2b2lkIHJvcGUoUm9wZSogcikgeyBwZF9yb3BlID0gcjsgci0+aW5jclJlZkNvdW50KCk7IH0K ICBpbmxpbmUgdm9pZCBrZXkoY29uc3QgX0NPUkJBX09jdGV0KiBrLCBpbnQga3NpemUpIHsgcGRf a2V5LmNvcHkoaywga3NpemUpOyB9Cgpwcml2YXRlOgogIG9tbmlSb3BlQW5kS2V5JiBvcGVyYXRv cj0oY29uc3Qgb21uaVJvcGVBbmRLZXkmKTsKICBvbW5pUm9wZUFuZEtleShjb25zdCBvbW5pUm9w ZUFuZEtleSYpOwoKCiAgUm9wZSogcGRfcm9wZTsKICBvbW5pT2JqS2V5IHBkX2tleTsKfTsKIyA0 MDcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiCiMgMSAiLi4v Li4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9idWZmZXJlZFN0cmVhbS5oIiAxCiMgMTY2ICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2J1ZmZlcmVkU3RyZWFtLmgiCmNsYXNzIE5ldEJ1ZmZl cmVkU3RyZWFtIDogcHVibGljIFN0cmFuZF9TeW5jIHsKcHVibGljOgogIE5ldEJ1ZmZlcmVkU3Ry ZWFtKFN0cmFuZCAqcywKICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBSZExvY2s9 MSwKICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBXckxvY2s9MSwKICAgICAgICAg ICAgICAgICAgICBzaXplX3QgQnVmc2l6ZT0wKTsKICBOZXRCdWZmZXJlZFN0cmVhbShSb3BlICpy LAogICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIFJkTG9jaz0xLAogICAgICAgICAg ICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIFdyTG9jaz0xLAogICAgICAgICAgICAgICAgICAgIHNp emVfdCBCdWZzaXplPTApOwogIH5OZXRCdWZmZXJlZFN0cmVhbSgpOwoKICBmcmllbmQgaW5saW5l IHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9DaGFyIGEsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7 CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICopIChzKS5hbGlnbl9hbmRfcHV0 X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFyKSk7ICpwID0gYTsgfTsKICB9 CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX0NoYXImIGEsIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICop IChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFy KSk7IGEgPSAqcDsgfTsKICB9CgoKCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChf Q09SQkFfQm9vbGVhbiBiLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgX0NPUkJBX0NoYXIg YyA9IGIgPyAxIDogMDsKICAgIHsgX0NPUkJBX0NoYXIgKnAgPSAoX0NPUkJBX0NoYXIgKikgKHMp LmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fMSxzaXplb2YoX0NPUkJBX0NoYXIpKTsg KnAgPSBjOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChfQ09SQkFf Qm9vbGVhbiYgYiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIF9DT1JCQV9DaGFyIGM7CiAg ICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5 dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFyKSk7IGMgPSAqcDsgfTsKICAgIGIg PSBjID8gdHJ1ZSA6IGZhbHNlOwogIH0KCgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+ Pj0gKF9DT1JCQV9TaG9ydCBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFf U2hvcnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6 OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQg aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9TaG9ydCYgYSwgTmV0QnVmZmVyZWRTdHJl YW0mIHMpIHsKICAgIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9y ZGVyKSB7CiAgICAgIF9DT1JCQV9TaG9ydCB0OwogICAgICB7IF9DT1JCQV9TaG9ydCAqcCA9IChf Q09SQkFfU2hvcnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXpl b2YoX0NPUkJBX1Nob3J0KSk7IHQgPSAqcDsgfTsKICAgICAgYSA9ICgoKCh0KSAmIDB4ZmYpIDw8 IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09S QkFfU2hvcnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9t bmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyBhID0gKnA7IH07CiAgICB9CiAgICBy ZXR1cm47CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9VU2hv cnQgYSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX1VTaG9ydCAqcCA9IChf Q09SQkFfVVNob3J0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzIsc2l6 ZW9mKF9DT1JCQV9VU2hvcnQpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lk IG9wZXJhdG9yPDw9IChfQ09SQkFfVVNob3J0JiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewog ICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAg ICAgX0NPUkJBX1VTaG9ydCB0OwogICAgICB7IF9DT1JCQV9VU2hvcnQgKnAgPSAoX0NPUkJBX1VT aG9ydCAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl8yLHNpemVvZihfQ09S QkFfVVNob3J0KSk7IHQgPSAqcDsgfTsKICAgICAgYSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwg KCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfVVNo b3J0ICpwID0gKF9DT1JCQV9VU2hvcnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6 QUxJR05fMixzaXplb2YoX0NPUkJBX1VTaG9ydCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1 cm47CiAgfQoKCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChfQ09SQkFfTG9uZyBh LCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFfTG9uZyAqcCA9IChfQ09SQkFf TG9uZyAqKSAocykuYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09S QkFfTG9uZykpOyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8 PD0gKF9DT1JCQV9Mb25nJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRN ZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0xv bmcgdDsKICAgICAgeyBfQ09SQkFfTG9uZyAqcCA9IChfQ09SQkFfTG9uZyAqKSAocykuYWxpZ25f YW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09SQkFfTG9uZykpOyB0ID0gKnA7 IH07CiAgICAgIGEgPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0KSAmIDB4MDBm ZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHQpICYgMHgwMDAw MDBmZikgPDwgMjQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9Mb25nICpwID0g KF9DT1JCQV9Mb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6 ZW9mKF9DT1JCQV9Mb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZy aWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1VMb25nIGEsIE5ldEJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9VTG9uZyAqcCA9IChfQ09SQkFfVUxvbmcgKikgKHMp LmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX1VMb25nKSk7 ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJB X1VMb25nJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0 ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX1VMb25nIHQ7CiAg ICAgIHsgX0NPUkJBX1VMb25nICpwID0gKF9DT1JCQV9VTG9uZyAqKSAocykuYWxpZ25fYW5kX2dl dF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09SQkFfVUxvbmcpKTsgdCA9ICpwOyB9Owog ICAgICBhID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAweDAwZmYwMDAw KSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYp IDw8IDI0KSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfVUxvbmcgKnAgPSAoX0NP UkJBX1VMb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9m KF9DT1JCQV9VTG9uZykpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKCgogIGZy aWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX0xvbmdMb25nIGEsIE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9Mb25nTG9uZyAqcCA9IChfQ09SQkFfTG9uZ0xv bmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJB X0xvbmdMb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRv cjw8PSAoX0NPUkJBX0xvbmdMb25nJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYg KHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NP UkJBX0xvbmdMb25nIHQ7CiAgICAgIHsgX0NPUkJBX0xvbmdMb25nICpwID0gKF9DT1JCQV9Mb25n TG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09S QkFfTG9uZ0xvbmcpKTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgoKHQpICYgKDB4ZmYwMDAwMDAw MDAwMDAwMExMKSkgPj4gNTYpIHwgKCgodCkgJiAoMHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+PiA0 MCkgfCAoKCh0KSAmICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+IDI0KSB8ICgoKHQpICYgKDB4 MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKCh0KSAmICgweDAwMDAwMDAwZmYwMDAwMDBM TCkpIDw8IDgpIHwgKCgodCkgJiAoMHgwMDAwMDAwMDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKCh0 KSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgoKHQpICYgKDB4MDAwMDAwMDAw MDAwMDBmZkxMKSkgPDwgNTYpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9Mb25n TG9uZyAqcCA9IChfQ09SQkFfTG9uZ0xvbmcgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21u aTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX0xvbmdMb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAg IHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1VM b25nTG9uZyBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFfVUxvbmdMb25n ICpwID0gKF9DT1JCQV9VTG9uZ0xvbmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6 QUxJR05fOCxzaXplb2YoX0NPUkJBX1VMb25nTG9uZykpOyAqcCA9IGE7IH07CiAgfQoKICBmcmll bmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9VTG9uZ0xvbmcmIGEsIE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgICBpZiAocy5SZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpt eUJ5dGVPcmRlcikgewogICAgICBfQ09SQkFfVUxvbmdMb25nIHQ7CiAgICAgIHsgX0NPUkJBX1VM b25nTG9uZyAqcCA9IChfQ09SQkFfVUxvbmdMb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVz KG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9VTG9uZ0xvbmcpKTsgdCA9ICpwOyB9OwogICAg ICBhID0gKCgoKHQpICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkgPj4gNTYpIHwgKCgodCkgJiAo MHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKCh0KSAmICgweDAwMDBmZjAwMDAwMDAw MDBMTCkpID4+IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAo KCh0KSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgodCkgJiAoMHgwMDAwMDAw MDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKCh0KSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8 IDQwKSB8ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYpKTsKICAgIH0KICAg IGVsc2UgewogICAgICB7IF9DT1JCQV9VTG9uZ0xvbmcgKnAgPSAoX0NPUkJBX1VMb25nTG9uZyAq KSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfVUxv bmdMb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgoKCgoKICBmcmllbmQg aW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9GbG9hdCBhLCBOZXRCdWZmZXJlZFN0cmVh bSYgcykgewogICAgeyBfQ09SQkFfRmxvYXQgKnAgPSAoX0NPUkJBX0Zsb2F0ICopIChzKS5hbGln bl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9GbG9hdCkpOyAqcCA9 IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9GbG9h dCYgYSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRl cigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyKSB7CiAgICAgIF9DT1JCQV9GbG9hdCB0OwogICAgICB7 IF9DT1JCQV9GbG9hdCAqcCA9IChfQ09SQkFfRmxvYXQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0 ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0Zsb2F0KSk7IHQgPSAqcDsgfTsKICAgICAg X0NPUkJBX1VMb25nIHRsMSA9ICooKF9DT1JCQV9VTG9uZyAqKSZ0KTsKICAgICAgX0NPUkJBX1VM b25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBm ZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4 MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIGEgPSAqKChfQ09SQkFfRmxvYXQgKikgJnRsMik7CiAg ICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfRmxvYXQgKnAgPSAoX0NPUkJBX0Zsb2F0ICop IChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9GbG9h dCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICBmcmllbmQgaW5saW5lIHZv aWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9Eb3VibGUgYSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsK ICAgIHsgX0NPUkJBX0RvdWJsZSAqcCA9IChfQ09SQkFfRG91YmxlICopIChzKS5hbGlnbl9hbmRf cHV0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9Eb3VibGUpKTsgKnAgPSBhOyB9 OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChfQ09SQkFfRG91YmxlJiBh LCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkg IT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0RvdWJsZSB0OwogICAgICB7IF9D T1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJsZSAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRl cyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfRG91YmxlKSk7IHQgPSAqcDsgfTsKICAgICAg X0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQpWzFdOwogICAgICBfQ09SQkFf VUxvbmcgdGwyID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgw MGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYg MHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgKChfQ09SQkFfVUxvbmcgKikmYSlbMF0gPSB0bDI7 CiAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQpWzBdOwogICAgICB0bDIgPSAoKCgodGwx KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgo KHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkp OwogICAgICAoKF9DT1JCQV9VTG9uZyAqKSZhKVsxXSA9IHRsMjsKICAgIH0KICAgIGVsc2Ugewog ICAgICB7IF9DT1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJsZSAqKSAocykuYWxpZ25fYW5k X2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfRG91YmxlKSk7IGEgPSAqcDsg fTsKICAgIH0KICAgIHJldHVybjsKICB9CgoKCgoKCgogIHZvaWQgcHV0X2NoYXJfYXJyYXkoY29u c3QgX0NPUkJBX0NoYXIqIGIsIGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9t bmk6OmFsaWdubWVudF90IGFsaWduPW9tbmk6OkFMSUdOXzEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCwKICAgICAgICAgICAgICAgICAgICAgICAg ICBfQ09SQkFfQm9vbGVhbiBhdF9tb3N0X29uY2U9MCk7CgoKCgoKICB2b2lkIGdldF9jaGFyX2Fy cmF5KF9DT1JCQV9DaGFyKiBiLGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9t bmk6OmFsaWdubWVudF90IGFsaWduPW9tbmk6OkFMSUdOXzEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCk7CgoKCgoKICB2b2lkIHNraXAoX0NPUkJB X1VMb25nIHNpemUsX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCk7CgoKCgogIHZvaWQgZmx1c2go X0NPUkJBX0Jvb2xlYW4gZW5kTVRVPTApOwoKCgogIHZvaWQgY29weV9mcm9tKE1lbUJ1ZmZlcmVk U3RyZWFtJiwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgb21uaTo6YWxpZ25tZW50X3Qg YWxpZ249b21uaTo6QUxJR05fMSk7CiMgNDA1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L2J1ZmZlcmVkU3RyZWFtLmgiCiAgaW5saW5lIHNpemVfdCBNYXhNZXNzYWdlU2l6ZSgpIGNvbnN0 IHsgcmV0dXJuIHBkX3N0cmFuZC0+TWF4TVRVKCk7IH0KCiAgaW5saW5lIHNpemVfdCBXck1lc3Nh Z2VTaXplKCkgY29uc3QgeyByZXR1cm4gcGRfd3Jtc2dfc2l6ZTsgfQoKCiAgaW5saW5lIHNpemVf dCBSZE1lc3NhZ2VTaXplKCkgY29uc3QgeyByZXR1cm4gcGRfcmRtc2dfc2l6ZTsgfQoKCiAgc2l6 ZV90IFJkTWVzc2FnZUFscmVhZHlSZWFkKCkgY29uc3Q7CgoKCiAgc2l6ZV90IFJkTWVzc2FnZVVu UmVhZCgpIGNvbnN0OwoKCgogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBvdmVycnVuKF9DT1JCQV9V TG9uZyBsZW4pIGNvbnN0IHsKICAgIHJldHVybiBsZW4gPiAoX0NPUkJBX1VMb25nKSBSZE1lc3Nh Z2VVblJlYWQoKTsKICB9CgoKCiAgaW5saW5lIGludCByZEN1cnJlbnRBbGlnbm1lbnQoKSBjb25z dCB7CiAgICByZXR1cm4gY3VycmVudF9pbmJfYWxpZ25tZW50KCk7CiAgfQoKICBzaXplX3QgV3JN ZXNzYWdlQWxyZWFkeVdyaXR0ZW4oKSBjb25zdDsKCgoKICBzaXplX3QgV3JNZXNzYWdlU3BhY2VM ZWZ0KCkgY29uc3Q7CgoKCiAgaW5saW5lIGludCB3ckN1cnJlbnRBbGlnbm1lbnQoKSBjb25zdCB7 CiAgICByZXR1cm4gY3VycmVudF9vdXRiX2FsaWdubWVudCgpOwogIH0KCiAgaW5saW5lIF9DT1JC QV9DaGFyIFJkTWVzc2FnZUJ5dGVPcmRlcigpIGNvbnN0IHsKICAgIHJldHVybiBwZF9yZG1zZ19i eXRlX29yZGVyOwogIH0KCnByb3RlY3RlZDoKICB2b2lkIFJkTG9jaygpOwogIHZvaWQgUmRVbmxv Y2soKTsKICB2b2lkIFdyTG9jaygpOwogIHZvaWQgV3JVbmxvY2soKTsKCiAgaW5saW5lIF9DT1JC QV9Mb25nIG5ld1JlcXVlc3RJRCgpIHsgcmV0dXJuIHBkX3N0cmFuZC0+c2VxdWVuY2VOdW1iZXIo KTsgfQoKICB2b2lkIFdyTWVzc2FnZVNpemUoc2l6ZV90IG1zZ3NpemUpOwoKCiAgdm9pZCBSZE1l c3NhZ2VTaXplKHNpemVfdCBtc2dzaXplLCBfQ09SQkFfQ2hhciBieXRlb3JkZXIpOwoKCnByaXZh dGU6CiAgU3RyYW5kKiBwZF9zdHJhbmQ7CiAgc2l6ZV90IHBkX2lkZWFsX2J1Zl9zaXplOwogIHZv aWQqIHBkX2luYl9lbmQ7CiAgdm9pZCogcGRfb3V0Yl9lbmQ7CiAgdm9pZCogcGRfaW5iX21rcjsK ICB2b2lkKiBwZF9vdXRiX21rcjsKICBfQ09SQkFfQm9vbGVhbiBwZF9SZExvY2s7CiAgX0NPUkJB X0Jvb2xlYW4gcGRfV3JMb2NrOwoKICBzaXplX3QgcGRfcmRtc2dfc2l6ZTsKICBzaXplX3QgcGRf d3Jtc2dfc2l6ZTsKICBzaXplX3QgcGRfcmVhZDsKICBzaXplX3QgcGRfd3JpdHRlbjsKICBfQ09S QkFfQ2hhciBwZF9yZG1zZ19ieXRlX29yZGVyOwoKICB2b2lkIGVuc3VyZV9yZGxvY2tlZCgpOwog IHZvaWQgZW5zdXJlX3dybG9ja2VkKCk7CiAgdm9pZCByZXNlcnZlKHNpemVfdCBtaW5pbXVtLF9D T1JCQV9Cb29sZWFuIHN0YXJ0TVRVPTAsCiAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGF0 X21vc3Rfb25jZT0wKTsKICB2b2lkIGdpdmViYWNrX3Jlc2VydmVkKF9DT1JCQV9Cb29sZWFuIHRy YW5zbWl0ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGVuZE1U VT0wKTsKICB2b2lkIHJlY2VpdmUoc2l6ZV90IG1pbmltdW0sX0NPUkJBX0Jvb2xlYW4gc3RhcnRN VFU9MCk7CiAgdm9pZCBnaXZlYmFja19yZWNlaXZlZChfQ09SQkFfQm9vbGVhbiBzdGFydE1UVT0w KTsKICBpbnQgY3VycmVudF9vdXRiX2FsaWdubWVudCgpIGNvbnN0OwogIGludCBjdXJyZW50X2lu Yl9hbGlnbm1lbnQoKSBjb25zdDsKICB2b2lkIHJld2luZF9vdXRiX21rcihpbnQgb2xkYWxpZ25t ZW50KTsKICB2b2lkIHJld2luZF9pbmJfbWtyKGludCBvbGRhbGlnbm1lbnQpOwoKICBpbmxpbmUg dm9pZCogYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjphbGlnbm1lbnRfdCBhbGlnbiwgc2l6ZV90 IG5ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVh biBzdGFydE1UVT0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9C b29sZWFuIGF0X21vc3Rfb25jZT0wKQogIHsKCgoKCiAgICBpZiAoc3RhcnRNVFUpIGdpdmViYWNr X3Jlc2VydmVkKDEsMSk7CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBwMSA9b21uaTo6YWxpZ25fdG8o KG9tbmk6OnB0cl9hcml0aF90KXBkX291dGJfbWtyLGFsaWduKTsKICAgIG9tbmk6OnB0cl9hcml0 aF90IHAyID0gcDEgKyBuYnl0ZXM7CiAgICBpZiggKHZvaWQqKXAyID4gcGRfb3V0Yl9lbmQgKSB7 CiAgICAgIHJlc2VydmUocDIgLSAob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0Yl9ta3IsIHN0YXJ0 TVRVLCBhdF9tb3N0X29uY2UpOwogICAgICBwMSA9IG9tbmk6OmFsaWduX3RvKChvbW5pOjpwdHJf YXJpdGhfdClwZF9vdXRiX21rciwgYWxpZ24pOwogICAgICBwMiA9IHAxICsgbmJ5dGVzOwogICAg fQogICAgcGRfb3V0Yl9ta3IgPSAodm9pZCopIHAyOwogICAgcmV0dXJuICh2b2lkKikgcDE7CiAg fQoKICBpbmxpbmUgdm9pZCAqYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjphbGlnbm1lbnRfdCBh bGlnbixzaXplX3QgbmJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9D T1JCQV9Cb29sZWFuIHN0YXJ0TVRVPTApIHsKCgoKCiAgICBpZiAoc3RhcnRNVFUpIGdpdmViYWNr X3JlY2VpdmVkKDEpOwogICAgb21uaTo6cHRyX2FyaXRoX3QgcDEgPSBvbW5pOjphbGlnbl90bygo b21uaTo6cHRyX2FyaXRoX3QpcGRfaW5iX21rcixhbGlnbik7CiAgICBvbW5pOjpwdHJfYXJpdGhf dCBwMiA9IHAxICsgbmJ5dGVzOwogICAgaWYgKCh2b2lkICopcDIgPiBwZF9pbmJfZW5kKSB7CiAg ICAgIHJlY2VpdmUocDIgLSAob21uaTo6cHRyX2FyaXRoX3QpcGRfaW5iX21rciwgc3RhcnRNVFUp OwogICAgICBwMSA9IG9tbmk6OmFsaWduX3RvKChvbW5pOjpwdHJfYXJpdGhfdClwZF9pbmJfbWty LCBhbGlnbik7CiAgICAgIHAyID0gcDEgKyBuYnl0ZXM7CiAgICB9CiAgICBwZF9pbmJfbWtyID0g KHZvaWQqKSBwMjsKICAgIHJldHVybiAodm9pZCopIHAxOwogIH0KCiAgTmV0QnVmZmVyZWRTdHJl YW0oKTsKICBOZXRCdWZmZXJlZFN0cmVhbShjb25zdCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIE5l dEJ1ZmZlcmVkU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgTmV0QnVmZmVyZWRTdHJlYW0mKTsKfTsK CgoKCgpjbGFzcyBNZW1CdWZmZXJlZFN0cmVhbSB7CnB1YmxpYzoKICBNZW1CdWZmZXJlZFN0cmVh bShzaXplX3QgaW5pdGlhbEJ1ZnNpemU9MCk7CiAgfk1lbUJ1ZmZlcmVkU3RyZWFtKCk7CgogIE1l bUJ1ZmZlcmVkU3RyZWFtKGNvbnN0IE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgTWVtQnVmZmVyZWRT dHJlYW0mIG9wZXJhdG9yPShjb25zdCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBNZW1CdWZmZXJl ZFN0cmVhbSh2b2lkKiBkYXRhYnVmZmVyKTsKICBNZW1CdWZmZXJlZFN0cmVhbSh2b2lkKiBkYXRh YnVmZmVyLCBzaXplX3QgbWF4TGVuKTsKCgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+ PSAoX0NPUkJBX0NoYXIgYSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX0No YXIgKnAgPSAoX0NPUkJBX0NoYXIgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJ R05fMSxzaXplb2YoX0NPUkJBX0NoYXIpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9IChfQ09SQkFfQ2hhciYgYSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMp IHsKICAgIHsgX0NPUkJBX0NoYXIgKnAgPSAoX0NPUkJBX0NoYXIgKikgKHMpLmFsaWduX2FuZF9n ZXRfYnl0ZXMob21uaTo6QUxJR05fMSxzaXplb2YoX0NPUkJBX0NoYXIpKTsgYSA9ICpwOyB9Owog IH0KCgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9Cb29sZWFuIGIs IE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBfQ09SQkFfQ2hhciBjID0gYiA/IDEgOiAwOwog ICAgeyBfQ09SQkFfQ2hhciAqcCA9IChfQ09SQkFfQ2hhciAqKSAocykuYWxpZ25fYW5kX3B1dF9i eXRlcyhvbW5pOjpBTElHTl8xLHNpemVvZihfQ09SQkFfQ2hhcikpOyAqcCA9IGM7IH07CiAgfQoK ICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9Cb29sZWFuJiBiLCBNZW1C dWZmZXJlZFN0cmVhbSYgcykgewogICAgX0NPUkJBX0NoYXIgYzsKICAgIHsgX0NPUkJBX0NoYXIg KnAgPSAoX0NPUkJBX0NoYXIgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05f MSxzaXplb2YoX0NPUkJBX0NoYXIpKTsgYyA9ICpwOyB9OwogICAgYiA9IGMgPyB0cnVlIDogZmFs c2U7CiAgfQoKCgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1Nob3J0 IGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9TaG9ydCAqcCA9IChfQ09S QkFfU2hvcnQgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2Yo X0NPUkJBX1Nob3J0KSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVy YXRvcjw8PSAoX0NPUkJBX1Nob3J0JiBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYg KHMuYnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX1Nob3J0 IHQ7CiAgICAgIHsgX0NPUkJBX1Nob3J0ICpwID0gKF9DT1JCQV9TaG9ydCAqKSAocykuYWxpZ25f YW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl8yLHNpemVvZihfQ09SQkFfU2hvcnQpKTsgdCA9ICpw OyB9OwogICAgICBhID0gKCgoKHQpICYgMHhmZikgPDwgOCkgfCAoKCh0KSA+PiA4KSAmIDB4ZmYp KTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9TaG9ydCAqcCA9IChfQ09SQkFfU2hv cnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2YoX0NPUkJB X1Nob3J0KSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxp bmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1VTaG9ydCBhLCBNZW1CdWZmZXJlZFN0cmVhbSYg cykgewogICAgeyBfQ09SQkFfVVNob3J0ICpwID0gKF9DT1JCQV9VU2hvcnQgKikgKHMpLmFsaWdu X2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2YoX0NPUkJBX1VTaG9ydCkpOyAqcCA9 IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9VU2hv cnQmIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBpZiAocy5ieXRlT3JkZXIoKSAhPSBv bW5pOjpteUJ5dGVPcmRlcikgewogICAgICBfQ09SQkFfVVNob3J0IHQ7CiAgICAgIHsgX0NPUkJB X1VTaG9ydCAqcCA9IChfQ09SQkFfVVNob3J0ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9t bmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9VU2hvcnQpKTsgdCA9ICpwOyB9OwogICAgICBhID0g KCgoKHQpICYgMHhmZikgPDwgOCkgfCAoKCh0KSA+PiA4KSAmIDB4ZmYpKTsKICAgIH0KICAgIGVs c2UgewogICAgICB7IF9DT1JCQV9VU2hvcnQgKnAgPSAoX0NPUkJBX1VTaG9ydCAqKSAocykuYWxp Z25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl8yLHNpemVvZihfQ09SQkFfVVNob3J0KSk7IGEg PSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3Bl cmF0b3I+Pj0gKF9DT1JCQV9Mb25nIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9D T1JCQV9Mb25nICpwID0gKF9DT1JCQV9Mb25nICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9t bmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9Mb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVu ZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX0xvbmcmIGEsIE1lbUJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlcikgewog ICAgICBfQ09SQkFfTG9uZyB0OwogICAgICB7IF9DT1JCQV9Mb25nICpwID0gKF9DT1JCQV9Mb25n ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9M b25nKSk7IHQgPSAqcDsgfTsKICAgICAgYSA9ICgoKCh0KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8 ICgoKHQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwg KCgodCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHsgX0NP UkJBX0xvbmcgKnAgPSAoX0NPUkJBX0xvbmcgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21u aTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0xvbmcpKTsgYSA9ICpwOyB9OwogICAgfQogICAgcmV0 dXJuOwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChfQ09SQkFfVUxvbmcg YSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX1VMb25nICpwID0gKF9DT1JC QV9VTG9uZyAqKSAocykuYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihf Q09SQkFfVUxvbmcpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJh dG9yPDw9IChfQ09SQkFfVUxvbmcmIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBpZiAo cy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlcikgewogICAgICBfQ09SQkFfVUxvbmcg dDsKICAgICAgeyBfQ09SQkFfVUxvbmcgKnAgPSAoX0NPUkJBX1VMb25nICopIChzKS5hbGlnbl9h bmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9VTG9uZykpOyB0ID0gKnA7 IH07CiAgICAgIGEgPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0KSAmIDB4MDBm ZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHQpICYgMHgwMDAw MDBmZikgPDwgMjQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9VTG9uZyAqcCA9 IChfQ09SQkFfVUxvbmcgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fNCxz aXplb2YoX0NPUkJBX1VMb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgoK CiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChfQ09SQkFfTG9uZ0xvbmcgYSwgTWVt QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX0xvbmdMb25nICpwID0gKF9DT1JCQV9M b25nTG9uZyAqKSAocykuYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihf Q09SQkFfTG9uZ0xvbmcpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9w ZXJhdG9yPDw9IChfQ09SQkFfTG9uZ0xvbmcmIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAg ICBpZiAocy5SZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlcikgewogICAg ICBfQ09SQkFfTG9uZ0xvbmcgdDsKICAgICAgeyBfQ09SQkFfTG9uZ0xvbmcgKnAgPSAoX0NPUkJB X0xvbmdMb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9m KF9DT1JCQV9Mb25nTG9uZykpOyB0ID0gKnA7IH07CiAgICAgIGEgPSAoKCgodCkgJiAoMHhmZjAw MDAwMDAwMDAwMDAwTEwpKSA+PiA1NikgfCAoKCh0KSAmICgweDAwZmYwMDAwMDAwMDAwMDBMTCkp ID4+IDQwKSB8ICgoKHQpICYgKDB4MDAwMGZmMDAwMDAwMDAwMExMKSkgPj4gMjQpIHwgKCgodCkg JiAoMHgwMDAwMDBmZjAwMDAwMDAwTEwpKSA+PiA4KSB8ICgoKHQpICYgKDB4MDAwMDAwMDBmZjAw MDAwMExMKSkgPDwgOCkgfCAoKCh0KSAmICgweDAwMDAwMDAwMDBmZjAwMDBMTCkpIDw8IDI0KSB8 ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwZmYwMExMKSkgPDwgNDApIHwgKCgodCkgJiAoMHgwMDAw MDAwMDAwMDAwMGZmTEwpKSA8PCA1NikpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHsgX0NPUkJB X0xvbmdMb25nICpwID0gKF9DT1JCQV9Mb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRl cyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfTG9uZ0xvbmcpKTsgYSA9ICpwOyB9OwogICAg fQogICAgcmV0dXJuOwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChfQ09S QkFfVUxvbmdMb25nIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9VTG9u Z0xvbmcgKnAgPSAoX0NPUkJBX1VMb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX3B1dF9ieXRlcyhv bW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfVUxvbmdMb25nKSk7ICpwID0gYTsgfTsKICB9Cgog IGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX1VMb25nTG9uZyYgYSwgTWVt QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9t bmk6Om15Qnl0ZU9yZGVyKSB7CiAgICAgIF9DT1JCQV9VTG9uZ0xvbmcgdDsKICAgICAgeyBfQ09S QkFfVUxvbmdMb25nICpwID0gKF9DT1JCQV9VTG9uZ0xvbmcgKikgKHMpLmFsaWduX2FuZF9nZXRf Ynl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX1VMb25nTG9uZykpOyB0ID0gKnA7IH07 CiAgICAgIGEgPSAoKCgodCkgJiAoMHhmZjAwMDAwMDAwMDAwMDAwTEwpKSA+PiA1NikgfCAoKCh0 KSAmICgweDAwZmYwMDAwMDAwMDAwMDBMTCkpID4+IDQwKSB8ICgoKHQpICYgKDB4MDAwMGZmMDAw MDAwMDAwMExMKSkgPj4gMjQpIHwgKCgodCkgJiAoMHgwMDAwMDBmZjAwMDAwMDAwTEwpKSA+PiA4 KSB8ICgoKHQpICYgKDB4MDAwMDAwMDBmZjAwMDAwMExMKSkgPDwgOCkgfCAoKCh0KSAmICgweDAw MDAwMDAwMDBmZjAwMDBMTCkpIDw8IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwZmYwMExM KSkgPDwgNDApIHwgKCgodCkgJiAoMHgwMDAwMDAwMDAwMDAwMGZmTEwpKSA8PCA1NikpOwogICAg fQogICAgZWxzZSB7CiAgICAgIHsgX0NPUkJBX1VMb25nTG9uZyAqcCA9IChfQ09SQkFfVUxvbmdM b25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JC QV9VTG9uZ0xvbmcpKTsgYSA9ICpwOyB9OwogICAgfQogICAgcmV0dXJuOwogIH0KCgoKCgogIGZy aWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX0Zsb2F0IGEsIE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9GbG9hdCAqcCA9IChfQ09SQkFfRmxvYXQgKikgKHMp LmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0Zsb2F0KSk7 ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJB X0Zsb2F0JiBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuYnl0ZU9yZGVyKCkg IT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0Zsb2F0IHQ7CiAgICAgIHsgX0NP UkJBX0Zsb2F0ICpwID0gKF9DT1JCQV9GbG9hdCAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhv bW5pOjpBTElHTl80LHNpemVvZihfQ09SQkFfRmxvYXQpKTsgdCA9ICpwOyB9OwogICAgICBfQ09S QkFfVUxvbmcgdGwxID0gKigoX0NPUkJBX1VMb25nICopJnQpOwogICAgICBfQ09SQkFfVUxvbmcg dGwyID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAw MCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAw MDBmZikgPDwgMjQpKTsKICAgICAgYSA9ICooKF9DT1JCQV9GbG9hdCAqKSAmdGwyKTsKICAgIH0K ICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9GbG9hdCAqcCA9IChfQ09SQkFfRmxvYXQgKikgKHMp LmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0Zsb2F0KSk7 IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBv cGVyYXRvcj4+PSAoX0NPUkJBX0RvdWJsZSBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAg eyBfQ09SQkFfRG91YmxlICpwID0gKF9DT1JCQV9Eb3VibGUgKikgKHMpLmFsaWduX2FuZF9wdXRf Ynl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX0RvdWJsZSkpOyAqcCA9IGE7IH07CiAg fQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9Eb3VibGUmIGEsIE1l bUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5 dGVPcmRlcikgewogICAgICBfQ09SQkFfRG91YmxlIHQ7CiAgICAgIHsgX0NPUkJBX0RvdWJsZSAq cCA9IChfQ09SQkFfRG91YmxlICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdO Xzgsc2l6ZW9mKF9DT1JCQV9Eb3VibGUpKTsgdCA9ICpwOyB9OwogICAgICBfQ09SQkFfVUxvbmcg dGwxID0gKChfQ09SQkFfVUxvbmcgKikmdClbMV07CiAgICAgIF9DT1JCQV9VTG9uZyB0bDIgPSAo KCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4 KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8 PCAyNCkpOwogICAgICAoKF9DT1JCQV9VTG9uZyAqKSZhKVswXSA9IHRsMjsKICAgICAgdGwxID0g KChfQ09SQkFfVUxvbmcgKikmdClbMF07CiAgICAgIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAw MCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAw MGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICgoX0NP UkJBX1VMb25nICopJmEpWzFdID0gdGwyOwogICAgfQogICAgZWxzZSB7CiAgICAgIHsgX0NPUkJB X0RvdWJsZSAqcCA9IChfQ09SQkFfRG91YmxlICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9t bmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9Eb3VibGUpKTsgYSA9ICpwOyB9OwogICAgfQogICAg cmV0dXJuOwogIH0KCgoKCgoKCiAgdm9pZCBwdXRfY2hhcl9hcnJheShjb25zdCBfQ09SQkFfQ2hh ciogc3JjLGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgb21uaTo6YWxpZ25tZW50X3Qg YWxpZ249b21uaTo6QUxJR05fMSk7CiAgdm9pZCBnZXRfY2hhcl9hcnJheShfQ09SQkFfQ2hhciog ZHN0LCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgIG9tbmk6OmFsaWdubWVudF90IGFs aWduPW9tbmk6OkFMSUdOXzEpOwoKICBmcmllbmQgY2xhc3MgTmV0QnVmZmVyZWRTdHJlYW07Cgog IHZvaWQgY29weV9mcm9tKE1lbUJ1ZmZlcmVkU3RyZWFtJiBmcm9tLCBzaXplX3Qgc2l6ZSwKICAg ICAgICAgICAgICAgICBvbW5pOjphbGlnbm1lbnRfdCBhbGlnbj1vbW5pOjpBTElHTl8xKTsKICB2 b2lkIGNvcHlfZnJvbShOZXRCdWZmZXJlZFN0cmVhbSYgZnJvbSwgc2l6ZV90IHNpemUsCiAgICAg ICAgICAgICAgICAgb21uaTo6YWxpZ25tZW50X3QgYWxpZ249b21uaTo6QUxJR05fMSk7CgoKCgog IGlubGluZSB2b2lkIHJld2luZF9pbl9ta3IoKSB7CiAgICBwZF9pbl9ta3IgPSBzdGFydG9mc3Ry ZWFtKCk7CiAgfQogIGlubGluZSB2b2lkIHJld2luZF9pbm91dF9ta3IoKSB7CiAgICByZXdpbmRf aW5fbWtyKCk7CiAgICBwZF9vdXRfbWtyID0gcGRfaW5fbWtyOwogIH0KCiAgaW5saW5lIF9DT1JC QV9DaGFyIGJ5dGVPcmRlcigpIGNvbnN0IHsKICAgIHJldHVybiBfQ09SQkFfQ2hhcihwZF9ieXRl X29yZGVyKTsKICB9CgogIGlubGluZSB2b2lkIGJ5dGVPcmRlcihfQ09SQkFfQ2hhciBiKSB7CiAg ICBwZF9ieXRlX29yZGVyID0gYiA/IDEgOiAwOwogIH0KCiAgaW5saW5lIF9DT1JCQV9DaGFyIFJk TWVzc2FnZUJ5dGVPcmRlcigpIGNvbnN0IHsKICAgIHJldHVybiBieXRlT3JkZXIoKTsKICB9Cgog IGlubGluZSBzaXplX3QgYWxyZWFkeVJlYWQoKSBjb25zdCB7CiAgICBpZiAocGRfaW5fbWtyIDwg cGRfb3V0X21rcikKICAgICAgcmV0dXJuICgob21uaTo6cHRyX2FyaXRoX3QpcGRfaW5fbWtyIC0K ICAgICAgICAgICAgICAob21uaTo6cHRyX2FyaXRoX3Qpc3RhcnRvZnN0cmVhbSgpKTsKICAgIGVs c2UKICAgICAgcmV0dXJuICgob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciAtCiAgICAgICAg ICAgICAgKG9tbmk6OnB0cl9hcml0aF90KXN0YXJ0b2ZzdHJlYW0oKSk7CiAgfQoKICBpbmxpbmUg c2l6ZV90IFJkTWVzc2FnZUFscmVhZHlSZWFkKCkgY29uc3QgewogICAgcmV0dXJuIGFscmVhZHlS ZWFkKCk7CiAgfQoKICBpbmxpbmUgc2l6ZV90IHVuUmVhZCgpIGNvbnN0IHsKICAgIGlmIChwZF9p bl9ta3IgPCBwZF9vdXRfbWtyKQogICAgICByZXR1cm4gKChvbW5pOjpwdHJfYXJpdGhfdClwZF9v dXRfbWtyIC0KICAgICAgICAgICAgICAob21uaTo6cHRyX2FyaXRoX3QpcGRfaW5fbWtyKTsKICAg IGVsc2UKICAgICAgcmV0dXJuIDA7CiAgfQoKICBpbmxpbmUgc2l6ZV90IFJkTWVzc2FnZVVuUmVh ZCgpIGNvbnN0IHsKICAgIHJldHVybiB1blJlYWQoKTsKICB9CgogIGlubGluZSBfQ09SQkFfQm9v bGVhbiBvdmVycnVuKF9DT1JCQV9VTG9uZyBsZW4pIGNvbnN0IHsKICAgIHJldHVybiBsZW4gPiAo X0NPUkJBX1VMb25nKSB1blJlYWQoKTsKICB9CgogIGlubGluZSBpbnQgcmRDdXJyZW50QWxpZ25t ZW50KCkgY29uc3QgewogICAgaW50IGFsaWduPSgob21uaTo6cHRyX2FyaXRoX3QpcGRfaW5fbWty ICYgKChpbnQpb21uaTo6bWF4X2FsaWdubWVudCAtIDEpKTsKICAgIHJldHVybiAoKGFsaWduKT8g YWxpZ246KGludClvbW5pOjptYXhfYWxpZ25tZW50KTsKICB9CgogIGlubGluZSBzaXplX3QgYWxy ZWFkeVdyaXR0ZW4oKSBjb25zdCB7CiAgICByZXR1cm4gKChvbW5pOjpwdHJfYXJpdGhfdClwZF9v dXRfbWtyIC0KICAgICAgICAgICAgKG9tbmk6OnB0cl9hcml0aF90KXN0YXJ0b2ZzdHJlYW0oKSk7 CiAgfQoKICBpbmxpbmUgc2l6ZV90IFdyTWVzc2FnZUFscmVhZHlXcml0dGVuKCkgY29uc3Qgewog ICAgcmV0dXJuICgob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciAtCiAgICAgICAgICAgIChv bW5pOjpwdHJfYXJpdGhfdClzdGFydG9mc3RyZWFtKCkpOwogIH0KCiAgaW5saW5lIGludCB3ckN1 cnJlbnRBbGlnbm1lbnQoKSBjb25zdCB7CiAgICBpbnQgYWxpZ249KChvbW5pOjpwdHJfYXJpdGhf dClwZF9vdXRfbWtyICYgKChpbnQpb21uaTo6bWF4X2FsaWdubWVudCAtIDEpKTsKICAgIHJldHVy biAoKGFsaWduKT9hbGlnbjooaW50KW9tbmk6Om1heF9hbGlnbm1lbnQpOwogIH0KCiAgdm9pZCBz a2lwKF9DT1JCQV9VTG9uZyBzaXplKTsKCiAgaW5saW5lIHZvaWQqIGRhdGEoKSBjb25zdCB7IHJl dHVybiBwZF9pbl9ta3I7IH0KCnByaXZhdGU6CgoKCiAgX0NPUkJBX0Jvb2xlYW4gcGRfZXh0ZXJu YWxfYnVmZmVyOwogIHZvaWQqIHBkX2J1ZnA7CiAgdm9pZCogcGRfYnVmZW5kOwogIHZvaWQqIHBk X2luX21rcjsKICB2b2lkKiBwZF9vdXRfbWtyOwogIHN0YXRpYyBjb25zdCBpbnQgcGRfaW5saW5l X2J1Zl9zaXplOwogIGNoYXIgcGRfYnVmZmVyWzMyXTsKICBfQ09SQkFfQm9vbGVhbiBwZF9ieXRl X29yZGVyOwoKICBpbmxpbmUgdm9pZCogYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjphbGlnbm1l bnRfdCBhbGlnbiwgc2l6ZV90IG5ieXRlcykKICB7CiAgICBpZiggcGRfZXh0ZXJuYWxfYnVmZmVy ICkgd3JpdGVfdG9fcmVhZG9ubHlfZXJyb3IoIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMv YnVmZmVyZWRTdHJlYW0uaCIsIDgyMyk7CgogICAgb21uaTo6cHRyX2FyaXRoX3QgcDEgPSBvbW5p OjphbGlnbl90bygob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rcixhbGlnbik7CiAgICBvbW5p OjpwdHJfYXJpdGhfdCBwMiA9IHAxICsgbmJ5dGVzOwogICAgaWYoICh2b2lkKilwMiA+IHBkX2J1 ZmVuZCApIHsKICAgICAgZ3JvdyhwMiAtIChvbW5pOjpwdHJfYXJpdGhfdClwZF9vdXRfbWtyKTsK ICAgICAgcDEgPSBvbW5pOjphbGlnbl90bygob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciwg YWxpZ24pOwogICAgICBwMiA9IHAxICsgbmJ5dGVzOwogICAgfQogICAgcGRfb3V0X21rciA9ICh2 b2lkKikgcDI7CiAgICByZXR1cm4gKHZvaWQqKSBwMTsKICB9CgogIGlubGluZSB2b2lkKiBhbGln bl9hbmRfZ2V0X2J5dGVzKG9tbmk6OmFsaWdubWVudF90IGFsaWduLHNpemVfdCBuYnl0ZXMpIHsK ICAgIG9tbmk6OnB0cl9hcml0aF90IHAxID0gb21uaTo6YWxpZ25fdG8oKG9tbmk6OnB0cl9hcml0 aF90KXBkX2luX21rciwgYWxpZ24pOwogICAgcGRfaW5fbWtyID0gKHZvaWQqKSAocDEgKyBuYnl0 ZXMpOwogICAgaWYoIHBkX2luX21rciA+IHBkX291dF9ta3IgKSBvdmVycnVuX2Vycm9yKCk7CiAg ICByZXR1cm4gKHZvaWQqKSBwMTsKICB9CgogIHZvaWQqIHN0YXJ0b2ZzdHJlYW0oKSBjb25zdDsK ICBpbmxpbmUgc2l6ZV90IHNpemUoKSB7CiAgICByZXR1cm4gKG9tbmk6OnB0cl9hcml0aF90KSBw ZF9idWZlbmQgLSAob21uaTo6cHRyX2FyaXRoX3QpIHN0YXJ0b2ZzdHJlYW0oKTsKICB9CiAgdm9p ZCBncm93KHNpemVfdCBtaW5pbXVtKTsKICB2b2lkIGNvcHkoY29uc3QgTWVtQnVmZmVyZWRTdHJl YW0mKTsKICB2b2lkIG92ZXJydW5fZXJyb3IoKTsKICB2b2lkIHdyaXRlX3RvX3JlYWRvbmx5X2Vy cm9yKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3Mg YnVmX3Q+CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1hcnNoYWxBcnJheVNob3J0KGJ1 Zl90JiBzLCBfQ09SQkFfU2hvcnQqIGEsIGludCBsZW5ndGgpCnsKICBzLmdldF9jaGFyX2FycmF5 KChfQ09SQkFfQ2hhciopIGEsIGxlbmd0aCAqIDIsIG9tbmk6OkFMSUdOXzIpOwoKICBpZiggcy5S ZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciApCiAgICBmb3IoIGludCBp ID0gMDsgaSA8IGxlbmd0aDsgaSsrICkKICAgICAgYVtpXSA9ICgoKChhW2ldKSAmIDB4ZmYpIDw8 IDgpIHwgKCgoYVtpXSkgPj4gOCkgJiAweGZmKSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgYnVmX3Q+ CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1hcnNoYWxBcnJheVVTaG9ydChidWZfdCYg cywgX0NPUkJBX1VTaG9ydCogYSwgaW50IGxlbmd0aCkKewogIHMuZ2V0X2NoYXJfYXJyYXkoKF9D T1JCQV9DaGFyKikgYSwgbGVuZ3RoICogMiwgb21uaTo6QUxJR05fMik7CgogIGlmKCBzLlJkTWVz c2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkKICAgIGZvciggaW50IGkgPSAw OyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFbaV0pICYgMHhmZikgPDwgOCkg fCAoKChhW2ldKSA+PiA4KSAmIDB4ZmYpKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBidWZfdD4KaW5s aW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVyX3VubWFyc2hhbEFycmF5TG9uZyhidWZfdCYgcywgX0NP UkJBX0xvbmcqIGEsIGludCBsZW5ndGgpCnsKICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hh ciopIGEsIGxlbmd0aCAqIDQsIG9tbmk6OkFMSUdOXzQpOwoKICBpZiggcy5SZE1lc3NhZ2VCeXRl T3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciApCiAgICBmb3IoIGludCBpID0gMDsgaSA8IGxl bmd0aDsgaSsrICkKICAgICAgYVtpXSA9ICgoKChhW2ldKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8 ICgoKGFbaV0pICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKChhW2ldKSAmIDB4MDAwMGZmMDApIDw8 IDgpIHwgKCgoYVtpXSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwp9CgoKdGVtcGxhdGUgPGNsYXNz IGJ1Zl90PgppbmxpbmUgdm9pZApDZHJTdHJlYW1IZWxwZXJfdW5tYXJzaGFsQXJyYXlVTG9uZyhi dWZfdCYgcywgX0NPUkJBX1VMb25nKiBhLCBpbnQgbGVuZ3RoKQp7CiAgcy5nZXRfY2hhcl9hcnJh eSgoX0NPUkJBX0NoYXIqKSBhLCBsZW5ndGggKiA0LCBvbW5pOjpBTElHTl80KTsKCiAgaWYoIHMu UmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIgKQogICAgZm9yKCBpbnQg aSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApCiAgICAgIGFbaV0gPSAoKCgoYVtpXSkgJiAweGZmMDAw MDAwKSA+PiAyNCkgfCAoKChhW2ldKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgoYVtpXSkgJiAw eDAwMDBmZjAwKSA8PCA4KSB8ICgoKGFbaV0pICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKfQoKCnRl bXBsYXRlIDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVyX3VubWFyc2hh bEFycmF5RmxvYXQoYnVmX3QmIHMsIF9DT1JCQV9GbG9hdCogYSwgaW50IGxlbmd0aCkKewogIHMu Z2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogNCwgb21uaTo6QUxJR05f NCk7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkK ICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7CiAgICAgIF9DT1JCQV9VTG9u ZyB0bXAgPSAoKCgoKiAoX0NPUkJBX1VMb25nKikgKGEgKyBpKSkgJiAweGZmMDAwMDAwKSA+PiAy NCkgfCAoKCgqIChfQ09SQkFfVUxvbmcqKSAoYSArIGkpKSAmIDB4MDBmZjAwMDApID4+IDgpIHwg KCgoKiAoX0NPUkJBX1VMb25nKikgKGEgKyBpKSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKCog KF9DT1JCQV9VTG9uZyopIChhICsgaSkpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgYVtp XSA9ICogKF9DT1JCQV9GbG9hdCopICZ0bXA7CiAgICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgYnVm X3Q+CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1hcnNoYWxBcnJheURvdWJsZShidWZf dCYgcywgX0NPUkJBX0RvdWJsZSogYSwgaW50IGxlbmd0aCkKewogIHMuZ2V0X2NoYXJfYXJyYXko KF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJR05fOCk7CgogIGlmKCBzLlJk TWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkKICAgIGZvciggaW50IGkg PSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7CiAgICAgIF9DT1JCQV9VTG9uZyB0bXAwID0gKCgoKCgo X0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMF0pICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgoKChf Q09SQkFfVUxvbmcqKSAoYSArIGkpKVswXSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKCgoX0NP UkJBX1VMb25nKikgKGEgKyBpKSlbMF0pICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCgoKF9DT1JC QV9VTG9uZyopIChhICsgaSkpWzBdKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIF9DT1JC QV9VTG9uZyB0bXAxID0gKCgoKCgoX0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMV0pICYgMHhmZjAw MDAwMCkgPj4gMjQpIHwgKCgoKChfQ09SQkFfVUxvbmcqKSAoYSArIGkpKVsxXSkgJiAweDAwZmYw MDAwKSA+PiA4KSB8ICgoKCgoX0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMV0pICYgMHgwMDAwZmYw MCkgPDwgOCkgfCAoKCgoKF9DT1JCQV9VTG9uZyopIChhICsgaSkpWzFdKSAmIDB4MDAwMDAwZmYp IDw8IDI0KSk7CiAgICAgICgoX0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMV0gPSB0bXAwOwogICAg ICAoKF9DT1JCQV9VTG9uZyopIChhICsgaSkpWzBdID0gdG1wMTsKICAgIH0KfQoKCnRlbXBsYXRl IDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVyX3VubWFyc2hhbEFycmF5 TG9uZ0xvbmcoYnVmX3QmIHMsIF9DT1JCQV9Mb25nTG9uZyogYSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKewogIHMuZ2V0X2NoYXJfYXJyYXkoKF9D T1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJR05fOCk7CgogIGlmKCBzLlJkTWVz c2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkKICAgIGZvciggaW50IGkgPSAw OyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFbaV0pICYgKDB4ZmYwMDAwMDAw MDAwMDAwMExMKSkgPj4gNTYpIHwgKCgoYVtpXSkgJiAoMHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+ PiA0MCkgfCAoKChhW2ldKSAmICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+IDI0KSB8ICgoKGFb aV0pICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKChhW2ldKSAmICgweDAwMDAw MDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgoYVtpXSkgJiAoMHgwMDAwMDAwMDAwZmYwMDAwTEwp KSA8PCAyNCkgfCAoKChhW2ldKSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgo KGFbaV0pICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYpKTsKfQoKCnRlbXBsYXRlIDxj bGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVyX3VubWFyc2hhbEFycmF5VUxv bmdMb25nKGJ1Zl90JiBzLCBfQ09SQkFfVUxvbmdMb25nKiBhLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKewogIHMuZ2V0X2NoYXJfYXJyYXkoKF9D T1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJR05fOCk7CgogIGlmKCBzLlJkTWVz c2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkKICAgIGZvciggaW50IGkgPSAw OyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFbaV0pICYgKDB4ZmYwMDAwMDAw MDAwMDAwMExMKSkgPj4gNTYpIHwgKCgoYVtpXSkgJiAoMHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+ PiA0MCkgfCAoKChhW2ldKSAmICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+IDI0KSB8ICgoKGFb aV0pICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKChhW2ldKSAmICgweDAwMDAw MDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgoYVtpXSkgJiAoMHgwMDAwMDAwMDAwZmYwMDAwTEwp KSA8PCAyNCkgfCAoKChhW2ldKSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgo KGFbaV0pICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYpKTsKfQojIDk3MyAiLi4vLi4v Li4vLi4vaW5jbHVkZS9vbW5pT1JCMy9idWZmZXJlZFN0cmVhbS5oIgp0ZW1wbGF0ZSA8Y2xhc3Mg VD4KaW5saW5lIHZvaWQKX0NPUkJBX1NlcXVlbmNlPFQ+OjpvcGVyYXRvcj4+PSAoTmV0QnVmZmVy ZWRTdHJlYW0mIHMpIGNvbnN0CnsKICA6Om9wZXJhdG9yPj49KF9DT1JCQV9VTG9uZyhwZF9sZW4p LCBzKTsKICBmb3IoIGludCBpID0gMDsgaSA8IChpbnQpcGRfbGVuOyBpKysgKQogICAgcGRfYnVm W2ldID4+PSBzOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkCl9DT1JCQV9TZXF1 ZW5jZTxUPjo6b3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NPUkJBX1VM b25nIGw7CiAgbCA8PD0gczsKICBpZiAobCA+IHMuUmRNZXNzYWdlVW5SZWFkKCkgfHwgKHBkX2Jv dW5kZWQgJiYgbCA+IHBkX21heCkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0K ICBsZW5ndGgobCk7CiAgZm9yKCBfQ09SQkFfVUxvbmcgaSA9IDA7IGkgPCBsOyBpKysgKQogICAg cGRfYnVmW2ldIDw8PSBzOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkCl9DT1JC QV9TZXF1ZW5jZTxUPjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7 CiAgcGRfbGVuID4+PSBzOwogIGZvciAoaW50IGk9MDsgaTwoaW50KXBkX2xlbjsgaSsrKQogICAg cGRfYnVmW2ldID4+PSBzOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkCl9DT1JC QV9TZXF1ZW5jZTxUPjo6b3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NP UkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAocy51blJlYWQoKSA8IGwgfHwgKHBkX2JvdW5k ZWQgJiYgbCA+IHBkX21heCkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KICBs ZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykKICAgIHBkX2J1Zltp XSA8PD0gczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQsaW50IGVsbVNpemUsaW50IGVsbUFsaWdubWVu dD4KaW5saW5lCnZvaWQKX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50 PFQsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0m IHMpIGNvbnN0CnsKICBfQ09SQkFfVUxvbmcgbCA9IEJhc2VUOjpsZW5ndGgoKTsKICBsID4+PSBz OwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21u aTo6QUxJR05fOCkgewogICAgX0NPUkJBX1VMb25nIHBhZGRpbmcgPSAwOwogICAgaWYgKHMud3JD dXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBwYWRkaW5nID4+ PSBzOwogIH0KICBzLnB1dF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEo KSwoaW50KWwqZWxtU2l6ZSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgZWxtU2l6ZSxpbnQg ZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4 U2l6ZUVsZW1lbnQ8VCxlbG1TaXplLGVsbUFsaWdubWVudD46Om9wZXJhdG9yPDw9IChOZXRCdWZm ZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwqZWxt U2l6ZSA+IHMuUmRNZXNzYWdlVW5SZWFkKCkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7 CgogIH0KICBCYXNlVDo6bGVuZ3RoKGwpOwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQp ZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAgaWYgKHMucmRDdXJyZW50 QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBzLnNraXAoc2l6ZW9mKF9D T1JCQV9VTG9uZykpOwogIH0KICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6 Ok5QX2RhdGEoKSwoaW50KWwqZWxtU2l6ZSk7CiAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkg IT0gb21uaTo6bXlCeXRlT3JkZXIgJiYgZWxtQWxpZ25tZW50ICE9IDEpIHsKICAgIGlmIChlbG1T aXplID09IDIpIHsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAg ICAgIF9DT1JCQV9VU2hvcnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlb aV07CiAgICAgICAgKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0 KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0KICAgIH0KICAg IGVsc2UgaWYgKGVsbVNpemUgPT0gNCkgewogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8 bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHQgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6 Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkp W2ldID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAweDAwZmYwMDAwKSA+ PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYpIDw8 IDI0KSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gOCkgewogICAgICBs ICo9IDI7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKz0yKSB7CiAgICAgICAg X0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFd OwogICAgICAgIF9DT1JCQV9VTG9uZyB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0 KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8 PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAgIHRsMSA9ICgoX0NP UkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9uZyop QmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSB0bDI7CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VU OjpOUF9kYXRhKCkpW2krMV0gPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRs MSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgo KHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgfQp9CgoKdGVtcGxh dGUgPGNsYXNzIFQsaW50IGVsbVNpemUsaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PFQsZWxtU2l6ZSxlbG1BbGln bm1lbnQ+OjpvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09S QkFfVUxvbmcgbCA9IEJhc2VUOjpsZW5ndGgoKTsKICBsID4+PSBzOwogIGlmIChsPT0wKSByZXR1 cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAg X0NPUkJBX1VMb25nIHBhZGRpbmcgPSAwOwogICAgaWYgKHMud3JDdXJyZW50QWxpZ25tZW50KCkg IT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBwYWRkaW5nID4+PSBzOwogIH0KICBzLnB1dF9j aGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZWxtU2l6ZSk7 Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgZWxtU2l6ZSxpbnQgZWxtQWxpZ25tZW50Pgppbmxp bmUKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxlbG1T aXplLGVsbUFsaWdubWVudD46Om9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykKewog IF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKHMudW5SZWFkKCkgPCAobCplbG1TaXpl KSkgewogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQogIEJhc2VUOjpsZW5ndGgobCk7 CiAgaWYgKGw9PTApIHJldHVybjsKICBpZiAoKGludCllbG1BbGlnbm1lbnQgPT0gKGludClvbW5p OjpBTElHTl84KSB7CiAgICBpZiAocy5yZEN1cnJlbnRBbGlnbm1lbnQoKSAhPSAoaW50KW9tbmk6 OkFMSUdOXzgpCiAgICAgIHMuc2tpcChzaXplb2YoX0NPUkJBX1VMb25nKSk7CiAgfQogIHMuZ2V0 X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQpbCplbG1TaXpl KTsKICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciAmJiBlbG1BbGlnbm1l bnQgIT0gMSkgewogICAgaWYgKGVsbVNpemUgPT0gMikgewogICAgICBmb3IgKF9DT1JCQV9VTG9u ZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VTaG9ydCB0ID0gKChfQ09SQkFfVVNo b3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VU2hvcnQqKUJhc2VU OjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhmZikgPDwgOCkgfCAoKCh0KSA+PiA4KSAmIDB4 ZmYpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZWxtU2l6ZSA9PSA0KSB7CiAgICAgIGZv ciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdCA9 ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9V TG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+PiAyNCkg fCAoKCh0KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8PCA4KSB8 ICgoKHQpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAo ZWxtU2l6ZSA9PSA4KSB7CiAgICAgIGwgKj0gMjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0w OyBpPGw7IGkrPTIpIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwxID0gKChfQ09SQkFfVUxvbmcq KUJhc2VUOjpOUF9kYXRhKCkpW2krMV07CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0 bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwg KCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0 KSk7CiAgICAgICAgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwog ICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9IHRsMjsKICAgICAg ICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsxXSA9ICgoKCh0bDEpICYgMHhm ZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAm IDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAg IH0KICAgIH0KICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgbWF4LGludCBlbG1TaXplLCBp bnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0Zp eFNpemVFbGVtZW50PFQsbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I+Pj0gKE5l dEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1VMb25nIGwgPSBCYXNlVDo6bGVu Z3RoKCk7CiAgbCA+Pj0gczsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdu bWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIF9DT1JCQV9VTG9uZyBwYWRkaW5nID0g MDsKICAgIGlmIChzLndyQ3VycmVudEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkK ICAgICAgcGFkZGluZyA+Pj0gczsKICB9CiAgcy5wdXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIq KUJhc2VUOjpOUF9kYXRhKCksKGludClsKmVsbVNpemUpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQs aW50IG1heCxpbnQgZWxtU2l6ZSwgaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJB X0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxULG1heCxlbG1TaXplLGVsbUFsaWdu bWVudD46Om9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9u ZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwqZWxtU2l6ZSA+IHMuUmRNZXNzYWdlVW5SZWFkKCkgfHwg bCA+IG1heCkgewogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQoKICBCYXNlVDo6bGVu Z3RoKGwpOwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChp bnQpb21uaTo6QUxJR05fOCkgewogICAgaWYgKHMucmRDdXJyZW50QWxpZ25tZW50KCkgIT0gKGlu dClvbW5pOjpBTElHTl84KQogICAgICBzLnNraXAoc2l6ZW9mKF9DT1JCQV9VTG9uZykpOwogIH0K ICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwq ZWxtU2l6ZSk7CiAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3Jk ZXIgJiYgZWxtQWxpZ25tZW50ICE9IDEpIHsKICAgIGlmIChlbG1TaXplID09IDIpIHsKICAgICAg Zm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VU2hvcnQg dCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09S QkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwg KCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUg PT0gNCkgewogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAg X0NPUkJBX1VMb25nIHQgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAg ICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhm ZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYgMHgw MDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0KICAg IH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gOCkgewogICAgICBsICo9IDI7CiAgICAgIGZvciAo X0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKz0yKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMSA9 ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdOwogICAgICAgIF9DT1JCQV9V TG9uZyB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAw ZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAw eDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6 TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlb aV0gPSB0bDI7CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV0g PSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+ PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZm KSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgfQp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsaW50IG1h eCxpbnQgZWxtU2l6ZSwgaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxULG1heCxlbG1TaXplLGVsbUFsaWdubWVudD46 Om9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9VTG9u ZyBsID0gQmFzZVQ6Omxlbmd0aCgpOwogIGwgPj49IHM7CiAgaWYgKGw9PTApIHJldHVybjsKICBp ZiAoKGludCllbG1BbGlnbm1lbnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBfQ09SQkFf VUxvbmcgcGFkZGluZyA9IDA7CiAgICBpZiAocy53ckN1cnJlbnRBbGlnbm1lbnQoKSAhPSAoaW50 KW9tbmk6OkFMSUdOXzgpCiAgICAgIHBhZGRpbmcgPj49IHM7CiAgfQogIHMucHV0X2NoYXJfYXJy YXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQpbCplbG1TaXplKTsKfQoKCnRl bXBsYXRlIDxjbGFzcyBULGludCBtYXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1lbnQ+Cmlu bGluZQp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxtYXgs ZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMp CnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmICgocy51blJlYWQoKSA8IChsKmVs bVNpemUpKSB8fCBsID4gbWF4KSB7CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9Cgog IEJhc2VUOjpsZW5ndGgobCk7CiAgaWYgKGw9PTApIHJldHVybjsKICBpZiAoKGludCllbG1BbGln bm1lbnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBpZiAocy5yZEN1cnJlbnRBbGlnbm1l bnQoKSAhPSAoaW50KW9tbmk6OkFMSUdOXzgpCiAgICAgIHMuc2tpcChzaXplb2YoX0NPUkJBX1VM b25nKSk7CiAgfQogIHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0 YSgpLChpbnQpbCplbG1TaXplKTsKICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVP cmRlciAmJiBlbG1BbGlnbm1lbnQgIT0gMSkgewogICAgaWYgKGVsbVNpemUgPT0gMikgewogICAg ICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VTaG9y dCB0ID0gKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9D T1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhmZikgPDwgOCkg fCAoKCh0KSA+PiA4KSAmIDB4ZmYpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZWxtU2l6 ZSA9PSA0KSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgICAg ICBfQ09SQkFfVUxvbmcgdCA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsK ICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSAoKCgodCkgJiAw eGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAw eDAwMDBmZjAwKSA8PCA4KSB8ICgoKHQpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQog ICAgfQogICAgZWxzZSBpZiAoZWxtU2l6ZSA9PSA4KSB7CiAgICAgIGwgKj0gMjsKICAgICAgZm9y IChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrPTIpIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwx ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV07CiAgICAgICAgX0NPUkJB X1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4 MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAm IDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICAgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VU OjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgp KVtpXSA9IHRsMjsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsx XSA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDAp ID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAw ZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xh c3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24+CmlubGluZSB2b2lkCl9DT1JCQV9T ZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+OjpvcGVyYXRvcj4+PSAoTmV0 QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBwZF9sZW4gPj49IHM7CiAgZm9yIChfQ09SQkFf VUxvbmcgaT0wOyBpPHBkX2xlbjsgaSsrKSB7CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBqPTA7IGo8 ZGltZW5zaW9uOyBqKyspIHsKICAgICAgKigoVGVsbSopKHBkX2J1ZltpXSkraikgPj49IHM7CiAg ICB9CiAgfQogIHJldHVybjsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xh c3MgVGVsbSxpbnQgZGltZW5zaW9uPgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfQXJyYXk8 VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPjo6b3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFt JiBzKQp7CiAgX0NPUkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAobCA+IHMuUmRNZXNzYWdl VW5SZWFkKCkgfHwgKHBkX2JvdW5kZWQgJiYgbCA+IHBkX21heCkpIHsKICAgIF9DT1JCQV9tYXJz aGFsX2Vycm9yKCk7CgogIH0KICBsZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PGw7IGkrKykgewogICAgZm9yIChfQ09SQkFfVUxvbmcgaj0wOyBqPGRpbWVuc2lvbjsgaisrKSB7 CiAgICAgICooKFRlbG0qKShwZF9idWZbaV0pK2opIDw8PSBzOwogICAgfQogIH0KICByZXR1cm47 Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVu c2lvbj4KaW5saW5lIHZvaWQKX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRp bWVuc2lvbj46Om9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIHBk X2xlbiA+Pj0gczsKICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8cGRfbGVuOyBpKyspIHsKICAg IGZvciAoX0NPUkJBX1VMb25nIGo9MDsgajxkaW1lbnNpb247IGorKykgewogICAgICAqKChUZWxt KikocGRfYnVmW2ldKStqKSA+Pj0gczsKICAgIH0KICB9CiAgcmV0dXJuOwp9CgoKdGVtcGxhdGUg PGNsYXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24+CmlubGluZSB2 b2lkCl9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+OjpvcGVy YXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8 PSBzOwogIGlmIChzLnVuUmVhZCgpIDwgbCB8fCAocGRfYm91bmRlZCAmJiBsID4gcGRfbWF4KSkg ewogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQogIGxlbmd0aChsKTsKICBmb3IgKF9D T1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBqPTA7IGo8 ZGltZW5zaW9uOyBqKyspIHsKICAgICAgKigoVGVsbSopKHBkX2J1ZltpXSkraikgPDw9IHM7CiAg ICB9CiAgfQogIHJldHVybjsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xh c3MgVGVsbSxpbnQgZGltZW5zaW9uLGludCBlbG1TaXplLGludCBlbG1BbGlnbm1lbnQ+CmlubGlu ZQp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxU LFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcj4+ PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09SQkFfVUxvbmcgbCA9IEJhc2VU OjpsZW5ndGgoKTsKICBsID4+PSBzOwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxt QWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAgX0NPUkJBX1VMb25nIHBhZGRp bmcgPSAwOwogICAgaWYgKHMud3JDdXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElH Tl84KQogICAgICBwYWRkaW5nID4+PSBzOwogIH0KICBzLnB1dF9jaGFyX2FycmF5KChfQ09SQkFf Q2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZGltZW5zaW9uKmVsbVNpemUpOwp9CgoKdGVt cGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24saW50 IGVsbVNpemUsaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbixl bG1TaXplLGVsbUFsaWdubWVudD46Om9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSYgcykK ewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwqZGltZW5zaW9uKmVsbVNpemUg PiBzLlJkTWVzc2FnZVVuUmVhZCgpKSB7CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9 CiAgQmFzZVQ6Omxlbmd0aChsKTsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFs aWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIGlmIChzLnJkQ3VycmVudEFsaWdu bWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcy5za2lwKHNpemVvZihfQ09SQkFf VUxvbmcpKTsKICB9CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9k YXRhKCksKGludClsKmRpbWVuc2lvbiplbG1TaXplKTsKICBpZiAocy5SZE1lc3NhZ2VCeXRlT3Jk ZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciAmJiBlbG1BbGlnbm1lbnQgIT0gMSkgewogICAgaWYg KGVsbVNpemUgPT0gMikgewogICAgICBsICo9IGRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFf VUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VU2hvcnQgdCA9ICgoX0NPUkJB X1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVVNob3J0KilC YXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkg JiAweGZmKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gNCkgewogICAg ICBsICo9IGRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykg ewogICAgICAgIF9DT1JCQV9VTG9uZyB0ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRh KCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgo KCh0KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAo KCh0KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwog ICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChlbG1TaXplID09IDgpIHsKICAgICAgbCAqPSAyKmRp bWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrPTIpIHsKICAgICAg ICBfQ09SQkFfVUxvbmcgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2kr MV07CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4g MjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDAp IDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICAgdGwxID0gKChf Q09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25n KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9IHRsMjsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFz ZVQ6Ok5QX2RhdGEoKSlbaSsxXSA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgo dGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwg KCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCgp0ZW1w bGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQg ZWxtU2l6ZSxpbnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLGVs bVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSBj b25zdAp7CiAgX0NPUkJBX1VMb25nIGwgPSBCYXNlVDo6bGVuZ3RoKCk7CiAgbCA+Pj0gczsKICBp ZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFM SUdOXzgpIHsKICAgIF9DT1JCQV9VTG9uZyBwYWRkaW5nID0gMDsKICAgIGlmIChzLndyQ3VycmVu dEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcGFkZGluZyA+Pj0gczsK ICB9CiAgcy5wdXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGlu dClsKmRpbWVuc2lvbiplbG1TaXplKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xp Y2UsY2xhc3MgVGVsbSxpbnQgZGltZW5zaW9uLGludCBlbG1TaXplLGludCBlbG1BbGlnbm1lbnQ+ CmlubGluZQp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxl bWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVy YXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8 PSBzOwogIGlmKCBzLnVuUmVhZCgpIDwgbCAqIGRpbWVuc2lvbiAqIGVsbVNpemUgKSB7CiAgICBf Q09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CiAgQmFzZVQ6Omxlbmd0aChsKTsKICBpZiAobD09 MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgp IHsKICAgIGlmIChzLnJkQ3VycmVudEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkK ICAgICAgcy5za2lwKHNpemVvZihfQ09SQkFfVUxvbmcpKTsKICB9CiAgcy5nZXRfY2hhcl9hcnJh eSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGludClsKmRpbWVuc2lvbiplbG1TaXpl KTsKICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciAmJiBlbG1BbGlnbm1l bnQgIT0gMSkgewogICAgaWYgKGVsbVNpemUgPT0gMikgewogICAgICBsICo9IGRpbWVuc2lvbjsK ICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9V U2hvcnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAg KChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYpIDw8 IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVs bVNpemUgPT0gNCkgewogICAgICBsICo9IGRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxv bmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VTG9uZyB0ID0gKChfQ09SQkFfVUxv bmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6 TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHQpICYgMHgw MGZmMDAwMCkgPj4gOCkgfCAoKCh0KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodCkgJiAweDAw MDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChlbG1TaXplID09IDgp IHsKICAgICAgbCAqPSAyKmRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PGw7IGkrPTIpIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJh c2VUOjpOUF9kYXRhKCkpW2krMV07CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0bDEp ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgo dGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7 CiAgICAgICAgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAg ICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9IHRsMjsKICAgICAgICAo KF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsxXSA9ICgoKCh0bDEpICYgMHhmZjAw MDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4 MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0K ICAgIH0KICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0s aW50IGRpbWVuc2lvbixpbnQgbWF4LGludCBlbG1TaXplLCBpbnQgZWxtQWxpZ25tZW50Pgppbmxp bmUKdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQs VF9zbGljZSxUZWxtLGRpbWVuc2lvbixtYXgsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRv cj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09SQkFfVUxvbmcgbCA9IEJh c2VUOjpsZW5ndGgoKTsKICBsID4+PSBzOwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQp ZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAgX0NPUkJBX1VMb25nIHBh ZGRpbmcgPSAwOwogICAgaWYgKHMud3JDdXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpB TElHTl84KQogICAgICBwYWRkaW5nID4+PSBzOwogIH0KICBzLnB1dF9jaGFyX2FycmF5KChfQ09S QkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZGltZW5zaW9uKmVsbVNpemUpOwp9CgoK dGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24s aW50IG1heCxpbnQgZWxtU2l6ZSwgaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJB X0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsVGVsbSxk aW1lbnNpb24sbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I8PD0gKE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKQp7CiAgX0NPUkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAobCpkaW1l bnNpb24qZWxtU2l6ZSA+IHMuUmRNZXNzYWdlVW5SZWFkKCkgfHwgbCA+IG1heCkgewogICAgX0NP UkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQoKICBCYXNlVDo6bGVuZ3RoKGwpOwogIGlmIChsPT0w KSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkg ewogICAgaWYgKHMucmRDdXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQog ICAgICBzLnNraXAoc2l6ZW9mKF9DT1JCQV9VTG9uZykpOwogIH0KICBzLmdldF9jaGFyX2FycmF5 KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZGltZW5zaW9uKmVsbVNpemUp OwogIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICYmIGVs bUFsaWdubWVudCAhPSAxKSB7CiAgICBpZiAoZWxtU2l6ZSA9PSAyKSB7CiAgICAgIGwgKj0gZGlt ZW5zaW9uOwogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAg X0NPUkJBX1VTaG9ydCB0ID0gKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXTsK ICAgICAgICAoKF9DT1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYg MHhmZikgPDwgOCkgfCAoKCh0KSA+PiA4KSAmIDB4ZmYpKTsKICAgICAgfQogICAgfQogICAgZWxz ZSBpZiAoZWxtU2l6ZSA9PSA0KSB7CiAgICAgIGwgKj0gZGltZW5zaW9uOwogICAgICBmb3IgKF9D T1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHQgPSAoKF9D T1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcq KUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgo dCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0 KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNp emUgPT0gOCkgewogICAgICBsICo9IDIqZGltZW5zaW9uOwogICAgICBmb3IgKF9DT1JCQV9VTG9u ZyBpPTA7IGk8bDsgaSs9MikgewogICAgICAgIF9DT1JCQV9VTG9uZyB0bDEgPSAoKF9DT1JCQV9V TG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsxXTsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwyID0g KCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4g OCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikg PDwgMjQpKTsKICAgICAgICB0bDEgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlb aV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gdGwyOwog ICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdID0gKCgoKHRsMSkg JiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0 bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsK ICAgICAgfQogICAgfQogIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xh c3MgVGVsbSxpbnQgZGltZW5zaW9uLGludCBtYXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1l bnQ+CmlubGluZQp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVs ZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heCxlbG1TaXplLGVsbUFsaWdubWVudD46 Om9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9VTG9u ZyBsID0gQmFzZVQ6Omxlbmd0aCgpOwogIGwgPj49IHM7CiAgaWYgKGw9PTApIHJldHVybjsKICBp ZiAoKGludCllbG1BbGlnbm1lbnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBfQ09SQkFf VUxvbmcgcGFkZGluZyA9IDA7CiAgICBpZiAocy53ckN1cnJlbnRBbGlnbm1lbnQoKSAhPSAoaW50 KW9tbmk6OkFMSUdOXzgpCiAgICAgIHBhZGRpbmcgPj49IHM7CiAgfQogIHMucHV0X2NoYXJfYXJy YXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQpbCpkaW1lbnNpb24qZWxtU2l6 ZSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRp bWVuc2lvbixpbnQgbWF4LGludCBlbG1TaXplLCBpbnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9p ZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGlj ZSxUZWxtLGRpbWVuc2lvbixtYXgsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcjw8PSAo TWVtQnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlm ICgocy51blJlYWQoKSA8IChsKmRpbWVuc2lvbiplbG1TaXplKSkgfHwgbCA+IG1heCkgewogICAg X0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQoKICBCYXNlVDo6bGVuZ3RoKGwpOwogIGlmIChs PT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05f OCkgewogICAgaWYgKHMucmRDdXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84 KQogICAgICBzLnNraXAoc2l6ZW9mKF9DT1JCQV9VTG9uZykpOwogIH0KICBzLmdldF9jaGFyX2Fy cmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZGltZW5zaW9uKmVsbVNp emUpOwogIGlmIChzLmJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICYmIGVsbUFsaWdu bWVudCAhPSAxKSB7CiAgICBpZiAoZWxtU2l6ZSA9PSAyKSB7CiAgICAgIGwgKj0gZGltZW5zaW9u OwogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJB X1VTaG9ydCB0ID0gKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAg ICAoKF9DT1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhmZikg PDwgOCkgfCAoKCh0KSA+PiA4KSAmIDB4ZmYpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAo ZWxtU2l6ZSA9PSA0KSB7CiAgICAgIGwgKj0gZGltZW5zaW9uOwogICAgICBmb3IgKF9DT1JCQV9V TG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHQgPSAoKF9DT1JCQV9V TG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VU OjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAw eDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4 MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0g OCkgewogICAgICBsICo9IDIqZGltZW5zaW9uOwogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7 IGk8bDsgaSs9MikgewogICAgICAgIF9DT1JCQV9VTG9uZyB0bDEgPSAoKF9DT1JCQV9VTG9uZyop QmFzZVQ6Ok5QX2RhdGEoKSlbaSsxXTsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwyID0gKCgoKHRs MSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAo KCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQp KTsKICAgICAgICB0bDEgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAg ICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gdGwyOwogICAgICAg ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdID0gKCgoKHRsMSkgJiAweGZm MDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYg MHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAg fQogICAgfQogIH0KfQojIDE2MDcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvYnVmZmVy ZWRTdHJlYW0uaCIKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuOjpvcGVy YXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09SQkFfU2VxdWVuY2U8 X0NPUkJBX0Jvb2xlYW4+OjpvcGVyYXRvcj4+PShzKTsKfQoKCnZvaWQKX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9fQm9vbGVhbjo6b3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKQp7 CiAgX0NPUkJBX1NlcXVlbmNlPF9DT1JCQV9Cb29sZWFuPjo6b3BlcmF0b3I8PD0ocyk7Cn0KCgp2 b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW46Om9wZXJhdG9yPj49IChNZW1C dWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9TZXF1ZW5jZTxfQ09SQkFfQm9vbGVh bj46Om9wZXJhdG9yPj49KHMpOwp9CgoKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19C b29sZWFuOjpvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfU2Vx dWVuY2U8X0NPUkJBX0Jvb2xlYW4+OjpvcGVyYXRvcjw8PShzKTsKfQoKCnRlbXBsYXRlIDxpbnQg bWF4Pgp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuPG1heD46Om9wZXJhdG9y Pj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9TZXF1ZW5jZTxfQ09S QkFfQm9vbGVhbj46Om9wZXJhdG9yPj49KHMpOwp9CgoKdGVtcGxhdGUgPGludCBtYXg+CnZvaWQK X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW48bWF4Pjo6b3BlcmF0b3I8PD0gKE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NPUkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAobCA+ IHMuUmRNZXNzYWdlVW5SZWFkKCkgfHwgbCA+IG1heCkgewogICAgX0NPUkJBX21hcnNoYWxfZXJy b3IoKTsKCiAgfQoKICBCYXNlVDo6bGVuZ3RoKGwpOwogIGZvciAoX0NPUkJBX1VMb25nIGk9MDsg aTxsOyBpKyspIHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxfQ09SQkFfQm9vbGVhbj46Ok5QX2RhdGEo KVtpXSA8PD0gczsKICB9CiAgcmV0dXJuOwp9CgoKdGVtcGxhdGUgPGludCBtYXg+CnZvaWQKX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW48bWF4Pjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1NlcXVlbmNlPF9DT1JCQV9Cb29sZWFuPjo6 b3BlcmF0b3I+Pj0ocyk7Cn0KCgp0ZW1wbGF0ZSA8aW50IG1heD4Kdm9pZApfQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV9fQm9vbGVhbjxtYXg+OjpvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0m IHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmICgocy51blJlYWQoKSA8IGwp IHx8IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KICBCYXNlVDo6 bGVuZ3RoKGwpOwogIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgIF9DT1JC QV9TZXF1ZW5jZTxfQ09SQkFfQm9vbGVhbj46Ok5QX2RhdGEoKVtpXSA8PD0gczsKICB9CiAgcmV0 dXJuOwp9CgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwgaW50IGRpbWVuc2lvbj4K dm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxk aW1lbnNpb24+OjoKICAgIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3QK ewogIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5z aW9uPjo6b3BlcmF0b3I+Pj0ocyk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUX3NsaWNl LCBpbnQgZGltZW5zaW9uPgp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jv b2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbj46OgogICAgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVk U3RyZWFtJiBzKQp7CiAgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxfQ09SQkFfQm9v bGVhbixkaW1lbnNpb24+OjpvcGVyYXRvcjw8PShzKTsKfQoKCnRlbXBsYXRlPGNsYXNzIFQsIGNs YXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24+CnZvaWQKX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZV9BcnJheV9fQm9vbGVhbjxULFRfc2xpY2UsZGltZW5zaW9uPjo6CiAgICBvcGVyYXRvcj4+PSAo TWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxU X3NsaWNlLF9DT1JCQV9Cb29sZWFuLGRpbWVuc2lvbj46Om9wZXJhdG9yPj49KHMpOwp9CgoKdGVt cGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwgaW50IGRpbWVuc2lvbj4Kdm9pZApfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1lbnNpb24+OjoK ICAgIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9TZXF1ZW5j ZV9BcnJheTxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uPjo6b3BlcmF0b3I8PD0o cyk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUX3NsaWNlLCBpbnQgZGltZW5zaW9uLCBp bnQgbWF4Pgp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9z bGljZSxkaW1lbnNpb24sbWF4Pjo6CiAgIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYg cykgY29uc3QKewogIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsX0NPUkJBX0Jvb2xl YW4sZGltZW5zaW9uPjo6b3BlcmF0b3I+Pj0ocyk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFz cyBUX3NsaWNlLCBpbnQgZGltZW5zaW9uLCBpbnQgbWF4Pgp2b2lkCl9DT1JCQV9Cb3VuZGVkX1Nl cXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1lbnNpb24sbWF4Pjo6CiAgICBvcGVy YXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8 PSBzOwogIGlmIChsID4gcy5SZE1lc3NhZ2VVblJlYWQoKSB8fCBsID4gbWF4KSB7CiAgICBfQ09S QkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CgogIEJhc2VUOjpsZW5ndGgobCk7CiAgZm9yIChfQ09S QkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgZm9yIChfQ09SQkFfVUxvbmcgaj0wOyBqPGRp bWVuc2lvbjsgaisrKSB7CiAgICAgICooKF9DT1JCQV9Cb29sZWFuKikoQmFzZVQ6Ok5QX2RhdGEo KVtpXSkraikgPDw9IHM7CiAgICB9CiAgfQogIHJldHVybjsKfQoKCnRlbXBsYXRlPGNsYXNzIFQs IGNsYXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24sIGludCBtYXg+CnZvaWQKX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbixtYXg+OjoKICAg IG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9TZXF1 ZW5jZV9BcnJheTxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uPjo6b3BlcmF0b3I+ Pj0ocyk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUX3NsaWNlLCBpbnQgZGltZW5zaW9u LCBpbnQgbWF4Pgp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQs VF9zbGljZSxkaW1lbnNpb24sbWF4Pjo6CiAgICBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJl YW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmICgocy51blJlYWQoKSA8 IGwpIHx8IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KICBCYXNl VDo6bGVuZ3RoKGwpOwogIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgIGZv ciAoX0NPUkJBX1VMb25nIGo9MDsgajxkaW1lbnNpb247IGorKykgewogICAgICAqKChfQ09SQkFf Qm9vbGVhbiopKEJhc2VUOjpOUF9kYXRhKClbaV0pK2opIDw8PSBzOwogICAgfQogIH0KICByZXR1 cm47Cn0KCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBFbGVtVCxjbGFzcyBUX0hlbHBlcj4K aW5saW5lIHZvaWQKX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPjo6b3Bl cmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgOjpvcGVyYXRvcj4+PShf Q09SQkFfVUxvbmcocGRfbGVuKSwgcyk7CiAgZm9yKCBpbnQgaSA9IDA7IGkgPCAoaW50KXBkX2xl bjsgaSsrICkKICAgIFRfSGVscGVyOjptYXJzaGFsT2JqUmVmKHBkX2RhdGFbaV0scyk7Cn0KCgoK CgppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKG9tbmlPYmpLZXkmIGssIE5ldEJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgX0NPUkJBX1VMb25nIHNpemU7CiAgc2l6ZSA8PD0gczsKICBrLnNldF9zaXpl KHNpemUpOwogIHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgay53cml0ZV9rZXkoKSwg c2l6ZSk7Cn0KaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChvbW5pT2JqS2V5JiBrLCBNZW1CdWZm ZXJlZFN0cmVhbSYgcykgewogIF9DT1JCQV9VTG9uZyBzaXplOwogIHNpemUgPDw9IHM7CiAgay5z ZXRfc2l6ZShzaXplKTsKICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopIGsud3JpdGVf a2V5KCksIHNpemUpOwp9CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEVsZW1ULGNsYXNz IFRfSGVscGVyPgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9I ZWxwZXI+OjpvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxv bmcgbDsKICBsIDw8PSBzOwogIGlmIChsID4gcy5SZE1lc3NhZ2VVblJlYWQoKSB8fCAocGRfYm91 bmRlZCAmJiBsID4gcGRfbWF4KSkgewogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQog IGxlbmd0aChsKTsKICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gMDsgaSA8IGw7IGkrKyApCiAgICBv cGVyYXRvcltdKGkpID0gVF9IZWxwZXI6OnVubWFyc2hhbE9ialJlZihzKTsKfQoKCnRlbXBsYXRl IDxjbGFzcyBULCBjbGFzcyBFbGVtVCxjbGFzcyBUX0hlbHBlcj4KaW5saW5lIHZvaWQKX0NPUkJB X1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgcGRfbGVuID4+PSBzOwogIGZvciAoaW50IGk9MDsgaTwo aW50KXBkX2xlbjsgaSsrKQogICAgVF9IZWxwZXI6Om1hcnNoYWxPYmpSZWYocGRfZGF0YVtpXSxz KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBFbGVtVCwgY2xhc3MgVF9IZWxwZXI+Cmlu bGluZSB2b2lkCl9DT1JCQV9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj46Om9wZXJh dG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9 IHM7CiAgaWYgKHMudW5SZWFkKCkgPCBsIHx8IChwZF9ib3VuZGVkICYmIGwgPiBwZF9tYXgpKSB7 CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CiAgbGVuZ3RoKGwpOwogIGZvciAoX0NP UkJBX1VMb25nIGk9MDsgaTxsOyBpKyspCiAgICBvcGVyYXRvcltdKGkpID0gVF9IZWxwZXI6OnVu bWFyc2hhbE9ialJlZihzKTsKfQojIDQwOCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9v bW5pSW50ZXJuYWwuaCIgMgojIDEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvZ2lvcERy aXZlci5oIiAxCiMgODQgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvZ2lvcERyaXZlci5o IgpjbGFzcyBHSU9QX0Jhc2V0eXBlcyB7CnB1YmxpYzoKICBjbGFzcyBNZXNzYWdlSGVhZGVyIHsK ICBwdWJsaWM6CiAgICB0eXBlZGVmIF9DT1JCQV9DaGFyIEhlYWRlclR5cGVbOF07CiAgICBzdGF0 aWMgY29uc3QgSGVhZGVyVHlwZSBSZXF1ZXN0OwogICAgc3RhdGljIGNvbnN0IEhlYWRlclR5cGUg UmVwbHk7CiAgICBzdGF0aWMgY29uc3QgSGVhZGVyVHlwZSBDYW5jZWxSZXF1ZXN0OwogICAgc3Rh dGljIGNvbnN0IEhlYWRlclR5cGUgTG9jYXRlUmVxdWVzdDsKICAgIHN0YXRpYyBjb25zdCBIZWFk ZXJUeXBlIExvY2F0ZVJlcGx5OwogICAgc3RhdGljIGNvbnN0IEhlYWRlclR5cGUgQ2xvc2VDb25u ZWN0aW9uOwogICAgc3RhdGljIGNvbnN0IEhlYWRlclR5cGUgTWVzc2FnZUVycm9yOwogIH07CiAg c3RydWN0IF9TeXNFeGNlcHRSZXBvSUQgewogICAgX0NPUkJBX0NoYXIgKmlkOwogICAgX0NPUkJB X1VMb25nIGxlbjsKCiAgICBfU3lzRXhjZXB0UmVwb0lEKF9DT1JCQV9DaGFyICppKSB7CiAgICAg IGlkID0gaTsgbGVuID0gc3RybGVuKChjb25zdCBjaGFyICopaSk7CiAgICB9CiAgfTsKICBjbGFz cyBTeXNFeGNlcHRSZXBvSUQgewogIHB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0 UmVwb0lEIFVOS05PV047CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBCQURfUEFS QU07CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBOT19NRU1PUlk7CiAgICBzdGF0 aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBJTVBfTElNSVQ7CiAgICBzdGF0aWMgY29uc3QgX1N5 c0V4Y2VwdFJlcG9JRCBDT01NX0ZBSUxVUkU7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJl cG9JRCBJTlZfT0JKUkVGOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgT0JKRUNU X05PVF9FWElTVDsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIE5PX1BFUk1JU1NJ T047CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBJTlRFUk5BTDsKICAgIHN0YXRp YyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIE1BUlNIQUw7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4 Y2VwdFJlcG9JRCBJTklUSUFMSVpFOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQg Tk9fSU1QTEVNRU5UOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgQkFEX1RZUEVD T0RFOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgQkFEX09QRVJBVElPTjsKICAg IHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIE5PX1JFU09VUkNFUzsKICAgIHN0YXRpYyBj b25zdCBfU3lzRXhjZXB0UmVwb0lEIE5PX1JFU1BPTlNFOwogICAgc3RhdGljIGNvbnN0IF9TeXNF eGNlcHRSZXBvSUQgUEVSU0lTVF9TVE9SRTsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVw b0lEIEJBRF9JTlZfT1JERVI7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBUUkFO U0lFTlQ7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBGUkVFX01FTTsKICAgIHN0 YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIElOVl9JREVOVDsKICAgIHN0YXRpYyBjb25zdCBf U3lzRXhjZXB0UmVwb0lEIElOVl9GTEFHOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBv SUQgSU5URl9SRVBPUzsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIEJBRF9DT05U RVhUOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgT0JKX0FEQVBURVI7CiAgICBz dGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBEQVRBX0NPTlZFUlNJT047CiAgICBzdGF0aWMg Y29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBUUkFOU0FDVElPTl9SRVFVSVJFRDsKICAgIHN0YXRpYyBj b25zdCBfU3lzRXhjZXB0UmVwb0lEIFRSQU5TQUNUSU9OX1JPTExFREJBQ0s7CiAgICBzdGF0aWMg Y29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBJTlZBTElEX1RSQU5TQUNUSU9OOwogICAgc3RhdGljIGNv bnN0IF9TeXNFeGNlcHRSZXBvSUQgV1JPTkdfVFJBTlNBQ1RJT047CiAgICBzdGF0aWMgY29uc3Qg X0NPUkJBX1VMb25nIG1heElETGVuOwogICAgc3RhdGljIGNvbnN0IF9DT1JCQV9DaGFyICp2ZXJz aW9uOwogICAgc3RhdGljIGNvbnN0IF9DT1JCQV9VTG9uZyB2ZXJzaW9uTGVuOwoKICB9OwogIHN0 YXRpYyBzaXplX3QgbWF4X2dpb3BfbWVzc2FnZV9zaXplOwp9OwoKCmNsYXNzIEdJT1BfQyA6IHB1 YmxpYyBHSU9QX0Jhc2V0eXBlcywgcHVibGljIE5ldEJ1ZmZlcmVkU3RyZWFtIHsKcHVibGljOgoK ICBHSU9QX0MoUm9wZSAqcik7CiAgfkdJT1BfQygpOwoKICBlbnVtIFN0YXRlIHsgSWRsZSwKICAg ICAgICAgICAgICAgUmVxdWVzdEluUHJvZ3Jlc3MsCiAgICAgICAgICAgICAgIFdhaXRpbmdGb3JS ZXBseSwKICAgICAgICAgICAgICAgUmVwbHlJc0JlaW5nUHJvY2Vzc2VkLAogICAgICAgICAgICAg ICBab21iaWUKICB9OwojIDIyMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9naW9wRHJp dmVyLmgiCiAgdm9pZCBJbml0aWFsaXNlUmVxdWVzdChjb25zdCB2b2lkKiBvYmprZXksCiAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2Jqa2V5c2l6ZSwKICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9wbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IHNpemVfdCBvcG5hbWVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg c2l6ZV90IG1zZ3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfQ09SQkFfQm9v bGVhbiBvbmV3YXkpOwoKCgoKCiAgR0lPUDo6UmVwbHlTdGF0dXNUeXBlIFJlY2VpdmVSZXBseSgp OwoKICB2b2lkIFJlcXVlc3RDb21wbGV0ZWQoX0NPUkJBX0Jvb2xlYW4gc2tpcD0wKTsKCiAgR0lP UDo6TG9jYXRlU3RhdHVzVHlwZSBJc3N1ZUxvY2F0ZVJlcXVlc3QoY29uc3Qgdm9pZCAqb2Jqa2V5 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVf dCBvYmprZXlzaXplKTsKCiAgc3RhdGljIHNpemVfdCBSZXF1ZXN0SGVhZGVyU2l6ZShjb25zdCBz aXplX3Qgb2Jqa2V5c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHNpemVfdCBvcG5hbWVzaXplKTsKCgoKICBzaXplX3QgTWF4TWVzc2FnZVNpemUoKSBjb25zdCB7 IHJldHVybiBwZF9tYXhfbWVzc2FnZV9zaXplOyB9CiMgMjU2ICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL2dpb3BEcml2ZXIuaCIKcHJpdmF0ZToKICBTdGF0ZSBwZF9zdGF0ZTsKICBfQ09S QkFfVUxvbmcgcGRfcmVxdWVzdF9pZDsKICBfQ09SQkFfQm9vbGVhbiBwZF9yZXNwb25zZV9leHBl Y3RlZDsKICBzaXplX3QgcGRfbWF4X21lc3NhZ2Vfc2l6ZTsKCiAgdm9pZCBVbk1hcnNoYWxsU3lz dGVtRXhjZXB0aW9uKCk7Cgp9OwoKCmNsYXNzIEdJT1BfUyA6IHB1YmxpYyBHSU9QX0Jhc2V0eXBl cywgcHVibGljIE5ldEJ1ZmZlcmVkU3RyZWFtIHsKcHVibGljOgoKICBzdGF0aWMgdm9pZCBkaXNw YXRjaGVyKFN0cmFuZCAqcyk7CiMgMjg4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2dp b3BEcml2ZXIuaCIKICBHSU9QX1MoU3RyYW5kICpzKTsKICB+R0lPUF9TKCk7CgogIGVudW0gU3Rh dGUgeyBJZGxlLAogICAgICAgICAgICAgICBSZXF1ZXN0SXNCZWluZ1Byb2Nlc3NlZCwKICAgICAg ICAgICAgICAgV2FpdGluZ0ZvclJlcGx5LAogICAgICAgICAgICAgICBSZXBseUlzQmVpbmdDb21w b3NlZCwKICAgICAgICAgICAgICAgWm9tYmllCiAgfTsKIyAzNjUgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvZ2lvcERyaXZlci5oIgogIHZvaWQgUmVxdWVzdFJlY2VpdmVkKF9DT1JCQV9C b29sZWFuIHNraXA9MCk7CgogIHZvaWQgSW5pdGlhbGlzZVJlcGx5KGNvbnN0IEdJT1A6OlJlcGx5 U3RhdHVzVHlwZSBzdGF0dXMsIHNpemVfdCBtc2dzaXplKTsKCgoKCiAgdm9pZCBSZXBseUNvbXBs ZXRlZCgpOwoKICBzdGF0aWMgc2l6ZV90IFJlcGx5SGVhZGVyU2l6ZSgpOwoKCgogIGlubGluZSBz aXplX3QgTWF4TWVzc2FnZVNpemUoKSBjb25zdCB7IHJldHVybiBwZF9tYXhfbWVzc2FnZV9zaXpl OyB9CiMgMzkwICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2dpb3BEcml2ZXIuaCIKICBp bmxpbmUgY29uc3QgX0NPUkJBX09jdGV0KiBrZXkoKSBjb25zdCB7IHJldHVybiBwZF9rZXkua2V5 KCk7IH0KICBpbmxpbmUgaW50IGtleXNpemUoKSBjb25zdCB7IHJldHVybiBwZF9rZXkuc2l6ZSgp OyB9CiAgaW5saW5lIGNvbnN0IGNoYXIqIG9wZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIChjb25z dCBjaGFyKikgcGRfb3BlcmF0aW9uOyB9CiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIHJlc3BvbnNl X2V4cGVjdGVkKCkgY29uc3QgewogICAgcmV0dXJuIHBkX3Jlc3BvbnNlX2V4cGVjdGVkOwogIH0K ICBpbmxpbmUgdm9pZCBzZXRfdXNlcl9leGNlcHRpb25zKGNvbnN0IGNoYXIqY29uc3QqIHVlcywg aW50IG4pIHsKICAgIHBkX3VzZXJfZXhucyA9IHVlczsgcGRfbl91c2VyX2V4bnMgPSBuOwogIH0K CgogIHZvaWQgU2VuZE1zZ0Vycm9yTWVzc2FnZSgpOwoKICBjbGFzcyB0ZXJtaW5hdGVQcm9jZXNz aW5nIHsKICBwdWJsaWM6CgoKICAgIGlubGluZSB0ZXJtaW5hdGVQcm9jZXNzaW5nKCkge30KICAg IGlubGluZSB+dGVybWluYXRlUHJvY2Vzc2luZygpIHt9CiAgfTsKCnByaXZhdGU6CiAgU3RhdGUg cGRfc3RhdGU7CiAgX0NPUkJBX1VMb25nIHBkX3JlcXVlc3RfaWQ7CiAgX0NPUkJBX0Jvb2xlYW4g cGRfcmVzcG9uc2VfZXhwZWN0ZWQ7CiAgc2l6ZV90IHBkX21heF9tZXNzYWdlX3NpemU7CgoKCiAg X0NPUkJBX09jdGV0KiBwZF9vcGVyYXRpb247CiAgX0NPUkJBX09jdGV0IHBkX29wX2J1ZmZlclsz Ml07CiAgX0NPUkJBX09jdGV0KiBwZF9wcmluY2lwYWw7CiAgX0NPUkJBX09jdGV0IHBkX3ByX2J1 ZmZlclszMl07CgogIG9tbmlPYmpLZXkgcGRfa2V5OwoKCgogIGNvbnN0IGNoYXIqY29uc3QqIHBk X3VzZXJfZXhuczsKICBpbnQgcGRfbl91c2VyX2V4bnM7CgoKCiAgdm9pZCBIYW5kbGVSZXF1ZXN0 KF9DT1JCQV9Cb29sZWFuIGJ5dGVvcmRlcik7CiAgdm9pZCBIYW5kbGVMb2NhdGVSZXF1ZXN0KF9D T1JCQV9Cb29sZWFuIGJ5dGVvcmRlcik7CiAgdm9pZCBIYW5kbGVDYW5jZWxSZXF1ZXN0KF9DT1JC QV9Cb29sZWFuIGJ5dGVvcmRlcik7CiAgdm9pZCBIYW5kbGVNZXNzYWdlRXJyb3IoKTsKICB2b2lk IEhhbmRsZUNsb3NlQ29ubmVjdGlvbigpOwoKICB2b2lkIE1heWJlTWFyc2hhbFVzZXJFeGNlcHRp b24odm9pZCopOwoKCn07CiMgNDA5ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlJ bnRlcm5hbC5oIiAyCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT2JqUmVm LmgiIDEKIyA1MiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT2JqUmVmLmgiCmNs YXNzIG9tbmk7CmNsYXNzIG9tbmlJbnRlcm5hbDsKY2xhc3Mgb21uaU9iaktleTsKY2xhc3Mgb21u aUlkZW50aXR5OwpjbGFzcyBvbW5pTG9jYWxJZGVudGl0eTsKY2xhc3Mgb21uaVJlbW90ZUlkZW50 aXR5OwpjbGFzcyBvbW5pQ2FsbERlc2NyaXB0b3I7CmNsYXNzIG9tbmlTZXJ2YW50OwoKCmNsYXNz IG9tbmlPYmpSZWYgewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3Qg Y2hhciogcmVwb0lkKSA9IDA7CiMgNzcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21u aU9ialJlZi5oIgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2NvbXBhdGlibGVTZXJ2YW50KG9t bmlTZXJ2YW50KiBzdm50KTsKCgoKCgoKICBpbnQgX2dldFJvcGVBbmRLZXkob21uaVJvcGVBbmRL ZXkmIHJhaywgX0NPUkJBX0Jvb2xlYW4qIGlzX2xvY2FsPTApIGNvbnN0OwoKCgoKCgogIHZvaWQg X2dldFRoZUtleShvbW5pT2JqS2V5JiBrZXksIGludCBsb2NrZWQ9MCkgY29uc3Q7CgoKCiAgaW5s aW5lIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpIGNvbnN0IHsKICAgIHJldHVybiBw ZF9tb3N0RGVyaXZlZFJlcG9JZDsKICB9CgoKCgogIGlubGluZSBJT1A6OlRhZ2dlZFByb2ZpbGVM aXN0KiBfaW9wUHJvZmlsZXMoKSBjb25zdCB7CiAgICByZXR1cm4gcGRfaW9wcHJvZmlsZXM7CiAg fQoKCgoKCiAgX0NPUkJBX0Jvb2xlYW4gX3JlYWxfaXNfYShjb25zdCBjaGFyKiByZXBvSWQpOwoK CgoKCgoKICB2b2lkKiBfcmVhbE5hcnJvdyhjb25zdCBjaGFyKiByZXBvSWQpOwojIDEyOSAiLi4v Li4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT2JqUmVmLmgiCiAgdm9pZCBfYXNzZXJ0RXhp c3RzQW5kVHlwZVZlcmlmaWVkKCk7CgoKCgoKCiAgX0NPUkJBX0Jvb2xlYW4gX3JlbW90ZV9pc19h KGNvbnN0IGNoYXIqIHJlcG9JZCk7CgoKCgoKCiAgX0NPUkJBX0Jvb2xlYW4gX3JlbW90ZV9ub25f ZXhpc3RlbnQoKTsKCgoKCgoKICB2b2lkKiBfdHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcih2b2lk KiYgY29va2llKTsKCgoKCgoKICB2b2lkIF90cmFuc2llbnRFeGNlcHRpb25IYW5kbGVyKHZvaWQq IG5ld19oYW5kbGVyLCB2b2lkKiBjb29raWUpOwojIDE2NiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9v bW5pT1JCMy9vbW5pT2JqUmVmLmgiCiAgdm9pZCogX2NvbW1GYWlsdXJlRXhjZXB0aW9uSGFuZGxl cih2b2lkKiYgY29va2llKTsKCgoKCgoKICB2b2lkIF9jb21tRmFpbHVyZUV4Y2VwdGlvbkhhbmRs ZXIodm9pZCogbmV3X2hhbmRsZXIsIHZvaWQqIGNvb2tpZSk7CiMgMTgyICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL29tbmlPYmpSZWYuaCIKICB2b2lkKiBfc3lzdGVtRXhjZXB0aW9uSGFu ZGxlcih2b2lkKiYgY29va2llKTsKCgoKCgoKICB2b2lkIF9zeXN0ZW1FeGNlcHRpb25IYW5kbGVy KHZvaWQqIG5ld19oYW5kbGVyLCB2b2lkKiBjb29raWUpOwojIDIwMCAiLi4vLi4vLi4vLi4vaW5j bHVkZS9vbW5pT1JCMy9vbW5pT2JqUmVmLmgiCiAgaW5saW5lIG9tbmlPYmpSZWYqKiBfYWRkck9m TG9jYWxSZWZMaXN0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDsKICAgIHJldHVybiAmcGRfbmV4dEluTG9jYWxSZWZMaXN0OwogIH0K ICBpbmxpbmUgb21uaU9ialJlZiogX25leHRJbkxvY2FsUmVmTGlzdCgpIHsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICByZXR1cm4g cGRfbmV4dEluTG9jYWxSZWZMaXN0OwogIH0KCgoKICBpbmxpbmUgb21uaUlkZW50aXR5KiBfaWRl bnRpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwogICAgcmV0dXJuIHBkX2lkOwogIH0KCgogIGlubGluZSBvbW5pTG9jYWxJZGVu dGl0eSogX2xvY2FsSWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwogICAgcmV0dXJuIHBkX2xvY2FsSWQ7CiAgfQoKCiAgaW5saW5l IGludCBfaXNGb3J3YXJkTG9jYXRpb24oKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgcmV0dXJuIHBkX2ZsYWdzLmZv cndhcmRfbG9jYXRpb247CiAgfQoKCiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIF9pc19uaWwoKSB7 IHJldHVybiAhcGRfaWQ7IH0KCgogIGlubGluZSB2b2lkIF9ub0V4aXN0ZW50Q2hlY2soKSB7CiAg ICBwZF9mbGFncy50eXBlX3ZlcmlmaWVkID0gMTsKICAgIHBkX2ZsYWdzLm9iamVjdF9leGlzdHMg PSAxOwogIH0KCgoKCgogIHZvaWQgX2ludm9rZShvbW5pQ2FsbERlc2NyaXB0b3ImLCBfQ09SQkFf Qm9vbGVhbiBkb19hc3NlcnQ9MSk7CgoKCgoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfm9tbmlPYmpS ZWYoKTsKCgogIG9tbmlPYmpSZWYoKTsKCgoKCiAgb21uaU9ialJlZihjb25zdCBjaGFyKiBpbnRm UmVwb0lkLCBjb25zdCBjaGFyKiBtb3N0RGVyaXZlZElkLAogICAgICAgICAgICAgSU9QOjpUYWdn ZWRQcm9maWxlTGlzdCogcHJvZmlsZXMsCiAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqIGlkLCBv bW5pTG9jYWxJZGVudGl0eSogbGlkKTsKCgogIHZvaWQgX2xvY2F0ZVJlcXVlc3QoKTsKCgoKCgpw cml2YXRlOgogIG9tbmlPYmpSZWYoY29uc3Qgb21uaU9ialJlZiYpOwogIG9tbmlPYmpSZWYmIG9w ZXJhdG9yID0gKGNvbnN0IG9tbmlPYmpSZWYmKTsKCgoKCgoKICBmcmllbmQgY2xhc3Mgb21uaTsK ICBmcmllbmQgY2xhc3Mgb21uaUludGVybmFsOwogIGZyaWVuZCBjbGFzcyBvbW5pUHk7CgogIGlu bGluZSB2b2lkIF9zZXRJZGVudGl0eShvbW5pSWRlbnRpdHkqIGlkLCBvbW5pTG9jYWxJZGVudGl0 eSogbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwogICAgcGRfaWQgPSBpZDsKICAgIHBkX2xvY2FsSWQgPSBsaWQ7CiAgfQoKCgoK CgoKICBpbnQgcGRfcmVmQ291bnQ7CgoKICBjaGFyKiBwZF9tb3N0RGVyaXZlZFJlcG9JZDsKIyAz MDQgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9ialJlZi5oIgogIGNoYXIqIHBk X2ludGZSZXBvSWQ7CiMgMzE1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpS ZWYuaCIKICBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiBwZF9pb3Bwcm9maWxlczsKCgogIG9tbmlJ ZGVudGl0eSogcGRfaWQ7CgoKCgoKICBvbW5pTG9jYWxJZGVudGl0eSogcGRfbG9jYWxJZDsKCgoK CgogIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBmb3J3YXJkX2xvY2F0aW9uIDogMTsKCgoKCiAgICB1 bnNpZ25lZCB0eXBlX3ZlcmlmaWVkIDogMTsKCgoKCgogICAgdW5zaWduZWQgb2JqZWN0X2V4aXN0 cyA6IDE7CgoKCgoKICAgIHVuc2lnbmVkIHRyYW5zaWVudF9leGNlcHRpb25faGFuZGxlciA6IDE7 CiAgICB1bnNpZ25lZCBjb21tZmFpbF9leGNlcHRpb25faGFuZGxlciA6IDE7CiAgICB1bnNpZ25l ZCBzeXN0ZW1fZXhjZXB0aW9uX2hhbmRsZXIgOiAxOwoKCgogIH0gcGRfZmxhZ3M7CgoKICBvbW5p T2JqUmVmKiBwZF9uZXh0SW5Mb2NhbFJlZkxpc3Q7CgoKfTsKIyA0MTAgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL3Byb3h5RmFjdG9yeS5oIiAxCiMgNTEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21u aU9SQjMvcHJveHlGYWN0b3J5LmgiCmNsYXNzIG9tbmlMb2NhbElkZW50aXR5OwpjbGFzcyBvbW5p T2JqUmVmOwoKCmNsYXNzIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICB2aXJ0dWFsIH5w cm94eU9iamVjdEZhY3RvcnkoKTsKICBwcm94eU9iamVjdEZhY3RvcnkoY29uc3QgY2hhciogcmVw b0lkKTsKCgoKCgogIHN0YXRpYyB2b2lkIHNodXRkb3duKCk7CgoKCiAgc3RhdGljIHByb3h5T2Jq ZWN0RmFjdG9yeSogbG9va3VwKGNvbnN0IGNoYXIqIHJlcG9JZCk7CgogIGlubGluZSBjb25zdCBj aGFyKiBpclJlcG9JZCgpIGNvbnN0IHsgcmV0dXJuIHBkX3JlcG9JZDsgfQoKCgogIHZpcnR1YWwg b21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqIG1vc3REZXJpdmVkVHlwZUlkLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqIHByb2Zp bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSogaWQsIG9t bmlMb2NhbElkZW50aXR5KiBsaWQpID0gMDsKCgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNf YShjb25zdCBjaGFyKiBiYXNlX3JlcG9JZCkgY29uc3QgPSAwOwoKCgoKcHJpdmF0ZToKICBjb25z dCBjaGFyKiBwZF9yZXBvSWQ7Cn07CiMgNDExICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L29tbmlJbnRlcm5hbC5oIiAyCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5p U2VydmFudC5oIiAxCiMgNDQgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZh bnQuaCIKY2xhc3Mgb21uaU9ialJlZjsKY2xhc3Mgb21uaUlkZW50aXR5OwoKCgoKCmNsYXNzIG9t bmlTZXJ2YW50IHsKcHJvdGVjdGVkOgogIGlubGluZSBvbW5pU2VydmFudCgpIDogcGRfaWRlbnRp dGllcygwKSB7fQogIGlubGluZSBvbW5pU2VydmFudChjb25zdCBvbW5pU2VydmFudCYpIDogcGRf aWRlbnRpdGllcygwKSB7fQogIGlubGluZSBvbW5pU2VydmFudCYgb3BlcmF0b3IgPSAoY29uc3Qg b21uaVNlcnZhbnQmKSB7IHJldHVybiAqdGhpczsgfQoKcHVibGljOgogIHZpcnR1YWwgfm9tbmlT ZXJ2YW50KCk7CgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqIHJl cG9JZCk7CiMgNzQgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZhbnQuaCIK ICB2aXJ0dWFsIHZvaWQqIF9kb3duY2FzdCgpOwoKCgoKCgoKICB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9tb3N0RGVyaXZlZFJlcG9JZCgpOwojIDkxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L29tbmlTZXJ2YW50LmgiCiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfaXNfYShjb25zdCBjaGFy KiBsb2dpY2FsX3R5cGVfaWQpOwoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9ub25fZXhp c3RlbnQoKTsKCgoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIF9kb19nZXRfaW50ZXJmYWNlKCkgPSAw OwoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKIyAxMjAg Ii4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZhbnQuaCIKICB2b2lkIF9hZGRJ ZGVudGl0eShvbW5pTG9jYWxJZGVudGl0eSopOwoKCgogIHZvaWQgX3JlbW92ZUlkZW50aXR5KG9t bmlMb2NhbElkZW50aXR5Kik7CgoKCiAgaW5saW5lIG9tbmlMb2NhbElkZW50aXR5KiBfaWRlbnRp dGllcygpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CiAgICByZXR1cm4gcGRfaWRlbnRpdGllczsKICB9CgoKCnByaXZhdGU6 CiAgb21uaUxvY2FsSWRlbnRpdHkqIHBkX2lkZW50aXRpZXM7CgoKCgoKfTsKIyA0MTIgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIKCgoKdGVtcGxhdGUgPGNs YXNzIFQ+CmNsYXNzIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjsKIyAyNTYgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMgojIDEgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvdGVtcGxhdGVkZWNscy5oIiAxCiMgMzcgIi4uLy4uLy4uLy4uL2luY2x1ZGUv b21uaU9SQjMvdGVtcGxhdGVkZWNscy5oIgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+ IGNsYXNzIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyOwp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3Mg VF92YXI+IGNsYXNzIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNs YXNzIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyIHsKcHVibGljOgogIHR5cGVkZWYgVCogVF9wdHI7CiAg dHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiBUX3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Q c2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+IFRfbWVtYmVyOwoKICBpbmxpbmUgX0NPUkJBX1BzZXVk b09ial9WYXIoKTsKICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9WYXIoVF9wdHIgcCkgOiBwZF9k YXRhKHApIHt9CiAgaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyKGNvbnN0IFRfdmFyJiB2KTsK ICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9WYXIoY29uc3QgVF9tZW1iZXImIG0pOwoKICBpbmxp bmUgfl9DT1JCQV9Qc2V1ZG9PYmpfVmFyKCk7CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9KFRf cHRyIHApOwogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJiB2KTsKICBpbmxp bmUgVF92YXImIG9wZXJhdG9yPShjb25zdCBUX21lbWJlciYgdik7CgogIGlubGluZSBUX3B0ciBv cGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQogIGlubGluZSBvcGVyYXRvciBU X3B0ciAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CgogIGlubGluZSBUKiBpbigpIGNvbnN0 IHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gcGRf ZGF0YTsgfQogIGlubGluZSBUX3B0ciYgb3V0KCk7CiAgaW5saW5lIFRfcHRyIF9yZXRuKCk7Cgog IGZyaWVuZCBjbGFzcyBfQ09SQkFfUHNldWRvT2JqX091dDxULCBfQ09SQkFfUHNldWRvT2JqX1Zh cjxUPiA+OwogIGZyaWVuZCBjbGFzcyBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULCBfQ09SQkFf UHNldWRvT2JqX1ZhcjxUPiA+OwoKcHJvdGVjdGVkOgogIFRfcHRyIHBkX2RhdGE7Cn07CgoKCgoK dGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFRfdmFyPgpjbGFzcyBfQ09SQkFfUHNldWRvT2JqX01l bWJlciB7CnB1YmxpYzoKICB0eXBlZGVmIFQqIFRfcHRyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVk b09ial9NZW1iZXI8VCxUX3Zhcj4gVF9tZW1iZXI7CgogIGlubGluZSBfQ09SQkFfUHNldWRvT2Jq X01lbWJlcigpOwogIGlubGluZSBfQ09SQkFfUHNldWRvT2JqX01lbWJlcihUX3B0ciBwKSA6IF9w dHIocCkge30KICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9NZW1iZXIoY29uc3QgVF9tZW1iZXIm IHApOwogIGlubGluZSB+X0NPUkJBX1BzZXVkb09ial9NZW1iZXIoKTsKCiAgaW5saW5lIFRfbWVt YmVyJiBvcGVyYXRvcj0oVF9wdHIgcCk7CiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0oY29u c3QgVF9tZW1iZXImIHApOwogIGlubGluZSBUX21lbWJlciYgb3BlcmF0b3I9KGNvbnN0IFRfdmFy JiBwKTsKCiAgaW5saW5lIFRfcHRyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBfcHRyOyB9 CiAgaW5saW5lIG9wZXJhdG9yIFRfcHRyICgpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0KCiAgVF9w dHIgX3B0cjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXIsIGNsYXNzIFRf bWJyPgpjbGFzcyBfQ09SQkFfUHNldWRvT2JqX0luT3V0IHsKcHVibGljOgogIGlubGluZSBfQ09S QkFfUHNldWRvT2JqX0luT3V0KFQqIHApIDogX2RhdGEocCkge30KICBpbmxpbmUgX0NPUkJBX1Bz ZXVkb09ial9Jbk91dChUX3ZhciYgdikgOiBfZGF0YSh2KSB7fQogIGlubGluZSBfQ09SQkFfUHNl dWRvT2JqX0luT3V0KFRfbWJyJiBtKSA6IF9kYXRhKG0uX3B0cikge30KCiAgVCogX2RhdGE7Cgpw cml2YXRlOgogIF9DT1JCQV9Qc2V1ZG9PYmpfSW5PdXQoKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xh c3MgVCwgY2xhc3MgVF92YXI+CmNsYXNzIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0IHsKcHVibGljOgog IGlubGluZSBfQ09SQkFfUHNldWRvT2JqX091dChUKiYgcCkgOiBfZGF0YShwKSB7fQogIGlubGlu ZSBfQ09SQkFfUHNldWRvT2JqX091dChUX3ZhciYgcCk7CgogIGlubGluZSBfQ09SQkFfUHNldWRv T2JqX091dDxULFRfdmFyPiYgb3BlcmF0b3I9KFQqIHApIHsKICAgIF9kYXRhID0gcDsKICAgIHJl dHVybiAqdGhpczsKICB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAgX0NPUkJBX1BzZXVkb09i al9PdXQoKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRWxlbVQ+CmNsYXNzIF9D T1JCQV9Qc2V1ZG9fVW5ib3VuZGVkX1NlcXVlbmNlIHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJB X1BzZXVkb19VbmJvdW5kZWRfU2VxdWVuY2U8VCxFbGVtVD4gVF9zZXE7CgogIGlubGluZSBfQ09S QkFfUHNldWRvX1VuYm91bmRlZF9TZXF1ZW5jZSgpCiAgICA6IHBkX21heCgwKSwgcGRfbGVuKDAp LCBwZF9yZWwoMSksIHBkX2J1ZigwKSB7IH0KICBpbmxpbmUgX0NPUkJBX1BzZXVkb19VbmJvdW5k ZWRfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1heCkKICAgIDogcGRfbWF4KG1heCksIHBkX2xlbigw KSwgcGRfcmVsKDEpCiAgewogICAgaWYoICEocGRfYnVmID0gbmV3IEVsZW1UW21heF0pICkKICAg ICAgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogIH0KCiAgaW5saW5lIF9DT1JC QV9Qc2V1ZG9fVW5ib3VuZGVkX1NlcXVlbmNlKF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW5ndGgsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQqKiB2YWx1ZSwgX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4obGVuZ3RoKQogIHsK ICAgIGlmKCBsZW5ndGggPiBtYXggKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHBk X2J1ZiA9IG5ldyBFbGVtVFtsZW5ndGhdOwogICAgaWYoIHJlbGVhc2UgKSB7CiAgICAgIGZvcigg X0NPUkJBX1VMb25nIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSBwZF9idWZbaV0gPSB2YWx1ZVtp XTsKICAgICAgZGVsZXRlW10gdmFsdWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgZm9yKCBfQ09S QkFfVUxvbmcgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApCiAgICAgICAgcGRfYnVmW2ldID0gdmFs dWVbaV07CiAgICB9CiAgfQoKICBpbmxpbmUgX0NPUkJBX1BzZXVkb19VbmJvdW5kZWRfU2VxdWVu Y2UoY29uc3QgVF9zZXEmIHMpCiAgICA6IHBkX21heChzLnBkX21heCksIHBkX2xlbihzLnBkX2xl biksIHBkX3JlbCgxKQogIHsKICAgIGlmKCAhKHBkX2J1ZiA9IG5ldyBFbGVtVFtzLnBkX21heF0p ICkKICAgICAgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgZm9yKCBfQ09S QkFfVUxvbmcgaT0wOyBpIDwgcy5wZF9sZW47IGkrKyApIHsKICAgICAgcGRfYnVmW2ldID0gcy5w ZF9idWZbaV07CiAgICB9CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Qc2V1ZG9fVW5ib3VuZGVkX1Nl cXVlbmNlKCkgewogICAgaWYoIHBkX3JlbCAmJiBwZF9idWYgKSBkZWxldGVbXSBwZF9idWY7CiAg fQoKICBpbmxpbmUgVF9zZXEmIG9wZXJhdG9yPSAoY29uc3QgVF9zZXEmIHMpIHsKICAgIGlmKCAm cyA9PSB0aGlzICkgcmV0dXJuICp0aGlzOwogICAgaWYoIHBkX21heCA8IHMucGRfbWF4ICkgewog ICAgICBFbGVtVCogbmV3YnVmID0gbmV3IEVsZW1UW3MucGRfbWF4XTsKICAgICAgaWYoICFuZXdi dWYgKSBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CiAgICAgIHBkX21heCA9IHMu cGRfbWF4OwogICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsKICAg ICAgZWxzZSBwZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBuZXdidWY7CiAgICB9CiAgICBwZF9s ZW4gPSBzLnBkX2xlbjsKICAgIGZvciggdW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkr KyApIHBkX2J1ZltpXSA9IHMucGRfYnVmW2ldOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5s aW5lIF9DT1JCQV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5s aW5lIF9DT1JCQV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxp bmUgdm9pZCBsZW5ndGgoX0NPUkJBX1VMb25nIGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCA+IHBk X21heCkgewogICAgICBFbGVtVCogbmV3YnVmID0gbmV3IEVsZW1UW2xlbmd0aF07CiAgICAgIGlm KCAhbmV3YnVmICkgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgICBmb3Io IHVuc2lnbmVkIGxvbmcgaSA9IDA7IGkgPCBwZF9sZW47IGkrKyApCiAgICAgICAgbmV3YnVmW2ld ID0gcGRfYnVmW2ldOwogICAgICBwZF9tYXggPSBsZW5ndGg7CiAgICAgIGlmKCBwZF9yZWwgJiYg cGRfYnVmICkgZGVsZXRlW10gcGRfYnVmOwogICAgICBlbHNlIHBkX3JlbCA9IDE7CiAgICAgIHBk X2J1ZiA9IG5ld2J1ZjsKICAgIH0KICAgIHBkX2xlbiA9IGxlbmd0aDsKICB9CiAgaW5saW5lIEVs ZW1UJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIHsKICAgIGlmKCBpbmRleCA+PSBw ZF9sZW4gKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBwZF9idWZbaW5k ZXhdOwogIH0KICBpbmxpbmUgY29uc3QgRWxlbVQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBp bmRleCkgY29uc3QgewogICAgaWYoIGluZGV4ID49IHBkX2xlbiApIF9DT1JCQV9ib3VuZF9jaGVj a19lcnJvcigpOwogICAgcmV0dXJuIHBkX2J1ZltpbmRleF07CiAgfQogIHN0YXRpYyBpbmxpbmUg VCoqIGFsbG9jYnVmKF9DT1JCQV9VTG9uZyBuZWxlbXMpIHsKICAgIFQqKiB2ID0gbmV3IFQqW25l bGVtc107CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGkgPCBuZWxlbXM7IGkrKykgdltpXSA9 IFQ6Ol9uaWwoKTsKICAgIHJldHVybiB2OwogIH0KICBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZWJ1 ZihUKiogYikgeyBpZiggYiApIGRlbGV0ZVtdIGI7IH0KCiAgaW5saW5lIEVsZW1UKiBOUF9kYXRh KCkgeyByZXR1cm4gcGRfYnVmOyB9Cgpwcm90ZWN0ZWQ6CiAgX0NPUkJBX1VMb25nIHBkX21heDsK ICBfQ09SQkFfVUxvbmcgcGRfbGVuOwogIF9DT1JCQV9Cb29sZWFuIHBkX3JlbDsKICBFbGVtVCog cGRfYnVmOwp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBfQ09SQkFfUHNldWRvVmFs dWVfU2VxdWVuY2UgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVu Y2U8VD4gVF9zZXE7CgogIGlubGluZSBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2UoKQogICAg OiBwZF9tYXgoMCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLCBwZF9idWYoMCkgeyB9CiAgaW5saW5l IF9DT1JCQV9Qc2V1ZG9WYWx1ZV9TZXF1ZW5jZShfQ09SQkFfVUxvbmcgbWF4KQogICAgOiBwZF9t YXgobWF4KSwgcGRfbGVuKDApLCBwZF9yZWwoMSkKICB7CiAgICBpZiggIShwZF9idWYgPSBhbGxv Y2J1ZihtYXgpKSApCiAgICAgIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICB9 CgogIGlubGluZSBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1heCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW5ndGgs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiB2YWx1ZSwgX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4obGVuZ3RoKSwgcGRf cmVsKHJlbGVhc2UpLCBwZF9idWYodmFsdWUpCiAgewogICAgaWYoIGxlbmd0aCA+IG1heCApIF9D T1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9Qc2V1ZG9WYWx1 ZV9TZXF1ZW5jZShjb25zdCBUX3NlcSYgcykKICAgIDogcGRfbWF4KHMucGRfbWF4KSwgcGRfbGVu KHMucGRfbGVuKSwgcGRfcmVsKDEpCiAgewogICAgaWYoICEocGRfYnVmID0gYWxsb2NidWYocy5w ZF9tYXgpKSApCiAgICAgIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgIGZv ciggX0NPUkJBX1VMb25nIGk9MDsgaSA8IHMucGRfbGVuOyBpKysgKSB7CiAgICAgIHBkX2J1Zltp XSA9IHMucGRfYnVmW2ldOwogICAgfQogIH0KCiAgaW5saW5lIH5fQ09SQkFfUHNldWRvVmFsdWVf U2VxdWVuY2UoKSB7CiAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsK ICB9CgogIGlubGluZSBUX3NlcSYgb3BlcmF0b3I9IChjb25zdCBUX3NlcSYgcykgewogICAgaWYo ICZzID09IHRoaXMgKSByZXR1cm4gKnRoaXM7CiAgICBpZiggcGRfbWF4IDwgcy5wZF9tYXggKSB7 CiAgICAgIFQqIG5ld2J1ZiA9IGFsbG9jYnVmKHMucGRfbWF4KTsKICAgICAgaWYoICFuZXdidWYg KSBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CiAgICAgIHBkX21heCA9IHMucGRf bWF4OwogICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsKICAgICAg ZWxzZSBwZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBuZXdidWY7CiAgICB9CiAgICBwZF9sZW4g PSBzLnBkX2xlbjsKICAgIGZvciggdW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKyAp IHBkX2J1ZltpXSA9IHMucGRfYnVmW2ldOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5l IF9DT1JCQV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5saW5l IF9DT1JCQV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxpbmUg dm9pZCBsZW5ndGgoX0NPUkJBX1VMb25nIGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCA+IHBkX21h eCkgewogICAgICBUKiBuZXdidWYgPSBhbGxvY2J1ZihsZW5ndGgpOwogICAgICBpZiggIW5ld2J1 ZiApIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgICAgZm9yKCB1bnNpZ25l ZCBsb25nIGkgPSAwOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICAgIG5ld2J1ZltpXSA9IHBkX2J1 ZltpXTsKICAgICAgcGRfbWF4ID0gbGVuZ3RoOwogICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiAp IGRlbGV0ZVtdIHBkX2J1ZjsKICAgICAgZWxzZSBwZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBu ZXdidWY7CiAgICB9CiAgICBwZF9sZW4gPSBsZW5ndGg7CiAgfQogIGlubGluZSBUJiBvcGVyYXRv cltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIHsKICAgIGlmKCBpbmRleCA+PSBwZF9sZW4gKSBfQ09S QkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBwZF9idWZbaW5kZXhdOwogIH0KICBp bmxpbmUgY29uc3QgVCYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSBjb25zdCB7CiAg ICBpZiggaW5kZXggPj0gcGRfbGVuICkgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICBy ZXR1cm4gcGRfYnVmW2luZGV4XTsKICB9CiAgc3RhdGljIGlubGluZSBUKiBhbGxvY2J1ZihfQ09S QkFfVUxvbmcgbmVsZW1zKSB7IHJldHVybiBuZXcgVFtuZWxlbXNdOyB9CiAgc3RhdGljIGlubGlu ZSB2b2lkIGZyZWVidWYoVCogYikgeyBpZiggYiApIGRlbGV0ZVtdIGI7IH0KCiAgaW5saW5lIFQq IE5QX2RhdGEoKSB7IHJldHVybiBwZF9idWY7IH0KCnByb3RlY3RlZDoKICBfQ09SQkFfVUxvbmcg cGRfbWF4OwogIF9DT1JCQV9VTG9uZyBwZF9sZW47CiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwog IFQqIHBkX2J1ZjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xh c3MgX0NPUkJBX09ialJlZl9NZW1iZXI7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBl cj4KY2xhc3MgX0NPUkJBX09ialJlZl9FbGVtZW50OwoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3Mg VF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfSU5PVVRfYXJnOwoKdGVtcGxhdGUgPGNsYXNz IFQsY2xhc3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzsKCnRlbXBsYXRl IDxjbGFzcyBULGNsYXNzIFRfSGVscGVyPgpjbGFzcyBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmc7 Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZf VmFyIHsKcHVibGljOgogIHR5cGVkZWYgVCogcHRyX3Q7CiAgdHlwZWRlZiBUKiBUX3B0cjsKICB0 eXBlZGVmIF9DT1JCQV9PYmpSZWZfTWVtYmVyPFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVk ZWYgX0NPUkJBX09ialJlZl9FbGVtZW50PFQsVF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVm IF9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxwZXI+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX09i alJlZl9WYXIoKSA6IHBkX29ianJlZihUX0hlbHBlcjo6X25pbCgpKSB7fQogIGlubGluZSBfQ09S QkFfT2JqUmVmX1ZhcihUX3B0ciBwKSA6IHBkX29ianJlZihwKSB7fQogIGlubGluZSBfQ09SQkFf T2JqUmVmX1Zhcihjb25zdCBUX3ZhciYgcCkgOiBwZF9vYmpyZWYocC5wZF9vYmpyZWYpIHsKICAg IFRfSGVscGVyOjpkdXBsaWNhdGUocC5wZF9vYmpyZWYpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9P YmpSZWZfVmFyKGNvbnN0IFRfbWVtYmVyJiBtKTsKICBpbmxpbmUgX0NPUkJBX09ialJlZl9WYXIo Y29uc3QgVF9lbGVtZW50JiBtKTsKCiAgaW5saW5lIH5fQ09SQkFfT2JqUmVmX1ZhcigpIHsKCiAg ICBUX0hlbHBlcjo6cmVsZWFzZShwZF9vYmpyZWYpOwoKCgogIH0KCiAgaW5saW5lIFRfdmFyJiBv cGVyYXRvcj0gKFRfcHRyIHApIHsKICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX29ianJlZik7CiAg ICBwZF9vYmpyZWYgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfdmFyJiBv cGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBpZiggJnAgIT0gdGhpcyApIHsKICAgICAg VF9IZWxwZXI6OmR1cGxpY2F0ZShwLnBkX29ianJlZik7CiAgICAgIFRfSGVscGVyOjpyZWxlYXNl KHBkX29ianJlZik7CiAgICAgIHBkX29ianJlZiA9IHAucGRfb2JqcmVmOwogICAgfQogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfbWVtYmVy JiBtKTsKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF9lbGVtZW50JiBtKTsKICBp bmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX29ianJlZjsgfQogIGlu bGluZSBvcGVyYXRvciBUX3B0ciAoKSBjb25zdCB7IHJldHVybiBwZF9vYmpyZWY7IH0KCiAgaW5s aW5lIFRfcHRyIGluKCkgY29uc3QgeyByZXR1cm4gcGRfb2JqcmVmOyB9CiAgaW5saW5lIFRfcHRy JiBpbm91dCgpIHsgcmV0dXJuIHBkX29ianJlZjsgfQogIGlubGluZSBUX3B0ciYgb3V0KCkgewog ICAgVF9IZWxwZXI6OnJlbGVhc2UocGRfb2JqcmVmKTsKICAgIHBkX29ianJlZiA9IFRfSGVscGVy OjpfbmlsKCk7CiAgICByZXR1cm4gcGRfb2JqcmVmOwogIH0KICBpbmxpbmUgVF9wdHIgX3JldG4o KSB7CiAgICBUX3B0ciB0bXAgPSBwZF9vYmpyZWY7CiAgICBwZF9vYmpyZWYgPSBUX0hlbHBlcjo6 X25pbCgpOwogICAgcmV0dXJuIHRtcDsKICB9CgogIGZyaWVuZCBjbGFzcyBfQ09SQkFfT2JqUmVm X0lOT1VUX2FyZzxULFRfSGVscGVyPjsKICBmcmllbmQgY2xhc3MgX0NPUkJBX09ialJlZl9PVVRf YXJnPFQsVF9IZWxwZXI+OwogIGZyaWVuZCBjbGFzcyBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmc8 VCxUX0hlbHBlcj47Cgpwcml2YXRlOgogIFRfcHRyIHBkX29ianJlZjsKfTsKCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xhc3MgX0NPUkJBX09ialJlZl9NZW1iZXIgewpw dWJsaWM6CiAgdHlwZWRlZiBUKiBUX3B0cjsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfTWVtYmVy PFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9FbGVtZW50PFQs VF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxw ZXI+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9NZW1iZXIoKSB7CiAgICBfcHRyID0g VF9IZWxwZXI6Ol9uaWwoKTsKICB9CgogIGlubGluZSBfQ09SQkFfT2JqUmVmX01lbWJlcihjb25z dCBUX21lbWJlciYgcCkgewogICAgVF9IZWxwZXI6OmR1cGxpY2F0ZShwLl9wdHIpOwogICAgX3B0 ciA9IHAuX3B0cjsKICB9CgppbmxpbmUgfl9DT1JCQV9PYmpSZWZfTWVtYmVyKCkgewoKICAgIFRf SGVscGVyOjpyZWxlYXNlKF9wdHIpOwoKCgogIH0KCiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRv cj0gKFRfcHRyIHApIHsKICAgIFRfSGVscGVyOjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IHA7 CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAoY29u c3QgVF9tZW1iZXImIHApIHsKICAgIGlmKCAmcCAhPSB0aGlzICkgewogICAgICBUX0hlbHBlcjo6 cmVsZWFzZShfcHRyKTsKICAgICAgVF9IZWxwZXI6OmR1cGxpY2F0ZShwLl9wdHIpOwogICAgICBf cHRyID0gcC5fcHRyOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfbWVt YmVyJiBvcGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBUX0hlbHBlcjo6cmVsZWFzZShf cHRyKTsKICAgIFRfSGVscGVyOjpkdXBsaWNhdGUocCk7CiAgICBfcHRyID0gKFRfcHRyKSBwOwog ICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0gKGNvbnN0 IFRfZWxlbWVudCYgcCk7CgogIGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1 cm4gX3B0cjsgfQoKICBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlh bG9mZnNldCkgY29uc3QgewogICAgcmV0dXJuIFRfSGVscGVyOjpOUF9hbGlnbmVkU2l6ZShfcHRy LGluaXRpYWxvZmZzZXQpOwogIH0KCiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSBjb25zdCB7CiAgICBUX0hlbHBlcjo6bWFyc2hhbE9ialJlZihfcHRyLHMp OwogIH0KCiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7 CiAgICBUX3B0ciBfcmVzdWx0ID0gVF9IZWxwZXI6OnVubWFyc2hhbE9ialJlZihzKTsKICAgIFRf SGVscGVyOjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IF9yZXN1bHQ7CiAgfQoKICBpbmxpbmUg dm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0IHsKICAgIFRfSGVs cGVyOjptYXJzaGFsT2JqUmVmKF9wdHIscyk7CiAgfQoKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8 PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIFRfcHRyIF9yZXN1bHQgPSBUX0hlbHBlcjo6 dW5tYXJzaGFsT2JqUmVmKHMpOwogICAgVF9IZWxwZXI6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRy ID0gX3Jlc3VsdDsKICB9CgoKCgogIGlubGluZSBvcGVyYXRvciBUX3B0ciAoKSBjb25zdCB7IHJl dHVybiBfcHRyOyB9CgogIGlubGluZSBUX3B0ciBpbigpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0K ICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gX3B0cjsgfQogIGlubGluZSBUX3B0ciYg b3V0KCkgewogICAgVF9IZWxwZXI6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRyID0gVF9IZWxwZXI6 Ol9uaWwoKTsKICAgIHJldHVybiBfcHRyOwogIH0KICBpbmxpbmUgVF9wdHIgX3JldG4oKSB7CiAg ICBUX3B0ciB0bXA7CiAgICB0bXAgPSBfcHRyOwogICAgX3B0ciA9IFRfSGVscGVyOjpfbmlsKCk7 CiAgICByZXR1cm4gdG1wOwogIH0KCiAgVF9wdHIgX3B0cjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xh c3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xhc3MgX0NPUkJBX09ialJlZl9FbGVtZW50IHsKcHVibGlj OgogIHR5cGVkZWYgVCogVF9wdHI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8VCxU X0hlbHBlcj4gVF9lbGVtZW50OwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hl bHBlcj4gVF9tZW1iZXI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiBU X3ZhcjsKCiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudChUX3B0ciYgcCwgX0NPUkJBX0Jv b2xlYW4gcmVsKQogICAgOiBwZF9yZWwocmVsKSwgcGRfZGF0YShwKSB7fQoKICBpbmxpbmUgX0NP UkJBX09ialJlZl9FbGVtZW50KGNvbnN0IFRfZWxlbWVudCYgcCkKICAgIDogcGRfcmVsKHAucGRf cmVsKSwgcGRfZGF0YShwLnBkX2RhdGEpIHt9CgogIGlubGluZSB+X0NPUkJBX09ialJlZl9FbGVt ZW50KCkgewoKICB9CgogIGlubGluZSBUX2VsZW1lbnQmIG9wZXJhdG9yPSAoVF9wdHIgcCkgewog ICAgaWYoIHBkX3JlbCApIFRfSGVscGVyOjpyZWxlYXNlKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9 IHA7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9lbGVtZW50JiBvcGVyYXRvcj0g KGNvbnN0IFRfZWxlbWVudCYgcCkgewogICAgaWYoIHBkX3JlbCApIHsKICAgICAgVF9IZWxwZXI6 OnJlbGVhc2UocGRfZGF0YSk7CiAgICAgIFRfSGVscGVyOjpkdXBsaWNhdGUocC5wZF9kYXRhKTsK ICAgICAgcGRfZGF0YSA9IHAucGRfZGF0YTsKICAgIH0KICAgIGVsc2UKICAgICAgcGRfZGF0YSA9 IHAucGRfZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBUX2VsZW1lbnQmIG9w ZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9yZWwgKSB7CiAgICAgIFRfSGVs cGVyOjpyZWxlYXNlKHBkX2RhdGEpOwogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHApOwogICAg fQogICAgcGRfZGF0YSA9IChUX3B0cikgcDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGlu ZSBUX2VsZW1lbnQmIG9wZXJhdG9yPSAoY29uc3QgVF9tZW1iZXImIHApIHsKICAgIGlmKCBwZF9y ZWwgKSB7CiAgICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX2RhdGEpOwogICAgICBUX0hlbHBlcjo6 ZHVwbGljYXRlKHApOwogICAgfQogICAgcGRfZGF0YSA9IChUX3B0cikgcDsKICAgIHJldHVybiAq dGhpczsKICB9CgogIGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcGRf ZGF0YTsgfQoKCgoKICBpbmxpbmUgb3BlcmF0b3IgVF9wdHIgKCkgY29uc3QgeyByZXR1cm4gcGRf ZGF0YTsgfQoKCiAgaW5saW5lIFRfcHRyIGluKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQog IGlubGluZSBUX3B0ciYgaW5vdXQoKSB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5lIFRfcHRy JiBvdXQoKSB7CiAgICBpZiAocGRfcmVsKSB7CiAgICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX2Rh dGEpOwogICAgfQogICAgcGRfZGF0YSA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICByZXR1cm4gcGRf ZGF0YTsKICB9CiAgaW5saW5lIFRfcHRyIF9yZXRuKCkgewogICAgVF9wdHIgdG1wID0gcGRfZGF0 YTsKICAgIGlmICghcGRfcmVsKQogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHBkX2RhdGEpOwog ICAgcGRfZGF0YSA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICByZXR1cm4gdG1wOwogIH0KCiAgaW5s aW5lIFRfcHRyJiBfTlBfcmVmKCkgY29uc3Qge3JldHVybiBwZF9kYXRhO30KICBpbmxpbmUgX0NP UkJBX0Jvb2xlYW4gX05QX3JlbGVhc2UoKSBjb25zdCB7cmV0dXJuIHBkX3JlbDt9CgogIF9DT1JC QV9Cb29sZWFuIHBkX3JlbDsKICBUX3B0ciYgcGRfZGF0YTsKfTsKCgoKCgoKCnRlbXBsYXRlIDxj bGFzcyBULCBjbGFzcyBUX0hlbHBlcj4KaW5saW5lCl9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxw ZXI+OjoKX0NPUkJBX09ialJlZl9WYXIoY29uc3QgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hl bHBlcj4mIG0pCnsKICBUX0hlbHBlcjo6ZHVwbGljYXRlKG0uX3B0cik7CiAgcGRfb2JqcmVmID0g bS5fcHRyOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmlubGluZQpfQ09S QkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPjo6Cl9DT1JCQV9PYmpSZWZfVmFyKGNvbnN0IF9DT1JC QV9PYmpSZWZfRWxlbWVudDxULFRfSGVscGVyPiYgbSkKewogIFRfSGVscGVyOjpkdXBsaWNhdGUo bSk7CiAgcGRfb2JqcmVmID0gKFQqKW07Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9I ZWxwZXI+CmlubGluZSBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiYKX0NPUkJBX09ialJl Zl9WYXI8VCxUX0hlbHBlcj46Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX09ialJlZl9NZW1iZXI8 VCxUX0hlbHBlcj4mIHApCnsKICBUX0hlbHBlcjo6cmVsZWFzZShwZF9vYmpyZWYpOwogIFRfSGVs cGVyOjpkdXBsaWNhdGUocC5fcHRyKTsKICBwZF9vYmpyZWYgPSBwLl9wdHI7CiAgcmV0dXJuICp0 aGlzOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmlubGluZSBfQ09SQkFf T2JqUmVmX1ZhcjxULFRfSGVscGVyPiYKX0NPUkJBX09ialJlZl9WYXI8VCxUX0hlbHBlcj46Om9w ZXJhdG9yPSAoY29uc3QgX0NPUkJBX09ialJlZl9FbGVtZW50PFQsVF9IZWxwZXI+JiBwKQp7CiAg VF9IZWxwZXI6OnJlbGVhc2UocGRfb2JqcmVmKTsKICBUX0hlbHBlcjo6ZHVwbGljYXRlKHApOwog IHBkX29ianJlZiA9IChUKilwOwogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQs IGNsYXNzIFRfSGVscGVyPgppbmxpbmUgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hlbHBlcj4m Cl9DT1JCQV9PYmpSZWZfTWVtYmVyPFQsVF9IZWxwZXI+OjpvcGVyYXRvcj0gKGNvbnN0IF9DT1JC QV9PYmpSZWZfRWxlbWVudDxULFRfSGVscGVyPiYgcCkKewogIFRfSGVscGVyOjpyZWxlYXNlKF9w dHIpOwogIFRfSGVscGVyOjpkdXBsaWNhdGUocCk7CiAgX3B0ciA9IChUKilwOwogIHJldHVybiAq dGhpczsKfQoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfSGVscGVyPgpjbGFzcyBfQ09S QkFfT2JqUmVmX0lOT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfTWVt YmVyPFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9FbGVtZW50 PFQsVF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPFQsVF9I ZWxwZXI+IFRfdmFyOwogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VUX2FyZyhUKiYgcCkgOiBf ZGF0YShwKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VUX2FyZyhUX3ZhciYgcCkgOiBf ZGF0YShwLnBkX29ianJlZikge30KICBpbmxpbmUgX0NPUkJBX09ialJlZl9JTk9VVF9hcmcoVF9t ZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VU X2FyZyhUX2VsZW1lbnQmIHApIDogX2RhdGEocC5fTlBfcmVmKCkpIHsKCgoKCgoKICAgIGlmKCAh cC5OUF9yZWxlYXNlKCkgKQogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHAuX05QX3JlZigpKTsK ICB9CiAgaW5saW5lIH5fQ09SQkFfT2JqUmVmX0lOT1VUX2FyZygpIHt9CgogIGlubGluZSBvcGVy YXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRlOgogIF9D T1JCQV9PYmpSZWZfSU5PVVRfYXJnKCk7Cn07CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3Mg VF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVm IF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxULFRfSGVscGVyPiBUX291dDsKICB0eXBlZGVmIF9DT1JC QV9PYmpSZWZfTWVtYmVyPFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09i alJlZl9FbGVtZW50PFQsVF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpS ZWZfVmFyPFQsVF9IZWxwZXI+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9PVVRfYXJn KFQqJiBwKSA6IF9kYXRhKHApIHsgX2RhdGEgPSBUX0hlbHBlcjo6X25pbCgpOyB9CiAgaW5saW5l IF9DT1JCQV9PYmpSZWZfT1VUX2FyZyhUX3ZhciYgcCkgOiBfZGF0YShwLnBkX29ianJlZikgewog ICAgcCA9IFRfSGVscGVyOjpfbmlsKCk7CiAgfQogIGlubGluZSBfQ09SQkFfT2JqUmVmX09VVF9h cmcoVF9tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7CiAgICBwID0gVF9IZWxwZXI6Ol9uaWwo KTsKICB9CiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfT1VUX2FyZyhUX2VsZW1lbnQmIHApIDogX2Rh dGEocC5fTlBfcmVmKCkpIHsKICAgIHAgPSBUX0hlbHBlcjo6X25pbCgpOwogIH0KCiAgaW5saW5l IF9DT1JCQV9PYmpSZWZfT1VUX2FyZyhjb25zdCBUX291dCYgcCkgOiBfZGF0YShwLl9kYXRhKSB7 fQogIGlubGluZSB+X0NPUkJBX09ialJlZl9PVVRfYXJnKCkge30KCiAgaW5saW5lIFRfb3V0JiBv cGVyYXRvcj0oY29uc3QgVF9vdXQmIHApIHsgX2RhdGEgPSBwLl9kYXRhOyByZXR1cm4gKnRoaXM7 IH0KICBpbmxpbmUgVF9vdXQmIG9wZXJhdG9yPShUKiBwKSB7IF9kYXRhID0gcDsgcmV0dXJuICp0 aGlzOyB9CgogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGlu ZSBUKiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIGNv bnN0IHsgcmV0dXJuIF9kYXRhOyB9CgogIFQqJiBfZGF0YTsKcHJpdmF0ZToKICBfQ09SQkFfT2Jq UmVmX09VVF9hcmcoKTsKICBUX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfbWVtYmVyJiBwKTsKICBU X291dCYgb3BlcmF0b3I9KGNvbnN0IFRfZWxlbWVudCYgcCk7CiAgVF9vdXQmIG9wZXJhdG9yPShj b25zdCBUX3ZhciYgcCk7CgoKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBl cj4KY2xhc3MgX0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnIHsKcHVibGljOgoKCgoKCgogIHR5cGVk ZWYgVCogVF9wdHI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX01lbWJlcjxULFRfSGVscGVyPiBU X21lbWJlcjsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxULFRfSGVscGVyPiBUX2Vs ZW1lbnQ7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiBUX3ZhcjsKICBp bmxpbmUgX0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnKFRfcHRyJiBwLCBfQ09SQkFfQm9vbGVhbiBy ZWwpCiAgICA6IF9kYXRhKHApLCBfcmVsKHJlbCkge30KICBpbmxpbmUgX0NPUkJBX09ialJlZl90 Y0Rlc2NfYXJnKFRfdmFyJiBwKSA6IF9kYXRhKHAucGRfb2JqcmVmKSwgX3JlbCgxKSB7fQogIGlu bGluZSBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmcoVF9tZW1iZXImIHApIDogX2RhdGEocC5fcHRy KSwgX3JlbCgxKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmcoVF9lbGVtZW50 IHApCiAgICA6IF9kYXRhKHAuX05QX3JlZigpKSwgX3JlbChwLl9OUF9yZWxlYXNlKCkpIHt9CiAg aW5saW5lIH5fQ09SQkFfT2JqUmVmX3RjRGVzY19hcmcoKSB7fQoKICBUKiYgX2RhdGE7CiAgX0NP UkJBX0Jvb2xlYW4gX3JlbDsKCnByaXZhdGU6CiAgX0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnKCk7 Cn07CgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KY2xhc3MgX0NPUkJBX0Nv bnN0clR5cGVfRml4X09VVF9hcmc7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgX0NPUkJBX0Nv bnN0clR5cGVfRml4X1ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX0Zp eF9WYXI8VD4gVF92YXI7CgogIGlubGluZSBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfVmFyKCkge30K ICBpbmxpbmUgX0NPUkJBX0NvbnN0clR5cGVfRml4X1ZhcihUKiBwKSB7IHBkX2RhdGEgPSAqcDsg ZGVsZXRlIHA7IH0KICBpbmxpbmUgX0NPUkJBX0NvbnN0clR5cGVfRml4X1Zhcihjb25zdCBUX3Zh ciYgcCkgewogICAgcGRfZGF0YSA9IHAucGRfZGF0YTsKICB9CiAgaW5saW5lIH5fQ09SQkFfQ29u c3RyVHlwZV9GaXhfVmFyKCkge30KICBpbmxpbmUgVF92YXImb3BlcmF0b3I9IChUKiBwKSB7CiAg ICBwZF9kYXRhID0gKnA7CiAgICBkZWxldGUgcDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5s aW5lIFRfdmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBwZF9kYXRhID0gcC5w ZF9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAo VCBwKSB7CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFQq IG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAoVCopICZwZF9kYXRhOyB9CgoKCgogIGlubGlu ZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5l IG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KIyA4MTkgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvb21uaU9SQjMvdGVtcGxhdGVkZWNscy5oIgogIGNvbnN0IFQmIGluKCkgY29uc3QgeyBy ZXR1cm4gcGRfZGF0YTsgfQogIFQmIGlub3V0KCkgeyByZXR1cm4gcGRfZGF0YTsgfQogIFQmIG91 dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBUIF9yZXRuKCkgeyByZXR1cm4gcGRfZGF0YTsgfQoK ICBmcmllbmQgY2xhc3MgX0NPUkJBX0NvbnN0clR5cGVfRml4X09VVF9hcmc8VCwgVF92YXI+OwoK cHJvdGVjdGVkOgogIFQgcGRfZGF0YTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3Mg VF92YXI+CmNsYXNzIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnIHsKcHVibGljOgogIHR5 cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfRml4X09VVF9hcmc8VCxUX3Zhcj4gVF9vdXQ7CiAgaW5s aW5lIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnKFQqJiBwKSA6IF9kYXRhKHApIHsgX2Rh dGEgPSAwOyB9CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnKFRfdmFyJiBw KSA6IF9kYXRhKCZwLnBkX2RhdGEpIHt9CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9P VVRfYXJnKGNvbnN0IFRfb3V0JiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgaW5saW5lIFRfb3V0 JiBvcGVyYXRvcj0oY29uc3QgVF9vdXQmIHApIHsgX2RhdGEgPSBwLl9kYXRhOyByZXR1cm4gKnRo aXM7IH0KICBpbmxpbmUgVF9vdXQmIG9wZXJhdG9yPShUKiBwKSB7IF9kYXRhID0gcDsgcmV0dXJu ICp0aGlzOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5s aW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiYgb3BlcmF0b3ItPigp IHsgcmV0dXJuIF9kYXRhOyB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAgX0NPUkJBX0NvbnN0 clR5cGVfRml4X09VVF9hcmcoKTsKICBUX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7Cn07 CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFRfdmFyPgpjbGFzcyBfQ09SQkFfQ29uc3Ry VHlwZV9WYXJpYWJsZV9PVVRfYXJnOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIF9DT1JCQV9D b25zdHJUeXBlX1ZhcmlhYmxlX1ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJU eXBlX1ZhcmlhYmxlX1ZhcjxUPiBUX3ZhcjsKCiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBlX1Zh cmlhYmxlX1ZhcigpIHsgcGRfZGF0YSA9IDA7IH0KICBpbmxpbmUgX0NPUkJBX0NvbnN0clR5cGVf VmFyaWFibGVfVmFyKFQqIHApIHsgcGRfZGF0YSA9IHA7IH0KICBpbmxpbmUgX0NPUkJBX0NvbnN0 clR5cGVfVmFyaWFibGVfVmFyKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBpZiggIXAucGRfZGF0YSAp IHBkX2RhdGEgPSAwOwogICAgZWxzZSB7CiAgICAgIHBkX2RhdGEgPSBuZXcgVDsKICAgICAgaWYo ICFwZF9kYXRhICkgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgICAqcGRf ZGF0YSA9ICpwLnBkX2RhdGE7CiAgICB9CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX1ZhcigpIHsgaWYoIHBkX2RhdGEgKSBkZWxldGUgcGRfZGF0YTsgfQoKICBpbmxp bmUgVF92YXImIG9wZXJhdG9yPSAoVCogcCkgewogICAgaWYoIHBkX2RhdGEgKSBkZWxldGUgcGRf ZGF0YTsKICAgIHBkX2RhdGEgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRf dmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBpZiggJnAgPT0gdGhpcyApIHJl dHVybiAqdGhpczsKICAgIGlmKCBwLnBkX2RhdGEgKSB7CiAgICAgIGlmKCAhcGRfZGF0YSApIHsK ICAgICAgICBwZF9kYXRhID0gbmV3IFQ7CiAgICAgICAgaWYoICFwZF9kYXRhICkgX0NPUkJBX25l d19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgICB9CiAgICAgICpwZF9kYXRhID0gKnAucGRf ZGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiggcGRfZGF0YSApIGRlbGV0ZSBwZF9kYXRh OwogICAgICBwZF9kYXRhID0gMDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGlu ZSBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKFQqKXBkX2RhdGE7IH0KCgoKCiAgaW5s aW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpwZF9kYXRhOyB9CiAgaW5s aW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpwZF9kYXRhOyB9CiMgOTIwICIuLi8uLi8uLi8u Li9pbmNsdWRlL29tbmlPUkIzL3RlbXBsYXRlZGVjbHMuaCIKICBjb25zdCBUJiBpbigpIGNvbnN0 IHsgcmV0dXJuICpwZF9kYXRhOyB9CiAgVCYgaW5vdXQoKSB7IHJldHVybiAqcGRfZGF0YTsgfQog IFQqJiBvdXQoKSB7IGlmIChwZF9kYXRhKSB7IGRlbGV0ZSBwZF9kYXRhOyBwZF9kYXRhID0gMDsg fSByZXR1cm4gcGRfZGF0YTsgfQogIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBwZF9kYXRhOyBwZF9k YXRhID0gMDsgcmV0dXJuIHRtcDsgfQoKICBmcmllbmQgY2xhc3MgX0NPUkJBX0NvbnN0clR5cGVf VmFyaWFibGVfT1VUX2FyZzxULCBUX3Zhcj47Cgpwcm90ZWN0ZWQ6CiAgVCogcGRfZGF0YTsKfTsK CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+CmNsYXNzIF9DT1JCQV9Db25zdHJU eXBlX1ZhcmlhYmxlX09VVF9hcmcgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlw ZV9WYXJpYWJsZV9PVVRfYXJnPFQsVF92YXI+IFRfb3V0OwogIGlubGluZSBfQ09SQkFfQ29uc3Ry VHlwZV9WYXJpYWJsZV9PVVRfYXJnKFQqJiBwKSA6IF9kYXRhKHApIHsgX2RhdGEgPSAwOyB9CiAg aW5saW5lIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmcoVF92YXImIHApIDogX2Rh dGEocC5wZF9kYXRhKSB7CiAgICBwID0gKFQqKTA7CiAgfQogIGlubGluZSBfQ09SQkFfQ29uc3Ry VHlwZV9WYXJpYWJsZV9PVVRfYXJnKGNvbnN0IFRfb3V0JiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9 CiAgaW5saW5lIFRfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF9vdXQmIHApIHsgX2RhdGEgPSBwLl9k YXRhOyByZXR1cm4gKnRoaXM7IH0KICBpbmxpbmUgVF9vdXQmIG9wZXJhdG9yPShUKiBwKSB7IF9k YXRhID0gcDsgcmV0dXJuICp0aGlzOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJu IF9kYXRhOyB9CiAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBU KiYgb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6 CiAgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfT1VUX2FyZygpOwogIFRfb3V0JiBvcGVyYXRv cj0oY29uc3QgVF92YXImKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+ CmNsYXNzIF9DT1JCQV9BcnJheV9PVVRfYXJnOwoKdGVtcGxhdGUgPGNsYXNzIFRfSGVscGVyLCBj bGFzcyBUPgpjbGFzcyBfQ09SQkFfQXJyYXlfVmFyIHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJB X0FycmF5X1ZhcjxUX0hlbHBlcixUPiBUX3ZhcjsKCiAgaW5saW5lIF9DT1JCQV9BcnJheV9WYXIg KCkgeyBwZF9kYXRhID0gMDsgfQogIGlubGluZSBfQ09SQkFfQXJyYXlfVmFyIChUKiBwKSB7IHBk X2RhdGEgPSBwOyB9CiAgaW5saW5lIF9DT1JCQV9BcnJheV9WYXIgKGNvbnN0IFRfdmFyJiBwKSB7 CiAgICBpZiggIXAucGRfZGF0YSApIHBkX2RhdGEgPSAwOwogICAgZWxzZSB7CiAgICAgIHBkX2Rh dGEgPSBUX0hlbHBlcjo6ZHVwKHAucGRfZGF0YSk7CiAgICAgIGlmKCAhcGRfZGF0YSApIF9DT1JC QV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgIH0KICB9CgogIGlubGluZSB+X0NPUkJB X0FycmF5X1ZhcigpIHsgaWYoIHBkX2RhdGEgKSBUX0hlbHBlcjo6ZnJlZShwZF9kYXRhKTsgfQoK ICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoVCogcCkgewogICAgaWYgKHBkX2RhdGEpIFRfSGVs cGVyOjpmcmVlKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9IHA7CiAgICByZXR1cm4gKnRoaXM7CiAg fQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCAm cCA9PSB0aGlzICkgcmV0dXJuICp0aGlzOwogICAgaWYoIHBkX2RhdGEgKSBUX0hlbHBlcjo6ZnJl ZShwZF9kYXRhKTsKCiAgICBpZiggcC5wZF9kYXRhICkgewogICAgICBwZF9kYXRhID0gVF9IZWxw ZXI6OmR1cChwLnBkX2RhdGEpOwogICAgICBpZiggIXBkX2RhdGEgKSBfQ09SQkFfbmV3X29wZXJh dG9yX3JldHVybl9udWxsKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcGRfZGF0YSA9IDA7CiAg ICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIFQmIG9wZXJhdG9yW10gKF9DT1JC QV9VTG9uZyBpbmRleCkgewogICAgcmV0dXJuICoocGRfZGF0YSArIGluZGV4KTsKICB9CiAgaW5s aW5lIGNvbnN0IFQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkgY29uc3QgewogICAg cmV0dXJuICooKGNvbnN0IFQqKSAocGRfZGF0YSArIGluZGV4KSk7CiAgfQogIGlubGluZSBvcGVy YXRvciBUKiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CgoKCgoKCiAgY29uc3QgVCogaW4o KSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgVCogaW5vdXQoKSB7IHJldHVybiBwZF9kYXRh OyB9CiAgVComIG91dCgpIHsKICAgIGlmIChwZF9kYXRhKSB7CiAgICAgIFRfSGVscGVyOjpmcmVl KHBkX2RhdGEpOwogICAgICBwZF9kYXRhID0gMDsKICAgIH0KICAgIHJldHVybiBwZF9kYXRhOwog IH0KICBUKiBfcmV0bigpIHsgVCogdG1wID0gcGRfZGF0YTsgcGRfZGF0YSA9IDA7IHJldHVybiB0 bXA7IH0KCiAgZnJpZW5kIGNsYXNzIF9DT1JCQV9BcnJheV9PVVRfYXJnPFQsIFRfdmFyPjsKCnBy aXZhdGU6CiAgVCogcGRfZGF0YTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92 YXI+CmNsYXNzIF9DT1JCQV9BcnJheV9PVVRfYXJnIHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJB X0FycmF5X09VVF9hcmc8VCxUX3Zhcj4gVF9vdXQ7CiAgaW5saW5lIF9DT1JCQV9BcnJheV9PVVRf YXJnKFQqJiBwKSA6IF9kYXRhKHApIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIF9DT1JCQV9BcnJh eV9PVVRfYXJnKFRfdmFyJiBwKSA6IF9kYXRhKHAucGRfZGF0YSkgewogICAgcCA9IChUKikwOwog IH0KICBpbmxpbmUgX0NPUkJBX0FycmF5X09VVF9hcmcoY29uc3QgVF9vdXQmIHApIDogX2RhdGEo cC5fZGF0YSkge30KICBpbmxpbmUgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX291dCYgcCkgeyBf ZGF0YSA9IHAuX2RhdGE7IHJldHVybiAqdGhpczsgfQogIGlubGluZSBUX291dCYgb3BlcmF0b3I9 KFQqIHApIHsgX2RhdGEgPSBwOyByZXR1cm4gKnRoaXM7IH0KICBpbmxpbmUgb3BlcmF0b3IgVCom KCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9 CiAgaW5saW5lIFQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkgewogICAgcmV0dXJu IF9kYXRhW2luZGV4XTsKICB9CgogIFQqJiBfZGF0YTsKcHJpdmF0ZToKICBfQ09SQkFfQXJyYXlf T1VUX2FyZygpOwogIFRfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsKCgoKCgp0ZW1w bGF0ZSA8Y2xhc3MgVF9IZWxwZXIsY2xhc3MgVD4KY2xhc3MgX0NPUkJBX0FycmF5X0ZvcmFueSB7 CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJBX0FycmF5X0ZvcmFueSAoKSB7IHBkX2RhdGEgPSAwOyBw ZF9ub2NvcHkgPSAwOyB9CgoKCgoKICBpbmxpbmUgX0NPUkJBX0FycmF5X0ZvcmFueSAoVCogcCxf Q09SQkFfQm9vbGVhbiBub2NvcHkgPSAwKSB7CiAgICBwZF9kYXRhID0gcDsgcGRfbm9jb3B5ID0g bm9jb3B5OwogIH0KCiAgaW5saW5lIF9DT1JCQV9BcnJheV9Gb3JhbnkgKGNvbnN0IF9DT1JCQV9B cnJheV9Gb3Jhbnk8VF9IZWxwZXIsVD4mIHApIHsKICAgIHBkX2RhdGEgPSBwLnBkX2RhdGE7IHBk X25vY29weSA9IDA7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9BcnJheV9Gb3JhbnkoKSB7CgogIH0K CiAgaW5saW5lIF9DT1JCQV9BcnJheV9Gb3Jhbnk8VF9IZWxwZXIsVD4mIG9wZXJhdG9yPSAoVCog cCkgewogICAgcGRfZGF0YSA9IHA7IHBkX25vY29weSA9IDA7IHJldHVybiAqdGhpczsKICB9Cgog IGlubGluZSBUJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIHsgcmV0dXJuICoocGRf ZGF0YSArIGluZGV4KTsgfQogIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcltdIChfQ09SQkFfVUxv bmcgaW5kZXgpIGNvbnN0IHsKICAgIHJldHVybiAqKCAoY29uc3QgVCopIChwZF9kYXRhICsgaW5k ZXgpKTsKICB9CgogIGlubGluZSBvcGVyYXRvciBUKiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRh OyB9CiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQqICgpIGNvbnN0IHsgcmV0dXJuIChjb25zdCBU KilwZF9kYXRhOyB9CgogIGlubGluZSBUKiBOUF9nZXRTbGljZSgpIGNvbnN0IHsgcmV0dXJuIHBk X2RhdGE7IH0KICBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gTlBfbm9jb3B5KCkgY29uc3QgeyByZXR1 cm4gcGRfbm9jb3B5OyB9Cgpwcml2YXRlOgogIFQqIHBkX2RhdGE7CiAgX0NPUkJBX0Jvb2xlYW4g cGRfbm9jb3B5Owp9OwojIDI1NyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5o IiAyCiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9zdHJpbmd0eXBlcy5oIiAxCiMg NjcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvc3RyaW5ndHlwZXMuaCIKY2xhc3MgX0NP UkJBX1N0cmluZ19tZW1iZXI7CmNsYXNzIF9DT1JCQV9TdHJpbmdfZWxlbWVudDsKY2xhc3MgX0NP UkJBX1N0cmluZ19pbm91dDsKY2xhc3MgX0NPUkJBX1N0cmluZ19vdXQ7CgoKCgoKY2xhc3MgX0NP UkJBX1N0cmluZ192YXIgewpwdWJsaWM6CgoKCgoKICB0eXBlZGVmIGNoYXIqIHB0cl90OwoKICBz dGF0aWMgaW5saW5lIGNoYXIqIHN0cmluZ19kdXAoY29uc3QgY2hhciogcCkgewogICAgY2hhciog ciA9IG9tbmk6OmFsbG9jU3RyaW5nKHN0cmxlbihwKSk7CiAgICBzdHJjcHkociwgcCk7CiAgICBy ZXR1cm4gcjsKICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3ZhcigpIHsgX2RhdGEgPSAwOyB9 CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfdmFyKGNoYXIgKnApIHsgX2RhdGEgPSBwOyB9CgogIGlu bGluZSBfQ09SQkFfU3RyaW5nX3Zhcihjb25zdCBjaGFyKiBwKSB7CiAgICBpZiggcCApIF9kYXRh ID0gc3RyaW5nX2R1cChwKTsKICAgIGVsc2UgX2RhdGEgPSAwOwogIH0KCiAgaW5saW5lIF9DT1JC QV9TdHJpbmdfdmFyKGNvbnN0IF9DT1JCQV9TdHJpbmdfdmFyJiBzKSB7CiAgICBpZiggKGNvbnN0 IGNoYXIgKilzICkgX2RhdGEgPSBzdHJpbmdfZHVwKHMpOwogICAgZWxzZSBfZGF0YSA9IDA7CiAg fQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXIoY29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXIm IHMpOwoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXIoY29uc3QgX0NPUkJBX1N0cmluZ19lbGVt ZW50JiBzKTsKCiAgaW5saW5lIH5fQ09SQkFfU3RyaW5nX3ZhcigpIHsKICAgIG9tbmk6OmZyZWVT dHJpbmcoX2RhdGEpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfdmFyJiBvcGVyYXRvcj0o Y2hhciogcCkgewogICAgb21uaTo6ZnJlZVN0cmluZyhfZGF0YSk7CiAgICBfZGF0YSA9IHA7CiAg ICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXImIG9wZXJhdG9y PShjb25zdCBjaGFyKiBwKSB7CiAgICBvbW5pOjpmcmVlU3RyaW5nKF9kYXRhKTsKICAgIF9kYXRh ID0gMDsKICAgIGlmIChwKSBfZGF0YSA9IHN0cmluZ19kdXAocCk7CiAgICByZXR1cm4gKnRoaXM7 CiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXImIG9wZXJhdG9yPShjb25zdCBfQ09SQkFf U3RyaW5nX3ZhciYgcykgewogICAgaWYgKCZzICE9IHRoaXMpIHsKICAgICAgb21uaTo6ZnJlZVN0 cmluZyhfZGF0YSk7CiAgICAgIF9kYXRhID0gMDsKICAgICAgaWYoIChjb25zdCBjaGFyKilzICkg X2RhdGEgPSBzdHJpbmdfZHVwKHMpOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5s aW5lIF9DT1JCQV9TdHJpbmdfdmFyJiBvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ19tZW1i ZXImIHMpOwoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXImIG9wZXJhdG9yPShjb25zdCBfQ09S QkFfU3RyaW5nX2VsZW1lbnQmIHMpOwoKCiAgaW5saW5lIG9wZXJhdG9yIGNoYXIqICgpIHsgcmV0 dXJuIF9kYXRhOyB9CiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqICgpIGNvbnN0IHsgcmV0 dXJuIF9kYXRhOyB9CgoKCgogIGlubGluZSBjaGFyJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcg aW5kZXgpIHsKICAgIGlmICghX2RhdGEgfHwgKF9DT1JCQV9VTG9uZylzdHJsZW4oX2RhdGEpIDwg aW5kZXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICB9CiAgICByZXR1 cm4gX2RhdGFbaW5kZXhdOwogIH0KCiAgaW5saW5lIGNoYXIgb3BlcmF0b3JbXSAoX0NPUkJBX1VM b25nIGluZGV4KSBjb25zdCB7CiAgICBpZiAoIV9kYXRhIHx8IChfQ09SQkFfVUxvbmcpc3RybGVu KF9kYXRhKSA8IGluZGV4KSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwogICAg fQogICAgcmV0dXJuIF9kYXRhW2luZGV4XTsKICB9CgogIGlubGluZSBjb25zdCBjaGFyKiBpbigp IGNvbnN0IHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIGNoYXIqJiBpbm91dCgpIHsgcmV0dXJu IF9kYXRhOyB9CiAgaW5saW5lIGNoYXIqJiBvdXQoKSB7CiAgICBpZiggX2RhdGEgKXsKICAgICAg b21uaTo6ZnJlZVN0cmluZyhfZGF0YSk7CiAgICAgIF9kYXRhID0gMDsKICAgIH0KICAgIHJldHVy biBfZGF0YTsKICB9CiAgaW5saW5lIGNoYXIqIF9yZXRuKCkgewogICAgY2hhciogdG1wID0gX2Rh dGE7CiAgICBfZGF0YSA9IDA7CiAgICByZXR1cm4gdG1wOwogIH0KCiAgZnJpZW5kIGNsYXNzIF9D T1JCQV9TdHJpbmdfaW5vdXQ7CiAgZnJpZW5kIGNsYXNzIF9DT1JCQV9TdHJpbmdfb3V0OwoKcHJp dmF0ZToKICBjaGFyKiBfZGF0YTsKfTsKCgoKCgpjbGFzcyBfQ09SQkFfU3RyaW5nX21lbWJlciB7 CnB1YmxpYzoKICB0eXBlZGVmIGNoYXIqIHB0cl90OwoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19t ZW1iZXIoKQogICAgOiBfcHRyKChjaGFyKikgb21uaTo6ZW1wdHlfc3RyaW5nKSB7fQoKICBpbmxp bmUgX0NPUkJBX1N0cmluZ19tZW1iZXIoY29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImIHMpCiAg ICAgICAgICAgOiBfcHRyKChjaGFyKilvbW5pOjplbXB0eV9zdHJpbmcpIHsKICAgIGlmIChzLl9w dHIgJiYgcy5fcHRyICE9IG9tbmk6OmVtcHR5X3N0cmluZykKICAgICAgX3B0ciA9IF9DT1JCQV9T dHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMuX3B0cik7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9TdHJp bmdfbWVtYmVyKCkgewogICAgb21uaTo6ZnJlZVN0cmluZyhfcHRyKTsKICB9CgogIGlubGluZSBf Q09SQkFfU3RyaW5nX21lbWJlciYgb3BlcmF0b3I9KGNoYXIqIHMpIHsKICAgIG9tbmk6OmZyZWVT dHJpbmcoX3B0cik7CiAgICBfcHRyID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGlu ZSBfQ09SQkFfU3RyaW5nX21lbWJlciYgb3BlcmF0b3I9IChjb25zdCBjaGFyKiBzKSB7CiAgICBv bW5pOjpmcmVlU3RyaW5nKF9wdHIpOwogICAgaWYgKHMpCiAgICAgIF9wdHIgPSBfQ09SQkFfU3Ry aW5nX3Zhcjo6c3RyaW5nX2R1cChzKTsKICAgIGVsc2UKICAgICAgX3B0ciA9IDA7CiAgICByZXR1 cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19tZW1iZXImIG9wZXJhdG9yPShj b25zdCBfQ09SQkFfU3RyaW5nX21lbWJlciYgcykgewogICAgaWYgKCZzICE9IHRoaXMpIHsKICAg ICAgb21uaTo6ZnJlZVN0cmluZyhfcHRyKTsKICAgICAgaWYgKHMuX3B0ciAmJiBzLl9wdHIgIT0g b21uaTo6ZW1wdHlfc3RyaW5nKQogICAgICAgIF9wdHIgPSBfQ09SQkFfU3RyaW5nX3Zhcjo6c3Ry aW5nX2R1cChzLl9wdHIpOwogICAgICBlbHNlCiAgICAgICAgX3B0ciA9IHMuX3B0cjsKICAgIH0K ICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX21lbWJlciYgb3Bl cmF0b3I9KGNvbnN0IF9DT1JCQV9TdHJpbmdfdmFyJiBzKSB7CiAgICBvbW5pOjpmcmVlU3RyaW5n KF9wdHIpOwogICAgaWYoIChjb25zdCBjaGFyKilzICkgewogICAgICBfcHRyID0gX0NPUkJBX1N0 cmluZ192YXI6OnN0cmluZ19kdXAoKGNvbnN0IGNoYXIqKXMpOwogICAgfQogICAgZWxzZSB7CiAg ICAgIF9wdHIgPSAoY2hhciopIDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxp bmUgX0NPUkJBX1N0cmluZ19tZW1iZXImIG9wZXJhdG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX2Vs ZW1lbnQmIHMpOwoKICBpbmxpbmUgY2hhciYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4 KSB7CiAgICBpZiAoIV9wdHIgfHwgKF9DT1JCQV9VTG9uZylzdHJsZW4oX3B0cikgPCBpbmRleCkg ewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIH0KICAgIHJldHVybiBfcHRy W2luZGV4XTsKICB9CgogIGlubGluZSBjaGFyIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRl eCkgY29uc3QgewogICAgaWYgKCFfcHRyIHx8IChfQ09SQkFfVUxvbmcpc3RybGVuKF9wdHIpIDwg aW5kZXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICB9CiAgICByZXR1 cm4gX3B0cltpbmRleF07CiAgfQoKCiAgaW5saW5lIG9wZXJhdG9yIGNoYXIqICgpIHsgcmV0dXJu IF9wdHI7IH0KICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgY2hhciogKCkgY29uc3QgeyByZXR1cm4g X3B0cjsgfQoKCgoKICBpbmxpbmUgY29uc3QgY2hhciogaW4oKSBjb25zdCB7IHJldHVybiBfcHRy OyB9CiAgaW5saW5lIGNoYXIqJiBpbm91dCgpIHsgcmV0dXJuIF9wdHI7IH0KICBpbmxpbmUgY2hh ciomIG91dCgpIHsKICAgIG9tbmk6OmZyZWVTdHJpbmcoX3B0cik7CiAgICBfcHRyID0gMDsKICAg IHJldHVybiBfcHRyOwogIH0KCiAgaW5saW5lIGNoYXIqIF9yZXRuKCkgewogICAgY2hhciAqdG1w OwogICAgdG1wID0gX3B0cjsKICAgIF9wdHIgPSAwOwogICAgcmV0dXJuIHRtcDsKICB9CgogIHZv aWQgb3BlcmF0b3IgPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgdm9pZCBvcGVy YXRvciA8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKICB2b2lkIG9wZXJhdG9yID4+PSAoTWVt QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3IgPDw9IChNZW1CdWZmZXJl ZFN0cmVhbSYgcyk7CiAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNl dCkgY29uc3Q7CgogIGlubGluZSBjaGFyKiYgX05QX3JlZigpIHtyZXR1cm4gX3B0cjt9CgogIGNo YXIqIF9wdHI7Cgp9OwoKCgoKCmNsYXNzIF9DT1JCQV9TdHJpbmdfZWxlbWVudCB7CgpwdWJsaWM6 CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX2VsZW1lbnQoY2hhciomIHAsIF9DT1JCQV9Cb29sZWFu IHJlbCkKICAgIDogcGRfcmVsKHJlbCksIHBkX2RhdGEocCkge30KCiAgaW5saW5lIF9DT1JCQV9T dHJpbmdfZWxlbWVudChjb25zdCBfQ09SQkFfU3RyaW5nX2VsZW1lbnQmIHMpCiAgOiBwZF9yZWwo cy5wZF9yZWwpLCBwZF9kYXRhKHMucGRfZGF0YSkge30KCiAgaW5saW5lIH5fQ09SQkFfU3RyaW5n X2VsZW1lbnQoKSB7CgogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgb3BlcmF0 b3I9KGNoYXIqIHMpIHsKICAgIGlmIChwZF9yZWwpCiAgICAgIG9tbmk6OmZyZWVTdHJpbmcocGRf ZGF0YSk7CiAgICBwZF9kYXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBf Q09SQkFfU3RyaW5nX2VsZW1lbnQmIG9wZXJhdG9yPSAoY29uc3QgY2hhciogcykgewogICAgaWYg KHBkX3JlbCkgewogICAgICBvbW5pOjpmcmVlU3RyaW5nKHBkX2RhdGEpOwogICAgICBpZiAocykK ICAgICAgICBwZF9kYXRhID0gX0NPUkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocyk7CiAgICAg IGVsc2UKICAgICAgICBwZF9kYXRhID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHBkX2RhdGEgPSAo Y2hhciopczsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBfQ09SQkFfU3Ry aW5nX2VsZW1lbnQmIG9wZXJhdG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX2VsZW1lbnQmIHMpIHsK ICAgIGlmICgmcyAhPSB0aGlzKSB7CiAgICAgIGlmIChwZF9yZWwpIHsKICAgICAgICBvbW5pOjpm cmVlU3RyaW5nKHBkX2RhdGEpOwogICAgICAgIGlmIChzLnBkX2RhdGEgJiYgcy5wZF9kYXRhICE9 IG9tbmk6OmVtcHR5X3N0cmluZykKICAgICAgICAgIHBkX2RhdGEgPSBfQ09SQkFfU3RyaW5nX3Zh cjo6c3RyaW5nX2R1cChzLnBkX2RhdGEpOwogICAgICAgIGVsc2UKICAgICAgICAgIHBkX2RhdGEg PSAoY2hhciopcy5wZF9kYXRhOwogICAgICB9IGVsc2UKICAgICAgICBwZF9kYXRhID0gKGNoYXIq KXMucGRfZGF0YTsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBfQ09SQkFf U3RyaW5nX2VsZW1lbnQmIG9wZXJhdG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX3ZhciYgcykgewog ICAgaWYgKHBkX3JlbCkgewogICAgICBvbW5pOjpmcmVlU3RyaW5nKHBkX2RhdGEpOwogICAgICBp ZiggKGNvbnN0IGNoYXIqKXMgKQogICAgICAgIHBkX2RhdGEgPSBfQ09SQkFfU3RyaW5nX3Zhcjo6 c3RyaW5nX2R1cCgoY29uc3QgY2hhciopcyk7CiAgICAgIGVsc2UKICAgICAgICBwZF9kYXRhID0g MDsKICAgIH0gZWxzZQogICAgICBwZF9kYXRhID0gKGNoYXIqKShjb25zdCBjaGFyKilzOwogICAg cmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgb3BlcmF0 b3I9KGNvbnN0IF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBzKSB7CiAgICBpZiAocGRfcmVsKSB7CiAg ICAgIG9tbmk6OmZyZWVTdHJpbmcocGRfZGF0YSk7CiAgICAgIGlmKCAoY29uc3QgY2hhciopcyAm JiAoY29uc3QgY2hhciopIHMgIT0gb21uaTo6ZW1wdHlfc3RyaW5nKQogICAgICAgIHBkX2RhdGEg PSBfQ09SQkFfU3RyaW5nX3Zhcjo6c3RyaW5nX2R1cCgoY29uc3QgY2hhciopcyk7CiAgICAgIGVs c2UKICAgICAgICBwZF9kYXRhID0gKGNoYXIqKShjb25zdCBjaGFyKilzOwogICAgfSBlbHNlCiAg ICAgIHBkX2RhdGEgPSAoY2hhciopKGNvbnN0IGNoYXIqKXM7CiAgICByZXR1cm4gKnRoaXM7CiAg fQoKICBpbmxpbmUgY2hhciYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSB7CiAgICBp ZiAoISgoY2hhciopcGRfZGF0YSkgfHwgKF9DT1JCQV9VTG9uZylzdHJsZW4ocGRfZGF0YSkgPCBp bmRleCkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIH0KICAgIHJldHVy biBwZF9kYXRhW2luZGV4XTsKICB9CgogIGlubGluZSBjaGFyIG9wZXJhdG9yW10gKF9DT1JCQV9V TG9uZyBpbmRleCkgY29uc3QgewogICAgaWYgKCEoKGNoYXIqKXBkX2RhdGEpIHx8IChfQ09SQkFf VUxvbmcpc3RybGVuKHBkX2RhdGEpIDwgaW5kZXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNr X2Vycm9yKCk7CiAgICB9CiAgICByZXR1cm4gcGRfZGF0YVtpbmRleF07CiAgfQoKCiAgaW5saW5l IG9wZXJhdG9yIGNoYXIqICgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgb3BlcmF0b3Ig Y29uc3QgY2hhciogKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQoKCgoKICBpbmxpbmUgY29u c3QgY2hhciogaW4oKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5lIGNoYXIqJiBp bm91dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgY2hhciomIG91dCgpIHsKICAgIGlm IChwZF9yZWwpIHsKICAgICAgb21uaTo6ZnJlZVN0cmluZyhwZF9kYXRhKTsKICAgICAgcGRfZGF0 YSA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcGRfZGF0YSA9IDA7CiAgICB9CiAgICByZXR1 cm4gcGRfZGF0YTsKICB9CiAgaW5saW5lIGNoYXIqIF9yZXRuKCkgewogICAgY2hhciAqdG1wOwog ICAgaWYgKHBkX3JlbCkgewogICAgICB0bXAgPSBwZF9kYXRhOwogICAgICBwZF9kYXRhID0gMDsK ICAgIH0KICAgIGVsc2UgewogICAgICB0bXAgPSAoKChjaGFyKilwZF9kYXRhKSA/IF9DT1JCQV9T dHJpbmdfdmFyOjpzdHJpbmdfZHVwKHBkX2RhdGEpIDogMCk7CiAgICAgIHBkX2RhdGEgPSAwOwog ICAgfQogICAgcmV0dXJuIHRtcDsKICB9CgoKICBpbmxpbmUgY2hhciomIF9OUF9yZWYoKSBjb25z dCB7cmV0dXJuIHBkX2RhdGE7fQogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBfTlBfcmVsZWFzZSgp IGNvbnN0IHtyZXR1cm4gcGRfcmVsO30KCiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIGNoYXIq JiBwZF9kYXRhOwp9OwojIDQyNiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9zdHJpbmd0 eXBlcy5oIgppbmxpbmUgX0NPUkJBX1N0cmluZ192YXI6Ol9DT1JCQV9TdHJpbmdfdmFyKGNvbnN0 IF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBzKQp7CiAgaWYgKChjb25zdCBjaGFyKilzKSB7CiAgICBf ZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIH0KICBlbHNlCiAgICBf ZGF0YSA9IDA7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3Zhcjo6X0NPUkJBX1N0cmluZ192YXIo Y29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKQp7CiAgaWYgKChjb25zdCBjaGFyKilzKSB7 CiAgICBfZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIH0KICBlbHNl CiAgICBfZGF0YSA9IDA7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYKX0NPUkJBX1N0cmlu Z192YXI6Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImIHMpCnsKICBvbW5p OjpmcmVlU3RyaW5nKF9kYXRhKTsKICBpZiAoKGNvbnN0IGNoYXIqKXMpCiAgICBfZGF0YSA9IF9D T1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIGVsc2UKICAgIF9kYXRhID0gMDsKICBy ZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYKX0NPUkJBX1N0cmluZ192 YXI6Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKQp7CiAgb21uaTo6 ZnJlZVN0cmluZyhfZGF0YSk7CiAgaWYgKChjb25zdCBjaGFyKilzKQogICAgX2RhdGEgPSBfQ09S QkFfU3RyaW5nX3Zhcjo6c3RyaW5nX2R1cChzKTsKICBlbHNlCiAgICBfZGF0YSA9IDA7CiAgcmV0 dXJuICp0aGlzOwp9CgppbmxpbmUgX0NPUkJBX1N0cmluZ19tZW1iZXImCl9DT1JCQV9TdHJpbmdf bWVtYmVyOjpvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKSB7CiAgb21u aTo6ZnJlZVN0cmluZyhfcHRyKTsKICBpZiggKGNvbnN0IGNoYXIqKXMgKQogICAgX3B0ciA9IF9D T1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKChjb25zdCBjaGFyKilzKTsKICBlbHNlCiAgICBf cHRyID0gMDsKICByZXR1cm4gKnRoaXM7Cn0KCgoKCgoKY2xhc3MgX0NPUkJBX1N0cmluZ19pbm91 dCB7CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19pbm91dChjaGFyKiYgcCkgOiBfZGF0 YShwKSB7fQogIGlubGluZSBfQ09SQkFfU3RyaW5nX2lub3V0KF9DT1JCQV9TdHJpbmdfdmFyJiBw KSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfaW5vdXQoX0NPUkJB X1N0cmluZ19tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7fQogIGlubGluZSBfQ09SQkFfU3Ry aW5nX2lub3V0KF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgcCkgOiBfZGF0YShwLl9OUF9yZWYoKSkg ewoKCgoKCgogICAgaWYgKCFwLl9OUF9yZWxlYXNlKCkgJiYgKHAuX05QX3JlZigpKSkgewogICAg ICBwLl9OUF9yZWYoKSA9ICgocC5fTlBfcmVmKCkpID8KICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocC5fTlBfcmVmKCkpIDogMCk7CiAgICB9CiAgfQog IGlubGluZSB+X0NPUkJBX1N0cmluZ19pbm91dCgpIHt9CgogIGlubGluZSBvcGVyYXRvciBjaGFy KiYoKSB7IHJldHVybiBfZGF0YTsgfQoKICBjaGFyKiYgX2RhdGE7Cgpwcml2YXRlOgogIF9DT1JC QV9TdHJpbmdfaW5vdXQoKTsKfTsKCgoKCgpjbGFzcyBfQ09SQkFfU3RyaW5nX291dCB7CnB1Ymxp YzoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQoY2hhciomIHApIDogX2RhdGEocCkgeyBfZGF0 YSA9IDA7IH0KICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQoX0NPUkJBX1N0cmluZ192YXImIHAp IDogX2RhdGEocC5fZGF0YSkgeyBwID0gKGNoYXIqKTA7IH0KICBpbmxpbmUgX0NPUkJBX1N0cmlu Z19vdXQoX0NPUkJBX1N0cmluZ19tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7IHAgPSAoY2hh ciopMDsgfQogIGlubGluZSBfQ09SQkFfU3RyaW5nX291dChfQ09SQkFfU3RyaW5nX2VsZW1lbnQm IHApIDogX2RhdGEocC5fTlBfcmVmKCkpIHsgcCA9IChjaGFyKikwOyB9CiAgaW5saW5lIH5fQ09S QkFfU3RyaW5nX291dCgpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfb3V0KGNvbnN0IF9DT1JC QV9TdHJpbmdfb3V0JiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJp bmdfb3V0JiBvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ19vdXQmIHApIHsKICAgIF9kYXRh ID0gcC5fZGF0YTsgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQm IG9wZXJhdG9yPShjaGFyKiBwKSB7CiAgICBfZGF0YSA9IHA7IHJldHVybiAqdGhpczsKICB9CiAg aW5saW5lIF9DT1JCQV9TdHJpbmdfb3V0JiBvcGVyYXRvcj0oY29uc3QgY2hhciogcCkgewogICAg X2RhdGEgPSAoKHApID8gX0NPUkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocCkgOiAwKTsgcmV0 dXJuICp0aGlzOwogIH0KCiAgb3BlcmF0b3IgY2hhciomICgpIHsgcmV0dXJuIF9kYXRhOyB9CiAg Y2hhciomIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CgogIGNoYXIqJiBfZGF0YTsKCnByaXZhdGU6 CiAgX0NPUkJBX1N0cmluZ19vdXQoKTsKICBfQ09SQkFfU3RyaW5nX291dCYgb3BlcmF0b3I9KGNv bnN0IF9DT1JCQV9TdHJpbmdfdmFyJiApOwogIF9DT1JCQV9TdHJpbmdfb3V0JiBvcGVyYXRvcj0o Y29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImICk7CiAgX0NPUkJBX1N0cmluZ19vdXQmIG9wZXJh dG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX2VsZW1lbnQmICk7Cn07CgoKCgoKY2xhc3MgX0NPUkJB X1NlcXVlbmNlX19TdHJpbmcKewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU3RyaW5nX2VsZW1l bnQgRWxlbVQ7CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyBTZXFUOwoKICBpbmxp bmUgX0NPUkJBX1VMb25nIG1heGltdW0oKSBjb25zdCB7IHJldHVybiBwZF9tYXg7IH0KICBpbmxp bmUgX0NPUkJBX1VMb25nIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHBkX2xlbjsgfQogIGlubGlu ZSB2b2lkIGxlbmd0aChfQ09SQkFfVUxvbmcgbGVuKSB7CiAgICBpZiAocGRfYm91bmRlZCAmJiBs ZW4gPiBwZF9tYXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQoK CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gbGVuOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICBv cGVyYXRvcltdKGkpID0gKGNoYXIqKSBvbW5pOjplbXB0eV9zdHJpbmc7CgogICAgaWYgKGxlbikg ewoKCiAgICAgIGlmICghcGRfZGF0YSB8fCBsZW4gPiBwZF9tYXgpIHsKICAgICAgICBjb3B5YnVm ZmVyKCgobGVuID4gcGRfbWF4KSA/IGxlbiA6IHBkX21heCkpOwogICAgICB9CiAgICB9CiAgICBw ZF9sZW4gPSBsZW47CiAgfQoKICBpbmxpbmUgRWxlbVQgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25n IGkpIHsKICAgIGlmKCBpID49IHBkX2xlbiApIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwog ICAgcmV0dXJuIEVsZW1UKHBkX2RhdGFbaV0scGRfcmVsKTsKICB9CiAgaW5saW5lIGNvbnN0IEVs ZW1UIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpKSBjb25zdCB7CiAgICBpZiggaSA+PSBwZF9s ZW4gKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBFbGVtVChwZF9kYXRh W2ldLHBkX3JlbCk7CiAgfQoKICBzdGF0aWMgaW5saW5lIGNoYXIqKiBhbGxvY2J1ZihfQ09SQkFf VUxvbmcgbmVsZW1zKSB7CiAgICBpZiAoIW5lbGVtcykgcmV0dXJuIDA7CiAgICBjaGFyKiogYiA9 IG5ldyBjaGFyKltuZWxlbXMrMl07CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBsID0gbmVsZW1zOwog ICAgYlswXSA9IChjaGFyKikgKChvbW5pOjpwdHJfYXJpdGhfdCkgMHg1MzUxNTM1NFUpOwogICAg YlsxXSA9IChjaGFyKikgbDsKICAgIGZvciAoX0NPUkJBX1VMb25nIGluZGV4ID0gMjsgaW5kZXgg PCAobmVsZW1zKzIpOyBpbmRleCsrKQogICAgICBiW2luZGV4XSA9IChjaGFyKilvbW5pOjplbXB0 eV9zdHJpbmc7CiAgICByZXR1cm4gYisyOwogIH0KCiAgc3RhdGljIGlubGluZSB2b2lkIGZyZWVi dWYoY2hhcioqIGJ1ZikgewogICAgaWYgKCFidWYpIHJldHVybjsKICAgIGNoYXIqKiBiID0gYnVm LTI7CiAgICBpZiAoKG9tbmk6OnB0cl9hcml0aF90KWJbMF0gIT0gKChvbW5pOjpwdHJfYXJpdGhf dCkgMHg1MzUxNTM1NFUpKSB7CiAgICAgIF9DT1JCQV9iYWRfcGFyYW1fZnJlZWJ1ZigpOwogICAg ICByZXR1cm47CiAgICB9CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBsID0gKG9tbmk6OnB0cl9hcml0 aF90KSBiWzFdOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaSA9IDA7IGkgPCAoX0NPUkJBX1VMb25n KSBsOyBpKyspIHsKICAgICAgb21uaTo6ZnJlZVN0cmluZyhidWZbaV0pOwogICAgfQogICAgYlsw XSA9IChjaGFyKikgMDsKICAgIGRlbGV0ZSBbXSBiOwogIH0KCgoKICBpbmxpbmUgX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3JlbDsgfQoKICBpbmxpbmUgY2hhcioq IGdldF9idWZmZXIoX0NPUkJBX0Jvb2xlYW4gb3JwaGFuID0gMCkgewogICAgaWYgKHBkX21heCAm JiAhcGRfZGF0YSkgewogICAgICBjb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAgICBpZiAoIW9y cGhhbikgewogICAgICByZXR1cm4gcGRfZGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAo IXBkX3JlbCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSB7CiAgICAgICAgY2hhcioqIHRt cCA9IHBkX2RhdGE7CiAgICAgICAgcGRfZGF0YSA9IDA7CiAgICAgICAgaWYgKCFwZF9ib3VuZGVk KSB7CiAgICAgICAgICBwZF9tYXggPSAwOwogICAgICAgIH0KICAgICAgICBwZF9sZW4gPSAwOwog ICAgICAgIHBkX3JlbCA9IDE7CiAgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQogICAgfQogIH0K CiAgaW5saW5lIGNvbnN0IGNoYXIqIGNvbnN0KiBnZXRfYnVmZmVyKCkgY29uc3QgewogICAgaWYg KHBkX21heCAmJiAhcGRfZGF0YSkgewoKICAgICAgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcqIHMg PSBjb25zdF9jYXN0PF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKj4odGhpcyk7CgoKCiAgICAgIHMt PmNvcHlidWZmZXIocGRfbWF4KTsKICAgIH0KCiAgICByZXR1cm4gcGRfZGF0YTsKCgoKICB9CgoK ICBpbmxpbmUgfl9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKCkgewogICAgaWYgKHBkX3JlbCAmJiBw ZF9kYXRhKSBmcmVlYnVmKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9IDA7CiAgfQoKCiAgc2l6ZV90 IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgdm9pZCBvcGVy YXRvciA+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yIDw8 PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpOwogIHZvaWQgb3BlcmF0b3IgPj49IChNZW1CdWZmZXJl ZFN0cmVhbSYgcykgY29uc3Q7CiAgdm9pZCBvcGVyYXRvciA8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKTsKCnByb3RlY3RlZDoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcoKQogICAg OiBwZF9tYXgoMCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLCBwZF9ib3VuZGVkKDApLCBwZF9kYXRh KDApIHt9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhfQ09SQkFfVUxvbmcgbWF4 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBib3VuZGVk PTApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4oMCksIHBkX3JlbCgxKSwgcGRfYm91bmRlZChi b3VuZGVkKSwgcGRfZGF0YSgwKSB7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX19TdHJp bmcoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX1VMb25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHZh bHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxl YXNlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4g Ym91bmRlZCA9IDApCiAgICAgOiBwZF9tYXgobWF4KSwgcGRfbGVuKGxlbiksIHBkX3JlbChyZWxl YXNlKSwKICAgICAgIHBkX2JvdW5kZWQoYm91bmRlZCksIHBkX2RhdGEodmFsdWUpIHsKICAgIGlm IChsZW4gPiBtYXggfHwgKGxlbiAmJiAhdmFsdWUpKSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVj a19lcnJvcigpOwoKICAgIH0KICB9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhj b25zdCBTZXFUJiBzKQogICAgOiBwZF9tYXgocy5wZF9tYXgpLCBwZF9sZW4oMCksIHBkX3JlbCgx KSwKICAgICAgcGRfYm91bmRlZChzLnBkX2JvdW5kZWQpLCBwZF9kYXRhKDApIHsKICAgIGxlbmd0 aChzLnBkX2xlbik7CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gMDsgaSA8IHBkX2xlbjsgaSsr ICkKICAgICAgb3BlcmF0b3JbXShpKSA9IHNbaV07CiAgfQoKICBpbmxpbmUgU2VxVCYgb3BlcmF0 b3IgPSAoY29uc3QgU2VxVCYgcykgewogICAgbGVuZ3RoKHMucGRfbGVuKTsKICAgIGZvciggX0NP UkJBX1VMb25nIGkgPSAwOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICBvcGVyYXRvcltdKGkpID0g c1tpXTsKICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9DT1JC QV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIGNoYXIqKiBkYXRhLAogICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIGlmIChsZW4gPiBtYXgg fHwgKGxlbiAmJiAhZGF0YSkpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7Cgog ICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9kYXRhKSB7CiAgICAgIGZyZWVidWYocGRfZGF0YSk7 CiAgICB9CiAgICBwZF9tYXggPSBtYXg7CiAgICBwZF9sZW4gPSBsZW47CiAgICBwZF9kYXRhID0g ZGF0YTsKICAgIHBkX3JlbCA9IHJlbGVhc2U7CiAgfQoKCnByaXZhdGU6CgogIHZvaWQgY29weWJ1 ZmZlcihfQ09SQkFfVUxvbmcgbmV3bWF4KSB7CgoKCiAgICBjaGFyKiogbmV3ZGF0YSA9IGFsbG9j YnVmKG5ld21heCk7CiAgICBpZiAoIW5ld2RhdGEpIHsKICAgICAgX0NPUkJBX25ld19vcGVyYXRv cl9yZXR1cm5fbnVsbCgpOwoKICAgIH0KICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBw ZF9sZW47IGkrKykgewogICAgICBpZiAocGRfcmVsKSB7CiAgICAgICAgbmV3ZGF0YVtpXSA9IHBk X2RhdGFbaV07CiAgICAgICAgcGRfZGF0YVtpXSA9IDA7CiAgICAgIH0KICAgICAgZWxzZSB7CiAg ICAgICAgbmV3ZGF0YVtpXSA9ICgocGRfZGF0YVtpXSkgPwogICAgICAgICAgICAgICAgICAgICAg X0NPUkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocGRfZGF0YVtpXSkgOiAwKTsKICAgICAgfQog ICAgfQogICAgaWYgKHBkX3JlbCkgewogICAgICBpZiAocGRfZGF0YSkgZnJlZWJ1ZihwZF9kYXRh KTsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9yZWwgPSAxOwogICAgfQogICAgcGRfZGF0YSA9 IG5ld2RhdGE7CiAgICBwZF9tYXggPSBuZXdtYXg7CiAgfQoKICBfQ09SQkFfVUxvbmcgcGRfbWF4 OwogIF9DT1JCQV9VTG9uZyBwZF9sZW47CiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIF9DT1JC QV9Cb29sZWFuIHBkX2JvdW5kZWQ7CiAgY2hhcioqIHBkX2RhdGE7Cn07CgoKCgoKdGVtcGxhdGU8 aW50IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX1N0cmluZwogIDogcHVibGlj IF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nCnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2VfX1N0cmluZzxtYXg+IFNlcVQ7CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nKCkKICAgIDogX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcobWF4LDEpIHt9 CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9DT1JCQV9VTG9uZyBs ZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHZh bHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29s ZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhtYXgsIGxlbmd0 aCwgdmFsdWUsIHJlbGVhc2UsIDEpIHt9CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZV9fU3RyaW5nKGNvbnN0IFNlcVQmIHMpCiAgICA6IF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKHMp IHt9CgogIGlubGluZSB+X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX1N0cmluZygpIHt9CgogIGlu bGluZSBTZXFUJiBvcGVyYXRvciA9IChjb25zdCBTZXFUJiBzKSB7CiAgICBfQ09SQkFfU2VxdWVu Y2VfX1N0cmluZzo6b3BlcmF0b3IgPSAocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5s aW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbGVuLCBjaGFyKiogZGF0YSwKICAgICAgICAg ICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2Vx dWVuY2VfX1N0cmluZzo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQp9OwoKCgoK CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZwogIDogcHVibGljIF9DT1JC QV9TZXF1ZW5jZV9fU3RyaW5nCnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nIFNlcVQ7CgogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X19TdHJpbmcoKSB7fQoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5n KF9DT1JCQV9VTG9uZyBtYXgpIDoKICAgICAgICAgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcobWF4 KSB7fQoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9DT1JCQV9V TG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09S QkFfVUxvbmcgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY2hhcioqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9TZXF1ZW5jZV9fU3Ry aW5nKG1heCwgbGVuZ3RoLCB2YWx1ZSwgcmVsZWFzZSkge30KCiAgaW5saW5lIF9DT1JCQV9VbmJv dW5kZWRfU2VxdWVuY2VfX1N0cmluZyhjb25zdCBTZXFUJiBzKQogICAgOiBfQ09SQkFfU2VxdWVu Y2VfX1N0cmluZyhzKSB7fQoKICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0 cmluZygpIHt9CgogIGlubGluZSBTZXFUJiBvcGVyYXRvciA9IChjb25zdCBTZXFUJiBzKSB7CiAg ICBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZzo6b3BlcmF0b3IgPSAocyk7CiAgICByZXR1cm4gKnRo aXM7CiAgfQoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFf VUxvbmcgbGVuLCBjaGFyKiogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29s ZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZzo6cmVwbGFjZSht YXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoKfTsKIyAyNTggIi4uLy4uLy4uLy4uL2luY2x1ZGUv b21uaU9SQjMvQ09SQkEuaCIgMgojIDEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvdXNl cmV4Y2VwdGlvbi5oIiAxCiMgMjU5ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJB LmgiIDIKCgoKY2xhc3Mgb21uaU9yYkJvYVNlcnZhbnQ7CgoKbmFtZXNwYWNlIENPUkJBCgp7CgoK CiAgdHlwZWRlZiB2b2lkKiBTdGF0dXM7CgoKCgoKCgogIHR5cGVkZWYgX0NPUkJBX0Jvb2xlYW4g Qm9vbGVhbjsKICB0eXBlZGVmIF9DT1JCQV9DaGFyIENoYXI7CiAgdHlwZWRlZiBfQ09SQkFfT2N0 ZXQgT2N0ZXQ7CiAgdHlwZWRlZiBfQ09SQkFfU2hvcnQgU2hvcnQ7CiAgdHlwZWRlZiBfQ09SQkFf VVNob3J0IFVTaG9ydDsKICB0eXBlZGVmIF9DT1JCQV9Mb25nIExvbmc7CiAgdHlwZWRlZiBfQ09S QkFfVUxvbmcgVUxvbmc7CgogIHR5cGVkZWYgX0NPUkJBX0xvbmdMb25nIExvbmdMb25nOwogIHR5 cGVkZWYgX0NPUkJBX1VMb25nTG9uZyBVTG9uZ0xvbmc7CgoKICB0eXBlZGVmIF9DT1JCQV9GbG9h dCBGbG9hdDsKICB0eXBlZGVmIF9DT1JCQV9Eb3VibGUgRG91YmxlOwoKCgoKCiAgdHlwZWRlZiBf Q09SQkFfQm9vbGVhbiYgQm9vbGVhbl9vdXQ7CiAgdHlwZWRlZiBfQ09SQkFfQ2hhciYgQ2hhcl9v dXQ7CiAgdHlwZWRlZiBfQ09SQkFfT2N0ZXQmIE9jdGV0X291dDsKICB0eXBlZGVmIF9DT1JCQV9T aG9ydCYgU2hvcnRfb3V0OwogIHR5cGVkZWYgX0NPUkJBX1VTaG9ydCYgVVNob3J0X291dDsKICB0 eXBlZGVmIF9DT1JCQV9Mb25nJiBMb25nX291dDsKICB0eXBlZGVmIF9DT1JCQV9VTG9uZyYgVUxv bmdfb3V0OwoKICB0eXBlZGVmIF9DT1JCQV9GbG9hdCYgRmxvYXRfb3V0OwogIHR5cGVkZWYgX0NP UkJBX0RvdWJsZSYgRG91YmxlX291dDsKCgoKCgoKCiAgICAgICAgICAgICAgICAgICBjaGFyKiBz dHJpbmdfYWxsb2MoVUxvbmcgbGVuKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3RyaW5nX2Zy ZWUoY2hhciopOwogICAgICAgICAgICAgICAgICAgY2hhciogc3RyaW5nX2R1cChjb25zdCBjaGFy Kik7CgogIHR5cGVkZWYgX0NPUkJBX1N0cmluZ192YXIgU3RyaW5nX3ZhcjsKICB0eXBlZGVmIF9D T1JCQV9TdHJpbmdfbWVtYmVyIFN0cmluZ19tZW1iZXI7CiAgdHlwZWRlZiBfQ09SQkFfU3RyaW5n X2lub3V0IFN0cmluZ19JTk9VVF9hcmc7CiAgdHlwZWRlZiBfQ09SQkFfU3RyaW5nX291dCBTdHJp bmdfT1VUX2FyZzsKICB0eXBlZGVmIFN0cmluZ19PVVRfYXJnIFN0cmluZ19vdXQ7CgoKCgoKCiAg Y2xhc3MgT2JqZWN0OwogIGNsYXNzIE9iamVjdF92YXI7CiAgdHlwZWRlZiBPYmplY3QqIE9iamVj dF9wdHI7CiAgdHlwZWRlZiBPYmplY3RfcHRyIE9iamVjdFJlZjsKCiAgY2xhc3MgVHlwZUNvZGU7 CiAgdHlwZWRlZiBjbGFzcyBUeXBlQ29kZSogVHlwZUNvZGVfcHRyOwogIHR5cGVkZWYgVHlwZUNv ZGVfcHRyIFR5cGVDb2RlUmVmOwoKCiAgY2xhc3MgQW55IHsKICBwdWJsaWM6CiAgICBBbnkoKTsK CiAgICB+QW55KCk7CgogICAgQW55KGNvbnN0IEFueSYgYSk7CgogICAgQW55KFR5cGVDb2RlX3B0 ciB0Yywgdm9pZCogdmFsdWUsIEJvb2xlYW4gcmVsZWFzZSA9IDApOwoKCiAgICB2b2lkIG9wZXJh dG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9 IChOZXRCdWZmZXJlZFN0cmVhbSYgcyk7CgogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVy ZWRTdHJlYW0mIHMpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJl YW0mIHMpOwoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQp IGNvbnN0OwoKICAgIHZvaWQqIE5QX3BkKCkgeyByZXR1cm4gcGRfcHRyOyB9CiAgICB2b2lkKiBO UF9wZCgpIGNvbnN0IHsgcmV0dXJuIHBkX3B0cjsgfQoKCiAgICB2b2lkIE5QX21hcnNoYWxEYXRh T25seShOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIE5QX3VubWFyc2hhbERh dGFPbmx5KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKCiAgICB2b2lkIE5QX21hcnNoYWxEYXRhT25s eShNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIE5QX3VubWFyc2hhbERhdGFP bmx5KE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKCiAgICBzaXplX3QgTlBfYWxpZ25lZERhdGFPbmx5 U2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CgoKICAgIHZvaWQgUFJfcGFja0Zyb20o VHlwZUNvZGVfcHRyIG5ld3RjLCB2b2lkKiB0Y2Rlc2MpOwogICAgQm9vbGVhbiBQUl91bnBhY2tU byhUeXBlQ29kZV9wdHIgdGMsIHZvaWQqIHRjZGVzYykgY29uc3Q7CgogICAgdm9pZCAqUFJfZ2V0 Q2FjaGVkRGF0YSgpIGNvbnN0OwogICAgdm9pZCBQUl9zZXRDYWNoZWREYXRhKHZvaWQgKmRhdGEs IHZvaWQoKmRlc3RydWN0b3IpKHZvaWQgKikpOwoKCiAgICBBbnkmIG9wZXJhdG9yPShjb25zdCBB bnkmIGEpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oU2hvcnQgcyk7CgogICAgdm9pZCBvcGVyYXRv cjw8PShVU2hvcnQgdSk7CgogICAgdm9pZCBvcGVyYXRvcjw8PShMb25nIGwpOwoKICAgIHZvaWQg b3BlcmF0b3I8PD0oVUxvbmcgdSk7CgoKICAgIHZvaWQgb3BlcmF0b3I8PD0oRmxvYXQgZik7Cgog ICAgdm9pZCBvcGVyYXRvcjw8PShEb3VibGUgZCk7CgoKICAgIHZvaWQgb3BlcmF0b3I8PD0oY29u c3QgQW55JiBhKTsKCiAgICB2b2lkIG9wZXJhdG9yPDw9KEFueSogYSk7CgogICAgdm9pZCBvcGVy YXRvcjw8PShUeXBlQ29kZV9wdHIgdGMpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oT2JqZWN0X3B0 ciBvYmopOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgY2hhciogcyk7CgogICAgc3RydWN0 IGZyb21fYm9vbGVhbiB7CiAgICAgIGZyb21fYm9vbGVhbihCb29sZWFuIGIpIDogdmFsKGIpIHt9 CiAgICAgIEJvb2xlYW4gdmFsOwogICAgfTsKCiAgICBzdHJ1Y3QgZnJvbV9vY3RldCB7CiAgICAg IGZyb21fb2N0ZXQoT2N0ZXQgYikgOiB2YWwoYikge30KICAgICAgT2N0ZXQgdmFsOwogICAgfTsK CiAgICBzdHJ1Y3QgZnJvbV9jaGFyIHsKICAgICAgZnJvbV9jaGFyKENoYXIgYikgOiB2YWwoYikg e30KICAgICAgQ2hhciB2YWw7CiAgICB9OwoKICAgIHN0cnVjdCBmcm9tX3N0cmluZyB7CiAgICAg IGZyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHMsIFVMb25nIGIsIEJvb2xlYW4gbm9jb3B5ID0gMCkK ICAgICAgICA6IHZhbCgoY2hhciopcyksIGJvdW5kKGIpLCBuYyhub2NvcHkpIHsgfQogICAgICBm cm9tX3N0cmluZyhjaGFyKiBzLCBVTG9uZyBiLCBCb29sZWFuIG5vY29weSA9IDApCiAgICAgICAg OiB2YWwocyksIGJvdW5kKGIpLCBuYyhub2NvcHkpIHsgfQoKICAgICAgY2hhciogdmFsOwogICAg ICBVTG9uZyBib3VuZDsKICAgICAgQm9vbGVhbiBuYzsKICAgIH07CgoKICAgIHZvaWQgb3BlcmF0 b3I8PD0oZnJvbV9ib29sZWFuIGYpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oZnJvbV9jaGFyIGMp OwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oZnJvbV9vY3RldCBvKTsKCiAgICB2b2lkIG9wZXJhdG9y PDw9KGZyb21fc3RyaW5nIHMpOwoKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFNob3J0JiBzKSBj b25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFVTaG9ydCYgdSkgY29uc3Q7CgogICAgQm9v bGVhbiBvcGVyYXRvcj4+PShMb25nJiBsKSBjb25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49 KFVMb25nJiB1KSBjb25zdDsKCgogICAgQm9vbGVhbiBvcGVyYXRvcj4+PShGbG9hdCYgZikgY29u c3Q7CgogICAgQm9vbGVhbiBvcGVyYXRvcj4+PShEb3VibGUmIGQpIGNvbnN0OwoKCiAgICBCb29s ZWFuIG9wZXJhdG9yPj49KGNvbnN0IEFueSomIGEpIGNvbnN0OwogICAgQm9vbGVhbiBvcGVyYXRv cj4+PShBbnkqJiBhKSBjb25zdDsKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55JiBhKSBjb25z dDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFR5cGVDb2RlX3B0ciYgdGMpIGNvbnN0OwoKICAg IEJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgY2hhciomIHMpIGNvbnN0OwoKICAgIEJvb2xlYW4g b3BlcmF0b3I+Pj0oY2hhciomIHMpIGNvbnN0OwoKCiAgICBzdHJ1Y3QgdG9fYm9vbGVhbiB7CiAg ICAgIHRvX2Jvb2xlYW4oQm9vbGVhbiYgYikgOiByZWYoYikge30KICAgICAgQm9vbGVhbiYgcmVm OwogICAgfTsKCiAgICBzdHJ1Y3QgdG9fY2hhciB7CiAgICAgIHRvX2NoYXIoQ2hhciYgYikgOiBy ZWYoYikge30KICAgICAgQ2hhciYgcmVmOwogICAgfTsKCiAgICBzdHJ1Y3QgdG9fb2N0ZXQgewog ICAgICB0b19vY3RldChPY3RldCYgYikgOiByZWYoYikge30KICAgICAgT2N0ZXQmIHJlZjsKICAg IH07CgogICAgc3RydWN0IHRvX3N0cmluZyB7CiAgICAgIHRvX3N0cmluZyhjb25zdCBjaGFyKiYg cywgVUxvbmcgYikgOiB2YWwoKGNoYXIqJilzKSwgYm91bmQoYikgeyB9CiAgICAgIHRvX3N0cmlu ZyhjaGFyKiYgcywgVUxvbmcgYikgOiB2YWwocyksIGJvdW5kKGIpIHsgfQoKICAgICAgY2hhciom IHZhbDsKICAgICAgVUxvbmcgYm91bmQ7CiAgICB9OwoKICAgIHN0cnVjdCB0b19vYmplY3Qgewog ICAgICB0b19vYmplY3QoT2JqZWN0X3B0ciYgb2JqKSA6IHJlZihvYmopIHsgfQogICAgICBPYmpl Y3RfcHRyJiByZWY7CiAgICB9OwoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0odG9fYm9vbGVhbiBi KSBjb25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KHRvX2NoYXIgYykgY29uc3Q7CgogICAg Qm9vbGVhbiBvcGVyYXRvcj4+PSh0b19vY3RldCBvKSBjb25zdDsKCgogICAgQm9vbGVhbiBvcGVy YXRvcj4+PSh0b19zdHJpbmcgcykgY29uc3Q7CgoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0odG9f b2JqZWN0IG8pIGNvbnN0OwoKICAgIHZvaWQgcmVwbGFjZShUeXBlQ29kZV9wdHIgVENwLCB2b2lk KiB2YWx1ZSwgQm9vbGVhbiByZWxlYXNlID0gMCk7CgogICAgVHlwZUNvZGVfcHRyIHR5cGUoKSBj b25zdDsKICAgIHZvaWQgdHlwZShUeXBlQ29kZV9wdHIpOwoKICAgIGNvbnN0IHZvaWQqIHZhbHVl KCkgY29uc3Q7CgogIHByaXZhdGU6CiAgICB2b2lkICpwZF9wdHI7CiAgfTsKCgogIGNsYXNzIEFu eV9PVVRfYXJnOwoKCiAgY2xhc3MgQW55X3ZhciB7CiAgcHVibGljOgogICAgaW5saW5lIEFueV92 YXIoKSB7IHBkX2RhdGEgPSAwOyB9CiAgICBpbmxpbmUgQW55X3ZhcihBbnkqIHApIHsgcGRfZGF0 YSA9IHA7IH0KICAgIGlubGluZSBBbnlfdmFyKGNvbnN0IEFueV92YXImIHApIHsKICAgICAgaWYg KCFwLnBkX2RhdGEpIHsKICAgICAgICBwZF9kYXRhID0gMDsKICAgICAgICByZXR1cm47CiAgICAg IH0KICAgICAgZWxzZSB7CiAgICAgICAgcGRfZGF0YSA9IG5ldyBBbnk7CiAgICAgICAgaWYgKCFw ZF9kYXRhKSB7CiAgICAgICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7Cgog ICAgICAgIH0KICAgICAgICAqcGRfZGF0YSA9ICpwLnBkX2RhdGE7CiAgICAgIH0KICAgIH0KCiAg ICBpbmxpbmUgfkFueV92YXIoKSB7IGlmIChwZF9kYXRhKSBkZWxldGUgcGRfZGF0YTsgfQogICAg aW5saW5lIEFueV92YXImIG9wZXJhdG9yPSAoQW55KiBwKSB7CiAgICAgIGlmIChwZF9kYXRhKSBk ZWxldGUgcGRfZGF0YTsKICAgICAgcGRfZGF0YSA9IHA7CiAgICAgIHJldHVybiAqdGhpczsKICAg IH0KCiAgICBpbmxpbmUgQW55X3ZhciYgb3BlcmF0b3I9IChjb25zdCBBbnlfdmFyJiBwKSB7CiAg ICAgICAgaWYgKHAucGRfZGF0YSkgewogICAgICAgICAgaWYgKCFwZF9kYXRhKSB7CiAgICAgICAg ICAgIHBkX2RhdGEgPSBuZXcgQW55OwogICAgICAgICAgICBpZiAoIXBkX2RhdGEpIHsKICAgICAg ICAgICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CgogICAgICAgICAgICB9 CiAgICAgICAgICB9CiAgICAgICAgICAqcGRfZGF0YSA9ICpwLnBkX2RhdGE7CiAgICAgICAgfQog ICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKHBkX2RhdGEpIGRlbGV0ZSBwZF9kYXRhOwogICAg ICAgICAgcGRfZGF0YSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0K CiAgICBpbmxpbmUgQW55KiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKEFueSopcGRfZGF0 YTsgfQoKCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBBbnkmICgpIGNvbnN0IHsgcmV0dXJu ICpwZF9kYXRhOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgQW55JiAoKSB7IHJldHVybiAqcGRfZGF0 YTsgfQoKCiAgICBpbmxpbmUgY29uc3QgQW55JiBpbigpIGNvbnN0IHsgcmV0dXJuICpwZF9kYXRh OyB9CiAgICBpbmxpbmUgQW55JiBpbm91dCgpIHsgcmV0dXJuICpwZF9kYXRhOyB9CiAgICBpbmxp bmUgQW55KiYgb3V0KCkgewogICAgICBpZiggcGRfZGF0YSApewogICAgICAgIGRlbGV0ZSBwZF9k YXRhOwogICAgICAgIHBkX2RhdGEgPSAwOwogICAgICB9CiAgICAgIHJldHVybiBwZF9kYXRhOwog ICAgfQogICAgaW5saW5lIEFueSogX3JldG4oKSB7CiAgICAgIEFueSogdG1wID0gcGRfZGF0YTsK ICAgICAgcGRfZGF0YSA9IDA7CiAgICAgIHJldHVybiB0bXA7CiAgICB9CgoKCiAgICBpbmxpbmUg dm9pZCBvcGVyYXRvcjw8PShTaG9ydCBzKSB7CiAgICAgICpwZF9kYXRhIDw8PSBzOwogICAgfQoK ICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KFVTaG9ydCB1KSB7CiAgICAgICpwZF9kYXRhIDw8 PSB1OwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KExvbmcgbCkgewogICAgICAq cGRfZGF0YSA8PD0gbDsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShVTG9uZyB1 KSB7CiAgICAgICpwZF9kYXRhIDw8PSB1OwogICAgfQoKCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRv cjw8PShGbG9hdCBmKSB7CiAgICAgICpwZF9kYXRhIDw8PSBmOwogICAgfQoKICAgIGlubGluZSB2 b2lkIG9wZXJhdG9yPDw9KERvdWJsZSBkKSB7CiAgICAgICpwZF9kYXRhIDw8PSBkOwogICAgfQoK CiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBBbnkmIGEpIHsKICAgICAgKnBkX2Rh dGEgPDw9IGE7CiAgICB9CgogICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55KiBhKSB7CiAg ICAgICpwZF9kYXRhIDw8PSBhOwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KFR5 cGVDb2RlX3B0ciB0YykgewogICAgICAqcGRfZGF0YSA8PD0gdGM7CiAgICB9CgogICAgaW5saW5l IHZvaWQgb3BlcmF0b3I8PD0oT2JqZWN0X3B0ciBvYmopIHsKICAgICAgKnBkX2RhdGEgPDw9IG9i ajsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBjaGFyKiBzKSB7CiAg ICAgICpwZF9kYXRhIDw8PSBzOwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KEFu eTo6ZnJvbV9ib29sZWFuIGYpIHsKICAgICAgKnBkX2RhdGEgPDw9IGY7CiAgICB9CgogICAgaW5s aW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55Ojpmcm9tX2NoYXIgYykgewogICAgICAqcGRfZGF0YSA8 PD0gYzsKICAgIH0KCgogICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55Ojpmcm9tX29jdGV0 IG8pIHsKICAgICAgKnBkX2RhdGEgPDw9IG87CiAgICB9CgogICAgaW5saW5lIHZvaWQgb3BlcmF0 b3I8PD0oQW55Ojpmcm9tX3N0cmluZyBzKXsKICAgICAgKnBkX2RhdGEgPDw9IHM7CiAgICB9CgoK CgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oU2hvcnQmIHMpIGNvbnN0IHsKICAgICAg cmV0dXJuICgqcGRfZGF0YSA+Pj0gcyk7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0 b3I+Pj0oVVNob3J0JiB1KSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IHUpOwog ICAgfQoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9yPj49KExvbmcmIGwpIGNvbnN0IHsKICAg ICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gbCk7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4gb3Bl cmF0b3I+Pj0oVUxvbmcmIHUpIGNvbnN0IHsKICAgICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gdSk7 CiAgICB9CgoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9yPj49KEZsb2F0JiBmKSBjb25zdCB7 CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IGYpOwogICAgICB9CgogICAgaW5saW5lIEJvb2xl YW4gb3BlcmF0b3I+Pj0oRG91YmxlJiBkKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEg Pj49IGQpOwogICAgfQoKCgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQW55 KiYgYSkgY29uc3QgewogICAgICByZXR1cm4gKCpwZF9kYXRhID4+PSBhKTsKICAgIH0KCiAgICBp bmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShBbnkqJiBhKSBjb25zdCB7CiAgICAgIHJldHVybiAo KnBkX2RhdGEgPj49IGEpOwogICAgfQoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55JiBhKSBj b25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IGEpOwogICAgfQoKICAgIGlubGluZSBC b29sZWFuIG9wZXJhdG9yPj49KFR5cGVDb2RlX3B0ciYgdGMpIGNvbnN0IHsKICAgICAgcmV0dXJu ICgqcGRfZGF0YSA+Pj0gdGMpOwogICAgfQoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9yPj49 KGNvbnN0IGNoYXIqJiBzKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IHMpOwog ICAgfQoKCiAgICBpbmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShjaGFyKiYgcykgY29uc3Qgewog ICAgICByZXR1cm4gKCpwZF9kYXRhID4+PSBzKTsKICAgIH0KCgogICAgaW5saW5lIEJvb2xlYW4g b3BlcmF0b3I+Pj0oQW55Ojp0b19ib29sZWFuIGIpIGNvbnN0IHsKICAgICAgcmV0dXJuICgqcGRf ZGF0YSA+Pj0gYik7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55Ojp0 b19jaGFyIGMpIGNvbnN0IHsKICAgICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gYyk7CiAgICB9Cgog ICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55Ojp0b19vY3RldCBvKSBjb25zdCB7CiAg ICAgIHJldHVybiAoKnBkX2RhdGEgPj49IG8pOwogICAgfQoKCiAgICBpbmxpbmUgQm9vbGVhbiBv cGVyYXRvcj4+PShBbnk6OnRvX3N0cmluZyBzKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2Rh dGEgPj49IHMpOwogICAgfQoKCiAgICBpbmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShBbnk6OnRv X29iamVjdCBvKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IG8pOwogICAgfQoK ICAgIGZyaWVuZCBjbGFzcyBBbnlfT1VUX2FyZzsKCiAgcHJpdmF0ZToKICAgIEFueSogcGRfZGF0 YTsKICB9OwoKCiAgY2xhc3MgQW55X09VVF9hcmcgewogIHB1YmxpYzoKICAgIGlubGluZSBBbnlf T1VUX2FyZyhBbnkqJiBwKSA6IF9kYXRhKHApIHsgX2RhdGEgPSAoQW55KikgMDsgfQogICAgaW5s aW5lIEFueV9PVVRfYXJnKEFueV92YXImIHApIDogX2RhdGEocC5wZF9kYXRhKSB7CiAgICAgIHAg PSAoQW55KikwOwogICAgfQogICAgaW5saW5lIEFueV9PVVRfYXJnKGNvbnN0IEFueV9PVVRfYXJn JiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgICBpbmxpbmUgQW55X09VVF9hcmcmIG9wZXJhdG9y PShjb25zdCBBbnlfT1VUX2FyZyYgcCkgewogICAgICBfZGF0YSA9IHAuX2RhdGE7IHJldHVybiAq dGhpczsKICAgIH0KICAgIGlubGluZSBBbnlfT1VUX2FyZyYgb3BlcmF0b3I9KEFueSogcCkgeyBf ZGF0YSA9IHA7IHJldHVybiAqdGhpczsgfQoKICAgIG9wZXJhdG9yIEFueSomICgpIHsgcmV0dXJu IF9kYXRhOyB9CiAgICBBbnkqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQoKICAgIEFueSomIF9k YXRhOwogIHByaXZhdGU6CiAgICBBbnlfT1VUX2FyZygpOwogICAgQW55X09VVF9hcmcmIG9wZXJh dG9yPShjb25zdCBBbnlfdmFyJik7CiAgfTsKCiAgdHlwZWRlZiBBbnlfT1VUX2FyZyBBbnlfb3V0 OwoKCgoKCgogIGNsYXNzIEV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCB+RXhjZXB0 aW9uKCk7CgogICAgdmlydHVhbCB2b2lkIF9yYWlzZSgpID0gMDsKCgogICAgc3RhdGljIGlubGlu ZSBFeGNlcHRpb24qIF9kb3duY2FzdChFeGNlcHRpb24qIGUpIHsgcmV0dXJuIGU7IH0KCgoKICAg IHN0YXRpYyBpbmxpbmUgY29uc3QgRXhjZXB0aW9uKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9u KiBlKSB7IHJldHVybiBlOyB9CgoKCiAgICBzdGF0aWMgaW5saW5lIEV4Y2VwdGlvbiogX25hcnJv dyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIGU7IH0KCgoKCiAgICBzdGF0aWMgRXhjZXB0aW9uKiBf ZHVwbGljYXRlKEV4Y2VwdGlvbiogZSk7CgoKICAgIHZpcnR1YWwgY29uc3QgY2hhciogX05QX3Jl cG9JZChpbnQqIHNpemUpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgc2l6ZV90IF9OUF9hbGlnbmVk U2l6ZShzaXplX3QpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZl cmVkU3RyZWFtJikgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1 ZmZlcmVkU3RyZWFtJikgY29uc3QgPSAwOwoKICAgIHN0YXRpYyBpbmxpbmUgX0NPUkJBX0Jvb2xl YW4gUFJfaXNfdmFsaWQoRXhjZXB0aW9uKiBwICkgewogICAgICByZXR1cm4gKChwKSA/IChwLT5w ZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KICAgIHN0YXRpYyBjb25zdCBfQ09SQkFf VUxvbmcgUFJfbWFnaWM7CgogICAgdHlwZWRlZiB2b2lkICgqaW5zZXJ0RXhjZXB0aW9uVG9Bbnkp IChBbnkmLCBjb25zdCBFeGNlcHRpb24mKTsKICAgIHR5cGVkZWYgdm9pZCAoKmluc2VydEV4Y2Vw dGlvblRvQW55TkNQKSAoQW55JiwgY29uc3QgRXhjZXB0aW9uKik7CgogICAgaW5saW5lIGluc2Vy dEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm4oKSBjb25zdCB7CiAgICAgIHJldHVybiBwZF9p bnNlcnRUb0FueUZuOwogICAgfQogICAgaW5saW5lIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGlu c2VydFRvQW55Rm5OQ1AoKSBjb25zdCB7CiAgICAgIHJldHVybiBwZF9pbnNlcnRUb0FueUZuTkNQ OwogICAgfQoKICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgRXhjZXB0aW9uKCkgOgogICAgICBwZF9p bnNlcnRUb0FueUZuKDApLAogICAgICBwZF9pbnNlcnRUb0FueUZuTkNQKDApLAogICAgICBwZF9t YWdpYyhQUl9tYWdpYykKICAgICAge30KICAgIGlubGluZSBFeGNlcHRpb24mIG9wZXJhdG9yID0g KGNvbnN0IEV4Y2VwdGlvbiYgZXgpIHsKICAgICAgcGRfbWFnaWMgPSBleC5wZF9tYWdpYzsKICAg ICAgcGRfaW5zZXJ0VG9BbnlGbiA9IGV4LnBkX2luc2VydFRvQW55Rm47CiAgICAgIHBkX2luc2Vy dFRvQW55Rm5OQ1AgPSBleC5wZF9pbnNlcnRUb0FueUZuTkNQOwogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CiAgICBzdGF0aWMgRXhjZXB0aW9uKiBfTlBfaXNfYShjb25zdCBFeGNlcHRpb24qIGUs IGNvbnN0IGNoYXIqIHR5cGVJZCk7CgogICAgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgcGRfaW5zZXJ0 VG9BbnlGbjsKICAgIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIHBkX2luc2VydFRvQW55Rm5OQ1A7 CgoKCgoKICAgIGlubGluZSBFeGNlcHRpb24oY29uc3QgRXhjZXB0aW9uJiBleCkgOgogICAgICBw ZF9pbnNlcnRUb0FueUZuKGV4LnBkX2luc2VydFRvQW55Rm4pLAogICAgICBwZF9pbnNlcnRUb0Fu eUZuTkNQKGV4LnBkX2luc2VydFRvQW55Rm5OQ1ApLAogICAgICBwZF9tYWdpYyhleC5wZF9tYWdp YykKICAgICAge30KCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGlj YXRlKCkgY29uc3QgPSAwOwoKCgogICAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkg Y29uc3QgPSAwOwoKCgoKICAgIFVMb25nIHBkX21hZ2ljOwogIH07CgoKCgoKCiAgZW51bSBDb21w bGV0aW9uU3RhdHVzIHsgQ09NUExFVEVEX1lFUywgQ09NUExFVEVEX05PLCBDT01QTEVURURfTUFZ QkUgfTsKICBlbnVtIGV4Y2VwdGlvbl90eXBlIHsgTk9fRVhDRVBUSU9OLCBVU0VSX0VYQ0VQVElP TiwgU1lTVEVNX0VYQ0VQVElPTiB9OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVTG9u ZwogICAgICAgT01HVk1DSUQgPSAxMzMwNDQ2MzM2OwoKCiAgY2xhc3MgU3lzdGVtRXhjZXB0aW9u IDogcHVibGljIEV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCB+U3lzdGVtRXhjZXB0 aW9uKCk7CgoKCgoKCgogICAgaW5saW5lIFVMb25nIG1pbm9yKCkgY29uc3QgeyByZXR1cm4gcGRf bWlub3I7IH0KICAgIGlubGluZSB2b2lkIG1pbm9yKFVMb25nIG0pIHsgcGRfbWlub3IgPSBtOyB9 CgogICAgaW5saW5lIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkKCkgY29uc3QgeyByZXR1cm4g cGRfc3RhdHVzOyB9CiAgICBpbmxpbmUgdm9pZCBjb21wbGV0ZWQoQ29tcGxldGlvblN0YXR1cyBz KSB7IHBkX3N0YXR1cyA9IHM7IH0KCiAgICBzdGF0aWMgU3lzdGVtRXhjZXB0aW9uKiBfZG93bmNh c3QoRXhjZXB0aW9uKik7CiAgICBzdGF0aWMgY29uc3QgU3lzdGVtRXhjZXB0aW9uKiBfZG93bmNh c3QoY29uc3QgRXhjZXB0aW9uKik7CiAgICBzdGF0aWMgaW5saW5lIFN5c3RlbUV4Y2VwdGlvbiog X25hcnJvdyhFeGNlcHRpb24qIGUpIHsKICAgICAgcmV0dXJuIF9kb3duY2FzdChlKTsKICAgIH0K CiAgICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uKCkgewogICAgICBwZF9taW5vciA9IDA7CiAgICAg IHBkX3N0YXR1cyA9IENPTVBMRVRFRF9OTzsKICAgIH0KICAgIGlubGluZSBTeXN0ZW1FeGNlcHRp b24oY29uc3QgU3lzdGVtRXhjZXB0aW9uJiBlKSA6IEV4Y2VwdGlvbihlKSB7CiAgICAgIHBkX21p bm9yID0gZS5wZF9taW5vcjsKICAgICAgcGRfc3RhdHVzID0gZS5wZF9zdGF0dXM7CiAgICB9CiAg ICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uKFVMb25nIG1pbm9yLCBDb21wbGV0aW9uU3RhdHVzIHN0 YXR1cykgewogICAgICBwZF9taW5vciA9IG1pbm9yOwogICAgICBwZF9zdGF0dXMgPSBzdGF0dXM7 CiAgICB9CiAgICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgU3lzdGVt RXhjZXB0aW9uJiBlKSB7CiAgICAgIEV4Y2VwdGlvbjo6b3BlcmF0b3I9KGUpOwogICAgICBwZF9t aW5vciA9IGUucGRfbWlub3I7CiAgICAgIHBkX3N0YXR1cyA9IGUucGRfc3RhdHVzOwogICAgICBy ZXR1cm4gKnRoaXM7CiAgICB9CgogIHByb3RlY3RlZDoKICAgIFVMb25nIHBkX21pbm9yOwogICAg Q29tcGxldGlvblN0YXR1cyBwZF9zdGF0dXM7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHNpemVf dCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90KSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBfTlBfbWFy c2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIF9OUF9tYXJz aGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgfTsKIyA5MzkgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIKICBjbGFzcyBVTktOT1dOIDogcHVibGljIFN5c3RlbUV4 Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFVOS05PV04oVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0 aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1p bm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2lu c2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBVTktOT1dOKGNvbnN0 IFVOS05PV04mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIFVOS05PV04mIG9w ZXJhdG9yPShjb25zdCBVTktOT1dOJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShl eCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5VTktOT1dOKCk7IHZpcnR1YWwgdm9pZCBfcmFp c2UoKTsgc3RhdGljIFVOS05PV04qIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0 IFVOS05PV04qIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBVTktO T1dOKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1 YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0 aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9u OjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0 dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgQkFEX1BBUkFNIDogcHVibGljIFN5c3RlbUV4 Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEJBRF9QQVJBTShVTG9uZyBtaW5vciA9IDAsIENvbXBs ZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAo bWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRf aW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEJBRF9QQVJBTShj b25zdCBCQURfUEFSQU0mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIEJBRF9Q QVJBTSYgb3BlcmF0b3I9KGNvbnN0IEJBRF9QQVJBTSYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpv cGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+QkFEX1BBUkFNKCk7IHZpcnR1 YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEJBRF9QQVJBTSogX2Rvd25jYXN0KEV4Y2VwdGlvbiop OyBzdGF0aWMgY29uc3QgQkFEX1BBUkFNKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0 YXRpYyBpbmxpbmUgQkFEX1BBUkFNKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rv d25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNv bnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZu OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZu TkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgTk9fTUVNT1JZ IDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE5PX01FTU9SWShVTG9u ZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6 IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0g aW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0g aW5saW5lIE5PX01FTU9SWShjb25zdCBOT19NRU1PUlkmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihl eCkge30gaW5saW5lIE5PX01FTU9SWSYgb3BlcmF0b3I9KGNvbnN0IE5PX01FTU9SWSYgZXgpIHsg U3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+ Tk9fTUVNT1JZKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIE5PX01FTU9SWSogX2Rv d25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgTk9fTUVNT1JZKiBfZG93bmNhc3QoY29u c3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgTk9fTUVNT1JZKiBfbmFycm93KEV4Y2VwdGlv biogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3Jl cG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25U b0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0Fu eU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg fTsgY2xhc3MgSU1QX0xJTUlUIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5s aW5lIElNUF9MSU1JVChVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVk ID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBw ZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGlu c2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIElNUF9MSU1JVChjb25zdCBJTVBfTElNSVQmIGV4KSA6 IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIElNUF9MSU1JVCYgb3BlcmF0b3I9KGNvbnN0 IElNUF9MSU1JVCYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4g KnRoaXM7IH0gdmlydHVhbCB+SU1QX0xJTUlUKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3Rh dGljIElNUF9MSU1JVCogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgSU1QX0xJ TUlUKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSU1QX0xJTUlU KiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwg Y29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9u OjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjpp bnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFs IEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgQ09NTV9GQUlMVVJFIDogcHVibGljIFN5c3RlbUV4 Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIENPTU1fRkFJTFVSRShVTG9uZyBtaW5vciA9IDAsIENv bXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlv biAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIENPTU1fRkFJ TFVSRShjb25zdCBDT01NX0ZBSUxVUkUmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5s aW5lIENPTU1fRkFJTFVSRSYgb3BlcmF0b3I9KGNvbnN0IENPTU1fRkFJTFVSRSYgZXgpIHsgU3lz dGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+Q09N TV9GQUlMVVJFKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIENPTU1fRkFJTFVSRSog X2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQ09NTV9GQUlMVVJFKiBfZG93bmNh c3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQ09NTV9GQUlMVVJFKiBfbmFycm93 KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRF eGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNl cHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlv biogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQo KSBjb25zdDsgfTsgY2xhc3MgSU5WX09CSlJFRiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBw dWJsaWM6IGlubGluZSBJTlZfT0JKUkVGKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0YXR1 cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwgY29t cGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0Fu eUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSU5WX09CSlJFRihjb25zdCBJTlZf T0JKUkVGJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBJTlZfT0JKUkVGJiBv cGVyYXRvcj0oY29uc3QgSU5WX09CSlJFRiYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRv cj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SU5WX09CSlJFRigpOyB2aXJ0dWFsIHZv aWQgX3JhaXNlKCk7IHN0YXRpYyBJTlZfT0JKUkVGKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0 YXRpYyBjb25zdCBJTlZfT0JKUkVGKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRp YyBpbmxpbmUgSU5WX09CSlJFRiogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3du Y2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25z dDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsg c3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5D UDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmly dHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIE9CSkVDVF9OT1Rf RVhJU1QgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgT0JKRUNUX05P VF9FWElTVChVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09N UExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNl cnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRv QW55Rm5OQ1A7IH0gaW5saW5lIE9CSkVDVF9OT1RfRVhJU1QoY29uc3QgT0JKRUNUX05PVF9FWElT VCYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgT0JKRUNUX05PVF9FWElTVCYg b3BlcmF0b3I9KGNvbnN0IE9CSkVDVF9OT1RfRVhJU1QmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6 b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfk9CSkVDVF9OT1RfRVhJU1Qo KTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgT0JKRUNUX05PVF9FWElTVCogX2Rvd25j YXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgT0JKRUNUX05PVF9FWElTVCogX2Rvd25jYXN0 KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIE9CSkVDVF9OT1RfRVhJU1QqIF9uYXJy b3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBj aGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2Vy dEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4 Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0 aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJ ZCgpIGNvbnN0OyB9OyBjbGFzcyBOT19QRVJNSVNTSU9OIDogcHVibGljIFN5c3RlbUV4Y2VwdGlv biB7IHB1YmxpYzogaW5saW5lIE5PX1BFUk1JU1NJT04oVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0 aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1p bm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2lu c2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBOT19QRVJNSVNTSU9O KGNvbnN0IE5PX1BFUk1JU1NJT04mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5l IE5PX1BFUk1JU1NJT04mIG9wZXJhdG9yPShjb25zdCBOT19QRVJNSVNTSU9OJiBleCkgeyBTeXN0 ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5OT19Q RVJNSVNTSU9OKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIE5PX1BFUk1JU1NJT04q IF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE5PX1BFUk1JU1NJT04qIF9kb3du Y2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBOT19QRVJNSVNTSU9OKiBfbmFy cm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3Qg Y2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNl cnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRF eGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2Vw dGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBl SWQoKSBjb25zdDsgfTsgY2xhc3MgSU5URVJOQUwgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsg cHVibGljOiBpbmxpbmUgSU5URVJOQUwoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVz IGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21w bGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55 Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBJTlRFUk5BTChjb25zdCBJTlRFUk5B TCYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgSU5URVJOQUwmIG9wZXJhdG9y PShjb25zdCBJTlRFUk5BTCYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyBy ZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SU5URVJOQUwoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgp OyBzdGF0aWMgSU5URVJOQUwqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IElO VEVSTkFMKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSU5URVJO QUwqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVh bCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRp b246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246 Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1 YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciog X05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBNQVJTSEFMIDogcHVibGljIFN5c3RlbUV4Y2Vw dGlvbiB7IHB1YmxpYzogaW5saW5lIE1BUlNIQUwoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9u U3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9y LCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2Vy dFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBNQVJTSEFMKGNvbnN0IE1B UlNIQUwmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIE1BUlNIQUwmIG9wZXJh dG9yPShjb25zdCBNQVJTSEFMJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7 IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5NQVJTSEFMKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2Uo KTsgc3RhdGljIE1BUlNIQUwqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE1B UlNIQUwqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBNQVJTSEFM KiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwg Y29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9u OjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjpp bnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFs IEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgSU5JVElBTElaRSA6IHB1YmxpYyBTeXN0ZW1FeGNl cHRpb24geyBwdWJsaWM6IGlubGluZSBJTklUSUFMSVpFKFVMb25nIG1pbm9yID0gMCwgQ29tcGxl dGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uICht aW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9p bnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSU5JVElBTElaRShj b25zdCBJTklUSUFMSVpFJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBJTklU SUFMSVpFJiBvcGVyYXRvcj0oY29uc3QgSU5JVElBTElaRSYgZXgpIHsgU3lzdGVtRXhjZXB0aW9u OjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SU5JVElBTElaRSgpOyB2 aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBJTklUSUFMSVpFKiBfZG93bmNhc3QoRXhjZXB0 aW9uKik7IHN0YXRpYyBjb25zdCBJTklUSUFMSVpFKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9u Kik7IHN0YXRpYyBpbmxpbmUgSU5JVElBTElaRSogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0 dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBz aXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0 VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0 VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBj b25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIE5P X0lNUExFTUVOVCA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBOT19J TVBMRU1FTlQoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENP TVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5z ZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRU b0FueUZuTkNQOyB9IGlubGluZSBOT19JTVBMRU1FTlQoY29uc3QgTk9fSU1QTEVNRU5UJiBleCkg OiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBOT19JTVBMRU1FTlQmIG9wZXJhdG9yPShj b25zdCBOT19JTVBMRU1FTlQmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsg cmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfk5PX0lNUExFTUVOVCgpOyB2aXJ0dWFsIHZvaWQgX3Jh aXNlKCk7IHN0YXRpYyBOT19JTVBMRU1FTlQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGlj IGNvbnN0IE5PX0lNUExFTUVOVCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMg aW5saW5lIE5PX0lNUExFTUVOVCogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3du Y2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25z dDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsg c3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5D UDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmly dHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIEJBRF9UWVBFQ09E RSA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBCQURfVFlQRUNPREUo VUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9O TykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlG biA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQ OyB9IGlubGluZSBCQURfVFlQRUNPREUoY29uc3QgQkFEX1RZUEVDT0RFJiBleCkgOiBTeXN0ZW1F eGNlcHRpb24oZXgpIHt9IGlubGluZSBCQURfVFlQRUNPREUmIG9wZXJhdG9yPShjb25zdCBCQURf VFlQRUNPREUmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0 aGlzOyB9IHZpcnR1YWwgfkJBRF9UWVBFQ09ERSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0 YXRpYyBCQURfVFlQRUNPREUqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJB RF9UWVBFQ09ERSogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEJB RF9UWVBFQ09ERSogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsg fSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGlj IEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4 Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0 ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25z dCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIEJBRF9PUEVSQVRJT04gOiBwdWJs aWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQkFEX09QRVJBVElPTihVTG9uZyBt aW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5 c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5z ZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5s aW5lIEJBRF9PUEVSQVRJT04oY29uc3QgQkFEX09QRVJBVElPTiYgZXgpIDogU3lzdGVtRXhjZXB0 aW9uKGV4KSB7fSBpbmxpbmUgQkFEX09QRVJBVElPTiYgb3BlcmF0b3I9KGNvbnN0IEJBRF9PUEVS QVRJT04mIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlz OyB9IHZpcnR1YWwgfkJBRF9PUEVSQVRJT04oKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0 aWMgQkFEX09QRVJBVElPTiogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQkFE X09QRVJBVElPTiogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEJB RF9PUEVSQVRJT04qIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7 IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRp YyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBF eGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZh dGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29u c3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBOT19SRVNPVVJDRVMgOiBwdWJs aWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgTk9fUkVTT1VSQ0VTKFVMb25nIG1p bm9yID0gMCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lz dGVtRXhjZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNl cnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxp bmUgTk9fUkVTT1VSQ0VTKGNvbnN0IE5PX1JFU09VUkNFUyYgZXgpIDogU3lzdGVtRXhjZXB0aW9u KGV4KSB7fSBpbmxpbmUgTk9fUkVTT1VSQ0VTJiBvcGVyYXRvcj0oY29uc3QgTk9fUkVTT1VSQ0VT JiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2 aXJ0dWFsIH5OT19SRVNPVVJDRVMoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgTk9f UkVTT1VSQ0VTKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBOT19SRVNPVVJD RVMqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBOT19SRVNPVVJD RVMqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVh bCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRp b246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246 Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1 YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciog X05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBOT19SRVNQT05TRSA6IHB1YmxpYyBTeXN0ZW1F eGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBOT19SRVNQT05TRShVTG9uZyBtaW5vciA9IDAsIENv bXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlv biAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIE5PX1JFU1BP TlNFKGNvbnN0IE5PX1JFU1BPTlNFJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGlu ZSBOT19SRVNQT05TRSYgb3BlcmF0b3I9KGNvbnN0IE5PX1JFU1BPTlNFJiBleCkgeyBTeXN0ZW1F eGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5OT19SRVNQ T05TRSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBOT19SRVNQT05TRSogX2Rvd25j YXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgTk9fUkVTUE9OU0UqIF9kb3duY2FzdChjb25z dCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBOT19SRVNQT05TRSogX25hcnJvdyhFeGNlcHRp b24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9y ZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9u VG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9B bnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9k dXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7 IH07IGNsYXNzIFBFUlNJU1RfU1RPUkUgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGlj OiBpbmxpbmUgUEVSU0lTVF9TVE9SRShVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMg Y29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBs ZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlG bk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIFBFUlNJU1RfU1RPUkUoY29uc3QgUEVS U0lTVF9TVE9SRSYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgUEVSU0lTVF9T VE9SRSYgb3BlcmF0b3I9KGNvbnN0IFBFUlNJU1RfU1RPUkUmIGV4KSB7IFN5c3RlbUV4Y2VwdGlv bjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgflBFUlNJU1RfU1RPUkUo KTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgUEVSU0lTVF9TVE9SRSogX2Rvd25jYXN0 KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgUEVSU0lTVF9TVE9SRSogX2Rvd25jYXN0KGNvbnN0 IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIFBFUlNJU1RfU1RPUkUqIF9uYXJyb3coRXhjZXB0 aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBf cmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlv blRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRv QW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBf ZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0 OyB9OyBjbGFzcyBCQURfSU5WX09SREVSIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1Ymxp YzogaW5saW5lIEJBRF9JTlZfT1JERVIoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVz IGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21w bGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55 Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCQURfSU5WX09SREVSKGNvbnN0IEJB RF9JTlZfT1JERVImIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIEJBRF9JTlZf T1JERVImIG9wZXJhdG9yPShjb25zdCBCQURfSU5WX09SREVSJiBleCkgeyBTeXN0ZW1FeGNlcHRp b246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5CQURfSU5WX09SREVS KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEJBRF9JTlZfT1JERVIqIF9kb3duY2Fz dChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJBRF9JTlZfT1JERVIqIF9kb3duY2FzdChjb25z dCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBCQURfSU5WX09SREVSKiBfbmFycm93KEV4Y2Vw dGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05Q X3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRp b25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25U b0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05Q X2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25z dDsgfTsgY2xhc3MgVFJBTlNJRU5UIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzog aW5saW5lIFRSQU5TSUVOVChVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxl dGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkg eyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9 IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIFRSQU5TSUVOVChjb25zdCBUUkFOU0lFTlQmIGV4 KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIFRSQU5TSUVOVCYgb3BlcmF0b3I9KGNv bnN0IFRSQU5TSUVOVCYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1 cm4gKnRoaXM7IH0gdmlydHVhbCB+VFJBTlNJRU5UKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsg c3RhdGljIFRSQU5TSUVOVCogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgVFJB TlNJRU5UKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgVFJBTlNJ RU5UKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1 YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0 aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9u OjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0 dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgRlJFRV9NRU0gOiBwdWJsaWMgU3lzdGVtRXhj ZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgRlJFRV9NRU0oVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0 aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1p bm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2lu c2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBGUkVFX01FTShjb25z dCBGUkVFX01FTSYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgRlJFRV9NRU0m IG9wZXJhdG9yPShjb25zdCBGUkVFX01FTSYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRv cj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+RlJFRV9NRU0oKTsgdmlydHVhbCB2b2lk IF9yYWlzZSgpOyBzdGF0aWMgRlJFRV9NRU0qIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGlj IGNvbnN0IEZSRUVfTUVNKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxp bmUgRlJFRV9NRU0qIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7 IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRp YyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBF eGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZh dGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29u c3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBJTlZfSURFTlQgOiBwdWJsaWMg U3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSU5WX0lERU5UKFVMb25nIG1pbm9yID0g MCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhj ZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0Fu eUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSU5W X0lERU5UKGNvbnN0IElOVl9JREVOVCYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxp bmUgSU5WX0lERU5UJiBvcGVyYXRvcj0oY29uc3QgSU5WX0lERU5UJiBleCkgeyBTeXN0ZW1FeGNl cHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5JTlZfSURFTlQo KTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgSU5WX0lERU5UKiBfZG93bmNhc3QoRXhj ZXB0aW9uKik7IHN0YXRpYyBjb25zdCBJTlZfSURFTlQqIF9kb3duY2FzdChjb25zdCBFeGNlcHRp b24qKTsgc3RhdGljIGlubGluZSBJTlZfSURFTlQqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJl dHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCog c2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2Vy dFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2Vy dFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkg Y29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBJ TlZfRkxBRyA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBJTlZfRkxB RyhVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVE X05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0Fu eUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5O Q1A7IH0gaW5saW5lIElOVl9GTEFHKGNvbnN0IElOVl9GTEFHJiBleCkgOiBTeXN0ZW1FeGNlcHRp b24oZXgpIHt9IGlubGluZSBJTlZfRkxBRyYgb3BlcmF0b3I9KGNvbnN0IElOVl9GTEFHJiBleCkg eyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFs IH5JTlZfRkxBRygpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBJTlZfRkxBRyogX2Rv d25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgSU5WX0ZMQUcqIF9kb3duY2FzdChjb25z dCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBJTlZfRkxBRyogX25hcnJvdyhFeGNlcHRpb24q IGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBv SWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9B bnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlO Q1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBs aWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07 IGNsYXNzIElOVEZfUkVQT1MgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxp bmUgSU5URl9SRVBPUyhVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVk ID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBw ZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGlu c2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIElOVEZfUkVQT1MoY29uc3QgSU5URl9SRVBPUyYgZXgp IDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgSU5URl9SRVBPUyYgb3BlcmF0b3I9KGNv bnN0IElOVEZfUkVQT1MmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0 dXJuICp0aGlzOyB9IHZpcnR1YWwgfklOVEZfUkVQT1MoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgp OyBzdGF0aWMgSU5URl9SRVBPUyogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3Qg SU5URl9SRVBPUyogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIElO VEZfUkVQT1MqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0g dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBF eGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNl cHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6 IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3Qg Y2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBCQURfQ09OVEVYVCA6IHB1YmxpYyBT eXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBCQURfQ09OVEVYVChVTG9uZyBtaW5vciA9 IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4 Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9B bnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEJB RF9DT05URVhUKGNvbnN0IEJBRF9DT05URVhUJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9 IGlubGluZSBCQURfQ09OVEVYVCYgb3BlcmF0b3I9KGNvbnN0IEJBRF9DT05URVhUJiBleCkgeyBT eXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5C QURfQ09OVEVYVCgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBCQURfQ09OVEVYVCog X2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQkFEX0NPTlRFWFQqIF9kb3duY2Fz dChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBCQURfQ09OVEVYVCogX25hcnJvdyhF eGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhj ZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0 aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24q IF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkg Y29uc3Q7IH07IGNsYXNzIE9CSl9BREFQVEVSIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1 YmxpYzogaW5saW5lIE9CSl9BREFQVEVSKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0YXR1 cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwgY29t cGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0Fu eUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgT0JKX0FEQVBURVIoY29uc3QgT0JK X0FEQVBURVImIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIE9CSl9BREFQVEVS JiBvcGVyYXRvcj0oY29uc3QgT0JKX0FEQVBURVImIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3Bl cmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfk9CSl9BREFQVEVSKCk7IHZpcnR1 YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIE9CSl9BREFQVEVSKiBfZG93bmNhc3QoRXhjZXB0aW9u Kik7IHN0YXRpYyBjb25zdCBPQkpfQURBUFRFUiogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiop OyBzdGF0aWMgaW5saW5lIE9CSl9BREFQVEVSKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1 cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNp emUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRU b0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRU b0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNv bnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgREFU QV9DT05WRVJTSU9OIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIERB VEFfQ09OVkVSU0lPTihVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVk ID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBw ZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGlu c2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIERBVEFfQ09OVkVSU0lPTihjb25zdCBEQVRBX0NPTlZF UlNJT04mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIERBVEFfQ09OVkVSU0lP TiYgb3BlcmF0b3I9KGNvbnN0IERBVEFfQ09OVkVSU0lPTiYgZXgpIHsgU3lzdGVtRXhjZXB0aW9u OjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+REFUQV9DT05WRVJTSU9O KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIERBVEFfQ09OVkVSU0lPTiogX2Rvd25j YXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgREFUQV9DT05WRVJTSU9OKiBfZG93bmNhc3Qo Y29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgREFUQV9DT05WRVJTSU9OKiBfbmFycm93 KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRF eGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNl cHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlv biogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQo KSBjb25zdDsgfTsgY2xhc3MgVFJBTlNBQ1RJT05fUkVRVUlSRUQgOiBwdWJsaWMgU3lzdGVtRXhj ZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgVFJBTlNBQ1RJT05fUkVRVUlSRUQoVUxvbmcgbWlub3Ig PSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1F eGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRv QW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBU UkFOU0FDVElPTl9SRVFVSVJFRChjb25zdCBUUkFOU0FDVElPTl9SRVFVSVJFRCYgZXgpIDogU3lz dGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgVFJBTlNBQ1RJT05fUkVRVUlSRUQmIG9wZXJhdG9y PShjb25zdCBUUkFOU0FDVElPTl9SRVFVSVJFRCYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVy YXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+VFJBTlNBQ1RJT05fUkVRVUlSRUQo KTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgVFJBTlNBQ1RJT05fUkVRVUlSRUQqIF9k b3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IFRSQU5TQUNUSU9OX1JFUVVJUkVEKiBf ZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgVFJBTlNBQ1RJT05fUkVR VUlSRUQqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmly dHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNl cHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRp b246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZp cnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBUUkFOU0FDVElPTl9ST0xMRURCQUNLIDog cHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFRSQU5TQUNUSU9OX1JPTExF REJBQ0soVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBM RVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0 VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0Fu eUZuTkNQOyB9IGlubGluZSBUUkFOU0FDVElPTl9ST0xMRURCQUNLKGNvbnN0IFRSQU5TQUNUSU9O X1JPTExFREJBQ0smIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIFRSQU5TQUNU SU9OX1JPTExFREJBQ0smIG9wZXJhdG9yPShjb25zdCBUUkFOU0FDVElPTl9ST0xMRURCQUNLJiBl eCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0 dWFsIH5UUkFOU0FDVElPTl9ST0xMRURCQUNLKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3Rh dGljIFRSQU5TQUNUSU9OX1JPTExFREJBQ0sqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGlj IGNvbnN0IFRSQU5TQUNUSU9OX1JPTExFREJBQ0sqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24q KTsgc3RhdGljIGlubGluZSBUUkFOU0FDVElPTl9ST0xMRURCQUNLKiBfbmFycm93KEV4Y2VwdGlv biogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3Jl cG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25U b0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0Fu eU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg fTsgY2xhc3MgSU5WQUxJRF9UUkFOU0FDVElPTiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBw dWJsaWM6IGlubGluZSBJTlZBTElEX1RSQU5TQUNUSU9OKFVMb25nIG1pbm9yID0gMCwgQ29tcGxl dGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uICht aW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9p bnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSU5WQUxJRF9UUkFO U0FDVElPTihjb25zdCBJTlZBTElEX1RSQU5TQUNUSU9OJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24o ZXgpIHt9IGlubGluZSBJTlZBTElEX1RSQU5TQUNUSU9OJiBvcGVyYXRvcj0oY29uc3QgSU5WQUxJ RF9UUkFOU0FDVElPTiYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1 cm4gKnRoaXM7IH0gdmlydHVhbCB+SU5WQUxJRF9UUkFOU0FDVElPTigpOyB2aXJ0dWFsIHZvaWQg X3JhaXNlKCk7IHN0YXRpYyBJTlZBTElEX1RSQU5TQUNUSU9OKiBfZG93bmNhc3QoRXhjZXB0aW9u Kik7IHN0YXRpYyBjb25zdCBJTlZBTElEX1RSQU5TQUNUSU9OKiBfZG93bmNhc3QoY29uc3QgRXhj ZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSU5WQUxJRF9UUkFOU0FDVElPTiogX25hcnJvdyhFeGNl cHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9u VG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9O UF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29u c3Q7IH07IGNsYXNzIFdST05HX1RSQU5TQUNUSU9OIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7 IHB1YmxpYzogaW5saW5lIFdST05HX1RSQU5TQUNUSU9OKFVMb25nIG1pbm9yID0gMCwgQ29tcGxl dGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uICht aW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9p bnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgV1JPTkdfVFJBTlNB Q1RJT04oY29uc3QgV1JPTkdfVFJBTlNBQ1RJT04mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkg e30gaW5saW5lIFdST05HX1RSQU5TQUNUSU9OJiBvcGVyYXRvcj0oY29uc3QgV1JPTkdfVFJBTlNB Q1RJT04mIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlz OyB9IHZpcnR1YWwgfldST05HX1RSQU5TQUNUSU9OKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsg c3RhdGljIFdST05HX1RSQU5TQUNUSU9OKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBj b25zdCBXUk9OR19UUkFOU0FDVElPTiogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0 aWMgaW5saW5lIFdST05HX1RSQU5TQUNUSU9OKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1 cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNp emUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRU b0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRU b0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNv bnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsKIyA5NDggIi4u Ly4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIKICBjbGFzcyBVc2VyRXhjZXB0aW9u IDogcHVibGljIEV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCB+VXNlckV4Y2VwdGlv bigpOwogICAgc3RhdGljIFVzZXJFeGNlcHRpb24qIF9kb3duY2FzdChFeGNlcHRpb24qIGUpOwog ICAgc3RhdGljIGNvbnN0IFVzZXJFeGNlcHRpb24qIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24q IGUpOwogICAgc3RhdGljIGlubGluZSBVc2VyRXhjZXB0aW9uKiBfbmFycm93KEV4Y2VwdGlvbiog ZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9CgogIHByb3RlY3RlZDoKICAgIGlubGluZSBVc2Vy RXhjZXB0aW9uKCkge30KCgoKCgogICAgaW5saW5lIFVzZXJFeGNlcHRpb24oY29uc3QgVXNlckV4 Y2VwdGlvbiYgZXgpIDogRXhjZXB0aW9uKGV4KSB7fQoKICBwdWJsaWM6CiAgICBVc2VyRXhjZXB0 aW9uJiBvcGVyYXRvcj0oY29uc3QgVXNlckV4Y2VwdGlvbiYgZXgpIHsKICAgICAgRXhjZXB0aW9u OjpvcGVyYXRvcj0oZXgpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgfTsKCgoKCgoKICBj bGFzcyBVbmtub3duVXNlckV4Y2VwdGlvbiA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsKICBwdWJs aWM6CiAgICB2aXJ0dWFsIH5Vbmtub3duVXNlckV4Y2VwdGlvbigpOwoKICAgIFVua25vd25Vc2Vy RXhjZXB0aW9uKEFueSogZXgpOwoKCiAgICBpbmxpbmUgVW5rbm93blVzZXJFeGNlcHRpb24oY29u c3QgVW5rbm93blVzZXJFeGNlcHRpb24mIGV4KQogICAgICA6IFVzZXJFeGNlcHRpb24oZXgpIHsK ICAgICAgcGRfZXhjZXB0aW9uID0gbmV3IEFueSgqZXgucGRfZXhjZXB0aW9uKTsKICAgIH0KICAg IFVua25vd25Vc2VyRXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgVW5rbm93blVzZXJFeGNlcHRp b24mIGV4KSB7CiAgICAgIFVzZXJFeGNlcHRpb246Om9wZXJhdG9yPShleCk7CiAgICAgIGlmIChw ZF9leGNlcHRpb24pIGRlbGV0ZSBwZF9leGNlcHRpb247CiAgICAgIHBkX2V4Y2VwdGlvbiA9IG5l dyBBbnkoKmV4LnBkX2V4Y2VwdGlvbik7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBB bnkmIGV4Y2VwdGlvbigpOwoKICAgIHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsKICAgIHN0YXRpYyBV bmtub3duVXNlckV4Y2VwdGlvbiogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOwogICAgc3RhdGljIGNv bnN0IFVua25vd25Vc2VyRXhjZXB0aW9uKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7CiAg ICBzdGF0aWMgaW5saW5lIFVua25vd25Vc2VyRXhjZXB0aW9uKiBfbmFycm93KEV4Y2VwdGlvbiog ZSkgewogICAgICByZXR1cm4gX2Rvd25jYXN0KGUpOwogICAgfQoKICAgIHN0YXRpYyBFeGNlcHRp b246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47CiAgICBzdGF0aWMgRXhjZXB0 aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOwoKICBwcml2YXRl OgogICAgdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsKICAgIHZpcnR1 YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OwogICAgdmlydHVhbCBjb25zdCBjaGFy KiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgX05QX21hcnNo YWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hh bChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwoKICAgIEFueSogcGRfZXhjZXB0aW9uOwogIH07 CgoKCgoKCiAgY2xhc3MgV3JvbmdUcmFuc2FjdGlvbiA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsg cHVibGljOiBpbmxpbmUgV3JvbmdUcmFuc2FjdGlvbigpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGlu c2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlu bGluZSBXcm9uZ1RyYW5zYWN0aW9uKGNvbnN0IFdyb25nVHJhbnNhY3Rpb24mIF9leCkgOiBVc2Vy RXhjZXB0aW9uKF9leCkge30gaW5saW5lIFdyb25nVHJhbnNhY3Rpb24mIG9wZXJhdG9yPShjb25z dCBXcm9uZ1RyYW5zYWN0aW9uJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7 IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5Xcm9uZ1RyYW5zYWN0aW9uKCk7IHZpcnR1YWwgdm9p ZCBfcmFpc2UoKTsgc3RhdGljIFdyb25nVHJhbnNhY3Rpb24qIF9kb3duY2FzdChFeGNlcHRpb24q KTsgc3RhdGljIGNvbnN0IFdyb25nVHJhbnNhY3Rpb24qIF9kb3duY2FzdChjb25zdCBFeGNlcHRp b24qKTsgc3RhdGljIGlubGluZSBXcm9uZ1RyYW5zYWN0aW9uKiBfbmFycm93KEV4Y2VwdGlvbiog X2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVk U2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9y Pj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0o TWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRC dWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3Ry ZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRp YyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3Qg Y2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNh dGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1 YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9t YXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CgoKCgoKCiAgY2xhc3MgRW52aXJv bm1lbnQ7CiAgdHlwZWRlZiBFbnZpcm9ubWVudCogRW52aXJvbm1lbnRfcHRyOwogIHR5cGVkZWYg RW52aXJvbm1lbnRfcHRyIEVudmlyb25tZW50UmVmOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09i al9WYXI8RW52aXJvbm1lbnQ+IEVudmlyb25tZW50X3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1 ZG9PYmpfT3V0PEVudmlyb25tZW50LEVudmlyb25tZW50X3Zhcj4gRW52aXJvbm1lbnRfb3V0OwoK ICBjbGFzcyBFbnZpcm9ubWVudCB7CiAgcHVibGljOgogICAgRW52aXJvbm1lbnQoKTsKCiAgICB2 aXJ0dWFsIH5FbnZpcm9ubWVudCgpOwoKICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb24oRXhjZXB0 aW9uKik7CiAgICB2aXJ0dWFsIEV4Y2VwdGlvbiogZXhjZXB0aW9uKCkgY29uc3Q7CiAgICB2aXJ0 dWFsIHZvaWQgY2xlYXIoKTsKCiAgICB2aXJ0dWFsIEJvb2xlYW4gTlBfaXNfbmlsKCkgY29uc3Q7 CiAgICB2aXJ0dWFsIEVudmlyb25tZW50X3B0ciBOUF9kdXBsaWNhdGUoKTsKCiAgICBzdGF0aWMg RW52aXJvbm1lbnRfcHRyIF9kdXBsaWNhdGUoRW52aXJvbm1lbnRfcHRyKTsKICAgIHN0YXRpYyBF bnZpcm9ubWVudF9wdHIgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4g UFJfaXNfdmFsaWQoRW52aXJvbm1lbnRfcHRyIHAgKSB7CiAgICAgIHJldHVybiAoKHApID8gKHAt PnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBfQ09S QkFfVUxvbmcgUFJfbWFnaWM7CgogIHByaXZhdGU6CiAgICBDT1JCQTo6RXhjZXB0aW9uKiBwZF9l eGNlcHRpb247CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CgogICAgRW52aXJvbm1lbnQoY29u c3QgRW52aXJvbm1lbnQmKTsKICAgIEVudmlyb25tZW50JiBvcGVyYXRvcj0oY29uc3QgRW52aXJv bm1lbnQmKTsKCiAgcHVibGljOgogICAgQ09SQkE6OkJvb2xlYW4gcGRfaXNfcHNldWRvOwogIH07 CgoKCgoKCiAgZW51bSBfRmxhZ3MgewogICAgQVJHX0lOID0gMHgxLAogICAgQVJHX09VVCA9IDB4 MiwKICAgIEFSR19JTk9VVCA9IDB4NCwKICAgIENUWF9SRVNUUklDVF9TQ09QRSA9IDB4OCwKICAg IE9VVF9MSVNUX01FTU9SWSA9IDB4MTAsCiAgICBJTl9DT1BZX1ZBTFVFID0gMHgyMAogIH07Cgog IHR5cGVkZWYgVUxvbmcgRmxhZ3M7CgogIGNsYXNzIE5hbWVkVmFsdWU7CiAgdHlwZWRlZiBOYW1l ZFZhbHVlKiBOYW1lZFZhbHVlX3B0cjsKICB0eXBlZGVmIE5hbWVkVmFsdWVfcHRyIE5hbWVkVmFs dWVSZWY7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxOYW1lZFZhbHVlPiBOYW1lZFZh bHVlX3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0PE5hbWVkVmFsdWUsTmFtZWRW YWx1ZV92YXI+IE5hbWVkVmFsdWVfb3V0OwoKICBjbGFzcyBOYW1lZFZhbHVlIHsKICBwdWJsaWM6 CiAgICB2aXJ0dWFsIH5OYW1lZFZhbHVlKCk7CgogICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1l KCkgY29uc3QgPSAwOwoKCiAgICB2aXJ0dWFsIEFueSogdmFsdWUoKSBjb25zdCA9IDA7CgoKICAg IHZpcnR1YWwgRmxhZ3MgZmxhZ3MoKSBjb25zdCA9IDA7CgogICAgdmlydHVhbCBCb29sZWFuIE5Q X2lzX25pbCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgTmFtZWRWYWx1ZV9wdHIgTlBfZHVwbGlj YXRlKCkgPSAwOwoKICAgIHN0YXRpYyBOYW1lZFZhbHVlX3B0ciBfZHVwbGljYXRlKE5hbWVkVmFs dWVfcHRyKTsKICAgIHN0YXRpYyBOYW1lZFZhbHVlX3B0ciBfbmlsKCk7CgogICAgc3RhdGljIGlu bGluZSBfQ09SQkFfQm9vbGVhbiBQUl9pc192YWxpZChOYW1lZFZhbHVlX3B0ciBwICkgewogICAg ICByZXR1cm4gKChwKSA/IChwLT5wZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KCiAg ICBzdGF0aWMgY29uc3QgX0NPUkJBX1VMb25nIFBSX21hZ2ljOwoKICBwcm90ZWN0ZWQ6CiAgICBO YW1lZFZhbHVlKCkgeyBwZF9tYWdpYyA9IFBSX21hZ2ljOyB9CgogIHByaXZhdGU6CiAgICBfQ09S QkFfVUxvbmcgcGRfbWFnaWM7CgogICAgTmFtZWRWYWx1ZShjb25zdCBOYW1lZFZhbHVlJik7CiAg ICBOYW1lZFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgTmFtZWRWYWx1ZSYpOwogIH07CgoKCgoKCiAg Y2xhc3MgTlZMaXN0OwogIHR5cGVkZWYgTlZMaXN0KiBOVkxpc3RfcHRyOwogIHR5cGVkZWYgTlZM aXN0X3B0ciBOVkxpc3RSZWY7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxOVkxpc3Q+ IE5WTGlzdF92YXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX091dDxOVkxpc3QsTlZMaXN0 X3Zhcj4gTlZMaXN0X291dDsKCiAgY2xhc3MgTlZMaXN0IHsKICBwdWJsaWM6CiAgICB2aXJ0dWFs IH5OVkxpc3QoKTsKCiAgICB2aXJ0dWFsIFVMb25nIGNvdW50KCkgY29uc3QgPSAwOwogICAgdmly dHVhbCBOYW1lZFZhbHVlX3B0ciBhZGQoRmxhZ3MpID0gMDsKICAgIHZpcnR1YWwgTmFtZWRWYWx1 ZV9wdHIgYWRkX2l0ZW0oY29uc3QgY2hhciosIEZsYWdzKSA9IDA7CiAgICB2aXJ0dWFsIE5hbWVk VmFsdWVfcHRyIGFkZF92YWx1ZShjb25zdCBjaGFyKiwgY29uc3QgQW55JiwgRmxhZ3MpID0gMDsK ICAgIHZpcnR1YWwgTmFtZWRWYWx1ZV9wdHIgYWRkX2l0ZW1fY29uc3VtZShjaGFyKixGbGFncykg PSAwOwogICAgdmlydHVhbCBOYW1lZFZhbHVlX3B0ciBhZGRfdmFsdWVfY29uc3VtZShjaGFyKiwg QW55KiwgRmxhZ3MpID0gMDsKICAgIHZpcnR1YWwgTmFtZWRWYWx1ZV9wdHIgaXRlbShVTG9uZyBp bmRleCkgPSAwOwogICAgdmlydHVhbCBTdGF0dXMgcmVtb3ZlIChVTG9uZykgPSAwOwoKICAgIHZp cnR1YWwgQm9vbGVhbiBOUF9pc19uaWwoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIE5WTGlzdF9w dHIgTlBfZHVwbGljYXRlKCkgPSAwOwoKICAgIHN0YXRpYyBOVkxpc3RfcHRyIF9kdXBsaWNhdGUo TlZMaXN0X3B0cik7CiAgICBzdGF0aWMgTlZMaXN0X3B0ciBfbmlsKCk7CgoKCiAgICBjbGFzcyBC b3VuZHMgOiBwdWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEJvdW5kcygpIHsg cGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBp bnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCb3VuZHMoY29uc3QgQm91bmRzJiBfZXgpIDogVXNl ckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBCb3VuZHMmIG9wZXJhdG9yPShjb25zdCBCb3VuZHMm IF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZp cnR1YWwgfkJvdW5kcygpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBCb3VuZHMqIF9k b3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJvdW5kcyogX2Rvd25jYXN0KGNvbnN0 IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEJvdW5kcyogX25hcnJvdyhFeGNlcHRpb24qIF9l eCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNp emUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+ PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVm ZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVh bSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMg aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNo YXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRl KCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFy c2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwoKICAgIHN0YXRpYyBpbmxpbmUgX0NP UkJBX0Jvb2xlYW4gUFJfaXNfdmFsaWQoTlZMaXN0X3B0ciBwICkgewogICAgICByZXR1cm4gKChw KSA/IChwLT5wZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KCiAgICBzdGF0aWMgY29u c3QgX0NPUkJBX1VMb25nIFBSX21hZ2ljOwoKICBwcm90ZWN0ZWQ6CiAgICBOVkxpc3QoKSB7IHBk X21hZ2ljID0gUFJfbWFnaWM7IH0KCiAgcHJpdmF0ZToKICAgIF9DT1JCQV9VTG9uZyBwZF9tYWdp YzsKCiAgICBOVkxpc3QoY29uc3QgTlZMaXN0JiBudmwpOwogICAgTlZMaXN0JiBvcGVyYXRvcj0o Y29uc3QgTlZMaXN0Jik7CiAgfTsKCgoKCgoKICBjbGFzcyBDb250ZXh0OwogIHR5cGVkZWYgQ29u dGV4dCogQ29udGV4dF9wdHI7CiAgdHlwZWRlZiBDb250ZXh0X3B0ciBDb250ZXh0UmVmOwogIHR5 cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8Q29udGV4dD4gQ29udGV4dF92YXI7CiAgdHlwZWRl ZiBfQ09SQkFfUHNldWRvT2JqX091dDxDb250ZXh0LENvbnRleHRfdmFyPiBDb250ZXh0X291dDsK CiAgY2xhc3MgQ29udGV4dCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+Q29udGV4dCgpOwoKICAg IHZpcnR1YWwgY29uc3QgY2hhciogY29udGV4dF9uYW1lKCkgY29uc3QgPSAwOwogICAgdmlydHVh bCBDT1JCQTo6Q29udGV4dF9wdHIgcGFyZW50KCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBDT1JC QTo6U3RhdHVzIGNyZWF0ZV9jaGlsZChjb25zdCBjaGFyKiwgQ29udGV4dF9vdXQpID0gMDsKICAg IHZpcnR1YWwgQ09SQkE6OlN0YXR1cyBzZXRfb25lX3ZhbHVlKGNvbnN0IGNoYXIqLCBjb25zdCBB bnkmKSA9IDA7CiAgICB2aXJ0dWFsIENPUkJBOjpTdGF0dXMgc2V0X3ZhbHVlcyhDT1JCQTo6TlZM aXN0X3B0cikgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6U3RhdHVzIGRlbGV0ZV92YWx1ZXMoY29u c3QgY2hhciopID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6OlN0YXR1cyBnZXRfdmFsdWVzKGNvbnN0 IGNoYXIqIHN0YXJ0X3Njb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Q09SQkE6OkZsYWdzIG9wX2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgY2hhciogcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIENPUkJBOjpOVkxpc3Rfb3V0IHZhbHVlcykgPSAwOwoKCgogICAgdmlydHVhbCBCb29sZWFu IE5QX2lzX25pbCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6OkNvbnRleHRfcHRyIE5Q X2R1cGxpY2F0ZSgpID0gMDsKCiAgICBzdGF0aWMgQ29udGV4dF9wdHIgX2R1cGxpY2F0ZShDb250 ZXh0X3B0cik7CiAgICBzdGF0aWMgQ29udGV4dF9wdHIgX25pbCgpOwoKCiAgICBzdGF0aWMgc2l6 ZV90IF9OUF9hbGlnbmVkU2l6ZShDb250ZXh0X3B0ciBjdHh0LCBjb25zdCBjaGFyKmNvbnN0KiB3 aGljaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaGxlbiwgc2l6 ZV90IGluaXRpYWxvZmZzZXQpOwogICAgc3RhdGljIHZvaWQgbWFyc2hhbENvbnRleHQoQ29udGV4 dF9wdHIgY3R4dCwgY29uc3QgY2hhcipjb25zdCogd2hpY2gsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBpbnQgd2hpY2hsZW4sIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgIHN0YXRp YyB2b2lkIG1hcnNoYWxDb250ZXh0KENvbnRleHRfcHRyIGN0eHQsIGNvbnN0IGNoYXIqY29uc3Qq IHdoaWNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNobGVuLCBNZW1C dWZmZXJlZFN0cmVhbSYgcyk7CiAgICBzdGF0aWMgQ29udGV4dF9wdHIgdW5tYXJzaGFsQ29udGV4 dChOZXRCdWZmZXJlZFN0cmVhbSYgcyk7CiAgICBzdGF0aWMgQ29udGV4dF9wdHIgdW5tYXJzaGFs Q29udGV4dChNZW1CdWZmZXJlZFN0cmVhbSYgcyk7CgogICAgc3RhdGljIGlubGluZSBfQ09SQkFf Qm9vbGVhbiBQUl9pc192YWxpZChDb250ZXh0X3B0ciBwICkgewogICAgICByZXR1cm4gKChwKSA/ IChwLT5wZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KCiAgICBzdGF0aWMgY29uc3Qg X0NPUkJBX1VMb25nIFBSX21hZ2ljOwoKICBwcm90ZWN0ZWQ6CiAgICBDb250ZXh0KCkgeyBwZF9t YWdpYyA9IFBSX21hZ2ljOyB9CgogIHByaXZhdGU6CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7 CgogICAgQ29udGV4dChjb25zdCBDb250ZXh0Jik7CiAgICBDb250ZXh0JiBvcGVyYXRvcj0oY29u c3QgQ29udGV4dCYpOwogIH07CgoKCgoKCiAgY2xhc3MgQ29udGV4dExpc3Q7CiAgdHlwZWRlZiBD b250ZXh0TGlzdCogQ29udGV4dExpc3RfcHRyOwogIHR5cGVkZWYgQ29udGV4dExpc3RfcHRyIENv bnRleHRMaXN0UmVmOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8Q29udGV4dExpc3Q+ IENvbnRleHRMaXN0X3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0PENvbnRleHRM aXN0LENvbnRleHRMaXN0X3Zhcj4gQ29udGV4dExpc3Rfb3V0OwoKICBjbGFzcyBDb250ZXh0TGlz dCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+Q29udGV4dExpc3QoKTsKCiAgICB2aXJ0dWFsIFVM b25nIGNvdW50KCkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIGFkZChjb25zdCBjaGFyKiBj dHh0KSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgYWRkX2NvbnN1bWUoY2hhciogY3R4dCkgPSAwOwoK CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGl0ZW0oVUxvbmcgaW5kZXgpID0gMDsKCgogICAgdmly dHVhbCBTdGF0dXMgcmVtb3ZlKFVMb25nIGluZGV4KSA9IDA7CgogICAgdmlydHVhbCBCb29sZWFu IE5QX2lzX25pbCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgQ29udGV4dExpc3RfcHRyIE5QX2R1 cGxpY2F0ZSgpID0gMDsKCiAgICBzdGF0aWMgQ29udGV4dExpc3RfcHRyIF9kdXBsaWNhdGUoQ29u dGV4dExpc3RfcHRyKTsKICAgIHN0YXRpYyBDb250ZXh0TGlzdF9wdHIgX25pbCgpOwoKCgogICAg Y2xhc3MgQm91bmRzIDogcHVibGljIFVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBCb3Vu ZHMoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZu TkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgQm91bmRzKGNvbnN0IEJvdW5kcyYgX2V4 KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgQm91bmRzJiBvcGVyYXRvcj0oY29uc3Qg Qm91bmRzJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhp czsgfSB2aXJ0dWFsIH5Cb3VuZHMoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgQm91 bmRzKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBCb3VuZHMqIF9kb3duY2Fz dChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBCb3VuZHMqIF9uYXJyb3coRXhjZXB0 aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2Fs aWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3Bl cmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRv cj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVy ZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsg c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBj b25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwg dm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKCiAgICBzdGF0aWMgaW5s aW5lIF9DT1JCQV9Cb29sZWFuIFBSX2lzX3ZhbGlkKENvbnRleHRMaXN0X3B0ciBwICkgewogICAg ICByZXR1cm4gKChwKSA/IChwLT5wZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KCiAg ICBzdGF0aWMgY29uc3QgX0NPUkJBX1VMb25nIFBSX21hZ2ljOwoKICBwcm90ZWN0ZWQ6CiAgICBD b250ZXh0TGlzdCgpIHsgcGRfbWFnaWMgPSBQUl9tYWdpYzsgfQoKICBwcml2YXRlOgogICAgX0NP UkJBX1VMb25nIHBkX21hZ2ljOwoKICAgIENvbnRleHRMaXN0KGNvbnN0IENvbnRleHRMaXN0Jik7 CiAgICBDb250ZXh0TGlzdCYgb3BlcmF0b3I9KGNvbnN0IENvbnRleHRMaXN0Jik7CiAgfTsKCgoK CgoKICBjbGFzcyBQcmluY2lwYWw7CiAgdHlwZWRlZiBQcmluY2lwYWwqIFByaW5jaXBhbF9wdHI7 CiAgdHlwZWRlZiBQcmluY2lwYWxfcHRyIFByaW5jaXBhbFJlZjsKCgoKICBjbGFzcyBQcmluY2lw YWxJRCA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCB7CiAgcHVibGlj OgogICAgaW5saW5lIFByaW5jaXBhbElEKCkge30KICAgIGlubGluZSBQcmluY2lwYWxJRChjb25z dCBQcmluY2lwYWxJRCYgc2VxKQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09j dGV0KHNlcSkge30KICAgIGlubGluZSBQcmluY2lwYWxJRChDT1JCQTo6VUxvbmcgbWF4KQogICAg ICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KG1heCkge30KICAgIGlubGluZSBQ cmluY2lwYWxJRChDT1JCQTo6VUxvbmcgbWF4LCBDT1JCQTo6VUxvbmcgbGVuLCBDT1JCQTo6T2N0 ZXQqIHZhbCwgQ09SQkE6OkJvb2xlYW4gcmVsPTApCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fT2N0ZXQobWF4LCBsZW4sIHZhbCwgcmVsKSB7fQogICAgaW5saW5lIFByaW5jaXBh bElEJiBvcGVyYXRvciA9IChjb25zdCBQcmluY2lwYWxJRCYgc2VxKSB7CiAgICAgIF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0OjpvcGVyYXRvcj0oc2VxKTsKICAgICAgcmV0dXJuICp0 aGlzOwogICAgfTsKICB9OwoKICBjbGFzcyBQcmluY2lwYWwgewogIHB1YmxpYzoKICAgIHN0YXRp YyBQcmluY2lwYWxfcHRyIF9kdXBsaWNhdGUoUHJpbmNpcGFsX3B0cik7CiAgICBzdGF0aWMgUHJp bmNpcGFsX3B0ciBfbmlsKCk7CiAgcHJpdmF0ZToKICAgIFByaW5jaXBhbCgpOwogIH07CgoKCgoK CiAgY2xhc3MgRXhjZXB0aW9uTGlzdDsKICB0eXBlZGVmIEV4Y2VwdGlvbkxpc3QqIEV4Y2VwdGlv bkxpc3RfcHRyOwogIHR5cGVkZWYgRXhjZXB0aW9uTGlzdF9wdHIgRXhjZXB0aW9uTGlzdFJlZjsK ICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPEV4Y2VwdGlvbkxpc3Q+IEV4Y2VwdGlvbkxp c3RfdmFyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RXhjZXB0aW9uTGlzdCxFeGNl cHRpb25MaXN0X3Zhcj4gRXhjZXB0aW9uTGlzdF9vdXQ7CgogIGNsYXNzIEV4Y2VwdGlvbkxpc3Qg ewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfkV4Y2VwdGlvbkxpc3QoKTsKCiAgICB2aXJ0dWFsIFVM b25nIGNvdW50KCkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIGFkZChUeXBlQ29kZV9wdHIg dGMpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBhZGRfY29uc3VtZShUeXBlQ29kZV9wdHIgdGMpID0g MDsKCgogICAgdmlydHVhbCBUeXBlQ29kZV9wdHIgaXRlbShVTG9uZyBpbmRleCkgPSAwOwoKCiAg ICB2aXJ0dWFsIFN0YXR1cyByZW1vdmUoVUxvbmcgaW5kZXgpID0gMDsKCiAgICB2aXJ0dWFsIEJv b2xlYW4gTlBfaXNfbmlsKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBFeGNlcHRpb25MaXN0X3B0 ciBOUF9kdXBsaWNhdGUoKSA9IDA7CgogICAgc3RhdGljIEV4Y2VwdGlvbkxpc3RfcHRyIF9kdXBs aWNhdGUoRXhjZXB0aW9uTGlzdF9wdHIpOwogICAgc3RhdGljIEV4Y2VwdGlvbkxpc3RfcHRyIF9u aWwoKTsKCgoKICAgIGNsYXNzIEJvdW5kcyA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGlj OiBpbmxpbmUgQm91bmRzKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRf aW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEJvdW5kcyhjb25z dCBCb3VuZHMmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEJvdW5kcyYgb3Bl cmF0b3I9KGNvbnN0IEJvdW5kcyYgX2V4KSB7ICogKFVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4 OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+Qm91bmRzKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2Uo KTsgc3RhdGljIEJvdW5kcyogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQm91 bmRzKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQm91bmRzKiBf bmFycm93KEV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUg c2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlu bGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5l IHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9p ZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9y PDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGlu c2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZu TkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNl cHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlw ZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNv bnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsg dmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07Cgog ICAgc3RhdGljIGlubGluZSBfQ09SQkFfQm9vbGVhbiBQUl9pc192YWxpZChFeGNlcHRpb25MaXN0 X3B0ciBwICkgewogICAgICByZXR1cm4gKChwKSA/IChwLT5wZF9tYWdpYyA9PSBQUl9tYWdpYykg OiAxKTsKICAgIH0KCiAgICBzdGF0aWMgY29uc3QgX0NPUkJBX1VMb25nIFBSX21hZ2ljOwoKICBw cm90ZWN0ZWQ6CiAgICBFeGNlcHRpb25MaXN0KCkgeyBwZF9tYWdpYyA9IFBSX21hZ2ljOyB9Cgog IHByaXZhdGU6CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CgogICAgRXhjZXB0aW9uTGlzdChj b25zdCBFeGNlcHRpb25MaXN0JiBlbCk7CiAgICBFeGNlcHRpb25MaXN0JiBvcGVyYXRvcj0oY29u c3QgRXhjZXB0aW9uTGlzdCYpOwogIH07CgoKCgoKCiAgY2xhc3MgVHlwZUNvZGVfdmFyOwoKICBj bGFzcyBUeXBlQ29kZV9tZW1iZXIgewogIHB1YmxpYzoKICAgIFR5cGVDb2RlX21lbWJlcigpOwog ICAgaW5saW5lIFR5cGVDb2RlX21lbWJlcihUeXBlQ29kZV9wdHIgcCkgOiBfcHRyKHApIHt9CiAg ICBUeXBlQ29kZV9tZW1iZXIoY29uc3QgVHlwZUNvZGVfbWVtYmVyJiBwKTsKICAgIH5UeXBlQ29k ZV9tZW1iZXIoKTsKCiAgICBUeXBlQ29kZV9tZW1iZXImIG9wZXJhdG9yPShUeXBlQ29kZV9wdHIg cCk7CiAgICBUeXBlQ29kZV9tZW1iZXImIG9wZXJhdG9yPShjb25zdCBUeXBlQ29kZV9tZW1iZXIm IHApOwogICAgVHlwZUNvZGVfbWVtYmVyJiBvcGVyYXRvcj0oY29uc3QgVHlwZUNvZGVfdmFyJiBw KTsKCiAgICBpbmxpbmUgVHlwZUNvZGVfcHRyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBf cHRyOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgVHlwZUNvZGVfcHRyKCkgY29uc3QgeyByZXR1cm4g X3B0cjsgfQoKICAgIFR5cGVDb2RlX3B0ciBfcHRyOwoKICAgIHZvaWQgb3BlcmF0b3I+Pj0oTmV0 QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRT dHJlYW0mKTsKICAgIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsK ICAgIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKTsKICAgIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90KSBjb25zdDsKICB9OwoKCgp9CgpuYW1lc3BhY2UgQ09SQkEKewoK CgoKCiMgMSAiLi4vb21uaU9SQjMvY29yYmFpZGxfZGVmcy5oaCIgMQoKCgoKCgoKY2xhc3MgSURM VHlwZTsKY2xhc3MgX29ianJlZl9JRExUeXBlOwpjbGFzcyBfaW1wbF9JRExUeXBlOwoKdHlwZWRl ZiBfb2JqcmVmX0lETFR5cGUqIElETFR5cGVfcHRyOwp0eXBlZGVmIElETFR5cGVfcHRyIElETFR5 cGVSZWY7CgpjbGFzcyBJRExUeXBlX0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIElETFR5cGVf cHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JC QV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90 eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90 IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBl IHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNo YWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5 cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JC QV9PYmpSZWZfVmFyPF9vYmpyZWZfSURMVHlwZSwgSURMVHlwZV9IZWxwZXI+IElETFR5cGVfdmFy Owp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0lETFR5cGUsSURMVHlwZV9I ZWxwZXIgPiBJRExUeXBlX291dDsKCgoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIg X3RjX0lkZW50aWZpZXI7Cgp0eXBlZGVmIGNoYXIqIElkZW50aWZpZXI7CnR5cGVkZWYgQ09SQkE6 OlN0cmluZ192YXIgSWRlbnRpZmllcl92YXI7CgpzdHJ1Y3QgU3RydWN0TWVtYmVyIHsKICB0eXBl ZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxTdHJ1Y3RNZW1iZXI+IF92YXJfdHlw ZTsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgbmFtZTsKCiAgQ09SQkE6OlR5cGVDb2RlX21lbWJl ciB0eXBlOwoKICBfQ09SQkFfT2JqUmVmX01lbWJlcjwgX29ianJlZl9JRExUeXBlLCBJRExUeXBl X0hlbHBlcj4gdHlwZV9kZWY7CgogIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRp YWxvZmZzZXQpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYp IGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogIHZvaWQg b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8 PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpOwp9OwoKdHlwZWRlZiBTdHJ1Y3RNZW1iZXI6Ol92YXJf dHlwZSBTdHJ1Y3RNZW1iZXJfdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJs ZV9PVVRfYXJnPCBTdHJ1Y3RNZW1iZXIsU3RydWN0TWVtYmVyX3ZhciA+IFN0cnVjdE1lbWJlcl9v dXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfU3RydWN0TWVtYmVyOwoK ZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1N0cnVjdE1lbWJlclNlcTsKCmNs YXNzIFN0cnVjdE1lbWJlclNlcV92YXI7CgpjbGFzcyBTdHJ1Y3RNZW1iZXJTZXEgOiBwdWJsaWMg X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgU3RydWN0TWVtYmVyPiB7CnB1YmxpYzoKICB0eXBl ZGVmIFN0cnVjdE1lbWJlclNlcV92YXIgX3Zhcl90eXBlOwogIGlubGluZSBTdHJ1Y3RNZW1iZXJT ZXEoKSB7fQogIGlubGluZSBTdHJ1Y3RNZW1iZXJTZXEoY29uc3QgU3RydWN0TWVtYmVyU2VxJiBz KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBTdHJ1Y3RNZW1iZXI+IChzKSB7fQoK ICBpbmxpbmUgU3RydWN0TWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlPCBTdHJ1Y3RNZW1iZXI+IChfbWF4KSB7fQogIGlubGluZSBTdHJ1 Y3RNZW1iZXJTZXEoX0NPUkJBX1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVuLCBTdHJ1Y3RN ZW1iZXIqIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZTwgU3RydWN0TWVtYmVyPiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KCiAg aW5saW5lIFN0cnVjdE1lbWJlclNlcSYgb3BlcmF0b3IgPSAoY29uc3QgU3RydWN0TWVtYmVyU2Vx JiBzKSB7CiAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBTdHJ1Y3RNZW1iZXI+IDo6b3Bl cmF0b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIFN0cnVjdE1lbWJlclNl cV9vdXQ7CgpjbGFzcyBTdHJ1Y3RNZW1iZXJTZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgU3Ry dWN0TWVtYmVyU2VxIFQ7CiAgdHlwZWRlZiBTdHJ1Y3RNZW1iZXJTZXFfdmFyIFRfdmFyOwoKICBp bmxpbmUgU3RydWN0TWVtYmVyU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBTdHJ1 Y3RNZW1iZXJTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBTdHJ1Y3RNZW1i ZXJTZXFfdmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgX3BkX3NlcSA9 IG5ldyBUKCpzLl9wZF9zZXEpOwogICAgZWxzZSBfcGRfc2VxID0gMDsKICB9CiAgaW5saW5lIH5T dHJ1Y3RNZW1iZXJTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9Cgog IGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxl dGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxp bmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2Vx ICkgewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2Vx ID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9w ZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAg aW5saW5lIFN0cnVjdE1lbWJlciYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICBy ZXR1cm4gKCpfcGRfc2VxKVtzXTsKICB9CgogIGlubGluZSBUKiBvcGVyYXRvciAtPiAoKSB7IHJl dHVybiBfcGRfc2VxOyB9CgoKCiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsg cmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpfcGRf c2VxOyB9CgoKICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsg fQogIGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQqJiBv dXQoKSB7CiAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9 CiAgICByZXR1cm4gX3BkX3NlcTsKICB9CiAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBf cGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICBmcmllbmQgY2xhc3MgU3RydWN0 TWVtYmVyU2VxX291dDsKCnByaXZhdGU6CiAgVCogX3BkX3NlcTsKfTsKCmNsYXNzIFN0cnVjdE1l bWJlclNlcV9vdXQgewpwdWJsaWM6CiAgdHlwZWRlZiBTdHJ1Y3RNZW1iZXJTZXEgVDsKICB0eXBl ZGVmIFN0cnVjdE1lbWJlclNlcV92YXIgVF92YXI7CgogIGlubGluZSBTdHJ1Y3RNZW1iZXJTZXFf b3V0KFQqJiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIFN0cnVjdE1lbWJl clNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9 CiAgaW5saW5lIFN0cnVjdE1lbWJlclNlcV9vdXQoY29uc3QgU3RydWN0TWVtYmVyU2VxX291dCYg cykgOiBfZGF0YShzLl9kYXRhKSB7fQogIGlubGluZSBTdHJ1Y3RNZW1iZXJTZXFfb3V0JiBvcGVy YXRvciA9IChjb25zdCBTdHJ1Y3RNZW1iZXJTZXFfb3V0JiBzKSB7CiAgICBfZGF0YSA9IHMuX2Rh dGE7CiAgICByZXR1cm4gKnRoaXM7CiAgfSBpbmxpbmUgU3RydWN0TWVtYmVyU2VxX291dCYgb3Bl cmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBp bmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigp IHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0 YTsgfQoKICBpbmxpbmUgU3RydWN0TWVtYmVyJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkp IHsKICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAg U3RydWN0TWVtYmVyU2VxX291dCgpOwogIFN0cnVjdE1lbWJlclNlcV9vdXQmIG9wZXJhdG9yPShj b25zdCBUX3ZhciYpOwp9OwoKc3RydWN0IFVuaW9uTWVtYmVyIHsKICB0eXBlZGVmIF9DT1JCQV9D b25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxVbmlvbk1lbWJlcj4gX3Zhcl90eXBlOwoKICBDT1JCQTo6 U3RyaW5nX21lbWJlciBuYW1lOwoKICBDT1JCQTo6QW55IGxhYmVsOwoKICBDT1JCQTo6VHlwZUNv ZGVfbWVtYmVyIHR5cGU7CgogIF9DT1JCQV9PYmpSZWZfTWVtYmVyPCBfb2JqcmVmX0lETFR5cGUs IElETFR5cGVfSGVscGVyPiB0eXBlX2RlZjsKCiAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXpl X3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRT dHJlYW0gJikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7 CiAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgdm9pZCBv cGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJik7Cn07Cgp0eXBlZGVmIFVuaW9uTWVtYmVy OjpfdmFyX3R5cGUgVW5pb25NZW1iZXJfdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9W YXJpYWJsZV9PVVRfYXJnPCBVbmlvbk1lbWJlcixVbmlvbk1lbWJlcl92YXIgPiBVbmlvbk1lbWJl cl9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVW5pb25NZW1iZXI7 CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVW5pb25NZW1iZXJTZXE7Cgpj bGFzcyBVbmlvbk1lbWJlclNlcV92YXI7CgpjbGFzcyBVbmlvbk1lbWJlclNlcSA6IHB1YmxpYyBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBVbmlvbk1lbWJlcj4gewpwdWJsaWM6CiAgdHlwZWRl ZiBVbmlvbk1lbWJlclNlcV92YXIgX3Zhcl90eXBlOwogIGlubGluZSBVbmlvbk1lbWJlclNlcSgp IHt9CiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxKGNvbnN0IFVuaW9uTWVtYmVyU2VxJiBzKQogICAg OiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBVbmlvbk1lbWJlcj4gKHMpIHt9CgogIGlubGlu ZSBVbmlvbk1lbWJlclNlcShfQ09SQkFfVUxvbmcgX21heCkKICAgIDogX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZTwgVW5pb25NZW1iZXI+IChfbWF4KSB7fQogIGlubGluZSBVbmlvbk1lbWJlclNl cShfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VMb25nIF9sZW4sIFVuaW9uTWVtYmVyKiBfdmFs LCBfQ09SQkFfQm9vbGVhbiBfcmVsPTApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8 IFVuaW9uTWVtYmVyPiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KCiAgaW5saW5lIFVuaW9u TWVtYmVyU2VxJiBvcGVyYXRvciA9IChjb25zdCBVbmlvbk1lbWJlclNlcSYgcykgewogICAgX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgVW5pb25NZW1iZXI+IDo6b3BlcmF0b3I9KHMpOwogICAg cmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIFVuaW9uTWVtYmVyU2VxX291dDsKCmNsYXNzIFVu aW9uTWVtYmVyU2VxX3ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIFVuaW9uTWVtYmVyU2VxIFQ7CiAg dHlwZWRlZiBVbmlvbk1lbWJlclNlcV92YXIgVF92YXI7CgogIGlubGluZSBVbmlvbk1lbWJlclNl cV92YXIoKSA6IF9wZF9zZXEoMCkge30KICBpbmxpbmUgVW5pb25NZW1iZXJTZXFfdmFyKFQqIHMp IDogX3BkX3NlcShzKSB7fQogIGlubGluZSBVbmlvbk1lbWJlclNlcV92YXIoY29uc3QgVF92YXIm IHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAg ICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBpbmxpbmUgflVuaW9uTWVtYmVyU2VxX3ZhcigpIHsg aWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsgfQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9y ID0gKFQqIHMpIHsKICAgIGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7CiAgICBfcGRfc2Vx ID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChj b25zdCBUX3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIHsKICAgICAgaWYoICFfcGRfc2Vx ICkgX3BkX3NlcSA9IG5ldyBUOwogICAgICAqX3BkX3NlcSA9ICpzLl9wZF9zZXE7CiAgICB9IGVs c2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgIGRlbGV0ZSBfcGRfc2VxOwogICAgICBfcGRfc2VxID0g MDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBVbmlvbk1lbWJlciYgb3Bl cmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICByZXR1cm4gKCpfcGRfc2VxKVtzXTsKICB9 CgogIGlubGluZSBUKiBvcGVyYXRvciAtPiAoKSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgaW5s aW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5s aW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CgoKICBpbmxpbmUgY29uc3Qg VCYgaW4oKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUJiBpbm91dCgpIHsg cmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQqJiBvdXQoKSB7CiAgICBpZiggX3BkX3NlcSAp IHsgZGVsZXRlIF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9CiAgICByZXR1cm4gX3BkX3NlcTsKICB9 CiAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0 dXJuIHRtcDsgfQoKICBmcmllbmQgY2xhc3MgVW5pb25NZW1iZXJTZXFfb3V0OwoKcHJpdmF0ZToK ICBUKiBfcGRfc2VxOwp9OwoKY2xhc3MgVW5pb25NZW1iZXJTZXFfb3V0IHsKcHVibGljOgogIHR5 cGVkZWYgVW5pb25NZW1iZXJTZXEgVDsKICB0eXBlZGVmIFVuaW9uTWVtYmVyU2VxX3ZhciBUX3Zh cjsKCiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRh ID0gMDsgfQogIGlubGluZSBVbmlvbk1lbWJlclNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRh KHMuX3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9CiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxX291dChj b25zdCBVbmlvbk1lbWJlclNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBpbmxpbmUg VW5pb25NZW1iZXJTZXFfb3V0JiBvcGVyYXRvciA9IChjb25zdCBVbmlvbk1lbWJlclNlcV9vdXQm IHMpIHsKICAgIF9kYXRhID0gcy5fZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9IGlubGluZSBV bmlvbk1lbWJlclNlcV9vdXQmIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAg IHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRh OyB9CiAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVy YXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgaW5saW5lIFVuaW9uTWVtYmVyJiBvcGVyYXRv ciBbXSAoX0NPUkJBX1VMb25nIGkpIHsKICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICB9CgogIFQq JiBfZGF0YTsKCnByaXZhdGU6CiAgVW5pb25NZW1iZXJTZXFfb3V0KCk7CiAgVW5pb25NZW1iZXJT ZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsKCmV4dGVybiBjb25zdCBDT1JCQTo6 VHlwZUNvZGVfcHRyIF90Y19FbnVtTWVtYmVyU2VxOwoKY2xhc3MgRW51bU1lbWJlclNlcV92YXI7 CgpjbGFzcyBFbnVtTWVtYmVyU2VxIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vf X1N0cmluZyB7CnB1YmxpYzoKICB0eXBlZGVmIEVudW1NZW1iZXJTZXFfdmFyIF92YXJfdHlwZTsK ICBpbmxpbmUgRW51bU1lbWJlclNlcSgpIHt9CiAgaW5saW5lIEVudW1NZW1iZXJTZXEoY29uc3Qg RW51bU1lbWJlclNlcSYgcykKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5n KHMpIHt9CgogIGlubGluZSBFbnVtTWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19TdHJpbmcoX21heCkge30KICBpbmxpbmUgRW51bU1l bWJlclNlcShfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VMb25nIF9sZW4sIGNoYXIqKiBfdmFs LCBfQ09SQkFfQm9vbGVhbiBfcmVsPTApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vf X1N0cmluZyhfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxpbmUgRW51bU1lbWJlclNl cSYgb3BlcmF0b3IgPSAoY29uc3QgRW51bU1lbWJlclNlcSYgcykgewogICAgX0NPUkJBX1VuYm91 bmRlZF9TZXF1ZW5jZV9fU3RyaW5nOjpvcGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAg fQp9OwoKY2xhc3MgRW51bU1lbWJlclNlcV9vdXQ7CgpjbGFzcyBFbnVtTWVtYmVyU2VxX3ZhciB7 CnB1YmxpYzoKICB0eXBlZGVmIEVudW1NZW1iZXJTZXEgVDsKICB0eXBlZGVmIEVudW1NZW1iZXJT ZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgRW51bU1lbWJlclNlcV92YXIoKSA6IF9wZF9zZXEoMCkg e30KICBpbmxpbmUgRW51bU1lbWJlclNlcV92YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5s aW5lIEVudW1NZW1iZXJTZXFfdmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2Vx ICkgX3BkX3NlcSA9IG5ldyBUKCpzLl9wZF9zZXEpOwogICAgZWxzZSBfcGRfc2VxID0gMDsKICB9 CiAgaW5saW5lIH5FbnVtTWVtYmVyU2VxX3ZhcigpIHsgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3Bk X3NlcTsgfQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIGlmKCBfcGRf c2VxICkgZGVsZXRlIF9wZF9zZXE7CiAgICBfcGRfc2VxID0gczsKICAgIHJldHVybiAqdGhpczsK ICB9CiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChjb25zdCBUX3ZhciYgcykgewogICAgaWYo IHMuX3BkX3NlcSApIHsKICAgICAgaWYoICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwogICAg ICAqX3BkX3NlcSA9ICpzLl9wZF9zZXE7CiAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAg IGRlbGV0ZSBfcGRfc2VxOwogICAgICBfcGRfc2VxID0gMDsKICAgIH0KICAgIHJldHVybiAqdGhp czsKICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX2VsZW1lbnQgb3BlcmF0b3IgW10gKF9DT1JC QV9VTG9uZyBzKSB7CiAgICByZXR1cm4gKCpfcGRfc2VxKVtzXTsKICB9CgogIGlubGluZSBUKiBv cGVyYXRvciAtPiAoKSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgaW5saW5lIG9wZXJhdG9yIGNv bnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQm ICgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CgoKICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7 IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2Vx OyB9CiAgaW5saW5lIFQqJiBvdXQoKSB7CiAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9z ZXE7IF9wZF9zZXEgPSAwOyB9CiAgICByZXR1cm4gX3BkX3NlcTsKICB9CiAgaW5saW5lIFQqIF9y ZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICBm cmllbmQgY2xhc3MgRW51bU1lbWJlclNlcV9vdXQ7Cgpwcml2YXRlOgogIFQqIF9wZF9zZXE7Cn07 CgpjbGFzcyBFbnVtTWVtYmVyU2VxX291dCB7CnB1YmxpYzoKICB0eXBlZGVmIEVudW1NZW1iZXJT ZXEgVDsKICB0eXBlZGVmIEVudW1NZW1iZXJTZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgRW51bU1l bWJlclNlcV9vdXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9IDA7IH0KICBpbmxpbmUgRW51 bU1lbWJlclNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQq KSAwOyB9CiAgaW5saW5lIEVudW1NZW1iZXJTZXFfb3V0KGNvbnN0IEVudW1NZW1iZXJTZXFfb3V0 JiBzKSA6IF9kYXRhKHMuX2RhdGEpIHt9CiAgaW5saW5lIEVudW1NZW1iZXJTZXFfb3V0JiBvcGVy YXRvciA9IChjb25zdCBFbnVtTWVtYmVyU2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9kYXRh OwogICAgcmV0dXJuICp0aGlzOwogIH0gaW5saW5lIEVudW1NZW1iZXJTZXFfb3V0JiBvcGVyYXRv ciA9IChUKiBzKSB7CiAgICBfZGF0YSA9IHM7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGlu ZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiYgcHRyKCkgeyBy ZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9 CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX2VsZW1lbnQgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9u ZyBpKSB7CiAgICByZXR1cm4gKCpfZGF0YSlbaV07CiAgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRl OgogIEVudW1NZW1iZXJTZXFfb3V0KCk7CiAgRW51bU1lbWJlclNlcV9vdXQmIG9wZXJhdG9yPShj b25zdCBUX3ZhciYpOwp9OwojIDE0MTEgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09S QkEuaCIgMgojIDE0MjMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIKICBj bGFzcyBJbnRlcmZhY2VEZWY7CiAgY2xhc3MgX29ianJlZl9JbnRlcmZhY2VEZWY7CgogIGNsYXNz IEltcGxlbWVudGF0aW9uRGVmIHt9OwogIHR5cGVkZWYgSW1wbGVtZW50YXRpb25EZWYqIEltcGxl bWVudGF0aW9uRGVmX3B0cjsKICB0eXBlZGVmIEltcGxlbWVudGF0aW9uRGVmX3B0ciBJbXBsZW1l bnRhdGlvbkRlZlJlZjsKCiAgY2xhc3MgT3BlcmF0aW9uRGVmOwogIGNsYXNzIF9vYmpyZWZfT3Bl cmF0aW9uRGVmOwoKICBjbGFzcyBTZXJ2ZXJSZXF1ZXN0OwogIHR5cGVkZWYgU2VydmVyUmVxdWVz dCogU2VydmVyUmVxdWVzdF9wdHI7CiAgdHlwZWRlZiBTZXJ2ZXJSZXF1ZXN0X3B0ciBTZXJ2ZXJS ZXF1ZXN0UmVmOwoKICBjbGFzcyBSZXF1ZXN0OwogIHR5cGVkZWYgUmVxdWVzdCogUmVxdWVzdF9w dHI7CiAgdHlwZWRlZiBSZXF1ZXN0X3B0ciBSZXF1ZXN0UmVmOwogIHR5cGVkZWYgX0NPUkJBX1Bz ZXVkb09ial9WYXI8UmVxdWVzdD4gUmVxdWVzdF92YXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRv T2JqX091dDxSZXF1ZXN0LFJlcXVlc3RfdmFyPiBSZXF1ZXN0X291dDsKICB0eXBlZGVmIF9DT1JC QV9Qc2V1ZG9PYmpfTWVtYmVyPFJlcXVlc3QsUmVxdWVzdF92YXI+IFJlcXVlc3RfbWVtYmVyOwoK CgoKCiAgY2xhc3MgT2JqZWN0X0hlbHBlciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBPYmplY3Rf cHRyIF9wdHJfdHlwZTsKCiAgICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICAgIHN0YXRpYyBf Q09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICAgIHN0YXRpYyB2b2lkIHJlbGVhc2Uo X3B0cl90eXBlKTsKICAgIHN0YXRpYyB2b2lkIGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogICAgc3Rh dGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMg dm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0 YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgICBz dGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsK ICAgIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7 CiAgfTsKCiAgY2xhc3MgT2JqZWN0IHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIE9iamVjdF9wdHIg X3B0cl90eXBlOwogICAgdHlwZWRlZiBPYmplY3RfdmFyIF92YXJfdHlwZTsKCiAgICB2aXJ0dWFs IH5PYmplY3QoKTsKCiAgICBTdGF0dXMgX2NyZWF0ZV9yZXF1ZXN0KENvbnRleHRfcHRyIGN0eCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3BlcmF0aW9uLAogICAgICAg ICAgICAgICAgICAgICAgICAgICBOVkxpc3RfcHRyIGFyZ19saXN0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICBOYW1lZFZhbHVlX3B0ciByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIFJlcXVlc3Rfb3V0IHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdz IHJlcV9mbGFncyk7CgogICAgU3RhdHVzIF9jcmVhdGVfcmVxdWVzdChDb250ZXh0X3B0ciBjdHgs CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wZXJhdGlvbiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgTlZMaXN0X3B0ciBhcmdfbGlzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgTmFtZWRWYWx1ZV9wdHIgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICBFeGNlcHRpb25MaXN0X3B0ciBleGNlcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAg ICAgICBDb250ZXh0TGlzdF9wdHIgY3R4bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg UmVxdWVzdF9vdXQgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgcmVx X2ZsYWdzKTsKCiAgICBSZXF1ZXN0X3B0ciBfcmVxdWVzdChjb25zdCBjaGFyKiBvcGVyYXRpb24p OwoKICAgIEltcGxlbWVudGF0aW9uRGVmX3B0ciBfZ2V0X2ltcGxlbWVudGF0aW9uKCk7CiAgICBf b2JqcmVmX0ludGVyZmFjZURlZiogX2dldF9pbnRlcmZhY2UoKTsKCgogICAgQm9vbGVhbiBfaXNf YShjb25zdCBjaGFyKiByZXBvSWQpOwogICAgdmlydHVhbCBCb29sZWFuIF9ub25fZXhpc3RlbnQo KTsKICAgIEJvb2xlYW4gX2lzX2VxdWl2YWxlbnQoX3B0cl90eXBlIG90aGVyX29iamVjdCk7CiAg ICBVTG9uZyBfaGFzaChVTG9uZyBtYXhpbXVtKTsKCiAgICBzdGF0aWMgX3B0cl90eXBlIF9kdXBs aWNhdGUoX3B0cl90eXBlKTsKICAgIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF9uYXJyb3coT2Jq ZWN0X3B0ciBvKSB7IHJldHVybiBfZHVwbGljYXRlKG8pOyB9CiAgICBzdGF0aWMgX3B0cl90eXBl IF9uaWwoKTsKCgoKCgogICAgaW5saW5lIE9iamVjdCgpIDogcGRfb2JqKDApLCBwZF9tYWdpYyhf UFJfbWFnaWMpIHt9CgogICAgaW5saW5lIEJvb2xlYW4gX05QX2lzX25pbCgpIGNvbnN0IHsgcmV0 dXJuIHBkX29iaiA9PSAwOyB9CiAgICBpbmxpbmUgQm9vbGVhbiBfTlBfaXNfcHNldWRvKCkgY29u c3QgeyByZXR1cm4gcGRfb2JqID09IChvbW5pT2JqUmVmKikgMTsgfQogICAgaW5saW5lIG9tbmlP YmpSZWYqIF9QUl9nZXRvYmooKSB7IHJldHVybiBwZF9vYmo7IH0KICAgIGlubGluZSB2b2lkIF9Q Ul9zZXRvYmoob21uaU9ialJlZiogbykgeyBwZF9vYmogPSBvOyB9CiAgICBzdGF0aWMgaW5saW5l IF9DT1JCQV9Cb29sZWFuIF9QUl9pc192YWxpZChPYmplY3RfcHRyIHApIHsKICAgICAgcmV0dXJu IHAgPyAocC0+cGRfbWFnaWMgPT0gX1BSX21hZ2ljKSA6IDE7CiAgICB9CgogICAgdmlydHVhbCB2 b2lkIF9OUF9pbmNyUmVmQ291bnQoKTsKICAgIHZpcnR1YWwgdm9pZCBfTlBfZGVjclJlZkNvdW50 KCk7CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOwoK ICAgIHN0YXRpYyBzaXplX3QgX05QX2FsaWduZWRTaXplKE9iamVjdF9wdHIsIHNpemVfdCk7CiAg ICBzdGF0aWMgdm9pZCBfbWFyc2hhbE9ialJlZihPYmplY3RfcHRyLCBOZXRCdWZmZXJlZFN0cmVh bSYpOwogICAgc3RhdGljIE9iamVjdF9wdHIgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0 cmVhbSYpOwogICAgc3RhdGljIHZvaWQgX21hcnNoYWxPYmpSZWYoT2JqZWN0X3B0ciwgTWVtQnVm ZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyBPYmplY3RfcHRyIF91bm1hcnNoYWxPYmpSZWYoTWVt QnVmZmVyZWRTdHJlYW0mKTsKCiAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKICAg IHN0YXRpYyBjb25zdCBVTG9uZyBfUFJfbWFnaWM7CgogIHByaXZhdGU6CiAgICBvbW5pT2JqUmVm KiBwZF9vYmo7CgoKICAgIFVMb25nIHBkX21hZ2ljOwogIH07CgoKCgoKCgogIHN0cnVjdCBQUl9z dHJ1Y3RNZW1iZXIgewogICAgY29uc3QgY2hhciogbmFtZTsKICAgIFR5cGVDb2RlX3B0ciB0eXBl OwogIH07CgogIHR5cGVkZWYgVUxvbmcgUFJfdW5pb25EaXNjcmltaW5hdG9yOwoKICBzdHJ1Y3Qg UFJfdW5pb25NZW1iZXIgewogICAgY29uc3QgY2hhciogbmFtZTsKICAgIFR5cGVDb2RlX3B0ciB0 eXBlOwogICAgUFJfdW5pb25EaXNjcmltaW5hdG9yIGxhYmVsOwogIH07CgogIGVudW0gVENLaW5k IHsKICAgIHRrX251bGwgPSAwLAogICAgdGtfdm9pZCA9IDEsCiAgICB0a19zaG9ydCA9IDIsCiAg ICB0a19sb25nID0gMywKICAgIHRrX3VzaG9ydCA9IDQsCiAgICB0a191bG9uZyA9IDUsCiAgICB0 a19mbG9hdCA9IDYsCiAgICB0a19kb3VibGUgPSA3LAogICAgdGtfYm9vbGVhbiA9IDgsCiAgICB0 a19jaGFyID0gOSwKICAgIHRrX29jdGV0ID0gMTAsCiAgICB0a19hbnkgPSAxMSwKICAgIHRrX1R5 cGVDb2RlID0gMTIsCiAgICB0a19QcmluY2lwYWw9IDEzLAogICAgdGtfb2JqcmVmID0gMTQsCiAg ICB0a19zdHJ1Y3QgPSAxNSwKICAgIHRrX3VuaW9uID0gMTYsCiAgICB0a19lbnVtID0gMTcsCiAg ICB0a19zdHJpbmcgPSAxOCwKICAgIHRrX3NlcXVlbmNlID0gMTksCiAgICB0a19hcnJheSA9IDIw LAogICAgdGtfYWxpYXMgPSAyMSwKICAgIHRrX2V4Y2VwdCA9IDIyLAogICAgdGtfbG9uZ2xvbmcg PSAyMywKICAgIHRrX3Vsb25nbG9uZyA9IDI0LAogICAgdGtfbG9uZ2RvdWJsZSA9IDI1CiAgfTsK CgogIGNsYXNzIFR5cGVDb2RlIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5UeXBlQ29kZSgpOwoK ICAgIFRDS2luZCBraW5kKCkgY29uc3Q7CgogICAgQm9vbGVhbiBlcXVhbChUeXBlQ29kZV9wdHIg VENwKSBjb25zdDsKCiAgICBCb29sZWFuIGVxdWl2YWxlbnQoVHlwZUNvZGVfcHRyIFRDcCkgY29u c3Q7CgoKICAgIFR5cGVDb2RlX3B0ciBnZXRfY29tcGFjdF90eXBlY29kZSgpIGNvbnN0OwoKCiAg ICBjb25zdCBjaGFyKiBpZCgpIGNvbnN0OwogICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwoK ICAgIFVMb25nIG1lbWJlcl9jb3VudCgpIGNvbnN0OwogICAgY29uc3QgY2hhciogbWVtYmVyX25h bWUoVUxvbmcgaW5kZXgpIGNvbnN0OwoKICAgIFR5cGVDb2RlX3B0ciBtZW1iZXJfdHlwZShVTG9u ZyBpKSBjb25zdDsKCiAgICBBbnkqIG1lbWJlcl9sYWJlbChVTG9uZyBpKSBjb25zdDsKICAgIFR5 cGVDb2RlX3B0ciBkaXNjcmltaW5hdG9yX3R5cGUoKSBjb25zdDsKICAgIExvbmcgZGVmYXVsdF9p bmRleCgpIGNvbnN0OwoKICAgIFVMb25nIGxlbmd0aCgpIGNvbnN0OwoKICAgIFR5cGVDb2RlX3B0 ciBjb250ZW50X3R5cGUoKSBjb25zdDsKCiAgICBMb25nIHBhcmFtX2NvdW50KCkgY29uc3Q7CiAg ICBBbnkqIHBhcmFtZXRlcihMb25nIGluZGV4KSBjb25zdDsKIyAxNjI1ICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiCiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIF9kdXBsaWNh dGUoVHlwZUNvZGVfcHRyIHQpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBfbmlsKCk7CgoKCiAg ICBjbGFzcyBCb3VuZHMgOiBwdWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEJv dW5kcygpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55 Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCb3VuZHMoY29uc3QgQm91bmRzJiBf ZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBCb3VuZHMmIG9wZXJhdG9yPShjb25z dCBCb3VuZHMmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0 aGlzOyB9IHZpcnR1YWwgfkJvdW5kcygpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBC b3VuZHMqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJvdW5kcyogX2Rvd25j YXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEJvdW5kcyogX25hcnJvdyhFeGNl cHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBv cGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJh dG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8 PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZm ZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZu OyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGlj IGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBf ZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0 OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVh bCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9p ZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgQmFk S2luZCA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQmFkS2luZCgpIHsg cGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBp bnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCYWRLaW5kKGNvbnN0IEJhZEtpbmQmIF9leCkgOiBV c2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEJhZEtpbmQmIG9wZXJhdG9yPShjb25zdCBCYWRL aW5kJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhpczsg fSB2aXJ0dWFsIH5CYWRLaW5kKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEJhZEtp bmQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJhZEtpbmQqIF9kb3duY2Fz dChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBCYWRLaW5kKiBfbmFycm93KEV4Y2Vw dGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9h bGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9w ZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8 PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZl cmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47 IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMg Y29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9k dXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFs IHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lk IF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CgogICAgc3RhdGljIHZv aWQgbWFyc2hhbFR5cGVDb2RlKFR5cGVDb2RlX3B0ciBvYmosTmV0QnVmZmVyZWRTdHJlYW0mIHMp OwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciB1bm1hcnNoYWxUeXBlQ29kZShOZXRCdWZmZXJlZFN0 cmVhbSYgcyk7CgoKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxUeXBlQ29kZShUeXBlQ29kZV9wdHIg b2JqLE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgdW5tYXJz aGFsVHlwZUNvZGUoTWVtQnVmZmVyZWRTdHJlYW0mIHMpOwojIDE2NTQgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfdW5pb25f dGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFR5cGVDb2RlX3B0ciBkaXNjcmltaW5hdG9yX3R5cGUsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaW9uTWVtYmVyU2VxJiBtZW1iZXJz KTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfZW51bV90Yyhjb25zdCBjaGFyKiBpZCwgY29u c3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBF bnVtTWVtYmVyU2VxJiBtZW1iZXJzKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfYWxpYXNf dGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFR5cGVDb2RlX3B0ciBvcmlnaW5hbF90eXBlKTsKICAgIHN0YXRpYyBU eXBlQ29kZV9wdHIgTlBfaW50ZXJmYWNlX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBu YW1lKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfc3RyaW5nX3RjKFVMb25nIGJvdW5kKTsK ICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfc2VxdWVuY2VfdGMoVUxvbmcgYm91bmQsIFR5cGVD b2RlX3B0ciBlbGVtZW50X3R5cGUpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBOUF9hcnJheV90 YyhVTG9uZyBsZW5ndGgsIFR5cGVDb2RlX3B0ciBlbGVtZW50X3R5cGUpOwogICAgc3RhdGljIFR5 cGVDb2RlX3B0ciBOUF9yZWN1cnNpdmVfc2VxdWVuY2VfdGMoVUxvbmcgYm91bmQsIFVMb25nIG9m ZnNldCk7CgoKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfc3RydWN0X3RjKGNvbnN0IGNoYXIq IGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgUFJfc3RydWN0TWVtYmVyKiBtZW1iZXJzLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgVUxvbmcgbWVtYmVyQ291bnQpOwoKCiAgICBzdGF0aWMgVHlwZUNvZGVf cHRyIFBSX3VuaW9uX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29kZV9wdHIgZGlzY3JpbWluYXRvcl90 eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQUl91bmlvbk1l bWJlciogbWVtYmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxvbmcg bWVtYmVyQ291bnQsIExvbmcgZGVmbHQgPSAtMSk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBS X2VudW1fdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG1lbWJlcnMsIFVMb25nIG1lbWJlckNv dW50KTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfYWxpYXNfdGMoY29uc3QgY2hhciogaWQs IGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5 cGVDb2RlX3B0ciBvcmlnaW5hbF90eXBlKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfZXhj ZXB0aW9uX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFJfc3RydWN0TWVtYmVyKiBtZW1iZXJz LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxvbmcgbWVtYmVyQ291 bnQpOwoKCiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX2ludGVyZmFjZV90Yyhjb25zdCBjaGFy KiBpZCwgY29uc3QgY2hhciogbmFtZSk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX3N0cmlu Z190YyhVTG9uZyBib3VuZCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX3NlcXVlbmNlX3Rj KFVMb25nIGJvdW5kLCBUeXBlQ29kZV9wdHIgZWxlbWVudF90eXBlKTsKICAgIHN0YXRpYyBUeXBl Q29kZV9wdHIgUFJfYXJyYXlfdGMoVUxvbmcgbGVuZ3RoLCBUeXBlQ29kZV9wdHIgZWxlbWVudF90 eXBlKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfcmVjdXJzaXZlX3NlcXVlbmNlX3RjKFVM b25nIGJvdW5kLCBVTG9uZyBvZmZzZXQpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl9udWxs X3RjKCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX3ZvaWRfdGMoKTsKICAgIHN0YXRpYyBU eXBlQ29kZV9wdHIgUFJfc2hvcnRfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfbG9u Z190YygpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl91c2hvcnRfdGMoKTsKICAgIHN0YXRp YyBUeXBlQ29kZV9wdHIgUFJfdWxvbmdfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJf ZmxvYXRfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfZG91YmxlX3RjKCk7CiAgICBz dGF0aWMgVHlwZUNvZGVfcHRyIFBSX2Jvb2xlYW5fdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9w dHIgUFJfY2hhcl90YygpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl9vY3RldF90YygpOwog ICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl9hbnlfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9w dHIgUFJfVHlwZUNvZGVfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfUHJpbmNpcGFs X3RjKCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX09iamVjdF90YygpOwogICAgc3RhdGlj IFR5cGVDb2RlX3B0ciBQUl9zdHJpbmdfdGMoKTsKCgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6 ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgICB2aXJ0dWFsIENPUkJBOjpCb29sZWFu IE5QX2lzX25pbCgpIGNvbnN0OwoKICAgIHN0YXRpYyBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gUFJf aXNfdmFsaWQoVHlwZUNvZGVfcHRyIHAgKSB7CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21h Z2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQogICAgc3RhdGljIGNvbnN0IENPUkJBOjpVTG9u ZyBQUl9tYWdpYzsKCiAgcHJvdGVjdGVkOgoKICAgIFR5cGVDb2RlKGNvbnN0IFR5cGVDb2RlJiB0 Yyk7CiAgICBUeXBlQ29kZSYgb3BlcmF0b3I9KGNvbnN0IFR5cGVDb2RlJiB0Yyk7CiAgICBUeXBl Q29kZSgpIHsgcGRfbWFnaWMgPSBQUl9tYWdpYzsgfTsKCiAgICBfQ09SQkFfVUxvbmcgcGRfbWFn aWM7CiAgfTsKCgoKCgoKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19udWxsOwogIGV4dGVybiBU eXBlQ29kZV9wdHIgX3RjX3ZvaWQ7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfc2hvcnQ7CiAg ZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfbG9uZzsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y191 c2hvcnQ7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfdWxvbmc7CiAgZXh0ZXJuIFR5cGVDb2Rl X3B0ciBfdGNfZmxvYXQ7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfZG91YmxlOwogIGV4dGVy biBUeXBlQ29kZV9wdHIgX3RjX2Jvb2xlYW47CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfY2hh cjsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19vY3RldDsKICBleHRlcm4gVHlwZUNvZGVfcHRy IF90Y19hbnk7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfVHlwZUNvZGU7CiAgZXh0ZXJuIFR5 cGVDb2RlX3B0ciBfdGNfUHJpbmNpcGFsOwogIGV4dGVybiBUeXBlQ29kZV9wdHIgX3RjX09iamVj dDsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19zdHJpbmc7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0 ciBfdGNfTmFtZWRWYWx1ZTsKCgoKCgoKICBjbGFzcyBEeW5Bbnk7CiAgdHlwZWRlZiBEeW5Bbnkq IER5bkFueV9wdHI7CiAgdHlwZWRlZiBEeW5BbnlfcHRyIER5bkFueVJlZjsKCiAgY2xhc3MgRHlu RW51bTsKICB0eXBlZGVmIER5bkVudW0qIER5bkVudW1fcHRyOwogIHR5cGVkZWYgRHluRW51bV9w dHIgRHluRW51bVJlZjsKCiAgY2xhc3MgRHluU3RydWN0OwogIHR5cGVkZWYgRHluU3RydWN0KiBE eW5TdHJ1Y3RfcHRyOwogIHR5cGVkZWYgRHluU3RydWN0X3B0ciBEeW5TdHJ1Y3RSZWY7CgogIGNs YXNzIER5blVuaW9uOwogIHR5cGVkZWYgRHluVW5pb24qIER5blVuaW9uX3B0cjsKICB0eXBlZGVm IER5blVuaW9uX3B0ciBEeW5VbmlvblJlZjsKCiAgY2xhc3MgRHluU2VxdWVuY2U7CiAgdHlwZWRl ZiBEeW5TZXF1ZW5jZSogRHluU2VxdWVuY2VfcHRyOwogIHR5cGVkZWYgRHluU2VxdWVuY2VfcHRy IER5blNlcXVlbmNlUmVmOwoKICBjbGFzcyBEeW5BcnJheTsKICB0eXBlZGVmIER5bkFycmF5KiBE eW5BcnJheV9wdHI7CiAgdHlwZWRlZiBEeW5BcnJheV9wdHIgRHluQXJyYXlSZWY7CgoKCgoKCiAg Y2xhc3MgRHluQW55IHsKICBwdWJsaWM6CgogICAgY2xhc3MgSW52YWxpZCA6IHB1YmxpYyBVc2Vy RXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSW52YWxpZCgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9 IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9 IGlubGluZSBJbnZhbGlkKGNvbnN0IEludmFsaWQmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkg e30gaW5saW5lIEludmFsaWQmIG9wZXJhdG9yPShjb25zdCBJbnZhbGlkJiBfZXgpIHsgKiAoVXNl ckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5JbnZhbGlk KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEludmFsaWQqIF9kb3duY2FzdChFeGNl cHRpb24qKTsgc3RhdGljIGNvbnN0IEludmFsaWQqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24q KTsgc3RhdGljIGlubGluZSBJbnZhbGlkKiBfbmFycm93KEV4Y2VwdGlvbiogX2V4KSB7IHJldHVy biBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qg b3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZl cmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRT dHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVh bSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3Rh dGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNl cHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3Jl cG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwo TmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBJbnZhbGlkVmFsdWUgOiBwdWJsaWMg VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEludmFsaWRWYWx1ZSgpIHsgcGRfaW5zZXJ0 VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0Fu eUZuTkNQOyB9IGlubGluZSBJbnZhbGlkVmFsdWUoY29uc3QgSW52YWxpZFZhbHVlJiBfZXgpIDog VXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBJbnZhbGlkVmFsdWUmIG9wZXJhdG9yPShjb25z dCBJbnZhbGlkVmFsdWUmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0 dXJuICp0aGlzOyB9IHZpcnR1YWwgfkludmFsaWRWYWx1ZSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNl KCk7IHN0YXRpYyBJbnZhbGlkVmFsdWUqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNv bnN0IEludmFsaWRWYWx1ZSogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5s aW5lIEludmFsaWRWYWx1ZSogX25hcnJvdyhFeGNlcHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25j YXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25z dCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikg Y29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBp bmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNl cnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9B bnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHBy aXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwg Y29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9y ZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZl cmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0 cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgVHlwZU1pc21hdGNoIDogcHVibGljIFVzZXJFeGNl cHRpb24geyBwdWJsaWM6IGlubGluZSBUeXBlTWlzbWF0Y2goKSB7IHBkX2luc2VydFRvQW55Rm4g PSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsg fSBpbmxpbmUgVHlwZU1pc21hdGNoKGNvbnN0IFR5cGVNaXNtYXRjaCYgX2V4KSA6IFVzZXJFeGNl cHRpb24oX2V4KSB7fSBpbmxpbmUgVHlwZU1pc21hdGNoJiBvcGVyYXRvcj0oY29uc3QgVHlwZU1p c21hdGNoJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhp czsgfSB2aXJ0dWFsIH5UeXBlTWlzbWF0Y2goKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0 aWMgVHlwZU1pc21hdGNoKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBUeXBl TWlzbWF0Y2gqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBUeXBl TWlzbWF0Y2gqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgp OyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1 cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25z dCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9 IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZv aWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGlu c2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2 aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGlu dCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBj b25zdDsgfTsKICAgIGNsYXNzIEludmFsaWRTZXEgOiBwdWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1 YmxpYzogaW5saW5lIEludmFsaWRTZXEoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0Fu eUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSW52 YWxpZFNlcShjb25zdCBJbnZhbGlkU2VxJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlu bGluZSBJbnZhbGlkU2VxJiBvcGVyYXRvcj0oY29uc3QgSW52YWxpZFNlcSYgX2V4KSB7ICogKFVz ZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SW52YWxp ZFNlcSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBJbnZhbGlkU2VxKiBfZG93bmNh c3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBJbnZhbGlkU2VxKiBfZG93bmNhc3QoY29uc3Qg RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSW52YWxpZFNlcSogX25hcnJvdyhFeGNlcHRpb24q IF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25l ZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRv cj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49 KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0 QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0 cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0 aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0 IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGlj YXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0 dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lk IF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBf bWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwoKICAgIHR5cGVkZWYgX0NPUkJB X1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgT2N0ZXRTZXE7CgogICAgdmlydHVhbCB+RHluQW55 KCk7CgogICAgdmlydHVhbCBUeXBlQ29kZV9wdHIgdHlwZSgpIGNvbnN0ID0gMDsKICAgIHZpcnR1 YWwgdm9pZCBhc3NpZ24oRHluQW55X3B0ciBkeW5fYW55KSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQg ZnJvbV9hbnkoY29uc3QgQW55JiB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCBBbnkqIHRvX2FueSgp ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOwogICAgdmlydHVhbCBEeW5Bbnlf cHRyIGNvcHkoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X2Jvb2xlYW4oQm9vbGVhbiB2 YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2VydF9vY3RldChPY3RldCB2YWx1ZSkgPSAw OwogICAgdmlydHVhbCB2b2lkIGluc2VydF9jaGFyKENoYXIgdmFsdWUpID0gMDsKICAgIHZpcnR1 YWwgdm9pZCBpbnNlcnRfc2hvcnQoU2hvcnQgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBp bnNlcnRfdXNob3J0KFVTaG9ydCB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2VydF9s b25nKExvbmcgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRfdWxvbmcoVUxvbmcg dmFsdWUpID0gMDsKCiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X2Zsb2F0KEZsb2F0IHZhbHVlKSA9 IDA7CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X2RvdWJsZShEb3VibGUgdmFsdWUpID0gMDsKCiAg ICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X3N0cmluZyhjb25zdCBjaGFyKiB2YWx1ZSkgPSAwOwogICAg dmlydHVhbCB2b2lkIGluc2VydF9yZWZlcmVuY2UoT2JqZWN0X3B0ciB2YWx1ZSkgPSAwOwogICAg dmlydHVhbCB2b2lkIGluc2VydF90eXBlY29kZShUeXBlQ29kZV9wdHIgdmFsdWUpID0gMDsKICAg IHZpcnR1YWwgdm9pZCBpbnNlcnRfYW55KGNvbnN0IEFueSYgdmFsdWUpID0gMDsKICAgIHZpcnR1 YWwgQm9vbGVhbiBnZXRfYm9vbGVhbigpID0gMDsKICAgIHZpcnR1YWwgT2N0ZXQgZ2V0X29jdGV0 KCkgPSAwOwogICAgdmlydHVhbCBDaGFyIGdldF9jaGFyKCkgPSAwOwogICAgdmlydHVhbCBTaG9y dCBnZXRfc2hvcnQoKSA9IDA7CiAgICB2aXJ0dWFsIFVTaG9ydCBnZXRfdXNob3J0KCkgPSAwOwog ICAgdmlydHVhbCBMb25nIGdldF9sb25nKCkgPSAwOwogICAgdmlydHVhbCBVTG9uZyBnZXRfdWxv bmcoKSA9IDA7CgogICAgdmlydHVhbCBGbG9hdCBnZXRfZmxvYXQoKSA9IDA7CiAgICB2aXJ0dWFs IERvdWJsZSBnZXRfZG91YmxlKCkgPSAwOwoKICAgIHZpcnR1YWwgY2hhciogZ2V0X3N0cmluZygp ID0gMDsKICAgIHZpcnR1YWwgT2JqZWN0X3B0ciBnZXRfcmVmZXJlbmNlKCkgPSAwOwogICAgdmly dHVhbCBUeXBlQ29kZV9wdHIgZ2V0X3R5cGVjb2RlKCkgPSAwOwogICAgdmlydHVhbCBBbnkqIGdl dF9hbnkoKSA9IDA7CiAgICB2aXJ0dWFsIER5bkFueV9wdHIgY3VycmVudF9jb21wb25lbnQoKSA9 IDA7CiAgICB2aXJ0dWFsIEJvb2xlYW4gbmV4dCgpID0gMDsKICAgIHZpcnR1YWwgQm9vbGVhbiBz ZWVrKExvbmcgaW5kZXgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCByZXdpbmQoKSA9IDA7CgogICAg c3RhdGljIER5bkFueV9wdHIgX2R1cGxpY2F0ZShEeW5BbnlfcHRyKTsKICAgIHN0YXRpYyBEeW5B bnlfcHRyIF9uYXJyb3coRHluQW55X3B0cik7CiAgICBzdGF0aWMgRHluQW55X3B0ciBfbmlsKCk7 CgogICAgdmlydHVhbCBCb29sZWFuIE5QX2lzX25pbCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwg aW50IE5QX25vZGV0eXBlKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkKiBOUF9uYXJyb3co KSA9IDA7CgogICAgc3RhdGljIGlubGluZSBfQ09SQkFfQm9vbGVhbiBQUl9pc192YWxpZChEeW5B bnlfcHRyIHAgKSB7CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2lj KSA6IDEpOwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CiAg cHJvdGVjdGVkOgogICAgRHluQW55KCk7CgogIHByaXZhdGU6CiAgICBfQ09SQkFfVUxvbmcgcGRf bWFnaWM7CgogICAgRHluQW55KGNvbnN0IER5bkFueSYpOwogICAgRHluQW55JiBvcGVyYXRvcj0o Y29uc3QgRHluQW55Jik7CiAgfTsKIyAxODg2ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L0NPUkJBLmgiCiAgY2xhc3MgRHluRW51bSA6IHB1YmxpYyB2aXJ0dWFsIER5bkFueSB7CiAgcHVi bGljOgoKICAgIHZpcnR1YWwgY2hhciogdmFsdWVfYXNfc3RyaW5nKCkgPSAwOwogICAgdmlydHVh bCB2b2lkIHZhbHVlX2FzX3N0cmluZyhjb25zdCBjaGFyKiB2YWx1ZSkgPSAwOwogICAgdmlydHVh bCBVTG9uZyB2YWx1ZV9hc191bG9uZygpID0gMDsKICAgIHZpcnR1YWwgdm9pZCB2YWx1ZV9hc191 bG9uZyhVTG9uZyB2YWx1ZSkgPSAwOwoKICAgIHN0YXRpYyBEeW5FbnVtX3B0ciBfZHVwbGljYXRl KER5bkVudW1fcHRyKTsKICAgIHN0YXRpYyBEeW5FbnVtX3B0ciBfbmFycm93KER5bkFueV9wdHIp OwogICAgc3RhdGljIER5bkVudW1fcHRyIF9uaWwoKTsKCiAgICB2aXJ0dWFsIH5EeW5FbnVtKCk7 CgogIHByb3RlY3RlZDoKICAgIER5bkVudW0oKSB7fQoKICBwcml2YXRlOgogICAgRHluRW51bShj b25zdCBEeW5FbnVtJik7CiAgICBEeW5FbnVtJiBvcGVyYXRvcj0oY29uc3QgRHluRW51bSYpOwog IH07CgoKCgoKICB0eXBlZGVmIGNoYXIqIEZpZWxkTmFtZTsKICB0eXBlZGVmIFN0cmluZ192YXIg RmllbGROYW1lX3ZhcjsKCiAgc3RydWN0IE5hbWVWYWx1ZVBhaXIgewogICAgU3RyaW5nX21lbWJl ciBpZDsKICAgIEFueSB2YWx1ZTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1Zh cmlhYmxlX1ZhcjxOYW1lVmFsdWVQYWlyPiBOYW1lVmFsdWVQYWlyX3ZhcjsKICB0eXBlZGVmIF9D T1JCQV9Qc2V1ZG9WYWx1ZV9TZXF1ZW5jZTxOYW1lVmFsdWVQYWlyPiBOYW1lVmFsdWVQYWlyU2Vx OwoKICBjbGFzcyBEeW5TdHJ1Y3QgOiBwdWJsaWMgdmlydHVhbCBEeW5BbnkgewogIHB1YmxpYzoK CiAgICB2aXJ0dWFsIGNoYXIqIGN1cnJlbnRfbWVtYmVyX25hbWUoKSA9IDA7CiAgICB2aXJ0dWFs IFRDS2luZCBjdXJyZW50X21lbWJlcl9raW5kKCkgPSAwOwogICAgdmlydHVhbCBOYW1lVmFsdWVQ YWlyU2VxKiBnZXRfbWVtYmVycygpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXRfbWVtYmVycyhj b25zdCBOYW1lVmFsdWVQYWlyU2VxJiBOVlNlcVZhbCkgPSAwOwoKICAgIHN0YXRpYyBEeW5TdHJ1 Y3RfcHRyIF9kdXBsaWNhdGUoRHluU3RydWN0X3B0cik7CiAgICBzdGF0aWMgRHluU3RydWN0X3B0 ciBfbmFycm93KER5bkFueV9wdHIpOwogICAgc3RhdGljIER5blN0cnVjdF9wdHIgX25pbCgpOwoK ICAgIHZpcnR1YWwgfkR5blN0cnVjdCgpOwoKICBwcm90ZWN0ZWQ6CiAgICBEeW5TdHJ1Y3QoKSB7 fQoKICBwcml2YXRlOgogICAgRHluU3RydWN0KGNvbnN0IER5blN0cnVjdCYpOwogICAgRHluU3Ry dWN0JiBvcGVyYXRvcj0oY29uc3QgRHluU3RydWN0Jik7CiAgfTsKCgoKCgogIGNsYXNzIER5blVu aW9uIDogcHVibGljIHZpcnR1YWwgRHluQW55IHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIEJvb2xl YW4gc2V0X2FzX2RlZmF1bHQoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0X2FzX2RlZmF1bHQo Qm9vbGVhbiB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCBEeW5BbnlfcHRyIGRpc2NyaW1pbmF0b3Io KSA9IDA7CiAgICB2aXJ0dWFsIFRDS2luZCBkaXNjcmltaW5hdG9yX2tpbmQoKSA9IDA7CiAgICB2 aXJ0dWFsIER5bkFueV9wdHIgbWVtYmVyKCkgPSAwOwogICAgdmlydHVhbCBjaGFyKiBtZW1iZXJf bmFtZSgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBtZW1iZXJfbmFtZShjb25zdCBjaGFyKiB2YWx1 ZSkgPSAwOwogICAgdmlydHVhbCBUQ0tpbmQgbWVtYmVyX2tpbmQoKSA9IDA7CgogICAgc3RhdGlj IER5blVuaW9uX3B0ciBfZHVwbGljYXRlKER5blVuaW9uX3B0cik7CiAgICBzdGF0aWMgRHluVW5p b25fcHRyIF9uYXJyb3coRHluQW55X3B0cik7CiAgICBzdGF0aWMgRHluVW5pb25fcHRyIF9uaWwo KTsKCiAgICB2aXJ0dWFsIH5EeW5VbmlvbigpOwoKICBwcm90ZWN0ZWQ6CiAgICBEeW5Vbmlvbigp IHt9CgogIHByaXZhdGU6CiAgICBEeW5Vbmlvbihjb25zdCBEeW5VbmlvbiYpOwogICAgRHluVW5p b24mIG9wZXJhdG9yPShjb25zdCBEeW5VbmlvbiYpOwogIH07CgoKCgoKICB0eXBlZGVmIF9DT1JC QV9Qc2V1ZG9WYWx1ZV9TZXF1ZW5jZTxBbnk+IEFueVNlcTsKCiAgY2xhc3MgRHluU2VxdWVuY2Ug OiBwdWJsaWMgdmlydHVhbCBEeW5BbnkgewogIHB1YmxpYzoKCiAgICB2aXJ0dWFsIFVMb25nIGxl bmd0aCgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBsZW5ndGggKFVMb25nIHZhbHVlKSA9IDA7CiAg ICB2aXJ0dWFsIEFueVNlcSogZ2V0X2VsZW1lbnRzKCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHNl dF9lbGVtZW50cyhjb25zdCBBbnlTZXEmIHZhbHVlKSA9IDA7CgogICAgc3RhdGljIER5blNlcXVl bmNlX3B0ciBfZHVwbGljYXRlKER5blNlcXVlbmNlX3B0cik7CiAgICBzdGF0aWMgRHluU2VxdWVu Y2VfcHRyIF9uYXJyb3coRHluQW55X3B0cik7CiAgICBzdGF0aWMgRHluU2VxdWVuY2VfcHRyIF9u aWwoKTsKCiAgICB2aXJ0dWFsIH5EeW5TZXF1ZW5jZSgpOwoKICBwcm90ZWN0ZWQ6CiAgICBEeW5T ZXF1ZW5jZSgpIHt9CgogIHByaXZhdGU6CiAgICBEeW5TZXF1ZW5jZShjb25zdCBEeW5TZXF1ZW5j ZSYpOwogICAgRHluU2VxdWVuY2UmIG9wZXJhdG9yPShjb25zdCBEeW5TZXF1ZW5jZSYpOwogIH07 CgoKCgoKICBjbGFzcyBEeW5BcnJheSA6IHB1YmxpYyB2aXJ0dWFsIER5bkFueSB7CiAgcHVibGlj OgoKICAgIHZpcnR1YWwgQW55U2VxKiBnZXRfZWxlbWVudHMoKSA9IDA7CiAgICB2aXJ0dWFsIHZv aWQgc2V0X2VsZW1lbnRzKGNvbnN0IEFueVNlcSYgdmFsdWUpID0gMDsKCiAgICBzdGF0aWMgRHlu QXJyYXlfcHRyIF9kdXBsaWNhdGUoRHluQXJyYXlfcHRyKTsKICAgIHN0YXRpYyBEeW5BcnJheV9w dHIgX25hcnJvdyhEeW5BbnlfcHRyKTsKICAgIHN0YXRpYyBEeW5BcnJheV9wdHIgX25pbCgpOwoK ICAgIHZpcnR1YWwgfkR5bkFycmF5KCk7CgogIHByb3RlY3RlZDoKICAgIER5bkFycmF5KCkge30K CiAgcHJpdmF0ZToKICAgIER5bkFycmF5KGNvbnN0IER5bkFycmF5Jik7CiAgICBEeW5BcnJheSYg b3BlcmF0b3I9KGNvbnN0IER5bkFycmF5Jik7CiAgfTsKCgoKCgoKICBjbGFzcyBSZXF1ZXN0IHsK ICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5SZXF1ZXN0KCk7CgogICAgdmlydHVhbCBPYmplY3RfcHRy IHRhcmdldCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgY29uc3QgY2hhciogb3BlcmF0aW9uKCkg Y29uc3QgPSAwOwogICAgdmlydHVhbCBOVkxpc3RfcHRyIGFyZ3VtZW50cygpID0gMDsKICAgIHZp cnR1YWwgTmFtZWRWYWx1ZV9wdHIgcmVzdWx0KCkgPSAwOwogICAgdmlydHVhbCBFbnZpcm9ubWVu dF9wdHIgZW52KCkgPSAwOwogICAgdmlydHVhbCBFeGNlcHRpb25MaXN0X3B0ciBleGNlcHRpb25z KCkgPSAwOwogICAgdmlydHVhbCBDb250ZXh0TGlzdF9wdHIgY29udGV4dHMoKSA9IDA7CiAgICB2 aXJ0dWFsIENvbnRleHRfcHRyIGN0eCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBjdHgo Q29udGV4dF9wdHIpID0gMDsKCiAgICB2aXJ0dWFsIEFueSYgYWRkX2luX2FyZygpID0gMDsKICAg IHZpcnR1YWwgQW55JiBhZGRfaW5fYXJnKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKICAgIHZpcnR1 YWwgQW55JiBhZGRfaW5vdXRfYXJnKCkgPSAwOwogICAgdmlydHVhbCBBbnkmIGFkZF9pbm91dF9h cmcoY29uc3QgY2hhciogbmFtZSkgPSAwOwogICAgdmlydHVhbCBBbnkmIGFkZF9vdXRfYXJnKCkg PSAwOwogICAgdmlydHVhbCBBbnkmIGFkZF9vdXRfYXJnKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsK CiAgICB2aXJ0dWFsIHZvaWQgc2V0X3JldHVybl90eXBlKFR5cGVDb2RlX3B0ciB0YykgPSAwOwog ICAgdmlydHVhbCBBbnkmIHJldHVybl92YWx1ZSgpID0gMDsKCiAgICB2aXJ0dWFsIFN0YXR1cyBp bnZva2UoKSA9IDA7CiAgICB2aXJ0dWFsIFN0YXR1cyBzZW5kX29uZXdheSgpID0gMDsKICAgIHZp cnR1YWwgU3RhdHVzIHNlbmRfZGVmZXJyZWQoKSA9IDA7CiAgICB2aXJ0dWFsIFN0YXR1cyBnZXRf cmVzcG9uc2UoKSA9IDA7CiAgICB2aXJ0dWFsIEJvb2xlYW4gcG9sbF9yZXNwb25zZSgpID0gMDsK CiAgICB2aXJ0dWFsIEJvb2xlYW4gTlBfaXNfbmlsKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBS ZXF1ZXN0X3B0ciBOUF9kdXBsaWNhdGUoKSA9IDA7CgogICAgc3RhdGljIFJlcXVlc3RfcHRyIF9k dXBsaWNhdGUoUmVxdWVzdF9wdHIpOwogICAgc3RhdGljIFJlcXVlc3RfcHRyIF9uaWwoKTsKCiAg ICBzdGF0aWMgaW5saW5lIF9DT1JCQV9Cb29sZWFuIFBSX2lzX3ZhbGlkKFJlcXVlc3RfcHRyIHAg KSB7CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwog ICAgfQoKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CgogIHByb3RlY3Rl ZDoKICAgIFJlcXVlc3QoKSB7IHBkX21hZ2ljID0gUFJfbWFnaWM7IH0KCiAgcHJpdmF0ZToKICAg IF9DT1JCQV9VTG9uZyBwZF9tYWdpYzsKCiAgICBSZXF1ZXN0KGNvbnN0IFJlcXVlc3QmKTsKICAg IFJlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBSZXF1ZXN0Jik7CiAgfTsKCgoKCgoKICBjbGFzcyBT ZXJ2ZXJSZXF1ZXN0IHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG9wZXJhdGlv bigpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBhcmd1bWVudHMoTlZMaXN0X3B0ciYgcGFyYW1ldGVy cykgPSAwOwogICAgdmlydHVhbCBDb250ZXh0X3B0ciBjdHgoKSA9IDA7CiAgICB2aXJ0dWFsIHZv aWQgc2V0X3Jlc3VsdChjb25zdCBBbnkmIHZhbHVlKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 X2V4Y2VwdGlvbihjb25zdCBBbnkmIHZhbHVlKSA9IDA7CgogIHByb3RlY3RlZDoKICAgIGlubGlu ZSBTZXJ2ZXJSZXF1ZXN0KCkge30KICAgIHZpcnR1YWwgflNlcnZlclJlcXVlc3QoKTsKCiAgcHJp dmF0ZToKICAgIFNlcnZlclJlcXVlc3QoY29uc3QgU2VydmVyUmVxdWVzdCYpOwogICAgU2VydmVy UmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IFNlcnZlclJlcXVlc3QmKTsKICB9OwoKCgoKCgogIHR5 cGVkZWYgVUxvbmcgUG9saWN5VHlwZTsKCiAgY2xhc3MgUG9saWN5OwogIHR5cGVkZWYgUG9saWN5 KiBQb2xpY3lfcHRyOwogIHR5cGVkZWYgUG9saWN5X3B0ciBQb2xpY3lSZWY7CgogIGNsYXNzIFBv bGljeSA6IHB1YmxpYyB2aXJ0dWFsIE9iamVjdCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+UG9s aWN5KCk7CgogICAgdmlydHVhbCBQb2xpY3lUeXBlIHBvbGljeV90eXBlKCk7CiAgICB2aXJ0dWFs IFBvbGljeV9wdHIgY29weSgpOwoKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7CgoKICAgIHN0 YXRpYyBQb2xpY3lfcHRyIF9kdXBsaWNhdGUoUG9saWN5X3B0cik7CiAgICBzdGF0aWMgUG9saWN5 X3B0ciBfbmFycm93KE9iamVjdF9wdHIpOwogICAgc3RhdGljIFBvbGljeV9wdHIgX25pbCgpOwoK CgogICAgUG9saWN5KFBvbGljeVR5cGUgdHlwZSk7CiAgICBQb2xpY3koKTsKCiAgICB2aXJ0dWFs IHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOwogICAgdmlydHVhbCB2b2lk IF9OUF9pbmNyUmVmQ291bnQoKTsKICAgIHZpcnR1YWwgdm9pZCBfTlBfZGVjclJlZkNvdW50KCk7 CgoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKICBwcml2YXRlOgogICAgUG9s aWN5KGNvbnN0IFBvbGljeSYpOwogICAgUG9saWN5JiBvcGVyYXRvciA9IChjb25zdCBQb2xpY3km KTsKCiAgICBpbnQgcGRfcmVmQ291bnQ7CiAgICBQb2xpY3lUeXBlIHBkX3R5cGU7CiAgfTsKCiAg dHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxQb2xpY3k+IFBvbGljeV92YXI7CiAgdHlwZWRl ZiBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxQb2xpY3ksIFBvbGljeV92YXI+IFBvbGljeV9tZW1i ZXI7CgogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb19VbmJvdW5kZWRfU2VxdWVuY2U8UG9saWN5LCBQ b2xpY3lfbWVtYmVyPiBQb2xpY3lMaXN0OwogIHR5cGVkZWYgUG9saWN5TGlzdCogUG9saWN5TGlz dF92YXI7CgoKCgoKCiAgY2xhc3MgRG9tYWluTWFuYWdlcjsKICB0eXBlZGVmIGNsYXNzIERvbWFp bk1hbmFnZXIqIERvbWFpbk1hbmFnZXJfcHRyOwogIHR5cGVkZWYgRG9tYWluTWFuYWdlcl9wdHIg RG9tYWluTWFuYWdlclJlZjsKCiAgY2xhc3MgRG9tYWluTWFuYWdlciB7CiAgcHVibGljOgogICAg UG9saWN5X3B0ciBnZXRfZG9tYWluX3BvbGljeShQb2xpY3lUeXBlIHBvbGljeV90eXBlKTsKCiAg ICBzdGF0aWMgRG9tYWluTWFuYWdlcl9wdHIgX2R1cGxpY2F0ZShEb21haW5NYW5hZ2VyX3B0ciBw KTsKICAgIHN0YXRpYyBEb21haW5NYW5hZ2VyX3B0ciBfbmlsKCk7CgogIHByaXZhdGU6CiAgICBE b21haW5NYW5hZ2VyKCk7CiAgfTsKCiAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzX25pbChE b21haW5NYW5hZ2VyX3B0ciBwKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgcmVsZWFzZShEb21h aW5NYW5hZ2VyX3B0cik7CgogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8RG9tYWluTWFu YWdlcj4gRG9tYWluTWFuYWdlcl92YXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX01lbWJl cjxEb21haW5NYW5hZ2VyLERvbWFpbk1hbmFnZXJfdmFyPgogICAgRG9tYWluTWFuYWdlcl9tZW1i ZXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvX1VuYm91bmRlZF9TZXF1ZW5jZTxEb21haW5NYW5h Z2VyLERvbWFpbk1hbmFnZXJfbWVtYmVyPgogICAgRG9tYWluTWFuYWdlckxpc3Q7CgoKCgoKCiAg Y2xhc3MgQk9BOwogIGNsYXNzIEJPQV92YXI7CiAgdHlwZWRlZiBCT0EqIEJPQV9wdHI7CiAgdHlw ZWRlZiBCT0FfcHRyIEJPQVJlZjsKCgogIGNsYXNzIFJlZmVyZW5jZURhdGEgOiBwdWJsaWMgX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgewogIHB1YmxpYzoKICAgIGlubGluZSBSZWZl cmVuY2VEYXRhKCkge30KICAgIGlubGluZSBSZWZlcmVuY2VEYXRhKGNvbnN0IFJlZmVyZW5jZURh dGEmIHNlcSkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldChzZXEpIHt9 CiAgICBpbmxpbmUgUmVmZXJlbmNlRGF0YShDT1JCQTo6VUxvbmcgbWF4KQogICAgICA6IF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KG1heCkge30KICAgIGlubGluZSBSZWZlcmVuY2VE YXRhKENPUkJBOjpVTG9uZyBtYXgsIENPUkJBOjpVTG9uZyBsZW4sIENPUkJBOjpPY3RldCogdmFs LCBDT1JCQTo6Qm9vbGVhbiByZWw9MCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X19PY3RldChtYXgsIGxlbiwgdmFsLCByZWwpIHt9CiAgICBpbmxpbmUgUmVmZXJlbmNlRGF0YSYg b3BlcmF0b3IgPSAoY29uc3QgUmVmZXJlbmNlRGF0YSYgc2VxKSB7CiAgICAgIF9DT1JCQV9VbmJv dW5kZWRfU2VxdWVuY2VfX09jdGV0OjpvcGVyYXRvcj0oc2VxKTsKICAgICAgcmV0dXJuICp0aGlz OwogICAgfTsKICB9OwoKCiAgY2xhc3MgQk9BIDogcHVibGljIE9iamVjdCB7CiAgcHVibGljOgog ICAgdmlydHVhbCB2b2lkIGltcGxfaXNfcmVhZHkoSW1wbGVtZW50YXRpb25EZWZfcHRyIHA9MCwg Qm9vbGVhbiBOb0Jsaz0wKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgaW1wbF9zaHV0ZG93bigpID0g MDsKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOwoKICAgIHZpcnR1YWwgdm9pZCBvYmpf aXNfcmVhZHkob21uaU9yYkJvYVNlcnZhbnQqLCBJbXBsZW1lbnRhdGlvbkRlZl9wdHIgcD0wKT0w OwogICAgdmlydHVhbCB2b2lkIG9ial9pc19yZWFkeShPYmplY3RfcHRyLCBJbXBsZW1lbnRhdGlv bkRlZl9wdHIgcD0wKT0wOwogICAgdmlydHVhbCB2b2lkIGRpc3Bvc2UoT2JqZWN0X3B0cikgPSAw OwoKICAgIHZpcnR1YWwgT2JqZWN0X3B0ciBjcmVhdGUoY29uc3QgUmVmZXJlbmNlRGF0YSYsIF9v YmpyZWZfSW50ZXJmYWNlRGVmKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wbGVt ZW50YXRpb25EZWZfcHRyKSA9IDA7CiAgICB2aXJ0dWFsIFJlZmVyZW5jZURhdGEqIGdldF9pZChP YmplY3RfcHRyKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlX2ltcGxlbWVudGF0aW9uKE9i amVjdF9wdHIsSW1wbGVtZW50YXRpb25EZWZfcHRyKSA9IDA7CiAgICB2aXJ0dWFsIFByaW5jaXBh bF9wdHIgZ2V0X3ByaW5jaXBhbChPYmplY3RfcHRyLCBFbnZpcm9ubWVudF9wdHIpID0gMDsKICAg IHZpcnR1YWwgdm9pZCBkZWFjdGl2YXRlX2ltcGwoSW1wbGVtZW50YXRpb25EZWZfcHRyKSA9IDA7 CiAgICB2aXJ0dWFsIHZvaWQgZGVhY3RpdmF0ZV9vYmooT2JqZWN0X3B0cikgPSAwOwoKICAgIHN0 YXRpYyBCT0FfcHRyIF9kdXBsaWNhdGUoQk9BX3B0cik7CiAgICBzdGF0aWMgQk9BX3B0ciBfbmFy cm93KE9iamVjdF9wdHIpOwogICAgc3RhdGljIEJPQV9wdHIgX25pbCgpOwogICAgc3RhdGljIEJP QV9wdHIgZ2V0Qk9BKCk7CgogICAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgogIHBy b3RlY3RlZDoKICAgIGlubGluZSBCT0EoaW50IG5pbCkgeyBfUFJfc2V0b2JqKChvbW5pT2JqUmVm KikgKG5pbCA/IDA6MSkpOyB9CiAgICB2aXJ0dWFsIH5CT0EoKTsKCiAgcHJpdmF0ZToKICAgIEJP QShjb25zdCBCT0EmKTsKICAgIEJPQSYgb3BlcmF0b3I9KGNvbnN0IEJPQSYpOwogIH07CgoKCgoK ICBjbGFzcyBPUkI7CiAgY2xhc3MgT1JCX3ZhcjsKICB0eXBlZGVmIE9SQiogT1JCX3B0cjsKICB0 eXBlZGVmIE9SQl9wdHIgT1JCUmVmOwoKICBjbGFzcyBPUkIgOiBwdWJsaWMgT2JqZWN0IHsKICBw dWJsaWM6CiAgICB0eXBlZGVmIE9SQl9wdHIgX3B0cl90eXBlOwogICAgdHlwZWRlZiBPUkJfdmFy IF92YXJfdHlwZTsKCiAgICB0eXBlZGVmIGNoYXIqIE9BaWQ7CgogICAgdHlwZWRlZiBjaGFyKiBP YmplY3RJZDsKICAgIHR5cGVkZWYgU3RyaW5nX3ZhciBPYmplY3RJZF92YXI7CgogICAgdHlwZWRl ZiBfQ09SQkFfUHNldWRvX1VuYm91bmRlZF9TZXF1ZW5jZTxSZXF1ZXN0LFJlcXVlc3RfbWVtYmVy PgogICAgICBSZXF1ZXN0U2VxOwoKICAgIGNsYXNzIEludmFsaWROYW1lIDogcHVibGljIFVzZXJF eGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBJbnZhbGlkTmFtZSgpIHsgcGRfaW5zZXJ0VG9BbnlG biA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQ OyB9IGlubGluZSBJbnZhbGlkTmFtZShjb25zdCBJbnZhbGlkTmFtZSYgX2V4KSA6IFVzZXJFeGNl cHRpb24oX2V4KSB7fSBpbmxpbmUgSW52YWxpZE5hbWUmIG9wZXJhdG9yPShjb25zdCBJbnZhbGlk TmFtZSYgX2V4KSB7ICogKFVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7 IH0gdmlydHVhbCB+SW52YWxpZE5hbWUoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMg SW52YWxpZE5hbWUqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEludmFsaWRO YW1lKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSW52YWxpZE5h bWUqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlu bGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7 IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBp bmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3Bl cmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9B bnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRv QW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFs IEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6 ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNv bnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsg fTsKICAgIGNsYXNzIEluY29uc2lzdGVudFR5cGVDb2RlIDogcHVibGljIFVzZXJFeGNlcHRpb24g eyBwdWJsaWM6IGlubGluZSBJbmNvbnNpc3RlbnRUeXBlQ29kZSgpIHsgcGRfaW5zZXJ0VG9BbnlG biA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQ OyB9IGlubGluZSBJbmNvbnNpc3RlbnRUeXBlQ29kZShjb25zdCBJbmNvbnNpc3RlbnRUeXBlQ29k ZSYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgSW5jb25zaXN0ZW50VHlwZUNv ZGUmIG9wZXJhdG9yPShjb25zdCBJbmNvbnNpc3RlbnRUeXBlQ29kZSYgX2V4KSB7ICogKFVzZXJF eGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SW5jb25zaXN0 ZW50VHlwZUNvZGUoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgSW5jb25zaXN0ZW50 VHlwZUNvZGUqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEluY29uc2lzdGVu dFR5cGVDb2RlKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSW5j b25zaXN0ZW50VHlwZUNvZGUqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3du Y2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29u c3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJl YW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYp IGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30g aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5z ZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRv QW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBw cml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBf cmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZm ZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRT dHJlYW0mKSBjb25zdDsgfTsKCgoKCgogICAgY2xhc3MgT2JqZWN0SWRMaXN0X3ZhcjsKCiAgICBj bGFzcyBPYmplY3RJZExpc3QgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3Ry aW5nIHsKICAgIHB1YmxpYzoKICAgICAgdHlwZWRlZiBPYmplY3RJZExpc3RfdmFyIF92YXJfdHlw ZTsKICAgICAgaW5saW5lIE9iamVjdElkTGlzdCgpIHt9CiAgICAgIGlubGluZSBPYmplY3RJZExp c3QoY29uc3QgT2JqZWN0SWRMaXN0JiBzZXEpCiAgICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX19TdHJpbmcoc2VxKSB7fQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0KFVMb25nIG1h eCkKICAgICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhtYXgpIHt9CiAg ICAgIGlubGluZSBPYmplY3RJZExpc3QoVUxvbmcgbWF4LCBVTG9uZyBsZW4sIGNoYXIqKiB2YWws CiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiByZWw9MCkKICAgICAgICA6IF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhtYXgsIGxlbiwgdmFsLCByZWwpIHt9CiAgICAg IGlubGluZSBPYmplY3RJZExpc3QmIG9wZXJhdG9yID0gKGNvbnN0IE9iamVjdElkTGlzdCYgc2Vx KSB7CiAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nOjpvcGVyYXRvcj0o c2VxKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgIH0KICAgIH07CgogICAgY2xhc3MgT2Jq ZWN0SWRMaXN0X291dDsKCiAgICBjbGFzcyBPYmplY3RJZExpc3RfdmFyIHsKICAgIHB1YmxpYzoK ICAgICAgdHlwZWRlZiBPYmplY3RJZExpc3QgVDsKICAgICAgdHlwZWRlZiBPYmplY3RJZExpc3Rf dmFyIFRfdmFyOwoKICAgICAgaW5saW5lIE9iamVjdElkTGlzdF92YXIoKSA6IHBkX3NlcSgwKSB7 fQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0X3ZhcihUKiBzKSA6IHBkX3NlcShzKSB7fQogICAg ICBpbmxpbmUgT2JqZWN0SWRMaXN0X3Zhcihjb25zdCBUX3ZhciYgc3YpIHsKICAgICAgICBpZigg c3YucGRfc2VxICkgewogICAgICAgICAgcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgICAqcGRfc2Vx ID0gKnN2LnBkX3NlcTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHBkX3NlcSA9IDA7CiAgICAg IH0KICAgICAgaW5saW5lIH5PYmplY3RJZExpc3RfdmFyKCkgeyBpZiggcGRfc2VxICkgZGVsZXRl IHBkX3NlcTsgfQoKICAgICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICAg ICAgaWYoIHBkX3NlcSApIGRlbGV0ZSBwZF9zZXE7CiAgICAgICAgcGRfc2VxID0gczsKICAgICAg ICByZXR1cm4gKnRoaXM7CiAgICAgIH0KICAgICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChj b25zdCBUX3ZhciYgc3YpIHsKICAgICAgICBpZiggc3YucGRfc2VxICkgewogICAgICAgICAgaWYo ICFwZF9zZXEgKSBwZF9zZXEgPSBuZXcgVDsKICAgICAgICAgICpwZF9zZXEgPSAqc3YucGRfc2Vx OwogICAgICAgIH0gZWxzZSBpZiggcGRfc2VxICkgewogICAgICAgICAgZGVsZXRlIHBkX3NlcTsK ICAgICAgICAgIHBkX3NlcSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAqdGhpczsKICAg ICAgfQoKICAgICAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBvcGVyYXRvciBbXSAoX0NP UkJBX1VMb25nIGkpIHsgcmV0dXJuICgqcGRfc2VxKVtpXTsgfQogICAgICBpbmxpbmUgVCogb3Bl cmF0b3IgLT4gKCkgeyByZXR1cm4gcGRfc2VxOyB9CgoKCiAgICAgIGlubGluZSBvcGVyYXRvciBj b25zdCBUJiAoKSBjb25zdCB7IHJldHVybiAqcGRfc2VxOyB9CiAgICAgIGlubGluZSBvcGVyYXRv ciBUJiAoKSB7IHJldHVybiAqcGRfc2VxOyB9CgoKICAgICAgaW5saW5lIGNvbnN0IFQmIGluKCkg Y29uc3QgeyByZXR1cm4gKnBkX3NlcTsgfQogICAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVy biAqcGRfc2VxOyB9CiAgICAgIGlubGluZSBUKiYgb3V0KCkgeyBpZiAocGRfc2VxKSB7IGRlbGV0 ZSBwZF9zZXE7IHBkX3NlcSA9IDA7IH0gcmV0dXJuIHBkX3NlcTsgfQogICAgICBpbmxpbmUgVCog X3JldG4oKSB7IFQqIHRtcCA9IHBkX3NlcTsgcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICAg ICAgZnJpZW5kIGNsYXNzIE9iamVjdElkTGlzdF9vdXQ7CgogICAgcHJpdmF0ZToKICAgICAgVCog cGRfc2VxOwogICAgfTsKCiAgICBjbGFzcyBPYmplY3RJZExpc3Rfb3V0IHsKICAgIHB1YmxpYzoK ICAgICAgdHlwZWRlZiBPYmplY3RJZExpc3QgVDsKICAgICAgdHlwZWRlZiBPYmplY3RJZExpc3Rf dmFyIFRfdmFyOwoKICAgICAgaW5saW5lIE9iamVjdElkTGlzdF9vdXQoVComIHMpIDogX2RhdGEo cykgeyBfZGF0YSA9IDA7IH0KICAgICAgaW5saW5lIE9iamVjdElkTGlzdF9vdXQoVF92YXImIHN2 KQogICAgICAgIDogX2RhdGEoc3YucGRfc2VxKSB7IHN2ID0gKFQqKSAwOyB9CiAgICAgIGlubGlu ZSBPYmplY3RJZExpc3Rfb3V0KGNvbnN0IE9iamVjdElkTGlzdF9vdXQmIHMpIDogX2RhdGEocy5f ZGF0YSkge30KICAgICAgaW5saW5lIE9iamVjdElkTGlzdF9vdXQmIG9wZXJhdG9yPShjb25zdCBP YmplY3RJZExpc3Rfb3V0JiBzKSB7CiAgICAgICAgX2RhdGEgPSBzLl9kYXRhOyByZXR1cm4gKnRo aXM7CiAgICAgIH0KICAgICAgaW5saW5lIE9iamVjdElkTGlzdF9vdXQmIG9wZXJhdG9yPShUKiBz KSB7IF9kYXRhID0gczsgcmV0dXJuICp0aGlzOyB9CiAgICAgIGlubGluZSBvcGVyYXRvciBUKiYo KSB7IHJldHVybiBfZGF0YTsgfQogICAgICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRh OyB9CiAgICAgIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KICAgICAg aW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkp IHsKICAgICAgICByZXR1cm4gKCpfZGF0YSlbaV07CiAgICAgIH0KICAgICAgVComIF9kYXRhOwoK ICAgIHByaXZhdGU6CiAgICAgIE9iamVjdElkTGlzdF9vdXQoKTsKICAgICAgT2JqZWN0SWRMaXN0 X291dCBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKICAgIH07CgoKCgoKICAgIHN0YXRpYyBfcHRy X3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93 KE9iamVjdF9wdHIpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogICAgdmlydHVhbCBj aGFyKiBvYmplY3RfdG9fc3RyaW5nKE9iamVjdF9wdHIpID0gMDsKICAgIHZpcnR1YWwgT2JqZWN0 X3B0ciBzdHJpbmdfdG9fb2JqZWN0KGNvbnN0IGNoYXIqKSA9IDA7CgogICAgdmlydHVhbCBPYmpl Y3RJZExpc3QqIGxpc3RfaW5pdGlhbF9zZXJ2aWNlcygpID0gMDsKICAgIHZpcnR1YWwgT2JqZWN0 X3B0ciByZXNvbHZlX2luaXRpYWxfcmVmZXJlbmNlcyhjb25zdCBjaGFyKiBpZGVudGlmaWVyKSA9 IDA7CgogICAgdmlydHVhbCBCb29sZWFuIHdvcmtfcGVuZGluZygpID0gMDsKICAgIHZpcnR1YWwg dm9pZCBwZXJmb3JtX3dvcmsoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwogICAg dmlydHVhbCB2b2lkIHNodXRkb3duKEJvb2xlYW4gd2FpdF9mb3JfY29tcGxldGlvbikgPSAwOwog ICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSA9IDA7CgogICAgaW5saW5lIHZvaWQgTlBfZGVzdHJv eSgpIHsgZGVzdHJveSgpOyB9CgoKICAgIEJPQV9wdHIgQk9BX2luaXQoaW50JiBhcmdjLCBjaGFy KiogYXJndiwgY29uc3QgY2hhciogYm9hX2lkZW50aWZpZXI9MCk7CgogICAgU3RhdHVzIGNyZWF0 ZV9saXN0KExvbmcsIE5WTGlzdF9vdXQpOwogICAgU3RhdHVzIGNyZWF0ZV9vcGVyYXRpb25fbGlz dChfb2JqcmVmX09wZXJhdGlvbkRlZiosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE5WTGlzdF9vdXQpOwogICAgU3RhdHVzIGNyZWF0ZV9uYW1lZF92YWx1ZShOYW1lZFZhbHVlX291 dCk7CiAgICBTdGF0dXMgY3JlYXRlX2V4Y2VwdGlvbl9saXN0KEV4Y2VwdGlvbkxpc3Rfb3V0KTsK ICAgIFN0YXR1cyBjcmVhdGVfY29udGV4dF9saXN0KENvbnRleHRMaXN0X291dCk7CgogICAgU3Rh dHVzIGdldF9kZWZhdWx0X2NvbnRleHQoQ29udGV4dF9vdXQgY29udGV4dF9vdXQpOwoKCgogICAg U3RhdHVzIGNyZWF0ZV9lbnZpcm9ubWVudChFbnZpcm9ubWVudF9vdXQpOwoKICAgIFN0YXR1cyBz ZW5kX211bHRpcGxlX3JlcXVlc3RzX29uZXdheShjb25zdCBSZXF1ZXN0U2VxJik7CiAgICBTdGF0 dXMgc2VuZF9tdWx0aXBsZV9yZXF1ZXN0c19kZWZlcnJlZChjb25zdCBSZXF1ZXN0U2VxJik7CiAg ICBCb29sZWFuIHBvbGxfbmV4dF9yZXNwb25zZSgpOwogICAgU3RhdHVzIGdldF9uZXh0X3Jlc3Bv bnNlKFJlcXVlc3Rfb3V0KTsKCiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX3N0cnVjdF90Yyhjb25z dCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IFN0cnVjdE1lbWJlclNlcSYgbWVtYmVycyk7CiAgICBUeXBlQ29kZV9wdHIg Y3JlYXRlX3VuaW9uX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29kZV9wdHIgZGlzY3JpbWluYXRvcl90eXBl LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmlvbk1lbWJlclNlcSYg bWVtYmVycyk7CiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX2VudW1fdGMoY29uc3QgY2hhciogaWQs IGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg RW51bU1lbWJlclNlcSYgbWVtYmVycyk7CiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX2FsaWFzX3Rj KGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBUeXBlQ29kZV9wdHIgb3JpZ2luYWxfdHlwZSk7CiAgICBUeXBlQ29kZV9wdHIg Y3JlYXRlX2V4Y2VwdGlvbl90Yyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdE1lbWJlclNlcSYg bWVtYmVycyk7CiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX2ludGVyZmFjZV90Yyhjb25zdCBjaGFy KiBpZCwgY29uc3QgY2hhciogbmFtZSk7CiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX3N0cmluZ190 YyhVTG9uZyBib3VuZCk7CiAgICBUeXBlQ29kZV9wdHIgY3JlYXRlX3NlcXVlbmNlX3RjKFVMb25n IGJvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29kZV9wdHIg ZWxlbWVudF90eXBlKTsKICAgIFR5cGVDb2RlX3B0ciBjcmVhdGVfYXJyYXlfdGMoVUxvbmcgbGVu Z3RoLCBUeXBlQ29kZV9wdHIgZXR5cGUpOwogICAgVHlwZUNvZGVfcHRyIGNyZWF0ZV9yZWN1cnNp dmVfc2VxdWVuY2VfdGMoVUxvbmcgYm91bmQsIFVMb25nIG9mZnNldCk7CgoKCgoKICAgIER5bkFu eV9wdHIgY3JlYXRlX2R5bl9hbnkoY29uc3QgQW55JiB2YWx1ZSk7CiAgICBEeW5BbnlfcHRyIGNy ZWF0ZV9iYXNpY19keW5fYW55KFR5cGVDb2RlX3B0ciB0Yyk7CiAgICBEeW5TdHJ1Y3RfcHRyIGNy ZWF0ZV9keW5fc3RydWN0KFR5cGVDb2RlX3B0ciB0Yyk7CiAgICBEeW5TZXF1ZW5jZV9wdHIgY3Jl YXRlX2R5bl9zZXF1ZW5jZShUeXBlQ29kZV9wdHIgdGMpOwogICAgRHluQXJyYXlfcHRyIGNyZWF0 ZV9keW5fYXJyYXkoVHlwZUNvZGVfcHRyIHRjKTsKICAgIER5blVuaW9uX3B0ciBjcmVhdGVfZHlu X3VuaW9uKFR5cGVDb2RlX3B0ciB0Yyk7CiAgICBEeW5FbnVtX3B0ciBjcmVhdGVfZHluX2VudW0o VHlwZUNvZGVfcHRyIHRjKTsKCgoKCgogICAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7 CiAgICB2aXJ0dWFsIH5PUkIoKTsKCiAgcHJvdGVjdGVkOgogICAgaW5saW5lIE9SQihpbnQgbmls KSB7IF9QUl9zZXRvYmooKG9tbmlPYmpSZWYqKSAobmlsID8gMDoxKSk7IH0KCiAgcHJpdmF0ZToK ICAgIE9SQihjb25zdCBPUkImKTsKICAgIE9SQiYgb3BlcmF0b3IgPSAoY29uc3QgT1JCJik7CiAg fTsKCiAgdHlwZWRlZiBjaGFyKiBPUkJpZDsKICB0eXBlZGVmIFN0cmluZ192YXIgT1JCaWRfdmFy OwoKICAgICAgICAgICAgICAgICAgIE9SQl9wdHIgT1JCX2luaXQoaW50JiBhcmdjLCBjaGFyKiog YXJndiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3Ji X2lkZW50aWZpZXI9IiIpOwoKCgoKCgogICAgICAgICAgICAgICAgICAgaW5saW5lIEJvb2xlYW4g aXNfbmlsKEVudmlyb25tZW50X3B0ciBwKSB7CiAgICBpZiAoIUVudmlyb25tZW50OjpQUl9pc192 YWxpZChwKSkKICAgICAgcmV0dXJuIDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5Q X2lzX25pbCgpIDoKICAgICAgICAgICAgICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVk b19vYmpyZWYoIkVudmlyb25tZW50IikpOwogIH0KICAgICAgICAgICAgICAgICAgIGlubGluZSBC b29sZWFuIGlzX25pbChDb250ZXh0X3B0ciBwKSB7CiAgICBpZiAoIUNvbnRleHQ6OlBSX2lzX3Zh bGlkKHApKQogICAgICByZXR1cm4gMDsKICAgIGVsc2UKICAgICAgcmV0dXJuIChwID8gcC0+TlBf aXNfbmlsKCkgOgogICAgICAgICAgICAgIF9DT1JCQV91c2VfbmlsX3B0cl9hc19uaWxfcHNldWRv X29ianJlZigiQ29udGV4dCIpKTsKICB9CiAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzX25p bChQcmluY2lwYWxfcHRyKTsKICAgICAgICAgICAgICAgICAgIGlubGluZSBCb29sZWFuIGlzX25p bChPYmplY3RfcHRyIG8pIHsKICAgIGlmKCAhT2JqZWN0OjpfUFJfaXNfdmFsaWQobykgKSByZXR1 cm4gMDsKICAgIGlmKCBvICkgcmV0dXJuIG8tPl9OUF9pc19uaWwoKTsKICAgIGVsc2UgewoKCgoK CgogICAgICByZXR1cm4gX0NPUkJBX3VzZV9uaWxfcHRyX2FzX25pbF9vYmpyZWYoKTsKICAgIH0K ICB9CiAgICAgICAgICAgICAgICAgICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoTmFtZWRWYWx1ZV9w dHIgcCkgewogICAgaWYgKCFOYW1lZFZhbHVlOjpQUl9pc192YWxpZChwKSkKICAgICAgcmV0dXJu IDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5QX2lzX25pbCgpIDoKICAgICAgICAg ICAgICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpyZWYoIk5hbWVkVmFsdWUi KSk7CiAgfQogICAgICAgICAgICAgICAgICAgaW5saW5lIEJvb2xlYW4gaXNfbmlsKE5WTGlzdF9w dHIgcCkgewogICAgaWYgKCFOVkxpc3Q6OlBSX2lzX3ZhbGlkKHApKQogICAgICByZXR1cm4gMDsK ICAgIGVsc2UKICAgICAgcmV0dXJuIChwID8gcC0+TlBfaXNfbmlsKCkgOgogICAgICAgICAgICAg IF9DT1JCQV91c2VfbmlsX3B0cl9hc19uaWxfcHNldWRvX29ianJlZigiTlZMaXN0IikpOwogIH0K ICAgICAgICAgICAgICAgICAgIGlubGluZSBCb29sZWFuIGlzX25pbChSZXF1ZXN0X3B0ciBwKSB7 CiAgICBpZiAoIVJlcXVlc3Q6OlBSX2lzX3ZhbGlkKHApKQogICAgICByZXR1cm4gMDsKICAgIGVs c2UKICAgICAgcmV0dXJuIChwID8gcC0+TlBfaXNfbmlsKCkgOgogICAgICAgICAgICAgIF9DT1JC QV91c2VfbmlsX3B0cl9hc19uaWxfcHNldWRvX29ianJlZigiUmVxdWVzdCIpKTsKICB9CiAgICAg ICAgICAgICAgICAgICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoRXhjZXB0aW9uTGlzdF9wdHIgcCkg ewogICAgaWYgKCFFeGNlcHRpb25MaXN0OjpQUl9pc192YWxpZChwKSkKICAgICAgcmV0dXJuIDA7 CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5QX2lzX25pbCgpIDoKICAgICAgICAgICAg ICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpyZWYoIkV4Y2VwdGlvbkxpc3Qi KSk7CiAgfQogICAgICAgICAgICAgICAgICAgaW5saW5lIEJvb2xlYW4gaXNfbmlsKENvbnRleHRM aXN0X3B0ciBwKSB7CiAgICBpZiAoIUNvbnRleHRMaXN0OjpQUl9pc192YWxpZChwKSkKICAgICAg cmV0dXJuIDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5QX2lzX25pbCgpIDoKICAg ICAgICAgICAgICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpyZWYoIkNvbnRl eHRMaXN0IikpOwogIH0KICAgICAgICAgICAgICAgICAgIGlubGluZSBCb29sZWFuIGlzX25pbChU eXBlQ29kZV9wdHIgcCkgewogICAgaWYgKCFUeXBlQ29kZTo6UFJfaXNfdmFsaWQocCkpCiAgICAg IHJldHVybiAwOwogICAgZWxzZQogICAgICByZXR1cm4gKHAgPyBwLT5OUF9pc19uaWwoKSA6CiAg ICAgICAgICAgICAgX0NPUkJBX3VzZV9uaWxfcHRyX2FzX25pbF9wc2V1ZG9fb2JqcmVmKCJUeXBl Q29kZSIpKTsKICB9CiAgICAgICAgICAgICAgICAgICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoRHlu QW55X3B0ciBwKSB7CiAgICBpZiAoIUR5bkFueTo6UFJfaXNfdmFsaWQocCkpCiAgICAgIHJldHVy biAwOwogICAgZWxzZQogICAgICByZXR1cm4gKHAgPyBwLT5OUF9pc19uaWwoKSA6CiAgICAgICAg ICAgICAgX0NPUkJBX3VzZV9uaWxfcHRyX2FzX25pbF9wc2V1ZG9fb2JqcmVmKCJEeW5BbnkiKSk7 CiAgfQoKCgoKCgogICAgICAgICAgICAgICAgICAgaW5saW5lIHZvaWQgcmVsZWFzZShPYmplY3Rf cHRyIG8pIHsKICAgIGlmKCBvICYmICFvLT5fTlBfaXNfbmlsKCkgKSB7CiAgICAgIGlmKCBvLT5f TlBfaXNfcHNldWRvKCkgKSBvLT5fTlBfZGVjclJlZkNvdW50KCk7CiAgICAgIGVsc2Ugb21uaTo6 cmVsZWFzZU9ialJlZihvLT5fUFJfZ2V0b2JqKCkpOwogICAgfQogIH0KICAgICAgICAgICAgICAg ICAgIHZvaWQgcmVsZWFzZShFbnZpcm9ubWVudF9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2 b2lkIHJlbGVhc2UoQ29udGV4dF9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVh c2UoUHJpbmNpcGFsX3B0cik7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoTmFtZWRW YWx1ZV9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoTlZMaXN0X3B0ciBw KTsKICAgICAgICAgICAgICAgICAgIHZvaWQgcmVsZWFzZShSZXF1ZXN0X3B0ciBwKTsKICAgICAg ICAgICAgICAgICAgIHZvaWQgcmVsZWFzZShFeGNlcHRpb25MaXN0X3B0ciBwKTsKICAgICAgICAg ICAgICAgICAgIHZvaWQgcmVsZWFzZShDb250ZXh0TGlzdF9wdHIgcCk7CiAgICAgICAgICAgICAg ICAgICB2b2lkIHJlbGVhc2UoVHlwZUNvZGVfcHRyIG8pOwogICAgICAgICAgICAgICAgICAgdm9p ZCByZWxlYXNlKER5bkFueV9wdHIgZCk7CgoKCgogICAgICAgICAgICAgICAgICAgT2JqZWN0X3B0 ciBVbk1hcnNoYWxPYmpSZWYoY29uc3QgY2hhciogcmVwb0lkLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0QnVmZmVyZWRTdHJlYW0mIHMpOwogICAgICAg ICAgICAgICAgICAgdm9pZCBNYXJzaGFsT2JqUmVmKE9iamVjdF9wdHIgb2JqLCBjb25zdCBjaGFy ICpyZXBvSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJl cG9JZFNpemUsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgICAgICAgICAgICAgICAgIHNpemVf dCBBbGlnbmVkT2JqUmVmKE9iamVjdF9wdHIgb2JqLCBjb25zdCBjaGFyICpyZXBvSWQsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVwb0lkU2l6ZSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0aWFsb2Zmc2V0 KTsKICAgICAgICAgICAgICAgICAgIE9iamVjdF9wdHIgVW5NYXJzaGFsT2JqUmVmKGNvbnN0IGNo YXIgKnJlcG9JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgTWFyc2hhbE9i alJlZihPYmplY3RfcHRyIG9iaiwgY29uc3QgY2hhciogcmVwb0lkLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZXBvSWRTaXplLCBNZW1CdWZmZXJlZFN0cmVh bSYgcyk7CgoKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJBX3ZhcnR5cGVz LmgiIDEKIyA0OCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQV92YXJ0eXBlcy5o IgpjbGFzcyBPYmplY3RfTWVtYmVyOwpjbGFzcyBPYmplY3RfRWxlbWVudDsKY2xhc3MgT2JqZWN0 X0lOT1VUX2FyZzsKY2xhc3MgT2JqZWN0X09VVF9hcmc7CmNsYXNzIE9iamVjdF90Y0Rlc2NfYXJn OwoKY2xhc3MgT2JqZWN0X3ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIE9iamVjdCBUOwogIHR5cGVk ZWYgT2JqZWN0X3B0ciBUX3B0cjsKICB0eXBlZGVmIE9iamVjdF92YXIgVF92YXI7CiAgdHlwZWRl ZiBPYmplY3RfTWVtYmVyIFRfbWVtYmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1lbnQgVF9lbGVt ZW50OwoKICBpbmxpbmUgT2JqZWN0X3ZhcigpIDogcGRfcmVmKFQ6Ol9uaWwoKSkge30KICBpbmxp bmUgT2JqZWN0X3ZhcihUX3B0ciBwKSB7IHBkX3JlZiA9IHA7IH0KICBpbmxpbmUgT2JqZWN0X3Zh cihjb25zdCBUX3ZhciYgcCkgOiBwZF9yZWYoVDo6X2R1cGxpY2F0ZShwLnBkX3JlZikpIHt9CiAg aW5saW5lIE9iamVjdF92YXIoY29uc3QgVF9tZW1iZXImIHApOwogIGlubGluZSBPYmplY3RfdmFy KGNvbnN0IFRfZWxlbWVudCYgcCk7CiAgaW5saW5lIH5PYmplY3RfdmFyKCkgeyByZWxlYXNlKHBk X3JlZik7IH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKFRfcHRyIHApIHsKICAgIHJlbGVh c2UocGRfcmVmKTsKICAgIHBkX3JlZiA9IHA7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGlu ZSBUX3ZhciYgb3BlcmF0b3I9IChjb25zdCBUX3ZhciYgcCkgewogICAgaWYoIHBkX3JlZiAhPSBw LnBkX3JlZiApIHsKICAgICAgcmVsZWFzZShwZF9yZWYpOwogICAgICBwZF9yZWYgPSBUOjpfZHVw bGljYXRlKHAucGRfcmVmKTsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRf dmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfbWVtYmVyJiBwKTsKCiAgaW5saW5lIFRfdmFyJiBvcGVy YXRvcj0gKGNvbnN0IFRfZWxlbWVudCYgcCk7CgogIGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkg Y29uc3QgeyByZXR1cm4gcGRfcmVmOyB9CiAgaW5saW5lIG9wZXJhdG9yIFRfcHRyKCkgY29uc3Qg eyByZXR1cm4gcGRfcmVmOyB9CgogIGlubGluZSBUX3B0ciBpbigpIGNvbnN0IHsgcmV0dXJuIHBk X3JlZjsgfQogIGlubGluZSBUX3B0ciYgaW5vdXQoKSB7IHJldHVybiBwZF9yZWY7IH0KICBpbmxp bmUgVF9wdHImIG91dCgpIHsKICAgIGlmKCAhaXNfbmlsKHBkX3JlZikgKSB7CiAgICAgIHJlbGVh c2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0gVDo6X25pbCgpOwogICAgfQogICAgcmV0dXJuIHBk X3JlZjsKICB9CiAgaW5saW5lIFRfcHRyIF9yZXRuKCkgewogICAgVF9wdHIgdG1wID0gcGRfcmVm OwogICAgcGRfcmVmID0gVDo6X25pbCgpOwogICAgcmV0dXJuIHRtcDsKICB9CgogIGZyaWVuZCBj bGFzcyBPYmplY3RfTWVtYmVyOwogIGZyaWVuZCBjbGFzcyBPYmplY3RfSU5PVVRfYXJnOwogIGZy aWVuZCBjbGFzcyBPYmplY3RfT1VUX2FyZzsKICBmcmllbmQgY2xhc3MgT2JqZWN0X3RjRGVzY19h cmc7Cgpwcml2YXRlOgogIFRfcHRyIHBkX3JlZjsKfTsKCgoKCgpjbGFzcyBPYmplY3RfTWVtYmVy IHsKcHVibGljOgogIHR5cGVkZWYgT2JqZWN0IFQ7CiAgdHlwZWRlZiBPYmplY3RfcHRyIFRfcHRy OwogIHR5cGVkZWYgT2JqZWN0X3ZhciBUX3ZhcjsKICB0eXBlZGVmIE9iamVjdF9NZW1iZXIgVF9t ZW1iZXI7CiAgdHlwZWRlZiBPYmplY3RfRWxlbWVudCBUX2VsZW1lbnQ7CgogIGlubGluZSBPYmpl Y3RfTWVtYmVyKCkgOiBfcHRyKFQ6Ol9uaWwoKSkge30KICBpbmxpbmUgT2JqZWN0X01lbWJlcihj b25zdCBUX21lbWJlciYgcCkgewogICAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUocC5fcHRyKTsKICB9 CiAgaW5saW5lIH5PYmplY3RfTWVtYmVyKCkgewogICAgQ09SQkE6OnJlbGVhc2UoX3B0cik7CiAg fQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAoVF9wdHIgcCkgewogICAgQ09SQkE6OnJl bGVhc2UoX3B0cik7CiAgICBfcHRyID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5l IFRfbWVtYmVyJiBvcGVyYXRvcj0gKGNvbnN0IFRfbWVtYmVyJiBwKSB7CiAgICBpZiggJnAgIT0g dGhpcyApIHsKICAgICAgQ09SQkE6OnJlbGVhc2UoX3B0cik7CiAgICAgIF9wdHIgPSBUOjpfZHVw bGljYXRlKHAuX3B0cik7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9t ZW1iZXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIENPUkJBOjpyZWxlYXNlKF9w dHIpOwogICAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUocCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoK ICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAoY29uc3QgVF9lbGVtZW50JiBwKTsKCiAgaW5s aW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0IHsK ICAgIHJldHVybiBDT1JCQTo6T2JqZWN0OjpfTlBfYWxpZ25lZFNpemUoX3B0cixpbml0aWFsb2Zm c2V0KTsKICB9CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBz KSBjb25zdCB7CiAgICBDT1JCQTo6T2JqZWN0OjpfbWFyc2hhbE9ialJlZihfcHRyLHMpOwogIH0K ICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIE9i amVjdF9wdHIgX3Jlc3VsdCA9IENPUkJBOjpPYmplY3Q6Ol91bm1hcnNoYWxPYmpSZWYocyk7CiAg ICBDT1JCQTo6cmVsZWFzZShfcHRyKTsKICAgIF9wdHIgPSBfcmVzdWx0OwogIH0KICBpbmxpbmUg dm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0IHsKICAgIENPUkJB OjpPYmplY3Q6Ol9tYXJzaGFsT2JqUmVmKF9wdHIscyk7CiAgfQogIGlubGluZSB2b2lkIG9wZXJh dG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgT2JqZWN0X3B0ciBfcmVzdWx0ID0g Q09SQkE6Ok9iamVjdDo6X3VubWFyc2hhbE9ialJlZihzKTsKICAgIENPUkJBOjpyZWxlYXNlKF9w dHIpOwogICAgX3B0ciA9IF9yZXN1bHQ7CiAgfQoKICBpbmxpbmUgT2JqZWN0X3B0ciBvcGVyYXRv ci0+KCkgY29uc3QgeyByZXR1cm4gX3B0cjsgfQogIGlubGluZSBvcGVyYXRvciBPYmplY3RfcHRy ICgpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0KCiAgaW5saW5lIE9iamVjdF9wdHIgaW4oKSBjb25z dCB7IHJldHVybiBfcHRyOyB9CiAgaW5saW5lIE9iamVjdF9wdHImIGlub3V0KCkgeyByZXR1cm4g X3B0cjsgfQogIGlubGluZSBPYmplY3RfcHRyJiBvdXQoKSB7CiAgICBDT1JCQTo6cmVsZWFzZShf cHRyKTsKICAgIF9wdHIgPSBDT1JCQTo6T2JqZWN0OjpfbmlsKCk7CiAgICByZXR1cm4gX3B0cjsK ICB9CiAgaW5saW5lIE9iamVjdF9wdHIgX3JldG4oKSB7CiAgICBPYmplY3RfcHRyIHRtcDsKICAg IHRtcCA9IF9wdHI7CiAgICBfcHRyID0gQ09SQkE6Ok9iamVjdDo6X25pbCgpOwogICAgcmV0dXJu IHRtcDsKICB9CgogIE9iamVjdF9wdHIgX3B0cjsKfTsKCgoKCgpjbGFzcyBPYmplY3RfRWxlbWVu dCB7CnB1YmxpYzoKICB0eXBlZGVmIE9iamVjdCBUOwogIHR5cGVkZWYgT2JqZWN0X3B0ciBUX3B0 cjsKICB0eXBlZGVmIE9iamVjdF92YXIgVF92YXI7CiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRf bWVtYmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1lbnQgVF9lbGVtZW50OwoKICBpbmxpbmUgT2Jq ZWN0X0VsZW1lbnQoVF9wdHImIHAsIF9DT1JCQV9Cb29sZWFuIHJlbCkKICAgIDogcGRfcmVsKHJl bCksIHBkX2RhdGEocCkge30KCiAgaW5saW5lIE9iamVjdF9FbGVtZW50KGNvbnN0IFRfZWxlbWVu dCYgcCkKICAgIDogcGRfcmVsKHAucGRfcmVsKSwgcGRfZGF0YShwLnBkX2RhdGEpIHt9CgogIGlu bGluZSB+T2JqZWN0X0VsZW1lbnQoKSB7CgogIH0KCiAgaW5saW5lIFRfZWxlbWVudCYgb3BlcmF0 b3I9IChUX3B0ciBwKSB7CiAgICBpZiggcGRfcmVsICkgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7 CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBUX2VsZW1l bnQmIG9wZXJhdG9yPSAoY29uc3QgVF9lbGVtZW50JiBwKSB7CiAgICBpZiggcGRfcmVsICkgewog ICAgICBDT1JCQTo6cmVsZWFzZShwZF9kYXRhKTsKICAgICAgVDo6X2R1cGxpY2F0ZShwLnBkX2Rh dGEpOwogICAgICBwZF9kYXRhID0gcC5wZF9kYXRhOwogICAgfQogICAgZWxzZQogICAgICBwZF9k YXRhID0gcC5wZF9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfZWxlbWVu dCYgb3BlcmF0b3I9IChjb25zdCBUX21lbWJlciYgcCkgewogICAgaWYoIHBkX3JlbCApIHsKICAg ICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7CiAgICAgIFQ6Ol9kdXBsaWNhdGUocCk7CiAgICB9 CiAgICBwZF9kYXRhID0gKFRfcHRyKSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5l IFRfZWxlbWVudCYgb3BlcmF0b3I9IChjb25zdCBUX3ZhciYgcCkgewogICAgaWYoIHBkX3JlbCAp IHsKICAgICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7CiAgICAgIFQ6Ol9kdXBsaWNhdGUocCk7 CiAgICB9CiAgICBwZF9kYXRhID0gKFRfcHRyKXA7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBp bmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxp bmUgb3BlcmF0b3IgVF9wdHIgKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQoKICBpbmxpbmUg VF9wdHIgaW4oKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5lIFRfcHRyJiBpbm91 dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgVF9wdHImIG91dCgpIHsKICAgIGlmIChw ZF9yZWwpIHsKICAgICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7CiAgICB9CiAgICBwZF9kYXRh ID0gVDo6X25pbCgpOwogICAgcmV0dXJuIHBkX2RhdGE7CiAgfQoKICBpbmxpbmUgVF9wdHIgX3Jl dG4oKSB7CiAgICBUX3B0ciB0bXAgPSBwZF9kYXRhOwogICAgaWYgKCFwZF9yZWwpIHsgVDo6X2R1 cGxpY2F0ZShwZF9kYXRhKTsgfQogICAgcGRfZGF0YSA9IFQ6Ol9uaWwoKTsKICAgIHJldHVybiB0 bXA7CiAgfQoKICBpbmxpbmUgVF9wdHImIF9OUF9yZWYoKSBjb25zdCB7cmV0dXJuIHBkX2RhdGE7 fQogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBfTlBfcmVsZWFzZSgpIGNvbnN0IHtyZXR1cm4gcGRf cmVsO30KCiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIFRfcHRyJiBwZF9kYXRhOwp9OwoKCgoK CmNsYXNzIE9iamVjdF9JTk9VVF9hcmcgewpwdWJsaWM6CiAgaW5saW5lIE9iamVjdF9JTk9VVF9h cmcoT2JqZWN0X3B0ciYgcCkgOiBfZGF0YShwKSB7fQogIGlubGluZSBPYmplY3RfSU5PVVRfYXJn KE9iamVjdF92YXImIHApIDogX2RhdGEocC5wZF9yZWYpIHt9CiAgaW5saW5lIE9iamVjdF9JTk9V VF9hcmcoT2JqZWN0X01lbWJlciYgcCkgOiBfZGF0YShwLl9wdHIpIHt9CiAgaW5saW5lIE9iamVj dF9JTk9VVF9hcmcoT2JqZWN0X0VsZW1lbnQmIHApIDogX2RhdGEocC5fTlBfcmVmKCkpIHsKCgoK CgoKICAgIGlmKCAhcC5fTlBfcmVsZWFzZSgpICkKICAgICAgT2JqZWN0OjpfZHVwbGljYXRlKHAu X05QX3JlZigpKTsKICB9CiAgaW5saW5lIH5PYmplY3RfSU5PVVRfYXJnKCkge30KCiAgaW5saW5l IG9wZXJhdG9yIE9iamVjdF9wdHImKCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgT2JqZWN0X3B0ciYg X2RhdGE7Cgpwcml2YXRlOgogIE9iamVjdF9JTk9VVF9hcmcoKTsKfTsKCgoKCgpjbGFzcyBPYmpl Y3RfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIE9iamVjdCBUOwogIHR5cGVkZWYgT2JqZWN0 X3B0ciBUX3B0cjsKICB0eXBlZGVmIE9iamVjdF92YXIgVF92YXI7CiAgdHlwZWRlZiBPYmplY3Rf TWVtYmVyIFRfbWVtYmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1lbnQgVF9lbGVtZW50OwogIHR5 cGVkZWYgT2JqZWN0X09VVF9hcmcgVF9vdXQ7CgogIGlubGluZSBPYmplY3RfT1VUX2FyZyhUX3B0 ciYgcCkgOiBfZGF0YShwKSB7IF9kYXRhID0gVDo6X25pbCgpOyB9CiAgaW5saW5lIE9iamVjdF9P VVRfYXJnKFRfdmFyJiBwKSA6IF9kYXRhKHAucGRfcmVmKSB7CiAgICBwID0gVDo6X25pbCgpOwog IH0KICBpbmxpbmUgT2JqZWN0X09VVF9hcmcoVF9tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7 CiAgICBwID0gVDo6X25pbCgpOwogIH0KICBpbmxpbmUgT2JqZWN0X09VVF9hcmcoVF9lbGVtZW50 JiBwKSA6IF9kYXRhKHAuX05QX3JlZigpKSB7CiAgICBwID0gVDo6X25pbCgpOwogIH0KICBpbmxp bmUgT2JqZWN0X09VVF9hcmcoY29uc3QgVF9vdXQmIHApIDogX2RhdGEocC5fZGF0YSkge30KICBp bmxpbmUgfk9iamVjdF9PVVRfYXJnKCkge30KCiAgaW5saW5lIE9iamVjdF9PVVRfYXJnJiBvcGVy YXRvcj0oY29uc3QgVF9vdXQmIHApIHsKICAgIF9kYXRhID0gcC5fZGF0YTsgcmV0dXJuICp0aGlz OyB9CiAgaW5saW5lIE9iamVjdF9PVVRfYXJnJiBvcGVyYXRvcj0oVF9wdHIgcCkgeyBfZGF0YSA9 IHA7IHJldHVybiAqdGhpczsgfQoKICBpbmxpbmUgb3BlcmF0b3IgVF9wdHImKCkgeyByZXR1cm4g X2RhdGE7IH0KICBpbmxpbmUgVF9wdHImIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5l IFRfcHRyIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBUX3B0ciYgX2RhdGE7Cgpw cml2YXRlOgogIE9iamVjdF9PVVRfYXJnKCk7CiAgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX21l bWJlciYgcCk7CiAgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX2VsZW1lbnQmIHApOwogIFRfb3V0 JiBvcGVyYXRvcj0oY29uc3QgVF92YXImIHApOwoKfTsKCgp0eXBlZGVmIE9iamVjdF9PVVRfYXJn IE9iamVjdF9vdXQ7CgoKCgoKY2xhc3MgT2JqZWN0X3RjRGVzY19hcmcgewpwdWJsaWM6CgoKCgoK CiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRfbWVtYmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1l bnQgVF9lbGVtZW50OwogIHR5cGVkZWYgT2JqZWN0X3ZhciBUX3ZhcjsKICBpbmxpbmUgT2JqZWN0 X3RjRGVzY19hcmcoVF92YXImIHApIDogX2RhdGEocC5wZF9yZWYpLCBfcmVsKDEpIHt9CiAgaW5s aW5lIE9iamVjdF90Y0Rlc2NfYXJnKFRfbWVtYmVyJiBwKSA6IF9kYXRhKHAuX3B0ciksIF9yZWwo MSkge30KICBpbmxpbmUgT2JqZWN0X3RjRGVzY19hcmcoVF9lbGVtZW50IHApCiAgICA6IF9kYXRh KHAuX05QX3JlZigpKSwgX3JlbChwLl9OUF9yZWxlYXNlKCkpIHt9CiAgaW5saW5lIH5PYmplY3Rf dGNEZXNjX2FyZygpIHt9CgogIE9iamVjdF9wdHImIF9kYXRhOwogIF9DT1JCQV9Cb29sZWFuIF9y ZWw7Cgpwcml2YXRlOgogIE9iamVjdF90Y0Rlc2NfYXJnKCk7Cn07CgoKCgoKY2xhc3MgVHlwZUNv ZGVfSU5PVVRfYXJnOwpjbGFzcyBUeXBlQ29kZV9PVVRfYXJnOwoKY2xhc3MgVHlwZUNvZGVfdmFy IHsKcHVibGljOgogIHR5cGVkZWYgVHlwZUNvZGVfcHRyIFRfcHRyOwogIHR5cGVkZWYgVHlwZUNv ZGVfdmFyIFRfdmFyOwogIHR5cGVkZWYgVHlwZUNvZGVfbWVtYmVyIFRfbWVtYmVyOwoKICBpbmxp bmUgVHlwZUNvZGVfdmFyKCkgOiBwZF9yZWYoVHlwZUNvZGU6Ol9uaWwoKSkge30KICBpbmxpbmUg VHlwZUNvZGVfdmFyKFRfcHRyIHApIDogcGRfcmVmKHApIHt9CiAgaW5saW5lIFR5cGVDb2RlX3Zh cihjb25zdCBUX3ZhciYgcCkgewogICAgcGRfcmVmID0gVHlwZUNvZGU6Ol9kdXBsaWNhdGUocC5w ZF9yZWYpOwogIH0KICBUeXBlQ29kZV92YXIoY29uc3QgVHlwZUNvZGVfbWVtYmVyJiBwKSB7CiAg ICBwZF9yZWYgPSBUeXBlQ29kZTo6X2R1cGxpY2F0ZShwLl9wdHIpOwogIH0KICB+VHlwZUNvZGVf dmFyKCkgeyByZWxlYXNlKHBkX3JlZik7IH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKFRf cHRyIHApIHsKICAgIHJlbGVhc2UocGRfcmVmKTsKICAgIHBkX3JlZiA9IHA7CiAgICByZXR1cm4g KnRoaXM7CiAgfQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsK ICAgIGlmKCBwZF9yZWYgIT0gcC5wZF9yZWYgKSB7CiAgICAgIHJlbGVhc2UocGRfcmVmKTsKICAg ICAgcGRfcmVmID0gVHlwZUNvZGU6Ol9kdXBsaWNhdGUocC5wZF9yZWYpOwogICAgfQogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0oY29uc3QgVHlwZUNvZGVf bWVtYmVyJiBwKSB7CiAgICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6 X2R1cGxpY2F0ZShwLl9wdHIpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgVF9wdHIgb3BlcmF0 b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIG9wZXJhdG9yIFRfcHRyICgpIGNvbnN0 IHsgcmV0dXJuIHBkX3JlZjsgfQoKICBUX3B0ciBpbigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsg fQogIFRfcHRyJiBpbm91dCgpIHsgcmV0dXJuIHBkX3JlZjsgfQogIFRfcHRyJiBvdXQoKSB7CiAg ICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6X25pbCgpOwogICAgcmV0 dXJuIHBkX3JlZjsKICB9CiAgVF9wdHIgX3JldG4oKSB7CiAgICBUX3B0ciB0bXAgPSBwZF9yZWY7 CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6X25pbCgpOwogICAgcmV0dXJuIHRtcDsKICB9CgogIGZy aWVuZCBjbGFzcyBUeXBlQ29kZV9tZW1iZXI7CiAgZnJpZW5kIGNsYXNzIFR5cGVDb2RlX0lOT1VU X2FyZzsKICBmcmllbmQgY2xhc3MgVHlwZUNvZGVfT1VUX2FyZzsKCnByaXZhdGU6CiAgVF9wdHIg cGRfcmVmOwp9OwoKCgoKCmNsYXNzIFR5cGVDb2RlX0lOT1VUX2FyZyB7CnB1YmxpYzoKICBpbmxp bmUgVHlwZUNvZGVfSU5PVVRfYXJnKFR5cGVDb2RlX3B0ciYgcCkgOiBfZGF0YShwKSB7IH0KICBp bmxpbmUgVHlwZUNvZGVfSU5PVVRfYXJnKFR5cGVDb2RlX3ZhciYgcCkgOiBfZGF0YShwLnBkX3Jl ZikgeyB9CiAgaW5saW5lIFR5cGVDb2RlX0lOT1VUX2FyZyhUeXBlQ29kZV9tZW1iZXImIHApIDog X2RhdGEocC5fcHRyKSB7IH0KICBpbmxpbmUgflR5cGVDb2RlX0lOT1VUX2FyZygpIHt9CgogIGlu bGluZSBvcGVyYXRvciBUeXBlQ29kZV9wdHImKCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgVHlwZUNv ZGVfcHRyJiBfZGF0YTsKCnByaXZhdGU6CiAgVHlwZUNvZGVfSU5PVVRfYXJnKCk7Cn07CgoKCgoK Y2xhc3MgVHlwZUNvZGVfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIFR5cGVDb2RlIFQ7CiAg dHlwZWRlZiBUeXBlQ29kZV9wdHIgVF9wdHI7CiAgdHlwZWRlZiBUeXBlQ29kZV92YXIgVF92YXI7 CiAgdHlwZWRlZiBUeXBlQ29kZV9tZW1iZXIgVF9tZW1iZXI7CgogIFR5cGVDb2RlX09VVF9hcmco VF9wdHImIHApIDogX2RhdGEocCkgeyBfZGF0YSA9IFQ6Ol9uaWwoKTsgfQogIFR5cGVDb2RlX09V VF9hcmcoVF92YXImIHApIDogX2RhdGEocC5wZF9yZWYpIHsKICAgIHAgPSBUOjpfbmlsKCk7CiAg fQogIGlubGluZSBUeXBlQ29kZV9PVVRfYXJnKFRfbWVtYmVyJiBwKSA6IF9kYXRhKHAuX3B0cikg ewogICAgcCA9IFQ6Ol9uaWwoKTsKICB9CiAgaW5saW5lIH5UeXBlQ29kZV9PVVRfYXJnKCkge30K CiAgaW5saW5lIFR5cGVDb2RlX09VVF9hcmcmIG9wZXJhdG9yPShUX3B0ciBwKSB7IF9kYXRhID0g cDsgcmV0dXJuICp0aGlzOyB9CiAgaW5saW5lIFR5cGVDb2RlX09VVF9hcmcmIG9wZXJhdG9yPShj b25zdCBUX21lbWJlciYgcCkgewogICAgX2RhdGEgPSBUOjpfZHVwbGljYXRlKHApOyByZXR1cm4g KnRoaXM7CiAgfQogIGlubGluZSBvcGVyYXRvciBUX3B0ciYoKSB7IHJldHVybiBfZGF0YTsgfQog IGlubGluZSBUX3B0ciYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVF9wdHIgb3Bl cmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9CgogIFRfcHRyJiBfZGF0YTsKCnByaXZhdGU6CiAg VHlwZUNvZGVfT1VUX2FyZygpOwp9OwoKCnR5cGVkZWYgVHlwZUNvZGVfT1VUX2FyZyBUeXBlQ29k ZV9vdXQ7CgoKCgoKY2xhc3MgT1JCX3ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIE9SQiBUOwogIHR5 cGVkZWYgT1JCX3B0ciBUX3B0cjsKICB0eXBlZGVmIE9SQl92YXIgVF92YXI7CgogIGlubGluZSBP UkJfdmFyKCkgOiBwZF9yZWYoVDo6X25pbCgpKSB7fQogIGlubGluZSBPUkJfdmFyKFRfcHRyIHAp IDogcGRfcmVmKHApIHt9CiAgaW5saW5lIE9SQl92YXIoY29uc3QgVF92YXImIHApIDogcGRfcmVm KFQ6Ol9kdXBsaWNhdGUocC5wZF9yZWYpKSB7fQogIGlubGluZSB+T1JCX3ZhcigpIHsgcmVsZWFz ZShwZF9yZWYpOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9IChUX3B0ciBwKSB7CiAgICBy ZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBp bmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9yZWYg IT0gcC5wZF9yZWYgKSB7CiAgICAgIHJlbGVhc2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0gVDo6 X2R1cGxpY2F0ZShwLnBkX3JlZik7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxp bmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIGlubGluZSBv cGVyYXRvciBUX3B0cigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQoKICBpbmxpbmUgVF9wdHIg aW4oKSBjb25zdCB7IHJldHVybiBwZF9yZWY7IH0KICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyBy ZXR1cm4gcGRfcmVmOyB9CiAgaW5saW5lIFRfcHRyJiBvdXQoKSB7CiAgICBpZiggIWlzX25pbChw ZF9yZWYpICkgewogICAgICByZWxlYXNlKHBkX3JlZik7CiAgICAgIHBkX3JlZiA9IFQ6Ol9uaWwo KTsKICAgIH0KICAgIHJldHVybiBwZF9yZWY7CiAgfQogIGlubGluZSBUX3B0ciBfcmV0bigpIHsK ICAgIFRfcHRyIHRtcCA9IHBkX3JlZjsKICAgIHBkX3JlZiA9IFQ6Ol9uaWwoKTsKICAgIHJldHVy biB0bXA7CiAgfQoKcHJpdmF0ZToKICBUX3B0ciBwZF9yZWY7Cn07CgoKCgoKY2xhc3MgQk9BX3Zh ciB7CnB1YmxpYzoKICB0eXBlZGVmIEJPQSBUOwogIHR5cGVkZWYgQk9BX3B0ciBUX3B0cjsKICB0 eXBlZGVmIEJPQV92YXIgVF92YXI7CgogIGlubGluZSBCT0FfdmFyKCkgOiBwZF9yZWYoVDo6X25p bCgpKSB7fQogIGlubGluZSBCT0FfdmFyKFRfcHRyIHApIDogcGRfcmVmKHApIHt9CiAgaW5saW5l IEJPQV92YXIoY29uc3QgVF92YXImIHApIDogcGRfcmVmKFQ6Ol9kdXBsaWNhdGUocC5wZF9yZWYp KSB7fQogIGlubGluZSB+Qk9BX3ZhcigpIHsgcmVsZWFzZShwZF9yZWYpOyB9CgogIGlubGluZSBU X3ZhciYgb3BlcmF0b3I9IChUX3B0ciBwKSB7CiAgICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9y ZWYgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAo Y29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9yZWYgIT0gcC5wZF9yZWYgKSB7CiAgICAgIHJl bGVhc2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0gVDo6X2R1cGxpY2F0ZShwLnBkX3JlZik7CiAg ICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNv bnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIGlubGluZSBvcGVyYXRvciBUX3B0cigpIGNvbnN0IHsg cmV0dXJuIHBkX3JlZjsgfQoKICBpbmxpbmUgVF9wdHIgaW4oKSBjb25zdCB7IHJldHVybiBwZF9y ZWY7IH0KICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gcGRfcmVmOyB9CiAgaW5saW5l IFRfcHRyJiBvdXQoKSB7CiAgICBpZiggIWlzX25pbChwZF9yZWYpICkgewogICAgICByZWxlYXNl KHBkX3JlZik7CiAgICAgIHBkX3JlZiA9IFQ6Ol9uaWwoKTsKICAgIH0KICAgIHJldHVybiBwZF9y ZWY7CiAgfQogIGlubGluZSBUX3B0ciBfcmV0bigpIHsKICAgIFRfcHRyIHRtcCA9IHBkX3JlZjsK ICAgIHBkX3JlZiA9IFQ6Ol9uaWwoKTsKICAgIHJldHVybiB0bXA7CiAgfQoKcHJpdmF0ZToKICBU X3B0ciBwZF9yZWY7Cn07CgoKCgoKCnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8RHluQW55 PiBEeW5BbnlfdmFyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPER5bkVudW0+IER5bkVu dW1fdmFyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPER5blN0cnVjdD4gRHluU3RydWN0 X3ZhcjsKdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxEeW5Vbmlvbj4gRHluVW5pb25fdmFy Owp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPER5blNlcXVlbmNlPiBEeW5TZXF1ZW5jZV92 YXI7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8RHluQXJyYXk+IER5bkFycmF5X3ZhcjsK Cgp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5bkFueSxEeW5BbnlfdmFyPiBEeW5B bnlfbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5bkVudW0sRHluRW51 bV92YXI+IER5bkVudW1fbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5 blN0cnVjdCxEeW5TdHJ1Y3RfdmFyPiBEeW5TdHJ1Y3RfbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Q c2V1ZG9PYmpfTWVtYmVyPER5blVuaW9uLER5blVuaW9uX3Zhcj4gRHluVW5pb25fbWVtYmVyOwp0 eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5blNlcXVlbmNlLER5blNlcXVlbmNlX3Zh cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgRHluU2VxdWVuY2VfbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5 bkFycmF5LER5bkFycmF5X3Zhcj4gRHluQXJyYXlfbWVtYmVyOwoKCnR5cGVkZWYgX0NPUkJBX1Bz ZXVkb09ial9PdXQ8RHluQW55LER5bkFueV92YXI+IER5bkFueV9vdXQ7CnR5cGVkZWYgX0NPUkJB X1BzZXVkb09ial9PdXQ8RHluRW51bSxEeW5FbnVtX3Zhcj4gRHluRW51bV9vdXQ7CnR5cGVkZWYg X0NPUkJBX1BzZXVkb09ial9PdXQ8RHluU3RydWN0LER5blN0cnVjdF92YXI+IER5blN0cnVjdF9v dXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluVW5pb24sRHluVW5pb25fdmFyPiBE eW5Vbmlvbl9vdXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluU2VxdWVuY2UsRHlu U2VxdWVuY2VfdmFyPiBEeW5TZXF1ZW5jZV9vdXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9P dXQ8RHluQXJyYXksRHluQXJyYXlfdmFyPiBEeW5BcnJheV9vdXQ7CiMgMjU5MCAiLi4vLi4vLi4v Li4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAyCgoKfQoKbmFtZXNwYWNlIENPUkJBCnsKCgoK CgoKIyAxICIuLi9vbW5pT1JCMy9pcl9kZWZzLmhoIiAxCgoKCgpleHRlcm4gY29uc3QgQ09SQkE6 OlR5cGVDb2RlX3B0ciBfdGNfU2NvcGVkTmFtZTsKCnR5cGVkZWYgY2hhciogU2NvcGVkTmFtZTsK dHlwZWRlZiBDT1JCQTo6U3RyaW5nX3ZhciBTY29wZWROYW1lX3ZhcjsKCmV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19SZXBvc2l0b3J5SWQ7Cgp0eXBlZGVmIGNoYXIqIFJlcG9z aXRvcnlJZDsKdHlwZWRlZiBDT1JCQTo6U3RyaW5nX3ZhciBSZXBvc2l0b3J5SWRfdmFyOwoKZW51 bSBEZWZpbml0aW9uS2luZCB7IGRrX25vbmUsIGRrX2FsbCwgZGtfQXR0cmlidXRlLCBka19Db25z dGFudCwgZGtfRXhjZXB0aW9uLCBka19JbnRlcmZhY2UsIGRrX01vZHVsZSwgZGtfT3BlcmF0aW9u LCBka19UeXBlZGVmLCBka19BbGlhcywgZGtfU3RydWN0LCBka19VbmlvbiwgZGtfRW51bSwgZGtf UHJpbWl0aXZlLCBka19TdHJpbmcsIGRrX1NlcXVlbmNlLCBka19BcnJheSwgZGtfUmVwb3NpdG9y eSwgZGtfV3N0cmluZywgZGtfRml4ZWQsIGRrX1ZhbHVlLCBka19WYWx1ZUJveCwgZGtfTWVtYmVy LCBka19OYXRpdmUsIGRrX0Fic3RyYWN0SW50ZXJmYWNlIH07CnR5cGVkZWYgRGVmaW5pdGlvbktp bmQmIERlZmluaXRpb25LaW5kX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRy IF90Y19EZWZpbml0aW9uS2luZDsKCgoKCmNsYXNzIElST2JqZWN0OwpjbGFzcyBfb2JqcmVmX0lS T2JqZWN0OwpjbGFzcyBfaW1wbF9JUk9iamVjdDsKCnR5cGVkZWYgX29ianJlZl9JUk9iamVjdCog SVJPYmplY3RfcHRyOwp0eXBlZGVmIElST2JqZWN0X3B0ciBJUk9iamVjdFJlZjsKCmNsYXNzIElS T2JqZWN0X0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIElST2JqZWN0X3B0ciBfcHRyX3R5cGU7 CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19u aWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGlj IHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6 ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5 cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpS ZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9i alJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxf b2JqcmVmX0lST2JqZWN0LCBJUk9iamVjdF9IZWxwZXI+IElST2JqZWN0X3ZhcjsKdHlwZWRlZiBf Q09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9JUk9iamVjdCxJUk9iamVjdF9IZWxwZXIgPiBJ Uk9iamVjdF9vdXQ7CgoKCmNsYXNzIElST2JqZWN0IHsKcHVibGljOgoKICB0eXBlZGVmIElST2Jq ZWN0X3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBJUk9iamVjdF92YXIgX3Zhcl90eXBlOwoKICBz dGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBl IF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoK ICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwog IHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVk U3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hh bE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2Jq ID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSBy ZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJu IHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYo TWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJB OjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0g X25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7 CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNsYXNzIF9vYmpy ZWZfSVJPYmplY3QgOgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpPYmplY3QsIHB1YmxpYyB2aXJ0 dWFsIG9tbmlPYmpSZWYKewpwdWJsaWM6CiAgdm9pZCBkZXN0cm95KCk7CgogIERlZmluaXRpb25L aW5kIGRlZl9raW5kKCk7CgogIGlubGluZSBfb2JqcmVmX0lST2JqZWN0KCkgeyBfUFJfc2V0b2Jq KDApOyB9CiAgX29ianJlZl9JUk9iamVjdChjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxl TGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAg dmlydHVhbCB+X29ianJlZl9JUk9iamVjdCgpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9w dHJUb09ialJlZihjb25zdCBjaGFyKik7CgogIF9vYmpyZWZfSVJPYmplY3QoY29uc3QgX29ianJl Zl9JUk9iamVjdCYpOwogIF9vYmpyZWZfSVJPYmplY3QmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpy ZWZfSVJPYmplY3QmKTsKCn07CgpjbGFzcyBfcG9mX0lST2JqZWN0IDogcHVibGljIHByb3h5T2Jq ZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9JUk9iamVjdCgpIDogcHJveHlPYmpl Y3RGYWN0b3J5KElST2JqZWN0OjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfSVJPYmpl Y3QoKTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6 VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJ ZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBp c19hKGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX0lST2JqZWN0IDoKICBwdWJs aWMgdmlydHVhbCBvbW5pU2VydmFudAp7CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9JUk9iamVj dCgpOwoKICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0gMDsKCiAgdmlydHVhbCBEZWZpbml0aW9u S2luZCBkZWZfa2luZCgpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9k aXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZh Y2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lk KCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfSVJPYmplY3Q7Cgpl eHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVmVyc2lvblNwZWM7Cgp0eXBlZGVm IGNoYXIqIFZlcnNpb25TcGVjOwp0eXBlZGVmIENPUkJBOjpTdHJpbmdfdmFyIFZlcnNpb25TcGVj X3ZhcjsKCgoKCmNsYXNzIENvbnRhaW5lZDsKY2xhc3MgX29ianJlZl9Db250YWluZWQ7CmNsYXNz IF9pbXBsX0NvbnRhaW5lZDsKCnR5cGVkZWYgX29ianJlZl9Db250YWluZWQqIENvbnRhaW5lZF9w dHI7CnR5cGVkZWYgQ29udGFpbmVkX3B0ciBDb250YWluZWRSZWY7CgpjbGFzcyBDb250YWluZWRf SGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgQ29udGFpbmVkX3B0ciBfcHRyX3R5cGU7CgogIHN0 YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0 cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQg ZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5l dEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0 QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihN ZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVm X0NvbnRhaW5lZCwgQ29udGFpbmVkX0hlbHBlcj4gQ29udGFpbmVkX3ZhcjsKdHlwZWRlZiBfQ09S QkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9Db250YWluZWQsQ29udGFpbmVkX0hlbHBlciA+IENv bnRhaW5lZF9vdXQ7CgoKCgoKCmNsYXNzIFJlcG9zaXRvcnk7CmNsYXNzIF9vYmpyZWZfUmVwb3Np dG9yeTsKY2xhc3MgX2ltcGxfUmVwb3NpdG9yeTsKCnR5cGVkZWYgX29ianJlZl9SZXBvc2l0b3J5 KiBSZXBvc2l0b3J5X3B0cjsKdHlwZWRlZiBSZXBvc2l0b3J5X3B0ciBSZXBvc2l0b3J5UmVmOwoK Y2xhc3MgUmVwb3NpdG9yeV9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBSZXBvc2l0b3J5X3B0 ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFf Qm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlw ZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBO UF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9i alJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1 bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBl IHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFf T2JqUmVmX1Zhcjxfb2JqcmVmX1JlcG9zaXRvcnksIFJlcG9zaXRvcnlfSGVscGVyPiBSZXBvc2l0 b3J5X3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9SZXBvc2l0b3J5 LFJlcG9zaXRvcnlfSGVscGVyID4gUmVwb3NpdG9yeV9vdXQ7CgoKCgoKCmNsYXNzIENvbnRhaW5l cjsKY2xhc3MgX29ianJlZl9Db250YWluZXI7CmNsYXNzIF9pbXBsX0NvbnRhaW5lcjsKCnR5cGVk ZWYgX29ianJlZl9Db250YWluZXIqIENvbnRhaW5lcl9wdHI7CnR5cGVkZWYgQ29udGFpbmVyX3B0 ciBDb250YWluZXJSZWY7CgpjbGFzcyBDb250YWluZXJfSGVscGVyIHsKcHVibGljOgogIHR5cGVk ZWYgQ29udGFpbmVyX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwog IHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBy ZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAg c3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGlj IHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3Rh dGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0 aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBz dGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoK dHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX0NvbnRhaW5lciwgQ29udGFpbmVyX0hl bHBlcj4gQ29udGFpbmVyX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJl Zl9Db250YWluZXIsQ29udGFpbmVyX0hlbHBlciA+IENvbnRhaW5lcl9vdXQ7CiMgMjYxICIuLi9v bW5pT1JCMy9pcl9kZWZzLmhoIgpjbGFzcyBDb250YWluZWQgewpwdWJsaWM6CgogIHR5cGVkZWYg Q29udGFpbmVkX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBDb250YWluZWRfdmFyIF92YXJfdHlw ZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9w dHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9u aWwoKTsKCiAgc3RhdGljIGlubGluZSBzaXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6 ZV90KTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRC dWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91 bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3Rf cHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRy X3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAg IHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFs T2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmog PSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJl c3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4g cmVzdWx0OwogIH0KCiAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKICBzdHJ1Y3Qg RGVzY3JpcHRpb24gewogICAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9WYXI8 RGVzY3JpcHRpb24+IF92YXJfdHlwZTsKCiAgICBEZWZpbml0aW9uS2luZCBraW5kOwoKICAgIENP UkJBOjpBbnkgdmFsdWU7CgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlh bG9mZnNldCkgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAm KSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogICAg dm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9w ZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKICB9OwoKICB0eXBlZGVmIERlc2NyaXB0 aW9uOjpfdmFyX3R5cGUgRGVzY3JpcHRpb25fdmFyOwoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJU eXBlX1ZhcmlhYmxlX09VVF9hcmc8IERlc2NyaXB0aW9uLERlc2NyaXB0aW9uX3ZhciA+IERlc2Ny aXB0aW9uX291dDsKCiAgc3RhdGljIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0Rlc2Ny aXB0aW9uOwoKfTsKCmNsYXNzIF9vYmpyZWZfQ29udGFpbmVkIDoKICBwdWJsaWMgdmlydHVhbCBf b2JqcmVmX0lST2JqZWN0CnsKcHVibGljOgogIENvbnRhaW5lZDo6RGVzY3JpcHRpb24qIGRlc2Ny aWJlKCk7CiAgdm9pZCBtb3ZlKENvbnRhaW5lcl9wdHIgbmV3X2NvbnRhaW5lciwgY29uc3QgY2hh ciogbmV3X25hbWUsIGNvbnN0IGNoYXIqIG5ld192ZXJzaW9uKTsKCiAgY2hhciogaWQoKTsKICB2 b2lkIGlkKGNvbnN0IGNoYXIqKTsKICBjaGFyKiBuYW1lKCk7CiAgdm9pZCBuYW1lKGNvbnN0IGNo YXIqKTsKICBjaGFyKiB2ZXJzaW9uKCk7CiAgdm9pZCB2ZXJzaW9uKGNvbnN0IGNoYXIqKTsKICBD b250YWluZXJfcHRyIGRlZmluZWRfaW4oKTsKICBjaGFyKiBhYnNvbHV0ZV9uYW1lKCk7CiAgUmVw b3NpdG9yeV9wdHIgY29udGFpbmluZ19yZXBvc2l0b3J5KCk7CgogIGlubGluZSBfb2JqcmVmX0Nv bnRhaW5lZCgpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpyZWZfQ29udGFpbmVkKGNvbnN0IGNo YXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRl bnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX0NvbnRhaW5lZCgpOwoKcHJp dmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7CgogIF9vYmpy ZWZfQ29udGFpbmVkKGNvbnN0IF9vYmpyZWZfQ29udGFpbmVkJik7CiAgX29ianJlZl9Db250YWlu ZWQmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfQ29udGFpbmVkJik7Cgp9OwoKY2xhc3MgX3Bv Zl9Db250YWluZWQgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGlu ZSBfcG9mX0NvbnRhaW5lZCgpIDogcHJveHlPYmplY3RGYWN0b3J5KENvbnRhaW5lZDo6X1BEX3Jl cG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX0NvbnRhaW5lZCgpOwoKICB2aXJ0dWFsIG9tbmlPYmpS ZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRp dHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9 OwoKY2xhc3MgX2ltcGxfQ29udGFpbmVkIDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9JUk9iamVj dAp7CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9Db250YWluZWQoKTsKCiAgdmlydHVhbCBDb250 YWluZWQ6OkRlc2NyaXB0aW9uKiBkZXNjcmliZSgpID0gMDsKICB2aXJ0dWFsIHZvaWQgbW92ZShD b250YWluZXJfcHRyIG5ld19jb250YWluZXIsIGNvbnN0IGNoYXIqIG5ld19uYW1lLCBjb25zdCBj aGFyKiBuZXdfdmVyc2lvbikgPSAwOwoKICB2aXJ0dWFsIGNoYXIqIGlkKCkgPSAwOwogIHZpcnR1 YWwgdm9pZCBpZChjb25zdCBjaGFyKikgPSAwOwogIHZpcnR1YWwgY2hhciogbmFtZSgpID0gMDsK ICB2aXJ0dWFsIHZvaWQgbmFtZShjb25zdCBjaGFyKikgPSAwOwogIHZpcnR1YWwgY2hhciogdmVy c2lvbigpID0gMDsKICB2aXJ0dWFsIHZvaWQgdmVyc2lvbihjb25zdCBjaGFyKikgPSAwOwogIHZp cnR1YWwgQ29udGFpbmVyX3B0ciBkZWZpbmVkX2luKCkgPSAwOwogIHZpcnR1YWwgY2hhciogYWJz b2x1dGVfbmFtZSgpID0gMDsKICB2aXJ0dWFsIFJlcG9zaXRvcnlfcHRyIGNvbnRhaW5pbmdfcmVw b3NpdG9yeSgpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRj aChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29u c3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07 CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQ29udGFpbmVkOwoKCgoKY2xh c3MgTW9kdWxlRGVmOwpjbGFzcyBfb2JqcmVmX01vZHVsZURlZjsKY2xhc3MgX2ltcGxfTW9kdWxl RGVmOwoKdHlwZWRlZiBfb2JqcmVmX01vZHVsZURlZiogTW9kdWxlRGVmX3B0cjsKdHlwZWRlZiBN b2R1bGVEZWZfcHRyIE1vZHVsZURlZlJlZjsKCmNsYXNzIE1vZHVsZURlZl9IZWxwZXIgewpwdWJs aWM6CiAgdHlwZWRlZiBNb2R1bGVEZWZfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlw ZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0 YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0 cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90 KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJl YW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVh bSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0 cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3Ry ZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfTW9kdWxlRGVmLCBN b2R1bGVEZWZfSGVscGVyPiBNb2R1bGVEZWZfdmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VU X2FyZzxfb2JqcmVmX01vZHVsZURlZixNb2R1bGVEZWZfSGVscGVyID4gTW9kdWxlRGVmX291dDsK CgoKCgoKY2xhc3MgQ29uc3RhbnREZWY7CmNsYXNzIF9vYmpyZWZfQ29uc3RhbnREZWY7CmNsYXNz IF9pbXBsX0NvbnN0YW50RGVmOwoKdHlwZWRlZiBfb2JqcmVmX0NvbnN0YW50RGVmKiBDb25zdGFu dERlZl9wdHI7CnR5cGVkZWYgQ29uc3RhbnREZWZfcHRyIENvbnN0YW50RGVmUmVmOwoKY2xhc3Mg Q29uc3RhbnREZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgQ29uc3RhbnREZWZfcHRyIF9w dHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29s ZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsK ICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2Fs aWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVm KF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFy c2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpS ZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5t YXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpS ZWZfVmFyPF9vYmpyZWZfQ29uc3RhbnREZWYsIENvbnN0YW50RGVmX0hlbHBlcj4gQ29uc3RhbnRE ZWZfdmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0NvbnN0YW50RGVm LENvbnN0YW50RGVmX0hlbHBlciA+IENvbnN0YW50RGVmX291dDsKIyA0NzcgIi4uL29tbmlPUkIz L2lyX2RlZnMuaGgiCmNsYXNzIFN0cnVjdERlZjsKY2xhc3MgX29ianJlZl9TdHJ1Y3REZWY7CmNs YXNzIF9pbXBsX1N0cnVjdERlZjsKCnR5cGVkZWYgX29ianJlZl9TdHJ1Y3REZWYqIFN0cnVjdERl Zl9wdHI7CnR5cGVkZWYgU3RydWN0RGVmX3B0ciBTdHJ1Y3REZWZSZWY7CgpjbGFzcyBTdHJ1Y3RE ZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgU3RydWN0RGVmX3B0ciBfcHRyX3R5cGU7Cgog IHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwo X3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZv aWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShf cHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUs IE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYo TmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlw ZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJl ZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2Jq cmVmX1N0cnVjdERlZiwgU3RydWN0RGVmX0hlbHBlcj4gU3RydWN0RGVmX3ZhcjsKdHlwZWRlZiBf Q09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9TdHJ1Y3REZWYsU3RydWN0RGVmX0hlbHBlciA+ IFN0cnVjdERlZl9vdXQ7CgoKCgoKCmNsYXNzIFVuaW9uRGVmOwpjbGFzcyBfb2JqcmVmX1VuaW9u RGVmOwpjbGFzcyBfaW1wbF9VbmlvbkRlZjsKCnR5cGVkZWYgX29ianJlZl9VbmlvbkRlZiogVW5p b25EZWZfcHRyOwp0eXBlZGVmIFVuaW9uRGVmX3B0ciBVbmlvbkRlZlJlZjsKCmNsYXNzIFVuaW9u RGVmX0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIFVuaW9uRGVmX3B0ciBfcHRyX3R5cGU7Cgog IHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwo X3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZv aWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShf cHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUs IE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYo TmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlw ZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJl ZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2Jq cmVmX1VuaW9uRGVmLCBVbmlvbkRlZl9IZWxwZXI+IFVuaW9uRGVmX3ZhcjsKdHlwZWRlZiBfQ09S QkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9VbmlvbkRlZixVbmlvbkRlZl9IZWxwZXIgPiBVbmlv bkRlZl9vdXQ7CgoKCgoKCmNsYXNzIEVudW1EZWY7CmNsYXNzIF9vYmpyZWZfRW51bURlZjsKY2xh c3MgX2ltcGxfRW51bURlZjsKCnR5cGVkZWYgX29ianJlZl9FbnVtRGVmKiBFbnVtRGVmX3B0cjsK dHlwZWRlZiBFbnVtRGVmX3B0ciBFbnVtRGVmUmVmOwoKY2xhc3MgRW51bURlZl9IZWxwZXIgewpw dWJsaWM6CiAgdHlwZWRlZiBFbnVtRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5 cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBz dGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9w dHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVf dCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3Ry ZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJl YW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRT dHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0 cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX0VudW1EZWYsIEVu dW1EZWZfSGVscGVyPiBFbnVtRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8 X29ianJlZl9FbnVtRGVmLEVudW1EZWZfSGVscGVyID4gRW51bURlZl9vdXQ7CgoKCgoKCmNsYXNz IEFsaWFzRGVmOwpjbGFzcyBfb2JqcmVmX0FsaWFzRGVmOwpjbGFzcyBfaW1wbF9BbGlhc0RlZjsK CnR5cGVkZWYgX29ianJlZl9BbGlhc0RlZiogQWxpYXNEZWZfcHRyOwp0eXBlZGVmIEFsaWFzRGVm X3B0ciBBbGlhc0RlZlJlZjsKCmNsYXNzIEFsaWFzRGVmX0hlbHBlciB7CnB1YmxpYzoKICB0eXBl ZGVmIEFsaWFzRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwog IHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBy ZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAg c3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGlj IHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3Rh dGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0 aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBz dGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoK dHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX0FsaWFzRGVmLCBBbGlhc0RlZl9IZWxw ZXI+IEFsaWFzRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9B bGlhc0RlZixBbGlhc0RlZl9IZWxwZXIgPiBBbGlhc0RlZl9vdXQ7CgoKCgoKCmNsYXNzIEludGVy ZmFjZURlZjsKY2xhc3MgX29ianJlZl9JbnRlcmZhY2VEZWY7CmNsYXNzIF9pbXBsX0ludGVyZmFj ZURlZjsKCnR5cGVkZWYgX29ianJlZl9JbnRlcmZhY2VEZWYqIEludGVyZmFjZURlZl9wdHI7CnR5 cGVkZWYgSW50ZXJmYWNlRGVmX3B0ciBJbnRlcmZhY2VEZWZSZWY7CgpjbGFzcyBJbnRlcmZhY2VE ZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgSW50ZXJmYWNlRGVmX3B0ciBfcHRyX3R5cGU7 CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19u aWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGlj IHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6 ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5 cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpS ZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9i alJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxf b2JqcmVmX0ludGVyZmFjZURlZiwgSW50ZXJmYWNlRGVmX0hlbHBlcj4gSW50ZXJmYWNlRGVmX3Zh cjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9JbnRlcmZhY2VEZWYsSW50 ZXJmYWNlRGVmX0hlbHBlciA+IEludGVyZmFjZURlZl9vdXQ7CgoKCgoKCmNsYXNzIFZhbHVlRGVm OwpjbGFzcyBfb2JqcmVmX1ZhbHVlRGVmOwpjbGFzcyBfaW1wbF9WYWx1ZURlZjsKCnR5cGVkZWYg X29ianJlZl9WYWx1ZURlZiogVmFsdWVEZWZfcHRyOwp0eXBlZGVmIFZhbHVlRGVmX3B0ciBWYWx1 ZURlZlJlZjsKCmNsYXNzIFZhbHVlRGVmX0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIFZhbHVl RGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBf Q09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9w dHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNp emVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFy c2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJf dHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBt YXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0 cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBf Q09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1ZhbHVlRGVmLCBWYWx1ZURlZl9IZWxwZXI+IFZhbHVl RGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9WYWx1ZURlZixW YWx1ZURlZl9IZWxwZXIgPiBWYWx1ZURlZl9vdXQ7CgoKCgoKCmNsYXNzIFZhbHVlQm94RGVmOwpj bGFzcyBfb2JqcmVmX1ZhbHVlQm94RGVmOwpjbGFzcyBfaW1wbF9WYWx1ZUJveERlZjsKCnR5cGVk ZWYgX29ianJlZl9WYWx1ZUJveERlZiogVmFsdWVCb3hEZWZfcHRyOwp0eXBlZGVmIFZhbHVlQm94 RGVmX3B0ciBWYWx1ZUJveERlZlJlZjsKCmNsYXNzIFZhbHVlQm94RGVmX0hlbHBlciB7CnB1Ymxp YzoKICB0eXBlZGVmIFZhbHVlQm94RGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5 cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBz dGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9w dHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVf dCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3Ry ZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJl YW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRT dHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0 cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1ZhbHVlQm94RGVm LCBWYWx1ZUJveERlZl9IZWxwZXI+IFZhbHVlQm94RGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2Jq UmVmX09VVF9hcmc8X29ianJlZl9WYWx1ZUJveERlZixWYWx1ZUJveERlZl9IZWxwZXIgPiBWYWx1 ZUJveERlZl9vdXQ7CgoKCgoKCmNsYXNzIEV4Y2VwdGlvbkRlZjsKY2xhc3MgX29ianJlZl9FeGNl cHRpb25EZWY7CmNsYXNzIF9pbXBsX0V4Y2VwdGlvbkRlZjsKCnR5cGVkZWYgX29ianJlZl9FeGNl cHRpb25EZWYqIEV4Y2VwdGlvbkRlZl9wdHI7CnR5cGVkZWYgRXhjZXB0aW9uRGVmX3B0ciBFeGNl cHRpb25EZWZSZWY7CgpjbGFzcyBFeGNlcHRpb25EZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVk ZWYgRXhjZXB0aW9uRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgp OwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9p ZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7 CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3Rh dGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAg c3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBz dGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsK ICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9 OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgRXhjZXB0 aW9uRGVmX0hlbHBlcj4gRXhjZXB0aW9uRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09V VF9hcmc8X29ianJlZl9FeGNlcHRpb25EZWYsRXhjZXB0aW9uRGVmX0hlbHBlciA+IEV4Y2VwdGlv bkRlZl9vdXQ7CgoKCgoKCmNsYXNzIE5hdGl2ZURlZjsKY2xhc3MgX29ianJlZl9OYXRpdmVEZWY7 CmNsYXNzIF9pbXBsX05hdGl2ZURlZjsKCnR5cGVkZWYgX29ianJlZl9OYXRpdmVEZWYqIE5hdGl2 ZURlZl9wdHI7CnR5cGVkZWYgTmF0aXZlRGVmX3B0ciBOYXRpdmVEZWZSZWY7CgpjbGFzcyBOYXRp dmVEZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgTmF0aXZlRGVmX3B0ciBfcHRyX3R5cGU7 CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19u aWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGlj IHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6 ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5 cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpS ZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9i alJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxf b2JqcmVmX05hdGl2ZURlZiwgTmF0aXZlRGVmX0hlbHBlcj4gTmF0aXZlRGVmX3ZhcjsKdHlwZWRl ZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9OYXRpdmVEZWYsTmF0aXZlRGVmX0hlbHBl ciA+IE5hdGl2ZURlZl9vdXQ7CgoKCgoKCmNsYXNzIEFic3RyYWN0SW50ZXJmYWNlRGVmOwpjbGFz cyBfb2JqcmVmX0Fic3RyYWN0SW50ZXJmYWNlRGVmOwpjbGFzcyBfaW1wbF9BYnN0cmFjdEludGVy ZmFjZURlZjsKCnR5cGVkZWYgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZiogQWJzdHJhY3RJ bnRlcmZhY2VEZWZfcHRyOwp0eXBlZGVmIEFic3RyYWN0SW50ZXJmYWNlRGVmX3B0ciBBYnN0cmFj dEludGVyZmFjZURlZlJlZjsKCmNsYXNzIEFic3RyYWN0SW50ZXJmYWNlRGVmX0hlbHBlciB7CnB1 YmxpYzoKICB0eXBlZGVmIEFic3RyYWN0SW50ZXJmYWNlRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0 YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0 cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQg ZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5l dEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0 QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihN ZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVm X0Fic3RyYWN0SW50ZXJmYWNlRGVmLCBBYnN0cmFjdEludGVyZmFjZURlZl9IZWxwZXI+IEFic3Ry YWN0SW50ZXJmYWNlRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJl Zl9BYnN0cmFjdEludGVyZmFjZURlZixBYnN0cmFjdEludGVyZmFjZURlZl9IZWxwZXIgPiBBYnN0 cmFjdEludGVyZmFjZURlZl9vdXQ7CgoKCgoKCmNsYXNzIFdzdHJpbmdEZWY7CmNsYXNzIF9vYmpy ZWZfV3N0cmluZ0RlZjsKY2xhc3MgX2ltcGxfV3N0cmluZ0RlZjsKCnR5cGVkZWYgX29ianJlZl9X c3RyaW5nRGVmKiBXc3RyaW5nRGVmX3B0cjsKdHlwZWRlZiBXc3RyaW5nRGVmX3B0ciBXc3RyaW5n RGVmUmVmOwoKY2xhc3MgV3N0cmluZ0RlZl9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBXc3Ry aW5nRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRp YyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNl KF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGlj IHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQg bWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9w dHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9p ZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMg X3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRl ZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1dzdHJpbmdEZWYsIFdzdHJpbmdEZWZfSGVscGVy PiBXc3RyaW5nRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9X c3RyaW5nRGVmLFdzdHJpbmdEZWZfSGVscGVyID4gV3N0cmluZ0RlZl9vdXQ7CgoKCgoKCmNsYXNz IEZpeGVkRGVmOwpjbGFzcyBfb2JqcmVmX0ZpeGVkRGVmOwpjbGFzcyBfaW1wbF9GaXhlZERlZjsK CnR5cGVkZWYgX29ianJlZl9GaXhlZERlZiogRml4ZWREZWZfcHRyOwp0eXBlZGVmIEZpeGVkRGVm X3B0ciBGaXhlZERlZlJlZjsKCmNsYXNzIEZpeGVkRGVmX0hlbHBlciB7CnB1YmxpYzoKICB0eXBl ZGVmIEZpeGVkRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwog IHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBy ZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAg c3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGlj IHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3Rh dGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0 aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBz dGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoK dHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX0ZpeGVkRGVmLCBGaXhlZERlZl9IZWxw ZXI+IEZpeGVkRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9G aXhlZERlZixGaXhlZERlZl9IZWxwZXIgPiBGaXhlZERlZl9vdXQ7CgoKCmV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19JbnRlcmZhY2VEZWZTZXE7CgpjbGFzcyBJbnRlcmZhY2VE ZWZTZXFfdmFyOwoKY2xhc3MgSW50ZXJmYWNlRGVmU2VxIDogcHVibGljIF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2VfT2JqUmVmPCBfb2JqcmVmX0ludGVyZmFjZURlZiwgX0NPUkJBX09ialJlZl9F bGVtZW50PCBfb2JqcmVmX0ludGVyZmFjZURlZiwgSW50ZXJmYWNlRGVmX0hlbHBlcj4gLCBJbnRl cmZhY2VEZWZfSGVscGVyPiB7CnB1YmxpYzoKICB0eXBlZGVmIEludGVyZmFjZURlZlNlcV92YXIg X3Zhcl90eXBlOwogIGlubGluZSBJbnRlcmZhY2VEZWZTZXEoKSB7fQogIGlubGluZSBJbnRlcmZh Y2VEZWZTZXEoY29uc3QgSW50ZXJmYWNlRGVmU2VxJiBzKQogICAgOiBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9JbnRlcmZhY2VEZWYsIF9DT1JCQV9PYmpSZWZfRWxl bWVudDwgX29ianJlZl9JbnRlcmZhY2VEZWYsIEludGVyZmFjZURlZl9IZWxwZXI+ICwgSW50ZXJm YWNlRGVmX0hlbHBlcj4gKHMpIHt9CgogIGlubGluZSBJbnRlcmZhY2VEZWZTZXEoX0NPUkJBX1VM b25nIF9tYXgpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPCBfb2JqcmVm X0ludGVyZmFjZURlZiwgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0ludGVyZmFjZURl ZiwgSW50ZXJmYWNlRGVmX0hlbHBlcj4gLCBJbnRlcmZhY2VEZWZfSGVscGVyPiAoX21heCkge30K ICBpbmxpbmUgSW50ZXJmYWNlRGVmU2VxKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcg X2xlbiwgSW50ZXJmYWNlRGVmX3B0ciogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAg OiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9JbnRlcmZhY2VEZWYs IF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9JbnRlcmZhY2VEZWYsIEludGVyZmFjZURl Zl9IZWxwZXI+ICwgSW50ZXJmYWNlRGVmX0hlbHBlcj4gKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwp IHt9CgogIGlubGluZSBJbnRlcmZhY2VEZWZTZXEmIG9wZXJhdG9yID0gKGNvbnN0IEludGVyZmFj ZURlZlNlcSYgcykgewogICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8IF9vYmpy ZWZfSW50ZXJmYWNlRGVmLCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfSW50ZXJmYWNl RGVmLCBJbnRlcmZhY2VEZWZfSGVscGVyPiAsIEludGVyZmFjZURlZl9IZWxwZXI+IDo6b3BlcmF0 b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIEludGVyZmFjZURlZlNlcV9v dXQ7CgpjbGFzcyBJbnRlcmZhY2VEZWZTZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgSW50ZXJm YWNlRGVmU2VxIFQ7CiAgdHlwZWRlZiBJbnRlcmZhY2VEZWZTZXFfdmFyIFRfdmFyOwoKICBpbmxp bmUgSW50ZXJmYWNlRGVmU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBJbnRlcmZh Y2VEZWZTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBJbnRlcmZhY2VEZWZT ZXFfdmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgX3BkX3NlcSA9IG5l dyBUKCpzLl9wZF9zZXEpOwogICAgZWxzZSBfcGRfc2VxID0gMDsKICB9CiAgaW5saW5lIH5JbnRl cmZhY2VEZWZTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlu bGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUg X3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUg VF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkg ewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0g KnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9z ZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5s aW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9JbnRlcmZhY2VEZWYsIEludGVyZmFj ZURlZl9IZWxwZXI+IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgcykgewogICAgcmV0dXJuICgq X3BkX3NlcSlbc107CiAgfQoKICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4gX3Bk X3NlcTsgfQoKCgogIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiAq X3BkX3NlcTsgfQogIGlubGluZSBvcGVyYXRvciBUJiAoKSB7IHJldHVybiAqX3BkX3NlcTsgfQoK CiAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxp bmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUKiYgb3V0KCkgewog ICAgaWYoIF9wZF9zZXEgKSB7IGRlbGV0ZSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgfQogICAgcmV0 dXJuIF9wZF9zZXE7CiAgfQogIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gX3BkX3NlcTsg X3BkX3NlcSA9IDA7IHJldHVybiB0bXA7IH0KCiAgZnJpZW5kIGNsYXNzIEludGVyZmFjZURlZlNl cV9vdXQ7Cgpwcml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBJbnRlcmZhY2VEZWZTZXFf b3V0IHsKcHVibGljOgogIHR5cGVkZWYgSW50ZXJmYWNlRGVmU2VxIFQ7CiAgdHlwZWRlZiBJbnRl cmZhY2VEZWZTZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgSW50ZXJmYWNlRGVmU2VxX291dChUKiYg cykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQogIGlubGluZSBJbnRlcmZhY2VEZWZTZXFfb3V0 KFRfdmFyJiBzKQogICAgOiBfZGF0YShzLl9wZF9zZXEpIHsgcyA9IChUKikgMDsgfQogIGlubGlu ZSBJbnRlcmZhY2VEZWZTZXFfb3V0KGNvbnN0IEludGVyZmFjZURlZlNlcV9vdXQmIHMpIDogX2Rh dGEocy5fZGF0YSkge30KICBpbmxpbmUgSW50ZXJmYWNlRGVmU2VxX291dCYgb3BlcmF0b3IgPSAo Y29uc3QgSW50ZXJmYWNlRGVmU2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9kYXRhOwogICAg cmV0dXJuICp0aGlzOwogIH0gaW5saW5lIEludGVyZmFjZURlZlNlcV9vdXQmIG9wZXJhdG9yID0g KFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIG9w ZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVy biBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAg aW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9JbnRlcmZhY2VEZWYsIEludGVy ZmFjZURlZl9IZWxwZXI+IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJu ICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBJbnRlcmZhY2VEZWZT ZXFfb3V0KCk7CiAgSW50ZXJmYWNlRGVmU2VxX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7 Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVmFsdWVEZWZTZXE7Cgpj bGFzcyBWYWx1ZURlZlNlcV92YXI7CgpjbGFzcyBWYWx1ZURlZlNlcSA6IHB1YmxpYyBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9WYWx1ZURlZiwgX0NPUkJBX09ialJl Zl9FbGVtZW50PCBfb2JqcmVmX1ZhbHVlRGVmLCBWYWx1ZURlZl9IZWxwZXI+ICwgVmFsdWVEZWZf SGVscGVyPiB7CnB1YmxpYzoKICB0eXBlZGVmIFZhbHVlRGVmU2VxX3ZhciBfdmFyX3R5cGU7CiAg aW5saW5lIFZhbHVlRGVmU2VxKCkge30KICBpbmxpbmUgVmFsdWVEZWZTZXEoY29uc3QgVmFsdWVE ZWZTZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPCBfb2JqcmVm X1ZhbHVlRGVmLCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfVmFsdWVEZWYsIFZhbHVl RGVmX0hlbHBlcj4gLCBWYWx1ZURlZl9IZWxwZXI+IChzKSB7fQoKICBpbmxpbmUgVmFsdWVEZWZT ZXEoX0NPUkJBX1VMb25nIF9tYXgpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2Jq UmVmPCBfb2JqcmVmX1ZhbHVlRGVmLCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfVmFs dWVEZWYsIFZhbHVlRGVmX0hlbHBlcj4gLCBWYWx1ZURlZl9IZWxwZXI+IChfbWF4KSB7fQogIGlu bGluZSBWYWx1ZURlZlNlcShfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VMb25nIF9sZW4sIFZh bHVlRGVmX3B0ciogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9WYWx1ZURlZiwgX0NPUkJBX09ialJlZl9F bGVtZW50PCBfb2JqcmVmX1ZhbHVlRGVmLCBWYWx1ZURlZl9IZWxwZXI+ICwgVmFsdWVEZWZfSGVs cGVyPiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KCiAgaW5saW5lIFZhbHVlRGVmU2VxJiBv cGVyYXRvciA9IChjb25zdCBWYWx1ZURlZlNlcSYgcykgewogICAgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfVmFsdWVEZWYsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwg X29ianJlZl9WYWx1ZURlZiwgVmFsdWVEZWZfSGVscGVyPiAsIFZhbHVlRGVmX0hlbHBlcj4gOjpv cGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgVmFsdWVEZWZTZXFf b3V0OwoKY2xhc3MgVmFsdWVEZWZTZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgVmFsdWVEZWZT ZXEgVDsKICB0eXBlZGVmIFZhbHVlRGVmU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIFZhbHVlRGVm U2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBWYWx1ZURlZlNlcV92YXIoVCogcykg OiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIFZhbHVlRGVmU2VxX3Zhcihjb25zdCBUX3ZhciYgcykg ewogICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgIGVs c2UgX3BkX3NlcSA9IDA7CiAgfQogIGlubGluZSB+VmFsdWVEZWZTZXFfdmFyKCkgeyBpZiggX3Bk X3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCog cykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwog ICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRf dmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRf c2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZigg X3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAg fQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwg X29ianJlZl9WYWx1ZURlZiwgVmFsdWVEZWZfSGVscGVyPiBvcGVyYXRvciBbXSAoX0NPUkJBX1VM b25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogIH0KCiAgaW5saW5lIFQqIG9wZXJh dG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICBpbmxpbmUgb3BlcmF0b3IgY29uc3Qg VCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkg eyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0 dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0K ICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsg X3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2VxOwogIH0KICBpbmxpbmUgVCogX3JldG4o KSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogIGZyaWVu ZCBjbGFzcyBWYWx1ZURlZlNlcV9vdXQ7Cgpwcml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFz cyBWYWx1ZURlZlNlcV9vdXQgewpwdWJsaWM6CiAgdHlwZWRlZiBWYWx1ZURlZlNlcSBUOwogIHR5 cGVkZWYgVmFsdWVEZWZTZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgVmFsdWVEZWZTZXFfb3V0KFQq JiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIFZhbHVlRGVmU2VxX291dChU X3ZhciYgcykKICAgIDogX2RhdGEocy5fcGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICBpbmxpbmUg VmFsdWVEZWZTZXFfb3V0KGNvbnN0IFZhbHVlRGVmU2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRh KSB7fQogIGlubGluZSBWYWx1ZURlZlNlcV9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IFZhbHVlRGVm U2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0g aW5saW5lIFZhbHVlRGVmU2VxX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBz OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4g X2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQq IG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9F bGVtZW50PCBfb2JqcmVmX1ZhbHVlRGVmLCBWYWx1ZURlZl9IZWxwZXI+IG9wZXJhdG9yIFtdIChf Q09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRh OwoKcHJpdmF0ZToKICBWYWx1ZURlZlNlcV9vdXQoKTsKICBWYWx1ZURlZlNlcV9vdXQmIG9wZXJh dG9yPShjb25zdCBUX3ZhciYpOwp9OwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIg X3RjX0Fic3RyYWN0SW50ZXJmYWNlRGVmU2VxOwoKY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VEZWZT ZXFfdmFyOwoKY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXEgOiBwdWJsaWMgX0NPUkJBX1Vu Ym91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfQWJzdHJhY3RJbnRlcmZhY2VEZWYsIF9D T1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZiwgQWJzdHJh Y3RJbnRlcmZhY2VEZWZfSGVscGVyPiAsIEFic3RyYWN0SW50ZXJmYWNlRGVmX0hlbHBlcj4gewpw dWJsaWM6CiAgdHlwZWRlZiBBYnN0cmFjdEludGVyZmFjZURlZlNlcV92YXIgX3Zhcl90eXBlOwog IGlubGluZSBBYnN0cmFjdEludGVyZmFjZURlZlNlcSgpIHt9CiAgaW5saW5lIEFic3RyYWN0SW50 ZXJmYWNlRGVmU2VxKGNvbnN0IEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxJiBzKQogICAgOiBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURl ZiwgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0Fic3RyYWN0SW50ZXJmYWNlRGVmLCBB YnN0cmFjdEludGVyZmFjZURlZl9IZWxwZXI+ICwgQWJzdHJhY3RJbnRlcmZhY2VEZWZfSGVscGVy PiAocykge30KCiAgaW5saW5lIEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxKF9DT1JCQV9VTG9uZyBf bWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9BYnN0 cmFjdEludGVyZmFjZURlZiwgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0Fic3RyYWN0 SW50ZXJmYWNlRGVmLCBBYnN0cmFjdEludGVyZmFjZURlZl9IZWxwZXI+ICwgQWJzdHJhY3RJbnRl cmZhY2VEZWZfSGVscGVyPiAoX21heCkge30KICBpbmxpbmUgQWJzdHJhY3RJbnRlcmZhY2VEZWZT ZXEoX0NPUkJBX1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVuLCBBYnN0cmFjdEludGVyZmFj ZURlZl9wdHIqIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91 bmRlZF9TZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfQWJzdHJhY3RJbnRlcmZhY2VEZWYsIF9DT1JC QV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZiwgQWJzdHJhY3RJ bnRlcmZhY2VEZWZfSGVscGVyPiAsIEFic3RyYWN0SW50ZXJmYWNlRGVmX0hlbHBlcj4gKF9tYXgs IF9sZW4sIF92YWwsIF9yZWwpIHt9CgogIGlubGluZSBBYnN0cmFjdEludGVyZmFjZURlZlNlcSYg b3BlcmF0b3IgPSAoY29uc3QgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXEmIHMpIHsKICAgIF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPCBfb2JqcmVmX0Fic3RyYWN0SW50ZXJmYWNlRGVm LCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfQWJzdHJhY3RJbnRlcmZhY2VEZWYsIEFi c3RyYWN0SW50ZXJmYWNlRGVmX0hlbHBlcj4gLCBBYnN0cmFjdEludGVyZmFjZURlZl9IZWxwZXI+ IDo6b3BlcmF0b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIEFic3RyYWN0 SW50ZXJmYWNlRGVmU2VxX291dDsKCmNsYXNzIEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxX3ZhciB7 CnB1YmxpYzoKICB0eXBlZGVmIEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxIFQ7CiAgdHlwZWRlZiBB YnN0cmFjdEludGVyZmFjZURlZlNlcV92YXIgVF92YXI7CgogIGlubGluZSBBYnN0cmFjdEludGVy ZmFjZURlZlNlcV92YXIoKSA6IF9wZF9zZXEoMCkge30KICBpbmxpbmUgQWJzdHJhY3RJbnRlcmZh Y2VEZWZTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBBYnN0cmFjdEludGVy ZmFjZURlZlNlcV92YXIoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRf c2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBpbmxp bmUgfkFic3RyYWN0SW50ZXJmYWNlRGVmU2VxX3ZhcigpIHsgaWYoIF9wZF9zZXEgKSBkZWxldGUg X3BkX3NlcTsgfQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIGlmKCBf cGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7CiAgICBfcGRfc2VxID0gczsKICAgIHJldHVybiAqdGhp czsKICB9CiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChjb25zdCBUX3ZhciYgcykgewogICAg aWYoIHMuX3BkX3NlcSApIHsKICAgICAgaWYoICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwog ICAgICAqX3BkX3NlcSA9ICpzLl9wZF9zZXE7CiAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAg ICAgIGRlbGV0ZSBfcGRfc2VxOwogICAgICBfcGRfc2VxID0gMDsKICAgIH0KICAgIHJldHVybiAq dGhpczsKICB9CgogIGlubGluZSBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfQWJzdHJh Y3RJbnRlcmZhY2VEZWYsIEFic3RyYWN0SW50ZXJmYWNlRGVmX0hlbHBlcj4gb3BlcmF0b3IgW10g KF9DT1JCQV9VTG9uZyBzKSB7CiAgICByZXR1cm4gKCpfcGRfc2VxKVtzXTsKICB9CgogIGlubGlu ZSBUKiBvcGVyYXRvciAtPiAoKSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgaW5saW5lIG9wZXJh dG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIG9wZXJh dG9yIFQmICgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CgoKICBpbmxpbmUgY29uc3QgVCYgaW4oKSBj b25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpf cGRfc2VxOyB9CiAgaW5saW5lIFQqJiBvdXQoKSB7CiAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRl IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9CiAgICByZXR1cm4gX3BkX3NlcTsKICB9CiAgaW5saW5l IFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsg fQoKICBmcmllbmQgY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXFfb3V0OwoKcHJpdmF0ZToK ICBUKiBfcGRfc2VxOwp9OwoKY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXFfb3V0IHsKcHVi bGljOgogIHR5cGVkZWYgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXEgVDsKICB0eXBlZGVmIEFic3Ry YWN0SW50ZXJmYWNlRGVmU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIEFic3RyYWN0SW50ZXJmYWNl RGVmU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQogIGlubGluZSBBYnN0 cmFjdEludGVyZmFjZURlZlNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRhKHMuX3BkX3NlcSkg eyBzID0gKFQqKSAwOyB9CiAgaW5saW5lIEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxX291dChjb25z dCBBYnN0cmFjdEludGVyZmFjZURlZlNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBp bmxpbmUgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXFfb3V0JiBvcGVyYXRvciA9IChjb25zdCBBYnN0 cmFjdEludGVyZmFjZURlZlNlcV9vdXQmIHMpIHsKICAgIF9kYXRhID0gcy5fZGF0YTsKICAgIHJl dHVybiAqdGhpczsKICB9IGlubGluZSBBYnN0cmFjdEludGVyZmFjZURlZlNlcV9vdXQmIG9wZXJh dG9yID0gKFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5s aW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBwdHIoKSB7 IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7 IH0KCiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9BYnN0cmFjdEludGVy ZmFjZURlZiwgQWJzdHJhY3RJbnRlcmZhY2VEZWZfSGVscGVyPiBvcGVyYXRvciBbXSAoX0NPUkJB X1VMb25nIGkpIHsKICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICB9CgogIFQqJiBfZGF0YTsKCnBy aXZhdGU6CiAgQWJzdHJhY3RJbnRlcmZhY2VEZWZTZXFfb3V0KCk7CiAgQWJzdHJhY3RJbnRlcmZh Y2VEZWZTZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsKCmV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Db250YWluZWRTZXE7CgpjbGFzcyBDb250YWluZWRTZXFf dmFyOwoKY2xhc3MgQ29udGFpbmVkU2VxIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVu Y2VfT2JqUmVmPCBfb2JqcmVmX0NvbnRhaW5lZCwgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2Jq cmVmX0NvbnRhaW5lZCwgQ29udGFpbmVkX0hlbHBlcj4gLCBDb250YWluZWRfSGVscGVyPiB7CnB1 YmxpYzoKICB0eXBlZGVmIENvbnRhaW5lZFNlcV92YXIgX3Zhcl90eXBlOwogIGlubGluZSBDb250 YWluZWRTZXEoKSB7fQogIGlubGluZSBDb250YWluZWRTZXEoY29uc3QgQ29udGFpbmVkU2VxJiBz KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9Db250YWlu ZWQsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9Db250YWluZWQsIENvbnRhaW5lZF9I ZWxwZXI+ICwgQ29udGFpbmVkX0hlbHBlcj4gKHMpIHt9CgogIGlubGluZSBDb250YWluZWRTZXEo X0NPUkJBX1VMb25nIF9tYXgpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVm PCBfb2JqcmVmX0NvbnRhaW5lZCwgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0NvbnRh aW5lZCwgQ29udGFpbmVkX0hlbHBlcj4gLCBDb250YWluZWRfSGVscGVyPiAoX21heCkge30KICBp bmxpbmUgQ29udGFpbmVkU2VxKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwg Q29udGFpbmVkX3B0ciogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgOiBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9Db250YWluZWQsIF9DT1JCQV9PYmpS ZWZfRWxlbWVudDwgX29ianJlZl9Db250YWluZWQsIENvbnRhaW5lZF9IZWxwZXI+ICwgQ29udGFp bmVkX0hlbHBlcj4gKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9CgogIGlubGluZSBDb250YWlu ZWRTZXEmIG9wZXJhdG9yID0gKGNvbnN0IENvbnRhaW5lZFNlcSYgcykgewogICAgX0NPUkJBX1Vu Ym91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfQ29udGFpbmVkLCBfQ09SQkFfT2JqUmVm X0VsZW1lbnQ8IF9vYmpyZWZfQ29udGFpbmVkLCBDb250YWluZWRfSGVscGVyPiAsIENvbnRhaW5l ZF9IZWxwZXI+IDo6b3BlcmF0b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNz IENvbnRhaW5lZFNlcV9vdXQ7CgpjbGFzcyBDb250YWluZWRTZXFfdmFyIHsKcHVibGljOgogIHR5 cGVkZWYgQ29udGFpbmVkU2VxIFQ7CiAgdHlwZWRlZiBDb250YWluZWRTZXFfdmFyIFRfdmFyOwoK ICBpbmxpbmUgQ29udGFpbmVkU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBDb250 YWluZWRTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBDb250YWluZWRTZXFf dmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBU KCpzLl9wZF9zZXEpOwogICAgZWxzZSBfcGRfc2VxID0gMDsKICB9CiAgaW5saW5lIH5Db250YWlu ZWRTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBU X3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3Nl cTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXIm IG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgewogICAg ICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3Bk X3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAg ICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9D T1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9Db250YWluZWQsIENvbnRhaW5lZF9IZWxwZXI+ IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgcykgewogICAgcmV0dXJuICgqX3BkX3NlcSlbc107 CiAgfQoKICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4gX3BkX3NlcTsgfQoKCgog IGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQog IGlubGluZSBvcGVyYXRvciBUJiAoKSB7IHJldHVybiAqX3BkX3NlcTsgfQoKCiAgaW5saW5lIGNv bnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgVCYgaW5vdXQo KSB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUKiYgb3V0KCkgewogICAgaWYoIF9wZF9z ZXEgKSB7IGRlbGV0ZSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgfQogICAgcmV0dXJuIF9wZF9zZXE7 CiAgfQogIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gX3BkX3NlcTsgX3BkX3NlcSA9IDA7 IHJldHVybiB0bXA7IH0KCiAgZnJpZW5kIGNsYXNzIENvbnRhaW5lZFNlcV9vdXQ7Cgpwcml2YXRl OgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBDb250YWluZWRTZXFfb3V0IHsKcHVibGljOgogIHR5 cGVkZWYgQ29udGFpbmVkU2VxIFQ7CiAgdHlwZWRlZiBDb250YWluZWRTZXFfdmFyIFRfdmFyOwoK ICBpbmxpbmUgQ29udGFpbmVkU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsg fQogIGlubGluZSBDb250YWluZWRTZXFfb3V0KFRfdmFyJiBzKQogICAgOiBfZGF0YShzLl9wZF9z ZXEpIHsgcyA9IChUKikgMDsgfQogIGlubGluZSBDb250YWluZWRTZXFfb3V0KGNvbnN0IENvbnRh aW5lZFNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBpbmxpbmUgQ29udGFpbmVkU2Vx X291dCYgb3BlcmF0b3IgPSAoY29uc3QgQ29udGFpbmVkU2VxX291dCYgcykgewogICAgX2RhdGEg PSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0gaW5saW5lIENvbnRhaW5lZFNlcV9vdXQm IG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBw dHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4g X2RhdGE7IH0KCiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9Db250YWlu ZWQsIENvbnRhaW5lZF9IZWxwZXI+IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAg cmV0dXJuICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBDb250YWlu ZWRTZXFfb3V0KCk7CiAgQ29udGFpbmVkU2VxX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7 Cn07CgpzdHJ1Y3QgSW5pdGlhbGl6ZXIgewogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFy aWFibGVfVmFyPEluaXRpYWxpemVyPiBfdmFyX3R5cGU7CgogIFN0cnVjdE1lbWJlclNlcSBtZW1i ZXJzOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBuYW1lOwoKICBzaXplX3QgX05QX2FsaWduZWRT aXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49IChOZXRC dWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0 cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKfTsKCnR5cGVkZWYgSW5p dGlhbGl6ZXI6Ol92YXJfdHlwZSBJbml0aWFsaXplcl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25z dHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8IEluaXRpYWxpemVyLEluaXRpYWxpemVyX3ZhciA+IElu aXRpYWxpemVyX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Jbml0 aWFsaXplcjsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Jbml0aWFsaXpl clNlcTsKCmNsYXNzIEluaXRpYWxpemVyU2VxX3ZhcjsKCmNsYXNzIEluaXRpYWxpemVyU2VxIDog cHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEluaXRpYWxpemVyPiB7CnB1YmxpYzoK ICB0eXBlZGVmIEluaXRpYWxpemVyU2VxX3ZhciBfdmFyX3R5cGU7CiAgaW5saW5lIEluaXRpYWxp emVyU2VxKCkge30KICBpbmxpbmUgSW5pdGlhbGl6ZXJTZXEoY29uc3QgSW5pdGlhbGl6ZXJTZXEm IHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEluaXRpYWxpemVyPiAocykge30K CiAgaW5saW5lIEluaXRpYWxpemVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlPCBJbml0aWFsaXplcj4gKF9tYXgpIHt9CiAgaW5saW5lIEluaXRp YWxpemVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgSW5pdGlhbGl6 ZXIqIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZTwgSW5pdGlhbGl6ZXI+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxp bmUgSW5pdGlhbGl6ZXJTZXEmIG9wZXJhdG9yID0gKGNvbnN0IEluaXRpYWxpemVyU2VxJiBzKSB7 CiAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBJbml0aWFsaXplcj4gOjpvcGVyYXRvcj0o cyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgSW5pdGlhbGl6ZXJTZXFfb3V0OwoK Y2xhc3MgSW5pdGlhbGl6ZXJTZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgSW5pdGlhbGl6ZXJT ZXEgVDsKICB0eXBlZGVmIEluaXRpYWxpemVyU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIEluaXRp YWxpemVyU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBJbml0aWFsaXplclNlcV92 YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIEluaXRpYWxpemVyU2VxX3Zhcihjb25z dCBUX3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRf c2VxKTsKICAgIGVsc2UgX3BkX3NlcSA9IDA7CiAgfQogIGlubGluZSB+SW5pdGlhbGl6ZXJTZXFf dmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYg b3BlcmF0b3IgPSAoVCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAg IF9wZF9zZXEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJh dG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZigg IV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsK ICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9w ZF9zZXEgPSAwOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIEluaXRpYWxp emVyJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEp W3NdOwogIH0KCiAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0K CgoKICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7 IH0KICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGlu ZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlu b3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBf cGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRf c2VxOwogIH0KICBpbmxpbmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEg PSAwOyByZXR1cm4gdG1wOyB9CgogIGZyaWVuZCBjbGFzcyBJbml0aWFsaXplclNlcV9vdXQ7Cgpw cml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBJbml0aWFsaXplclNlcV9vdXQgewpwdWJs aWM6CiAgdHlwZWRlZiBJbml0aWFsaXplclNlcSBUOwogIHR5cGVkZWYgSW5pdGlhbGl6ZXJTZXFf dmFyIFRfdmFyOwoKICBpbmxpbmUgSW5pdGlhbGl6ZXJTZXFfb3V0KFQqJiBzKSA6IF9kYXRhKHMp IHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIEluaXRpYWxpemVyU2VxX291dChUX3ZhciYgcykKICAg IDogX2RhdGEocy5fcGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICBpbmxpbmUgSW5pdGlhbGl6ZXJT ZXFfb3V0KGNvbnN0IEluaXRpYWxpemVyU2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRhKSB7fQog IGlubGluZSBJbml0aWFsaXplclNlcV9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IEluaXRpYWxpemVy U2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0g aW5saW5lIEluaXRpYWxpemVyU2VxX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEg PSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1 cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5l IFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxpbmUgSW5pdGlhbGl6ZXIm IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwog IH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBJbml0aWFsaXplclNlcV9vdXQoKTsKICBJbml0 aWFsaXplclNlcV9vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwojIDE0MzQgIi4uL29t bmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIENvbnRhaW5lciB7CnB1YmxpYzoKCiAgdHlwZWRlZiBD b250YWluZXJfcHRyIF9wdHJfdHlwZTsKICB0eXBlZGVmIENvbnRhaW5lcl92YXIgX3Zhcl90eXBl OwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0 cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25p bCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXpl X3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1 ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3Vu bWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9w dHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJf dHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAg cmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxP YmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9 IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVz dWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiBy ZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgogIHN0cnVjdCBE ZXNjcmlwdGlvbiB7CiAgICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxE ZXNjcmlwdGlvbj4gX3Zhcl90eXBlOwoKICAgIF9DT1JCQV9PYmpSZWZfTWVtYmVyPCBfb2JqcmVm X0NvbnRhaW5lZCwgQ29udGFpbmVkX0hlbHBlcj4gY29udGFpbmVkX29iamVjdDsKCiAgICBEZWZp bml0aW9uS2luZCBraW5kOwoKICAgIENPUkJBOjpBbnkgdmFsdWU7CgogICAgc2l6ZV90IF9OUF9h bGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9y Pj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5l dEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJl YW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsK ICB9OwoKICB0eXBlZGVmIERlc2NyaXB0aW9uOjpfdmFyX3R5cGUgRGVzY3JpcHRpb25fdmFyOwoK ICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8IERlc2NyaXB0aW9u LERlc2NyaXB0aW9uX3ZhciA+IERlc2NyaXB0aW9uX291dDsKCiAgc3RhdGljIGNvbnN0IENPUkJB OjpUeXBlQ29kZV9wdHIgX3RjX0Rlc2NyaXB0aW9uOwoKICBzdGF0aWMgY29uc3QgQ09SQkE6OlR5 cGVDb2RlX3B0ciBfdGNfRGVzY3JpcHRpb25TZXE7CgogIGNsYXNzIERlc2NyaXB0aW9uU2VxX3Zh cjsKCiAgY2xhc3MgRGVzY3JpcHRpb25TZXEgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZTwgRGVzY3JpcHRpb24+IHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIERlc2NyaXB0aW9uU2Vx X3ZhciBfdmFyX3R5cGU7CiAgICBpbmxpbmUgRGVzY3JpcHRpb25TZXEoKSB7fQogICAgaW5saW5l IERlc2NyaXB0aW9uU2VxKGNvbnN0IERlc2NyaXB0aW9uU2VxJiBzKQogICAgICA6IF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2U8IERlc2NyaXB0aW9uPiAocykge30KCiAgICBpbmxpbmUgRGVzY3Jp cHRpb25TZXEoX0NPUkJBX1VMb25nIF9tYXgpCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZTwgRGVzY3JpcHRpb24+IChfbWF4KSB7fQogICAgaW5saW5lIERlc2NyaXB0aW9uU2VxKF9D T1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgRGVzY3JpcHRpb24qIF92YWwsIF9D T1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBE ZXNjcmlwdGlvbj4gKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9CgogICAgaW5saW5lIERlc2Ny aXB0aW9uU2VxJiBvcGVyYXRvciA9IChjb25zdCBEZXNjcmlwdGlvblNlcSYgcykgewogICAgICBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBEZXNjcmlwdGlvbj4gOjpvcGVyYXRvcj0ocyk7CiAg ICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKICBjbGFzcyBEZXNjcmlwdGlvblNlcV9vdXQ7 CgogIGNsYXNzIERlc2NyaXB0aW9uU2VxX3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBEZXNj cmlwdGlvblNlcSBUOwogICAgdHlwZWRlZiBEZXNjcmlwdGlvblNlcV92YXIgVF92YXI7CgogICAg aW5saW5lIERlc2NyaXB0aW9uU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogICAgaW5saW5lIERl c2NyaXB0aW9uU2VxX3ZhcihUKiBzKSA6IF9wZF9zZXEocykge30KICAgIGlubGluZSBEZXNjcmlw dGlvblNlcV92YXIoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMuX3BkX3NlcSApIF9wZF9z ZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgICAgZWxzZSBfcGRfc2VxID0gMDsKICAgIH0KICAg IGlubGluZSB+RGVzY3JpcHRpb25TZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRf c2VxOyB9CgogICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICAgIGlmKCBf cGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSBzOwogICAgICByZXR1cm4g KnRoaXM7CiAgICB9CiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBz KSB7CiAgICAgIGlmKCBzLl9wZF9zZXEgKSB7CiAgICAgICAgaWYoICFfcGRfc2VxICkgX3BkX3Nl cSA9IG5ldyBUOwogICAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgICAgfSBlbHNlIGlm KCBfcGRfc2VxICkgewogICAgICAgIGRlbGV0ZSBfcGRfc2VxOwogICAgICAgIF9wZF9zZXEgPSAw OwogICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBpbmxpbmUgRGVzY3JpcHRp b24mIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgcykgewogICAgICByZXR1cm4gKCpfcGRfc2Vx KVtzXTsKICAgIH0KCiAgICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4gX3BkX3Nl cTsgfQoKCgogICAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpf cGRfc2VxOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0K CgogICAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAg IGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgICBpbmxpbmUgVComIG91 dCgpIHsKICAgICAgaWYoIF9wZF9zZXEgKSB7IGRlbGV0ZSBfcGRfc2VxOyBfcGRfc2VxID0gMDsg fQogICAgICByZXR1cm4gX3BkX3NlcTsKICAgIH0KICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCog dG1wID0gX3BkX3NlcTsgX3BkX3NlcSA9IDA7IHJldHVybiB0bXA7IH0KCiAgICBmcmllbmQgY2xh c3MgRGVzY3JpcHRpb25TZXFfb3V0OwoKICBwcml2YXRlOgogICAgVCogX3BkX3NlcTsKICB9OwoK ICBjbGFzcyBEZXNjcmlwdGlvblNlcV9vdXQgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgRGVzY3Jp cHRpb25TZXEgVDsKICAgIHR5cGVkZWYgRGVzY3JpcHRpb25TZXFfdmFyIFRfdmFyOwoKICAgIGlu bGluZSBEZXNjcmlwdGlvblNlcV9vdXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9IDA7IH0K ICAgIGlubGluZSBEZXNjcmlwdGlvblNlcV9vdXQoVF92YXImIHMpCiAgICAgIDogX2RhdGEocy5f cGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICAgIGlubGluZSBEZXNjcmlwdGlvblNlcV9vdXQoY29u c3QgRGVzY3JpcHRpb25TZXFfb3V0JiBzKSA6IF9kYXRhKHMuX2RhdGEpIHt9CiAgICBpbmxpbmUg RGVzY3JpcHRpb25TZXFfb3V0JiBvcGVyYXRvciA9IChjb25zdCBEZXNjcmlwdGlvblNlcV9vdXQm IHMpIHsKICAgICAgX2RhdGEgPSBzLl9kYXRhOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9IGlu bGluZSBEZXNjcmlwdGlvblNlcV9vdXQmIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgICAgX2RhdGEg PSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUgb3BlcmF0b3IgVComKCkg eyByZXR1cm4gX2RhdGE7IH0KICAgIGlubGluZSBUKiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0K ICAgIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgICBpbmxpbmUg RGVzY3JpcHRpb24mIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgICByZXR1cm4g KCpfZGF0YSlbaV07CiAgICB9CgogICAgVComIF9kYXRhOwoKICBwcml2YXRlOgogICAgRGVzY3Jp cHRpb25TZXFfb3V0KCk7CiAgICBEZXNjcmlwdGlvblNlcV9vdXQmIG9wZXJhdG9yPShjb25zdCBU X3ZhciYpOwogIH07Cgp9OwoKY2xhc3MgX29ianJlZl9Db250YWluZXIgOgogIHB1YmxpYyB2aXJ0 dWFsIF9vYmpyZWZfSVJPYmplY3QKewpwdWJsaWM6CiAgQ29udGFpbmVkX3B0ciBsb29rdXAoY29u c3QgY2hhciogc2VhcmNoX25hbWUpOwogIENvbnRhaW5lZFNlcSogY29udGVudHMoRGVmaW5pdGlv bktpbmQgbGltaXRfdHlwZSwgQ09SQkE6OkJvb2xlYW4gZXhjbHVkZV9pbmhlcml0ZWQpOwogIENv bnRhaW5lZFNlcSogbG9va3VwX25hbWUoY29uc3QgY2hhciogc2VhcmNoX25hbWUsIENPUkJBOjpM b25nIGxldmVsc190b19zZWFyY2gsIERlZmluaXRpb25LaW5kIGxpbWl0X3R5cGUsIENPUkJBOjpC b29sZWFuIGV4Y2x1ZGVfaW5oZXJpdGVkKTsKICBDb250YWluZXI6OkRlc2NyaXB0aW9uU2VxKiBk ZXNjcmliZV9jb250ZW50cyhEZWZpbml0aW9uS2luZCBsaW1pdF90eXBlLCBDT1JCQTo6Qm9vbGVh biBleGNsdWRlX2luaGVyaXRlZCwgQ09SQkE6OkxvbmcgbWF4X3JldHVybmVkX29ianMpOwogIE1v ZHVsZURlZl9wdHIgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFt ZSwgY29uc3QgY2hhciogdmVyc2lvbik7CiAgQ29uc3RhbnREZWZfcHRyIGNyZWF0ZV9jb25zdGFu dChjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwg SURMVHlwZV9wdHIgdHlwZSwgY29uc3QgQ09SQkE6OkFueSYgdmFsdWUpOwogIFN0cnVjdERlZl9w dHIgY3JlYXRlX3N0cnVjdChjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qg Y2hhciogdmVyc2lvbiwgY29uc3QgU3RydWN0TWVtYmVyU2VxJiBtZW1iZXJzKTsKICBVbmlvbkRl Zl9wdHIgY3JlYXRlX3VuaW9uKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25z dCBjaGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciBkaXNjcmltaW5hdG9yX3R5cGUsIGNvbnN0IFVu aW9uTWVtYmVyU2VxJiBtZW1iZXJzKTsKICBFbnVtRGVmX3B0ciBjcmVhdGVfZW51bShjb25zdCBj aGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgY29uc3QgRW51 bU1lbWJlclNlcSYgbWVtYmVycyk7CiAgQWxpYXNEZWZfcHRyIGNyZWF0ZV9hbGlhcyhjb25zdCBj aGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlwZV9w dHIgb3JpZ2luYWxfdHlwZSk7CiAgSW50ZXJmYWNlRGVmX3B0ciBjcmVhdGVfaW50ZXJmYWNlKGNv bnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBjb25z dCBJbnRlcmZhY2VEZWZTZXEmIGJhc2VfaW50ZXJmYWNlcyk7CiAgVmFsdWVEZWZfcHRyIGNyZWF0 ZV92YWx1ZShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVy c2lvbiwgQ09SQkE6OkJvb2xlYW4gaXNfY3VzdG9tLCBDT1JCQTo6Qm9vbGVhbiBpc19hYnN0cmFj dCwgVmFsdWVEZWZfcHRyIGJhc2VfdmFsdWUsIENPUkJBOjpCb29sZWFuIGlzX3RydW5jYXRhYmxl LCBjb25zdCBWYWx1ZURlZlNlcSYgYWJzdHJhY3RfYmFzZV92YWx1ZXMsIGNvbnN0IEludGVyZmFj ZURlZlNlcSYgc3VwcG9ydGVkX2ludGVyZmFjZXMsIGNvbnN0IEluaXRpYWxpemVyU2VxJiBpbml0 aWFsaXplcnMpOwogIFZhbHVlQm94RGVmX3B0ciBjcmVhdGVfdmFsdWVfYm94KGNvbnN0IGNoYXIq IGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciBv cmlnaW5hbF90eXBlX2RlZik7CiAgRXhjZXB0aW9uRGVmX3B0ciBjcmVhdGVfZXhjZXB0aW9uKGNv bnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBjb25z dCBTdHJ1Y3RNZW1iZXJTZXEmIG1lbWJlcnMpOwogIE5hdGl2ZURlZl9wdHIgY3JlYXRlX25hdGl2 ZShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbik7 CiAgQWJzdHJhY3RJbnRlcmZhY2VEZWZfcHRyIGNyZWF0ZV9hYnN0cmFjdF9pbnRlcmZhY2UoY29u c3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZlcnNpb24sIGNvbnN0 IEFic3RyYWN0SW50ZXJmYWNlRGVmU2VxJiBiYXNlX2ludGVyZmFjZXMpOwoKICBpbmxpbmUgX29i anJlZl9Db250YWluZXIoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVmX0NvbnRhaW5lcihj b25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlM b2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9Db250YWluZXIo KTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoK ICBfb2JqcmVmX0NvbnRhaW5lcihjb25zdCBfb2JqcmVmX0NvbnRhaW5lciYpOwogIF9vYmpyZWZf Q29udGFpbmVyJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0NvbnRhaW5lciYpOwoKfTsKCmNs YXNzIF9wb2ZfQ29udGFpbmVyIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoK ICBpbmxpbmUgX3BvZl9Db250YWluZXIoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShDb250YWluZXI6 Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9Db250YWluZXIoKTsKCiAgdmlydHVhbCBv bW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3Qq LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2Nh bElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBj b25zdDsKfTsKCmNsYXNzIF9pbXBsX0NvbnRhaW5lciA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxf SVJPYmplY3QKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxfQ29udGFpbmVyKCk7CgogIHZpcnR1 YWwgQ29udGFpbmVkX3B0ciBsb29rdXAoY29uc3QgY2hhciogc2VhcmNoX25hbWUpID0gMDsKICB2 aXJ0dWFsIENvbnRhaW5lZFNlcSogY29udGVudHMoRGVmaW5pdGlvbktpbmQgbGltaXRfdHlwZSwg Q09SQkE6OkJvb2xlYW4gZXhjbHVkZV9pbmhlcml0ZWQpID0gMDsKICB2aXJ0dWFsIENvbnRhaW5l ZFNlcSogbG9va3VwX25hbWUoY29uc3QgY2hhciogc2VhcmNoX25hbWUsIENPUkJBOjpMb25nIGxl dmVsc190b19zZWFyY2gsIERlZmluaXRpb25LaW5kIGxpbWl0X3R5cGUsIENPUkJBOjpCb29sZWFu IGV4Y2x1ZGVfaW5oZXJpdGVkKSA9IDA7CiAgdmlydHVhbCBDb250YWluZXI6OkRlc2NyaXB0aW9u U2VxKiBkZXNjcmliZV9jb250ZW50cyhEZWZpbml0aW9uS2luZCBsaW1pdF90eXBlLCBDT1JCQTo6 Qm9vbGVhbiBleGNsdWRlX2luaGVyaXRlZCwgQ09SQkE6OkxvbmcgbWF4X3JldHVybmVkX29ianMp ID0gMDsKICB2aXJ0dWFsIE1vZHVsZURlZl9wdHIgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyKiBp ZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbikgPSAwOwogIHZpcnR1YWwg Q29uc3RhbnREZWZfcHRyIGNyZWF0ZV9jb25zdGFudChjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hh ciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlwZV9wdHIgdHlwZSwgY29uc3QgQ09S QkE6OkFueSYgdmFsdWUpID0gMDsKICB2aXJ0dWFsIFN0cnVjdERlZl9wdHIgY3JlYXRlX3N0cnVj dChjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwg Y29uc3QgU3RydWN0TWVtYmVyU2VxJiBtZW1iZXJzKSA9IDA7CiAgdmlydHVhbCBVbmlvbkRlZl9w dHIgY3JlYXRlX3VuaW9uKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBj aGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciBkaXNjcmltaW5hdG9yX3R5cGUsIGNvbnN0IFVuaW9u TWVtYmVyU2VxJiBtZW1iZXJzKSA9IDA7CiAgdmlydHVhbCBFbnVtRGVmX3B0ciBjcmVhdGVfZW51 bShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwg Y29uc3QgRW51bU1lbWJlclNlcSYgbWVtYmVycykgPSAwOwogIHZpcnR1YWwgQWxpYXNEZWZfcHRy IGNyZWF0ZV9hbGlhcyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hh ciogdmVyc2lvbiwgSURMVHlwZV9wdHIgb3JpZ2luYWxfdHlwZSkgPSAwOwogIHZpcnR1YWwgSW50 ZXJmYWNlRGVmX3B0ciBjcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFy KiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBjb25zdCBJbnRlcmZhY2VEZWZTZXEmIGJhc2Vf aW50ZXJmYWNlcykgPSAwOwogIHZpcnR1YWwgVmFsdWVEZWZfcHRyIGNyZWF0ZV92YWx1ZShjb25z dCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgQ09SQkE6 OkJvb2xlYW4gaXNfY3VzdG9tLCBDT1JCQTo6Qm9vbGVhbiBpc19hYnN0cmFjdCwgVmFsdWVEZWZf cHRyIGJhc2VfdmFsdWUsIENPUkJBOjpCb29sZWFuIGlzX3RydW5jYXRhYmxlLCBjb25zdCBWYWx1 ZURlZlNlcSYgYWJzdHJhY3RfYmFzZV92YWx1ZXMsIGNvbnN0IEludGVyZmFjZURlZlNlcSYgc3Vw cG9ydGVkX2ludGVyZmFjZXMsIGNvbnN0IEluaXRpYWxpemVyU2VxJiBpbml0aWFsaXplcnMpID0g MDsKICB2aXJ0dWFsIFZhbHVlQm94RGVmX3B0ciBjcmVhdGVfdmFsdWVfYm94KGNvbnN0IGNoYXIq IGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciBv cmlnaW5hbF90eXBlX2RlZikgPSAwOwogIHZpcnR1YWwgRXhjZXB0aW9uRGVmX3B0ciBjcmVhdGVf ZXhjZXB0aW9uKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2 ZXJzaW9uLCBjb25zdCBTdHJ1Y3RNZW1iZXJTZXEmIG1lbWJlcnMpID0gMDsKICB2aXJ0dWFsIE5h dGl2ZURlZl9wdHIgY3JlYXRlX25hdGl2ZShjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFt ZSwgY29uc3QgY2hhciogdmVyc2lvbikgPSAwOwogIHZpcnR1YWwgQWJzdHJhY3RJbnRlcmZhY2VE ZWZfcHRyIGNyZWF0ZV9hYnN0cmFjdF9pbnRlcmZhY2UoY29uc3QgY2hhciogaWQsIGNvbnN0IGNo YXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZlcnNpb24sIGNvbnN0IEFic3RyYWN0SW50ZXJmYWNlRGVm U2VxJiBiYXNlX2ludGVyZmFjZXMpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29s ZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9J bnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVk UmVwb0lkKCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQ29udGFp bmVyOwojIDE3MDcgIi4uL29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIElETFR5cGUgewpwdWJs aWM6CgogIHR5cGVkZWYgSURMVHlwZV9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgSURMVHlwZV92 YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsK ICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBf cHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0 cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBf cHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09S QkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBz KTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFz ZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBl IF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmpl Y3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBf cHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsK ICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsK CgoKfTsKCmNsYXNzIF9vYmpyZWZfSURMVHlwZSA6CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9J Uk9iamVjdAp7CnB1YmxpYzoKCiAgQ09SQkE6OlR5cGVDb2RlX3B0ciB0eXBlKCk7CgogIGlubGlu ZSBfb2JqcmVmX0lETFR5cGUoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVmX0lETFR5cGUo Y29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkqLCBvbW5p TG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpyZWZfSURMVHlwZSgp OwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7Cgog IF9vYmpyZWZfSURMVHlwZShjb25zdCBfb2JqcmVmX0lETFR5cGUmKTsKICBfb2JqcmVmX0lETFR5 cGUmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfSURMVHlwZSYpOwoKfTsKCmNsYXNzIF9wb2Zf SURMVHlwZSA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9w b2ZfSURMVHlwZSgpIDogcHJveHlPYmplY3RGYWN0b3J5KElETFR5cGU6Ol9QRF9yZXBvSWQpIHt9 CiAgdmlydHVhbCB+X3BvZl9JRExUeXBlKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2Jq UmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZp cnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgpjbGFzcyBf aW1wbF9JRExUeXBlIDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9JUk9iamVjdAp7CnB1YmxpYzoK ICB2aXJ0dWFsIH5faW1wbF9JRExUeXBlKCk7CgogIHZpcnR1YWwgQ09SQkE6OlR5cGVDb2RlX3B0 ciB0eXBlKCkgPSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNo KEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25z dCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsK CmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19JRExUeXBlOwoKCgoKY2xhc3Mg UHJpbWl0aXZlRGVmOwpjbGFzcyBfb2JqcmVmX1ByaW1pdGl2ZURlZjsKY2xhc3MgX2ltcGxfUHJp bWl0aXZlRGVmOwoKdHlwZWRlZiBfb2JqcmVmX1ByaW1pdGl2ZURlZiogUHJpbWl0aXZlRGVmX3B0 cjsKdHlwZWRlZiBQcmltaXRpdmVEZWZfcHRyIFByaW1pdGl2ZURlZlJlZjsKCmNsYXNzIFByaW1p dGl2ZURlZl9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBQcmltaXRpdmVEZWZfcHRyIF9wdHJf dHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFu IGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBz dGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWdu ZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9w dHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hh bE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYo X3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJz aGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZf VmFyPF9vYmpyZWZfUHJpbWl0aXZlRGVmLCBQcmltaXRpdmVEZWZfSGVscGVyPiBQcmltaXRpdmVE ZWZfdmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1ByaW1pdGl2ZURl ZixQcmltaXRpdmVEZWZfSGVscGVyID4gUHJpbWl0aXZlRGVmX291dDsKCgoKCgoKY2xhc3MgU3Ry aW5nRGVmOwpjbGFzcyBfb2JqcmVmX1N0cmluZ0RlZjsKY2xhc3MgX2ltcGxfU3RyaW5nRGVmOwoK dHlwZWRlZiBfb2JqcmVmX1N0cmluZ0RlZiogU3RyaW5nRGVmX3B0cjsKdHlwZWRlZiBTdHJpbmdE ZWZfcHRyIFN0cmluZ0RlZlJlZjsKCmNsYXNzIFN0cmluZ0RlZl9IZWxwZXIgewpwdWJsaWM6CiAg dHlwZWRlZiBTdHJpbmdEZWZfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmls KCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2 b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBl KTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBz dGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsK ICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwog IHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYp OwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7 Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfU3RyaW5nRGVmLCBTdHJpbmdE ZWZfSGVscGVyPiBTdHJpbmdEZWZfdmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxf b2JqcmVmX1N0cmluZ0RlZixTdHJpbmdEZWZfSGVscGVyID4gU3RyaW5nRGVmX291dDsKCgoKCgoK Y2xhc3MgU2VxdWVuY2VEZWY7CmNsYXNzIF9vYmpyZWZfU2VxdWVuY2VEZWY7CmNsYXNzIF9pbXBs X1NlcXVlbmNlRGVmOwoKdHlwZWRlZiBfb2JqcmVmX1NlcXVlbmNlRGVmKiBTZXF1ZW5jZURlZl9w dHI7CnR5cGVkZWYgU2VxdWVuY2VEZWZfcHRyIFNlcXVlbmNlRGVmUmVmOwoKY2xhc3MgU2VxdWVu Y2VEZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgU2VxdWVuY2VEZWZfcHRyIF9wdHJfdHlw ZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlz X25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0 aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRT aXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9i alJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0 cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFs T2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFy PF9vYmpyZWZfU2VxdWVuY2VEZWYsIFNlcXVlbmNlRGVmX0hlbHBlcj4gU2VxdWVuY2VEZWZfdmFy Owp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1NlcXVlbmNlRGVmLFNlcXVl bmNlRGVmX0hlbHBlciA+IFNlcXVlbmNlRGVmX291dDsKCgoKCgoKY2xhc3MgQXJyYXlEZWY7CmNs YXNzIF9vYmpyZWZfQXJyYXlEZWY7CmNsYXNzIF9pbXBsX0FycmF5RGVmOwoKdHlwZWRlZiBfb2Jq cmVmX0FycmF5RGVmKiBBcnJheURlZl9wdHI7CnR5cGVkZWYgQXJyYXlEZWZfcHRyIEFycmF5RGVm UmVmOwoKY2xhc3MgQXJyYXlEZWZfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgQXJyYXlEZWZf cHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JC QV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90 eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90 IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBl IHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNo YWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5 cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JC QV9PYmpSZWZfVmFyPF9vYmpyZWZfQXJyYXlEZWYsIEFycmF5RGVmX0hlbHBlcj4gQXJyYXlEZWZf dmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0FycmF5RGVmLEFycmF5 RGVmX0hlbHBlciA+IEFycmF5RGVmX291dDsKCgoKZW51bSBQcmltaXRpdmVLaW5kIHsgcGtfbnVs bCwgcGtfdm9pZCwgcGtfc2hvcnQsIHBrX2xvbmcsIHBrX3VzaG9ydCwgcGtfdWxvbmcsIHBrX2Zs b2F0LCBwa19kb3VibGUsIHBrX2Jvb2xlYW4sIHBrX2NoYXIsIHBrX29jdGV0LCBwa19hbnksIHBr X1R5cGVDb2RlLCBwa19QcmluY2lwYWwsIHBrX3N0cmluZywgcGtfb2JqcmVmLCBwa19sb25nbG9u ZywgcGtfdWxvbmdsb25nLCBwa19sb25nZG91YmxlLCBwa193Y2hhciwgcGtfd3N0cmluZywgcGtf dmFsdWVfYmFzZSB9Owp0eXBlZGVmIFByaW1pdGl2ZUtpbmQmIFByaW1pdGl2ZUtpbmRfb3V0OwoK ZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1ByaW1pdGl2ZUtpbmQ7CiMgMTk0 NSAiLi4vb21uaU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgUmVwb3NpdG9yeSB7CnB1YmxpYzoKCiAg dHlwZWRlZiBSZXBvc2l0b3J5X3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBSZXBvc2l0b3J5X3Zh ciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwog IHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9w dHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxP YmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9w dHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JC QTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMp OwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNl KG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUg X3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVj dF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9w dHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwog ICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoK Cgp9OwoKY2xhc3MgX29ianJlZl9SZXBvc2l0b3J5IDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVm X0NvbnRhaW5lcgp7CnB1YmxpYzoKICBDb250YWluZWRfcHRyIGxvb2t1cF9pZChjb25zdCBjaGFy KiBzZWFyY2hfaWQpOwogIENPUkJBOjpUeXBlQ29kZV9wdHIgZ2V0X2Nhbm9uaWNhbF90eXBlY29k ZShDT1JCQTo6VHlwZUNvZGVfcHRyIHRjKTsKICBQcmltaXRpdmVEZWZfcHRyIGdldF9wcmltaXRp dmUoUHJpbWl0aXZlS2luZCBraW5kKTsKICBTdHJpbmdEZWZfcHRyIGNyZWF0ZV9zdHJpbmcoQ09S QkE6OlVMb25nIGJvdW5kKTsKICBXc3RyaW5nRGVmX3B0ciBjcmVhdGVfd3N0cmluZyhDT1JCQTo6 VUxvbmcgYm91bmQpOwogIFNlcXVlbmNlRGVmX3B0ciBjcmVhdGVfc2VxdWVuY2UoQ09SQkE6OlVM b25nIGJvdW5kLCBJRExUeXBlX3B0ciBlbGVtZW50X3R5cGUpOwogIEFycmF5RGVmX3B0ciBjcmVh dGVfYXJyYXkoQ09SQkE6OlVMb25nIGxlbmd0aCwgSURMVHlwZV9wdHIgZWxlbWVudF90eXBlKTsK ICBGaXhlZERlZl9wdHIgY3JlYXRlX2ZpeGVkKENPUkJBOjpVU2hvcnQgZGlnaXRzLCBDT1JCQTo6 U2hvcnQgc2NhbGUpOwoKICBpbmxpbmUgX29ianJlZl9SZXBvc2l0b3J5KCkgeyBfUFJfc2V0b2Jq KDApOyB9CiAgX29ianJlZl9SZXBvc2l0b3J5KGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2Zp bGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoK ICB2aXJ0dWFsIH5fb2JqcmVmX1JlcG9zaXRvcnkoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lk KiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1JlcG9zaXRvcnkoY29uc3Qg X29ianJlZl9SZXBvc2l0b3J5Jik7CiAgX29ianJlZl9SZXBvc2l0b3J5JiBvcGVyYXRvciA9IChj b25zdCBfb2JqcmVmX1JlcG9zaXRvcnkmKTsKCn07CgpjbGFzcyBfcG9mX1JlcG9zaXRvcnkgOiBw dWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGluZSBfcG9mX1JlcG9zaXRv cnkoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShSZXBvc2l0b3J5OjpfUERfcmVwb0lkKSB7fQogIHZp cnR1YWwgfl9wb2ZfUmVwb3NpdG9yeSgpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJl Zihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0 dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2lt cGxfUmVwb3NpdG9yeSA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFpbmVyCnsKcHVibGlj OgogIHZpcnR1YWwgfl9pbXBsX1JlcG9zaXRvcnkoKTsKCiAgdmlydHVhbCBDb250YWluZWRfcHRy IGxvb2t1cF9pZChjb25zdCBjaGFyKiBzZWFyY2hfaWQpID0gMDsKICB2aXJ0dWFsIENPUkJBOjpU eXBlQ29kZV9wdHIgZ2V0X2Nhbm9uaWNhbF90eXBlY29kZShDT1JCQTo6VHlwZUNvZGVfcHRyIHRj KSA9IDA7CiAgdmlydHVhbCBQcmltaXRpdmVEZWZfcHRyIGdldF9wcmltaXRpdmUoUHJpbWl0aXZl S2luZCBraW5kKSA9IDA7CiAgdmlydHVhbCBTdHJpbmdEZWZfcHRyIGNyZWF0ZV9zdHJpbmcoQ09S QkE6OlVMb25nIGJvdW5kKSA9IDA7CiAgdmlydHVhbCBXc3RyaW5nRGVmX3B0ciBjcmVhdGVfd3N0 cmluZyhDT1JCQTo6VUxvbmcgYm91bmQpID0gMDsKICB2aXJ0dWFsIFNlcXVlbmNlRGVmX3B0ciBj cmVhdGVfc2VxdWVuY2UoQ09SQkE6OlVMb25nIGJvdW5kLCBJRExUeXBlX3B0ciBlbGVtZW50X3R5 cGUpID0gMDsKICB2aXJ0dWFsIEFycmF5RGVmX3B0ciBjcmVhdGVfYXJyYXkoQ09SQkE6OlVMb25n IGxlbmd0aCwgSURMVHlwZV9wdHIgZWxlbWVudF90eXBlKSA9IDA7CiAgdmlydHVhbCBGaXhlZERl Zl9wdHIgY3JlYXRlX2ZpeGVkKENPUkJBOjpVU2hvcnQgZGlnaXRzLCBDT1JCQTo6U2hvcnQgc2Nh bGUpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9Q X1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hh ciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgpleHRl cm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfUmVwb3NpdG9yeTsKIyAyMDcxICIuLi9v bW5pT1JCMy9pcl9kZWZzLmhoIgpjbGFzcyBNb2R1bGVEZWYgewpwdWJsaWM6CgogIHR5cGVkZWYg TW9kdWxlRGVmX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBNb2R1bGVEZWZfdmFyIF92YXJfdHlw ZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9w dHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9u aWwoKTsKCiAgc3RhdGljIGlubGluZSBzaXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6 ZV90KTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRC dWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91 bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3Rf cHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRy X3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAg IHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFs T2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmog PSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJl c3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4g cmVzdWx0OwogIH0KCiAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKCn07CgpjbGFz cyBfb2JqcmVmX01vZHVsZURlZiA6CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZXIs CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZWQKewpwdWJsaWM6CgogIGlubGluZSBf b2JqcmVmX01vZHVsZURlZigpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpyZWZfTW9kdWxlRGVm KGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21u aUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX01vZHVsZURl ZigpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7 CgogIF9vYmpyZWZfTW9kdWxlRGVmKGNvbnN0IF9vYmpyZWZfTW9kdWxlRGVmJik7CiAgX29ianJl Zl9Nb2R1bGVEZWYmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfTW9kdWxlRGVmJik7Cgp9OwoK Y2xhc3MgX3BvZl9Nb2R1bGVEZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGlj OgogIGlubGluZSBfcG9mX01vZHVsZURlZigpIDogcHJveHlPYmplY3RGYWN0b3J5KE1vZHVsZURl Zjo6X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX01vZHVsZURlZigpOwoKICB2aXJ0dWFs IG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlz dCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxv Y2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciop IGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxfTW9kdWxlRGVmIDoKICBwdWJsaWMgdmlydHVhbCBfaW1w bF9Db250YWluZXIsCiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFpbmVkCnsKcHVibGljOgog IHZpcnR1YWwgfl9pbXBsX01vZHVsZURlZigpOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jv b2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJU b0ludGVyZmFjZShjb25zdCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2 ZWRSZXBvSWQoKTsKfTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Nb2R1 bGVEZWY7CgpzdHJ1Y3QgTW9kdWxlRGVzY3JpcHRpb24gewogIHR5cGVkZWYgX0NPUkJBX0NvbnN0 clR5cGVfVmFyaWFibGVfVmFyPE1vZHVsZURlc2NyaXB0aW9uPiBfdmFyX3R5cGU7CgogIENPUkJB OjpTdHJpbmdfbWVtYmVyIG5hbWU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIGlkOwoKICBDT1JC QTo6U3RyaW5nX21lbWJlciBkZWZpbmVkX2luOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciB2ZXJz aW9uOwoKICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25z dDsKICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lk IG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChN ZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJl ZFN0cmVhbSAmKTsKfTsKCnR5cGVkZWYgTW9kdWxlRGVzY3JpcHRpb246Ol92YXJfdHlwZSBNb2R1 bGVEZXNjcmlwdGlvbl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09V VF9hcmc8IE1vZHVsZURlc2NyaXB0aW9uLE1vZHVsZURlc2NyaXB0aW9uX3ZhciA+IE1vZHVsZURl c2NyaXB0aW9uX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Nb2R1 bGVEZXNjcmlwdGlvbjsKIyAyMjA2ICIuLi9vbW5pT1JCMy9pcl9kZWZzLmhoIgpjbGFzcyBDb25z dGFudERlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBDb25zdGFudERlZl9wdHIgX3B0cl90eXBlOwog IHR5cGVkZWYgQ29uc3RhbnREZWZfdmFyIF92YXJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBf ZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpP YmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgc3RhdGljIGlubGluZSBz aXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgaW5saW5lIHZv aWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRp YyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFt Jik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVy ZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNo YWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhv YmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBz dGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVm KF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAg IENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGNv bnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKCn07CgpjbGFzcyBfb2JqcmVmX0NvbnN0YW50RGVmIDoK ICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX0NvbnRhaW5lZAp7CnB1YmxpYzoKCiAgQ09SQkE6OlR5 cGVDb2RlX3B0ciB0eXBlKCk7CiAgSURMVHlwZV9wdHIgdHlwZV9kZWYoKTsKICB2b2lkIHR5cGVf ZGVmKElETFR5cGVfcHRyKTsKICBDT1JCQTo6QW55KiB2YWx1ZSgpOwogIHZvaWQgdmFsdWUoY29u c3QgQ09SQkE6OkFueSYpOwoKICBpbmxpbmUgX29ianJlZl9Db25zdGFudERlZigpIHsgX1BSX3Nl dG9iaigwKTsgfQogIF9vYmpyZWZfQ29uc3RhbnREZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2Vk UHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVj dGVkOgogIHZpcnR1YWwgfl9vYmpyZWZfQ29uc3RhbnREZWYoKTsKCnByaXZhdGU6CiAgdmlydHVh bCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX0NvbnN0YW50RGVm KGNvbnN0IF9vYmpyZWZfQ29uc3RhbnREZWYmKTsKICBfb2JqcmVmX0NvbnN0YW50RGVmJiBvcGVy YXRvciA9IChjb25zdCBfb2JqcmVmX0NvbnN0YW50RGVmJik7Cgp9OwoKY2xhc3MgX3BvZl9Db25z dGFudERlZiA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9w b2ZfQ29uc3RhbnREZWYoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShDb25zdGFudERlZjo6X1BEX3Jl cG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX0NvbnN0YW50RGVmKCk7CgogIHZpcnR1YWwgb21uaU9i alJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVu dGl0eSopOwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7 Cn07CgpjbGFzcyBfaW1wbF9Db25zdGFudERlZiA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29u dGFpbmVkCnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX0NvbnN0YW50RGVmKCk7CgogIHZpcnR1 YWwgQ09SQkE6OlR5cGVDb2RlX3B0ciB0eXBlKCkgPSAwOwogIHZpcnR1YWwgSURMVHlwZV9wdHIg dHlwZV9kZWYoKSA9IDA7CiAgdmlydHVhbCB2b2lkIHR5cGVfZGVmKElETFR5cGVfcHRyKSA9IDA7 CiAgdmlydHVhbCBDT1JCQTo6QW55KiB2YWx1ZSgpID0gMDsKICB2aXJ0dWFsIHZvaWQgdmFsdWUo Y29uc3QgQ09SQkE6OkFueSYpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFu IF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRl cmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVw b0lkKCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQ29uc3RhbnRE ZWY7CgpzdHJ1Y3QgQ29uc3RhbnREZXNjcmlwdGlvbiB7CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3Ry VHlwZV9WYXJpYWJsZV9WYXI8Q29uc3RhbnREZXNjcmlwdGlvbj4gX3Zhcl90eXBlOwoKICBDT1JC QTo6U3RyaW5nX21lbWJlciBuYW1lOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBpZDsKCiAgQ09S QkE6OlN0cmluZ19tZW1iZXIgZGVmaW5lZF9pbjsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgdmVy c2lvbjsKCiAgQ09SQkE6OlR5cGVDb2RlX21lbWJlciB0eXBlOwoKICBDT1JCQTo6QW55IHZhbHVl OwoKICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsK ICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9w ZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChNZW1C dWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0 cmVhbSAmKTsKfTsKCnR5cGVkZWYgQ29uc3RhbnREZXNjcmlwdGlvbjo6X3Zhcl90eXBlIENvbnN0 YW50RGVzY3JpcHRpb25fdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9P VVRfYXJnPCBDb25zdGFudERlc2NyaXB0aW9uLENvbnN0YW50RGVzY3JpcHRpb25fdmFyID4gQ29u c3RhbnREZXNjcmlwdGlvbl9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBf dGNfQ29uc3RhbnREZXNjcmlwdGlvbjsKCgoKCmNsYXNzIFR5cGVkZWZEZWY7CmNsYXNzIF9vYmpy ZWZfVHlwZWRlZkRlZjsKY2xhc3MgX2ltcGxfVHlwZWRlZkRlZjsKCnR5cGVkZWYgX29ianJlZl9U eXBlZGVmRGVmKiBUeXBlZGVmRGVmX3B0cjsKdHlwZWRlZiBUeXBlZGVmRGVmX3B0ciBUeXBlZGVm RGVmUmVmOwoKY2xhc3MgVHlwZWRlZkRlZl9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBUeXBl ZGVmRGVmX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRp YyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNl KF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGlj IHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQg bWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9w dHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9p ZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMg X3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRl ZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1R5cGVkZWZEZWYsIFR5cGVkZWZEZWZfSGVscGVy PiBUeXBlZGVmRGVmX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9U eXBlZGVmRGVmLFR5cGVkZWZEZWZfSGVscGVyID4gVHlwZWRlZkRlZl9vdXQ7CgoKCmNsYXNzIFR5 cGVkZWZEZWYgewpwdWJsaWM6CgogIHR5cGVkZWYgVHlwZWRlZkRlZl9wdHIgX3B0cl90eXBlOwog IHR5cGVkZWYgVHlwZWRlZkRlZl92YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9k dXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9i amVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNp emVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9p ZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGlj IGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0m KTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJl ZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hh bE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9i aik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0 YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0m IHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYo X1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAg Q09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29u c3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNsYXNzIF9vYmpyZWZfVHlwZWRlZkRlZiA6CiAg cHVibGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZWQsCiAgcHVibGljIHZpcnR1YWwgX29ianJl Zl9JRExUeXBlCnsKcHVibGljOgoKICBpbmxpbmUgX29ianJlZl9UeXBlZGVmRGVmKCkgeyBfUFJf c2V0b2JqKDApOyB9CiAgX29ianJlZl9UeXBlZGVmRGVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dl ZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3Rl Y3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX1R5cGVkZWZEZWYoKTsKCnByaXZhdGU6CiAgdmlydHVh bCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1R5cGVkZWZEZWYo Y29uc3QgX29ianJlZl9UeXBlZGVmRGVmJik7CiAgX29ianJlZl9UeXBlZGVmRGVmJiBvcGVyYXRv ciA9IChjb25zdCBfb2JqcmVmX1R5cGVkZWZEZWYmKTsKCn07CgpjbGFzcyBfcG9mX1R5cGVkZWZE ZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGluZSBfcG9mX1R5 cGVkZWZEZWYoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShUeXBlZGVmRGVmOjpfUERfcmVwb0lkKSB7 fQogIHZpcnR1YWwgfl9wb2ZfVHlwZWRlZkRlZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5l d09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsK ICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xh c3MgX2ltcGxfVHlwZWRlZkRlZiA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFpbmVkLAog IHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0lETFR5cGUKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxf VHlwZWRlZkRlZigpOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNo KEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25z dCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsK CmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19UeXBlZGVmRGVmOwoKc3RydWN0 IFR5cGVEZXNjcmlwdGlvbiB7CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9W YXI8VHlwZURlc2NyaXB0aW9uPiBfdmFyX3R5cGU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIG5h bWU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIGlkOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBk ZWZpbmVkX2luOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciB2ZXJzaW9uOwoKICBDT1JCQTo6VHlw ZUNvZGVfbWVtYmVyIHR5cGU7CgogIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRp YWxvZmZzZXQpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYp IGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogIHZvaWQg b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8 PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpOwp9OwoKdHlwZWRlZiBUeXBlRGVzY3JpcHRpb246Ol92 YXJfdHlwZSBUeXBlRGVzY3JpcHRpb25fdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9W YXJpYWJsZV9PVVRfYXJnPCBUeXBlRGVzY3JpcHRpb24sVHlwZURlc2NyaXB0aW9uX3ZhciA+IFR5 cGVEZXNjcmlwdGlvbl9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNf VHlwZURlc2NyaXB0aW9uOwojIDI0OTIgIi4uL29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIFN0 cnVjdERlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBTdHJ1Y3REZWZfcHRyIF9wdHJfdHlwZTsKICB0 eXBlZGVmIFN0cnVjdERlZl92YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBs aWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVj dF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVf dCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBf bWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlu bGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsK CiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0 cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9i alJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7 CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRp YyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMp IHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BE X3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09S QkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3Qg Y2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNsYXNzIF9vYmpyZWZfU3RydWN0RGVmIDoKICBwdWJs aWMgdmlydHVhbCBfb2JqcmVmX1R5cGVkZWZEZWYsCiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9D b250YWluZXIKewpwdWJsaWM6CgogIFN0cnVjdE1lbWJlclNlcSogbWVtYmVycygpOwogIHZvaWQg bWVtYmVycyhjb25zdCBTdHJ1Y3RNZW1iZXJTZXEmKTsKCiAgaW5saW5lIF9vYmpyZWZfU3RydWN0 RGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9TdHJ1Y3REZWYoY29uc3QgY2hhcios IElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0 eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpyZWZfU3RydWN0RGVmKCk7Cgpwcml2YXRl OgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9T dHJ1Y3REZWYoY29uc3QgX29ianJlZl9TdHJ1Y3REZWYmKTsKICBfb2JqcmVmX1N0cnVjdERlZiYg b3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9TdHJ1Y3REZWYmKTsKCn07CgpjbGFzcyBfcG9mX1N0 cnVjdERlZiA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9w b2ZfU3RydWN0RGVmKCkgOiBwcm94eU9iamVjdEZhY3RvcnkoU3RydWN0RGVmOjpfUERfcmVwb0lk KSB7fQogIHZpcnR1YWwgfl9wb2ZfU3RydWN0RGVmKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiog bmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSop OwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07Cgpj bGFzcyBfaW1wbF9TdHJ1Y3REZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX1R5cGVkZWZEZWYs CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFpbmVyCnsKcHVibGljOgogIHZpcnR1YWwgfl9p bXBsX1N0cnVjdERlZigpOwoKICB2aXJ0dWFsIFN0cnVjdE1lbWJlclNlcSogbWVtYmVycygpID0g MDsKICB2aXJ0dWFsIHZvaWQgbWVtYmVycyhjb25zdCBTdHJ1Y3RNZW1iZXJTZXEmKSA9IDA7Cgpw dWJsaWM6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9TJik7Cgpwcml2 YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICB2aXJ0 dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKZXh0ZXJuIGNvbnN0IENP UkJBOjpUeXBlQ29kZV9wdHIgX3RjX1N0cnVjdERlZjsKIyAyNjA5ICIuLi9vbW5pT1JCMy9pcl9k ZWZzLmhoIgpjbGFzcyBVbmlvbkRlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBVbmlvbkRlZl9wdHIg X3B0cl90eXBlOwogIHR5cGVkZWYgVW5pb25EZWZfdmFyIF92YXJfdHlwZTsKCiAgc3RhdGljIF9w dHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93 KENPUkJBOjpPYmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgc3RhdGlj IGlubGluZSBzaXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMg aW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYp OwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZl cmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYo TmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJB OjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0g X25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7 CiAgfQoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJz aGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3co b2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAg c3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKCn07CgpjbGFzcyBfb2JqcmVmX1VuaW9u RGVmIDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX1R5cGVkZWZEZWYsCiAgcHVibGljIHZpcnR1 YWwgX29ianJlZl9Db250YWluZXIKewpwdWJsaWM6CgogIENPUkJBOjpUeXBlQ29kZV9wdHIgZGlz Y3JpbWluYXRvcl90eXBlKCk7CiAgSURMVHlwZV9wdHIgZGlzY3JpbWluYXRvcl90eXBlX2RlZigp OwogIHZvaWQgZGlzY3JpbWluYXRvcl90eXBlX2RlZihJRExUeXBlX3B0cik7CiAgVW5pb25NZW1i ZXJTZXEqIG1lbWJlcnMoKTsKICB2b2lkIG1lbWJlcnMoY29uc3QgVW5pb25NZW1iZXJTZXEmKTsK CiAgaW5saW5lIF9vYmpyZWZfVW5pb25EZWYoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVm X1VuaW9uRGVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50 aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVm X1VuaW9uRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0 IGNoYXIqKTsKCiAgX29ianJlZl9VbmlvbkRlZihjb25zdCBfb2JqcmVmX1VuaW9uRGVmJik7CiAg X29ianJlZl9VbmlvbkRlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9VbmlvbkRlZiYpOwoK fTsKCmNsYXNzIF9wb2ZfVW5pb25EZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVi bGljOgogIGlubGluZSBfcG9mX1VuaW9uRGVmKCkgOiBwcm94eU9iamVjdEZhY3RvcnkoVW5pb25E ZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9VbmlvbkRlZigpOwoKICB2aXJ0dWFs IG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlz dCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxv Y2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciop IGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxfVW5pb25EZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBs X1R5cGVkZWZEZWYsCiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFpbmVyCnsKcHVibGljOgog IHZpcnR1YWwgfl9pbXBsX1VuaW9uRGVmKCk7CgogIHZpcnR1YWwgQ09SQkE6OlR5cGVDb2RlX3B0 ciBkaXNjcmltaW5hdG9yX3R5cGUoKSA9IDA7CiAgdmlydHVhbCBJRExUeXBlX3B0ciBkaXNjcmlt aW5hdG9yX3R5cGVfZGVmKCkgPSAwOwogIHZpcnR1YWwgdm9pZCBkaXNjcmltaW5hdG9yX3R5cGVf ZGVmKElETFR5cGVfcHRyKSA9IDA7CiAgdmlydHVhbCBVbmlvbk1lbWJlclNlcSogbWVtYmVycygp ID0gMDsKICB2aXJ0dWFsIHZvaWQgbWVtYmVycyhjb25zdCBVbmlvbk1lbWJlclNlcSYpID0gMDsK CnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnBy aXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZp cnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgpleHRlcm4gY29uc3Qg Q09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVW5pb25EZWY7CiMgMjczMiAiLi4vb21uaU9SQjMvaXJf ZGVmcy5oaCIKY2xhc3MgRW51bURlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBFbnVtRGVmX3B0ciBf cHRyX3R5cGU7CiAgdHlwZWRlZiBFbnVtRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRy X3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhD T1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBp bmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlu bGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsK ICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJl ZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5l dEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6 VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9u YXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0Owog IH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJl ZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hh bE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9i aik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0 YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoKY2xhc3MgX29ianJlZl9FbnVtRGVm IDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX1R5cGVkZWZEZWYKewpwdWJsaWM6CgogIEVudW1N ZW1iZXJTZXEqIG1lbWJlcnMoKTsKICB2b2lkIG1lbWJlcnMoY29uc3QgRW51bU1lbWJlclNlcSYp OwoKICBpbmxpbmUgX29ianJlZl9FbnVtRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJl Zl9FbnVtRGVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50 aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVm X0VudW1EZWYoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3Qg Y2hhciopOwoKICBfb2JqcmVmX0VudW1EZWYoY29uc3QgX29ianJlZl9FbnVtRGVmJik7CiAgX29i anJlZl9FbnVtRGVmJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0VudW1EZWYmKTsKCn07Cgpj bGFzcyBfcG9mX0VudW1EZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgog IGlubGluZSBfcG9mX0VudW1EZWYoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShFbnVtRGVmOjpfUERf cmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfRW51bURlZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpS ZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRp dHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9 OwoKY2xhc3MgX2ltcGxfRW51bURlZiA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfVHlwZWRlZkRl Zgp7CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9FbnVtRGVmKCk7CgogIHZpcnR1YWwgRW51bU1l bWJlclNlcSogbWVtYmVycygpID0gMDsKICB2aXJ0dWFsIHZvaWQgbWVtYmVycyhjb25zdCBFbnVt TWVtYmVyU2VxJikgPSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3Bh dGNoKEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShj b25zdCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsK fTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19FbnVtRGVmOwojIDI4NDcg Ii4uL29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIEFsaWFzRGVmIHsKcHVibGljOgoKICB0eXBl ZGVmIEFsaWFzRGVmX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBBbGlhc0RlZl92YXIgX3Zhcl90 eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMg X3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUg X25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBz aXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5l dEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9w dHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUg X3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVj dF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9w dHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwog ICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNo YWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9i aiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUg cmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVy biByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNs YXNzIF9vYmpyZWZfQWxpYXNEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfVHlwZWRlZkRl Zgp7CnB1YmxpYzoKCiAgSURMVHlwZV9wdHIgb3JpZ2luYWxfdHlwZV9kZWYoKTsKICB2b2lkIG9y aWdpbmFsX3R5cGVfZGVmKElETFR5cGVfcHRyKTsKCiAgaW5saW5lIF9vYmpyZWZfQWxpYXNEZWYo KSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVmX0FsaWFzRGVmKGNvbnN0IGNoYXIqLCBJT1A6 OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsK CnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX0FsaWFzRGVmKCk7Cgpwcml2YXRlOgogIHZp cnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9BbGlhc0Rl Zihjb25zdCBfb2JqcmVmX0FsaWFzRGVmJik7CiAgX29ianJlZl9BbGlhc0RlZiYgb3BlcmF0b3Ig PSAoY29uc3QgX29ianJlZl9BbGlhc0RlZiYpOwoKfTsKCmNsYXNzIF9wb2ZfQWxpYXNEZWYgOiBw dWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGluZSBfcG9mX0FsaWFzRGVm KCkgOiBwcm94eU9iamVjdEZhY3RvcnkoQWxpYXNEZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVh bCB+X3BvZl9BbGlhc0RlZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25z dCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9D T1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxfQWxp YXNEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX1R5cGVkZWZEZWYKewpwdWJsaWM6CiAgdmly dHVhbCB+X2ltcGxfQWxpYXNEZWYoKTsKCiAgdmlydHVhbCBJRExUeXBlX3B0ciBvcmlnaW5hbF90 eXBlX2RlZigpID0gMDsKICB2aXJ0dWFsIHZvaWQgb3JpZ2luYWxfdHlwZV9kZWYoSURMVHlwZV9w dHIpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9Q X1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hh ciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgpleHRl cm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQWxpYXNEZWY7CiMgMjk2MiAiLi4vb21u aU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgTmF0aXZlRGVmIHsKcHVibGljOgoKICB0eXBlZGVmIE5h dGl2ZURlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgTmF0aXZlRGVmX3ZhciBfdmFyX3R5cGU7 CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRy X3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmls KCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVf dCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVm ZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90 eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5t YXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0 ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90 eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICBy ZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9i alJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0g Q09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1 bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJl c3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoKY2xhc3Mg X29ianJlZl9OYXRpdmVEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfVHlwZWRlZkRlZgp7 CnB1YmxpYzoKCiAgaW5saW5lIF9vYmpyZWZfTmF0aXZlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9 CiAgX29ianJlZl9OYXRpdmVEZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3Qq LCBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1 YWwgfl9vYmpyZWZfTmF0aXZlRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRv T2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9OYXRpdmVEZWYoY29uc3QgX29ianJlZl9O YXRpdmVEZWYmKTsKICBfb2JqcmVmX05hdGl2ZURlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJl Zl9OYXRpdmVEZWYmKTsKCn07CgpjbGFzcyBfcG9mX05hdGl2ZURlZiA6IHB1YmxpYyBwcm94eU9i amVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfTmF0aXZlRGVmKCkgOiBwcm94eU9i amVjdEZhY3RvcnkoTmF0aXZlRGVmOjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfTmF0 aXZlRGVmKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJ T1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBv bW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xl YW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgpjbGFzcyBfaW1wbF9OYXRpdmVEZWYgOgog IHB1YmxpYyB2aXJ0dWFsIF9pbXBsX1R5cGVkZWZEZWYKewpwdWJsaWM6CiAgdmlydHVhbCB+X2lt cGxfTmF0aXZlRGVmKCk7CgpwdWJsaWM6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0 Y2goR0lPUF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNv bnN0IGNoYXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9 OwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX05hdGl2ZURlZjsKIyAzMDcx ICIuLi9vbW5pT1JCMy9pcl9kZWZzLmhoIgpjbGFzcyBQcmltaXRpdmVEZWYgewpwdWJsaWM6Cgog IHR5cGVkZWYgUHJpbWl0aXZlRGVmX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBQcmltaXRpdmVE ZWZfdmFyIF92YXJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlw ZSk7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICBzdGF0 aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgc3RhdGljIGlubGluZSBzaXplX3QgX2FsaWduZWRTaXpl KF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYo X3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFy c2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbmxp bmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAg IENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9J ZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJl bGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW5saW5lIF9wdHJf dHlwZSBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6 T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwog ICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9i aik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBv SWQ7CgoKCn07CgpjbGFzcyBfb2JqcmVmX1ByaW1pdGl2ZURlZiA6CiAgcHVibGljIHZpcnR1YWwg X29ianJlZl9JRExUeXBlCnsKcHVibGljOgoKICBQcmltaXRpdmVLaW5kIGtpbmQoKTsKCiAgaW5s aW5lIF9vYmpyZWZfUHJpbWl0aXZlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9Q cmltaXRpdmVEZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRl bnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpy ZWZfUHJpbWl0aXZlRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVm KGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9QcmltaXRpdmVEZWYoY29uc3QgX29ianJlZl9Qcmlt aXRpdmVEZWYmKTsKICBfb2JqcmVmX1ByaW1pdGl2ZURlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29i anJlZl9QcmltaXRpdmVEZWYmKTsKCn07CgpjbGFzcyBfcG9mX1ByaW1pdGl2ZURlZiA6IHB1Ymxp YyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfUHJpbWl0aXZlRGVm KCkgOiBwcm94eU9iamVjdEZhY3RvcnkoUHJpbWl0aXZlRGVmOjpfUERfcmVwb0lkKSB7fQogIHZp cnR1YWwgfl9wb2ZfUHJpbWl0aXZlRGVmKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2Jq UmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZp cnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgpjbGFzcyBf aW1wbF9QcmltaXRpdmVEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0lETFR5cGUKewpwdWJs aWM6CiAgdmlydHVhbCB+X2ltcGxfUHJpbWl0aXZlRGVmKCk7CgogIHZpcnR1YWwgUHJpbWl0aXZl S2luZCBraW5kKCkgPSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3Bh dGNoKEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShj b25zdCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsK fTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19QcmltaXRpdmVEZWY7CiMg MzE4NCAiLi4vb21uaU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgU3RyaW5nRGVmIHsKcHVibGljOgoK ICB0eXBlZGVmIFN0cmluZ0RlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgU3RyaW5nRGVmX3Zh ciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwog IHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9w dHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxP YmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9w dHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JC QTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMp OwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNl KG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUg X3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVj dF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9w dHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwog ICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoK Cgp9OwoKY2xhc3MgX29ianJlZl9TdHJpbmdEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZf SURMVHlwZQp7CnB1YmxpYzoKCiAgQ09SQkE6OlVMb25nIGJvdW5kKCk7CiAgdm9pZCBib3VuZChD T1JCQTo6VUxvbmcpOwoKICBpbmxpbmUgX29ianJlZl9TdHJpbmdEZWYoKSB7IF9QUl9zZXRvYmoo MCk7IH0KICBfb2JqcmVmX1N0cmluZ0RlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxl TGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAg dmlydHVhbCB+X29ianJlZl9TdHJpbmdEZWYoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBf cHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1N0cmluZ0RlZihjb25zdCBfb2Jq cmVmX1N0cmluZ0RlZiYpOwogIF9vYmpyZWZfU3RyaW5nRGVmJiBvcGVyYXRvciA9IChjb25zdCBf b2JqcmVmX1N0cmluZ0RlZiYpOwoKfTsKCmNsYXNzIF9wb2ZfU3RyaW5nRGVmIDogcHVibGljIHBy b3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9TdHJpbmdEZWYoKSA6IHBy b3h5T2JqZWN0RmFjdG9yeShTdHJpbmdEZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3Bv Zl9TdHJpbmdEZWYoKTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hh ciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFf Qm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX1N0cmluZ0Rl ZiA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfSURMVHlwZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5f aW1wbF9TdHJpbmdEZWYoKTsKCiAgdmlydHVhbCBDT1JCQTo6VUxvbmcgYm91bmQoKSA9IDA7CiAg dmlydHVhbCB2b2lkIGJvdW5kKENPUkJBOjpVTG9uZykgPSAwOwoKcHVibGljOgogIHZpcnR1YWwg X0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZv aWQqIF9wdHJUb0ludGVyZmFjZShjb25zdCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBf bW9zdERlcml2ZWRSZXBvSWQoKTsKfTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRy IF90Y19TdHJpbmdEZWY7CiMgMzI5OSAiLi4vb21uaU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgV3N0 cmluZ0RlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBXc3RyaW5nRGVmX3B0ciBfcHRyX3R5cGU7CiAg dHlwZWRlZiBXc3RyaW5nRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1 cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2Jq ZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6 ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lk IF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMg aW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYp OwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFs T2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2Jq KTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3Rh dGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYg cykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihf UERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBD T1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25z dCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoKY2xhc3MgX29ianJlZl9Xc3RyaW5nRGVmIDoKICBw dWJsaWMgdmlydHVhbCBfb2JqcmVmX0lETFR5cGUKewpwdWJsaWM6CgogIENPUkJBOjpVTG9uZyBi b3VuZCgpOwogIHZvaWQgYm91bmQoQ09SQkE6OlVMb25nKTsKCiAgaW5saW5lIF9vYmpyZWZfV3N0 cmluZ0RlZigpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpyZWZfV3N0cmluZ0RlZihjb25zdCBj aGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElk ZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9Xc3RyaW5nRGVmKCk7Cgpw cml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29i anJlZl9Xc3RyaW5nRGVmKGNvbnN0IF9vYmpyZWZfV3N0cmluZ0RlZiYpOwogIF9vYmpyZWZfV3N0 cmluZ0RlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9Xc3RyaW5nRGVmJik7Cgp9OwoKY2xh c3MgX3BvZl9Xc3RyaW5nRGVmIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoK ICBpbmxpbmUgX3BvZl9Xc3RyaW5nRGVmKCkgOiBwcm94eU9iamVjdEZhY3RvcnkoV3N0cmluZ0Rl Zjo6X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1dzdHJpbmdEZWYoKTsKCiAgdmlydHVh bCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxp c3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9tbmlM b2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIq KSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX1dzdHJpbmdEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9p bXBsX0lETFR5cGUKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxfV3N0cmluZ0RlZigpOwoKICB2 aXJ0dWFsIENPUkJBOjpVTG9uZyBib3VuZCgpID0gMDsKICB2aXJ0dWFsIHZvaWQgYm91bmQoQ09S QkE6OlVMb25nKSA9IDA7CgpwdWJsaWM6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0 Y2goR0lPUF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNv bnN0IGNoYXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9 OwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1dzdHJpbmdEZWY7CiMgMzQx NCAiLi4vb21uaU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgRml4ZWREZWYgewpwdWJsaWM6CgogIHR5 cGVkZWYgRml4ZWREZWZfcHRyIF9wdHJfdHlwZTsKICB0eXBlZGVmIEZpeGVkRGVmX3ZhciBfdmFy X3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRp YyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlw ZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUs IHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYo X3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlw ZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2Jq ZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAg X3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7 CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFy c2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIg b2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlw ZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0 dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoK Y2xhc3MgX29ianJlZl9GaXhlZERlZiA6CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9JRExUeXBl CnsKcHVibGljOgoKICBDT1JCQTo6VVNob3J0IGRpZ2l0cygpOwogIHZvaWQgZGlnaXRzKENPUkJB OjpVU2hvcnQpOwogIENPUkJBOjpTaG9ydCBzY2FsZSgpOwogIHZvaWQgc2NhbGUoQ09SQkE6OlNo b3J0KTsKCiAgaW5saW5lIF9vYmpyZWZfRml4ZWREZWYoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBf b2JqcmVmX0ZpeGVkRGVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21u aUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5f b2JqcmVmX0ZpeGVkRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVm KGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9GaXhlZERlZihjb25zdCBfb2JqcmVmX0ZpeGVkRGVm Jik7CiAgX29ianJlZl9GaXhlZERlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9GaXhlZERl ZiYpOwoKfTsKCmNsYXNzIF9wb2ZfRml4ZWREZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5 IHsKcHVibGljOgogIGlubGluZSBfcG9mX0ZpeGVkRGVmKCkgOiBwcm94eU9iamVjdEZhY3Rvcnko Rml4ZWREZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9GaXhlZERlZigpOwoKICB2 aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9m aWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwg b21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3Qg Y2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxfRml4ZWREZWYgOgogIHB1YmxpYyB2aXJ0dWFs IF9pbXBsX0lETFR5cGUKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxfRml4ZWREZWYoKTsKCiAg dmlydHVhbCBDT1JCQTo6VVNob3J0IGRpZ2l0cygpID0gMDsKICB2aXJ0dWFsIHZvaWQgZGlnaXRz KENPUkJBOjpVU2hvcnQpID0gMDsKICB2aXJ0dWFsIENPUkJBOjpTaG9ydCBzY2FsZSgpID0gMDsK ICB2aXJ0dWFsIHZvaWQgc2NhbGUoQ09SQkE6OlNob3J0KSA9IDA7CgpwdWJsaWM6CiAgdmlydHVh bCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwg dm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9w dHIgX3RjX0ZpeGVkRGVmOwojIDM1MzMgIi4uL29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIFNl cXVlbmNlRGVmIHsKcHVibGljOgoKICB0eXBlZGVmIFNlcXVlbmNlRGVmX3B0ciBfcHRyX3R5cGU7 CiAgdHlwZWRlZiBTZXF1ZW5jZURlZl92YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBl IF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6 Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5l IHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUg dm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3Rh dGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJl YW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZm ZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFy c2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93 KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cgog IHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJl YW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpS ZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwog ICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMg Y29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNsYXNzIF9vYmpyZWZfU2VxdWVuY2VEZWYg OgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfSURMVHlwZQp7CnB1YmxpYzoKCiAgQ09SQkE6OlVM b25nIGJvdW5kKCk7CiAgdm9pZCBib3VuZChDT1JCQTo6VUxvbmcpOwogIENPUkJBOjpUeXBlQ29k ZV9wdHIgZWxlbWVudF90eXBlKCk7CiAgSURMVHlwZV9wdHIgZWxlbWVudF90eXBlX2RlZigpOwog IHZvaWQgZWxlbWVudF90eXBlX2RlZihJRExUeXBlX3B0cik7CgogIGlubGluZSBfb2JqcmVmX1Nl cXVlbmNlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9TZXF1ZW5jZURlZihjb25z dCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2Nh bElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9TZXF1ZW5jZURlZigp OwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7Cgog IF9vYmpyZWZfU2VxdWVuY2VEZWYoY29uc3QgX29ianJlZl9TZXF1ZW5jZURlZiYpOwogIF9vYmpy ZWZfU2VxdWVuY2VEZWYmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfU2VxdWVuY2VEZWYmKTsK Cn07CgpjbGFzcyBfcG9mX1NlcXVlbmNlRGVmIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7 CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9TZXF1ZW5jZURlZigpIDogcHJveHlPYmplY3RGYWN0b3J5 KFNlcXVlbmNlRGVmOjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfU2VxdWVuY2VEZWYo KTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFn Z2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVu dGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19h KGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX1NlcXVlbmNlRGVmIDoKICBwdWJs aWMgdmlydHVhbCBfaW1wbF9JRExUeXBlCnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX1NlcXVl bmNlRGVmKCk7CgogIHZpcnR1YWwgQ09SQkE6OlVMb25nIGJvdW5kKCkgPSAwOwogIHZpcnR1YWwg dm9pZCBib3VuZChDT1JCQTo6VUxvbmcpID0gMDsKICB2aXJ0dWFsIENPUkJBOjpUeXBlQ29kZV9w dHIgZWxlbWVudF90eXBlKCkgPSAwOwogIHZpcnR1YWwgSURMVHlwZV9wdHIgZWxlbWVudF90eXBl X2RlZigpID0gMDsKICB2aXJ0dWFsIHZvaWQgZWxlbWVudF90eXBlX2RlZihJRExUeXBlX3B0cikg PSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYp OwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25zdCBjaGFyKik7 CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsKCmV4dGVybiBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19TZXF1ZW5jZURlZjsKIyAzNjU0ICIuLi9vbW5p T1JCMy9pcl9kZWZzLmhoIgpjbGFzcyBBcnJheURlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBBcnJh eURlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgQXJyYXlEZWZfdmFyIF92YXJfdHlwZTsKCiAg c3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9wdHJfdHlw ZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsK CiAgc3RhdGljIGlubGluZSBzaXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsK ICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJl ZFN0cmVhbSYpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUs IE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNo YWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9i aiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUg cmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVy biByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVm KE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JC QTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9 IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0 OwogIH0KCiAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKCn07CgpjbGFzcyBfb2Jq cmVmX0FycmF5RGVmIDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX0lETFR5cGUKewpwdWJsaWM6 CgogIENPUkJBOjpVTG9uZyBsZW5ndGgoKTsKICB2b2lkIGxlbmd0aChDT1JCQTo6VUxvbmcpOwog IENPUkJBOjpUeXBlQ29kZV9wdHIgZWxlbWVudF90eXBlKCk7CiAgSURMVHlwZV9wdHIgZWxlbWVu dF90eXBlX2RlZigpOwogIHZvaWQgZWxlbWVudF90eXBlX2RlZihJRExUeXBlX3B0cik7CgogIGlu bGluZSBfb2JqcmVmX0FycmF5RGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9BcnJh eURlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSos IG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9BcnJh eURlZigpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFy Kik7CgogIF9vYmpyZWZfQXJyYXlEZWYoY29uc3QgX29ianJlZl9BcnJheURlZiYpOwogIF9vYmpy ZWZfQXJyYXlEZWYmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfQXJyYXlEZWYmKTsKCn07Cgpj bGFzcyBfcG9mX0FycmF5RGVmIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoK ICBpbmxpbmUgX3BvZl9BcnJheURlZigpIDogcHJveHlPYmplY3RGYWN0b3J5KEFycmF5RGVmOjpf UERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfQXJyYXlEZWYoKTsKCiAgdmlydHVhbCBvbW5p T2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElk ZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25z dDsKfTsKCmNsYXNzIF9pbXBsX0FycmF5RGVmIDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9JRExU eXBlCnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX0FycmF5RGVmKCk7CgogIHZpcnR1YWwgQ09S QkE6OlVMb25nIGxlbmd0aCgpID0gMDsKICB2aXJ0dWFsIHZvaWQgbGVuZ3RoKENPUkJBOjpVTG9u ZykgPSAwOwogIHZpcnR1YWwgQ09SQkE6OlR5cGVDb2RlX3B0ciBlbGVtZW50X3R5cGUoKSA9IDA7 CiAgdmlydHVhbCBJRExUeXBlX3B0ciBlbGVtZW50X3R5cGVfZGVmKCkgPSAwOwogIHZpcnR1YWwg dm9pZCBlbGVtZW50X3R5cGVfZGVmKElETFR5cGVfcHRyKSA9IDA7CgpwdWJsaWM6CiAgdmlydHVh bCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwg dm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9w dHIgX3RjX0FycmF5RGVmOwojIDM3NzUgIi4uL29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIEV4 Y2VwdGlvbkRlZiB7CnB1YmxpYzoKCiAgdHlwZWRlZiBFeGNlcHRpb25EZWZfcHRyIF9wdHJfdHlw ZTsKICB0eXBlZGVmIEV4Y2VwdGlvbkRlZl92YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90 eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09S QkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5s aW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxp bmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAg c3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRT dHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRC dWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVu TWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFy cm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9 CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRT dHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxP YmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmop OwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0 aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCmNsYXNzIF9vYmpyZWZfRXhjZXB0aW9u RGVmIDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX0NvbnRhaW5lZCwKICBwdWJsaWMgdmlydHVh bCBfb2JqcmVmX0NvbnRhaW5lcgp7CnB1YmxpYzoKCiAgQ09SQkE6OlR5cGVDb2RlX3B0ciB0eXBl KCk7CiAgU3RydWN0TWVtYmVyU2VxKiBtZW1iZXJzKCk7CiAgdm9pZCBtZW1iZXJzKGNvbnN0IFN0 cnVjdE1lbWJlclNlcSYpOwoKICBpbmxpbmUgX29ianJlZl9FeGNlcHRpb25EZWYoKSB7IF9QUl9z ZXRvYmooMCk7IH0KICBfb2JqcmVmX0V4Y2VwdGlvbkRlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdn ZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90 ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9FeGNlcHRpb25EZWYoKTsKCnByaXZhdGU6CiAgdmly dHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX0V4Y2VwdGlv bkRlZihjb25zdCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiYpOwogIF9vYmpyZWZfRXhjZXB0aW9uRGVm JiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiYpOwoKfTsKCmNsYXNzIF9w b2ZfRXhjZXB0aW9uRGVmIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBp bmxpbmUgX3BvZl9FeGNlcHRpb25EZWYoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShFeGNlcHRpb25E ZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9FeGNlcHRpb25EZWYoKTsKCiAgdmly dHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmls ZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9t bmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNo YXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX0V4Y2VwdGlvbkRlZiA6CiAgcHVibGljIHZpcnR1 YWwgX2ltcGxfQ29udGFpbmVkLAogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0NvbnRhaW5lcgp7CnB1 YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9FeGNlcHRpb25EZWYoKTsKCiAgdmlydHVhbCBDT1JCQTo6 VHlwZUNvZGVfcHRyIHR5cGUoKSA9IDA7CiAgdmlydHVhbCBTdHJ1Y3RNZW1iZXJTZXEqIG1lbWJl cnMoKSA9IDA7CiAgdmlydHVhbCB2b2lkIG1lbWJlcnMoY29uc3QgU3RydWN0TWVtYmVyU2VxJikg PSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYp OwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25zdCBjaGFyKik7 CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsKCmV4dGVybiBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19FeGNlcHRpb25EZWY7CgpzdHJ1Y3QgRXhjZXB0 aW9uRGVzY3JpcHRpb24gewogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfVmFy PEV4Y2VwdGlvbkRlc2NyaXB0aW9uPiBfdmFyX3R5cGU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVy IG5hbWU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIGlkOwoKICBDT1JCQTo6U3RyaW5nX21lbWJl ciBkZWZpbmVkX2luOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciB2ZXJzaW9uOwoKICBDT1JCQTo6 VHlwZUNvZGVfbWVtYmVyIHR5cGU7CgogIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGlu aXRpYWxvZmZzZXQpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFt ICYpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogIHZv aWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogIHZvaWQgb3BlcmF0 b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpOwp9OwoKdHlwZWRlZiBFeGNlcHRpb25EZXNjcmlw dGlvbjo6X3Zhcl90eXBlIEV4Y2VwdGlvbkRlc2NyaXB0aW9uX3ZhcjsKCnR5cGVkZWYgX0NPUkJB X0NvbnN0clR5cGVfVmFyaWFibGVfT1VUX2FyZzwgRXhjZXB0aW9uRGVzY3JpcHRpb24sRXhjZXB0 aW9uRGVzY3JpcHRpb25fdmFyID4gRXhjZXB0aW9uRGVzY3JpcHRpb25fb3V0OwoKZXh0ZXJuIGNv bnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0V4Y2VwdGlvbkRlc2NyaXB0aW9uOwoKZW51bSBB dHRyaWJ1dGVNb2RlIHsgQVRUUl9OT1JNQUwsIEFUVFJfUkVBRE9OTFkgfTsKdHlwZWRlZiBBdHRy aWJ1dGVNb2RlJiBBdHRyaWJ1dGVNb2RlX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNv ZGVfcHRyIF90Y19BdHRyaWJ1dGVNb2RlOwoKCgoKY2xhc3MgQXR0cmlidXRlRGVmOwpjbGFzcyBf b2JqcmVmX0F0dHJpYnV0ZURlZjsKY2xhc3MgX2ltcGxfQXR0cmlidXRlRGVmOwoKdHlwZWRlZiBf b2JqcmVmX0F0dHJpYnV0ZURlZiogQXR0cmlidXRlRGVmX3B0cjsKdHlwZWRlZiBBdHRyaWJ1dGVE ZWZfcHRyIEF0dHJpYnV0ZURlZlJlZjsKCmNsYXNzIEF0dHJpYnV0ZURlZl9IZWxwZXIgewpwdWJs aWM6CiAgdHlwZWRlZiBBdHRyaWJ1dGVEZWZfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJf dHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwog IHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUo X3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6 ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRT dHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0 cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJl ZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVk U3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfQXR0cmlidXRl RGVmLCBBdHRyaWJ1dGVEZWZfSGVscGVyPiBBdHRyaWJ1dGVEZWZfdmFyOwp0eXBlZGVmIF9DT1JC QV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0F0dHJpYnV0ZURlZixBdHRyaWJ1dGVEZWZfSGVscGVy ID4gQXR0cmlidXRlRGVmX291dDsKCgoKY2xhc3MgQXR0cmlidXRlRGVmIHsKcHVibGljOgoKICB0 eXBlZGVmIEF0dHJpYnV0ZURlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgQXR0cmlidXRlRGVm X3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUp OwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGlj IF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShf cHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9w dHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNo YWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5l IF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBD T1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQs IHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxl YXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5 cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9i amVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAg IF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmop OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lk OwoKCgp9OwoKY2xhc3MgX29ianJlZl9BdHRyaWJ1dGVEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9v YmpyZWZfQ29udGFpbmVkCnsKcHVibGljOgoKICBDT1JCQTo6VHlwZUNvZGVfcHRyIHR5cGUoKTsK ICBJRExUeXBlX3B0ciB0eXBlX2RlZigpOwogIHZvaWQgdHlwZV9kZWYoSURMVHlwZV9wdHIpOwog IEF0dHJpYnV0ZU1vZGUgbW9kZSgpOwogIHZvaWQgbW9kZShBdHRyaWJ1dGVNb2RlKTsKCiAgaW5s aW5lIF9vYmpyZWZfQXR0cmlidXRlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9B dHRyaWJ1dGVEZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRl bnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpy ZWZfQXR0cmlidXRlRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVm KGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9BdHRyaWJ1dGVEZWYoY29uc3QgX29ianJlZl9BdHRy aWJ1dGVEZWYmKTsKICBfb2JqcmVmX0F0dHJpYnV0ZURlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29i anJlZl9BdHRyaWJ1dGVEZWYmKTsKCn07CgpjbGFzcyBfcG9mX0F0dHJpYnV0ZURlZiA6IHB1Ymxp YyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfQXR0cmlidXRlRGVm KCkgOiBwcm94eU9iamVjdEZhY3RvcnkoQXR0cmlidXRlRGVmOjpfUERfcmVwb0lkKSB7fQogIHZp cnR1YWwgfl9wb2ZfQXR0cmlidXRlRGVmKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2Jq UmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZp cnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgpjbGFzcyBf aW1wbF9BdHRyaWJ1dGVEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0NvbnRhaW5lZAp7CnB1 YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9BdHRyaWJ1dGVEZWYoKTsKCiAgdmlydHVhbCBDT1JCQTo6 VHlwZUNvZGVfcHRyIHR5cGUoKSA9IDA7CiAgdmlydHVhbCBJRExUeXBlX3B0ciB0eXBlX2RlZigp ID0gMDsKICB2aXJ0dWFsIHZvaWQgdHlwZV9kZWYoSURMVHlwZV9wdHIpID0gMDsKICB2aXJ0dWFs IEF0dHJpYnV0ZU1vZGUgbW9kZSgpID0gMDsKICB2aXJ0dWFsIHZvaWQgbW9kZShBdHRyaWJ1dGVN b2RlKSA9IDA7CgpwdWJsaWM6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lP UF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNo YXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKZXh0 ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0F0dHJpYnV0ZURlZjsKCnN0cnVjdCBB dHRyaWJ1dGVEZXNjcmlwdGlvbiB7CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJs ZV9WYXI8QXR0cmlidXRlRGVzY3JpcHRpb24+IF92YXJfdHlwZTsKCiAgQ09SQkE6OlN0cmluZ19t ZW1iZXIgbmFtZTsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgaWQ7CgogIENPUkJBOjpTdHJpbmdf bWVtYmVyIGRlZmluZWRfaW47CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIHZlcnNpb247CgogIENP UkJBOjpUeXBlQ29kZV9tZW1iZXIgdHlwZTsKCiAgQXR0cmlidXRlTW9kZSBtb2RlOwoKICBzaXpl X3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsKICB2b2lkIG9w ZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9 IChOZXRCdWZmZXJlZFN0cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0 cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsK fTsKCnR5cGVkZWYgQXR0cmlidXRlRGVzY3JpcHRpb246Ol92YXJfdHlwZSBBdHRyaWJ1dGVEZXNj cmlwdGlvbl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8 IEF0dHJpYnV0ZURlc2NyaXB0aW9uLEF0dHJpYnV0ZURlc2NyaXB0aW9uX3ZhciA+IEF0dHJpYnV0 ZURlc2NyaXB0aW9uX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19B dHRyaWJ1dGVEZXNjcmlwdGlvbjsKCmVudW0gT3BlcmF0aW9uTW9kZSB7IE9QX05PUk1BTCwgT1Bf T05FV0FZIH07CnR5cGVkZWYgT3BlcmF0aW9uTW9kZSYgT3BlcmF0aW9uTW9kZV9vdXQ7CgpleHRl cm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfT3BlcmF0aW9uTW9kZTsKCmVudW0gUGFy YW1ldGVyTW9kZSB7IFBBUkFNX0lOLCBQQVJBTV9PVVQsIFBBUkFNX0lOT1VUIH07CnR5cGVkZWYg UGFyYW1ldGVyTW9kZSYgUGFyYW1ldGVyTW9kZV9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5 cGVDb2RlX3B0ciBfdGNfUGFyYW1ldGVyTW9kZTsKCnN0cnVjdCBQYXJhbWV0ZXJEZXNjcmlwdGlv biB7CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9WYXI8UGFyYW1ldGVyRGVz Y3JpcHRpb24+IF92YXJfdHlwZTsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgbmFtZTsKCiAgQ09S QkE6OlR5cGVDb2RlX21lbWJlciB0eXBlOwoKICBfQ09SQkFfT2JqUmVmX01lbWJlcjwgX29ianJl Zl9JRExUeXBlLCBJRExUeXBlX0hlbHBlcj4gdHlwZV9kZWY7CgogIFBhcmFtZXRlck1vZGUgbW9k ZTsKCiAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7 CiAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgdm9pZCBv cGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7CiAgdm9pZCBvcGVyYXRvcj4+PSAoTWVt QnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRT dHJlYW0gJik7Cn07Cgp0eXBlZGVmIFBhcmFtZXRlckRlc2NyaXB0aW9uOjpfdmFyX3R5cGUgUGFy YW1ldGVyRGVzY3JpcHRpb25fdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJs ZV9PVVRfYXJnPCBQYXJhbWV0ZXJEZXNjcmlwdGlvbixQYXJhbWV0ZXJEZXNjcmlwdGlvbl92YXIg PiBQYXJhbWV0ZXJEZXNjcmlwdGlvbl9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2Rl X3B0ciBfdGNfUGFyYW1ldGVyRGVzY3JpcHRpb247CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVD b2RlX3B0ciBfdGNfUGFyRGVzY3JpcHRpb25TZXE7CgpjbGFzcyBQYXJEZXNjcmlwdGlvblNlcV92 YXI7CgpjbGFzcyBQYXJEZXNjcmlwdGlvblNlcSA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlPCBQYXJhbWV0ZXJEZXNjcmlwdGlvbj4gewpwdWJsaWM6CiAgdHlwZWRlZiBQYXJEZXNj cmlwdGlvblNlcV92YXIgX3Zhcl90eXBlOwogIGlubGluZSBQYXJEZXNjcmlwdGlvblNlcSgpIHt9 CiAgaW5saW5lIFBhckRlc2NyaXB0aW9uU2VxKGNvbnN0IFBhckRlc2NyaXB0aW9uU2VxJiBzKQog ICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBQYXJhbWV0ZXJEZXNjcmlwdGlvbj4gKHMp IHt9CgogIGlubGluZSBQYXJEZXNjcmlwdGlvblNlcShfQ09SQkFfVUxvbmcgX21heCkKICAgIDog X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgUGFyYW1ldGVyRGVzY3JpcHRpb24+IChfbWF4KSB7 fQogIGlubGluZSBQYXJEZXNjcmlwdGlvblNlcShfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VM b25nIF9sZW4sIFBhcmFtZXRlckRlc2NyaXB0aW9uKiBfdmFsLCBfQ09SQkFfQm9vbGVhbiBfcmVs PTApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFBhcmFtZXRlckRlc2NyaXB0aW9u PiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KCiAgaW5saW5lIFBhckRlc2NyaXB0aW9uU2Vx JiBvcGVyYXRvciA9IChjb25zdCBQYXJEZXNjcmlwdGlvblNlcSYgcykgewogICAgX0NPUkJBX1Vu Ym91bmRlZF9TZXF1ZW5jZTwgUGFyYW1ldGVyRGVzY3JpcHRpb24+IDo6b3BlcmF0b3I9KHMpOwog ICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIFBhckRlc2NyaXB0aW9uU2VxX291dDsKCmNs YXNzIFBhckRlc2NyaXB0aW9uU2VxX3ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIFBhckRlc2NyaXB0 aW9uU2VxIFQ7CiAgdHlwZWRlZiBQYXJEZXNjcmlwdGlvblNlcV92YXIgVF92YXI7CgogIGlubGlu ZSBQYXJEZXNjcmlwdGlvblNlcV92YXIoKSA6IF9wZF9zZXEoMCkge30KICBpbmxpbmUgUGFyRGVz Y3JpcHRpb25TZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBQYXJEZXNjcmlw dGlvblNlcV92YXIoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRfc2Vx ID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBpbmxpbmUg flBhckRlc2NyaXB0aW9uU2VxX3ZhcigpIHsgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsg fQoKICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIGlmKCBfcGRfc2VxICkg ZGVsZXRlIF9wZF9zZXE7CiAgICBfcGRfc2VxID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAg aW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChjb25zdCBUX3ZhciYgcykgewogICAgaWYoIHMuX3Bk X3NlcSApIHsKICAgICAgaWYoICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwogICAgICAqX3Bk X3NlcSA9ICpzLl9wZF9zZXE7CiAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgIGRlbGV0 ZSBfcGRfc2VxOwogICAgICBfcGRfc2VxID0gMDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9 CgogIGlubGluZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbiYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9u ZyBzKSB7CiAgICByZXR1cm4gKCpfcGRfc2VxKVtzXTsKICB9CgogIGlubGluZSBUKiBvcGVyYXRv ciAtPiAoKSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQm ICgpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsg cmV0dXJuICpfcGRfc2VxOyB9CgoKICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVy biAqX3BkX3NlcTsgfQogIGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CiAg aW5saW5lIFQqJiBvdXQoKSB7CiAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9zZXE7IF9w ZF9zZXEgPSAwOyB9CiAgICByZXR1cm4gX3BkX3NlcTsKICB9CiAgaW5saW5lIFQqIF9yZXRuKCkg eyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICBmcmllbmQg Y2xhc3MgUGFyRGVzY3JpcHRpb25TZXFfb3V0OwoKcHJpdmF0ZToKICBUKiBfcGRfc2VxOwp9OwoK Y2xhc3MgUGFyRGVzY3JpcHRpb25TZXFfb3V0IHsKcHVibGljOgogIHR5cGVkZWYgUGFyRGVzY3Jp cHRpb25TZXEgVDsKICB0eXBlZGVmIFBhckRlc2NyaXB0aW9uU2VxX3ZhciBUX3ZhcjsKCiAgaW5s aW5lIFBhckRlc2NyaXB0aW9uU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsg fQogIGlubGluZSBQYXJEZXNjcmlwdGlvblNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRhKHMu X3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9CiAgaW5saW5lIFBhckRlc2NyaXB0aW9uU2VxX291dChj b25zdCBQYXJEZXNjcmlwdGlvblNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBpbmxp bmUgUGFyRGVzY3JpcHRpb25TZXFfb3V0JiBvcGVyYXRvciA9IChjb25zdCBQYXJEZXNjcmlwdGlv blNlcV9vdXQmIHMpIHsKICAgIF9kYXRhID0gcy5fZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9 IGlubGluZSBQYXJEZXNjcmlwdGlvblNlcV9vdXQmIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIF9k YXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsg cmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlu bGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgaW5saW5lIFBhcmFtZXRl ckRlc2NyaXB0aW9uJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkpIHsKICAgIHJldHVybiAo Kl9kYXRhKVtpXTsKICB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAgUGFyRGVzY3JpcHRpb25T ZXFfb3V0KCk7CiAgUGFyRGVzY3JpcHRpb25TZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXIm KTsKfTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Db250ZXh0SWRlbnRp ZmllcjsKCnR5cGVkZWYgY2hhciogQ29udGV4dElkZW50aWZpZXI7CnR5cGVkZWYgQ09SQkE6OlN0 cmluZ192YXIgQ29udGV4dElkZW50aWZpZXJfdmFyOwoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBl Q29kZV9wdHIgX3RjX0NvbnRleHRJZFNlcTsKCmNsYXNzIENvbnRleHRJZFNlcV92YXI7CgpjbGFz cyBDb250ZXh0SWRTZXEgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5n IHsKcHVibGljOgogIHR5cGVkZWYgQ29udGV4dElkU2VxX3ZhciBfdmFyX3R5cGU7CiAgaW5saW5l IENvbnRleHRJZFNlcSgpIHt9CiAgaW5saW5lIENvbnRleHRJZFNlcShjb25zdCBDb250ZXh0SWRT ZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhzKSB7fQoKICBp bmxpbmUgQ29udGV4dElkU2VxKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX19TdHJpbmcoX21heCkge30KICBpbmxpbmUgQ29udGV4dElkU2VxKF9DT1JC QV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgY2hhcioqIF92YWwsIF9DT1JCQV9Cb29s ZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9tYXgs IF9sZW4sIF92YWwsIF9yZWwpIHt9CgogIGlubGluZSBDb250ZXh0SWRTZXEmIG9wZXJhdG9yID0g KGNvbnN0IENvbnRleHRJZFNlcSYgcykgewogICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9f U3RyaW5nOjpvcGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgQ29u dGV4dElkU2VxX291dDsKCmNsYXNzIENvbnRleHRJZFNlcV92YXIgewpwdWJsaWM6CiAgdHlwZWRl ZiBDb250ZXh0SWRTZXEgVDsKICB0eXBlZGVmIENvbnRleHRJZFNlcV92YXIgVF92YXI7CgogIGlu bGluZSBDb250ZXh0SWRTZXFfdmFyKCkgOiBfcGRfc2VxKDApIHt9CiAgaW5saW5lIENvbnRleHRJ ZFNlcV92YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIENvbnRleHRJZFNlcV92YXIo Y29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQoKnMu X3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBpbmxpbmUgfkNvbnRleHRJZFNl cV92YXIoKSB7IGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7IH0KCiAgaW5saW5lIFRfdmFy JiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOwog ICAgX3BkX3NlcSA9IHM7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSBUX3ZhciYgb3Bl cmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSB7CiAgICAgIGlm KCAhX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVDsKICAgICAgKl9wZF9zZXEgPSAqcy5fcGRfc2Vx OwogICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICBkZWxldGUgX3BkX3NlcTsKICAgICAg X3BkX3NlcSA9IDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgX0NPUkJB X1N0cmluZ19lbGVtZW50IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgcykgewogICAgcmV0dXJu ICgqX3BkX3NlcSlbc107CiAgfQoKICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4g X3BkX3NlcTsgfQoKCgogIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVy biAqX3BkX3NlcTsgfQogIGlubGluZSBvcGVyYXRvciBUJiAoKSB7IHJldHVybiAqX3BkX3NlcTsg fQoKCiAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBp bmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBUKiYgb3V0KCkg ewogICAgaWYoIF9wZF9zZXEgKSB7IGRlbGV0ZSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgfQogICAg cmV0dXJuIF9wZF9zZXE7CiAgfQogIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gX3BkX3Nl cTsgX3BkX3NlcSA9IDA7IHJldHVybiB0bXA7IH0KCiAgZnJpZW5kIGNsYXNzIENvbnRleHRJZFNl cV9vdXQ7Cgpwcml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBDb250ZXh0SWRTZXFfb3V0 IHsKcHVibGljOgogIHR5cGVkZWYgQ29udGV4dElkU2VxIFQ7CiAgdHlwZWRlZiBDb250ZXh0SWRT ZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgQ29udGV4dElkU2VxX291dChUKiYgcykgOiBfZGF0YShz KSB7IF9kYXRhID0gMDsgfQogIGlubGluZSBDb250ZXh0SWRTZXFfb3V0KFRfdmFyJiBzKQogICAg OiBfZGF0YShzLl9wZF9zZXEpIHsgcyA9IChUKikgMDsgfQogIGlubGluZSBDb250ZXh0SWRTZXFf b3V0KGNvbnN0IENvbnRleHRJZFNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBpbmxp bmUgQ29udGV4dElkU2VxX291dCYgb3BlcmF0b3IgPSAoY29uc3QgQ29udGV4dElkU2VxX291dCYg cykgewogICAgX2RhdGEgPSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0gaW5saW5lIENv bnRleHRJZFNlcV9vdXQmIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAgIHJl dHVybiAqdGhpczsKICB9CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9 CiAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVyYXRv ci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBv cGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkpIHsKICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICB9 CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAgQ29udGV4dElkU2VxX291dCgpOwogIENvbnRleHRJ ZFNlcV9vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwoKZXh0ZXJuIGNvbnN0IENPUkJB OjpUeXBlQ29kZV9wdHIgX3RjX0V4Y2VwdGlvbkRlZlNlcTsKCmNsYXNzIEV4Y2VwdGlvbkRlZlNl cV92YXI7CgpjbGFzcyBFeGNlcHRpb25EZWZTZXEgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfRXhjZXB0aW9uRGVmLCBfQ09SQkFfT2JqUmVmX0VsZW1l bnQ8IF9vYmpyZWZfRXhjZXB0aW9uRGVmLCBFeGNlcHRpb25EZWZfSGVscGVyPiAsIEV4Y2VwdGlv bkRlZl9IZWxwZXI+IHsKcHVibGljOgogIHR5cGVkZWYgRXhjZXB0aW9uRGVmU2VxX3ZhciBfdmFy X3R5cGU7CiAgaW5saW5lIEV4Y2VwdGlvbkRlZlNlcSgpIHt9CiAgaW5saW5lIEV4Y2VwdGlvbkRl ZlNlcShjb25zdCBFeGNlcHRpb25EZWZTZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfT2JqUmVmPCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgX0NPUkJBX09ialJlZl9FbGVtZW50 PCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgRXhjZXB0aW9uRGVmX0hlbHBlcj4gLCBFeGNlcHRpb25E ZWZfSGVscGVyPiAocykge30KCiAgaW5saW5lIEV4Y2VwdGlvbkRlZlNlcShfQ09SQkFfVUxvbmcg X21heCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8IF9vYmpyZWZfRXhj ZXB0aW9uRGVmLCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8IF9vYmpyZWZfRXhjZXB0aW9uRGVmLCBF eGNlcHRpb25EZWZfSGVscGVyPiAsIEV4Y2VwdGlvbkRlZl9IZWxwZXI+IChfbWF4KSB7fQogIGlu bGluZSBFeGNlcHRpb25EZWZTZXEoX0NPUkJBX1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVu LCBFeGNlcHRpb25EZWZfcHRyKiBfdmFsLCBfQ09SQkFfQm9vbGVhbiBfcmVsPTApCiAgICA6IF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgX0NP UkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgRXhjZXB0aW9uRGVmX0hl bHBlcj4gLCBFeGNlcHRpb25EZWZfSGVscGVyPiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30K CiAgaW5saW5lIEV4Y2VwdGlvbkRlZlNlcSYgb3BlcmF0b3IgPSAoY29uc3QgRXhjZXB0aW9uRGVm U2VxJiBzKSB7CiAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjwgX29ianJlZl9F eGNlcHRpb25EZWYsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDwgX29ianJlZl9FeGNlcHRpb25EZWYs IEV4Y2VwdGlvbkRlZl9IZWxwZXI+ICwgRXhjZXB0aW9uRGVmX0hlbHBlcj4gOjpvcGVyYXRvcj0o cyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgRXhjZXB0aW9uRGVmU2VxX291dDsK CmNsYXNzIEV4Y2VwdGlvbkRlZlNlcV92YXIgewpwdWJsaWM6CiAgdHlwZWRlZiBFeGNlcHRpb25E ZWZTZXEgVDsKICB0eXBlZGVmIEV4Y2VwdGlvbkRlZlNlcV92YXIgVF92YXI7CgogIGlubGluZSBF eGNlcHRpb25EZWZTZXFfdmFyKCkgOiBfcGRfc2VxKDApIHt9CiAgaW5saW5lIEV4Y2VwdGlvbkRl ZlNlcV92YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIEV4Y2VwdGlvbkRlZlNlcV92 YXIoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQo KnMuX3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBpbmxpbmUgfkV4Y2VwdGlv bkRlZlNlcV92YXIoKSB7IGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7IH0KCiAgaW5saW5l IFRfdmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRf c2VxOwogICAgX3BkX3NlcSA9IHM7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSBUX3Zh ciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSB7CiAg ICAgIGlmKCAhX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVDsKICAgICAgKl9wZF9zZXEgPSAqcy5f cGRfc2VxOwogICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICBkZWxldGUgX3BkX3NlcTsK ICAgICAgX3BkX3NlcSA9IDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUg X0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgRXhjZXB0aW9uRGVm X0hlbHBlcj4gb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICByZXR1cm4gKCpfcGRf c2VxKVtzXTsKICB9CgogIGlubGluZSBUKiBvcGVyYXRvciAtPiAoKSB7IHJldHVybiBfcGRfc2Vx OyB9CgoKCiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpfcGRf c2VxOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CgoKICBp bmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBU JiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQqJiBvdXQoKSB7CiAgICBp ZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9CiAgICByZXR1cm4g X3BkX3NlcTsKICB9CiAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRf c2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICBmcmllbmQgY2xhc3MgRXhjZXB0aW9uRGVmU2VxX291 dDsKCnByaXZhdGU6CiAgVCogX3BkX3NlcTsKfTsKCmNsYXNzIEV4Y2VwdGlvbkRlZlNlcV9vdXQg ewpwdWJsaWM6CiAgdHlwZWRlZiBFeGNlcHRpb25EZWZTZXEgVDsKICB0eXBlZGVmIEV4Y2VwdGlv bkRlZlNlcV92YXIgVF92YXI7CgogIGlubGluZSBFeGNlcHRpb25EZWZTZXFfb3V0KFQqJiBzKSA6 IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIEV4Y2VwdGlvbkRlZlNlcV9vdXQoVF92 YXImIHMpCiAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9CiAgaW5saW5lIEV4 Y2VwdGlvbkRlZlNlcV9vdXQoY29uc3QgRXhjZXB0aW9uRGVmU2VxX291dCYgcykgOiBfZGF0YShz Ll9kYXRhKSB7fQogIGlubGluZSBFeGNlcHRpb25EZWZTZXFfb3V0JiBvcGVyYXRvciA9IChjb25z dCBFeGNlcHRpb25EZWZTZXFfb3V0JiBzKSB7CiAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICByZXR1 cm4gKnRoaXM7CiAgfSBpbmxpbmUgRXhjZXB0aW9uRGVmU2VxX291dCYgb3BlcmF0b3IgPSAoVCog cykgewogICAgX2RhdGEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0 b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9k YXRhOyB9CiAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxp bmUgX0NPUkJBX09ialJlZl9FbGVtZW50PCBfb2JqcmVmX0V4Y2VwdGlvbkRlZiwgRXhjZXB0aW9u RGVmX0hlbHBlcj4gb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAgICByZXR1cm4gKCpf ZGF0YSlbaV07CiAgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRlOgogIEV4Y2VwdGlvbkRlZlNlcV9v dXQoKTsKICBFeGNlcHRpb25EZWZTZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsK CmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19FeGNEZXNjcmlwdGlvblNlcTsK CmNsYXNzIEV4Y0Rlc2NyaXB0aW9uU2VxX3ZhcjsKCmNsYXNzIEV4Y0Rlc2NyaXB0aW9uU2VxIDog cHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEV4Y2VwdGlvbkRlc2NyaXB0aW9uPiB7 CnB1YmxpYzoKICB0eXBlZGVmIEV4Y0Rlc2NyaXB0aW9uU2VxX3ZhciBfdmFyX3R5cGU7CiAgaW5s aW5lIEV4Y0Rlc2NyaXB0aW9uU2VxKCkge30KICBpbmxpbmUgRXhjRGVzY3JpcHRpb25TZXEoY29u c3QgRXhjRGVzY3JpcHRpb25TZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8 IEV4Y2VwdGlvbkRlc2NyaXB0aW9uPiAocykge30KCiAgaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2Vx KF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBFeGNl cHRpb25EZXNjcmlwdGlvbj4gKF9tYXgpIHt9CiAgaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2VxKF9D T1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgRXhjZXB0aW9uRGVzY3JpcHRpb24q IF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZTwgRXhjZXB0aW9uRGVzY3JpcHRpb24+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoK ICBpbmxpbmUgRXhjRGVzY3JpcHRpb25TZXEmIG9wZXJhdG9yID0gKGNvbnN0IEV4Y0Rlc2NyaXB0 aW9uU2VxJiBzKSB7CiAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBFeGNlcHRpb25EZXNj cmlwdGlvbj4gOjpvcGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3Mg RXhjRGVzY3JpcHRpb25TZXFfb3V0OwoKY2xhc3MgRXhjRGVzY3JpcHRpb25TZXFfdmFyIHsKcHVi bGljOgogIHR5cGVkZWYgRXhjRGVzY3JpcHRpb25TZXEgVDsKICB0eXBlZGVmIEV4Y0Rlc2NyaXB0 aW9uU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2VxX3ZhcigpIDogX3Bk X3NlcSgwKSB7fQogIGlubGluZSBFeGNEZXNjcmlwdGlvblNlcV92YXIoVCogcykgOiBfcGRfc2Vx KHMpIHt9CiAgaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2VxX3Zhcihjb25zdCBUX3ZhciYgcykgewog ICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgIGVsc2Ug X3BkX3NlcSA9IDA7CiAgfQogIGlubGluZSB+RXhjRGVzY3JpcHRpb25TZXFfdmFyKCkgeyBpZigg X3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAo VCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBz OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0 IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZiggIV9wZF9zZXEgKSBf cGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBp ZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwog ICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIEV4Y2VwdGlvbkRlc2NyaXB0aW9u JiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3Nd OwogIH0KCiAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoK ICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0K ICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBj b25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0 KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRf c2VxICkgeyBkZWxldGUgX3BkX3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2Vx OwogIH0KICBpbmxpbmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAw OyByZXR1cm4gdG1wOyB9CgogIGZyaWVuZCBjbGFzcyBFeGNEZXNjcmlwdGlvblNlcV9vdXQ7Cgpw cml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBFeGNEZXNjcmlwdGlvblNlcV9vdXQgewpw dWJsaWM6CiAgdHlwZWRlZiBFeGNEZXNjcmlwdGlvblNlcSBUOwogIHR5cGVkZWYgRXhjRGVzY3Jp cHRpb25TZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgRXhjRGVzY3JpcHRpb25TZXFfb3V0KFQqJiBz KSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2VxX291 dChUX3ZhciYgcykKICAgIDogX2RhdGEocy5fcGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICBpbmxp bmUgRXhjRGVzY3JpcHRpb25TZXFfb3V0KGNvbnN0IEV4Y0Rlc2NyaXB0aW9uU2VxX291dCYgcykg OiBfZGF0YShzLl9kYXRhKSB7fQogIGlubGluZSBFeGNEZXNjcmlwdGlvblNlcV9vdXQmIG9wZXJh dG9yID0gKGNvbnN0IEV4Y0Rlc2NyaXB0aW9uU2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9k YXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0gaW5saW5lIEV4Y0Rlc2NyaXB0aW9uU2VxX291dCYg b3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0K ICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0 cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBf ZGF0YTsgfQoKICBpbmxpbmUgRXhjZXB0aW9uRGVzY3JpcHRpb24mIG9wZXJhdG9yIFtdIChfQ09S QkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRhOwoK cHJpdmF0ZToKICBFeGNEZXNjcmlwdGlvblNlcV9vdXQoKTsKICBFeGNEZXNjcmlwdGlvblNlcV9v dXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwoKCgoKY2xhc3MgT3BlcmF0aW9uRGVmOwpj bGFzcyBfb2JqcmVmX09wZXJhdGlvbkRlZjsKY2xhc3MgX2ltcGxfT3BlcmF0aW9uRGVmOwoKdHlw ZWRlZiBfb2JqcmVmX09wZXJhdGlvbkRlZiogT3BlcmF0aW9uRGVmX3B0cjsKdHlwZWRlZiBPcGVy YXRpb25EZWZfcHRyIE9wZXJhdGlvbkRlZlJlZjsKCmNsYXNzIE9wZXJhdGlvbkRlZl9IZWxwZXIg ewpwdWJsaWM6CiAgdHlwZWRlZiBPcGVyYXRpb25EZWZfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGlj IF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5 cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBs aWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlw ZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVm ZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZm ZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1C dWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1 ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfT3Bl cmF0aW9uRGVmLCBPcGVyYXRpb25EZWZfSGVscGVyPiBPcGVyYXRpb25EZWZfdmFyOwp0eXBlZGVm IF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX09wZXJhdGlvbkRlZixPcGVyYXRpb25EZWZf SGVscGVyID4gT3BlcmF0aW9uRGVmX291dDsKCgoKY2xhc3MgT3BlcmF0aW9uRGVmIHsKcHVibGlj OgoKICB0eXBlZGVmIE9wZXJhdGlvbkRlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgT3BlcmF0 aW9uRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRy X3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAg c3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVk U2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2Jq UmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQg X21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMg aW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7 CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9y ZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJB OjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBf cHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09S QkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBz KTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFz ZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERf cmVwb0lkOwoKCgp9OwoKY2xhc3MgX29ianJlZl9PcGVyYXRpb25EZWYgOgogIHB1YmxpYyB2aXJ0 dWFsIF9vYmpyZWZfQ29udGFpbmVkCnsKcHVibGljOgoKICBDT1JCQTo6VHlwZUNvZGVfcHRyIHJl c3VsdCgpOwogIElETFR5cGVfcHRyIHJlc3VsdF9kZWYoKTsKICB2b2lkIHJlc3VsdF9kZWYoSURM VHlwZV9wdHIpOwogIFBhckRlc2NyaXB0aW9uU2VxKiBwYXJhbXMoKTsKICB2b2lkIHBhcmFtcyhj b25zdCBQYXJEZXNjcmlwdGlvblNlcSYpOwogIE9wZXJhdGlvbk1vZGUgbW9kZSgpOwogIHZvaWQg bW9kZShPcGVyYXRpb25Nb2RlKTsKICBDb250ZXh0SWRTZXEqIGNvbnRleHRzKCk7CiAgdm9pZCBj b250ZXh0cyhjb25zdCBDb250ZXh0SWRTZXEmKTsKICBFeGNlcHRpb25EZWZTZXEqIGV4Y2VwdGlv bnMoKTsKICB2b2lkIGV4Y2VwdGlvbnMoY29uc3QgRXhjZXB0aW9uRGVmU2VxJik7CgogIGlubGlu ZSBfb2JqcmVmX09wZXJhdGlvbkRlZigpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpyZWZfT3Bl cmF0aW9uRGVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50 aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVm X09wZXJhdGlvbkRlZigpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihj b25zdCBjaGFyKik7CgogIF9vYmpyZWZfT3BlcmF0aW9uRGVmKGNvbnN0IF9vYmpyZWZfT3BlcmF0 aW9uRGVmJik7CiAgX29ianJlZl9PcGVyYXRpb25EZWYmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpy ZWZfT3BlcmF0aW9uRGVmJik7Cgp9OwoKY2xhc3MgX3BvZl9PcGVyYXRpb25EZWYgOiBwdWJsaWMg cHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGluZSBfcG9mX09wZXJhdGlvbkRlZigp IDogcHJveHlPYmplY3RGYWN0b3J5KE9wZXJhdGlvbkRlZjo6X1BEX3JlcG9JZCkge30KICB2aXJ0 dWFsIH5fcG9mX09wZXJhdGlvbkRlZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJl Zihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0 dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2lt cGxfT3BlcmF0aW9uRGVmIDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9Db250YWluZWQKewpwdWJs aWM6CiAgdmlydHVhbCB+X2ltcGxfT3BlcmF0aW9uRGVmKCk7CgogIHZpcnR1YWwgQ09SQkE6OlR5 cGVDb2RlX3B0ciByZXN1bHQoKSA9IDA7CiAgdmlydHVhbCBJRExUeXBlX3B0ciByZXN1bHRfZGVm KCkgPSAwOwogIHZpcnR1YWwgdm9pZCByZXN1bHRfZGVmKElETFR5cGVfcHRyKSA9IDA7CiAgdmly dHVhbCBQYXJEZXNjcmlwdGlvblNlcSogcGFyYW1zKCkgPSAwOwogIHZpcnR1YWwgdm9pZCBwYXJh bXMoY29uc3QgUGFyRGVzY3JpcHRpb25TZXEmKSA9IDA7CiAgdmlydHVhbCBPcGVyYXRpb25Nb2Rl IG1vZGUoKSA9IDA7CiAgdmlydHVhbCB2b2lkIG1vZGUoT3BlcmF0aW9uTW9kZSkgPSAwOwogIHZp cnR1YWwgQ29udGV4dElkU2VxKiBjb250ZXh0cygpID0gMDsKICB2aXJ0dWFsIHZvaWQgY29udGV4 dHMoY29uc3QgQ29udGV4dElkU2VxJikgPSAwOwogIHZpcnR1YWwgRXhjZXB0aW9uRGVmU2VxKiBl eGNlcHRpb25zKCkgPSAwOwogIHZpcnR1YWwgdm9pZCBleGNlcHRpb25zKGNvbnN0IEV4Y2VwdGlv bkRlZlNlcSYpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRj aChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29u c3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07 CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfT3BlcmF0aW9uRGVmOwoKc3Ry dWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uIHsKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1Zh cmlhYmxlX1ZhcjxPcGVyYXRpb25EZXNjcmlwdGlvbj4gX3Zhcl90eXBlOwoKICBDT1JCQTo6U3Ry aW5nX21lbWJlciBuYW1lOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBpZDsKCiAgQ09SQkE6OlN0 cmluZ19tZW1iZXIgZGVmaW5lZF9pbjsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgdmVyc2lvbjsK CiAgQ09SQkE6OlR5cGVDb2RlX21lbWJlciByZXN1bHQ7CgogIE9wZXJhdGlvbk1vZGUgbW9kZTsK CiAgQ29udGV4dElkU2VxIGNvbnRleHRzOwoKICBQYXJEZXNjcmlwdGlvblNlcSBwYXJhbWV0ZXJz OwoKICBFeGNEZXNjcmlwdGlvblNlcSBleGNlcHRpb25zOwoKICBzaXplX3QgX05QX2FsaWduZWRT aXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49IChOZXRC dWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0 cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKfTsKCnR5cGVkZWYgT3Bl cmF0aW9uRGVzY3JpcHRpb246Ol92YXJfdHlwZSBPcGVyYXRpb25EZXNjcmlwdGlvbl92YXI7Cgp0 eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8IE9wZXJhdGlvbkRlc2Ny aXB0aW9uLE9wZXJhdGlvbkRlc2NyaXB0aW9uX3ZhciA+IE9wZXJhdGlvbkRlc2NyaXB0aW9uX291 dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19PcGVyYXRpb25EZXNjcmlw dGlvbjsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19SZXBvc2l0b3J5SWRT ZXE7CgpjbGFzcyBSZXBvc2l0b3J5SWRTZXFfdmFyOwoKY2xhc3MgUmVwb3NpdG9yeUlkU2VxIDog cHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyB7CnB1YmxpYzoKICB0eXBl ZGVmIFJlcG9zaXRvcnlJZFNlcV92YXIgX3Zhcl90eXBlOwogIGlubGluZSBSZXBvc2l0b3J5SWRT ZXEoKSB7fQogIGlubGluZSBSZXBvc2l0b3J5SWRTZXEoY29uc3QgUmVwb3NpdG9yeUlkU2VxJiBz KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19TdHJpbmcocykge30KCiAgaW5saW5l IFJlcG9zaXRvcnlJZFNlcShfQ09SQkFfVUxvbmcgX21heCkKICAgIDogX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9fU3RyaW5nKF9tYXgpIHt9CiAgaW5saW5lIFJlcG9zaXRvcnlJZFNlcShfQ09S QkFfVUxvbmcgX21heCwgX0NPUkJBX1VMb25nIF9sZW4sIGNoYXIqKiBfdmFsLCBfQ09SQkFfQm9v bGVhbiBfcmVsPTApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhfbWF4 LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxpbmUgUmVwb3NpdG9yeUlkU2VxJiBvcGVyYXRv ciA9IChjb25zdCBSZXBvc2l0b3J5SWRTZXEmIHMpIHsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfX1N0cmluZzo6b3BlcmF0b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNs YXNzIFJlcG9zaXRvcnlJZFNlcV9vdXQ7CgpjbGFzcyBSZXBvc2l0b3J5SWRTZXFfdmFyIHsKcHVi bGljOgogIHR5cGVkZWYgUmVwb3NpdG9yeUlkU2VxIFQ7CiAgdHlwZWRlZiBSZXBvc2l0b3J5SWRT ZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgUmVwb3NpdG9yeUlkU2VxX3ZhcigpIDogX3BkX3NlcSgw KSB7fQogIGlubGluZSBSZXBvc2l0b3J5SWRTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQog IGlubGluZSBSZXBvc2l0b3J5SWRTZXFfdmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5f cGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUKCpzLl9wZF9zZXEpOwogICAgZWxzZSBfcGRfc2VxID0g MDsKICB9CiAgaW5saW5lIH5SZXBvc2l0b3J5SWRTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRl bGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAg aWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJu ICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7 CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3 IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSAp IHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBvcGVyYXRvciBb XSAoX0NPUkJBX1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogIH0KCiAgaW5s aW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICBpbmxpbmUgb3Bl cmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgb3Bl cmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBjb25zdCBUJiBpbigp IGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4g Kl9wZF9zZXE7IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRfc2VxICkgeyBkZWxl dGUgX3BkX3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2VxOwogIH0KICBpbmxp bmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1w OyB9CgogIGZyaWVuZCBjbGFzcyBSZXBvc2l0b3J5SWRTZXFfb3V0OwoKcHJpdmF0ZToKICBUKiBf cGRfc2VxOwp9OwoKY2xhc3MgUmVwb3NpdG9yeUlkU2VxX291dCB7CnB1YmxpYzoKICB0eXBlZGVm IFJlcG9zaXRvcnlJZFNlcSBUOwogIHR5cGVkZWYgUmVwb3NpdG9yeUlkU2VxX3ZhciBUX3ZhcjsK CiAgaW5saW5lIFJlcG9zaXRvcnlJZFNlcV9vdXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9 IDA7IH0KICBpbmxpbmUgUmVwb3NpdG9yeUlkU2VxX291dChUX3ZhciYgcykKICAgIDogX2RhdGEo cy5fcGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICBpbmxpbmUgUmVwb3NpdG9yeUlkU2VxX291dChj b25zdCBSZXBvc2l0b3J5SWRTZXFfb3V0JiBzKSA6IF9kYXRhKHMuX2RhdGEpIHt9CiAgaW5saW5l IFJlcG9zaXRvcnlJZFNlcV9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IFJlcG9zaXRvcnlJZFNlcV9v dXQmIHMpIHsKICAgIF9kYXRhID0gcy5fZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9IGlubGlu ZSBSZXBvc2l0b3J5SWRTZXFfb3V0JiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBfZGF0YSA9IHM7 CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBf ZGF0YTsgfQogIGlubGluZSBUKiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCog b3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX2Vs ZW1lbnQgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAgICByZXR1cm4gKCpfZGF0YSlb aV07CiAgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRlOgogIFJlcG9zaXRvcnlJZFNlcV9vdXQoKTsK ICBSZXBvc2l0b3J5SWRTZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsKCmV4dGVy biBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19PcERlc2NyaXB0aW9uU2VxOwoKY2xhc3Mg T3BEZXNjcmlwdGlvblNlcV92YXI7CgpjbGFzcyBPcERlc2NyaXB0aW9uU2VxIDogcHVibGljIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IE9wZXJhdGlvbkRlc2NyaXB0aW9uPiB7CnB1YmxpYzoK ICB0eXBlZGVmIE9wRGVzY3JpcHRpb25TZXFfdmFyIF92YXJfdHlwZTsKICBpbmxpbmUgT3BEZXNj cmlwdGlvblNlcSgpIHt9CiAgaW5saW5lIE9wRGVzY3JpcHRpb25TZXEoY29uc3QgT3BEZXNjcmlw dGlvblNlcSYgcykKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgT3BlcmF0aW9uRGVz Y3JpcHRpb24+IChzKSB7fQoKICBpbmxpbmUgT3BEZXNjcmlwdGlvblNlcShfQ09SQkFfVUxvbmcg X21heCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgT3BlcmF0aW9uRGVzY3JpcHRp b24+IChfbWF4KSB7fQogIGlubGluZSBPcERlc2NyaXB0aW9uU2VxKF9DT1JCQV9VTG9uZyBfbWF4 LCBfQ09SQkFfVUxvbmcgX2xlbiwgT3BlcmF0aW9uRGVzY3JpcHRpb24qIF92YWwsIF9DT1JCQV9C b29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgT3BlcmF0aW9u RGVzY3JpcHRpb24+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxpbmUgT3BEZXNj cmlwdGlvblNlcSYgb3BlcmF0b3IgPSAoY29uc3QgT3BEZXNjcmlwdGlvblNlcSYgcykgewogICAg X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgT3BlcmF0aW9uRGVzY3JpcHRpb24+IDo6b3BlcmF0 b3I9KHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCmNsYXNzIE9wRGVzY3JpcHRpb25TZXFf b3V0OwoKY2xhc3MgT3BEZXNjcmlwdGlvblNlcV92YXIgewpwdWJsaWM6CiAgdHlwZWRlZiBPcERl c2NyaXB0aW9uU2VxIFQ7CiAgdHlwZWRlZiBPcERlc2NyaXB0aW9uU2VxX3ZhciBUX3ZhcjsKCiAg aW5saW5lIE9wRGVzY3JpcHRpb25TZXFfdmFyKCkgOiBfcGRfc2VxKDApIHt9CiAgaW5saW5lIE9w RGVzY3JpcHRpb25TZXFfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQogIGlubGluZSBPcERlc2Ny aXB0aW9uU2VxX3Zhcihjb25zdCBUX3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIF9wZF9z ZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgIGVsc2UgX3BkX3NlcSA9IDA7CiAgfQogIGlubGlu ZSB+T3BEZXNjcmlwdGlvblNlcV92YXIoKSB7IGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7 IH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBpZiggX3BkX3NlcSAp IGRlbGV0ZSBfcGRfc2VxOwogICAgX3BkX3NlcSA9IHM7CiAgICByZXR1cm4gKnRoaXM7CiAgfQog IGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9w ZF9zZXEgKSB7CiAgICAgIGlmKCAhX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVDsKICAgICAgKl9w ZF9zZXEgPSAqcy5fcGRfc2VxOwogICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICBkZWxl dGUgX3BkX3NlcTsKICAgICAgX3BkX3NlcSA9IDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAg fQoKICBpbmxpbmUgT3BlcmF0aW9uRGVzY3JpcHRpb24mIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxv bmcgcykgewogICAgcmV0dXJuICgqX3BkX3NlcSlbc107CiAgfQoKICBpbmxpbmUgVCogb3BlcmF0 b3IgLT4gKCkgeyByZXR1cm4gX3BkX3NlcTsgfQoKCgogIGlubGluZSBvcGVyYXRvciBjb25zdCBU JiAoKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlubGluZSBvcGVyYXRvciBUJiAoKSB7 IHJldHVybiAqX3BkX3NlcTsgfQoKCiAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1 cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsgfQog IGlubGluZSBUKiYgb3V0KCkgewogICAgaWYoIF9wZF9zZXEgKSB7IGRlbGV0ZSBfcGRfc2VxOyBf cGRfc2VxID0gMDsgfQogICAgcmV0dXJuIF9wZF9zZXE7CiAgfQogIGlubGluZSBUKiBfcmV0bigp IHsgVCogdG1wID0gX3BkX3NlcTsgX3BkX3NlcSA9IDA7IHJldHVybiB0bXA7IH0KCiAgZnJpZW5k IGNsYXNzIE9wRGVzY3JpcHRpb25TZXFfb3V0OwoKcHJpdmF0ZToKICBUKiBfcGRfc2VxOwp9OwoK Y2xhc3MgT3BEZXNjcmlwdGlvblNlcV9vdXQgewpwdWJsaWM6CiAgdHlwZWRlZiBPcERlc2NyaXB0 aW9uU2VxIFQ7CiAgdHlwZWRlZiBPcERlc2NyaXB0aW9uU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5l IE9wRGVzY3JpcHRpb25TZXFfb3V0KFQqJiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAg aW5saW5lIE9wRGVzY3JpcHRpb25TZXFfb3V0KFRfdmFyJiBzKQogICAgOiBfZGF0YShzLl9wZF9z ZXEpIHsgcyA9IChUKikgMDsgfQogIGlubGluZSBPcERlc2NyaXB0aW9uU2VxX291dChjb25zdCBP cERlc2NyaXB0aW9uU2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRhKSB7fQogIGlubGluZSBPcERl c2NyaXB0aW9uU2VxX291dCYgb3BlcmF0b3IgPSAoY29uc3QgT3BEZXNjcmlwdGlvblNlcV9vdXQm IHMpIHsKICAgIF9kYXRhID0gcy5fZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9IGlubGluZSBP cERlc2NyaXB0aW9uU2VxX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBzOwog ICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2Rh dGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqIG9w ZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxpbmUgT3BlcmF0aW9uRGVzY3JpcHRp b24mIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ld OwogIH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBPcERlc2NyaXB0aW9uU2VxX291dCgpOwog IE9wRGVzY3JpcHRpb25TZXFfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKfTsKCmV4dGVy biBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19BdHRyRGVzY3JpcHRpb25TZXE7CgpjbGFz cyBBdHRyRGVzY3JpcHRpb25TZXFfdmFyOwoKY2xhc3MgQXR0ckRlc2NyaXB0aW9uU2VxIDogcHVi bGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEF0dHJpYnV0ZURlc2NyaXB0aW9uPiB7CnB1 YmxpYzoKICB0eXBlZGVmIEF0dHJEZXNjcmlwdGlvblNlcV92YXIgX3Zhcl90eXBlOwogIGlubGlu ZSBBdHRyRGVzY3JpcHRpb25TZXEoKSB7fQogIGlubGluZSBBdHRyRGVzY3JpcHRpb25TZXEoY29u c3QgQXR0ckRlc2NyaXB0aW9uU2VxJiBzKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl PCBBdHRyaWJ1dGVEZXNjcmlwdGlvbj4gKHMpIHt9CgogIGlubGluZSBBdHRyRGVzY3JpcHRpb25T ZXEoX0NPUkJBX1VMb25nIF9tYXgpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEF0 dHJpYnV0ZURlc2NyaXB0aW9uPiAoX21heCkge30KICBpbmxpbmUgQXR0ckRlc2NyaXB0aW9uU2Vx KF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgQXR0cmlidXRlRGVzY3JpcHRp b24qIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZTwgQXR0cmlidXRlRGVzY3JpcHRpb24+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7 fQoKICBpbmxpbmUgQXR0ckRlc2NyaXB0aW9uU2VxJiBvcGVyYXRvciA9IChjb25zdCBBdHRyRGVz Y3JpcHRpb25TZXEmIHMpIHsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEF0dHJpYnV0 ZURlc2NyaXB0aW9uPiA6Om9wZXJhdG9yPShzKTsKICAgIHJldHVybiAqdGhpczsKICB9Cn07Cgpj bGFzcyBBdHRyRGVzY3JpcHRpb25TZXFfb3V0OwoKY2xhc3MgQXR0ckRlc2NyaXB0aW9uU2VxX3Zh ciB7CnB1YmxpYzoKICB0eXBlZGVmIEF0dHJEZXNjcmlwdGlvblNlcSBUOwogIHR5cGVkZWYgQXR0 ckRlc2NyaXB0aW9uU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIEF0dHJEZXNjcmlwdGlvblNlcV92 YXIoKSA6IF9wZF9zZXEoMCkge30KICBpbmxpbmUgQXR0ckRlc2NyaXB0aW9uU2VxX3ZhcihUKiBz KSA6IF9wZF9zZXEocykge30KICBpbmxpbmUgQXR0ckRlc2NyaXB0aW9uU2VxX3Zhcihjb25zdCBU X3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2Vx KTsKICAgIGVsc2UgX3BkX3NlcSA9IDA7CiAgfQogIGlubGluZSB+QXR0ckRlc2NyaXB0aW9uU2Vx X3ZhcigpIHsgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsgfQoKICBpbmxpbmUgVF92YXIm IG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7CiAg ICBfcGRfc2VxID0gczsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRfdmFyJiBvcGVy YXRvciA9IChjb25zdCBUX3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIHsKICAgICAgaWYo ICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwogICAgICAqX3BkX3NlcSA9ICpzLl9wZF9zZXE7 CiAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgIGRlbGV0ZSBfcGRfc2VxOwogICAgICBf cGRfc2VxID0gMDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBBdHRyaWJ1 dGVEZXNjcmlwdGlvbiYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICByZXR1cm4g KCpfcGRfc2VxKVtzXTsKICB9CgogIGlubGluZSBUKiBvcGVyYXRvciAtPiAoKSB7IHJldHVybiBf cGRfc2VxOyB9CgoKCiAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IFQmICgpIGNvbnN0IHsgcmV0dXJu ICpfcGRfc2VxOyB9CiAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpfcGRfc2VxOyB9 CgoKICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogIGlu bGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQqJiBvdXQoKSB7 CiAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9CiAgICBy ZXR1cm4gX3BkX3NlcTsKICB9CiAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2Vx OyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoKICBmcmllbmQgY2xhc3MgQXR0ckRlc2NyaXB0 aW9uU2VxX291dDsKCnByaXZhdGU6CiAgVCogX3BkX3NlcTsKfTsKCmNsYXNzIEF0dHJEZXNjcmlw dGlvblNlcV9vdXQgewpwdWJsaWM6CiAgdHlwZWRlZiBBdHRyRGVzY3JpcHRpb25TZXEgVDsKICB0 eXBlZGVmIEF0dHJEZXNjcmlwdGlvblNlcV92YXIgVF92YXI7CgogIGlubGluZSBBdHRyRGVzY3Jp cHRpb25TZXFfb3V0KFQqJiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIEF0 dHJEZXNjcmlwdGlvblNlcV9vdXQoVF92YXImIHMpCiAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBz ID0gKFQqKSAwOyB9CiAgaW5saW5lIEF0dHJEZXNjcmlwdGlvblNlcV9vdXQoY29uc3QgQXR0ckRl c2NyaXB0aW9uU2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRhKSB7fQogIGlubGluZSBBdHRyRGVz Y3JpcHRpb25TZXFfb3V0JiBvcGVyYXRvciA9IChjb25zdCBBdHRyRGVzY3JpcHRpb25TZXFfb3V0 JiBzKSB7CiAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICByZXR1cm4gKnRoaXM7CiAgfSBpbmxpbmUg QXR0ckRlc2NyaXB0aW9uU2VxX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBz OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4g X2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQq IG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxpbmUgQXR0cmlidXRlRGVzY3Jp cHRpb24mIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEp W2ldOwogIH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBBdHRyRGVzY3JpcHRpb25TZXFfb3V0 KCk7CiAgQXR0ckRlc2NyaXB0aW9uU2VxX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7Cn07 CiMgNTA1MCAiLi4vb21uaU9SQjMvaXJfZGVmcy5oaCIKY2xhc3MgSW50ZXJmYWNlRGVmIHsKcHVi bGljOgoKICB0eXBlZGVmIEludGVyZmFjZURlZl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgSW50 ZXJmYWNlRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShf cHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7 CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGln bmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZv aWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0 aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBz KSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9Q RF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENP UkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGlu ZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAg Q09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lk LCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVs ZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBf UERfcmVwb0lkOwoKCiAgc3RydWN0IEZ1bGxJbnRlcmZhY2VEZXNjcmlwdGlvbiB7CiAgICB0eXBl ZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxGdWxsSW50ZXJmYWNlRGVzY3JpcHRp b24+IF92YXJfdHlwZTsKCiAgICBDT1JCQTo6U3RyaW5nX21lbWJlciBuYW1lOwoKICAgIENPUkJB OjpTdHJpbmdfbWVtYmVyIGlkOwoKICAgIENPUkJBOjpTdHJpbmdfbWVtYmVyIGRlZmluZWRfaW47 CgogICAgQ09SQkE6OlN0cmluZ19tZW1iZXIgdmVyc2lvbjsKCiAgICBPcERlc2NyaXB0aW9uU2Vx IG9wZXJhdGlvbnM7CgogICAgQXR0ckRlc2NyaXB0aW9uU2VxIGF0dHJpYnV0ZXM7CgogICAgUmVw b3NpdG9yeUlkU2VxIGJhc2VfaW50ZXJmYWNlczsKCiAgICBDT1JCQTo6VHlwZUNvZGVfbWVtYmVy IHR5cGU7CgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkg Y29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9pZCBvcGVy YXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9 IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKICB9OwoKICB0eXBlZGVmIEZ1bGxJbnRlcmZhY2VEZXNj cmlwdGlvbjo6X3Zhcl90eXBlIEZ1bGxJbnRlcmZhY2VEZXNjcmlwdGlvbl92YXI7CgogIHR5cGVk ZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfT1VUX2FyZzwgRnVsbEludGVyZmFjZURlc2Ny aXB0aW9uLEZ1bGxJbnRlcmZhY2VEZXNjcmlwdGlvbl92YXIgPiBGdWxsSW50ZXJmYWNlRGVzY3Jp cHRpb25fb3V0OwoKICBzdGF0aWMgY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfRnVsbElu dGVyZmFjZURlc2NyaXB0aW9uOwoKfTsKCmNsYXNzIF9vYmpyZWZfSW50ZXJmYWNlRGVmIDoKICBw dWJsaWMgdmlydHVhbCBfb2JqcmVmX0NvbnRhaW5lciwKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVm X0NvbnRhaW5lZCwKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX0lETFR5cGUKewpwdWJsaWM6CiAg Q09SQkE6OkJvb2xlYW4gaXNfYShjb25zdCBjaGFyKiBpbnRlcmZhY2VfaWQpOwogIEludGVyZmFj ZURlZjo6RnVsbEludGVyZmFjZURlc2NyaXB0aW9uKiBkZXNjcmliZV9pbnRlcmZhY2UoKTsKICBB dHRyaWJ1dGVEZWZfcHRyIGNyZWF0ZV9hdHRyaWJ1dGUoY29uc3QgY2hhciogaWQsIGNvbnN0IGNo YXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZlcnNpb24sIElETFR5cGVfcHRyIHR5cGUsIEF0dHJpYnV0 ZU1vZGUgbW9kZSk7CiAgT3BlcmF0aW9uRGVmX3B0ciBjcmVhdGVfb3BlcmF0aW9uKGNvbnN0IGNo YXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0 ciByZXN1bHQsIE9wZXJhdGlvbk1vZGUgbW9kZSwgY29uc3QgUGFyRGVzY3JpcHRpb25TZXEmIHBh cmFtcywgY29uc3QgRXhjZXB0aW9uRGVmU2VxJiBleGNlcHRpb25zLCBjb25zdCBDb250ZXh0SWRT ZXEmIGNvbnRleHRzKTsKCiAgSW50ZXJmYWNlRGVmU2VxKiBiYXNlX2ludGVyZmFjZXMoKTsKICB2 b2lkIGJhc2VfaW50ZXJmYWNlcyhjb25zdCBJbnRlcmZhY2VEZWZTZXEmKTsKCiAgaW5saW5lIF9v YmpyZWZfSW50ZXJmYWNlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9JbnRlcmZh Y2VEZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkq LCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpyZWZfSW50 ZXJmYWNlRGVmKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0 IGNoYXIqKTsKCiAgX29ianJlZl9JbnRlcmZhY2VEZWYoY29uc3QgX29ianJlZl9JbnRlcmZhY2VE ZWYmKTsKICBfb2JqcmVmX0ludGVyZmFjZURlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9J bnRlcmZhY2VEZWYmKTsKCn07CgpjbGFzcyBfcG9mX0ludGVyZmFjZURlZiA6IHB1YmxpYyBwcm94 eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfSW50ZXJmYWNlRGVmKCkgOiBw cm94eU9iamVjdEZhY3RvcnkoSW50ZXJmYWNlRGVmOjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwg fl9wb2ZfSW50ZXJmYWNlRGVmKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNv bnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZpcnR1YWwg X0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgpjbGFzcyBfaW1wbF9J bnRlcmZhY2VEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0NvbnRhaW5lciwKICBwdWJsaWMg dmlydHVhbCBfaW1wbF9Db250YWluZWQsCiAgcHVibGljIHZpcnR1YWwgX2ltcGxfSURMVHlwZQp7 CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9JbnRlcmZhY2VEZWYoKTsKCiAgdmlydHVhbCBDT1JC QTo6Qm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqIGludGVyZmFjZV9pZCkgPSAwOwogIHZpcnR1YWwg SW50ZXJmYWNlRGVmOjpGdWxsSW50ZXJmYWNlRGVzY3JpcHRpb24qIGRlc2NyaWJlX2ludGVyZmFj ZSgpID0gMDsKICB2aXJ0dWFsIEF0dHJpYnV0ZURlZl9wdHIgY3JlYXRlX2F0dHJpYnV0ZShjb25z dCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlw ZV9wdHIgdHlwZSwgQXR0cmlidXRlTW9kZSBtb2RlKSA9IDA7CiAgdmlydHVhbCBPcGVyYXRpb25E ZWZfcHRyIGNyZWF0ZV9vcGVyYXRpb24oY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUs IGNvbnN0IGNoYXIqIHZlcnNpb24sIElETFR5cGVfcHRyIHJlc3VsdCwgT3BlcmF0aW9uTW9kZSBt b2RlLCBjb25zdCBQYXJEZXNjcmlwdGlvblNlcSYgcGFyYW1zLCBjb25zdCBFeGNlcHRpb25EZWZT ZXEmIGV4Y2VwdGlvbnMsIGNvbnN0IENvbnRleHRJZFNlcSYgY29udGV4dHMpID0gMDsKCiAgdmly dHVhbCBJbnRlcmZhY2VEZWZTZXEqIGJhc2VfaW50ZXJmYWNlcygpID0gMDsKICB2aXJ0dWFsIHZv aWQgYmFzZV9pbnRlcmZhY2VzKGNvbnN0IEludGVyZmFjZURlZlNlcSYpID0gMDsKCnB1YmxpYzoK ICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAg dmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29u c3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5 cGVDb2RlX3B0ciBfdGNfSW50ZXJmYWNlRGVmOwoKc3RydWN0IEludGVyZmFjZURlc2NyaXB0aW9u IHsKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxJbnRlcmZhY2VEZXNj cmlwdGlvbj4gX3Zhcl90eXBlOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBuYW1lOwoKICBDT1JC QTo6U3RyaW5nX21lbWJlciBpZDsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgZGVmaW5lZF9pbjsK CiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgdmVyc2lvbjsKCiAgUmVwb3NpdG9yeUlkU2VxIGJhc2Vf aW50ZXJmYWNlczsKCiAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNl dCkgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7 CiAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7CiAgdm9pZCBvcGVyYXRv cj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcjw8PSAoTWVt QnVmZmVyZWRTdHJlYW0gJik7Cn07Cgp0eXBlZGVmIEludGVyZmFjZURlc2NyaXB0aW9uOjpfdmFy X3R5cGUgSW50ZXJmYWNlRGVzY3JpcHRpb25fdmFyOwoKdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlw ZV9WYXJpYWJsZV9PVVRfYXJnPCBJbnRlcmZhY2VEZXNjcmlwdGlvbixJbnRlcmZhY2VEZXNjcmlw dGlvbl92YXIgPiBJbnRlcmZhY2VEZXNjcmlwdGlvbl9vdXQ7CgpleHRlcm4gY29uc3QgQ09SQkE6 OlR5cGVDb2RlX3B0ciBfdGNfSW50ZXJmYWNlRGVzY3JpcHRpb247CgpleHRlcm4gY29uc3QgQ09S QkE6OlR5cGVDb2RlX3B0ciBfdGNfVmlzaWJpbGl0eTsKCnR5cGVkZWYgQ09SQkE6OlNob3J0IFZp c2liaWxpdHk7CgogICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6U2hvcnQgUFJJVkFU RV9NRU1CRVIgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlNob3J0IFBV QkxJQ19NRU1CRVIgPSAxOwoKc3RydWN0IFZhbHVlTWVtYmVyIHsKICB0eXBlZGVmIF9DT1JCQV9D b25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjxWYWx1ZU1lbWJlcj4gX3Zhcl90eXBlOwoKICBDT1JCQTo6 U3RyaW5nX21lbWJlciBuYW1lOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBpZDsKCiAgQ09SQkE6 OlN0cmluZ19tZW1iZXIgZGVmaW5lZF9pbjsKCiAgQ09SQkE6OlN0cmluZ19tZW1iZXIgdmVyc2lv bjsKCiAgQ09SQkE6OlR5cGVDb2RlX21lbWJlciB0eXBlOwoKICBfQ09SQkFfT2JqUmVmX01lbWJl cjwgX29ianJlZl9JRExUeXBlLCBJRExUeXBlX0hlbHBlcj4gdHlwZV9kZWY7CgogIFZpc2liaWxp dHkgYWNjZXNzOwoKICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0 KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9y Pj49IChNZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChNZW1C dWZmZXJlZFN0cmVhbSAmKTsKfTsKCnR5cGVkZWYgVmFsdWVNZW1iZXI6Ol92YXJfdHlwZSBWYWx1 ZU1lbWJlcl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8 IFZhbHVlTWVtYmVyLFZhbHVlTWVtYmVyX3ZhciA+IFZhbHVlTWVtYmVyX291dDsKCmV4dGVybiBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19WYWx1ZU1lbWJlcjsKCmV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19WYWx1ZU1lbWJlclNlcTsKCmNsYXNzIFZhbHVlTWVtYmVy U2VxX3ZhcjsKCmNsYXNzIFZhbHVlTWVtYmVyU2VxIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2U8IFZhbHVlTWVtYmVyPiB7CnB1YmxpYzoKICB0eXBlZGVmIFZhbHVlTWVtYmVyU2Vx X3ZhciBfdmFyX3R5cGU7CiAgaW5saW5lIFZhbHVlTWVtYmVyU2VxKCkge30KICBpbmxpbmUgVmFs dWVNZW1iZXJTZXEoY29uc3QgVmFsdWVNZW1iZXJTZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2U8IFZhbHVlTWVtYmVyPiAocykge30KCiAgaW5saW5lIFZhbHVlTWVtYmVyU2Vx KF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBWYWx1 ZU1lbWJlcj4gKF9tYXgpIHt9CiAgaW5saW5lIFZhbHVlTWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBf bWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgVmFsdWVNZW1iZXIqIF92YWwsIF9DT1JCQV9Cb29sZWFu IF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgVmFsdWVNZW1iZXI+IChf bWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxpbmUgVmFsdWVNZW1iZXJTZXEmIG9wZXJh dG9yID0gKGNvbnN0IFZhbHVlTWVtYmVyU2VxJiBzKSB7CiAgICBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlPCBWYWx1ZU1lbWJlcj4gOjpvcGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAg fQp9OwoKY2xhc3MgVmFsdWVNZW1iZXJTZXFfb3V0OwoKY2xhc3MgVmFsdWVNZW1iZXJTZXFfdmFy IHsKcHVibGljOgogIHR5cGVkZWYgVmFsdWVNZW1iZXJTZXEgVDsKICB0eXBlZGVmIFZhbHVlTWVt YmVyU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIFZhbHVlTWVtYmVyU2VxX3ZhcigpIDogX3BkX3Nl cSgwKSB7fQogIGlubGluZSBWYWx1ZU1lbWJlclNlcV92YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9 CiAgaW5saW5lIFZhbHVlTWVtYmVyU2VxX3Zhcihjb25zdCBUX3ZhciYgcykgewogICAgaWYoIHMu X3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgIGVsc2UgX3BkX3NlcSA9 IDA7CiAgfQogIGlubGluZSB+VmFsdWVNZW1iZXJTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRl bGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAg aWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJu ICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7 CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3 IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSAp IHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFZhbHVlTWVtYmVyJiBvcGVyYXRvciBbXSAoX0NPUkJB X1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogIH0KCiAgaW5saW5lIFQqIG9w ZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICBpbmxpbmUgb3BlcmF0b3IgY29u c3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgb3BlcmF0b3IgVCYg KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsg cmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7 IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3BkX3Nl cTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2VxOwogIH0KICBpbmxpbmUgVCogX3Jl dG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogIGZy aWVuZCBjbGFzcyBWYWx1ZU1lbWJlclNlcV9vdXQ7Cgpwcml2YXRlOgogIFQqIF9wZF9zZXE7Cn07 CgpjbGFzcyBWYWx1ZU1lbWJlclNlcV9vdXQgewpwdWJsaWM6CiAgdHlwZWRlZiBWYWx1ZU1lbWJl clNlcSBUOwogIHR5cGVkZWYgVmFsdWVNZW1iZXJTZXFfdmFyIFRfdmFyOwoKICBpbmxpbmUgVmFs dWVNZW1iZXJTZXFfb3V0KFQqJiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgaW5saW5l IFZhbHVlTWVtYmVyU2VxX291dChUX3ZhciYgcykKICAgIDogX2RhdGEocy5fcGRfc2VxKSB7IHMg PSAoVCopIDA7IH0KICBpbmxpbmUgVmFsdWVNZW1iZXJTZXFfb3V0KGNvbnN0IFZhbHVlTWVtYmVy U2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRhKSB7fQogIGlubGluZSBWYWx1ZU1lbWJlclNlcV9v dXQmIG9wZXJhdG9yID0gKGNvbnN0IFZhbHVlTWVtYmVyU2VxX291dCYgcykgewogICAgX2RhdGEg PSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0gaW5saW5lIFZhbHVlTWVtYmVyU2VxX291 dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEgPSBzOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCom IHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVy biBfZGF0YTsgfQoKICBpbmxpbmUgVmFsdWVNZW1iZXImIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxv bmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRhOwoKcHJpdmF0 ZToKICBWYWx1ZU1lbWJlclNlcV9vdXQoKTsKICBWYWx1ZU1lbWJlclNlcV9vdXQmIG9wZXJhdG9y PShjb25zdCBUX3ZhciYpOwp9OwoKCgoKY2xhc3MgVmFsdWVNZW1iZXJEZWY7CmNsYXNzIF9vYmpy ZWZfVmFsdWVNZW1iZXJEZWY7CmNsYXNzIF9pbXBsX1ZhbHVlTWVtYmVyRGVmOwoKdHlwZWRlZiBf b2JqcmVmX1ZhbHVlTWVtYmVyRGVmKiBWYWx1ZU1lbWJlckRlZl9wdHI7CnR5cGVkZWYgVmFsdWVN ZW1iZXJEZWZfcHRyIFZhbHVlTWVtYmVyRGVmUmVmOwoKY2xhc3MgVmFsdWVNZW1iZXJEZWZfSGVs cGVyIHsKcHVibGljOgogIHR5cGVkZWYgVmFsdWVNZW1iZXJEZWZfcHRyIF9wdHJfdHlwZTsKCiAg c3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChf cHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9p ZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9w dHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihO ZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBl LCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVm KE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpy ZWZfVmFsdWVNZW1iZXJEZWYsIFZhbHVlTWVtYmVyRGVmX0hlbHBlcj4gVmFsdWVNZW1iZXJEZWZf dmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1ZhbHVlTWVtYmVyRGVm LFZhbHVlTWVtYmVyRGVmX0hlbHBlciA+IFZhbHVlTWVtYmVyRGVmX291dDsKCgoKY2xhc3MgVmFs dWVNZW1iZXJEZWYgewpwdWJsaWM6CgogIHR5cGVkZWYgVmFsdWVNZW1iZXJEZWZfcHRyIF9wdHJf dHlwZTsKICB0eXBlZGVmIFZhbHVlTWVtYmVyRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBf cHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJv dyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRp YyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGlj IGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0m KTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZm ZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVm KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JC QTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9 IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0 OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZm ZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFy c2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93 KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cgog IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoKY2xhc3MgX29ianJlZl9WYWx1 ZU1lbWJlckRlZiA6CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZWQKewpwdWJsaWM6 CgogIENPUkJBOjpUeXBlQ29kZV9wdHIgdHlwZSgpOwogIElETFR5cGVfcHRyIHR5cGVfZGVmKCk7 CiAgdm9pZCB0eXBlX2RlZihJRExUeXBlX3B0cik7CiAgVmlzaWJpbGl0eSBhY2Nlc3MoKTsKICB2 b2lkIGFjY2VzcyhWaXNpYmlsaXR5KTsKCiAgaW5saW5lIF9vYmpyZWZfVmFsdWVNZW1iZXJEZWYo KSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVmX1ZhbHVlTWVtYmVyRGVmKGNvbnN0IGNoYXIq LCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRp dHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX1ZhbHVlTWVtYmVyRGVmKCk7Cgpw cml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29i anJlZl9WYWx1ZU1lbWJlckRlZihjb25zdCBfb2JqcmVmX1ZhbHVlTWVtYmVyRGVmJik7CiAgX29i anJlZl9WYWx1ZU1lbWJlckRlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9WYWx1ZU1lbWJl ckRlZiYpOwoKfTsKCmNsYXNzIF9wb2ZfVmFsdWVNZW1iZXJEZWYgOiBwdWJsaWMgcHJveHlPYmpl Y3RGYWN0b3J5IHsKcHVibGljOgogIGlubGluZSBfcG9mX1ZhbHVlTWVtYmVyRGVmKCkgOiBwcm94 eU9iamVjdEZhY3RvcnkoVmFsdWVNZW1iZXJEZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+ X3BvZl9WYWx1ZU1lbWJlckRlZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihj b25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFs IF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxf VmFsdWVNZW1iZXJEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0NvbnRhaW5lZAp7CnB1Ymxp YzoKICB2aXJ0dWFsIH5faW1wbF9WYWx1ZU1lbWJlckRlZigpOwoKICB2aXJ0dWFsIENPUkJBOjpU eXBlQ29kZV9wdHIgdHlwZSgpID0gMDsKICB2aXJ0dWFsIElETFR5cGVfcHRyIHR5cGVfZGVmKCkg PSAwOwogIHZpcnR1YWwgdm9pZCB0eXBlX2RlZihJRExUeXBlX3B0cikgPSAwOwogIHZpcnR1YWwg VmlzaWJpbGl0eSBhY2Nlc3MoKSA9IDA7CiAgdmlydHVhbCB2b2lkIGFjY2VzcyhWaXNpYmlsaXR5 KSA9IDA7CgpwdWJsaWM6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9T Jik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIq KTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKZXh0ZXJu IGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1ZhbHVlTWVtYmVyRGVmOwojIDU1MDQgIi4u L29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIFZhbHVlRGVmIHsKcHVibGljOgoKICB0eXBlZGVm IFZhbHVlRGVmX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBWYWx1ZURlZl92YXIgX3Zhcl90eXBl OwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0 cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25p bCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXpl X3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1 ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3Vu bWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9w dHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJf dHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAg cmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxP YmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9 IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVz dWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiBy ZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgogIHN0cnVjdCBG dWxsVmFsdWVEZXNjcmlwdGlvbiB7CiAgICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1Zhcmlh YmxlX1ZhcjxGdWxsVmFsdWVEZXNjcmlwdGlvbj4gX3Zhcl90eXBlOwoKICAgIENPUkJBOjpTdHJp bmdfbWVtYmVyIG5hbWU7CgogICAgQ09SQkE6OlN0cmluZ19tZW1iZXIgaWQ7CgogICAgQ09SQkE6 OkJvb2xlYW4gaXNfYWJzdHJhY3Q7CgogICAgQ09SQkE6OkJvb2xlYW4gaXNfY3VzdG9tOwoKICAg IENPUkJBOjpTdHJpbmdfbWVtYmVyIGRlZmluZWRfaW47CgogICAgQ09SQkE6OlN0cmluZ19tZW1i ZXIgdmVyc2lvbjsKCiAgICBPcERlc2NyaXB0aW9uU2VxIG9wZXJhdGlvbnM7CgogICAgQXR0ckRl c2NyaXB0aW9uU2VxIGF0dHJpYnV0ZXM7CgogICAgVmFsdWVNZW1iZXJTZXEgbWVtYmVyczsKCiAg ICBJbml0aWFsaXplclNlcSBpbml0aWFsaXplcnM7CgogICAgUmVwb3NpdG9yeUlkU2VxIHN1cHBv cnRlZF9pbnRlcmZhY2VzOwoKICAgIFJlcG9zaXRvcnlJZFNlcSBhYnN0cmFjdF9iYXNlX3ZhbHVl czsKCiAgICBDT1JCQTo6Qm9vbGVhbiBpc190cnVuY2F0YWJsZTsKCiAgICBDT1JCQTo6U3RyaW5n X21lbWJlciBiYXNlX3ZhbHVlOwoKICAgIENPUkJBOjpUeXBlQ29kZV9tZW1iZXIgdHlwZTsKCiAg ICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsKICAg IHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogICAgdm9pZCBv cGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7CiAgICB2b2lkIG9wZXJhdG9yPj49IChN ZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZl cmVkU3RyZWFtICYpOwogIH07CgogIHR5cGVkZWYgRnVsbFZhbHVlRGVzY3JpcHRpb246Ol92YXJf dHlwZSBGdWxsVmFsdWVEZXNjcmlwdGlvbl92YXI7CgogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5 cGVfVmFyaWFibGVfT1VUX2FyZzwgRnVsbFZhbHVlRGVzY3JpcHRpb24sRnVsbFZhbHVlRGVzY3Jp cHRpb25fdmFyID4gRnVsbFZhbHVlRGVzY3JpcHRpb25fb3V0OwoKICBzdGF0aWMgY29uc3QgQ09S QkE6OlR5cGVDb2RlX3B0ciBfdGNfRnVsbFZhbHVlRGVzY3JpcHRpb247Cgp9OwoKY2xhc3MgX29i anJlZl9WYWx1ZURlZiA6CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZXIsCiAgcHVi bGljIHZpcnR1YWwgX29ianJlZl9Db250YWluZWQsCiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9J RExUeXBlCnsKcHVibGljOgogIENPUkJBOjpCb29sZWFuIGlzX2EoY29uc3QgY2hhciogaWQpOwog IFZhbHVlRGVmOjpGdWxsVmFsdWVEZXNjcmlwdGlvbiogZGVzY3JpYmVfdmFsdWUoKTsKICBWYWx1 ZU1lbWJlckRlZl9wdHIgY3JlYXRlX3ZhbHVlX21lbWJlcihjb25zdCBjaGFyKiBpZCwgY29uc3Qg Y2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlwZV9wdHIgdHlwZSwgVmlzaWJp bGl0eSBhY2Nlc3MpOwogIEF0dHJpYnV0ZURlZl9wdHIgY3JlYXRlX2F0dHJpYnV0ZShjb25zdCBj aGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlwZV9w dHIgdHlwZSwgQXR0cmlidXRlTW9kZSBtb2RlKTsKICBPcGVyYXRpb25EZWZfcHRyIGNyZWF0ZV9v cGVyYXRpb24oY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZl cnNpb24sIElETFR5cGVfcHRyIHJlc3VsdCwgT3BlcmF0aW9uTW9kZSBtb2RlLCBjb25zdCBQYXJE ZXNjcmlwdGlvblNlcSYgcGFyYW1zLCBjb25zdCBFeGNlcHRpb25EZWZTZXEmIGV4Y2VwdGlvbnMs IGNvbnN0IENvbnRleHRJZFNlcSYgY29udGV4dHMpOwoKICBJbnRlcmZhY2VEZWZTZXEqIHN1cHBv cnRlZF9pbnRlcmZhY2VzKCk7CiAgdm9pZCBzdXBwb3J0ZWRfaW50ZXJmYWNlcyhjb25zdCBJbnRl cmZhY2VEZWZTZXEmKTsKICBJbml0aWFsaXplclNlcSogaW5pdGlhbGl6ZXJzKCk7CiAgdm9pZCBp bml0aWFsaXplcnMoY29uc3QgSW5pdGlhbGl6ZXJTZXEmKTsKICBWYWx1ZURlZl9wdHIgYmFzZV92 YWx1ZSgpOwogIHZvaWQgYmFzZV92YWx1ZShWYWx1ZURlZl9wdHIpOwogIFZhbHVlRGVmU2VxKiBh YnN0cmFjdF9iYXNlX3ZhbHVlcygpOwogIHZvaWQgYWJzdHJhY3RfYmFzZV92YWx1ZXMoY29uc3Qg VmFsdWVEZWZTZXEmKTsKICBDT1JCQTo6Qm9vbGVhbiBpc19hYnN0cmFjdCgpOwogIHZvaWQgaXNf YWJzdHJhY3QoQ09SQkE6OkJvb2xlYW4pOwogIENPUkJBOjpCb29sZWFuIGlzX2N1c3RvbSgpOwog IHZvaWQgaXNfY3VzdG9tKENPUkJBOjpCb29sZWFuKTsKICBDT1JCQTo6Qm9vbGVhbiBpc190cnVu Y2F0YWJsZSgpOwogIHZvaWQgaXNfdHJ1bmNhdGFibGUoQ09SQkE6OkJvb2xlYW4pOwoKICBpbmxp bmUgX29ianJlZl9WYWx1ZURlZigpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpyZWZfVmFsdWVE ZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkqLCBv bW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfl9vYmpyZWZfVmFsdWVE ZWYoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciop OwoKICBfb2JqcmVmX1ZhbHVlRGVmKGNvbnN0IF9vYmpyZWZfVmFsdWVEZWYmKTsKICBfb2JqcmVm X1ZhbHVlRGVmJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX1ZhbHVlRGVmJik7Cgp9OwoKY2xh c3MgX3BvZl9WYWx1ZURlZiA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAg aW5saW5lIF9wb2ZfVmFsdWVEZWYoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShWYWx1ZURlZjo6X1BE X3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1ZhbHVlRGVmKCk7CgogIHZpcnR1YWwgb21uaU9i alJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVu dGl0eSopOwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7 Cn07CgpjbGFzcyBfaW1wbF9WYWx1ZURlZiA6CiAgcHVibGljIHZpcnR1YWwgX2ltcGxfQ29udGFp bmVyLAogIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0NvbnRhaW5lZCwKICBwdWJsaWMgdmlydHVhbCBf aW1wbF9JRExUeXBlCnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX1ZhbHVlRGVmKCk7CgogIHZp cnR1YWwgQ09SQkE6OkJvb2xlYW4gaXNfYShjb25zdCBjaGFyKiBpZCkgPSAwOwogIHZpcnR1YWwg VmFsdWVEZWY6OkZ1bGxWYWx1ZURlc2NyaXB0aW9uKiBkZXNjcmliZV92YWx1ZSgpID0gMDsKICB2 aXJ0dWFsIFZhbHVlTWVtYmVyRGVmX3B0ciBjcmVhdGVfdmFsdWVfbWVtYmVyKGNvbnN0IGNoYXIq IGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciB0 eXBlLCBWaXNpYmlsaXR5IGFjY2VzcykgPSAwOwogIHZpcnR1YWwgQXR0cmlidXRlRGVmX3B0ciBj cmVhdGVfYXR0cmlidXRlKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBj aGFyKiB2ZXJzaW9uLCBJRExUeXBlX3B0ciB0eXBlLCBBdHRyaWJ1dGVNb2RlIG1vZGUpID0gMDsK ICB2aXJ0dWFsIE9wZXJhdGlvbkRlZl9wdHIgY3JlYXRlX29wZXJhdGlvbihjb25zdCBjaGFyKiBp ZCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmVyc2lvbiwgSURMVHlwZV9wdHIgcmVz dWx0LCBPcGVyYXRpb25Nb2RlIG1vZGUsIGNvbnN0IFBhckRlc2NyaXB0aW9uU2VxJiBwYXJhbXMs IGNvbnN0IEV4Y2VwdGlvbkRlZlNlcSYgZXhjZXB0aW9ucywgY29uc3QgQ29udGV4dElkU2VxJiBj b250ZXh0cykgPSAwOwoKICB2aXJ0dWFsIEludGVyZmFjZURlZlNlcSogc3VwcG9ydGVkX2ludGVy ZmFjZXMoKSA9IDA7CiAgdmlydHVhbCB2b2lkIHN1cHBvcnRlZF9pbnRlcmZhY2VzKGNvbnN0IElu dGVyZmFjZURlZlNlcSYpID0gMDsKICB2aXJ0dWFsIEluaXRpYWxpemVyU2VxKiBpbml0aWFsaXpl cnMoKSA9IDA7CiAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVycyhjb25zdCBJbml0aWFsaXplclNl cSYpID0gMDsKICB2aXJ0dWFsIFZhbHVlRGVmX3B0ciBiYXNlX3ZhbHVlKCkgPSAwOwogIHZpcnR1 YWwgdm9pZCBiYXNlX3ZhbHVlKFZhbHVlRGVmX3B0cikgPSAwOwogIHZpcnR1YWwgVmFsdWVEZWZT ZXEqIGFic3RyYWN0X2Jhc2VfdmFsdWVzKCkgPSAwOwogIHZpcnR1YWwgdm9pZCBhYnN0cmFjdF9i YXNlX3ZhbHVlcyhjb25zdCBWYWx1ZURlZlNlcSYpID0gMDsKICB2aXJ0dWFsIENPUkJBOjpCb29s ZWFuIGlzX2Fic3RyYWN0KCkgPSAwOwogIHZpcnR1YWwgdm9pZCBpc19hYnN0cmFjdChDT1JCQTo6 Qm9vbGVhbikgPSAwOwogIHZpcnR1YWwgQ09SQkE6OkJvb2xlYW4gaXNfY3VzdG9tKCkgPSAwOwog IHZpcnR1YWwgdm9pZCBpc19jdXN0b20oQ09SQkE6OkJvb2xlYW4pID0gMDsKICB2aXJ0dWFsIENP UkJBOjpCb29sZWFuIGlzX3RydW5jYXRhYmxlKCkgPSAwOwogIHZpcnR1YWwgdm9pZCBpc190cnVu Y2F0YWJsZShDT1JCQTo6Qm9vbGVhbikgPSAwOwoKcHVibGljOgogIHZpcnR1YWwgX0NPUkJBX0Jv b2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJU b0ludGVyZmFjZShjb25zdCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2 ZWRSZXBvSWQoKTsKfTsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19WYWx1 ZURlZjsKCnN0cnVjdCBWYWx1ZURlc2NyaXB0aW9uIHsKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJU eXBlX1ZhcmlhYmxlX1ZhcjxWYWx1ZURlc2NyaXB0aW9uPiBfdmFyX3R5cGU7CgogIENPUkJBOjpT dHJpbmdfbWVtYmVyIG5hbWU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIGlkOwoKICBDT1JCQTo6 Qm9vbGVhbiBpc19hYnN0cmFjdDsKCiAgQ09SQkE6OkJvb2xlYW4gaXNfY3VzdG9tOwoKICBDT1JC QTo6U3RyaW5nX21lbWJlciBkZWZpbmVkX2luOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciB2ZXJz aW9uOwoKICBSZXBvc2l0b3J5SWRTZXEgc3VwcG9ydGVkX2ludGVyZmFjZXM7CgogIFJlcG9zaXRv cnlJZFNlcSBhYnN0cmFjdF9iYXNlX3ZhbHVlczsKCiAgQ09SQkE6OkJvb2xlYW4gaXNfdHJ1bmNh dGFibGU7CgogIENPUkJBOjpTdHJpbmdfbWVtYmVyIGJhc2VfdmFsdWU7CgogIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I+ Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1 ZmZlcmVkU3RyZWFtICYpOwogIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYp IGNvbnN0OwogIHZvaWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpOwp9OwoKdHlw ZWRlZiBWYWx1ZURlc2NyaXB0aW9uOjpfdmFyX3R5cGUgVmFsdWVEZXNjcmlwdGlvbl92YXI7Cgp0 eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8IFZhbHVlRGVzY3JpcHRp b24sVmFsdWVEZXNjcmlwdGlvbl92YXIgPiBWYWx1ZURlc2NyaXB0aW9uX291dDsKCmV4dGVybiBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19WYWx1ZURlc2NyaXB0aW9uOwojIDU3MzkgIi4u L29tbmlPUkIzL2lyX2RlZnMuaGgiCmNsYXNzIFZhbHVlQm94RGVmIHsKcHVibGljOgoKICB0eXBl ZGVmIFZhbHVlQm94RGVmX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBWYWx1ZUJveERlZl92YXIg X3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBz dGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRy X3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90 eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5 cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2Jq UmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRy X3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6 Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsK ICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShv YmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91 bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3Rf cHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRy X3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAg IHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoK fTsKCmNsYXNzIF9vYmpyZWZfVmFsdWVCb3hEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZf VHlwZWRlZkRlZgp7CnB1YmxpYzoKCiAgSURMVHlwZV9wdHIgb3JpZ2luYWxfdHlwZV9kZWYoKTsK ICB2b2lkIG9yaWdpbmFsX3R5cGVfZGVmKElETFR5cGVfcHRyKTsKCiAgaW5saW5lIF9vYmpyZWZf VmFsdWVCb3hEZWYoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBfb2JqcmVmX1ZhbHVlQm94RGVmKGNv bnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxv Y2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVmX1ZhbHVlQm94RGVm KCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsK CiAgX29ianJlZl9WYWx1ZUJveERlZihjb25zdCBfb2JqcmVmX1ZhbHVlQm94RGVmJik7CiAgX29i anJlZl9WYWx1ZUJveERlZiYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9WYWx1ZUJveERlZiYp OwoKfTsKCmNsYXNzIF9wb2ZfVmFsdWVCb3hEZWYgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5 IHsKcHVibGljOgogIGlubGluZSBfcG9mX1ZhbHVlQm94RGVmKCkgOiBwcm94eU9iamVjdEZhY3Rv cnkoVmFsdWVCb3hEZWY6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9WYWx1ZUJveERl ZigpOwoKICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpU YWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlk ZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlz X2EoY29uc3QgY2hhciopIGNvbnN0Owp9OwoKY2xhc3MgX2ltcGxfVmFsdWVCb3hEZWYgOgogIHB1 YmxpYyB2aXJ0dWFsIF9pbXBsX1R5cGVkZWZEZWYKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxf VmFsdWVCb3hEZWYoKTsKCiAgdmlydHVhbCBJRExUeXBlX3B0ciBvcmlnaW5hbF90eXBlX2RlZigp ID0gMDsKICB2aXJ0dWFsIHZvaWQgb3JpZ2luYWxfdHlwZV9kZWYoSURMVHlwZV9wdHIpID0gMDsK CnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnBy aXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZp cnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgpleHRlcm4gY29uc3Qg Q09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVmFsdWVCb3hEZWY7CiMgNTg1NCAiLi4vb21uaU9SQjMv aXJfZGVmcy5oaCIKY2xhc3MgQWJzdHJhY3RJbnRlcmZhY2VEZWYgewpwdWJsaWM6CgogIHR5cGVk ZWYgQWJzdHJhY3RJbnRlcmZhY2VEZWZfcHRyIF9wdHJfdHlwZTsKICB0eXBlZGVmIEFic3RyYWN0 SW50ZXJmYWNlRGVmX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0 ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0 cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9h bGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJz aGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5l IHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBz dGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVm KF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAg IENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlu bGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewog ICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVw b0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6 cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFy KiBfUERfcmVwb0lkOwoKCgp9OwoKY2xhc3MgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZiA6 CiAgcHVibGljIHZpcnR1YWwgX29ianJlZl9JbnRlcmZhY2VEZWYKewpwdWJsaWM6CgogIGlubGlu ZSBfb2JqcmVmX0Fic3RyYWN0SW50ZXJmYWNlRGVmKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29i anJlZl9BYnN0cmFjdEludGVyZmFjZURlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxl TGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAg dmlydHVhbCB+X29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZigpOwoKcHJpdmF0ZToKICB2aXJ0 dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7CgogIF9vYmpyZWZfQWJzdHJhY3RJ bnRlcmZhY2VEZWYoY29uc3QgX29ianJlZl9BYnN0cmFjdEludGVyZmFjZURlZiYpOwogIF9vYmpy ZWZfQWJzdHJhY3RJbnRlcmZhY2VEZWYmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfQWJzdHJh Y3RJbnRlcmZhY2VEZWYmKTsKCn07CgpjbGFzcyBfcG9mX0Fic3RyYWN0SW50ZXJmYWNlRGVmIDog cHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9BYnN0cmFj dEludGVyZmFjZURlZigpIDogcHJveHlPYmplY3RGYWN0b3J5KEFic3RyYWN0SW50ZXJmYWNlRGVm OjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfQWJzdHJhY3RJbnRlcmZhY2VEZWYoKTsK CiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2Vk UHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0 eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNv bnN0IGNoYXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX0Fic3RyYWN0SW50ZXJmYWNlRGVmIDoK ICBwdWJsaWMgdmlydHVhbCBfaW1wbF9JbnRlcmZhY2VEZWYKewpwdWJsaWM6CiAgdmlydHVhbCB+ X2ltcGxfQWJzdHJhY3RJbnRlcmZhY2VEZWYoKTsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9C b29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRy VG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJp dmVkUmVwb0lkKCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQWJz dHJhY3RJbnRlcmZhY2VEZWY7CiMgMjYwMyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9D T1JCQS5oIiAyCiMgMjYxNiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIgp9 CgoKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIgMQojIDEyNSAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCnN0cnVjdCBvbW5pT3JiQm9h S2V5IHsKICBfQ09SQkFfVUxvbmcgaGk7CiAgX0NPUkJBX1VMb25nIG1lZDsKICBfQ09SQkFfVUxv bmcgbG87Cn07CgoKbmFtZXNwYWNlIG9tbmlPUkIKCnsKIyAxNDggIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogIGV4dGVybiBjaGFyKiBzZXJ2ZXJOYW1lOwojIDE2MSAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuIGludCB0cmFj ZUxldmVsOwoKCgoKCiAgZXh0ZXJuIGludCB0cmFjZUludm9jYXRpb25zOwojIDE5NyAiLi4vLi4v Li4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuIENPUkJBOjpCb29sZWFu IHN0cmljdElJT1A7CiMgMjIzICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIu aCIKICBleHRlcm4gQ09SQkE6OkJvb2xlYW4gdGNBbGlhc0V4cGFuZDsKIyAyMzcgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogIHR5cGVkZWYgb21uaU9yYkJvYUtleSBv YmplY3RLZXk7CgoKCgoKCiAgICAgICAgICAgICAgICAgICB2b2lkIGdlbmVyYXRlTmV3S2V5KG9i amVjdEtleSAmayk7CgoKICAgICAgICAgICAgICAgICAgIG9iamVjdEtleSBudWxsa2V5KCk7CgoK ICAgICAgICAgICAgICAgICAgIGludCBvcGVyYXRvcj09KGNvbnN0IG9iamVjdEtleSAmazEsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0S2V5ICZrMik7 CgoKICAgICAgICAgICAgICAgICAgIGludCBvcGVyYXRvciE9KGNvbnN0IG9iamVjdEtleSAmazEs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0S2V5ICZr Mik7CgoKICB0eXBlZGVmIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2N0ZXQgc2VxT2N0ZXRz OwoKICAgICAgICAgICAgICAgICAgIHNlcU9jdGV0cyoga2V5VG9PY3RldFNlcXVlbmNlKGNvbnN0 IG9iamVjdEtleSAmazEpOwoKCgoKICAgICAgICAgICAgICAgICAgIG9iamVjdEtleSBvY3RldFNl cXVlbmNlVG9LZXkoY29uc3Qgc2VxT2N0ZXRzJiBzZXEpOwojIDI3NCAiLi4vLi4vLi4vLi4vaW5j bHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgICAgICAgICAgICAgICAgICBzaXplX3QgTWF4TWVz c2FnZVNpemUoKTsKIyAyODMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5o IgogICAgICAgICAgICAgICAgICAgdm9pZCBNYXhNZXNzYWdlU2l6ZShzaXplX3QgbmV3dmFsdWUp OwoKCgogIGVudW0gaWRsZUNvbm5UeXBlIHsgaWRsZUluY29taW5nLCBpZGxlT3V0Z29pbmcgfTsK IyAyOTYgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogICAgICAgICAg ICAgICAgICAgdm9pZCBpZGxlQ29ubmVjdGlvblNjYW5QZXJpb2QoaWRsZUNvbm5UeXBlIGRpcmVj dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OlVMb25n IHNlYyk7CgoKCgoKICAgICAgICAgICAgICAgICAgIENPUkJBOjpVTG9uZyBpZGxlQ29ubmVjdGlv blNjYW5QZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRs ZUNvbm5UeXBlIGRpcmVjdGlvbik7CgoKCiAgZW51bSBjYWxsVGltZU91dFR5cGUgeyBjbGllbnRT aWRlLCBzZXJ2ZXJTaWRlIH07CiMgMzE4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29t bmlPUkIuaCIKICAgICAgICAgICAgICAgICAgIHZvaWQgY2FsbFRpbWVPdXRQZXJpb2QoY2FsbFRp bWVPdXRUeXBlIGRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQ09SQkE6OlVMb25nIHNlYyk7CgoKCgoKICAgICAgICAgICAgICAgICAgIENPUkJBOjpV TG9uZyBjYWxsVGltZU91dFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY2FsbFRpbWVPdXRUeXBlIGRpcmVjdGlvbik7CiMgMzQwICIuLi8uLi8uLi8u Li9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIKICAgICAgICAgICAgICAgICAgIHZvaWQgc2Nh bkdyYW51bGFyaXR5KENPUkJBOjpVTG9uZyBzZWMpOwoKCgoKCiAgICAgICAgICAgICAgICAgICBD T1JCQTo6VUxvbmcgc2NhbkdyYW51bGFyaXR5KCk7CiMgMzgyICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL29tbmlPUkIuaCIKICB0eXBlZGVmIENPUkJBOjpCb29sZWFuICgqdHJhbnNpZW50 RXhjZXB0aW9uSGFuZGxlcl90KSh2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBDT1JCQTo6VUxvbmcgbl9yZXRyaWVzLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlRSQU5TSUVOVCYgZXgpOwoKICAg ICAgICAgICAgICAgICAgIHZvaWQgaW5zdGFsbFRyYW5zaWVudEV4Y2VwdGlvbkhhbmRsZXIodm9p ZCogY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRFeGNl cHRpb25IYW5kbGVyX3QgZm4pOwoKICAgICAgICAgICAgICAgICAgIHZvaWQgaW5zdGFsbFRyYW5z aWVudEV4Y2VwdGlvbkhhbmRsZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENP UkJBOjpPYmplY3RfcHRyIG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9p ZCogY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRFeGNl cHRpb25IYW5kbGVyX3QgZm4pOwoKICBleHRlcm4gQ09SQkE6OlVMb25nIGRlZmF1bHRUcmFuc2ll bnRSZXRyeURlbGF5SW5jcmVtZW50OwogIGV4dGVybiBDT1JCQTo6VUxvbmcgZGVmYXVsdFRyYW5z aWVudFJldHJ5RGVsYXlNYXhpbXVtOwojIDQxMyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JC My9vbW5pT1JCLmgiCiAgdHlwZWRlZiBDT1JCQTo6Qm9vbGVhbiAoKmNvbW1GYWlsdXJlRXhjZXB0 aW9uSGFuZGxlcl90KSh2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBDT1JCQTo6VUxvbmcgbl9yZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OkNPTU1fRkFJTFVSRSYgZXgpOwoKICAgICAg ICAgICAgICAgICAgIHZvaWQgaW5zdGFsbENvbW1GYWlsdXJlRXhjZXB0aW9uSGFuZGxlcih2b2lk KiBjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1GYWlsdXJlRXhj ZXB0aW9uSGFuZGxlcl90IGZuKTsKCiAgICAgICAgICAgICAgICAgICB2b2lkIGluc3RhbGxDb21t RmFpbHVyZUV4Y2VwdGlvbkhhbmRsZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHZvaWQqIGNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21t RmFpbHVyZUV4Y2VwdGlvbkhhbmRsZXJfdCBmbik7CiMgNDQ2ICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL29tbmlPUkIuaCIKICB0eXBlZGVmIENPUkJBOjpCb29sZWFuICgqc3lzdGVtRXhj ZXB0aW9uSGFuZGxlcl90KSh2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQ09SQkE6OlVMb25nIG5fcmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBDT1JCQTo6U3lzdGVtRXhjZXB0aW9uJiBleCk7CgogICAgICAgICAg ICAgICAgICAgdm9pZCBpbnN0YWxsU3lzdGVtRXhjZXB0aW9uSGFuZGxlcih2b2lkKiBjb29raWUs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUV4Y2VwdGlvbkhhbmRs ZXJfdCBmbik7CgogICAgICAgICAgICAgICAgICAgdm9pZCBpbnN0YWxsU3lzdGVtRXhjZXB0aW9u SGFuZGxlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6Ok9iamVj dF9wdHIgb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29r aWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUV4Y2VwdGlvbkhh bmRsZXJfdCBmbik7CiMgNDg4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIu aCIKICBjbGFzcyBsb2FkZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgQ09SQkE6Ok9iamVjdF9w dHIgKCptYXBLZXlUb09iamVjdF90KSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IG9iamVjdEtleSYga2V5KTsKCiAgICBzdGF0aWMgdm9pZCBzZXQobWFwS2V5 VG9PYmplY3RfdCBOZXdLZXlUb09iamVjdCk7CiAgfTsKIyA1MzkgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogIGNsYXNzIGdpb3BTZXJ2ZXJUaHJlYWRXcmFwcGVyIHsK ICBwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgcnVuKHZvaWQgKCpmbikodm9pZCopLCB2b2lkKiBh cmcpIHsgZm4oYXJnKTsgfQogICAgdmlydHVhbCB+Z2lvcFNlcnZlclRocmVhZFdyYXBwZXIoKSB7 fQoKCgoKCgogICAgc3RhdGljIHZvaWQgc2V0R2lvcFNlcnZlclRocmVhZFdyYXBwZXIoZ2lvcFNl cnZlclRocmVhZFdyYXBwZXIqIHApOwogICAgc3RhdGljIGdpb3BTZXJ2ZXJUaHJlYWRXcmFwcGVy KiBnZXRHaW9wU2VydmVyVGhyZWFkV3JhcHBlcigpOwogIH07CiMgNTYxICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIKICBjbGFzcyBmYXRhbEV4Y2VwdGlvbiB7CiAgcHVi bGljOgogICAgZmF0YWxFeGNlcHRpb24oY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSxjb25zdCBj aGFyICplcnJtc2cpOwogICAgaW5saW5lIH5mYXRhbEV4Y2VwdGlvbigpIHt9CiAgICBpbmxpbmUg Y29uc3QgY2hhciAqZmlsZSgpIGNvbnN0IHsgcmV0dXJuIHBkX2ZpbGU7IH0KICAgIGlubGluZSBp bnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIHBkX2xpbmU7IH0KICAgIGlubGluZSBjb25zdCBjaGFy ICplcnJtc2coKSBjb25zdCB7IHJldHVybiBwZF9lcnJtc2c7IH0KICBwcml2YXRlOgogICAgY29u c3QgY2hhciAqcGRfZmlsZTsKICAgIGludCBwZF9saW5lOwogICAgY29uc3QgY2hhciAqcGRfZXJy bXNnOwoKICAgIGZhdGFsRXhjZXB0aW9uKCk7CiAgfTsKIyA1ODcgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogIGV4dGVybiB1bnNpZ25lZCBpbnQgbWF4VGNwQ29ubmVj dGlvblBlclNlcnZlcjsKIyA2MDAgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9S Qi5oIgogIGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBkaWlUaHJvd3NTeXNFeGNlcHRpb25zOwojIDYx NyAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuIENPUkJB OjpCb29sZWFuIGFib3J0T25JbnRlcm5hbEVycm9yOwojIDYyNyAiLi4vLi4vLi4vLi4vaW5jbHVk ZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuIF9DT1JCQV9VTG9uZyBvYmplY3RUYWJsZVNp emU7CiMgNjQxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIKICAgICAg ICAgICAgICAgICAgIHZvaWQgZW5hYmxlTGNkTW9kZSgpOwojIDY1OSAiLi4vLi4vLi4vLi4vaW5j bHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuCiAgICAgICAgICAgICAgICAgICAgICBD T1JCQTo6Qm9vbGVhbiBvbW5pT1JCXzI3X0NvbXBhdGlibGVBbnlFeHRyYWN0aW9uOwojIDY3MSAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiCiAgZXh0ZXJuIENPUkJBOjpC b29sZWFuIHZlcmlmeU9iamVjdEV4aXN0c0FuZFR5cGU7CiMgNjg2ICIuLi8uLi8uLi8uLi9pbmNs dWRlL29tbmlPUkIzL29tbmlPUkIuaCIKICBleHRlcm4gaW50IHBvYUhvbGRSZXF1ZXN0VGltZW91 dDsKIyA2OTkgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIgogIGNsYXNz IExPQ0FUSU9OX0ZPUldBUkQgewogIHB1YmxpYzoKICAgIGlubGluZSBMT0NBVElPTl9GT1JXQVJE KENPUkJBOjpPYmplY3RfcHRyIG9ianJlZikKICAgICAgOiBwZF9vYmpyZWYob2JqcmVmKSB7fQoK ICAgIGlubGluZSBDT1JCQTo6T2JqZWN0X3B0ciBnZXRfb2JqKCkgY29uc3QgeyByZXR1cm4gcGRf b2JqcmVmOyB9CgogIHByaXZhdGU6CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBwZF9vYmpyZWY7CiAg fTsKCgoKCgogIGV4dGVybiBDT1JCQTo6Qm9vbGVhbiB1c2VUeXBlQ29kZUluZGlyZWN0aW9uczsK CgogIGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBhY2NlcHRNaXNhbGlnbmVkVGNJbmRpcmVjdGlvbnM7 CgoKCiAgY2xhc3MgbG9nU3RyZWFtIHsKICBwdWJsaWM6CiAgICBsb2dTdHJlYW0oKTsKICAgIH5s b2dTdHJlYW0oKTsKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChjaGFyIGMpOwogICAgbG9nU3Ry ZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAoY2hh ciljOyB9CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgYykgeyByZXR1cm4g KCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoY29uc3QgY2hh ciAqcyk7CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoY29uc3QgdW5zaWduZWQgY2hhciAqcykg ewogICAgICByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsKICAgIH0KICAgIGxvZ1N0 cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykgewogICAgICByZXR1cm4gKCp0 aGlzKSA8PCAoY29uc3QgY2hhciopczsKICAgIH0KICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChj b25zdCB2b2lkICpwKTsKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChpbnQgbik7CiAgICBsb2dT dHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgbG9nU3RyZWFtJiBvcGVyYXRv cjw8KGxvbmcgbik7CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBuKTsK ICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKGlu dCluKTt9CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgc2hvcnQgbikge3JldHVy biBvcGVyYXRvcjw8KCh1bnNpZ25lZCBpbnQpbik7fQoKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8 PChsb25nIGxvbmcgbik7CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBs b25nIG4pOwoKCiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoYm9vbCBiKSB7IHJldHVybiBvcGVy YXRvcjw8KChpbnQpYik7IH0KCgogICAgbG9nU3RyZWFtJiBvcGVyYXRvcjw8KGRvdWJsZSBuKTsK ICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8KChk b3VibGUpbik7IH0KCgoKCiAgICBsb2dTdHJlYW0mIGZsdXNoKCk7CiAgcHJpdmF0ZToKICAgIHZv aWQqIHBkX3N0YXRlOwogIH07CgogIGV4dGVybiBsb2dTdHJlYW0mIGxvZzsKCgoKCgogIHN0YXRp YyBpbmxpbmUgaW50IHRyYWNlKGludCB0bCkgeyByZXR1cm4gdHJhY2VMZXZlbCA+PSB0bDsgfQoK CiAgY2xhc3MgbG9nZ2VyIHsKICBwdWJsaWM6CiAgICBsb2dnZXIoY29uc3QgY2hhciogcHJlZml4 ID0gMCk7CiAgICB+bG9nZ2VyKCk7CgoKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChjaGFyIGMpOwog ICAgbG9nZ2VyJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8 PCAoY2hhciljOyB9CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgYykgeyByZXR1 cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoY29uc3QgY2hh ciAqcyk7CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoY29uc3QgdW5zaWduZWQgY2hhciAqcykgewog ICAgICByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsKICAgIH0KICAgIGxvZ2dlciYg b3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykgewogICAgICByZXR1cm4gKCp0aGlzKSA8 PCAoY29uc3QgY2hhciopczsKICAgIH0KICAgIGxvZ2dlciYgb3BlcmF0b3I8PChjb25zdCB2b2lk ICpwKTsKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChpbnQgbik7CiAgICBsb2dnZXImIG9wZXJhdG9y PDwodW5zaWduZWQgaW50IG4pOwogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KGxvbmcgbik7CiAgICBs b2dnZXImIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBuKTsKICAgIGxvZ2dlciYgb3BlcmF0b3I8 PChzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKGludCluKTt9CiAgICBsb2dnZXImIG9wZXJh dG9yPDwodW5zaWduZWQgc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KCh1bnNpZ25lZCBpbnQp bik7fQoKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChsb25nIGxvbmcgbik7CiAgICBsb2dnZXImIG9w ZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOwoKCiAgICBsb2dnZXImIG9wZXJhdG9yPDwo Ym9vbCBiKSB7IHJldHVybiBvcGVyYXRvcjw8KChpbnQpYik7IH0KCgogICAgbG9nZ2VyJiBvcGVy YXRvcjw8KGRvdWJsZSBuKTsKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVy biBvcGVyYXRvcjw8KChkb3VibGUpbik7IH0KCgoKCiAgICBsb2dnZXImIG9wZXJhdG9yPDwob21u aUxvY2FsSWRlbnRpdHkqKTsKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChvbW5pSWRlbnRpdHkqKTsK ICAgIGxvZ2dlciYgb3BlcmF0b3I8PChvbW5pT2JqS2V5Jik7CgogICAgdm9pZCBmbHVzaCgpOwoK CgogIHByaXZhdGU6CiAgICBsb2dnZXIoY29uc3QgbG9nZ2VyJik7CiAgICBsb2dnZXImIG9wZXJh dG9yPShjb25zdCBsb2dnZXImKTsKCiAgICBpbmxpbmUgdm9pZCByZXNlcnZlKGludCBuKSB7IGlm KCBwZF9lbmQgLSBwZF9wIC0gMSA8IG4gKSBtb3JlKG4pOyB9CiAgICB2b2lkIG1vcmUoaW50IG4p OwoKICAgIGNvbnN0IGNoYXIqIHBkX3ByZWZpeDsKICAgIGNoYXIqIHBkX2J1ZjsKICAgIGNoYXIq IHBkX3A7CiAgICBjaGFyKiBwZF9lbmQ7CiAgfTsKCgogICAgICAgICAgICAgICAgICAgdm9pZCBs b2dmKGNvbnN0IGNoYXIqIGZtdCAuLi4pOwoKCiAgICAgICAgICAgICAgICAgICB2b2lkIGRvX2xv Z3MoY29uc3QgY2hhciogbXNnKTsKCgogICAgICAgICAgICAgICAgICAgaW5saW5lIHZvaWQgbG9n cyhpbnQgdGwsIGNvbnN0IGNoYXIqIG1zZykgewogICAgaWYoIHRyYWNlTGV2ZWwgPj0gdGwgKSBk b19sb2dzKG1zZyk7CiAgfQojIDg0NiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9vbW5p T1JCLmgiCiAgZXh0ZXJuIG9iamVjdEtleSBzZWVkOwojIDg3NyAiLi4vLi4vLi4vLi4vaW5jbHVk ZS9vbW5pT1JCMy9vbW5pT1JCLmgiCn0KIyAyNjIwICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlP UkIzL0NPUkJBLmgiIDIKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3Byb3h5RmFj dG9yeS5oIiAxCiMgMjYyMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAy CiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy90ZW1wbGF0ZWRlZm5zLmgiIDEKIyA0 OCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy90ZW1wbGF0ZWRlZm5zLmgiCnRlbXBsYXRl IDxjbGFzcyBUPgppbmxpbmUKX0NPUkJBX1BzZXVkb09ial9WYXI8VD46Ol9DT1JCQV9Qc2V1ZG9P YmpfVmFyKCkKICA6IHBkX2RhdGEoVDo6X25pbCgpKSB7fQoKCnRlbXBsYXRlIDxjbGFzcyBUPgpp bmxpbmUKX0NPUkJBX1BzZXVkb09ial9WYXI8VD46Ol9DT1JCQV9Qc2V1ZG9PYmpfVmFyKGNvbnN0 IF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+JiB2KQp7CiAgcGRfZGF0YSA9IFQ6Ol9kdXBsaWNhdGUo di5wZF9kYXRhKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUKX0NPUkJBX1BzZXVkb09i al9WYXI8VD46Ol9DT1JCQV9Qc2V1ZG9PYmpfVmFyKGNvbnN0IF9DT1JCQV9Qc2V1ZG9PYmpfTWVt YmVyPFQsIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+ID4mIHApCnsKICBwZF9kYXRhID0gVDo6X2R1 cGxpY2F0ZShwLl9wdHIpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZQpfQ09SQkFfUHNl dWRvT2JqX1ZhcjxUPjo6fl9DT1JCQV9Qc2V1ZG9PYmpfVmFyKCkKewogIENPUkJBOjpyZWxlYXNl KHBkX2RhdGEpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSBfQ09SQkFfUHNldWRvT2Jq X1ZhcjxUPiYKX0NPUkJBX1BzZXVkb09ial9WYXI8VD46Om9wZXJhdG9yPShUKiBwKQp7CiAgQ09S QkE6OnJlbGVhc2UocGRfZGF0YSk7CiAgcGRfZGF0YSA9IHA7CiAgcmV0dXJuICp0aGlzOwp9CgoK dGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiYKX0NPUkJB X1BzZXVkb09ial9WYXI8VD46Om9wZXJhdG9yPShjb25zdCBfQ09SQkFfUHNldWRvT2JqX1ZhcjxU PiYgdikKewogIGlmKCBwZF9kYXRhICE9IHYucGRfZGF0YSApIHsKICAgIENPUkJBOjpyZWxlYXNl KHBkX2RhdGEpOwogICAgaWYoIHYucGRfZGF0YSApIHBkX2RhdGEgPSBUOjpfZHVwbGljYXRlKHYu cGRfZGF0YSk7CiAgICBlbHNlIHBkX2RhdGEgPSBUOjpfbmlsKCk7CiAgfQogIHJldHVybiAqdGhp czsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgX0NPUkJBX1BzZXVkb09ial9WYXI8VD4m Cl9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+OjpvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1BzZXVkb09i al9NZW1iZXI8VCwgX0NPUkJBX1BzZXVkb09ial9WYXI8VD4gPiYgbSkKewogIENPUkJBOjpyZWxl YXNlKHBkX2RhdGEpOwogIHBkX2RhdGEgPSBUOjpfZHVwbGljYXRlKG0uX3B0cik7CiAgcmV0dXJu ICp0aGlzOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSBUKiYKX0NPUkJBX1BzZXVkb09i al9WYXI8VD46Om91dCgpCnsKICBDT1JCQTo6cmVsZWFzZShwZF9kYXRhKTsKICBwZF9kYXRhID0g VDo6X25pbCgpOwogIHJldHVybiBwZF9kYXRhOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGlu ZSBUKgpfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPjo6X3JldG4oKQp7CiAgVF9wdHIgdG1wID0gcGRf ZGF0YTsKICBwZF9kYXRhID0gVDo6X25pbCgpOwogIHJldHVybiB0bXA7Cn0KCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+CmlubGluZQpfQ09SQkFfUHNldWRvT2JqX091dDxULFRf dmFyPjo6X0NPUkJBX1BzZXVkb09ial9PdXQoVF92YXImIHYpCiAgOiBfZGF0YSh2LnBkX2RhdGEp CnsKCiAgdiA9IFQ6Ol9uaWwoKTsKfQoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zh cj4KaW5saW5lCl9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+OjpfQ09SQkFfUHNldWRv T2JqX01lbWJlcigpCiAgOiBfcHRyKFQ6Ol9uaWwoKSkge30KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwg Y2xhc3MgVF92YXI+CmlubGluZQpfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPjo6X0NP UkJBX1BzZXVkb09ial9NZW1iZXIoY29uc3QgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zh cj4mIG0pCnsKICBpZiggbS5fcHRyICkgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUobS5fcHRyKTsKICBl bHNlIF9wdHIgPSBUOjpfbmlsKCk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+ CmlubGluZQpfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPjo6fl9DT1JCQV9Qc2V1ZG9P YmpfTWVtYmVyKCkKewogIENPUkJBOjpyZWxlYXNlKF9wdHIpOwp9CgoKdGVtcGxhdGUgPGNsYXNz IFQsIGNsYXNzIFRfdmFyPgppbmxpbmUgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zhcj4m Cl9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+OjpvcGVyYXRvcj0oVCogcCkKewogIENP UkJBOjpyZWxlYXNlKF9wdHIpOwogIF9wdHIgPSBwOwogIHJldHVybiAqdGhpczsKfQoKCnRlbXBs YXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVy PFQsVF92YXI+JgpfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPjo6b3BlcmF0b3I9KGNv bnN0IF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+JiBtKQp7CiAgaWYoIF9wdHIgIT0g bS5fcHRyICkgewogICAgQ09SQkE6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRyID0gVDo6X2R1cGxp Y2F0ZShtLl9wdHIpOwogIH0KICByZXR1cm4gKnRoaXM7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwg Y2xhc3MgVF92YXI+CmlubGluZSBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPiYKX0NP UkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zhcj46Om9wZXJhdG9yPShjb25zdCBUX3ZhciYgdikK ewogIENPUkJBOjpyZWxlYXNlKF9wdHIpOwogIF9wdHIgPSBUOjpfZHVwbGljYXRlKHYucGRfZGF0 YSk7CiAgcmV0dXJuICp0aGlzOwp9CiMgMjA4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L3RlbXBsYXRlZGVmbnMuaCIKaW5saW5lCkNPUkJBOjpPYmplY3RfdmFyOjpPYmplY3RfdmFyKGNv bnN0IENPUkJBOjpPYmplY3RfTWVtYmVyJiBwKQogIDogcGRfcmVmKFQ6Ol9kdXBsaWNhdGUocCkp CnsKfQoKaW5saW5lCkNPUkJBOjpPYmplY3RfdmFyOjpPYmplY3RfdmFyKGNvbnN0IENPUkJBOjpP YmplY3RfRWxlbWVudCYgcCkKICA6IHBkX3JlZihUOjpfZHVwbGljYXRlKHApKQp7Cn0KCgppbmxp bmUgQ09SQkE6Ok9iamVjdF92YXImCkNPUkJBOjpPYmplY3RfdmFyOjpvcGVyYXRvcj0gKGNvbnN0 IENPUkJBOjpPYmplY3RfTWVtYmVyJiBwKQp7CiAgcmVsZWFzZShwZF9yZWYpOwogIHBkX3JlZiA9 IFQ6Ol9kdXBsaWNhdGUocCk7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgQ09SQkE6Ok9iamVj dF92YXImCkNPUkJBOjpPYmplY3RfdmFyOjpvcGVyYXRvcj0gKGNvbnN0IENPUkJBOjpPYmplY3Rf RWxlbWVudCYgcCkKewogIHJlbGVhc2UocGRfcmVmKTsKICBwZF9yZWYgPSBUOjpfZHVwbGljYXRl KHApOwogIHJldHVybiAqdGhpczsKfQoKaW5saW5lIENPUkJBOjpPYmplY3RfTWVtYmVyJgpDT1JC QTo6T2JqZWN0X01lbWJlcjo6b3BlcmF0b3I9KGNvbnN0IENPUkJBOjpPYmplY3RfRWxlbWVudCYg cCkKewogIHJlbGVhc2UoX3B0cik7CiAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUocCk7CiAgcmV0dXJu ICp0aGlzOwp9CiMgMjYyMiAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAy CiMgMSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9jb3JiYV9vcGVyYXRvcnMuaCIgMQoj IDMyICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2NvcmJhX29wZXJhdG9ycy5oIgpleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiYp OwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkV4Y2Vw dGlvbiopOwoKCgoKCgoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpVTktOT1dOJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBj b25zdCBDT1JCQTo6VU5LTk9XTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0o Y29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpVTktOT1dOKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9QQVJBTSYpOyBleHRlcm4gdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9QQVJBTSopOyBleHRlcm4g Q09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpCQURf UEFSQU0qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JC QTo6Tk9fTUVNT1JZJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25z dCBDT1JCQTo6Tk9fTUVNT1JZKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX01FTU9SWSomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0 b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTVBfTElNSVQmKTsgZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTVBfTElNSVQqKTsgZXh0ZXJu IENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6SU1Q X0xJTUlUKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09S QkE6OkNPTU1fRkFJTFVSRSYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55Jiwg Y29uc3QgQ09SQkE6OkNPTU1fRkFJTFVSRSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpDT01NX0ZBSUxVUkUqJik7CmV4dGVybiB2 b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6SU5WX09CSlJFRiYpOyBl eHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVl9PQkpS RUYqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm LCBDT1JCQTo6SU5WX09CSlJFRiomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFu eSYsIGNvbnN0IENPUkJBOjpPQkpFQ1RfTk9UX0VYSVNUJik7IGV4dGVybiB2b2lkIG9wZXJhdG9y PDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6T0JKRUNUX05PVF9FWElTVCopOyBleHRlcm4g Q09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpPQkpF Q1RfTk9UX0VYSVNUKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29u c3QgQ09SQkE6Ok5PX1BFUk1JU1NJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYsIGNvbnN0IENPUkJBOjpOT19QRVJNSVNTSU9OKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVh biBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1BFUk1JU1NJT04qJik7 CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6SU5URVJO QUwmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJ TlRFUk5BTCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6 OkFueSYsIENPUkJBOjpJTlRFUk5BTComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYsIGNvbnN0IENPUkJBOjpNQVJTSEFMJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6TUFSU0hBTCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4g b3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpNQVJTSEFMKiYpOwpleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOSVRJQUxJWkUmKTsg ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTklUSUFM SVpFKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55 JiwgQ09SQkE6OklOSVRJQUxJWkUqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpB bnkmLCBjb25zdCBDT1JCQTo6Tk9fSU1QTEVNRU5UJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Tk9fSU1QTEVNRU5UKik7IGV4dGVybiBDT1JCQTo6 Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX0lNUExFTUVO VComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpC QURfVFlQRUNPREUmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpCQURfVFlQRUNPREUqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49 KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6QkFEX1RZUEVDT0RFKiYpOwpleHRlcm4gdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9PUEVSQVRJT04mKTsgZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpCQURfT1BFUkFU SU9OKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55 JiwgQ09SQkE6OkJBRF9PUEVSQVRJT04qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJB OjpBbnkmLCBjb25zdCBDT1JCQTo6Tk9fUkVTT1VSQ0VTJik7IGV4dGVybiB2b2lkIG9wZXJhdG9y PDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Tk9fUkVTT1VSQ0VTKik7IGV4dGVybiBDT1JC QTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1JFU09V UkNFUyomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJB OjpOT19SRVNQT05TRSYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29u c3QgQ09SQkE6Ok5PX1JFU1BPTlNFKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+ PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1JFU1BPTlNFKiYpOwpleHRlcm4gdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OlBFUlNJU1RfU1RPUkUmKTsgZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpQRVJTSVNUX1NU T1JFKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55 JiwgQ09SQkE6OlBFUlNJU1RfU1RPUkUqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJB OjpBbnkmLCBjb25zdCBDT1JCQTo6QkFEX0lOVl9PUkRFUiYpOyBleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9JTlZfT1JERVIqKTsgZXh0ZXJuIENP UkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6QkFEX0lO Vl9PUkRFUiomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENP UkJBOjpUUkFOU0lFTlQmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpUUkFOU0lFTlQqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49 KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6VFJBTlNJRU5UKiYpOwpleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkZSRUVfTUVNJik7IGV4dGVybiB2b2lk IG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6RlJFRV9NRU0qKTsgZXh0ZXJu IENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6RlJF RV9NRU0qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JC QTo6SU5WX0lERU5UJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25z dCBDT1JCQTo6SU5WX0lERU5UKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVl9JREVOVComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0 b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTlZfRkxBRyYpOyBleHRlcm4gdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVl9GTEFHKik7IGV4dGVybiBD T1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVl9G TEFHKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6 OklOVEZfUkVQT1MmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpJTlRGX1JFUE9TKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVEZfUkVQT1MqJik7CmV4dGVybiB2b2lkIG9wZXJh dG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6QkFEX0NPTlRFWFQmKTsgZXh0ZXJuIHZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpCQURfQ09OVEVYVCopOyBl eHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJB OjpCQURfQ09OVEVYVComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpPQkpfQURBUFRFUiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6 QW55JiwgY29uc3QgQ09SQkE6Ok9CSl9BREFQVEVSKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBv cGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok9CSl9BREFQVEVSKiYpOwpleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkRBVEFfQ09OVkVS U0lPTiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6 OkRBVEFfQ09OVkVSU0lPTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29u c3QgQ09SQkE6OkFueSYsIENPUkJBOjpEQVRBX0NPTlZFUlNJT04qJik7CmV4dGVybiB2b2lkIG9w ZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6VFJBTlNBQ1RJT05fUkVRVUlSRUQm KTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUUkFO U0FDVElPTl9SRVFVSVJFRCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29u c3QgQ09SQkE6OkFueSYsIENPUkJBOjpUUkFOU0FDVElPTl9SRVFVSVJFRComKTsKZXh0ZXJuIHZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUUkFOU0FDVElPTl9ST0xM RURCQUNLJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JC QTo6VFJBTlNBQ1RJT05fUk9MTEVEQkFDSyopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpUUkFOU0FDVElPTl9ST0xMRURCQUNLKiYp OwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVkFM SURfVFJBTlNBQ1RJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpJTlZBTElEX1RSQU5TQUNUSU9OKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBv cGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVkFMSURfVFJBTlNBQ1RJT04q Jik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6V1JP TkdfVFJBTlNBQ1RJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpXUk9OR19UUkFOU0FDVElPTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3Bl cmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpXUk9OR19UUkFOU0FDVElPTiomKTsK ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpVbmtub3du VXNlckV4Y2VwdGlvbiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29u c3QgQ09SQkE6OlVua25vd25Vc2VyRXhjZXB0aW9uKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBv cGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OlVua25vd25Vc2VyRXhjZXB0aW9u KiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6Oldy b25nVHJhbnNhY3Rpb24mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpXcm9uZ1RyYW5zYWN0aW9uKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVy YXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Oldyb25nVHJhbnNhY3Rpb24qJik7CmV4 dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Q29udGV4dExp c3Q6OkJvdW5kcyYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3Qg Q09SQkE6OkNvbnRleHRMaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6Q29udGV4dExpc3Q6OkJvdW5kcyomKTsK ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpFeGNlcHRp b25MaXN0OjpCb3VuZHMmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNv bnN0IENPUkJBOjpFeGNlcHRpb25MaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFu IG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6RXhjZXB0aW9uTGlzdDo6Qm91 bmRzKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6 Ok5WTGlzdDo6Qm91bmRzJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBj b25zdCBDT1JCQTo6TlZMaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6TlZMaXN0OjpCb3VuZHMqJik7CmV4dGVy biB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6VHlwZUNvZGU6OkJv dW5kcyYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6 OlR5cGVDb2RlOjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNv bnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6VHlwZUNvZGU6OkJvdW5kcyomKTsKZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUeXBlQ29kZTo6QmFkS2luZCYp OyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OlR5cGVD b2RlOjpCYWRLaW5kKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBD T1JCQTo6QW55JiwgQ09SQkE6OlR5cGVDb2RlOjpCYWRLaW5kKiYpOwpleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52YWxpZCYpOyBleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52 YWxpZCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFu eSYsIENPUkJBOjpEeW5Bbnk6OkludmFsaWQqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6RHluQW55OjpJbnZhbGlkVmFsdWUmKTsgZXh0ZXJuIHZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpEeW5Bbnk6OkludmFsaWRW YWx1ZSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFu eSYsIENPUkJBOjpEeW5Bbnk6OkludmFsaWRWYWx1ZSomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8 PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpEeW5Bbnk6OlR5cGVNaXNtYXRjaCYpOyBleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6VHlw ZU1pc21hdGNoKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JC QTo6QW55JiwgQ09SQkE6OkR5bkFueTo6VHlwZU1pc21hdGNoKiYpOwpleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52YWxpZFNlcSYpOyBl eHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6 SW52YWxpZFNlcSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09S QkE6OkFueSYsIENPUkJBOjpEeW5Bbnk6OkludmFsaWRTZXEqJik7CmV4dGVybiB2b2lkIG9wZXJh dG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6T1JCOjpJbmNvbnNpc3RlbnRUeXBlQ29k ZSYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6Ok9S Qjo6SW5jb25zaXN0ZW50VHlwZUNvZGUqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6T1JCOjpJbmNvbnNpc3RlbnRUeXBlQ29kZSom KTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpPUkI6 OkludmFsaWROYW1lJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25z dCBDT1JCQTo6T1JCOjpJbnZhbGlkTmFtZSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpPUkI6OkludmFsaWROYW1lKiYpOwojIDI2 MjMgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMgojIDEgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDEKIyA3MCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9v bW5pT1JCMy9wb2EuaCIKY2xhc3MgR0lPUF9TOwpjbGFzcyBvbW5pT3JiUE9BOwoKCm5hbWVzcGFj ZSBQb3J0YWJsZVNlcnZlcgp7CgoKCgoKICBjbGFzcyBQT0E7CiAgdHlwZWRlZiBQT0EqIFBPQV9w dHI7CiAgdHlwZWRlZiBQT0FfcHRyIFBPQVJlZjsKCiAgY2xhc3MgUE9BX0hlbHBlciB7CiAgcHVi bGljOgogICAgdHlwZWRlZiBQT0FfcHRyIF9wdHJfdHlwZTsKCiAgICBzdGF0aWMgX3B0cl90eXBl IF9uaWwoKTsKICAgIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICAg IHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICAgIHN0YXRpYyB2b2lkIGR1cGxpY2F0 ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIGlubGluZSBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0 cl90eXBlLCBzaXplX3QpIHsgcmV0dXJuIDA7IH0KICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXJz aGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKSB7fQogICAgc3RhdGljIGlu bGluZSBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJikgeyByZXR1 cm4gMDsgfQogICAgc3RhdGljIGlubGluZSB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBN ZW1CdWZmZXJlZFN0cmVhbSYpIHt9CiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSB1bm1hcnNo YWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKSB7IHJldHVybiAwOyB9CiAgfTsKCiAgY2xhc3Mg U2VydmFudEJhc2U7CiAgdHlwZWRlZiBTZXJ2YW50QmFzZSogU2VydmFudDsKCgoKCgoKICBjbGFz cyBQT0FMaXN0X3ZhcjsKCiAgY2xhc3MgUE9BTGlzdCA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX09ialJlZjxQT0EsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxQT0EsIFBPQV9IZWxw ZXI+LCBQT0FfSGVscGVyPiB7CiAgcHVibGljOgogICAgdHlwZWRlZiBQT0FMaXN0X3ZhciBfdmFy X3R5cGU7CiAgICBpbmxpbmUgUE9BTGlzdCgpIHt9CiAgICBpbmxpbmUgUE9BTGlzdChjb25zdCBQ T0FMaXN0JiBzKQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPFBPQSwg X0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9BX0hlbHBlcj4sIFBPQV9IZWxwZXI+KHMpIHt9 CiAgICBpbmxpbmUgUE9BTGlzdChfQ09SQkFfVUxvbmcgX21heCkKICAgICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX09ialJlZjxQT0EsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxQT0EsIFBP QV9IZWxwZXI+LCBQT0FfSGVscGVyPihfbWF4KSB7fQogICAgaW5saW5lIFBPQUxpc3QoX0NPUkJB X1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVuLCBQT0FfcHRyKiBfdmFsLCBfQ09SQkFfQm9v bGVhbiBfcmVsPTApCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8UE9B LCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8UE9BLCBQT0FfSGVscGVyPiwgUE9BX0hlbHBlcj4oX21h eCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KICAgIGlubGluZSBQT0FMaXN0JiBvcGVyYXRvciA9IChj b25zdCBQT0FMaXN0JiBzKSB7CiAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVm PFBPQSwgX0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9BX0hlbHBlcj4sIFBPQV9IZWxwZXI+ OjpvcGVyYXRvcj0ocyk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKCiAgY2xhc3Mg UE9BTGlzdF92YXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgUE9BTGlzdCBUOwogICAgdHlwZWRl ZiBQT0FMaXN0X3ZhciBUX3ZhcjsKCiAgICBpbmxpbmUgUE9BTGlzdF92YXIoKSA6IHBkX3NlcSgw KSB7fQogICAgaW5saW5lIFBPQUxpc3RfdmFyKFQqIHMpIDogcGRfc2VxKHMpIHt9CiAgICBpbmxp bmUgUE9BTGlzdF92YXIoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMucGRfc2VxICkgcGRf c2VxID0gbmV3IFQoKnMucGRfc2VxKTsKICAgICAgZWxzZSBwZF9zZXEgPSAwOwogICAgfQogICAg aW5saW5lIH5QT0FMaXN0X3ZhcigpIHsgaWYoIHBkX3NlcSApIGRlbGV0ZSBwZF9zZXE7IH0KCiAg ICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgICAgaWYoIHBkX3NlcSApIGRl bGV0ZSBwZF9zZXE7CiAgICAgIHBkX3NlcSA9IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0K ICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYo IHMucGRfc2VxICkgewogICAgICAgIGlmKCAhcGRfc2VxICkgcGRfc2VxID0gbmV3IFQ7CiAgICAg ICAgKnBkX3NlcSA9ICpzLnBkX3NlcTsKICAgICAgfSBlbHNlIGlmKCBwZF9zZXEgKSB7CiAgICAg ICAgZGVsZXRlIHBkX3NlcTsKICAgICAgICBwZF9zZXEgPSAwOwogICAgICB9CiAgICAgIHJldHVy biAqdGhpczsKICAgIH0KCiAgICBpbmxpbmUgX0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9B X0hlbHBlcj4gb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICAgIHJldHVybiAoKnBk X3NlcSlbc107CiAgICB9CiAgICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4gcGRf c2VxOyB9CgoKCiAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4g KnBkX3NlcTsgfQogICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpwZF9zZXE7IH0K CgogICAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKnBkX3NlcTsgfQogICAg aW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKnBkX3NlcTsgfQogICAgaW5saW5lIFQqJiBvdXQo KSB7CiAgICAgIGlmKCBwZF9zZXEgKSB7IGRlbGV0ZSBwZF9zZXE7IHBkX3NlcSA9IDA7IH0KICAg ICAgcmV0dXJuIHBkX3NlcTsKICAgIH0KICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0g cGRfc2VxOyBwZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogIHByaXZhdGU6CiAgICBUKiBwZF9z ZXE7CiAgfTsKCgoKCgogIGNsYXNzIE9iamVjdElkX3ZhcjsKCiAgY2xhc3MgT2JqZWN0SWQgOiBw dWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgewogIHB1YmxpYzoKICAgIHR5 cGVkZWYgT2JqZWN0SWRfdmFyIF92YXJfdHlwZTsKICAgIGlubGluZSBPYmplY3RJZCgpIHt9CiAg ICBpbmxpbmUgT2JqZWN0SWQoY29uc3QgT2JqZWN0SWQmIHNlcSkKICAgICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX19PY3RldChzZXEpIHt9CiAgICBpbmxpbmUgT2JqZWN0SWQoQ09SQkE6 OlVMb25nIG1heCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldChtYXgp IHt9CiAgICBpbmxpbmUgT2JqZWN0SWQoQ09SQkE6OlVMb25nIG1heCwgQ09SQkE6OlVMb25nIGxl biwgQ09SQkE6Ok9jdGV0KiB2YWwsIENPUkJBOjpCb29sZWFuIHJlbD0wKQogICAgICA6IF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KG1heCwgbGVuLCB2YWwsIHJlbCkge30KICAgIGlu bGluZSBPYmplY3RJZCYgb3BlcmF0b3IgPSAoY29uc3QgT2JqZWN0SWQmIHNlcSkgewogICAgICBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldDo6b3BlcmF0b3I9KHNlcSk7CiAgICAgIHJl dHVybiAqdGhpczsKICAgIH0KICB9OwoKICBjbGFzcyBPYmplY3RJZF9vdXQ7CgogIGNsYXNzIE9i amVjdElkX3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBPYmplY3RJZCBUOwogICAgdHlwZWRl ZiBPYmplY3RJZF92YXIgVF92YXI7CgogICAgaW5saW5lIE9iamVjdElkX3ZhcigpIDogcGRfc2Vx KDApIHt9CiAgICBpbmxpbmUgT2JqZWN0SWRfdmFyKFQqIHMpIDogcGRfc2VxKHMpIHt9CiAgICBp bmxpbmUgT2JqZWN0SWRfdmFyKGNvbnN0IFRfdmFyJiBzdikgewogICAgICBpZiggc3YucGRfc2Vx ICkgewogICAgICAgIHBkX3NlcSA9IG5ldyBUOwogICAgICAgICpwZF9zZXEgPSAqc3YucGRfc2Vx OwogICAgICB9IGVsc2UKICAgICAgICBwZF9zZXEgPSAwOwogICAgfQogICAgaW5saW5lIH5PYmpl Y3RJZF92YXIoKSB7IGlmKCBwZF9zZXEgKSBkZWxldGUgcGRfc2VxOyB9CgogICAgaW5saW5lIFRf dmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICAgIGlmKCBwZF9zZXEgKSBkZWxldGUgcGRfc2Vx OwogICAgICBwZF9zZXEgPSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUg VF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzdikgewogICAgICBpZiggc3YucGRfc2Vx ICkgewogICAgICAgIGlmKCAhcGRfc2VxICkgcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgKnBkX3Nl cSA9ICpzdi5wZF9zZXE7CiAgICAgIH0gZWxzZSBpZiggcGRfc2VxICkgewogICAgICAgIGRlbGV0 ZSBwZF9zZXE7CiAgICAgICAgcGRfc2VxID0gMDsKICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CgogICAgaW5saW5lIENPUkJBOjpPY3RldCYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9u ZyBpKSB7IHJldHVybiAoKnBkX3NlcSlbaV07IH0KICAgIGlubGluZSBUKiBvcGVyYXRvciAtPiAo KSB7IHJldHVybiBwZF9zZXE7IH0KCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBj b25zdCB7IHJldHVybiAqcGRfc2VxOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1 cm4gKnBkX3NlcTsgfQoKCiAgICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAq cGRfc2VxOyB9CiAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqcGRfc2VxOyB9CiAgICBp bmxpbmUgVComIG91dCgpIHsgaWYgKHBkX3NlcSkgeyBkZWxldGUgcGRfc2VxOyBwZF9zZXEgPSAw OyB9IHJldHVybiBwZF9zZXE7IH0KICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gcGRf c2VxOyBwZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogICAgZnJpZW5kIGNsYXNzIE9iamVjdElk X291dDsKCiAgcHJpdmF0ZToKICAgIFQqIHBkX3NlcTsKICB9OwoKICBjbGFzcyBPYmplY3RJZF9v dXQgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgT2JqZWN0SWQgVDsKICAgIHR5cGVkZWYgT2JqZWN0 SWRfdmFyIFRfdmFyOwoKICAgIGlubGluZSBPYmplY3RJZF9vdXQoVComIHMpIDogX2RhdGEocykg eyBfZGF0YSA9IDA7IH0KICAgIGlubGluZSBPYmplY3RJZF9vdXQoVF92YXImIHN2KQogICAgICA6 IF9kYXRhKHN2LnBkX3NlcSkgeyBzdiA9IChUKikgMDsgfQogICAgaW5saW5lIE9iamVjdElkX291 dChjb25zdCBPYmplY3RJZF9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkgeyB9CiAgICBpbmxpbmUg T2JqZWN0SWRfb3V0JiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0SWRfb3V0JiBzKSB7IF9kYXRhID0g cy5fZGF0YTsgcmV0dXJuICp0aGlzOyB9CiAgICBpbmxpbmUgT2JqZWN0SWRfb3V0JiBvcGVyYXRv cj0oVCogcykgeyBfZGF0YSA9IHM7IHJldHVybiAqdGhpczsgfQogICAgaW5saW5lIG9wZXJhdG9y IFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9k YXRhOyB9CiAgICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgICBp bmxpbmUgQ09SQkE6Ok9jdGV0JiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkpIHsgcmV0dXJu ICgqX2RhdGEpW2ldOyB9CiAgICBUKiYgX2RhdGE7CgogIHByaXZhdGU6CiAgICBPYmplY3RJZF9v dXQoKTsKICAgIE9iamVjdElkX291dCBvcGVyYXRvcj0oIGNvbnN0IFRfdmFyJik7CiAgfTsKCgoK CgogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPUkJBOjpVTG9uZwogICAgVEhSRUFEX1BP TElDWV9JRCA9IDE2OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6VUxvbmcK ICAgIExJRkVTUEFOX1BPTElDWV9JRCA9IDE3OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBDT1JCQTo6VUxvbmcKICAgIElEX1VOSVFVRU5FU1NfUE9MSUNZX0lEID0gMTg7CgogICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IENPUkJBOjpVTG9uZwogICAgSURfQVNTSUdOTUVOVF9QT0xJ Q1lfSUQgPSAxOTsKCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlVMb25nCiAg ICBJTVBMSUNJVF9BQ1RJVkFUSU9OX1BPTElDWV9JRCA9IDIwOwoKICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBDT1JCQTo6VUxvbmcKICAgIFNFUlZBTlRfUkVURU5USU9OX1BPTElDWV9JRCA9 IDIxOwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6VUxvbmcKICAgIFJFUVVF U1RfUFJPQ0VTU0lOR19QT0xJQ1lfSUQgPSAyMjsKCgogIGVudW0gVGhyZWFkUG9saWN5VmFsdWUg ewogICAgT1JCX0NUUkxfTU9ERUwsCiAgICBTSU5HTEVfVEhSRUFEX01PREVMCiAgfTsKCiAgZW51 bSBMaWZlc3BhblBvbGljeVZhbHVlIHsKICAgIFRSQU5TSUVOVCwKICAgIFBFUlNJU1RFTlQKICB9 OwoKICBlbnVtIElkVW5pcXVlbmVzc1BvbGljeVZhbHVlIHsKICAgIFVOSVFVRV9JRCwKICAgIE1V TFRJUExFX0lECiAgfTsKCiAgZW51bSBJZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZSB7CiAgICBVU0VS X0lELAogICAgU1lTVEVNX0lECiAgfTsKCiAgZW51bSBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lW YWx1ZSB7CiAgICBJTVBMSUNJVF9BQ1RJVkFUSU9OLAogICAgTk9fSU1QTElDSVRfQUNUSVZBVElP TgogIH07CgogIGVudW0gU2VydmFudFJldGVudGlvblBvbGljeVZhbHVlIHsKICAgIFJFVEFJTiwK ICAgIE5PTl9SRVRBSU4KICB9OwoKICBlbnVtIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWUg ewogICAgVVNFX0FDVElWRV9PQkpFQ1RfTUFQX09OTFksCiAgICBVU0VfREVGQVVMVF9TRVJWQU5U LAogICAgVVNFX1NFUlZBTlRfTUFOQUdFUgogIH07CiMgMzcxICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL3BvYS5oIgogIGNsYXNzIFRocmVhZFBvbGljeTsgdHlwZWRlZiBUaHJlYWRQb2xp Y3kqIFRocmVhZFBvbGljeV9wdHI7IHR5cGVkZWYgVGhyZWFkUG9saWN5X3B0ciBUaHJlYWRQb2xp Y3lSZWY7IGNsYXNzIFRocmVhZFBvbGljeSA6IHB1YmxpYyBDT1JCQTo6UG9saWN5IHsgcHVibGlj OiBpbmxpbmUgVGhyZWFkUG9saWN5KFRocmVhZFBvbGljeVZhbHVlIHZhbHVlKSA6IENPUkJBOjpQ b2xpY3koVEhSRUFEX1BPTElDWV9JRCksIHBkX3ZhbHVlKHZhbHVlKSB7fSBpbmxpbmUgVGhyZWFk UG9saWN5KCkge30gdmlydHVhbCB+VGhyZWFkUG9saWN5KCk7IHZpcnR1YWwgQ09SQkE6OlBvbGlj eV9wdHIgY29weSgpOyB2aXJ0dWFsIFRocmVhZFBvbGljeVZhbHVlIHZhbHVlKCkgeyByZXR1cm4g cGRfdmFsdWU7IH0gdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciogcmVwb0lk KTsgc3RhdGljIFRocmVhZFBvbGljeV9wdHIgX2R1cGxpY2F0ZShUaHJlYWRQb2xpY3lfcHRyIHAp OyBzdGF0aWMgVGhyZWFkUG9saWN5X3B0ciBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyIHApOyBz dGF0aWMgVGhyZWFkUG9saWN5X3B0ciBfbmlsKCk7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVw b0lkOyBwcml2YXRlOiBUaHJlYWRQb2xpY3lWYWx1ZSBwZF92YWx1ZTsgfTsgdHlwZWRlZiBfQ09S QkFfUHNldWRvT2JqX1ZhcjxUaHJlYWRQb2xpY3k+IFRocmVhZFBvbGljeV92YXI7CiAgY2xhc3Mg TGlmZXNwYW5Qb2xpY3k7IHR5cGVkZWYgTGlmZXNwYW5Qb2xpY3kqIExpZmVzcGFuUG9saWN5X3B0 cjsgdHlwZWRlZiBMaWZlc3BhblBvbGljeV9wdHIgTGlmZXNwYW5Qb2xpY3lSZWY7IGNsYXNzIExp ZmVzcGFuUG9saWN5IDogcHVibGljIENPUkJBOjpQb2xpY3kgeyBwdWJsaWM6IGlubGluZSBMaWZl c3BhblBvbGljeShMaWZlc3BhblBvbGljeVZhbHVlIHZhbHVlKSA6IENPUkJBOjpQb2xpY3koTElG RVNQQU5fUE9MSUNZX0lEKSwgcGRfdmFsdWUodmFsdWUpIHt9IGlubGluZSBMaWZlc3BhblBvbGlj eSgpIHt9IHZpcnR1YWwgfkxpZmVzcGFuUG9saWN5KCk7IHZpcnR1YWwgQ09SQkE6OlBvbGljeV9w dHIgY29weSgpOyB2aXJ0dWFsIExpZmVzcGFuUG9saWN5VmFsdWUgdmFsdWUoKSB7IHJldHVybiBw ZF92YWx1ZTsgfSB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQp OyBzdGF0aWMgTGlmZXNwYW5Qb2xpY3lfcHRyIF9kdXBsaWNhdGUoTGlmZXNwYW5Qb2xpY3lfcHRy IHApOyBzdGF0aWMgTGlmZXNwYW5Qb2xpY3lfcHRyIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIg cCk7IHN0YXRpYyBMaWZlc3BhblBvbGljeV9wdHIgX25pbCgpOyBzdGF0aWMgY29uc3QgY2hhciog X1BEX3JlcG9JZDsgcHJpdmF0ZTogTGlmZXNwYW5Qb2xpY3lWYWx1ZSBwZF92YWx1ZTsgfTsgdHlw ZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxMaWZlc3BhblBvbGljeT4gTGlmZXNwYW5Qb2xpY3lf dmFyOwogIGNsYXNzIElkVW5pcXVlbmVzc1BvbGljeTsgdHlwZWRlZiBJZFVuaXF1ZW5lc3NQb2xp Y3kqIElkVW5pcXVlbmVzc1BvbGljeV9wdHI7IHR5cGVkZWYgSWRVbmlxdWVuZXNzUG9saWN5X3B0 ciBJZFVuaXF1ZW5lc3NQb2xpY3lSZWY7IGNsYXNzIElkVW5pcXVlbmVzc1BvbGljeSA6IHB1Ymxp YyBDT1JCQTo6UG9saWN5IHsgcHVibGljOiBpbmxpbmUgSWRVbmlxdWVuZXNzUG9saWN5KElkVW5p cXVlbmVzc1BvbGljeVZhbHVlIHZhbHVlKSA6IENPUkJBOjpQb2xpY3koSURfVU5JUVVFTkVTU19Q T0xJQ1lfSUQpLCBwZF92YWx1ZSh2YWx1ZSkge30gaW5saW5lIElkVW5pcXVlbmVzc1BvbGljeSgp IHt9IHZpcnR1YWwgfklkVW5pcXVlbmVzc1BvbGljeSgpOyB2aXJ0dWFsIENPUkJBOjpQb2xpY3lf cHRyIGNvcHkoKTsgdmlydHVhbCBJZFVuaXF1ZW5lc3NQb2xpY3lWYWx1ZSB2YWx1ZSgpIHsgcmV0 dXJuIHBkX3ZhbHVlOyB9IHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJl cG9JZCk7IHN0YXRpYyBJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyIF9kdXBsaWNhdGUoSWRVbmlxdWVu ZXNzUG9saWN5X3B0ciBwKTsgc3RhdGljIElkVW5pcXVlbmVzc1BvbGljeV9wdHIgX25hcnJvdyhD T1JCQTo6T2JqZWN0X3B0ciBwKTsgc3RhdGljIElkVW5pcXVlbmVzc1BvbGljeV9wdHIgX25pbCgp OyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogSWRVbmlxdWVuZXNzUG9s aWN5VmFsdWUgcGRfdmFsdWU7IH07IHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8SWRVbmlx dWVuZXNzUG9saWN5PiBJZFVuaXF1ZW5lc3NQb2xpY3lfdmFyOwogIGNsYXNzIElkQXNzaWdubWVu dFBvbGljeTsgdHlwZWRlZiBJZEFzc2lnbm1lbnRQb2xpY3kqIElkQXNzaWdubWVudFBvbGljeV9w dHI7IHR5cGVkZWYgSWRBc3NpZ25tZW50UG9saWN5X3B0ciBJZEFzc2lnbm1lbnRQb2xpY3lSZWY7 IGNsYXNzIElkQXNzaWdubWVudFBvbGljeSA6IHB1YmxpYyBDT1JCQTo6UG9saWN5IHsgcHVibGlj OiBpbmxpbmUgSWRBc3NpZ25tZW50UG9saWN5KElkQXNzaWdubWVudFBvbGljeVZhbHVlIHZhbHVl KSA6IENPUkJBOjpQb2xpY3koSURfQVNTSUdOTUVOVF9QT0xJQ1lfSUQpLCBwZF92YWx1ZSh2YWx1 ZSkge30gaW5saW5lIElkQXNzaWdubWVudFBvbGljeSgpIHt9IHZpcnR1YWwgfklkQXNzaWdubWVu dFBvbGljeSgpOyB2aXJ0dWFsIENPUkJBOjpQb2xpY3lfcHRyIGNvcHkoKTsgdmlydHVhbCBJZEFz c2lnbm1lbnRQb2xpY3lWYWx1ZSB2YWx1ZSgpIHsgcmV0dXJuIHBkX3ZhbHVlOyB9IHZpcnR1YWwg dm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9JZCk7IHN0YXRpYyBJZEFzc2lnbm1l bnRQb2xpY3lfcHRyIF9kdXBsaWNhdGUoSWRBc3NpZ25tZW50UG9saWN5X3B0ciBwKTsgc3RhdGlj IElkQXNzaWdubWVudFBvbGljeV9wdHIgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0ciBwKTsgc3Rh dGljIElkQXNzaWdubWVudFBvbGljeV9wdHIgX25pbCgpOyBzdGF0aWMgY29uc3QgY2hhciogX1BE X3JlcG9JZDsgcHJpdmF0ZTogSWRBc3NpZ25tZW50UG9saWN5VmFsdWUgcGRfdmFsdWU7IH07IHR5 cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8SWRBc3NpZ25tZW50UG9saWN5PiBJZEFzc2lnbm1l bnRQb2xpY3lfdmFyOwogIGNsYXNzIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeTsgdHlwZWRlZiBJ bXBsaWNpdEFjdGl2YXRpb25Qb2xpY3kqIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeV9wdHI7IHR5 cGVkZWYgSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5X3B0ciBJbXBsaWNpdEFjdGl2YXRpb25Qb2xp Y3lSZWY7IGNsYXNzIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeSA6IHB1YmxpYyBDT1JCQTo6UG9s aWN5IHsgcHVibGljOiBpbmxpbmUgSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5KEltcGxpY2l0QWN0 aXZhdGlvblBvbGljeVZhbHVlIHZhbHVlKSA6IENPUkJBOjpQb2xpY3koSU1QTElDSVRfQUNUSVZB VElPTl9QT0xJQ1lfSUQpLCBwZF92YWx1ZSh2YWx1ZSkge30gaW5saW5lIEltcGxpY2l0QWN0aXZh dGlvblBvbGljeSgpIHt9IHZpcnR1YWwgfkltcGxpY2l0QWN0aXZhdGlvblBvbGljeSgpOyB2aXJ0 dWFsIENPUkJBOjpQb2xpY3lfcHRyIGNvcHkoKTsgdmlydHVhbCBJbXBsaWNpdEFjdGl2YXRpb25Q b2xpY3lWYWx1ZSB2YWx1ZSgpIHsgcmV0dXJuIHBkX3ZhbHVlOyB9IHZpcnR1YWwgdm9pZCogX3B0 clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9JZCk7IHN0YXRpYyBJbXBsaWNpdEFjdGl2YXRpb25Q b2xpY3lfcHRyIF9kdXBsaWNhdGUoSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5X3B0ciBwKTsgc3Rh dGljIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeV9wdHIgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0 ciBwKTsgc3RhdGljIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeV9wdHIgX25pbCgpOyBzdGF0aWMg Y29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5 VmFsdWUgcGRfdmFsdWU7IH07IHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8SW1wbGljaXRB Y3RpdmF0aW9uUG9saWN5PiBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfdmFyOwoKICBjbGFzcyBT ZXJ2YW50UmV0ZW50aW9uUG9saWN5OyB0eXBlZGVmIFNlcnZhbnRSZXRlbnRpb25Qb2xpY3kqIFNl cnZhbnRSZXRlbnRpb25Qb2xpY3lfcHRyOyB0eXBlZGVmIFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lf cHRyIFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lSZWY7IGNsYXNzIFNlcnZhbnRSZXRlbnRpb25Qb2xp Y3kgOiBwdWJsaWMgQ09SQkE6OlBvbGljeSB7IHB1YmxpYzogaW5saW5lIFNlcnZhbnRSZXRlbnRp b25Qb2xpY3koU2VydmFudFJldGVudGlvblBvbGljeVZhbHVlIHZhbHVlKSA6IENPUkJBOjpQb2xp Y3koU0VSVkFOVF9SRVRFTlRJT05fUE9MSUNZX0lEKSwgcGRfdmFsdWUodmFsdWUpIHt9IGlubGlu ZSBTZXJ2YW50UmV0ZW50aW9uUG9saWN5KCkge30gdmlydHVhbCB+U2VydmFudFJldGVudGlvblBv bGljeSgpOyB2aXJ0dWFsIENPUkJBOjpQb2xpY3lfcHRyIGNvcHkoKTsgdmlydHVhbCBTZXJ2YW50 UmV0ZW50aW9uUG9saWN5VmFsdWUgdmFsdWUoKSB7IHJldHVybiBwZF92YWx1ZTsgfSB2aXJ0dWFs IHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOyBzdGF0aWMgU2VydmFudFJl dGVudGlvblBvbGljeV9wdHIgX2R1cGxpY2F0ZShTZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0ciBw KTsgc3RhdGljIFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lfcHRyIF9uYXJyb3coQ09SQkE6Ok9iamVj dF9wdHIgcCk7IHN0YXRpYyBTZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0ciBfbmlsKCk7IHN0YXRp YyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiBTZXJ2YW50UmV0ZW50aW9uUG9saWN5 VmFsdWUgcGRfdmFsdWU7IH07IHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8U2VydmFudFJl dGVudGlvblBvbGljeT4gU2VydmFudFJldGVudGlvblBvbGljeV92YXI7CgogIGNsYXNzIFJlcXVl c3RQcm9jZXNzaW5nUG9saWN5OyB0eXBlZGVmIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5KiBSZXF1 ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHI7IHR5cGVkZWYgUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lf cHRyIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5UmVmOyBjbGFzcyBSZXF1ZXN0UHJvY2Vzc2luZ1Bv bGljeSA6IHB1YmxpYyBDT1JCQTo6UG9saWN5IHsgcHVibGljOiBpbmxpbmUgUmVxdWVzdFByb2Nl c3NpbmdQb2xpY3koUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6 UG9saWN5KFJFUVVFU1RfUFJPQ0VTU0lOR19QT0xJQ1lfSUQpLCBwZF92YWx1ZSh2YWx1ZSkge30g aW5saW5lIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5KCkge30gdmlydHVhbCB+UmVxdWVzdFByb2Nl c3NpbmdQb2xpY3koKTsgdmlydHVhbCBDT1JCQTo6UG9saWN5X3B0ciBjb3B5KCk7IHZpcnR1YWwg UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lWYWx1ZSB2YWx1ZSgpIHsgcmV0dXJuIHBkX3ZhbHVlOyB9 IHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9JZCk7IHN0YXRpYyBS ZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHIgX2R1cGxpY2F0ZShSZXF1ZXN0UHJvY2Vzc2luZ1Bv bGljeV9wdHIgcCk7IHN0YXRpYyBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHIgX25hcnJvdyhD T1JCQTo6T2JqZWN0X3B0ciBwKTsgc3RhdGljIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5X3B0ciBf bmlsKCk7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiBSZXF1ZXN0UHJv Y2Vzc2luZ1BvbGljeVZhbHVlIHBkX3ZhbHVlOyB9OyB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpf VmFyPFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5PiBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV92YXI7 CiMgMzg4ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3BvYS5oIgogIGNsYXNzIFBPQU1h bmFnZXI7CiAgdHlwZWRlZiBQT0FNYW5hZ2VyKiBQT0FNYW5hZ2VyX3B0cjsKICB0eXBlZGVmIFBP QU1hbmFnZXJfcHRyIFBPQU1hbmFnZXJSZWY7CgogIGNsYXNzIFBPQU1hbmFnZXIgOiBwdWJsaWMg Q09SQkE6Ok9iamVjdCB7CiAgcHVibGljOgogICAgY2xhc3MgQWRhcHRlckluYWN0aXZlIDogcHVi bGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQWRhcHRlckluYWN0aXZl KCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5D UCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEFkYXB0ZXJJbmFjdGl2ZShjb25zdCBBZGFw dGVySW5hY3RpdmUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEFkYXB0ZXJJ bmFjdGl2ZSYgb3BlcmF0b3I9KGNvbnN0IEFkYXB0ZXJJbmFjdGl2ZSYgX2V4KSB7ICogKENPUkJB OjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkFk YXB0ZXJJbmFjdGl2ZSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBBZGFwdGVySW5h Y3RpdmUqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBBZGFwdGVy SW5hY3RpdmUqIF9kb3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxp bmUgQWRhcHRlckluYWN0aXZlKiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9leCkgeyByZXR1 cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90 IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZm ZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVk U3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJl YW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHt9IHN0 YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgaW5zZXJ0RXhj ZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9y ZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgp IGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBj b25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBf bWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNo YWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKCiAgICB2aXJ0dWFsIHZvaWQgYWN0aXZh dGUoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgaG9sZF9yZXF1ZXN0cyhDT1JCQTo6Qm9vbGVhbiB3 YWl0X2Zvcl9jb21wbGV0aW9uKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZGlzY2FyZF9yZXF1ZXN0 cyhDT1JCQTo6Qm9vbGVhbiB3YWl0X2Zvcl9jb21wbGV0aW9uKSA9IDA7CiAgICB2aXJ0dWFsIHZv aWQgZGVhY3RpdmF0ZShDT1JCQTo6Qm9vbGVhbiBldGhlcmVhbGl6ZV9vYmplY3RzLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OkJvb2xlYW4gd2FpdF9mb3JfY29tcGxldGlvbikg PSAwOwoKICAgIGVudW0gU3RhdGUgeyBIT0xESU5HLCBBQ1RJVkUsIERJU0NBUkRJTkcsIElOQUNU SVZFIH07CgogICAgdmlydHVhbCBTdGF0ZSBnZXRfc3RhdGUoKSA9IDA7CgoKCiAgICBzdGF0aWMg UE9BTWFuYWdlcl9wdHIgX2R1cGxpY2F0ZShQT0FNYW5hZ2VyX3B0cik7CiAgICBzdGF0aWMgUE9B TWFuYWdlcl9wdHIgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgICBzdGF0aWMgUE9BTWFu YWdlcl9wdHIgX25pbCgpOwoKCiAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCiAg cHJvdGVjdGVkOgogICAgaW5saW5lIFBPQU1hbmFnZXIoaW50IGlzX25pbCA9IDApIHsKICAgICAg X1BSX3NldG9iaigob21uaU9ialJlZiopIChpc19uaWwgPyAwOjEpKTsKICAgIH0KICAgIHZpcnR1 YWwgflBPQU1hbmFnZXIoKTsKCiAgcHJpdmF0ZToKICAgIFBPQU1hbmFnZXIoY29uc3QgUE9BTWFu YWdlciYpOwogICAgUE9BTWFuYWdlciYgb3BlcmF0b3I9KGNvbnN0IFBPQU1hbmFnZXImKTsKICB9 OwoKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFBPQU1hbmFnZXI+IFBPQU1hbmFnZXJf dmFyOwoKCgoKCiAgY2xhc3MgX29ianJlZl9BZGFwdGVyQWN0aXZhdG9yOwogIGNsYXNzIF9vYmpy ZWZfU2VydmFudE1hbmFnZXI7CgoKICBjbGFzcyBQT0EgOiBwdWJsaWMgQ09SQkE6Ok9iamVjdCB7 CiAgcHVibGljOgoKICAgIHR5cGVkZWYgUE9BKiBfcHRyX3R5cGU7CiAgICB0eXBlZGVmIF9DT1JC QV9Qc2V1ZG9PYmpfVmFyPFBPQT4gX3Zhcl90eXBlOwoKCgogICAgY2xhc3MgQWRhcHRlckFscmVh ZHlFeGlzdHMgOiBwdWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBB ZGFwdGVyQWxyZWFkeUV4aXN0cygpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47 IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBBZGFwdGVy QWxyZWFkeUV4aXN0cyhjb25zdCBBZGFwdGVyQWxyZWFkeUV4aXN0cyYgX2V4KSA6IFVzZXJFeGNl cHRpb24oX2V4KSB7fSBpbmxpbmUgQWRhcHRlckFscmVhZHlFeGlzdHMmIG9wZXJhdG9yPShjb25z dCBBZGFwdGVyQWxyZWFkeUV4aXN0cyYgX2V4KSB7ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikg dGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkFkYXB0ZXJBbHJlYWR5RXhpc3Rz KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEFkYXB0ZXJBbHJlYWR5RXhpc3RzKiBf ZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQWRhcHRlckFscmVhZHlF eGlzdHMqIF9kb3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUg QWRhcHRlckFscmVhZHlFeGlzdHMqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJl dHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXpl X3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVy ZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0 cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30g c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRF eGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BE X3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRl KCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFy c2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgQWRhcHRlckluYWN0 aXZlIDogcHVibGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQWRhcHRl ckluYWN0aXZlKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0 VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEFkYXB0ZXJJbmFjdGl2ZShj b25zdCBBZGFwdGVySW5hY3RpdmUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5l IEFkYXB0ZXJJbmFjdGl2ZSYgb3BlcmF0b3I9KGNvbnN0IEFkYXB0ZXJJbmFjdGl2ZSYgX2V4KSB7 ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZp cnR1YWwgfkFkYXB0ZXJJbmFjdGl2ZSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBB ZGFwdGVySW5hY3RpdmUqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBjb25z dCBBZGFwdGVySW5hY3RpdmUqIF9kb3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0 YXRpYyBpbmxpbmUgQWRhcHRlckluYWN0aXZlKiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9l eCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNp emUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+ PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVm ZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVh bSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMg aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNo YXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwg dm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKICAgIGNsYXNzIEFkYXB0 ZXJOb25FeGlzdGVudCA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5s aW5lIEFkYXB0ZXJOb25FeGlzdGVudCgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55 Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBBZGFw dGVyTm9uRXhpc3RlbnQoY29uc3QgQWRhcHRlck5vbkV4aXN0ZW50JiBfZXgpIDogVXNlckV4Y2Vw dGlvbihfZXgpIHt9IGlubGluZSBBZGFwdGVyTm9uRXhpc3RlbnQmIG9wZXJhdG9yPShjb25zdCBB ZGFwdGVyTm9uRXhpc3RlbnQmIF9leCkgeyAqIChDT1JCQTo6VXNlckV4Y2VwdGlvbiopIHRoaXMg PSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5BZGFwdGVyTm9uRXhpc3RlbnQoKTsgdmly dHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgQWRhcHRlck5vbkV4aXN0ZW50KiBfZG93bmNhc3Qo Q09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQWRhcHRlck5vbkV4aXN0ZW50KiBfZG93 bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEFkYXB0ZXJOb25F eGlzdGVudCogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2Fz dChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3Qg eyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0m KSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNv bnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5s aW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0 RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55 TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2 YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmly dHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciog X05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0 QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZl cmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBOb1NlcnZhbnQgOiBwdWJsaWMgQ09SQkE6 OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBOb1NlcnZhbnQoKSB7IHBkX2luc2VydFRv QW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlG bk5DUDsgfSBpbmxpbmUgTm9TZXJ2YW50KGNvbnN0IE5vU2VydmFudCYgX2V4KSA6IFVzZXJFeGNl cHRpb24oX2V4KSB7fSBpbmxpbmUgTm9TZXJ2YW50JiBvcGVyYXRvcj0oY29uc3QgTm9TZXJ2YW50 JiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRo aXM7IH0gdmlydHVhbCB+Tm9TZXJ2YW50KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGlj IE5vU2VydmFudCogX2Rvd25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE5v U2VydmFudCogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGlu ZSBOb1NlcnZhbnQqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93 bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNv bnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3Ry ZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0m KSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9 IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGlu c2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25U b0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsg cHJpdmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFs KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1C dWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgT2JqZWN0QWxyZWFkeUFjdGl2ZSA6 IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE9iamVjdEFscmVh ZHlBY3RpdmUoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRU b0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgT2JqZWN0QWxyZWFkeUFjdGl2 ZShjb25zdCBPYmplY3RBbHJlYWR5QWN0aXZlJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9 IGlubGluZSBPYmplY3RBbHJlYWR5QWN0aXZlJiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0QWxyZWFk eUFjdGl2ZSYgX2V4KSB7ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0 dXJuICp0aGlzOyB9IHZpcnR1YWwgfk9iamVjdEFscmVhZHlBY3RpdmUoKTsgdmlydHVhbCB2b2lk IF9yYWlzZSgpOyBzdGF0aWMgT2JqZWN0QWxyZWFkeUFjdGl2ZSogX2Rvd25jYXN0KENPUkJBOjpF eGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE9iamVjdEFscmVhZHlBY3RpdmUqIF9kb3duY2FzdChj b25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgT2JqZWN0QWxyZWFkeUFjdGl2 ZSogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgp OyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1 cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25z dCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9 IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZv aWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGlu c2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2 aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBj b25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3Jl cG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVy ZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3Ry ZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBPYmplY3ROb3RBY3RpdmUgOiBwdWJsaWMgQ09SQkE6 OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBPYmplY3ROb3RBY3RpdmUoKSB7IHBkX2lu c2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0 VG9BbnlGbk5DUDsgfSBpbmxpbmUgT2JqZWN0Tm90QWN0aXZlKGNvbnN0IE9iamVjdE5vdEFjdGl2 ZSYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgT2JqZWN0Tm90QWN0aXZlJiBv cGVyYXRvcj0oY29uc3QgT2JqZWN0Tm90QWN0aXZlJiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNl cHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+T2JqZWN0Tm90QWN0 aXZlKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIE9iamVjdE5vdEFjdGl2ZSogX2Rv d25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE9iamVjdE5vdEFjdGl2ZSog X2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBPYmplY3RO b3RBY3RpdmUqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNh c3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0 IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFt JikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBj b25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlu bGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2Vy dEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0Fu eU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJp dmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5l dEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZm ZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgU2VydmFudEFscmVhZHlBY3RpdmUgOiBw dWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBTZXJ2YW50QWxyZWFk eUFjdGl2ZSgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRv QW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBTZXJ2YW50QWxyZWFkeUFjdGl2 ZShjb25zdCBTZXJ2YW50QWxyZWFkeUFjdGl2ZSYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7 fSBpbmxpbmUgU2VydmFudEFscmVhZHlBY3RpdmUmIG9wZXJhdG9yPShjb25zdCBTZXJ2YW50QWxy ZWFkeUFjdGl2ZSYgX2V4KSB7ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsg cmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgflNlcnZhbnRBbHJlYWR5QWN0aXZlKCk7IHZpcnR1YWwg dm9pZCBfcmFpc2UoKTsgc3RhdGljIFNlcnZhbnRBbHJlYWR5QWN0aXZlKiBfZG93bmNhc3QoQ09S QkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgU2VydmFudEFscmVhZHlBY3RpdmUqIF9kb3du Y2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgU2VydmFudEFscmVh ZHlBY3RpdmUqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNh c3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0 IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFt JikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBj b25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlu bGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2Vy dEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0Fu eU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJp dmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5l dEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZm ZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgU2VydmFudE5vdEFjdGl2ZSA6IHB1Ymxp YyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFNlcnZhbnROb3RBY3RpdmUo KSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQ ID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgU2VydmFudE5vdEFjdGl2ZShjb25zdCBTZXJ2 YW50Tm90QWN0aXZlJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBTZXJ2YW50 Tm90QWN0aXZlJiBvcGVyYXRvcj0oY29uc3QgU2VydmFudE5vdEFjdGl2ZSYgX2V4KSB7ICogKENP UkJBOjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwg flNlcnZhbnROb3RBY3RpdmUoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgU2VydmFu dE5vdEFjdGl2ZSogX2Rvd25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IFNl cnZhbnROb3RBY3RpdmUqIF9kb3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRp YyBpbmxpbmUgU2VydmFudE5vdEFjdGl2ZSogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgp IHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXpl KHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0o TmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1C dWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZl cmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0m KSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGlu c2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFy KiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBs aWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZv aWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBXcm9uZ0Fk YXB0ZXIgOiBwdWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBXcm9u Z0FkYXB0ZXIoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRU b0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgV3JvbmdBZGFwdGVyKGNvbnN0 IFdyb25nQWRhcHRlciYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgV3JvbmdB ZGFwdGVyJiBvcGVyYXRvcj0oY29uc3QgV3JvbmdBZGFwdGVyJiBfZXgpIHsgKiAoQ09SQkE6OlVz ZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+V3JvbmdB ZGFwdGVyKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIFdyb25nQWRhcHRlciogX2Rv d25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IFdyb25nQWRhcHRlciogX2Rv d25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBXcm9uZ0FkYXB0 ZXIqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4 KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0 dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29u c3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7 fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2 b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2Vw dGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBp bnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTog dmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwg Y29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9y ZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZl cmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0 cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgV3JvbmdQb2xpY3kgOiBwdWJsaWMgQ09SQkE6OlVz ZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBXcm9uZ1BvbGljeSgpIHsgcGRfaW5zZXJ0VG9B bnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZu TkNQOyB9IGlubGluZSBXcm9uZ1BvbGljeShjb25zdCBXcm9uZ1BvbGljeSYgX2V4KSA6IFVzZXJF eGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgV3JvbmdQb2xpY3kmIG9wZXJhdG9yPShjb25zdCBXcm9u Z1BvbGljeSYgX2V4KSB7ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0 dXJuICp0aGlzOyB9IHZpcnR1YWwgfldyb25nUG9saWN5KCk7IHZpcnR1YWwgdm9pZCBfcmFpc2Uo KTsgc3RhdGljIFdyb25nUG9saWN5KiBfZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0 aWMgY29uc3QgV3JvbmdQb2xpY3kqIF9kb3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7 IHN0YXRpYyBpbmxpbmUgV3JvbmdQb2xpY3kqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4 KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6 ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49 KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVt QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZm ZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFt Jikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBp bnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hh ciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVw bGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2 b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBf TlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwoKICAgIGNsYXNzIEludmFs aWRQb2xpY3kgOiBwdWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24gewogICAgcHVibGljOgogICAg ICBDT1JCQTo6VVNob3J0IGluZGV4OwoKICAgICAgaW5saW5lIEludmFsaWRQb2xpY3koKSB7CiAg ICAgICAgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47CiAgICAgICAgcGRfaW5zZXJ0 VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7CiAgICAgIH0KICAgICAgSW52YWxpZFBvbGlj eShjb25zdCBJbnZhbGlkUG9saWN5Jik7CiAgICAgIEludmFsaWRQb2xpY3koQ09SQkE6OlVTaG9y dCBpX2luZGV4KTsKICAgICAgSW52YWxpZFBvbGljeSYgb3BlcmF0b3I9KGNvbnN0IEludmFsaWRQ b2xpY3kmKTsKICAgICAgdmlydHVhbCB+SW52YWxpZFBvbGljeSgpOwogICAgICB2aXJ0dWFsIHZv aWQgX3JhaXNlKCk7CiAgICAgIHN0YXRpYyBJbnZhbGlkUG9saWN5KiBfZG93bmNhc3QoQ09SQkE6 OkV4Y2VwdGlvbiopOwogICAgICBzdGF0aWMgY29uc3QgSW52YWxpZFBvbGljeSogX2Rvd25jYXN0 KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsKICAgICAgc3RhdGljIGlubGluZSBJbnZhbGlkUG9s aWN5KiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIGUpIHsKICAgICAgICByZXR1cm4gX2Rvd25j YXN0KGUpOwogICAgICB9CgogICAgICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCkgY29u c3Q7CiAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAg ICAgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgICB2b2lk IG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgICAgIHZvaWQgb3BlcmF0b3I8PD0o TWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgICAgIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBp bnNlcnRUb0FueUZuOwogICAgICBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0 VG9BbnlGbk5DUDsKCiAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKICAgIHBy aXZhdGU6CiAgICAgIHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNv bnN0OwogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsKICAgICAg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCopIGNvbnN0OwogICAgICB2aXJ0dWFs IHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgICAgdmlydHVh bCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgICB9OwoKCgog ICAgdmlydHVhbCBQT0FfcHRyIGNyZWF0ZV9QT0EoY29uc3QgY2hhciogYWRhcHRlcl9uYW1lLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9BTWFuYWdlcl9wdHIgYV9QT0FNYW5hZ2Vy LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlBvbGljeUxpc3Qm IHBvbGljaWVzKSA9IDA7CgogICAgdmlydHVhbCBQT0FfcHRyIGZpbmRfUE9BKGNvbnN0IGNoYXIq IGFkYXB0ZXJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JCQTo6Qm9vbGVh biBhY3RpdmF0ZV9pdCkgPSAwOwoKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KENPUkJBOjpCb29s ZWFuIGV0aGVyZWFsaXplX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBDT1JCQTo6 Qm9vbGVhbiB3YWl0X2Zvcl9jb21wbGV0aW9uKSA9IDA7CgoKCiAgICB2aXJ0dWFsIFRocmVhZFBv bGljeV9wdHIKICAgICAgY3JlYXRlX3RocmVhZF9wb2xpY3koVGhyZWFkUG9saWN5VmFsdWUgdik7 CiAgICB2aXJ0dWFsIExpZmVzcGFuUG9saWN5X3B0cgogICAgICBjcmVhdGVfbGlmZXNwYW5fcG9s aWN5KExpZmVzcGFuUG9saWN5VmFsdWUgdik7CiAgICB2aXJ0dWFsIElkVW5pcXVlbmVzc1BvbGlj eV9wdHIKICAgICAgY3JlYXRlX2lkX3VuaXF1ZW5lc3NfcG9saWN5KElkVW5pcXVlbmVzc1BvbGlj eVZhbHVlIHYpOwogICAgdmlydHVhbCBJZEFzc2lnbm1lbnRQb2xpY3lfcHRyCiAgICAgIGNyZWF0 ZV9pZF9hc3NpZ25tZW50X3BvbGljeShJZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZSB2KTsKICAgIHZp cnR1YWwgSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5X3B0cgogICAgICBjcmVhdGVfaW1wbGljaXRf YWN0aXZhdGlvbl9wb2xpY3koSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5VmFsdWUgdik7CiAgICB2 aXJ0dWFsIFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lfcHRyCiAgICAgIGNyZWF0ZV9zZXJ2YW50X3Jl dGVudGlvbl9wb2xpY3koU2VydmFudFJldGVudGlvblBvbGljeVZhbHVlIHYpOwogICAgdmlydHVh bCBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHIKICAgICAgY3JlYXRlX3JlcXVlc3RfcHJvY2Vz c2luZ19wb2xpY3koUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lWYWx1ZSB2KTsKCgoKICAgIHZpcnR1 YWwgY2hhciogdGhlX25hbWUoKSA9IDA7CiAgICB2aXJ0dWFsIFBPQV9wdHIgdGhlX3BhcmVudCgp ID0gMDsKICAgIHZpcnR1YWwgUE9BTGlzdCogdGhlX2NoaWxkcmVuKCkgPSAwOwogICAgdmlydHVh bCBQT0FNYW5hZ2VyX3B0ciB0aGVfUE9BTWFuYWdlcigpID0gMDsKICAgIHZpcnR1YWwgX29ianJl Zl9BZGFwdGVyQWN0aXZhdG9yKiB0aGVfYWN0aXZhdG9yKCkgPSAwOwogICAgdmlydHVhbCB2b2lk IHRoZV9hY3RpdmF0b3IoX29ianJlZl9BZGFwdGVyQWN0aXZhdG9yKiBhYSkgPSAwOwoKCgogICAg dmlydHVhbCBfb2JqcmVmX1NlcnZhbnRNYW5hZ2VyKiBnZXRfc2VydmFudF9tYW5hZ2VyKCkgPSAw OwogICAgdmlydHVhbCB2b2lkIHNldF9zZXJ2YW50X21hbmFnZXIoX29ianJlZl9TZXJ2YW50TWFu YWdlciogaW1ncikgPSAwOwoKCgogICAgdmlydHVhbCBTZXJ2YW50IGdldF9zZXJ2YW50KCkgPSAw OwogICAgdmlydHVhbCB2b2lkIHNldF9zZXJ2YW50KFNlcnZhbnQgcF9zZXJ2YW50KSA9IDA7CgoK CiAgICB2aXJ0dWFsIE9iamVjdElkKiBhY3RpdmF0ZV9vYmplY3QoU2VydmFudCBwX3NlcnZhbnQp ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBhY3RpdmF0ZV9vYmplY3Rfd2l0aF9pZChjb25zdCBPYmpl Y3RJZCYgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmFu dCBwX3NlcnZhbnQpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkZWFjdGl2YXRlX29iamVjdChjb25z dCBPYmplY3RJZCYgb2lkKSA9IDA7CgoKCiAgICB2aXJ0dWFsIENPUkJBOjpPYmplY3RfcHRyIGNy ZWF0ZV9yZWZlcmVuY2UoY29uc3QgY2hhciogaW50ZikgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6 T2JqZWN0X3B0ciBjcmVhdGVfcmVmZXJlbmNlX3dpdGhfaWQoY29uc3QgT2JqZWN0SWQmIG9pZCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy KiBpbnRmKSA9IDA7CgoKCiAgICB2aXJ0dWFsIE9iamVjdElkKiBzZXJ2YW50X3RvX2lkKFNlcnZh bnQgcF9zZXJ2YW50KSA9IDA7CiAgICB2aXJ0dWFsIENPUkJBOjpPYmplY3RfcHRyIHNlcnZhbnRf dG9fcmVmZXJlbmNlKFNlcnZhbnQgcF9zZXJ2YW50KSA9IDA7CiAgICB2aXJ0dWFsIFNlcnZhbnQg cmVmZXJlbmNlX3RvX3NlcnZhbnQoQ09SQkE6Ok9iamVjdF9wdHIgcmVmZXJlbmNlKSA9IDA7CiAg ICB2aXJ0dWFsIE9iamVjdElkKiByZWZlcmVuY2VfdG9faWQoQ09SQkE6Ok9iamVjdF9wdHIgcmVm ZXJlbmNlKSA9IDA7CiAgICB2aXJ0dWFsIFNlcnZhbnQgaWRfdG9fc2VydmFudChjb25zdCBPYmpl Y3RJZCYgb2lkKSA9IDA7CiAgICB2aXJ0dWFsIENPUkJBOjpPYmplY3RfcHRyIGlkX3RvX3JlZmVy ZW5jZShjb25zdCBPYmplY3RJZCYgb2lkKSA9IDA7CgoKCgoKICAgIHN0YXRpYyBQT0FfcHRyIF9k dXBsaWNhdGUoUE9BX3B0cik7CiAgICBzdGF0aWMgUE9BX3B0ciBfbmFycm93KENPUkJBOjpPYmpl Y3RfcHRyKTsKICAgIHN0YXRpYyBQT0FfcHRyIF9uaWwoKTsKCgogICAgc3RhdGljIGNvbnN0IGNo YXIqIF9QRF9yZXBvSWQ7CiAgICBzdGF0aWMgUE9BX3B0ciBfdGhlX3Jvb3RfcG9hKCk7CgogIHBy b3RlY3RlZDoKICAgIGlubGluZSBQT0EoaW50IG5pbCkgeyBfUFJfc2V0b2JqKChvbW5pT2JqUmVm KikgKG5pbCA/IDA6MSkpOyB9CiAgICB2aXJ0dWFsIH5QT0EoKTsKCiAgcHJpdmF0ZToKICAgIFBP QShjb25zdCBQT0EmKTsKICAgIFBPQSYgb3BlcmF0b3I9KGNvbnN0IFBPQSYpOwogIH07CgogIHR5 cGVkZWYgUE9BOjpfdmFyX3R5cGUgUE9BX3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpf TWVtYmVyPFBPQSwgUE9BX3Zhcj4gUE9BX21lbWJlcjsKIyA2MTkgIi4uLy4uLy4uLy4uL2luY2x1 ZGUvb21uaU9SQjMvcG9hLmgiCiAgY2xhc3MgU2VydmFudEJhc2UgOiBwdWJsaWMgdmlydHVhbCBv bW5pU2VydmFudCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+U2VydmFudEJhc2UoKTsKCiAgICB2 aXJ0dWFsIFBPQV9wdHIgX2RlZmF1bHRfUE9BKCk7CgoKCgogICAgdmlydHVhbCBDT1JCQTo6X29i anJlZl9JbnRlcmZhY2VEZWYqIF9nZXRfaW50ZXJmYWNlKCk7CiMgNjQxICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL3BvYS5oIgogICAgdmlydHVhbCB2b2lkIF9hZGRfcmVmKCk7CiAgICB2 aXJ0dWFsIHZvaWQgX3JlbW92ZV9yZWYoKTsKCiAgcHJvdGVjdGVkOgogICAgaW5saW5lIFNlcnZh bnRCYXNlKCkge30KICAgIGlubGluZSBTZXJ2YW50QmFzZShjb25zdCBTZXJ2YW50QmFzZSYpIHt9 CiAgICBpbmxpbmUgU2VydmFudEJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IFNlcnZhbnRCYXNlJikg eyByZXR1cm4gKnRoaXM7IH0KCiAgICB2b2lkKiBfZG9fdGhpcyhjb25zdCBjaGFyKiByZXBvSWQp OwoKICBwcml2YXRlOgogICAgdmlydHVhbCBvbW5pT2JqUmVmKiBfZG9fZ2V0X2ludGVyZmFjZSgp OwogICAgdmlydHVhbCB2b2lkKiBfZG93bmNhc3QoKTsKCiAgfTsKCgoKCgogIGNsYXNzIFJlZkNv dW50U2VydmFudEJhc2UgOiBwdWJsaWMgdmlydHVhbCBTZXJ2YW50QmFzZSB7CiAgcHVibGljOgog ICAgdmlydHVhbCB+UmVmQ291bnRTZXJ2YW50QmFzZSgpOwoKICAgIHZpcnR1YWwgdm9pZCBfYWRk X3JlZigpOwogICAgdmlydHVhbCB2b2lkIF9yZW1vdmVfcmVmKCk7CgogIHByb3RlY3RlZDoKICAg IGlubGluZSBSZWZDb3VudFNlcnZhbnRCYXNlKCkgOiBwZF9yZWZDb3VudCgxKSB7fQogICAgaW5s aW5lIFJlZkNvdW50U2VydmFudEJhc2UoY29uc3QgUmVmQ291bnRTZXJ2YW50QmFzZSYpIDogcGRf cmVmQ291bnQoMSkge30KICAgIGlubGluZSBSZWZDb3VudFNlcnZhbnRCYXNlJiBvcGVyYXRvciA9 IChjb25zdCBSZWZDb3VudFNlcnZhbnRCYXNlJikKICAgICAgeyByZXR1cm4gKnRoaXM7IH0KCiAg cHJpdmF0ZToKICAgIGludCBwZF9yZWZDb3VudDsKICB9OwoKCgoKCiAgY2xhc3MgU2VydmFudEJh c2VfdmFyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFNlcnZhbnRCYXNlKiBUX3B0cjsKICAgIHR5 cGVkZWYgU2VydmFudEJhc2VfdmFyIFRfdmFyOwoKICAgIGlubGluZSBTZXJ2YW50QmFzZV92YXIo KSA6IHBkX2RhdGEoMCkge30KICAgIGlubGluZSBTZXJ2YW50QmFzZV92YXIoVF9wdHIgcCkgOiBw ZF9kYXRhKHApIHt9CiAgICBpbmxpbmUgU2VydmFudEJhc2VfdmFyKGNvbnN0IFRfdmFyJiB2KSA6 IHBkX2RhdGEodi5wZF9kYXRhKQogICAgICB7IGlmKCBwZF9kYXRhICkgcGRfZGF0YS0+X2FkZF9y ZWYoKTsgfQoKICAgIGlubGluZSB+U2VydmFudEJhc2VfdmFyKCkgeyBpZiggcGRfZGF0YSApIHBk X2RhdGEtPl9yZW1vdmVfcmVmKCk7IH0KCiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFRf cHRyIHApIHsKICAgICAgaWYoIHBkX2RhdGEgKSBwZF9kYXRhLT5fcmVtb3ZlX3JlZigpOwogICAg ICBwZF9kYXRhID0gcDsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgaW5saW5lIFRfdmFy JiBvcGVyYXRvciA9IChUX3ZhciB2KSB7CiAgICAgIGlmKCBwZF9kYXRhICkgcGRfZGF0YS0+X3Jl bW92ZV9yZWYoKTsKICAgICAgaWYoIChwZF9kYXRhID0gdi5wZF9kYXRhKSApIHBkX2RhdGEtPl9h ZGRfcmVmKCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBpbmxpbmUgb3BlcmF0b3Ig VF9wdHIgKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQogICAgaW5saW5lIFRfcHRyIG9wZXJh dG9yIC0+ICgpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KCiAgICBpbmxpbmUgVF9wdHIgaW4o KSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyBy ZXR1cm4gcGRfZGF0YTsgfQogICAgaW5saW5lIFRfcHRyJiBvdXQoKSB7CiAgICAgIGlmKCBwZF9k YXRhICkgeyBwZF9kYXRhLT5fcmVtb3ZlX3JlZigpOyBwZF9kYXRhID0gMDsgfQogICAgICByZXR1 cm4gcGRfZGF0YTsKICAgIH0KICAgIGlubGluZSBUX3B0ciBfcmV0bigpIHsgVF9wdHIgdG1wID0g cGRfZGF0YTsgcGRfZGF0YSA9IDA7IHJldHVybiB0bXA7IH0KCiAgcHJpdmF0ZToKICAgIFRfcHRy IHBkX2RhdGE7CiAgfTsKCgoKCgogIGNsYXNzIER5bmFtaWNJbXBsZW1lbnRhdGlvbiA6IHB1Ymxp YyB2aXJ0dWFsIFNlcnZhbnRCYXNlIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5EeW5hbWljSW1w bGVtZW50YXRpb24oKTsKCiAgICBDT1JCQTo6T2JqZWN0X3B0ciBfdGhpcygpOwoKICAgIHZpcnR1 YWwgdm9pZCBpbnZva2UoQ09SQkE6OlNlcnZlclJlcXVlc3RfcHRyIHJlcXVlc3QpID0gMDsKICAg IHZpcnR1YWwgY2hhciogX3ByaW1hcnlfaW50ZXJmYWNlKGNvbnN0IE9iamVjdElkJiBvaWQsIFBP QV9wdHIgcG9hKSA9IDA7CgoKICAgIHZpcnR1YWwgQ09SQkE6OkJvb2xlYW4gX2lzX2EoY29uc3Qg Y2hhciogbG9naWNhbF90eXBlX2lkKTsKCgoKCiAgICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9k aXNwYXRjaChHSU9QX1MmKTsKCgoKICBwcml2YXRlOgogICAgdmlydHVhbCBvbW5pT2JqUmVmKiBf ZG9fZ2V0X2ludGVyZmFjZSgpOwogIH07CgoKCgoKICAgICAgICAgICAgICAgICAgIGNoYXIqIE9i amVjdElkX3RvX3N0cmluZyhjb25zdCBPYmplY3RJZCYgaWQpOwogICAgICAgICAgICAgICAgICAg T2JqZWN0SWQqIHN0cmluZ190b19PYmplY3RJZChjb25zdCBjaGFyKiBzKTsKCgojIDEgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcG9hX2RlZnMuaCIgMQojIDYyICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL3BvYV9kZWZzLmgiCmNsYXNzIEZvcndhcmRSZXF1ZXN0IDogcHVibGlj IENPUkJBOjpVc2VyRXhjZXB0aW9uIHsKcHVibGljOgogIENPUkJBOjpPYmplY3RfTWVtYmVyIGZv cndhcmRfcmVmZXJlbmNlOwoKICBpbmxpbmUgRm9yd2FyZFJlcXVlc3QoKSB7CiAgICBwZF9pbnNl cnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsKICAgIHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNl cnRUb0FueUZuTkNQOwogIH0KICBGb3J3YXJkUmVxdWVzdChjb25zdCBGb3J3YXJkUmVxdWVzdCYp OwogIEZvcndhcmRSZXF1ZXN0KENPUkJBOjpPYmplY3RfcHRyIGlfZm9yd2FyZF9yZWZlcmVuY2Up OwogIEZvcndhcmRSZXF1ZXN0JiBvcGVyYXRvcj0oY29uc3QgRm9yd2FyZFJlcXVlc3QmKTsKICB2 aXJ0dWFsIH5Gb3J3YXJkUmVxdWVzdCgpOwogIHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsKICBzdGF0 aWMgRm9yd2FyZFJlcXVlc3QqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7CiAgc3RhdGlj IGNvbnN0IEZvcndhcmRSZXF1ZXN0KiBfZG93bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiop OwogIHN0YXRpYyBpbmxpbmUgRm9yd2FyZFJlcXVlc3QqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlv biogZSkgewogICAgcmV0dXJuIF9kb3duY2FzdChlKTsKICB9CgogIHNpemVfdCBfTlBfYWxpZ25l ZFNpemUoc2l6ZV90KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFt JikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0Owog IHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKTsKICB2b2lkIG9wZXJhdG9yPDw9 KE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNl cnRUb0FueUZuOwogIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZu TkNQOwoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCnByaXZhdGU6CiAgdmlydHVh bCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7CiAgdmlydHVhbCBjb25z dCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVw b0lkKGludCopIGNvbnN0OwogIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0 cmVhbSYpIGNvbnN0OwogIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVh bSYpIGNvbnN0Owp9OwoKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Gb3J3 YXJkUmVxdWVzdDsKIyAxMTAgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcG9hX2RlZnMu aCIKY2xhc3MgX29ianJlZl9BZGFwdGVyQWN0aXZhdG9yOwp0eXBlZGVmIF9vYmpyZWZfQWRhcHRl ckFjdGl2YXRvciogQWRhcHRlckFjdGl2YXRvcl9wdHI7CnR5cGVkZWYgQWRhcHRlckFjdGl2YXRv cl9wdHIgQWRhcHRlckFjdGl2YXRvclJlZjsKCmNsYXNzIEFkYXB0ZXJBY3RpdmF0b3JfSGVscGVy IHsKcHVibGljOgogIHR5cGVkZWYgQWRhcHRlckFjdGl2YXRvcl9wdHIgX3B0cl90eXBlOwoKICBz dGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICBzdGF0aWMgX0NPUkJBX0Jvb2xlYW4gaXNfbmlsKF9w dHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgcmVsZWFzZShfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lk IGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0 cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBO ZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5l dEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUs IE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYo TWVtQnVmZmVyZWRTdHJlYW0mKTsKfTsKCnR5cGVkZWYgX0NPUkJBX09ialJlZl9WYXI8X29ianJl Zl9BZGFwdGVyQWN0aXZhdG9yLCBBZGFwdGVyQWN0aXZhdG9yX0hlbHBlcj4gQWRhcHRlckFjdGl2 YXRvcl92YXI7CnR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfQWRhcHRlckFj dGl2YXRvcixBZGFwdGVyQWN0aXZhdG9yX0hlbHBlciA+IEFkYXB0ZXJBY3RpdmF0b3Jfb3V0OwoK CgoKY2xhc3MgQWRhcHRlckFjdGl2YXRvciB7CnB1YmxpYzoKCiAgdHlwZWRlZiBBZGFwdGVyQWN0 aXZhdG9yX3B0ciBfcHRyX3R5cGU7CiAgdHlwZWRlZiBBZGFwdGVyQWN0aXZhdG9yX3ZhciBfdmFy X3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRp YyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlw ZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUs IHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYo X3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlw ZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2Jq ZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAg X3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7 CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFy c2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIg b2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlw ZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0 dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgp9OwoK CmNsYXNzIF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvciA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6 Ok9iamVjdCwgcHVibGljIHZpcnR1YWwgb21uaU9ialJlZgp7CnB1YmxpYzoKICBDT1JCQTo6Qm9v bGVhbiB1bmtub3duX2FkYXB0ZXIoUE9BX3B0ciBwYXJlbnQsIGNvbnN0IGNoYXIqIG5hbWUpOwoK ICBpbmxpbmUgX29ianJlZl9BZGFwdGVyQWN0aXZhdG9yKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAg X29ianJlZl9BZGFwdGVyQWN0aXZhdG9yKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVM aXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2 aXJ0dWFsIH5fb2JqcmVmX0FkYXB0ZXJBY3RpdmF0b3IoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2 b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX0FkYXB0ZXJBY3RpdmF0 b3IoY29uc3QgX29ianJlZl9BZGFwdGVyQWN0aXZhdG9yJik7CiAgX29ianJlZl9BZGFwdGVyQWN0 aXZhdG9yJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0FkYXB0ZXJBY3RpdmF0b3ImKTsKCn07 CgoKY2xhc3MgX3BvZl9BZGFwdGVyQWN0aXZhdG9yIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9y eSB7CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9BZGFwdGVyQWN0aXZhdG9yKCkgOiBwcm94eU9iamVj dEZhY3RvcnkoQWRhcHRlckFjdGl2YXRvcjo6X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9m X0FkYXB0ZXJBY3RpdmF0b3IoKTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29u c3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBf Q09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCgpjbGFzcyBfaW1wbF9B ZGFwdGVyQWN0aXZhdG9yIDoKICBwdWJsaWMgdmlydHVhbCBvbW5pU2VydmFudAp7CnB1YmxpYzoK ICB2aXJ0dWFsIH5faW1wbF9BZGFwdGVyQWN0aXZhdG9yKCk7CgogIHZpcnR1YWwgQ09SQkE6OkJv b2xlYW4gdW5rbm93bl9hZGFwdGVyKFBPQV9wdHIgcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lKSA9 IDA7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9T Jik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIq KTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKCmV4dGVy biBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19BZGFwdGVyQWN0aXZhdG9yOwojIDIyOCAi Li4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9wb2FfZGVmcy5oIgpjbGFzcyBfb2JqcmVmX1Nl cnZhbnRNYW5hZ2VyOwp0eXBlZGVmIF9vYmpyZWZfU2VydmFudE1hbmFnZXIqIFNlcnZhbnRNYW5h Z2VyX3B0cjsKdHlwZWRlZiBTZXJ2YW50TWFuYWdlcl9wdHIgU2VydmFudE1hbmFnZXJSZWY7Cgpj bGFzcyBTZXJ2YW50TWFuYWdlcl9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBTZXJ2YW50TWFu YWdlcl9wdHIgX3B0cl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICBzdGF0aWMg X0NPUkJBX0Jvb2xlYW4gaXNfbmlsKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgcmVsZWFzZShf cHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBz aXplX3QgTlBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyB2b2lkIG1h cnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRy X3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIHZvaWQg bWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9w dHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKfTsKCnR5cGVkZWYg X0NPUkJBX09ialJlZl9WYXI8X29ianJlZl9TZXJ2YW50TWFuYWdlciwgU2VydmFudE1hbmFnZXJf SGVscGVyPiBTZXJ2YW50TWFuYWdlcl92YXI7CnR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJn PF9vYmpyZWZfU2VydmFudE1hbmFnZXIsU2VydmFudE1hbmFnZXJfSGVscGVyID4gU2VydmFudE1h bmFnZXJfb3V0OwoKCgoKY2xhc3MgU2VydmFudE1hbmFnZXIgewpwdWJsaWM6CgogIHR5cGVkZWYg U2VydmFudE1hbmFnZXJfcHRyIF9wdHJfdHlwZTsKICB0eXBlZGVmIFNlcnZhbnRNYW5hZ2VyX3Zh ciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwog IHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9w dHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxP YmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9w dHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JC QTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMp OwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNl KG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUg X3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVj dF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9w dHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwog ICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoK Cgp9OwoKCmNsYXNzIF9vYmpyZWZfU2VydmFudE1hbmFnZXIgOgogIHB1YmxpYyB2aXJ0dWFsIENP UkJBOjpPYmplY3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKewpwdWJsaWM6CgogIGlubGlu ZSBfb2JqcmVmX1NlcnZhbnRNYW5hZ2VyKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9T ZXJ2YW50TWFuYWdlcihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJ ZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29i anJlZl9TZXJ2YW50TWFuYWdlcigpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09i alJlZihjb25zdCBjaGFyKik7CgogIF9vYmpyZWZfU2VydmFudE1hbmFnZXIoY29uc3QgX29ianJl Zl9TZXJ2YW50TWFuYWdlciYpOwogIF9vYmpyZWZfU2VydmFudE1hbmFnZXImIG9wZXJhdG9yID0g KGNvbnN0IF9vYmpyZWZfU2VydmFudE1hbmFnZXImKTsKCn07CgoKY2xhc3MgX3BvZl9TZXJ2YW50 TWFuYWdlciA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9w b2ZfU2VydmFudE1hbmFnZXIoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShTZXJ2YW50TWFuYWdlcjo6 X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1NlcnZhbnRNYW5hZ2VyKCk7CgogIHZpcnR1 YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVM aXN0KiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5p TG9jYWxJZGVudGl0eSopOwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFy KikgY29uc3Q7Cn07CgoKY2xhc3MgX2ltcGxfU2VydmFudE1hbmFnZXIgOgogIHB1YmxpYyB2aXJ0 dWFsIG9tbmlTZXJ2YW50CnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX1NlcnZhbnRNYW5hZ2Vy KCk7CgoKcHJvdGVjdGVkOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1Bf UyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25zdCBjaGFy Kik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsKCgpleHRl cm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfU2VydmFudE1hbmFnZXI7CiMgMzQ0ICIu Li8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3BvYV9kZWZzLmgiCmNsYXNzIF9vYmpyZWZfU2Vy dmFudEFjdGl2YXRvcjsKdHlwZWRlZiBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IqIFNlcnZhbnRB Y3RpdmF0b3JfcHRyOwp0eXBlZGVmIFNlcnZhbnRBY3RpdmF0b3JfcHRyIFNlcnZhbnRBY3RpdmF0 b3JSZWY7CgpjbGFzcyBTZXJ2YW50QWN0aXZhdG9yX0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVm IFNlcnZhbnRBY3RpdmF0b3JfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmls KCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2 b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBl KTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBz dGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsK ICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwog IHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYp OwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7 Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfU2VydmFudEFjdGl2YXRvciwg U2VydmFudEFjdGl2YXRvcl9IZWxwZXI+IFNlcnZhbnRBY3RpdmF0b3JfdmFyOwp0eXBlZGVmIF9D T1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IsU2VydmFudEFjdGl2 YXRvcl9IZWxwZXIgPiBTZXJ2YW50QWN0aXZhdG9yX291dDsKCgoKCmNsYXNzIFNlcnZhbnRBY3Rp dmF0b3IgewpwdWJsaWM6CgogIHR5cGVkZWYgU2VydmFudEFjdGl2YXRvcl9wdHIgX3B0cl90eXBl OwogIHR5cGVkZWYgU2VydmFudEFjdGl2YXRvcl92YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0 cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3co Q09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMg aW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBp bmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7 CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVy ZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihO ZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6 OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBf bmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsK ICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVy ZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNo YWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhv YmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBz dGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCgpjbGFzcyBfb2JqcmVmX1NlcnZh bnRBY3RpdmF0b3IgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfU2VydmFudE1hbmFnZXIKewpw dWJsaWM6CiAgU2VydmFudCBpbmNhcm5hdGUoY29uc3QgT2JqZWN0SWQmIG9pZCwgUE9BX3B0ciBh ZGFwdGVyKTsKICB2b2lkIGV0aGVyZWFsaXplKGNvbnN0IE9iamVjdElkJiBvaWQsIFBPQV9wdHIg YWRhcHRlciwgU2VydmFudCBzZXJ2LCBDT1JCQTo6Qm9vbGVhbiBjbGVhbnVwX2luX3Byb2dyZXNz LCBDT1JCQTo6Qm9vbGVhbiByZW1haW5pbmdfYWN0aXZhdGlvbnMpOwoKICBpbmxpbmUgX29ianJl Zl9TZXJ2YW50QWN0aXZhdG9yKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9TZXJ2YW50 QWN0aXZhdG9yKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50 aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIH5fb2JqcmVm X1NlcnZhbnRBY3RpdmF0b3IoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpS ZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IoY29uc3QgX29ianJl Zl9TZXJ2YW50QWN0aXZhdG9yJik7CiAgX29ianJlZl9TZXJ2YW50QWN0aXZhdG9yJiBvcGVyYXRv ciA9IChjb25zdCBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3ImKTsKCn07CgoKY2xhc3MgX3BvZl9T ZXJ2YW50QWN0aXZhdG9yIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBp bmxpbmUgX3BvZl9TZXJ2YW50QWN0aXZhdG9yKCkgOiBwcm94eU9iamVjdEZhY3RvcnkoU2VydmFu dEFjdGl2YXRvcjo6X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1NlcnZhbnRBY3RpdmF0 b3IoKTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6 VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJ ZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBp c19hKGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCgpjbGFzcyBfaW1wbF9TZXJ2YW50QWN0aXZhdG9y IDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9TZXJ2YW50TWFuYWdlcgp7CnB1YmxpYzoKICB2aXJ0 dWFsIH5faW1wbF9TZXJ2YW50QWN0aXZhdG9yKCk7CgogIHZpcnR1YWwgU2VydmFudCBpbmNhcm5h dGUoY29uc3QgT2JqZWN0SWQmIG9pZCwgUE9BX3B0ciBhZGFwdGVyKSA9IDA7CiAgdmlydHVhbCB2 b2lkIGV0aGVyZWFsaXplKGNvbnN0IE9iamVjdElkJiBvaWQsIFBPQV9wdHIgYWRhcHRlciwgU2Vy dmFudCBzZXJ2LCBDT1JCQTo6Qm9vbGVhbiBjbGVhbnVwX2luX3Byb2dyZXNzLCBDT1JCQTo6Qm9v bGVhbiByZW1haW5pbmdfYWN0aXZhdGlvbnMpID0gMDsKCnByb3RlY3RlZDoKICB2aXJ0dWFsIF9D T1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lk KiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21v c3REZXJpdmVkUmVwb0lkKCk7Cn07CgoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIg X3RjX1NlcnZhbnRBY3RpdmF0b3I7CiMgNDY0ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIz L3BvYV9kZWZzLmgiCmNsYXNzIF9vYmpyZWZfU2VydmFudExvY2F0b3I7CnR5cGVkZWYgX29ianJl Zl9TZXJ2YW50TG9jYXRvciogU2VydmFudExvY2F0b3JfcHRyOwp0eXBlZGVmIFNlcnZhbnRMb2Nh dG9yX3B0ciBTZXJ2YW50TG9jYXRvclJlZjsKCmNsYXNzIFNlcnZhbnRMb2NhdG9yX0hlbHBlciB7 CnB1YmxpYzoKICB0eXBlZGVmIFNlcnZhbnRMb2NhdG9yX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRp YyBfcHRyX3R5cGUgX25pbCgpOwogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90 eXBlKTsKICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVw bGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5 cGUsIHNpemVfdCk7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1 ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVm ZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVt QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1C dWZmZXJlZFN0cmVhbSYpOwp9OwoKdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1Nl cnZhbnRMb2NhdG9yLCBTZXJ2YW50TG9jYXRvcl9IZWxwZXI+IFNlcnZhbnRMb2NhdG9yX3ZhcjsK dHlwZWRlZiBfQ09SQkFfT2JqUmVmX09VVF9hcmc8X29ianJlZl9TZXJ2YW50TG9jYXRvcixTZXJ2 YW50TG9jYXRvcl9IZWxwZXIgPiBTZXJ2YW50TG9jYXRvcl9vdXQ7CgoKCgpjbGFzcyBTZXJ2YW50 TG9jYXRvciB7CnB1YmxpYzoKCiAgdHlwZWRlZiBTZXJ2YW50TG9jYXRvcl9wdHIgX3B0cl90eXBl OwogIHR5cGVkZWYgU2VydmFudExvY2F0b3JfdmFyIF92YXJfdHlwZTsKCiAgc3RhdGljIF9wdHJf dHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENP UkJBOjpPYmplY3RfcHRyKTsKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgc3RhdGljIGlu bGluZSBzaXplX3QgX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgaW5s aW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwog IHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVk U3RyZWFtJik7CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTmV0 QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpV bk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25h cnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAg fQoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFs T2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2Jq KTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3Rh dGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgoKCiAgc3RhdGljIGNvbnN0IENPUkJBOjpUeXBl Q29kZV9wdHIgX3RjX0Nvb2tpZTsKICB0eXBlZGVmIHZvaWQqIENvb2tpZTsKfTsKCgpjbGFzcyBf b2JqcmVmX1NlcnZhbnRMb2NhdG9yIDoKICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX1NlcnZhbnRN YW5hZ2VyCnsKcHVibGljOgogIFNlcnZhbnQgcHJlaW52b2tlKGNvbnN0IE9iamVjdElkJiBvaWQs IFBPQV9wdHIgYWRhcHRlciwgY29uc3QgY2hhciogb3BlcmF0aW9uLCBTZXJ2YW50TG9jYXRvcjo6 Q29va2llJiB0aGVfY29va2llKTsKICB2b2lkIHBvc3RpbnZva2UoY29uc3QgT2JqZWN0SWQmIG9p ZCwgUE9BX3B0ciBhZGFwdGVyLCBjb25zdCBjaGFyKiBvcGVyYXRpb24sIFNlcnZhbnRMb2NhdG9y OjpDb29raWUgdGhlX2Nvb2tpZSwgU2VydmFudCB0aGVfc2VydmFudCk7CgogIGlubGluZSBfb2Jq cmVmX1NlcnZhbnRMb2NhdG9yKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9TZXJ2YW50 TG9jYXRvcihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0 eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9T ZXJ2YW50TG9jYXRvcigpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihj b25zdCBjaGFyKik7CgogIF9vYmpyZWZfU2VydmFudExvY2F0b3IoY29uc3QgX29ianJlZl9TZXJ2 YW50TG9jYXRvciYpOwogIF9vYmpyZWZfU2VydmFudExvY2F0b3ImIG9wZXJhdG9yID0gKGNvbnN0 IF9vYmpyZWZfU2VydmFudExvY2F0b3ImKTsKCn07CgoKY2xhc3MgX3BvZl9TZXJ2YW50TG9jYXRv ciA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfU2Vy dmFudExvY2F0b3IoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShTZXJ2YW50TG9jYXRvcjo6X1BEX3Jl cG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1NlcnZhbnRMb2NhdG9yKCk7CgogIHZpcnR1YWwgb21u aU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJ ZGVudGl0eSopOwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29u c3Q7Cn07CgoKY2xhc3MgX2ltcGxfU2VydmFudExvY2F0b3IgOgogIHB1YmxpYyB2aXJ0dWFsIF9p bXBsX1NlcnZhbnRNYW5hZ2VyCnsKcHVibGljOgogIHZpcnR1YWwgfl9pbXBsX1NlcnZhbnRMb2Nh dG9yKCk7CgogIHZpcnR1YWwgU2VydmFudCBwcmVpbnZva2UoY29uc3QgT2JqZWN0SWQmIG9pZCwg UE9BX3B0ciBhZGFwdGVyLCBjb25zdCBjaGFyKiBvcGVyYXRpb24sIFNlcnZhbnRMb2NhdG9yOjpD b29raWUmIHRoZV9jb29raWUpID0gMDsKICB2aXJ0dWFsIHZvaWQgcG9zdGludm9rZShjb25zdCBP YmplY3RJZCYgb2lkLCBQT0FfcHRyIGFkYXB0ZXIsIGNvbnN0IGNoYXIqIG9wZXJhdGlvbiwgU2Vy dmFudExvY2F0b3I6OkNvb2tpZSB0aGVfY29va2llLCBTZXJ2YW50IHRoZV9zZXJ2YW50KSA9IDA7 Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9TJik7 Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsK ICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9OwoKCmV4dGVybiBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19TZXJ2YW50TG9jYXRvcjsKIyA3NTYgIi4uLy4u Ly4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDIKCgoKCgoKCn0KCgojIDEgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvb21uaU9SQjMvcG9hX29wZXJhdG9ycy5oIiAxCiMgNDQgIi4uLy4uLy4uLy4u L2luY2x1ZGUvb21uaU9SQjMvcG9hX29wZXJhdG9ycy5oIgppbmxpbmUgc2l6ZV90ClBvcnRhYmxl U2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yOjpfYWxpZ25lZFNpemUoUG9ydGFibGVTZXJ2ZXI6OkFk YXB0ZXJBY3RpdmF0b3JfcHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JCQTo6 QWxpZ25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDQ4LCBvZmZzZXQpOwp9CgppbmxpbmUgdm9p ZApQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcjo6X21hcnNoYWxPYmpSZWYoUG9ydGFi bGVTZXJ2ZXI6OkFkYXB0ZXJBY3RpdmF0b3JfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMp IHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDQ4LCBzKTsKfQoKaW5s aW5lIHZvaWQKUG9ydGFibGVTZXJ2ZXI6OkFkYXB0ZXJBY3RpdmF0b3I6Ol9tYXJzaGFsT2JqUmVm KFBvcnRhYmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0OCwgcyk7 Cn0KCgppbmxpbmUgc2l6ZV90ClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcjo6X2FsaWdu ZWRTaXplKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcl9wdHIgb2JqLCBzaXplX3Qgb2Zm c2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgNDYs IG9mZnNldCk7Cn0KCmlubGluZSB2b2lkClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcjo6 X21hcnNoYWxPYmpSZWYoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRNYW5hZ2VyX3B0ciBvYmosIE5l dEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVw b0lkLCA0Niwgcyk7Cn0KCmlubGluZSB2b2lkClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdl cjo6X21hcnNoYWxPYmpSZWYoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRNYW5hZ2VyX3B0ciBvYmos IE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERf cmVwb0lkLCA0Niwgcyk7Cn0KCgppbmxpbmUgc2l6ZV90ClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50 QWN0aXZhdG9yOjpfYWxpZ25lZFNpemUoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3Jf cHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JCQTo6QWxpZ25lZE9ialJlZihv YmosIF9QRF9yZXBvSWQsIDQ4LCBvZmZzZXQpOwp9CgppbmxpbmUgdm9pZApQb3J0YWJsZVNlcnZl cjo6U2VydmFudEFjdGl2YXRvcjo6X21hcnNoYWxPYmpSZWYoUG9ydGFibGVTZXJ2ZXI6OlNlcnZh bnRBY3RpdmF0b3JfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFy c2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDQ4LCBzKTsKfQoKaW5saW5lIHZvaWQKUG9ydGFi bGVTZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3I6Ol9tYXJzaGFsT2JqUmVmKFBvcnRhYmxlU2VydmVy OjpTZXJ2YW50QWN0aXZhdG9yX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09S QkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0OCwgcyk7Cn0KCgppbmxpbmUgc2l6 ZV90ClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRvcjo6X2FsaWduZWRTaXplKFBvcnRhYmxl U2VydmVyOjpTZXJ2YW50TG9jYXRvcl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJu IENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgNDYsIG9mZnNldCk7Cn0KCmlu bGluZSB2b2lkClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRvcjo6X21hcnNoYWxPYmpSZWYo UG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRMb2NhdG9yX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0Niwgcyk7Cn0K CmlubGluZSB2b2lkClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRvcjo6X21hcnNoYWxPYmpS ZWYoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRMb2NhdG9yX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0Niwgcyk7 Cn0KIyA3NjcgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDIKIyAxICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3BvYV9wb2EuaCIgMQojIDQ0ICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL3BvYV9wb2EuaCIKbmFtZXNwYWNlIFBPQV9Qb3J0YWJsZVNlcnZlcgp7 CgoKY2xhc3MgQWRhcHRlckFjdGl2YXRvciA6CiAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNl cnZlcjo6X2ltcGxfQWRhcHRlckFjdGl2YXRvciwKICAgIHB1YmxpYyB2aXJ0dWFsIFBvcnRhYmxl U2VydmVyOjpTZXJ2YW50QmFzZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5BZGFwdGVyQWN0aXZhdG9y KCk7CgogIGlubGluZSBQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcl9wdHIgX3RoaXMo KSB7CiAgICByZXR1cm4gKFBvcnRhYmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yX3B0cikgX2Rv X3RoaXMoUG9ydGFibGVTZXJ2ZXI6OkFkYXB0ZXJBY3RpdmF0b3I6Ol9QRF9yZXBvSWQpOwogIH0K fTsKCgpjbGFzcyBTZXJ2YW50TWFuYWdlciA6CiAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNl cnZlcjo6X2ltcGxfU2VydmFudE1hbmFnZXIsCiAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNl cnZlcjo6U2VydmFudEJhc2UKewpwdWJsaWM6CiAgdmlydHVhbCB+U2VydmFudE1hbmFnZXIoKTsK CiAgaW5saW5lIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcl9wdHIgX3RoaXMoKSB7CiAg ICByZXR1cm4gKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcl9wdHIpIF9kb190aGlzKFBv cnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKCmNsYXNz IFNlcnZhbnRBY3RpdmF0b3IgOgogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6Ol9p bXBsX1NlcnZhbnRBY3RpdmF0b3IsCiAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNlcnZlcjo6 U2VydmFudEJhc2UKewpwdWJsaWM6CiAgdmlydHVhbCB+U2VydmFudEFjdGl2YXRvcigpOwoKICBp bmxpbmUgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3JfcHRyIF90aGlzKCkgewogICAg cmV0dXJuIChQb3J0YWJsZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcl9wdHIpIF9kb190aGlzKFBv cnRhYmxlU2VydmVyOjpTZXJ2YW50QWN0aXZhdG9yOjpfUERfcmVwb0lkKTsKICB9Cn07CgoKY2xh c3MgU2VydmFudExvY2F0b3IgOgogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6Ol9p bXBsX1NlcnZhbnRMb2NhdG9yLAogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlNl cnZhbnRCYXNlCnsKcHVibGljOgogIHZpcnR1YWwgflNlcnZhbnRMb2NhdG9yKCk7CgogIGlubGlu ZSBQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3JfcHRyIF90aGlzKCkgewogICAgcmV0dXJu IChQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3JfcHRyKSBfZG9fdGhpcyhQb3J0YWJsZVNl cnZlcjo6U2VydmFudExvY2F0b3I6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCgp9CiMgNzY4ICIuLi8u Li8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL3BvYS5oIiAyCiMgMjYyNCAiLi4vLi4vLi4vLi4vaW5j bHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAyCgoKCmV4dGVybiBDT1JCQTo6Qm9vbGVhbgpfb21uaV9j YWxsVHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcihvbW5pT2JqUmVmKiBvYmosIENPUkJBOjpVTG9u ZyByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JC QTo6VFJBTlNJRU5UJiBleCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbgpfb21uaV9jYWxsQ29tbUZh aWx1cmVFeGNlcHRpb25IYW5kbGVyKG9tbmlPYmpSZWYqIG9iaiwgQ09SQkE6OlVMb25nIHJldHJp ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OkNP TU1fRkFJTFVSRSYgZXgpOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4KX29tbmlfY2FsbFN5c3RlbUV4 Y2VwdGlvbkhhbmRsZXIob21uaU9ialJlZiogb2JqLCBDT1JCQTo6VUxvbmcgcmV0cmllcywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlN5c3RlbUV4Y2VwdGlv biYgZXgpOwoKCmV4dGVybiB2b2lkIF9vbW5pX3NldF9OYW1lU2VydmljZShDT1JCQTo6T2JqZWN0 X3B0cik7CgoKIyAxICIuLi9vbW5pT1JCMy9jb3JiYWlkbF9vcGVyYXRvcnMuaGgiIDEKCgoKCmV4 dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6U3RydWN0 TWVtYmVyJiBfcyk7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JC QTo6U3RydWN0TWVtYmVyKiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0o Y29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpTdHJ1Y3RNZW1iZXIqJiBfc3ApOwpleHRlcm4g Q09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENP UkJBOjpTdHJ1Y3RNZW1iZXIqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JC QTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlN0cnVjdE1lbWJlclNlcSYgX3MpOwppbmxpbmUgdm9p ZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6U3RydWN0TWVtYmVyU2VxKiBf c3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFfQm9vbGVh biBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6U3RydWN0TWVtYmVy U2VxKiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09S QkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpTdHJ1Y3RNZW1iZXJTZXEqJiBfc3ApOwoKZXh0ZXJu IHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpVbmlvbk1lbWJl ciYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlVu aW9uTWVtYmVyKiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3Qg Q09SQkE6OkFueSYgX2EsIENPUkJBOjpVbmlvbk1lbWJlciomIF9zcCk7CmV4dGVybiBDT1JCQTo6 Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlVu aW9uTWVtYmVyKiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYg X2EsIGNvbnN0IENPUkJBOjpVbmlvbk1lbWJlclNlcSYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRv ciA8PD0gKENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VW5pb25NZW1iZXJTZXEqIF9zcCkgewogIF9h IDw8PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9y ID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpVbmlvbk1lbWJlclNlcSomIF9zcCk7 CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9h LCBjb25zdCBDT1JCQTo6VW5pb25NZW1iZXJTZXEqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0 b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkVudW1NZW1iZXJTZXEmIF9zKTsK aW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkVudW1NZW1i ZXJTZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JC QV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpFbnVt TWVtYmVyU2VxKiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29u c3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpFbnVtTWVtYmVyU2VxKiYgX3NwKTsKIyAy NjQyICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDIKCgojIDEgIi4uL29t bmlPUkIzL2lyX29wZXJhdG9ycy5oaCIgMQoKCgoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPj49KENP UkJBOjpEZWZpbml0aW9uS2luZCBfZSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICA6Om9wZXJh dG9yPj49KChDT1JCQTo6VUxvbmcpX2UsIHMpOwp9CgppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0g KENPUkJBOjpEZWZpbml0aW9uS2luZCYgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09S QkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8w UkxfZSkgewogICAgY2FzZSBDT1JCQTo6ZGtfbm9uZToKCiAgICBjYXNlIENPUkJBOjpka19hbGw6 CgogICAgY2FzZSBDT1JCQTo6ZGtfQXR0cmlidXRlOgoKICAgIGNhc2UgQ09SQkE6OmRrX0NvbnN0 YW50OgoKICAgIGNhc2UgQ09SQkE6OmRrX0V4Y2VwdGlvbjoKCiAgICBjYXNlIENPUkJBOjpka19J bnRlcmZhY2U6CgogICAgY2FzZSBDT1JCQTo6ZGtfTW9kdWxlOgoKICAgIGNhc2UgQ09SQkE6OmRr X09wZXJhdGlvbjoKCiAgICBjYXNlIENPUkJBOjpka19UeXBlZGVmOgoKICAgIGNhc2UgQ09SQkE6 OmRrX0FsaWFzOgoKICAgIGNhc2UgQ09SQkE6OmRrX1N0cnVjdDoKCiAgICBjYXNlIENPUkJBOjpk a19VbmlvbjoKCiAgICBjYXNlIENPUkJBOjpka19FbnVtOgoKICAgIGNhc2UgQ09SQkE6OmRrX1By aW1pdGl2ZToKCiAgICBjYXNlIENPUkJBOjpka19TdHJpbmc6CgogICAgY2FzZSBDT1JCQTo6ZGtf U2VxdWVuY2U6CgogICAgY2FzZSBDT1JCQTo6ZGtfQXJyYXk6CgogICAgY2FzZSBDT1JCQTo6ZGtf UmVwb3NpdG9yeToKCiAgICBjYXNlIENPUkJBOjpka19Xc3RyaW5nOgoKICAgIGNhc2UgQ09SQkE6 OmRrX0ZpeGVkOgoKICAgIGNhc2UgQ09SQkE6OmRrX1ZhbHVlOgoKICAgIGNhc2UgQ09SQkE6OmRr X1ZhbHVlQm94OgoKICAgIGNhc2UgQ09SQkE6OmRrX01lbWJlcjoKCiAgICBjYXNlIENPUkJBOjpk a19OYXRpdmU6CgogICAgY2FzZSBDT1JCQTo6ZGtfQWJzdHJhY3RJbnRlcmZhY2U6CgogICAgX2Ug PSAoQ09SQkE6OkRlZmluaXRpb25LaW5kKSBfMFJMX2U7CiAgICBicmVhazsKICBkZWZhdWx0Ogog ICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKICB9Cn0KCmlubGluZSB2b2lkIG9wZXJhdG9yID4+ PShDT1JCQTo6RGVmaW5pdGlvbktpbmQgX2UsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgOjpv cGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZvaWQgb3BlcmF0b3Ig PDw9IChDT1JCQTo6RGVmaW5pdGlvbktpbmQmIF9lLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewog IENPUkJBOjpVTG9uZyBfMFJMX2U7CiAgOjpvcGVyYXRvcjw8PShfMFJMX2Uscyk7CiAgc3dpdGNo IChfMFJMX2UpIHsKICAgIGNhc2UgQ09SQkE6OmRrX25vbmU6CgogICAgY2FzZSBDT1JCQTo6ZGtf YWxsOgoKICAgIGNhc2UgQ09SQkE6OmRrX0F0dHJpYnV0ZToKCiAgICBjYXNlIENPUkJBOjpka19D b25zdGFudDoKCiAgICBjYXNlIENPUkJBOjpka19FeGNlcHRpb246CgogICAgY2FzZSBDT1JCQTo6 ZGtfSW50ZXJmYWNlOgoKICAgIGNhc2UgQ09SQkE6OmRrX01vZHVsZToKCiAgICBjYXNlIENPUkJB Ojpka19PcGVyYXRpb246CgogICAgY2FzZSBDT1JCQTo6ZGtfVHlwZWRlZjoKCiAgICBjYXNlIENP UkJBOjpka19BbGlhczoKCiAgICBjYXNlIENPUkJBOjpka19TdHJ1Y3Q6CgogICAgY2FzZSBDT1JC QTo6ZGtfVW5pb246CgogICAgY2FzZSBDT1JCQTo6ZGtfRW51bToKCiAgICBjYXNlIENPUkJBOjpk a19QcmltaXRpdmU6CgogICAgY2FzZSBDT1JCQTo6ZGtfU3RyaW5nOgoKICAgIGNhc2UgQ09SQkE6 OmRrX1NlcXVlbmNlOgoKICAgIGNhc2UgQ09SQkE6OmRrX0FycmF5OgoKICAgIGNhc2UgQ09SQkE6 OmRrX1JlcG9zaXRvcnk6CgogICAgY2FzZSBDT1JCQTo6ZGtfV3N0cmluZzoKCiAgICBjYXNlIENP UkJBOjpka19GaXhlZDoKCiAgICBjYXNlIENPUkJBOjpka19WYWx1ZToKCiAgICBjYXNlIENPUkJB Ojpka19WYWx1ZUJveDoKCiAgICBjYXNlIENPUkJBOjpka19NZW1iZXI6CgogICAgY2FzZSBDT1JC QTo6ZGtfTmF0aXZlOgoKICAgIGNhc2UgQ09SQkE6OmRrX0Fic3RyYWN0SW50ZXJmYWNlOgoKICAg IF9lID0gKENPUkJBOjpEZWZpbml0aW9uS2luZCkgXzBSTF9lOwogICAgYnJlYWs7CiAgZGVmYXVs dDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9Cgp2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmIF9hLCBDT1JCQTo6RGVmaW5pdGlvbktpbmQgX3MpOwpDT1JCQTo6Qm9vbGVhbiBv cGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkRlZmluaXRpb25LaW5kJiBf cyk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6SVJPYmplY3RfcHRy IF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OklST2JqZWN0X3B0 ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwg Q09SQkE6OklST2JqZWN0X3B0ciYgX3MpOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYgX2EsIGNvbnN0IENPUkJBOjpDb250YWluZWQ6OkRlc2NyaXB0aW9uJiBfcyk7CmV4dGVy biB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6Q29udGFpbmVkOjpEZXNj cmlwdGlvbiogX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENP UkJBOjpBbnkmIF9hLCBDT1JCQTo6Q29udGFpbmVkOjpEZXNjcmlwdGlvbiomIF9zcCk7CmV4dGVy biBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3Qg Q09SQkE6OkNvbnRhaW5lZDo6RGVzY3JpcHRpb24qJiBfc3ApOwoKdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgQ09SQkE6OkNvbnRhaW5lZF9wdHIgX3MpOwp2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6Q29udGFpbmVkX3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVh biBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkNvbnRhaW5lZF9wdHIm IF9zKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIGNvbnN0IENP UkJBOjpJbnRlcmZhY2VEZWZTZXEmIF9zKTsKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JC QTo6QW55JiBfYSwgQ09SQkE6OkludGVyZmFjZURlZlNlcSogX3NwKSB7CiAgX2EgPDw9ICpfc3A7 CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25z dCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkludGVyZmFjZURlZlNlcSomIF9zcCk7CmV4dGVybiBf Q09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBD T1JCQTo6SW50ZXJmYWNlRGVmU2VxKiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yIDw8PSAo Q09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpWYWx1ZURlZlNlcSYgX3MpOwppbmxpbmUgdm9p ZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVEZWZTZXEqIF9zcCkg ewogIF9hIDw8PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9w ZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpWYWx1ZURlZlNlcSomIF9z cCk7CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkm IF9hLCBjb25zdCBDT1JCQTo6VmFsdWVEZWZTZXEqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0 b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkFic3RyYWN0SW50ZXJmYWNlRGVm U2VxJiBfcyk7CmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIENPUkJB OjpBYnN0cmFjdEludGVyZmFjZURlZlNlcSogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAgZGVsZXRl IF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6 QW55JiBfYSwgQ09SQkE6OkFic3RyYWN0SW50ZXJmYWNlRGVmU2VxKiYgX3NwKTsKZXh0ZXJuIF9D T1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENP UkJBOjpBYnN0cmFjdEludGVyZmFjZURlZlNlcSomIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRv ciA8PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6Q29udGFpbmVkU2VxJiBfcyk7Cmlu bGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIENPUkJBOjpDb250YWluZWRT ZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9C b29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpDb250YWlu ZWRTZXEqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBD T1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkNvbnRhaW5lZFNlcSomIF9zcCk7CgpleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkluaXRpYWxpemVy JiBfcyk7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6SW5p dGlhbGl6ZXIqIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBD T1JCQTo6QW55JiBfYSwgQ09SQkE6OkluaXRpYWxpemVyKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6SW5p dGlhbGl6ZXIqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBf YSwgY29uc3QgQ09SQkE6OkluaXRpYWxpemVyU2VxJiBfcyk7CmlubGluZSB2b2lkIG9wZXJhdG9y IDw8PSAoQ09SQkE6OkFueSYgX2EsIENPUkJBOjpJbml0aWFsaXplclNlcSogX3NwKSB7CiAgX2Eg PDw9ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3Ig Pj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkluaXRpYWxpemVyU2VxKiYgX3NwKTsK ZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2Es IGNvbnN0IENPUkJBOjpJbml0aWFsaXplclNlcSomIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkNvbnRhaW5lcjo6RGVzY3JpcHRpb24m IF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpDb250 YWluZXI6OkRlc2NyaXB0aW9uKiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpDb250YWluZXI6OkRlc2NyaXB0aW9uKiYg X3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm IF9hLCBjb25zdCBDT1JCQTo6Q29udGFpbmVyOjpEZXNjcmlwdGlvbiomIF9zcCk7CgpleHRlcm4g dm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6Q29udGFpbmVy OjpEZXNjcmlwdGlvblNlcSYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpB bnkmIF9hLCBDT1JCQTo6Q29udGFpbmVyOjpEZXNjcmlwdGlvblNlcSogX3NwKSB7CiAgX2EgPDw9 ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49 IChjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkNvbnRhaW5lcjo6RGVzY3JpcHRpb25TZXEq JiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6 QW55JiBfYSwgY29uc3QgQ09SQkE6OkNvbnRhaW5lcjo6RGVzY3JpcHRpb25TZXEqJiBfc3ApOwoK dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkNvbnRhaW5lcl9wdHIgX3Mp Owp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6Q29udGFpbmVyX3B0ciog X3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09S QkE6OkNvbnRhaW5lcl9wdHImIF9zKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2Es IENPUkJBOjpJRExUeXBlX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2Es IENPUkJBOjpJRExUeXBlX3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25z dCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OklETFR5cGVfcHRyJiBfcyk7CgppbmxpbmUgdm9pZCBv cGVyYXRvciA+Pj0oQ09SQkE6OlByaW1pdGl2ZUtpbmQgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBz KSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZvaWQg b3BlcmF0b3IgPDw9IChDT1JCQTo6UHJpbWl0aXZlS2luZCYgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsK ICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDT1JCQTo6cGtfbnVsbDoKCiAgICBjYXNlIENP UkJBOjpwa192b2lkOgoKICAgIGNhc2UgQ09SQkE6OnBrX3Nob3J0OgoKICAgIGNhc2UgQ09SQkE6 OnBrX2xvbmc6CgogICAgY2FzZSBDT1JCQTo6cGtfdXNob3J0OgoKICAgIGNhc2UgQ09SQkE6OnBr X3Vsb25nOgoKICAgIGNhc2UgQ09SQkE6OnBrX2Zsb2F0OgoKICAgIGNhc2UgQ09SQkE6OnBrX2Rv dWJsZToKCiAgICBjYXNlIENPUkJBOjpwa19ib29sZWFuOgoKICAgIGNhc2UgQ09SQkE6OnBrX2No YXI6CgogICAgY2FzZSBDT1JCQTo6cGtfb2N0ZXQ6CgogICAgY2FzZSBDT1JCQTo6cGtfYW55OgoK ICAgIGNhc2UgQ09SQkE6OnBrX1R5cGVDb2RlOgoKICAgIGNhc2UgQ09SQkE6OnBrX1ByaW5jaXBh bDoKCiAgICBjYXNlIENPUkJBOjpwa19zdHJpbmc6CgogICAgY2FzZSBDT1JCQTo6cGtfb2JqcmVm OgoKICAgIGNhc2UgQ09SQkE6OnBrX2xvbmdsb25nOgoKICAgIGNhc2UgQ09SQkE6OnBrX3Vsb25n bG9uZzoKCiAgICBjYXNlIENPUkJBOjpwa19sb25nZG91YmxlOgoKICAgIGNhc2UgQ09SQkE6OnBr X3djaGFyOgoKICAgIGNhc2UgQ09SQkE6OnBrX3dzdHJpbmc6CgogICAgY2FzZSBDT1JCQTo6cGtf dmFsdWVfYmFzZToKCiAgICBfZSA9IChDT1JCQTo6UHJpbWl0aXZlS2luZCkgXzBSTF9lOwogICAg YnJlYWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9Cgppbmxp bmUgdm9pZCBvcGVyYXRvciA+Pj0oQ09SQkE6OlByaW1pdGl2ZUtpbmQgX2UsIE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5s aW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6UHJpbWl0aXZlS2luZCYgX2UsIE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8w UkxfZSxzKTsKICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDT1JCQTo6cGtfbnVsbDoKCiAg ICBjYXNlIENPUkJBOjpwa192b2lkOgoKICAgIGNhc2UgQ09SQkE6OnBrX3Nob3J0OgoKICAgIGNh c2UgQ09SQkE6OnBrX2xvbmc6CgogICAgY2FzZSBDT1JCQTo6cGtfdXNob3J0OgoKICAgIGNhc2Ug Q09SQkE6OnBrX3Vsb25nOgoKICAgIGNhc2UgQ09SQkE6OnBrX2Zsb2F0OgoKICAgIGNhc2UgQ09S QkE6OnBrX2RvdWJsZToKCiAgICBjYXNlIENPUkJBOjpwa19ib29sZWFuOgoKICAgIGNhc2UgQ09S QkE6OnBrX2NoYXI6CgogICAgY2FzZSBDT1JCQTo6cGtfb2N0ZXQ6CgogICAgY2FzZSBDT1JCQTo6 cGtfYW55OgoKICAgIGNhc2UgQ09SQkE6OnBrX1R5cGVDb2RlOgoKICAgIGNhc2UgQ09SQkE6OnBr X1ByaW5jaXBhbDoKCiAgICBjYXNlIENPUkJBOjpwa19zdHJpbmc6CgogICAgY2FzZSBDT1JCQTo6 cGtfb2JqcmVmOgoKICAgIGNhc2UgQ09SQkE6OnBrX2xvbmdsb25nOgoKICAgIGNhc2UgQ09SQkE6 OnBrX3Vsb25nbG9uZzoKCiAgICBjYXNlIENPUkJBOjpwa19sb25nZG91YmxlOgoKICAgIGNhc2Ug Q09SQkE6OnBrX3djaGFyOgoKICAgIGNhc2UgQ09SQkE6OnBrX3dzdHJpbmc6CgogICAgY2FzZSBD T1JCQTo6cGtfdmFsdWVfYmFzZToKCiAgICBfZSA9IChDT1JCQTo6UHJpbWl0aXZlS2luZCkgXzBS TF9lOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAg fQp9Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6UHJpbWl0aXZlS2lu ZCBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBD T1JCQTo6UHJpbWl0aXZlS2luZCYgX3MpOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBf YSwgQ09SQkE6OlJlcG9zaXRvcnlfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55 JiBfYSwgQ09SQkE6OlJlcG9zaXRvcnlfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6UmVwb3NpdG9yeV9wdHImIF9zKTsKCnZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpNb2R1bGVEZWZfcHRyIF9zKTsK dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6Ok1vZHVsZURlZl9wdHIqIF9z KTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJB OjpNb2R1bGVEZWZfcHRyJiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55 JiBfYSwgY29uc3QgQ09SQkE6Ok1vZHVsZURlc2NyaXB0aW9uJiBfcyk7CmV4dGVybiB2b2lkIG9w ZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6TW9kdWxlRGVzY3JpcHRpb24qIF9zcCk7 CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwg Q09SQkE6Ok1vZHVsZURlc2NyaXB0aW9uKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9w ZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6TW9kdWxlRGVzY3Jp cHRpb24qJiBfc3ApOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkNv bnN0YW50RGVmX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJB OjpDb25zdGFudERlZl9wdHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3Qg Q09SQkE6OkFueSYgX2EsIENPUkJBOjpDb25zdGFudERlZl9wdHImIF9zKTsKCmV4dGVybiB2b2lk IG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6Q29uc3RhbnREZXNjcmlw dGlvbiYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6 OkNvbnN0YW50RGVzY3JpcHRpb24qIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRv cj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkNvbnN0YW50RGVzY3JpcHRpb24qJiBf c3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYg X2EsIGNvbnN0IENPUkJBOjpDb25zdGFudERlc2NyaXB0aW9uKiYgX3NwKTsKCnZvaWQgb3BlcmF0 b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpUeXBlZGVmRGVmX3B0ciBfcyk7CnZvaWQgb3Bl cmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpUeXBlZGVmRGVmX3B0ciogX3MpOwpDT1JC QTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlR5cGVk ZWZEZWZfcHRyJiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwg Y29uc3QgQ09SQkE6OlR5cGVEZXNjcmlwdGlvbiYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8 PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlR5cGVEZXNjcmlwdGlvbiogX3NwKTsKZXh0ZXJuIENP UkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VHlw ZURlc2NyaXB0aW9uKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNv bnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6VHlwZURlc2NyaXB0aW9uKiYgX3NwKTsK CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpTdHJ1Y3REZWZfcHRyIF9z KTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlN0cnVjdERlZl9wdHIq IF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENP UkJBOjpTdHJ1Y3REZWZfcHRyJiBfcyk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9h LCBDT1JCQTo6VW5pb25EZWZfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBf YSwgQ09SQkE6OlVuaW9uRGVmX3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlVuaW9uRGVmX3B0ciYgX3MpOwoKdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkVudW1EZWZfcHRyIF9zKTsKdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkVudW1EZWZfcHRyKiBfcyk7CkNPUkJBOjpC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6RW51bURlZl9w dHImIF9zKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpBbGlhc0Rl Zl9wdHIgX3MpOwp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6QWxpYXNE ZWZfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm IF9hLCBDT1JCQTo6QWxpYXNEZWZfcHRyJiBfcyk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpB bnkmIF9hLCBDT1JCQTo6TmF0aXZlRGVmX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYgX2EsIENPUkJBOjpOYXRpdmVEZWZfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6TmF0aXZlRGVmX3B0ciYgX3MpOwoK dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlByaW1pdGl2ZURlZl9wdHIg X3MpOwp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6UHJpbWl0aXZlRGVm X3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBf YSwgQ09SQkE6OlByaW1pdGl2ZURlZl9wdHImIF9zKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYgX2EsIENPUkJBOjpTdHJpbmdEZWZfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JC QTo6QW55JiBfYSwgQ09SQkE6OlN0cmluZ0RlZl9wdHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3Bl cmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpTdHJpbmdEZWZfcHRyJiBfcyk7 Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6V3N0cmluZ0RlZl9wdHIg X3MpOwp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6V3N0cmluZ0RlZl9w dHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2Es IENPUkJBOjpXc3RyaW5nRGVmX3B0ciYgX3MpOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55 JiBfYSwgQ09SQkE6OkZpeGVkRGVmX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFu eSYgX2EsIENPUkJBOjpGaXhlZERlZl9wdHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpGaXhlZERlZl9wdHImIF9zKTsKCnZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpTZXF1ZW5jZURlZl9wdHIgX3MpOwp2 b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6U2VxdWVuY2VEZWZfcHRyKiBf cyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JC QTo6U2VxdWVuY2VEZWZfcHRyJiBfcyk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9h LCBDT1JCQTo6QXJyYXlEZWZfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBf YSwgQ09SQkE6OkFycmF5RGVmX3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkFycmF5RGVmX3B0ciYgX3MpOwoKdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkV4Y2VwdGlvbkRlZl9wdHIgX3MpOwp2b2lk IG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6RXhjZXB0aW9uRGVmX3B0ciogX3Mp OwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6 OkV4Y2VwdGlvbkRlZl9wdHImIF9zKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpB bnkmIF9hLCBjb25zdCBDT1JCQTo6RXhjZXB0aW9uRGVzY3JpcHRpb24mIF9zKTsKZXh0ZXJuIHZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpFeGNlcHRpb25EZXNjcmlwdGlv biogX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpB bnkmIF9hLCBDT1JCQTo6RXhjZXB0aW9uRGVzY3JpcHRpb24qJiBfc3ApOwpleHRlcm4gQ09SQkE6 OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpF eGNlcHRpb25EZXNjcmlwdGlvbiomIF9zcCk7CgppbmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0oQ09S QkE6OkF0dHJpYnV0ZU1vZGUgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgOjpvcGVyYXRv cj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChD T1JCQTo6QXR0cmlidXRlTW9kZSYgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6 OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8wUkxf ZSkgewogICAgY2FzZSBDT1JCQTo6QVRUUl9OT1JNQUw6CgogICAgY2FzZSBDT1JCQTo6QVRUUl9S RUFET05MWToKCiAgICBfZSA9IChDT1JCQTo6QXR0cmlidXRlTW9kZSkgXzBSTF9lOwogICAgYnJl YWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9CgppbmxpbmUg dm9pZCBvcGVyYXRvciA+Pj0oQ09SQkE6OkF0dHJpYnV0ZU1vZGUgX2UsIE1lbUJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5l IHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QXR0cmlidXRlTW9kZSYgX2UsIE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxf ZSxzKTsKICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDT1JCQTo6QVRUUl9OT1JNQUw6Cgog ICAgY2FzZSBDT1JCQTo6QVRUUl9SRUFET05MWToKCiAgICBfZSA9IChDT1JCQTo6QXR0cmlidXRl TW9kZSkgXzBSTF9lOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vy cm9yKCk7CiAgfQp9Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6QXR0 cmlidXRlTW9kZSBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpB bnkmIF9hLCBDT1JCQTo6QXR0cmlidXRlTW9kZSYgX3MpOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JC QTo6QW55JiBfYSwgQ09SQkE6OkF0dHJpYnV0ZURlZl9wdHIgX3MpOwp2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6QXR0cmlidXRlRGVmX3B0ciogX3MpOwpDT1JCQTo6Qm9v bGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkF0dHJpYnV0ZURl Zl9wdHImIF9zKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25z dCBDT1JCQTo6QXR0cmlidXRlRGVzY3JpcHRpb24mIF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8 PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpBdHRyaWJ1dGVEZXNjcmlwdGlvbiogX3NwKTsKZXh0 ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JC QTo6QXR0cmlidXRlRGVzY3JpcHRpb24qJiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3Bl cmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpBdHRyaWJ1dGVEZXNj cmlwdGlvbiomIF9zcCk7CgppbmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0oQ09SQkE6Ok9wZXJhdGlv bk1vZGUgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6 OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6T3BlcmF0 aW9uTW9kZSYgX2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxf ZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2Fz ZSBDT1JCQTo6T1BfTk9STUFMOgoKICAgIGNhc2UgQ09SQkE6Ok9QX09ORVdBWToKCiAgICBfZSA9 IChDT1JCQTo6T3BlcmF0aW9uTW9kZSkgXzBSTF9lOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAg IF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9CgppbmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0o Q09SQkE6Ok9wZXJhdGlvbk1vZGUgX2UsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgOjpvcGVy YXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9 IChDT1JCQTo6T3BlcmF0aW9uTW9kZSYgX2UsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09S QkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8w UkxfZSkgewogICAgY2FzZSBDT1JCQTo6T1BfTk9STUFMOgoKICAgIGNhc2UgQ09SQkE6Ok9QX09O RVdBWToKCiAgICBfZSA9IChDT1JCQTo6T3BlcmF0aW9uTW9kZSkgXzBSTF9lOwogICAgYnJlYWs7 CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9Cgp2b2lkIG9wZXJh dG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6T3BlcmF0aW9uTW9kZSBfcyk7CkNPUkJBOjpC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6T3BlcmF0aW9u TW9kZSYgX3MpOwoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPj49KENPUkJBOjpQYXJhbWV0ZXJNb2Rl IF9lLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIDo6b3BlcmF0b3I+Pj0oKENPUkJBOjpVTG9u ZylfZSwgcyk7Cn0KCmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OlBhcmFtZXRlck1v ZGUmIF9lLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpVTG9uZyBfMFJMX2U7CiAg OjpvcGVyYXRvcjw8PShfMFJMX2Uscyk7CiAgc3dpdGNoIChfMFJMX2UpIHsKICAgIGNhc2UgQ09S QkE6OlBBUkFNX0lOOgoKICAgIGNhc2UgQ09SQkE6OlBBUkFNX09VVDoKCiAgICBjYXNlIENPUkJB OjpQQVJBTV9JTk9VVDoKCiAgICBfZSA9IChDT1JCQTo6UGFyYW1ldGVyTW9kZSkgXzBSTF9lOwog ICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9Cgpp bmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0oQ09SQkE6OlBhcmFtZXRlck1vZGUgX2UsIE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoK aW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6UGFyYW1ldGVyTW9kZSYgX2UsIE1lbUJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9 KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDT1JCQTo6UEFSQU1fSU46 CgogICAgY2FzZSBDT1JCQTo6UEFSQU1fT1VUOgoKICAgIGNhc2UgQ09SQkE6OlBBUkFNX0lOT1VU OgoKICAgIF9lID0gKENPUkJBOjpQYXJhbWV0ZXJNb2RlKSBfMFJMX2U7CiAgICBicmVhazsKICBk ZWZhdWx0OgogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKICB9Cn0KCnZvaWQgb3BlcmF0b3I8 PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpQYXJhbWV0ZXJNb2RlIF9zKTsKQ09SQkE6OkJvb2xl YW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpQYXJhbWV0ZXJNb2Rl JiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09S QkE6OlBhcmFtZXRlckRlc2NyaXB0aW9uJiBfcyk7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmIF9hLCBDT1JCQTo6UGFyYW1ldGVyRGVzY3JpcHRpb24qIF9zcCk7CmV4dGVybiBD T1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlBh cmFtZXRlckRlc2NyaXB0aW9uKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6UGFyYW1ldGVyRGVzY3JpcHRp b24qJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29u c3QgQ09SQkE6OlBhckRlc2NyaXB0aW9uU2VxJiBfcyk7CmlubGluZSB2b2lkIG9wZXJhdG9yIDw8 PSAoQ09SQkE6OkFueSYgX2EsIENPUkJBOjpQYXJEZXNjcmlwdGlvblNlcSogX3NwKSB7CiAgX2Eg PDw9ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3Ig Pj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlBhckRlc2NyaXB0aW9uU2VxKiYgX3Nw KTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYg X2EsIGNvbnN0IENPUkJBOjpQYXJEZXNjcmlwdGlvblNlcSomIF9zcCk7CgpleHRlcm4gdm9pZCBv cGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6Q29udGV4dElkU2VxJiBf cyk7CmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIENPUkJBOjpDb250 ZXh0SWRTZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9D T1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpD b250ZXh0SWRTZXEqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChj b25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkNvbnRleHRJZFNlcSomIF9zcCk7Cgpl eHRlcm4gdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6RXhj ZXB0aW9uRGVmU2VxJiBfcyk7CmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYg X2EsIENPUkJBOjpFeGNlcHRpb25EZWZTZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwogIGRlbGV0 ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6 OkFueSYgX2EsIENPUkJBOjpFeGNlcHRpb25EZWZTZXEqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jv b2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkV4 Y2VwdGlvbkRlZlNlcSomIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpB bnkmIF9hLCBjb25zdCBDT1JCQTo6RXhjRGVzY3JpcHRpb25TZXEmIF9zKTsKaW5saW5lIHZvaWQg b3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkV4Y0Rlc2NyaXB0aW9uU2VxKiBf c3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFfQm9vbGVh biBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6RXhjRGVzY3JpcHRp b25TZXEqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBD T1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkV4Y0Rlc2NyaXB0aW9uU2VxKiYgX3NwKTsKCnZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpPcGVyYXRpb25EZWZfcHRyIF9z KTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6Ok9wZXJhdGlvbkRlZl9w dHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2Es IENPUkJBOjpPcGVyYXRpb25EZWZfcHRyJiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6Ok9wZXJhdGlvbkRlc2NyaXB0aW9uJiBfcyk7CmV4 dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6T3BlcmF0aW9uRGVz Y3JpcHRpb24qIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBD T1JCQTo6QW55JiBfYSwgQ09SQkE6Ok9wZXJhdGlvbkRlc2NyaXB0aW9uKiYgX3NwKTsKZXh0ZXJu IENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBD T1JCQTo6T3BlcmF0aW9uRGVzY3JpcHRpb24qJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3Ig PDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlJlcG9zaXRvcnlJZFNlcSYgX3MpOwpp bmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6UmVwb3NpdG9y eUlkU2VxKiBfc3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09S QkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6UmVw b3NpdG9yeUlkU2VxKiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAo Y29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpSZXBvc2l0b3J5SWRTZXEqJiBfc3Ap OwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6 Ok9wRGVzY3JpcHRpb25TZXEmIF9zKTsKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6 QW55JiBfYSwgQ09SQkE6Ok9wRGVzY3JpcHRpb25TZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwog IGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3Qg Q09SQkE6OkFueSYgX2EsIENPUkJBOjpPcERlc2NyaXB0aW9uU2VxKiYgX3NwKTsKZXh0ZXJuIF9D T1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENP UkJBOjpPcERlc2NyaXB0aW9uU2VxKiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yIDw8PSAo Q09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpBdHRyRGVzY3JpcHRpb25TZXEmIF9zKTsKaW5s aW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkF0dHJEZXNjcmlw dGlvblNlcSogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NP UkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkF0 dHJEZXNjcmlwdGlvblNlcSomIF9zcCk7CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+ Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6QXR0ckRlc2NyaXB0aW9uU2Vx KiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBD T1JCQTo6SW50ZXJmYWNlRGVmOjpGdWxsSW50ZXJmYWNlRGVzY3JpcHRpb24mIF9zKTsKZXh0ZXJu IHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpJbnRlcmZhY2VEZWY6OkZ1 bGxJbnRlcmZhY2VEZXNjcmlwdGlvbiogX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6SW50ZXJmYWNlRGVmOjpGdWxsSW50 ZXJmYWNlRGVzY3JpcHRpb24qJiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpJbnRlcmZhY2VEZWY6OkZ1bGxJ bnRlcmZhY2VEZXNjcmlwdGlvbiomIF9zcCk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkm IF9hLCBDT1JCQTo6SW50ZXJmYWNlRGVmX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYgX2EsIENPUkJBOjpJbnRlcmZhY2VEZWZfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9w ZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6SW50ZXJmYWNlRGVmX3B0ciYg X3MpOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJB OjpJbnRlcmZhY2VEZXNjcmlwdGlvbiYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JC QTo6QW55JiBfYSwgQ09SQkE6OkludGVyZmFjZURlc2NyaXB0aW9uKiBfc3ApOwpleHRlcm4gQ09S QkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpJbnRl cmZhY2VEZXNjcmlwdGlvbiomIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+ PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OkludGVyZmFjZURlc2NyaXB0aW9u KiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBD T1JCQTo6VmFsdWVNZW1iZXImIF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFu eSYgX2EsIENPUkJBOjpWYWx1ZU1lbWJlciogX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9w ZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVNZW1iZXIqJiBfc3Ap OwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2Es IGNvbnN0IENPUkJBOjpWYWx1ZU1lbWJlciomIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRvciA8 PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6VmFsdWVNZW1iZXJTZXEmIF9zKTsKaW5s aW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlZhbHVlTWVtYmVy U2VxKiBfc3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFf Qm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVN ZW1iZXJTZXEqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25z dCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlZhbHVlTWVtYmVyU2VxKiYgX3NwKTsKCnZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpWYWx1ZU1lbWJlckRlZl9wdHIg X3MpOwp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVNZW1iZXJE ZWZfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm IF9hLCBDT1JCQTo6VmFsdWVNZW1iZXJEZWZfcHRyJiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlZhbHVlRGVmOjpGdWxsVmFsdWVEZXNj cmlwdGlvbiYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09S QkE6OlZhbHVlRGVmOjpGdWxsVmFsdWVEZXNjcmlwdGlvbiogX3NwKTsKZXh0ZXJuIENPUkJBOjpC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVEZWY6 OkZ1bGxWYWx1ZURlc2NyaXB0aW9uKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6VmFsdWVEZWY6OkZ1bGxW YWx1ZURlc2NyaXB0aW9uKiYgX3NwKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2Es IENPUkJBOjpWYWx1ZURlZl9wdHIgX3MpOwp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9h LCBDT1JCQTo6VmFsdWVEZWZfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNv bnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVEZWZfcHRyJiBfcyk7CgpleHRlcm4gdm9p ZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlZhbHVlRGVzY3JpcHRp b24mIF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENPUkJBOjpW YWx1ZURlc2NyaXB0aW9uKiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0o Y29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpWYWx1ZURlc2NyaXB0aW9uKiYgX3NwKTsKZXh0 ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25z dCBDT1JCQTo6VmFsdWVEZXNjcmlwdGlvbiomIF9zcCk7Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJB OjpBbnkmIF9hLCBDT1JCQTo6VmFsdWVCb3hEZWZfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgQ09SQkE6OlZhbHVlQm94RGVmX3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVh biBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlZhbHVlQm94RGVmX3B0 ciYgX3MpOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkFic3RyYWN0 SW50ZXJmYWNlRGVmX3B0ciBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENP UkJBOjpBYnN0cmFjdEludGVyZmFjZURlZl9wdHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpBYnN0cmFjdEludGVyZmFjZURlZl9w dHImIF9zKTsKCmlubGluZSBzaXplX3QKQ09SQkE6OklST2JqZWN0OjpfYWxpZ25lZFNpemUoQ09S QkE6OklST2JqZWN0X3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFs aWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQK Q09SQkE6OklST2JqZWN0OjpfbWFyc2hhbE9ialJlZihDT1JCQTo6SVJPYmplY3RfcHRyIG9iaiwg TmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9y ZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OklST2JqZWN0OjpfbWFyc2hhbE9i alJlZihDT1JCQTo6SVJPYmplY3RfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBD T1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5lIHNp emVfdApDT1JCQTo6Q29udGFpbmVkOjpfYWxpZ25lZFNpemUoQ09SQkE6OkNvbnRhaW5lZF9wdHIg b2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwg X1BEX3JlcG9JZCwgMzIsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpDb250YWluZWQ6 Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpDb250YWluZWRfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJl YW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMyLCBzKTsK fQoKaW5saW5lIHZvaWQKQ09SQkE6OkNvbnRhaW5lZDo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OkNv bnRhaW5lZF9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFs T2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzIsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpD b250YWluZXI6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6Q29udGFpbmVyX3B0ciBvYmosIHNpemVfdCBv ZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAz Miwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OkNvbnRhaW5lcjo6X21hcnNoYWxPYmpS ZWYoQ09SQkE6OkNvbnRhaW5lcl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENP UkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzIsIHMpOwp9CgppbmxpbmUgdm9p ZApDT1JCQTo6Q29udGFpbmVyOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6Q29udGFpbmVyX3B0ciBv YmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBf UERfcmVwb0lkLCAzMiwgcyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6OklETFR5cGU6Ol9hbGln bmVkU2l6ZShDT1JCQTo6SURMVHlwZV9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJu IENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzAsIG9mZnNldCk7Cn0KCmlu bGluZSB2b2lkCkNPUkJBOjpJRExUeXBlOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6SURMVHlwZV9w dHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9i aiwgX1BEX3JlcG9JZCwgMzAsIHMpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6SURMVHlwZTo6X21h cnNoYWxPYmpSZWYoQ09SQkE6OklETFR5cGVfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMp IHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMwLCBzKTsKfQoKaW5s aW5lIHNpemVfdApDT1JCQTo6UmVwb3NpdG9yeTo6X2FsaWduZWRTaXplKENPUkJBOjpSZXBvc2l0 b3J5X3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpS ZWYob2JqLCBfUERfcmVwb0lkLCAzMywgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlJl cG9zaXRvcnk6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpSZXBvc2l0b3J5X3B0ciBvYmosIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lk LCAzMywgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpSZXBvc2l0b3J5OjpfbWFyc2hhbE9ialJl ZihDT1JCQTo6UmVwb3NpdG9yeV9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENP UkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzMsIHMpOwp9CgppbmxpbmUgc2l6 ZV90CkNPUkJBOjpNb2R1bGVEZWY6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6TW9kdWxlRGVmX3B0ciBv YmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBf UERfcmVwb0lkLCAzMiwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6Ok1vZHVsZURlZjo6 X21hcnNoYWxPYmpSZWYoQ09SQkE6Ok1vZHVsZURlZl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVh bSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzIsIHMpOwp9 CgppbmxpbmUgdm9pZApDT1JCQTo6TW9kdWxlRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6TW9k dWxlRGVmX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxP YmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMiwgcyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6OkNv bnN0YW50RGVmOjpfYWxpZ25lZFNpemUoQ09SQkE6OkNvbnN0YW50RGVmX3B0ciBvYmosIHNpemVf dCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lk LCAzNCwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OkNvbnN0YW50RGVmOjpfbWFyc2hh bE9ialJlZihDT1JCQTo6Q29uc3RhbnREZWZfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMp IHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDM0LCBzKTsKfQoKaW5s aW5lIHZvaWQKQ09SQkE6OkNvbnN0YW50RGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6Q29uc3Rh bnREZWZfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9i alJlZihvYmosIF9QRF9yZXBvSWQsIDM0LCBzKTsKfQoKaW5saW5lIHNpemVfdApDT1JCQTo6VHlw ZWRlZkRlZjo6X2FsaWduZWRTaXplKENPUkJBOjpUeXBlZGVmRGVmX3B0ciBvYmosIHNpemVfdCBv ZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAz Mywgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlR5cGVkZWZEZWY6Ol9tYXJzaGFsT2Jq UmVmKENPUkJBOjpUeXBlZGVmRGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAg Q09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMywgcyk7Cn0KCmlubGluZSB2 b2lkCkNPUkJBOjpUeXBlZGVmRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6VHlwZWRlZkRlZl9w dHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9i aiwgX1BEX3JlcG9JZCwgMzMsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpTdHJ1Y3REZWY6 Ol9hbGlnbmVkU2l6ZShDT1JCQTo6U3RydWN0RGVmX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsK ICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMiwgb2Zmc2V0 KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlN0cnVjdERlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6 OlN0cnVjdERlZl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJz aGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzIsIHMpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6 U3RydWN0RGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6U3RydWN0RGVmX3B0ciBvYmosIE1lbUJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lk LCAzMiwgcyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6OlVuaW9uRGVmOjpfYWxpZ25lZFNpemUo Q09SQkE6OlVuaW9uRGVmX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6 OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwgb2Zmc2V0KTsKfQoKaW5saW5lIHZv aWQKQ09SQkE6OlVuaW9uRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6VW5pb25EZWZfcHRyIG9i aiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9Q RF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlVuaW9uRGVmOjpfbWFyc2hh bE9ialJlZihDT1JCQTo6VW5pb25EZWZfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsK ICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5l IHNpemVfdApDT1JCQTo6RW51bURlZjo6X2FsaWduZWRTaXplKENPUkJBOjpFbnVtRGVmX3B0ciBv YmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBf UERfcmVwb0lkLCAzMCwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OkVudW1EZWY6Ol9t YXJzaGFsT2JqUmVmKENPUkJBOjpFbnVtRGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBz KSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMCwgcyk7Cn0KCmlu bGluZSB2b2lkCkNPUkJBOjpFbnVtRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6RW51bURlZl9w dHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9i aiwgX1BEX3JlcG9JZCwgMzAsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpBbGlhc0RlZjo6 X2FsaWduZWRTaXplKENPUkJBOjpBbGlhc0RlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAg cmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzEsIG9mZnNldCk7 Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpBbGlhc0RlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OkFs aWFzRGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxP YmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpBbGlh c0RlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OkFsaWFzRGVmX3B0ciBvYmosIE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwg cyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6Ok5hdGl2ZURlZjo6X2FsaWduZWRTaXplKENPUkJB OjpOYXRpdmVEZWZfcHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JCQTo6QWxp Z25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMyLCBvZmZzZXQpOwp9CgppbmxpbmUgdm9pZApD T1JCQTo6TmF0aXZlRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6TmF0aXZlRGVmX3B0ciBvYmos IE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERf cmVwb0lkLCAzMiwgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpOYXRpdmVEZWY6Ol9tYXJzaGFs T2JqUmVmKENPUkJBOjpOYXRpdmVEZWZfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsK ICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMyLCBzKTsKfQoKaW5saW5l IHNpemVfdApDT1JCQTo6UHJpbWl0aXZlRGVmOjpfYWxpZ25lZFNpemUoQ09SQkE6OlByaW1pdGl2 ZURlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2Jq UmVmKG9iaiwgX1BEX3JlcG9JZCwgMzUsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpQ cmltaXRpdmVEZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpQcmltaXRpdmVEZWZfcHRyIG9iaiwg TmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9y ZXBvSWQsIDM1LCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlByaW1pdGl2ZURlZjo6X21hcnNo YWxPYmpSZWYoQ09SQkE6OlByaW1pdGl2ZURlZl9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYg cykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzUsIHMpOwp9Cgpp bmxpbmUgc2l6ZV90CkNPUkJBOjpTdHJpbmdEZWY6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6U3RyaW5n RGVmX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpS ZWYob2JqLCBfUERfcmVwb0lkLCAzMiwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlN0 cmluZ0RlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OlN0cmluZ0RlZl9wdHIgb2JqLCBOZXRCdWZm ZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwg MzIsIHMpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6U3RyaW5nRGVmOjpfbWFyc2hhbE9ialJlZihD T1JCQTo6U3RyaW5nRGVmX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6 Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMiwgcyk7Cn0KCmlubGluZSBzaXplX3QK Q09SQkE6OldzdHJpbmdEZWY6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6V3N0cmluZ0RlZl9wdHIgb2Jq LCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BE X3JlcG9JZCwgMzMsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpXc3RyaW5nRGVmOjpf bWFyc2hhbE9ialJlZihDT1JCQTo6V3N0cmluZ0RlZl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVh bSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzMsIHMpOwp9 CgppbmxpbmUgdm9pZApDT1JCQTo6V3N0cmluZ0RlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6Oldz dHJpbmdEZWZfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hh bE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMzLCBzKTsKfQoKaW5saW5lIHNpemVfdApDT1JCQTo6 Rml4ZWREZWY6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6Rml4ZWREZWZfcHRyIG9iaiwgc2l6ZV90IG9m ZnNldCkgewogIHJldHVybiBDT1JCQTo6QWxpZ25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMx LCBvZmZzZXQpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6Rml4ZWREZWY6Ol9tYXJzaGFsT2JqUmVm KENPUkJBOjpGaXhlZERlZl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJB OjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzEsIHMpOwp9CgppbmxpbmUgdm9pZApD T1JCQTo6Rml4ZWREZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpGaXhlZERlZl9wdHIgb2JqLCBN ZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3Jl cG9JZCwgMzEsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpTZXF1ZW5jZURlZjo6X2FsaWdu ZWRTaXplKENPUkJBOjpTZXF1ZW5jZURlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0 dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzQsIG9mZnNldCk7Cn0K CmlubGluZSB2b2lkCkNPUkJBOjpTZXF1ZW5jZURlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OlNl cXVlbmNlRGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNo YWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzNCwgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpT ZXF1ZW5jZURlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OlNlcXVlbmNlRGVmX3B0ciBvYmosIE1l bUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVw b0lkLCAzNCwgcyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6OkFycmF5RGVmOjpfYWxpZ25lZFNp emUoQ09SQkE6OkFycmF5RGVmX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09S QkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwgb2Zmc2V0KTsKfQoKaW5saW5l IHZvaWQKQ09SQkE6OkFycmF5RGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6QXJyYXlEZWZfcHRy IG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmos IF9QRF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OkFycmF5RGVmOjpfbWFy c2hhbE9ialJlZihDT1JCQTo6QXJyYXlEZWZfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMp IHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5s aW5lIHNpemVfdApDT1JCQTo6RXhjZXB0aW9uRGVmOjpfYWxpZ25lZFNpemUoQ09SQkE6OkV4Y2Vw dGlvbkRlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVk T2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzUsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCkNPUkJB OjpFeGNlcHRpb25EZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpFeGNlcHRpb25EZWZfcHRyIG9i aiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9Q RF9yZXBvSWQsIDM1LCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OkV4Y2VwdGlvbkRlZjo6X21h cnNoYWxPYmpSZWYoQ09SQkE6OkV4Y2VwdGlvbkRlZl9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVh bSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzUsIHMpOwp9 CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpBdHRyaWJ1dGVEZWY6Ol9hbGlnbmVkU2l6ZShDT1JCQTo6 QXR0cmlidXRlRGVmX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFs aWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzNSwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQK Q09SQkE6OkF0dHJpYnV0ZURlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OkF0dHJpYnV0ZURlZl9w dHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9i aiwgX1BEX3JlcG9JZCwgMzUsIHMpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6QXR0cmlidXRlRGVm OjpfbWFyc2hhbE9ialJlZihDT1JCQTo6QXR0cmlidXRlRGVmX3B0ciBvYmosIE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzNSwg cyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6Ok9wZXJhdGlvbkRlZjo6X2FsaWduZWRTaXplKENP UkJBOjpPcGVyYXRpb25EZWZfcHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JC QTo6QWxpZ25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDM1LCBvZmZzZXQpOwp9CgppbmxpbmUg dm9pZApDT1JCQTo6T3BlcmF0aW9uRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6T3BlcmF0aW9u RGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpS ZWYob2JqLCBfUERfcmVwb0lkLCAzNSwgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpPcGVyYXRp b25EZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpPcGVyYXRpb25EZWZfcHRyIG9iaiwgTWVtQnVm ZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQs IDM1LCBzKTsKfQoKaW5saW5lIHNpemVfdApDT1JCQTo6SW50ZXJmYWNlRGVmOjpfYWxpZ25lZFNp emUoQ09SQkE6OkludGVyZmFjZURlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJu IENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzUsIG9mZnNldCk7Cn0KCmlu bGluZSB2b2lkCkNPUkJBOjpJbnRlcmZhY2VEZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpJbnRl cmZhY2VEZWZfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hh bE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDM1LCBzKTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6Oklu dGVyZmFjZURlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OkludGVyZmFjZURlZl9wdHIgb2JqLCBN ZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3Jl cG9JZCwgMzUsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpWYWx1ZU1lbWJlckRlZjo6X2Fs aWduZWRTaXplKENPUkJBOjpWYWx1ZU1lbWJlckRlZl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7 CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzcsIG9mZnNl dCk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpWYWx1ZU1lbWJlckRlZjo6X21hcnNoYWxPYmpSZWYo Q09SQkE6OlZhbHVlTWVtYmVyRGVmX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAg Q09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzNywgcyk7Cn0KCmlubGluZSB2 b2lkCkNPUkJBOjpWYWx1ZU1lbWJlckRlZjo6X21hcnNoYWxPYmpSZWYoQ09SQkE6OlZhbHVlTWVt YmVyRGVmX3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxP YmpSZWYob2JqLCBfUERfcmVwb0lkLCAzNywgcyk7Cn0KCmlubGluZSBzaXplX3QKQ09SQkE6OlZh bHVlRGVmOjpfYWxpZ25lZFNpemUoQ09SQkE6OlZhbHVlRGVmX3B0ciBvYmosIHNpemVfdCBvZmZz ZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAzMSwg b2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ09SQkE6OlZhbHVlRGVmOjpfbWFyc2hhbE9ialJlZihD T1JCQTo6VmFsdWVEZWZfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6 TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDMxLCBzKTsKfQoKaW5saW5lIHZvaWQKQ09S QkE6OlZhbHVlRGVmOjpfbWFyc2hhbE9ialJlZihDT1JCQTo6VmFsdWVEZWZfcHRyIG9iaiwgTWVt QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBv SWQsIDMxLCBzKTsKfQoKaW5saW5lIHNpemVfdApDT1JCQTo6VmFsdWVCb3hEZWY6Ol9hbGlnbmVk U2l6ZShDT1JCQTo6VmFsdWVCb3hEZWZfcHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVy biBDT1JCQTo6QWxpZ25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDM0LCBvZmZzZXQpOwp9Cgpp bmxpbmUgdm9pZApDT1JCQTo6VmFsdWVCb3hEZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpWYWx1 ZUJveERlZl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFs T2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzQsIHMpOwp9CgppbmxpbmUgdm9pZApDT1JCQTo6VmFs dWVCb3hEZWY6Ol9tYXJzaGFsT2JqUmVmKENPUkJBOjpWYWx1ZUJveERlZl9wdHIgb2JqLCBNZW1C dWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9J ZCwgMzQsIHMpOwp9CgppbmxpbmUgc2l6ZV90CkNPUkJBOjpBYnN0cmFjdEludGVyZmFjZURlZjo6 X2FsaWduZWRTaXplKENPUkJBOjpBYnN0cmFjdEludGVyZmFjZURlZl9wdHIgb2JqLCBzaXplX3Qg b2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwg NDMsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpBYnN0cmFjdEludGVyZmFjZURlZjo6 X21hcnNoYWxPYmpSZWYoQ09SQkE6OkFic3RyYWN0SW50ZXJmYWNlRGVmX3B0ciBvYmosIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lk LCA0Mywgcyk7Cn0KCmlubGluZSB2b2lkCkNPUkJBOjpBYnN0cmFjdEludGVyZmFjZURlZjo6X21h cnNoYWxPYmpSZWYoQ09SQkE6OkFic3RyYWN0SW50ZXJmYWNlRGVmX3B0ciBvYmosIE1lbUJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0 Mywgcyk7Cn0KIyAyNjQ1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDIK CgoKbmFtZXNwYWNlIFBPQV9DT1JCQQp7CgojIDEgIi4uL29tbmlPUkIzL2NvcmJhaWRsX3BvYS5o aCIgMQojIDI2NTIgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMgoKIyAx ICIuLi9vbW5pT1JCMy9pcl9wb2EuaGgiIDEKCgoKCmNsYXNzIElST2JqZWN0IDoKICBwdWJsaWMg dmlydHVhbCBDT1JCQTo6X2ltcGxfSVJPYmplY3QsCiAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVT ZXJ2ZXI6OlNlcnZhbnRCYXNlCnsKcHVibGljOgogIHZpcnR1YWwgfklST2JqZWN0KCk7CgogIGlu bGluZSBDT1JCQTo6SVJPYmplY3RfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6SVJP YmplY3RfcHRyKSBfZG9fdGhpcyhDT1JCQTo6SVJPYmplY3Q6Ol9QRF9yZXBvSWQpOwogIH0KfTsK CmNsYXNzIENvbnRhaW5lZCA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX0NvbnRhaW5l ZCwKICBwdWJsaWMgdmlydHVhbCBJUk9iamVjdAp7CnB1YmxpYzoKICB2aXJ0dWFsIH5Db250YWlu ZWQoKTsKCiAgaW5saW5lIENPUkJBOjpDb250YWluZWRfcHRyIF90aGlzKCkgewogICAgcmV0dXJu IChDT1JCQTo6Q29udGFpbmVkX3B0cikgX2RvX3RoaXMoQ09SQkE6OkNvbnRhaW5lZDo6X1BEX3Jl cG9JZCk7CiAgfQp9OwoKY2xhc3MgQ29udGFpbmVyIDoKICBwdWJsaWMgdmlydHVhbCBDT1JCQTo6 X2ltcGxfQ29udGFpbmVyLAogIHB1YmxpYyB2aXJ0dWFsIElST2JqZWN0CnsKcHVibGljOgogIHZp cnR1YWwgfkNvbnRhaW5lcigpOwoKICBpbmxpbmUgQ09SQkE6OkNvbnRhaW5lcl9wdHIgX3RoaXMo KSB7CiAgICByZXR1cm4gKENPUkJBOjpDb250YWluZXJfcHRyKSBfZG9fdGhpcyhDT1JCQTo6Q29u dGFpbmVyOjpfUERfcmVwb0lkKTsKICB9Cn07CgpjbGFzcyBJRExUeXBlIDoKICBwdWJsaWMgdmly dHVhbCBDT1JCQTo6X2ltcGxfSURMVHlwZSwKICBwdWJsaWMgdmlydHVhbCBJUk9iamVjdAp7CnB1 YmxpYzoKICB2aXJ0dWFsIH5JRExUeXBlKCk7CgogIGlubGluZSBDT1JCQTo6SURMVHlwZV9wdHIg X3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpJRExUeXBlX3B0cikgX2RvX3RoaXMoQ09SQkE6 OklETFR5cGU6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNzIFJlcG9zaXRvcnkgOgogIHB1Ymxp YyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9SZXBvc2l0b3J5LAogIHB1YmxpYyB2aXJ0dWFsIENvbnRh aW5lcgp7CnB1YmxpYzoKICB2aXJ0dWFsIH5SZXBvc2l0b3J5KCk7CgogIGlubGluZSBDT1JCQTo6 UmVwb3NpdG9yeV9wdHIgX3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpSZXBvc2l0b3J5X3B0 cikgX2RvX3RoaXMoQ09SQkE6OlJlcG9zaXRvcnk6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNz IE1vZHVsZURlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX01vZHVsZURlZiwKICBw dWJsaWMgdmlydHVhbCBDb250YWluZXIsCiAgICBwdWJsaWMgdmlydHVhbCBDb250YWluZWQKewpw dWJsaWM6CiAgdmlydHVhbCB+TW9kdWxlRGVmKCk7CgogIGlubGluZSBDT1JCQTo6TW9kdWxlRGVm X3B0ciBfdGhpcygpIHsKICAgIHJldHVybiAoQ09SQkE6Ok1vZHVsZURlZl9wdHIpIF9kb190aGlz KENPUkJBOjpNb2R1bGVEZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNzIENvbnN0YW50RGVm IDoKICBwdWJsaWMgdmlydHVhbCBDT1JCQTo6X2ltcGxfQ29uc3RhbnREZWYsCiAgcHVibGljIHZp cnR1YWwgQ29udGFpbmVkCnsKcHVibGljOgogIHZpcnR1YWwgfkNvbnN0YW50RGVmKCk7CgogIGlu bGluZSBDT1JCQTo6Q29uc3RhbnREZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6 Q29uc3RhbnREZWZfcHRyKSBfZG9fdGhpcyhDT1JCQTo6Q29uc3RhbnREZWY6Ol9QRF9yZXBvSWQp OwogIH0KfTsKCmNsYXNzIFR5cGVkZWZEZWYgOgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1w bF9UeXBlZGVmRGVmLAogIHB1YmxpYyB2aXJ0dWFsIENvbnRhaW5lZCwKICAgIHB1YmxpYyB2aXJ0 dWFsIElETFR5cGUKewpwdWJsaWM6CiAgdmlydHVhbCB+VHlwZWRlZkRlZigpOwoKICBpbmxpbmUg Q09SQkE6OlR5cGVkZWZEZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6VHlwZWRl ZkRlZl9wdHIpIF9kb190aGlzKENPUkJBOjpUeXBlZGVmRGVmOjpfUERfcmVwb0lkKTsKICB9Cn07 CgpjbGFzcyBTdHJ1Y3REZWYgOgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9TdHJ1Y3RE ZWYsCiAgcHVibGljIHZpcnR1YWwgVHlwZWRlZkRlZiwKICAgIHB1YmxpYyB2aXJ0dWFsIENvbnRh aW5lcgp7CnB1YmxpYzoKICB2aXJ0dWFsIH5TdHJ1Y3REZWYoKTsKCiAgaW5saW5lIENPUkJBOjpT dHJ1Y3REZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6U3RydWN0RGVmX3B0cikg X2RvX3RoaXMoQ09SQkE6OlN0cnVjdERlZjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKY2xhc3MgVW5p b25EZWYgOgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9VbmlvbkRlZiwKICBwdWJsaWMg dmlydHVhbCBUeXBlZGVmRGVmLAogICAgcHVibGljIHZpcnR1YWwgQ29udGFpbmVyCnsKcHVibGlj OgogIHZpcnR1YWwgflVuaW9uRGVmKCk7CgogIGlubGluZSBDT1JCQTo6VW5pb25EZWZfcHRyIF90 aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6VW5pb25EZWZfcHRyKSBfZG9fdGhpcyhDT1JCQTo6 VW5pb25EZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNzIEVudW1EZWYgOgogIHB1YmxpYyB2 aXJ0dWFsIENPUkJBOjpfaW1wbF9FbnVtRGVmLAogIHB1YmxpYyB2aXJ0dWFsIFR5cGVkZWZEZWYK ewpwdWJsaWM6CiAgdmlydHVhbCB+RW51bURlZigpOwoKICBpbmxpbmUgQ09SQkE6OkVudW1EZWZf cHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6RW51bURlZl9wdHIpIF9kb190aGlzKENP UkJBOjpFbnVtRGVmOjpfUERfcmVwb0lkKTsKICB9Cn07CgpjbGFzcyBBbGlhc0RlZiA6CiAgcHVi bGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX0FsaWFzRGVmLAogIHB1YmxpYyB2aXJ0dWFsIFR5cGVk ZWZEZWYKewpwdWJsaWM6CiAgdmlydHVhbCB+QWxpYXNEZWYoKTsKCiAgaW5saW5lIENPUkJBOjpB bGlhc0RlZl9wdHIgX3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpBbGlhc0RlZl9wdHIpIF9k b190aGlzKENPUkJBOjpBbGlhc0RlZjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKY2xhc3MgTmF0aXZl RGVmIDoKICBwdWJsaWMgdmlydHVhbCBDT1JCQTo6X2ltcGxfTmF0aXZlRGVmLAogIHB1YmxpYyB2 aXJ0dWFsIFR5cGVkZWZEZWYKewpwdWJsaWM6CiAgdmlydHVhbCB+TmF0aXZlRGVmKCk7CgogIGlu bGluZSBDT1JCQTo6TmF0aXZlRGVmX3B0ciBfdGhpcygpIHsKICAgIHJldHVybiAoQ09SQkE6Ok5h dGl2ZURlZl9wdHIpIF9kb190aGlzKENPUkJBOjpOYXRpdmVEZWY6Ol9QRF9yZXBvSWQpOwogIH0K fTsKCmNsYXNzIFByaW1pdGl2ZURlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX1By aW1pdGl2ZURlZiwKICBwdWJsaWMgdmlydHVhbCBJRExUeXBlCnsKcHVibGljOgogIHZpcnR1YWwg flByaW1pdGl2ZURlZigpOwoKICBpbmxpbmUgQ09SQkE6OlByaW1pdGl2ZURlZl9wdHIgX3RoaXMo KSB7CiAgICByZXR1cm4gKENPUkJBOjpQcmltaXRpdmVEZWZfcHRyKSBfZG9fdGhpcyhDT1JCQTo6 UHJpbWl0aXZlRGVmOjpfUERfcmVwb0lkKTsKICB9Cn07CgpjbGFzcyBTdHJpbmdEZWYgOgogIHB1 YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9TdHJpbmdEZWYsCiAgcHVibGljIHZpcnR1YWwgSURM VHlwZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5TdHJpbmdEZWYoKTsKCiAgaW5saW5lIENPUkJBOjpT dHJpbmdEZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6U3RyaW5nRGVmX3B0cikg X2RvX3RoaXMoQ09SQkE6OlN0cmluZ0RlZjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKY2xhc3MgV3N0 cmluZ0RlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX1dzdHJpbmdEZWYsCiAgcHVi bGljIHZpcnR1YWwgSURMVHlwZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5Xc3RyaW5nRGVmKCk7Cgog IGlubGluZSBDT1JCQTo6V3N0cmluZ0RlZl9wdHIgX3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJB OjpXc3RyaW5nRGVmX3B0cikgX2RvX3RoaXMoQ09SQkE6OldzdHJpbmdEZWY6Ol9QRF9yZXBvSWQp OwogIH0KfTsKCmNsYXNzIEZpeGVkRGVmIDoKICBwdWJsaWMgdmlydHVhbCBDT1JCQTo6X2ltcGxf Rml4ZWREZWYsCiAgcHVibGljIHZpcnR1YWwgSURMVHlwZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5G aXhlZERlZigpOwoKICBpbmxpbmUgQ09SQkE6OkZpeGVkRGVmX3B0ciBfdGhpcygpIHsKICAgIHJl dHVybiAoQ09SQkE6OkZpeGVkRGVmX3B0cikgX2RvX3RoaXMoQ09SQkE6OkZpeGVkRGVmOjpfUERf cmVwb0lkKTsKICB9Cn07CgpjbGFzcyBTZXF1ZW5jZURlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09S QkE6Ol9pbXBsX1NlcXVlbmNlRGVmLAogIHB1YmxpYyB2aXJ0dWFsIElETFR5cGUKewpwdWJsaWM6 CiAgdmlydHVhbCB+U2VxdWVuY2VEZWYoKTsKCiAgaW5saW5lIENPUkJBOjpTZXF1ZW5jZURlZl9w dHIgX3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpTZXF1ZW5jZURlZl9wdHIpIF9kb190aGlz KENPUkJBOjpTZXF1ZW5jZURlZjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKY2xhc3MgQXJyYXlEZWYg OgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9BcnJheURlZiwKICBwdWJsaWMgdmlydHVh bCBJRExUeXBlCnsKcHVibGljOgogIHZpcnR1YWwgfkFycmF5RGVmKCk7CgogIGlubGluZSBDT1JC QTo6QXJyYXlEZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6QXJyYXlEZWZfcHRy KSBfZG9fdGhpcyhDT1JCQTo6QXJyYXlEZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNzIEV4 Y2VwdGlvbkRlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX0V4Y2VwdGlvbkRlZiwK ICBwdWJsaWMgdmlydHVhbCBDb250YWluZWQsCiAgICBwdWJsaWMgdmlydHVhbCBDb250YWluZXIK ewpwdWJsaWM6CiAgdmlydHVhbCB+RXhjZXB0aW9uRGVmKCk7CgogIGlubGluZSBDT1JCQTo6RXhj ZXB0aW9uRGVmX3B0ciBfdGhpcygpIHsKICAgIHJldHVybiAoQ09SQkE6OkV4Y2VwdGlvbkRlZl9w dHIpIF9kb190aGlzKENPUkJBOjpFeGNlcHRpb25EZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNs YXNzIEF0dHJpYnV0ZURlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX0F0dHJpYnV0 ZURlZiwKICBwdWJsaWMgdmlydHVhbCBDb250YWluZWQKewpwdWJsaWM6CiAgdmlydHVhbCB+QXR0 cmlidXRlRGVmKCk7CgogIGlubGluZSBDT1JCQTo6QXR0cmlidXRlRGVmX3B0ciBfdGhpcygpIHsK ICAgIHJldHVybiAoQ09SQkE6OkF0dHJpYnV0ZURlZl9wdHIpIF9kb190aGlzKENPUkJBOjpBdHRy aWJ1dGVEZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKCmNsYXNzIE9wZXJhdGlvbkRlZiA6CiAgcHVi bGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX09wZXJhdGlvbkRlZiwKICBwdWJsaWMgdmlydHVhbCBD b250YWluZWQKewpwdWJsaWM6CiAgdmlydHVhbCB+T3BlcmF0aW9uRGVmKCk7CgogIGlubGluZSBD T1JCQTo6T3BlcmF0aW9uRGVmX3B0ciBfdGhpcygpIHsKICAgIHJldHVybiAoQ09SQkE6Ok9wZXJh dGlvbkRlZl9wdHIpIF9kb190aGlzKENPUkJBOjpPcGVyYXRpb25EZWY6Ol9QRF9yZXBvSWQpOwog IH0KfTsKCmNsYXNzIEludGVyZmFjZURlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBs X0ludGVyZmFjZURlZiwKICBwdWJsaWMgdmlydHVhbCBDb250YWluZXIsCiAgICBwdWJsaWMgdmly dHVhbCBDb250YWluZWQsCiAgICBwdWJsaWMgdmlydHVhbCBJRExUeXBlCnsKcHVibGljOgogIHZp cnR1YWwgfkludGVyZmFjZURlZigpOwoKICBpbmxpbmUgQ09SQkE6OkludGVyZmFjZURlZl9wdHIg X3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpJbnRlcmZhY2VEZWZfcHRyKSBfZG9fdGhpcyhD T1JCQTo6SW50ZXJmYWNlRGVmOjpfUERfcmVwb0lkKTsKICB9Cn07CgpjbGFzcyBWYWx1ZU1lbWJl ckRlZiA6CiAgcHVibGljIHZpcnR1YWwgQ09SQkE6Ol9pbXBsX1ZhbHVlTWVtYmVyRGVmLAogIHB1 YmxpYyB2aXJ0dWFsIENvbnRhaW5lZAp7CnB1YmxpYzoKICB2aXJ0dWFsIH5WYWx1ZU1lbWJlckRl ZigpOwoKICBpbmxpbmUgQ09SQkE6OlZhbHVlTWVtYmVyRGVmX3B0ciBfdGhpcygpIHsKICAgIHJl dHVybiAoQ09SQkE6OlZhbHVlTWVtYmVyRGVmX3B0cikgX2RvX3RoaXMoQ09SQkE6OlZhbHVlTWVt YmVyRGVmOjpfUERfcmVwb0lkKTsKICB9Cn07CgpjbGFzcyBWYWx1ZURlZiA6CiAgcHVibGljIHZp cnR1YWwgQ09SQkE6Ol9pbXBsX1ZhbHVlRGVmLAogIHB1YmxpYyB2aXJ0dWFsIENvbnRhaW5lciwK ICAgIHB1YmxpYyB2aXJ0dWFsIENvbnRhaW5lZCwKICAgIHB1YmxpYyB2aXJ0dWFsIElETFR5cGUK ewpwdWJsaWM6CiAgdmlydHVhbCB+VmFsdWVEZWYoKTsKCiAgaW5saW5lIENPUkJBOjpWYWx1ZURl Zl9wdHIgX3RoaXMoKSB7CiAgICByZXR1cm4gKENPUkJBOjpWYWx1ZURlZl9wdHIpIF9kb190aGlz KENPUkJBOjpWYWx1ZURlZjo6X1BEX3JlcG9JZCk7CiAgfQp9OwoKY2xhc3MgVmFsdWVCb3hEZWYg OgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpfaW1wbF9WYWx1ZUJveERlZiwKICBwdWJsaWMgdmly dHVhbCBUeXBlZGVmRGVmCnsKcHVibGljOgogIHZpcnR1YWwgflZhbHVlQm94RGVmKCk7CgogIGlu bGluZSBDT1JCQTo6VmFsdWVCb3hEZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChDT1JCQTo6 VmFsdWVCb3hEZWZfcHRyKSBfZG9fdGhpcyhDT1JCQTo6VmFsdWVCb3hEZWY6Ol9QRF9yZXBvSWQp OwogIH0KfTsKCmNsYXNzIEFic3RyYWN0SW50ZXJmYWNlRGVmIDoKICBwdWJsaWMgdmlydHVhbCBD T1JCQTo6X2ltcGxfQWJzdHJhY3RJbnRlcmZhY2VEZWYsCiAgcHVibGljIHZpcnR1YWwgSW50ZXJm YWNlRGVmCnsKcHVibGljOgogIHZpcnR1YWwgfkFic3RyYWN0SW50ZXJmYWNlRGVmKCk7CgogIGlu bGluZSBDT1JCQTo6QWJzdHJhY3RJbnRlcmZhY2VEZWZfcHRyIF90aGlzKCkgewogICAgcmV0dXJu IChDT1JCQTo6QWJzdHJhY3RJbnRlcmZhY2VEZWZfcHRyKSBfZG9fdGhpcyhDT1JCQTo6QWJzdHJh Y3RJbnRlcmZhY2VEZWY6Ol9QRF9yZXBvSWQpOwogIH0KfTsKIyAyNjU0ICIuLi8uLi8uLi8uLi9p bmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDIKCgp9CgoKIyAxICIuLi8uLi8uLi8uLi9pbmNsdWRl L29tbmlPUkIzL2JvYS5oIiAxCiMgNTIgIi4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvYm9h LmgiCmNsYXNzIG9tbmlPcmJCb2FTZXJ2YW50IDogcHVibGljIHZpcnR1YWwgb21uaVNlcnZhbnQg ewpwdWJsaWM6CiAgdmlydHVhbCB+b21uaU9yYkJvYVNlcnZhbnQoKTsKCiAgb21uaU9yYkJvYVNl cnZhbnQoKTsKICBpbmxpbmUgb21uaU9yYkJvYVNlcnZhbnQoY29uc3Qgb21uaU9yYkJvYUtleSYg aykKICAgIDogcGRfa2V5KGspIHt9CgogIHZvaWQgX2Rpc3Bvc2UoKTsKCgoKCgoKICB2b2lkIF9v YmpfaXNfcmVhZHkoKTsKCgogIHZvaWQqIF90aGlzKGNvbnN0IGNoYXIqIHJlcG9JZCk7CgoKCiAg aW5saW5lIGNvbnN0IG9tbmlPcmJCb2FLZXkmIF9rZXkoKSBjb25zdCB7IHJldHVybiBwZF9rZXk7 IH0KICBpbmxpbmUgdm9pZCBfb2JqX2lzX3JlYWR5KENPUkJBOjpCT0FfcHRyKSB7IF9vYmpfaXNf cmVhZHkoKTsgfQogIGlubGluZSBDT1JCQTo6Qk9BX3B0ciBfYm9hKCkgeyByZXR1cm4gQ09SQkE6 OkJPQTo6Z2V0Qk9BKCk7IH0KCnByaXZhdGU6CiAgdmlydHVhbCBvbW5pT2JqUmVmKiBfZG9fZ2V0 X2ludGVyZmFjZSgpOwoKCnByb3RlY3RlZDoKICBvbW5pT3JiQm9hS2V5IHBkX2tleTsKCgoKCn07 CiMgMjY2MCAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAyCiMgNzkgInBv cnRhYmxlc2VydmVyLmNjIiAyCiMgMSAicG9haW1wbC5oIiAxCiMgNjYgInBvYWltcGwuaCIKIyAx ICJvYmplY3RBZGFwdGVyLmgiIDEKIyA0OCAib2JqZWN0QWRhcHRlci5oIgojIDEgIi4uL29tbml1 dGlsaXRpZXMuaCIgMQojIDM0ICIuLi9vbW5pdXRpbGl0aWVzLmgiCnRlbXBsYXRlIDxjbGFzcyBJ bnB1dEl0ZXJhdG9yLCBjbGFzcyBPdXRwdXRJdGVyYXRvcj4KaW5saW5lIE91dHB1dEl0ZXJhdG9y IG9tbmljb3B5KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEl0ZXJhdG9yIHJlc3VsdCkKewogIHdoaWxl KCBmaXJzdCAhPSBsYXN0ICkgKnJlc3VsdCsrID0gKmZpcnN0Kys7CgogIHJldHVybiByZXN1bHQ7 Cn0KIyA1MiAiLi4vb21uaXV0aWxpdGllcy5oIgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3Mgb21u aXZlY3RvciB7CnB1YmxpYzoKICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKICB0eXBlZGVmIFQmIHJl ZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIFQq IHBvaW50ZXI7CiAgdHlwZWRlZiBUKiBpdGVyYXRvcjsKICB0eXBlZGVmIGNvbnN0IFQqIGNvbnN0 X2l0ZXJhdG9yOwogIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKCiAgaW5saW5lIG9tbml2ZWN0 b3IoKSA6IHN0YXJ0KDApLCBmaW5pc2goMCksIGVuZF9vZl9zdG9yYWdlKDApIHt9CiAgaW5saW5l IG9tbml2ZWN0b3Ioc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHZhbHVlID0gVCgpKQogICAgOiBzdGFy dCgwKSwgZmluaXNoKDApLCBlbmRfb2Zfc3RvcmFnZSgwKSB7CiAgICByZXNlcnZlKG4pOwogICAg d2hpbGUoIG4tLSApIHB1c2hfYmFjayh2YWx1ZSk7CiAgfQogIGlubGluZSB+b21uaXZlY3Rvcigp IHsgZGVhbGxvY2F0ZSgpOyB9CgogIGlubGluZSB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIG4pIHsK ICAgIGlmKCBjYXBhY2l0eSgpIDwgbiApIHsKICAgICAgc2l6ZV90eXBlIG9sZF9zaXplID0gc2l6 ZSgpOwogICAgICBpdGVyYXRvciB0bXAgPSBhbGxvY2F0ZShuKTsKICAgICAgb21uaWNvcHkoc3Rh cnQsIGZpbmlzaCwgdG1wKTsKICAgICAgZGVhbGxvY2F0ZSgpOwogICAgICBzdGFydCA9IHRtcDsK ICAgICAgZmluaXNoID0gc3RhcnQgKyBvbGRfc2l6ZTsKICAgICAgZW5kX29mX3N0b3JhZ2UgPSBz dGFydCArIG47CiAgICB9CiAgfQoKICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBz dGFydDsgfQogIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHN0 YXJ0OyB9CiAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGZpbmlzaDsgfQogIGlubGlu ZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBmaW5pc2g7IH0KICBpbmxpbmUg c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoZmluaXNoIC0gc3RhcnQp OyB9CiAgaW5saW5lIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsKICAgIHJldHVybiBzaXpl X3R5cGUoZW5kX29mX3N0b3JhZ2UgLSBzdGFydCk7CiAgfQogIGlubGluZSBpbnQgZW1wdHkoKSBj b25zdCB7IHJldHVybiBzdGFydCA9PSBmaW5pc2g7IH0KICBpbmxpbmUgcmVmZXJlbmNlIG9wZXJh dG9yW10oc2l6ZV90eXBlIG4pIHsgcmV0dXJuICooc3RhcnQgKyBuKTsgfQogIGlubGluZSBjb25z dF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbikgY29uc3QgeyByZXR1cm4gKihzdGFy dCArIG4pOyB9CiAgaW5saW5lIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuICpzdGFydDsgfQog IGlubGluZSByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZmluaXNoIC0gMSk7IH0KICBpbmxp bmUgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgeCkgewogICAgaWYoIGZpbmlzaCA9PSBlbmRfb2Zf c3RvcmFnZSApIG1vcmUoKTsKICAgICpmaW5pc2grKyA9IHg7CiAgfQogIGlubGluZSB2b2lkIHBv cF9iYWNrKCkgeyBmaW5pc2gtLTsgfQogIGlubGluZSBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBw b3NpdGlvbikgewogICAgaWYoIHBvc2l0aW9uICsgMSAhPSBmaW5pc2ggKQogICAgICBvbW5pY29w eShwb3NpdGlvbiArIDEsIGZpbmlzaCwgcG9zaXRpb24pOwogICAgZmluaXNoLS07CiAgICByZXR1 cm4gcG9zaXRpb247CiAgfQogIGlubGluZSBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBmaXJzdCwg aXRlcmF0b3IgbGFzdCkgewogICAgaXRlcmF0b3IgaSA9IG9tbmljb3B5KGxhc3QsIGZpbmlzaCwg Zmlyc3QpOwogICAgZmluaXNoIC09IChsYXN0IC0gZmlyc3QpOwogICAgcmV0dXJuIGZpcnN0Owog IH0KIyAxMjIgIi4uL29tbml1dGlsaXRpZXMuaCIKcHJpdmF0ZToKICBpbmxpbmUgdm9pZCBtb3Jl KCkgeyByZXNlcnZlKHNpemUoKSA/IHNpemUoKSAqIDIgOiAxKTsgfQogIGlubGluZSB2b2lkIGRl YWxsb2NhdGUoKSB7IGlmKCBzdGFydCApIGRlbGV0ZVtdIHN0YXJ0OyB9CiAgaW5saW5lIGl0ZXJh dG9yIGFsbG9jYXRlKHNpemVfdHlwZSBuKSB7CiAgICByZXR1cm4gbmV3IHZhbHVlX3R5cGVbbl07 CiAgfQoKICBvbW5pdmVjdG9yPFQ+JiBvcGVyYXRvcj0oY29uc3Qgb21uaXZlY3RvcjxUPiYgeCk7 CgoKICBpdGVyYXRvciBzdGFydDsKICBpdGVyYXRvciBmaW5pc2g7CiAgaXRlcmF0b3IgZW5kX29m X3N0b3JhZ2U7Cn07CiMgNDkgIm9iamVjdEFkYXB0ZXIuaCIgMgoKCgoKCgpjbGFzcyByb3BlRmFj dG9yeUxpc3Q7CmNsYXNzIFJvcGU7CmNsYXNzIEdJT1BfUzsKY2xhc3Mgb21uaUNhbGxEZXNjcmlw dG9yOwpjbGFzcyBvbW5pTG9jYWxJZGVudGl0eTsKCgpjbGFzcyBvbW5pT2JqQWRhcHRlciB7CnB1 YmxpYzoKICB2aXJ0dWFsIH5vbW5pT2JqQWRhcHRlcigpOwoKICBzdGF0aWMgb21uaU9iakFkYXB0 ZXIqIGdldEFkYXB0ZXIoY29uc3QgX0NPUkJBX09jdGV0KiBrZXksIGludCBrZXlzaXplKTsKCgoK CgogIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc0luaXRpYWxpc2VkKCk7CgogIHN0YXRpYyB2b2lk IGluaXRpYWxpc2UoKTsKCgoKCgoKCiAgc3RhdGljIHZvaWQgc2h1dGRvd24oKTsKCgoKCgoKICB2 b2lkIGFkYXB0ZXJBY3RpdmUoKTsKICB2b2lkIGFkYXB0ZXJJbmFjdGl2ZSgpOwoKCgoKCgogIHZv aWQgd2FpdEZvckFjdGl2ZVJlcXVlc3RzVG9Db21wbGV0ZShpbnQgbG9ja2VkKTsKCgogIHZvaWQg d2FpdEZvckFsbFJlcXVlc3RzVG9Db21wbGV0ZShpbnQgbG9ja2VkKTsKCgogIHZpcnR1YWwgdm9p ZCBpbmNyUmVmQ291bnQoKSA9IDA7CiAgdmlydHVhbCB2b2lkIGRlY3JSZWZDb3VudCgpID0gMDsK CgogIHZpcnR1YWwgdm9pZCBkaXNwYXRjaChHSU9QX1MmLCBvbW5pTG9jYWxJZGVudGl0eSopID0g MDsKCgogIHZpcnR1YWwgdm9pZCBkaXNwYXRjaChHSU9QX1MmLCBjb25zdCBfQ09SQkFfT2N0ZXQq IGtleSwgaW50IGtleXNpemUpID0gMDsKCgoKICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2gob21uaUNh bGxEZXNjcmlwdG9yJiwgb21uaUxvY2FsSWRlbnRpdHkqKSA9IDA7CgoKICB2aXJ0dWFsIGludCBv YmplY3RFeGlzdHMoY29uc3QgX0NPUkJBX09jdGV0KiBrZXksIGludCBrZXlzaXplKSA9IDA7CgoK CgoKCiAgaW5saW5lIHZvaWQgZW50ZXJBZGFwdGVyKCkgewogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgIGRveyBpZiggIShwZF9uUmVx SW5UaGlzID49IDApICkgb21uaTo6YXNzZXJ0RmFpbCgib2JqZWN0QWRhcHRlci5oIiwxMjYsICJw ZF9uUmVxSW5UaGlzID49IDAiKTsgfXdoaWxlKDApOwogICAgcGRfblJlcUluVGhpcysrOwogIH0K CgogIGlubGluZSB2b2lkIHN0YXJ0UmVxdWVzdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICBkb3sgaWYoICEocGRfblJlcUFj dGl2ZSA+PSAwKSApIG9tbmk6OmFzc2VydEZhaWwoIm9iamVjdEFkYXB0ZXIuaCIsMTMzLCAicGRf blJlcUFjdGl2ZSA+PSAwIik7IH13aGlsZSgwKTsKICAgIHBkX25SZXFBY3RpdmUrKzsKICB9CgoK CgoKICBpbmxpbmUgdm9pZCBsZWF2ZUFkYXB0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgZG97IGlmKCAhKHBkX25SZXFJ blRoaXMgPiAwKSApIG9tbmk6OmFzc2VydEZhaWwoIm9iamVjdEFkYXB0ZXIuaCIsMTQzLCAicGRf blJlcUluVGhpcyA+IDAiKTsgfXdoaWxlKDApOyBkb3sgaWYoICEocGRfblJlcUFjdGl2ZSA+IDAp ICkgb21uaTo6YXNzZXJ0RmFpbCgib2JqZWN0QWRhcHRlci5oIiwxNDMsICJwZF9uUmVxQWN0aXZl ID4gMCIpOyB9d2hpbGUoMCk7CiAgICAtLXBkX25SZXFJblRoaXM7CiAgICAtLXBkX25SZXFBY3Rp dmU7CiAgICBpZiggIXBkX25SZXFBY3RpdmUgJiYgcGRfc2lnbmFsT25aZXJvSW52b2NhdGlvbnMg KQogICAgICBwZF9zaWduYWwuYnJvYWRjYXN0KCk7CiAgfQoKCgogIGlubGluZSB2b2lkIGV4aXRB ZGFwdGVyKGludCBsb2VudHJ5PTAsIGludCBsb2V4aXQ9MCkgewogICAgaWYoICFsb2VudHJ5ICkg b21uaTo6aW50ZXJuYWxMb2NrLT5sb2NrKCk7CiAgICBkb3sgaWYoICEocGRfblJlcUluVGhpcyA+ IDApICkgb21uaTo6YXNzZXJ0RmFpbCgib2JqZWN0QWRhcHRlci5oIiwxNTQsICJwZF9uUmVxSW5U aGlzID4gMCIpOyB9d2hpbGUoMCk7CiAgICAtLXBkX25SZXFJblRoaXM7CiAgICBpbnQgZG9fc2ln bmFsID0gIXBkX25SZXFJblRoaXMgJiYgcGRfc2lnbmFsT25aZXJvSW52b2NhdGlvbnM7CiAgICBp ZiggIWxvZXhpdCApIG9tbmk6OmludGVybmFsTG9jay0+dW5sb2NrKCk7CiAgICBpZiggZG9fc2ln bmFsICkgcGRfc2lnbmFsLmJyb2FkY2FzdCgpOwogIH0KCiAgaW5saW5lIHZvaWQgZGV0YWNoZWRf b2JqZWN0KCkgewogICAgc2RfZGV0YWNoZWRPYmplY3RMb2NrLmxvY2soKTsKICAgIHBkX25EZXRh Y2hlZE9iamVjdHMrKzsKICAgIHNkX2RldGFjaGVkT2JqZWN0TG9jay51bmxvY2soKTsKICB9Cgog IHZvaWQgbWV0X2RldGFjaGVkX29iamVjdCgpOwoKCgoKCiAgdm9pZCB3YWl0X2Zvcl9kZXRhY2hl ZF9vYmplY3RzKCk7CgoKCiAgdmlydHVhbCB2b2lkIGxhc3RJbnZvY2F0aW9uSGFzQ29tcGxldGVk KG9tbmlMb2NhbElkZW50aXR5KiBpZCkgPSAwOwojIDE5MCAib2JqZWN0QWRhcHRlci5oIgogIHN0 YXRpYyByb3BlRmFjdG9yeUxpc3QqIGluY29taW5nUm9wZUZhY3RvcmllcygpOwoKICBzdGF0aWMg Um9wZSogZGVmYXVsdExvb3BCYWNrKCk7CgoKICBzdHJ1Y3QgTGlzdGVuUG9ydCB7CiAgICBpbmxp bmUgTGlzdGVuUG9ydChjb25zdCBjaGFyKiBoLCB1bnNpZ25lZCBwKSA6IGhvc3QoaCksIHBvcnQo cCkge30KICAgIGlubGluZSBMaXN0ZW5Qb3J0KCkgOiBwb3J0KDApIHt9CiAgICBDT1JCQTo6U3Ry aW5nX3ZhciBob3N0OwogICAgdW5zaWduZWQgcG9ydDsKICB9OwogIHR5cGVkZWYgb21uaXZlY3Rv cjxMaXN0ZW5Qb3J0PiBMaXN0ZW5Qb3J0TGlzdDsKCiAgc3RydWN0IE9wdGlvbnMgewogICAgaW5s aW5lIE9wdGlvbnMoKSA6IG5vQm9vdHN0cmFwQWdlbnQoMCkge30KCiAgICBfQ09SQkFfQm9vbGVh biBub0Jvb3RzdHJhcEFnZW50OwogICAgTGlzdGVuUG9ydExpc3QgaW5jb21pbmdQb3J0czsKICB9 OwoKICBzdGF0aWMgT3B0aW9ucyBvcHRpb25zOwoKCnByb3RlY3RlZDoKICBvbW5pT2JqQWRhcHRl cigpOwoKCiAgaW50IHBkX25SZXFJblRoaXM7CgoKCiAgaW50IHBkX25SZXFBY3RpdmU7CgoKCgog IGludCBwZF9zaWduYWxPblplcm9JbnZvY2F0aW9uczsKCgoKCgoKICBvbW5pX3RyYWNlZGNvbmRp dGlvbiBwZF9zaWduYWw7CgoKCgoKCgpwcml2YXRlOgogIHN0YXRpYyBvbW5pX3RyYWNlZG11dGV4 IHNkX2RldGFjaGVkT2JqZWN0TG9jazsKICBzdGF0aWMgb21uaV90cmFjZWRjb25kaXRpb24gc2Rf ZGV0YWNoZWRPYmplY3RTaWduYWw7CgogIGludCBwZF9uRGV0YWNoZWRPYmplY3RzOwoKCgoKICBp bnQgcGRfc2lnbmFsT25aZXJvRGV0YWNoZWRPYmplY3RzOwoKCgoKCgogIGludCBwZF9pc0FjdGl2 ZTsKCgoKfTsKCgpjbGFzcyBvbW5pT2JqQWRhcHRlcl92YXIgewpwdWJsaWM6CiAgdHlwZWRlZiBv bW5pT2JqQWRhcHRlcl92YXIgVF92YXI7CiAgdHlwZWRlZiBvbW5pT2JqQWRhcHRlciogVF9wdHI7 CgogIGlubGluZSBvbW5pT2JqQWRhcHRlcl92YXIoKSA6IHBkX3ZhbCgwKSB7fQogIGlubGluZSBv bW5pT2JqQWRhcHRlcl92YXIoVF9wdHIgcCkgOiBwZF92YWwocCkge30KICBpbmxpbmUgfm9tbmlP YmpBZGFwdGVyX3ZhcigpIHsgaWYoIHBkX3ZhbCApIHBkX3ZhbC0+ZGVjclJlZkNvdW50KCk7IH0K CiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChUX3B0ciBwKSB7CiAgICBkb3sgaWYoICEoIXBk X3ZhbCkgKSBvbW5pOjphc3NlcnRGYWlsKCJvYmplY3RBZGFwdGVyLmgiLDI3NCwgIiFwZF92YWwi KTsgfXdoaWxlKDApOwogICAgcGRfdmFsID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlu bGluZSBUX3B0ciBvcGVyYXRvciAtPiAoKSB7IHJldHVybiBwZF92YWw7IH0KICBpbmxpbmUgb3Bl cmF0b3IgVF9wdHIgKCkgeyByZXR1cm4gcGRfdmFsOyB9Cgpwcml2YXRlOgogIG9tbmlPYmpBZGFw dGVyX3Zhcihjb25zdCBUX3ZhciYpOwogIFRfdmFyJiBvcGVyYXRvciA9IChjb25zdCBUX3ZhciYp OwoKICBUX3B0ciBwZF92YWw7Cn07CiMgNjcgInBvYWltcGwuaCIgMgojIDEgInBvYW1hbmFnZXIu aCIgMQojIDU1ICJwb2FtYW5hZ2VyLmgiCmNsYXNzIG9tbmlPcmJQT0E7CgoKY2xhc3Mgb21uaU9y YlBPQU1hbmFnZXIgOiBwdWJsaWMgUG9ydGFibGVTZXJ2ZXI6OlBPQU1hbmFnZXIgewpwdWJsaWM6 CiAgdmlydHVhbCB+b21uaU9yYlBPQU1hbmFnZXIoKTsKICBpbmxpbmUgb21uaU9yYlBPQU1hbmFn ZXIoaW50IGlzX25pbCA9IDApCiAgICA6IFBPQU1hbmFnZXIoaXNfbmlsKSwKICAgICAgcGRfcmVm Q291bnQoMSksCiAgICAgIHBkX3N0YXRlKEhPTERJTkcpCiAgICB7fQoKCgoKICB2aXJ0dWFsIHZv aWQgYWN0aXZhdGUoKTsKICB2aXJ0dWFsIHZvaWQgaG9sZF9yZXF1ZXN0cyhDT1JCQTo6Qm9vbGVh biB3YWl0X2Zvcl9jb21wbGV0aW9uKTsKICB2aXJ0dWFsIHZvaWQgZGlzY2FyZF9yZXF1ZXN0cyhD T1JCQTo6Qm9vbGVhbiB3YWl0X2Zvcl9jb21wbGV0aW9uKTsKICB2aXJ0dWFsIHZvaWQgZGVhY3Rp dmF0ZShDT1JCQTo6Qm9vbGVhbiBldGhlcmVhbGl6ZV9vYmplY3RzLAogICAgICAgICAgICAgICAg ICAgICAgICAgIENPUkJBOjpCb29sZWFuIHdhaXRfZm9yX2NvbXBsZXRpb24pOwogIHZpcnR1YWwg U3RhdGUgZ2V0X3N0YXRlKCk7CgoKCgogIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0 IGNoYXIqIHJlcG9JZCk7CiAgdmlydHVhbCB2b2lkIF9OUF9pbmNyUmVmQ291bnQoKTsKICB2aXJ0 dWFsIHZvaWQgX05QX2RlY3JSZWZDb3VudCgpOwoKCgoKICB2b2lkIGdhaW5fcG9hKG9tbmlPcmJQ T0EqIHBvYSk7CgoKCiAgdm9pZCBsb3NlX3BvYShvbW5pT3JiUE9BKiBwb2EpOwoKCiAgdHlwZWRl ZiBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2U8b21uaU9yYlBPQSo+IFBPQVNlcTsKCgpwcml2 YXRlOgogIFBPQVNlcSBwZF9wb2FzOwoKCgogIGludCBwZF9yZWZDb3VudDsKICBTdGF0ZSBwZF9z dGF0ZTsKfTsKIyA2OCAicG9haW1wbC5oIiAyCiMgMSAidGFza3F1ZXVlLmgiIDEKIyA0MyAidGFz a3F1ZXVlLmgiCmNsYXNzIG9tbmlUYXNrUXVldWUgOiBwdWJsaWMgb21uaV90aHJlYWQgewpwdWJs aWM6CiAgY2xhc3MgVGFzazsKICB0eXBlZGVmIHZvaWQgKCpUYXNrRm4pKHZvaWQqKTsKCiAgdmly dHVhbCB+b21uaVRhc2tRdWV1ZSgpOwogIG9tbmlUYXNrUXVldWUoKTsKICB2b2lkIGluc2VydChU YXNrKik7CiAgdm9pZCBpbnNlcnQoVGFza0ZuLCB2b2lkKik7CiAgdm9pZCBkaWUoKTsKCiAgY2xh c3MgVGFzayB7CiAgcHVibGljOgogICAgaW5saW5lIFRhc2soKSA6IHBkX25leHQoMCkge30KICAg IHZpcnR1YWwgflRhc2soKTsKICAgIHZpcnR1YWwgdm9pZCBkb2l0KCkgPSAwOwoKICBwcml2YXRl OgogICAgZnJpZW5kIGNsYXNzIG9tbmlUYXNrUXVldWU7CiAgICBUYXNrKGNvbnN0IFRhc2smKTsK ICAgIFRhc2smIG9wZXJhdG9yPShjb25zdCBUYXNrJik7CgogICAgVGFzayogcGRfbmV4dDsKICB9 OwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIHJ1bl91bmRldGFjaGVkKHZvaWQqKTsKCiAgb21u aV90cmFjZWRtdXRleCBwZF9sb2NrOwogIG9tbmlfdHJhY2VkY29uZGl0aW9uIHBkX2NvbmQ7CiAg VGFzayogcGRfdGFza3E7CiAgVGFzayogcGRfdGFza3F0YWlsOwogIGludCBwZF9keWluZzsKfTsK IyA2OSAicG9haW1wbC5oIiAyCgoKCgoKY2xhc3Mgb21uaU9yYlBPQU1hbmFnZXI7CgoKY2xhc3Mg b21uaU9yYlBPQSA6IHB1YmxpYyBQb3J0YWJsZVNlcnZlcjo6UE9BLAogICAgICAgICAgICAgICAg ICAgcHVibGljIG9tbmlPYmpBZGFwdGVyCnsKcHVibGljOgogIHZpcnR1YWwgfm9tbmlPcmJQT0Eo KTsKCgoKCgogIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlBPQV9wdHIgY3JlYXRlX1BPQShjb25z dCBjaGFyKiBhZGFwdGVyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGFi bGVTZXJ2ZXI6OlBPQU1hbmFnZXJfcHRyIGFfUE9BTWFuYWdlciwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBDT1JCQTo6UG9saWN5TGlzdCYgcG9saWNpZXMpOwogIHZpcnR1YWwg UG9ydGFibGVTZXJ2ZXI6OlBPQV9wdHIgZmluZF9QT0EoY29uc3QgY2hhciogYWRhcHRlcl9uYW1l LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OkJvb2xl YW4gYWN0aXZhdGVfaXQpOwogIHZpcnR1YWwgdm9pZCBkZXN0cm95KENPUkJBOjpCb29sZWFuIGV0 aGVyZWFsaXplX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OkJvb2xlYW4g d2FpdF9mb3JfY29tcGxldGlvbik7CgogIHZpcnR1YWwgY2hhciogdGhlX25hbWUoKTsKICB2aXJ0 dWFsIFBvcnRhYmxlU2VydmVyOjpQT0FfcHRyIHRoZV9wYXJlbnQoKTsKICB2aXJ0dWFsIFBvcnRh YmxlU2VydmVyOjpQT0FMaXN0KiB0aGVfY2hpbGRyZW4oKTsKICB2aXJ0dWFsIFBvcnRhYmxlU2Vy dmVyOjpQT0FNYW5hZ2VyX3B0ciB0aGVfUE9BTWFuYWdlcigpOwogIHZpcnR1YWwgUG9ydGFibGVT ZXJ2ZXI6OkFkYXB0ZXJBY3RpdmF0b3JfcHRyIHRoZV9hY3RpdmF0b3IoKTsKICB2aXJ0dWFsIHZv aWQgdGhlX2FjdGl2YXRvcihQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcl9wdHIgYWEp OwoKICB2aXJ0dWFsIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdlcl9wdHIgZ2V0X3NlcnZh bnRfbWFuYWdlcigpOwogIHZpcnR1YWwgdm9pZCBzZXRfc2VydmFudF9tYW5hZ2VyKFBvcnRhYmxl U2VydmVyOjpTZXJ2YW50TWFuYWdlcl9wdHIgaW1ncik7CgogIHZpcnR1YWwgUG9ydGFibGVTZXJ2 ZXI6OlNlcnZhbnQgZ2V0X3NlcnZhbnQoKTsKICB2aXJ0dWFsIHZvaWQgc2V0X3NlcnZhbnQoUG9y dGFibGVTZXJ2ZXI6OlNlcnZhbnQgcF9zZXJ2YW50KTsKCiAgdmlydHVhbCBQb3J0YWJsZVNlcnZl cjo6T2JqZWN0SWQqIGFjdGl2YXRlX29iamVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBQb3J0YWJsZVNlcnZlcjo6U2VydmFudCBwX3NlcnZhbnQpOwogIHZp cnR1YWwgdm9pZCBhY3RpdmF0ZV9vYmplY3Rfd2l0aF9pZChjb25zdCBQb3J0YWJsZVNlcnZlcjo6 T2JqZWN0SWQmIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0 YWJsZVNlcnZlcjo6U2VydmFudCBwX3NlcnZhbnQpOwogIHZpcnR1YWwgdm9pZCBkZWFjdGl2YXRl X29iamVjdChjb25zdCBQb3J0YWJsZVNlcnZlcjo6T2JqZWN0SWQmIG9pZCk7CgogIHZpcnR1YWwg Q09SQkE6Ok9iamVjdF9wdHIgY3JlYXRlX3JlZmVyZW5jZShjb25zdCBjaGFyKiBpbnRmKTsKICB2 aXJ0dWFsIENPUkJBOjpPYmplY3RfcHRyIGNyZWF0ZV9yZWZlcmVuY2Vfd2l0aF9pZCgKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvcnRhYmxlU2VydmVyOjpPYmpl Y3RJZCYgb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hh ciogaW50Zik7CgogIHZpcnR1YWwKICBQb3J0YWJsZVNlcnZlcjo6T2JqZWN0SWQqIHNlcnZhbnRf dG9faWQoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnQgcF9zZXJ2YW50KTsKICB2aXJ0dWFsCiAgQ09S QkE6Ok9iamVjdF9wdHIgc2VydmFudF90b19yZWZlcmVuY2UoUG9ydGFibGVTZXJ2ZXI6OlNlcnZh bnQgcF9zZXJ2YW50KTsKICB2aXJ0dWFsCiAgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnQgcmVmZXJl bmNlX3RvX3NlcnZhbnQoQ09SQkE6Ok9iamVjdF9wdHIgcmVmZXJlbmNlKTsKICB2aXJ0dWFsCiAg UG9ydGFibGVTZXJ2ZXI6Ok9iamVjdElkKiByZWZlcmVuY2VfdG9faWQoQ09SQkE6Ok9iamVjdF9w dHIgcmVmZXJlbmNlKTsKICB2aXJ0dWFsCiAgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnQgaWRfdG9f c2VydmFudChjb25zdCBQb3J0YWJsZVNlcnZlcjo6T2JqZWN0SWQmIG9pZCk7CiAgdmlydHVhbAog IENPUkJBOjpPYmplY3RfcHRyIGlkX3RvX3JlZmVyZW5jZShjb25zdCBQb3J0YWJsZVNlcnZlcjo6 T2JqZWN0SWQmIG9pZCk7CgoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9ub25fZXhpc3Rl bnQoKTsKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOwog IHZpcnR1YWwgdm9pZCBfTlBfaW5jclJlZkNvdW50KCk7CiAgdmlydHVhbCB2b2lkIF9OUF9kZWNy UmVmQ291bnQoKTsKCgoKCgogIHZpcnR1YWwgdm9pZCBpbmNyUmVmQ291bnQoKTsKICB2aXJ0dWFs IHZvaWQgZGVjclJlZkNvdW50KCk7CiAgdmlydHVhbCB2b2lkIGRpc3BhdGNoKEdJT1BfUyYsIG9t bmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCB2b2lkIGRpc3BhdGNoKEdJT1BfUyYsIGNvbnN0 IF9DT1JCQV9PY3RldCoga2V5LCBpbnQga2V5c2l6ZSk7CiAgdmlydHVhbCB2b2lkIGRpc3BhdGNo KG9tbmlDYWxsRGVzY3JpcHRvciYsIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBpbnQg b2JqZWN0RXhpc3RzKGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LCBpbnQga2V5c2l6ZSk7CiAgdmly dHVhbCB2b2lkIGxhc3RJbnZvY2F0aW9uSGFzQ29tcGxldGVkKG9tbmlMb2NhbElkZW50aXR5KiBp ZCk7CgoKCgoKICBlbnVtIHsKICAgIFJQUF9BQ1RJVkVfT0JKX01BUCA9IDAsCiAgICBSUFBfREVG QVVMVF9TRVJWQU5UID0gMSwKICAgIFJQUF9TRVJWQU5UX01BTkFHRVIgPSAyCiAgfTsKCgogIHN0 cnVjdCBQb2xpY2llcyB7CiAgICB1bnNpZ25lZCBzaW5nbGVfdGhyZWFkZWQgOiAxOwogICAgdW5z aWduZWQgdHJhbnNpZW50IDogMTsKICAgIHVuc2lnbmVkIG11bHRpcGxlX2lkIDogMTsKICAgIHVu c2lnbmVkIHVzZXJfYXNzaWduZWRfaWQgOiAxOwogICAgdW5zaWduZWQgcmV0YWluX3NlcnZhbnRz IDogMTsKICAgIHVuc2lnbmVkIHJlcV9wcm9jZXNzaW5nIDogMjsKICAgIHVuc2lnbmVkIGltcGxp Y2l0X2FjdGl2YXRpb24gOiAxOwogIH07CgogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb1ZhbHVlX1Nl cXVlbmNlPG9tbmlPcmJQT0EqPiBDaGlsZFNlcTsKCgogIG9tbmlPcmJQT0EoY29uc3QgY2hhciog bmFtZSwgb21uaU9yYlBPQU1hbmFnZXIqIG1hbmFnZXIsCiAgICAgICAgICAgICBjb25zdCBQb2xp Y2llcyYgcG9saWNpZXMsIG9tbmlPcmJQT0EqIHBhcmVudCk7CgoKICBvbW5pT3JiUE9BKCk7CgoK ICB2b2lkIGRvX2Rlc3Ryb3koX0NPUkJBX0Jvb2xlYW4gZXRoZXJlYWxpemVfb2JqZWN0cyk7CiMg MTk0ICJwb2FpbXBsLmgiCiAgdm9pZCBwbV9jaGFuZ2Vfc3RhdGUob21uaU9yYlBPQU1hbmFnZXI6 OlN0YXRlIG5ld19zdGF0ZSk7CgoKCiAgdm9pZCBwbV93YWl0Rm9yUmVxQ21wbHRuT3JTdHRDaG5n ZShvbW5pT3JiUE9BTWFuYWdlcjo6U3RhdGUgc3RhdGUpOwoKCgoKICB2b2lkIHBtX2RlYWN0aXZh dGUoX0NPUkJBX0Jvb2xlYW4gZXRoZXJlYWxpemVfb2JqZWN0cyk7CgoKCiAgdm9pZCogc2VydmFu dF9fdGhpcyhQb3J0YWJsZVNlcnZlcjo6U2VydmFudCBzZXJ2YW50LCBjb25zdCBjaGFyKiByZXBv SWQpOwoKCgogIHN0YXRpYyBQb3J0YWJsZVNlcnZlcjo6UE9BX3B0ciByb290UE9BKGludCBpbml0 X2lmX25vbmUgPSAxKTsKCgoKCgoKCiAgc3RhdGljIFBvcnRhYmxlU2VydmVyOjpQT0FfcHRyIG9t bmlJTlNQT0EoKTsKIyAyMjkgInBvYWltcGwuaCIKICBzdGF0aWMgdm9pZCBzaHV0ZG93bigpOwoK CgoKCgogIHN0YXRpYyBvbW5pT3JiUE9BKiBnZXRBZGFwdGVyKGNvbnN0IF9DT1JCQV9PY3RldCog a2V5LCBpbnQga2V5c2l6ZSk7CgoKCgoKCgpwcml2YXRlOgogIHZvaWQgY3JlYXRlX2tleShvbW5p T2JqS2V5JiBrZXlfb3V0LCBjb25zdCBDT1JCQTo6T2N0ZXQqIGlkLCBpbnQgaWRzaXplKTsKCiAg dm9pZCBjcmVhdGVfbmV3X2tleShvbW5pT2JqS2V5JiBrZXlfb3V0LCBjb25zdCBDT1JCQTo6T2N0 ZXQqKiBpZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICBpbnQqIGlkc2l6ZSA9IDApOwoKCiAg b21uaU9yYlBPQSogZmluZF9jaGlsZChjb25zdCBjaGFyKiBuYW1lKTsKICBvbW5pT3JiUE9BKiBm aW5kX2NoaWxkKGNvbnN0IGNoYXIqIG5hbWVfc3RhcnQsIGNvbnN0IGNoYXIqIG5hbWVfZW5kKTsK CgoKCiAgdm9pZCBpbnNlcnRfY2hpbGQob21uaU9yYlBPQSogY2hpbGQpOwoKCiAgdm9pZCBsb3Nl X2NoaWxkKG9tbmlPcmJQT0EqIGNoaWxkKTsKCgoKCiAgaW50IGFkYXB0ZXJfbmFtZV9pc192YWxp ZChjb25zdCBjaGFyKiBuYW1lKTsKCgogIHZvaWQgc3luY2hyb25pc2VfcmVxdWVzdChvbW5pTG9j YWxJZGVudGl0eSogbGlkKTsKIyAyNzggInBvYWltcGwuaCIKICB2b2lkIGRlYWN0aXZhdGVfb2Jq ZWN0cyhvbW5pTG9jYWxJZGVudGl0eSogaWRsZV9vYmpzKTsKCgoKCiAgdm9pZCBjb21wbGV0ZV9v YmplY3RfZGVhY3RpdmF0aW9uKG9tbmlMb2NhbElkZW50aXR5KiBpZCk7CgoKCgoKCgogIHZvaWQg ZXRoZXJlYWxpc2Vfb2JqZWN0cyhvbW5pTG9jYWxJZGVudGl0eSogaWRfbGlzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gZXRoZXJlYWxpc2UsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50QWN0aXZhdG9yX3B0ciBzYSk7 CgoKCgogIHZvaWQgYWRkX29iamVjdF90b19ldGhlcmVhbGlzYXRpb25fcXVldWUoUG9ydGFibGVT ZXJ2ZXI6OlNlcnZhbnQgcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0YWJs ZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcl9wdHIgc2EsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgX0NPUkJBX09jdGV0KiBrZXksIGludCBrZXlzaXplLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGludCBjbGVhbnVwX2luX3Byb2dyZXNzLCBpbnQgZGV0YWNo ZWQ9MCk7CgoKCgoKCgogIHZvaWQgZGlzcGF0Y2hfdG9fZHMoR0lPUF9TJiwgY29uc3QgX0NPUkJB X09jdGV0KiwgaW50KTsKICB2b2lkIGRpc3BhdGNoX3RvX3NhKEdJT1BfUyYsIGNvbnN0IF9DT1JC QV9PY3RldCosIGludCk7CiAgdm9pZCBkaXNwYXRjaF90b19zbChHSU9QX1MmLCBjb25zdCBfQ09S QkFfT2N0ZXQqLCBpbnQpOwoKCgoKICB2b2lkIGNhbGxfcG9zdGludm9rZShQb3J0YWJsZVNlcnZl cjo6U2VydmFudExvY2F0b3JfcHRyIHNsLAogICAgICAgICAgICAgICAgICAgICAgIFBvcnRhYmxl U2VydmVyOjpPYmplY3RJZCYgb2lkLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIq IG9wLAogICAgICAgICAgICAgICAgICAgICAgIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRv cjo6Q29va2llIGNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICBQb3J0YWJsZVNlcnZlcjo6 U2VydmFudCBzZXJ2YW50KTsKCgoKICBvbW5pT3JiUE9BKiBhdHRlbXB0X3RvX2FjdGl2YXRlX2Fk YXB0ZXIoY29uc3QgY2hhciogbmFtZSk7CiMgMzM1ICJwb2FpbXBsLmgiCiAgaW50IHN0YXJ0X2Fk YXB0ZXJhY3RpdmF0aW5nX2NoaWxkX29yX2Jsb2NrKGNvbnN0IGNoYXIqIG5hbWUpOwoKCgoKCiAg dm9pZCBmaW5pc2hfYWRhcHRlcmFjdGl2YXRpbmdfY2hpbGQoY29uc3QgY2hhciogbmFtZSk7CgoK ICBpbnQgaXNfYWRhcHRlcmFjdGl2YXRpbmdfY2hpbGQoY29uc3QgY2hhciogbmFtZSk7CgoKCgoK ICBjbGFzcyBFdGhlcmVhbGlzZXIgOiBwdWJsaWMgb21uaVRhc2tRdWV1ZTo6VGFzayB7CiAgcHVi bGljOgogICAgaW5saW5lIEV0aGVyZWFsaXNlcihQb3J0YWJsZVNlcnZlcjo6U2VydmFudCBzLAog ICAgICAgICAgICAgICAgICAgICAgICBQb3J0YWJsZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcl9w dHIgc2EsCiAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlPcmJQT0EqIHBvYSwgY29uc3QgX0NP UkJBX09jdGV0KiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkc2l6ZSwgQ09SQkE6 OkJvb2xlYW4gY2xlYW51cCkKICAgICAgOiBwZF9zZXJ2YW50KHMpLCBwZF9zYShzYSksCiAgICAg ICAgcGRfcG9hKHBvYSksIHBkX2NsZWFudXAoY2xlYW51cCkgewogICAgICBwZF9vaWQubGVuZ3Ro KGlkc2l6ZSk7CiAgICAgIG1lbWNweShwZF9vaWQuTlBfZGF0YSgpLCBpZCwgaWRzaXplKTsKICAg IH0KICAgIGlubGluZSB2b2lkIHNldF9pc19sYXN0KGludCBpbCkgeyBwZF9pc19sYXN0ID0gaWw7 IH0KCiAgICB2aXJ0dWFsIHZvaWQgZG9pdCgpOwoKICBwcml2YXRlOgogICAgUG9ydGFibGVTZXJ2 ZXI6OlNlcnZhbnQgcGRfc2VydmFudDsKICAgIGludCBwZF9pc19sYXN0OwogICAgUG9ydGFibGVT ZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3JfcHRyIHBkX3NhOwogICAgb21uaU9yYlBPQSogcGRfcG9h OwogICAgUG9ydGFibGVTZXJ2ZXI6Ok9iamVjdElkIHBkX29pZDsKICAgIENPUkJBOjpCb29sZWFu IHBkX2NsZWFudXA7CiAgfTsKICBmcmllbmQgY2xhc3MgRXRoZXJlYWxpc2VyOwoKCiAgaW50IHBk X2Rlc3Ryb3llZDsKIyAzODggInBvYWltcGwuaCIKICBpbnQgcGRfZHlpbmc7CgoKCgogIGludCBw ZF9yZWZDb3VudDsKCgogIENPUkJBOjpTdHJpbmdfdmFyIHBkX25hbWU7CgoKICBvbW5pT3JiUE9B KiBwZF9wYXJlbnQ7CgoKCgoKICBvbW5pT3JiUE9BTWFuYWdlciogcGRfbWFuYWdlcjsKCgoKICBQ b3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcl9wdHIgcGRfYWRhcHRlckFjdGl2YXRvcjsK CgoKICBvbW5pdmVjdG9yPGNvbnN0IGNoYXIqPiBwZF9hZHB0ckFjdHZ0bnNJblByb2dyZXNzOwoK CgoKICBQb3J0YWJsZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcl9wdHIgcGRfc2VydmFudEFjdGl2 YXRvcjsKICBQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3JfcHRyIHBkX3NlcnZhbnRMb2Nh dG9yOwoKCgoKCgogIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50IHBkX2RlZmF1bHRTZXJ2YW50OwoK CgoKCiAgdm9sYXRpbGUgaW50IHBkX3JxX3N0YXRlOwoKCgoKICBDT1JCQTo6U3RyaW5nX3ZhciBw ZF9mdWxsbmFtZTsKCgogIENPUkJBOjpTdHJpbmdfdmFyIHBkX3BvYUlkOwogIGludCBwZF9wb2FJ ZFNpemU7CgoKCgoKICBDaGlsZFNlcSBwZF9jaGlsZHJlbjsKCgoKCgogIFBvbGljaWVzIHBkX3Bv bGljeTsKCgogIG9tbmlfdHJhY2VkbXV0ZXgqIHBkX2NhbGxfbG9jazsKCgoKCgoKICBvbW5pX3Ry YWNlZG11dGV4IHBkX2xvY2s7CgoKICBvbW5pX3RyYWNlZGNvbmRpdGlvbiBwZF9kZWF0aFNpZ25h bDsKCgoKCiAgX0NPUkJBX1VMb25nIHBkX29pZEluZGV4OwoKCgoKICBvbW5pTG9jYWxJZGVudGl0 eSogcGRfYWN0aXZlT2JqTGlzdDsKCgoKfTsKIyA4MCAicG9ydGFibGVzZXJ2ZXIuY2MiIDIKIyAx ICJsb2NhbElkZW50aXR5LmgiIDEKIyA0OCAibG9jYWxJZGVudGl0eS5oIgojIDEgIi4uL29tbmlJ ZGVudGl0eS5oIiAxCiMgNDQgIi4uL29tbmlJZGVudGl0eS5oIgojIDEgIi91c3IvaW5jbHVkZS9z dHJpbmcuaCIgMSAzCiMgNDUgIi4uL29tbmlJZGVudGl0eS5oIiAyCgoKY2xhc3Mgb21uaUNhbGxE ZXNjcmlwdG9yOwpjbGFzcyBvbW5pT2JqUmVmOwoKCmNsYXNzIG9tbmlJZGVudGl0eSB7CnB1Ymxp YzoKICBpbmxpbmUgY29uc3QgX0NPUkJBX09jdGV0KiBrZXkoKSBjb25zdCB7IHJldHVybiBwZF9r ZXkua2V5KCk7IH0KICBpbmxpbmUgaW50IGtleXNpemUoKSBjb25zdCB7IHJldHVybiBwZF9rZXku c2l6ZSgpOyB9CgoKICBpbmxpbmUgaW50IGlzX2VxdWFsKGNvbnN0IF9DT1JCQV9PY3RldCoga2V5 LCBpbnQga2V5c2l6ZSkgY29uc3QgewogICAgcmV0dXJuIHBkX2tleS5pc19lcXVhbChrZXksIGtl eXNpemUpOwogIH0KCiAgdmlydHVhbCB2b2lkIGRpc3BhdGNoKG9tbmlDYWxsRGVzY3JpcHRvciYp ID0gMDsKCgoKCgogIHZpcnR1YWwgdm9pZCBnYWluT2JqUmVmKG9tbmlPYmpSZWYqKSA9IDA7CiAg dmlydHVhbCB2b2lkIGxvc2VPYmpSZWYob21uaU9ialJlZiopID0gMDsKCgoKcHJvdGVjdGVkOgog IGlubGluZSB+b21uaUlkZW50aXR5KCkge30KCgoKCiAgaW5saW5lIG9tbmlJZGVudGl0eShvbW5p T2JqS2V5JiBrZXkpCiAgICA6IHBkX2tleShrZXksIDEpIHt9CgoKICBpbmxpbmUgb21uaUlkZW50 aXR5KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LCBpbnQga2V5c2l6ZSkKICAgIDogcGRfa2V5KGtl eSwga2V5c2l6ZSkge30KCgogIGlubGluZSBvbW5pSWRlbnRpdHkoX0NPUkJBX09jdGV0KiBrZXks IGludCBrZXlzaXplKQogICAgOiBwZF9rZXkoa2V5LCBrZXlzaXplKSB7fQoKCnByaXZhdGU6CiAg b21uaUlkZW50aXR5KGNvbnN0IG9tbmlJZGVudGl0eSYpOwogIG9tbmlJZGVudGl0eSYgb3BlcmF0 b3IgPSAoY29uc3Qgb21uaUlkZW50aXR5Jik7CgoKCiAgb21uaU9iaktleSBwZF9rZXk7Cgp9Owoj IDQ5ICJsb2NhbElkZW50aXR5LmgiIDIKCgpjbGFzcyBvbW5pU2VydmFudDsKY2xhc3Mgb21uaU9i alJlZjsKY2xhc3Mgb21uaU9iakFkYXB0ZXI7CmNsYXNzIG9tbmlMb2NhbElkZW50aXR5X1JlZkhv bGRlcjsKCgpjbGFzcyBvbW5pTG9jYWxJZGVudGl0eSA6IHB1YmxpYyBvbW5pSWRlbnRpdHkgewpw dWJsaWM6CiAgaW5saW5lIH5vbW5pTG9jYWxJZGVudGl0eSgpIHt9CgogIGlubGluZSBvbW5pTG9j YWxJZGVudGl0eShvbW5pT2JqS2V5JiBrZXkpCiAgICA6IG9tbmlJZGVudGl0eShrZXkpLAogICAg ICBwZF9uSW52b2NhdGlvbnMoMSksCiAgICAgIHBkX3NlcnZhbnQoMCksCiAgICAgIHBkX2FkYXB0 ZXIoMCksCiAgICAgIHBkX3NlcnZhbnRzTmV4dElkZW50aXR5KDApLAogICAgICBwZF9uZXh0SW5P YmplY3RUYWJsZSgwKSwKICAgICAgcGRfbG9jYWxSZWZzKDApLAogICAgICBwZF9uZXh0SW5PQU9i akxpc3QoMCksCiAgICAgIHBkX3ByZXZJbk9BT2JqTGlzdCgwKQogICAge30KCgoKICBpbmxpbmUg b21uaUxvY2FsSWRlbnRpdHkoY29uc3QgX0NPUkJBX09jdGV0KiBrZXksIGludCBrZXlzaXplKQog ICAgOiBvbW5pSWRlbnRpdHkoa2V5LCBrZXlzaXplKSwKICAgICAgcGRfbkludm9jYXRpb25zKDEp LAogICAgICBwZF9zZXJ2YW50KDApLAogICAgICBwZF9hZGFwdGVyKDApLAogICAgICBwZF9zZXJ2 YW50c05leHRJZGVudGl0eSgwKSwKICAgICAgcGRfbmV4dEluT2JqZWN0VGFibGUoMCksCiAgICAg IHBkX2xvY2FsUmVmcygwKSwKICAgICAgcGRfbmV4dEluT0FPYmpMaXN0KDApLAogICAgICBwZF9w cmV2SW5PQU9iakxpc3QoMCkKICAgIHt9CgoKCiAgdmlydHVhbCB2b2lkIGRpc3BhdGNoKG9tbmlD YWxsRGVzY3JpcHRvciYpOwogIHZpcnR1YWwgdm9pZCBnYWluT2JqUmVmKG9tbmlPYmpSZWYqKTsK ICB2aXJ0dWFsIHZvaWQgbG9zZU9ialJlZihvbW5pT2JqUmVmKik7CgoKICB2b2lkIGRpc3BhdGNo KEdJT1BfUyYpOwoKCgoKCgoKICB2b2lkIGZpbmlzaGVkV2l0aER1bW15SWQoKTsKCgoKCgogIGlu bGluZSB2b2lkIGRlYWN0aXZhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgZG97IGlmKCAhKHBkX25JbnZvY2F0aW9ucyA+ IDApICkgb21uaTo6YXNzZXJ0RmFpbCgibG9jYWxJZGVudGl0eS5oIiwxMTAsICJwZF9uSW52b2Nh dGlvbnMgPiAwIik7IH13aGlsZSgwKTsKICAgIC0tcGRfbkludm9jYXRpb25zOwogIH0KCgoKICB2 b2lkIGRpZSgpOwoKCgoKCiAgaW5saW5lIG9tbmlTZXJ2YW50KiBzZXJ2YW50KCkgY29uc3QgeyBy ZXR1cm4gcGRfc2VydmFudDsgfQogIGlubGluZSBvbW5pT2JqQWRhcHRlciogYWRhcHRlcigpIGNv bnN0IHsgcmV0dXJuIHBkX2FkYXB0ZXI7IH0KICBpbmxpbmUgaW50IGlzX2lkbGUoKSBjb25zdCB7 IHJldHVybiAhcGRfbkludm9jYXRpb25zOyB9CgoKCgogIGlubGluZSBvbW5pT2JqUmVmKiBsb2Nh bFJlZkxpc3QoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwogICAgcmV0dXJuIHBkX2xvY2FsUmVmczsKICB9CgogIGlubGlu ZSBvbW5pTG9jYWxJZGVudGl0eSogbmV4dEluT2JqZWN0VGFibGUoKSB7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgcmV0dXJuIHBk X25leHRJbk9iamVjdFRhYmxlOwogIH0KICBpbmxpbmUgb21uaUxvY2FsSWRlbnRpdHkqKiBhZGRy T2ZOZXh0SW5PYmplY3RUYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CiAgICByZXR1cm4gJnBkX25leHRJbk9iamVjdFRhYmxl OwogIH0KCiAgaW5saW5lIG9tbmlMb2NhbElkZW50aXR5KiBzZXJ2YW50c05leHRJZGVudGl0eSgp IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgICByZXR1cm4gcGRfc2VydmFudHNOZXh0SWRlbnRpdHk7CiAgfQogIGlubGluZSBvbW5p TG9jYWxJZGVudGl0eSoqIGFkZHJPZlNlcnZhbnRzTmV4dElkZW50aXR5KCkgewogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgIHJldHVy biAmcGRfc2VydmFudHNOZXh0SWRlbnRpdHk7CiAgfQoKICBpbmxpbmUgb21uaUxvY2FsSWRlbnRp dHkqIG5leHRJbk9BT2JqTGlzdCgpIHsgcmV0dXJuIHBkX25leHRJbk9BT2JqTGlzdDsgfQogIGlu bGluZSB2b2lkIGluc2VydEludG9PQU9iakxpc3Qob21uaUxvY2FsSWRlbnRpdHkqKiBwX2hlYWQp IHsKICAgIGRveyBpZiggISghcGRfbmV4dEluT0FPYmpMaXN0ICYmICFwZF9wcmV2SW5PQU9iakxp c3QpICkgb21uaTo6YXNzZXJ0RmFpbCgibG9jYWxJZGVudGl0eS5oIiwxNTQsICIhcGRfbmV4dElu T0FPYmpMaXN0ICYmICFwZF9wcmV2SW5PQU9iakxpc3QiKTsgfXdoaWxlKDApOwogICAgZG97IGlm KCAhKHBfaGVhZCkgKSBvbW5pOjphc3NlcnRGYWlsKCJsb2NhbElkZW50aXR5LmgiLDE1NSwgInBf aGVhZCIpOyB9d2hpbGUoMCk7CiAgICBwZF9uZXh0SW5PQU9iakxpc3QgPSAqcF9oZWFkOwogICAg cGRfcHJldkluT0FPYmpMaXN0ID0gcF9oZWFkOwogICAgKnBfaGVhZCA9IHRoaXM7CiAgICBpZigg cGRfbmV4dEluT0FPYmpMaXN0ICkKICAgICAgcGRfbmV4dEluT0FPYmpMaXN0LT5wZF9wcmV2SW5P QU9iakxpc3QgPSAmcGRfbmV4dEluT0FPYmpMaXN0OwogIH0KICBpbmxpbmUgdm9pZCByZW1vdmVG cm9tT0FPYmpMaXN0KCkgewogICAgZG97IGlmKCAhKHBkX3ByZXZJbk9BT2JqTGlzdCkgKSBvbW5p Ojphc3NlcnRGYWlsKCJsb2NhbElkZW50aXR5LmgiLDE2MywgInBkX3ByZXZJbk9BT2JqTGlzdCIp OyB9d2hpbGUoMCk7CiAgICAqcGRfcHJldkluT0FPYmpMaXN0ID0gcGRfbmV4dEluT0FPYmpMaXN0 OwogICAgaWYoIHBkX25leHRJbk9BT2JqTGlzdCApCiAgICAgIHBkX25leHRJbk9BT2JqTGlzdC0+ cGRfcHJldkluT0FPYmpMaXN0ID0gcGRfcHJldkluT0FPYmpMaXN0OwogICAgcGRfbmV4dEluT0FP YmpMaXN0ID0gMDsKICAgIHBkX3ByZXZJbk9BT2JqTGlzdCA9IDA7CiAgfQogIGlubGluZSB2b2lk IHJlUm9vdE9BT2JqTGlzdChvbW5pTG9jYWxJZGVudGl0eSoqIG5ld19oZWFkKSB7CiAgICBkb3sg aWYoICEocGRfcHJldkluT0FPYmpMaXN0KSApIG9tbmk6OmFzc2VydEZhaWwoImxvY2FsSWRlbnRp dHkuaCIsMTcxLCAicGRfcHJldkluT0FPYmpMaXN0Iik7IH13aGlsZSgwKTsgZG97IGlmKCAhKG5l d19oZWFkKSApIG9tbmk6OmFzc2VydEZhaWwoImxvY2FsSWRlbnRpdHkuaCIsMTcxLCAibmV3X2hl YWQiKTsgfXdoaWxlKDApOwogICAgKnBkX3ByZXZJbk9BT2JqTGlzdCA9IDA7CiAgICBwZF9wcmV2 SW5PQU9iakxpc3QgPSBuZXdfaGVhZDsKICAgICpuZXdfaGVhZCA9IHRoaXM7CiAgfQogIGlubGlu ZSBDT1JCQTo6Qm9vbGVhbiBkZWFjdGl2YXRlZCgpIHsKICAgIHJldHVybiBwZF9hZGFwdGVyICYm ICFwZF9wcmV2SW5PQU9iakxpc3Q7CiAgfQoKCgogIGlubGluZSB2b2lkIHNldFNlcnZhbnQob21u aVNlcnZhbnQqIHNlcnZhbnQsIG9tbmlPYmpBZGFwdGVyKiBvYSkgewogICAgZG97IGlmKCAhKCFw ZF9zZXJ2YW50KSApIG9tbmk6OmFzc2VydEZhaWwoImxvY2FsSWRlbnRpdHkuaCIsMTgzLCAiIXBk X3NlcnZhbnQiKTsgfXdoaWxlKDApOyBkb3sgaWYoICEoc2VydmFudCkgKSBvbW5pOjphc3NlcnRG YWlsKCJsb2NhbElkZW50aXR5LmgiLDE4MywgInNlcnZhbnQiKTsgfXdoaWxlKDApOwogICAgZG97 IGlmKCAhKCFwZF9hZGFwdGVyICYmIG9hKSApIG9tbmk6OmFzc2VydEZhaWwoImxvY2FsSWRlbnRp dHkuaCIsMTg0LCAiIXBkX2FkYXB0ZXIgJiYgb2EiKTsgfXdoaWxlKDApOwogICAgcGRfc2VydmFu dCA9IHNlcnZhbnQ7CiAgICBwZF9hZGFwdGVyID0gb2E7CiAgfQoKcHJpdmF0ZToKICBmcmllbmQg Y2xhc3Mgb21uaUxvY2FsSWRlbnRpdHlfUmVmSG9sZGVyOwoKICBvbW5pTG9jYWxJZGVudGl0eShj b25zdCBvbW5pTG9jYWxJZGVudGl0eSYpOwogIG9tbmlMb2NhbElkZW50aXR5JiBvcGVyYXRvciA9 IChjb25zdCBvbW5pTG9jYWxJZGVudGl0eSYpOwoKCgogIGludCBwZF9uSW52b2NhdGlvbnM7CiMg MjA3ICJsb2NhbElkZW50aXR5LmgiCiAgb21uaVNlcnZhbnQqIHBkX3NlcnZhbnQ7CgoKCgoKICBv bW5pT2JqQWRhcHRlciogcGRfYWRhcHRlcjsKCgoKCgoKCiAgb21uaUxvY2FsSWRlbnRpdHkqIHBk X3NlcnZhbnRzTmV4dElkZW50aXR5OwoKCgoKICBvbW5pTG9jYWxJZGVudGl0eSogcGRfbmV4dElu T2JqZWN0VGFibGU7CgoKCgogIG9tbmlPYmpSZWYqIHBkX2xvY2FsUmVmczsKCgoKICBvbW5pTG9j YWxJZGVudGl0eSogcGRfbmV4dEluT0FPYmpMaXN0OwogIG9tbmlMb2NhbElkZW50aXR5KiogcGRf cHJldkluT0FPYmpMaXN0OwoKCgoKCgp9OwojIDgxICJwb3J0YWJsZXNlcnZlci5jYyIgMgojIDEg Ii4uLy4uLy4uLy4uL2luY2x1ZGUvb21uaU9SQjMvY2FsbERlc2NyaXB0b3IuaCIgMQojIDQwICIu Li8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2NhbGxEZXNjcmlwdG9yLmgiCmNsYXNzIG9tbmlP YmpSZWY7CmNsYXNzIG9tbmlTZXJ2YW50OwpjbGFzcyBHSU9QX0M7CgoKCgoKCmNsYXNzIG9tbmlD YWxsRGVzY3JpcHRvciB7CnB1YmxpYzoKICB0eXBlZGVmIHZvaWQgKCpMb2NhbENhbGxGbikob21u aUNhbGxEZXNjcmlwdG9yKiwgb21uaVNlcnZhbnQqKTsKCiAgaW5saW5lIG9tbmlDYWxsRGVzY3Jp cHRvcihMb2NhbENhbGxGbiBsY2ZuLCBjb25zdCBjaGFyKiBvcCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGludCBvcF9sZW4sIF9DT1JCQV9Cb29sZWFuIG9uZXdheSA9IDApCiAgICA6IHBk X2xvY2FsQ2FsbChsY2ZuKSwKICAgICAgcGRfaXNfb25ld2F5KG9uZXdheSksCiAgICAgIHBkX29w KG9wKSwgcGRfb3BsZW4ob3BfbGVuKSwKICAgICAgcGRfY3R4dCgwKSB7fQoKCgoKCiAgdmlydHVh bCBfQ09SQkFfVUxvbmcgYWxpZ25lZFNpemUoX0NPUkJBX1VMb25nKTsKCgogIHZpcnR1YWwgdm9p ZCBtYXJzaGFsQXJndW1lbnRzKEdJT1BfQyYpOwoKCiAgdmlydHVhbCB2b2lkIHVubWFyc2hhbFJl dHVybmVkVmFsdWVzKEdJT1BfQyYpOwoKCiAgdmlydHVhbCB2b2lkIHVzZXJFeGNlcHRpb24oR0lP UF9DJiwgY29uc3QgY2hhciopOwojIDgzICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2Nh bGxEZXNjcmlwdG9yLmgiCiAgaW5saW5lIGNvbnN0IGNoYXIqIG9wKCkgY29uc3QgeyByZXR1cm4g cGRfb3A7IH0KICBpbmxpbmUgc2l6ZV90IG9wX2xlbigpIGNvbnN0IHsgcmV0dXJuIHBkX29wbGVu OyB9CiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIGlzX29uZXdheSgpIGNvbnN0IHsgcmV0dXJuIHBk X2lzX29uZXdheTsgfQogIGlubGluZSB2b2lkIGRvTG9jYWxDYWxsKG9tbmlTZXJ2YW50KiBzZXJ2 YW50KSB7CiAgICBwZF9sb2NhbENhbGwodGhpcywgc2VydmFudCk7CiAgfQoKCgoKCiAgc3RydWN0 IENvbnRleHRJbmZvIHsKICAgIGlubGluZSBDb250ZXh0SW5mbyhDT1JCQTo6Q29udGV4dF9wdHIg YywgY29uc3QgY2hhcipjb25zdCogY2wsIGludCBuKQogICAgICA6IGNvbnRleHQoYyksIGV4cGVj dGVkKGNsKSwgbnVtX2V4cGVjdGVkKG4pIHt9CgogICAgQ09SQkE6OkNvbnRleHRfcHRyIGNvbnRl eHQ7CiAgICBjb25zdCBjaGFyKmNvbnN0KiBleHBlY3RlZDsKICAgIGludCBudW1fZXhwZWN0ZWQ7 CiAgfTsKCiAgaW5saW5lIHZvaWQgc2V0X2NvbnRleHRfaW5mbyhjb25zdCBDb250ZXh0SW5mbyog Y2kpIHsgcGRfY3R4dCA9IGNpOyB9CiAgaW5saW5lIGNvbnN0IENvbnRleHRJbmZvKiBjb250ZXh0 X2luZm8oKSB7IHJldHVybiBwZF9jdHh0OyB9Cgpwcml2YXRlOgogIG9tbmlDYWxsRGVzY3JpcHRv cihjb25zdCBvbW5pQ2FsbERlc2NyaXB0b3ImKTsKICBvbW5pQ2FsbERlc2NyaXB0b3ImIG9wZXJh dG9yID0gKGNvbnN0IG9tbmlDYWxsRGVzY3JpcHRvciYpOwoKCiAgTG9jYWxDYWxsRm4gcGRfbG9j YWxDYWxsOwogIF9DT1JCQV9Cb29sZWFuIHBkX2lzX29uZXdheTsKICBjb25zdCBjaGFyKiBwZF9v cDsKICBzaXplX3QgcGRfb3BsZW47CiAgY29uc3QgQ29udGV4dEluZm8qIHBkX2N0eHQ7Cn07CiMg MTI1ICIuLi8uLi8uLi8uLi9pbmNsdWRlL29tbmlPUkIzL2NhbGxEZXNjcmlwdG9yLmgiCmNsYXNz IG9tbmlTdGRDYWxsRGVzYyB7CnB1YmxpYzoKCgogIHR5cGVkZWYgb21uaUNhbGxEZXNjcmlwdG9y IHZvaWRfY2FsbDsKCgogIGNsYXNzIF9jQ09SQkFfbU9iamVjdF9pX2NzdHJpbmcgOiBwdWJsaWMg b21uaUNhbGxEZXNjcmlwdG9yIHsKICBwdWJsaWM6CiAgICBpbmxpbmUgX2NDT1JCQV9tT2JqZWN0 X2lfY3N0cmluZyhMb2NhbENhbGxGbiBsY2ZuLCBjb25zdCBjaGFyKiBvcCwKICAgICAgICAgICAg ICAgICAgICAgc2l6ZV90IG9wbGVuLCBfQ09SQkFfQm9vbGVhbiBvbmV3YXksIGNvbnN0IGNoYXIq IGFfMCkgOgogICAgICBvbW5pQ2FsbERlc2NyaXB0b3IobGNmbiwgb3AsIG9wbGVuLCBvbmV3YXkp LAogICAgICBhcmdfMChhXzApIHt9CgogICAgdmlydHVhbCBDT1JCQTo6VUxvbmcgYWxpZ25lZFNp emUoQ09SQkE6OlVMb25nIHNpemVfaW4pOwogICAgdmlydHVhbCB2b2lkIG1hcnNoYWxBcmd1bWVu dHMoR0lPUF9DJik7CiAgICB2aXJ0dWFsIHZvaWQgdW5tYXJzaGFsUmV0dXJuZWRWYWx1ZXMoR0lP UF9DJik7CgogICAgaW5saW5lIENPUkJBOjpPYmplY3RfcHRyIHJlc3VsdCgpIHsgcmV0dXJuIHBk X3Jlc3VsdDsgfQoKICAgIGNvbnN0IGNoYXIqIGFyZ18wOwogICAgQ09SQkE6Ok9iamVjdF9wdHIg cGRfcmVzdWx0OwogIH07Cgp9OwojIDE1OSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9vbW5pT1JCMy9j YWxsRGVzY3JpcHRvci5oIgpjbGFzcyBvbW5pTG9jYWxPbmx5Q2FsbERlc2NyaXB0b3IgOiBwdWJs aWMgb21uaUNhbGxEZXNjcmlwdG9yIHsKcHVibGljOgogIG9tbmlMb2NhbE9ubHlDYWxsRGVzY3Jp cHRvcihMb2NhbENhbGxGbiBsY2ZuLCBjb25zdCBjaGFyKiBvcCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50IG9wX2xlbiwgX0NPUkJBX0Jvb2xlYW4gaXNfb25ld2F5ID0gMCkKICAg IDogb21uaUNhbGxEZXNjcmlwdG9yKGxjZm4sIG9wLCBvcF9sZW4sIGlzX29uZXdheSkge30KCgoK CiAgdmlydHVhbCBfQ09SQkFfVUxvbmcgYWxpZ25lZFNpemUoX0NPUkJBX1VMb25nKTsKfTsKIyA4 MiAicG9ydGFibGVzZXJ2ZXIuY2MiIDIKIyAxICIuLi9pbml0UmVmcy5oIiAxCiMgNjYgIi4uL2lu aXRSZWZzLmgiCiMgMSAiLi4vb21uaU9SQjMvYm9vdHN0cmFwLmhoIiAxCiMgNjYgIi4uL29tbmlP UkIzL2Jvb3RzdHJhcC5oaCIKY2xhc3MgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXM7CmNsYXNzIF9v YmpyZWZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXM7CmNsYXNzIF9pbXBsX0NPUkJBX0luaXRpYWxS ZWZlcmVuY2VzOwoKdHlwZWRlZiBfb2JqcmVmX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzKiBDT1JC QV9Jbml0aWFsUmVmZXJlbmNlc19wdHI7CnR5cGVkZWYgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNf cHRyIENPUkJBX0luaXRpYWxSZWZlcmVuY2VzUmVmOwoKY2xhc3MgQ09SQkFfSW5pdGlhbFJlZmVy ZW5jZXNfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNf cHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JC QV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90 eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90 IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBl IHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNo YWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5 cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JC QV9PYmpSZWZfVmFyPF9vYmpyZWZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMsIENPUkJBX0luaXRp YWxSZWZlcmVuY2VzX0hlbHBlcj4gQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNfdmFyOwp0eXBlZGVm IF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzLENP UkJBX0luaXRpYWxSZWZlcmVuY2VzX0hlbHBlciA+IENPUkJBX0luaXRpYWxSZWZlcmVuY2VzX291 dDsKCgoKY2xhc3MgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMgewpwdWJsaWM6CgogIHR5cGVkZWYg Q09SQkFfSW5pdGlhbFJlZmVyZW5jZXNfcHRyIF9wdHJfdHlwZTsKICB0eXBlZGVmIENPUkJBX0lu aXRpYWxSZWZlcmVuY2VzX3ZhciBfdmFyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxp Y2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0 X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgogIHN0YXRpYyBpbmxpbmUgc2l6ZV90 IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGljIGlubGluZSB2b2lkIF9t YXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgaW5s aW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwoK ICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2Jq UmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsK ICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGlj IGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERf cmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JC QTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBjb25zdCBj aGFyKiBfUERfcmVwb0lkOwoKCiAgc3RhdGljIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3Rj X09iaklkOwoKICB0eXBlZGVmIGNoYXIqIE9iaklkOwogIHR5cGVkZWYgQ09SQkE6OlN0cmluZ192 YXIgT2JqSWRfdmFyOwoKICBzdGF0aWMgY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfT2Jq SWRMaXN0OwoKICBjbGFzcyBPYmpJZExpc3RfdmFyOwoKICBjbGFzcyBPYmpJZExpc3QgOiBwdWJs aWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nIHsKICBwdWJsaWM6CiAgICB0eXBl ZGVmIE9iaklkTGlzdF92YXIgX3Zhcl90eXBlOwogICAgaW5saW5lIE9iaklkTGlzdCgpIHt9CiAg ICBpbmxpbmUgT2JqSWRMaXN0KGNvbnN0IE9iaklkTGlzdCYgcykKICAgICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX19TdHJpbmcocykge30KCiAgICBpbmxpbmUgT2JqSWRMaXN0KF9DT1JC QV9VTG9uZyBfbWF4KQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhf bWF4KSB7fQogICAgaW5saW5lIE9iaklkTGlzdChfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VM b25nIF9sZW4sIGNoYXIqKiBfdmFsLCBfQ09SQkFfQm9vbGVhbiBfcmVsPTApCiAgICAgIDogX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9 CgogICAgaW5saW5lIE9iaklkTGlzdCYgb3BlcmF0b3IgPSAoY29uc3QgT2JqSWRMaXN0JiBzKSB7 CiAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZzo6b3BlcmF0b3I9KHMpOwog ICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgfTsKCiAgY2xhc3MgT2JqSWRMaXN0X291dDsKCiAg Y2xhc3MgT2JqSWRMaXN0X3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBPYmpJZExpc3QgVDsK ICAgIHR5cGVkZWYgT2JqSWRMaXN0X3ZhciBUX3ZhcjsKCiAgICBpbmxpbmUgT2JqSWRMaXN0X3Zh cigpIDogX3BkX3NlcSgwKSB7fQogICAgaW5saW5lIE9iaklkTGlzdF92YXIoVCogcykgOiBfcGRf c2VxKHMpIHt9CiAgICBpbmxpbmUgT2JqSWRMaXN0X3Zhcihjb25zdCBUX3ZhciYgcykgewogICAg ICBpZiggcy5fcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUKCpzLl9wZF9zZXEpOwogICAgICBlbHNl IF9wZF9zZXEgPSAwOwogICAgfQogICAgaW5saW5lIH5PYmpJZExpc3RfdmFyKCkgeyBpZiggX3Bk X3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChU KiBzKSB7CiAgICAgIGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEg PSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9y ID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICAgIGlmKCBzLl9wZF9zZXEgKSB7CiAgICAgICAgaWYo ICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwogICAgICAgICpfcGRfc2VxID0gKnMuX3BkX3Nl cTsKICAgICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICAgIGRlbGV0ZSBfcGRfc2VxOwog ICAgICAgIF9wZF9zZXEgPSAwOwogICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAg ICBpbmxpbmUgX0NPUkJBX1N0cmluZ19lbGVtZW50IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcg cykgewogICAgICByZXR1cm4gKCpfcGRfc2VxKVtzXTsKICAgIH0KCiAgICBpbmxpbmUgVCogb3Bl cmF0b3IgLT4gKCkgeyByZXR1cm4gX3BkX3NlcTsgfQoKCgogICAgaW5saW5lIG9wZXJhdG9yIGNv bnN0IFQmICgpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgICBpbmxpbmUgb3BlcmF0b3Ig VCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogICAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29u c3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAgIGlubGluZSBUJiBpbm91dCgpIHsgcmV0dXJuICpf cGRfc2VxOyB9CiAgICBpbmxpbmUgVComIG91dCgpIHsKICAgICAgaWYoIF9wZF9zZXEgKSB7IGRl bGV0ZSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgfQogICAgICByZXR1cm4gX3BkX3NlcTsKICAgIH0K ICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gX3BkX3NlcTsgX3BkX3NlcSA9IDA7IHJl dHVybiB0bXA7IH0KCiAgICBmcmllbmQgY2xhc3MgT2JqSWRMaXN0X291dDsKCiAgcHJpdmF0ZToK ICAgIFQqIF9wZF9zZXE7CiAgfTsKCiAgY2xhc3MgT2JqSWRMaXN0X291dCB7CiAgcHVibGljOgog ICAgdHlwZWRlZiBPYmpJZExpc3QgVDsKICAgIHR5cGVkZWYgT2JqSWRMaXN0X3ZhciBUX3ZhcjsK CiAgICBpbmxpbmUgT2JqSWRMaXN0X291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsg fQogICAgaW5saW5lIE9iaklkTGlzdF9vdXQoVF92YXImIHMpCiAgICAgIDogX2RhdGEocy5fcGRf c2VxKSB7IHMgPSAoVCopIDA7IH0KICAgIGlubGluZSBPYmpJZExpc3Rfb3V0KGNvbnN0IE9iaklk TGlzdF9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICAgIGlubGluZSBPYmpJZExpc3Rfb3V0 JiBvcGVyYXRvciA9IChjb25zdCBPYmpJZExpc3Rfb3V0JiBzKSB7CiAgICAgIF9kYXRhID0gcy5f ZGF0YTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfSBpbmxpbmUgT2JqSWRMaXN0X291dCYgb3Bl cmF0b3IgPSAoVCogcykgewogICAgICBfZGF0YSA9IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAg IH0KICAgIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5l IFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7 IHJldHVybiBfZGF0YTsgfQoKICAgIGlubGluZSBfQ09SQkFfU3RyaW5nX2VsZW1lbnQgb3BlcmF0 b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAgICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICAgIH0K CiAgICBUKiYgX2RhdGE7CgogIHByaXZhdGU6CiAgICBPYmpJZExpc3Rfb3V0KCk7CiAgICBPYmpJ ZExpc3Rfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKICB9OwoKfTsKCmNsYXNzIF9vYmpy ZWZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMgOgogIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpPYmpl Y3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKewpwdWJsaWM6CiAgQ09SQkE6Ok9iamVjdF9w dHIgZ2V0KGNvbnN0IGNoYXIqIGlkKTsKICBDT1JCQV9Jbml0aWFsUmVmZXJlbmNlczo6T2JqSWRM aXN0KiBsaXN0KCk7CgogIGlubGluZSBfb2JqcmVmX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzKCkg eyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJlZl9DT1JCQV9Jbml0aWFsUmVmZXJlbmNlcyhjb25z dCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2Nh bElkZW50aXR5Kik7Cgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9DT1JCQV9Jbml0aWFs UmVmZXJlbmNlcygpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25z dCBjaGFyKik7CgogIF9vYmpyZWZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMoY29uc3QgX29ianJl Zl9DT1JCQV9Jbml0aWFsUmVmZXJlbmNlcyYpOwogIF9vYmpyZWZfQ09SQkFfSW5pdGlhbFJlZmVy ZW5jZXMmIG9wZXJhdG9yID0gKGNvbnN0IF9vYmpyZWZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMm KTsKCn07CgpjbGFzcyBfcG9mX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzIDogcHVibGljIHByb3h5 T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBpbmxpbmUgX3BvZl9DT1JCQV9Jbml0aWFsUmVmZXJl bmNlcygpIDogcHJveHlPYmplY3RGYWN0b3J5KENPUkJBX0luaXRpYWxSZWZlcmVuY2VzOjpfUERf cmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMoKTsKCiAg dmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJv ZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0eSos IG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0 IGNoYXIqKSBjb25zdDsKfTsKCmNsYXNzIF9pbXBsX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzIDoK ICBwdWJsaWMgdmlydHVhbCBvbW5pU2VydmFudAp7CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9D T1JCQV9Jbml0aWFsUmVmZXJlbmNlcygpOwoKICB2aXJ0dWFsIENPUkJBOjpPYmplY3RfcHRyIGdl dChjb25zdCBjaGFyKiBpZCkgPSAwOwogIHZpcnR1YWwgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXM6 Ok9iaklkTGlzdCogbGlzdCgpID0gMDsKCnB1YmxpYzoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFu IF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRl cmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVw b0lkKCk7Cn07CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQ09SQkFfSW5p dGlhbFJlZmVyZW5jZXM7CgpjbGFzcyBQT0FfQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXMgOgogIHB1 YmxpYyB2aXJ0dWFsIF9pbXBsX0NPUkJBX0luaXRpYWxSZWZlcmVuY2VzLAogIHB1YmxpYyB2aXJ0 dWFsIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50QmFzZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5QT0Ff Q09SQkFfSW5pdGlhbFJlZmVyZW5jZXMoKTsKCiAgaW5saW5lIENPUkJBX0luaXRpYWxSZWZlcmVu Y2VzX3B0ciBfdGhpcygpIHsKICAgIHJldHVybiAoQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNfcHRy KSBfZG9fdGhpcyhDT1JCQV9Jbml0aWFsUmVmZXJlbmNlczo6X1BEX3JlcG9JZCk7CiAgfQp9OwoK CgoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkFf SW5pdGlhbFJlZmVyZW5jZXM6Ok9iaklkTGlzdCYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8 PD0gKENPUkJBOjpBbnkmIF9hLCBDT1JCQV9Jbml0aWFsUmVmZXJlbmNlczo6T2JqSWRMaXN0KiBf c3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFfQm9vbGVh biBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQV9Jbml0aWFsUmVmZXJl bmNlczo6T2JqSWRMaXN0KiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+ PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBX0luaXRpYWxSZWZlcmVuY2VzOjpP YmpJZExpc3QqJiBfc3ApOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkFf SW5pdGlhbFJlZmVyZW5jZXNfcHRyIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBf YSwgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNfcHRyKiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJh dG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBDT1JCQV9Jbml0aWFsUmVmZXJlbmNlc19wdHIm IF9zKTsKCmlubGluZSBzaXplX3QKQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXM6Ol9hbGlnbmVkU2l6 ZShDT1JCQV9Jbml0aWFsUmVmZXJlbmNlc19wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0 dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzYsIG9mZnNldCk7Cn0K CmlubGluZSB2b2lkCkNPUkJBX0luaXRpYWxSZWZlcmVuY2VzOjpfbWFyc2hhbE9ialJlZihDT1JC QV9Jbml0aWFsUmVmZXJlbmNlc19wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENP UkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMzYsIHMpOwp9CgppbmxpbmUgdm9p ZApDT1JCQV9Jbml0aWFsUmVmZXJlbmNlczo6X21hcnNoYWxPYmpSZWYoQ09SQkFfSW5pdGlhbFJl ZmVyZW5jZXNfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hh bE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDM2LCBzKTsKfQojIDY3ICIuLi9pbml0UmVmcy5oIiAy CgoKY2xhc3MgQ09SQkFfSW5pdGlhbFJlZmVyZW5jZXNfaTsKCgpjbGFzcyBvbW5pSW5pdGlhbFJl ZmVyZW5jZXMgewpwdWJsaWM6CiAgc3RhdGljIENPUkJBOjpCb29sZWFuIHNldEZyb21GaWxlKGNv bnN0IGNoYXIqIGlkZW50aWZpZXIsIGNvbnN0IGNoYXIqIHVyaSk7CiAgc3RhdGljIENPUkJBOjpC b29sZWFuIHNldEZyb21BcmdzKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIsIGNvbnN0IGNoYXIqIHVy aSk7CgoKCgogIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJbml0UmVmRnJvbUZpbGUoY29uc3QgY2hh ciogZGVmSW5pdCk7CiAgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEluaXRSZWZGcm9tQXJncyhjb25z dCBjaGFyKiBkZWZJbml0KTsKCgogIHN0YXRpYyBDT1JCQTo6T2JqZWN0X3B0ciByZXNvbHZlKGNv bnN0IGNoYXIqIGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgaW50IGN5Y2xlcyA9IDApOwoKCgoKCiAgc3RhdGljIENPUkJBOjpPUkI6Ok9iamVj dElkTGlzdCogbGlzdCgpOwoKCgoKCiAgc3RhdGljIHZvaWQgcmVtRnJvbUZpbGUoY29uc3QgY2hh ciogaWRlbnRpZmllcik7CgoKCgogIHN0YXRpYyB2b2lkIHJlbUZyb21BcmdzKGNvbnN0IGNoYXIq IGlkZW50aWZpZXIpOwoKCiAgc3RhdGljIHZvaWQgaW5pdGlhbGlzZV9ib290c3RyYXBfYWdlbnRJ bXBsKCk7CgogIHN0YXRpYyBpbnQgaW52b2tlX2Jvb3RzdHJhcF9hZ2VudEltcGwoR0lPUF9TJik7 CgoKCiAgc3RhdGljIGludCBpc19ib290c3RyYXBfYWdlbnRJbXBsX2luaXRpYWxpc2VkKCk7CgoK ICBzdGF0aWMgdm9pZCBpbml0aWFsaXNlX2Jvb3RzdHJhcF9hZ2VudChjb25zdCBjaGFyKiBob3N0 LCBDT1JCQTo6VVNob3J0IHBvcnQpOwp9OwojIDgzICJwb3J0YWJsZXNlcnZlci5jYyIgMgojIDEg Ii4uL2R5bmFtaWNMaWIuaCIgMQojIDUzICIuLi9keW5hbWljTGliLmgiCmNsYXNzIG9tbmlDYWxs RGVzY3JpcHRvcjsKCgpjbGFzcyBvbW5pRHluYW1pY0xpYiB7CnB1YmxpYzoKCgoKCgoKICBzdGF0 aWMgb21uaUR5bmFtaWNMaWIqIG9wczsKCgoKICBzdGF0aWMgb21uaUR5bmFtaWNMaWIqIGhvb2s7 CgoKCgoKCiAgc3RhdGljIGNoYXIgbGlua19pbjsKCgoKCgoKICB2b2lkICgqaW5pdCkoKTsKICB2 b2lkICgqZGVpbml0KSgpOwoKCiAgc2l6ZV90ICgqY29udGV4dF9hbGlnbmVkX3NpemUpKHNpemVf dCBpbml0b2Zmc2V0LCBDT1JCQTo6Q29udGV4dF9wdHIgY3h0eCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgY2hhcipjb25zdCogd2hpY2gsIGludCBob3dfbWFueSk7CiAg dm9pZCAoKm1hcnNoYWxfY29udGV4dCkoTmV0QnVmZmVyZWRTdHJlYW0mLCBDT1JCQTo6Q29udGV4 dF9wdHIgY3h0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiB3 aGljaCwgaW50IGhvd19tYW55KTsKCgoKCiAgdm9pZCAoKmxvb2t1cF9pZF9sY2ZuKShvbW5pQ2Fs bERlc2NyaXB0b3IqLCBvbW5pU2VydmFudCopOwp9OwojIDg0ICJwb3J0YWJsZXNlcnZlci5jYyIg MgojIDEgIi4uL2V4Y2VwdGlvbmRlZnMuaCIgMQojIDU1ICIuLi9leGNlcHRpb25kZWZzLmgiCmNs YXNzIG9tbmlDb25uZWN0aW9uQnJva2VuIHsKcHVibGljOgogIGlubGluZSBvbW5pQ29ubmVjdGlv bkJyb2tlbihDT1JCQTo6VUxvbmcgbSwgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMgYykKICAgIDog cGRfbWlub3IobSksIHBkX3N0YXR1cyhjKSB7fQoKICBpbmxpbmUgQ09SQkE6OlVMb25nIG1pbm9y KCkgY29uc3QgeyByZXR1cm4gcGRfbWlub3I7IH0KICBpbmxpbmUgQ09SQkE6OkNvbXBsZXRpb25T dGF0dXMgY29tcGxldGVkKCkgY29uc3QgeyByZXR1cm4gcGRfc3RhdHVzOyB9Cgpwcml2YXRlOgog IENPUkJBOjpVTG9uZyBwZF9taW5vcjsKICBDT1JCQTo6Q29tcGxldGlvblN0YXR1cyBwZF9zdGF0 dXM7Cn07CgoKCgoKY2xhc3Mgb21uaUV4SGVscGVyIHsKcHVibGljOgoKCgoKICBzdGF0aWMgdm9p ZCBVTktOT1dOKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRp b25TdGF0dXMpOyBzdGF0aWMgdm9pZCBCQURfUEFSQU0oY29uc3QgY2hhciosIGludCwgQ09SQkE6 OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0YXR1cyk7IHN0YXRpYyB2b2lkIE5PX01FTU9SWShj b25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsg c3RhdGljIHZvaWQgSU1QX0xJTUlUKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09S QkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBDT01NX0ZBSUxVUkUoY29uc3QgY2hh ciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0YXR1cyk7IHN0YXRpYyB2 b2lkIElOVl9PQkpSRUYoY29uc3QgY2hhciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29t cGxldGlvblN0YXR1cyk7IHN0YXRpYyB2b2lkIE9CSkVDVF9OT1RfRVhJU1QoY29uc3QgY2hhcios IGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0YXR1cyk7IHN0YXRpYyB2b2lk IE5PX1BFUk1JU1NJT04oY29uc3QgY2hhciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29t cGxldGlvblN0YXR1cyk7IHN0YXRpYyB2b2lkIElOVEVSTkFMKGNvbnN0IGNoYXIqLCBpbnQsIENP UkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBNQVJTSEFM KGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMp OyBzdGF0aWMgdm9pZCBJTklUSUFMSVpFKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywg Q09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBOT19JTVBMRU1FTlQoY29uc3Qg Y2hhciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0YXR1cyk7IHN0YXRp YyB2b2lkIEJBRF9UWVBFQ09ERShjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsIENPUkJB OjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgQkFEX09QRVJBVElPTihjb25zdCBjaGFy KiwgaW50LCBDT1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZv aWQgTk9fUkVTT1VSQ0VTKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNv bXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBOT19SRVNQT05TRShjb25zdCBjaGFyKiwgaW50 LCBDT1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgUEVS U0lTVF9TVE9SRShjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0 aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgQkFEX0lOVl9PUkRFUihjb25zdCBjaGFyKiwgaW50LCBD T1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgVFJBTlNJ RU5UKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0 dXMpOyBzdGF0aWMgdm9pZCBGUkVFX01FTShjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcs IENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgSU5WX0lERU5UKGNvbnN0IGNo YXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMg dm9pZCBJTlZfRkxBRyhjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsIENPUkJBOjpDb21w bGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgSU5URl9SRVBPUyhjb25zdCBjaGFyKiwgaW50LCBD T1JCQTo6VUxvbmcsIENPUkJBOjpDb21wbGV0aW9uU3RhdHVzKTsgc3RhdGljIHZvaWQgQkFEX0NP TlRFWFQoY29uc3QgY2hhciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0 YXR1cyk7IHN0YXRpYyB2b2lkIE9CSl9BREFQVEVSKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpV TG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBEQVRBX0NPTlZFUlNJ T04oY29uc3QgY2hhciosIGludCwgQ09SQkE6OlVMb25nLCBDT1JCQTo6Q29tcGxldGlvblN0YXR1 cyk7IHN0YXRpYyB2b2lkIFRSQU5TQUNUSU9OX1JFUVVJUkVEKGNvbnN0IGNoYXIqLCBpbnQsIENP UkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBUUkFOU0FD VElPTl9ST0xMRURCQUNLKGNvbnN0IGNoYXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNv bXBsZXRpb25TdGF0dXMpOyBzdGF0aWMgdm9pZCBJTlZBTElEX1RSQU5TQUNUSU9OKGNvbnN0IGNo YXIqLCBpbnQsIENPUkJBOjpVTG9uZywgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOyBzdGF0aWMg dm9pZCBXUk9OR19UUkFOU0FDVElPTihjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsIENP UkJBOjpDb21wbGV0aW9uU3RhdHVzKTsKCgoKICBzdGF0aWMgdm9pZCBvbW5pQ29ubmVjdGlvbkJy b2tlbihjb25zdCBjaGFyKiwgaW50LCBDT1JCQTo6VUxvbmcsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgQ09SQkE6OkNvbXBsZXRpb25TdGF0dXMpOwp9OwojIDg1ICJwb3J0YWJs ZXNlcnZlci5jYyIgMgojIDE2OSAicG9ydGFibGVzZXJ2ZXIuY2MiClBvcnRhYmxlU2VydmVyOjpU aHJlYWRQb2xpY3k6On5UaHJlYWRQb2xpY3koKSB7fSBDT1JCQTo6UG9saWN5X3B0ciBQb3J0YWJs ZVNlcnZlcjo6VGhyZWFkUG9saWN5Ojpjb3B5KCkgeyBpZiggX05QX2lzX25pbCgpICkgX0NPUkJB X2ludm9rZWRfbmlsX3BzZXVkb19yZWYoKTsgcmV0dXJuIG5ldyBUaHJlYWRQb2xpY3kocGRfdmFs dWUpOyB9IHZvaWQqIFBvcnRhYmxlU2VydmVyOjpUaHJlYWRQb2xpY3k6Ol9wdHJUb09ialJlZihj b25zdCBjaGFyKiByZXBvSWQpIHsgZG97IGlmKCAhKHJlcG9JZCkgKSBvbW5pOjphc3NlcnRGYWls KCJwb3J0YWJsZXNlcnZlci5jYyIsMTY5LCAicmVwb0lkIik7IH13aGlsZSgwKTsgaWYoICFzdHJj bXAocmVwb0lkLCBDT1JCQTo6T2JqZWN0OjpfUERfcmVwb0lkKSApIHJldHVybiAoQ09SQkE6Ok9i amVjdF9wdHIpIHRoaXM7IGlmKCAhc3RyY21wKHJlcG9JZCwgQ09SQkE6OlBvbGljeTo6X1BEX3Jl cG9JZCkgKSByZXR1cm4gKENPUkJBOjpQb2xpY3lfcHRyKSB0aGlzOyBpZiggIXN0cmNtcChyZXBv SWQsIFBvcnRhYmxlU2VydmVyOjpUaHJlYWRQb2xpY3k6Ol9QRF9yZXBvSWQpICkgcmV0dXJuIChQ b3J0YWJsZVNlcnZlcjo6VGhyZWFkUG9saWN5X3B0cikgdGhpczsgcmV0dXJuIDA7IH0gUG9ydGFi bGVTZXJ2ZXI6OlRocmVhZFBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OlRocmVhZFBvbGljeTo6 X2R1cGxpY2F0ZShQb3J0YWJsZVNlcnZlcjo6VGhyZWFkUG9saWN5X3B0ciBvYmopIHsgaWYoICFD T1JCQTo6aXNfbmlsKG9iaikgKSBvYmotPl9OUF9pbmNyUmVmQ291bnQoKTsgcmV0dXJuIG9iajsg fSBQb3J0YWJsZVNlcnZlcjo6VGhyZWFkUG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6VGhyZWFk UG9saWN5OjpfbmFycm93KENPUkJBOjpPYmplY3RfcHRyIG9iaikgeyBpZiggQ09SQkE6OmlzX25p bChvYmopICkgcmV0dXJuIF9uaWwoKTsgVGhyZWFkUG9saWN5X3B0ciBwID0gKFRocmVhZFBvbGlj eV9wdHIpIG9iai0+X3B0clRvT2JqUmVmKFRocmVhZFBvbGljeTo6X1BEX3JlcG9JZCk7IGlmKCBw ICkgcC0+X05QX2luY3JSZWZDb3VudCgpOyByZXR1cm4gcCA/IHAgOiBfbmlsKCk7IH0gUG9ydGFi bGVTZXJ2ZXI6OlRocmVhZFBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OlRocmVhZFBvbGljeTo6 X25pbCgpIHsgc3RhdGljIFRocmVhZFBvbGljeSogX3RoZV9uaWxfcHRyID0gMDsgaWYoICFfdGhl X25pbF9wdHIgKSB7IG9tbmk6Om5pbFJlZkxvY2soKS5sb2NrKCk7IGlmKCAhX3RoZV9uaWxfcHRy ICkgX3RoZV9uaWxfcHRyID0gbmV3IFRocmVhZFBvbGljeTsgb21uaTo6bmlsUmVmTG9jaygpLnVu bG9jaygpOyB9IHJldHVybiBfdGhlX25pbF9wdHI7IH0gY29uc3QgY2hhciogUG9ydGFibGVTZXJ2 ZXI6OlRocmVhZFBvbGljeTo6X1BEX3JlcG9JZCA9ICJJREw6b21nLm9yZy9Qb3J0YWJsZVNlcnZl ci8iICJUaHJlYWRQb2xpY3kiICI6Mi4zIjsKUG9ydGFibGVTZXJ2ZXI6OkxpZmVzcGFuUG9saWN5 Ojp+TGlmZXNwYW5Qb2xpY3koKSB7fSBDT1JCQTo6UG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6 TGlmZXNwYW5Qb2xpY3k6OmNvcHkoKSB7IGlmKCBfTlBfaXNfbmlsKCkgKSBfQ09SQkFfaW52b2tl ZF9uaWxfcHNldWRvX3JlZigpOyByZXR1cm4gbmV3IExpZmVzcGFuUG9saWN5KHBkX3ZhbHVlKTsg fSB2b2lkKiBQb3J0YWJsZVNlcnZlcjo6TGlmZXNwYW5Qb2xpY3k6Ol9wdHJUb09ialJlZihjb25z dCBjaGFyKiByZXBvSWQpIHsgZG97IGlmKCAhKHJlcG9JZCkgKSBvbW5pOjphc3NlcnRGYWlsKCJw b3J0YWJsZXNlcnZlci5jYyIsMTcwLCAicmVwb0lkIik7IH13aGlsZSgwKTsgaWYoICFzdHJjbXAo cmVwb0lkLCBDT1JCQTo6T2JqZWN0OjpfUERfcmVwb0lkKSApIHJldHVybiAoQ09SQkE6Ok9iamVj dF9wdHIpIHRoaXM7IGlmKCAhc3RyY21wKHJlcG9JZCwgQ09SQkE6OlBvbGljeTo6X1BEX3JlcG9J ZCkgKSByZXR1cm4gKENPUkJBOjpQb2xpY3lfcHRyKSB0aGlzOyBpZiggIXN0cmNtcChyZXBvSWQs IFBvcnRhYmxlU2VydmVyOjpMaWZlc3BhblBvbGljeTo6X1BEX3JlcG9JZCkgKSByZXR1cm4gKFBv cnRhYmxlU2VydmVyOjpMaWZlc3BhblBvbGljeV9wdHIpIHRoaXM7IHJldHVybiAwOyB9IFBvcnRh YmxlU2VydmVyOjpMaWZlc3BhblBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OkxpZmVzcGFuUG9s aWN5OjpfZHVwbGljYXRlKFBvcnRhYmxlU2VydmVyOjpMaWZlc3BhblBvbGljeV9wdHIgb2JqKSB7 IGlmKCAhQ09SQkE6OmlzX25pbChvYmopICkgb2JqLT5fTlBfaW5jclJlZkNvdW50KCk7IHJldHVy biBvYmo7IH0gUG9ydGFibGVTZXJ2ZXI6OkxpZmVzcGFuUG9saWN5X3B0ciBQb3J0YWJsZVNlcnZl cjo6TGlmZXNwYW5Qb2xpY3k6Ol9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIgb2JqKSB7IGlmKCBD T1JCQTo6aXNfbmlsKG9iaikgKSByZXR1cm4gX25pbCgpOyBMaWZlc3BhblBvbGljeV9wdHIgcCA9 IChMaWZlc3BhblBvbGljeV9wdHIpIG9iai0+X3B0clRvT2JqUmVmKExpZmVzcGFuUG9saWN5Ojpf UERfcmVwb0lkKTsgaWYoIHAgKSBwLT5fTlBfaW5jclJlZkNvdW50KCk7IHJldHVybiBwID8gcCA6 IF9uaWwoKTsgfSBQb3J0YWJsZVNlcnZlcjo6TGlmZXNwYW5Qb2xpY3lfcHRyIFBvcnRhYmxlU2Vy dmVyOjpMaWZlc3BhblBvbGljeTo6X25pbCgpIHsgc3RhdGljIExpZmVzcGFuUG9saWN5KiBfdGhl X25pbF9wdHIgPSAwOyBpZiggIV90aGVfbmlsX3B0ciApIHsgb21uaTo6bmlsUmVmTG9jaygpLmxv Y2soKTsgaWYoICFfdGhlX25pbF9wdHIgKSBfdGhlX25pbF9wdHIgPSBuZXcgTGlmZXNwYW5Qb2xp Y3k7IG9tbmk6Om5pbFJlZkxvY2soKS51bmxvY2soKTsgfSByZXR1cm4gX3RoZV9uaWxfcHRyOyB9 IGNvbnN0IGNoYXIqIFBvcnRhYmxlU2VydmVyOjpMaWZlc3BhblBvbGljeTo6X1BEX3JlcG9JZCA9 ICJJREw6b21nLm9yZy9Qb3J0YWJsZVNlcnZlci8iICJMaWZlc3BhblBvbGljeSIgIjoyLjMiOwpQ b3J0YWJsZVNlcnZlcjo6SWRVbmlxdWVuZXNzUG9saWN5Ojp+SWRVbmlxdWVuZXNzUG9saWN5KCkg e30gQ09SQkE6OlBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OklkVW5pcXVlbmVzc1BvbGljeTo6 Y29weSgpIHsgaWYoIF9OUF9pc19uaWwoKSApIF9DT1JCQV9pbnZva2VkX25pbF9wc2V1ZG9fcmVm KCk7IHJldHVybiBuZXcgSWRVbmlxdWVuZXNzUG9saWN5KHBkX3ZhbHVlKTsgfSB2b2lkKiBQb3J0 YWJsZVNlcnZlcjo6SWRVbmlxdWVuZXNzUG9saWN5OjpfcHRyVG9PYmpSZWYoY29uc3QgY2hhciog cmVwb0lkKSB7IGRveyBpZiggIShyZXBvSWQpICkgb21uaTo6YXNzZXJ0RmFpbCgicG9ydGFibGVz ZXJ2ZXIuY2MiLDE3MSwgInJlcG9JZCIpOyB9d2hpbGUoMCk7IGlmKCAhc3RyY21wKHJlcG9JZCwg Q09SQkE6Ok9iamVjdDo6X1BEX3JlcG9JZCkgKSByZXR1cm4gKENPUkJBOjpPYmplY3RfcHRyKSB0 aGlzOyBpZiggIXN0cmNtcChyZXBvSWQsIENPUkJBOjpQb2xpY3k6Ol9QRF9yZXBvSWQpICkgcmV0 dXJuIChDT1JCQTo6UG9saWN5X3B0cikgdGhpczsgaWYoICFzdHJjbXAocmVwb0lkLCBQb3J0YWJs ZVNlcnZlcjo6SWRVbmlxdWVuZXNzUG9saWN5OjpfUERfcmVwb0lkKSApIHJldHVybiAoUG9ydGFi bGVTZXJ2ZXI6OklkVW5pcXVlbmVzc1BvbGljeV9wdHIpIHRoaXM7IHJldHVybiAwOyB9IFBvcnRh YmxlU2VydmVyOjpJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyIFBvcnRhYmxlU2VydmVyOjpJZFVuaXF1 ZW5lc3NQb2xpY3k6Ol9kdXBsaWNhdGUoUG9ydGFibGVTZXJ2ZXI6OklkVW5pcXVlbmVzc1BvbGlj eV9wdHIgb2JqKSB7IGlmKCAhQ09SQkE6OmlzX25pbChvYmopICkgb2JqLT5fTlBfaW5jclJlZkNv dW50KCk7IHJldHVybiBvYmo7IH0gUG9ydGFibGVTZXJ2ZXI6OklkVW5pcXVlbmVzc1BvbGljeV9w dHIgUG9ydGFibGVTZXJ2ZXI6OklkVW5pcXVlbmVzc1BvbGljeTo6X25hcnJvdyhDT1JCQTo6T2Jq ZWN0X3B0ciBvYmopIHsgaWYoIENPUkJBOjppc19uaWwob2JqKSApIHJldHVybiBfbmlsKCk7IElk VW5pcXVlbmVzc1BvbGljeV9wdHIgcCA9IChJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyKSBvYmotPl9w dHJUb09ialJlZihJZFVuaXF1ZW5lc3NQb2xpY3k6Ol9QRF9yZXBvSWQpOyBpZiggcCApIHAtPl9O UF9pbmNyUmVmQ291bnQoKTsgcmV0dXJuIHAgPyBwIDogX25pbCgpOyB9IFBvcnRhYmxlU2VydmVy OjpJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyIFBvcnRhYmxlU2VydmVyOjpJZFVuaXF1ZW5lc3NQb2xp Y3k6Ol9uaWwoKSB7IHN0YXRpYyBJZFVuaXF1ZW5lc3NQb2xpY3kqIF90aGVfbmlsX3B0ciA9IDA7 IGlmKCAhX3RoZV9uaWxfcHRyICkgeyBvbW5pOjpuaWxSZWZMb2NrKCkubG9jaygpOyBpZiggIV90 aGVfbmlsX3B0ciApIF90aGVfbmlsX3B0ciA9IG5ldyBJZFVuaXF1ZW5lc3NQb2xpY3k7IG9tbmk6 Om5pbFJlZkxvY2soKS51bmxvY2soKTsgfSByZXR1cm4gX3RoZV9uaWxfcHRyOyB9IGNvbnN0IGNo YXIqIFBvcnRhYmxlU2VydmVyOjpJZFVuaXF1ZW5lc3NQb2xpY3k6Ol9QRF9yZXBvSWQgPSAiSURM Om9tZy5vcmcvUG9ydGFibGVTZXJ2ZXIvIiAiSWRVbmlxdWVuZXNzUG9saWN5IiAiOjIuMyI7ClBv cnRhYmxlU2VydmVyOjpJZEFzc2lnbm1lbnRQb2xpY3k6On5JZEFzc2lnbm1lbnRQb2xpY3koKSB7 fSBDT1JCQTo6UG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6SWRBc3NpZ25tZW50UG9saWN5Ojpj b3B5KCkgeyBpZiggX05QX2lzX25pbCgpICkgX0NPUkJBX2ludm9rZWRfbmlsX3BzZXVkb19yZWYo KTsgcmV0dXJuIG5ldyBJZEFzc2lnbm1lbnRQb2xpY3kocGRfdmFsdWUpOyB9IHZvaWQqIFBvcnRh YmxlU2VydmVyOjpJZEFzc2lnbm1lbnRQb2xpY3k6Ol9wdHJUb09ialJlZihjb25zdCBjaGFyKiBy ZXBvSWQpIHsgZG97IGlmKCAhKHJlcG9JZCkgKSBvbW5pOjphc3NlcnRGYWlsKCJwb3J0YWJsZXNl cnZlci5jYyIsMTcyLCAicmVwb0lkIik7IH13aGlsZSgwKTsgaWYoICFzdHJjbXAocmVwb0lkLCBD T1JCQTo6T2JqZWN0OjpfUERfcmVwb0lkKSApIHJldHVybiAoQ09SQkE6Ok9iamVjdF9wdHIpIHRo aXM7IGlmKCAhc3RyY21wKHJlcG9JZCwgQ09SQkE6OlBvbGljeTo6X1BEX3JlcG9JZCkgKSByZXR1 cm4gKENPUkJBOjpQb2xpY3lfcHRyKSB0aGlzOyBpZiggIXN0cmNtcChyZXBvSWQsIFBvcnRhYmxl U2VydmVyOjpJZEFzc2lnbm1lbnRQb2xpY3k6Ol9QRF9yZXBvSWQpICkgcmV0dXJuIChQb3J0YWJs ZVNlcnZlcjo6SWRBc3NpZ25tZW50UG9saWN5X3B0cikgdGhpczsgcmV0dXJuIDA7IH0gUG9ydGFi bGVTZXJ2ZXI6OklkQXNzaWdubWVudFBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OklkQXNzaWdu bWVudFBvbGljeTo6X2R1cGxpY2F0ZShQb3J0YWJsZVNlcnZlcjo6SWRBc3NpZ25tZW50UG9saWN5 X3B0ciBvYmopIHsgaWYoICFDT1JCQTo6aXNfbmlsKG9iaikgKSBvYmotPl9OUF9pbmNyUmVmQ291 bnQoKTsgcmV0dXJuIG9iajsgfSBQb3J0YWJsZVNlcnZlcjo6SWRBc3NpZ25tZW50UG9saWN5X3B0 ciBQb3J0YWJsZVNlcnZlcjo6SWRBc3NpZ25tZW50UG9saWN5OjpfbmFycm93KENPUkJBOjpPYmpl Y3RfcHRyIG9iaikgeyBpZiggQ09SQkE6OmlzX25pbChvYmopICkgcmV0dXJuIF9uaWwoKTsgSWRB c3NpZ25tZW50UG9saWN5X3B0ciBwID0gKElkQXNzaWdubWVudFBvbGljeV9wdHIpIG9iai0+X3B0 clRvT2JqUmVmKElkQXNzaWdubWVudFBvbGljeTo6X1BEX3JlcG9JZCk7IGlmKCBwICkgcC0+X05Q X2luY3JSZWZDb3VudCgpOyByZXR1cm4gcCA/IHAgOiBfbmlsKCk7IH0gUG9ydGFibGVTZXJ2ZXI6 OklkQXNzaWdubWVudFBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OklkQXNzaWdubWVudFBvbGlj eTo6X25pbCgpIHsgc3RhdGljIElkQXNzaWdubWVudFBvbGljeSogX3RoZV9uaWxfcHRyID0gMDsg aWYoICFfdGhlX25pbF9wdHIgKSB7IG9tbmk6Om5pbFJlZkxvY2soKS5sb2NrKCk7IGlmKCAhX3Ro ZV9uaWxfcHRyICkgX3RoZV9uaWxfcHRyID0gbmV3IElkQXNzaWdubWVudFBvbGljeTsgb21uaTo6 bmlsUmVmTG9jaygpLnVubG9jaygpOyB9IHJldHVybiBfdGhlX25pbF9wdHI7IH0gY29uc3QgY2hh ciogUG9ydGFibGVTZXJ2ZXI6OklkQXNzaWdubWVudFBvbGljeTo6X1BEX3JlcG9JZCA9ICJJREw6 b21nLm9yZy9Qb3J0YWJsZVNlcnZlci8iICJJZEFzc2lnbm1lbnRQb2xpY3kiICI6Mi4zIjsKUG9y dGFibGVTZXJ2ZXI6OkltcGxpY2l0QWN0aXZhdGlvblBvbGljeTo6fkltcGxpY2l0QWN0aXZhdGlv blBvbGljeSgpIHt9IENPUkJBOjpQb2xpY3lfcHRyIFBvcnRhYmxlU2VydmVyOjpJbXBsaWNpdEFj dGl2YXRpb25Qb2xpY3k6OmNvcHkoKSB7IGlmKCBfTlBfaXNfbmlsKCkgKSBfQ09SQkFfaW52b2tl ZF9uaWxfcHNldWRvX3JlZigpOyByZXR1cm4gbmV3IEltcGxpY2l0QWN0aXZhdGlvblBvbGljeShw ZF92YWx1ZSk7IH0gdm9pZCogUG9ydGFibGVTZXJ2ZXI6OkltcGxpY2l0QWN0aXZhdGlvblBvbGlj eTo6X3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9JZCkgeyBkb3sgaWYoICEocmVwb0lkKSAp IG9tbmk6OmFzc2VydEZhaWwoInBvcnRhYmxlc2VydmVyLmNjIiwxNzMsICJyZXBvSWQiKTsgfXdo aWxlKDApOyBpZiggIXN0cmNtcChyZXBvSWQsIENPUkJBOjpPYmplY3Q6Ol9QRF9yZXBvSWQpICkg cmV0dXJuIChDT1JCQTo6T2JqZWN0X3B0cikgdGhpczsgaWYoICFzdHJjbXAocmVwb0lkLCBDT1JC QTo6UG9saWN5OjpfUERfcmVwb0lkKSApIHJldHVybiAoQ09SQkE6OlBvbGljeV9wdHIpIHRoaXM7 IGlmKCAhc3RyY21wKHJlcG9JZCwgUG9ydGFibGVTZXJ2ZXI6OkltcGxpY2l0QWN0aXZhdGlvblBv bGljeTo6X1BEX3JlcG9JZCkgKSByZXR1cm4gKFBvcnRhYmxlU2VydmVyOjpJbXBsaWNpdEFjdGl2 YXRpb25Qb2xpY3lfcHRyKSB0aGlzOyByZXR1cm4gMDsgfSBQb3J0YWJsZVNlcnZlcjo6SW1wbGlj aXRBY3RpdmF0aW9uUG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6SW1wbGljaXRBY3RpdmF0aW9u UG9saWN5OjpfZHVwbGljYXRlKFBvcnRhYmxlU2VydmVyOjpJbXBsaWNpdEFjdGl2YXRpb25Qb2xp Y3lfcHRyIG9iaikgeyBpZiggIUNPUkJBOjppc19uaWwob2JqKSApIG9iai0+X05QX2luY3JSZWZD b3VudCgpOyByZXR1cm4gb2JqOyB9IFBvcnRhYmxlU2VydmVyOjpJbXBsaWNpdEFjdGl2YXRpb25Q b2xpY3lfcHRyIFBvcnRhYmxlU2VydmVyOjpJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3k6Ol9uYXJy b3coQ09SQkE6Ok9iamVjdF9wdHIgb2JqKSB7IGlmKCBDT1JCQTo6aXNfbmlsKG9iaikgKSByZXR1 cm4gX25pbCgpOyBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfcHRyIHAgPSAoSW1wbGljaXRBY3Rp dmF0aW9uUG9saWN5X3B0cikgb2JqLT5fcHRyVG9PYmpSZWYoSW1wbGljaXRBY3RpdmF0aW9uUG9s aWN5OjpfUERfcmVwb0lkKTsgaWYoIHAgKSBwLT5fTlBfaW5jclJlZkNvdW50KCk7IHJldHVybiBw ID8gcCA6IF9uaWwoKTsgfSBQb3J0YWJsZVNlcnZlcjo6SW1wbGljaXRBY3RpdmF0aW9uUG9saWN5 X3B0ciBQb3J0YWJsZVNlcnZlcjo6SW1wbGljaXRBY3RpdmF0aW9uUG9saWN5OjpfbmlsKCkgeyBz dGF0aWMgSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5KiBfdGhlX25pbF9wdHIgPSAwOyBpZiggIV90 aGVfbmlsX3B0ciApIHsgb21uaTo6bmlsUmVmTG9jaygpLmxvY2soKTsgaWYoICFfdGhlX25pbF9w dHIgKSBfdGhlX25pbF9wdHIgPSBuZXcgSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5OyBvbW5pOjpu aWxSZWZMb2NrKCkudW5sb2NrKCk7IH0gcmV0dXJuIF90aGVfbmlsX3B0cjsgfSBjb25zdCBjaGFy KiBQb3J0YWJsZVNlcnZlcjo6SW1wbGljaXRBY3RpdmF0aW9uUG9saWN5OjpfUERfcmVwb0lkID0g IklETDpvbWcub3JnL1BvcnRhYmxlU2VydmVyLyIgIkltcGxpY2l0QWN0aXZhdGlvblBvbGljeSIg IjoyLjMiOwpQb3J0YWJsZVNlcnZlcjo6U2VydmFudFJldGVudGlvblBvbGljeTo6flNlcnZhbnRS ZXRlbnRpb25Qb2xpY3koKSB7fSBDT1JCQTo6UG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6U2Vy dmFudFJldGVudGlvblBvbGljeTo6Y29weSgpIHsgaWYoIF9OUF9pc19uaWwoKSApIF9DT1JCQV9p bnZva2VkX25pbF9wc2V1ZG9fcmVmKCk7IHJldHVybiBuZXcgU2VydmFudFJldGVudGlvblBvbGlj eShwZF92YWx1ZSk7IH0gdm9pZCogUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRSZXRlbnRpb25Qb2xp Y3k6Ol9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpIHsgZG97IGlmKCAhKHJlcG9JZCkg KSBvbW5pOjphc3NlcnRGYWlsKCJwb3J0YWJsZXNlcnZlci5jYyIsMTc0LCAicmVwb0lkIik7IH13 aGlsZSgwKTsgaWYoICFzdHJjbXAocmVwb0lkLCBDT1JCQTo6T2JqZWN0OjpfUERfcmVwb0lkKSAp IHJldHVybiAoQ09SQkE6Ok9iamVjdF9wdHIpIHRoaXM7IGlmKCAhc3RyY21wKHJlcG9JZCwgQ09S QkE6OlBvbGljeTo6X1BEX3JlcG9JZCkgKSByZXR1cm4gKENPUkJBOjpQb2xpY3lfcHRyKSB0aGlz OyBpZiggIXN0cmNtcChyZXBvSWQsIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50UmV0ZW50aW9uUG9s aWN5OjpfUERfcmVwb0lkKSApIHJldHVybiAoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRSZXRlbnRp b25Qb2xpY3lfcHRyKSB0aGlzOyByZXR1cm4gMDsgfSBQb3J0YWJsZVNlcnZlcjo6U2VydmFudFJl dGVudGlvblBvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRSZXRlbnRpb25Qb2xpY3k6 Ol9kdXBsaWNhdGUoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRSZXRlbnRpb25Qb2xpY3lfcHRyIG9i aikgeyBpZiggIUNPUkJBOjppc19uaWwob2JqKSApIG9iai0+X05QX2luY3JSZWZDb3VudCgpOyBy ZXR1cm4gb2JqOyB9IFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0ciBQ b3J0YWJsZVNlcnZlcjo6U2VydmFudFJldGVudGlvblBvbGljeTo6X25hcnJvdyhDT1JCQTo6T2Jq ZWN0X3B0ciBvYmopIHsgaWYoIENPUkJBOjppc19uaWwob2JqKSApIHJldHVybiBfbmlsKCk7IFNl cnZhbnRSZXRlbnRpb25Qb2xpY3lfcHRyIHAgPSAoU2VydmFudFJldGVudGlvblBvbGljeV9wdHIp IG9iai0+X3B0clRvT2JqUmVmKFNlcnZhbnRSZXRlbnRpb25Qb2xpY3k6Ol9QRF9yZXBvSWQpOyBp ZiggcCApIHAtPl9OUF9pbmNyUmVmQ291bnQoKTsgcmV0dXJuIHAgPyBwIDogX25pbCgpOyB9IFBv cnRhYmxlU2VydmVyOjpTZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6 U2VydmFudFJldGVudGlvblBvbGljeTo6X25pbCgpIHsgc3RhdGljIFNlcnZhbnRSZXRlbnRpb25Q b2xpY3kqIF90aGVfbmlsX3B0ciA9IDA7IGlmKCAhX3RoZV9uaWxfcHRyICkgeyBvbW5pOjpuaWxS ZWZMb2NrKCkubG9jaygpOyBpZiggIV90aGVfbmlsX3B0ciApIF90aGVfbmlsX3B0ciA9IG5ldyBT ZXJ2YW50UmV0ZW50aW9uUG9saWN5OyBvbW5pOjpuaWxSZWZMb2NrKCkudW5sb2NrKCk7IH0gcmV0 dXJuIF90aGVfbmlsX3B0cjsgfSBjb25zdCBjaGFyKiBQb3J0YWJsZVNlcnZlcjo6U2VydmFudFJl dGVudGlvblBvbGljeTo6X1BEX3JlcG9JZCA9ICJJREw6b21nLm9yZy9Qb3J0YWJsZVNlcnZlci8i ICJTZXJ2YW50UmV0ZW50aW9uUG9saWN5IiAiOjIuMyI7ClBvcnRhYmxlU2VydmVyOjpSZXF1ZXN0 UHJvY2Vzc2luZ1BvbGljeTo6flJlcXVlc3RQcm9jZXNzaW5nUG9saWN5KCkge30gQ09SQkE6OlBv bGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OlJlcXVlc3RQcm9jZXNzaW5nUG9saWN5Ojpjb3B5KCkg eyBpZiggX05QX2lzX25pbCgpICkgX0NPUkJBX2ludm9rZWRfbmlsX3BzZXVkb19yZWYoKTsgcmV0 dXJuIG5ldyBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeShwZF92YWx1ZSk7IH0gdm9pZCogUG9ydGFi bGVTZXJ2ZXI6OlJlcXVlc3RQcm9jZXNzaW5nUG9saWN5OjpfcHRyVG9PYmpSZWYoY29uc3QgY2hh ciogcmVwb0lkKSB7IGRveyBpZiggIShyZXBvSWQpICkgb21uaTo6YXNzZXJ0RmFpbCgicG9ydGFi bGVzZXJ2ZXIuY2MiLDE3NSwgInJlcG9JZCIpOyB9d2hpbGUoMCk7IGlmKCAhc3RyY21wKHJlcG9J ZCwgQ09SQkE6Ok9iamVjdDo6X1BEX3JlcG9JZCkgKSByZXR1cm4gKENPUkJBOjpPYmplY3RfcHRy KSB0aGlzOyBpZiggIXN0cmNtcChyZXBvSWQsIENPUkJBOjpQb2xpY3k6Ol9QRF9yZXBvSWQpICkg cmV0dXJuIChDT1JCQTo6UG9saWN5X3B0cikgdGhpczsgaWYoICFzdHJjbXAocmVwb0lkLCBQb3J0 YWJsZVNlcnZlcjo6UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3k6Ol9QRF9yZXBvSWQpICkgcmV0dXJu IChQb3J0YWJsZVNlcnZlcjo6UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyKSB0aGlzOyByZXR1 cm4gMDsgfSBQb3J0YWJsZVNlcnZlcjo6UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyIFBvcnRh YmxlU2VydmVyOjpSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeTo6X2R1cGxpY2F0ZShQb3J0YWJsZVNl cnZlcjo6UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyIG9iaikgeyBpZiggIUNPUkJBOjppc19u aWwob2JqKSApIG9iai0+X05QX2luY3JSZWZDb3VudCgpOyByZXR1cm4gb2JqOyB9IFBvcnRhYmxl U2VydmVyOjpSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHIgUG9ydGFibGVTZXJ2ZXI6OlJlcXVl c3RQcm9jZXNzaW5nUG9saWN5OjpfbmFycm93KENPUkJBOjpPYmplY3RfcHRyIG9iaikgeyBpZigg Q09SQkE6OmlzX25pbChvYmopICkgcmV0dXJuIF9uaWwoKTsgUmVxdWVzdFByb2Nlc3NpbmdQb2xp Y3lfcHRyIHAgPSAoUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyKSBvYmotPl9wdHJUb09ialJl ZihSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeTo6X1BEX3JlcG9JZCk7IGlmKCBwICkgcC0+X05QX2lu Y3JSZWZDb3VudCgpOyByZXR1cm4gcCA/IHAgOiBfbmlsKCk7IH0gUG9ydGFibGVTZXJ2ZXI6OlJl cXVlc3RQcm9jZXNzaW5nUG9saWN5X3B0ciBQb3J0YWJsZVNlcnZlcjo6UmVxdWVzdFByb2Nlc3Np bmdQb2xpY3k6Ol9uaWwoKSB7IHN0YXRpYyBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeSogX3RoZV9u aWxfcHRyID0gMDsgaWYoICFfdGhlX25pbF9wdHIgKSB7IG9tbmk6Om5pbFJlZkxvY2soKS5sb2Nr KCk7IGlmKCAhX3RoZV9uaWxfcHRyICkgX3RoZV9uaWxfcHRyID0gbmV3IFJlcXVlc3RQcm9jZXNz aW5nUG9saWN5OyBvbW5pOjpuaWxSZWZMb2NrKCkudW5sb2NrKCk7IH0gcmV0dXJuIF90aGVfbmls X3B0cjsgfSBjb25zdCBjaGFyKiBQb3J0YWJsZVNlcnZlcjo6UmVxdWVzdFByb2Nlc3NpbmdQb2xp Y3k6Ol9QRF9yZXBvSWQgPSAiSURMOm9tZy5vcmcvUG9ydGFibGVTZXJ2ZXIvIiAiUmVxdWVzdFBy b2Nlc3NpbmdQb2xpY3kiICI6Mi4zIjsKCgoKCgoKClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50QmFz ZTo6flNlcnZhbnRCYXNlKCkge30KCgpQb3J0YWJsZVNlcnZlcjo6UE9BX3B0cgpQb3J0YWJsZVNl cnZlcjo6U2VydmFudEJhc2U6Ol9kZWZhdWx0X1BPQSgpCnsKICByZXR1cm4gb21uaU9yYlBPQTo6 cm9vdFBPQSgpOwp9CgoKQ09SQkE6Ol9vYmpyZWZfSW50ZXJmYWNlRGVmKgpQb3J0YWJsZVNlcnZl cjo6U2VydmFudEJhc2U6Ol9nZXRfaW50ZXJmYWNlKCkKewoKCgoKICByZXR1cm4gMDsKfQoKCnZv aWQKUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlOjpfYWRkX3JlZigpCnsKCn0KCgp2b2lkClBv cnRhYmxlU2VydmVyOjpTZXJ2YW50QmFzZTo6X3JlbW92ZV9yZWYoKQp7Cgp9CgoKdm9pZCoKUG9y dGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlOjpfZG9fdGhpcyhjb25zdCBjaGFyKiByZXBvSWQpCnsK ICBkb3sgaWYoICEocmVwb0lkKSApIG9tbmk6OmFzc2VydEZhaWwoInBvcnRhYmxlc2VydmVyLmNj IiwyMjEsICJyZXBvSWQiKTsgfXdoaWxlKDApOwoKICBpZiggMCApIHsKCgoKCgoKCiAgfQogIGVs c2UgewoKICAgIHsKICAgICAgb21uaV90cmFjZWRtdXRleF9sb2NrIHN5bmMoKm9tbmk6OmludGVy bmFsTG9jayk7CgogICAgICBvbW5pTG9jYWxJZGVudGl0eSogaWQgPSBfaWRlbnRpdGllcygpOwoK ICAgICAgaWYoIGlkICYmICFpZC0+c2VydmFudHNOZXh0SWRlbnRpdHkoKSApIHsKCiAgICAgICAg b21uaU9ialJlZiogcmVmID0gb21uaTo6Y3JlYXRlT2JqUmVmKF9tb3N0RGVyaXZlZFJlcG9JZCgp LCByZXBvSWQsIGlkKTsKICAgICAgICBkb3sgaWYoICEocmVmKSApIG9tbmk6OmFzc2VydEZhaWwo InBvcnRhYmxlc2VydmVyLmNjIiwyNDIsICJyZWYiKTsgfXdoaWxlKDApOwogICAgICAgIHJldHVy biByZWYtPl9wdHJUb09ialJlZihyZXBvSWQpOwogICAgICB9CiAgICB9CgogICAgUG9ydGFibGVT ZXJ2ZXI6OlBPQV92YXIgcG9hID0gdGhpcy0+X2RlZmF1bHRfUE9BKCk7CgogICAgaWYoIENPUkJB Ojppc19uaWwocG9hKSApCiAgICAgIG9tbmlFeEhlbHBlcjo6T0JKX0FEQVBURVIoInBvcnRhYmxl c2VydmVyLmNjIiwgMjUwLCAwLCBDT1JCQTo6Q09NUExFVEVEX05PKTsKCiAgICByZXR1cm4gKChv bW5pT3JiUE9BKikoUG9ydGFibGVTZXJ2ZXI6OlBPQV9wdHIpIHBvYSktPgogICAgICBzZXJ2YW50 X190aGlzKHRoaXMsIHJlcG9JZCk7CiAgfQp9CgoKb21uaU9ialJlZioKUG9ydGFibGVTZXJ2ZXI6 OlNlcnZhbnRCYXNlOjpfZG9fZ2V0X2ludGVyZmFjZSgpCnsKICBDT1JCQTo6X29ianJlZl9JbnRl cmZhY2VEZWYqIHAgPSBfZ2V0X2ludGVyZmFjZSgpOwogIGlmKCBwICkgcmV0dXJuIHAtPl9QUl9n ZXRvYmooKTsKCgoKCgoKCiAgY29uc3QgY2hhciogcmVwb0lkID0gX21vc3REZXJpdmVkUmVwb0lk KCk7CiAgZG97IGlmKCAhKHJlcG9JZCAmJiAqcmVwb0lkKSApIG9tbmk6OmFzc2VydEZhaWwoInBv cnRhYmxlc2VydmVyLmNjIiwyNzEsICJyZXBvSWQgJiYgKnJlcG9JZCIpOyB9d2hpbGUoMCk7CgoK ICBDT1JCQTo6T2JqZWN0X3ZhciByZXBvc2l0b3J5ID0gQ09SQkE6Ok9iamVjdDo6X25pbCgpOwog IHRyeSB7CiAgICByZXBvc2l0b3J5ID0gb21uaUluaXRpYWxSZWZlcmVuY2VzOjpyZXNvbHZlKCJJ bnRlcmZhY2VSZXBvc2l0b3J5Iik7CiAgfQogIGNhdGNoICguLi4pIHsKICB9CiAgaWYoIENPUkJB Ojppc19uaWwocmVwb3NpdG9yeSkgKQogICAgb21uaUV4SGVscGVyOjpJTlRGX1JFUE9TKCJwb3J0 YWJsZXNlcnZlci5jYyIsIDI4MSwgMCwgQ09SQkE6OkNPTVBMRVRFRF9OTyk7CgoKICBvbW5pU3Rk Q2FsbERlc2M6Ol9jQ09SQkFfbU9iamVjdF9pX2NzdHJpbmcKICAgIGNhbGxfZGVzYyhvbW5pRHlu YW1pY0xpYjo6b3BzLT5sb29rdXBfaWRfbGNmbiwgImxvb2t1cF9pZCIsIDEwLCAwLCByZXBvSWQp OwogIHJlcG9zaXRvcnktPl9QUl9nZXRvYmooKS0+X2ludm9rZShjYWxsX2Rlc2MpOwoKICByZXR1 cm4gY2FsbF9kZXNjLnJlc3VsdCgpID8gY2FsbF9kZXNjLnJlc3VsdCgpLT5fUFJfZ2V0b2JqKCkg OiAwOwp9CgoKdm9pZCoKUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlOjpfZG93bmNhc3QoKQp7 CiAgcmV0dXJuIChTZXJ2YW50KSB0aGlzOwp9CgoKCgoKc3RhdGljIG9tbmlfdHJhY2VkbXV0ZXgg cmVmX2NvdW50X2xvY2s7CgoKUG9ydGFibGVTZXJ2ZXI6OlJlZkNvdW50U2VydmFudEJhc2U6On5S ZWZDb3VudFNlcnZhbnRCYXNlKCkge30KCgp2b2lkClBvcnRhYmxlU2VydmVyOjpSZWZDb3VudFNl cnZhbnRCYXNlOjpfYWRkX3JlZigpCnsKICByZWZfY291bnRfbG9jay5sb2NrKCk7CgoKCgoKICBk b3sgaWYoICEocGRfcmVmQ291bnQgPiAwKSApIG9tbmk6OnVjaGVja0ZhaWwoInBvcnRhYmxlc2Vy dmVyLmNjIiwzMTcsICJwZF9yZWZDb3VudCA+IDAiKTsgfXdoaWxlKDApOwoKICBwZF9yZWZDb3Vu dCsrOwogIHJlZl9jb3VudF9sb2NrLnVubG9jaygpOwp9CgoKdm9pZApQb3J0YWJsZVNlcnZlcjo6 UmVmQ291bnRTZXJ2YW50QmFzZTo6X3JlbW92ZV9yZWYoKQp7CiAgcmVmX2NvdW50X2xvY2subG9j aygpOwogIGludCBkb25lID0gLS1wZF9yZWZDb3VudCA+IDA7CiAgcmVmX2NvdW50X2xvY2sudW5s b2NrKCk7CiAgaWYoIGRvbmUgKSByZXR1cm47CgogIGlmKCBwZF9yZWZDb3VudCA8IDAgKSB7CiAg ICBvbW5pT1JCOjpsb2dzKDEsICJSZWZDb3VudFNlcnZhbnRCYXNlIGhhcyBuZWdhdGl2ZSByZWYg Y291bnQhIik7CiAgICByZXR1cm47CiAgfQoKICBvbW5pT1JCOjpsb2dzKDE1LCAiUmVmQ291bnRT ZXJ2YW50QmFzZSBoYXMgemVybyByZWYgY291bnQgLS0gZGVsZXRlZC4iKTsKCiAgZGVsZXRlIHRo aXM7Cn0KCgoKCgpjaGFyKgpQb3J0YWJsZVNlcnZlcjo6T2JqZWN0SWRfdG9fc3RyaW5nKGNvbnN0 IE9iamVjdElkJiBpZCkKewogIGludCBsZW4gPSBpZC5sZW5ndGgoKTsKCiAgY2hhciogcyA9IG9t bmk6OmFsbG9jU3RyaW5nKGxlbik7CgogIGZvciggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKQog ICAgaWYoIChjaGFyKSAoc1tpXSA9IGlkW2ldKSA9PSAnXDAnICkgewogICAgICBkZWxldGVbXSBz OwogICAgICBvbW5pRXhIZWxwZXI6OkJBRF9QQVJBTSgicG9ydGFibGVzZXJ2ZXIuY2MiLCAzNTYs IDAsIENPUkJBOjpDT01QTEVURURfTk8pOwogICAgfQoKICBzW2xlbl0gPSAnXDAnOwogIHJldHVy biBzOwp9CgoKUG9ydGFibGVTZXJ2ZXI6Ok9iamVjdElkKgpQb3J0YWJsZVNlcnZlcjo6c3RyaW5n X3RvX09iamVjdElkKGNvbnN0IGNoYXIqIHMpCnsKICBpbnQgbGVuID0gc3RybGVuKHMpOwogIE9i amVjdElkKiBwaWQgPSBuZXcgT2JqZWN0SWQobGVuKTsKICBPYmplY3RJZCYgaWQgPSAqcGlkOwoK ICBpZC5sZW5ndGgobGVuKTsKCiAgZm9yKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIGlkW2ld ID0gKnMrKzsKCiAgcmV0dXJuIHBpZDsKfQo=