From mboxrd@z Thu Jan 1 00:00:00 1970 From: neil@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c++/383 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010120112604.11921.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00524.html List-Id: The following reply was made to PR c++/383; it has been noted by GNATS. From: neil@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, jcampbell3@prodigy.net, martin@loewis.home.cs.tu-berlin.de, nobody@gcc.gnu.org Cc: Subject: Re: c++/383 Date: 20 Jan 2001 11:25:11 -0000 Synopsis: C++v2,96:member template conversion not implicit State-Changed-From-To: analyzed->open State-Changed-By: neil State-Changed-When: Sat Jan 20 03:25:11 2001 State-Changed-Why: Not analyzed http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=383&database=gcc >>From jarausch@igpm.rwth-aachen.de Sun Apr 01 00:00:00 2001 From: jarausch@igpm.rwth-aachen.de To: gcc-gnats@gcc.gnu.org Subject: c/1778: IRIX 20010126 c_expand_expr compiler error Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010126114229.2901.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00730.html Content-length: 1317 >Number: 1778 >Category: c >Synopsis: IRIX 20010126 c_expand_expr compiler error >Confidential: no >Severity: serious >Priority: high >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Jan 26 03:46:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: Helmut Jarausch, Lehrst. Numer. Math, RWTH Aachen, Germany >Release: CVS 20010126 >Organization: >Environment: IRIX 6.5 (9) >Description: Tring to build: ./xgcc -B./ -B/usr/LOCAL/mips-sgi-irix6.5/bin/ -isystem /usr/LOCAL/mips-sgi-irix6.5/include -O3 -DIN_GCC -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -isystem ./include -O3 -g1 -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -I. -I. -I/usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc -I/usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/. -I/usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/config -I/usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/../include -DL_muldi3 -c /usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/libgcc2.c -o libgcc/./_muldi3.o /usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/libgcc2.c: In function `__muldi3': /usr/people/jarausch/ZIP/EGCS/gcc-cvs/gcc/libgcc2.c:360: Internal compiler error in c_expand_expr, at c-common.c:4072 >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: >>From lerdsuwa@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: lerdsuwa@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c++/334 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010204133601.6314.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00925.html Content-length: 535 The following reply was made to PR c++/334; it has been noted by GNATS. From: lerdsuwa@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org, petter@matfys.lth.se Cc: Subject: Re: c++/334 Date: 4 Feb 2001 13:30:09 -0000 Synopsis: ICE at -O2 State-Changed-From-To: analyzed->closed State-Changed-By: lerdsuwa State-Changed-When: Sun Feb 4 05:30:09 2001 State-Changed-Why: The bug appears to be fixed in the CVS. Tested with snapshot 20010123. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=334&database=gcc >>From neil@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: neil@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c++/513 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010121133601.21856.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00559.html Content-length: 552 The following reply was made to PR c++/513; it has been noted by GNATS. From: neil@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, m@icopyright.com, nobody@gcc.gnu.org Cc: Subject: Re: c++/513 Date: 21 Jan 2001 13:34:21 -0000 Synopsis: Duplicate symbols not collapsed for template constructor State-Changed-From-To: open->closed State-Changed-By: neil State-Changed-When: Sun Jan 21 05:34:21 2001 State-Changed-Why: CVS G++ compiles and links fine without error (Linux 586) http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=513&database=gcc >>From tromey@redhat.com Sun Apr 01 00:00:00 2001 From: Tom Tromey To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: libgcj/1913: reading closed streams throws NullPointerException, not IOException Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010209013600.19126.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg01089.html Content-length: 722 The following reply was made to PR libgcj/1913; it has been noted by GNATS. From: Tom Tromey To: paul@dawa.demon.co.uk Cc: gcc-gnats@gcc.gnu.org Subject: Re: libgcj/1913: reading closed streams throws NullPointerException, not IOException Date: 08 Feb 2001 18:31:48 -0700 >>>>> "Paul" == paul writes: Paul> While trying to produce a test case for java/1912 I noticed that Paul> reading from an InputStreamReader after a close throws a Paul> NullPointerException whereas in the Sun JDK it throws an Paul> IOException with the message "Stream closed". I modified your test case and checked it in to Mauve. I'll probably commit your change in the near future. Tom >>From neil@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: neil@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c/727 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010203120601.25333.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00877.html Content-length: 554 The following reply was made to PR c/727; it has been noted by GNATS. From: neil@gcc.gnu.org To: dedu@ese-metz.fr, gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org Cc: Subject: Re: c/727 Date: 3 Feb 2001 11:57:36 -0000 Synopsis: Warning bug if -O0? State-Changed-From-To: open->closed State-Changed-By: neil State-Changed-When: Sat Feb 3 03:57:36 2001 State-Changed-Why: This is not a bug; GCC does not do sufficient flow analysis when not optimising to give the warnings. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=727&database=gcc >>From neil@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: neil@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c/374 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010120112603.11903.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00523.html Content-length: 604 The following reply was made to PR c/374; it has been noted by GNATS. From: neil@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, martin@loewis.home.cs.tu-berlin.de, nickols_k@mail.ru, nobody@gcc.gnu.org Cc: Subject: Re: c/374 Date: 20 Jan 2001 11:20:46 -0000 Synopsis: gcc-2.95.2 ceases to produce workable executables after recompiling it with some optimization State-Changed-From-To: open->closed State-Changed-By: neil State-Changed-When: Sat Jan 20 03:20:46 2001 State-Changed-Why: This is not an acceptable bug report. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=374&database=gcc >>From cate@debian.org Sun Apr 01 00:00:00 2001 From: cate@debian.org To: gcc-gnats@gcc.gnu.org Subject: c++/1744: Internal compiler error in `make_decl_rtl', at varasm.c:738 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010123143812.15983.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00631.html Content-length: 810507 >Number: 1744 >Category: c++ >Synopsis: Internal compiler error in `make_decl_rtl', at varasm.c:738 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Jan 23 06:46:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: Giacomo Catenazzi >Release: gcc version 2.95.2 20000220 (Debian GNU/Linux) >Organization: >Environment: Debian Linux on a i386 arch. >Description: Compiling an erroneous code: g++ -pipe -ggdb -DDEBUG linel.ii ... linel.cc:209: ANSI C++ forbids declaration `M' with no type linel.cc:209: conflicting types for `int M' linel.cc:153: previous declaration as `class op_Local M' linel.cc:209: initializer list being treated as compound expression linel.cc:209: `class fnc_Vector' used where a `int' was expected linel.cc:221: syntax error before `<' linel.cc:223: syntax error before `<' linel.cc: In function `void __static_initialization_and_destruction_0(int, int)': cc1plus: register name not specified for ` /* decl error */ ' linel.cc:138: Internal compiler error in `make_decl_rtl', at varasm.c:738 Please submit a full bug report. See for instructions. cate@herodot% >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="linel.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="linel.ii" IyAxICJsaW5lbC5jYyIKIAoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3RyZWFtLmgiIDEgMwogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgojIDEgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCiAg IAoKCgpleHRlcm4gIkMiIHsKIyAxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMSAzCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAxIDMK IAoKCgoKCiAKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwogCgoKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKCgog CgoKCgoKCgogCiMgMTQyICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMwoKCiAKCgoKCgoKCgoK IAoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyMDggIi91c3IvaW5jbHVk ZS9mZWF0dXJlcy5oIiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCiAK CgogCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKIAoKCiMgMSAiL3Vzci9pbmNsdWRl L3N5cy9jZGVmcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCiAKCgoKCgoKIAoK CgoKCiAKCgoKCgoKCgogCgoKCiMgNjUgIi91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCIgMwoKCiAK CgoKCgogCgoKCgogCgoKCgoKCgoKCiAKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgoKCiAKCgoKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgogCgoKCgoKCgoK IAoKCgoKCgoKIAoKCgoKIAoKCgoKCgojIDI4MyAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDIg MwoKCgogCgoKCgoKCgoKIAoKCgoKIAoKIAoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2dudS9z dHVicy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMxMSAiL3Vz ci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDIgMwoKCgoKIyAyNiAiL3Vzci9pbmNsdWRlL2JpdHMvdHlw ZXMuaCIgMiAzCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNs dWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1s aW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIv dXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgog CgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2kz ODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAzMTcg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI5ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5o IiAyIDMKCgogCnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VfY2hhcjsKdHlwZWRlZiB1bnNpZ25l ZCBzaG9ydCBfX3Vfc2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9fdV9pbnQ7CnR5cGVkZWYg dW5zaWduZWQgbG9uZyBfX3VfbG9uZzsKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBs b25nIGxvbmcgaW50IF9fdV9xdWFkX3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcg aW50IF9fcXVhZF90OwojIDQ4ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAzCgp0eXBlZGVm IHNpZ25lZCBjaGFyIF9faW50OF90Owp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191aW50OF90Owp0 eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0 IGludCBfX3VpbnQxNl90Owp0eXBlZGVmIHNpZ25lZCBpbnQgX19pbnQzMl90Owp0eXBlZGVmIHVu c2lnbmVkIGludCBfX3VpbnQzMl90OwoKX19leHRlbnNpb25fXyB0eXBlZGVmIHNpZ25lZCBsb25n IGxvbmcgaW50IF9faW50NjRfdDsKX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcg bG9uZyBpbnQgX191aW50NjRfdDsKCnR5cGVkZWYgX19xdWFkX3QgKl9fcWFkZHJfdDsKCnR5cGVk ZWYgX191X3F1YWRfdCBfX2Rldl90OwkJIAp0eXBlZGVmIF9fdV9pbnQgX191aWRfdDsJCSAKdHlw ZWRlZiBfX3VfaW50IF9fZ2lkX3Q7CQkgCnR5cGVkZWYgX191X2xvbmcgX19pbm9fdDsJCSAKdHlw ZWRlZiBfX3VfaW50IF9fbW9kZV90OwkJIAp0eXBlZGVmIF9fdV9pbnQgX19ubGlua190OyAJCSAK dHlwZWRlZiBsb25nIGludCBfX29mZl90OwkJIAp0eXBlZGVmIF9fcXVhZF90IF9fbG9mZl90OwkJ IAp0eXBlZGVmIGludCBfX3BpZF90OwkJCSAKdHlwZWRlZiBpbnQgX19zc2l6ZV90OwkJCSAKdHlw ZWRlZiBfX3VfbG9uZyBfX3JsaW1fdDsJCSAKdHlwZWRlZiBfX3VfcXVhZF90IF9fcmxpbTY0X3Q7 CQkgCnR5cGVkZWYgX191X2ludCBfX2lkX3Q7CQkJIAoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICBp bnQgX192YWxbMl07CiAgfSBfX2ZzaWRfdDsJCQkJIAoKIAp0eXBlZGVmIGludCBfX2RhZGRyX3Q7 CQkJIAp0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKdHlwZWRlZiBsb25nIGludCBfX3RpbWVfdDsK dHlwZWRlZiB1bnNpZ25lZCBpbnQgX191c2Vjb25kc190Owp0eXBlZGVmIGxvbmcgaW50IF9fc3Vz ZWNvbmRzX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19zd2Jsa190OwkJIAoMCnR5cGVkZWYgbG9uZyBp bnQgX19jbG9ja190OwoKIAp0eXBlZGVmIGludCBfX2Nsb2NraWRfdDsKCiAKdHlwZWRlZiBpbnQg X190aW1lcl90OwoKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2ZkX21hc2s7CgogCgoK IAoKCgoKIAp0eXBlZGVmIHN0cnVjdAogIHsKICAgICAKCgoKCgogICAgX19mZF9tYXNrIF9fZmRz X2JpdHNbMTAyNCAgLyAoOCAqIHNpemVvZiAoX19mZF9tYXNrKSkgXTsKCgogIH0gX19mZF9zZXQ7 CgoKdHlwZWRlZiBpbnQgX19rZXlfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX19p cGNfcGlkX3Q7CgoKIAp0eXBlZGVmIGxvbmcgaW50IF9fYmxrc2l6ZV90OwoKIAoKIAp0eXBlZGVm IGxvbmcgaW50IF9fYmxrY250X3Q7CnR5cGVkZWYgX19xdWFkX3QgX19ibGtjbnQ2NF90OwoKIAp0 eXBlZGVmIF9fdV9sb25nIF9fZnNibGtjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNibGtj bnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNmaWxjbnRfdDsKdHlwZWRlZiBfX3VfcXVh ZF90IF9fZnNmaWxjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9xdWFkX3QgX19pbm82NF90OwoKIAp0 eXBlZGVmIF9fbG9mZl90IF9fb2ZmNjRfdDsKCiAKdHlwZWRlZiBsb25nIGludCBfX3Rfc2NhbGFy X3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX190X3VzY2FsYXJfdDsKCiAKdHlwZWRlZiBp bnQgX19pbnRwdHJfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19zb2NrbGVuX3Q7CgoKIAoK IyAxICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMSAzCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAxIDMK IAoKCgoKCgoKCgoKCgoKCgoKCgoKIyA2MiAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMwoK CgoKCiAKc3RydWN0IF9fc2NoZWRfcGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAg fTsKCgojIDIzICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMiAzCgoKIApzdHJ1 Y3QgX3B0aHJlYWRfZmFzdGxvY2sKewogIGxvbmcgaW50IF9fc3RhdHVzOyAgICAKICBpbnQgX19z cGlubG9jazsgICAgICAgCgp9OwoKCiAKdHlwZWRlZiBzdHJ1Y3QgX3B0aHJlYWRfZGVzY3Jfc3Ry dWN0ICpfcHRocmVhZF9kZXNjcjsKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2RldGFj aHN0YXRlOwogIGludCBfX3NjaGVkcG9saWN5OwogIHN0cnVjdCBfX3NjaGVkX3BhcmFtIF9fc2No ZWRwYXJhbTsKICBpbnQgX19pbmhlcml0c2NoZWQ7CiAgaW50IF9fc2NvcGU7CiAgc2l6ZV90IF9f Z3VhcmRzaXplOwogIGludCBfX3N0YWNrYWRkcl9zZXQ7CiAgdm9pZCAqX19zdGFja2FkZHI7CiAg c2l6ZV90IF9fc3RhY2tzaXplOwp9IHB0aHJlYWRfYXR0cl90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QK ewogIHN0cnVjdCBfcHRocmVhZF9mYXN0bG9jayBfX2NfbG9jazsgIAogIF9wdGhyZWFkX2Rlc2Ny IF9fY193YWl0aW5nOyAgICAgICAgIAp9IHB0aHJlYWRfY29uZF90OwoKCiAKdHlwZWRlZiBzdHJ1 Y3QKewogIGludCBfX2R1bW15Owp9IHB0aHJlYWRfY29uZGF0dHJfdDsKCiAKdHlwZWRlZiB1bnNp Z25lZCBpbnQgcHRocmVhZF9rZXlfdDsKCgogCiAKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19t X3Jlc2VydmVkOyAgICAgICAgICAgICAgICAKICBpbnQgX19tX2NvdW50OyAgICAgICAgICAgICAg ICAgICAKICBfcHRocmVhZF9kZXNjciBfX21fb3duZXI7ICAgICAgICAKICBpbnQgX19tX2tpbmQ7 ICAgICAgICAgICAgICAgICAgICAKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19tX2xvY2s7 ICAKfSBwdGhyZWFkX211dGV4X3Q7CgoKIAp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbXV0ZXhr aW5kOwp9IHB0aHJlYWRfbXV0ZXhhdHRyX3Q7CgoKIAp0eXBlZGVmIGludCBwdGhyZWFkX29uY2Vf dDsKCgojIDExNyAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDMKCgojIDEzNiAi L3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDMKCgoKIAp0eXBlZGVmIHVuc2lnbmVk IGxvbmcgaW50IHB0aHJlYWRfdDsKCgojIDE2NSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIg MiAzCgoKCgojIDkgIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIgMiAzCgoKCgoKIyAxICIvdXNy L2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoK CgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1s aW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2kz ODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgp0eXBlZGVmIHVuc2lnbmVkIGludCAgd2ludF90OwoKCgoKIAoKIAoK IyAzMTcgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDE0ICIvdXNyL2luY2x1ZGUvX0dfY29u ZmlnLmgiIDIgMwoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKIyA0MyAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMK CgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgojIDE5MCAiL3Vzci9saWIv Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgoKCiAK CiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxp bnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiMgNDUgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRz L3djaGFyLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDQ3ICIvdXNyL2luY2x1 ZGUvd2NoYXIuaCIgMiAzCgoKIAoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIHN0cnVjdAp7CiAgaW50 IF9fY291bnQ7CiAgdW5pb24KICB7CiAgICB3aW50X3QgX193Y2g7CiAgICBjaGFyIF9fd2NoYls0 XTsKICB9IF9fdmFsdWU7CQkgCn0gX19tYnN0YXRlX3Q7CgoKCgogCgojIDY4MSAiL3Vzci9pbmNs dWRlL3djaGFyLmgiIDMKCgoKIyAyNCAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAyIDMKCgp0 eXBlZGVmIHN0cnVjdAp7CiAgX19vZmZfdCBfX3BvczsKICBfX21ic3RhdGVfdCBfX3N0YXRlOwp9 IF9HX2Zwb3NfdDsKdHlwZWRlZiBzdHJ1Y3QKewogIF9fb2ZmNjRfdCBfX3BvczsKICBfX21ic3Rh dGVfdCBfX3N0YXRlOwp9IF9HX2Zwb3M2NF90OwoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2dj b252LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRl L3djaGFyLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCiMgNDMgIi91c3Iv aW5jbHVkZS93Y2hhci5oIiAzCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45 NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxp Yi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoK CiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vz ci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoK IAoKIyAxOTAgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKCgoKIAoKIAoKIyAzMTcgIi91c3Iv bGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgojIDQ1ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMiAzCgoKCgog CgoKCgoKCgoKCgoKIyA3MyAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKCiAKCiMgNjgxICIv dXNyL2luY2x1ZGUvd2NoYXIuaCIgMwoKCgojIDI4ICIvdXNyL2luY2x1ZGUvZ2NvbnYuaCIgMiAz CgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVm LmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoK CgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5j bHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyAzMCAiL3Vzci9pbmNsdWRlL2djb252LmgiIDIgMwoKCiAKCgogCmVudW0KewogIF9fR0NPTlZf T0sgPSAwLAogIF9fR0NPTlZfTk9DT05WLAogIF9fR0NPTlZfTk9EQiwKICBfX0dDT05WX05PTUVN LAoKICBfX0dDT05WX0VNUFRZX0lOUFVULAogIF9fR0NPTlZfRlVMTF9PVVRQVVQsCiAgX19HQ09O Vl9JTExFR0FMX0lOUFVULAogIF9fR0NPTlZfSU5DT01QTEVURV9JTlBVVCwKCiAgX19HQ09OVl9J TExFR0FMX0RFU0NSSVBUT1IsCiAgX19HQ09OVl9JTlRFUk5BTF9FUlJPUgp9OwoKCiAKZW51bQp7 CiAgX19HQ09OVl9JU19MQVNUID0gMHgwMDAxLAogIF9fR0NPTlZfSUdOT1JFX0VSUk9SUyA9IDB4 MDAwMgp9OwoKCiAKc3RydWN0IF9fZ2NvbnZfc3RlcDsKc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRh OwpzdHJ1Y3QgX19nY29udl9sb2FkZWRfb2JqZWN0OwpzdHJ1Y3QgX19nY29udl90cmFuc19kYXRh OwoKCiAKdHlwZWRlZiBpbnQgKCpfX2djb252X2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKiwg c3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhICosCgkJCSAgICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIg KiosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAoJCQkgICAgdW5zaWduZWQgY2hhciAqKiwgc2l6 ZV90ICosIGludCwgaW50KTsKCiAKdHlwZWRlZiBpbnQgKCpfX2djb252X2luaXRfZmN0KSAoc3Ry dWN0IF9fZ2NvbnZfc3RlcCAqKTsKdHlwZWRlZiB2b2lkICgqX19nY29udl9lbmRfZmN0KSAoc3Ry dWN0IF9fZ2NvbnZfc3RlcCAqKTsKCgogCnR5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19mY3Qp IChzdHJ1Y3QgX19nY29udl9zdGVwICosCgkJCQkgIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSAq LCB2b2lkICosCgkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAoJCQkJICBfX2NvbnN0IHVu c2lnbmVkIGNoYXIgKiosCgkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBj aGFyICoqLAoJCQkJICBzaXplX3QgKik7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19j b250ZXh0X2ZjdCkgKHZvaWQgKiwgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCgkJCQkJICBfX2Nv bnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJCQkgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hh ciAqKTsKCiAKdHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX3F1ZXJ5X2ZjdCkgKF9fY29uc3Qg Y2hhciAqLCBfX2NvbnN0IGNoYXIgKioqLAoJCQkJCXNpemVfdCAqKTsKCiAKdHlwZWRlZiBpbnQg KCpfX2djb252X3RyYW5zX2luaXRfZmN0KSAodm9pZCAqKiwgY29uc3QgY2hhciAqKTsKdHlwZWRl ZiB2b2lkICgqX19nY29udl90cmFuc19lbmRfZmN0KSAodm9pZCAqKTsKCnN0cnVjdCBfX2djb252 X3RyYW5zX2RhdGEKewogICAKICBfX2djb252X3RyYW5zX2ZjdCBfX3RyYW5zX2ZjdDsKICBfX2dj b252X3RyYW5zX2NvbnRleHRfZmN0IF9fdHJhbnNfY29udGV4dF9mY3Q7CiAgX19nY29udl90cmFu c19lbmRfZmN0IF9fdHJhbnNfZW5kX2ZjdDsKICB2b2lkICpfX2RhdGE7CiAgc3RydWN0IF9fZ2Nv bnZfdHJhbnNfZGF0YSAqX19uZXh0Owp9OwoKCiAKc3RydWN0IF9fZ2NvbnZfc3RlcAp7CiAgc3Ry dWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdCAqX19zaGxpYl9oYW5kbGU7CiAgX19jb25zdCBjaGFy ICpfX21vZG5hbWU7CgogIGludCBfX2NvdW50ZXI7CgogIGNoYXIgKl9fZnJvbV9uYW1lOwogIGNo YXIgKl9fdG9fbmFtZTsKCiAgX19nY29udl9mY3QgX19mY3Q7CiAgX19nY29udl9pbml0X2ZjdCBf X2luaXRfZmN0OwogIF9fZ2NvbnZfZW5kX2ZjdCBfX2VuZF9mY3Q7CgogICAKCiAgaW50IF9fbWlu X25lZWRlZF9mcm9tOwogIGludCBfX21heF9uZWVkZWRfZnJvbTsKICBpbnQgX19taW5fbmVlZGVk X3RvOwogIGludCBfX21heF9uZWVkZWRfdG87CgogICAKICBpbnQgX19zdGF0ZWZ1bDsKCiAgdm9p ZCAqX19kYXRhOwkJIAp9OwoKIAoKc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhCnsKICB1bnNpZ25l ZCBjaGFyICpfX291dGJ1ZjsgICAgIAogIHVuc2lnbmVkIGNoYXIgKl9fb3V0YnVmZW5kOyAgCgoK ICAgCiAgaW50IF9fZmxhZ3M7CgogICAKCiAgaW50IF9faW52b2NhdGlvbl9jb3VudGVyOwoKICAg CgogIGludCBfX2ludGVybmFsX3VzZTsKCiAgX19tYnN0YXRlX3QgKl9fc3RhdGVwOwogIF9fbWJz dGF0ZV90IF9fc3RhdGU7CSAKCgogICAKICBzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhICpfX3Ry YW5zOwp9OwoKCiAKdHlwZWRlZiBzdHJ1Y3QgX19nY29udl9pbmZvCnsKICBzaXplX3QgX19uc3Rl cHM7CiAgc3RydWN0IF9fZ2NvbnZfc3RlcCAqX19zdGVwczsKICBfX2V4dGVuc2lvbl9fIHN0cnVj dCBfX2djb252X3N0ZXBfZGF0YSBfX2RhdGEgWzBdIDsKfSAqX19nY29udl90OwoKCiMgNDQgIi91 c3IvaW5jbHVkZS9fR19jb25maWcuaCIgMiAzCgp0eXBlZGVmIHVuaW9uCnsKICBzdHJ1Y3QgX19n Y29udl9pbmZvIF9fY2Q7CiAgc3RydWN0CiAgewogICAgc3RydWN0IF9fZ2NvbnZfaW5mbyBfX2Nk OwogICAgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0YTsKICB9IF9fY29tYmluZWQ7Cn0g X0dfaWNvbnZfdDsKCnR5cGVkZWYgaW50IF9HX2ludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9k ZV9fIChfX0hJX18pKSk7CnR5cGVkZWYgaW50IF9HX2ludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9f bW9kZV9fIChfX1NJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9HX3VpbnQxNl90IF9fYXR0 cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkpOwp0eXBlZGVmIHVuc2lnbmVkIGludCBfR191 aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoKCgoKCiMgMzAgIi91c3IvaW5jbHVkZS9saWJp by5oIiAyIDMKCiAKCgoKCgoKCgoKCgoKCgoKCgogCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4 Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKdHlw ZWRlZiB2b2lkICpfX2dudWNfdmFfbGlzdDsKCgoKIAoKIyAxMjIgIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoK CiMgMjA5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkYXJn LmgiIDMKCgoKCiMgNTEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKCgoKCgoKCiMgNzAgIi91 c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKIAoKCgoKCgoKCgoKCgoKCgoKCiMgMTAxICIvdXNyL2lu Y2x1ZGUvbGliaW8uaCIgMwoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKCnN0cnVjdCBfSU9fanVtcF90OyAgc3RydWN0IF9JT19GSUxFOwoK IAoKCgoKCgoKdHlwZWRlZiB2b2lkIF9JT19sb2NrX3Q7CgoKCiAKCnN0cnVjdCBfSU9fbWFya2Vy IHsKICBzdHJ1Y3QgX0lPX21hcmtlciAqX25leHQ7CiAgc3RydWN0IF9JT19GSUxFICpfc2J1ZjsK ICAgCgogICAKICBpbnQgX3BvczsKIyAxOTAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgp9OwoK IAplbnVtIF9fY29kZWN2dF9yZXN1bHQKewogIF9fY29kZWN2dF9vaywKICBfX2NvZGVjdnRfcGFy dGlhbCwKICBfX2NvZGVjdnRfZXJyb3IsCiAgX19jb2RlY3Z0X25vY29udgp9OwoKIyAyNTcgIi91 c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKc3RydWN0IF9JT19GSUxFIHsKICBpbnQgX2ZsYWdzOwkJ IAoKCiAgIAogICAKICBjaGFyKiBfSU9fcmVhZF9wdHI7CSAKICBjaGFyKiBfSU9fcmVhZF9lbmQ7 CSAKICBjaGFyKiBfSU9fcmVhZF9iYXNlOwkgCiAgY2hhciogX0lPX3dyaXRlX2Jhc2U7CSAKICBj aGFyKiBfSU9fd3JpdGVfcHRyOwkgCiAgY2hhciogX0lPX3dyaXRlX2VuZDsJIAogIGNoYXIqIF9J T19idWZfYmFzZTsJIAogIGNoYXIqIF9JT19idWZfZW5kOwkgCiAgIAogIGNoYXIgKl9JT19zYXZl X2Jhc2U7ICAKICBjaGFyICpfSU9fYmFja3VwX2Jhc2U7ICAgCiAgY2hhciAqX0lPX3NhdmVfZW5k OyAgCgogIHN0cnVjdCBfSU9fbWFya2VyICpfbWFya2VyczsKCiAgc3RydWN0IF9JT19GSUxFICpf Y2hhaW47CgogIGludCBfZmlsZW5vOwogIGludCBfYmxrc2l6ZTsKICBfX29mZl90ICAgX29sZF9v ZmZzZXQ7ICAKCgogICAKICB1bnNpZ25lZCBzaG9ydCBfY3VyX2NvbHVtbjsKICBzaWduZWQgY2hh ciBfdnRhYmxlX29mZnNldDsKICBjaGFyIF9zaG9ydGJ1ZlsxXTsKCiAgIAoKICBfSU9fbG9ja190 ICpfbG9jazsKCgoKCgoKCgogIF9fb2ZmNjRfdCAgIF9vZmZzZXQ7CgoKCgoKICB2b2lkICpfX3Bh ZDE7CiAgdm9pZCAqX19wYWQyOwoKICBpbnQgX21vZGU7CiAgIAogIGNoYXIgX3VudXNlZDJbMTUg KiBzaXplb2YgKGludCkgLSAyICogc2l6ZW9mICh2b2lkICopXTsKCn07CgoKCgoKc3RydWN0IF9J T19GSUxFX3BsdXM7CgpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRpbl87 CmV4dGVybiBzdHJ1Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZG91dF87CmV4dGVybiBzdHJ1 Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZGVycl87CgoKCgoKCgoKCgoKIAoKIAoKdHlwZWRl ZiBfX3NzaXplX3QgX19pb19yZWFkX2ZuICh2b2lkICpfX2Nvb2tpZSwgY2hhciAqX19idWYsIHNp emVfdCBfX25ieXRlcyk7CgogCgoKCgoKdHlwZWRlZiBfX3NzaXplX3QgX19pb193cml0ZV9mbiAo dm9pZCAqX19jb29raWUsIF9fY29uc3QgY2hhciAqX19idWYsCgkJCQkgc2l6ZV90IF9fbik7Cgog CgoKCgoKdHlwZWRlZiBpbnQgX19pb19zZWVrX2ZuICh2b2lkICpfX2Nvb2tpZSwgX19vZmY2NF90 ICAgKl9fcG9zLCBpbnQgX193KTsKCiAKdHlwZWRlZiBpbnQgX19pb19jbG9zZV9mbiAodm9pZCAq X19jb29raWUpOwoKCiMgMzg3ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCgoKZXh0ZXJuICJD IiB7CgoKZXh0ZXJuIGludCBfX3VuZGVyZmxvdyAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRl cm4gaW50IF9fdWZsb3cgKF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIGludCBfX292ZXJm bG93IChfSU9fRklMRSAqLCBpbnQpIHRocm93ICgpIDsKZXh0ZXJuIHdpbnRfdCAgIF9fd3VuZGVy ZmxvdyAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRlcm4gd2ludF90ICAgX193dWZsb3cgKF9J T19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIHdpbnRfdCAgIF9fd292ZXJmbG93IChfSU9fRklM RSAqLCB3aW50X3QgICkgdGhyb3cgKCkgOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4g aW50IF9JT19nZXRjIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9JT19w dXRjIChpbnQgX19jLCBfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9JT19m ZW9mIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9JT19mZXJyb3IgKF9J T19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CgpleHRlcm4gaW50IF9JT19wZWVrY19sb2NrZWQgKF9J T19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CgogCgoKCmV4dGVybiB2b2lkIF9JT19mbG9ja2ZpbGUg KF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIHZvaWQgX0lPX2Z1bmxvY2tmaWxlIChfSU9f RklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgX0lPX2Z0cnlsb2NrZmlsZSAoX0lPX0ZJTEUg KikgdGhyb3cgKCkgOwoKCgoKCgoKCgoKCgoKCgoKZXh0ZXJuIGludCBfSU9fdmZzY2FuZiAoX0lP X0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwKCQkJX19nbnVjX3Zh X2xpc3QgLCBpbnQgKl9fcmVzdHJpY3QpIHRocm93ICgpIDsKZXh0ZXJuIGludCBfSU9fdmZwcmlu dGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0LAoJCQkgX19n bnVjX3ZhX2xpc3QgKSB0aHJvdyAoKSA7CmV4dGVybiBfX3NzaXplX3QgICBfSU9fcGFkbiAoX0lP X0ZJTEUgKiwgaW50LCBfX3NzaXplX3QgICkgdGhyb3cgKCkgOwpleHRlcm4gc2l6ZV90ICAgX0lP X3NnZXRuIChfSU9fRklMRSAqLCB2b2lkICosIHNpemVfdCAgKSB0aHJvdyAoKSA7CgpleHRlcm4g X19vZmY2NF90ICAgX0lPX3NlZWtvZmYgKF9JT19GSUxFICosIF9fb2ZmNjRfdCAgLCBpbnQsIGlu dCkgdGhyb3cgKCkgOwpleHRlcm4gX19vZmY2NF90ICAgX0lPX3NlZWtwb3MgKF9JT19GSUxFICos IF9fb2ZmNjRfdCAgLCBpbnQpIHRocm93ICgpIDsKCmV4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1 cF9hcmVhIChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CgojIDUwNyAiL3Vzci9pbmNsdWRlL2xpYmlv LmgiIDMKCgoKfQoKCgojIDM2ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDIgMwoKfQogCgojIDEgIi91c3Iv bGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCnZvaWQgdmFfZW5kIChfX2du dWNfdmFfbGlzdCk7CQkgCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgogCiAKCgoKCgoKCgoKCgoKCiMgMTc1ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgv Mi45NS4yL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgogCgoKCgogCgogCgogCgp0eXBlZGVmIF9fZ251 Y192YV9saXN0IHZhX2xpc3Q7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNDAgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJl YW1idWYuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gIkMrKyIgewpjbGFz cyBpc3RyZWFtOyAgCmNsYXNzIG9zdHJlYW07IGNsYXNzIHN0cmVhbWJ1ZjsKCiAKCgoKCnR5cGVk ZWYgX19vZmY2NF90ICAgc3RyZWFtb2ZmOwp0eXBlZGVmIF9fb2ZmNjRfdCAgIHN0cmVhbXBvczsK CgoKCnR5cGVkZWYgX19zc2l6ZV90ICAgc3RyZWFtc2l6ZTsKCnR5cGVkZWYgdW5zaWduZWQgbG9u ZyBfX2ZtdGZsYWdzOwp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX19pb3N0YXRlOwoKc3RydWN0IF9p b3NfZmllbGRzCnsgIAogICAgc3RyZWFtYnVmICpfc3RyYnVmOwogICAgb3N0cmVhbSogX3RpZTsK ICAgIGludCBfd2lkdGg7CiAgICBfX2ZtdGZsYWdzIF9mbGFnczsKICAgIHdjaGFyX3QgICBfZmls bDsKICAgIF9faW9zdGF0ZSBfc3RhdGU7CiAgICBfX2lvc3RhdGUgX2V4Y2VwdGlvbnM7CiAgICBp bnQgX3ByZWNpc2lvbjsKCiAgICB2b2lkICpfYXJyYXlzOyAgCn07CgoKCgoKCgoKCgoKCgoKCiMg MTI0ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1 ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDMKCgpjbGFzcyBpb3MgOiBwdWJsaWMgX2lvc19maWVsZHMg ewogIGlvcyYgb3BlcmF0b3I9KGlvcyYpOyAgIAogIGlvcyAoY29uc3QgaW9zJik7ICAKICBwdWJs aWM6CiAgICB0eXBlZGVmIF9fZm10ZmxhZ3MgZm10ZmxhZ3M7CiAgICB0eXBlZGVmIGludCBpb3N0 YXRlOwogICAgdHlwZWRlZiBpbnQgb3Blbm1vZGU7CiAgICB0eXBlZGVmIF9fc3NpemVfdCAgIHN0 cmVhbXNpemU7CiAgICBlbnVtIGlvX3N0YXRlIHsKCWdvb2RiaXQgPSAwICwKCWVvZmJpdCA9IDEg LAoJZmFpbGJpdCA9IDIgLAoJYmFkYml0ID0gNCAgfTsKICAgIGVudW0gb3Blbl9tb2RlIHsKCWlu ID0gMSAsCglvdXQgPSAyICwKCWF0ZSA9IDQgLAoJYXBwID0gOCAsCgl0cnVuYyA9IDE2ICwKCW5v Y3JlYXRlID0gMzIgLAoJbm9yZXBsYWNlID0gNjQgLAoJYmluID0gMTI4ICwgIAoJYmluYXJ5ID0g MTI4ICB9OwogICAgZW51bSBzZWVrX2RpciB7IGJlZywgY3VyLCBlbmR9OwogICAgdHlwZWRlZiBl bnVtIHNlZWtfZGlyIHNlZWtkaXI7CiAgICAgCiAgICBlbnVtIHsgc2tpcHdzPSAwMSAsCgkgICBs ZWZ0PSAwMiAsIHJpZ2h0PSAwNCAsIGludGVybmFsPSAwMTAgLAoJICAgZGVjPSAwMjAgLCBvY3Q9 IDA0MCAsIGhleD0gMDEwMCAsCgkgICBzaG93YmFzZT0gMDIwMCAsIHNob3dwb2ludD0gMDQwMCAs CgkgICB1cHBlcmNhc2U9IDAxMDAwICwgc2hvd3Bvcz0gMDIwMDAgLAoJICAgc2NpZW50aWZpYz0g MDQwMDAgLCBmaXhlZD0gMDEwMDAwICwKCSAgIHVuaXRidWY9IDAyMDAwMCAsIHN0ZGlvPSAwNDAw MDAgCgoKCgkgICB9OwogICAgZW51bSB7ICAKCWJhc2VmaWVsZD1kZWMrb2N0K2hleCwKCWZsb2F0 ZmllbGQgPSBzY2llbnRpZmljK2ZpeGVkLAoJYWRqdXN0ZmllbGQgPSBsZWZ0K3JpZ2h0K2ludGVy bmFsCiAgICB9OwoKIyAxNzcgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYuaCIgMwoKCiAgICBvc3RyZWFtKiB0aWUo KSBjb25zdCB7IHJldHVybiBfdGllOyB9CiAgICBvc3RyZWFtKiB0aWUob3N0cmVhbSogdmFsKSB7 IG9zdHJlYW0qIHNhdmU9X3RpZTsgX3RpZT12YWw7IHJldHVybiBzYXZlOyB9CgogICAgIAogICAg d2NoYXJfdCAgIGZpbGwoKSBjb25zdCB7IHJldHVybiBfZmlsbDsgfQogICAgd2NoYXJfdCAgIGZp bGwod2NoYXJfdCAgIG5ld2YpCgl7d2NoYXJfdCAgIG9sZGYgPSBfZmlsbDsgX2ZpbGwgPSBuZXdm OyByZXR1cm4gb2xkZjt9CiAgICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9mbGFn czsgfQogICAgZm10ZmxhZ3MgZmxhZ3MoZm10ZmxhZ3MgbmV3X3ZhbCkgewoJZm10ZmxhZ3Mgb2xk X3ZhbCA9IF9mbGFnczsgX2ZsYWdzID0gbmV3X3ZhbDsgcmV0dXJuIG9sZF92YWw7IH0KICAgIGlu dCBwcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiBfcHJlY2lzaW9uOyB9CiAgICBpbnQgcHJlY2lz aW9uKGludCBuZXdwKSB7Cgl1bnNpZ25lZCBzaG9ydCBvbGRwID0gX3ByZWNpc2lvbjsgX3ByZWNp c2lvbiA9ICh1bnNpZ25lZCBzaG9ydCluZXdwOwoJcmV0dXJuIG9sZHA7IH0KICAgIGZtdGZsYWdz IHNldGYoZm10ZmxhZ3MgdmFsKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdz IHw9IHZhbDsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFs LCBmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzID0g KF9mbGFncyAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZt dGZsYWdzIHVuc2V0ZihmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdz OwoJX2ZsYWdzICY9IH5tYXNrOyByZXR1cm4gb2xkYml0czsgfQogICAgaW50IHdpZHRoKCkgY29u c3QgeyByZXR1cm4gX3dpZHRoOyB9CiAgICBpbnQgd2lkdGgoaW50IHZhbCkgeyBpbnQgc2F2ZSA9 IF93aWR0aDsgX3dpZHRoID0gdmFsOyByZXR1cm4gc2F2ZTsgfQoKCgoKICAgIHZvaWQgX3Rocm93 X2ZhaWx1cmUoKSBjb25zdCB7IH0KCiAgICB2b2lkIGNsZWFyKGlvc3RhdGUgc3RhdGUgPSAwKSB7 Cglfc3RhdGUgPSBfc3RyYnVmID8gc3RhdGUgOiBzdGF0ZXxiYWRiaXQ7CglpZiAoX3N0YXRlICYg X2V4Y2VwdGlvbnMpIF90aHJvd19mYWlsdXJlKCk7IH0KICAgIHZvaWQgc2V0KGlvc3RhdGUgZmxh ZykgeyBfc3RhdGUgfD0gZmxhZzsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2Zh aWx1cmUoKTsgfQogICAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIGZsYWcpIHsgX3N0YXRlIHw9IGZs YWc7ICAKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAg aW50IGdvb2QoKSBjb25zdCB7IHJldHVybiBfc3RhdGUgPT0gMDsgfQogICAgaW50IGVvZigpIGNv bnN0IHsgcmV0dXJuIF9zdGF0ZSAmIGlvczo6ZW9mYml0OyB9CiAgICBpbnQgZmFpbCgpIGNvbnN0 IHsgcmV0dXJuIF9zdGF0ZSAmIChpb3M6OmJhZGJpdHxpb3M6OmZhaWxiaXQpOyB9CiAgICBpbnQg YmFkKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlICYgaW9zOjpiYWRiaXQ7IH0KICAgIGlvc3RhdGUg cmRzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZTsgfQogICAgb3BlcmF0b3Igdm9pZCooKSBj b25zdCB7IHJldHVybiBmYWlsKCkgPyAodm9pZCopMCA6ICh2b2lkKikoLTEpOyB9CiAgICBpbnQg b3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gZmFpbCgpOyB9CiAgICBpb3N0YXRlIGV4Y2VwdGlv bnMoKSBjb25zdCB7IHJldHVybiBfZXhjZXB0aW9uczsgfQogICAgdm9pZCBleGNlcHRpb25zKGlv c3RhdGUgZW5hYmxlKSB7CglfZXhjZXB0aW9ucyA9IGVuYWJsZTsKCWlmIChfc3RhdGUgJiBfZXhj ZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQoKICAgIHN0cmVhbWJ1ZiogcmRidWYoKSBjb25z dCB7IHJldHVybiBfc3RyYnVmOyB9CiAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiAqX3Mp IHsKICAgICAgc3RyZWFtYnVmICpfb2xkID0gX3N0cmJ1ZjsgX3N0cmJ1ZiA9IF9zOyBjbGVhciAo KTsgcmV0dXJuIF9vbGQ7IH0KCiAgICBzdGF0aWMgaW50IHN5bmNfd2l0aF9zdGRpbyhpbnQgb24p OwogICAgc3RhdGljIHZvaWQgc3luY193aXRoX3N0ZGlvKCkgeyBzeW5jX3dpdGhfc3RkaW8oMSk7 IH0KICAgIHN0YXRpYyBmbXRmbGFncyBiaXRhbGxvYygpOwogICAgc3RhdGljIGludCB4YWxsb2Mo KTsKICAgIHZvaWQqJiBwd29yZChpbnQpOwogICAgdm9pZCogcHdvcmQoaW50KSBjb25zdDsKICAg IGxvbmcmIGl3b3JkKGludCk7CiAgICBsb25nIGl3b3JkKGludCkgY29uc3Q7CgoKCgoKCgoKCiAg ICAgCiAgICBjbGFzcyBJbml0IHsKICAgIHB1YmxpYzoKICAgICAgSW5pdCAoKSB7IH0KICAgIH07 CgogIHByb3RlY3RlZDoKICAgIGlubGluZSBpb3Moc3RyZWFtYnVmKiBzYiA9IDAsIG9zdHJlYW0q IHRpZV90byA9IDApOwogICAgaW5saW5lIHZpcnR1YWwgfmlvcygpOwogICAgaW5saW5lIHZvaWQg aW5pdChzdHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0aWUgPSAwKTsKfTsKCgoKCnR5cGVkZWYgaW9z OjpzZWVrX2RpciBfc2Vla19kaXI7CgoKIAogCiAKIAogCgogCiAKY2xhc3Mgc3RyZWFtbWFya2Vy IDogcHJpdmF0ZSBfSU9fbWFya2VyIHsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1idWY7CiAgICB2 b2lkIHNldF9vZmZzZXQoaW50IG9mZnNldCkgeyBfcG9zID0gb2Zmc2V0OyB9CiAgcHVibGljOgog ICAgc3RyZWFtbWFya2VyKHN0cmVhbWJ1ZiAqc2IpOwogICAgfnN0cmVhbW1hcmtlcigpOwogICAg aW50IHNhdmluZygpIHsgcmV0dXJuICAxOyB9CiAgICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7 CiAgICBpbnQgZGVsdGEoKTsKfTsKCnN0cnVjdCBzdHJlYW1idWYgOiBwdWJsaWMgX0lPX0ZJTEUg eyAgCiAgICBmcmllbmQgY2xhc3MgaW9zOwogICAgZnJpZW5kIGNsYXNzIGlzdHJlYW07CiAgICBm cmllbmQgY2xhc3Mgb3N0cmVhbTsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1tYXJrZXI7CiAgICBj b25zdCB2b2lkIComX3Z0YWJsZSgpIHsgcmV0dXJuICooY29uc3Qgdm9pZCoqKSgoX0lPX0ZJTEUq KXRoaXMgKyAxKTsgfQogIHByb3RlY3RlZDoKICAgIHN0YXRpYyBzdHJlYW1idWYqIF9saXN0X2Fs bDsgIAogICAgX0lPX0ZJTEUqJiB4Y2hhaW4oKSB7IHJldHVybiBfY2hhaW47IH0KICAgIHZvaWQg X3VuX2xpbmsoKTsKICAgIHZvaWQgX2xpbmtfaW4oKTsKICAgIGNoYXIqIGdwdHIoKSBjb25zdAog ICAgICB7IHJldHVybiBfZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFk X3B0cjsgfQogICAgY2hhciogcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9wdHI7IH0K ICAgIGNoYXIqIGVncHRyKCkgY29uc3QKICAgICAgeyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/ IF9JT19zYXZlX2VuZCA6IF9JT19yZWFkX2VuZDsgfQogICAgY2hhciogZXBwdHIoKSBjb25zdCB7 IHJldHVybiBfSU9fd3JpdGVfZW5kOyB9CiAgICBjaGFyKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJu IF9JT193cml0ZV9iYXNlOyB9CiAgICBjaGFyKiBlYmFjaygpIGNvbnN0CiAgICAgIHsgcmV0dXJu IF9mbGFncyAgJiAweDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3JlYWRfYmFzZTt9CiAgICBj aGFyKiBiYXNlKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9iYXNlOyB9CiAgICBjaGFyKiBlYnVm KCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9lbmQ7IH0KICAgIGludCBibGVuKCkgY29uc3QgeyBy ZXR1cm4gX0lPX2J1Zl9lbmQgLSBfSU9fYnVmX2Jhc2U7IH0KICAgIHZvaWQgeHB1dF9jaGFyKGNo YXIgYykgeyAqX0lPX3dyaXRlX3B0cisrID0gYzsgfQogICAgaW50IHhmbGFncygpIHsgcmV0dXJu IF9mbGFncyA7IH0KICAgIGludCB4ZmxhZ3MoaW50IGYpIHtpbnQgZmwgPSBfZmxhZ3MgOyBfZmxh Z3MgID0gZjsgcmV0dXJuIGZsO30KICAgIHZvaWQgeHNldGZsYWdzKGludCBmKSB7IF9mbGFncyAg fD0gZjsgfQogICAgdm9pZCB4c2V0ZmxhZ3MoaW50IGYsIGludCBtYXNrKQogICAgICB7IF9mbGFn cyAgPSAoX2ZsYWdzICAmIH5tYXNrKSB8IChmICYgbWFzayk7IH0KICAgIHZvaWQgZ2J1bXAoaW50 IG4pCiAgICAgIHsgX2ZsYWdzICAmIDB4MTAwICA/IChfSU9fc2F2ZV9iYXNlKz1uKTooX0lPX3Jl YWRfcHRyKz1uKTt9CiAgICB2b2lkIHBidW1wKGludCBuKSB7IF9JT193cml0ZV9wdHIgKz0gbjsg fQogICAgdm9pZCBzZXRiKGNoYXIqIGIsIGNoYXIqIGViLCBpbnQgYT0wKTsKICAgIHZvaWQgc2V0 cChjaGFyKiBwLCBjaGFyKiBlcCkKICAgICAgeyBfSU9fd3JpdGVfYmFzZT1fSU9fd3JpdGVfcHRy PXA7IF9JT193cml0ZV9lbmQ9ZXA7IH0KICAgIHZvaWQgc2V0ZyhjaGFyKiBlYiwgY2hhciogZywg Y2hhciAqZWcpIHsKICAgICAgaWYgKF9mbGFncyAgJiAweDEwMCApIF9JT19mcmVlX2JhY2t1cF9h cmVhKHRoaXMpOyAKICAgICAgX0lPX3JlYWRfYmFzZSA9IGViOyBfSU9fcmVhZF9wdHIgPSBnOyBf SU9fcmVhZF9lbmQgPSBlZzsgfQogICAgY2hhciAqc2hvcnRidWYoKSB7IHJldHVybiBfc2hvcnRi dWY7IH0KCiAgICBpbnQgaW5fYmFja3VwKCkgeyByZXR1cm4gX2ZsYWdzICYgMHgxMDAgOyB9CiAg ICAgCiAgICBjaGFyICpHYmFzZSgpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3NhdmVfYmFz ZSA6IF9JT19yZWFkX2Jhc2U7IH0KICAgICAKICAgIGNoYXIgKmVHcHRyKCkgeyByZXR1cm4gaW5f YmFja3VwKCkgPyBfSU9fc2F2ZV9lbmQgOiBfSU9fcmVhZF9lbmQ7IH0KICAgICAKICAgIGNoYXIg KkJiYXNlKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fcmVhZF9iYXNlIDogX0lPX3NhdmVf YmFzZTsgfQogICAgY2hhciAqQnB0cigpIHsgcmV0dXJuIF9JT19iYWNrdXBfYmFzZTsgfQogICAg IAogICAgY2hhciAqZUJwdHIoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19yZWFkX2VuZCA6 IF9JT19zYXZlX2VuZDsgfQogICAgY2hhciAqTmJhc2UoKSB7IHJldHVybiBfSU9fc2F2ZV9iYXNl OyB9CiAgICBjaGFyICplTnB0cigpIHsgcmV0dXJuIF9JT19zYXZlX2VuZDsgfQogICAgaW50IGhh dmVfYmFja3VwKCkgeyByZXR1cm4gX0lPX3NhdmVfYmFzZSAhPSBfX251bGwgOyB9CiAgICBpbnQg aGF2ZV9tYXJrZXJzKCkgeyByZXR1cm4gX21hcmtlcnMgIT0gX19udWxsIDsgfQogICAgdm9pZCBm cmVlX2JhY2t1cF9hcmVhKCk7CiAgICB2b2lkIHVuc2F2ZV9tYXJrZXJzKCk7ICAKICAgIGludCBw dXRfbW9kZSgpIHsgcmV0dXJuIF9mbGFncyAmIDB4ODAwIDsgfQogICAgaW50IHN3aXRjaF90b19n ZXRfbW9kZSgpOwogICAgCiAgICBzdHJlYW1idWYoaW50IGZsYWdzPTApOwogIHB1YmxpYzoKICAg IHN0YXRpYyBpbnQgZmx1c2hfYWxsKCk7CiAgICBzdGF0aWMgdm9pZCBmbHVzaF9hbGxfbGluZWJ1 ZmZlcmVkKCk7ICAKICAgIHZpcnR1YWwgfnN0cmVhbWJ1ZigpOwogICAgdmlydHVhbCBpbnQgb3Zl cmZsb3coaW50IGMgPSAoLTEpICk7ICAKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOyAgCiAg ICB2aXJ0dWFsIGludCB1ZmxvdygpOyAgCiAgICB2aXJ0dWFsIGludCBwYmFja2ZhaWwoaW50IGMp OwogCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNp emUgbik7CiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUg bik7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBp bnQgbW9kZT1pb3M6OmlufGlvczo6b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtwb3Mo c3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KTsKCiAgICBzdHJlYW1w b3MgcHVic2Vla29mZihzdHJlYW1vZmYgbywgX3NlZWtfZGlyIGQsIGludCBtb2RlPWlvczo6aW58 aW9zOjpvdXQpCiAgICAgIHsgcmV0dXJuIF9JT19zZWVrb2ZmICh0aGlzLCBvLCBkLCBtb2RlKTsg fQogICAgc3RyZWFtcG9zIHB1YnNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6 OmlufGlvczo6b3V0KQogICAgICB7IHJldHVybiBfSU9fc2Vla3BvcyAodGhpcywgcG9zLCBtb2Rl KTsgfQogICAgc3RyZWFtcG9zIHNzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9k ZT1pb3M6OmlufGlvczo6b3V0KTsKICAgIHN0cmVhbXBvcyBzc2Vla3BvcyhzdHJlYW1wb3MgcG9z LCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNl dGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKICAgIHZpcnR1 YWwgaW50IGRvYWxsb2NhdGUoKTsKCiAgICBpbnQgc2Vla21hcmsoc3RyZWFtbWFya2VyJiBtYXJr LCBpbnQgZGVsdGEgPSAwKTsKICAgIGludCBzcHV0YmFja2MoY2hhciBjKTsKICAgIGludCBzdW5n ZXRjKCk7CiAgICBpbnQgdW5idWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDIgID8gMSA6IDA7 IH0KICAgIGludCBsaW5lYnVmZmVyZWQoKSB7IHJldHVybiBfZmxhZ3MgJiAweDIwMCAgPyAxIDog MDsgfQogICAgdm9pZCB1bmJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDIgOyBl bHNlIF9mbGFncyAmPSB+MiA7IH0KICAgIHZvaWQgbGluZWJ1ZmZlcmVkKGludCBpKQoJeyBpZiAo aSkgX2ZsYWdzIHw9IDB4MjAwIDsgZWxzZSBfZmxhZ3MgJj0gfjB4MjAwIDsgfQogICAgaW50IGFs bG9jYXRlKCkgeyAgCglpZiAoYmFzZSgpIHx8IHVuYnVmZmVyZWQoKSkgcmV0dXJuIDA7CgllbHNl IHJldHVybiBkb2FsbG9jYXRlKCk7IH0KICAgICAKICAgIHZvaWQgYWxsb2NidWYoKSB7IGlmIChi YXNlKCkgPT0gX19udWxsICkgZG9hbGxvY2J1ZigpOyB9CiAgICB2b2lkIGRvYWxsb2NidWYoKTsK ICAgIGludCBpbl9hdmFpbCgpIHsgcmV0dXJuIF9JT19yZWFkX2VuZCAtIF9JT19yZWFkX3B0cjsg fQogICAgaW50IG91dF93YWl0aW5nKCkgeyByZXR1cm4gX0lPX3dyaXRlX3B0ciAtIF9JT193cml0 ZV9iYXNlOyB9CiAgICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUg bikgeyByZXR1cm4geHNwdXRuKHMsIG4pOyB9CiAgICBzdHJlYW1zaXplIHBhZG4oY2hhciBwYWQs IHN0cmVhbXNpemUgbikgeyByZXR1cm4gX0lPX3BhZG4odGhpcywgcGFkLCBuKTsgfQogICAgc3Ry ZWFtc2l6ZSBzZ2V0bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pIHsgcmV0dXJuIF9JT19zZ2V0bih0 aGlzLCBzLCBuKTsgfQogICAgaW50IGlnbm9yZShpbnQpOwogICAgaW50IGdldF9jb2x1bW4oKTsK ICAgIGludCBzZXRfY29sdW1uKGludCk7CiAgICBsb25nIHNnZXRsaW5lKGNoYXIqIGJ1Ziwgc2l6 ZV90ICAgbiwgY2hhciBkZWxpbSwgaW50IHB1dGJhY2tfZGVsaW0pOwogICAgaW50IHNwdXRjKGlu dCBjKSB7IHJldHVybiBfSU9fcHV0YyhjLCB0aGlzKTsgfQogICAgaW50IHNidW1wYygpIHsgcmV0 dXJuIF9JT19nZXRjKHRoaXMpOyB9CiAgICBpbnQgc2dldGMoKSB7IHJldHVybiAoKCAgdGhpcyAg KS0+X0lPX3JlYWRfcHRyID49ICggIHRoaXMgICktPl9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxv dyAoICB0aGlzICApID09ICgtMSkgID8gKC0xKSAgOiAqKHVuc2lnbmVkIGNoYXIgKikgKCAgdGhp cyAgKS0+X0lPX3JlYWRfcHRyKSAgOyB9CiAgICBpbnQgc25leHRjKCkgewoJaWYgKF9JT19yZWFk X3B0ciA+PSBfSU9fcmVhZF9lbmQgJiYgX191bmRlcmZsb3codGhpcykgPT0gKC0xKSApCgkgIHJl dHVybiAoLTEpIDsKCWVsc2UgcmV0dXJuIF9JT19yZWFkX3B0cisrLCBzZ2V0YygpOyB9CiAgICB2 b2lkIHN0b3NzYygpIHsgaWYgKF9JT19yZWFkX3B0ciA8IF9JT19yZWFkX2VuZCkgX0lPX3JlYWRf cHRyKys7IH0KICAgIGludCB2c2NhbihjaGFyIGNvbnN0ICpmbXQwLCBfX2dudWNfdmFfbGlzdCAg YXAsIGlvcyogc3RyZWFtID0gX19udWxsICk7CiAgICBpbnQgc2NhbihjaGFyIGNvbnN0ICpmbXQw IC4uLik7CiAgICBpbnQgdmZvcm0oY2hhciBjb25zdCAqZm10MCwgX19nbnVjX3ZhX2xpc3QgIGFw KTsKICAgIGludCBmb3JtKGNoYXIgY29uc3QgKmZtdDAgLi4uKTsKCgoKCiAgICB2aXJ0dWFsIHN0 cmVhbXNpemUgc3lzX3JlYWQoY2hhciogYnVmLCBzdHJlYW1zaXplIHNpemUpOwogICAgdmlydHVh bCBzdHJlYW1zaXplIHN5c193cml0ZShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2aXJ0 dWFsIHN0cmVhbXBvcyBzeXNfc2VlayhzdHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0dWFs IGludCBzeXNfY2xvc2UoKTsKICAgIHZpcnR1YWwgaW50IHN5c19zdGF0KHZvaWQqKTsgIAoKICAg IHZpcnR1YWwgaW50IHNob3dtYW55YygpOwogICAgdmlydHVhbCB2b2lkIGltYnVlKHZvaWQgKik7 Cgp9OwoKIAogCgpjbGFzcyBmaWxlYnVmIDogcHVibGljIHN0cmVhbWJ1ZiB7CiAgcHJvdGVjdGVk OgogICAgdm9pZCBpbml0KCk7CiAgcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludCBvcGVucHJv dDsgIAogICAgZmlsZWJ1ZigpOwogICAgZmlsZWJ1ZihpbnQgZmQpOwogICAgZmlsZWJ1ZihpbnQg ZmQsIGNoYXIqIHAsIGludCBsZW4pOwoKCgogICAgfmZpbGVidWYoKTsKICAgIGZpbGVidWYqIGF0 dGFjaChpbnQgZmQpOwogICAgZmlsZWJ1Ziogb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29u c3QgY2hhciAqbW9kZSk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBp b3M6Om9wZW5tb2RlIG1vZGUsIGludCBwcm90ID0gMDY2NCk7CiAgICB2aXJ0dWFsIGludCB1bmRl cmZsb3coKTsKICAgIHZpcnR1YWwgaW50IG92ZXJmbG93KGludCBjID0gKC0xKSApOwogICAgaW50 IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiBfZmlsZW5vID49IDA7IH0KICAgIGludCBmZCgpIGNv bnN0IHsgcmV0dXJuIGlzX29wZW4oKSA/IF9maWxlbm8gOiAoLTEpIDsgfQogICAgZmlsZWJ1Ziog Y2xvc2UoKTsKICAgIHZpcnR1YWwgaW50IGRvYWxsb2NhdGUoKTsKICAgIHZpcnR1YWwgc3RyZWFt cG9zIHNlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vla19kaXIsIGludCBtb2RlPWlvczo6aW58aW9zOjpv dXQpOwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAg IHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICBzdHJl YW1zaXplIHhzZ2V0bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwogICAgdmlydHVhbCBpbnQgc3lu YygpOwogIHByb3RlY3RlZDogIAogCiAgICBpbnQgaXNfcmVhZGluZygpIHsgcmV0dXJuIGViYWNr KCkgIT0gZWdwdHIoKTsgfQogICAgY2hhciogY3VyX3B0cigpIHsgcmV0dXJuIGlzX3JlYWRpbmco KSA/ICBncHRyKCkgOiBwcHRyKCk7IH0KICAgICAKICAgIGNoYXIqIGZpbGVfcHRyKCkgeyByZXR1 cm4gZUdwdHIoKTsgfQogICAgIAogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c19yZWFkKGNoYXIq IGJ1Ziwgc3RyZWFtc2l6ZSBzaXplKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHN5c19zZWVrKHN0 cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSBzeXNfd3JpdGUoY29u c3QgY2hhciosIHN0cmVhbXNpemUpOwogICAgdmlydHVhbCBpbnQgc3lzX3N0YXQodm9pZCopOyAg CiAgICB2aXJ0dWFsIGludCBzeXNfY2xvc2UoKTsKCgoKCn07CgppbmxpbmUgdm9pZCBpb3M6Omlu aXQoc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllX3RvKSB7CgkJX3N0YXRlID0gc2IgPyBpb3M6 Omdvb2RiaXQgOiBpb3M6OmJhZGJpdDsgX2V4Y2VwdGlvbnM9MDsKCQlfc3RyYnVmPXNiOyBfdGll ID0gdGllX3RvOyBfd2lkdGg9MDsgX2ZpbGw9JyAnOwoKCQlfZmxhZ3M9aW9zOjpza2lwd3N8aW9z OjpkZWM7CgoKCgkJX3ByZWNpc2lvbj02OyBfYXJyYXlzID0gMDsgfQoKaW5saW5lIGlvczo6aW9z KHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qIHRpZV90bykgeyBpbml0KHNiLCB0aWVfdG8pOyB9Cgpp bmxpbmUgaW9zOjp+aW9zKCkgewoKCgogICAgIAogICAgIAogICAgb3BlcmF0b3IgZGVsZXRlW10g KF9hcnJheXMpOwp9Cn0gIAoKIyAzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu Mi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3RyZWFtLmgiIDIgMwoKCmV4dGVybiAiQysr IiB7CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnR5cGVkZWYgaW9zJiAoKl9fbWFuaXAp KGlvcyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19pbWFuaXApKGlzdHJlYW0mKTsKdHlwZWRlZiBv c3RyZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7CgpleHRlcm4gaXN0cmVhbSYgd3MoaXN0cmVh bSYgaW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNoKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0 cmVhbSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9zdHJlYW0mIGVuZHMob3N0cmVhbSYg b3V0cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKICAgIHZv aWQgZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9zdHJlYW0oKSB7IH0KICAgIG9zdHJlYW0oc3Ry ZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19udWxsICk7CiAgICBpbnQgb3BmeCgpIHsKCWlm ICghZ29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBpZiAoX3RpZSkgX3RpZS0+Zmx1c2goKTsgIDsg cmV0dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7ICA7CgkJICBpZiAoZmxhZ3MoKSAmIChpb3M6 OnVuaXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAgZG9fb3NmeCgpOyB9CiAgICBvc3RyZWFtJiBm bHVzaCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIgYykgeyBfc3RyYnVmLT5zcHV0YyhjKTsgcmV0 dXJuICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IGNoYXIgKnMsIHN0cmVh bXNpemUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBzdHJl YW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25zdCBjaGFyKilzLCBuKTt9CiAgICBv c3RyZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hhciAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7 IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgd3JpdGUoY29u c3Qgdm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hh ciopcywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Aoc3RyZWFtcG9zKTsKICAgIG9zdHJlYW0mIHNl ZWtwKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxscCgpOwogICAgb3N0 cmVhbSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIG9zdHJlYW0mIHZmb3JtKGNv bnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0mIG9w ZXJhdG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBj KSB7IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwo c2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFt JiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25z dCB1bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsg fQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykKCXsgcmV0dXJu ICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29u c3Qgdm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGludCBuKTsKICAgIG9zdHJlYW0m IG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChsb25n IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIG4pOwoKICAgIF9fZXh0 ZW5zaW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGxvbmcgbik7CiAgICBfX2V4dGVuc2lv bl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOwoKICAgIG9zdHJl YW0mIG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAg b3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwo KHVuc2lnbmVkIGludCluKTt9CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChib29sIGIpIHsgcmV0 dXJuIG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91Ymxl IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8 KChkb3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIG4pOwoK CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMp KCp0aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX21hbmlwIGZ1bmMpIHsoKmZ1bmMp KCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc3RyZWFtYnVm Kik7CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKcHJv dGVjdGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsKCiAgICBpbnQgX3NraXBfd3MoKTsKICBwdWJs aWM6CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDApIHsgfQogICAgaXN0cmVhbShzdHJlYW1idWYq IHNiLCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwogICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0ciwg aW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNo YXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIq KXB0ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJlYW0mIGdldChjaGFyJiBjKTsKICAgIGlzdHJl YW0mIGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJldHVybiBnZXQoKGNoYXImKWMpOyB9CiAgICBp c3RyZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwog ICAgaXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVs aW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQog ICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBjKSAgeyByZXR1cm4gZ2V0KChjaGFyJiljKTsg fQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0g PSAnXG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAgICBpc3Ry ZWFtJiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4n KQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVh bSYgcmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUgbik7CiAgICBpc3RyZWFtJiByZWFkKHVuc2ln bmVkIGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFyKilw dHIsIG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNpZ25lZCBjaGFyICpwdHIsIHN0cmVhbXNpemUg bikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgcmVh ZCh2b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRy LCBuKTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVhbWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAnXG4n KTsKICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGlu dCBpcGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7 IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8fCBy ZGJ1ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90aWUtPmZsdXNoKCk7CgkgIGlmICghbmVlZCAm JiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0dXJuIF9za2lwX3dzKCk7CgkgIGVsc2UgcmV0 dXJuIDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAoKSB7ICAKCWlmICghZ29vZCgpKSB7IHNldChp b3M6OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxzZSB7CgkgICA7CgkgIGlmIChfdGllKSBfdGll LT5mbHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSByZXR1cm4gX3NraXBfd3Mo KTsKCSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGludCBpcGZ4MSgpIHsgIAoJaWYgKCFn b29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAg aWYgKF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJICBy ZXR1cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNmeCgpIHsgIDsgfQogICAgaW50IGdldCgpIHsg aWYgKCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJZWxzZSB7IGludCBjaCA9IF9zdHJidWYtPnNi dW1wYygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0xKSApIHNldChpb3M6OmVvZmJpdCk7CgkJICAg ICAgIGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNoOwoJCSAgICAgfSB9CiAgICBpbnQgcGVlaygp OwogICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1cm4gX2djb3VudDsgfQogICAgaXN0cmVhbSYg aWdub3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgtMSkgKTsKICAgIGludCBzeW5jICgpOwogICAg aXN0cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAgIGlzdHJlYW0mIHNlZWtnKHN0cmVhbW9mZiwg X3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxsZygpOwogICAgaXN0cmVhbSYgcHV0YmFjayhj aGFyIGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnNwdXRiYWNrYyhjaCkgPT0gKC0xKSAp IGNsZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhpczt9CiAgICBpc3RyZWFtJiB1bmdldCgp IHsKCWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3VuZ2V0YygpID09ICgtMSkgKSBjbGVhcihpb3M6 OmJhZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgc2Nhbihjb25zdCBjaGFyICpm b3JtYXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2FuKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVj X3ZhX2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFyKik7CiAg ICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIqIHApIHsgcmV0dXJuIG9wZXJhdG9y Pj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFyKnApIHsg cmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KGNo YXImIGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyJiBjKSB7cmV0dXJu IG9wZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oc2lnbmVkIGNo YXImIGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7fQogICAgaXN0cmVhbSYgb3BlcmF0 b3I+PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYpOwoKICAgIF9fZXh0ZW5z aW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcmKTsKICAgIF9fZXh0ZW5zaW9uX18g aXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmKTsKCiAgICBpc3RyZWFtJiBv cGVyYXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYp OwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJik7CiAgICBpc3RyZWFtJiBv cGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihib29s Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYpOwogICAgaXN0cmVhbSYgb3BlcmF0 b3I+Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBkb3VibGUmKTsKICAg IGlzdHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykgeygqZnVuYykoKnRoaXMpOyByZXR1 cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihfX2ltYW5pcCBmdW5jKSB7IHJldHVy biAoKmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzdHJlYW1idWYqKTsK fTsKCmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0sIHB1YmxpYyBvc3RyZWFtCnsKICBw dWJsaWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0 cmVhbSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24gOiBw dWJsaWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRv cj0oaXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9faXN0 cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0 PGlzdHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gOiBw dWJsaWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRv cj0ob3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9fb3N0 cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0 PG9zdHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9faXN0cmVhbV93aXRoYXNzaWduIGNp bjsKIApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBjb3V0LCBjZXJyOwoKZXh0ZXJuIF9J T19vc3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRlcm4gaXN0cmVhbSYgbG9jayhpc3Ry ZWFtJiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlzdHJlYW0mIGlucyk7CmV4dGVybiBv c3RyZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgdW5sb2NrKG9zdHJl YW0mIG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9IDsgICAKCmlubGluZSBpb3MmIGRl Yyhpb3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7 IHJldHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkpCnsgaS5zZXRmKGlvczo6aGV4LCBp b3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIG9jdChp b3MmIGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJl dHVybiBpOyB9Cn0gIAoKCiMgNyAibGluZWwuY2MiIDIKCiMgMSAiL3Vzci9pbmNsdWRlL21hdGgu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCmV4dGVybiAiQyIgeyAKCiAKCiMg MSAiL3Vzci9pbmNsdWRlL2JpdHMvaHVnZV92YWwuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgogCgojIDgxICIvdXNyL2luY2x1ZGUvYml0cy9odWdl X3ZhbC5oIiAzCgojIDMzICIvdXNyL2luY2x1ZGUvbWF0aC5oIiAyIDMKCgogCgoKCiAKIyAxICIv dXNyL2luY2x1ZGUvYml0cy9tYXRoZGVmLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMg NDEgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhkZWYuaCIgMwoKIyA0MCAiL3Vzci9pbmNsdWRlL21h dGguaCIgMiAzCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv bWF0aGNhbGxzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgYWNvcyAgICAgICAgICAo ZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fYWNv cyAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3Vi bGUgICAgICAgICAgYXNpbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4 dGVybiAgIGRvdWJsZSAgICAgICAgIF9fYXNpbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRo cm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgYXRhbiAgICAgICAgICAoZG91 YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fYXRhbiAg ICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUg ICAgICAgICAgYXRhbjIgICAgICAgICAgKGRvdWJsZSAgX195LCBkb3VibGUgIF9feCkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19hdGFuMiAgICAgICAgICAoZG91Ymxl ICBfX3ksIGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGRvdWJsZSAg ICAgICAgICBjb3MgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBkb3VibGUgICAgICAgICBfX2NvcyAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgp ICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgc2luICAgICAgICAgIChkb3VibGUgIF9f eCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19zaW4gICAgICAgICAg KGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAg IHRhbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJs ZSAgICAgICAgIF9fdGFuICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoK CgoKCgoKIAoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgY29zaCAgICAgICAgICAoZG91Ymxl ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fY29zaCAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAg ICAgICAgc2luaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGRvdWJsZSAgICAgICAgIF9fc2luaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgp ICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgdGFuaCAgICAgICAgICAoZG91YmxlICBf X3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fdGFuaCAgICAgICAg ICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGRvdWJsZSAgICAg ICAgICBhY29zaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGRvdWJsZSAgICAgICAgIF9fYWNvc2ggICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAo KSAgICA7CiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGFzaW5oICAgICAgICAgIChkb3VibGUg IF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19hc2luaCAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAg ICAgICAgYXRhbmggICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBkb3VibGUgICAgICAgICBfX2F0YW5oICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cg KCkgICAgOwoKCiAKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGV4cCAgICAgICAgICAoZG91 YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fZXhwICAg ICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCgoKCgoKCiAKZXh0ZXJuICAg ZG91YmxlICAgICAgICAgIGZyZXhwICAgICAgICAgIChkb3VibGUgIF9feCwgaW50ICpfX2V4cG9u ZW50KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2ZyZXhwICAgICAg ICAgIChkb3VibGUgIF9feCwgaW50ICpfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgICA7CgogCmV4 dGVybiAgIGRvdWJsZSAgICAgICAgICBsZGV4cCAgICAgICAgICAoZG91YmxlICBfX3gsIGludCBf X2V4cG9uZW50KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2xkZXhw ICAgICAgICAgIChkb3VibGUgIF9feCwgaW50IF9fZXhwb25lbnQpICAgIHRocm93ICgpICAgIDsK CiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGxvZyAgICAgICAgICAoZG91YmxlICBfX3gpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fbG9nICAgICAgICAgIChkb3Vi bGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgbG9n MTAgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUg ICAgICAgICBfX2xvZzEwICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoK IApleHRlcm4gICBkb3VibGUgICAgICAgICAgbW9kZiAgICAgICAgICAoZG91YmxlICBfX3gsIGRv dWJsZSAgKl9faXB0cikgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19t b2RmICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICAqX19pcHRyKSAgICB0aHJvdyAoKSAg ICA7CgoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgZXhwbTEgICAgICAgICAgKGRvdWJsZSAg X194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2V4cG0xICAgICAg ICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAg ICAgICAgbG9nMXAgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBkb3VibGUgICAgICAgICBfX2xvZzFwICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cg KCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgbG9nYiAgICAgICAgICAoZG91Ymxl ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fbG9nYiAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKCgoKCgoKCgogCgogCmV4dGVy biAgIGRvdWJsZSAgICAgICAgICBwb3cgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9f eSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19wb3cgICAgICAgICAg KGRvdWJsZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBk b3VibGUgICAgICAgICAgc3FydCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc3FydCAgICAgICAgICAoZG91YmxlICBfX3gpICAg IHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBoeXBvdCAgICAgICAg ICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3Vi bGUgICAgICAgICBfX2h5cG90ICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICBfX3kpICAg IHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgY2JydCAgICAgICAg ICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9f Y2JydCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKIAoKIApleHRl cm4gICBkb3VibGUgICAgICAgICAgY2VpbCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93 ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fY2VpbCAgICAgICAgICAoZG91YmxlICBf X3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGZhYnMgICAg ICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19j b25zdF9fKSAgKTsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19mYWJzICAgICAgICAgIChkb3Vi bGUgIF9feCkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkg IDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGZsb29yICAgICAgICAgIChkb3VibGUgIF9f eCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19mbG9vciAgICAgICAg ICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAg ICAgIGZtb2QgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cgKCkg IDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19mbW9kICAgICAgICAgIChkb3VibGUgIF9feCwg ZG91YmxlICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCgpleHRlcm4gIGludCAgICAgX19pc2lu ZiAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2Nv bnN0X18pKTsKCiAKZXh0ZXJuICBpbnQgICAgIF9fZmluaXRlICAgICAgKGRvdWJsZSAgX192YWx1 ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCiAKCmV4dGVybiAg aW50ICAgICBpc2luZiAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmli dXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICBpbnQgICAgIGZpbml0ZSAgICAgIChkb3Vi bGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAK CgoKCgpleHRlcm4gICBkb3VibGUgICAgICAgICAgaW5mbmFuICAgICAgICAgIChpbnQgX19lcnJv cikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICk7IGV4dGVy biAgIGRvdWJsZSAgICAgICAgIF9faW5mbmFuICAgICAgICAgIChpbnQgX19lcnJvcikgICAgdGhy b3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCiAKZXh0ZXJuICAg ZG91YmxlICAgICAgICAgIGRyZW0gICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9feSkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19kcmVtICAgICAgICAgIChk b3VibGUgIF9feCwgZG91YmxlICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGRv dWJsZSAgICAgICAgICBzaWduaWZpY2FuZCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93 ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc2lnbmlmaWNhbmQgICAgICAgICAgKGRv dWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAg IGNvcHlzaWduICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICBfX3kpICAgIHRocm93ICgp ICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApOyBleHRlcm4gICBkb3VibGUgICAg ICAgICBfX2NvcHlzaWduICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICBfX3kpICAgIHRo cm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApICA7CgoKCgoKCgoKIApl eHRlcm4gIGludCAgICAgX19pc25hbiAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAg IF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgogCmV4dGVybiAgaW50ICAgICBpc25hbiAg ICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0 X18pKTsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGowICAgICAgICAgIChkb3VibGUgKSAg ICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2owICAgICAgICAgIChkb3Vi bGUgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBqMSAgICAgICAg ICAoZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19qMSAg ICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBkb3VibGUgICAgICAg ICAgam4gICAgICAgICAgKGludCwgZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91 YmxlICAgICAgICAgX19qbiAgICAgICAgICAoaW50LCBkb3VibGUgKSAgICB0aHJvdyAoKSAgICA7 CmV4dGVybiAgIGRvdWJsZSAgICAgICAgICB5MCAgICAgICAgICAoZG91YmxlICkgICAgdGhyb3cg KCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX195MCAgICAgICAgICAoZG91YmxlICkgICAg dGhyb3cgKCkgICAgOwpleHRlcm4gICBkb3VibGUgICAgICAgICAgeTEgICAgICAgICAgKGRvdWJs ZSApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9feTEgICAgICAgICAg KGRvdWJsZSApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIHluICAg ICAgICAgIChpbnQsIGRvdWJsZSApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAg ICAgIF9feW4gICAgICAgICAgKGludCwgZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwoKCgoKIApl eHRlcm4gICBkb3VibGUgICAgICAgICAgZXJmICAgICAgICAgIChkb3VibGUgKSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2VyZiAgICAgICAgICAoZG91YmxlICkgICAg dGhyb3cgKCkgICAgOwpleHRlcm4gICBkb3VibGUgICAgICAgICAgZXJmYyAgICAgICAgICAoZG91 YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19lcmZjICAgICAg ICAgIChkb3VibGUgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBs Z2FtbWEgICAgICAgICAgKGRvdWJsZSApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAg ICAgICAgIF9fbGdhbW1hICAgICAgICAgIChkb3VibGUgKSAgICB0aHJvdyAoKSAgICA7CgoKCgoK CgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBnYW1tYSAgICAgICAgICAoZG91YmxlICkgICAg dGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19nYW1tYSAgICAgICAgICAoZG91 YmxlICkgICAgdGhyb3cgKCkgICAgOwoKCgogCgoKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGxn YW1tYV9yICAgICAgICAgICAgICAoZG91YmxlICwgaW50ICpfX3NpZ25nYW1wKSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2xnYW1tYV9yICAgICAgICAgICAgICAoZG91 YmxlICwgaW50ICpfX3NpZ25nYW1wKSAgICB0aHJvdyAoKSAgICA7CgoKCgogCgpleHRlcm4gICBk b3VibGUgICAgICAgICAgcmludCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fcmludCAgICAgICAgICAoZG91YmxlICBfX3gpICAg IHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIG5leHRhZnRlciAgICAg ICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRl X18gKCAgICAoX19jb25zdF9fKSAgKTsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19uZXh0YWZ0 ZXIgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cgKCkgICBfX2F0 dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCgoKCiAKZXh0ZXJuICAgZG91YmxlICAg ICAgICAgIHJlbWFpbmRlciAgICAgICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0 aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX3JlbWFpbmRlciAgICAgICAgICAo ZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBk b3VibGUgICAgICAgICAgc2NhbGIgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9fbikg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19zY2FsYiAgICAgICAgICAo ZG91YmxlICBfX3gsIGRvdWJsZSAgX19uKSAgICB0aHJvdyAoKSAgICA7CgoKCiAKZXh0ZXJuICAg ZG91YmxlICAgICAgICAgIHNjYWxibiAgICAgICAgICAoZG91YmxlICBfX3gsIGludCBfX24pICAg IHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc2NhbGJuICAgICAgICAgIChk b3VibGUgIF9feCwgaW50IF9fbikgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgaW50ICAg ICAgICBpbG9nYiAgICAgICAgKGRvdWJsZSAgX194KSAgIHRocm93ICgpICA7IGV4dGVybiAgIGlu dCAgICAgICAgX19pbG9nYiAgICAgICAgKGRvdWJsZSAgX194KSAgIHRocm93ICgpICAgOwoKCiMg MzQxICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoY2FsbHMuaCIgMwoKIyA2MyAiL3Vzci9pbmNsdWRl L21hdGguaCIgMiAzCgoKCgoKCgogCgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9t YXRoY2FsbHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGFjb3NmICAgICAgICAgKGZs b2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fYWNvc2Yg ICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBmbG9hdCAg ICAgICAgICBhc2luZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgZmxvYXQgICAgICAgICBfX2FzaW5mICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAo KSAgICA7CiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgYXRhbmYgICAgICAgICAoZmxvYXQgICBf X3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19hdGFuZiAgICAgICAg IChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGZsb2F0ICAgICAgICAg IGF0YW4yZiAgICAgICAgIChmbG9hdCAgIF9feSwgZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19hdGFuMmYgICAgICAgICAoZmxvYXQgICBfX3ksIGZs b2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGNv c2YgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAg ICAgICAgX19jb3NmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0 ZXJuICAgZmxvYXQgICAgICAgICAgc2luZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cg KCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX3NpbmYgICAgICAgICAoZmxvYXQgICBfX3gp ICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBmbG9hdCAgICAgICAgICB0YW5mICAgICAgICAg KGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fdGFu ZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCgoKCgoKIAoKIApleHRl cm4gICBmbG9hdCAgICAgICAgICBjb3NoZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cg KCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2Nvc2hmICAgICAgICAgKGZsb2F0ICAgX194 KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgc2luaGYgICAgICAg ICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19z aW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGZs b2F0ICAgICAgICAgIHRhbmhmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBl eHRlcm4gICBmbG9hdCAgICAgICAgIF9fdGFuaGYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRo cm93ICgpICAgIDsKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGFjb3NoZiAgICAgICAgIChm bG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2Fjb3No ZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGZsb2F0 ICAgICAgICAgIGFzaW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0 ZXJuICAgZmxvYXQgICAgICAgICBfX2FzaW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhy b3cgKCkgICAgOwogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGF0YW5oZiAgICAgICAgIChmbG9h dCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2F0YW5oZiAg ICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCiAKCiAKZXh0ZXJuICAgZmxv YXQgICAgICAgICAgZXhwZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0 ZXJuICAgZmxvYXQgICAgICAgICBfX2V4cGYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93 ICgpICAgIDsKCgoKCgoKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGZyZXhwZiAgICAgICAg IChmbG9hdCAgIF9feCwgaW50ICpfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBm bG9hdCAgICAgICAgIF9fZnJleHBmICAgICAgICAgKGZsb2F0ICAgX194LCBpbnQgKl9fZXhwb25l bnQpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgbGRleHBmICAg ICAgICAgKGZsb2F0ICAgX194LCBpbnQgX19leHBvbmVudCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgZmxvYXQgICAgICAgICBfX2xkZXhwZiAgICAgICAgIChmbG9hdCAgIF9feCwgaW50IF9fZXhw b25lbnQpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgbG9nZiAg ICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAg ICBfX2xvZ2YgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJu ICAgZmxvYXQgICAgICAgICAgbG9nMTBmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbG9nMTBmICAgICAgICAgKGZsb2F0ICAgX194 KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIG1vZGZmICAgICAg ICAgKGZsb2F0ICAgX194LCBmbG9hdCAgICpfX2lwdHIpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGZsb2F0ICAgICAgICAgX19tb2RmZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICAqX19p cHRyKSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBleHBtMWYg ICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAg ICAgX19leHBtMWYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0 ZXJuICAgZmxvYXQgICAgICAgICAgbG9nMXBmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJv dyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbG9nMXBmICAgICAgICAgKGZsb2F0ICAg X194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGxvZ2JmICAg ICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAg IF9fbG9nYmYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKCgoKCgoK CgogCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIHBvd2YgICAgICAgICAoZmxvYXQgICBfX3gs IGZsb2F0ICAgX195KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fcG93 ZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRocm93ICgpICAgIDsKCiAK ZXh0ZXJuICAgZmxvYXQgICAgICAgICAgc3FydGYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRo cm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19zcXJ0ZiAgICAgICAgIChmbG9hdCAg IF9feCkgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgaHlwb3Rm ICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgZmxvYXQgICAgICAgICBfX2h5cG90ZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBf X3kpICAgIHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBjYnJ0ZiAg ICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAg ICBfX2NicnRmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCiAKCiAK ZXh0ZXJuICAgZmxvYXQgICAgICAgICAgY2VpbGYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRo cm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19jZWlsZiAgICAgICAgIChmbG9hdCAg IF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBmYWJzZiAg ICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9f Y29uc3RfXykgICk7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19mYWJzZiAgICAgICAgIChmbG9h dCAgIF9feCkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkg IDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgZmxvb3JmICAgICAgICAgKGZsb2F0ICAgX194 KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fZmxvb3JmICAgICAgICAg KGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAg IGZtb2RmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkgICAgdGhyb3cgKCkgIDsg ZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2Ztb2RmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9h dCAgIF9feSkgICAgdGhyb3cgKCkgICAgOwoKCiAKCmV4dGVybiAgaW50ICAgIF9faXNpbmZmICAg ICAoZmxvYXQgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9f KSk7CgogCmV4dGVybiAgaW50ICAgIF9fZmluaXRlZiAgICAgKGZsb2F0ICAgX192YWx1ZSkgIHRo cm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCiAKCmV4dGVybiAgaW50ICAg IGlzaW5mZiAgICAgKGZsb2F0ICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAo KF9fY29uc3RfXykpOwoKIApleHRlcm4gIGludCAgICBmaW5pdGVmICAgICAoZmxvYXQgICBfX3Zh bHVlKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgogCgoKCgoKZXh0 ZXJuICAgZmxvYXQgICAgICAgICAgaW5mbmFuZiAgICAgICAgIChpbnQgX19lcnJvcikgICAgdGhy b3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICk7IGV4dGVybiAgIGZsb2F0 ICAgICAgICAgX19pbmZuYW5mICAgICAgICAgKGludCBfX2Vycm9yKSAgICB0aHJvdyAoKSAgIF9f YXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKSAgOwoKIApleHRlcm4gICBmbG9hdCAgICAg ICAgICBkcmVtZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRocm93ICgp ICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19kcmVtZiAgICAgICAgIChmbG9hdCAgIF9feCwg ZmxvYXQgICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAg IHNpZ25pZmljYW5kZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgZmxvYXQgICAgICAgICBfX3NpZ25pZmljYW5kZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAg dGhyb3cgKCkgICAgOwoKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGNvcHlzaWduZiAgICAg ICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVf XyAoICAgIChfX2NvbnN0X18pICApOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fY29weXNpZ25m ICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkgICAgdGhyb3cgKCkgICBfX2F0dHJp YnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCgoKCgoKCgogCmV4dGVybiAgaW50ICAgIF9f aXNuYW5mICAgICAoZmxvYXQgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgo X19jb25zdF9fKSk7CgoKIApleHRlcm4gIGludCAgICBpc25hbmYgICAgIChmbG9hdCAgIF9fdmFs dWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICAg ZmxvYXQgICAgICAgICAgajBmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICA7IGV4dGVy biAgIGZsb2F0ICAgICAgICAgX19qMGYgICAgICAgICAoZmxvYXQgICkgICAgdGhyb3cgKCkgICAg OwpleHRlcm4gICBmbG9hdCAgICAgICAgICBqMWYgICAgICAgICAoZmxvYXQgICkgICAgdGhyb3cg KCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2oxZiAgICAgICAgIChmbG9hdCAgKSAgICB0 aHJvdyAoKSAgICA7CmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGpuZiAgICAgICAgIChpbnQsIGZs b2F0ICApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19qbmYgICAgICAg ICAoaW50LCBmbG9hdCAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGZsb2F0ICAgICAgICAg IHkwZiAgICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAg ICAgIF9feTBmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgZmxv YXQgICAgICAgICAgeTFmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICA7IGV4dGVybiAg IGZsb2F0ICAgICAgICAgX195MWYgICAgICAgICAoZmxvYXQgICkgICAgdGhyb3cgKCkgICAgOwpl eHRlcm4gICBmbG9hdCAgICAgICAgICB5bmYgICAgICAgICAoaW50LCBmbG9hdCAgKSAgICB0aHJv dyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9feW5mICAgICAgICAgKGludCwgZmxvYXQg ICkgICAgdGhyb3cgKCkgICAgOwoKCgoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBlcmZmICAg ICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19l cmZmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgZmxvYXQgICAg ICAgICAgZXJmY2YgICAgICAgICAoZmxvYXQgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxv YXQgICAgICAgICBfX2VyZmNmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICAgIDsKZXh0 ZXJuICAgZmxvYXQgICAgICAgICAgbGdhbW1hZiAgICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbGdhbW1hZiAgICAgICAgIChmbG9hdCAgKSAg ICB0aHJvdyAoKSAgICA7CgoKCgoKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGdhbW1hZiAg ICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9f Z2FtbWFmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICAgIDsKCgoKIAoKCmV4dGVybiAg IGZsb2F0ICAgICAgICAgIGxnYW1tYWZfciAgICAgICAgICAgIChmbG9hdCAgLCBpbnQgKl9fc2ln bmdhbXApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19sZ2FtbWFmX3Ig ICAgICAgICAgICAoZmxvYXQgICwgaW50ICpfX3NpZ25nYW1wKSAgICB0aHJvdyAoKSAgICA7CgoK CgogCgpleHRlcm4gICBmbG9hdCAgICAgICAgICByaW50ZiAgICAgICAgIChmbG9hdCAgIF9feCkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX3JpbnRmICAgICAgICAgKGZs b2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIG5l eHRhZnRlcmYgICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX195KSAgICB0aHJvdyAoKSAg IF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKTsgZXh0ZXJuICAgZmxvYXQgICAgICAg ICBfX25leHRhZnRlcmYgICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX195KSAgICB0aHJv dyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKSAgOwoKCgoKIApleHRlcm4g ICBmbG9hdCAgICAgICAgICByZW1haW5kZXJmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAg IF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX3JlbWFpbmRlcmYg ICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX195KSAgICB0aHJvdyAoKSAgICA7CgoKIApl eHRlcm4gICBmbG9hdCAgICAgICAgICBzY2FsYmYgICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0 ICAgX19uKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fc2NhbGJmICAg ICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9fbikgICAgdGhyb3cgKCkgICAgOwoKCgogCmV4 dGVybiAgIGZsb2F0ICAgICAgICAgIHNjYWxibmYgICAgICAgICAoZmxvYXQgICBfX3gsIGludCBf X24pICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19zY2FsYm5mICAgICAg ICAgKGZsb2F0ICAgX194LCBpbnQgX19uKSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBp bnQgICAgICAgaWxvZ2JmICAgICAgIChmbG9hdCAgIF9feCkgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBpbnQgICAgICAgX19pbG9nYmYgICAgICAgKGZsb2F0ICAgX194KSAgIHRocm93ICgpICAgOwoK CiMgMzQxICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoY2FsbHMuaCIgMwoKIyA4MiAiL3Vzci9pbmNs dWRlL21hdGguaCIgMiAzCgoKCgoKIAoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv bWF0aGNhbGxzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBhY29zbCAgICAg ICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICBfX2Fjb3NsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAo KSAgICA7CiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgYXNpbmwgICAgICAgICAobG9u ZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAg ICAgX19hc2lubCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwog CmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGF0YW5sICAgICAgICAgKGxvbmcgZG91Ymxl ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fYXRh bmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4g ICBsb25nIGRvdWJsZSAgICAgICAgICBhdGFuMmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3ks IGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAg ICAgICAgIF9fYXRhbjJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX195LCBsb25nIGRvdWJsZSAg IF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBj b3NsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgIF9fY29zbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAg dGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIHNpbmwgICAgICAg ICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91Ymxl ICAgICAgICAgX19zaW5sICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAg ICA7CiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgdGFubCAgICAgICAgIChsb25nIGRv dWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBf X3RhbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKCgoK CiAKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgY29zaGwgICAgICAgICAobG9uZyBk b3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAg X19jb3NobCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4 dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIHNpbmhsICAgICAgICAgKGxvbmcgZG91YmxlICAg X194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fc2luaGwg ICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICB0YW5obCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAg dGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX3RhbmhsICAgICAgICAg KGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgICBhY29zaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93 ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19hY29zaGwgICAgICAgICAobG9u ZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBsb25nIGRvdWJsZSAg ICAgICAgICBhc2luaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19hc2luaGwgICAgICAgICAobG9uZyBkb3Vi bGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAg ICBhdGFuaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVy biAgIGxvbmcgZG91YmxlICAgICAgICAgX19hdGFuaGwgICAgICAgICAobG9uZyBkb3VibGUgICBf X3gpICAgIHRocm93ICgpICAgIDsKCgogCgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAg IGV4cGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGxvbmcgZG91YmxlICAgICAgICAgX19leHBsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAg ICB0aHJvdyAoKSAgICA7CgoKCgoKCgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBm cmV4cGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGludCAqX19leHBvbmVudCkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2ZyZXhwbCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCwgaW50ICpfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgICA7CgogCmV4 dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGxkZXhwbCAgICAgICAgIChsb25nIGRvdWJsZSAg IF9feCwgaW50IF9fZXhwb25lbnQpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91Ymxl ICAgICAgICAgX19sZGV4cGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGludCBfX2V4cG9u ZW50KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGxv Z2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxv bmcgZG91YmxlICAgICAgICAgX19sb2dsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0 aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGxvZzEwbCAgICAg ICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICBfX2xvZzEwbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cg KCkgICAgOwoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBtb2RmbCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICAqX19pcHRyKSAgICB0aHJvdyAoKSAgOyBl eHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fbW9kZmwgICAgICAgICAobG9uZyBkb3VibGUg ICBfX3gsIGxvbmcgZG91YmxlICAgKl9faXB0cikgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJu ICAgbG9uZyBkb3VibGUgICAgICAgICAgZXhwbTFsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194 KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fZXhwbTFsICAg ICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxv bmcgZG91YmxlICAgICAgICAgIGxvZzFwbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAg dGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2xvZzFwbCAgICAgICAg IChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgICBsb2dibCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cg KCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2xvZ2JsICAgICAgICAgKGxvbmcg ZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCgoKCgoKCgoKIAoKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICBwb3dsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194LCBsb25n IGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAg ICBfX3Bvd2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAg ICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIHNxcnRsICAg ICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgIF9fc3FydGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93 ICgpICAgIDsKCgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGh5cG90bCAgICAgICAg IChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93ICgpICA7IGV4 dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19oeXBvdGwgICAgICAgICAobG9uZyBkb3VibGUg ICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgICA7CgoKCiAKZXh0ZXJuICAg bG9uZyBkb3VibGUgICAgICAgICAgY2JydGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19jYnJ0bCAgICAgICAg IChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCgogCgogCmV4dGVybiAgIGxv bmcgZG91YmxlICAgICAgICAgIGNlaWxsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0 aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fY2VpbGwgICAgICAgICAo bG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICAgZmFic2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgp ICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApOyBleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgIF9fZmFic2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgp ICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApICA7CgogCmV4dGVybiAgIGxvbmcg ZG91YmxlICAgICAgICAgIGZsb29ybCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2Zsb29ybCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgICBmbW9kbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUg ICBfX3kpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19mbW9k bCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93 ICgpICAgIDsKCgogCgpleHRlcm4gIGludCAgICBfX2lzaW5mbCAgICAgKGxvbmcgZG91YmxlICAg X192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIApleHRl cm4gIGludCAgICBfX2Zpbml0ZWwgICAgIChsb25nIGRvdWJsZSAgIF9fdmFsdWUpICB0aHJvdyAo KSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgogCgpleHRlcm4gIGludCAgICBpc2lu ZmwgICAgIChsb25nIGRvdWJsZSAgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18g KChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICBpbnQgICAgZmluaXRlbCAgICAgKGxvbmcgZG91Ymxl ICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIAoK CgoKCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGluZm5hbmwgICAgICAgICAoaW50IF9f ZXJyb3IpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApOyBl eHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9faW5mbmFubCAgICAgICAgIChpbnQgX19lcnJv cikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCiAK ZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgZHJlbWwgICAgICAgICAobG9uZyBkb3VibGUg ICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgIF9fZHJlbWwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcgZG91 YmxlICAgX195KSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAg ICAgICBzaWduaWZpY2FuZGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgp ICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19zaWduaWZpY2FuZGwgICAgICAgICAo bG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgICBjb3B5c2lnbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcg ZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9f KSAgKTsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2NvcHlzaWdubCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93ICgpICAgX19hdHRy aWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApICA7CgoKCgoKCgoKIApleHRlcm4gIGludCAgICBf X2lzbmFubCAgICAgKGxvbmcgZG91YmxlICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1 dGVfXyAoKF9fY29uc3RfXykpOwoKCiAKZXh0ZXJuICBpbnQgICAgaXNuYW5sICAgICAobG9uZyBk b3VibGUgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7 CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGowbCAgICAgICAgIChsb25nIGRvdWJs ZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fajBsICAg ICAgICAgKGxvbmcgZG91YmxlICApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICAgajFsICAgICAgICAgKGxvbmcgZG91YmxlICApICAgIHRocm93ICgpICA7IGV4 dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19qMWwgICAgICAgICAobG9uZyBkb3VibGUgICkg ICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBqbmwgICAgICAg ICAoaW50LCBsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgIF9fam5sICAgICAgICAgKGludCwgbG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkg ICAgOwpleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICB5MGwgICAgICAgICAobG9uZyBkb3Vi bGUgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX3kwbCAg ICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGxvbmcgZG91 YmxlICAgICAgICAgIHkxbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgOyBl eHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9feTFsICAgICAgICAgKGxvbmcgZG91YmxlICAp ICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgeW5sICAgICAg ICAgKGludCwgbG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICBfX3lubCAgICAgICAgIChpbnQsIGxvbmcgZG91YmxlICApICAgIHRocm93ICgp ICAgIDsKCgoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgZXJmbCAgICAgICAgIChs b25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAg IF9fZXJmbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAg IGxvbmcgZG91YmxlICAgICAgICAgIGVyZmNsICAgICAgICAgKGxvbmcgZG91YmxlICApICAgIHRo cm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19lcmZjbCAgICAgICAgIChs b25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAg ICAgIGxnYW1tYWwgICAgICAgICAobG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgbG9uZyBkb3VibGUgICAgICAgICBfX2xnYW1tYWwgICAgICAgICAobG9uZyBkb3VibGUgICkg ICAgdGhyb3cgKCkgICAgOwoKCgoKCgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBn YW1tYWwgICAgICAgICAobG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9u ZyBkb3VibGUgICAgICAgICBfX2dhbW1hbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJv dyAoKSAgICA7CgoKCiAKCgpleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBsZ2FtbWFsX3Ig ICAgICAgICAgICAobG9uZyBkb3VibGUgICwgaW50ICpfX3NpZ25nYW1wKSAgICB0aHJvdyAoKSAg OyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fbGdhbW1hbF9yICAgICAgICAgICAgKGxv bmcgZG91YmxlICAsIGludCAqX19zaWduZ2FtcCkgICAgdGhyb3cgKCkgICAgOwoKCgoKIAoKZXh0 ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgcmludGwgICAgICAgICAobG9uZyBkb3VibGUgICBf X3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19yaW50bCAg ICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICBuZXh0YWZ0ZXJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194 LCBsb25nIGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9f Y29uc3RfXykgICk7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19uZXh0YWZ0ZXJsICAg ICAgICAgKGxvbmcgZG91YmxlICAgX194LCBsb25nIGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkg ICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCgoKCiAKZXh0ZXJuICAgbG9u ZyBkb3VibGUgICAgICAgICAgcmVtYWluZGVybCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwg bG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAg ICAgICAgX19yZW1haW5kZXJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194LCBsb25nIGRvdWJs ZSAgIF9feSkgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAg ICAgc2NhbGJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194LCBsb25nIGRvdWJsZSAgIF9fbikg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX3NjYWxibCAgICAg ICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX24pICAgIHRocm93ICgpICAg IDsKCgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBzY2FsYm5sICAgICAgICAgKGxv bmcgZG91YmxlICAgX194LCBpbnQgX19uKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgIF9fc2NhbGJubCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgaW50IF9f bikgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgaW50ICAgICAgIGlsb2dibCAgICAgICAo bG9uZyBkb3VibGUgICBfX3gpICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgaW50ICAgICAgIF9faWxv Z2JsICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICB0aHJvdyAoKSAgIDsKCgojIDM0MSAiL3Vz ci9pbmNsdWRlL2JpdHMvbWF0aGNhbGxzLmgiIDMKCiMgOTkgIi91c3IvaW5jbHVkZS9tYXRoLmgi IDIgMwoKCgoKCgoKCgoKCgoKIApleHRlcm4gaW50IHNpZ25nYW07CgoKCiAKIyAyMzIgIi91c3Iv aW5jbHVkZS9tYXRoLmgiIDMKCgoKIAp0eXBlZGVmIGVudW0KewogIF9JRUVFXyA9IC0xLAkgCiAg X1NWSURfLAkgCiAgX1hPUEVOXywJIAogIF9QT1NJWF8sCiAgX0lTT0NfCSAKfSBfTElCX1ZFUlNJ T05fVFlQRTsKCiAKCgpleHRlcm4gX0xJQl9WRVJTSU9OX1RZUEUgX0xJQl9WRVJTSU9OOwoKCgoK IAoKCgoKCnN0cnVjdCBfX2V4Y2VwdGlvbgoKCgogIHsKICAgIGludCB0eXBlOwogICAgY2hhciAq bmFtZTsKICAgIGRvdWJsZSBhcmcxOwogICAgZG91YmxlIGFyZzI7CiAgICBkb3VibGUgcmV0dmFs OwogIH07CgoKZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3QgX19leGNlcHRpb24gKl9fZXhjKSB0 aHJvdyAoKTsKCgoKCgoKIAoKCgoKCgoKIAoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yL2luY2x1ZGUvZmxvYXQuaCIgMSAzCiAKCgoKIAoKICAgIAoKCiAgICAKCgogICAg CgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAK CgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAK CgogICAgCgoKCiAgICAKCgogICAgCgoKICAgIAoKCgp1bmlvbiBfX2NvbnZlcnRfbG9uZ19kb3Vi bGUgewogIHVuc2lnbmVkIF9fY29udmVydF9sb25nX2RvdWJsZV9pWzRdOwogIGxvbmcgZG91Ymxl IF9fY29udmVydF9sb25nX2RvdWJsZV9kOwp9OwoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAK CgogICAgCgoKICAgIAoKCgoKIyAyODkgIi91c3IvaW5jbHVkZS9tYXRoLmgiIDIgMwoKCiMgMjk5 ICIvdXNyL2luY2x1ZGUvbWF0aC5oIiAzCgoKCiAKCgoKCgoKCgoKCgoKCgoKCiAKCgojIDMzNiAi L3Vzci9pbmNsdWRlL21hdGguaCIgMwoKCgogCgoKCgoKCiAKCgoKCgojIDQwNyAiL3Vzci9pbmNs dWRlL21hdGguaCIgMwoKCn0gCgoKCiMgOCAibGluZWwuY2MiIDIKCiMgMSAiL3Vzci9pbmNsdWRl L3N0ZGxpYi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiAKCgoKCgojIDEgIi91 c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoK CgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45 NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgojIDI2 OSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKCgojIDI4MyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKIAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1 LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMzICIv dXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKCmV4dGVybiAiQyIgeyAKCgoKCiMgOTEgIi91c3Iv aW5jbHVkZS9zdGRsaWIuaCIgMwoKCiAKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICBpbnQgcXVvdDsJ CQkgCiAgICBpbnQgcmVtOwkJCSAKICB9IGRpdl90OwoKIAoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAg ICBsb25nIGludCBxdW90OwkJIAogICAgbG9uZyBpbnQgcmVtOwkJIAogIH0gbGRpdl90OwoKCgoj IDExOCAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKCiAKCgoKIAoKCgoKCiAKCmV4dGVybiBz aXplX3QgX19jdHlwZV9nZXRfbWJfY3VyX21heCAodm9pZCkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJu IGRvdWJsZSBhdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0cikgdGhyb3cgKCkgICA7CiAKZXh0ZXJu IGludCBhdG9pIChfX2NvbnN0IGNoYXIgKl9fbnB0cikgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIGxv bmcgaW50IGF0b2wgKF9fY29uc3QgY2hhciAqX19ucHRyKSB0aHJvdyAoKSAgIDsKCgogCl9fZXh0 ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQgYXRvbGwgKF9fY29uc3QgY2hhciAqX19ucHRy KQogICAgIHRocm93ICgpICAgOwoKCiAKZXh0ZXJuIGRvdWJsZSBzdHJ0b2QgKF9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX25wdHIsCgkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIp IHRocm93ICgpIDsKCgoKCgoKCgoKCiAKZXh0ZXJuIGxvbmcgaW50IHN0cnRvbCAoX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGlu dCBfX2Jhc2UpIHRocm93ICgpIDsKIApleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgc3RydG91bCAo X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAgY2hhciAqKl9fcmVzdHJpY3Qg X19lbmRwdHIsIGludCBfX2Jhc2UpCiAgICAgdGhyb3cgKCkgOwoKCiAKX19leHRlbnNpb25fXwpl eHRlcm4gbG9uZyBsb25nIGludCBzdHJ0b3EgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25w dHIsCgkJCSAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93 ICgpIDsKIApfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRv dXEgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkgICAgICAgY2hhciAqKl9f cmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCiAgICAgdGhyb3cgKCkgOwoKCgogCgogCl9f ZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcgbG9uZyBpbnQgc3RydG9sbCAoX19jb25zdCBjaGFyICpf X3Jlc3RyaWN0IF9fbnB0ciwKCQkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGlu dCBfX2Jhc2UpIHRocm93ICgpIDsKIApfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25n IGxvbmcgaW50IHN0cnRvdWxsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJ CWNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQogICAgIHRocm93ICgpIDsK CgoKIyAyNDQgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgogCgoKZXh0ZXJuIGRvdWJsZSBf X3N0cnRvZF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSBj aGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fZ3JvdXApCiAgICAgdGhyb3cgKCkgOwpl eHRlcm4gZmxvYXQgX19zdHJ0b2ZfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X25wdHIsCgkJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fZ3JvdXApCiAgICAg dGhyb3cgKCkgOwpleHRlcm4gbG9uZyBkb3VibGUgX19zdHJ0b2xkX2ludGVybmFsIChfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9f ZW5kcHRyLAoJCQkJICAgICAgIGludCBfX2dyb3VwKSB0aHJvdyAoKSA7CgpleHRlcm4gbG9uZyBp bnQgX19zdHJ0b2xfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJ CQkgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCSAgIGludCBfX2Jhc2UsIGludCBf X2dyb3VwKSB0aHJvdyAoKSA7CgoKCmV4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX3N0cnRvdWxf aW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJICAgICBjaGFy ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCQkgICAgIGludCBfX2Jhc2UsIGludCBfX2dyb3Vw KSB0aHJvdyAoKSA7CgoKCgpfX2V4dGVuc2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IF9fc3Ry dG9sbF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCQkgY2hh ciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKSB0 aHJvdyAoKSA7CgoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQg X19zdHJ0b3VsbF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICoKCQkJCQkJICAgX19yZXN0cmljdCBf X25wdHIsCgkJCQkJCSAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJCQkJCQkgICBpbnQg X19iYXNlLCBpbnQgX19ncm91cCkKICAgICB0aHJvdyAoKSA7CgoKCgojIDM3OCAiL3Vzci9pbmNs dWRlL3N0ZGxpYi5oIiAzCgoKCgogCgoKZXh0ZXJuIGNoYXIgKmw2NGEgKGxvbmcgaW50IF9fbikg dGhyb3cgKCkgOwoKIApleHRlcm4gbG9uZyBpbnQgYTY0bCAoX19jb25zdCBjaGFyICpfX3MpIHRo cm93ICgpICAgOwoKCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgoKCgpleHRlcm4gIkMiIHsgCgoKCgp0eXBlZGVmIF9fdV9jaGFyIHVf Y2hhcjsKdHlwZWRlZiBfX3Vfc2hvcnQgdV9zaG9ydDsKdHlwZWRlZiBfX3VfaW50IHVfaW50Owp0 eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKdHlwZWRlZiBfX3F1YWRfdCBxdWFkX3Q7CnR5cGVkZWYg X191X3F1YWRfdCB1X3F1YWRfdDsKdHlwZWRlZiBfX2ZzaWRfdCBmc2lkX3Q7CgoKdHlwZWRlZiBf X2xvZmZfdCBsb2ZmX3Q7CgoKCnR5cGVkZWYgX19pbm9fdCBpbm9fdDsKCgoKCgoKCgoKCgp0eXBl ZGVmIF9fZGV2X3QgZGV2X3Q7CgoKCgp0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CgoKCgp0eXBlZGVm IF9fbW9kZV90IG1vZGVfdDsKCgoKCnR5cGVkZWYgX19ubGlua190IG5saW5rX3Q7CgoKCgp0eXBl ZGVmIF9fdWlkX3QgdWlkX3Q7CgoKCgoKdHlwZWRlZiBfX29mZl90IG9mZl90OwoKCgoKCgoKCgoK CnR5cGVkZWYgX19waWRfdCBwaWRfdDsKCgoKCnR5cGVkZWYgX19pZF90IGlkX3Q7CgoKCgp0eXBl ZGVmIF9fc3NpemVfdCBzc2l6ZV90OwoKCgoKdHlwZWRlZiBfX2RhZGRyX3QgZGFkZHJfdDsKdHlw ZWRlZiBfX2NhZGRyX3QgY2FkZHJfdDsKCgoKdHlwZWRlZiBfX2tleV90IGtleV90OwoKCgoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CgoKCgoKCgoKCiMgNTEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgojIDYxICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAp0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKCgoKCgoKCgoK CiAKdHlwZWRlZiBfX2Nsb2NraWRfdCBjbG9ja2lkX3Q7CgoKCgoKCgoKCgogCnR5cGVkZWYgX190 aW1lcl90IHRpbWVyX3Q7CgoKCgoKIyAxMTIgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKCiMg MzY0ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgMTI2ICIvdXNyL2luY2x1ZGUvc3lzL3R5 cGVzLmgiIDIgMwoKCiMgMTM3ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDMKCgoKIyAxICIv dXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoK CgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4 Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGli L2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3 MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxNDAgIi91 c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGlu dCB1bG9uZzsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdXNob3J0Owp0eXBlZGVmIHVuc2ln bmVkIGludCB1aW50OwoKCiAKCiMgMTc0ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDMKCgog CgoKCgoKCgp0eXBlZGVmIGludCBpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fICggIF9f UUlfXyApKSkgOwp0eXBlZGVmIGludCBpbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAo ICBfX0hJX18gKSkpIDsKdHlwZWRlZiBpbnQgaW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2Rl X18gKCAgX19TSV9fICkpKSA7CnR5cGVkZWYgaW50IGludDY0X3QgX19hdHRyaWJ1dGVfXyAoKF9f bW9kZV9fICggIF9fRElfXyApKSkgOwoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OF90IF9f YXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX1FJX18gKSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBp bnQgdV9pbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX0hJX18gKSkpIDsKdHlw ZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBf X1NJX18gKSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ2NF90IF9fYXR0cmlidXRlX18g KChfX21vZGVfXyAoICBfX0RJX18gKSkpIDsKCnR5cGVkZWYgaW50IHJlZ2lzdGVyX3QgX19hdHRy aWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKCgogCgoKCgoKCiAKIyAxICIvdXNyL2lu Y2x1ZGUvZW5kaWFuLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoK IAojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2VuZGlhbi5oIiAxIDMKIAoKCgoKCgojIDM3ICIvdXNy L2luY2x1ZGUvZW5kaWFuLmgiIDIgMwoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjA2ICIvdXNy L2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVj dC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgogCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvc2VsZWN0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDM2ICIv dXNyL2luY2x1ZGUvYml0cy9zZWxlY3QuaCIgMwoKCgoKCgoKCgoKCgojIDU2ICIvdXNyL2luY2x1 ZGUvYml0cy9zZWxlY3QuaCIgMwoKIyA3MiAiL3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgiIDMK CiMgMzEgIi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zaWdzZXQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiBpbnQg X19zaWdfYXRvbWljX3Q7CgogCgoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICB1bnNpZ25lZCBsb25n IGludCBfX3ZhbFsoMTAyNCAvICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKSBdOwog IH0gX19zaWdzZXRfdDsKCgoKCiAKCgoKCgojIDEyNSAiL3Vzci9pbmNsdWRlL2JpdHMvc2lnc2V0 LmgiIDMKCiMgMzQgIi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgiIDIgMwoKCiAKCiMgMSAiL3Vz ci9pbmNsdWRlL3RpbWUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoK IyA1MSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCiMgNjEgIi91c3IvaW5jbHVkZS90aW1lLmgi IDMKCgoKIyA3MiAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgojIDg0ICIvdXNyL2luY2x1ZGUv dGltZS5oIiAzCgoKCiMgOTYgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKCgoKCgogCgpzdHJ1 Y3QgdGltZXNwZWMKICB7CiAgICBsb25nIGludCB0dl9zZWM7CQkgCiAgICBsb25nIGludCB0dl9u c2VjOwkJIAogIH07CgoKCgoKIyAzNjQgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKIyAzOCAi L3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoKIAoKCgpzdHJ1 Y3QgdGltZXZhbDsKCnR5cGVkZWYgX19mZF9tYXNrIGZkX21hc2s7CgogCnR5cGVkZWYgX19mZF9z ZXQgZmRfc2V0OwoKIAoKCgogCgoKCgogCgoKCgoKCiAKCgoKCmV4dGVybiBpbnQgc2VsZWN0IChp bnQgX19uZmRzLCBfX2ZkX3NldCAqX19yZXN0cmljdCBfX3JlYWRmZHMsCgkJICAgX19mZF9zZXQg Kl9fcmVzdHJpY3QgX193cml0ZWZkcywKCQkgICBfX2ZkX3NldCAqX19yZXN0cmljdCBfX2V4Y2Vw dGZkcywKCQkgICBzdHJ1Y3QgdGltZXZhbCAqX19yZXN0cmljdCBfX3RpbWVvdXQpIHRocm93ICgp IDsKCiMgOTAgIi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgiIDMKCgp9IAoKCiMgMjA5ICIvdXNy L2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1ZGUvc3lzL3N5c21h Y3Jvcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKIyA0NyAiL3Vzci9p bmNsdWRlL3N5cy9zeXNtYWNyb3MuaCIgMwoKCgojIDIxMiAiL3Vzci9pbmNsdWRlL3N5cy90eXBl cy5oIiAyIDMKCgoKCgoKCgoKIAoKCnR5cGVkZWYgX19ibGtjbnRfdCBibGtjbnRfdDsJICAKCgoK dHlwZWRlZiBfX2ZzYmxrY250X3QgZnNibGtjbnRfdDsgIAoKCgp0eXBlZGVmIF9fZnNmaWxjbnRf dCBmc2ZpbGNudF90OyAgCgoKIyAyNDggIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMwoKCgoK CgoKCn0gCgoKIyAzOTEgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMiAzCgoKIAoKCgogCmV4dGVy biBpbnQzMl90IHJhbmRvbSAodm9pZCkgdGhyb3cgKCkgOwoKIApleHRlcm4gdm9pZCBzcmFuZG9t ICh1bnNpZ25lZCBpbnQgX19zZWVkKSB0aHJvdyAoKSA7CgogCgoKCmV4dGVybiBjaGFyICppbml0 c3RhdGUgKHVuc2lnbmVkIGludCBfX3NlZWQsIGNoYXIgKl9fc3RhdGVidWYsCgkJCXNpemVfdCBf X3N0YXRlbGVuKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gY2hhciAqc2V0c3RhdGUgKGNoYXIgKl9f c3RhdGVidWYpIHRocm93ICgpIDsKCgoKIAoKCgpzdHJ1Y3QgcmFuZG9tX2RhdGEKICB7CiAgICBp bnQzMl90ICpmcHRyOwkJIAogICAgaW50MzJfdCAqcnB0cjsJCSAKICAgIGludDMyX3QgKnN0YXRl OwkJIAogICAgaW50IHJhbmRfdHlwZTsJCSAKICAgIGludCByYW5kX2RlZzsJCSAKICAgIGludCBy YW5kX3NlcDsJCSAKICAgIGludDMyX3QgKmVuZF9wdHI7CQkgCiAgfTsKCmV4dGVybiBpbnQgcmFu ZG9tX3IgKHN0cnVjdCByYW5kb21fZGF0YSAqX19yZXN0cmljdCBfX2J1ZiwKCQkgICAgIGludDMy X3QgKl9fcmVzdHJpY3QgX19yZXN1bHQpIHRocm93ICgpIDsKCmV4dGVybiBpbnQgc3JhbmRvbV9y ICh1bnNpZ25lZCBpbnQgX19zZWVkLCBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fYnVmKSB0aHJvdyAo KSA7CgpleHRlcm4gaW50IGluaXRzdGF0ZV9yICh1bnNpZ25lZCBpbnQgX19zZWVkLCBjaGFyICpf X3Jlc3RyaWN0IF9fc3RhdGVidWYsCgkJCXNpemVfdCBfX3N0YXRlbGVuLAoJCQlzdHJ1Y3QgcmFu ZG9tX2RhdGEgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgpIDsKCmV4dGVybiBpbnQgc2V0c3Rh dGVfciAoY2hhciAqX19yZXN0cmljdCBfX3N0YXRlYnVmLAoJCSAgICAgICBzdHJ1Y3QgcmFuZG9t X2RhdGEgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGludCByYW5k ICh2b2lkKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIHZvaWQgc3JhbmQgKHVuc2lnbmVkIGludCBfX3Nl ZWQpIHRocm93ICgpIDsKCgogCmV4dGVybiBpbnQgcmFuZF9yICh1bnNpZ25lZCBpbnQgKl9fc2Vl ZCkgdGhyb3cgKCkgOwoKCgoKIAoKIApleHRlcm4gZG91YmxlIGRyYW5kNDggKHZvaWQpIHRocm93 ICgpIDsKZXh0ZXJuIGRvdWJsZSBlcmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVsz XSkgdGhyb3cgKCkgOwoKIApleHRlcm4gbG9uZyBpbnQgbHJhbmQ0OCAodm9pZCkgdGhyb3cgKCkg OwpleHRlcm4gbG9uZyBpbnQgbnJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10p IHRocm93ICgpIDsKCiAKZXh0ZXJuIGxvbmcgaW50IG1yYW5kNDggKHZvaWQpIHRocm93ICgpIDsK ZXh0ZXJuIGxvbmcgaW50IGpyYW5kNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdKSB0 aHJvdyAoKSA7CgogCmV4dGVybiB2b2lkIHNyYW5kNDggKGxvbmcgaW50IF9fc2VlZHZhbCkgdGhy b3cgKCkgOwpleHRlcm4gdW5zaWduZWQgc2hvcnQgaW50ICpzZWVkNDggKHVuc2lnbmVkIHNob3J0 IGludCBfX3NlZWQxNnZbM10pIHRocm93ICgpIDsKZXh0ZXJuIHZvaWQgbGNvbmc0OCAodW5zaWdu ZWQgc2hvcnQgaW50IF9fcGFyYW1bN10pIHRocm93ICgpIDsKCiAKc3RydWN0IGRyYW5kNDhfZGF0 YQogIHsKICAgIHVuc2lnbmVkIHNob3J0IGludCB4WzNdOwkgCiAgICB1bnNpZ25lZCBzaG9ydCBp bnQgYVszXTsJIAogICAgdW5zaWduZWQgc2hvcnQgaW50IGM7CSAKICAgIHVuc2lnbmVkIHNob3J0 IGludCBvbGRfeFszXTsgIAogICAgaW50IGluaXQ7CQkJIAogIH07CgoKIApleHRlcm4gaW50IGRy YW5kNDhfciAoc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkgICAg ICBkb3VibGUgKl9fcmVzdHJpY3QgX19yZXN1bHQpIHRocm93ICgpIDsKZXh0ZXJuIGludCBlcmFu ZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAoJCSAgICAgIHN0cnVjdCBkcmFu ZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCgkJICAgICAgZG91YmxlICpfX3Jlc3RyaWN0 IF9fcmVzdWx0KSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgbHJhbmQ0OF9yIChzdHJ1Y3QgZHJh bmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAoJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3Ry aWN0IF9fcmVzdWx0KSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgbnJhbmQ0OF9yICh1bnNpZ25lZCBz aG9ydCBpbnQgX194c3ViaVszXSwKCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3Ry aWN0IF9fYnVmZmVyLAoJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJv dyAoKSA7CgogCmV4dGVybiBpbnQgbXJhbmQ0OF9yIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jl c3RyaWN0IF9fYnVmZmVyLAoJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0 aHJvdyAoKSA7CmV4dGVybiBpbnQganJhbmQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3Vi aVszXSwKCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAoJ CSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAoKSA7CgogCmV4dGVy biBpbnQgc3JhbmQ0OF9yIChsb25nIGludCBfX3NlZWR2YWwsIHN0cnVjdCBkcmFuZDQ4X2RhdGEg Kl9fYnVmZmVyKQogICAgIHRocm93ICgpIDsKCmV4dGVybiBpbnQgc2VlZDQ4X3IgKHVuc2lnbmVk IHNob3J0IGludCBfX3NlZWQxNnZbM10sCgkJICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX2J1 ZmZlcikgdGhyb3cgKCkgOwoKZXh0ZXJuIGludCBsY29uZzQ4X3IgKHVuc2lnbmVkIHNob3J0IGlu dCBfX3BhcmFtWzddLAoJCSAgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSB0aHJv dyAoKSA7CgoKCgoKCgogCmV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBfX3NpemUpIHRocm93 ICgpICAgOwogCmV4dGVybiB2b2lkICpjYWxsb2MgKHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19z aXplKQogICAgIHRocm93ICgpICAgOwoKCgogCgpleHRlcm4gdm9pZCAqcmVhbGxvYyAodm9pZCAq X19wdHIsIHNpemVfdCBfX3NpemUpIHRocm93ICgpICAgOwogCmV4dGVybiB2b2lkIGZyZWUgKHZv aWQgKl9fcHRyKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gdm9pZCBjZnJlZSAodm9pZCAqX19wdHIp IHRocm93ICgpIDsKCgoKIyAxICIvdXNyL2luY2x1ZGUvYWxsb2NhLmgiIDEgMwogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2lu Y2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIv Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMg MTg4ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgi IDMKCgoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2Mt bGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIyAyNSAiL3Vzci9pbmNsdWRlL2FsbG9jYS5oIiAyIDMKCgpleHRlcm4gIkMi IHsgCgogCgoKIApleHRlcm4gdm9pZCAqYWxsb2NhIChzaXplX3QgX19zaXplKSB0aHJvdyAoKSA7 CgoKCgoKfSAKCgojIDU0NSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgoKCiAKZXh0ZXJu IHZvaWQgKnZhbGxvYyAoc2l6ZV90IF9fc2l6ZSkgdGhyb3cgKCkgICA7CgoKCgoKCgoKIApleHRl cm4gdm9pZCBhYm9ydCAodm9pZCkgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJu X18pKTsKCgogCmV4dGVybiBpbnQgYXRleGl0ICh2b2lkICgqX19mdW5jKSAodm9pZCkpIHRocm93 ICgpIDsKCgogCgpleHRlcm4gaW50IF9fb25fZXhpdCAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0 YXR1cywgdm9pZCAqX19hcmcpLCB2b2lkICpfX2FyZykKICAgICB0aHJvdyAoKSA7CmV4dGVybiBp bnQgb25fZXhpdCAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0YXR1cywgdm9pZCAqX19hcmcpLCB2 b2lkICpfX2FyZykKICAgICB0aHJvdyAoKSA7CgoKIAoKCmV4dGVybiB2b2lkIGV4aXQgKGludCBf X3N0YXR1cykgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCgoKCgoK CgogCmV4dGVybiBjaGFyICpnZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lKSB0aHJvdyAoKSA7 CgogCgpleHRlcm4gY2hhciAqX19zZWN1cmVfZ2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkg dGhyb3cgKCkgOwoKCiAKIAoKZXh0ZXJuIGludCBwdXRlbnYgKGNoYXIgKl9fc3RyaW5nKSB0aHJv dyAoKSA7CgoKCiAKCmV4dGVybiBpbnQgc2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgX19j b25zdCBjaGFyICpfX3ZhbHVlLCBpbnQgX19yZXBsYWNlKQogICAgIHRocm93ICgpIDsKCiAKZXh0 ZXJuIHZvaWQgdW5zZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lKSB0aHJvdyAoKSA7CgoKCiAK CgpleHRlcm4gaW50IGNsZWFyZW52ICh2b2lkKSB0aHJvdyAoKSA7CgoKCgogCgoKCmV4dGVybiBj aGFyICpta3RlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIHRocm93ICgpIDsKCiAKCgoKCgpleHRlcm4g aW50IG1rc3RlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCiAK CgoKCmV4dGVybiBjaGFyICpta2R0ZW1wIChjaGFyICpfX3RlbXBsYXRlKSB0aHJvdyAoKSA7CgoK CiAKZXh0ZXJuIGludCBzeXN0ZW0gKF9fY29uc3QgY2hhciAqX19jb21tYW5kKSB0aHJvdyAoKSA7 CgoKCgoKCgoKCgogCgoKCgoKZXh0ZXJuIGNoYXIgKnJlYWxwYXRoIChfX2NvbnN0IGNoYXIgKl9f cmVzdHJpY3QgX19uYW1lLAoJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpIHRo cm93ICgpIDsKCgoKIAoKCnR5cGVkZWYgaW50ICgqX19jb21wYXJfZm5fdCkgKF9fY29uc3Qgdm9p ZCAqLCBfX2NvbnN0IHZvaWQgKik7CgoKCgoKCiAKCmV4dGVybiB2b2lkICpic2VhcmNoIChfX2Nv bnN0IHZvaWQgKl9fa2V5LCBfX2NvbnN0IHZvaWQgKl9fYmFzZSwKCQkgICAgICBzaXplX3QgX19u bWVtYiwgc2l6ZV90IF9fc2l6ZSwgX19jb21wYXJfZm5fdCBfX2NvbXBhcik7CgogCgpleHRlcm4g dm9pZCBxc29ydCAodm9pZCAqX19iYXNlLCBzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwK CQkgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKCgogCmV4dGVybiBpbnQgYWJzIChpbnQgX194 KSB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwpleHRlcm4gbG9uZyBpbnQg bGFicyAobG9uZyBpbnQgX194KSB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykp OwoKCgoKCgogCgogCmV4dGVybiBkaXZfdCBkaXYgKGludCBfX251bWVyLCBpbnQgX19kZW5vbSkK ICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwpleHRlcm4gbGRpdl90 IGxkaXYgKGxvbmcgaW50IF9fbnVtZXIsIGxvbmcgaW50IF9fZGVub20pCiAgICAgdGhyb3cgKCkg IF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgoKCgoKCgogCgoKIAoKCmV4dGVybiBjaGFy ICplY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19k ZWNwdCwKCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSB0aHJvdyAoKSA7CgogCgoKZXh0ZXJu IGNoYXIgKmZjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmlj dCBfX2RlY3B0LAoJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24pIHRocm93ICgpIDsKCiAKCgpl eHRlcm4gY2hhciAqZ2N2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgY2hhciAqX19i dWYpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGNoYXIgKnFlY3Z0IChsb25nIGRvdWJsZSBfX3ZhbHVl LCBpbnQgX19uZGlnaXQsCgkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVz dHJpY3QgX19zaWduKSB0aHJvdyAoKSA7CmV4dGVybiBjaGFyICpxZmN2dCAobG9uZyBkb3VibGUg X192YWx1ZSwgaW50IF9fbmRpZ2l0LAoJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50 ICpfX3Jlc3RyaWN0IF9fc2lnbikgdGhyb3cgKCkgOwpleHRlcm4gY2hhciAqcWdjdnQgKGxvbmcg ZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgY2hhciAqX19idWYpIHRocm93ICgpIDsKCgoK IAoKZXh0ZXJuIGludCBlY3Z0X3IgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAq X19yZXN0cmljdCBfX2RlY3B0LAoJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24sIGNoYXIgKl9f cmVzdHJpY3QgX19idWYsCgkJICAgc2l6ZV90IF9fbGVuKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQg ZmN2dF9yIChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19k ZWNwdCwKCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVm LAoJCSAgIHNpemVfdCBfX2xlbikgdGhyb3cgKCkgOwoKZXh0ZXJuIGludCBxZWN2dF9yIChsb25n IGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCgkJICAgIGludCAqX19yZXN0cmljdCBfX2Rl Y3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAoJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVm LCBzaXplX3QgX19sZW4pIHRocm93ICgpIDsKZXh0ZXJuIGludCBxZmN2dF9yIChsb25nIGRvdWJs ZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCgkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBp bnQgKl9fcmVzdHJpY3QgX19zaWduLAoJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXpl X3QgX19sZW4pIHRocm93ICgpIDsKCgoKCiAKCmV4dGVybiBpbnQgbWJsZW4gKF9fY29uc3QgY2hh ciAqX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CiAKCmV4dGVybiBpbnQgbWJ0b3djICh3Y2hh cl90ICpfX3Jlc3RyaWN0IF9fcHdjLAoJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Ms IHNpemVfdCBfX24pIHRocm93ICgpIDsKIAoKZXh0ZXJuIGludCB3Y3RvbWIgKGNoYXIgKl9fcywg d2NoYXJfdCBfX3djaGFyKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gc2l6ZV90IG1ic3Rvd2NzICh3 Y2hhcl90ICpfX3Jlc3RyaWN0ICBfX3B3Y3MsCgkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X3MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKIApleHRlcm4gc2l6ZV90IHdjc3RvbWJzIChjaGFy ICpfX3Jlc3RyaWN0IF9fcywKCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjcywg c2l6ZV90IF9fbikKICAgICB0aHJvdyAoKSA7CgoKCiAKCgoKZXh0ZXJuIGludCBycG1hdGNoIChf X2NvbnN0IGNoYXIgKl9fcmVzcG9uc2UpIHRocm93ICgpIDsKCgoKIyA4MTEgIi91c3IvaW5jbHVk ZS9zdGRsaWIuaCIgMwoKCgojIDgzNSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKIyA4NDUg Ii91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgogCgoKZXh0ZXJuIGludCBnZXRsb2FkYXZnIChk b3VibGUgX19sb2FkYXZnW10sIGludCBfX25lbGVtKSB0aHJvdyAoKSA7CgoKCgoKfSAKCgojIDkg ImxpbmVsLmNjIiAyCgojIDEgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxp Yi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK IAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKIyAyNzEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiMgMjgzICIvdXNy L2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgog CgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRl Zi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzMgIi91c3IvaW5jbHVkZS9zdHJp bmcuaCIgMiAzCgoKCiAKZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rl c3QsCgkJICAgICBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRo cm93ICgpIDsKIAoKZXh0ZXJuIHZvaWQgKm1lbW1vdmUgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2 b2lkICpfX3NyYywgc2l6ZV90IF9fbikKICAgICB0aHJvdyAoKSA7CgogCgoKCmV4dGVybiB2b2lk ICptZW1jY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fc3JjLAoJCSAgICAgIGludCBfX2MsIHNpemVfdCBfX24pCiAgICAgdGhyb3cgKCkgOwoK CgogCmV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikg dGhyb3cgKCkgOwoKIApleHRlcm4gaW50IG1lbWNtcCAoX19jb25zdCB2b2lkICpfX3MxLCBfX2Nv bnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCiAgICAgdGhyb3cgKCkgICA7CgogCmV4dGVybiB2 b2lkICptZW1jaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQogICAg ICB0aHJvdyAoKSAgIDsKCiMgNzMgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCgogCmV4dGVy biBjaGFyICpzdHJjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9f cmVzdHJpY3QgX19zcmMpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVybiBjaGFyICpzdHJuY3B5IChj aGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGNoYXIgKnN0cmNhdCAoY2hh ciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKICAg ICB0aHJvdyAoKSA7CiAKZXh0ZXJuIGNoYXIgKnN0cm5jYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19k ZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCgkJICAgICAgc2l6ZV90IF9fbikg dGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHN0cmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2Nv bnN0IGNoYXIgKl9fczIpCiAgICAgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIGludCBzdHJuY21wIChf X2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikKICAgICB0 aHJvdyAoKSAgIDsKCiAKZXh0ZXJuIGludCBzdHJjb2xsIChfX2NvbnN0IGNoYXIgKl9fczEsIF9f Y29uc3QgY2hhciAqX19zMikKICAgICB0aHJvdyAoKSAgIDsKIApleHRlcm4gc2l6ZV90IHN0cnhm cm0gKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAoJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpIDsKCiMgMTE2ICIvdXNyL2luY2x1ZGUv c3RyaW5nLmgiIDMKCgoKIApleHRlcm4gY2hhciAqc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fcykg dGhyb3cgKCkgICA7CgoKIAoKCgoKCgoKIyAxNTIgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoK CiAKZXh0ZXJuIGNoYXIgKnN0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93 ICgpICAgOwogCmV4dGVybiBjaGFyICpzdHJyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9f YykgdGhyb3cgKCkgICA7CgoKCgoKCgogCgpleHRlcm4gc2l6ZV90IHN0cmNzcG4gKF9fY29uc3Qg Y2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KQogICAgIHRocm93ICgpICAgOwogCgpl eHRlcm4gc2l6ZV90IHN0cnNwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19h Y2NlcHQpCiAgICAgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnBicmsgKF9fY29uc3Qg Y2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQogICAgIHRocm93ICgpICAgOwogCmV4 dGVybiBjaGFyICpzdHJzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFy ICpfX25lZWRsZSkKICAgICB0aHJvdyAoKSAgIDsKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKnN0cnRv ayAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGlt KQogICAgIHRocm93ICgpIDsKCiAKCmV4dGVybiBjaGFyICpfX3N0cnRva19yIChjaGFyICpfX3Jl c3RyaWN0IF9fcywKCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAoJCQkgY2hh ciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikgdGhyb3cgKCkgOwoKZXh0ZXJuIGNoYXIgKnN0cnRv a19yIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVs aW0sCgkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fc2F2ZV9wdHIpIHRocm93ICgpIDsKCgoj IDIxNCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCiAKZXh0ZXJuIHNpemVfdCBzdHJsZW4g KF9fY29uc3QgY2hhciAqX19zKSB0aHJvdyAoKSAgIDsKCgoKCgoKCgoKIApleHRlcm4gY2hhciAq c3RyZXJyb3IgKGludCBfX2Vycm51bSkgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGNoYXIgKl9fc3Ry ZXJyb3JfciAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSB0aHJv dyAoKSA7CmV4dGVybiBjaGFyICpzdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVm LCBzaXplX3QgX19idWZsZW4pIHRocm93ICgpIDsKCgogCgpleHRlcm4gdm9pZCBfX2J6ZXJvICh2 b2lkICpfX3MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKCgogCmV4dGVybiB2b2lkIGJjb3B5IChf X2NvbnN0IHZvaWQgKl9fc3JjLCB2b2lkICpfX2Rlc3QsIHNpemVfdCBfX24pIHRocm93ICgpIDsK CiAKZXh0ZXJuIHZvaWQgYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgdGhyb3cgKCkgOwoK IApleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3My LCBzaXplX3QgX19uKQogICAgIHRocm93ICgpICAgOwoKIApleHRlcm4gY2hhciAqaW5kZXggKF9f Y29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSAgIDsKCiAKZXh0ZXJuIGNoYXIgKnJp bmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpICAgOwoKIAoKZXh0ZXJu IGludCBfX2ZmcyAoaW50IF9faSkgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChjb25zdCkpOwpl eHRlcm4gaW50IGZmcyAoaW50IF9faSkgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChjb25zdCkp OwoKIAoKCgoKCgoKCgogCmV4dGVybiBpbnQgc3RyY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3Mx LCBfX2NvbnN0IGNoYXIgKl9fczIpCiAgICAgdGhyb3cgKCkgICA7CgogCmV4dGVybiBpbnQgc3Ry bmNhc2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBzaXplX3Qg X19uKQogICAgIHRocm93ICgpICAgOwoKCiMgMjkxICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMK CgoKIAoKZXh0ZXJuIGNoYXIgKnN0cnNlcCAoY2hhciAqKl9fcmVzdHJpY3QgX19zdHJpbmdwLAoJ CSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0pIHRocm93ICgpIDsKCgojIDMz NCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCgojIDM2MiAiL3Vzci9pbmNsdWRlL3N0cmlu Zy5oIiAzCgoKCn0gCgoKIyAxMCAibGluZWwuY2MiIDIKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p Mzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2ZzdHJlYW0uaCIgMSAz CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgpleHRlcm4g IkMrKyIgewpjbGFzcyBmc3RyZWFtYmFzZSA6IHZpcnR1YWwgcHVibGljIGlvcyB7CgogICAgbXV0 YWJsZSBmaWxlYnVmIF9fbXlfZmI7ICAKCiAgICB2b2lkIF9fZmJfaW5pdCAoKTsKICBwdWJsaWM6 CiAgICBmc3RyZWFtYmFzZSgpOwogICAgZnN0cmVhbWJhc2UoaW50IGZkKTsKICAgIGZzdHJlYW1i YXNlKGludCBmZCwgY2hhciAqcCwgaW50IGwpOyAgCiAgICBmc3RyZWFtYmFzZShjb25zdCBjaGFy ICpuYW1lLCBpbnQgbW9kZSwgaW50IHByb3Q9MDY2NCk7CiAgICB2b2lkIGNsb3NlKCk7CgogICAg ZmlsZWJ1ZiogcmRidWYoKSBjb25zdCB7IHJldHVybiAmX19teV9mYjsgfQoKCgogICAgdm9pZCBv cGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBpbnQgcHJvdD0wNjY0KTsKICAgIGludCBp c19vcGVuKCkgY29uc3QgeyByZXR1cm4gcmRidWYoKS0+aXNfb3BlbigpOyB9CiAgICB2b2lkIHNl dGJ1ZihjaGFyICpwdHIsIGludCBsZW4pIHsgcmRidWYoKS0+c2V0YnVmKHB0ciwgbGVuKTsgfQog ICAgdm9pZCBhdHRhY2goaW50IGZkKTsKCgoKCn07CgpjbGFzcyBpZnN0cmVhbSA6IHB1YmxpYyBm c3RyZWFtYmFzZSwgcHVibGljIGlzdHJlYW0gewogIHB1YmxpYzoKICAgIGlmc3RyZWFtKCkgOiBm c3RyZWFtYmFzZSgpIHsgfQogICAgaWZzdHJlYW0oaW50IGZkKSA6IGZzdHJlYW1iYXNlKGZkKSB7 IH0KICAgIGlmc3RyZWFtKGludCBmZCwgY2hhciAqcCwgaW50IGwpIDogZnN0cmVhbWJhc2UoZmQs IHAsIGwpIHsgfSAgCiAgICBpZnN0cmVhbShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZT1pb3M6 OmluLCBpbnQgcHJvdD0wNjY0KQoJOiBmc3RyZWFtYmFzZShuYW1lLCBtb2RlIHwgaW9zOjppbiwg cHJvdCkgeyB9CiAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGU9aW9zOjpp biwgaW50IHByb3Q9MDY2NCkKCXsgZnN0cmVhbWJhc2U6Om9wZW4obmFtZSwgbW9kZSB8IGlvczo6 aW4sIHByb3QpOyB9Cn07CgpjbGFzcyBvZnN0cmVhbSA6IHB1YmxpYyBmc3RyZWFtYmFzZSwgcHVi bGljIG9zdHJlYW0gewogIHB1YmxpYzoKICAgIG9mc3RyZWFtKCkgOiBmc3RyZWFtYmFzZSgpIHsg fQogICAgb2ZzdHJlYW0oaW50IGZkKSA6IGZzdHJlYW1iYXNlKGZkKSB7IH0KICAgIG9mc3RyZWFt KGludCBmZCwgY2hhciAqcCwgaW50IGwpIDogZnN0cmVhbWJhc2UoZmQsIHAsIGwpIHsgfSAgCiAg ICBvZnN0cmVhbShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZT1pb3M6Om91dCwgaW50IHByb3Q9 MDY2NCkKCTogZnN0cmVhbWJhc2UobmFtZSwgbW9kZSB8IGlvczo6b3V0LCBwcm90KSB7IH0KICAg IHZvaWQgb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZT1pb3M6Om91dCwgaW50IHByb3Q9 MDY2NCkKCXsgZnN0cmVhbWJhc2U6Om9wZW4obmFtZSwgbW9kZSB8IGlvczo6b3V0LCBwcm90KTsg fQp9OwoKY2xhc3MgZnN0cmVhbSA6IHB1YmxpYyBmc3RyZWFtYmFzZSwgcHVibGljIGlvc3RyZWFt IHsKICBwdWJsaWM6CiAgICBmc3RyZWFtKCkgOiBmc3RyZWFtYmFzZSgpIHsgfQogICAgZnN0cmVh bShpbnQgZmQpIDogZnN0cmVhbWJhc2UoZmQpIHsgfQogICAgZnN0cmVhbShjb25zdCBjaGFyICpu YW1lLCBpbnQgbW9kZSwgaW50IHByb3Q9MDY2NCkKCTogZnN0cmVhbWJhc2UobmFtZSwgbW9kZSwg cHJvdCkgeyB9CiAgICBmc3RyZWFtKGludCBmZCwgY2hhciAqcCwgaW50IGwpIDogZnN0cmVhbWJh c2UoZmQsIHAsIGwpIHsgfSAgCiAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG1v ZGUsIGludCBwcm90PTA2NjQpCgl7IGZzdHJlYW1iYXNlOjpvcGVuKG5hbWUsIG1vZGUsIHByb3Qp OyB9Cn07Cn0gIAoKIyAxMSAibGluZWwuY2MiIDIKCgojIDEgIi4uL2Z1bmN0aW9uL2ZuY0Z1bmN0 aW9uLmgiIDEKIAoKCgoKCgoKICAjcHJhZ21hIGludGVyZmFjZQoKCiMgMSAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3R5cGVpbmZvIiAxIDMKIAogCgoKCgojcHJh Z21hIGludGVyZmFjZSAidHlwZWluZm8iCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvaW5jbHVkZS9leGNlcHRpb24iIDEgMwogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNl ICJleGNlcHRpb24iCgpleHRlcm4gIkMrKyIgewoKbmFtZXNwYWNlIHN0ZCB7CgpjbGFzcyBleGNl cHRpb24gewpwdWJsaWM6CiAgZXhjZXB0aW9uICgpIHsgfQogIHZpcnR1YWwgfmV4Y2VwdGlvbiAo KSB7IH0KICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQgKCkgY29uc3Q7Cn07CgpjbGFzcyBiYWRf ZXhjZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbiB7CnB1YmxpYzoKICBiYWRfZXhjZXB0aW9uICgp IHsgfQogIHZpcnR1YWwgfmJhZF9leGNlcHRpb24gKCkgeyB9Cn07Cgp0eXBlZGVmIHZvaWQgKCp0 ZXJtaW5hdGVfaGFuZGxlcikgKCk7CnR5cGVkZWYgdm9pZCAoKnVuZXhwZWN0ZWRfaGFuZGxlcikg KCk7Cgp0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWluYXRlICh0ZXJtaW5hdGVfaGFuZGxlcik7 CnZvaWQgdGVybWluYXRlICgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKdW5leHBl Y3RlZF9oYW5kbGVyIHNldF91bmV4cGVjdGVkICh1bmV4cGVjdGVkX2hhbmRsZXIpOwp2b2lkIHVu ZXhwZWN0ZWQgKCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwpib29sIHVuY2F1Z2h0 X2V4Y2VwdGlvbiAoKTsKCn0gIAoKfSAgCgoKIyA5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yL2luY2x1ZGUvdHlwZWluZm8iIDIgMwoKCmV4dGVybiAiQysrIiB7CgpuYW1lc3Bh Y2Ugc3RkIHsKCmNsYXNzIHR5cGVfaW5mbyB7CnByaXZhdGU6CiAgIAogIHR5cGVfaW5mbyYgb3Bl cmF0b3I9IChjb25zdCB0eXBlX2luZm8mKTsKICB0eXBlX2luZm8gKGNvbnN0IHR5cGVfaW5mbyYp OwoKcHJvdGVjdGVkOgogIGV4cGxpY2l0IHR5cGVfaW5mbyAoY29uc3QgY2hhciAqbik6IF9uYW1l IChuKSB7IH0KCiAgY29uc3QgY2hhciAqX25hbWU7CgpwdWJsaWM6CiAgIAogIHZpcnR1YWwgfnR5 cGVfaW5mbyAoKTsKICAgIAogIGJvb2wgYmVmb3JlIChjb25zdCB0eXBlX2luZm8mIGFyZykgY29u c3Q7CiAgY29uc3QgY2hhciogbmFtZSAoKSBjb25zdAogICAgeyByZXR1cm4gX25hbWU7IH0KICBi b29sIG9wZXJhdG9yPT0gKGNvbnN0IHR5cGVfaW5mbyYgYXJnKSBjb25zdDsKICBib29sIG9wZXJh dG9yIT0gKGNvbnN0IHR5cGVfaW5mbyYgYXJnKSBjb25zdDsKfTsKCmlubGluZSBib29sIHR5cGVf aW5mbzo6Cm9wZXJhdG9yIT0gKGNvbnN0IHR5cGVfaW5mbyYgYXJnKSBjb25zdAp7CiAgcmV0dXJu ICFvcGVyYXRvcj09IChhcmcpOwp9CgpjbGFzcyBiYWRfY2FzdCA6IHB1YmxpYyBleGNlcHRpb24g ewpwdWJsaWM6CiAgYmFkX2Nhc3QoKSB7IH0KICB2aXJ0dWFsIH5iYWRfY2FzdCgpIHsgfQp9OwoK Y2xhc3MgYmFkX3R5cGVpZCA6IHB1YmxpYyBleGNlcHRpb24gewogcHVibGljOgogIGJhZF90eXBl aWQgKCkgeyB9CiAgdmlydHVhbCB+YmFkX3R5cGVpZCAoKSB7IH0KfTsKCn0gIAoKfSAgCgojIDEy ICIuLi9mdW5jdGlvbi9mbmNGdW5jdGlvbi5oIiAyCgoKCiMgMSAiLi4vZnVuY3Rpb24vLi4vY29u Y2VwdHMuaCIgMQogCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgojIDEgIi4uL2Z1bmN0 aW9uLy4uL3Rvb2xib3gvdGJ4RnVDby5oIiAxCiAKCgoKCgoKCgoKCmV4dGVybiAiQyIgewoKCgog ICAKCiAgaW50IHBhcnNlKGNvbnN0IGNoYXIgKnNlbnRlbmNlLCB1bnNpZ25lZCBjaGFyICpwZ20p OwoKICAgCgogIHZvaWQgIHByb2Nlc3MoY29uc3QgdW5zaWduZWQgY2hhciAqcGdtLCAKCQlkb3Vi bGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdltdKTsKCgp9CgoKCgogICAgCgojIDE2 ICIuLi9mdW5jdGlvbi8uLi9jb25jZXB0cy5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL3Rvb2xi b3gvdGJ4UG9vbC5oIiAxCiAKCgoKCgoKIAogCgoKCnRlbXBsYXRlIDxjbGFzcyBUPiAKY2xhc3Mg UG9vbCB7CiAKICB1bmlvbiBsaW5rIHsKICAgIHZvaWQqICBsbms7CiAgICBkb3VibGUgYWxpZ247 CiAgfTsKCiAgY29uc3QgdW5zaWduZWQgIGJsa1N6OwogIHZvaWQqICAgICAgICAgICBibGs7Cgog ICAKICB1bnNpZ25lZCAgICAgICAgZnJlZTsKCiAgVCogICAgICAgICAgICAgIG5leHQ7CgogIFBv b2woUG9vbCYpOwogIHZvaWQgb3BlcmF0b3I9KFBvb2wmKTsKCnB1YmxpYzoKICAgCgogIFBvb2wo dW5zaWduZWQgc3opIDogYmxrU3ooc3opIHsgZnJlZSA9IDA7IGJsayA9IDA7IH0KICB+UG9vbCgp OwoKICAgCgoKICBUKiBhbGxvYygpOwogIGZsb2F0IG1lbW9yeSgpIGNvbnN0Owp9OwoKdGVtcGxh dGUgPGNsYXNzIFQ+IApQb29sPFQ+Ojp+UG9vbCgpIHsKCiAgd2hpbGUgKGJsaykgewogICAgdm9p ZCogYiA9IGJsazsgYmxrID0gKChsaW5rKikgYmxrKS0+bG5rOwogICAgZGVsZXRlW10gYjsKICB9 Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPiAKVCogUG9vbDxUPjo6YWxsb2MoKSB7CgogIGlmICghZnJl ZSkgeyAKICAgIHZvaWQqIGIgPSBuZXcgY2hhcltibGtTeiAqIHNpemVvZihUKSArIHNpemVvZihs aW5rKV07CiAgICAoKGxpbmsqKSBiKS0+bG5rID0gYmxrOyBibGsgPSBiOwogICAgbmV4dCA9IChU KikoKGxpbmsqKSBibGsgKyAxKTsgZnJlZSA9IGJsa1N6OwogIH0gICAKCiAgZnJlZS0tOyByZXR1 cm4gbmV4dCsrOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gCmZsb2F0IFBvb2w8VD46Om1lbW9yeSgp IGNvbnN0IHsKCiAgZmxvYXQgbWVtID0gMC4wOwogIGZsb2F0IGJsa21lbSA9IGJsa1N6ICogc2l6 ZW9mKFQpICsgc2l6ZW9mKGxpbmspOwoKICBmb3Iodm9pZCogYiA9IGJsazsgYiAhPSBfX251bGwg OyBiID0gKChsaW5rKiliKS0+bG5rKSBtZW0gKz0gYmxrbWVtOwoKICByZXR1cm4gc2l6ZW9mKFBv b2wpICsgbWVtOwp9CgoKIyAxNyAiLi4vZnVuY3Rpb24vLi4vY29uY2VwdHMuaCIgMgoKCiAKCgoK CgoKCgoKICAKCgoKCiAgdGVtcGxhdGUgPGNsYXNzIEIsIGNsYXNzIEQ+IGlubGluZSBEKiBjYXN0 VXAoQiogYiwgRCoqIGQpIHsKICAgIHJldHVybiAqZCA9IGItPmNvb2tpZSgpID09ICZEOjplaWtv b2MgPyAoRCopYiA6IChEKilfX251bGwgOwogIH0KCgogCgogCnR5cGVkZWYgZG91YmxlICAgICAg ICAgICAgICAgICAgcmVhbDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICB1aW50 OwoKIAp0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIHVzaG9ydDsKCiAKdHlwZWRlZiB1 bnNpZ25lZCBjaGFyICAgICAgICAgICB1Y2hhcjsKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxv bmcgaW50ICB1bGxpbnQ7CgoKCgoKCgogCgogCgoKCgogCiAKCiAKCmNsYXNzIFJlYWwzZDsKY2xh c3MgVW5pdDNkOwpjbGFzcyBSZWFsMmQ7CmNsYXNzIFVuaXQyZDsKCiAKCiAKCmNsYXNzIFJvdGF0 aW9uM2QgewoKICByZWFsIHh4LCB4eSwgeHo7CiAgcmVhbCB5eCwgeXksIHl6OwogIHJlYWwgengs IHp5LCB6ejsKCnB1YmxpYzoKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBv cywgY29uc3QgUm90YXRpb24zZCYgcik7CgogICAKICBSb3RhdGlvbjNkKCkgeyB4eCA9IHh5ID0g eHogPSB5eCA9IHl5ID0geXogPSB6eCA9IHp5ID0genogPSAwOyB9CgogICAKCgoKICBSb3RhdGlv bjNkKGNvbnN0IFVuaXQzZCYgbik7CgogICAKCgoKCgogIFJvdGF0aW9uM2QoY29uc3QgUmVhbDNk JiBvbmUsIGNvbnN0IFJlYWwzZCYgdHdvLCBjb25zdCBSZWFsM2QmIHRocmVlKTsKCiAgIAoKCgoK ICBpbmxpbmUgdm9pZCBtYXAoUmVhbDNkIHUsIFJlYWwzZCogdikgY29uc3Q7CgogICAKCgoKCgog IGlubGluZSB2b2lkIG1hcChSZWFsM2QgdSwgUmVhbDJkKiB2KSBjb25zdDsKCiAgIAogIGlubGlu ZSByZWFsIGRldGVybWluYW50KCkgY29uc3Q7Cn07CgogCgogCgpjbGFzcyBSb3RhdGlvbjJkIHsK ICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgUm90YXRpb24y ZCYgcik7CgogIHJlYWwgeHgsIHh5OwogIHJlYWwgeXgsIHl5OwoKcHVibGljOgogICAKICBSb3Rh dGlvbjJkKCkgeyB4eCA9IHh5ID0geXggPSB5eSA9IDA7IH0KCiAgIAoKCgoKICBSb3RhdGlvbjJk KGNvbnN0IFVuaXQyZCYgbik7CgogICAKCgoKCiAgUm90YXRpb24yZChjb25zdCBSZWFsMmQmIG9u ZSwgY29uc3QgUmVhbDJkJiB0d28pOwoKICAgCgoKCiAgaW5saW5lIHZvaWQgbWFwKFJlYWwyZCB1 LCBSZWFsMmQqIHYpIGNvbnN0OwoKICAgCgoKCgogIGlubGluZSB2b2lkIG1hcChSZWFsMmQgdSwg UmVhbDNkKiB2KSBjb25zdDsKCiAgIAoKCgoKICBpbmxpbmUgdm9pZCBtYXAoUmVhbDNkIHUsIFJl YWwzZCogdikgY29uc3Q7CgogICAKICBpbmxpbmUgUm90YXRpb24yZCB0cmFuc3Bvc2UoKSBjb25z dDsKCiAgIAogIGlubGluZSByZWFsIGRldGVybWluYW50KCkgY29uc3Q7CgogICAKICBpbmxpbmUg Um90YXRpb24yZCBpbnZlcnNlKCkgY29uc3Q7CgogICAKICBpbmxpbmUgUm90YXRpb24yZCBvcGVy YXRvciogKGNvbnN0IFJvdGF0aW9uMmQmIHR3bykgY29uc3Q7CgogICAKICBpbmxpbmUgUmVhbDJk IG9wZXJhdG9yKiAoY29uc3QgUmVhbDJkJiB2KSBjb25zdDsKfTsKCiAKCiAKCmNsYXNzIFJlYWwz ZCB7CiAgZnJpZW5kIGNsYXNzIFJlYWwyZDsKICBmcmllbmQgY2xhc3MgUm90YXRpb24yZDsKICBm cmllbmQgY2xhc3MgUm90YXRpb24zZDsKCiAgIAogIHVuaW9uIHsKICAgICAKICAgIHN0cnVjdCB7 IAogICAgICAgCiAgICAgIHJlYWwgeDsKICAgICAgIAogICAgICByZWFsIHk7CiAgICAgICAKICAg ICAgcmVhbCB6OyB9IHNfOwogICAgIAogICAgcmVhbCAgICAgICAgICAgICAgICAgICAgIHZfWzNd OwogIH07CgogcHVibGljOgogICAKICBSZWFsM2QoKSB7IHNfLnggPSBzXy55ID0gc18ueiA9IDA7 IH0KCiAgIAogIFJlYWwzZChjb25zdCBSZWFsM2QmIHgpIHsgc18ueCA9IHguc18ueDsgc18ueSA9 IHguc18ueTsgc18ueiA9IHguc18uejsgfQoKICAgCgoKCgoKICBSZWFsM2QocmVhbCB4LCByZWFs IHksIHJlYWwgeikgeyBzXy54ID0geDsgc18ueSA9IHk7IHNfLnogPSB6OyB9CgogICAKCgoKCgog IFJlYWwzZCh1bnNpZ25lZCBjaGFyICpwZ20sIHJlYWwgeCwgcmVhbCB5LCByZWFsIHogPSAwLjAp IHsgCiAgICBwcm9jZXNzKHBnbSwgeCwgeSwgeiwgdl8pOyB9CgogICAKCgoKCiAgUmVhbDNkKGNv bnN0IFJvdGF0aW9uM2QmIHIsIGNvbnN0IFJlYWwzZCYgeCkgeyByLm1hcCh4LCB0aGlzKTsgfQoK ICAgCgoKCiAgaW5saW5lIFJlYWwzZChjb25zdCBSZWFsMmQmIHgpOwoKICAgCiAgaW5saW5lIFJl YWwzZCAgb3BlcmF0b3IgLSgpIGNvbnN0OwogICAKICBpbmxpbmUgUmVhbDNkICBvcGVyYXRvciAr KGNvbnN0IFJlYWwzZCYgdSkgY29uc3Q7CiAgIAogIGlubGluZSBSZWFsM2QgIG9wZXJhdG9yIC0o Y29uc3QgUmVhbDNkJiB1KSBjb25zdDsKICAgCiAgaW5saW5lIHJlYWwgICAgb3BlcmF0b3IgKihj b25zdCBSZWFsM2QmIHUpIGNvbnN0OwogICAKICBpbmxpbmUgUmVhbDNkICBvcGVyYXRvciAqKGNv bnN0IHJlYWwgcykgY29uc3Q7CiAgIAogIGlubGluZSBSZWFsM2QgIG9wZXJhdG9yICUoY29uc3Qg UmVhbDNkJiB1KSBjb25zdDsKICAgCiAgaW5saW5lIFJlYWwzZCYgb3BlcmF0b3IgKz0oY29uc3Qg UmVhbDNkJiB1KTsKICAgCiAgaW5saW5lIFJlYWwzZCYgb3BlcmF0b3IgKz0oY29uc3QgUmVhbDJk JiB1KTsKICAgCiAgaW5saW5lIFJlYWwzZCYgb3BlcmF0b3IgLT0oY29uc3QgUmVhbDNkJiB1KTsK ICAgCiAgaW5saW5lIFJlYWwzZCYgb3BlcmF0b3IgLT0oY29uc3QgUmVhbDJkJiB1KTsKICAgCiAg aW5saW5lIFJlYWwzZCYgb3BlcmF0b3IgKj0oZG91YmxlIHUpOwoKICAgCiAgaW5saW5lIHZvaWQg YWRkKGNvbnN0IFJlYWwzZCYgdSwgY29uc3QgUmVhbDNkJiB2KTsKICAgCiAgaW5saW5lIHZvaWQg c3ViKGNvbnN0IFJlYWwzZCYgdSwgY29uc3QgUmVhbDNkJiB2KTsKICAgCiAgaW5saW5lIHZvaWQg Y3Jvc3MoY29uc3QgUmVhbDNkJiB1LCBjb25zdCBSZWFsM2QmIHYpOwogICAKICBpbmxpbmUgdm9p ZCBzY2FsZShyZWFsIHMpOwogICAKICBpbmxpbmUgdm9pZCBtYXgoY29uc3QgUmVhbDNkJiB1LCBj b25zdCBSZWFsM2QmIHYpOwogICAKICBpbmxpbmUgdm9pZCBtaW4oY29uc3QgUmVhbDNkJiB1LCBj b25zdCBSZWFsM2QmIHYpOwoKICAgCiAgaW5saW5lIHZvaWQgbGluY29tYihjb25zdCBSZWFsM2Qm IHUsIGNvbnN0IFJlYWwzZCYgdiwgCgkJICAgICAgcmVhbCBzY3UgPSAxLjAsIHJlYWwgc2N2ID0g MS4wKTsKICAgCiAgaW5saW5lIHZvaWQgbGluY29tYihjb25zdCBSZWFsM2QmIHUsIGNvbnN0IFJl YWwyZCYgdiwgCgkJICAgICAgcmVhbCBzY3UgPSAxLjAsIHJlYWwgc2N2ID0gMS4wKTsKICAgCiAg aW5saW5lIHZvaWQgbGluY29tYihjb25zdCBSZWFsMmQmIHUsIGNvbnN0IFJlYWwzZCYgdiwgCgkJ ICAgICAgcmVhbCBzY3UgPSAxLjAsIHJlYWwgc2N2ID0gMS4wKTsKICAgCiAgaW5saW5lIHZvaWQg bGluY29tYihjb25zdCBSZWFsMmQmIHUsIGNvbnN0IFJlYWwyZCYgdiwgCgkJICAgICAgcmVhbCBz Y3UgPSAxLjAsIHJlYWwgc2N2ID0gMS4wKTsKCiAgIAogIGlubGluZSByZWFsIGwyKCkgY29uc3Qg eyByZXR1cm4gc3FydChsMl8yKCkpOyB9CiAgIAogIGlubGluZSByZWFsIGwyXzIoKSBjb25zdDsK CiAgIAoKCgoKCiAgdm9pZCBybmQoY29uc3QgcmVhbCBwciA9IDEuMCk7CiAgCiAgIAogIGlubGlu ZSByZWFsIHgoKSBjb25zdCB7IHJldHVybiBzXy54OyB9CiAgIAogIGlubGluZSByZWFsIHkoKSBj b25zdCB7IHJldHVybiBzXy55OyB9CiAgIAogIGlubGluZSByZWFsIHooKSBjb25zdCB7IHJldHVy biBzXy56OyB9CgogICAKICBpbmxpbmUgb3N0cmVhbSYgd3JpdGUob3N0cmVhbSYgb3MpIGNvbnN0 IHsgCiAgICByZXR1cm4gb3Mud3JpdGUoKGNvbnN0IGNoYXIqKXZfLCAzICogc2l6ZW9mKHJlYWwp KTsgfQoKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVhbSYgb3MsIGNvbnN0IFJl YWwzZCYgeCk7Cn07CgogCgogCgpjbGFzcyBVbml0M2QgOiBwdWJsaWMgUmVhbDNkIHsKCiAgcmVh bCBsZW47CgpwdWJsaWM6CiAgVW5pdDNkKCkgOiBSZWFsM2QoKSB7IGxlbiA9IDAuMDsgfQogIGlu bGluZSBVbml0M2QocmVhbCB4LCByZWFsIHksIHJlYWwgeik7CiAgaW5saW5lIFVuaXQzZChjb25z dCBSZWFsM2QmIHUpOwoKICByZWFsIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbjsgfQp9OwoK IAoKIAoKY2xhc3MgUmVhbDJkIHsKICBmcmllbmQgY2xhc3MgUmVhbDNkOwogIGZyaWVuZCBjbGFz cyBSb3RhdGlvbjJkOwogIGZyaWVuZCBjbGFzcyBSb3RhdGlvbjNkOwoKICAgCiAgdW5pb24gewog ICAgIAogICAgc3RydWN0IHsgCiAgICAgICAKICAgICAgcmVhbCB4OwogICAgICAgCiAgICAgIHJl YWwgeTsgfSBzXzsKICAgICAKICAgIHJlYWwgdl9bMl07CiAgfTsKCiBwdWJsaWM6CiAgIAogIFJl YWwyZCgpIHsgc18ueCA9IHNfLnkgPSAwOyB9CgogICAKCgoKCiAgUmVhbDJkKHJlYWwgeCwgcmVh bCB5KSB7IHNfLnggPSB4OyBzXy55ID0geTsgfQoKICAgCiAgUmVhbDJkKGNvbnN0IFJlYWwyZCYg dSkgeyBzXy54ID0gdS5zXy54OyBzXy55ID0gdS5zXy55OyB9CgogICAKCgoKICBSZWFsMmQoY29u c3QgUmVhbDNkJiB1KSB7IHNfLnggPSB1LnNfLng7IHNfLnkgPSB1LnNfLnk7IH0KCiAgIAoKCgoK CiAgUmVhbDJkKHVuc2lnbmVkIGNoYXIgKnBnbSwgcmVhbCB4LCByZWFsIHkpIHsgcHJvY2Vzcyhw Z20sIHgsIHksIDAuMCwgdl8pOyB9CgogICAKICBpbmxpbmUgUmVhbDJkICBvcGVyYXRvciAtKCkg Y29uc3Q7CgogICAKICBpbmxpbmUgUmVhbDJkICBvcGVyYXRvciArKGNvbnN0IFJlYWwyZCYgdSkg Y29uc3Q7CiAgIAogIGlubGluZSBSZWFsM2QgIG9wZXJhdG9yICsoY29uc3QgUmVhbDNkJiB1KSBj b25zdDsKCiAgIAogIGlubGluZSBSZWFsMmQgIG9wZXJhdG9yIC0oY29uc3QgUmVhbDJkJiB1KSBj b25zdDsKICAgCiAgaW5saW5lIFJlYWwzZCAgb3BlcmF0b3IgLShjb25zdCBSZWFsM2QmIHUpIGNv bnN0OwoKICAgCiAgaW5saW5lIHJlYWwgICAgb3BlcmF0b3IgKihjb25zdCBSZWFsMmQmIHUpIGNv bnN0OwoKICAgCgoKICBpbmxpbmUgcmVhbCAgICBvcGVyYXRvciBeKGNvbnN0IFJlYWwyZCYgdSkg Y29uc3Q7CgogICAKICBpbmxpbmUgUmVhbDJkJiBvcGVyYXRvciA9KGNvbnN0IFJlYWwzZCYgdSk7 CiAgIAogIGlubGluZSBSZWFsMmQmIG9wZXJhdG9yICs9KGNvbnN0IFJlYWwyZCYgdSk7CiAgIAog IGlubGluZSBSZWFsMmQmIG9wZXJhdG9yICo9KGRvdWJsZSB1KTsKCiAgIAogIGlubGluZSB2b2lk IGFkZChjb25zdCBSZWFsMmQmIHYsIGNvbnN0IFJlYWwyZCYgdyk7CiAgIAogIGlubGluZSB2b2lk IG9ydGhvKGNvbnN0IFJlYWwyZCYgdSk7CiAgIAogIGlubGluZSB2b2lkIHNjYWxlKHJlYWwgcyk7 CgogICAKICBpbmxpbmUgdm9pZCBtYXgoY29uc3QgUmVhbDJkJiB1LCBjb25zdCBSZWFsMmQmIHYp OwoKICAgCiAgaW5saW5lIHZvaWQgbWluKGNvbnN0IFJlYWwyZCYgdSwgY29uc3QgUmVhbDJkJiB2 KTsKCiAgIAogIGlubGluZSByZWFsIGwyKCkgY29uc3QgeyByZXR1cm4gc3FydChsMl8yKCkpOyB9 CgogICAKICBpbmxpbmUgcmVhbCBsMl8yKCkgY29uc3Q7CgogICAKICBpbmxpbmUgcmVhbCBwcm9k KGNvbnN0IFJlYWwyZCYgdSkgY29uc3Q7CiAgIAogIGlubGluZSByZWFsIHByb2RvcnRobyhjb25z dCBSZWFsMmQmIHUpIGNvbnN0OwoKICAgCgoKICBpbmxpbmUgdm9pZCBsaW5jb21iKGNvbnN0IFJl YWwyZCYgdSwgY29uc3QgUmVhbDJkJiB2LCByZWFsIHNjdSA9IDEuMCwgCgkJICAgICAgcmVhbCBz Y3YgPSAxLjApOwogICAKCgoKCgogIGlubGluZSB2b2lkIHJuZChjb25zdCByZWFsIHByID0gMS4w KTsKICAKICAgCiAgaW5saW5lIHJlYWwgeCgpIGNvbnN0IHsgcmV0dXJuIHNfLng7IH0KCiAgIAog IGlubGluZSByZWFsIHkoKSBjb25zdCB7IHJldHVybiBzXy55OyB9CgogIGZyaWVuZCBvc3RyZWFt JiBvcGVyYXRvciA8PChvc3RyZWFtJiBvcywgY29uc3QgUmVhbDJkJiB4KTsKfTsKCiAKCiAKCmNs YXNzIFVuaXQyZCA6IHB1YmxpYyBSZWFsMmQgewoKICByZWFsIGxlbjsKCiBwdWJsaWM6CiAgVW5p dDJkKCkgOiBSZWFsMmQoKSB7IGxlbiA9IDAuMDsgfQogIGlubGluZSBVbml0MmQocmVhbCB4LCBy ZWFsIHkpOwogIGlubGluZSBVbml0MmQoY29uc3QgUmVhbDJkJiB1KTsKCiAgcmVhbCBsZW5ndGgo KSBjb25zdCB7IHJldHVybiBsZW47IH0KfTsKCiAKCiAKCmlubGluZSB2b2lkIFJvdGF0aW9uM2Q6 Om1hcChSZWFsM2QgdSwgUmVhbDNkKiB2KSBjb25zdCB7CiAKICB2LT5zXy54ID0geHggKiB1LnNf LnggKyB4eSAqIHUuc18ueSArIHh6ICogdS5zXy56OwogIHYtPnNfLnkgPSB5eCAqIHUuc18ueCAr IHl5ICogdS5zXy55ICsgeXogKiB1LnNfLno7CiAgdi0+c18ueiA9IHp4ICogdS5zXy54ICsgenkg KiB1LnNfLnkgKyB6eiAqIHUuc18uejsKfQogIAppbmxpbmUgdm9pZCBSb3RhdGlvbjNkOjptYXAo UmVhbDNkIHUsIFJlYWwyZCogdikgY29uc3QgewoKICB2LT5zXy54ID0geHggKiB1LnNfLnggKyB4 eSAqIHUuc18ueSArIHh6ICogdS5zXy56OwogIHYtPnNfLnkgPSB5eCAqIHUuc18ueCArIHl5ICog dS5zXy55ICsgeXogKiB1LnNfLno7Cn0KICAKaW5saW5lIHJlYWwgUm90YXRpb24zZDo6ZGV0ZXJt aW5hbnQoKSBjb25zdCB7CgogIHJldHVybiB4eCp5eSp6eiArIHh5Knl6Knp4ICsgeHoqeXgqenkg LSB6eCp5eSp4eiAtIHp5Knl6Knh4IC0genoqeXgqeHk7Cn0KCiAKCmlubGluZSBSb3RhdGlvbjJk OjpSb3RhdGlvbjJkKGNvbnN0IFVuaXQyZCYgbikgewoKICB4eCA9IG4uc18ueTsgeHkgPSAtbi5z Xy54OyB5eCA9IG4uc18ueDsgeXkgPSBuLnNfLnk7Cn0KCmlubGluZSBSb3RhdGlvbjJkOjpSb3Rh dGlvbjJkKGNvbnN0IFJlYWwyZCYgb25lLCBjb25zdCBSZWFsMmQmIHR3bykgewoKICB4eCA9IG9u ZS54KCk7IHh5ID0gdHdvLngoKTsgeXggPSBvbmUueSgpOyB5eSA9IHR3by55KCk7Cn0KCmlubGlu ZSB2b2lkIFJvdGF0aW9uMmQ6Om1hcChSZWFsMmQgdSwgUmVhbDJkKiB2KSBjb25zdCB7CgogIHYt PnNfLnggPSB4eCAqIHUuc18ueCArIHh5ICogdS5zXy55OwogIHYtPnNfLnkgPSB5eCAqIHUuc18u eCArIHl5ICogdS5zXy55Owp9CgppbmxpbmUgdm9pZCBSb3RhdGlvbjJkOjptYXAoUmVhbDJkIHUs IFJlYWwzZCogdikgY29uc3QgewoKICB2LT5zXy54ID0geHggKiB1LnNfLnggKyB4eSAqIHUuc18u eTsKICB2LT5zXy55ID0geXggKiB1LnNfLnggKyB5eSAqIHUuc18ueTsKICB2LT5zXy56ID0gMDsK fQoKaW5saW5lIHZvaWQgUm90YXRpb24yZDo6bWFwKFJlYWwzZCB1LCBSZWFsM2QqIHYpIGNvbnN0 IHsKCiAgdi0+c18ueCA9IHh4ICogdS5zXy54ICsgeHkgKiB1LnNfLnk7CiAgdi0+c18ueSA9IHl4 ICogdS5zXy54ICsgeXkgKiB1LnNfLnk7CiAgdi0+c18ueiA9IHUuc18uejsKfQoKaW5saW5lIFJv dGF0aW9uMmQgUm90YXRpb24yZDo6dHJhbnNwb3NlKCkgY29uc3QgewoKICBSb3RhdGlvbjJkIHJl czsKICByZXMueHggPSB4eDsKICByZXMueXkgPSB5eTsKICByZXMueHkgPSB5eDsKICByZXMueXgg PSB4eTsKICByZXR1cm4gcmVzOwp9CgppbmxpbmUgcmVhbCBSb3RhdGlvbjJkOjpkZXRlcm1pbmFu dCgpIGNvbnN0IHsKCiAgcmV0dXJuIHh4Knl5LXh5Knl4Owp9CgppbmxpbmUgUm90YXRpb24yZCBS b3RhdGlvbjJkOjppbnZlcnNlKCkgY29uc3QgewoKICByZWFsIGZhY3QgPSBkZXRlcm1pbmFudCgp OwogIFJvdGF0aW9uMmQgcmVzOwogIHJlcy54eCA9IHl5L2ZhY3Q7CiAgcmVzLnl5ID0geHgvZmFj dDsKICByZXMueHkgPSAteHkvZmFjdDsKICByZXMueXggPSAteXgvZmFjdDsKCiAgcmV0dXJuIHJl czsKfQoKaW5saW5lIFJvdGF0aW9uMmQgUm90YXRpb24yZDo6b3BlcmF0b3IqIChjb25zdCBSb3Rh dGlvbjJkJiB0d28pIGNvbnN0IHsKCiAgUm90YXRpb24yZCByZXM7CiAgcmVzLnh4ID0geHgqdHdv Lnh4K3h5KnR3by55eDsKICByZXMueHkgPSB4eCp0d28ueHkreHkqdHdvLnl5OwogIHJlcy55eCA9 IHl4KnR3by54eCt5eSp0d28ueXg7CiAgcmVzLnl5ID0geXgqdHdvLnh5K3l5KnR3by55eTsKICBy ZXR1cm4gcmVzOwp9CgppbmxpbmUgUmVhbDJkIFJvdGF0aW9uMmQ6Om9wZXJhdG9yKiAoY29uc3Qg UmVhbDJkJiB2KSBjb25zdCB7CgogIFJlYWwyZCByZXM7CiAgcmVzLnNfLnggPSB4eCAqIHYuc18u eCArIHh5ICogdi5zXy55OwogIHJlcy5zXy55ID0geXggKiB2LnNfLnggKyB5eSAqIHYuc18ueTsK ICByZXR1cm4gcmVzOwp9CgogCgppbmxpbmUgUmVhbDNkOjpSZWFsM2QoY29uc3QgUmVhbDJkJiB4 KSB7IAoKICBzXy54ID0geC5zXy54OyBzXy55ID0geC5zXy55OyBzXy56ID0gMC4wOyAKfQoKaW5s aW5lIFJlYWwzZCBSZWFsM2Q6Om9wZXJhdG9yIC0oKSBjb25zdCB7CgogIHJldHVybiBSZWFsM2Qo LXNfLngsIC1zXy55LCAtc18ueik7Cn0KCmlubGluZSBSZWFsM2QgUmVhbDNkOjpvcGVyYXRvciAr KGNvbnN0IFJlYWwzZCYgdSkgY29uc3QgewoKICByZXR1cm4gUmVhbDNkKHNfLnggKyB1LnNfLngs IHNfLnkgKyB1LnNfLnksIHNfLnogKyB1LnNfLnopOwp9CgppbmxpbmUgUmVhbDNkIFJlYWwzZDo6 b3BlcmF0b3IgLShjb25zdCBSZWFsM2QmIHUpIGNvbnN0IHsKCiAgcmV0dXJuIFJlYWwzZChzXy54 IC0gdS5zXy54LCBzXy55IC0gdS5zXy55LCBzXy56IC0gdS5zXy56KTsKfQoKaW5saW5lIHJlYWwg UmVhbDNkOjpvcGVyYXRvciAqKGNvbnN0IFJlYWwzZCYgdSkgY29uc3QgewoKICByZXR1cm4gc18u eCAqIHUuc18ueCArIHNfLnkgKiB1LnNfLnkgKyBzXy56ICogdS5zXy56Owp9CgppbmxpbmUgUmVh bDNkIFJlYWwzZDo6b3BlcmF0b3IgKihjb25zdCByZWFsIHMpIGNvbnN0IHsKCiAgUmVhbDNkIHgo KnRoaXMpOwogIHguc2NhbGUocyk7CiAgcmV0dXJuIHg7Cn0KCmlubGluZSBSZWFsM2QgUmVhbDNk OjpvcGVyYXRvciAlKGNvbnN0IFJlYWwzZCYgdSkgY29uc3QgewoKICByZXR1cm4gUmVhbDNkKHNf LnkgKiB1LnNfLnogLSBzXy56ICogdS5zXy55LCBzXy56ICogdS5zXy54IC0gc18ueCAqIHUuc18u eiwKCQlzXy54ICogdS5zXy55IC0gc18ueSAqIHUuc18ueCk7Cn0KCmlubGluZSBSZWFsM2QmIFJl YWwzZDo6b3BlcmF0b3IgKz0oY29uc3QgUmVhbDNkJiB1KSB7CgogIHNfLnggKz0gdS5zXy54OyBz Xy55ICs9IHUuc18ueTsgc18ueiArPSB1LnNfLno7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUg UmVhbDNkJiBSZWFsM2Q6Om9wZXJhdG9yICs9KGNvbnN0IFJlYWwyZCYgdSkgewoKICBzXy54ICs9 IHUuc18ueDsgc18ueSArPSB1LnNfLnk7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgUmVhbDNk JiBSZWFsM2Q6Om9wZXJhdG9yIC09KGNvbnN0IFJlYWwzZCYgdSkgewoKICBzXy54IC09IHUuc18u eDsgc18ueSAtPSB1LnNfLnk7IHNfLnogLT0gdS5zXy56OwogIHJldHVybiAqdGhpczsKfQoKaW5s aW5lIFJlYWwzZCYgUmVhbDNkOjpvcGVyYXRvciAtPShjb25zdCBSZWFsMmQmIHUpIHsKCiAgc18u eCAtPSB1LnNfLng7IHNfLnkgLT0gdS5zXy55OwogIHJldHVybiAqdGhpczsKfQoKaW5saW5lIFJl YWwzZCYgUmVhbDNkOjpvcGVyYXRvciAqPShkb3VibGUgdSkgewoKICBzXy54ICo9IHU7IHNfLnkg Kj0gdTsgc18ueiAqPSB1OwogIHJldHVybiAqdGhpczsKfQoKaW5saW5lIHZvaWQgUmVhbDNkOjph ZGQoY29uc3QgUmVhbDNkJiB1LCBjb25zdCBSZWFsM2QmIHcpIHsKCiAgc18ueCA9IHUuc18ueCAr IHcuc18ueDsKICBzXy55ID0gdS5zXy55ICsgdy5zXy55OwogIHNfLnogPSB1LnNfLnogKyB3LnNf Lno7IAp9CgppbmxpbmUgdm9pZCBSZWFsM2Q6OnN1Yihjb25zdCBSZWFsM2QmIHUsIGNvbnN0IFJl YWwzZCYgdykgewoKICBzXy54ID0gdS5zXy54IC0gdy5zXy54OwogIHNfLnkgPSB1LnNfLnkgLSB3 LnNfLnk7CiAgc18ueiA9IHUuc18ueiAtIHcuc18uejsgCn0KCmlubGluZSB2b2lkIFJlYWwzZDo6 Y3Jvc3MoY29uc3QgUmVhbDNkJiB1LCBjb25zdCBSZWFsM2QmIHcpIHsKCiAgc18ueCA9IHUuc18u eSAqIHcuc18ueiAtIHUuc18ueiAqIHcuc18ueTsKICBzXy55ID0gdS5zXy56ICogdy5zXy54IC0g dS5zXy54ICogdy5zXy56OwogIHNfLnogPSB1LnNfLnggKiB3LnNfLnkgLSB1LnNfLnkgKiB3LnNf Lng7Cn0KCmlubGluZSB2b2lkIFJlYWwzZDo6c2NhbGUocmVhbCBzYykgewoKICBzXy54ICo9IHNj OyBzXy55ICo9IHNjOyBzXy56ICo9IHNjOwp9CgppbmxpbmUgdm9pZCBSZWFsM2Q6Om1pbihjb25z dCBSZWFsM2QmIHUsIGNvbnN0IFJlYWwzZCYgdikgewoKICBzXy54ID0gdS5zXy54IDwgdi5zXy54 ID8gdS5zXy54IDogdi5zXy54OwogIHNfLnkgPSB1LnNfLnkgPCB2LnNfLnkgPyB1LnNfLnkgOiB2 LnNfLnk7CiAgc18ueiA9IHUuc18ueiA8IHYuc18ueiA/IHUuc18ueiA6IHYuc18uejsKfQoKaW5s aW5lIHZvaWQgUmVhbDNkOjptYXgoY29uc3QgUmVhbDNkJiB1LCBjb25zdCBSZWFsM2QmIHYpIHsK CiAgc18ueCA9IHUuc18ueCA+IHYuc18ueCA/IHUuc18ueCA6IHYuc18ueDsKICBzXy55ID0gdS5z Xy55ID4gdi5zXy55ID8gdS5zXy55IDogdi5zXy55OwogIHNfLnogPSB1LnNfLnogPiB2LnNfLnog PyB1LnNfLnogOiB2LnNfLno7Cn0KCmlubGluZSB2b2lkIFJlYWwzZDo6bGluY29tYihjb25zdCBS ZWFsM2QmIHUsIGNvbnN0IFJlYWwzZCYgdywgCgkJCSAgICByZWFsIHNjdSwgcmVhbCBzY3cpIHsK CiAgc18ueCA9IHNjdSAqIHUuc18ueCArIHNjdyAqIHcuc18ueDsKICBzXy55ID0gc2N1ICogdS5z Xy55ICsgc2N3ICogdy5zXy55OwogIHNfLnogPSBzY3UgKiB1LnNfLnogKyBzY3cgKiB3LnNfLno7 Cn0KIAppbmxpbmUgdm9pZCBSZWFsM2Q6OmxpbmNvbWIoY29uc3QgUmVhbDNkJiB1LCBjb25zdCBS ZWFsMmQmIHcsIAoJCQkgICAgcmVhbCBzY3UsIHJlYWwgc2N3KSB7CgogIHNfLnggPSBzY3UgKiB1 LnNfLnggKyBzY3cgKiB3LnNfLng7CiAgc18ueSA9IHNjdSAqIHUuc18ueSArIHNjdyAqIHcuc18u eTsKICBzXy56ID0gc2N1ICogdS5zXy56Owp9CiAKaW5saW5lIHZvaWQgUmVhbDNkOjpsaW5jb21i KGNvbnN0IFJlYWwyZCYgdSwgY29uc3QgUmVhbDNkJiB3LCAKCQkJICAgIHJlYWwgc2N1LCByZWFs IHNjdykgewoKICBzXy54ID0gc2N1ICogdS5zXy54ICsgc2N3ICogdy5zXy54OwogIHNfLnkgPSBz Y3UgKiB1LnNfLnkgKyBzY3cgKiB3LnNfLnk7CiAgc18ueiA9IHNjdyAqIHcuc18uejsKfQogCmlu bGluZSB2b2lkIFJlYWwzZDo6bGluY29tYihjb25zdCBSZWFsMmQmIHUsIGNvbnN0IFJlYWwyZCYg dywgCgkJCSAgICByZWFsIHNjdSwgcmVhbCBzY3cpIHsKCiAgc18ueCA9IHNjdSAqIHUuc18ueCAr IHNjdyAqIHcuc18ueDsKICBzXy55ID0gc2N1ICogdS5zXy55ICsgc2N3ICogdy5zXy55OwogIHNf LnogPSAwLjA7Cn0KIAppbmxpbmUgcmVhbCBSZWFsM2Q6OmwyXzIoKSBjb25zdCB7CgogIHJldHVy biBzXy54ICogc18ueCArIHNfLnkgKiBzXy55ICsgc18ueiAqIHNfLno7Cn0KCmlubGluZSB2b2lk IFJlYWwzZDo6cm5kKGNvbnN0IHJlYWwgcHJlYykgewoKICBzXy54ID0gZmxvb3Ioc18ueCAvIHBy ZWMgKyAwLjUpICogcHJlYzsKICBzXy55ID0gZmxvb3Ioc18ueSAvIHByZWMgKyAwLjUpICogcHJl YzsKICBzXy56ID0gZmxvb3Ioc18ueiAvIHByZWMgKyAwLjUpICogcHJlYzsKfQoKIAoKaW5saW5l IFVuaXQzZDo6VW5pdDNkKHJlYWwgeCwgcmVhbCB5LCByZWFsIHopIDogUmVhbDNkKHgsIHksIHop IHsKCiAgbGVuID0gbDIoKTsgc2NhbGUoMS4wIC8gbGVuKTsKfQoKaW5saW5lIFVuaXQzZDo6VW5p dDNkKGNvbnN0IFJlYWwzZCYgdSkgOiBSZWFsM2QodSkgewoKICBsZW4gPSBsMigpOyBzY2FsZSgx LjAgLyBsZW4pOwp9CgogCgppbmxpbmUgUmVhbDJkIFJlYWwyZDo6b3BlcmF0b3IgLSgpIGNvbnN0 IHsKCiAgcmV0dXJuIFJlYWwyZCgtc18ueCwgLXNfLnkpOwp9CgppbmxpbmUgUmVhbDJkIFJlYWwy ZDo6b3BlcmF0b3IgKyhjb25zdCBSZWFsMmQmIHUpIGNvbnN0IHsKCiAgcmV0dXJuIFJlYWwyZChz Xy54ICsgdS5zXy54LCBzXy55ICsgdS5zXy55KTsKfQoKaW5saW5lIFJlYWwzZCBSZWFsMmQ6Om9w ZXJhdG9yICsoY29uc3QgUmVhbDNkJiB1KSBjb25zdCB7CgogIHJldHVybiBSZWFsM2Qoc18ueCAr IHUuc18ueCwgc18ueSArIHUuc18ueSwgdS5zXy56KTsKfQoKaW5saW5lIFJlYWwyZCBSZWFsMmQ6 Om9wZXJhdG9yIC0oY29uc3QgUmVhbDJkJiB1KSBjb25zdCB7CgogIHJldHVybiBSZWFsMmQoc18u eCAtIHUuc18ueCwgc18ueSAtIHUuc18ueSk7Cn0KCmlubGluZSBSZWFsM2QgUmVhbDJkOjpvcGVy YXRvciAtKGNvbnN0IFJlYWwzZCYgdSkgY29uc3QgewoKICByZXR1cm4gUmVhbDNkKHNfLnggLSB1 LnNfLngsIHNfLnkgLSB1LnNfLnksIC11LnNfLnopOwp9CgppbmxpbmUgcmVhbCBSZWFsMmQ6Om9w ZXJhdG9yICooY29uc3QgUmVhbDJkJiB1KSBjb25zdCB7CgogIHJldHVybiBzXy54ICogdS5zXy54 ICsgc18ueSAqIHUuc18ueTsKfQoKaW5saW5lIHJlYWwgUmVhbDJkOjpvcGVyYXRvciBeKGNvbnN0 IFJlYWwyZCYgdSkgY29uc3QgewoKICByZXR1cm4gc18ueCAqIHUuc18ueSAtIHNfLnkgKiB1LnNf Lng7Cn0KCmlubGluZSBSZWFsMmQmIFJlYWwyZDo6b3BlcmF0b3IgPShjb25zdCBSZWFsM2QmIHUp IHsgCgogIHNfLnggPSB1LnNfLng7IHNfLnkgPSB1LnNfLnk7CiAgcmV0dXJuICp0aGlzOwp9Cgpp bmxpbmUgUmVhbDJkJiBSZWFsMmQ6Om9wZXJhdG9yICs9KGNvbnN0IFJlYWwyZCYgdSkgewoKICBz Xy54ICs9IHUuc18ueDsgc18ueSArPSB1LnNfLnk7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUg UmVhbDJkJiBSZWFsMmQ6Om9wZXJhdG9yICo9KGRvdWJsZSB1KSB7CgogIHNfLnggKj0gdTsgc18u eSAqPSB1OwogIHJldHVybiAqdGhpczsKfQoKaW5saW5lIHZvaWQgUmVhbDJkOjphZGQoY29uc3Qg UmVhbDJkJiB1LCBjb25zdCBSZWFsMmQmIHcpIHsKCiAgc18ueCA9IHUuc18ueCArIHcuc18ueDsK ICBzXy55ID0gdS5zXy55ICsgdy5zXy55Owp9CgppbmxpbmUgdm9pZCBSZWFsMmQ6Om9ydGhvKGNv bnN0IFJlYWwyZCYgdSkgewoKICBzXy54ID0gdS5zXy55OwogIHNfLnkgPSAtdS5zXy54Owp9Cgpp bmxpbmUgdm9pZCBSZWFsMmQ6OnNjYWxlKHJlYWwgc2MpIHsKCiAgc18ueCAqPSBzYzsgc18ueSAq PSBzYzsKfQoKaW5saW5lIHZvaWQgUmVhbDJkOjptaW4oY29uc3QgUmVhbDJkJiB1LCBjb25zdCBS ZWFsMmQmIHYpIHsKCiAgc18ueCA9IHUuc18ueCA8IHYuc18ueCA/IHUuc18ueCA6IHYuc18ueDsK ICBzXy55ID0gdS5zXy55IDwgdi5zXy55ID8gdS5zXy55IDogdi5zXy55Owp9CgppbmxpbmUgdm9p ZCBSZWFsMmQ6Om1heChjb25zdCBSZWFsMmQmIHUsIGNvbnN0IFJlYWwyZCYgdikgewoKICBzXy54 ID0gdS5zXy54ID4gdi5zXy54ID8gdS5zXy54IDogdi5zXy54OwogIHNfLnkgPSB1LnNfLnkgPiB2 LnNfLnkgPyB1LnNfLnkgOiB2LnNfLnk7Cn0KCmlubGluZSByZWFsIFJlYWwyZDo6bDJfMigpIGNv bnN0IHsKCiAgcmV0dXJuIHNfLnggKiBzXy54ICsgc18ueSAqIHNfLnk7Cn0KCmlubGluZSByZWFs IFJlYWwyZDo6cHJvZChjb25zdCBSZWFsMmQmIHUpIGNvbnN0IHsKCiAgcmV0dXJuIHNfLnggKiB1 LnNfLnggKyBzXy55ICogdS5zXy55Owp9CgppbmxpbmUgcmVhbCBSZWFsMmQ6OnByb2RvcnRobyhj b25zdCBSZWFsMmQmIHUpIGNvbnN0IHsKCiAgcmV0dXJuIHNfLnggKiB1LnNfLnkgLSBzXy55ICog dS5zXy54Owp9CgppbmxpbmUgdm9pZCBSZWFsMmQ6OmxpbmNvbWIoY29uc3QgUmVhbDJkJiB1LCBj b25zdCBSZWFsMmQmIHcsCgkJCSAgICByZWFsIHNjdSwgcmVhbCBzY3cpIHsKCiAgc18ueCA9IHNj dSAqIHUuc18ueCArIHNjdyAqIHcuc18ueDsKICBzXy55ID0gc2N1ICogdS5zXy55ICsgc2N3ICog dy5zXy55Owp9CiAKaW5saW5lIHZvaWQgUmVhbDJkOjpybmQoY29uc3QgcmVhbCBwcmVjKSB7Cgog IHNfLnggPSBmbG9vcihzXy54IC8gcHJlYyArIDAuNSkgKiBwcmVjOwogIHNfLnkgPSBmbG9vcihz Xy55IC8gcHJlYyArIDAuNSkgKiBwcmVjOwp9CgogCgppbmxpbmUgVW5pdDJkOjpVbml0MmQocmVh bCB4LCByZWFsIHkpIDogUmVhbDJkKHgsIHkpIHsKCiAgbGVuID0gbDIoKTsgc2NhbGUoMS4wIC8g bGVuKTsKfQoKaW5saW5lIFVuaXQyZDo6VW5pdDJkKGNvbnN0IFJlYWwyZCYgdSkgOiBSZWFsMmQo dSkgewoKICBsZW4gPSBsMigpOyBzY2FsZSgxLjAgLyBsZW4pOwp9CgoKIyAxNSAiLi4vZnVuY3Rp b24vZm5jRnVuY3Rpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9zcGFjZS9zcGNFbGVtZW50 LmgiIDEKIAoKCgoKCgoKCiAgI3ByYWdtYSBpbnRlcmZhY2UgCgoKCgojIDEgIi4uL2Z1bmN0aW9u Ly4uL3NwYWNlLy4uL2dlb21ldHJ5L2dlb0NlbGwuaCIgMQogCgoKCgoKCgojIDEgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tZW1v cnkiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMSAzCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgi IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAoKCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCiAKCiAKIAogCiAKIAogCiAKCgoK CgoKCgojIDE0OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9jb25maWcuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgogICAg ICAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjM0ICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rs X2NvbmZpZy5oIiAzCgoKIyAyNDggIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDMKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAogCgoKCgoKCgoKCgoKCgoKCgoKCiAKIAojIDMxNiAi L3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9jb25maWcuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiAKIAogCiMgMzYgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKCiMgMSAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9yZWxv cHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKIAoKdGVtcGxhdGUg PGNsYXNzIF9UcD4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfVHAmIF9feCwgY29uc3Qg X1RwJiBfX3kpIHsKICByZXR1cm4gIShfX3ggPT0gX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9U cD4KaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkg ewogIHJldHVybiBfX3kgPCBfX3g7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBib29s IG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSB7CiAgcmV0dXJuICEo X195IDwgX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KaW5saW5lIGJvb2wgb3BlcmF0b3I+ PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIHsKICByZXR1cm4gIShfX3ggPCBfX3kp Owp9CgogCgoKCiAKIAogCiMgMzkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKCiMgMSAiL3Vz ci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0z L3N0bF9wYWlyLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCnRl bXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4Kc3RydWN0IHBhaXIgewogIHR5cGVkZWYgX1Qx IGZpcnN0X3R5cGU7CiAgdHlwZWRlZiBfVDIgc2Vjb25kX3R5cGU7CgogIF9UMSBmaXJzdDsKICBf VDIgc2Vjb25kOwogIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7fQogIHBh aXIoY29uc3QgX1QxJiBfX2EsIGNvbnN0IF9UMiYgX19iKSA6IGZpcnN0KF9fYSksIHNlY29uZChf X2IpIHt9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CiAgcGFpcihjb25zdCBw YWlyPF9VMSwgX1UyPiYgX19wKSA6IGZpcnN0KF9fcC5maXJzdCksIHNlY29uZChfX3Auc2Vjb25k KSB7fQoKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5lIGJvb2wgb3Bl cmF0b3I9PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYg X195KQp7IAogIHJldHVybiBfX3guZmlyc3QgPT0gX195LmZpcnN0ICYmIF9feC5zZWNvbmQgPT0g X195LnNlY29uZDsgCn0KCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5lIGJv b2wgb3BlcmF0b3I8KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBf VDI+JiBfX3kpCnsgCiAgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdCB8fCAKICAgICAgICAg KCEoX195LmZpcnN0IDwgX194LmZpcnN0KSAmJiBfX3guc2Vjb25kIDwgX195LnNlY29uZCk7IAp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CmlubGluZSBwYWlyPF9UMSwgX1QyPiBt YWtlX3BhaXIoY29uc3QgX1QxJiBfX3gsIGNvbnN0IF9UMiYgX195KQp7CiAgcmV0dXJuIHBhaXI8 X1QxLCBfVDI+KF9feCwgX195KTsKfQoKIAoKCgogCiAKIAojIDQyICIvdXNyL2xpYi9nY2MtbGli L2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNl LmgiIDIgMwoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4v Li4vLi4vaW5jbHVkZS9nKystMy90eXBlX3RyYWl0cy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgX190cnVlX3R5cGUg ewp9OwoKc3RydWN0IF9fZmFsc2VfdHlwZSB7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1 Y3QgX190eXBlX3RyYWl0cyB7IAogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgICB0aGlzX2R1bW15 X21lbWJlcl9tdXN0X2JlX2ZpcnN0OwogICAgICAgICAgICAgICAgICAgIAoKCgoKCiAgICAKCgoK CgoKCgogCgogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2Nv bnN0cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2Nv bnN0cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25t ZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0 cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCgoKIAog CiAKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8Ym9vbD4gewogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVf dHJhaXRzPGNoYXI+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZh dWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Nv cHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNz aWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9k ZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVt cGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8c2lnbmVkIGNoYXI+IHsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFp dHM8dW5zaWduZWQgY2hhcj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07 CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPHdjaGFyX3Q+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBl X3RyYWl0czxzaG9ydD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rl ZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf Y29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9h c3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0 ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25lZCBzaG9ydD4gewogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBl X3RyYWl0czxpbnQ+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZh dWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Nv cHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNz aWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9k ZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVt cGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8dW5zaWduZWQgaW50PiB7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0 X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlf Y29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdu bWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0 cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxh dGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8dW5zaWduZWQgbG9uZz4gewogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVl X3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPGxvbmcgbG9uZz4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rl ZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf Y29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9h c3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0 ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25lZCBsb25nIGxvbmc+IHsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwog ICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsK ICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3Qg X190eXBlX3RyYWl0czxmbG9hdD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190 cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7 Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxkb3VibGU+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90 cmFpdHM8bG9uZyBkb3VibGU+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9 OwoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX190eXBlX3RyYWl0czxfVHAqPiB7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsK ICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwog ICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7 CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCiMgMjk1ICIvdXNyL2xpYi9nY2Mt bGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdHlwZV90cmFp dHMuaCIgMwoKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBfSXNfaW50ZWdlciB7 CiAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX0ludGVncmFsOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1 Y3QgX0lzX2ludGVnZXI8Ym9vbD4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9 OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8Y2hhcj4gewogIHR5cGVkZWYgX190 cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPHNp Z25lZCBjaGFyPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0 ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5zaWduZWQgY2hhcj4gewogIHR5cGVkZWYgX190cnVl X3R5cGUgX0ludGVncmFsOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8d2No YXJfdD4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKCgp0ZW1wbGF0ZTw+ ICBzdHJ1Y3QgX0lzX2ludGVnZXI8c2hvcnQ+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRl Z3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjx1bnNpZ25lZCBzaG9ydD4g ewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0 IF9Jc19pbnRlZ2VyPGludD4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoK dGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPHVuc2lnbmVkIGludD4gewogIHR5cGVkZWYg X190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2Vy PGxvbmc+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4g IHN0cnVjdCBfSXNfaW50ZWdlcjx1bnNpZ25lZCBsb25nPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlw ZSBfSW50ZWdyYWw7Cn07CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxsb25nIGxv bmc+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0 cnVjdCBfSXNfaW50ZWdlcjx1bnNpZ25lZCBsb25nIGxvbmc+IHsKICB0eXBlZGVmIF9fdHJ1ZV90 eXBlIF9JbnRlZ3JhbDsKfTsKCgoKCgogCiAKIAojIDQ1ICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIg MwoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvbGlt aXRzLmgiIDEgMwogCgoKIAoKCgoKCiAKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgv Mi45NS4yL2luY2x1ZGUvc3lzbGltaXRzLmgiIDEgMwogCgoKCgoKIyAxICIvdXNyL2xpYi9nY2Mt bGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvbGltaXRzLmgiIDEgMwogCgoKIAoKIyAxMTQg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9saW1pdHMuaCIgMwoK CgojIDEgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKCgoKCiAKCgoKCgogCgojIDExMyAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAzCgoKCgogIAoK CgoKIyAxNDAgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMwoKCgogCiMgMSAiL3Vzci9pbmNsdWRl L2JpdHMvcG9zaXgxX2xpbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKIAoK IAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgoKIAoKCiAKCgogCgoKIAoKCiAKCgoKIAoK CiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKCiAKCgogCgoKIAoK CiAKCgogCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9sb2NhbF9saW0uaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvbGludXgv bGltaXRzLmgiIDEgMwoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzNiAiL3Vzci9pbmNsdWRlL2JpdHMv bG9jYWxfbGltLmgiIDIgMwoKCiAKCgoKCiAKCgoKCiAKCgoKCgogCgogCgoKIAoKIAoKCiAKCiAK CgogCgoKCiAKCgogCgojIDEyNiAiL3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgxX2xpbS5oIiAyIDMK CgoKCgoKCgogCgoKCgoKCgojIDE0NCAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKCgoKCiMg MSAiL3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgyX2xpbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCiAKCgogCgoKIAoKCiAKCgogCgoKCgogCgoKCiAKCgogCgoKCiAKCgoKCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKIyAxNDggIi91c3IvaW5jbHVkZS9saW1p dHMuaCIgMiAzCgoKCgoKCiMgMTE3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y L2luY2x1ZGUvbGltaXRzLmgiIDIgMwoKCgoKIyA3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yL2luY2x1ZGUvc3lzbGltaXRzLmgiIDIgMwoKCiMgMTEgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9saW1pdHMuaCIgMiAzCgoKCgoKIAoKCgogCgoK CiAKCgoKCiAKCgoKCgogCgoKCiAKCgoKCgoKCgoKCgoKIAoKIAoKCgoKIAoKCgogCgoKCgoKCgoK IAoKCgogCgoKCgoKCgoKCgoKCgogCgoKCiMgMTA3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yL2luY2x1ZGUvbGltaXRzLmgiIDMKCgoKCiAKCgoKCgoKCgoKIyA0OSAiL3Vzci9s aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0 bF9hbGdvYmFzZS5oIiAyIDMKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1 LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgoKCgoKCiAKCiAKCgoKCiAKCgogCgoK CgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50IHB0cmRpZmZfdDsKCgoKCgoKCgoKIAoKCgoKIAoK IAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCgoKCgoKCgoKCgoKIAoKIAoKIyAzMTcg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgoKIAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIyA1MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxp bnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMK CiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL25ldy5oIiAx IDMKIAoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUv bmV3IiAxIDMKIAogCgoKCgojcHJhZ21hIGludGVyZmFjZSAibmV3IgojIDEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQyICIvdXNy L2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCiMgOCAi L3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL25ldyIgMiAzCgoKCmV4 dGVybiAiQysrIiB7CgpuYW1lc3BhY2Ugc3RkIHsKCiAgY2xhc3MgYmFkX2FsbG9jIDogcHVibGlj IGV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29u c3QgdGhyb3coKSB7IHJldHVybiAiYmFkX2FsbG9jIjsgfQogIH07CgogIHN0cnVjdCBub3Rocm93 X3Qge307CiAgZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OwogIHR5cGVkZWYgdm9pZCAo Km5ld19oYW5kbGVyKSgpOwogIG5ld19oYW5kbGVyIHNldF9uZXdfaGFuZGxlciAobmV3X2hhbmRs ZXIpOwoKfSAgCgogCnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRf YWxsb2MpOwp2b2lkICpvcGVyYXRvciBuZXdbXSAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRfYWxs b2MpOwp2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9y IGRlbGV0ZVtdICh2b2lkICopIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90LCBj b25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ld1tdIChzaXpl X3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxldGUg KHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9yIGRl bGV0ZVtdICh2b2lkICosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKCiAKaW5saW5l IHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHZvaWQgKnBsYWNlKSB0aHJvdygpIHsgcmV0dXJu IHBsYWNlOyB9CmlubGluZSB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3QsIHZvaWQgKnBsYWNl KSB0aHJvdygpIHsgcmV0dXJuIHBsYWNlOyB9Cn0gIAoKCiMgNiAiL3Vzci9saWIvZ2NjLWxpYi9p Mzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL25ldy5oIiAyIDMKCgp1c2luZyBzdGQ6Om5ld19oYW5k bGVyOwp1c2luZyBzdGQ6OnNldF9uZXdfaGFuZGxlcjsKCgojIDUyICIvdXNyL2xpYi9nY2MtbGli L2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNl LmgiIDIgMwoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCiAKCnN0cnVjdCBpbnB1dF9pdGVyYXRvcl90YWcge307CnN0cnVj dCBvdXRwdXRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgOiBw dWJsaWMgaW5wdXRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRv cl90YWcgOiBwdWJsaWMgZm9yd2FyZF9pdGVyYXRvcl90YWcge307CnN0cnVjdCByYW5kb21fYWNj ZXNzX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyB7fTsK CiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IGlu cHV0X2l0ZXJhdG9yIHsKICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRl Z29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYg X0Rpc3RhbmNlICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogICAgICAg ICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgIHJlZmVyZW5jZTsK fTsKCnN0cnVjdCBvdXRwdXRfaXRlcmF0b3IgewogIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3Rh ZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVf dHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5 cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgdm9pZCAgICAgICAg ICAgICAgICByZWZlcmVuY2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFu Y2U+IHN0cnVjdCBmb3J3YXJkX2l0ZXJhdG9yIHsKICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3Jf dGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgdmFs dWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsK ICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBfVHAmICAg ICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0Rpc3RhbmNlPiBzdHJ1Y3QgYmlkaXJlY3Rpb25hbF9pdGVyYXRvciB7CiAgdHlwZWRlZiBiaWRp cmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAg ICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgICAg ICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAg ICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAg cmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1 Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvciB7CiAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJh dG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAg ICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICAgICAgICBk aWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICBwb2lu dGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwp9OwoK IyA5OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9y PgpzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzIHsKICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6 aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB0eXBlbmFtZSBf SXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfSXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVm IHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOwp9OwoKdGVt cGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGl0ZXJhdG9yX3RyYWl0czxfVHAqPiB7CiAgdHlwZWRl ZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVm IF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlm Zl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogICAg ICAgICAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAg ICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBpdGVy YXRvcl90cmFpdHM8Y29uc3QgX1RwKj4gewogIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRv cl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAg ICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICBk aWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgcG9p bnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07 CgogCiAKIAogCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVy YXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeQpfX2l0ZXJhdG9yX2NhdGVnb3J5 KGNvbnN0IF9JdGVyJikKewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVy Pjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwogIHJldHVybiBfQ2F0ZWdvcnkoKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9J dGVyPjo6ZGlmZmVyZW5jZV90eXBlKgpfX2Rpc3RhbmNlX3R5cGUoY29uc3QgX0l0ZXImKQp7CiAg cmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZl cmVuY2VfdHlwZSo+KDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CmlubGluZSB0eXBlbmFt ZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKgpfX3ZhbHVlX3R5cGUoY29uc3Qg X0l0ZXImKQp7CiAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxf SXRlcj46OnZhbHVlX3R5cGUqPigwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUg dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKaXRlcmF0 b3JfY2F0ZWdvcnkoY29uc3QgX0l0ZXImIF9faSkgeyByZXR1cm4gX19pdGVyYXRvcl9jYXRlZ29y eShfX2kpOyB9CgoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0 b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlKgpkaXN0YW5jZV90eXBlKGNvbnN0IF9J dGVyJiBfX2kpIHsgcmV0dXJuIF9fZGlzdGFuY2VfdHlwZShfX2kpOyB9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90 eXBlKgp2YWx1ZV90eXBlKGNvbnN0IF9JdGVyJiBfX2kpIHsgcmV0dXJuIF9fdmFsdWVfdHlwZShf X2kpOyB9CgoKCgoKIyAyNTkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCnRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBfX2Rpc3RhbmNl KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbiwgaW5wdXRfaXRlcmF0b3JfdGFnKQp7CiAgd2hp bGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7ICsrX19maXJzdDsgKytfX247IH0KfQoKdGVtcGxhdGUg PGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9p ZCBfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAg ICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCAKICAgICAgICAgICAgICAg ICAgICAgICBfRGlzdGFuY2UmIF9fbiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCnsKICBf X24gKz0gX19sYXN0IC0gX19maXJzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9y LCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIGRpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9f Zmlyc3QsIAogICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9EaXN0 YW5jZSYgX19uKQp7CiAgX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbiwgaXRlcmF0b3Jf Y2F0ZWdvcnkoX19maXJzdCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K aW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVu Y2VfdHlwZQpfX2Rpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9y IF9fbGFzdCwgaW5wdXRfaXRlcmF0b3JfdGFnKQp7CiAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRz PF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDA7CiAgd2hpbGUgKF9fZmly c3QgIT0gX19sYXN0KSB7CiAgICArK19fZmlyc3Q7ICsrX19uOwogIH0KICByZXR1cm4gX19uOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgppbmxpbmUgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQpf X2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKSB7CiAg cmV0dXJuIF9fbGFzdCAtIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRv cj4KaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZl cmVuY2VfdHlwZQpkaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRv ciBfX2xhc3QpIHsKICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVy YXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IAogICAgX0NhdGVnb3J5OwogIHJldHVybiBfX2Rpc3Rh bmNlKF9fZmlyc3QsIF9fbGFzdCwgX0NhdGVnb3J5KCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIF9fYWR2YW5jZShfSW5wdXRJ dGVyJiBfX2ksIF9EaXN0YW5jZSBfX24sIGlucHV0X2l0ZXJhdG9yX3RhZykgewogIHdoaWxlIChf X24tLSkgKytfX2k7Cn0KCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRv ciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBfX2FkdmFuY2UoX0JpZGlyZWN0aW9uYWxJ dGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uLCAKICAgICAgICAgICAgICAgICAgICAgIGJpZGly ZWN0aW9uYWxfaXRlcmF0b3JfdGFnKSB7CiAgaWYgKF9fbiA+PSAwKQogICAgd2hpbGUgKF9fbi0t KSArK19faTsKICBlbHNlCiAgICB3aGlsZSAoX19uKyspIC0tX19pOwp9CgoKCgoKdGVtcGxhdGUg PGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9p ZCBfX2FkdmFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sIAog ICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKICBfX2kg Kz0gX19uOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZT4KaW5saW5lIHZvaWQgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19u KSB7CiAgX19hZHZhbmNlKF9faSwgX19uLCBpdGVyYXRvcl9jYXRlZ29yeShfX2kpKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9Db250YWluZXI+CmNsYXNzIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yIHsKcHJv dGVjdGVkOgogIF9Db250YWluZXIqIGNvbnRhaW5lcjsKcHVibGljOgogIHR5cGVkZWYgX0NvbnRh aW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90 YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVl X3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0 eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAg ICAgICAgICAgcmVmZXJlbmNlOwoKICBleHBsaWNpdCBiYWNrX2luc2VydF9pdGVyYXRvcihfQ29u dGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CiAgYmFja19pbnNlcnRfaXRlcmF0b3I8 X0NvbnRhaW5lcj4mCiAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVl X3R5cGUmIF9fdmFsdWUpIHsgCiAgICBjb250YWluZXItPnB1c2hfYmFjayhfX3ZhbHVlKTsKICAg IHJldHVybiAqdGhpczsKICB9CiAgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9w ZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CiAgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRh aW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQogIGJhY2tfaW5zZXJ0X2l0ZXJh dG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KfTsKCiMg Mzc4ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1 ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4K aW5saW5lIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IGJhY2tfaW5zZXJ0ZXIoX0Nv bnRhaW5lciYgX194KSB7CiAgcmV0dXJuIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ KF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBmcm9udF9pbnNlcnRf aXRlcmF0b3Igewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5lciogY29udGFpbmVyOwpwdWJsaWM6CiAg dHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwogIHR5cGVkZWYgb3V0 cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHZvaWQgICAgICAg ICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVy ZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVk ZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CgogIGV4cGxpY2l0IGZyb250X2luc2Vy dF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CiAgZnJvbnRf aW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgogIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBf Q29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKSB7IAogICAgY29udGFpbmVyLT5wdXNoX2Zy b250KF9fdmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBmcm9udF9pbnNlcnRfaXRlcmF0 b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CiAgZnJvbnRfaW5z ZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0K ICBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJl dHVybiAqdGhpczsgfQp9OwoKIyA0MTcgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1 LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCnRlbXBsYXRl IDxjbGFzcyBfQ29udGFpbmVyPgppbmxpbmUgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWlu ZXI+IGZyb250X2luc2VydGVyKF9Db250YWluZXImIF9feCkgewogIHJldHVybiBmcm9udF9pbnNl cnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Db250YWlu ZXI+CmNsYXNzIGluc2VydF9pdGVyYXRvciB7CnByb3RlY3RlZDoKICBfQ29udGFpbmVyKiBjb250 YWluZXI7CiAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKcHVibGljOgogIHR5 cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1 dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAg ICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVu Y2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVm IHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoKICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRh aW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpIAogICAgOiBjb250 YWluZXIoJl9feCksIGl0ZXIoX19pKSB7fQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYK ICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1 ZSkgeyAKICAgIGl0ZXIgPSBjb250YWluZXItPmluc2VydChpdGVyLCBfX3ZhbHVlKTsKICAgICsr aXRlcjsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFp bmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CiAgaW5zZXJ0X2l0ZXJhdG9yPF9D b250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KfTsKCiMgNDU5ICIv dXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lciwgY2xhc3Mg X0l0ZXJhdG9yPgppbmxpbmUgCmluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBpbnNlcnRlcihf Q29udGFpbmVyJiBfX3gsIF9JdGVyYXRvciBfX2kpCnsKICB0eXBlZGVmIHR5cGVuYW1lIF9Db250 YWluZXI6Oml0ZXJhdG9yIF9faXRlcjsKICByZXR1cm4gaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWlu ZXI+KF9feCwgX19pdGVyKF9faSkpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFs SXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX1JlZmVyZW5jZSA9IF9UcCYsIAogICAgICAgICAg Y2xhc3MgX0Rpc3RhbmNlID0gcHRyZGlmZl90PiAKCgoKCmNsYXNzIHJldmVyc2VfYmlkaXJlY3Rp b25hbF9pdGVyYXRvciB7CiAgdHlwZWRlZiByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8 X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1RwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfUmVmZXJlbmNlLCBfRGlzdGFuY2U+ICBfU2VsZjsKcHJvdGVjdGVkOgog IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgY3VycmVudDsKcHVibGljOgogIHR5cGVkZWYgYmlkaXJl Y3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAg ICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAg ICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAg ICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9SZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJl ZmVyZW5jZTsKCiAgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yKCkge30KICBleHBsaWNp dCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBf X3gpCiAgICA6IGN1cnJlbnQoX194KSB7fQogIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgYmFzZSgp IGNvbnN0IHsgcmV0dXJuIGN1cnJlbnQ7IH0KICBfUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0 IHsKICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX190bXAgPSBjdXJyZW50OwogICAgcmV0dXJu ICotLV9fdG1wOwogIH0KCiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihv cGVyYXRvciooKSk7IH0KCiAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CiAgICAtLWN1cnJlbnQ7CiAg ICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CiAgICBfU2VsZiBf X3RtcCA9ICp0aGlzOwogICAgLS1jdXJyZW50OwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBfU2Vs ZiYgb3BlcmF0b3ItLSgpIHsKICAgICsrY3VycmVudDsKICAgIHJldHVybiAqdGhpczsKICB9CiAg X1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAgICArK2N1 cnJlbnQ7CiAgICByZXR1cm4gX190bXA7CiAgfQp9OwoKIyA1NTAgIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3Iu aCIgMwoKCnRlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9SZWYsCiAg ICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBib29sIG9wZXJhdG9yPT0oCiAgICBjb25z dCByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3I8X0JpSXRlciwgX1RwLCBfUmVmLCBfRGlz dGFuY2U+JiBfX3gsIAogICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9C aUl0ZXIsIF9UcCwgX1JlZiwgX0Rpc3RhbmNlPiYgX195KQp7CiAgcmV0dXJuIF9feC5iYXNlKCkg PT0gX195LmJhc2UoKTsKfQoKCgogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+ CmNsYXNzIHJldmVyc2VfaXRlcmF0b3IgCnsKcHJvdGVjdGVkOgogIF9JdGVyYXRvciBjdXJyZW50 OwpwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6 aXRlcmF0b3JfY2F0ZWdvcnkKICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYg dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGUKICAgICAgICAg IHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9y Pjo6ZGlmZmVyZW5jZV90eXBlCiAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB0 eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cG9pbnRlcgogICAgICAgICAgcG9p bnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpyZWZl cmVuY2UKICAgICAgICAgIHJlZmVyZW5jZTsKCiAgdHlwZWRlZiBfSXRlcmF0b3IgaXRlcmF0b3Jf dHlwZTsKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiBfU2VsZjsKCnB1Ymxp YzoKICByZXZlcnNlX2l0ZXJhdG9yKCkge30KICBleHBsaWNpdCByZXZlcnNlX2l0ZXJhdG9yKGl0 ZXJhdG9yX3R5cGUgX194KSA6IGN1cnJlbnQoX194KSB7fQoKICByZXZlcnNlX2l0ZXJhdG9yKGNv bnN0IF9TZWxmJiBfX3gpIDogY3VycmVudChfX3guY3VycmVudCkge30KCiAgdGVtcGxhdGUgPGNs YXNzIF9JdGVyPgogIHJldmVyc2VfaXRlcmF0b3IoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRl cj4mIF9feCkKICAgIDogY3VycmVudChfX3guYmFzZSgpKSB7fQoKICAgIAogIGl0ZXJhdG9yX3R5 cGUgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnQ7IH0KICByZWZlcmVuY2Ugb3BlcmF0b3Iq KCkgY29uc3QgewogICAgX0l0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKICAgIHJldHVybiAqLS1f X3RtcDsKICB9CgogIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0 b3IqKCkpOyB9CgoKICBfU2VsZiYgb3BlcmF0b3IrKygpIHsKICAgIC0tY3VycmVudDsKICAgIHJl dHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKICAgIF9TZWxmIF9fdG1w ID0gKnRoaXM7CiAgICAtLWN1cnJlbnQ7CiAgICByZXR1cm4gX190bXA7CiAgfQogIF9TZWxmJiBv cGVyYXRvci0tKCkgewogICAgKytjdXJyZW50OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBfU2Vs ZiBvcGVyYXRvci0tKGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsKICAgICsrY3VycmVu dDsKICAgIHJldHVybiBfX3RtcDsKICB9CgogIF9TZWxmIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5 cGUgX19uKSBjb25zdCB7CiAgICByZXR1cm4gX1NlbGYoY3VycmVudCAtIF9fbik7CiAgfQogIF9T ZWxmJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pIHsKICAgIGN1cnJlbnQgLT0gX19u OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBfU2VsZiBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBl IF9fbikgY29uc3QgewogICAgcmV0dXJuIF9TZWxmKGN1cnJlbnQgKyBfX24pOwogIH0KICBfU2Vs ZiYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CiAgICBjdXJyZW50ICs9IF9fbjsK ICAgIHJldHVybiAqdGhpczsKICB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90 eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0gIAp9OyAKIAp0ZW1wbGF0 ZSA8Y2xhc3MgX0l0ZXJhdG9yPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHJldmVyc2Vf aXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LCAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBy ZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkgewogIHJldHVybiBfX3guYmFzZSgpID09 IF9feS5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CmlubGluZSBib29sIG9w ZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwgCiAgICAgICAg ICAgICAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkgewog IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVy YXRvcj4KaW5saW5lIHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlmZmVy ZW5jZV90eXBlCm9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9f eCwgCiAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkgewog IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVy YXRvcj4KaW5saW5lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiAKb3BlcmF0b3IrKHR5cGVu YW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKICAg ICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194KSB7CiAgcmV0dXJu IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPihfX3guYmFzZSgpIC0gX19uKTsKfQoKIyA4MDUg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0Rpc3QgPSBwdHJkaWZmX3Q+IApjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yIHsKICBmcmllbmQgYm9v bCBvcGVyYXRvcj09IDw+ICAoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvciYp Owpwcm90ZWN0ZWQ6CiAgaXN0cmVhbSogX01fc3RyZWFtOwogIF9UcCBfTV92YWx1ZTsKICBib29s IF9NX2VuZF9tYXJrZXI7CiAgdm9pZCBfTV9yZWFkKCkgewogICAgX01fZW5kX21hcmtlciA9ICgq X01fc3RyZWFtKSA/IHRydWUgOiBmYWxzZTsKICAgIGlmIChfTV9lbmRfbWFya2VyKSAqX01fc3Ry ZWFtID4+IF9NX3ZhbHVlOwogICAgX01fZW5kX21hcmtlciA9ICgqX01fc3RyZWFtKSA/IHRydWUg OiBmYWxzZTsKICB9CnB1YmxpYzoKICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyAgaXRlcmF0 b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAg dHlwZWRlZiBfRGlzdCAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIGNv bnN0IF9UcCogICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAg cmVmZXJlbmNlOwoKICBpc3RyZWFtX2l0ZXJhdG9yKCkgOiBfTV9zdHJlYW0oJmNpbiksIF9NX2Vu ZF9tYXJrZXIoZmFsc2UpIHt9CiAgaXN0cmVhbV9pdGVyYXRvcihpc3RyZWFtJiBfX3MpIDogX01f c3RyZWFtKCZfX3MpIHsgX01fcmVhZCgpOyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0 IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CgogIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0 dXJuICYob3BlcmF0b3IqKCkpOyB9CgogIGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdD4mIG9w ZXJhdG9yKysoKSB7IAogICAgX01fcmVhZCgpOyAKICAgIHJldHVybiAqdGhpczsKICB9CiAgaXN0 cmVhbV9pdGVyYXRvcjxfVHAsIF9EaXN0PiBvcGVyYXRvcisrKGludCkgIHsKICAgIGlzdHJlYW1f aXRlcmF0b3I8X1RwLCBfRGlzdD4gX190bXAgPSAqdGhpczsKICAgIF9NX3JlYWQoKTsKICAgIHJl dHVybiBfX3RtcDsKICB9Cn07CgojIDg2NCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKdGVtcGxh dGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNv bnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+JiBfX3gsCiAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mIF9feSkgewog IHJldHVybiAoX194Ll9NX3N0cmVhbSA9PSBfX3kuX01fc3RyZWFtICYmCiAgICAgICAgICBfX3gu X01fZW5kX21hcmtlciA9PSBfX3kuX01fZW5kX21hcmtlcikgfHwKICAgICAgICAgX194Ll9NX2Vu ZF9tYXJrZXIgPT0gZmFsc2UgJiYgX195Ll9NX2VuZF9tYXJrZXIgPT0gZmFsc2U7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfVHA+CmNsYXNzIG9zdHJlYW1faXRlcmF0b3Igewpwcm90ZWN0ZWQ6CiAgb3N0 cmVhbSogX01fc3RyZWFtOwogIGNvbnN0IGNoYXIqIF9NX3N0cmluZzsKcHVibGljOgogIHR5cGVk ZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHZvaWQg ICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAg ZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwog IHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CgogIG9zdHJlYW1faXRlcmF0 b3Iob3N0cmVhbSYgX19zKSA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKDApIHt9CiAgb3N0 cmVhbV9pdGVyYXRvcihvc3RyZWFtJiBfX3MsIGNvbnN0IGNoYXIqIF9fYykgCiAgICA6IF9NX3N0 cmVhbSgmX19zKSwgX01fc3RyaW5nKF9fYykgIHt9CiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBv cGVyYXRvcj0oY29uc3QgX1RwJiBfX3ZhbHVlKSB7IAogICAgKl9NX3N0cmVhbSA8PCBfX3ZhbHVl OwogICAgaWYgKF9NX3N0cmluZykgKl9NX3N0cmVhbSA8PCBfTV9zdHJpbmc7CiAgICByZXR1cm4g KnRoaXM7CiAgfQogIG9zdHJlYW1faXRlcmF0b3I8X1RwPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4g KnRoaXM7IH0KICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAq dGhpczsgfSAKICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVy biAqdGhpczsgfSAKfTsKCiMgOTA3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgogCgoKCiAKIAog CiMgNTYgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKCiAKCiAKCnRlbXBsYXRlIDxjbGFzcyBf Rm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfVHA+CmlubGluZSB2b2lk IF9faXRlcl9zd2FwKF9Gb3J3YXJkSXRlcjEgX19hLCBfRm9yd2FyZEl0ZXIyIF9fYiwgX1RwKikg ewogIF9UcCBfX3RtcCA9ICpfX2E7CiAgKl9fYSA9ICpfX2I7CiAgKl9fYiA9IF9fdG1wOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMj4KaW5saW5l IHZvaWQgaXRlcl9zd2FwKF9Gb3J3YXJkSXRlcjEgX19hLCBfRm9yd2FyZEl0ZXIyIF9fYikgewog IF9faXRlcl9zd2FwKF9fYSwgX19iLCBfX3ZhbHVlX3R5cGUoIF9fYSApICk7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVHA+CmlubGluZSB2b2lkIHN3YXAoX1RwJiBfX2EsIF9UcCYgX19iKSB7CiAgX1Rw IF9fdG1wID0gX19hOwogIF9fYSA9IF9fYjsKICBfX2IgPSBfX3RtcDsKfQoKIAogCgoKCgoKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBjb25zdCBfVHAmIG1pbihjb25zdCBfVHAmIF9fYSwg Y29uc3QgX1RwJiBfX2IpIHsKICByZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgY29uc3QgX1RwJiBtYXgoY29uc3QgX1RwJiBfX2EsIGNv bnN0IF9UcCYgX19iKSB7CiAgcmV0dXJuICBfX2EgPCBfX2IgPyBfX2IgOiBfX2E7Cn0KCgoKdGVt cGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSBjb25zdCBfVHAmIG1pbihj b25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29tcCkgewogIHJldHVy biBfX2NvbXAoX19iLCBfX2EpID8gX19iIDogX19hOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBj bGFzcyBfQ29tcGFyZT4KaW5saW5lIGNvbnN0IF9UcCYgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25z dCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKSB7CiAgcmV0dXJuIF9fY29tcChfX2EsIF9fYikg PyBfX2IgOiBfX2E7Cn0KCiAKIAoKIAogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBfT3V0cHV0 SXRlciBfX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcsIF9EaXN0YW5jZSopCnsKICBmb3IgKCA7IF9f Zmlyc3QgIT0gX19sYXN0OyArK19fcmVzdWx0LCArK19fZmlyc3QpCiAgICAqX19yZXN1bHQgPSAq X19maXJzdDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNj ZXNzSXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIF9PdXRw dXRJdGVyCl9fY29weShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRl ciBfX2xhc3QsCiAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgcmFuZG9tX2FjY2Vzc19pdGVy YXRvcl90YWcsIF9EaXN0YW5jZSopCnsKICBmb3IgKF9EaXN0YW5jZSBfX24gPSBfX2xhc3QgLSBf X2ZpcnN0OyBfX24gPiAwOyAtLV9fbikgewogICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgICAr K19fZmlyc3Q7CiAgICArK19fcmVzdWx0OwogIH0KICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfVHA+CmlubGluZSBfVHAqCl9fY29weV90cml2aWFsKGNvbnN0IF9UcCogX19m aXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICBtZW1tb3ZlKF9fcmVz dWx0LCBfX2ZpcnN0LCBzaXplb2YoX1RwKSAqIChfX2xhc3QgLSBfX2ZpcnN0KSk7CiAgcmV0dXJu IF9fcmVzdWx0ICsgKF9fbGFzdCAtIF9fZmlyc3QpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Jvb2xUeXBlPgpzdHJ1Y3QgX19jb3B5 X2Rpc3BhdGNoIHsKICBzdGF0aWMgX091dHB1dEl0ZXIgY29weShfSW5wdXRJdGVyIF9fZmlyc3Qs IF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVy IF9fcmVzdWx0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJ dGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwogICAgdHlwZWRlZiB0eXBlbmFtZSBp dGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfRGlzdGFuY2U7CiAg ICByZXR1cm4gX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9DYXRlZ29yeSgpLCAo X0Rpc3RhbmNlKikgMCk7CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fY29w eV9kaXNwYXRjaDxfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KewogIHN0YXRpYyBfVHAqIGNvcHko Y29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkgewog ICAgcmV0dXJuIF9fY29weV90cml2aWFsKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwogIH0K fTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX2NvcHlfZGlzcGF0Y2g8Y29uc3QgX1Rw KiwgX1RwKiwgX190cnVlX3R5cGU+CnsKICBzdGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19m aXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICAgIHJldHVybiBfX2Nv cHlfdHJpdmlhbChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBfT3V0cHV0SXRlciBj b3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAg ICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVy YXRvcl90cmFpdHM8X0lucHV0SXRlcj46OnZhbHVlX3R5cGUgX1RwOwogIHR5cGVkZWYgdHlwZW5h bWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yCiAg ICAgICAgICBfVHJpdmlhbDsKICByZXR1cm4gX19jb3B5X2Rpc3BhdGNoPF9JbnB1dEl0ZXIsIF9P dXRwdXRJdGVyLCBfVHJpdmlhbD4KICAgIDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0 KTsKfQoKIyAyMTMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMwoKCiAKIAoKdGVtcGxhdGUgPGNsYXNz IF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsIAogICAgICAg ICAgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2NvcHlfYmFj a3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19sYXN0LCAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIg X19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRp cmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9EaXN0YW5jZSopCnsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCiAgICAq LS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBf RGlzdGFuY2U+CmlubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXIgX19jb3B5X2JhY2t3YXJkKF9SYW5k b21BY2Nlc3NJdGVyIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19yZXN1bHQsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3Jf dGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2Uq KQp7CiAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1f X24pCiAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCgoK IAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRp cmVjdGlvbmFsSXRlcjIsCiAgICAgICAgICBjbGFzcyBfQm9vbFR5cGU+CnN0cnVjdCBfX2NvcHlf YmFja3dhcmRfZGlzcGF0Y2gKewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9C aWRpcmVjdGlvbmFsSXRlcjE+OjppdGVyYXRvcl9jYXRlZ29yeSAKICAgICAgICAgIF9DYXQ7CiAg dHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyMT46OmRp ZmZlcmVuY2VfdHlwZQogICAgICAgICAgX0Rpc3RhbmNlOwoKICBzdGF0aWMgX0JpZGlyZWN0aW9u YWxJdGVyMiBjb3B5KF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdCwgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fcmVzdWx0KSB7 CiAgICByZXR1cm4gX19jb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9D YXQoKSwgKF9EaXN0YW5jZSopIDApOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVj dCBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X1RwKiwgX1RwKiwgX190cnVlX3R5cGU+CnsKICBz dGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9U cCogX19yZXN1bHQpIHsKICAgIGNvbnN0IHB0cmRpZmZfdCBfTnVtID0gX19sYXN0IC0gX19maXJz dDsKICAgIG1lbW1vdmUoX19yZXN1bHQgLSBfTnVtLCBfX2ZpcnN0LCBzaXplb2YoX1RwKSAqIF9O dW0pOwogICAgcmV0dXJuIF9fcmVzdWx0IC0gX051bTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3BhdGNoPGNvbnN0IF9UcCosIF9UcCosIF9f dHJ1ZV90eXBlPgp7CiAgc3RhdGljIF9UcCogY29weShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0 IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KSB7CiAgICByZXR1cm4gIF9fY29weV9iYWNrd2Fy ZF9kaXNwYXRjaDxfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KICAgICAgOjpjb3B5KF9fZmlyc3Qs IF9fbGFzdCwgX19yZXN1bHQpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQkkxLCBjbGFzcyBf QkkyPgppbmxpbmUgX0JJMiBjb3B5X2JhY2t3YXJkKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3Qs IF9CSTIgX19yZXN1bHQpIHsKICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8dHlwZW5h bWUgaXRlcmF0b3JfdHJhaXRzPF9CSTI+Ojp2YWx1ZV90eXBlPgogICAgICAgICAgICAgICAgICAg ICAgICA6Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IKICAgICAgICAgIF9Ucml2aWFs OwogIHJldHVybiBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X0JJMSwgX0JJMiwgX1RyaXZpYWw+ CiAgICAgICAgICAgICAgOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwp9CgojIDMw MyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRl L2crKy0zL3N0bF9hbGdvYmFzZS5oIiAzCgoKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl ciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgpwYWlyPF9JbnB1dEl0ZXIsIF9PdXRw dXRJdGVyPiBfX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcp IHsKICBmb3IgKCA7IF9fY291bnQgPiAwOyAtLV9fY291bnQpIHsKICAgICpfX3Jlc3VsdCA9ICpf X2ZpcnN0OwogICAgKytfX2ZpcnN0OwogICAgKytfX3Jlc3VsdDsKICB9CiAgcmV0dXJuIHBhaXI8 X0lucHV0SXRlciwgX091dHB1dEl0ZXI+KF9fZmlyc3QsIF9fcmVzdWx0KTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9SQUl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KaW5saW5lIHBh aXI8X1JBSXRlciwgX091dHB1dEl0ZXI+Cl9fY29weV9uKF9SQUl0ZXIgX19maXJzdCwgX1NpemUg X19jb3VudCwKICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgIHJhbmRvbV9h Y2Nlc3NfaXRlcmF0b3JfdGFnKSB7CiAgX1JBSXRlciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3Vu dDsKICByZXR1cm4gcGFpcjxfUkFJdGVyLCBfT3V0cHV0SXRlcj4oX19sYXN0LCBjb3B5KF9fZmly c3QsIF9fbGFzdCwgX19yZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNs YXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KaW5saW5lIHBhaXI8X0lucHV0SXRlciwgX091 dHB1dEl0ZXI+Cl9fY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091 dHB1dEl0ZXIgX19yZXN1bHQpIHsKICByZXR1cm4gX19jb3B5X24oX19maXJzdCwgX19jb3VudCwg X19yZXN1bHQsCiAgICAgICAgICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3Qg KSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9P dXRwdXRJdGVyPgppbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4KY29weV9uKF9J bnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwgX091dHB1dEl0ZXIgX19yZXN1bHQpIHsK ICByZXR1cm4gX19jb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQpOwp9CgogCiAKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CnZvaWQgZmlsbChfRm9yd2Fy ZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKSB7 CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgKl9fZmlyc3QgPSBf X3ZhbHVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFz cyBfVHA+Cl9PdXRwdXRJdGVyIGZpbGxfbihfT3V0cHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24s IGNvbnN0IF9UcCYgX192YWx1ZSkgewogIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19maXJz dCkKICAgICpfX2ZpcnN0ID0gX192YWx1ZTsKICByZXR1cm4gX19maXJzdDsKfQoKIAogCgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgpwYWlyPF9JbnB1dEl0 ZXIxLCBfSW5wdXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEgX19maXJzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIp IHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiAqX19maXJzdDEgPT0gKl9fZmlyc3Qy KSB7CiAgICArK19fZmlyc3QxOwogICAgKytfX2ZpcnN0MjsKICB9CiAgcmV0dXJuIHBhaXI8X0lu cHV0SXRlcjEsIF9JbnB1dEl0ZXIyPihfX2ZpcnN0MSwgX19maXJzdDIpOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGlj YXRlPgpwYWlyPF9JbnB1dEl0ZXIxLCBfSW5wdXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEg X19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJ dGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcjIgX19maXJzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKICB3aGlsZSAoX19maXJzdDEgIT0g X19sYXN0MSAmJiBfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkgewogICAgKytf X2ZpcnN0MTsKICAgICsrX19maXJzdDI7CiAgfQogIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIxLCBf SW5wdXRJdGVyMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KaW5saW5lIGJvb2wgZXF1YWwoX0lucHV0SXRlcjEg X19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgIF9JbnB1dEl0 ZXIyIF9fZmlyc3QyKSB7CiAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3Qx LCArK19fZmlyc3QyKQogICAgaWYgKCpfX2ZpcnN0MSAhPSAqX19maXJzdDIpCiAgICAgIHJldHVy biBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBj bGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KaW5saW5lIGJvb2wgZXF1 YWwoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAg ICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3By ZWQpIHsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJz dDIpCiAgICBpZiAoIV9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQogICAgICBy ZXR1cm4gZmFsc2U7CiAgcmV0dXJuIHRydWU7Cn0KCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgpib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJl KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3Qy KSB7CiAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIK ICAgICAgICA7ICsrX19maXJzdDEsICsrX19maXJzdDIpIHsKICAgIGlmICgqX19maXJzdDEgPCAq X19maXJzdDIpCiAgICAgIHJldHVybiB0cnVlOwogICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0 MSkKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAm JiBfX2ZpcnN0MiAhPSBfX2xhc3QyOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNs YXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQ29tcGFyZT4KYm9vbCBsZXhpY29ncmFwaGljYWxfY29t cGFyZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19s YXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsKICBm b3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MgogICAgICAg IDsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikgewogICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpf X2ZpcnN0MikpCiAgICAgIHJldHVybiB0cnVlOwogICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpf X2ZpcnN0MSkpCiAgICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIF9fZmlyc3QxID09IF9f bGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsKfQoKaW5saW5lIGJvb2wgCmxleGljb2dyYXBo aWNhbF9jb21wYXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAogICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MiwKICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MikKewogIGNvbnN0IHNpemVfdCBfX2xl bjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CiAgY29uc3Qgc2l6ZV90IF9fbGVuMiA9IF9fbGFzdDIg LSBfX2ZpcnN0MjsKICBjb25zdCBpbnQgX19yZXN1bHQgPSBtZW1jbXAoX19maXJzdDEsIF9fZmly c3QyLCBtaW4oX19sZW4xLCBfX2xlbjIpKTsKICByZXR1cm4gX19yZXN1bHQgIT0gMCA/IF9fcmVz dWx0IDwgMCA6IF9fbGVuMSA8IF9fbGVuMjsKfQoKaW5saW5lIGJvb2wgbGV4aWNvZ3JhcGhpY2Fs X2NvbXBhcmUoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9fZmlyc3QyLCBjb25z dCBjaGFyKiBfX2xhc3QyKQp7CgogIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZSgoY29u c3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19maXJzdDIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDIpOwoKCgoKCgp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgppbnQgX19sZXhp Y29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVy MSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIy IF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKQp7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9f bGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewogICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2Zp cnN0MikKICAgICAgcmV0dXJuIC0xOwogICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKICAg ICAgcmV0dXJuIDE7CiAgICArK19fZmlyc3QxOwogICAgKytfX2ZpcnN0MjsKICB9CiAgaWYgKF9f Zmlyc3QyID09IF9fbGFzdDIpIHsKICAgIHJldHVybiAhKF9fZmlyc3QxID09IF9fbGFzdDEpOwog IH0KICBlbHNlIHsKICAgIHJldHVybiAtMTsKICB9Cn0KCmlubGluZSBpbnQKX19sZXhpY29ncmFw aGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QxLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3Qy LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19s YXN0MikKewogIGNvbnN0IHB0cmRpZmZfdCBfX2xlbjEgPSBfX2xhc3QxIC0gX19maXJzdDE7CiAg Y29uc3QgcHRyZGlmZl90IF9fbGVuMiA9IF9fbGFzdDIgLSBfX2ZpcnN0MjsKICBjb25zdCBpbnQg X19yZXN1bHQgPSBtZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLCBtaW4oX19sZW4xLCBfX2xlbjIp KTsKICByZXR1cm4gX19yZXN1bHQgIT0gMCA/IF9fcmVzdWx0IAogICAgICAgICAgICAgICAgICAg ICAgIDogKF9fbGVuMSA9PSBfX2xlbjIgPyAwIDogKF9fbGVuMSA8IF9fbGVuMiA/IC0xIDogMSkp Owp9CgppbmxpbmUgaW50IApfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgY2hh ciogX19maXJzdDEsIGNvbnN0IGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikKewoKICBy ZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QxLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19maXJzdDIsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0 Mik7CgoKCgoKCn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRl cjI+CmludCBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3Qx LCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf SW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikKewogIHJldHVybiBfX2xl eGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBf X2xhc3QyKTsKfQoKIAoKCgogCiAKIAojIDE4ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbWVtb3J5IiAyIDMKCiMgMSAiL3Vzci9s aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0 bF9hbGxvYy5oIiAxIDMKIAoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAog CiAKIAoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM0MiAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4 LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgojIDUzICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDIgMwoK CgojIDEgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoK CiMgMzIgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMwoKCgoKCiAKCgoKCiMgNTYgIi91c3IvaW5j bHVkZS9hc3NlcnQuaCIgMwoKCmV4dGVybiAiQyIgeyAKCiAKZXh0ZXJuIHZvaWQgX19hc3NlcnRf ZmFpbCAoX19jb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgX19jb25zdCBjaGFyICpfX2ZpbGUsCgkJ CSAgIHVuc2lnbmVkIGludCBfX2xpbmUsIF9fY29uc3QgY2hhciAqX19mdW5jdGlvbikKICAgICB0 aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKIApleHRlcm4gdm9pZCBf X2Fzc2VydF9wZXJyb3JfZmFpbCAoaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwK CQkJCSAgdW5zaWduZWQgaW50IF9fbGluZSwKCQkJCSAgX19jb25zdCBjaGFyICpfX2Z1bmN0aW9u KQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgoKIAoKZXh0 ZXJuIHZvaWQgX19hc3NlcnQgKGNvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBjb25zdCBjaGFyICpf X2ZpbGUsIGludCBfX2xpbmUpCiAgICAgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX25vcmV0 dXJuX18pKTsKCgp9IAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgojIDU2ICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rs X2FsbG9jLmgiIDIgMwoKCgoKCgoKCgoKCgogICAgIAogICAgIAogICAgIAojIDEgIi91c3IvaW5j bHVkZS9wdGhyZWFkLmgiIDEgMwogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCiMgMSAi L3Vzci9pbmNsdWRlL3NjaGVkLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoj IDEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoK CgoKCgoKCiMgNTEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgojIDYxICIvdXNyL2luY2x1ZGUv dGltZS5oIiAzCgoKCiMgNzIgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKIyA4NCAiL3Vzci9p bmNsdWRlL3RpbWUuaCIgMwoKCgojIDk2ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgojIDEx MiAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyAzNjQgIi91c3IvaW5jbHVkZS90aW1lLmgi IDMKCgoKIyAyOSAiL3Vzci9pbmNsdWRlL3NjaGVkLmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgog CgoKCgoKCgoKCgoKIApzdHJ1Y3Qgc2NoZWRfcGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3Jp dHk7CiAgfTsKCmV4dGVybiAiQyIgeyAKCiAKCmV4dGVybiBpbnQgY2xvbmUgKGludCAoKl9fZm4p ICh2b2lkICpfX2FyZyksIHZvaWQgKl9fY2hpbGRfc3RhY2ssCgkJICBpbnQgX19mbGFncywgdm9p ZCAqX19hcmcpIHRocm93ICgpIDsKCgp9IAoKCgojIDczICIvdXNyL2luY2x1ZGUvYml0cy9zY2hl ZC5oIiAzCgojIDMyICIvdXNyL2luY2x1ZGUvc2NoZWQuaCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoK IApleHRlcm4gaW50IHNjaGVkX3NldHBhcmFtIChfX3BpZF90IF9fcGlkLCBfX2NvbnN0IHN0cnVj dCBzY2hlZF9wYXJhbSAqX19wYXJhbSkKICAgICB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgc2No ZWRfZ2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkg dGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHNjaGVkX3NldHNjaGVkdWxlciAoX19waWRfdCBfX3Bp ZCwgaW50IF9fcG9saWN5LAoJCQkgICAgICAgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9f cGFyYW0pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBzY2hlZF9nZXRzY2hlZHVsZXIgKF9fcGlk X3QgX19waWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBzY2hlZF95aWVsZCAodm9pZCkgdGhy b3cgKCkgOwoKIApleHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9tYXggKGludCBfX2FsZ29y aXRobSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9taW4gKGlu dCBfX2FsZ29yaXRobSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHNjaGVkX3JyX2dldF9pbnRl cnZhbCAoX19waWRfdCBfX3BpZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpIHRocm93ICgpIDsKCn0g CgoKIyAyMCAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgojIDEgIi91c3IvaW5jbHVkZS90 aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoK CgoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0 ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8y Ljk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoK IAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGli L2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgogCgogCgoKIyAx ODggIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9s aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoK CgoKCgoKCgoKCgogCgoKCgoKCgojIDM4ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAyIDMKCgogCgoj IDEgIi91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgoKIAoKCiAKCgoKCgogCgoKZXh0ZXJuIGxvbmcgaW50IF9fc3lzY29uZiAoaW50KTsKCgoK CiAKCiAKCiAKCgogCgoKCgoKCiMgNzMgIi91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaCIgMwoKIyA0 MiAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMiAzCgoKIAoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIF9f Y2xvY2tfdCBjbG9ja190OwoKCgoKIyA3MiAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgojIDg0 ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgOTYgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMK CgoKCiMgMTEyICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgoKIApzdHJ1Y3QgdG0KewogIGlu dCB0bV9zZWM7CQkJIAogIGludCB0bV9taW47CQkJIAogIGludCB0bV9ob3VyOwkJCSAKICBpbnQg dG1fbWRheTsJCQkgCiAgaW50IHRtX21vbjsJCQkgCiAgaW50IHRtX3llYXI7CQkJIAogIGludCB0 bV93ZGF5OwkJCSAKICBpbnQgdG1feWRheTsJCQkgCiAgaW50IHRtX2lzZHN0OwkJCSAKCgogIGxv bmcgaW50IHRtX2dtdG9mZjsJCSAKICBfX2NvbnN0IGNoYXIgKnRtX3pvbmU7CSAKCgoKCn07CgoK CiAKc3RydWN0IGl0aW1lcnNwZWMKICB7CiAgICBzdHJ1Y3QgdGltZXNwZWMgaXRfaW50ZXJ2YWw7 CiAgICBzdHJ1Y3QgdGltZXNwZWMgaXRfdmFsdWU7CiAgfTsKCiAKc3RydWN0IHNpZ2V2ZW50OwoK CgoKCgoKCgoKCiAKCmV4dGVybiBjbG9ja190IGNsb2NrICh2b2lkKSB0aHJvdyAoKSA7CgogCmV4 dGVybiB0aW1lX3QgdGltZSAodGltZV90ICpfX3RpbWVyKSB0aHJvdyAoKSA7CgogCmV4dGVybiBk b3VibGUgZGlmZnRpbWUgKHRpbWVfdCBfX3RpbWUxLCB0aW1lX3QgX190aW1lMCkKICAgICB0aHJv dyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIApleHRlcm4gdGltZV90IG1rdGlt ZSAoc3RydWN0IHRtICpfX3RwKSB0aHJvdyAoKSA7CgoKIAoKCmV4dGVybiBzaXplX3Qgc3RyZnRp bWUgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAoJCQlfX2NvbnN0IGNo YXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCV9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0 IF9fdHApIHRocm93ICgpIDsKCgoKCgoKCgoKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZSAo X19jb25zdCB0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpIDsKCiAKCmV4dGVybiBzdHJ1Y3QgdG0g KmxvY2FsdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpIDsKCgogCgpleHRl cm4gc3RydWN0IHRtICpnbXRpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1l ciwKCQkJICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSB0aHJvdyAoKSA7CgogCgpleHRl cm4gc3RydWN0IHRtICpsb2NhbHRpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190 aW1lciwKCQkJICAgICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSB0aHJvdyAoKSA7CgoK IAoKZXh0ZXJuIGNoYXIgKmFzY3RpbWUgKF9fY29uc3Qgc3RydWN0IHRtICpfX3RwKSB0aHJvdyAo KSA7CgogCmV4dGVybiBjaGFyICpjdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIHRocm93 ICgpIDsKCgogCgogCgpleHRlcm4gY2hhciAqYXNjdGltZV9yIChfX2NvbnN0IHN0cnVjdCB0bSAq X19yZXN0cmljdCBfX3RwLAoJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKSA7Cgog CmV4dGVybiBjaGFyICpjdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVy LAoJCSAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgpIDsKCgoKIApleHRlcm4g Y2hhciAqX190em5hbWVbMl07CSAKZXh0ZXJuIGludCBfX2RheWxpZ2h0OwkJIApleHRlcm4gbG9u ZyBpbnQgX190aW1lem9uZTsJIAoKCgogCmV4dGVybiBjaGFyICp0em5hbWVbMl07CgogCgpleHRl cm4gdm9pZCB0enNldCAodm9pZCkgdGhyb3cgKCkgOwoKCgpleHRlcm4gaW50IGRheWxpZ2h0Owpl eHRlcm4gbG9uZyBpbnQgdGltZXpvbmU7CgoKCiAKCmV4dGVybiBpbnQgc3RpbWUgKF9fY29uc3Qg dGltZV90ICpfX3doZW4pIHRocm93ICgpIDsKCgoKIAoKCgoKCgogCgoKIApleHRlcm4gdGltZV90 IHRpbWVnbSAoc3RydWN0IHRtICpfX3RwKSB0aHJvdyAoKSA7CgogCmV4dGVybiB0aW1lX3QgdGlt ZWxvY2FsIChzdHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBkeXNpemUg KGludCBfX3llYXIpIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCgoK IApleHRlcm4gaW50IG5hbm9zbGVlcCAoX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVxdWVz dGVkX3RpbWUsCgkJICAgICAgc3RydWN0IHRpbWVzcGVjICpfX3JlbWFpbmluZykgdGhyb3cgKCkg OwoKCiAKZXh0ZXJuIGludCBjbG9ja19nZXRyZXMgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBzdHJ1 Y3QgdGltZXNwZWMgKl9fcmVzKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgY2xvY2tfZ2V0dGlt ZSAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1lc3BlYyAqX190cCkgdGhyb3cgKCkg OwoKIApleHRlcm4gaW50IGNsb2NrX3NldHRpbWUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBfX2Nv bnN0IHN0cnVjdCB0aW1lc3BlYyAqX190cCkKICAgICB0aHJvdyAoKSA7CgojIDMwNSAiL3Vzci9p bmNsdWRlL3RpbWUuaCIgMwoKCgogCmV4dGVybiBpbnQgdGltZXJfY3JlYXRlIChjbG9ja2lkX3Qg X19jbG9ja19pZCwKCQkJIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX2V2cCwKCQkJIHRp bWVyX3QgKl9fcmVzdHJpY3QgX190aW1lcmlkKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgdGlt ZXJfZGVsZXRlICh0aW1lcl90IF9fdGltZXJpZCkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHRp bWVyX3NldHRpbWUgKHRpbWVyX3QgX190aW1lcmlkLCBpbnQgX19mbGFncywKCQkJICBfX2NvbnN0 IHN0cnVjdCBpdGltZXJzcGVjICpfX3Jlc3RyaWN0IF9fdmFsdWUsCgkJCSAgc3RydWN0IGl0aW1l cnNwZWMgKl9fcmVzdHJpY3QgX19vdmFsdWUpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCB0aW1l cl9nZXR0aW1lICh0aW1lcl90IF9fdGltZXJpZCwgc3RydWN0IGl0aW1lcnNwZWMgKl9fdmFsdWUp CiAgICAgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHRpbWVyX2dldG92ZXJydW4gKHRpbWVyX3Qg X190aW1lcmlkKSB0aHJvdyAoKSA7CgoKCiMgMzQ5ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoK IyAzNTkgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKfSAKCgoKCiMgMjEgIi91c3IvaW5jbHVk ZS9wdGhyZWFkLmgiIDIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9zaWduYWwuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zaWdzZXQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMyAiL3Vzci9pbmNs dWRlL2JpdHMvc2lnc2V0LmgiIDMKCgoKIAoKCgoKCiMgMTI1ICIvdXNyL2luY2x1ZGUvYml0cy9z aWdzZXQuaCIgMwoKIyAzMyAiL3Vzci9pbmNsdWRlL3NpZ25hbC5oIiAyIDMKCgogCgoKCgoKCgoK CgoKCgp0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CgoKCiMgMzcxICIvdXNyL2luY2x1ZGUv c2lnbmFsLmgiIDMKCgp9IAoKCiMgMjQgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKIyAx ICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMSAzCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKCgoKCgojIDE0MiAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDMK CiMgMjUgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKIyAxICIvdXNyL2luY2x1ZGUvYml0 cy9pbml0c3Bpbi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgogCgoKCiMgMjYgIi91 c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKCgpleHRlcm4gIkMiIHsgCgogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgplbnVtCnsKICBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSwKCiAgUFRI UkVBRF9DUkVBVEVfREVUQUNIRUQKCn07CgplbnVtCnsKICBQVEhSRUFEX0lOSEVSSVRfU0NIRUQs CgogIFBUSFJFQURfRVhQTElDSVRfU0NIRUQKCn07CgplbnVtCnsKICBQVEhSRUFEX1NDT1BFX1NZ U1RFTSwKCiAgUFRIUkVBRF9TQ09QRV9QUk9DRVNTCgp9OwoKZW51bQp7CiAgUFRIUkVBRF9NVVRF WF9USU1FRF9OUCwKICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwKICBQVEhSRUFEX01VVEVY X0VSUk9SQ0hFQ0tfTlAsCiAgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUAoKCgoKCgoKCgoKCn07 CgplbnVtCnsKICBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSwKCiAgUFRIUkVBRF9QUk9DRVNTX1NI QVJFRAoKfTsKCiMgMTE4ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCgoKCgogCgoKCgoKCiAK CnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcgp7CiAgdm9pZCAoKl9fcm91dGluZSkgKHZv aWQgKik7CQkgICAKICB2b2lkICpfX2FyZzsJCQkJICAgCiAgaW50IF9fY2FuY2VsdHlwZTsJCQkg ICAKICBzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKl9fcHJldjsgIAp9OwoKIAoKZW51 bQp7CiAgUFRIUkVBRF9DQU5DRUxfRU5BQkxFLAoKICBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFCgp9 OwplbnVtCnsKICBQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwKCiAgUFRIUkVBRF9DQU5DRUxfQVNZ TkNIUk9OT1VTCgp9OwoKCgogCgogCgoKZXh0ZXJuIGludCBwdGhyZWFkX2NyZWF0ZSAocHRocmVh ZF90ICpfX3Jlc3RyaWN0IF9fdGhyZWFkLAoJCQkgICBfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpf X3Jlc3RyaWN0IF9fYXR0ciwKCQkJICAgdm9pZCAqKCpfX3N0YXJ0X3JvdXRpbmUpICh2b2lkICop LAoJCQkgICB2b2lkICpfX3Jlc3RyaWN0IF9fYXJnKSB0aHJvdyAoKSA7CgogCmV4dGVybiBwdGhy ZWFkX3QgcHRocmVhZF9zZWxmICh2b2lkKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVh ZF9lcXVhbCAocHRocmVhZF90IF9fdGhyZWFkMSwgcHRocmVhZF90IF9fdGhyZWFkMikgdGhyb3cg KCkgOwoKIApleHRlcm4gdm9pZCBwdGhyZWFkX2V4aXQgKHZvaWQgKl9fcmV0dmFsKQogICAgIHRo cm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgogCgoKZXh0ZXJuIGludCBw dGhyZWFkX2pvaW4gKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSB0aHJv dyAoKSA7CgogCgoKCmV4dGVybiBpbnQgcHRocmVhZF9kZXRhY2ggKHB0aHJlYWRfdCBfX3RoKSB0 aHJvdyAoKSA7CgoKIAoKIAoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2luaXQgKHB0aHJlYWRf YXR0cl90ICpfX2F0dHIpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZGVz dHJveSAocHRocmVhZF9hdHRyX3QgKl9fYXR0cikgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0 aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCQlp bnQgX19kZXRhY2hzdGF0ZSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9n ZXRkZXRhY2hzdGF0ZSAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAoJCQkJCWludCAq X19kZXRhY2hzdGF0ZSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRz Y2hlZHBhcmFtIChwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCgkJCQkgICAgICAg X19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcmVzdHJpY3QKCQkJCSAgICAgICBfX3BhcmFt KSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0gKF9f Y29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKCQkJCSAgICAgICBfX2F0dHIsCgkJCQkg ICAgICAgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0IF9fcGFyYW0pCiAgICAgdGhyb3cg KCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAocHRocmVhZF9h dHRyX3QgKl9fYXR0ciwgaW50IF9fcG9saWN5KQogICAgIHRocm93ICgpIDsKCiAKZXh0ZXJuIGlu dCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9f cmVzdHJpY3QKCQkJCQlfX2F0dHIsIGludCAqX19yZXN0cmljdCBfX3BvbGljeSkKICAgICB0aHJv dyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCAocHRocmVh ZF9hdHRyX3QgKl9fYXR0ciwKCQkJCQkgaW50IF9faW5oZXJpdCkgdGhyb3cgKCkgOwoKIApleHRl cm4gaW50IHB0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgKF9fY29uc3QgcHRocmVhZF9hdHRy X3QgKl9fcmVzdHJpY3QKCQkJCQkgX19hdHRyLCBpbnQgKl9fcmVzdHJpY3QgX19pbmhlcml0KQog ICAgIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NvcGUgKHB0aHJl YWRfYXR0cl90ICpfX2F0dHIsIGludCBfX3Njb3BlKQogICAgIHRocm93ICgpIDsKCiAKZXh0ZXJu IGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVz dHJpY3QgX19hdHRyLAoJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19zY29wZSkgdGhyb3cgKCkgOwoK IyAyNTQgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKCgogCgoKCmV4dGVybiBpbnQgcHRocmVh ZF9hdHRyX3NldHN0YWNrYWRkciAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCSAgICAgIHZv aWQgKl9fc3RhY2thZGRyKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dl dHN0YWNrYWRkciAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdAoJCQkJICAgICAg X19hdHRyLCB2b2lkICoqX19yZXN0cmljdCBfX3N0YWNrYWRkcikKICAgICB0aHJvdyAoKSA7Cgoj IDI3OSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwoKCiAKCgpleHRlcm4gaW50IHB0aHJlYWRf YXR0cl9zZXRzdGFja3NpemUgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJCQkgICAgICBzaXpl X3QgX19zdGFja3NpemUpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0 c3RhY2tzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CgkJCQkgICAgICBf X2F0dHIsIHNpemVfdCAqX19yZXN0cmljdCBfX3N0YWNrc2l6ZSkKICAgICB0aHJvdyAoKSA7Cgog CgogCgpleHRlcm4gaW50IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0 X3RocmVhZCwgaW50IF9fcG9saWN5LAoJCQkJICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAq X19wYXJhbSkKICAgICB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9nZXRzY2hlZHBh cmFtIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLAoJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19w b2xpY3ksCgkJCQkgIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19yZXN0cmljdCBfX3BhcmFtKQogICAg IHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCgoKCgogCgogCgpleHRlcm4gaW50IHB0aHJlYWRfbXV0 ZXhfaW5pdCAocHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgsCgkJCSAgICAgICBf X2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fcmVzdHJpY3QKCQkJICAgICAgIF9fbXV0ZXhf YXR0cikgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRo cmVhZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9t dXRleF90cnlsb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpIDsKCiAKZXh0 ZXJuIGludCBwdGhyZWFkX211dGV4X2xvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhy b3cgKCkgOwoKCgoKCgoKCiAKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3VubG9jayAocHRocmVh ZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKSA7CgoKIAoKIAoKZXh0ZXJuIGludCBwdGhyZWFk X211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpIHRocm93ICgpIDsK CiAKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IChwdGhyZWFkX211dGV4YXR0 cl90ICpfX2F0dHIpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9n ZXRwc2hhcmVkIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKgoJCQkJCSBfX3Jlc3RyaWN0 IF9fYXR0ciwKCQkJCQkgaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkgdGhyb3cgKCkgOwoKIApl eHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfbXV0ZXhhdHRy X3QgKl9fYXR0ciwKCQkJCQkgaW50IF9fcHNoYXJlZCkgdGhyb3cgKCkgOwoKIyAzNzggIi91c3Iv aW5jbHVkZS9wdGhyZWFkLmgiIDMKCgoKIAoKIAoKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfaW5p dCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAoJCQkgICAgICBfX2NvbnN0IHB0 aHJlYWRfY29uZGF0dHJfdCAqX19yZXN0cmljdAoJCQkgICAgICBfX2NvbmRfYXR0cikgdGhyb3cg KCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfY29uZF9kZXN0cm95IChwdGhyZWFkX2NvbmRfdCAq X19jb25kKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3NpZ25hbCAocHRo cmVhZF9jb25kX3QgKl9fY29uZCkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfY29u ZF9icm9hZGNhc3QgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpIHRocm93ICgpIDsKCiAKCmV4dGVy biBpbnQgcHRocmVhZF9jb25kX3dhaXQgKHB0aHJlYWRfY29uZF90ICpfX3Jlc3RyaWN0IF9fY29u ZCwKCQkJICAgICAgcHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgpIHRocm93ICgp IDsKCiAKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IChwdGhyZWFkX2NvbmRf dCAqX19yZXN0cmljdCBfX2NvbmQsCgkJCQkgICBwdGhyZWFkX211dGV4X3QgKl9fcmVzdHJpY3Qg X19tdXRleCwKCQkJCSAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CgkJCQkg ICBfX2Fic3RpbWUpIHRocm93ICgpIDsKCiAKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRy X2luaXQgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyKSB0aHJvdyAoKSA7CgogCmV4dGVybiBp bnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95IChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikg dGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZ2V0cHNoYXJlZCAoX19j b25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKgoJCQkJCV9fcmVzdHJpY3QgX19hdHRyLAoJCQkJCWlu dCAqX19yZXN0cmljdCBfX3BzaGFyZWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFk X2NvbmRhdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyLAoJCQkJCWlu dCBfX3BzaGFyZWQpIHRocm93ICgpIDsKCgojIDQ5NiAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIg MwoKCiMgNTQwICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCgoKCiAKCiAKCgoKCgpleHRlcm4g aW50IHB0aHJlYWRfa2V5X2NyZWF0ZSAocHRocmVhZF9rZXlfdCAqX19rZXksCgkJCSAgICAgICB2 b2lkICgqX19kZXN0cl9mdW5jdGlvbikgKHZvaWQgKikpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGlu dCBwdGhyZWFkX2tleV9kZWxldGUgKHB0aHJlYWRfa2V5X3QgX19rZXkpIHRocm93ICgpIDsKCiAK ZXh0ZXJuIGludCBwdGhyZWFkX3NldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5LAoJCQkJ X19jb25zdCB2b2lkICpfX3BvaW50ZXIpIHRocm93ICgpIDsKCiAKZXh0ZXJuIHZvaWQgKnB0aHJl YWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpIHRocm93ICgpIDsKCgogCgogCgoK CmV4dGVybiBpbnQgcHRocmVhZF9vbmNlIChwdGhyZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2ws CgkJCSB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSkgdGhyb3cgKCkgOwoKCiAKCiAKCmV4 dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAoaW50IF9fc3RhdGUsIGludCAqX19vbGRz dGF0ZSkgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGludCBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKGlu dCBfX3R5cGUsIGludCAqX19vbGR0eXBlKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgcHRocmVh ZF9jYW5jZWwgKHB0aHJlYWRfdCBfX3RocmVhZCkgdGhyb3cgKCkgOwoKIAoKCmV4dGVybiB2b2lk IHB0aHJlYWRfdGVzdGNhbmNlbCAodm9pZCkgdGhyb3cgKCkgOwoKCiAKCgoKCgoKCgoKCmV4dGVy biB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVm ZmVyICpfX2J1ZmZlciwKCQkJCSAgIHZvaWQgKCpfX3JvdXRpbmUpICh2b2lkICopLAoJCQkJICAg dm9pZCAqX19hcmcpIHRocm93ICgpIDsKCiAKCgoKCgpleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVh bnVwX3BvcCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX2J1ZmZlciwKCQkJCSAg aW50IF9fZXhlY3V0ZSkgdGhyb3cgKCkgOwoKIAoKCiMgNjM5ICIvdXNyL2luY2x1ZGUvcHRocmVh ZC5oIiAzCgoKCgoKCgoKCgogCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2lndGhyZWFkLmgiIDEg MwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgogCgpleHRlcm4gaW50IHB0aHJlYWRfc2ln bWFzayAoaW50IF9faG93LAoJCQkgICAgX19jb25zdCBfX3NpZ3NldF90ICpfX3Jlc3RyaWN0IF9f bmV3bWFzaywKCQkJICAgIF9fc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19vbGRtYXNrKXRocm93ICgp IDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2tpbGwgKHB0aHJlYWRfdCBfX3RocmVhZCwgaW50IF9f c2lnbm8pIHRocm93ICgpIDsKCgojIDY1MCAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgoK CiAKCiAKCgoKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdGZvcmsgKHZvaWQgKCpfX3ByZXBh cmUpICh2b2lkKSwKCQkJICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCgkJCSAgIHZvaWQgKCpf X2NoaWxkKSAodm9pZCkpIHRocm93ICgpIDsKCiAKCgpleHRlcm4gdm9pZCBwdGhyZWFkX2tpbGxf b3RoZXJfdGhyZWFkc19ucCAodm9pZCkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHZvaWQgX19wdGhy ZWFkX2luaXRpYWxpemUgKHZvaWQpIHRocm93ICgpIDsKCn0gCgoKIyA3MSAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxv Yy5oIiAyIDMKCgoKCgoKCgojIDg3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDMKCiMgOTcgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf YWxsb2MuaCIgMwoKIyAxMTUgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIgMwoKCgoKCgoKCgogCgoKCgoKIAog CgoKCgoKCgoKCnRlbXBsYXRlIDxpbnQgX19pbnN0PgpjbGFzcyBfX21hbGxvY19hbGxvY190ZW1w bGF0ZSB7Cgpwcml2YXRlOgoKICBzdGF0aWMgdm9pZCogX1Nfb29tX21hbGxvYyhzaXplX3QpOwog IHN0YXRpYyB2b2lkKiBfU19vb21fcmVhbGxvYyh2b2lkKiwgc2l6ZV90KTsKCgogIHN0YXRpYyB2 b2lkICgqIF9fbWFsbG9jX2FsbG9jX29vbV9oYW5kbGVyKSgpOwoKCnB1YmxpYzoKCiAgc3RhdGlj IHZvaWQqIGFsbG9jYXRlKHNpemVfdCBfX24pCiAgewogICAgdm9pZCogX19yZXN1bHQgPSBtYWxs b2MoX19uKTsKICAgIGlmICgwID09IF9fcmVzdWx0KSBfX3Jlc3VsdCA9IF9TX29vbV9tYWxsb2Mo X19uKTsKICAgIHJldHVybiBfX3Jlc3VsdDsKICB9CgogIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUo dm9pZCogX19wLCBzaXplX3QgICkKICB7CiAgICBmcmVlKF9fcCk7CiAgfQoKICBzdGF0aWMgdm9p ZCogcmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCAgLCBzaXplX3QgX19uZXdfc3opCiAgewog ICAgdm9pZCogX19yZXN1bHQgPSByZWFsbG9jKF9fcCwgX19uZXdfc3opOwogICAgaWYgKDAgPT0g X19yZXN1bHQpIF9fcmVzdWx0ID0gX1Nfb29tX3JlYWxsb2MoX19wLCBfX25ld19zeik7CiAgICBy ZXR1cm4gX19yZXN1bHQ7CiAgfQoKICBzdGF0aWMgdm9pZCAoKiBfX3NldF9tYWxsb2NfaGFuZGxl cih2b2lkICgqX19mKSgpKSkoKQogIHsKICAgIHZvaWQgKCogX19vbGQpKCkgPSBfX21hbGxvY19h bGxvY19vb21faGFuZGxlcjsKICAgIF9fbWFsbG9jX2FsbG9jX29vbV9oYW5kbGVyID0gX19mOwog ICAgcmV0dXJuKF9fb2xkKTsKICB9Cgp9OwoKIAoKCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lk ICgqIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD46Ol9fbWFsbG9jX2FsbG9jX29vbV9o YW5kbGVyKSgpID0gMDsKCgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4Kdm9pZCoKX19tYWxsb2NfYWxs b2NfdGVtcGxhdGU8X19pbnN0Pjo6X1Nfb29tX21hbGxvYyhzaXplX3QgX19uKQp7CiAgICB2b2lk ICgqIF9fbXlfbWFsbG9jX2hhbmRsZXIpKCk7CiAgICB2b2lkKiBfX3Jlc3VsdDsKCiAgICBmb3Ig KDs7KSB7CiAgICAgICAgX19teV9tYWxsb2NfaGFuZGxlciA9IF9fbWFsbG9jX2FsbG9jX29vbV9o YW5kbGVyOwogICAgICAgIGlmICgwID09IF9fbXlfbWFsbG9jX2hhbmRsZXIpIHsgdGhyb3cgYmFk X2FsbG9jKCkgOyB9CiAgICAgICAgKCpfX215X21hbGxvY19oYW5kbGVyKSgpOwogICAgICAgIF9f cmVzdWx0ID0gbWFsbG9jKF9fbik7CiAgICAgICAgaWYgKF9fcmVzdWx0KSByZXR1cm4oX19yZXN1 bHQpOwogICAgfQp9Cgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4Kdm9pZCogX19tYWxsb2NfYWxsb2Nf dGVtcGxhdGU8X19pbnN0Pjo6X1Nfb29tX3JlYWxsb2Modm9pZCogX19wLCBzaXplX3QgX19uKQp7 CiAgICB2b2lkICgqIF9fbXlfbWFsbG9jX2hhbmRsZXIpKCk7CiAgICB2b2lkKiBfX3Jlc3VsdDsK CiAgICBmb3IgKDs7KSB7CiAgICAgICAgX19teV9tYWxsb2NfaGFuZGxlciA9IF9fbWFsbG9jX2Fs bG9jX29vbV9oYW5kbGVyOwogICAgICAgIGlmICgwID09IF9fbXlfbWFsbG9jX2hhbmRsZXIpIHsg dGhyb3cgYmFkX2FsbG9jKCkgOyB9CiAgICAgICAgKCpfX215X21hbGxvY19oYW5kbGVyKSgpOwog ICAgICAgIF9fcmVzdWx0ID0gcmVhbGxvYyhfX3AsIF9fbik7CiAgICAgICAgaWYgKF9fcmVzdWx0 KSByZXR1cm4oX19yZXN1bHQpOwogICAgfQp9Cgp0eXBlZGVmIF9fbWFsbG9jX2FsbG9jX3RlbXBs YXRlPDA+IG1hbGxvY19hbGxvYzsKCnRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpj bGFzcyBzaW1wbGVfYWxsb2MgewoKcHVibGljOgogICAgc3RhdGljIF9UcCogYWxsb2NhdGUoc2l6 ZV90IF9fbikKICAgICAgeyByZXR1cm4gMCA9PSBfX24gPyAwIDogKF9UcCopIF9BbGxvYzo6YWxs b2NhdGUoX19uICogc2l6ZW9mIChfVHApKTsgfQogICAgc3RhdGljIF9UcCogYWxsb2NhdGUodm9p ZCkKICAgICAgeyByZXR1cm4gKF9UcCopIF9BbGxvYzo6YWxsb2NhdGUoc2l6ZW9mIChfVHApKTsg fQogICAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShfVHAqIF9fcCwgc2l6ZV90IF9fbikKICAgICAg eyBpZiAoMCAhPSBfX24pIF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZiAoX1Rw KSk7IH0KICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoX1RwKiBfX3ApCiAgICAgIHsgX0FsbG9j OjpkZWFsbG9jYXRlKF9fcCwgc2l6ZW9mIChfVHApKTsgfQp9OwoKIAogCiAKIAogCnRlbXBsYXRl IDxjbGFzcyBfQWxsb2M+CmNsYXNzIGRlYnVnX2FsbG9jIHsKCnByaXZhdGU6CgogIGVudW0ge19T X2V4dHJhID0gOH07ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgIAoKcHVibGljOgoKICBzdGF0aWMgdm9pZCogYWxsb2NhdGUoc2l6ZV90IF9fbikK ICB7CiAgICBjaGFyKiBfX3Jlc3VsdCA9IChjaGFyKilfQWxsb2M6OmFsbG9jYXRlKF9fbiArIF9T X2V4dHJhKTsKICAgICooc2l6ZV90KilfX3Jlc3VsdCA9IF9fbjsKICAgIHJldHVybiBfX3Jlc3Vs dCArIF9TX2V4dHJhOwogIH0KCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNp emVfdCBfX24pCiAgewogICAgY2hhciogX19yZWFsX3AgPSAoY2hhciopX19wIC0gX1NfZXh0cmE7 CiAgICAoKHZvaWQpICgoICooc2l6ZV90KilfX3JlYWxfcCA9PSBfX24gKSA/IDAgOgkoX19hc3Nl cnRfZmFpbCAoIiooc2l6ZV90KilfX3JlYWxfcCA9PSBfX24iICwJIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIs IDI2MywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIF9BbGxvYzo6ZGVhbGxvY2F0 ZShfX3JlYWxfcCwgX19uICsgX1NfZXh0cmEpOwogIH0KCiAgc3RhdGljIHZvaWQqIHJlYWxsb2Nh dGUodm9pZCogX19wLCBzaXplX3QgX19vbGRfc3osIHNpemVfdCBfX25ld19zeikKICB7CiAgICBj aGFyKiBfX3JlYWxfcCA9IChjaGFyKilfX3AgLSBfU19leHRyYTsKICAgICgodm9pZCkgKCggKihz aXplX3QqKV9fcmVhbF9wID09IF9fb2xkX3N6ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIqKHNp emVfdCopX19yZWFsX3AgPT0gX19vbGRfc3oiICwJIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIsIDI3MCwgX19Q UkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIGNoYXIqIF9fcmVzdWx0ID0gKGNoYXIqKQog ICAgICBfQWxsb2M6OnJlYWxsb2NhdGUoX19yZWFsX3AsIF9fb2xkX3N6ICsgX1NfZXh0cmEsIF9f bmV3X3N6ICsgX1NfZXh0cmEpOwogICAgKihzaXplX3QqKV9fcmVzdWx0ID0gX19uZXdfc3o7CiAg ICByZXR1cm4gX19yZXN1bHQgKyBfU19leHRyYTsKICB9Cgp9OwoKCgoKCgoKCgoKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCgogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKdGVtcGxhdGUgPGJv b2wgdGhyZWFkcywgaW50IGluc3Q+CmNsYXNzIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZSB7Cgpw cml2YXRlOgogICAKICAgCgogICAgZW51bSB7X0FMSUdOID0gOH07CiAgICBlbnVtIHtfTUFYX0JZ VEVTID0gMTI4fTsKICAgIGVudW0ge19ORlJFRUxJU1RTID0gX01BWF9CWVRFUy9fQUxJR059OwoK ICBzdGF0aWMgc2l6ZV90CiAgX1Nfcm91bmRfdXAoc2l6ZV90IF9fYnl0ZXMpCiAgICB7IHJldHVy biAoKChfX2J5dGVzKSArIF9BTElHTi0xKSAmIH4oX0FMSUdOIC0gMSkpOyB9Cgpwcml2YXRlIDoK ICB1bmlvbiBfT2JqIHsKICAgICAgICB1bmlvbiBfT2JqKiBfTV9mcmVlX2xpc3RfbGluazsKICAg ICAgICBjaGFyIF9NX2NsaWVudF9kYXRhWzFdOyAgICAgCiAgfTsKcHJpdmF0ZToKCgoKCiAgICBz dGF0aWMgX09iaiogdm9sYXRpbGUgIF9TX2ZyZWVfbGlzdFtfTkZSRUVMSVNUU107CgogIHN0YXRp YyAgc2l6ZV90IF9TX2ZyZWVsaXN0X2luZGV4KHNpemVfdCBfX2J5dGVzKSB7CiAgICAgICAgcmV0 dXJuICgoKF9fYnl0ZXMpICsgX0FMSUdOLTEpL19BTElHTiAtIDEpOwogIH0KCiAgIAogIHN0YXRp YyB2b2lkKiBfU19yZWZpbGwoc2l6ZV90IF9fbik7CiAgIAogICAKICBzdGF0aWMgY2hhciogX1Nf Y2h1bmtfYWxsb2Moc2l6ZV90IF9fc2l6ZSwgaW50JiBfX25vYmpzKTsKCiAgIAogIHN0YXRpYyBj aGFyKiBfU19zdGFydF9mcmVlOwogIHN0YXRpYyBjaGFyKiBfU19lbmRfZnJlZTsKICBzdGF0aWMg c2l6ZV90IF9TX2hlYXBfc2l6ZTsKCgoKCgoKCgogICAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBf U19ub2RlX2FsbG9jYXRvcl9sb2NrOwoKCgoKCgojIDM4OSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoK ICAgIGNsYXNzIF9Mb2NrIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIF9Mb2NrKCkgeyBp ZiAodGhyZWFkcykgcHRocmVhZF9tdXRleF9sb2NrKCZfU19ub2RlX2FsbG9jYXRvcl9sb2NrKSA7 IH0KICAgICAgICAgICAgfl9Mb2NrKCkgeyBpZiAodGhyZWFkcykgcHRocmVhZF9tdXRleF91bmxv Y2soJl9TX25vZGVfYWxsb2NhdG9yX2xvY2spIDsgfQogICAgfTsKICAgIGZyaWVuZCBjbGFzcyBf TG9jazsKCnB1YmxpYzoKCiAgIAogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShzaXplX3QgX19uKQog IHsKICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CiAgICBfT2JqKiAgIF9fcmVz dWx0OwoKICAgIGlmIChfX24gPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAgICAgICAgcmV0dXJu KG1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19uKSk7CiAgICB9CiAgICBfX215X2ZyZWVfbGlzdCA9 IF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fbik7CiAgICAgCiAgICAgCiAgICAg CgogICAgICAgICAKICAgICAgICBfTG9jayBfX2xvY2tfaW5zdGFuY2U7CgogICAgX19yZXN1bHQg PSAqX19teV9mcmVlX2xpc3Q7CiAgICBpZiAoX19yZXN1bHQgPT0gMCkgewogICAgICAgIHZvaWQq IF9fciA9IF9TX3JlZmlsbChfU19yb3VuZF91cChfX24pKTsKICAgICAgICByZXR1cm4gX19yOwog ICAgfQogICAgKl9fbXlfZnJlZV9saXN0ID0gX19yZXN1bHQgLT4gX01fZnJlZV9saXN0X2xpbms7 CiAgICByZXR1cm4gKF9fcmVzdWx0KTsKICB9OwoKICAgCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0 ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewogICAgX09iaiogX19xID0gKF9PYmoqKV9fcDsK ICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CgogICAgaWYgKF9fbiA+IChzaXpl X3QpIF9NQVhfQllURVMpIHsKICAgICAgICBtYWxsb2NfYWxsb2M6OmRlYWxsb2NhdGUoX19wLCBf X24pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIF9fbXlfZnJlZV9saXN0ID0gX1NfZnJlZV9s aXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKICAgICAKCiAgICAgICAgIAogICAgICAgIF9M b2NrIF9fbG9ja19pbnN0YW5jZTsKCiAgICBfX3EgLT4gX01fZnJlZV9saXN0X2xpbmsgPSAqX19t eV9mcmVlX2xpc3Q7CiAgICAqX19teV9mcmVlX2xpc3QgPSBfX3E7CiAgICAgCiAgfQoKICBzdGF0 aWMgdm9pZCogcmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX29sZF9zeiwgc2l6ZV90IF9f bmV3X3N6KTsKCn0gOwoKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8IHRydWUgLCAw PiBhbGxvYzsKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8ZmFsc2UsIDA+IHNpbmds ZV9jbGllbnRfYWxsb2M7CgoKCiAKIAogCiAKdGVtcGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQg X19pbnN0PgpjaGFyKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+ OjpfU19jaHVua19hbGxvYyhzaXplX3QgX19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIF9fbm9ianMpCnsKICAgIGNo YXIqIF9fcmVzdWx0OwogICAgc2l6ZV90IF9fdG90YWxfYnl0ZXMgPSBfX3NpemUgKiBfX25vYmpz OwogICAgc2l6ZV90IF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVlIC0gX1Nfc3RhcnRfZnJlZTsK CiAgICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMpIHsKICAgICAgICBfX3Jlc3Vs dCA9IF9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgX1Nfc3RhcnRfZnJlZSArPSBfX3RvdGFsX2J5dGVz OwogICAgICAgIHJldHVybihfX3Jlc3VsdCk7CiAgICB9IGVsc2UgaWYgKF9fYnl0ZXNfbGVmdCA+ PSBfX3NpemUpIHsKICAgICAgICBfX25vYmpzID0gKGludCkoX19ieXRlc19sZWZ0L19fc2l6ZSk7 CiAgICAgICAgX190b3RhbF9ieXRlcyA9IF9fc2l6ZSAqIF9fbm9ianM7CiAgICAgICAgX19yZXN1 bHQgPSBfU19zdGFydF9mcmVlOwogICAgICAgIF9TX3N0YXJ0X2ZyZWUgKz0gX190b3RhbF9ieXRl czsKICAgICAgICByZXR1cm4oX19yZXN1bHQpOwogICAgfSBlbHNlIHsKICAgICAgICBzaXplX3Qg X19ieXRlc190b19nZXQgPQoJICAyICogX190b3RhbF9ieXRlcyArIF9TX3JvdW5kX3VwKF9TX2hl YXBfc2l6ZSA+PiA0KTsKICAgICAgICAgCiAgICAgICAgaWYgKF9fYnl0ZXNfbGVmdCA+IDApIHsK ICAgICAgICAgICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdCA9CiAgICAgICAgICAg ICAgICAgICAgICAgIF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fYnl0ZXNfbGVm dCk7CgogICAgICAgICAgICAoKF9PYmoqKV9TX3N0YXJ0X2ZyZWUpIC0+IF9NX2ZyZWVfbGlzdF9s aW5rID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAqX19teV9mcmVlX2xpc3QgPSAoX09i aiopX1Nfc3RhcnRfZnJlZTsKICAgICAgICB9CiAgICAgICAgX1Nfc3RhcnRfZnJlZSA9IChjaGFy KiltYWxsb2MoX19ieXRlc190b19nZXQpOwogICAgICAgIGlmICgwID09IF9TX3N0YXJ0X2ZyZWUp IHsKICAgICAgICAgICAgc2l6ZV90IF9faTsKICAgICAgICAgICAgX09iaiogdm9sYXRpbGUgKiBf X215X2ZyZWVfbGlzdDsKCSAgICBfT2JqKiBfX3A7CiAgICAgICAgICAgICAKICAgICAgICAgICAg IAogICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoX19pID0gX19zaXplOyBfX2kgPD0gX01B WF9CWVRFUzsgX19pICs9IF9BTElHTikgewogICAgICAgICAgICAgICAgX19teV9mcmVlX2xpc3Qg PSBfU19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX2kpOwogICAgICAgICAgICAgICAg X19wID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAgICAgaWYgKDAgIT0gX19wKSB7CiAg ICAgICAgICAgICAgICAgICAgKl9fbXlfZnJlZV9saXN0ID0gX19wIC0+IF9NX2ZyZWVfbGlzdF9s aW5rOwogICAgICAgICAgICAgICAgICAgIF9TX3N0YXJ0X2ZyZWUgPSAoY2hhciopX19wOwogICAg ICAgICAgICAgICAgICAgIF9TX2VuZF9mcmVlID0gX1Nfc3RhcnRfZnJlZSArIF9faTsKICAgICAg ICAgICAgICAgICAgICByZXR1cm4oX1NfY2h1bmtfYWxsb2MoX19zaXplLCBfX25vYmpzKSk7CiAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgfQoJICAgIF9TX2VuZF9mcmVlID0gMDsJIAogICAgICAgICAgICBfU19z dGFydF9mcmVlID0gKGNoYXIqKW1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19ieXRlc190b19nZXQp OwogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgIH0KICAg ICAgICBfU19oZWFwX3NpemUgKz0gX19ieXRlc190b19nZXQ7CiAgICAgICAgX1NfZW5kX2ZyZWUg PSBfU19zdGFydF9mcmVlICsgX19ieXRlc190b19nZXQ7CiAgICAgICAgcmV0dXJuKF9TX2NodW5r X2FsbG9jKF9fc2l6ZSwgX19ub2JqcykpOwogICAgfQp9CgoKIAogCiAKdGVtcGxhdGUgPGJvb2wg X190aHJlYWRzLCBpbnQgX19pbnN0Pgp2b2lkKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190 aHJlYWRzLCBfX2luc3Q+OjpfU19yZWZpbGwoc2l6ZV90IF9fbikKewogICAgaW50IF9fbm9ianMg PSAyMDsKICAgIGNoYXIqIF9fY2h1bmsgPSBfU19jaHVua19hbGxvYyhfX24sIF9fbm9ianMpOwog ICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKICAgIF9PYmoqIF9fcmVzdWx0Owog ICAgX09iaiogX19jdXJyZW50X29iajsKICAgIF9PYmoqIF9fbmV4dF9vYmo7CiAgICBpbnQgX19p OwoKICAgIGlmICgxID09IF9fbm9ianMpIHJldHVybihfX2NodW5rKTsKICAgIF9fbXlfZnJlZV9s aXN0ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKCiAgICAgCiAgICAg IF9fcmVzdWx0ID0gKF9PYmoqKV9fY2h1bms7CiAgICAgICpfX215X2ZyZWVfbGlzdCA9IF9fbmV4 dF9vYmogPSAoX09iaiopKF9fY2h1bmsgKyBfX24pOwogICAgICBmb3IgKF9faSA9IDE7IDsgX19p KyspIHsKICAgICAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKICAgICAgICBfX25leHRf b2JqID0gKF9PYmoqKSgoY2hhciopX19uZXh0X29iaiArIF9fbik7CiAgICAgICAgaWYgKF9fbm9i anMgLSAxID09IF9faSkgewogICAgICAgICAgICBfX2N1cnJlbnRfb2JqIC0+IF9NX2ZyZWVfbGlz dF9saW5rID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAg ICAgX19jdXJyZW50X29iaiAtPiBfTV9mcmVlX2xpc3RfbGluayA9IF9fbmV4dF9vYmo7CiAgICAg ICAgfQogICAgICB9CiAgICByZXR1cm4oX19yZXN1bHQpOwp9Cgp0ZW1wbGF0ZSA8Ym9vbCB0aHJl YWRzLCBpbnQgaW5zdD4Kdm9pZCoKX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPHRocmVhZHMsIGlu c3Q+OjpyZWFsbG9jYXRlKHZvaWQqIF9fcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX29sZF9zeiwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25ld19zeikKewogICAg dm9pZCogX19yZXN1bHQ7CiAgICBzaXplX3QgX19jb3B5X3N6OwoKICAgIGlmIChfX29sZF9zeiA+ IChzaXplX3QpIF9NQVhfQllURVMgJiYgX19uZXdfc3ogPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7 CiAgICAgICAgcmV0dXJuKHJlYWxsb2MoX19wLCBfX25ld19zeikpOwogICAgfQogICAgaWYgKF9T X3JvdW5kX3VwKF9fb2xkX3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikpIHJldHVybihfX3Ap OwogICAgX19yZXN1bHQgPSBhbGxvY2F0ZShfX25ld19zeik7CiAgICBfX2NvcHlfc3ogPSBfX25l d19zeiA+IF9fb2xkX3N6PyBfX29sZF9zeiA6IF9fbmV3X3N6OwogICAgbWVtY3B5KF9fcmVzdWx0 LCBfX3AsIF9fY29weV9zeik7CiAgICBkZWFsbG9jYXRlKF9fcCwgX19vbGRfc3opOwogICAgcmV0 dXJuKF9fcmVzdWx0KTsKfQoKCiAgICB0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2lu c3Q+CiAgICBwdGhyZWFkX211dGV4X3QKICAgIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3Ro cmVhZHMsIF9faW5zdD46Ol9TX25vZGVfYWxsb2NhdG9yX2xvY2sKICAgICAgICA9IHswLCAwLCAw LCBQVEhSRUFEX01VVEVYX1RJTUVEX05QLCB7IDAsIDAgIH0gfSA7CgoKCgoKCgoKCiMgNjAyICIv dXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2FsbG9jLmgiIDMKCgojIDY4OSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKdGVtcGxhdGUg PGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgpjaGFyKiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxh dGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19zdGFydF9mcmVlID0gMDsKCnRlbXBsYXRlIDxib29s IF9fdGhyZWFkcywgaW50IF9faW5zdD4KY2hhciogX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9f dGhyZWFkcywgX19pbnN0Pjo6X1NfZW5kX2ZyZWUgPSAwOwoKdGVtcGxhdGUgPGJvb2wgX190aHJl YWRzLCBpbnQgX19pbnN0PgpzaXplX3QgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFk cywgX19pbnN0Pjo6X1NfaGVhcF9zaXplID0gMDsKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywg aW50IF9faW5zdD4KX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0Pjo6 X09iaiogdm9sYXRpbGUgCl9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5z dD4gOjpfU19mcmVlX2xpc3RbCiAgICBfTkZSRUVMSVNUUwpdID0gezAsIDAsIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH07CiAKIAogCgoKCgoKCgoKCgogCiAKIAog CiAKIAogCgoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGFsbG9jYXRvciB7CiAgdHlwZWRl ZiBhbGxvYyBfQWxsb2M7ICAgICAgICAgICAKcHVibGljOgogIHR5cGVkZWYgc2l6ZV90ICAgICBz aXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IF9UcCogICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsK ICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgX1RwJiBjb25z dF9yZWZlcmVuY2U7CiAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CgogIHRlbXBsYXRl IDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+ IG90aGVyOwogIH07CgogIGFsbG9jYXRvcigpIHRocm93KCkgIHt9CiAgYWxsb2NhdG9yKGNvbnN0 IGFsbG9jYXRvciYpIHRocm93KCkgIHt9CiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IGFsbG9jYXRv cihjb25zdCBhbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpICB7fQogIH5hbGxvY2F0b3IoKSB0aHJv dygpICB7fQoKICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4g Jl9feDsgfQogIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25z dCB7IHJldHVybiAmX194OyB9CgogICAKICAgCiAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19u LCBjb25zdCB2b2lkKiA9IDApIHsKICAgIHJldHVybiBfX24gIT0gMCA/IHN0YXRpY19jYXN0PF9U cCo+KF9BbGxvYzo6YWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCkpKQogICAgICAgICAgICAgICAg ICAgIDogMDsKICB9CgogICAKICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlw ZSBfX24pCiAgICB7IF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZihfVHApKTsg fQoKICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIAogICAgeyByZXR1cm4gc2l6 ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CgogIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBj b25zdCBfVHAmIF9fdmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KICB2b2lkIGRlc3Ryb3ko cG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KfTsKCnRlbXBsYXRlPD4KY2xhc3MgYWxsb2Nh dG9yPHZvaWQ+IHsKICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0 cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7 CiAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdm9pZCAgICAg ICAgdmFsdWVfdHlwZTsKCiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewog ICAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7CiAgfTsKfTsKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1QxLCBjbGFzcyBfVDI+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9y PF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpCnsKICByZXR1cm4gdHJ1ZTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGFs bG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQp7CiAgcmV0dXJuIGZhbHNlOwp9 CgogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3Qg X19hbGxvY2F0b3IgewogIF9BbGxvYyBfX3VuZGVybHlpbmdfYWxsb2M7CgogIHR5cGVkZWYgc2l6 ZV90ICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAg dHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3Bv aW50ZXI7CiAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0IF9U cCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOwoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CiAgICB0eXBlZGVmIF9fYWxsb2Nh dG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7CiAgfTsKCiAgX19hbGxvY2F0b3IoKSB0aHJvdygpICB7 fQogIF9fYWxsb2NhdG9yKGNvbnN0IF9fYWxsb2NhdG9yJiBfX2EpIHRocm93KCkgCiAgICA6IF9f dW5kZXJseWluZ19hbGxvYyhfX2EuX191bmRlcmx5aW5nX2FsbG9jKSB7fQogIHRlbXBsYXRlIDxj bGFzcyBfVHAxPgogIF9fYWxsb2NhdG9yKGNvbnN0IF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4m IF9fYSkgdGhyb3coKSAKICAgIDogX191bmRlcmx5aW5nX2FsbG9jKF9fYS5fX3VuZGVybHlpbmdf YWxsb2MpIHt9CiAgfl9fYWxsb2NhdG9yKCkgdGhyb3coKSAge30KCiAgcG9pbnRlciBhZGRyZXNz KHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KICBjb25zdF9wb2ludGVyIGFk ZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQoKICAgCiAg X1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApIHsKICAgIHJldHVy biBfX24gIT0gMAogICAgICAgID8gc3RhdGljX2Nhc3Q8X1RwKj4oX191bmRlcmx5aW5nX2FsbG9j LmFsbG9jYXRlKF9fbiAqIHNpemVvZihfVHApKSkKICAgICAgICA6IDA7CiAgfQoKICAgCiAgdm9p ZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQogICAgeyBfX3VuZGVybHlp bmdfYWxsb2MuZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZihfVHApKTsgfQoKICBzaXplX3R5 cGUgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIAogICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNp emVvZihfVHApOyB9CgogIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9f dmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3Ap IHsgX19wLT5+X1RwKCk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmNsYXNzIF9fYWxs b2NhdG9yPHZvaWQsIF9BbGxvYz4gewogIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOwog IHR5cGVkZWYgcHRyZGlmZl90ICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCogICAg ICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRl ZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOwoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0 IHJlYmluZCB7CiAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7CiAg fTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJvb2wgb3Bl cmF0b3I9PShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTEsCiAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+JiBfX2EyKQp7CiAgcmV0 dXJuIF9fYTEuX191bmRlcmx5aW5nX2FsbG9jID09IF9fYTIuX191bmRlcmx5aW5nX2FsbG9jOwp9 CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRv ciE9KGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMSwKICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTIpCnsKICByZXR1cm4g X19hMS5fX3VuZGVybHlpbmdfYWxsb2MgIT0gX19hMi5fX3VuZGVybHlpbmdfYWxsb2M7Cn0KCgog CiAKIAoKdGVtcGxhdGUgPGludCBpbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPGluc3Q+JiwKICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxpbnN0PiYpCnsKICByZXR1cm4gdHJ1ZTsKfQoKCnRl bXBsYXRlIDxpbnQgX19pbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fbWFsbG9j X2FsbG9jX3RlbXBsYXRlPF9faW5zdD4mLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4mKQp7CiAgcmV0dXJuIGZhbHNlOwp9CgoKCnRl bXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KaW5saW5lIGJvb2wgb3BlcmF0b3I9 PShjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+JiwKICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+JikKewogIHJldHVybiB0cnVlOwp9CgoKdGVtcGxhdGUgPGJvb2wgX190aHJl YWRzLCBpbnQgX19pbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fZGVmYXVsdF9h bGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4mLAogICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4mKQp7CiAg cmV0dXJuIGZhbHNlOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9w ZXJhdG9yPT0oY29uc3QgZGVidWdfYWxsb2M8X0FsbG9jPiYsCiAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgZGVidWdfYWxsb2M8X0FsbG9jPiYpIHsKICByZXR1cm4gdHJ1ZTsKfQoKCnRlbXBs YXRlIDxjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgZGVidWdfYWxs b2M8X0FsbG9jPiYsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVidWdfYWxsb2M8X0Fs bG9jPiYpIHsKICByZXR1cm4gZmFsc2U7Cn0KCgogCiAKIAogCiAKIAoKIAogCiAKIAogCiAKCiAK IAogCiAKIAogCiAKIAogCiAKIAoKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9j YXRvcj4Kc3RydWN0IF9BbGxvY190cmFpdHMKewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3Rh bmNlbGVzcyA9IGZhbHNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6ICAgcmViaW5k PF9UcD46Om90aGVyCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKfTsKCnRlbXBsYXRlIDxjbGFz cyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CmNvbnN0IGJvb2wgX0FsbG9jX3RyYWl0czxfVHAsIF9B bGxvY2F0b3I+OjpfU19pbnN0YW5jZWxlc3M7CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfVHAxPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIGFsbG9jYXRvcjxfVHAxPiA+CnsKICBz dGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxl X2FsbG9jPF9UcCwgYWxsb2M+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgYWxsb2NhdG9yPF9UcD4g YWxsb2NhdG9yX3R5cGU7Cn07CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBpbnQgX19pbnN0Pgpz dHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4g Pgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVm IHNpbXBsZV9hbGxvYzxfVHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBfQWxs b2NfdHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxh dGU8X19pbnN0PiA+IGFsbG9jYXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGJv b2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fZGVm YXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgp7CiAgc3RhdGljIGNvbnN0 IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAs IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgogICAgICAgICAg X0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7Cn07 CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0 czxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5z dGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAsIGRlYnVnX2FsbG9j PF9BbGxvYz4gPiBfQWxsb2NfdHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgZGVidWdf YWxsb2M8X0FsbG9jPiA+IGFsbG9jYXRvcl90eXBlOwp9OwoKIAogCgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwLCBjbGFzcyBfVHAxLCBpbnQgX19pbnN0PgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsCiAg ICAgICAgICAgICAgICAgICAgIF9fYWxsb2NhdG9yPF9UcDEsIF9fbWFsbG9jX2FsbG9jX3RlbXBs YXRlPF9faW5zdD4gPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0 cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8 X19pbnN0PiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxv Y19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgYm9vbCBfX3RociwgaW50IF9faW5zdD4Kc3RydWN0IF9B bGxvY190cmFpdHM8X1RwLAogICAgICAgICAgICAgICAgICAgICAgX19hbGxvY2F0b3I8X1RwMSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0 ZTxfX3RociwgX19pbnN0PiA+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVz cyA9IHRydWU7CiAgdHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVt cGxhdGU8X190aHIsX19pbnN0PiA+CiAgICAgICAgICBfQWxsb2NfdHlwZTsKICB0eXBlZGVmIF9f YWxsb2NhdG9yPF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyLF9faW5zdD4gPgog ICAgICAgICAgYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X1RwMSwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fYWxsb2NhdG9y PF9UcDEsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19p bnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgZGVidWdfYWxs b2M8X0FsbG9jPiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBkZWJ1 Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKCgoKCgoKIAoKCgoKCiAKIAog CiMgMTkgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9tZW1vcnkiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2NvbnN0cnVjdC5oIiAxIDMKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCiAKCiAKIAoKdGVtcGxhdGUgPGNsYXNz IF9UcD4KaW5saW5lIHZvaWQgZGVzdHJveShfVHAqIF9fcG9pbnRlcikgewogIF9fcG9pbnRlci0+ fl9UcCgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CmlubGluZSB2b2lkIGNv bnN0cnVjdChfVDEqIF9fcCwgY29uc3QgX1QyJiBfX3ZhbHVlKSB7CiAgbmV3IChfX3ApIF9UMShf X3ZhbHVlKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMT4KaW5saW5lIHZvaWQgY29uc3RydWN0KF9U MSogX19wKSB7CiAgbmV3IChfX3ApIF9UMSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyYXRvcj4KaW5saW5lIHZvaWQKX19kZXN0cm95X2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmly c3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfX2ZhbHNlX3R5cGUpCnsKICBmb3IgKCA7IF9f Zmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBkZXN0cm95KCYqX19maXJzdCk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgppbmxpbmUgdm9pZCBfX2Rlc3Ryb3lfYXV4 KF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9fdHJ1ZV90eXBlKSB7fQoKdGVt cGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcD4KaW5saW5lIHZvaWQKX19k ZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3Qs IF9UcCopCnsKICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3RyaXZp YWxfZGVzdHJ1Y3RvcgogICAgICAgICAgX1RyaXZpYWxfZGVzdHJ1Y3RvcjsKICBfX2Rlc3Ryb3lf YXV4KF9fZmlyc3QsIF9fbGFzdCwgX1RyaXZpYWxfZGVzdHJ1Y3RvcigpKTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGluZSB2b2lkIGRlc3Ryb3koX0ZvcndhcmRJdGVy YXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgewogIF9fZGVzdHJveShfX2Zp cnN0LCBfX2xhc3QsIF9fdmFsdWVfdHlwZSggX19maXJzdCApICk7Cn0KCmlubGluZSB2b2lkIGRl c3Ryb3koY2hhciosIGNoYXIqKSB7fQppbmxpbmUgdm9pZCBkZXN0cm95KHdjaGFyX3QqLCB3Y2hh cl90Kikge30KCiAKCgoKIAogCiAKIyAyMCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL21lbW9yeSIgMiAzCgojIDEgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf dGVtcGJ1Zi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIAoKdGVt cGxhdGUgPGNsYXNzIF9UcD4KcGFpcjxfVHAqLCBwdHJkaWZmX3Q+IApfX2dldF90ZW1wb3Jhcnlf YnVmZmVyKHB0cmRpZmZfdCBfX2xlbiwgX1RwKikKewogIGlmIChfX2xlbiA+IHB0cmRpZmZfdCgy MTQ3NDgzNjQ3ICAgLyBzaXplb2YoX1RwKSkpCiAgICBfX2xlbiA9IDIxNDc0ODM2NDcgICAvIHNp emVvZihfVHApOwoKICB3aGlsZSAoX19sZW4gPiAwKSB7CiAgICBfVHAqIF9fdG1wID0gKF9UcCop IG1hbGxvYygoc2l6ZV90KV9fbGVuICogc2l6ZW9mKF9UcCkpOwogICAgaWYgKF9fdG1wICE9IDAp CiAgICAgIHJldHVybiBwYWlyPF9UcCosIHB0cmRpZmZfdD4oX190bXAsIF9fbGVuKTsKICAgIF9f bGVuIC89IDI7CiAgfQoKICByZXR1cm4gcGFpcjxfVHAqLCBwdHJkaWZmX3Q+KChfVHAqKTAsIDAp Owp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBwYWlyPF9UcCosIHB0cmRpZmZfdD4g Z2V0X3RlbXBvcmFyeV9idWZmZXIocHRyZGlmZl90IF9fbGVuKSB7CiAgcmV0dXJuIF9fZ2V0X3Rl bXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAqKSAwKTsKfQoKCgogCiAKIAogCiAKdGVtcGxhdGUg PGNsYXNzIF9UcD4KaW5saW5lIHBhaXI8X1RwKiwgcHRyZGlmZl90PiBnZXRfdGVtcG9yYXJ5X2J1 ZmZlcihwdHJkaWZmX3QgX19sZW4sIF9UcCopIHsKICByZXR1cm4gX19nZXRfdGVtcG9yYXJ5X2J1 ZmZlcihfX2xlbiwgKF9UcCopIDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgp2b2lkIHJldHVy bl90ZW1wb3JhcnlfYnVmZmVyKF9UcCogX19wKSB7CiAgZnJlZShfX3ApOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgpjbGFzcyBfVGVtcG9yYXJ5X2J1ZmZl ciB7CnByaXZhdGU6CiAgcHRyZGlmZl90ICBfTV9vcmlnaW5hbF9sZW47CiAgcHRyZGlmZl90ICBf TV9sZW47CiAgX1RwKiAgICAgICBfTV9idWZmZXI7CgogIHZvaWQgX01fYWxsb2NhdGVfYnVmZmVy KCkgewogICAgX01fb3JpZ2luYWxfbGVuID0gX01fbGVuOwogICAgX01fYnVmZmVyID0gMDsKCiAg ICBpZiAoX01fbGVuID4gKHB0cmRpZmZfdCkoMjE0NzQ4MzY0NyAgIC8gc2l6ZW9mKF9UcCkpKQog ICAgICBfTV9sZW4gPSAyMTQ3NDgzNjQ3ICAgLyBzaXplb2YoX1RwKTsKCiAgICB3aGlsZSAoX01f bGVuID4gMCkgewogICAgICBfTV9idWZmZXIgPSAoX1RwKikgbWFsbG9jKF9NX2xlbiAqIHNpemVv ZihfVHApKTsKICAgICAgaWYgKF9NX2J1ZmZlcikKICAgICAgICBicmVhazsKICAgICAgX01fbGVu IC89IDI7CiAgICB9CiAgfQoKICB2b2lkIF9NX2luaXRpYWxpemVfYnVmZmVyKGNvbnN0IF9UcCYs IF9fdHJ1ZV90eXBlKSB7fQogIHZvaWQgX01faW5pdGlhbGl6ZV9idWZmZXIoY29uc3QgX1RwJiB2 YWwsIF9fZmFsc2VfdHlwZSkgewogICAgdW5pbml0aWFsaXplZF9maWxsX24oX01fYnVmZmVyLCBf TV9sZW4sIHZhbCk7CiAgfQoKcHVibGljOgogIHB0cmRpZmZfdCBzaXplKCkgY29uc3QgeyByZXR1 cm4gX01fbGVuOyB9CiAgcHRyZGlmZl90IHJlcXVlc3RlZF9zaXplKCkgY29uc3QgeyByZXR1cm4g X01fb3JpZ2luYWxfbGVuOyB9CiAgX1RwKiBiZWdpbigpIHsgcmV0dXJuIF9NX2J1ZmZlcjsgfQog IF9UcCogZW5kKCkgeyByZXR1cm4gX01fYnVmZmVyICsgX01fbGVuOyB9CgogIF9UZW1wb3Jhcnlf YnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3Qp IHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+OjpoYXNfdHJpdmlhbF9k ZWZhdWx0X2NvbnN0cnVjdG9yCiAgICAgICAgICAgIF9Ucml2aWFsOwogICAgdHJ5ICB7CiAgICAg IF9NX2xlbiA9IDA7CiAgICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX01fbGVuKTsKICAg ICAgX01fYWxsb2NhdGVfYnVmZmVyKCk7CiAgICAgIGlmIChfTV9sZW4gPiAwKQogICAgICAgIF9N X2luaXRpYWxpemVfYnVmZmVyKCpfX2ZpcnN0LCBfVHJpdmlhbCgpKTsKICAgIH0KICAgIGNhdGNo KC4uLikgeyAgZnJlZShfTV9idWZmZXIpOyBfTV9idWZmZXIgPSAwOyBfTV9sZW4gPSAwIDsgdGhy b3c7IH0gOwogIH0KIAogIH5fVGVtcG9yYXJ5X2J1ZmZlcigpIHsgIAogICAgZGVzdHJveShfTV9i dWZmZXIsIF9NX2J1ZmZlciArIF9NX2xlbik7CiAgICBmcmVlKF9NX2J1ZmZlcik7CiAgfQoKcHJp dmF0ZToKICAgCiAgX1RlbXBvcmFyeV9idWZmZXIoY29uc3QgX1RlbXBvcmFyeV9idWZmZXImKSB7 fQogIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9UZW1wb3JhcnlfYnVmZmVyJikge30KfTsKCiAKCnRl bXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCAKICAgICAgICAgIGNsYXNzIF9UcCAKCiAg ICAgICAgICAgICAgICAgICAgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVy YXRvcj46OnZhbHVlX3R5cGUKCiAgICAgICAgID4Kc3RydWN0IHRlbXBvcmFyeV9idWZmZXIgOiBw dWJsaWMgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPgp7CiAgdGVtcG9y YXJ5X2J1ZmZlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19s YXN0KQogICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmly c3QsIF9fbGFzdCkge30KICB+dGVtcG9yYXJ5X2J1ZmZlcigpIHt9Cn07CiAgICAKIAoKCgogCiAK IAojIDIxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2lu Y2x1ZGUvZysrLTMvbWVtb3J5IiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4 LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF91bmluaXRpYWxpemVkLmgiIDEg MwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCiAKCiAKIAp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgX0ZvcndhcmRJdGVy IApfX3VuaW5pdGlhbGl6ZWRfY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVy IF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwK ICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJ1ZV90eXBlKQp7CiAgcmV0dXJuIGNvcHkoX19m aXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBj bGFzcyBfRm9yd2FyZEl0ZXI+Cl9Gb3J3YXJkSXRlciAKX191bmluaXRpYWxpemVkX2NvcHlfYXV4 KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBf X2ZhbHNlX3R5cGUpCnsKICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKICB0cnkgIHsK ICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX2N1cikKICAgICAg Y29uc3RydWN0KCYqX19jdXIsICpfX2ZpcnN0KTsKICAgIHJldHVybiBfX2N1cjsKICB9CiAgY2F0 Y2goLi4uKSB7ICBkZXN0cm95KF9fcmVzdWx0LCBfX2N1cikgOyB0aHJvdzsgfSA7Cn0KCgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+Cmlu bGluZSBfRm9yd2FyZEl0ZXIKX191bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0 LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9f cmVzdWx0LCBfVHAqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omlz X1BPRF90eXBlIF9Jc19QT0Q7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9jb3B5X2F1eChfX2Zp cnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfSXNfUE9EKCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgX0ZvcndhcmRJdGVyCiAgdW5pbml0 aWFsaXplZF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKewogIHJldHVybiBfX3VuaW5p dGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoIF9fcmVzdWx0ICkgKTsKfQoKaW5saW5lIGNoYXIq IHVuaW5pdGlhbGl6ZWRfY29weShjb25zdCBjaGFyKiBfX2ZpcnN0LCBjb25zdCBjaGFyKiBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogX19yZXN1bHQpIHsKICBt ZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBfX2xhc3QgLSBfX2ZpcnN0KTsKICByZXR1cm4gX19y ZXN1bHQgKyAoX19sYXN0IC0gX19maXJzdCk7Cn0KCmlubGluZSB3Y2hhcl90KiAKdW5pbml0aWFs aXplZF9jb3B5KGNvbnN0IHdjaGFyX3QqIF9fZmlyc3QsIGNvbnN0IHdjaGFyX3QqIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIF9fcmVzdWx0KQp7CiAgbWVtbW92ZShfX3Jlc3Vs dCwgX19maXJzdCwgc2l6ZW9mKHdjaGFyX3QpICogKF9fbGFzdCAtIF9fZmlyc3QpKTsKICByZXR1 cm4gX19yZXN1bHQgKyAoX19sYXN0IC0gX19maXJzdCk7Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgpwYWlyPF9JbnB1dEl0 ZXIsIF9Gb3J3YXJkSXRlcj4KX191bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmly c3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9f cmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKewogIF9G b3J3YXJkSXRlciBfX2N1ciA9IF9fcmVzdWx0OwogIHRyeSAgewogICAgZm9yICggOyBfX2NvdW50 ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKSAKICAgICAgY29uc3RydWN0KCYq X19jdXIsICpfX2ZpcnN0KTsKICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRl cj4oX19maXJzdCwgX19jdXIpOwogIH0KICBjYXRjaCguLi4pIHsgIGRlc3Ryb3koX19yZXN1bHQs IF9fY3VyKSA7IHRocm93OyB9IDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVy LCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgcGFpcjxfUmFuZG9tQWNj ZXNzSXRlciwgX0ZvcndhcmRJdGVyPgpfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9SYW5kb21BY2Nl c3NJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgX0Zv cndhcmRJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3Nf aXRlcmF0b3JfdGFnKSB7CiAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0ID0gX19maXJzdCArIF9f Y291bnQ7CiAgcmV0dXJuIHBhaXI8X1JhbmRvbUFjY2Vzc0l0ZXIsIF9Gb3J3YXJkSXRlcj4oCiAg ICAgICAgICAgICAgICAgX19sYXN0LAogICAgICAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRfY29w eShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgcGFpcjxfSW5wdXRJ dGVyLCBfRm9yd2FyZEl0ZXI+Cl9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2Zp cnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19y ZXN1bHQpIHsKICByZXR1cm4gX191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50 LCBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2Nh dGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNz IF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3 YXJkSXRlcj4KdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBf X2NvdW50LAogICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpIHsKICBy ZXR1cm4gX191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2Zp cnN0ICkgKTsKfQoKIAogCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4K aW5saW5lIHZvaWQKX191bmluaXRpYWxpemVkX2ZpbGxfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0 LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9U cCYgX194LCBfX3RydWVfdHlwZSkKewogIGZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gpOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CnZvaWQKX191bmluaXRpYWxp emVkX2ZpbGxfYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCAK ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBfX2ZhbHNlX3R5cGUpCnsK ICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OwogIHRyeSAgewogICAgZm9yICggOyBfX2N1 ciAhPSBfX2xhc3Q7ICsrX19jdXIpCiAgICAgIGNvbnN0cnVjdCgmKl9fY3VyLCBfX3gpOwogIH0K ICBjYXRjaCguLi4pIHsgIGRlc3Ryb3koX19maXJzdCwgX19jdXIpIDsgdGhyb3c7IH0gOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9UcDE+CmlubGlu ZSB2b2lkIF9fdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1Rw JiBfX3gsIF9UcDEqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcDE+Ojpp c19QT0RfdHlwZSBfSXNfUE9EOwogIF9fdW5pbml0aWFsaXplZF9maWxsX2F1eChfX2ZpcnN0LCBf X2xhc3QsIF9feCwgX0lzX1BPRCgpKTsKICAgICAgICAgICAgICAgICAgIAp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CmlubGluZSB2b2lkIHVuaW5pdGlhbGl6ZWRf ZmlsbChfRm9yd2FyZEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9Gb3J3YXJkSXRlciBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgX1RwJiBfX3gpCnsKICBfX3VuaW5pdGlhbGl6ZWRfZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9f eCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKIAogCnRlbXBsYXRlIDxjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CmlubGluZSBfRm9yd2FyZEl0ZXIKX191 bmluaXRpYWxpemVkX2ZpbGxfbl9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIF9fdHJ1ZV90eXBlKQp7 CiAgcmV0dXJuIGZpbGxfbihfX2ZpcnN0LCBfX24sIF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf Rm9yd2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+Cl9Gb3J3YXJkSXRlcgpfX3VuaW5p dGlhbGl6ZWRfZmlsbF9uX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLAogICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgX19mYWxzZV90eXBlKQp7CiAg X0ZvcndhcmRJdGVyIF9fY3VyID0gX19maXJzdDsKICB0cnkgIHsKICAgIGZvciAoIDsgX19uID4g MDsgLS1fX24sICsrX19jdXIpCiAgICAgIGNvbnN0cnVjdCgmKl9fY3VyLCBfX3gpOwogICAgcmV0 dXJuIF9fY3VyOwogIH0KICBjYXRjaCguLi4pIHsgIGRlc3Ryb3koX19maXJzdCwgX19jdXIpIDsg dGhyb3c7IH0gOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU2l6ZSwg Y2xhc3MgX1RwLCBjbGFzcyBfVHAxPgppbmxpbmUgX0ZvcndhcmRJdGVyIApfX3VuaW5pdGlhbGl6 ZWRfZmlsbF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX194 LCBfVHAxKikKewogIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHAxPjo6aXNfUE9E X3R5cGUgX0lzX1BPRDsKICByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxfbl9hdXgoX19maXJz dCwgX19uLCBfX3gsIF9Jc19QT0QoKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIs IGNsYXNzIF9TaXplLCBjbGFzcyBfVHA+CmlubGluZSBfRm9yd2FyZEl0ZXIgCnVuaW5pdGlhbGl6 ZWRfZmlsbF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX194 KQp7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9maWxsX24oX19maXJzdCwgX19uLCBfX3gsIF9f dmFsdWVfdHlwZSggX19maXJzdCApICk7Cn0KCiAKIAoKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNz IF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxp bmUgX0ZvcndhcmRJdGVyCl9fdW5pbml0aWFsaXplZF9jb3B5X2NvcHkoX0lucHV0SXRlcjEgX19m aXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQp7CiAgX0ZvcndhcmRJdGVyIF9fbWlkID0g dW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CiAgdHJ5ICB7 CiAgICByZXR1cm4gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBfX21pZCk7 CiAgfQogIGNhdGNoKC4uLikgeyAgZGVzdHJveShfX3Jlc3VsdCwgX19taWQpIDsgdGhyb3c7IH0g Owp9CgogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNz IF9JbnB1dEl0ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIgCl9fdW5pbml0aWFsaXplZF9maWxsX2Nv cHkoX0ZvcndhcmRJdGVyIF9fcmVzdWx0LCBfRm9yd2FyZEl0ZXIgX19taWQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKewogIHVuaW5pdGlhbGl6ZWRf ZmlsbChfX3Jlc3VsdCwgX19taWQsIF9feCk7CiAgdHJ5ICB7CiAgICByZXR1cm4gdW5pbml0aWFs aXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19taWQpOwogIH0KICBjYXRjaCguLi4pIHsgIGRl c3Ryb3koX19yZXN1bHQsIF9fbWlkKSA7IHRocm93OyB9IDsKfQoKIAogCiAKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxpbmUgdm9p ZApfX3VuaW5pdGlhbGl6ZWRfY29weV9maWxsKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0 ZXIgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJz dDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IF9UcCYgX194KQp7CiAgX0ZvcndhcmRJdGVyIF9fbWlkMiA9IHVuaW5pdGlhbGl6ZWRfY29weShf X2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOwogIHRyeSAgewogICAgdW5pbml0aWFsaXplZF9m aWxsKF9fbWlkMiwgX19sYXN0MiwgX194KTsKICB9CiAgY2F0Y2goLi4uKSB7ICBkZXN0cm95KF9f Zmlyc3QyLCBfX21pZDIpIDsgdGhyb3c7IH0gOwp9CgogCgoKCiAKIAogCiMgMjIgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tZW1v cnkiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKIAoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0 b3IsIGNsYXNzIF9UcD4KY2xhc3MgcmF3X3N0b3JhZ2VfaXRlcmF0b3Igewpwcm90ZWN0ZWQ6CiAg X0ZvcndhcmRJdGVyYXRvciBfTV9pdGVyOwpwdWJsaWM6CiAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0 b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2 YWx1ZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiB2b2lkICAg ICAgICAgICAgICAgIHJlZmVyZW5jZTsKCiAgZXhwbGljaXQgcmF3X3N0b3JhZ2VfaXRlcmF0b3Io X0ZvcndhcmRJdGVyYXRvciBfX3gpIDogX01faXRlcihfX3gpIHt9CiAgcmF3X3N0b3JhZ2VfaXRl cmF0b3ImIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CiAgcmF3X3N0b3JhZ2VfaXRlcmF0 b3ImIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fZWxlbWVudCkgewogICAgY29uc3RydWN0KCYqX01f aXRlciwgX19lbGVtZW50KTsKICAgIHJldHVybiAqdGhpczsKICB9ICAgICAgICAKICByYXdfc3Rv cmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+JiBvcGVyYXRvcisrKCkgewogICAg KytfTV9pdGVyOwogICAgcmV0dXJuICp0aGlzOwogIH0KICByYXdfc3RvcmFnZV9pdGVyYXRvcjxf Rm9yd2FyZEl0ZXJhdG9yLCBfVHA+IG9wZXJhdG9yKysoaW50KSB7CiAgICByYXdfc3RvcmFnZV9p dGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+IF9fdG1wID0gKnRoaXM7CiAgICArK19NX2l0 ZXI7CiAgICByZXR1cm4gX190bXA7CiAgfQp9OwoKIyA3MyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9yYXdfc3RvcmFnZV9p dGVyLmgiIDMKCgogCgoKCiAKIAogCiMgMjMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tZW1vcnkiIDIgMwoKCgoKCiAKCnRlbXBs YXRlIDxjbGFzcyBfVHA+IGNsYXNzIGF1dG9fcHRyIHsKcHJpdmF0ZToKICBfVHAqIF9NX3B0cjsK CnB1YmxpYzoKICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CiAgZXhwbGljaXQgYXV0b19wdHIo X1RwKiBfX3AgPSAwKSB0aHJvdygpICA6IF9NX3B0cihfX3ApIHt9CiAgYXV0b19wdHIoYXV0b19w dHImIF9fYSkgdGhyb3coKSAgOiBfTV9wdHIoX19hLnJlbGVhc2UoKSkge30KICB0ZW1wbGF0ZSA8 Y2xhc3MgX1RwMT4gYXV0b19wdHIoYXV0b19wdHI8X1RwMT4mIF9fYSkgdGhyb3coKSAKICAgIDog X01fcHRyKF9fYS5yZWxlYXNlKCkpIHt9CiAgYXV0b19wdHImIG9wZXJhdG9yPShhdXRvX3B0ciYg X19hKSB0aHJvdygpICB7CiAgICBpZiAoJl9fYSAhPSB0aGlzKSB7CiAgICAgIGRlbGV0ZSBfTV9w dHI7CiAgICAgIF9NX3B0ciA9IF9fYS5yZWxlYXNlKCk7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7 CiAgfQogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPgogIGF1dG9fcHRyJiBvcGVyYXRvcj0oYXV0b19w dHI8X1RwMT4mIF9fYSkgdGhyb3coKSAgewogICAgaWYgKF9fYS5nZXQoKSAhPSB0aGlzLT5nZXQo KSkgewogICAgICBkZWxldGUgX01fcHRyOwogICAgICBfTV9wdHIgPSBfX2EucmVsZWFzZSgpOwog ICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KICB+YXV0b19wdHIoKSB0aHJvdygpICB7IGRlbGV0 ZSBfTV9wdHI7IH0KCiAgX1RwJiBvcGVyYXRvciooKSBjb25zdCB0aHJvdygpICB7CiAgICByZXR1 cm4gKl9NX3B0cjsKICB9CiAgX1RwKiBvcGVyYXRvci0+KCkgY29uc3QgdGhyb3coKSAgewogICAg cmV0dXJuIF9NX3B0cjsKICB9CiAgX1RwKiBnZXQoKSBjb25zdCB0aHJvdygpICB7CiAgICByZXR1 cm4gX01fcHRyOwogIH0KICBfVHAqIHJlbGVhc2UoKSB0aHJvdygpICB7CiAgICBfVHAqIF9fdG1w ID0gX01fcHRyOwogICAgX01fcHRyID0gMDsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgdm9pZCBy ZXNldChfVHAqIF9fcCA9IDApIHRocm93KCkgIHsKICAgIGRlbGV0ZSBfTV9wdHI7CiAgICBfTV9w dHIgPSBfX3A7CiAgfQoKICAgCiAgIAogICAKICAgCiAgCgoKcHJpdmF0ZToKICB0ZW1wbGF0ZTxj bGFzcyBfVHAxPiBzdHJ1Y3QgYXV0b19wdHJfcmVmIHsKICAgIF9UcDEqIF9NX3B0cjsKICAgIGF1 dG9fcHRyX3JlZihfVHAxKiBfX3ApIDogX01fcHRyKF9fcCkge30KICB9OwoKcHVibGljOgogIGF1 dG9fcHRyKGF1dG9fcHRyX3JlZjxfVHA+IF9fcmVmKSB0aHJvdygpIAogICAgOiBfTV9wdHIoX19y ZWYuX01fcHRyKSB7fQogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBvcGVyYXRvciBhdXRvX3B0cl9y ZWY8X1RwMT4oKSB0aHJvdygpICAKICAgIHsgcmV0dXJuIGF1dG9fcHRyX3JlZjxfVHA+KHRoaXMt PnJlbGVhc2UoKSk7IH0KICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gb3BlcmF0b3IgYXV0b19wdHI8 X1RwMT4oKSB0aHJvdygpIAogICAgeyByZXR1cm4gYXV0b19wdHI8X1RwMT4odGhpcy0+cmVsZWFz ZSgpKTsgfQoKCn07CgogCgoKCgoKIAogCiAKIyA5ICIuLi9mdW5jdGlvbi8uLi9zcGFjZS8uLi9n ZW9tZXRyeS9nZW9DZWxsLmgiIDIKCgoKCiMgMSAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2Vv bWV0cnkvLi4vdG9vbGJveC90YnhEeW5BcnJheS5oIiAxCiAKCgoKCgoKCgogICNwcmFnbWEgaW50 ZXJmYWNlCgoKIyAxICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgogCgoKCgoKCgoKCmV4dGVybiAiQyIgeyAKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9s aWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgog CgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgoK IyAxMjYgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMwoKCiAKCgoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKCiMgMjY5ICIvdXNyL2xpYi9n Y2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgoKCgoKCgoK CgoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiMgMzMgIi91c3IvaW5j bHVkZS9zdGRpby5oIiAyIDMKCgoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIHN0cnVjdCBfSU9fRklM RSBGSUxFOwoKCgoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgX19GSUxFOwoKCgoKCgoK CgoKCiAKCnR5cGVkZWYgX0dfZnBvc190IGZwb3NfdDsKCgoKCgoKCiAKCgoKCgogCgoKCgoKIAoK CgoKCgogCgoKCgoKCgogCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zdGRp b19saW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMg MTIyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCiAKZXh0ZXJuIEZJTEUgKnN0ZGluOwkJ IApleHRlcm4gRklMRSAqc3Rkb3V0OwkJIApleHRlcm4gRklMRSAqc3RkZXJyOwkJIAogCgoKCgog CmV4dGVybiBpbnQgcmVtb3ZlIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIHRocm93ICgpIDsK IApleHRlcm4gaW50IHJlbmFtZSAoX19jb25zdCBjaGFyICpfX29sZCwgX19jb25zdCBjaGFyICpf X25ldykgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBGSUxFICp0bXBmaWxlICh2b2lkKSB0aHJvdyAo KSA7CgoKCgoKCgoKCgogCmV4dGVybiBjaGFyICp0bXBuYW0gKGNoYXIgKl9fcykgdGhyb3cgKCkg OwoKCiAKCmV4dGVybiBjaGFyICp0bXBuYW1fciAoY2hhciAqX19zKSB0aHJvdyAoKSA7CgoKCgog CgoKCgoKCmV4dGVybiBjaGFyICp0ZW1wbmFtIChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX2NvbnN0 IGNoYXIgKl9fcGZ4KQogICAgIHRocm93ICgpICAgOwoKCgogCmV4dGVybiBpbnQgZmNsb3NlIChG SUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZmZsdXNoIChGSUxFICpfX3N0 cmVhbSkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIGludCBmZmx1c2hfdW5sb2NrZWQgKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKSA7CgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUgKmZvcGVuIChfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fbW9kZXMpIHRocm93ICgpIDsKIApleHRlcm4gRklMRSAqZnJlb3BlbiAoX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCgkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fbW9kZXMsCgkJICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkg OwojIDIxMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUg KmZkb3BlbiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCkgOwoKCiMg MjQyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCgpleHRlcm4gdm9pZCBzZXRidWYgKEZJ TEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgp IDsKIAoKCmV4dGVybiBpbnQgc2V0dmJ1ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hh ciAqX19yZXN0cmljdCBfX2J1ZiwKCQkgICAgaW50IF9fbW9kZXMsIHNpemVfdCBfX24pIHRocm93 ICgpIDsKCgogCgpleHRlcm4gdm9pZCBzZXRidWZmZXIgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJl YW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJICAgICAgIHNpemVfdCBfX3NpemUpIHRocm93 ICgpIDsKCiAKZXh0ZXJuIHZvaWQgc2V0bGluZWJ1ZiAoRklMRSAqX19zdHJlYW0pIHRocm93ICgp IDsKCgoKIApleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJ ICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7CiAK ZXh0ZXJuIGludCBwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4u KSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywK CQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgpIDsK CiAKZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKCQkgICAgIF9fZ251Y192YV9saXN0ICBfX2FyZykgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgdnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f Zm9ybWF0LCBfX2dudWNfdmFfbGlzdCAgX19hcmcpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVybiBp bnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsCgkJICAgICBfX2dudWNfdmFfbGlzdCAgX19hcmcpIHRocm93ICgpIDsKCgog CmV4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhs ZW4sCgkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKICAgICB0 aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7 CgpleHRlcm4gaW50IF9fdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9f bWF4bGVuLAoJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fZ251Y192YV9s aXN0ICBfX2FyZykKICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9f cHJpbnRmX18sIDMsIDApKSk7CmV4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0 IF9fcywgc2l6ZV90IF9fbWF4bGVuLAoJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0 ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKCgojIDMxNyAiL3Vzci9pbmNs dWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBf X3N0cmVhbSwKCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zv cm1hdCwgLi4uKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzc2NhbmYgKF9fY29uc3QgY2hhciAq X19yZXN0cmljdCBfX3MsCgkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAu Li4pIHRocm93ICgpIDsKCiMgMzQzICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCmV4dGVy biBpbnQgZmdldGMgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgZ2V0YyAo RklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBnZXRjaGFyICh2b2lkKSB0 aHJvdyAoKSA7CgogCgoKCgogCmV4dGVybiBpbnQgZ2V0Y191bmxvY2tlZCAoRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBnZXRjaGFyX3VubG9ja2VkICh2b2lkKSB0aHJvdyAo KSA7CgoKCiAKZXh0ZXJuIGludCBmZ2V0Y191bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCgoKIApleHRlcm4gaW50IGZwdXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhy b3cgKCkgOwpleHRlcm4gaW50IHB1dGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAo KSA7CgogCmV4dGVybiBpbnQgcHV0Y2hhciAoaW50IF9fYykgdGhyb3cgKCkgOwoKIAoKCgoKIApl eHRlcm4gaW50IGZwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cg KCkgOwoKCgogCmV4dGVybiBpbnQgcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBwdXRjaGFyX3VubG9ja2VkIChpbnQgX19jKSB0aHJv dyAoKSA7CgoKCgogCmV4dGVybiBpbnQgZ2V0dyAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsK CiAKZXh0ZXJuIGludCBwdXR3IChpbnQgX193LCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoK CgogCmV4dGVybiBjaGFyICpmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJ TEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCiAgICAgdGhyb3cgKCkgOwoKCgoKCgoKIAoKZXh0ZXJu IGNoYXIgKmdldHMgKGNoYXIgKl9fcykgdGhyb3cgKCkgOwoKCiMgNDMzICIvdXNyL2luY2x1ZGUv c3RkaW8uaCIgMwoKCgogCmV4dGVybiBpbnQgZnB1dHMgKF9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX3MsIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCiAgICAgdGhyb3cgKCkgOwoKCgoKCgoK IApleHRlcm4gaW50IHB1dHMgKF9fY29uc3QgY2hhciAqX19zKSB0aHJvdyAoKSA7CgoKIApleHRl cm4gaW50IHVuZ2V0YyAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgogCmV4 dGVybiBzaXplX3QgZnJlYWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUs CgkJICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSB0aHJvdyAoKSA7 CiAKZXh0ZXJuIHNpemVfdCBmd3JpdGUgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3B0ciwg c2l6ZV90IF9fc2l6ZSwKCQkgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fcykg dGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHNpemVfdCBmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0 cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKCQkJICAgICAgc2l6ZV90IF9fbiwgRklMRSAqX19y ZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4gc2l6ZV90IGZ3cml0ZV91bmxvY2tl ZCAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAoJCQkgICAg ICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgog CmV4dGVybiBpbnQgZnNlZWsgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9f d2hlbmNlKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGxvbmcgaW50IGZ0ZWxsIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCkgOwogCmV4dGVybiB2b2lkIHJld2luZCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCmV4dGVybiBpbnQgZmdldHBv cyAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvc190ICpfX3Jlc3RyaWN0IF9fcG9zKQog ICAgIHRocm93ICgpIDsKIApleHRlcm4gaW50IGZzZXRwb3MgKEZJTEUgKl9fc3RyZWFtLCBfX2Nv bnN0IGZwb3NfdCAqX19wb3MpIHRocm93ICgpIDsKIyA1MzIgIi91c3IvaW5jbHVkZS9zdGRpby5o IiAzCgoKCgoKCgoKCgogCmV4dGVybiB2b2lkIGNsZWFyZXJyIChGSUxFICpfX3N0cmVhbSkgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgZmVvZiAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKIApl eHRlcm4gaW50IGZlcnJvciAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgogCmV4dGVybiB2 b2lkIGNsZWFyZXJyX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4g aW50IGZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQg ZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgogCmV4dGVybiB2 b2lkIHBlcnJvciAoX19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpIDsKCiAKCgpleHRlcm4gaW50 IHN5c19uZXJyOwpleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19lcnJsaXN0W107CgoK CgoKCgoKIApleHRlcm4gaW50IGZpbGVubyAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgoK IApleHRlcm4gaW50IGZpbGVub191bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsK CgoKCgogCmV4dGVybiBGSUxFICpwb3BlbiAoX19jb25zdCBjaGFyICpfX2NvbW1hbmQsIF9fY29u c3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHBjbG9zZSAoRklMRSAq X19zdHJlYW0pIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGNoYXIgKmN0ZXJtaWQgKGNoYXIgKl9f cykgdGhyb3cgKCkgOwoKCgoKCgoKCgojIDYxNCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoK CiAKCiAKZXh0ZXJuIHZvaWQgZmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoK IAoKZXh0ZXJuIGludCBmdHJ5bG9ja2ZpbGUgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7Cgog CmV4dGVybiB2b2lkIGZ1bmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgoK CgoKCgoKIAoKCgoKCn0gCgoKCgojIDEzICIuLi9mdW5jdGlvbi8uLi9zcGFjZS8uLi9nZW9tZXRy eS8uLi90b29sYm94L3RieER5bkFycmF5LmgiIDIKCgoKIAoKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+ CmNsYXNzIHRieF9EeW5BcnJheSB7CiAKICAgCgoKCiAgY2xhc3MgUGFnZSB7CiAgICBQYWdlKiAg ICBsbmtfOwogICAgdW5zaWduZWQgaWR4XzsKICAgIFQqICAgICAgIG1lbV87CiAgICAKICBwdWJs aWM6CgogICAgaW5saW5lIFBhZ2UodW5zaWduZWQgaWR4LCB1bnNpZ25lZCBzeiwgUGFnZSogbG5r ID0gX19udWxsICk7CiAgICBpbmxpbmUgflBhZ2UoKTsKCiAgICBpbmxpbmUgVCYgb3BlcmF0b3Jb XSh1bnNpZ25lZCBpKTsKCiAgICBpbmxpbmUgdW5zaWduZWQgaW5kZXgoKTsKICAgIGlubGluZSBQ YWdlKiBsaW5rKCk7CiMgNTEgIi4uL2Z1bmN0aW9uLy4uL3NwYWNlLy4uL2dlb21ldHJ5Ly4uL3Rv b2xib3gvdGJ4RHluQXJyYXkuaCIKCiAgfTsKCiAgIAogIGNvbnN0IHVuc2lnbmVkIGh0Ymxzel87 CgogIGNvbnN0IHVuc2lnbmVkIGh0Ymxtc2tfOwoKICAgCiAgY29uc3QgdW5zaWduZWQgcGdzel87 CiAgY29uc3QgdW5zaWduZWQgcGdtc2tfOwoKICBQYWdlKiogaHRibF87CiAgUGFnZSogIGxydV87 CgogIFQgICAgICAgIGRmbHRfOwogIGJvb2wgICAgIGluaXRfOwogIGJvb2wgICAgIGVtcHR5XzsK ICB1bnNpZ25lZCBtYXhfOwogIHVuc2lnbmVkIG1pbl87CiAgdW5zaWduZWQgbnBnXzsKIAogICAK ICB0YnhfRHluQXJyYXkodGJ4X0R5bkFycmF5PFQ+Jik7CiAgdm9pZCBvcGVyYXRvcj0odGJ4X0R5 bkFycmF5PFQ+Jik7CgpwdWJsaWM6CiAgIAoKCgoKCgoKCgoKCgoKICBpbmxpbmUgdGJ4X0R5bkFy cmF5KHVuc2lnbmVkIGh0YmxzeiwgdW5zaWduZWQgcGdzeik7CiAgaW5saW5lIHRieF9EeW5BcnJh eSh1bnNpZ25lZCBodGJsc3osIHVuc2lnbmVkIHBnc3osIGNvbnN0IFQmIGRmbHQpOwogIGlubGlu ZSB+dGJ4X0R5bkFycmF5KCk7CgogICAKCgoKCgoKICBUJiBvcGVyYXRvciBbXSh1bnNpZ25lZCBp KTsKCiAgaW5saW5lIHVuc2lnbmVkIG1heCgpOyAgICAgICAgCiAgaW5saW5lIGZsb2F0IG1lbW9y eSgpOyAKICBpbmxpbmUgdW5zaWduZWQgbWluKCk7ICAgICAgICAKCiAgIAogIHZvaWQgcmVzZXQo KTsJCQkJCQkJICAgCn07CgoKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIHRieF9EeW5BcnJheTxU Pjo6UGFnZTo6UGFnZSh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIHN6LCAKCQkJCSAgIFBhZ2UqIGxu ayA9IF9fbnVsbCApIHsKICBpZHhfID0gaWR4OyBsbmtfID0gbG5rOyBtZW1fID0gbmV3IFRbc3pd Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgppbmxpbmUgdGJ4X0R5bkFycmF5PFQ+OjpQYWdlOjp+UGFn ZSgpIHsKICBkZWxldGVbXSBtZW1fOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgppbmxpbmUgVCYgdGJ4 X0R5bkFycmF5PFQ+OjpQYWdlOjpvcGVyYXRvcltdKHVuc2lnbmVkIGkpIHsKICByZXR1cm4gbWVt X1tpXTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIHVuc2lnbmVkIHRieF9EeW5BcnJheTxU Pjo6UGFnZTo6aW5kZXgoKSB7CiAgcmV0dXJuIGlkeF87Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+Cmlu bGluZSB0YnhfRHluQXJyYXk8VD46OlBhZ2UqIHRieF9EeW5BcnJheTxUPjo6UGFnZTo6bGluaygp IHsKICByZXR1cm4gbG5rXzsKfQoKCnRlbXBsYXRlPGNsYXNzIFQ+IAppbmxpbmUgdGJ4X0R5bkFy cmF5PFQ+Ojp0YnhfRHluQXJyYXkodW5zaWduZWQgaHRibHN6LCB1bnNpZ25lZCBwZ3N6KSA6CiAg aHRibHN6XyhodGJsc3opLCBodGJsbXNrXygoMSA8PCBodGJsc3opIC0gMSksCiAgcGdzel8ocGdz eiksIHBnbXNrXygoMSA8PCBwZ3N6KSAtIDEpIHsKICBodGJsXyA9IG5ldyBQYWdlKltodGJsbXNr XyArIDFdOyAKICBmb3IodW5zaWduZWQgaSA9IGh0Ymxtc2tfICsgMTsgaS0tOykgaHRibF9baV0g PSBfX251bGwgOyAKICBscnVfID0gX19udWxsIDsgaW5pdF8gPSBmYWxzZTsgbWF4XyA9IG1pbl8g PSAwOyBucGdfID0gMDsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4gCmlubGluZSB0YnhfRHluQXJyYXk8 VD46OnRieF9EeW5BcnJheSh1bnNpZ25lZCBodGJsc3osIHVuc2lnbmVkIHBnc3osIAoJCQkJICAg ICBjb25zdCBUJiBkZmx0KSA6IAogIGh0Ymxzel8oaHRibHN6KSwgaHRibG1za18oKDEgPDwgaHRi bHN6KSAtIDEpLAogIHBnc3pfKHBnc3opLCBwZ21za18oKDEgPDwgcGdzeikgLSAxKSwgZGZsdF8o ZGZsdCkgewogIGh0YmxfID0gbmV3IFBhZ2UqW2h0Ymxtc2tfICsgMV07CiAgZm9yKHVuc2lnbmVk IGkgPSBodGJsbXNrXyArIDE7IGktLTspIGh0YmxfW2ldID0gX19udWxsIDsgCiAgbHJ1XyA9IF9f bnVsbCA7IGluaXRfID0gdHJ1ZTsgbWF4XyA9IG1pbl8gPSAwOyBucGdfID0gMDsKfQoKdGVtcGxh dGUgPGNsYXNzIFQ+IAppbmxpbmUgdGJ4X0R5bkFycmF5PFQ+Ojp+dGJ4X0R5bkFycmF5KCkgewog IGZvcih1bnNpZ25lZCBpID0gaHRibG1za18gKyAxOyBpLS07KSB7CiAgICBQYWdlKiBwZyA9IGh0 YmxfW2ldOwogICAgd2hpbGUgKHBnICE9IF9fbnVsbCApIHsKICAgICAgUGFnZSogZm9vID0gcGc7 IHBnID0gcGctPmxpbmsoKTsKICAgICAgZGVsZXRlIGZvbzsKICAgIH0KICB9CiAgZGVsZXRlW10g aHRibF87Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPiAKaW5saW5lIHVuc2lnbmVkIHRieF9EeW5BcnJh eTxUPjo6bWF4KCkgewogIHJldHVybiBtYXhfOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gCmlubGlu ZSBmbG9hdCB0YnhfRHluQXJyYXk8VD46Om1lbW9yeSgpIHsKICByZXR1cm4gc2l6ZW9mKHRieF9E eW5BcnJheSkgKyAoZmxvYXQpKDEgPDwgaHRibHN6XykgKiBzaXplb2YoUGFnZSopICsKICAgIChm bG9hdClucGdfICogKHNpemVvZihQYWdlKSArIChmbG9hdCkoMSA8PCBwZ3N6XykgKiBzaXplb2Yo VCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gCmlubGluZSB1bnNpZ25lZCB0YnhfRHluQXJyYXk8 VD46Om1pbigpIHsKICByZXR1cm4gbWluXzsKfQoKIAoKIyAxICIuLi9mdW5jdGlvbi8uLi9zcGFj ZS8uLi9nZW9tZXRyeS8uLi90b29sYm94L3RieER5bkFycmF5LnQiIDEKIAoKCgoKCgogICNwcmFn bWEgaW1wbGVtZW50YXRpb24KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gClQmIHRieF9EeW5BcnJheTxU Pjo6b3BlcmF0b3JbXSh1bnNpZ25lZCBpKSB7CgogIGlmICghKGkgPCBtYXhfKSkgbWF4XyA9IGkg KyAxOwogIGlmIChscnVfID09IF9fbnVsbCAgfHwgaSA8IG1pbl8pIG1pbl8gPSBpOwoKICB1bnNp Z25lZCBwZ2lkeCA9IGkgPj4gcGdzel87CgogIGlmIChscnVfICE9IF9fbnVsbCAgJiYgbHJ1Xy0+ aW5kZXgoKSA9PSBwZ2lkeCkKICAgIHJldHVybiAoKmxydV8pW2kgJiBwZ21za19dOwoKICBQYWdl KiogaHRibCA9IGh0YmxfICsgKHBnaWR4ICYgaHRibG1za18pOwoKICBQYWdlKiBwZyA9ICpodGJs OwogIHdoaWxlKHBnICE9IF9fbnVsbCApIHsKICAgIGlmIChwZy0+aW5kZXgoKSA9PSBwZ2lkeCkg CiAgICAgIHJldHVybiAoKihscnVfID0gcGcpKVtpICYgcGdtc2tfXTsKICAgIHBnID0gcGctPmxp bmsoKTsKICB9CgogICpodGJsID0gcGcgPSBuZXcgUGFnZShwZ2lkeCwgcGdtc2tfICsgMSwgKmh0 YmwpOwogIGlmIChpbml0XykgZm9yKHVuc2lnbmVkIGogPSBwZ21za18gKyAxOyBqLS07KSAoKnBn KVtqXSA9IGRmbHRfOwoKICByZXR1cm4gKCoobHJ1XyA9IHBnKSlbaSAmIHBnbXNrX107Cn0KCnRl bXBsYXRlIDxjbGFzcyBUPiAKdm9pZCB0YnhfRHluQXJyYXk8VD46OnJlc2V0KCkgewogIGZvcih1 bnNpZ25lZCBpID0gaHRibG1za18gKyAxOyBpLS07KSB7CiAgICBQYWdlKiBwZyA9IGh0YmxfW2ld OyAKICAgIHdoaWxlIChwZyAhPSBfX251bGwgKSB7CiAgICAgIFBhZ2UqIGZvbyA9IHBnOyBwZyA9 IHBnLT5saW5rKCk7CiAgICAgIGRlbGV0ZSBmb287CiAgICB9CiAgICBodGJsX1tpXSA9IF9fbnVs bCA7CiAgfQogIGxydV8gPSBfX251bGwgOyBtYXhfID0gbWluXyA9IDA7IG5wZ18gPSAwOwp9CgoK IyAxOTAgIi4uL2Z1bmN0aW9uLy4uL3NwYWNlLy4uL2dlb21ldHJ5Ly4uL3Rvb2xib3gvdGJ4RHlu QXJyYXkuaCIgMgoKCgoKIyAxMyAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2Vv Q2VsbC5oIiAyCgoKCiMgMSAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2VvVG9w b2xvZ3kuaCIgMQogCgoKCgoKCgoKCgoKIyAxICIuLi9mdW5jdGlvbi8uLi9zcGFjZS8uLi9nZW9t ZXRyeS9nZW9abS5oIiAxCiAKCgoKCgoKCgogCgogCgpjbGFzcyBaMiB7CgogIHVuc2lnbmVkIGNo YXIgaV87CgogcHVibGljOgogIFoyKCkgeyBpXyA9IDA7IH0KICBaMih1bnNpZ25lZCBpbnQgaSkg eyBpXyA9IGkgJiAxOyB9CgogIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIGlfOyB9Cgog IGludCBvcGVyYXRvcj0oaW50IGkpIHsgcmV0dXJuIGlfID0gaSAmIDE7IH0gIAogIGludCBvcGVy YXRvcisrKCkgeyByZXR1cm4gaV8gXj0gMTsgfQogIGludCBzdWNjKCkgY29uc3QgeyByZXR1cm4g aV8gXiAxOyB9Cn07CgogCgogCgpjbGFzcyBaMyB7CgogIHVuc2lnbmVkIGNoYXIgaV87CgogcHVi bGljOgogIFozKCkgeyBpXyA9IDA7IH0KICBaMyh1bnNpZ25lZCBpbnQgaSkgeyBpXyA9IGkgLSAz ICogKGkgLyAzKTsgfQoKICBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJldHVybiBpXzsgfQoKICBp bnQgb3BlcmF0b3I9KGludCBpKSB7IHJldHVybiBpXyA9IGkgLSAzICogKGkgLyAzKTsgfSAgCiAg aW50IG9wZXJhdG9yKysoKSB7IHJldHVybiBpXyA9IGlfID09IDIgPyAwIDogaV8gKyAxOyB9CiAg aW50IG9wZXJhdG9yLS0oKSB7IHJldHVybiBpXyA9IGlfID8gaV8gLSAxIDogMjsgfQogIGludCBz dWNjKCkgY29uc3QgeyByZXR1cm4gaV8gPT0gMiA/IDAgOiBpXyArIDE7IH0KICBpbnQgcHJlZCgp IGNvbnN0IHsgcmV0dXJuIGlfID8gaV8gLSAxIDogMjsgfQp9OwoKIAoKIAoKY2xhc3MgWjQgewoK ICB1bnNpZ25lZCBjaGFyIGlfOwoKIHB1YmxpYzoKICBaNCgpIHsgaV8gPSAwOyB9CiAgWjQodW5z aWduZWQgaW50IGkpIHsgaV8gPSBpICYgMzsgfQoKICBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJl dHVybiBpXzsgfQoKICBpbnQgb3BlcmF0b3I9KGludCBpKSB7IHJldHVybiBpXyA9IGkgJiAzOyB9 ICAKICBpbnQgb3BlcmF0b3IrKygpIHsgKytpXzsgcmV0dXJuIGlfICY9IDM7IH0KICBpbnQgb3Bl cmF0b3ItLSgpIHsgLS1pXzsgcmV0dXJuIGlfICY9IDM7IH0KICBpbnQgc3VjYygpIGNvbnN0IHsg cmV0dXJuIChpXyArIDEpICYgMzsgfQogIGludCBwcmVkKCkgY29uc3QgeyByZXR1cm4gKGlfIC0g MSkgJiAzOyB9Cn07CgoKIyAxMyAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2Vv VG9wb2xvZ3kuaCIgMgoKCiAKCiMgNjcgIi4uL2Z1bmN0aW9uLy4uL3NwYWNlLy4uL2dlb21ldHJ5 L2dlb1RvcG9sb2d5LmgiCgoKdGVtcGxhdGU8dWludCBkPgpjbGFzcyBnZW9fS2V5OwoKdGVtcGxh dGU8dWludCBkPgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3Qg Z2VvX0tleTxkPiYga2V5KSB7CiAgcmV0dXJuIG9zIDw8IGtleS5rZXlfOwp9CgogCgoKCnRlbXBs YXRlPHVpbnQgZD4KY2xhc3MgZ2VvX0tleSB7IAogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8 IDw+KG9zdHJlYW0mIG9zLCBjb25zdCBnZW9fS2V5PGQ+JiBrZXkpOwoKcHVibGljOgogICAKICBp bmxpbmUgZ2VvX0tleSh1aW50IGtleSA9IDApOwogICAgICAgICAKICAgCiAgaW5saW5lIGludCBv cGVyYXRvcj09KGNvbnN0IGdlb19LZXkmIGtleSkgY29uc3Q7CgogICAKICBpbmxpbmUgb3BlcmF0 b3IgdWludCgpIGNvbnN0OwogICAgICAgICAKICAgCiAgaW5saW5lIHVpbnQga2V5KCkgY29uc3Q7 Cgpwcml2YXRlOgogIHVpbnQga2V5XzsgCn07Cgp0ZW1wbGF0ZTx1aW50IGQ+CmlubGluZSBnZW9f S2V5PGQ+OjpnZW9fS2V5KHVpbnQga2V5KSA6IGtleV8oa2V5KSB7Cn0KCnRlbXBsYXRlPHVpbnQg ZD4KaW5saW5lIGludCBnZW9fS2V5PGQ+OjpvcGVyYXRvcj09KGNvbnN0IGdlb19LZXkmIGtleSkg Y29uc3QgeyAKICByZXR1cm4ga2V5XyA9PSBrZXkua2V5XzsgCn0KCnRlbXBsYXRlPHVpbnQgZD4K aW5saW5lIGdlb19LZXk8ZD46Om9wZXJhdG9yIHVpbnQoKSBjb25zdCB7IAogIHJldHVybiBrZXlf Owp9Cgp0ZW1wbGF0ZTx1aW50IGQ+CmlubGluZSB1aW50IGdlb19LZXk8ZD46OmtleSgpIGNvbnN0 IHsgCiAgcmV0dXJuIGtleV87IAp9CgoKCnR5cGVkZWYgZ2VvX0tleTwwPiBnZW9fS2V5MGQ7CnR5 cGVkZWYgZ2VvX0tleTwxPiBnZW9fS2V5MWQ7CnR5cGVkZWYgZ2VvX0tleTwyPiBnZW9fS2V5MmQ7 CnR5cGVkZWYgZ2VvX0tleTwzPiBnZW9fS2V5M2Q7CgogCgogCgoKY2xhc3MgZ2VvX0F0dHJpYnV0 ZSB7IAogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCAKCQkJICAgICBj b25zdCBnZW9fQXR0cmlidXRlJiBhdHRyaWIpOwoKcHVibGljOgogICAKCgoKICBpbmxpbmUgZ2Vv X0F0dHJpYnV0ZSh1aW50IGF0dHJpYiA9IDApOwoKICAgCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZv KG9zdHJlYW0mIG9zKSBjb25zdCB7CiAgICByZXR1cm4gb3MgPDwgYXR0cmliXzsKICB9CiAgICAg ICAgIAogICAKICBpbmxpbmUgaW50IG9wZXJhdG9yPT0oY29uc3QgZ2VvX0F0dHJpYnV0ZSYgYXR0 cmliKSBjb25zdDsKCiAgIAogIGlubGluZSBvcGVyYXRvciB1aW50KCkgY29uc3Q7CiAgICAgICAg IAogICAKICBpbmxpbmUgdWludCBhdHRyaWIoKSBjb25zdDsKCnByaXZhdGU6CiAgIAogIHVpbnQg YXR0cmliXzsgCn07CgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29u c3QgZ2VvX0F0dHJpYnV0ZSYgYXR0cmliKSB7CiAgcmV0dXJuIGF0dHJpYi5pbmZvKG9zKTsKfQoK aW5saW5lIGdlb19BdHRyaWJ1dGU6Omdlb19BdHRyaWJ1dGUodWludCBhdHRyaWIpIDogYXR0cmli XyhhdHRyaWIpIHsKfQoKaW5saW5lIGludCBnZW9fQXR0cmlidXRlOjpvcGVyYXRvcj09KGNvbnN0 IGdlb19BdHRyaWJ1dGUmIGF0dHJpYikgY29uc3QgeyAKICByZXR1cm4gYXR0cmliXyA9PSBhdHRy aWIuYXR0cmliXzsgCn0KCmlubGluZSBnZW9fQXR0cmlidXRlOjpvcGVyYXRvciB1aW50KCkgY29u c3QgeyAKICByZXR1cm4gYXR0cmliXzsKfQoKaW5saW5lIHVpbnQgZ2VvX0F0dHJpYnV0ZTo6YXR0 cmliKCkgY29uc3QgeyAKICByZXR1cm4gYXR0cmliXzsgCn0KCiAKCiAKCgoKCgoKCmNsYXNzIGdl b19Db25uZWN0b3IgewogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvciA8PChvc3RyZWFtJiBvcywg Y29uc3QgZ2VvX0Nvbm5lY3RvciYgYyk7CgpwdWJsaWM6CiAgdmlydHVhbCBnZW9fQ29ubmVjdG9y KiBjaGlsZCh1aW50IGkpID0gMDsKCiAgIAogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFt JiBvcykgY29uc3QgPSAwOwp9OwoKIAoKIAoKCgoKY2xhc3MgZ2VvX0Nvbm5lY3RvcjAgOiBwdWJs aWMgZ2VvX0Nvbm5lY3RvciB7CgpwdWJsaWM6CiAgIAoKCiAgc3RhdGljICB1aW50IGNudF87Cgog ICAKCgoKICBpbmxpbmUgZ2VvX0Nvbm5lY3RvcjAoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIpIDogCiAg ICBrZXlfKGNudF8rKyksIGF0dHJpYl8oYXR0cmliKSB7fQoKICAgCgogIGlubGluZSBpbnQgb3Bl cmF0b3I9PShjb25zdCBnZW9fQ29ubmVjdG9yMCYgY250cikgY29uc3Q7CgogICAKCgoKCiAgdmly dHVhbCBnZW9fQ29ubmVjdG9yMCogY2hpbGQodWludCBpKSA9IDA7CgogICAKICBpbmxpbmUgY29u c3QgZ2VvX0tleTwwPiYga2V5KCkgY29uc3Q7CgogICAKICBpbmxpbmUgY29uc3QgZ2VvX0F0dHJp YnV0ZSYgYXR0cmliKCkgY29uc3Q7Cgpwcm90ZWN0ZWQ6IAogICAKICBnZW9fS2V5PDA+IGtleV87 CgogICAKICBnZW9fQXR0cmlidXRlIGF0dHJpYl87Cn07CgppbmxpbmUgaW50IGdlb19Db25uZWN0 b3IwOjpvcGVyYXRvcj09KGNvbnN0IGdlb19Db25uZWN0b3IwJiBjbnRyKSBjb25zdCB7CiAgcmV0 dXJuIGtleV8gPT0gY250ci5rZXlfOyAKfQoKaW5saW5lIGNvbnN0IGdlb19LZXk8MD4mIGdlb19D b25uZWN0b3IwOjprZXkoKSBjb25zdCB7IAogIHJldHVybiBrZXlfOyAKfQoKaW5saW5lIGNvbnN0 IGdlb19BdHRyaWJ1dGUmIGdlb19Db25uZWN0b3IwOjphdHRyaWIoKSBjb25zdCB7IAogIHJldHVy biBhdHRyaWJfOyAKfQoKIAoKIAoKCgoKCgpjbGFzcyBnZW9fQ29ubmVjdG9yMSA6IHB1YmxpYyBn ZW9fQ29ubmVjdG9yIHsKCnB1YmxpYzoKICAgCgoKICBzdGF0aWMgdWludCBjbnRfOwoKICAgCgoK CiAgaW5saW5lIGdlb19Db25uZWN0b3IxKGdlb19BdHRyaWJ1dGUgYXR0cmliKSA6IAogICAga2V5 XyhjbnRfKyspLCBhdHRyaWJfKGF0dHJpYikge30KCiAgIAoKICBpbmxpbmUgaW50IG9wZXJhdG9y PT0oY29uc3QgZ2VvX0Nvbm5lY3RvcjEmIGNudHIpIGNvbnN0OwoKICAgCgoKCgoKICB2aXJ0dWFs IGdlb19Db25uZWN0b3IwKiB2ZXJ0ZXgodWludCBpKSBjb25zdCA9IDA7CgogICAKCgoKCiAgdmly dHVhbCBnZW9fQ29ubmVjdG9yMSogY2hpbGQodWludCBpKSA9IDA7CgogICAKICBpbmxpbmUgY29u c3QgZ2VvX0tleTwxPiYga2V5KCkgY29uc3Q7CgogICAKICBpbmxpbmUgY29uc3QgZ2VvX0F0dHJp YnV0ZSYgYXR0cmliKCkgY29uc3Q7Cgpwcm90ZWN0ZWQ6IAogICAKICBnZW9fS2V5PDE+IGtleV87 CgogICAKICBnZW9fQXR0cmlidXRlIGF0dHJpYl87Cn07CgppbmxpbmUgaW50IGdlb19Db25uZWN0 b3IxOjpvcGVyYXRvcj09KGNvbnN0IGdlb19Db25uZWN0b3IxJiBjbnRyKSBjb25zdCB7CiAgcmV0 dXJuIGtleV8gPT0gY250ci5rZXlfOyAKfQoKaW5saW5lIGNvbnN0IGdlb19LZXk8MT4mIGdlb19D b25uZWN0b3IxOjprZXkoKSBjb25zdCB7IAogIHJldHVybiBrZXlfOyAKfQoKaW5saW5lIGNvbnN0 IGdlb19BdHRyaWJ1dGUmIGdlb19Db25uZWN0b3IxOjphdHRyaWIoKSBjb25zdCB7IAogIHJldHVy biBhdHRyaWJfOyAKfQoKIAoKIAoKCgoKCgoKY2xhc3MgZ2VvX0Nvbm5lY3RvcjIgOiBwdWJsaWMg Z2VvX0Nvbm5lY3RvciB7CgpwdWJsaWM6CiAgIAoKCiAgc3RhdGljICB1aW50IGNudF87CgogICAK CgoKICBpbmxpbmUgZ2VvX0Nvbm5lY3RvcjIoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIpIDogCiAgICBr ZXlfKGNudF8rKyksIGF0dHJpYl8oYXR0cmliKSB7fQoKICAgCgogIGlubGluZSBpbnQgb3BlcmF0 b3I9PShjb25zdCBnZW9fQ29ubmVjdG9yMiYgY250cikgY29uc3Q7CgogICAKCgoKCiAgdmlydHVh bCBnZW9fQ29ubmVjdG9yMiogY2hpbGQodWludCBpKSAgPSAwOwoKICAgCgoKCgoKICB2aXJ0dWFs IGdlb19Db25uZWN0b3IxKiBlZGdlKHVpbnQgaSkgY29uc3QgPSAwOwoKICAgCgoKCgoKICB2aXJ0 dWFsIGdlb19Db25uZWN0b3IwKiB2ZXJ0ZXgodWludCBpKSBjb25zdCA9IDA7CgogICAKICBpbmxp bmUgY29uc3QgZ2VvX0tleTwyPiYga2V5KCkgY29uc3Q7CgogICAKICBpbmxpbmUgY29uc3QgZ2Vv X0F0dHJpYnV0ZSYgYXR0cmliKCkgY29uc3Q7Cgpwcm90ZWN0ZWQ6IAogICAKICBnZW9fS2V5PDI+ IGtleV87CgogICAKICBnZW9fQXR0cmlidXRlIGF0dHJpYl87ICAKfTsKCmlubGluZSBpbnQgZ2Vv X0Nvbm5lY3RvcjI6Om9wZXJhdG9yPT0oY29uc3QgZ2VvX0Nvbm5lY3RvcjImIGNudHIpIGNvbnN0 IHsKICByZXR1cm4ga2V5XyA9PSBjbnRyLmtleV87IAp9CgppbmxpbmUgY29uc3QgZ2VvX0tleTwy PiYgZ2VvX0Nvbm5lY3RvcjI6OmtleSgpIGNvbnN0IHsgCiAgcmV0dXJuIGtleV87IAp9Cgppbmxp bmUgY29uc3QgZ2VvX0F0dHJpYnV0ZSYgZ2VvX0Nvbm5lY3RvcjI6OmF0dHJpYigpIGNvbnN0IHsg CiAgcmV0dXJuIGF0dHJpYl87IAp9CgogCgogCgoKCgoKCmNsYXNzIGdlb19Db25uZWN0b3IzIDog cHVibGljIGdlb19Db25uZWN0b3IgewoKcHVibGljOgogIHN0YXRpYyB1aW50IGNudF87CiAgIAoK CgogIGlubGluZSBnZW9fQ29ubmVjdG9yMyhnZW9fQXR0cmlidXRlIGF0dHJpYikgOiAKICAgIGtl eV8oY250XysrKSwgYXR0cmliXyhhdHRyaWIpIHt9CgogICAKCiAgaW5saW5lIGludCBvcGVyYXRv cj09KGNvbnN0IGdlb19Db25uZWN0b3IzJiBjbnRyKSBjb25zdDsKCiAgIAoKCgoKICB2aXJ0dWFs IGdlb19Db25uZWN0b3IzKiBjaGlsZCh1aW50IGkpID0gMDsKCiAgIAoKCgoKCiAgdmlydHVhbCBn ZW9fQ29ubmVjdG9yMSogZWRnZSh1aW50IGkpIGNvbnN0ID0gMDsKCiAgIAoKCgoKCiAgdmlydHVh bCBnZW9fQ29ubmVjdG9yMiogZmFjZSh1aW50IGkpIGNvbnN0ID0gMDsKCiAgIAoKCgoKCiAgdmly dHVhbCBnZW9fQ29ubmVjdG9yMCogdmVydGV4KHVpbnQgaSkgY29uc3QgPSAwOwoKICAgCiAgaW5s aW5lIGNvbnN0IGdlb19LZXk8Mz4mIGtleSgpIGNvbnN0OwoKICAgCiAgaW5saW5lIGNvbnN0IGdl b19BdHRyaWJ1dGUmIGF0dHJpYigpIGNvbnN0OwoKcHJvdGVjdGVkOiAKICAgCiAgZ2VvX0tleTwz PiBrZXlfOwoKICAgCiAgZ2VvX0F0dHJpYnV0ZSBhdHRyaWJfOyAgCn07CgppbmxpbmUgaW50IGdl b19Db25uZWN0b3IzOjpvcGVyYXRvcj09KGNvbnN0IGdlb19Db25uZWN0b3IzJiBjbnRyKSBjb25z dCB7CiAgcmV0dXJuIGtleV8gPT0gY250ci5rZXlfOyAKfQoKaW5saW5lIGNvbnN0IGdlb19LZXk8 Mz4mIGdlb19Db25uZWN0b3IzOjprZXkoKSBjb25zdCB7IAogIHJldHVybiBrZXlfOyAKfQoKaW5s aW5lIGNvbnN0IGdlb19BdHRyaWJ1dGUmIGdlb19Db25uZWN0b3IzOjphdHRyaWIoKSBjb25zdCB7 IAogIHJldHVybiBhdHRyaWJfOyAKfQoKIAoKIAoKCmNsYXNzIGdlb19WZXJ0ZXggOiBwdWJsaWMg Z2VvX0Nvbm5lY3RvcjAgewogICAKICBnZW9fVmVydGV4KiBjaGxkXzsKCnB1YmxpYzoKICAgCiAg aW5saW5lIGdlb19WZXJ0ZXgoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIgPSBnZW9fQXR0cmlidXRlKCkp IDogCiAgICBnZW9fQ29ubmVjdG9yMChhdHRyaWIpLCBjaGxkXygwKSB7fQoKICBpbmxpbmUgdmly dHVhbCB+Z2VvX1ZlcnRleCgpOwoKICAgCgoKCgogIGlubGluZSBnZW9fVmVydGV4KiBjaGlsZCh1 aW50IGkpOwoKICAgCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7Cn07Cgppbmxp bmUgZ2VvX1ZlcnRleDo6fmdlb19WZXJ0ZXgoKSB7CiAgaWYgKGNobGRfICE9IF9fbnVsbCApIGRl bGV0ZSBjaGxkXzsKfQoKaW5saW5lIGdlb19WZXJ0ZXgqIGdlb19WZXJ0ZXg6OmNoaWxkKHVpbnQg aSkgewogIGlmIChpKSByZXR1cm4gX19udWxsIDsKCiAgaWYgKGNobGRfID09IF9fbnVsbCApIHsK ICAgIGNobGRfID0gbmV3IGdlb19WZXJ0ZXgoYXR0cmliXyk7CiAgfQogIHJldHVybiBjaGxkXzsK fQoKIAoKIAoKCmNsYXNzIGdlb19FZGdlIDogcHVibGljIGdlb19Db25uZWN0b3IxIHsKCnB1Ymxp YzoKICAgCgoKCgogIGdlb19FZGdlKGdlb19WZXJ0ZXgmIHZ0eDAsIGdlb19WZXJ0ZXgmIHZ0eDEs IAoJICAgZ2VvX0F0dHJpYnV0ZSBhdHRyaWIgPSBnZW9fQXR0cmlidXRlKCkpOwogIHZpcnR1YWwg fmdlb19FZGdlKCk7CgogICAKCgoKCgoKCgogIHZpcnR1YWwgZ2VvX0VkZ2UqIGNoaWxkKHVpbnQg aSk7CgogIGlubGluZSBnZW9fVmVydGV4KiB2ZXJ0ZXgodWludCBpKSBjb25zdDsKCiAgIAogIG9z dHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKcHJvdGVjdGVkOgogICAKICBnZW9fRWRn ZSogICBsbmtfOwoKICAgCgoKICBnZW9fRWRnZSogICBjaGxkXzsKCiAgIAogIGdlb19WZXJ0ZXgq IHZ0eF9bMl07Cn07CgppbmxpbmUgZ2VvX1ZlcnRleCogZ2VvX0VkZ2U6OnZlcnRleCh1aW50IGkp IGNvbnN0IHsgCiAgcmV0dXJuIGkgPCAyID8gdnR4X1tpXSA6IF9fbnVsbCA7IAp9CgogCgogCgoK CgoKCmNsYXNzIGdlb19UcmlhbmdsZSA6IHB1YmxpYyBnZW9fQ29ubmVjdG9yMiB7CgpwdWJsaWM6 CiAgIAoKCgoKCgoKCgogIGdlb19UcmlhbmdsZShnZW9fRWRnZSYgZWRnMCwgZ2VvX0VkZ2UmIGVk ZzEsIGdlb19FZGdlJiBlZGcyLCAKCSAgICAgICBnZW9fQXR0cmlidXRlIGF0dHJpYiA9IGdlb19B dHRyaWJ1dGUoKSk7CiAgdmlydHVhbCB+Z2VvX1RyaWFuZ2xlKCk7CgogICAKCgoKCgogIGdlb19U cmlhbmdsZSogY2hpbGQodWludCBpKTsKCiAgaW5saW5lIGdlb19FZGdlKiBlZGdlKHVpbnQgaSkg Y29uc3Q7CiAgaW5saW5lIGdlb19WZXJ0ZXgqIHZlcnRleCh1aW50IGkpIGNvbnN0OwoKICAgCgoK CiAgaW5saW5lIGludCByaG8oaW50IGkpIGNvbnN0OwoKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0m IG9zKSBjb25zdDsKcHJpdmF0ZToKICAgCiAgZ2VvX1RyaWFuZ2xlKiBsbmtfOwoKICAgCgoKICBn ZW9fVHJpYW5nbGUqIGNobGRfOwoKICAgCiAgZ2VvX0VkZ2UqICAgICBlZGdfWzNdOwoKICAgCiAg WjIgICAgICAgICAgICByaG9fWzNdOwp9OwoKaW5saW5lIGdlb19FZGdlKiBnZW9fVHJpYW5nbGU6 OmVkZ2UodWludCBpKSBjb25zdCB7IAogIHJldHVybiBpIDwgMyA/IGVkZ19baV0gOiBfX251bGwg OyAKfQoKaW5saW5lIGdlb19WZXJ0ZXgqIGdlb19UcmlhbmdsZTo6dmVydGV4KHVpbnQgaSkgY29u c3QgeyAKICByZXR1cm4gaSA8IDMgPyBlZGdfW2ldLT52ZXJ0ZXgocmhvX1tpXSkgOiBfX251bGwg OyAKfQoKaW5saW5lIGludCBnZW9fVHJpYW5nbGU6OnJobyhpbnQgaSkgY29uc3QgeyAKICByZXR1 cm4gcmhvX1tpXTsgCn0KCiAKCiAKCgoKCgoKY2xhc3MgZ2VvX1F1YWQgOiBwdWJsaWMgZ2VvX0Nv bm5lY3RvcjIgewoKcHVibGljOgogICAKCgoKCgoKCgoKCiAgZ2VvX1F1YWQoZ2VvX0VkZ2UmIGVk ZzAsIGdlb19FZGdlJiBlZGcxLCBnZW9fRWRnZSYgZWRnMiwgZ2VvX0VkZ2UmIGVkZzMsIAoJICAg Z2VvX0F0dHJpYnV0ZSBhdHRyaWIgPSBnZW9fQXR0cmlidXRlKCkpOwogIHZpcnR1YWwgfmdlb19R dWFkKCk7CgogICAKCgoKCgogIHZpcnR1YWwgZ2VvX1F1YWQqIGNoaWxkKHVpbnQgaSk7CgogIGlu bGluZSBnZW9fRWRnZSogZWRnZSh1aW50IGkpIGNvbnN0OwogIGlubGluZSBnZW9fVmVydGV4KiB2 ZXJ0ZXgodWludCBpKSBjb25zdDsKCiAgIAoKCgogIGlubGluZSBpbnQgcmhvKGludCBpKSBjb25z dDsKCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CnByb3RlY3RlZDoKICAgCiAg Z2VvX1F1YWQqIGxua187CgogICAKICBnZW9fUXVhZCogY2hsZF87CgogICAKICBnZW9fRWRnZSog ZWRnX1s0XTsKCiAgIAogIFoyICAgICAgICByaG9fWzRdOwp9OwoKaW5saW5lIGdlb19FZGdlKiBn ZW9fUXVhZDo6ZWRnZSh1aW50IGkpIGNvbnN0IHsgCiAgcmV0dXJuIGkgPCA0ID8gZWRnX1tpXSA6 IF9fbnVsbCA7IAp9CgppbmxpbmUgZ2VvX1ZlcnRleCogZ2VvX1F1YWQ6OnZlcnRleCh1aW50IGkp IGNvbnN0IHsgCiAgcmV0dXJuIGkgPCA0ID8gZWRnX1tpXS0+dmVydGV4KHJob19baV0pIDogX19u dWxsIDsgCn0KCmlubGluZSBpbnQgZ2VvX1F1YWQ6OnJobyhpbnQgaSkgY29uc3QgeyAKICByZXR1 cm4gcmhvX1tpXTsgCn0KCiAKCiAKCgoKCgoKCgoKCgoKY2xhc3MgZ2VvX1RldHJhaGVkcm9uIDog cHVibGljIGdlb19Db25uZWN0b3IzIHsKCnB1YmxpYzoKICAgCgoKCgoKCgoKCgoKCgoKCiAgZ2Vv X1RldHJhaGVkcm9uKGdlb19UcmlhbmdsZSYgdHJpMCwgZ2VvX1RyaWFuZ2xlJiB0cmkxLCBnZW9f VHJpYW5nbGUmIHRyaTIsIAoJCSAgZ2VvX1RyaWFuZ2xlJiB0cmkzLCBnZW9fQXR0cmlidXRlIGF0 dHJpYiA9IGdlb19BdHRyaWJ1dGUoKSk7CiAgdmlydHVhbCB+Z2VvX1RldHJhaGVkcm9uKCk7Cgog ICAKCgoKCgoKCgogIGdlb19UZXRyYWhlZHJvbiogY2hpbGQodWludCBpKTsKCiAgZ2VvX0VkZ2Uq IGVkZ2UodWludCBpKSBjb25zdDsKICBpbmxpbmUgZ2VvX1RyaWFuZ2xlKiBmYWNlKHVpbnQgaSkg Y29uc3Q7CiAgZ2VvX1ZlcnRleCogdmVydGV4KHVpbnQgaSkgY29uc3Q7CgogICAKCgoKICBpbmxp bmUgaW50IHJobyhpbnQgaSkgY29uc3Q7CgogICAKCgoKICBpbmxpbmUgaW50IHRhdShpbnQgaSkg Y29uc3Q7CgogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0Owpwcml2YXRlOgogICAK CgogIGdlb19UZXRyYWhlZHJvbiogY2hsZF87CgogICAKICBnZW9fVGV0cmFoZWRyb24qIGxua187 CgogICAKICBnZW9fVHJpYW5nbGUqICAgIHRyaV9bNF07CgogICAKCgoKCgogIFozICAgICAgICAg ICAgICAgdGF1X1s0XTsKCiAgIAoKCgoKCgogIFoyICAgICAgICAgICAgICAgcmhvX1s0XTsKfTsK CmlubGluZSBnZW9fVHJpYW5nbGUqIGdlb19UZXRyYWhlZHJvbjo6ZmFjZSh1aW50IGkpIGNvbnN0 IHsgCiAgcmV0dXJuIGkgPCA0ID8gdHJpX1tpXSA6IF9fbnVsbCA7IAp9CgppbmxpbmUgaW50IGdl b19UZXRyYWhlZHJvbjo6cmhvKGludCBpKSBjb25zdCB7IAogIHJldHVybiByaG9fW2ldOyAKfQoK aW5saW5lIGludCBnZW9fVGV0cmFoZWRyb246OnRhdShpbnQgaSkgY29uc3QgeyAKICByZXR1cm4g dGF1X1tpXTsgCn0KCiAKCiAKCgoKCgoKCgoKCgoKY2xhc3MgZ2VvX0hleGFoZWRyb24gOiBwdWJs aWMgZ2VvX0Nvbm5lY3RvcjMgewoKcHVibGljOgogICAKCgoKCgoKCgoKCgoKCgoKCgoKICBnZW9f SGV4YWhlZHJvbihnZW9fUXVhZCYgcXVhZDAsIGdlb19RdWFkJiBxdWFkMSwgZ2VvX1F1YWQmIHF1 YWQyLCAKCQkgZ2VvX1F1YWQmIHF1YWQzLCBnZW9fUXVhZCYgcXVhZDQsIGdlb19RdWFkJiBxdWFk NSwgCgkJIGdlb19BdHRyaWJ1dGUgYXR0cmliID0gZ2VvX0F0dHJpYnV0ZSgpKTsKICB2aXJ0dWFs IH5nZW9fSGV4YWhlZHJvbigpOwoKICAgCgoKCgoKCgoKICBnZW9fSGV4YWhlZHJvbiogY2hpbGQo dWludCBpKTsKCiAgZ2VvX0VkZ2UqIGVkZ2UodWludCBpKSBjb25zdDsKICBpbmxpbmUgZ2VvX1F1 YWQqIGZhY2UodWludCBpKSBjb25zdDsKICBnZW9fVmVydGV4KiB2ZXJ0ZXgodWludCBpKSBjb25z dDsKCiAgIAoKCgogIGlubGluZSBpbnQgcmhvKGludCBpKSBjb25zdDsKCiAgIAoKCgogIGlubGlu ZSBpbnQgdGF1KGludCBpKSBjb25zdDsKCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29u c3Q7CnByaXZhdGU6CiAgIAoKCiAgZ2VvX0hleGFoZWRyb24qIGNobGRfOwoKICAgCiAgZ2VvX0hl eGFoZWRyb24qIGxua187CgogICAKICBnZW9fUXVhZCogcXVhZF9bNl07CgogICAKCgoKCgoKCiAg WjQgdGF1X1s2XTsKCiAgIAoKCgoKCgoKICBaMiByaG9fWzZdOwp9OwoKaW5saW5lIGdlb19RdWFk KiBnZW9fSGV4YWhlZHJvbjo6ZmFjZSh1aW50IGkpIGNvbnN0IHsgCiAgcmV0dXJuIGkgPCA2ID8g cXVhZF9baV0gOiBfX251bGwgOyAKfQoKaW5saW5lIGludCBnZW9fSGV4YWhlZHJvbjo6cmhvKGlu dCBpKSBjb25zdCB7IAogIHJldHVybiByaG9fW2ldOyAKfQoKaW5saW5lIGludCBnZW9fSGV4YWhl ZHJvbjo6dGF1KGludCBpKSBjb25zdCB7IAogIHJldHVybiB0YXVfW2ldOyAKfQoKIAoKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKaW50IGdlb19tYXRjaChjb25zdCBnZW9fRWRnZSYgZWRnMCwgY29u c3QgZ2VvX0VkZ2UmIGVkZzEsIGludCBpZHhbXSk7CgogCgoKCgoKCgoKCgoKCgppbnQgZ2VvX21h dGNoKGNvbnN0IGdlb19UcmlhbmdsZSYgdHJpMCwgY29uc3QgZ2VvX1RyaWFuZ2xlJiB0cmkxLCBp bnQgaWR4W10pOwoKIAoKCgoKCgoKCgoKCgoKaW50IGdlb19tYXRjaChjb25zdCBnZW9fUXVhZCYg cXVhZDAsIGNvbnN0IGdlb19RdWFkJiBxdWFkMSwgaW50IGlkeFtdKTsKCgojIDE2ICIuLi9mdW5j dGlvbi8uLi9zcGFjZS8uLi9nZW9tZXRyeS9nZW9DZWxsLmgiIDIKCiMgMSAiLi4vZnVuY3Rpb24v Li4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2VvRGVidWcuaCIgMQojIDEgIi4uL2Z1bmN0aW9uLy4uL3Nw YWNlLy4uL2dlb21ldHJ5Ly4uL2RlYnVnLmgiIDEKIAoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2Nj LWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0cmVhbS5o IiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKIAogCgoKCgpleHRlcm4gIkMrKyIg ewpleHRlcm4gY2hhciogZm9ybShjb25zdCBjaGFyKiwgLi4uKTsKCmV4dGVybiBjaGFyKiBkZWMo bG9uZywgaW50PTApOwpleHRlcm4gY2hhciogZGVjKGludCwgaW50PTApOwpleHRlcm4gY2hhciog ZGVjKHVuc2lnbmVkIGxvbmcsIGludD0wKTsKZXh0ZXJuIGNoYXIqIGRlYyh1bnNpZ25lZCBpbnQs IGludD0wKTsKCmV4dGVybiBjaGFyKiBoZXgobG9uZywgaW50PTApOwpleHRlcm4gY2hhciogaGV4 KGludCwgaW50PTApOwpleHRlcm4gY2hhciogaGV4KHVuc2lnbmVkIGxvbmcsIGludD0wKTsKZXh0 ZXJuIGNoYXIqIGhleCh1bnNpZ25lZCBpbnQsIGludD0wKTsKCmV4dGVybiBjaGFyKiBvY3QobG9u ZywgaW50PTApOwpleHRlcm4gY2hhciogb2N0KGludCwgaW50PTApOwpleHRlcm4gY2hhciogb2N0 KHVuc2lnbmVkIGxvbmcsIGludD0wKTsKZXh0ZXJuIGNoYXIqIG9jdCh1bnNpZ25lZCBpbnQsIGlu dD0wKTsKCmNoYXIqICAgICAgICBjaHIoY2hhciBjaCwgaW50IHdpZHRoID0gMCk7CmNoYXIqICAg ICAgICBzdHIoY29uc3QgY2hhciogcywgaW50IHdpZHRoID0gMCk7CgppbmxpbmUgaXN0cmVhbSYg V1MoaXN0cmVhbSYgX19zdHIpIHsgcmV0dXJuIHdzKF9fc3RyKTsgfQp9ICAKCgojIDEwICIuLi9m dW5jdGlvbi8uLi9zcGFjZS8uLi9nZW9tZXRyeS8uLi9kZWJ1Zy5oIiAyCgoKCgoKCiAKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCiMg NTYgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMwoKCmV4dGVybiAiQyIgeyAKCiAKZXh0ZXJuIHZv aWQgX19hc3NlcnRfZmFpbCAoX19jb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgX19jb25zdCBjaGFy ICpfX2ZpbGUsCgkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsIF9fY29uc3QgY2hhciAqX19mdW5j dGlvbikKICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKIApl eHRlcm4gdm9pZCBfX2Fzc2VydF9wZXJyb3JfZmFpbCAoaW50IF9fZXJybnVtLCBfX2NvbnN0IGNo YXIgKl9fZmlsZSwKCQkJCSAgdW5zaWduZWQgaW50IF9fbGluZSwKCQkJCSAgX19jb25zdCBjaGFy ICpfX2Z1bmN0aW9uKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9f KSk7CgoKIAoKZXh0ZXJuIHZvaWQgX19hc3NlcnQgKGNvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBj b25zdCBjaGFyICpfX2ZpbGUsIGludCBfX2xpbmUpCiAgICAgdGhyb3cgKCkgIF9fYXR0cmlidXRl X18gKChfX25vcmV0dXJuX18pKTsKCgp9IAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoj IDU3ICIuLi9mdW5jdGlvbi8uLi9zcGFjZS8uLi9nZW9tZXRyeS8uLi9kZWJ1Zy5oIiAyCgojIDEg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9pb21hbmlwIiAxIDMKIAogCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4 LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvbWFuaXAuaCIgMSAzCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKZXh0ZXJuICJDKysiIHsK IAogCiAKCiAKIAogCiAKdGVtcGxhdGU8Y2xhc3MgVFA+IGNsYXNzIHNtYW5pcDsgIAoKdGVtcGxh dGU8Y2xhc3MgVFA+IGNsYXNzIHNhcHAgewogICAgaW9zJiAoKl9mKShpb3MmLCBUUCk7CnB1Ymxp YzogCiAgICBzYXBwKGlvcyYgKCpmKShpb3MmLCBUUCkpIDogX2YoZikge30KICAgICAKICAgIHNt YW5pcDxUUD4gb3BlcmF0b3IoKShUUCBhKSAKICAgICAgeyByZXR1cm4gc21hbmlwPFRQPihfZiwg YSk7IH0KfTsKCnRlbXBsYXRlPGNsYXNzIFRQPgppbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3I+Pihp c3RyZWFtJiBpLCBjb25zdCBzbWFuaXA8VFA+JiBtKTsKdGVtcGxhdGU8Y2xhc3MgVFA+CmlubGlu ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG8sIGNvbnN0IHNtYW5pcDxUUD4mIG0pOwoK dGVtcGxhdGUgPGNsYXNzIFRQPiBjbGFzcyBzbWFuaXAgewogICAgaW9zJiAoKl9mKShpb3MmLCBU UCk7CiAgICBUUCBfYTsKcHVibGljOgogICAgc21hbmlwKGlvcyYgKCpmKShpb3MmLCBUUCksIFRQ IGEpIDogX2YoZiksIF9hKGEpIHt9CiAgICAgCiAgICBmcmllbmQgCiAgICAgIGlzdHJlYW0mIG9w ZXJhdG9yPj4gPD4oaXN0cmVhbSYgaSwgY29uc3Qgc21hbmlwPFRQPiYgbSk7CiAgICBmcmllbmQK ICAgICAgb3N0cmVhbSYgb3BlcmF0b3I8PCA8Pihvc3RyZWFtJiBvLCBjb25zdCBzbWFuaXA8VFA+ JiBtKTsKfTsKCgpfX2V4dGVuc2lvbl9fIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBzbWFuaXA8aW50 PjsKX19leHRlbnNpb25fXyBleHRlcm4gdGVtcGxhdGUgY2xhc3Mgc21hbmlwPGlvczo6Zm10Zmxh Z3M+OwoKCnRlbXBsYXRlPGNsYXNzIFRQPgppbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3Ry ZWFtJiBpLCBjb25zdCBzbWFuaXA8VFA+JiBtKQp7ICgqbS5fZikoaSwgbS5fYSk7IHJldHVybiBp OyB9Cgp0ZW1wbGF0ZTxjbGFzcyBUUD4KaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVh bSYgbywgY29uc3Qgc21hbmlwPFRQPiYgbSkKeyAoKm0uX2YpKG8sIG0uX2EpOyByZXR1cm4gbzt9 CgoKX19leHRlbnNpb25fXyBleHRlcm4gCnRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0 cmVhbSYsIGNvbnN0IHNtYW5pcDxpbnQ+Jik7Cl9fZXh0ZW5zaW9uX18gZXh0ZXJuIAp0ZW1wbGF0 ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjb25zdCBzbWFuaXA8aW9zOjpmbXRmbGFn cz4mKTsKX19leHRlbnNpb25fXyBleHRlcm4gCnRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwo b3N0cmVhbSYsIGNvbnN0IHNtYW5pcDxpbnQ+Jik7Cl9fZXh0ZW5zaW9uX18gZXh0ZXJuIAp0ZW1w bGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBzbWFuaXA8aW9zOjpmbXRm bGFncz4mKTsKCgogCiAKIAogCnRlbXBsYXRlPGNsYXNzIFRQPiBjbGFzcyBpbWFuaXA7IAoKdGVt cGxhdGU8Y2xhc3MgVFA+IGNsYXNzIGlhcHAgewogICAgaXN0cmVhbSYgKCpfZikoaXN0cmVhbSYs IFRQKTsKcHVibGljOiAKICAgIGlhcHAoaXN0cmVhbSYgKCpmKShpc3RyZWFtJixUUCkpIDogX2Yo Zikge30KICAgICAKICAgIGltYW5pcDxUUD4gb3BlcmF0b3IoKShUUCBhKQogICAgICAgeyByZXR1 cm4gaW1hbmlwPFRQPihfZiwgYSk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBUUD4KaW5saW5lIGlz dHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIGNvbnN0IGltYW5pcDxUUD4mKTsKCnRlbXBsYXRl IDxjbGFzcyBUUD4gY2xhc3MgaW1hbmlwIHsKICAgIGlzdHJlYW0mICgqX2YpKGlzdHJlYW0mLCBU UCk7CiAgICBUUCBfYTsKcHVibGljOgogICAgaW1hbmlwKGlzdHJlYW0mICgqZikoaXN0cmVhbSYs IFRQKSwgVFAgYSkgOiBfZihmKSwgX2EoYSkge30KICAgICAKICAgIGZyaWVuZAogICAgICBpc3Ry ZWFtJiBvcGVyYXRvcj4+IDw+KGlzdHJlYW0mIGksIGNvbnN0IGltYW5pcDxUUD4mIG0pOwp9OwoK dGVtcGxhdGUgPGNsYXNzIFRQPgppbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiBp LCBjb25zdCBpbWFuaXA8VFA+JiBtKQp7IHJldHVybiAoKm0uX2YpKCBpLCBtLl9hKTsgfQoKIAog CiAKIAp0ZW1wbGF0ZTxjbGFzcyBUUD4gY2xhc3Mgb21hbmlwOyAKCnRlbXBsYXRlPGNsYXNzIFRQ PiBjbGFzcyBvYXBwIHsKICAgIG9zdHJlYW0mICgqX2YpKG9zdHJlYW0mLCBUUCk7CnB1YmxpYzog CiAgICBvYXBwKG9zdHJlYW0mICgqZikob3N0cmVhbSYsVFApKSA6IF9mKGYpIHt9CiAgICAgCiAg ICBvbWFuaXA8VFA+IG9wZXJhdG9yKCkoVFAgYSkKICAgICAgeyByZXR1cm4gb21hbmlwPFRQPihf ZiwgYSk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBUUD4KaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9y PDwob3N0cmVhbSYsIGNvbnN0IG9tYW5pcDxUUD4mKTsKCnRlbXBsYXRlIDxjbGFzcyBUUD4gY2xh c3Mgb21hbmlwIHsKICAgIG9zdHJlYW0mICgqX2YpKG9zdHJlYW0mLCBUUCk7CiAgICBUUCBfYTsK cHVibGljOgogICAgb21hbmlwKG9zdHJlYW0mICgqZikob3N0cmVhbSYsIFRQKSwgVFAgYSkgOiBf ZihmKSwgX2EoYSkge30KICAgICAKICAgIGZyaWVuZAogICAgICBvc3RyZWFtJiBvcGVyYXRvcjw8 IDw+KG9zdHJlYW0mIG8sIGNvbnN0IG9tYW5pcDxUUD4mIG0pOwp9OwoKdGVtcGxhdGUgPGNsYXNz IFRQPgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvLCBjb25zdCBvbWFuaXA8 VFA+JiBtKQp7IHJldHVybiAoKm0uX2YpKG8sIG0uX2EpOyB9CgogCiAKIAoKIAogCiAKIAoKCgoK CmV4dGVybiBpb3MmIF9faW9tYW5pcF9zZXRiYXNlICAoaW9zJiwgICBpbnQgKTsgaW5saW5lICAg c21hbmlwIDwgIGludCA+ICAgc2V0YmFzZSAgKCAgaW50ICBuKSB7IHJldHVybiAgIHNtYW5pcCA8 ICBpbnQgPiAoX19pb21hbmlwX3NldGJhc2UgLCBuKTsgfSAKZXh0ZXJuIGlvcyYgX19pb21hbmlw X3NldGZpbGwgIChpb3MmLCAgIGludCApOyBpbmxpbmUgICBzbWFuaXAgPCAgaW50ID4gICBzZXRm aWxsICAoICBpbnQgIG4pIHsgcmV0dXJuICAgc21hbmlwIDwgIGludCA+IChfX2lvbWFuaXBfc2V0 ZmlsbCAsIG4pOyB9IApleHRlcm4gaW9zJiBfX2lvbWFuaXBfc2V0cHJlY2lzaW9uICAoaW9zJiwg ICBpbnQgKTsgaW5saW5lICAgc21hbmlwIDwgIGludCA+ICAgc2V0cHJlY2lzaW9uICAoICBpbnQg IG4pIHsgcmV0dXJuICAgc21hbmlwIDwgIGludCA+IChfX2lvbWFuaXBfc2V0cHJlY2lzaW9uICwg bik7IH0gCmV4dGVybiBpb3MmIF9faW9tYW5pcF9zZXR3ICAoaW9zJiwgICBpbnQgKTsgaW5saW5l ICAgc21hbmlwIDwgIGludCA+ICAgc2V0dyAgKCAgaW50ICBuKSB7IHJldHVybiAgIHNtYW5pcCA8 ICBpbnQgPiAoX19pb21hbmlwX3NldHcgLCBuKTsgfSAKCmV4dGVybiBpb3MmIF9faW9tYW5pcF9y ZXNldGlvc2ZsYWdzICAoaW9zJiwgICBpb3M6OmZtdGZsYWdzICk7IGlubGluZSAgIHNtYW5pcCA8 ICBpb3M6OmZtdGZsYWdzID4gICByZXNldGlvc2ZsYWdzICAoICBpb3M6OmZtdGZsYWdzICBuKSB7 IHJldHVybiAgIHNtYW5pcCA8ICBpb3M6OmZtdGZsYWdzID4gKF9faW9tYW5pcF9yZXNldGlvc2Zs YWdzICwgbik7IH0gCmV4dGVybiBpb3MmIF9faW9tYW5pcF9zZXRpb3NmbGFncyAgKGlvcyYsICAg aW9zOjpmbXRmbGFncyApOyBpbmxpbmUgICBzbWFuaXAgPCAgaW9zOjpmbXRmbGFncyA+ICAgc2V0 aW9zZmxhZ3MgICggIGlvczo6Zm10ZmxhZ3MgIG4pIHsgcmV0dXJuICAgc21hbmlwIDwgIGlvczo6 Zm10ZmxhZ3MgPiAoX19pb21hbmlwX3NldGlvc2ZsYWdzICwgbik7IH0gCn0gIAoKCiMgNiAiL3Vz ci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0z L2lvbWFuaXAiIDIgMwoKCiMgNTggIi4uL2Z1bmN0aW9uLy4uL3NwYWNlLy4uL2dlb21ldHJ5Ly4u L2RlYnVnLmgiIDIKCgoKCiMgMSAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2Vv RGVidWcuaCIgMgoKCgoKCgoKIAogCiAKCiAKCgogCgoKCiAKCgogCgoKCgoKCgoKIAoKCgogCgoK CgoKCiAKCgoKIAoKCgoKIyAxNyAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2Vv Q2VsbC5oIiAyCgoKIAoKY2xhc3MgZ2VvX1ZlcnRleDJkOwpjbGFzcyBnZW9fVmVydGV4M2Q7Cgog CgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIGdlb19NYXBUcmlhbmdsZTJkIHsK CiAgIAogIHVjaGFyKiBtYXBfOwoKICAgCiAgdWludCAgIHN6XzsKCiAgIAogIHJlYWwgICBzY3hf OwoKICAgCiAgcmVhbCAgIHNjeV87CgogICAKICB2b2lkIG9wZXJhdG9yPShjb25zdCBnZW9fTWFw VHJpYW5nbGUyZCAmKTsKCiBwdWJsaWM6CiAgIAoKCgoKCgoKCgogIGdlb19NYXBUcmlhbmdsZTJk KGNoYXIqIG1hcCwgcmVhbCBzY1gsIHJlYWwgc2NZKTsKCiAgIAogIGdlb19NYXBUcmlhbmdsZTJk KGNvbnN0IGdlb19NYXBUcmlhbmdsZTJkICZtYXApOwogIH5nZW9fTWFwVHJpYW5nbGUyZCgpIHsg ZGVsZXRlW10gbWFwXzsgfQoKICAgCgoKCgoKCiAgUmVhbDJkIG9wZXJhdG9yKCkocmVhbCB4LCBy ZWFsIHkpIGNvbnN0IHsgCiAgICByZXR1cm4gUmVhbDJkKG1hcF8sIHNjeF8gKiB4LCBzY3lfICog eSk7IH0KfTsKCiAKCiAKCgoKCgoKCmNsYXNzIGdlb19NYXBRdWFkMmQgewoKICAgCiAgdWNoYXIq IG1hcF87CgogICAKICB1aW50ICAgc3pfOwoKICAgCiAgcmVhbCAgIHNjeF87CgogICAKICByZWFs ICAgc2N5XzsKCiAgUmVhbDJkIG9yZ187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICByZWFsICAgc3RyZXRjaF87ICAgICAKCiAgIAogIHZvaWQgb3BlcmF0 b3I9KGNvbnN0IGdlb19NYXBRdWFkMmQgJik7CgogcHVibGljOgogICAKCgoKCgoKCgoKCgogIGdl b19NYXBRdWFkMmQoY2hhciogbWFwLCByZWFsIHNjWCwgcmVhbCBzY1ksIFJlYWwyZCBvcmcgPSBS ZWFsMmQoMC4wLCAwLjApLAoJCXJlYWwgc3RyZXRjaCA9IDEuMCk7ICAKCiAgIAogIGdlb19NYXBR dWFkMmQoY29uc3QgZ2VvX01hcFF1YWQyZCAmbWFwKTsKICB+Z2VvX01hcFF1YWQyZCgpIHsgZGVs ZXRlW10gbWFwXzsgfQoKICAgCgoKCgoKCiAgUmVhbDJkIG9wZXJhdG9yKCkocmVhbCB4LCByZWFs IHkpIGNvbnN0IHsKICAgIFJlYWwyZCB2KG1hcF8sIHNjeF8gKiB4LCBzY3lfICogeSk7CiAgICB2 LnNjYWxlKHN0cmV0Y2hfKTsKICAgIHJldHVybiB2ICsgb3JnXzsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAogIH0KfTsKCiAKCiAKCmNsYXNzIGdlb19NYXBUcmlhbmds ZTNkIHsKCiAgIAogIHVjaGFyKiBtYXBfOwoKICAgCiAgdWludCAgIHN6XzsKCiAgIAogIHJlYWwg ICBzY3hfOwoKICAgCiAgcmVhbCAgIHNjeV87CgogICAKICB2b2lkIG9wZXJhdG9yPShjb25zdCBn ZW9fTWFwVHJpYW5nbGUzZCAmKTsKCiBwdWJsaWM6CiAgIAoKCgoKCgoKCgogIGdlb19NYXBUcmlh bmdsZTNkKGNoYXIqIG1hcCwgcmVhbCBzY1gsIHJlYWwgc2NZKTsKCiAgIAogIGdlb19NYXBUcmlh bmdsZTNkKGNvbnN0IGdlb19NYXBUcmlhbmdsZTNkICZtYXApOwogIH5nZW9fTWFwVHJpYW5nbGUz ZCgpIHsgZGVsZXRlW10gbWFwXzsgfQoKICAgCgoKCgoKCiAgUmVhbDNkIG9wZXJhdG9yKCkocmVh bCB4LCByZWFsIHkpIGNvbnN0IHsgCiAgICByZXR1cm4gUmVhbDNkKG1hcF8sIHNjeF8gKiB4LCBz Y3lfICogeSk7IH0KfTsKCiAKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNz IGdlb19NYXBUZXRyYWhlZHJvbjNkIHsKCiAgIAogIHVjaGFyKiBtYXBfOwoKICAgCiAgdWludCBz el87CgogICAKICByZWFsIHNjeF87CgogICAKICByZWFsIHNjeV87CgogICAKICByZWFsIHNjel87 CgogICAKICBSb3RhdGlvbjNkIEJfOwoKICAgCiAgUmVhbDNkIGJfOwoKICAgCiAgdm9pZCBvcGVy YXRvcj0oY29uc3QgZ2VvX01hcFRldHJhaGVkcm9uM2QgJik7CgpwdWJsaWM6CiAgIAoKCgoKCgoK CgoKICBnZW9fTWFwVGV0cmFoZWRyb24zZChjaGFyKiBtYXAsIHJlYWwgc2NYLCByZWFsIHNjWSwg cmVhbCBzY1opOwoKICAgCgoKCgoKICBnZW9fTWFwVGV0cmFoZWRyb24zZChSZWFsM2QgdnR4MCwg UmVhbDNkIHZ0eDEsIFJlYWwzZCB2dHgyLCBSZWFsM2QgdnR4Myk7CgogICAKICBnZW9fTWFwVGV0 cmFoZWRyb24zZChjb25zdCBnZW9fTWFwVGV0cmFoZWRyb24zZCAmbWFwKTsKICB+Z2VvX01hcFRl dHJhaGVkcm9uM2QoKSB7IGRlbGV0ZVtdIG1hcF87IH0KCiAgIAoKCgoKCgoKCgoKCgoKCiAgUmVh bDNkIG9wZXJhdG9yKCkocmVhbCB4LCByZWFsIHksIHJlYWwgeikgY29uc3QgeyAKICAgIGlmICht YXBfKQogICAgICByZXR1cm4gUmVhbDNkKG1hcF8sIHNjeF8gKiB4LCBzY3lfICogeSwgc2N6XyAq IHopOwogICAgZWxzZSB7CiAgICAgIHJlYWwgYSA9IHkqKDEuMC16KTsKICAgICAgUmVhbDNkIHhp KHgqKDEuMC16KSooMS4wLWEpLCBhLCB6KTsKICAgICAgUmVhbDNkIHJlczsKICAgICAgQl8ubWFw KHhpLCAmcmVzKTsKICAgICAgcmVzICs9IGJfOwogICAgICBpZiggMCAgIT0wKSBjb3V0IDw8ICAg J1snIDw8ICAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vZ2VvbWV0cnkvZ2VvQ2VsbC5oIiA8PCAi LCBsaW5lICIgPDwgMzI0CgkgIDw8ICJdIGdlb19NYXBUZXRyYWhlZHJvbjNkOjpvcGVyYXRvcigp IC0tICgiIDw8IHggPDwgIiwgIiA8PCB5IAoJICA8PCAiLCAiIDw8IHogPDwgIikgLT4gIiA8PCB4 aSA8PCAiIC0+IiAgPDwgIiAiIDw8ICAgcmVzICA8PCBlbmRsOyA7CiAgICAgIHJldHVybiByZXM7 CiAgICB9CiAgfQp9OwoKIAoKIAoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgZ2VvX01hcEhleGFoZWRy b24zZCB7CgogICAKICB1Y2hhciogbWFwXzsKCiAgIAogIHVpbnQgc3pfOwoKICAgCiAgcmVhbCBz Y3hfOwoKICAgCiAgcmVhbCBzY3lfOwoKICAgCiAgcmVhbCBzY3pfOwoKICAgCiAgUmVhbDNkICpj b21wXzsKCiAgIAogIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGdlb19NYXBIZXhhaGVkcm9uM2QgJik7 CgpwdWJsaWM6CiAgIAoKCgoKCgoKCgoKICBnZW9fTWFwSGV4YWhlZHJvbjNkKGNoYXIqIG1hcCwg cmVhbCBzY1gsIHJlYWwgc2NZLCByZWFsIHNjWik7CgogICAKCgoKCgogIGdlb19NYXBIZXhhaGVk cm9uM2QoY29uc3QgUmVhbDNkJiB2dHgwLCBjb25zdCBSZWFsM2QmIHZ0eDEsIAoJCSAgICAgIGNv bnN0IFJlYWwzZCYgdnR4MiwgY29uc3QgUmVhbDNkJiB2dHgzLAoJCSAgICAgIGNvbnN0IFJlYWwz ZCYgdnR4NCwgY29uc3QgUmVhbDNkJiB2dHg1LAoJCSAgICAgIGNvbnN0IFJlYWwzZCYgdnR4Niwg Y29uc3QgUmVhbDNkJiB2dHg3KTsKCiAgIAogIGdlb19NYXBIZXhhaGVkcm9uM2QoY29uc3QgZ2Vv X01hcEhleGFoZWRyb24zZCAmbWFwKTsKICB+Z2VvX01hcEhleGFoZWRyb24zZCgpIHsgZGVsZXRl W10gbWFwXzsgZGVsZXRlW10gY29tcF87IH0KCiAgIAoKCgoKCgoKICBpbmxpbmUgUmVhbDNkIG9w ZXJhdG9yKCkocmVhbCB4LCByZWFsIHksIHJlYWwgeikgY29uc3QgeyAKICAgIGlmIChtYXBfKQog ICAgICByZXR1cm4gUmVhbDNkKG1hcF8sIHNjeF8gKiB4LCBzY3lfICogeSwgc2N6Xyogeik7CiAg ICBlbHNlIHsKICAgICAgcmV0dXJuIGNvbXBfWzBdKih4KnkqeikKCSsgY29tcF9bMV0qKHgqeSkg KyBjb21wX1syXSooeCp6KSArIGNvbXBfWzNdKih5KnopCgkrIGNvbXBfWzRdKnggKyBjb21wX1s1 XSp5ICsgY29tcF9bNl0qegoJKyBjb21wX1s3XTsKICAgIH0KICB9CgogIGlubGluZSBkb3VibGUg amFjb2JpYW4oZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgY29uc3QgewogICAgaWYgKG1h cF8pCiAgICAgIHJldHVybiAwLjA7CiAgICBlbHNlIHsKICAgICAgUmVhbDNkIGZpcnN0IChjb21w X1swXSooeSp6KSArIGNvbXBfWzFdKnkgKyBjb21wX1syXSp6ICsgY29tcF9bNF0pOwogICAgICBS ZWFsM2Qgc2Vjb25kKGNvbXBfWzBdKih4KnopICsgY29tcF9bMV0qeCArIGNvbXBfWzNdKnogKyBj b21wX1s1XSk7CiAgICAgIFJlYWwzZCB0aGlyZCAoY29tcF9bMF0qKHgqeSkgKyBjb21wX1syXSp4 ICsgY29tcF9bM10qeSArIGNvbXBfWzZdKTsKCiAgICAgIHJldHVybiBmYWJzKGZpcnN0LngoKSpz ZWNvbmQueSgpKnRoaXJkLnooKSArCgkJICBzZWNvbmQueCgpKnRoaXJkLnkoKSpmaXJzdC56KCkg KwoJCSAgdGhpcmQueCgpKmZpcnN0LnkoKSpzZWNvbmQueigpIC0KCQkgIGZpcnN0LnooKSpzZWNv bmQueSgpKnRoaXJkLngoKSAtCgkJICBzZWNvbmQueigpKnRoaXJkLnkoKSpmaXJzdC54KCkgLQoJ CSAgdGhpcmQueigpKmZpcnN0LnkoKSpzZWNvbmQueCgpKTsKICAgIH0KICB9Cn07CgogCgogCgoK CgoKCmNsYXNzIGdlb19DZWxsIHsKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVh bSYgb3MsIGNvbnN0IGdlb19DZWxsJiBjKTsKcHVibGljOgogIHZpcnR1YWwgZ2VvX0NlbGwqIGNo aWxkKHVpbnQgaSkgPSAwOwogIHZpcnR1YWwgZ2VvX0Nvbm5lY3RvciYgY29ubmVjdG9yKCkgY29u c3QgPSAwOwogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3QgPSAwOwp9 OwoKIAoKIAoKCmNsYXNzIGdlb19DZWxsMiA6IHB1YmxpYyBnZW9fQ2VsbCB7CgogcHVibGljOgog IHZpcnR1YWwgZ2VvX0NlbGwyKiBjaGlsZCh1aW50IGkpID0gMDsKICB2aXJ0dWFsIGdlb19Db25u ZWN0b3IyJiBjb25uZWN0b3IoKSBjb25zdCA9IDA7Cn07CgogCgogCgoKY2xhc3MgZ2VvX0NlbGwz IDogcHVibGljIGdlb19DZWxsIHsKCnB1YmxpYzoKICB2aXJ0dWFsIGdlb19DZWxsMyogY2hpbGQo dWludCBpKSA9IDA7CiAgdmlydHVhbCBnZW9fQ29ubmVjdG9yMyYgY29ubmVjdG9yKCkgY29uc3Qg PSAwOwogIHZpcnR1YWwgUmVhbDNkIHZlcnRleCh1aW50IGkpIGNvbnN0ID0gMDsKfTsKCiAKCiAK CmNsYXNzIGdlb19UcmlhbmdsZTJkIDogcHVibGljIGdlb19DZWxsMiB7CgogICAKCiAgc3RydWN0 IEluZGV4IHsKICAgICAKICAgIHVjaGFyICBsXzsKCiAgICAgCgoKCiAgICB1c2hvcnQgaV87Cgog ICAgIAoKCgogICAgdXNob3J0IGpfOwoKICAgIGlubGluZSBJbmRleCgpOwogICAgaW5saW5lIElu ZGV4KHVjaGFyIGwsIHVzaG9ydCBpLCB1c2hvcnQgaik7CiAgICBpbmxpbmUgb3N0cmVhbSYgaW5m byhvc3RyZWFtJiBvcykgY29uc3Q7CiAgfTsKCiAgIAogIEluZGV4IGlkeF87CgogICAKICBnZW9f VHJpYW5nbGUmIGNudHJfOwoKICAgCiAgZ2VvX1RyaWFuZ2xlMmQqIGxua187CgogICAKCgogIGdl b19UcmlhbmdsZTJkKiBjaGxkXzsKCiAgIAogIGdlb19NYXBUcmlhbmdsZTJkKiBtYXBfOwoKICAg CiAgZ2VvX1RyaWFuZ2xlMmQoZ2VvX1RyaWFuZ2xlJiBjbnRyLCBnZW9fTWFwVHJpYW5nbGUyZCog bWFwLCBjb25zdCBJbmRleCYgaWR4KTsKCiBwdWJsaWM6CiAgIAoKCgogIGdlb19UcmlhbmdsZTJk KGdlb19UcmlhbmdsZSYgY250ciwgY29uc3QgZ2VvX01hcFRyaWFuZ2xlMmQmIG1hcCk7CiAgdmly dHVhbCB+Z2VvX1RyaWFuZ2xlMmQoKTsKICAKICAgCgoKCgogIGdlb19UcmlhbmdsZTJkKiBjaGls ZCh1aW50IGkpOwoKICAgCiAgaW5saW5lIGdlb19UcmlhbmdsZSYgY29ubmVjdG9yKCkgY29uc3Q7 CiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKCgoKCgoKCiAgUmVhbDJk IGNoaShyZWFsIHhpLCByZWFsIGV0YSkgY29uc3Q7Cn07CgppbmxpbmUgZ2VvX1RyaWFuZ2xlMmQ6 OkluZGV4OjpJbmRleCgpIHsgCiAgbF8gPSAwOyBpXyA9IGpfID0gMDsgCn0KCmlubGluZSBnZW9f VHJpYW5nbGUmIGdlb19UcmlhbmdsZTJkOjpjb25uZWN0b3IoKSBjb25zdCB7IAogIHJldHVybiBj bnRyXzsgCn0KCmlubGluZSBvc3RyZWFtJiBnZW9fVHJpYW5nbGUyZDo6SW5kZXg6OmluZm8ob3N0 cmVhbSYgb3MpIGNvbnN0IHsKICByZXR1cm4gb3MgPDwgJygnIDw8ICh1aW50KWxfIDw8ICIsICIg PDwgaV8gPDwgIiwgIiA8PCBqXyA8PCAnKSc7Cn0KCiAKCiAKCmNsYXNzIGdlb19RdWFkMmQgOiBw dWJsaWMgZ2VvX0NlbGwyIHsKCiAgIAoKICBzdHJ1Y3QgSW5kZXggewogICAgZnJpZW5kIG9zdHJl YW0mIG9wZXJhdG9yIDw8KG9zdHJlYW0mIG9zLCBjb25zdCBJbmRleCYgaSk7CgogICAgIAogICAg dWNoYXIgIGxfOwoKICAgICAKCgoKICAgIHVzaG9ydCBpXzsKCiAgICAgCgoKCiAgICB1c2hvcnQg al87CgogICAgaW5saW5lIEluZGV4KCk7CiAgICBpbmxpbmUgSW5kZXgodWNoYXIgbCwgdXNob3J0 IGksIHVzaG9ydCBqKTsKICAgIGlubGluZSBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25z dDsKICB9OwoKICAgCiAgSW5kZXggaWR4XzsKCiAgIAogIGdlb19RdWFkJiBjbnRyXzsKCiAgIAog IGdlb19RdWFkMmQqIGxua187CgogICAKCgogIGdlb19RdWFkMmQqIGNobGRfOwoKICAgCiAgZ2Vv X01hcFF1YWQyZCogbWFwXzsKCiAgIAogIGdlb19RdWFkMmQoZ2VvX1F1YWQmIGNudHIsIGdlb19N YXBRdWFkMmQqIG1hcCwgY29uc3QgSW5kZXgmIGlkeCk7CgpwdWJsaWM6CiAgIAoKCgogIGdlb19R dWFkMmQoZ2VvX1F1YWQmIGNudHIsIGNvbnN0IGdlb19NYXBRdWFkMmQmIG1hcCk7CiAgdmlydHVh bCB+Z2VvX1F1YWQyZCgpOwogIAogICAKCgoKCiAgZ2VvX1F1YWQyZCogY2hpbGQodWludCBpKTsK CiAgIAogIGlubGluZSBnZW9fUXVhZCYgY29ubmVjdG9yKCkgY29uc3Q7CiAgb3N0cmVhbSYgaW5m byhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKCgoKCgoKICBSZWFsMmQgY2hpKHJlYWwgeGksIHJl YWwgZXRhKSBjb25zdDsKfTsKCmlubGluZSBnZW9fUXVhZDJkOjpJbmRleDo6SW5kZXgoKSB7IAog IGxfID0gMDsgaV8gPSBqXyA9IDA7IAp9CgppbmxpbmUgZ2VvX1F1YWQyZDo6SW5kZXg6OkluZGV4 KHVjaGFyIGwsIHVzaG9ydCBpLCB1c2hvcnQgaikgeyAKICBsXyA9IGw7IGlfID0gaTsgal8gPSBq OyAKfQoKaW5saW5lIG9zdHJlYW0mIGdlb19RdWFkMmQ6OkluZGV4OjppbmZvKG9zdHJlYW0mIG9z KSBjb25zdCB7CiAgcmV0dXJuIG9zIDw8ICcoJyA8PCAodWludClsXyA8PCAiLCAiIDw8IGlfIDw8 ICIsICIgPDwgal8gPDwgJyknOwp9CgppbmxpbmUgZ2VvX1F1YWQmIGdlb19RdWFkMmQ6OmNvbm5l Y3RvcigpIGNvbnN0IHsgCiAgcmV0dXJuIGNudHJfOyAKfQoKIAoKIAoKY2xhc3MgZ2VvX1RyaWFu Z2xlM2QgOiBwdWJsaWMgZ2VvX0NlbGwyIHsKCiAgc3RydWN0IEluZGV4IHsKICAgIHVjaGFyICBs XzsKICAgIHVzaG9ydCBpXzsKICAgIHVzaG9ydCBqXzsKCiAgICBpbmxpbmUgSW5kZXgoKTsKICAg IGlubGluZSBJbmRleCh1Y2hhciBsLCB1c2hvcnQgaSwgdXNob3J0IGopOwogICAgaW5saW5lIG9z dHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwogIH07CgogIEluZGV4IGlkeF87CgogIGdl b19UcmlhbmdsZSYgY250cl87CgogIGdlb19UcmlhbmdsZTNkKiBsbmtfOwogIGdlb19Ucmlhbmds ZTNkKiBjaGxkXzsKCiAgZ2VvX01hcFRyaWFuZ2xlM2QqIG1hcF87CgogIGdlb19UcmlhbmdsZTNk KGdlb19UcmlhbmdsZSYgY250ciwgZ2VvX01hcFRyaWFuZ2xlM2QqIG1hcCwgY29uc3QgSW5kZXgm IGtleSk7CgogcHVibGljOgogIGdlb19UcmlhbmdsZTNkKGdlb19UcmlhbmdsZSYgY250ciwgY29u c3QgZ2VvX01hcFRyaWFuZ2xlM2QmIG1hcCk7CiAgdmlydHVhbCB+Z2VvX1RyaWFuZ2xlM2QoKTsK ICAKICBnZW9fVHJpYW5nbGUzZCogY2hpbGQodWludCBpKTsKICBpbmxpbmUgZ2VvX1RyaWFuZ2xl JiBjb25uZWN0b3IoKSBjb25zdDsKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsK CiAgUmVhbDNkIGNoaShyZWFsIHhpLCByZWFsIGV0YSkgY29uc3Q7Cn07CgppbmxpbmUgZ2VvX1Ry aWFuZ2xlM2Q6OkluZGV4OjpJbmRleCgpIHsgCiAgbF8gPSAwOyBpXyA9IGpfID0gMDsgCn0KCmlu bGluZSBnZW9fVHJpYW5nbGUzZDo6SW5kZXg6OkluZGV4KHVjaGFyIGwsIHVzaG9ydCBpLCB1c2hv cnQgaikgeyAKICBsXyA9IGw7IGlfID0gaTsgal8gPSBqOyAKfQoKaW5saW5lIGdlb19Ucmlhbmds ZSYgZ2VvX1RyaWFuZ2xlM2Q6OmNvbm5lY3RvcigpIGNvbnN0IHsgCiAgcmV0dXJuIGNudHJfOyAK fQoKaW5saW5lIG9zdHJlYW0mIGdlb19UcmlhbmdsZTNkOjpJbmRleDo6aW5mbyhvc3RyZWFtJiBv cykgY29uc3QgewogIHJldHVybiBvcyA8PCAnKCcgPDwgKHVpbnQpbF8gPDwgIiwgIiA8PCBpXyA8 PCAiLCAiIDw8IGpfIDw8ICcpJzsKfQoKIAoKIAoKY2xhc3MgZ2VvX1RldHJhaGVkcm9uM2QgOiBw dWJsaWMgZ2VvX0NlbGwzIHsKCiAgIAoKICBzdHJ1Y3QgSW5kZXggewogICAgIAogICAgdWNoYXIg IGxfOwoKICAgICAKCgoKICAgIHVzaG9ydCBpXzsKCiAgICAgCgoKCiAgICB1c2hvcnQgal87Cgog ICAgIAoKCgogICAgdXNob3J0IGtfOwoKICAgIGlubGluZSBJbmRleCgpOwogICAgaW5saW5lIElu ZGV4KHVjaGFyIGwsIHVzaG9ydCBpLCB1c2hvcnQgaiwgdXNob3J0IGspOwogICAgaW5saW5lIG9z dHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwogIH07CgogICAKICBJbmRleCBpZHhfOwoK ICAgCiAgZ2VvX1RldHJhaGVkcm9uJiBjbnRyXzsKCiAgIAogIGdlb19UZXRyYWhlZHJvbjNkKiBs bmtfOwoKICAgCgoKICBnZW9fVGV0cmFoZWRyb24zZCogY2hsZF87CgogICAKICBnZW9fTWFwVGV0 cmFoZWRyb24zZCogbWFwXzsKCiAgIAogIGdlb19UZXRyYWhlZHJvbjNkKGdlb19UZXRyYWhlZHJv biYgY250ciwgZ2VvX01hcFRldHJhaGVkcm9uM2QqIG1hcCwgCgkJICAgIGNvbnN0IEluZGV4JiBp ZHgpOwoKcHVibGljOgogICAKCgoKICBnZW9fVGV0cmFoZWRyb24zZChnZW9fVGV0cmFoZWRyb24m IGNudHIsIGNvbnN0IGdlb19NYXBUZXRyYWhlZHJvbjNkJiBtYXApOwogIHZpcnR1YWwgfmdlb19U ZXRyYWhlZHJvbjNkKCk7CiAgCiAgIAoKCgoKICBnZW9fVGV0cmFoZWRyb24zZCogY2hpbGQodWlu dCBpKTsKCiAgIAogIGlubGluZSBnZW9fVGV0cmFoZWRyb24mIGNvbm5lY3RvcigpIGNvbnN0Owog IG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAgCgoKCgoKCgogIFJlYWwzZCBj aGkocmVhbCB4aSwgcmVhbCBldGEsIHJlYWwgemV0YSkgY29uc3Q7CgogICAKICBSZWFsM2QgdmVy dGV4KHVpbnQgaSkgY29uc3Q7Cn07CgppbmxpbmUgZ2VvX1RldHJhaGVkcm9uM2Q6OkluZGV4OjpJ bmRleCgpIHsgCiAgbF8gPSAwOyBpXyA9IGpfID0ga18gPSAwOyAKfQoKaW5saW5lIGdlb19UZXRy YWhlZHJvbjNkOjpJbmRleDo6SW5kZXgodWNoYXIgbCwgCgkJCQkgICAgICAgdXNob3J0IGksIHVz aG9ydCBqLCB1c2hvcnQgaykgOgogIGxfKGwpLCBpXyhpKSwgal8oaiksIGtfKGspCnt9Cgppbmxp bmUgZ2VvX1RldHJhaGVkcm9uJiBnZW9fVGV0cmFoZWRyb24zZDo6Y29ubmVjdG9yKCkgY29uc3Qg eyAKICByZXR1cm4gY250cl87IAp9CgppbmxpbmUgb3N0cmVhbSYgZ2VvX1RldHJhaGVkcm9uM2Q6 OkluZGV4OjppbmZvKG9zdHJlYW0mIG9zKSBjb25zdCB7CiAgcmV0dXJuIG9zIDw8ICcoJyA8PCAo dWludClsXyA8PCAiLCAiIAoJICAgIDw8IGlfIDw8ICIsICIgPDwgal8gPDwgIiwgIiA8PCBrXyA8 PCAnKSc7Cn0KCiAKCiAKCmNsYXNzIGdlb19IZXhhaGVkcm9uM2QgOiBwdWJsaWMgZ2VvX0NlbGwz IHsKCiAgIAoKICBzdHJ1Y3QgSW5kZXggewogICAgIAogICAgdWNoYXIgIGxfOwoKICAgICAKCgoK ICAgIHVzaG9ydCBpXzsKCiAgICAgCgoKCiAgICB1c2hvcnQgal87CgogICAgIAoKCgogICAgdXNo b3J0IGtfOwoKICAgIGlubGluZSBJbmRleCgpOwogICAgaW5saW5lIEluZGV4KHVjaGFyIGwsIHVz aG9ydCBpLCB1c2hvcnQgaiwgdXNob3J0IGspOwogICAgaW5saW5lIG9zdHJlYW0mIGluZm8ob3N0 cmVhbSYgb3MpIGNvbnN0OwogIH07CgogICAKICBJbmRleCBpZHhfOwoKICAgCiAgZ2VvX0hleGFo ZWRyb24mIGNudHJfOwoKICAgCiAgZ2VvX0hleGFoZWRyb24zZCogbG5rXzsKCiAgIAoKCiAgZ2Vv X0hleGFoZWRyb24zZCogY2hsZF87CgogICAKICBnZW9fTWFwSGV4YWhlZHJvbjNkKiBtYXBfOwoK ICAgCiAgbXV0YWJsZSBnZW9fTWFwSGV4YWhlZHJvbjNkKiBqYWNvYmlhbl87CgogICAKICBnZW9f SGV4YWhlZHJvbjNkKGdlb19IZXhhaGVkcm9uJiBjbnRyLCBnZW9fTWFwSGV4YWhlZHJvbjNkKiBt YXAsIAoJCSAgICBjb25zdCBJbmRleCYgaWR4KTsKCnB1YmxpYzoKICAgCgoKCiAgZ2VvX0hleGFo ZWRyb24zZChnZW9fSGV4YWhlZHJvbiYgY250ciwgY29uc3QgZ2VvX01hcEhleGFoZWRyb24zZCYg bWFwKTsKICB2aXJ0dWFsIH5nZW9fSGV4YWhlZHJvbjNkKCk7CiAgCiAgIAoKCgoKICBnZW9fSGV4 YWhlZHJvbjNkKiBjaGlsZCh1aW50IGkpOwoKICAgCiAgaW5saW5lIGdlb19IZXhhaGVkcm9uJiBj b25uZWN0b3IoKSBjb25zdDsKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKCiAg IAoKCgoKCgoKICBSZWFsM2QgY2hpKHJlYWwgeGksIHJlYWwgZXRhLCByZWFsIHpldGEpIGNvbnN0 OwoKICByZWFsIGphY29iaWFuKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIGNvbnN0OwoK ICAgCiAgUmVhbDNkIHZlcnRleCh1aW50IGkpIGNvbnN0Owp9OwoKaW5saW5lIGdlb19IZXhhaGVk cm9uM2Q6OkluZGV4OjpJbmRleCgpIHsgCiAgbF8gPSAwOyBpXyA9IGpfID0ga18gPSAwOyAKfQoK aW5saW5lIGdlb19IZXhhaGVkcm9uM2Q6OkluZGV4OjpJbmRleCh1Y2hhciBsLCAKCQkJCSAgICAg ICB1c2hvcnQgaSwgdXNob3J0IGosIHVzaG9ydCBrKSA6CiAgbF8obCksIGlfKGkpLCBqXyhqKSwg a18oaykKe30KCmlubGluZSBnZW9fSGV4YWhlZHJvbiYgZ2VvX0hleGFoZWRyb24zZDo6Y29ubmVj dG9yKCkgY29uc3QgeyAKICByZXR1cm4gY250cl87IAp9CgppbmxpbmUgb3N0cmVhbSYgZ2VvX0hl eGFoZWRyb24zZDo6SW5kZXg6OmluZm8ob3N0cmVhbSYgb3MpIGNvbnN0IHsKICByZXR1cm4gb3Mg PDwgJygnIDw8ICh1aW50KWxfIDw8ICIsICIgCgkgICAgPDwgaV8gPDwgIiwgIiA8PCBqXyA8PCAi LCAiIDw8IGtfIDw8ICcpJzsKfQoKCiMgMTUgIi4uL2Z1bmN0aW9uLy4uL3NwYWNlL3NwY0VsZW1l bnQuaCIgMgoKCiMgMSAiLi4vZnVuY3Rpb24vLi4vc3BhY2UvLi4vdG9vbGJveC90YnhTY2FDby5o IiAxCiAKCgoKCgoKCgogCgogCgoKCnRlbXBsYXRlIDxjbGFzcyBULCB1bnNpZ25lZCBubG5rPiAK Y2xhc3MgdGJ4X0Nvbm5lY3RvciB7CiBwdWJsaWM6CiAgIAoKCgoKCiAgaW5saW5lIHRieF9Db25u ZWN0b3IoY29uc3QgVCYgdmFsLCB0YnhfQ29ubmVjdG9yKiBsbmsgPSBfX251bGwgKTsKCiAgIAoK CiAgaW5saW5lIHRieF9Db25uZWN0b3IqJiBvcGVyYXRvcltdKHVuc2lnbmVkIGkpOwoKICAgCiAg aW5saW5lIFQmIHZhbHVlKCk7CgogcHJpdmF0ZToKICAgCiAgdGJ4X0Nvbm5lY3RvciogbG5rX1tu bG5rXTsKCiAgIAogIFQgICAgICAgICAgICAgIHZhbF87CgogICAKICB0YnhfQ29ubmVjdG9yKGNv bnN0IHRieF9Db25uZWN0b3ImKTsKICB2b2lkIG9wZXJhdG9yID0oY29uc3QgdGJ4X0Nvbm5lY3Rv ciYpOwp9OwogIAp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgbmxuaz4KaW5saW5lIHRieF9D b25uZWN0b3I8VCwgbmxuaz46OnRieF9Db25uZWN0b3IoY29uc3QgVCYgdmFsLCAKCQkJCQkgICAg IHRieF9Db25uZWN0b3I8VCwgbmxuaz4qIGxuaykgOiAKICB2YWxfKHZhbCkgeyAKICBmb3IodW5z aWduZWQgaSA9IDA7IGkgPCBubG5rIC0gMTsgKytpKSBsbmtfW2ldID0gX19udWxsIDsgCiAgbG5r X1tubG5rIC0gMV0gPSBsbms7IAp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgbmxuaz4K aW5saW5lIHRieF9Db25uZWN0b3I8VCwgbmxuaz4qJiB0YnhfQ29ubmVjdG9yPFQsIG5sbms+Ojpv cGVyYXRvcltdKHVuc2lnbmVkIGkpIHsgCiAgcmV0dXJuIGxua19baV07IAp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgVCwgdW5zaWduZWQgbmxuaz4KaW5saW5lIFQmIHRieF9Db25uZWN0b3I8VCwgbmxuaz46 OnZhbHVlKCkgewogIHJldHVybiB2YWxfOwp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWdu ZWQgaHQ+CmNsYXNzIHRieF9TdGFjayB7CiAgVCAgc19baHRdOwogIFQqIHBfOwoKIHB1YmxpYzoK ICB0YnhfU3RhY2soKSB7IHBfID0gc187IH0KCgoKCiAgdGJ4X1N0YWNrKGNvbnN0IHRieF9TdGFj ayYgc3RrKSB7IHNfID0gc3RrLnNfOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcF8gPSBzXyArICgoVCBjb25zdCAqKXN0ay5wXyAtIHN0ay5zXyk7IH0KCiAgdGJ4X1N0 YWNrJiBvcGVyYXRvciA9KGNvbnN0IHRieF9TdGFjayYgc3RrKSB7IHNfID0gc3RrLnNfOyAKICAg ICAgICAgICAgICAgICAgICAgICAgIHBfID0gc18gKyAoKFQgY29uc3QgKilzdGsucF8gLSBzdGsu c18pOyByZXR1cm4gKnRoaXM7IH0KIAogIHZvaWQgcHVzaChjb25zdCBUJiB2YWwpIHsgaWYgKCh1 bnNpZ25lZCkocF8gLSBzXykgPCBodCkgKnBfKysgPSB2YWw7IH0KICBUIHBvcCgpIHsgaWYgKHBf ICE9IHNfKSAtLXBfOyByZXR1cm4gKnBfOyB9CgogIHVuc2lnbmVkIHVzZWQoKSB7IHJldHVybiBw XyAtIHNfOyB9CiAgdW5zaWduZWQgZnJlZSgpIHsgcmV0dXJuIGh0IC0gKHBfIC0gc18pOyB9Cn07 CgogCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCnRlbXBs YXRlIDxjbGFzcyBUPiAKY2xhc3MgdGJ4X1NjYW4gewoKIHB1YmxpYzoKICB2aXJ0dWFsIH50Ynhf U2NhbigpIHt9OwoKICBvcGVyYXRvciBpbnQoKSB7IHJldHVybiAhZW9zKCk7IH0KCiAgdmlydHVh bCBib29sIGVvcygpIGNvbnN0ID0gMDsKICB2aXJ0dWFsIFQmIG9wZXJhdG9yKysoaW50KSA9IDA7 CgogIHZpcnR1YWwgdGJ4X1NjYW48VD4qIGNsb25lKCkgY29uc3QgPSAwOwp9OwoKIAoKdGVtcGxh dGUgPGNsYXNzIFQsIHVuc2lnbmVkIG5sbms+IApjbGFzcyB0YnhfR2VuZXJpY1NjYW4gOiBwdWJs aWMgdGJ4X1NjYW48VD4gewogIHN0cnVjdCBTdGF0ZSB7IAogICAgdGJ4X0Nvbm5lY3RvcjxULCBu bG5rPiogY25yOyAKICAgIHVuc2lnbmVkICAgICAgICAgICAgbG5rOwogIH07CgogIHRieF9TdGFj azxTdGF0ZSwgMTAwID4gc3RhY2tfOwoKICBTdGF0ZSBzXzsKICBib29sICBlb3NfOwoKIHB1Ymxp YzoKICB0YnhfR2VuZXJpY1NjYW4odGJ4X0Nvbm5lY3RvcjxULCBubG5rPiYgY25yKSB7IGVvc18g PSBmYWxzZTsgc18uY25yID0gJmNucjsgCiAgICAgICAgICB1bnNpZ25lZCBpID0gMDsgZm9yICg7 IGNucltpXSA9PSBfX251bGwgICYmIGkgPCBubG5rOyArK2kpOyBzXy5sbmsgPSBpOyB9CgogIGJv b2wgZW9zKCkgY29uc3QgeyByZXR1cm4gZW9zXzsgfQoKICB0YnhfR2VuZXJpY1NjYW48VCwgbmxu az4qIGNsb25lKCkgY29uc3Q7CgogIFQmIG9wZXJhdG9yKysoaW50KTsKfTsKCnRlbXBsYXRlIDxj bGFzcyBULCB1bnNpZ25lZCBubG5rPiAKVCYgdGJ4X0dlbmVyaWNTY2FuPFQsIG5sbms+OjpvcGVy YXRvcisrKGludCkgewoKICBUJiB0bXAgPSBzXy5jbnItPnZhbHVlKCk7CgogIHdoaWxlICghZW9z XyAmJiBzXy5sbmsgPT0gbmxuaykKICAgIGlmICghKGVvc18gPSBzdGFja18udXNlZCgpID09IDAp KSB7CiAgICAgIHNfID0gc3RhY2tfLnBvcCgpOyArK3NfLmxuazsKICAgICAgd2hpbGUgKCgqc18u Y25yKVtzXy5sbmtdID09IF9fbnVsbCAgJiYgc18ubG5rIDwgbmxuaykgKytzXy5sbms7CiAgICB9 CiAgaWYgKCFlb3NfKSB7CiAgICBzdGFja18ucHVzaChzXyk7IAogICAgc18uY25yID0gKCpzXy5j bnIpW3NfLmxua107IHNfLmxuayA9IDA7CiAgICB3aGlsZSAoKCpzXy5jbnIpW3NfLmxua10gPT0g X19udWxsICAmJiBzXy5sbmsgPCBubG5rKSArK3NfLmxuazsKICB9CgogIHJldHVybiB0bXA7Cn0K CnRlbXBsYXRlIDxjbGFzcyBULCB1bnNpZ25lZCBubG5rPiAKdGJ4X0dlbmVyaWNTY2FuPFQsIG5s bms+KiB0YnhfR2VuZXJpY1NjYW48VCwgbmxuaz46OmNsb25lKCkgY29uc3QgewoKICByZXR1cm4g bmV3IHRieF9HZW5lcmljU2NhbjxULCBubG5rPigqdGhpcyk7Cn0KCiAKCnRlbXBsYXRlIDxjbGFz cyBULCB1bnNpZ25lZCBubG5rPiAKY2xhc3MgdGJ4X1BHZW5lcmljU2NhbiA6IHB1YmxpYyB0Ynhf U2NhbjxUPiB7CiAgc3RydWN0IFN0YXRlIHsgCiAgICB0YnhfQ29ubmVjdG9yPFQqLCBubG5rPiog Y25yOyAKICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICBsbms7CiAgfTsKCiAgdGJ4X1N0YWNr PFN0YXRlLCAxMDAgPiBzdGFja187CgogIFN0YXRlIHNfOwogIGJvb2wgIGVvc187CgogcHVibGlj OgogIHRieF9QR2VuZXJpY1NjYW4odGJ4X0Nvbm5lY3RvcjxUKiwgbmxuaz4mIGNucikgeyBlb3Nf ID0gZmFsc2U7IHNfLmNuciA9ICZjbnI7IAogICAgICAgICAgdW5zaWduZWQgaSA9IDA7IGZvciAo OyBjbnJbaV0gPT0gX19udWxsICAmJiBpIDwgbmxuazsgKytpKTsgc18ubG5rID0gaTsgfQoKICBi b29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIGVvc187IH0KCiAgdGJ4X1BHZW5lcmljU2NhbjxULCBu bG5rPiogY2xvbmUoKSBjb25zdDsKCiAgVCYgb3BlcmF0b3IrKyhpbnQpOwp9OwoKdGVtcGxhdGUg PGNsYXNzIFQsIHVuc2lnbmVkIG5sbms+IApUJiB0YnhfUEdlbmVyaWNTY2FuPFQsIG5sbms+Ojpv cGVyYXRvcisrKGludCkgewoKICBUKiB0bXAgPSBzXy5jbnItPnZhbHVlKCk7CgogIHdoaWxlICgh ZW9zXyAmJiBzXy5sbmsgPT0gbmxuaykKICAgIGlmICghKGVvc18gPSBzdGFja18udXNlZCgpID09 IDApKSB7CiAgICAgIHNfID0gc3RhY2tfLnBvcCgpOyArK3NfLmxuazsKICAgICAgd2hpbGUgKCgq c18uY25yKVtzXy5sbmtdID09IF9fbnVsbCAgJiYgc18ubG5rIDwgbmxuaykgKytzXy5sbms7CiAg ICB9CiAgaWYgKCFlb3NfKSB7CiAgICBzdGFja18ucHVzaChzXyk7IAogICAgc18uY25yID0gKCpz Xy5jbnIpW3NfLmxua107IHNfLmxuayA9IDA7CiAgICB3aGlsZSAoKCpzXy5jbnIpW3NfLmxua10g PT0gX19udWxsICAmJiBzXy5sbmsgPCBubG5rKSArK3NfLmxuazsKICB9CgogIHJldHVybiAqdG1w Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgbmxuaz4gCnRieF9QR2VuZXJpY1NjYW48 VCwgbmxuaz4qIHRieF9QR2VuZXJpY1NjYW48VCwgbmxuaz46OmNsb25lKCkgY29uc3QgewoKICBy ZXR1cm4gbmV3IHRieF9QR2VuZXJpY1NjYW48VCwgbmxuaz4oKnRoaXMpOwp9CgogCgp0ZW1wbGF0 ZSA8Y2xhc3MgVD4KY2xhc3MgdGJ4X0xpc3RTY2FuIDogcHVibGljIHRieF9TY2FuPFQ+IHsKICB0 YnhfQ29ubmVjdG9yPFQsIDE+KiBoZWFkXzsgCiAgdGJ4X0Nvbm5lY3RvcjxULCAxPiogY3VycmVu dF87CgogIGJvb2wgZW9zXzsKCiBwdWJsaWM6CiAgdGJ4X0xpc3RTY2FuKHRieF9Db25uZWN0b3I8 VCwgMT4mIGNucikgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVv c18gPSBmYWxzZTsgaGVhZF8gPSBjdXJyZW50XyA9ICZjbnI7IH0KCiAgYm9vbCBlb3MoKSBjb25z dCB7IHJldHVybiBlb3NfOyB9CgogIHRieF9MaXN0U2NhbjxUPiogY2xvbmUoKSBjb25zdDsKCiAg VCYgb3BlcmF0b3IrKyhpbnQpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+IApUJiB0YnhfTGlzdFNj YW48VD46Om9wZXJhdG9yKysoaW50KSB7CgogIFQmIHRtcCA9IGN1cnJlbnRfLT52YWx1ZSgpOwoK ICBpZiAoIWVvc18pIHsKICAgIGN1cnJlbnRfID0gKCpjdXJyZW50XylbMF07CiAgICBpZiAoKGVv c18gPSBjdXJyZW50XyA9PSBfX251bGwgKSkgY3VycmVudF8gPSBoZWFkXzsKICB9CgogIHJldHVy biB0bXA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPiAKdGJ4X0xpc3RTY2FuPFQ+KiB0YnhfTGlzdFNj YW48VD46OmNsb25lKCkgY29uc3QgewoKICByZXR1cm4gbmV3IHRieF9MaXN0U2NhbjxUPigqdGhp cyk7Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyB0YnhfUExpc3RTY2FuIDogcHVibGlj IHRieF9TY2FuPFQ+IHsKICB0YnhfQ29ubmVjdG9yPFQqLCAxPiogaGVhZF87IAogIHRieF9Db25u ZWN0b3I8VCosIDE+KiBjdXJyZW50XzsKCiAgYm9vbCBlb3NfOwoKIHB1YmxpYzoKICB0YnhfUExp c3RTY2FuKHRieF9Db25uZWN0b3I8VCosIDE+JiBjbnIpIHsgCiAgICBlb3NfID0gZmFsc2U7IGhl YWRfID0gY3VycmVudF8gPSAmY25yOwogIH0KCiAgYm9vbCBlb3MoKSBjb25zdCB7IHJldHVybiBl b3NfOyB9CgogIHRieF9QTGlzdFNjYW48VD4qIGNsb25lKCkgY29uc3Q7CgogIFQmIG9wZXJhdG9y KysoaW50KTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPiAKVCYgdGJ4X1BMaXN0U2NhbjxUPjo6b3Bl cmF0b3IrKyhpbnQpIHsKCiAgVCogdG1wID0gY3VycmVudF8tPnZhbHVlKCk7CgogIGlmICghZW9z XykgewogICAgY3VycmVudF8gPSAoKmN1cnJlbnRfKVswXTsKICAgIGlmICgoZW9zXyA9IGN1cnJl bnRfID09IF9fbnVsbCApKSBjdXJyZW50XyA9IGhlYWRfOwogIH0KCiAgcmV0dXJuICp0bXA7Cn0K CnRlbXBsYXRlIDxjbGFzcyBUPiAKdGJ4X1BMaXN0U2NhbjxUPiogdGJ4X1BMaXN0U2NhbjxUPjo6 Y2xvbmUoKSBjb25zdCB7CgogIHJldHVybiBuZXcgdGJ4X1BMaXN0U2NhbjxUPigqdGhpcyk7Cn0K CgojIDE3ICIuLi9mdW5jdGlvbi8uLi9zcGFjZS9zcGNFbGVtZW50LmgiIDIKCiAKCnR5cGVkZWYg dWludCBzcGNfQkZuY0luZGV4OwoKIAoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3Mgc3BjX0Vs ZW1lbnRNYXRyaXggewoKcHVibGljOgogICAKICBpbmxpbmUgc3BjX0VsZW1lbnRNYXRyaXgodWlu dCBuID0gMCwgdWludCBtID0gMCk7CiAgaW5saW5lIH5zcGNfRWxlbWVudE1hdHJpeCgpOwoKICAg CiAgc3BjX0VsZW1lbnRNYXRyaXg8Rj4mIG9wZXJhdG9yPShjb25zdCBzcGNfRWxlbWVudE1hdHJp eDxGPiYgQSk7CgogICAKICBpbmxpbmUgRiBvcGVyYXRvcigpKHVpbnQgaSwgdWludCBqKSBjb25z dDsKICBpbmxpbmUgRiYgb3BlcmF0b3IoKSh1aW50IGksIHVpbnQgaik7CgogIG9zdHJlYW0mIGlu Zm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAgCiAgaW5saW5lIHVpbnQgbigpIGNvbnN0OwoKICAg CiAgaW5saW5lIHVpbnQgbSgpIGNvbnN0OwoKICAgCgoKCgogIGlubGluZSB2b2lkIHJlc2l6ZSh1 aW50IG4sIHVpbnQgbSk7CgogICAKCgoKICBpbmxpbmUgYm9vbCB0cmFuc3Bvc2UoKTsKCiAgIAog IGlubGluZSB2b2lkIHplcm9zKCk7Cgpwcml2YXRlOgogICAKICBzaXplX3Qgc3pfOwoKICAgCiAg dWludCAgIG5fOwoKICAgCiAgdWludCAgIG1fOwoKICAgCiAgYm9vbCAgIHRfOwoKICAgCiAgRiog ICAgIG1hdHJpeF87CgogICAKICBzcGNfRWxlbWVudE1hdHJpeChjb25zdCBzcGNfRWxlbWVudE1h dHJpeCYpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHNwY19FbGVtZW50TWF0cml4PEY+ OjpzcGNfRWxlbWVudE1hdHJpeCh1aW50IG4sIHVpbnQgbSkgewogIG5fID0gbjsgbV8gPSBtOyBz el8gPSBuICogbTsKICBtYXRyaXhfID0gKHN6XykgPyBuZXcgRltzel9dIDogX19udWxsIDsKICB0 XyA9IGZhbHNlOwp9CiAgICAKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHNwY19FbGVtZW50TWF0 cml4PEY+Ojp+c3BjX0VsZW1lbnRNYXRyaXgoKSB7CiAgZGVsZXRlW10gbWF0cml4XzsKfQoKdGVt cGxhdGU8Y2xhc3MgRj4KaW5saW5lIEYgc3BjX0VsZW1lbnRNYXRyaXg8Rj46Om9wZXJhdG9yKCko dWludCBpLCB1aW50IGopIGNvbnN0IHsKICByZXR1cm4gdF8gPyBtYXRyaXhfW2ogKiBtXyArIGld IDogbWF0cml4X1tpICogbV8gKyBqXTsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIEYmIHNw Y19FbGVtZW50TWF0cml4PEY+OjpvcGVyYXRvcigpKHVpbnQgaSwgdWludCBqKSB7CiAgcmV0dXJu IHRfID8gbWF0cml4X1tqICogbV8gKyBpXSA6IG1hdHJpeF9baSAqIG1fICsgal07Cn0KCnRlbXBs YXRlPGNsYXNzIEY+CmlubGluZSB1aW50IHNwY19FbGVtZW50TWF0cml4PEY+OjpuKCkgY29uc3Qg ewogIHJldHVybiB0XyA/IG1fIDogbl87Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSB1aW50 IHNwY19FbGVtZW50TWF0cml4PEY+OjptKCkgY29uc3QgewogIHJldHVybiB0XyA/IG5fIDogbV87 Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSB2b2lkIHNwY19FbGVtZW50TWF0cml4PEY+Ojpy ZXNpemUodWludCBuLCB1aW50IG0pIHsKICBzaXplX3Qgc3ogPSBuICogbTsKICBpZiAoc3pfIDwg c3opIHsgZGVsZXRlW10gbWF0cml4XzsgbWF0cml4XyA9IG5ldyBGW3N6XyA9IHN6XTsgfQogIG5f ID0gbjsgbV8gPSBtOyB0XyA9IGZhbHNlOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgYm9v bCBzcGNfRWxlbWVudE1hdHJpeDxGPjo6dHJhbnNwb3NlKCkgewogIHJldHVybiB0XyBePSAxOyAK fQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHZvaWQgc3BjX0VsZW1lbnRNYXRyaXg8Rj46Onpl cm9zKCkgewogIEYqIG0gPSBtYXRyaXhfOwogIGZvcih1aW50IGkgPSBuXyAqIG1fOyBpOyAtLWkp ICptKysgPSAwLjA7Cn0KCiAKCiMgMTgxICIuLi9mdW5jdGlvbi8uLi9zcGFjZS9zcGNFbGVtZW50 LmgiCgoKdGVtcGxhdGU8Y2xhc3MgRj4gCmNsYXNzIHNwY19UOwoKdGVtcGxhdGU8Y2xhc3MgRj4K aW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IHNwY19UPEY+JiBU KSB7CiAgcmV0dXJuIFQuaW5mbyhvcyk7Cn0KCiAKCgoKCgoKdGVtcGxhdGU8Y2xhc3MgRj4gCmNs YXNzIHNwY19UIHsKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PCA8PiAob3N0cmVhbSYgb3Ms IGNvbnN0IHNwY19UPEY+JiBUKTsKCnB1YmxpYzoKICAgCgoKCiAgaW5saW5lIHNwY19UKHVpbnQg bik7CiAgdmlydHVhbCB+c3BjX1QoKSB7fQoKICAgCgoKCgoKCgogIHZpcnR1YWwgdm9pZCBvcGVy YXRvcigpKGNvbnN0IHNwY19FbGVtZW50TWF0cml4PEY+JiBBLCAKCQkJICBzcGNfRWxlbWVudE1h dHJpeDxGPiYgQikgY29uc3QgPSAwOyAKCiAgdmlydHVhbCBzcGNfQkZuY0luZGV4IGluZGV4KHVp bnQgaSkgY29uc3QgPSAwOwoKICAgCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9z KSBjb25zdCA9IDA7CgogICAKICBpbmxpbmUgdWludCBtKCkgY29uc3Q7CgogICAKICBpbmxpbmUg dWludCBuKCkgY29uc3Q7CgogcHJvdGVjdGVkOgogICAKICB1aW50IG5fOwoKICAgCiAgdWludCBt XzsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+IAppbmxpbmUgc3BjX1Q8Rj46OnNwY19UKHVpbnQgbikg ewogIG5fID0gbjsgbV8gPSAwOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPiAKaW5saW5lIHVpbnQgc3Bj X1Q8Rj46Om4oKSBjb25zdCB7CiAgcmV0dXJuIG5fOwp9CiAgCnRlbXBsYXRlPGNsYXNzIEY+IApp bmxpbmUgdWludCBzcGNfVDxGPjo6bSgpIGNvbnN0IHsKICByZXR1cm4gbV87Cn0KCgoKIAoKIAoK dGVtcGxhdGU8Y2xhc3MgRj4gCmNsYXNzIHNwY19USW5kZXggOiBwdWJsaWMgc3BjX1Q8Rj4gewoK cHVibGljOgogICAKCgoKCgogIGlubGluZSBzcGNfVEluZGV4KHVpbnQgbiwgdWludCBtLCBzcGNf QkZuY0luZGV4IGlkeFtdKTsKICBpbmxpbmUgfnNwY19USW5kZXgoKTsKCiAgIAoKCgoKCgoKCgog IGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnRNYXRyaXg8Rj4mIEEsIAoJ CQkgc3BjX0VsZW1lbnRNYXRyaXg8Rj4mIEIpIGNvbnN0OyAKCiAgIAoKCiAgaW5saW5lIHNwY19C Rm5jSW5kZXggaW5kZXgodWludCBpKSBjb25zdDsKICBpbmxpbmUgb3N0cmVhbSYgaW5mbyhvc3Ry ZWFtJiBvcykgY29uc3Q7Cgpwcml2YXRlOgogIHNwY19CRm5jSW5kZXgqIGlkeF87Cn07Cgp0ZW1w bGF0ZTxjbGFzcyBGPiAKaW5saW5lIHNwY19USW5kZXg8Rj46OnNwY19USW5kZXgodWludCBuLCB1 aW50IG0sIHNwY19CRm5jSW5kZXggaWR4W10pIAogIDogc3BjX1Q8Rj4obikgewogIG1fID0gbTsg aWR4XyA9IG5ldyBzcGNfQkZuY0luZGV4W21dOwogIG1lbWNweShpZHhfLCBpZHgsIG0gKiBzaXpl b2Yoc3BjX0JGbmNJbmRleCkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPiAKaW5saW5lIHNwY19USW5k ZXg8Rj46On5zcGNfVEluZGV4KCkgewogIGRlbGV0ZVtdIGlkeF87Cn0KCnRlbXBsYXRlPGNsYXNz IEY+IAppbmxpbmUgdm9pZCBzcGNfVEluZGV4PEY+OjpvcGVyYXRvcigpKGNvbnN0IHNwY19FbGVt ZW50TWF0cml4PEY+JiBBLCAKCQkJCSAgICAgIHNwY19FbGVtZW50TWF0cml4PEY+JiBCKSBjb25z dCB7CiAgQiA9IEE7Cn0KICAKdGVtcGxhdGU8Y2xhc3MgRj4gCmlubGluZSBzcGNfQkZuY0luZGV4 IHNwY19USW5kZXg8Rj46OmluZGV4KHVpbnQgaSkgY29uc3QgewogIHJldHVybiBpZHhfW2ldOwp9 Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgb3N0cmVhbSYgc3BjX1RJbmRleDxGPjo6aW5mbyhv c3RyZWFtJiBvcykgY29uc3QgewoKICBvcyA8PCAiVEluZGV4KCIgPDwgbl8gPDwgIiwgIiA8PCBt XyA8PCAiLCBbICI7CiAgZm9yICh1aW50IGkgPSAwOyBpIDwgbV87IGkrKykgb3MgPDwgaWR4X1tp XSA8PCAnICc7CiAgcmV0dXJuIG9zIDw8ICJdKSI7Cn0KICAKIAoKdGVtcGxhdGU8Y2xhc3MgRj4K Y2xhc3Mgc3BjX1RDb2x1bW47Cgp0ZW1wbGF0ZSA8Y2xhc3MgRj4Kb3N0cmVhbSYgb3BlcmF0b3I8 PChvc3RyZWFtJiBvcywgY29uc3Qgc3BjX1RDb2x1bW48Rj4mIFQpIHsKCiAgcmV0dXJuIFQuaW5m byhvcyk7Cn0KCiAKCgoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIHNwY19UQ29sdW1uIHsKCiAg ZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwgPEY+KG9zdHJlYW0mIG9zLCBjb25zdCBzcGNfVENv bHVtbjxGPiYgVCk7CgpwdWJsaWM6CiAgIAoKCgoKCiAgaW5saW5lIHNwY19UQ29sdW1uKHVpbnQg biwgc3BjX0JGbmNJbmRleCBpZHgsIHNwY19UQ29sdW1uPEY+KiBsbmsgPSBfX251bGwgKTsKICBp bmxpbmUgfnNwY19UQ29sdW1uKCk7CgogICAKICBpbmxpbmUgY29uc3QgRiYgb3BlcmF0b3JbXSh1 aW50IGkpIGNvbnN0OwogIGlubGluZSBGJiBvcGVyYXRvcltdKHVpbnQgaSk7CgogICAKICBpbmxp bmUgc3BjX0JGbmNJbmRleCBpbmRleCgpIGNvbnN0OwoKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0m IG9zKSBjb25zdDsKCiAgIAogIGlubGluZSBzcGNfVENvbHVtbjxGPiogbGluaygpIGNvbnN0OwoK ICAgCiAgaW5saW5lIHVpbnQgbigpIGNvbnN0OwoKcHJpdmF0ZTogCiAgIAogIHNwY19UQ29sdW1u PEY+KiBsbmtfOwoKICAgCiAgdWludCAgICAgICAgICAgIG5fOwoKICAgCiAgc3BjX0JGbmNJbmRl eCAgIGlkeF87CgogICAKICBGKiAgICAgICAgICAgICAgdmFsXzsKfTsKCnRlbXBsYXRlPGNsYXNz IEY+CmlubGluZSBzcGNfVENvbHVtbjxGPjo6c3BjX1RDb2x1bW4odWludCBuLCBzcGNfQkZuY0lu ZGV4IGlkeCwgCgkJCQkgICBzcGNfVENvbHVtbjxGPiogbG5rKSB7CiAgbl8gPSBuOyBsbmtfID0g bG5rOyBpZHhfID0gaWR4OyB2YWxfID0gbmV3IEZbbl07IAogIG1lbXNldCh2YWxfLCAwLCBuICog c2l6ZW9mKEYpKTsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHNwY19UQ29sdW1uPEY+Ojp+ c3BjX1RDb2x1bW4oKSB7CiAgZGVsZXRlW10gdmFsXzsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5s aW5lIGNvbnN0IEYmIHNwY19UQ29sdW1uPEY+OjpvcGVyYXRvcltdKHVpbnQgaSkgY29uc3Qgewog IHJldHVybiB2YWxfW2ldOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgRiYgc3BjX1RDb2x1 bW48Rj46Om9wZXJhdG9yW10odWludCBpKSB7CiAgcmV0dXJuIHZhbF9baV07Cn0KCnRlbXBsYXRl PGNsYXNzIEY+CmlubGluZSBzcGNfQkZuY0luZGV4IHNwY19UQ29sdW1uPEY+OjppbmRleCgpIGNv bnN0IHsKICByZXR1cm4gaWR4XzsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHNwY19UQ29s dW1uPEY+KiBzcGNfVENvbHVtbjxGPjo6bGluaygpIGNvbnN0IHsKICByZXR1cm4gbG5rXzsKfQoK dGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHVpbnQgc3BjX1RDb2x1bW48Rj46Om4oKSBjb25zdCB7 CiAgcmV0dXJuIG5fOwp9CgogCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKdGVtcGxhdGU8Y2xhc3Mg Rj4KY2xhc3Mgc3BjX1RNYXRyaXggOiBwdWJsaWMgc3BjX1Q8Rj4geyAKCnB1YmxpYzoKICAgCiAg c3RydWN0IENvbnRyb2wgewogICAgIAogICAgdWludCBpZHg7CiAgICAgCiAgICB1aW50IHN6Owog IH07CgogICAKICBzdHJ1Y3QgRGF0YSB7CiAgICAgCiAgICB1aW50IGlkeDsKICAgICAKICAgIEYg ICAgZGF0YTsKICB9OwoKICAgCgoKCgogIHNwY19UTWF0cml4KHNwY19UQ29sdW1uPEY+KiBUKTsK ICBpbmxpbmUgfnNwY19UTWF0cml4KCk7CgogICAKCgoKCgoKCgoKCgoKCgogIHZvaWQgb3BlcmF0 b3IoKShjb25zdCBzcGNfRWxlbWVudE1hdHJpeDxGPiYgQSwgCgkJICBzcGNfRWxlbWVudE1hdHJp eDxGPiYgQikgY29uc3Q7IAoKICAgCiAgIAoKICAgCiAgaW5saW5lIHNwY19CRm5jSW5kZXggaW5k ZXgodWludCBpKSBjb25zdDsKCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7Cgog ICAKCgoKCgoKICB2b2lkIGFwcGVuZChzcGNfVENvbHVtbjxGPiogVCk7CgogICAKICBpbmxpbmUg c3BjX1RNYXRyaXg6OkNvbnRyb2wgKmNvbnRyb2wodWludCBpKSBjb25zdCB7IHJldHVybiAmY3Ry bF9baV07IH07CgogICAKICBpbmxpbmUgc3BjX1RNYXRyaXg6OkRhdGEgKmRhdGEodWludCBpKSBj b25zdCB7IHJldHVybiAmZGF0YV9baV07IH07Cgpwcml2YXRlOgogICAKICBDb250cm9sICpjdHJs XzsKCiAgIAogIERhdGEgICAgKmRhdGFfOwoKICAgCiAgdWludCAgICBzel87Cn07Cgp0ZW1wbGF0 ZTxjbGFzcyBGPiAKaW5saW5lIHNwY19UTWF0cml4PEY+Ojp+c3BjX1RNYXRyaXgoKSB7CiAgZGVs ZXRlW10gZGF0YV87CiAgZGVsZXRlW10gY3RybF87Cn0KICAKdGVtcGxhdGU8Y2xhc3MgRj4gCmlu bGluZSBzcGNfQkZuY0luZGV4IHNwY19UTWF0cml4PEY+OjppbmRleCh1aW50IGkpIGNvbnN0IHsK ICByZXR1cm4gY3RybF9baV0uaWR4Owp9CgogCgojIDU3NSAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uv c3BjRWxlbWVudC5oIgoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIHNwY19FbGVtZW50OwoKdGVt cGxhdGU8Y2xhc3MgRj4KaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNv bnN0IHNwY19FbGVtZW50PEY+JiBlbG0pIHsgCiAgcmV0dXJuIGVsbS5pbmZvKG9zKTsgCn0KCiAK CnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIHNwY19FbGVtZW50IHsKICBmcmllbmQgb3N0cmVhbSYg b3BlcmF0b3I8PCA8PiAob3N0cmVhbSYgb3MsIGNvbnN0IHNwY19FbGVtZW50PEY+JiBlbG0pOwoK cHVibGljOgogIGlubGluZSBzcGNfRWxlbWVudCgpOwogIHZpcnR1YWwgfnNwY19FbGVtZW50KCkg e30KCiAgIAogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3QgPSAwOwog IHZpcnR1YWwgY29uc3Qgc3BjX1Q8Rj4mIFQoKSBjb25zdCA9IDA7CgogICAKICB1aW50JiB0YWco KTsKCnByaXZhdGU6CiAgIAogIHVpbnQgdGFnXzsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+CmlubGlu ZSBzcGNfRWxlbWVudDxGPjo6c3BjX0VsZW1lbnQoKSB7CiAgdGFnXyA9IDA7Cn0KCnRlbXBsYXRl PGNsYXNzIEY+CmlubGluZSB1aW50JiBzcGNfRWxlbWVudDxGPjo6dGFnKCkgewogIHJldHVybiB0 YWdfOwp9CgoKCiAKCnR5cGVkZWYgdm9pZCAoKnNwY19TTWF0cml4KShjb25zdCBzcGNfVENvbHVt bjxyZWFsPiYsIHNwY19UQ29sdW1uPHJlYWw+JiwgdWludCk7CgogCgoKCmNsYXNzIHNwY19EaXJh YzNkMDAwIDogcHVibGljIHNwY19FbGVtZW50PHJlYWw+IHsKCnB1YmxpYzoKICBzcGNfRGlyYWMz ZDAwMChjb25zdCBnZW9fVHJpYW5nbGUzZCYgY2VsbCwgc3BjX0JGbmNJbmRleCBpZHhbXSwgCgkJ IHVpbnQgdnR4W10sIHVpbnQgbik7CiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7 CiAgaW5saW5lIGNvbnN0IHNwY19UPHJlYWw+JiBUKCkgY29uc3Q7CgogIGlubGluZSBjb25zdCBn ZW9fVmVydGV4JiBzdXBwb3J0KHVpbnQgaSkgY29uc3Q7CiAgaW5saW5lIGNvbnN0IFJlYWwzZCYg dmVydGV4KHVpbnQgaSkgY29uc3Q7Cgpwcml2YXRlOgogIGNvbnN0IGdlb19UcmlhbmdsZTNkJiBj ZWxsXzsKICB1Y2hhciAgICAgICAgICAgICAgICAgY3RybF87ICAKICBzcGNfVEluZGV4PHJlYWw+ ICAgICAgVF87CiAgUmVhbDNkICAgICAgICAgICAgICAgIHZfWzNdOwp9OwoKaW5saW5lIGNvbnN0 IHNwY19UPHJlYWw+JiBzcGNfRGlyYWMzZDAwMDo6VCgpIGNvbnN0IHsgCiAgcmV0dXJuIFRfOyAK fQoKaW5saW5lIGNvbnN0IGdlb19WZXJ0ZXgmIHNwY19EaXJhYzNkMDAwOjpzdXBwb3J0KHVpbnQg aSkgY29uc3QgewoKICB1aW50IGogPSBjdHJsXyA+PiAoaSA8PCAxKTsKICByZXR1cm4gKmNlbGxf LmNvbm5lY3RvcigpLnZlcnRleChqICYgMyk7Cn0KCmlubGluZSBjb25zdCBSZWFsM2QmIHNwY19E aXJhYzNkMDAwOjp2ZXJ0ZXgodWludCBpKSBjb25zdCB7CiAgcmV0dXJuIHZfW2ldOwp9CgojIDY5 NyAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uvc3BjRWxlbWVudC5oIgoKCiAKCiAKCgoKY2xhc3Mgc3Bj X0xpbmVhcjJkMDAwIDogcHVibGljIHNwY19FbGVtZW50PHJlYWw+IHsKCnB1YmxpYzoKICAgCgoK CgoKCgogIGlubGluZSBzcGNfTGluZWFyMmQwMDAoY29uc3QgZ2VvX1RyaWFuZ2xlMmQmIGNlbGws IHNwY19CRm5jSW5kZXggaWR4W10pOwoKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25z dDsKICBpbmxpbmUgY29uc3Qgc3BjX1Q8cmVhbD4mIFQoKSBjb25zdDsKCiAgIAogIGlubGluZSBj b25zdCBnZW9fVHJpYW5nbGUmIHN1cHBvcnQoKSBjb25zdDsKCiAgIAogIFJlYWwyZCB2ZXJ0ZXgo dWludCBpKSBjb25zdDsKCnByaXZhdGU6CiAgIAogIGNvbnN0IGdlb19UcmlhbmdsZTJkJiBjZWxs XzsKCiAgIAogIHNwY19USW5kZXg8cmVhbD4gVF87Cn07CgppbmxpbmUgc3BjX0xpbmVhcjJkMDAw OjpzcGNfTGluZWFyMmQwMDAoY29uc3QgZ2VvX1RyaWFuZ2xlMmQmIGNlbGwsIAoJCQkJCXNwY19C Rm5jSW5kZXggaWR4W10pIDogCiAgY2VsbF8oY2VsbCksIFRfKDMsIDMsIGlkeCkgeyAKfQoKaW5s aW5lIGNvbnN0IHNwY19UPHJlYWw+JiBzcGNfTGluZWFyMmQwMDA6OlQoKSBjb25zdCB7IAogIHJl dHVybiBUXzsgCn0KCmlubGluZSBjb25zdCBnZW9fVHJpYW5nbGUmIHNwY19MaW5lYXIyZDAwMDo6 c3VwcG9ydCgpIGNvbnN0IHsKICByZXR1cm4gY2VsbF8uY29ubmVjdG9yKCk7Cn0KCiAKCgoKY2xh c3Mgc3BjX0xpbmVhcjNkMDAwIDogcHVibGljIHNwY19FbGVtZW50PHJlYWw+IHsKCnB1YmxpYzoK ICBzcGNfTGluZWFyM2QwMDAoY29uc3QgZ2VvX1RyaWFuZ2xlM2QmIGNlbGwsIHNwY19CRm5jSW5k ZXggaWR4W10pOwoKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKICBpbmxpbmUg Y29uc3Qgc3BjX1Q8cmVhbD4mIFQoKSBjb25zdDsKCiAgaW5saW5lIGNvbnN0IFVuaXQzZCYgbigp IGNvbnN0OwogIGlubGluZSBjb25zdCBnZW9fVHJpYW5nbGUmIHN1cHBvcnQoKSBjb25zdDsKICBp bmxpbmUgY29uc3QgUmVhbDNkJiB2ZXJ0ZXgodWludCBpKSBjb25zdDsKCnByaXZhdGU6CiAgY29u c3QgZ2VvX1RyaWFuZ2xlM2QmIGNlbGxfOwogIHNwY19USW5kZXg8cmVhbD4gVF87CgogIFJlYWwz ZCB2X1szXTsKICBVbml0M2Qgbl87Cn07CgppbmxpbmUgY29uc3Qgc3BjX1Q8cmVhbD4mIHNwY19M aW5lYXIzZDAwMDo6VCgpIGNvbnN0IHsgCiAgcmV0dXJuIFRfOyAKfQoKaW5saW5lIGNvbnN0IFVu aXQzZCYgc3BjX0xpbmVhcjNkMDAwOjpuKCkgY29uc3QgeyAKICByZXR1cm4gbl87IAp9Cgppbmxp bmUgY29uc3QgZ2VvX1RyaWFuZ2xlJiBzcGNfTGluZWFyM2QwMDA6OnN1cHBvcnQoKSBjb25zdCB7 CiAgcmV0dXJuIGNlbGxfLmNvbm5lY3RvcigpOwp9CgppbmxpbmUgY29uc3QgUmVhbDNkJiBzcGNf TGluZWFyM2QwMDA6OnZlcnRleCh1aW50IGkpIGNvbnN0IHsKICByZXR1cm4gdl9baV07Cn0KCiMg ODIxICIuLi9mdW5jdGlvbi8uLi9zcGFjZS9zcGNFbGVtZW50LmgiCgoKIAoKIAoKCgpjbGFzcyBz cGNfTGluZWFyM2QwMDEgOiBwdWJsaWMgc3BjX0VsZW1lbnQ8cmVhbD4gewoKcHVibGljOgogICAK CgoKCiAgc3BjX0xpbmVhcjNkMDAxKGNvbnN0IGdlb19UZXRyYWhlZHJvbjNkJiBjZWxsLCBzcGNf QkZuY0luZGV4IGlkeFtdKTsKCiAgIAogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0 OwoKICAgCiAgaW5saW5lIGNvbnN0IHNwY19UPHJlYWw+JiBUKCkgY29uc3QgeyByZXR1cm4gVF87 IH0KCiAgIAogIGlubGluZSBjb25zdCBnZW9fVGV0cmFoZWRyb24mIHN1cHBvcnQoKSBjb25zdCB7 IHJldHVybiBjZWxsXy5jb25uZWN0b3IoKTsgfQoKICAgCiAgaW5saW5lIGNvbnN0IGdlb19DZWxs MyYgY2VsbCgpIGNvbnN0IHsgcmV0dXJuIGNlbGxfOyB9CgogICAKICBpbmxpbmUgY29uc3QgUmVh bDNkIHZlcnRleCh1aW50IGkpIGNvbnN0IHsgcmV0dXJuIGNlbGxfLnZlcnRleChpKTsgfQoKcHJp dmF0ZToKICAgCiAgY29uc3QgZ2VvX1RldHJhaGVkcm9uM2QmIGNlbGxfOwoKICAgCiAgc3BjX1RJ bmRleDxyZWFsPiBUXzsKfTsKCiAKCgoKY2xhc3Mgc3BjX0NvbnN0YW50M2QwMDAgOiBwdWJsaWMg c3BjX0VsZW1lbnQ8cmVhbD4gewoKICBjb25zdCBnZW9fVHJpYW5nbGUzZCYgY2VsbF87CiAgc3Bj X1RJbmRleDxyZWFsPiBUXzsKCiAgVW5pdDNkIG5fOwogIFJlYWwzZCB2X1szXTsKCnB1YmxpYzoK ICBzcGNfQ29uc3RhbnQzZDAwMChjb25zdCBnZW9fVHJpYW5nbGUzZCYgY2VsbCwgc3BjX0JGbmNJ bmRleCBpZHgpOwoKICBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKICBpbmxpbmUg Y29uc3Qgc3BjX1Q8cmVhbD4mIFQoKSBjb25zdDsKCiAgaW5saW5lIGNvbnN0IFVuaXQzZCYgbigp IGNvbnN0OwogIGlubGluZSBjb25zdCBnZW9fVHJpYW5nbGUmIHN1cHBvcnQoKSBjb25zdDsKICBp bmxpbmUgY29uc3QgUmVhbDNkJiB2ZXJ0ZXgodWludCBpKSBjb25zdDsKfTsKCmlubGluZSBjb25z dCBzcGNfVDxyZWFsPiYgc3BjX0NvbnN0YW50M2QwMDA6OlQoKSBjb25zdCB7IAogIHJldHVybiBU XzsgCn0KCmlubGluZSBjb25zdCBVbml0M2QmIHNwY19Db25zdGFudDNkMDAwOjpuKCkgY29uc3Qg eyAKICByZXR1cm4gbl87IAp9CgppbmxpbmUgY29uc3QgZ2VvX1RyaWFuZ2xlJiBzcGNfQ29uc3Rh bnQzZDAwMDo6c3VwcG9ydCgpIGNvbnN0IHsKICByZXR1cm4gY2VsbF8uY29ubmVjdG9yKCk7Cn0K CmlubGluZSBjb25zdCBSZWFsM2QmIHNwY19Db25zdGFudDNkMDAwOjp2ZXJ0ZXgodWludCBpKSBj b25zdCB7CiAgcmV0dXJuIHZfW2ldOwp9CgojIDkzMyAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uvc3Bj RWxlbWVudC5oIgoKCiAKCiMgMSAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uvc3BjRWxlbWVudC50IiAx CiAKCgoKCgoKICAjcHJhZ21hIGltcGxlbWVudGF0aW9uCgoKCgogCgp0ZW1wbGF0ZTxjbGFzcyBG PgpzcGNfRWxlbWVudE1hdHJpeDxGPiYgc3BjX0VsZW1lbnRNYXRyaXg8Rj46Om9wZXJhdG9yPSgK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3Bj X0VsZW1lbnRNYXRyaXg8Rj4mIEEpIHsKICB1aW50IHN6ID0gQS5uXyAqIEEubV87CgogIGlmIChz el8gPCBzeikgewogICAgZGVsZXRlW10gbWF0cml4XzsgbWF0cml4XyA9IG5ldyBGW3N6XyA9IHN6 XTsKICB9CgogIG1lbWNweShtYXRyaXhfLCBBLm1hdHJpeF8sIHN6ICogc2l6ZW9mKEYpKTsKICBu XyA9IEEubl87IG1fID0gQS5tXzsgdF8gPSBBLnRfOwoKICByZXR1cm4gKnRoaXM7Cn0KICAgIAp0 ZW1wbGF0ZTxjbGFzcyBGPgpvc3RyZWFtJiBzcGNfRWxlbWVudE1hdHJpeDxGPjo6aW5mbyhvc3Ry ZWFtJiBvcykgY29uc3QgewoKICBvcyA8PCAiRWxlbWVudE1hdHJpeChuID0gIiA8PCBuXyA8PCAi LCBtID0gIiA8PCBtXyA8PCAiLCBtYXRyaXggPSBbIjsKICBpZiAobl8gKiBtXyA+IDApIHsKICAg IGZvciAodWludCBpID0gMDsgaSA8IG5fOyArK2kpIHsKICAgICAgb3MgPDwgIlxuWyI7CiAgICAg IGZvciAodWludCBqID0gMDsgaiA8IG1fIC0gMTsgKytqKSAKCW9zIDw8IG9wZXJhdG9yKCkoaSwg aikgPDwgIiAiOwogICAgICBvcyA8PCBvcGVyYXRvcigpKGksIG1fIC0gMSkgPDwgJ10nOwogICAg fQogICAgb3MgPDwgJ1xuJzsKICB9CiAgcmV0dXJuIG9zIDw8ICJdKSI7Cn0KICAgIAogCgp0ZW1w bGF0ZTxjbGFzcyBGPgpvc3RyZWFtJiBzcGNfVENvbHVtbjxGPjo6aW5mbyhvc3RyZWFtJiBvcykg Y29uc3QgewoKICBvcyA8PCAiVENvbHVtbihuID0gIiA8PCBuXyA8PCAiLCBpZHggPSAiIDw8IGlk eF8gPDwgIiwgdmFsID0gWyI7CgogIGlmIChuXyA+IDApIHsKICAgIGZvciAodWludCBpID0gMDsg aSA8IG5fIC0gMTsgKytpKSBvcyA8PCB2YWxfW2ldIDw8ICIsICI7CiAgICBvcyA8PCB2YWxfW25f IC0gMV07CiAgfQoKICByZXR1cm4gb3MgPDwgIl0pIjsKfQoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4K c3BjX1RNYXRyaXg8Rj46OnNwY19UTWF0cml4KHNwY19UQ29sdW1uPEY+KiBUKSA6IHNwY19UPEY+ KDApIHsKCiAgbV8gPSAwOyBjdHJsXyA9IF9fbnVsbCA7IGRhdGFfID0gX19udWxsIDsgc3pfID0g MDsKICBhcHBlbmQoVCk7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CnZvaWQgc3BjX1RNYXRyaXg8Rj46 Om9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnRNYXRyaXg8Rj4mIEEsIAoJCQkgICAgICAgICAg ICAgICAgICAgICAgICBzcGNfRWxlbWVudE1hdHJpeDxGPiYgQikgY29uc3QgeyAKICB1aW50IG4g PSBBLm4oKTsKCiAgQi5yZXNpemUobiwgbV8pOwogIAogIERhdGEqIGRiID0gZGF0YV87CiAgZm9y KHVpbnQgaiA9IDA7IGogPCBtXzsgKytqKSB7CiAgICBEYXRhKiBkZSA9IGRiICsgY3RybF9bal0u c3o7CgogICAgZm9yKHVpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgRiBzID0gMC4wOwog ICAgICBmb3IoRGF0YSogZCA9IGRiOyBkIDwgZGU7ICsrZCkgcyArPSBBKGksIGQtPmlkeCkgKiBk LT5kYXRhOwogICAgICBCKGksIGopID0gczsKICAgIH0KCiAgICBkYiA9IGRlOwogIH0KfQoKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlPGNsYXNzIEY+Cm9zdHJlYW0mIHNwY19UTWF0 cml4PEY+OjppbmZvKG9zdHJlYW0mIG9zKSBjb25zdCB7CgogIG9zIDw8ICJUTWF0cml4KCIgPDwg bl8gPDwgIiwgIiA8PCBtXyA8PCAiLCBjdHJsID0gWyI7CiAgaWYgKG1fID4gMCkgewogICAgQ29u dHJvbCogYyA9IGN0cmxfOwogICAgRGF0YSogZCA9IGRhdGFfOwoKICAgIGZvciAodWludCBpID0g MDsgaSA8IG1fIC0gMTsgKytpLCArK2MpIAogICAgICBvcyA8PCAnKCcgPDwgYy0+aWR4IDw8ICcs JyA8PCBjLT5zeiA8PCAiKSwgIjsKICAgIG9zIDw8ICcoJyA8PCBjLT5pZHggPDwgJywnIDw8IGMt PnN6IDw8ICcpJzsKICAgIG9zIDw8ICJdLCBkYXRhID0gWyI7CiAgICBmb3IgKHVpbnQgaiA9IDA7 IGogPCBtXyAtIDE7ICsraiwgKytkKSB7CiAgICAgIGZvciAodWludCBrID0gMDsgayA8IGN0cmxf W2pdLnN6IC0gMTsgKytrLCArK2QpCglvcyA8PCAnKCcgPDwgZC0+aWR4IDw8ICcsJyA8PCBkLT5k YXRhIDw8ICIpLCAiOwogICAgICBvcyA8PCAnKCcgPDwgZC0+aWR4IDw8ICcsJyA8PCBkLT5kYXRh IDw8ICIpIHwgIjsKICAgIH0KICAgIGZvciAodWludCBrID0gMDsgayA8IGN0cmxfW21fLTFdLnN6 IC0gMTsgKytrLCArK2QpCiAgICAgIG9zIDw8ICcoJyA8PCBkLT5pZHggPDwgJywnIDw8IGQtPmRh dGEgPDwgIiksICI7CiAgICBvcyA8PCAnKCcgPDwgZC0+aWR4IDw8ICcsJyA8PCBkLT5kYXRhIDw8 ICcpJzsKICB9IGVsc2UgCiAgICBvcyA8PCAiXSwgZGF0YSA9IFsiOwoKICByZXR1cm4gb3MgPDwg Il0pIjsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4Kdm9pZCBzcGNfVE1hdHJpeDxGPjo6YXBwZW5kKHNw Y19UQ29sdW1uPEY+KiBUKSB7CiAKICB1aW50IG0gPSAwOwogIHVpbnQgc3ogPSAwOwogIHVpbnQg bm1heCA9IG5fOwoKICBmb3IgKHNwY19UQ29sdW1uPEY+KiBUVCA9IFQ7IFRUICE9IF9fbnVsbCA7 IFRUID0gVFQtPmxpbmsoKSkgewogICAgaWYgKG5tYXggPCBUVC0+bigpKSBubWF4ID0gVFQtPm4o KTsKICAgIGZvciAodWludCBpID0gVFQtPm4oKTsgaS0tOykgaWYgKCgqVFQpW2ldICE9IDAuMCkg KytzejsgCiAgICArK207CiAgfQogIG5fID0gbm1heDsKCiAgbSArPSBtXzsKICBDb250cm9sKiBj ID0gbmV3IENvbnRyb2xbbV07CiAgaWYgKG1fID4gMCkgewogICAgbWVtY3B5KGMsIGN0cmxfLCBt XyAqIHNpemVvZihDb250cm9sKSk7CiAgICBkZWxldGVbXSBjdHJsXzsKICB9CiAgY3RybF8gPSBj OyBjICs9IG1fOyBtXyA9IG07CgogIHN6ICs9IHN6XzsKICBEYXRhKiBkID0gbmV3IERhdGFbc3pd OwogIGlmIChzel8gPiAwKSB7CiAgICBtZW1jcHkoZCwgZGF0YV8sIHN6XyAqIHNpemVvZihEYXRh KSk7CiAgICBkZWxldGVbXSBkYXRhXzsgCiAgfSAKICBkYXRhXyA9IGQ7IGQgKz0gc3pfOyBzel8g PSBzejsKCiAgZm9yIChzcGNfVENvbHVtbjxGPiogVFQgPSBUOyBUVCAhPSBfX251bGwgOyBUVCA9 IFRULT5saW5rKCkpIHsKICAgIGMtPmlkeCA9IFRULT5pbmRleCgpOyBjLT5zeiA9IDA7CgogICAg Zm9yICh1aW50IGkgPSBUVC0+bigpOyBpLS07KSAKICAgICAgaWYgKCgqVFQpW2ldICE9IDAuMCkg ewoJZC0+aWR4ID0gaTsgZC0+ZGF0YSA9ICgqVFQpW2ldOyArK2Q7IAoJKytjLT5zejsKICAgICAg fQoKICAgICsrYzsKICB9Cn0KCgoKCgoKCgoKCgojIDkzNyAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uv c3BjRWxlbWVudC5oIiAyCgoKCiMgMTYgIi4uL2Z1bmN0aW9uL2ZuY0Z1bmN0aW9uLmgiIDIKCiMg MSAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uvc3BjU3BhY2UuaCIgMQogCgoKCgoKCgogICNwcmFnbWEg aW50ZXJmYWNlCgoKCgoKIyAxICIuLi9mdW5jdGlvbi8uLi9zcGFjZS8uLi9nZW9tZXRyeS9nZW9N ZXNoLmgiIDEKIAoKCgoKCgoKCgoKCgoKCiAKCmNsYXNzIHRieF9TY2FuPGdlb19DZWxsMj4gOiBw dWJsaWMgdGJ4X1NjYW48Z2VvX0NlbGw+IHsKIHB1YmxpYzoKICBnZW9fQ2VsbDImIG9wZXJhdG9y KysoaW50KSA9IDA7Cn07CgpjbGFzcyB0YnhfU2NhbjxnZW9fQ2VsbDM+IDogcHVibGljIHRieF9T Y2FuPGdlb19DZWxsPiB7CiBwdWJsaWM6CiAgZ2VvX0NlbGwzJiBvcGVyYXRvcisrKGludCkgPSAw Owp9OwoKdHlwZWRlZiB0YnhfU2NhbjxnZW9fQ2VsbD4gZ2VvX1NjYW47CgogCnR5cGVkZWYgdGJ4 X1NjYW48Z2VvX0NlbGwyPiBnZW9fU2NhbjI7CgogCnR5cGVkZWYgdGJ4X1NjYW48Z2VvX0NlbGwz PiBnZW9fU2NhbjM7CgoKIAoKIAoKCgoKCmNsYXNzIGdlb19NZXNoIHsKCiBwdWJsaWM6CiAgdmly dHVhbCB1aW50IG5jZWxsKCkgY29uc3QgPSAwOyAgCiAgdmlydHVhbCBnZW9fU2Nhbiogc2Nhbigp ID0gMDsKfTsKCiAKCiAKCmNsYXNzIGdlb19NZXNoMiA6IHB1YmxpYyBnZW9fTWVzaCB7CgogcHVi bGljOgogIGdlb19TY2FuMiogc2NhbigpID0gMDsKfTsKCiAKCiAKCmNsYXNzIGdlb19NZXNoMyA6 IHB1YmxpYyBnZW9fTWVzaCB7CgogcHVibGljOgogIGdlb19TY2FuMyogc2NhbigpID0gMDsKfTsK CiAKCiAKCmNsYXNzIGdlb19CYWxsIDogcHVibGljIGdlb19NZXNoMiB7CiAgCiAgY2xhc3MgUyA6 IHB1YmxpYyBnZW9fU2NhbjIgewoKICAgIHVpbnQgICAgICAgICAgIGlkeF87CiAgICBnZW9fVHJp YW5nbGUzZCAqKCZjZWxsXylbOF07CgogICBwdWJsaWM6CiAgICBpbmxpbmUgUyhnZW9fVHJpYW5n bGUzZCAqKCZjZWxsKVs4XSk7IAogICAgaW5saW5lIFMoY29uc3QgUyAmc2Nhbik7IAogICAgCiAg ICBpbmxpbmUgYm9vbCBlb3MoKSBjb25zdDsKICAgIGlubGluZSBnZW9fQ2VsbDImIG9wZXJhdG9y KysoaW50KTsKCiAgICBpbmxpbmUgZ2VvX1NjYW4yKiBjbG9uZSgpIGNvbnN0OwogIH07CgogIGdl b19WZXJ0ZXggICAgKnZ0eF9bNl07CiAgZ2VvX0VkZ2UgICAgICAqZWRnX1sxMl07CiAgZ2VvX1Ry aWFuZ2xlICAqdHJpX1s4XTsKCiAgZ2VvX1RyaWFuZ2xlM2QgKmNlbGxfWzhdOwoKIHB1YmxpYzoK ICBnZW9fQmFsbCgpOwogIHZpcnR1YWwgfmdlb19CYWxsKCk7CgogIGlubGluZSB1aW50IG5jZWxs KCkgY29uc3Q7CiAgaW5saW5lIGdlb19TY2FuMiogc2NhbigpOwp9OwoKaW5saW5lIGdlb19CYWxs OjpTOjpTKGdlb19UcmlhbmdsZTNkICooJmNlbGwpWzhdKSA6IGlkeF8oMCksIGNlbGxfKGNlbGwp IHsKfQoKaW5saW5lIGdlb19CYWxsOjpTOjpTKGNvbnN0IFMmIHNjYW4pIDogaWR4XyhzY2FuLmlk eF8pLCAgY2VsbF8oc2Nhbi5jZWxsXykgewp9CgppbmxpbmUgYm9vbCBnZW9fQmFsbDo6Uzo6ZW9z KCkgY29uc3QgewogIHJldHVybiBpZHhfID09IDg7Cn0KCmlubGluZSBnZW9fQ2VsbDImIGdlb19C YWxsOjpTOjpvcGVyYXRvcisrKGludCkgewogIHJldHVybiAqY2VsbF9baWR4XysrXTsKfQoKaW5s aW5lIGdlb19TY2FuMiogZ2VvX0JhbGw6OlM6OmNsb25lKCkgY29uc3QgewogIHJldHVybiBuZXcg UygqdGhpcyk7Cn0KCmlubGluZSB1aW50IGdlb19CYWxsOjpuY2VsbCgpIGNvbnN0IHsKICByZXR1 cm4gODsKfQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX0JhbGw6OnNjYW4oKSB7CiAgcmV0dXJuIG5l dyBTKGNlbGxfKTsKfQoKIAoKIAoKCgpjbGFzcyBnZW9fRGlzayA6IHB1YmxpYyBnZW9fTWVzaDIg ewogIAogICAKCgogIGNsYXNzIFMgOiBwdWJsaWMgdGJ4X1NjYW48Z2VvX0NlbGwyPiB7CgogICAg IAogICAgdWludCAgICAgICAgICAgaWR4XzsKCiAgICAgCiAgICBnZW9fVHJpYW5nbGUyZCAqKCZj ZWxsXylbNF07CgogICBwdWJsaWM6CiAgICAgCgoKICAgIGlubGluZSBTKGdlb19UcmlhbmdsZTJk ICooJmNlbGwpWzRdKTsgCgogICAgIAogICAgaW5saW5lIFMoY29uc3QgUyYgc2Nhbik7IAogICAg CiAgICAgCgoKICAgIGlubGluZSBib29sIGVvcygpIGNvbnN0OwoKICAgICAKCgogICAgaW5saW5l IGdlb19DZWxsMiYgb3BlcmF0b3IrKyhpbnQpOwoKICAgICAKICAgIGlubGluZSBnZW9fU2NhbjIq IGNsb25lKCkgY29uc3Q7CiAgfTsKCiAgIAogIGdlb19WZXJ0ZXggICAgKnZ0eF9bNV07CgogICAK ICBnZW9fRWRnZSAgICAgICplZGdfWzhdOwoKICAgCiAgZ2VvX1RyaWFuZ2xlICAqdHJpX1s0XTsK CiAgIAoKCiAgZ2VvX1RyaWFuZ2xlMmQgKmNlbGxfWzRdOwoKIHB1YmxpYzoKICAgCgoKICBnZW9f RGlzaygpOwogIHZpcnR1YWwgfmdlb19EaXNrKCk7CgogICAKICBpbmxpbmUgdWludCBuY2VsbCgp IGNvbnN0OwoKICAgCgoKCiAgaW5saW5lIGdlb19TY2FuMiogc2NhbigpOwp9OwoKaW5saW5lIGdl b19EaXNrOjpTOjpTKGdlb19UcmlhbmdsZTJkKiAoJmNlbGwpWzRdKSA6IGlkeF8oMCksIGNlbGxf KGNlbGwpIHsKfQoKaW5saW5lIGdlb19EaXNrOjpTOjpTKGNvbnN0IFMmIHNjYW4pIDogaWR4Xyhz Y2FuLmlkeF8pLCAgY2VsbF8oc2Nhbi5jZWxsXykgewp9CgppbmxpbmUgYm9vbCBnZW9fRGlzazo6 Uzo6ZW9zKCkgY29uc3QgewogIHJldHVybiBpZHhfID09IDQ7Cn0KCmlubGluZSBnZW9fQ2VsbDIm IGdlb19EaXNrOjpTOjpvcGVyYXRvcisrKGludCkgewogIHJldHVybiAqY2VsbF9baWR4XysrXTsK fQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX0Rpc2s6OlM6OmNsb25lKCkgY29uc3QgewogIHJldHVy biBuZXcgUygqdGhpcyk7Cn0KCmlubGluZSB1aW50IGdlb19EaXNrOjpuY2VsbCgpIGNvbnN0IHsK ICByZXR1cm4gNDsKfQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX0Rpc2s6OnNjYW4oKXsKICByZXR1 cm4gbmV3IFMoY2VsbF8pOwp9CgogCgogCgoKY2xhc3MgZ2VvX1NxdWFyZSA6IHB1YmxpYyBnZW9f TWVzaDIgewogIAogICAKCgogIGNsYXNzIFMgOiBwdWJsaWMgdGJ4X1NjYW48Z2VvX0NlbGwyPiB7 CgogICAgIAogICAgdWludCAgICAgICAgICAgaWR4XzsKCiAgICAgCiAgICBnZW9fVHJpYW5nbGUy ZCAqKCZjZWxsXylbMl07CgogICBwdWJsaWM6CiAgICAgCgoKICAgIGlubGluZSBTKGdlb19Ucmlh bmdsZTJkICooJmNlbGwpWzJdKTsgCgogICAgIAogICAgaW5saW5lIFMoY29uc3QgUyYgc2Nhbik7 IAogICAgCiAgICAgCgoKICAgIGlubGluZSBib29sIGVvcygpIGNvbnN0OwoKICAgICAKCgogICAg aW5saW5lIGdlb19DZWxsMiYgb3BlcmF0b3IrKyhpbnQpOwoKICAgICAKICAgIGlubGluZSBnZW9f U2NhbjIqIGNsb25lKCkgY29uc3Q7CiAgfTsKCiAgIAogIGdlb19WZXJ0ZXggICAgKnZ0eF9bNF07 CgogICAKICBnZW9fRWRnZSAgICAgICplZGdfWzVdOwoKICAgCiAgZ2VvX1RyaWFuZ2xlICAqdHJp X1syXTsKCiAgIAoKCiAgZ2VvX1RyaWFuZ2xlMmQgKmNlbGxfWzJdOwoKIHB1YmxpYzoKICAgCgoK ICBnZW9fU3F1YXJlKCk7CiAgdmlydHVhbCB+Z2VvX1NxdWFyZSgpOwoKICAgCiAgaW5saW5lIHVp bnQgbmNlbGwoKSBjb25zdDsKCiAgIAoKCgogIGlubGluZSBnZW9fU2NhbjIqIHNjYW4oKTsKfTsK CmlubGluZSBnZW9fU3F1YXJlOjpTOjpTKGdlb19UcmlhbmdsZTJkKiAoJmNlbGwpWzJdKSA6IGlk eF8oMCksIGNlbGxfKGNlbGwpIHsKfQoKaW5saW5lIGdlb19TcXVhcmU6OlM6OlMoY29uc3QgUyYg c2NhbikgOiBpZHhfKHNjYW4uaWR4XyksICBjZWxsXyhzY2FuLmNlbGxfKSB7Cn0KCmlubGluZSBi b29sIGdlb19TcXVhcmU6OlM6OmVvcygpIGNvbnN0IHsKICByZXR1cm4gaWR4XyA9PSAyOwp9Cgpp bmxpbmUgZ2VvX0NlbGwyJiBnZW9fU3F1YXJlOjpTOjpvcGVyYXRvcisrKGludCkgewogIHJldHVy biAqY2VsbF9baWR4XysrXTsKfQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX1NxdWFyZTo6Uzo6Y2xv bmUoKSBjb25zdCB7CiAgcmV0dXJuIG5ldyBTKCp0aGlzKTsKfQoKaW5saW5lIHVpbnQgZ2VvX1Nx dWFyZTo6bmNlbGwoKSBjb25zdCB7CiAgcmV0dXJuIDI7Cn0KCmlubGluZSBnZW9fU2NhbjIqIGdl b19TcXVhcmU6OnNjYW4oKSB7CiAgcmV0dXJuIG5ldyBTKGNlbGxfKTsKfQoKIAoKIAoKY2xhc3Mg Z2VvX0JpVGV0cmEgOiBwdWJsaWMgZ2VvX01lc2gyIHsKICAKICBjbGFzcyBTIDogcHVibGljIGdl b19TY2FuMiB7CgogICAgdWludCAgICAgICAgICAgaWR4XzsKICAgIGdlb19UcmlhbmdsZTNkICoo JmNlbGxfKVs2XTsKCiAgIHB1YmxpYzoKICAgIGlubGluZSBTKGdlb19UcmlhbmdsZTNkICooJmNl bGwpWzZdKTsgCiAgICBpbmxpbmUgUyhjb25zdCBTICZzY2FuKTsgCiAgICAKICAgIGlubGluZSBi b29sIGVvcygpIGNvbnN0OwogICAgaW5saW5lIGdlb19DZWxsMiYgb3BlcmF0b3IrKyhpbnQpOwoK ICAgIGlubGluZSBnZW9fU2NhbjIqIGNsb25lKCkgY29uc3Q7CiAgfTsKCiAgZ2VvX1ZlcnRleCAg ICAqdnR4X1s1XTsKICBnZW9fRWRnZSAgICAgICplZGdfWzldOwogIGdlb19UcmlhbmdsZSAgKnRy aV9bNl07CgogIGdlb19UcmlhbmdsZTNkICpjZWxsX1s2XTsKCiBwdWJsaWM6CiAgZ2VvX0JpVGV0 cmEoKTsKICB2aXJ0dWFsIH5nZW9fQmlUZXRyYSgpOwoKICBpbmxpbmUgdWludCBuY2VsbCgpIGNv bnN0OwogIGlubGluZSBnZW9fU2NhbjIqIHNjYW4oKTsKfTsKCmlubGluZSBnZW9fQmlUZXRyYTo6 Uzo6UyhnZW9fVHJpYW5nbGUzZCAqKCZjZWxsKVs2XSkgOiBpZHhfKDApLCBjZWxsXyhjZWxsKSB7 Cn0KCmlubGluZSBnZW9fQmlUZXRyYTo6Uzo6Uyhjb25zdCBTJiBzY2FuKSA6IGlkeF8oc2Nhbi5p ZHhfKSwgY2VsbF8oc2Nhbi5jZWxsXykgewp9CgppbmxpbmUgYm9vbCBnZW9fQmlUZXRyYTo6Uzo6 ZW9zKCkgY29uc3QgewogIHJldHVybiBpZHhfID09IDY7Cn0KCmlubGluZSBnZW9fQ2VsbDImIGdl b19CaVRldHJhOjpTOjpvcGVyYXRvcisrKGludCkgewogIHJldHVybiAqY2VsbF9baWR4XysrXTsK fQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX0JpVGV0cmE6OlM6OmNsb25lKCkgY29uc3QgewogIHJl dHVybiBuZXcgUygqdGhpcyk7Cn0KCmlubGluZSB1aW50IGdlb19CaVRldHJhOjpuY2VsbCgpIGNv bnN0IHsKICByZXR1cm4gNjsKfQoKaW5saW5lIGdlb19TY2FuMiogZ2VvX0JpVGV0cmE6OnNjYW4o KSB7CiAgcmV0dXJuIG5ldyBTKGNlbGxfKTsKfQoKCiMgMTUgIi4uL2Z1bmN0aW9uLy4uL3NwYWNl L3NwY1NwYWNlLmgiIDIKCgoKCgogCgojIDQyICIuLi9mdW5jdGlvbi8uLi9zcGFjZS9zcGNTcGFj ZS5oIgoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIHNwY19TcGFjZTsKCnRlbXBsYXRlPGNsYXNz IEY+CmlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBzcGNfU3Bh Y2U8Rj4mIHNwYykgewogIHJldHVybiBzcGMuaW5mbyhvcyk7Cn0KCiAKCnRlbXBsYXRlPGNsYXNz IEY+CmNsYXNzIHNwY19TcGFjZSB7CiAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwgPD4gKG9z dHJlYW0mIG9zLCBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYyk7CgogcHVibGljOgogIHR5cGVkZWYg dGJ4X1NjYW48c3BjX0VsZW1lbnQ8Rj4gPiBzcGNfU2NhbjsKCiAgIAogIHZpcnR1YWwgdWludCBk aW0oKSBjb25zdCA9IDA7CgogICAKICB2aXJ0dWFsIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3Ms IHVpbnQgbW9kZSA9IDApIGNvbnN0OwoKICAgCiAgdmlydHVhbCB1aW50IG5lbG0oKSBjb25zdCA9 IDA7CgogICAKICB2aXJ0dWFsIHNwY19TY2FuKiBzY2FuKCkgY29uc3QgPSAwOyAKfTsKCgoKIAoK IAoKCgoKCgoKCgoKCgpjbGFzcyBzcGNfTGluZWFyMmQgOiBwdWJsaWMgc3BjX1NwYWNlPHJlYWw+ IHsKCiAgIAogIHVpbnQgZGltXzsKCiAgIAogIHVpbnQgbmVsbV87CgogICAKICB0YnhfQ29ubmVj dG9yPHNwY19FbGVtZW50PHJlYWw+KiwgMT4qIGVsbV87CgogICAKCgoKCgoKCgoKCgoKCgogIHZv aWQgY29uc3RydWN0b3JfKGdlb19UcmlhbmdsZTJkKiB0cmksIHVpbnQgbHZsLCB0YnhfRHluQXJy YXk8dWludD4mIG1hcCk7CgogcHVibGljOgogICAKCgoKCiAgc3BjX0xpbmVhcjJkKGdlb19NZXNo JiBtc2gsIHVpbnQgbHZsKTsKCiAgdmlydHVhbCB+c3BjX0xpbmVhcjJkKCk7CgogIGlubGluZSB1 aW50IGRpbSgpIGNvbnN0OwogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MsIHVpbnQgbW9kZSA9 IDApIGNvbnN0OwogIGlubGluZSB1aW50IG5lbG0oKSBjb25zdDsKICBpbmxpbmUgc3BjX1NjYW4q IHNjYW4oKSBjb25zdDsKfTsKCmlubGluZSB1aW50IHNwY19MaW5lYXIyZDo6ZGltKCkgY29uc3Qg eyAKICByZXR1cm4gZGltXzsgCn0KCmlubGluZSB1aW50IHNwY19MaW5lYXIyZDo6bmVsbSgpIGNv bnN0IHsgCiAgcmV0dXJuIG5lbG1fOyAKfQoKaW5saW5lIHNwY19TcGFjZTxyZWFsPjo6c3BjX1Nj YW4qIHNwY19MaW5lYXIyZDo6c2NhbigpIGNvbnN0IHsgCiAgcmV0dXJuIG5ldyB0YnhfUExpc3RT Y2FuPHNwY19FbGVtZW50PHJlYWw+ID4oKmVsbV8pOwp9CgogCgogCgogCiAKCiAKCiAKCiAKIAog CiAgCiAKIAogCiAKIAoKIAogCiAKCiAKIAogCgogCiAKIAoKIAoKCgoKCgoKCgoKCgpjbGFzcyBz cGNfTGluZWFyM2QgOiBwdWJsaWMgc3BjX1NwYWNlPHJlYWw+IHsKCnB1YmxpYzoKICAgCgoKCgog IHNwY19MaW5lYXIzZChnZW9fTWVzaCYgbXNoLCB1aW50IGx2bCk7CiAgdmlydHVhbCB+c3BjX0xp bmVhcjNkKCk7CgogICAKICBpbmxpbmUgdWludCBkaW0oKSBjb25zdCB7IHJldHVybiBkaW1fOyB9 CgogICAKICBpbmxpbmUgdWludCBuZWxtKCkgY29uc3QgeyByZXR1cm4gbmVsbV87IH0KCiAgIAog IGlubGluZSBzcGNfU2Nhbiogc2NhbigpIGNvbnN0IHsgCiAgICByZXR1cm4gbmV3IHRieF9QTGlz dFNjYW48c3BjX0VsZW1lbnQ8cmVhbD4gPigqZWxtXyk7CiAgfQoKICAgCiAgb3N0cmVhbSYgaW5m byhvc3RyZWFtJiBvcywgdWludCBtb2RlID0gMCkgY29uc3Q7Cgpwcml2YXRlOgogICAKICB1aW50 IGRpbV87CgogICAKICB1aW50IG5lbG1fOwoKICAgCiAgdGJ4X0Nvbm5lY3RvcjxzcGNfRWxlbWVu dDxyZWFsPiosIDE+KiBlbG1fOwoKICB2b2lkIGNvbnN0cnVjdG9yXyhnZW9fVGV0cmFoZWRyb24z ZCogY2VsbCwgdWludCBsdmwsIAoJCSAgICB0YnhfRHluQXJyYXk8dWludD4mIG1hcCk7Cn07Cgog CgpjbGFzcyBzcGNfQ29uc3RhbnQzZCA6IHB1YmxpYyBzcGNfU3BhY2U8cmVhbD4gewoKICB1aW50 IGRpbV87CiAgdWludCBuZWxtXzsKCiAgdGJ4X0Nvbm5lY3RvcjxzcGNfRWxlbWVudDxyZWFsPios IDE+KiBlbG1fOwoKICB2b2lkIGNvbnN0cnVjdG9yXyhnZW9fVHJpYW5nbGUzZCogdHJpLCB1aW50 IGx2bCk7CgogcHVibGljOgogIHNwY19Db25zdGFudDNkKGdlb19NZXNoJiBtc2gsIHVpbnQgbHZs KTsKICB2aXJ0dWFsIH5zcGNfQ29uc3RhbnQzZCgpOwoKICBpbmxpbmUgdWludCBkaW0oKSBjb25z dDsKICBpbmxpbmUgdWludCBuZWxtKCkgY29uc3Q7CiAgaW5saW5lIHNwY19TY2FuKiBzY2FuKCkg Y29uc3Q7Cn07CgppbmxpbmUgdWludCBzcGNfQ29uc3RhbnQzZDo6ZGltKCkgY29uc3QgeyAKICBy ZXR1cm4gZGltXzsgCn0KCmlubGluZSB1aW50IHNwY19Db25zdGFudDNkOjpuZWxtKCkgY29uc3Qg ewogIHJldHVybiBuZWxtXzsgCn0KCmlubGluZSBzcGNfU3BhY2U8cmVhbD46OnNwY19TY2FuKiBz cGNfQ29uc3RhbnQzZDo6c2NhbigpIGNvbnN0IHsgCiAgcmV0dXJuIG5ldyB0YnhfUExpc3RTY2Fu PHNwY19FbGVtZW50PHJlYWw+ID4oKmVsbV8pOwp9CgogCgpjbGFzcyBzcGNfRGlyYWMzZCA6IHB1 YmxpYyBzcGNfU3BhY2U8cmVhbD4gewoKICB1aW50IGRpbV87CiAgdWludCBuZWxtXzsKCiAgdGJ4 X0Nvbm5lY3RvcjxzcGNfRWxlbWVudDxyZWFsPiosIDE+KiBlbG1fOwoKICB2b2lkIGNvbnN0cnVj dG9yXyhnZW9fVHJpYW5nbGUzZCogdHJpLCB1aW50IGx2bCwgdGJ4X0R5bkFycmF5PHVpbnQ+JiBt YXApOwoKIHB1YmxpYzoKICBzcGNfRGlyYWMzZChnZW9fTWVzaCYgbXNoLCB1aW50IGx2bCk7CiAg dmlydHVhbCB+c3BjX0RpcmFjM2QoKTsKICAKICBpbmxpbmUgdWludCBkaW0oKSBjb25zdDsKICBp bmxpbmUgdWludCBuZWxtKCkgY29uc3Q7CiAgaW5saW5lIHNwY19TY2FuKiBzY2FuKCkgY29uc3Q7 Cn07CgppbmxpbmUgdWludCBzcGNfRGlyYWMzZDo6ZGltKCkgY29uc3QgeyAKICByZXR1cm4gZGlt XzsgCn0KCmlubGluZSB1aW50IHNwY19EaXJhYzNkOjpuZWxtKCkgY29uc3QgewogIHJldHVybiBu ZWxtXzsgCn0KCmlubGluZSBzcGNfU3BhY2U8cmVhbD46OnNwY19TY2FuKiBzcGNfRGlyYWMzZDo6 c2NhbigpIGNvbnN0IHsgCiAgcmV0dXJuIG5ldyB0YnhfUExpc3RTY2FuPHNwY19FbGVtZW50PHJl YWw+ID4oKmVsbV8pOwp9CgogCgojIDEgIi4uL2Z1bmN0aW9uLy4uL3NwYWNlL3NwY1NwYWNlLnQi IDEKIAoKCgoKCgogICNwcmFnbWEgaW1wbGVtZW50YXRpb24KCgogCgp0ZW1wbGF0ZTxjbGFzcyBG Pgpvc3RyZWFtJiBzcGNfU3BhY2U8Rj46OmluZm8ob3N0cmVhbSYgb3MsIHVpbnQgbW9kZSkgY29u c3QgewoKICBpZiAobW9kZSA9PSAwKSB7CiAgICBvcyA8PCAic3BjX1NwYWNlKGRpbSA9ICIgPDwg ZGltKCkgPDwgJyknOwoKICB9IGVsc2UgewoKICAgIHNwY19TY2FuKiBzYyA9IHNjYW4oKTsKICAg IHdoaWxlICgqc2MpIG9zIDw8ICgqc2MpKysgPDwgJ1xuJzsKICAgIGRlbGV0ZSBzYzsKCiAgfQoK ICByZXR1cm4gb3M7Cn0KCgojIDI5OCAiLi4vZnVuY3Rpb24vLi4vc3BhY2Uvc3BjU3BhY2UuaCIg MgoKCgojIDE3ICIuLi9mdW5jdGlvbi9mbmNGdW5jdGlvbi5oIiAyCgoKIyAxICIuLi9mdW5jdGlv bi9mbmNMRm9ybS5oIiAxCiAKCgoKCgoKCgoKCgoKIyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3Jh dGlvbi5oIiAxCiAKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCiAKCiMgMSAiLi4vZnVuY3Rp b24vLi4vaW50ZWdyYXRpb24vaW50UXVhZHJhdHVyZS5oIiAxCiAKCgoKIyAxICIvdXNyL2xpYi9n Y2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaGFzaF9t YXAiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2Mt bGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2h0 YWJsZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogCiAKCgoKCgoj IDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVk ZS9nKystMy9zdGxfYWxnby5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9zdGxfaGVhcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKCiAKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFz cyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4Kdm9pZCAKX19wdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0 ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwgX0Rpc3Rh bmNlIF9fdG9wSW5kZXgsIF9UcCBfX3ZhbHVlKQp7CiAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9f aG9sZUluZGV4IC0gMSkgLyAyOwogIHdoaWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXggJiYg KihfX2ZpcnN0ICsgX19wYXJlbnQpIDwgX192YWx1ZSkgewogICAgKihfX2ZpcnN0ICsgX19ob2xl SW5kZXgpID0gKihfX2ZpcnN0ICsgX19wYXJlbnQpOwogICAgX19ob2xlSW5kZXggPSBfX3BhcmVu dDsKICAgIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOwogIH0gICAgCiAgKihfX2Zp cnN0ICsgX19ob2xlSW5kZXgpID0gX192YWx1ZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+CmlubGluZSB2b2lkIApf X3B1c2hfaGVhcF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfRGlzdGFuY2UqLCBfVHAqKQp7CiAg X19wdXNoX2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlKChfX2xhc3QgLSBfX2ZpcnN0KSAtIDEpLCBf RGlzdGFuY2UoMCksIAogICAgICAgICAgICAgIF9UcCgqKF9fbGFzdCAtIDEpKSk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CmlubGluZSB2b2lkIApwdXNoX2hlYXAo X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xh c3QpCnsKICBfX3B1c2hfaGVhcF9hdXgoX19maXJzdCwgX19sYXN0LAogICAgICAgICAgICAgICAg ICBfX2Rpc3RhbmNlX3R5cGUoIF9fZmlyc3QgKSAsIF9fdmFsdWVfdHlwZSggX19maXJzdCApICk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZSwgY2xhc3MgX1RwLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgp2b2lkCl9fcHVzaF9oZWFw KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCiAg ICAgICAgICAgIF9EaXN0YW5jZSBfX3RvcEluZGV4LCBfVHAgX192YWx1ZSwgX0NvbXBhcmUgX19j b21wKQp7CiAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOwogIHdo aWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXggJiYgX19jb21wKCooX19maXJzdCArIF9fcGFy ZW50KSwgX192YWx1ZSkpIHsKICAgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9ICooX19maXJz dCArIF9fcGFyZW50KTsKICAgIF9faG9sZUluZGV4ID0gX19wYXJlbnQ7CiAgICBfX3BhcmVudCA9 IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKICB9CiAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0g X192YWx1ZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3Mg X0NvbXBhcmUsCiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KaW5saW5lIHZv aWQgCl9fcHVzaF9oZWFwX2F1eChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKICAgICAg ICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCwK ICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosIF9UcCopIAp7CiAgX19wdXNoX2hlYXAoX19maXJz dCwgX0Rpc3RhbmNlKChfX2xhc3QgLSBfX2ZpcnN0KSAtIDEpLCBfRGlzdGFuY2UoMCksIAogICAg ICAgICAgICAgIF9UcCgqKF9fbGFzdCAtIDEpKSwgX19jb21wKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSB2b2lkIApwdXNo X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRv ciBfX2xhc3QsCiAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsKICBfX3B1c2hfaGVhcF9hdXgo X19maXJzdCwgX19sYXN0LCBfX2NvbXAsCiAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlw ZSggX19maXJzdCApICwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+CnZv aWQgCl9fYWRqdXN0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5j ZSBfX2hvbGVJbmRleCwKICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4sIF9UcCBfX3ZhbHVl KQp7CiAgX0Rpc3RhbmNlIF9fdG9wSW5kZXggPSBfX2hvbGVJbmRleDsKICBfRGlzdGFuY2UgX19z ZWNvbmRDaGlsZCA9IDIgKiBfX2hvbGVJbmRleCArIDI7CiAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQg PCBfX2xlbikgewogICAgaWYgKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpIDwgKihfX2ZpcnN0 ICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSkpCiAgICAgIF9fc2Vjb25kQ2hpbGQtLTsKICAgICooX19m aXJzdCArIF9faG9sZUluZGV4KSA9ICooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpOwogICAgX19o b2xlSW5kZXggPSBfX3NlY29uZENoaWxkOwogICAgX19zZWNvbmRDaGlsZCA9IDIgKiAoX19zZWNv bmRDaGlsZCArIDEpOwogIH0KICBpZiAoX19zZWNvbmRDaGlsZCA9PSBfX2xlbikgewogICAgKihf X2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gKihfX2ZpcnN0ICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSk7 CiAgICBfX2hvbGVJbmRleCA9IF9fc2Vjb25kQ2hpbGQgLSAxOwogIH0KICBfX3B1c2hfaGVhcChf X2ZpcnN0LCBfX2hvbGVJbmRleCwgX190b3BJbmRleCwgX192YWx1ZSk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPgpp bmxpbmUgdm9pZCAKX19wb3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1Jh bmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0 b3IgX19yZXN1bHQsIF9UcCBfX3ZhbHVlLCBfRGlzdGFuY2UqKQp7CiAgKl9fcmVzdWx0ID0gKl9f Zmlyc3Q7CiAgX19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2UoMCksIF9EaXN0YW5jZShf X2xhc3QgLSBfX2ZpcnN0KSwgX192YWx1ZSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNj ZXNzSXRlcmF0b3IsIGNsYXNzIF9UcD4KaW5saW5lIHZvaWQgCl9fcG9wX2hlYXBfYXV4KF9SYW5k b21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAog ICAgICAgICAgICAgICBfVHAqKQp7CiAgX19wb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QgLSAxLCBf X2xhc3QgLSAxLCAKICAgICAgICAgICAgIF9UcCgqKF9fbGFzdCAtIDEpKSwgX19kaXN0YW5jZV90 eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRv cj4KaW5saW5lIHZvaWQgcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIAog ICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQp7CiAgX19w b3BfaGVhcF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2Us CiAgICAgICAgICBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgp2b2lkCl9fYWRqdXN0X2hlYXAo X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwKICAg ICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4sIF9UcCBfX3ZhbHVlLCBfQ29tcGFyZSBfX2NvbXAp CnsKICBfRGlzdGFuY2UgX190b3BJbmRleCA9IF9faG9sZUluZGV4OwogIF9EaXN0YW5jZSBfX3Nl Y29uZENoaWxkID0gMiAqIF9faG9sZUluZGV4ICsgMjsKICB3aGlsZSAoX19zZWNvbmRDaGlsZCA8 IF9fbGVuKSB7CiAgICBpZiAoX19jb21wKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpLCAqKF9f Zmlyc3QgKyAoX19zZWNvbmRDaGlsZCAtIDEpKSkpCiAgICAgIF9fc2Vjb25kQ2hpbGQtLTsKICAg ICooX19maXJzdCArIF9faG9sZUluZGV4KSA9ICooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpOwog ICAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkOwogICAgX19zZWNvbmRDaGlsZCA9IDIgKiAo X19zZWNvbmRDaGlsZCArIDEpOwogIH0KICBpZiAoX19zZWNvbmRDaGlsZCA9PSBfX2xlbikgewog ICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gKihfX2ZpcnN0ICsgKF9fc2Vjb25kQ2hpbGQg LSAxKSk7CiAgICBfX2hvbGVJbmRleCA9IF9fc2Vjb25kQ2hpbGQgLSAxOwogIH0KICBfX3B1c2hf aGVhcChfX2ZpcnN0LCBfX2hvbGVJbmRleCwgX190b3BJbmRleCwgX192YWx1ZSwgX19jb21wKTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFz cyBfQ29tcGFyZSwgCiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIApfX3Bv cF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0 b3IgX19sYXN0LAogICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCwgX1Rw IF9fdmFsdWUsIF9Db21wYXJlIF9fY29tcCwKICAgICAgICAgICBfRGlzdGFuY2UqKQp7CiAgKl9f cmVzdWx0ID0gKl9fZmlyc3Q7CiAgX19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2UoMCks IF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwgCiAgICAgICAgICAgICAgICBfX3ZhbHVlLCBf X2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBf VHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgdm9pZCAKX19wb3BfaGVhcF9hdXgoX1JhbmRvbUFj Y2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRv ciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29tcCkKewogIF9fcG9wX2hlYXAoX19maXJzdCwg X19sYXN0IC0gMSwgX19sYXN0IC0gMSwgX1RwKCooX19sYXN0IC0gMSkpLCBfX2NvbXAsCiAgICAg ICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoIF9fZmlyc3QgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgCnBvcF9o ZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAogICAgICAgICBfUmFuZG9tQWNjZXNz SXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCnsKICAgIF9fcG9wX2hlYXBfYXV4KF9f Zmlyc3QsIF9fbGFzdCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgLCBfX2NvbXApOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4Kdm9pZCAKX19tYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCiAg ICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9UcCosIF9EaXN0YW5jZSop CnsKICBpZiAoX19sYXN0IC0gX19maXJzdCA8IDIpIHJldHVybjsKICBfRGlzdGFuY2UgX19sZW4g PSBfX2xhc3QgLSBfX2ZpcnN0OwogIF9EaXN0YW5jZSBfX3BhcmVudCA9IChfX2xlbiAtIDIpLzI7 CiAgICAKICB3aGlsZSAodHJ1ZSkgewogICAgX19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfX3BhcmVu dCwgX19sZW4sIF9UcCgqKF9fZmlyc3QgKyBfX3BhcmVudCkpKTsKICAgIGlmIChfX3BhcmVudCA9 PSAwKSByZXR1cm47CiAgICBfX3BhcmVudC0tOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5k b21BY2Nlc3NJdGVyYXRvcj4KaW5saW5lIHZvaWQgCm1ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRl cmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKewogIF9fbWFrZV9o ZWFwKF9fZmlyc3QsIF9fbGFzdCwKICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoIF9fZmlyc3Qg KSAsIF9fZGlzdGFuY2VfdHlwZSggX19maXJzdCApICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFu ZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlLAogICAgICAgICAgY2xhc3MgX1RwLCBj bGFzcyBfRGlzdGFuY2U+CnZvaWQKX19tYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9f Zmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgIF9Db21wYXJl IF9fY29tcCwgX1RwKiwgX0Rpc3RhbmNlKikKewogIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikg cmV0dXJuOwogIF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgX0Rpc3RhbmNl IF9fcGFyZW50ID0gKF9fbGVuIC0gMikvMjsKICAgIAogIHdoaWxlICh0cnVlKSB7CiAgICBfX2Fk anVzdF9oZWFwKF9fZmlyc3QsIF9fcGFyZW50LCBfX2xlbiwgX1RwKCooX19maXJzdCArIF9fcGFy ZW50KSksCiAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgICBpZiAoX19wYXJlbnQgPT0gMCkg cmV0dXJuOwogICAgX19wYXJlbnQtLTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNj ZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgdm9pZCAKbWFrZV9oZWFwKF9SYW5k b21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRv ciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKewogIF9fbWFrZV9oZWFwKF9fZmlyc3QsIF9fbGFz dCwgX19jb21wLAogICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSggX19maXJzdCApICwgX19kaXN0 YW5jZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJ dGVyYXRvcj4Kdm9pZCBzb3J0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9S YW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCnsKICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+ IDEpCiAgICBwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QtLSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf UmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgp2b2lkIApzb3J0X2hlYXAoX1Jh bmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0 b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCnsKICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+ IDEpCiAgICBwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QtLSwgX19jb21wKTsKfQoKCgoKCiAKCgoK IAogCiAKIyAzNCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9hbGdvLmgiIDIgMwoKCiAKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwPgppbmxpbmUgY29uc3QgX1RwJiBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3Qg X1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jKSB7CiAgaWYgKF9fYSA8IF9fYikKICAgIGlmIChfX2Ig PCBfX2MpCiAgICAgIHJldHVybiBfX2I7CiAgICBlbHNlIGlmIChfX2EgPCBfX2MpCiAgICAgIHJl dHVybiBfX2M7CiAgICBlbHNlCiAgICAgIHJldHVybiBfX2E7CiAgZWxzZSBpZiAoX19hIDwgX19j KQogICAgcmV0dXJuIF9fYTsKICBlbHNlIGlmIChfX2IgPCBfX2MpCiAgICByZXR1cm4gX19jOwog IGVsc2UKICAgIHJldHVybiBfX2I7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21w YXJlPgppbmxpbmUgY29uc3QgX1RwJgpfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1Rw JiBfX2IsIGNvbnN0IF9UcCYgX19jLCBfQ29tcGFyZSBfX2NvbXApIHsKICBpZiAoX19jb21wKF9f YSwgX19iKSkKICAgIGlmIChfX2NvbXAoX19iLCBfX2MpKQogICAgICByZXR1cm4gX19iOwogICAg ZWxzZSBpZiAoX19jb21wKF9fYSwgX19jKSkKICAgICAgcmV0dXJuIF9fYzsKICAgIGVsc2UKICAg ICAgcmV0dXJuIF9fYTsKICBlbHNlIGlmIChfX2NvbXAoX19hLCBfX2MpKQogICAgcmV0dXJuIF9f YTsKICBlbHNlIGlmIChfX2NvbXAoX19iLCBfX2MpKQogICAgcmV0dXJuIF9fYzsKICBlbHNlCiAg ICByZXR1cm4gX19iOwp9CgogCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRnVu Y3Rpb24+Cl9GdW5jdGlvbiBmb3JfZWFjaChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIg X19sYXN0LCBfRnVuY3Rpb24gX19mKSB7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytf X2ZpcnN0KQogICAgX19mKCpfX2ZpcnN0KTsKICByZXR1cm4gX19mOwp9CgogCgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1RwPgppbmxpbmUgX0lucHV0SXRlciBmaW5kKF9JbnB1 dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg Y29uc3QgX1RwJiBfX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90 YWcpCnsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgIT0gX192YWwpCiAg ICArK19fZmlyc3Q7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyLCBjbGFzcyBfUHJlZGljYXRlPgppbmxpbmUgX0lucHV0SXRlciBmaW5kX2lmKF9JbnB1dEl0 ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X1ByZWRpY2F0ZSBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0 b3JfdGFnKQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFfX3ByZWQoKl9fZmlyc3Qp KQogICAgKytfX2ZpcnN0OwogIHJldHVybiBfX2ZpcnN0Owp9CgoKCnRlbXBsYXRlIDxjbGFzcyBf UmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgpfUmFuZG9tQWNjZXNzSXRlciBmaW5kKF9SYW5k b21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAogICAgICAgICAgICAgICAgICAgICAgIHJh bmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQp7CiAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9S YW5kb21BY2Nlc3NJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fdHJpcF9jb3VudAogICAgPSAoX19s YXN0IC0gX19maXJzdCkgPj4gMjsKCiAgZm9yICggOyBfX3RyaXBfY291bnQgPiAwIDsgLS1fX3Ry aXBfY291bnQpIHsKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CiAg ICArK19fZmlyc3Q7CgogICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsK ICAgICsrX19maXJzdDsKCiAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0 OwogICAgKytfX2ZpcnN0OwoKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmly c3Q7CiAgICArK19fZmlyc3Q7CiAgfQoKICBzd2l0Y2goX19sYXN0IC0gX19maXJzdCkgewogIGNh c2UgMzoKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CiAgICArK19f Zmlyc3Q7CiAgY2FzZSAyOgogICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJz dDsKICAgICsrX19maXJzdDsKICBjYXNlIDE6CiAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJl dHVybiBfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogIGNhc2UgMDoKICBkZWZhdWx0OgogICAgcmV0 dXJuIF9fbGFzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xh c3MgX1ByZWRpY2F0ZT4KX1JhbmRvbUFjY2Vzc0l0ZXIgZmluZF9pZihfUmFuZG9tQWNjZXNzSXRl ciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9t X2FjY2Vzc19pdGVyYXRvcl90YWcpCnsKICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRv bUFjY2Vzc0l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX190cmlwX2NvdW50CiAgICA9IChfX2xhc3Qg LSBfX2ZpcnN0KSA+PiAyOwoKICBmb3IgKCA7IF9fdHJpcF9jb3VudCA+IDAgOyAtLV9fdHJpcF9j b3VudCkgewogICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwogICAgKytf X2ZpcnN0OwoKICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKICAgICsr X19maXJzdDsKCiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CiAgICAr K19fZmlyc3Q7CgogICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwogICAg KytfX2ZpcnN0OwogIH0KCiAgc3dpdGNoKF9fbGFzdCAtIF9fZmlyc3QpIHsKICBjYXNlIDM6CiAg ICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CiAgICArK19fZmlyc3Q7CiAg Y2FzZSAyOgogICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwogICAgKytf X2ZpcnN0OwogIGNhc2UgMToKICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJz dDsKICAgICsrX19maXJzdDsKICBjYXNlIDA6CiAgZGVmYXVsdDoKICAgIHJldHVybiBfX2xhc3Q7 CiAgfQp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+CmlubGluZSBf SW5wdXRJdGVyIGZpbmQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKQp7CiAgcmV0dXJuIGZpbmQoX19m aXJzdCwgX19sYXN0LCBfX3ZhbCwgX19pdGVyYXRvcl9jYXRlZ29yeSggX19maXJzdCApICk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgppbmxpbmUgX0lu cHV0SXRlciBmaW5kX2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpIHsKICByZXR1cm4gZmlu ZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgX19pdGVyYXRvcl9jYXRlZ29yeSggX19maXJz dCApICk7Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Cl9Gb3J3YXJkSXRlciBh ZGphY2VudF9maW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0KSB7 CiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIF9fbGFzdDsKICBfRm9yd2FyZEl0 ZXIgX19uZXh0ID0gX19maXJzdDsKICB3aGlsZSgrK19fbmV4dCAhPSBfX2xhc3QpIHsKICAgIGlm ICgqX19maXJzdCA9PSAqX19uZXh0KQogICAgICByZXR1cm4gX19maXJzdDsKICAgIF9fZmlyc3Qg PSBfX25leHQ7CiAgfQogIHJldHVybiBfX2xhc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Cl9Gb3J3YXJkSXRlciBhZGphY2VudF9maW5k KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpIHsKICBpZiAoX19m aXJzdCA9PSBfX2xhc3QpCiAgICByZXR1cm4gX19sYXN0OwogIF9Gb3J3YXJkSXRlciBfX25leHQg PSBfX2ZpcnN0OwogIHdoaWxlKCsrX19uZXh0ICE9IF9fbGFzdCkgewogICAgaWYgKF9fYmluYXJ5 X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQogICAgICByZXR1cm4gX19maXJzdDsKICAgIF9fZmly c3QgPSBfX25leHQ7CiAgfQogIHJldHVybiBfX2xhc3Q7Cn0KCiAKIAogCiAKIAoKdGVtcGxhdGUg PGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX1NpemU+CnZvaWQgY291bnQoX0lu cHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlLAog ICAgICAgICAgIF9TaXplJiBfX24pIHsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19f Zmlyc3QpCiAgICBpZiAoKl9fZmlyc3QgPT0gX192YWx1ZSkKICAgICAgKytfX247Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfU2l6ZT4Kdm9p ZCBjb3VudF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGlj YXRlIF9fcHJlZCwKICAgICAgICAgICAgICBfU2l6ZSYgX19uKSB7CiAgZm9yICggOyBfX2ZpcnN0 ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCiAgICAgICsr X19uOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHA+CnR5cGVuYW1l IGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCmNvdW50KF9JbnB1 dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkgewog IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9f biA9IDA7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKCpf X2ZpcnN0ID09IF9fdmFsdWUpCiAgICAgICsrX19uOwogIHJldHVybiBfX247Cn0KCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgp0eXBlbmFtZSBpdGVyYXRvcl90 cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZQpjb3VudF9pZihfSW5wdXRJdGVyIF9f Zmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkgewogIHR5cGVuYW1l IGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDA7CiAg Zm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKF9fcHJlZCgqX19m aXJzdCkpCiAgICAgICsrX19uOwogIHJldHVybiBfX247Cn0KCgoKCiAKCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgpfRm9yd2FyZEl0ZXIxIHNlYXJj aChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCiAgICAgICAg ICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0 MikgCnsKICAgCiAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0 MikKICAgIHJldHVybiBfX2ZpcnN0MTsKCiAgIAogIF9Gb3J3YXJkSXRlcjIgX190bXAoX19maXJz dDIpOwogICsrX190bXA7CiAgaWYgKF9fdG1wID09IF9fbGFzdDIpCiAgICByZXR1cm4gZmluZChf X2ZpcnN0MSwgX19sYXN0MSwgKl9fZmlyc3QyKTsKCiAgIAoKICBfRm9yd2FyZEl0ZXIyIF9fcDEs IF9fcDsKCiAgX19wMSA9IF9fZmlyc3QyOyArK19fcDE7CgogIF9Gb3J3YXJkSXRlcjEgX19jdXJy ZW50ID0gX19maXJzdDE7CgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxKSB7CiAgICBfX2Zp cnN0MSA9IGZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CiAgICBpZiAoX19maXJz dDEgPT0gX19sYXN0MSkKICAgICAgcmV0dXJuIF9fbGFzdDE7CgogICAgX19wID0gX19wMTsKICAg IF9fY3VycmVudCA9IF9fZmlyc3QxOyAKICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQog ICAgICByZXR1cm4gX19sYXN0MTsKCiAgICB3aGlsZSAoKl9fY3VycmVudCA9PSAqX19wKSB7CiAg ICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQogICAgICAgIHJldHVybiBfX2ZpcnN0MTsKICAgICAg aWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCiAgICAgICAgcmV0dXJuIF9fbGFzdDE7CiAgICB9 CgogICAgKytfX2ZpcnN0MTsKICB9CiAgcmV0dXJuIF9fZmlyc3QxOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWQ+ Cl9Gb3J3YXJkSXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRl cjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0Miwg X0ZvcndhcmRJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZCAg X19wcmVkaWNhdGUpIAp7CiAgIAogIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3Qy ID09IF9fbGFzdDIpCiAgICByZXR1cm4gX19maXJzdDE7CgogICAKICBfRm9yd2FyZEl0ZXIyIF9f dG1wKF9fZmlyc3QyKTsKICArK19fdG1wOwogIGlmIChfX3RtcCA9PSBfX2xhc3QyKQogICAgcmV0 dXJuIGZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CgogICAKCiAgX0ZvcndhcmRJ dGVyMiBfX3AxLCBfX3A7CgogIF9fcDEgPSBfX2ZpcnN0MjsgKytfX3AxOwoKICBfRm9yd2FyZEl0 ZXIxIF9fY3VycmVudCA9IF9fZmlyc3QxOwoKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSkg ewogICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEpIHsKICAgICAgaWYgKF9fcHJlZGljYXRl KCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKICAgICAgICBicmVhazsKICAgICAgKytfX2ZpcnN0MTsK ICAgIH0KICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICFfX3ByZWRpY2F0ZSgqX19m aXJzdDEsICpfX2ZpcnN0MikpCiAgICAgICsrX19maXJzdDE7CiAgICBpZiAoX19maXJzdDEgPT0g X19sYXN0MSkKICAgICAgcmV0dXJuIF9fbGFzdDE7CgogICAgX19wID0gX19wMTsKICAgIF9fY3Vy cmVudCA9IF9fZmlyc3QxOyAKICAgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKSByZXR1cm4g X19sYXN0MTsKCiAgICB3aGlsZSAoX19wcmVkaWNhdGUoKl9fY3VycmVudCwgKl9fcCkpIHsKICAg ICAgaWYgKCsrX19wID09IF9fbGFzdDIpCiAgICAgICAgcmV0dXJuIF9fZmlyc3QxOwogICAgICBp ZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKICAgICAgICByZXR1cm4gX19sYXN0MTsKICAgIH0K CiAgICArK19fZmlyc3QxOwogIH0KICByZXR1cm4gX19maXJzdDE7Cn0KCiAKCnRlbXBsYXRlIDxj bGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9JbnRlZ2VyLCBjbGFzcyBfVHA+Cl9Gb3J3YXJkSXRl ciBzZWFyY2hfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAg ICAgICAgICAgICAgICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwpIHsK ICBpZiAoX19jb3VudCA8PSAwKQogICAgcmV0dXJuIF9fZmlyc3Q7CiAgZWxzZSB7CiAgICBfX2Zp cnN0ID0gZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKICAgIHdoaWxlIChfX2ZpcnN0ICE9 IF9fbGFzdCkgewogICAgICBfSW50ZWdlciBfX24gPSBfX2NvdW50IC0gMTsKICAgICAgX0Zvcndh cmRJdGVyIF9faSA9IF9fZmlyc3Q7CiAgICAgICsrX19pOwogICAgICB3aGlsZSAoX19pICE9IF9f bGFzdCAmJiBfX24gIT0gMCAmJiAqX19pID09IF9fdmFsKSB7CiAgICAgICAgKytfX2k7CiAgICAg ICAgLS1fX247CiAgICAgIH0KICAgICAgaWYgKF9fbiA9PSAwKQogICAgICAgIHJldHVybiBfX2Zp cnN0OwogICAgICBlbHNlCiAgICAgICAgX19maXJzdCA9IGZpbmQoX19pLCBfX2xhc3QsIF9fdmFs KTsKICAgIH0KICAgIHJldHVybiBfX2xhc3Q7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0Zvcndh cmRJdGVyLCBjbGFzcyBfSW50ZWdlciwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5UHJlZD4KX0Zv cndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19s YXN0LAogICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBf X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpIHsK ICBpZiAoX19jb3VudCA8PSAwKQogICAgcmV0dXJuIF9fZmlyc3Q7CiAgZWxzZSB7CiAgICB3aGls ZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3Qs IF9fdmFsKSkKICAgICAgICBicmVhazsKICAgICAgKytfX2ZpcnN0OwogICAgfQogICAgd2hpbGUg KF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICAgIF9JbnRlZ2VyIF9fbiA9IF9fY291bnQgLSAxOwog ICAgICBfRm9yd2FyZEl0ZXIgX19pID0gX19maXJzdDsKICAgICAgKytfX2k7CiAgICAgIHdoaWxl IChfX2kgIT0gX19sYXN0ICYmIF9fbiAhPSAwICYmIF9fYmluYXJ5X3ByZWQoKl9faSwgX192YWwp KSB7CiAgICAgICAgKytfX2k7CiAgICAgICAgLS1fX247CiAgICAgIH0KICAgICAgaWYgKF9fbiA9 PSAwKQogICAgICAgIHJldHVybiBfX2ZpcnN0OwogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAo X19pICE9IF9fbGFzdCkgewogICAgICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9faSwgX192YWwp KQogICAgICAgICAgICBicmVhazsKICAgICAgICAgICsrX19pOwogICAgICAgIH0KICAgICAgICBf X2ZpcnN0ID0gX19pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX19sYXN0OwogIH0KfSAKCiAK CnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgpfRm9y d2FyZEl0ZXIyIHN3YXBfcmFuZ2VzKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRl cjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmly c3QyKSB7CiAgZm9yICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmly c3QyKQogICAgaXRlcl9zd2FwKF9fZmlyc3QxLCBfX2ZpcnN0Mik7CiAgcmV0dXJuIF9fZmlyc3Qy Owp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNs YXNzIF9VbmFyeU9wZXJhdGlvbj4KX091dHB1dEl0ZXIgdHJhbnNmb3JtKF9JbnB1dEl0ZXIgX19m aXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRl ciBfX3Jlc3VsdCwgX1VuYXJ5T3BlcmF0aW9uIF9fb3BlcikgewogIGZvciAoIDsgX19maXJzdCAh PSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKICAgICpfX3Jlc3VsdCA9IF9fb3Blcigq X19maXJzdCk7CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl cjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKICAgICAgICAgIGNsYXNz IF9CaW5hcnlPcGVyYXRpb24+Cl9PdXRwdXRJdGVyIHRyYW5zZm9ybShfSW5wdXRJdGVyMSBfX2Zp cnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0 ZXIyIF9fZmlyc3QyLCBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAg IF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIHsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9f bGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIsICsrX19yZXN1bHQpCiAgICAqX19yZXN1bHQg PSBfX2JpbmFyeV9vcCgqX19maXJzdDEsICpfX2ZpcnN0Mik7CiAgcmV0dXJuIF9fcmVzdWx0Owp9 CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CnZvaWQgcmVwbGFj ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg IGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKICBmb3Ig KCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBpZiAoKl9fZmlyc3QgPT0gX19v bGRfdmFsdWUpCiAgICAgICpfX2ZpcnN0ID0gX19uZXdfdmFsdWU7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9UcD4Kdm9pZCByZXBsYWNl X2lmKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAg ICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpIHsKICBmb3Ig KCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0 KSkKICAgICAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfVHA+Cl9PdXRwdXRJdGVyIHJlcGxhY2Vf Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKSB7CiAgZm9y ICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQogICAgKl9fcmVz dWx0ID0gKl9fZmlyc3QgPT0gX19vbGRfdmFsdWUgPyBfX25ld192YWx1ZSA6ICpfX2ZpcnN0Owog IHJldHVybiBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBfT3V0 cHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZSwgY2xhc3MgX1RwPgpfT3V0cHV0SXRlciByZXBsYWNl X2NvcHlfaWYoSXRlcmF0b3IgX19maXJzdCwgSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkgewogIGZv ciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX3Jlc3VsdCkKICAgICpfX3Jl c3VsdCA9IF9fcHJlZCgqX19maXJzdCkgPyBfX25ld192YWx1ZSA6ICpfX2ZpcnN0OwogIHJldHVy biBfX3Jlc3VsdDsKfQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0dl bmVyYXRvcj4Kdm9pZCBnZW5lcmF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVy IF9fbGFzdCwgX0dlbmVyYXRvciBfX2dlbikgewogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7 ICsrX19maXJzdCkKICAgICpfX2ZpcnN0ID0gX19nZW4oKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9P dXRwdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX0dlbmVyYXRvcj4KX091dHB1dEl0ZXIgZ2Vu ZXJhdGVfbihfT3V0cHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4p IHsKICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCiAgICAqX19maXJzdCA9IF9f Z2VuKCk7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy LCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1RwPgpfT3V0cHV0SXRlciByZW1vdmVfY29weShf SW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgY29uc3QgX1RwJiBfX3ZhbHVlKSB7CiAgZm9yICgg OyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKCpfX2ZpcnN0ICE9IF9fdmFs dWUpIHsKICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgICAgICsrX19yZXN1bHQ7CiAgICB9 CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3Mg X091dHB1dEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Cl9PdXRwdXRJdGVyIHJlbW92ZV9jb3B5X2lm KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCkgewogIGZv ciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgIGlmICghX19wcmVkKCpfX2Zp cnN0KSkgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKICAgICAgKytfX3Jlc3VsdDsKICAg IH0KICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNs YXNzIF9UcD4KX0ZvcndhcmRJdGVyIHJlbW92ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0Zvcndh cmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsdWUpIHsK ICBfX2ZpcnN0ID0gZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWUpOwogIF9Gb3J3YXJkSXRl ciBfX2kgPSBfX2ZpcnN0OwogIHJldHVybiBfX2ZpcnN0ID09IF9fbGFzdCA/IF9fZmlyc3QgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVtb3ZlX2NvcHkoKytfX2ksIF9fbGFzdCwgX19m aXJzdCwgX192YWx1ZSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Q cmVkaWNhdGU+Cl9Gb3J3YXJkSXRlciByZW1vdmVfaWYoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9G b3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3By ZWQpIHsKICBfX2ZpcnN0ID0gZmluZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CiAgX0Zv cndhcmRJdGVyIF9faSA9IF9fZmlyc3Q7CiAgcmV0dXJuIF9fZmlyc3QgPT0gX19sYXN0ID8gX19m aXJzdCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZW1vdmVfY29weV9pZigrK19faSwg X19sYXN0LCBfX2ZpcnN0LCBfX3ByZWQpOwp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl ciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgX191bmlxdWVfY29w eShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAg ICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfVHAqKSB7CiAgX1RwIF9fdmFsdWUgPSAq X19maXJzdDsKICAqX19yZXN1bHQgPSBfX3ZhbHVlOwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19s YXN0KQogICAgaWYgKF9fdmFsdWUgIT0gKl9fZmlyc3QpIHsKICAgICAgX192YWx1ZSA9ICpfX2Zp cnN0OwogICAgICAqKytfX3Jlc3VsdCA9IF9fdmFsdWU7CiAgICB9CiAgcmV0dXJuICsrX19yZXN1 bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4KaW5s aW5lIF9PdXRwdXRJdGVyIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJ dGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIg X19yZXN1bHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaXRlcmF0 b3JfdGFnKSB7CiAgcmV0dXJuIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3Vs dCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KX0ZvcndhcmRJdGVyIF9fdW5pcXVlX2NvcHkoX0lucHV0 SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykgewogICpfX3Jl c3VsdCA9ICpfX2ZpcnN0OwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQogICAgaWYgKCpf X3Jlc3VsdCAhPSAqX19maXJzdCkgKisrX19yZXN1bHQgPSAqX19maXJzdDsKICByZXR1cm4gKytf X3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVy PgppbmxpbmUgX091dHB1dEl0ZXIgdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5w dXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVy IF9fcmVzdWx0KSB7CiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19yZXN1bHQ7CiAg cmV0dXJuIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKICAgICAgICAg ICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX3Jlc3VsdCApICk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0JpbmFyeVBy ZWRpY2F0ZSwKICAgICAgICAgIGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgX191bmlxdWVfY29weShf SW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9C aW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgX1RwKikgewogIF9UcCBfX3ZhbHVlID0gKl9f Zmlyc3Q7CiAgKl9fcmVzdWx0ID0gX192YWx1ZTsKICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFz dCkKICAgIGlmICghX19iaW5hcnlfcHJlZChfX3ZhbHVlLCAqX19maXJzdCkpIHsKICAgICAgX192 YWx1ZSA9ICpfX2ZpcnN0OwogICAgICAqKytfX3Jlc3VsdCA9IF9fdmFsdWU7CiAgICB9CiAgcmV0 dXJuICsrX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0 cHV0SXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KaW5saW5lIF9PdXRwdXRJdGVyIF9fdW5p cXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2l0ZXJhdG9yX3RhZykgewogIHJl dHVybiBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3By ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0Jp bmFyeVByZWRpY2F0ZT4KX0ZvcndhcmRJdGVyIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2Zp cnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Zvcndh cmRJdGVyIF9fcmVzdWx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRp Y2F0ZSBfX2JpbmFyeV9wcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0 ZXJhdG9yX3RhZykgewogICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogIHdoaWxlICgrK19fZmlyc3Qg IT0gX19sYXN0KQogICAgaWYgKCFfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSAq KytfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogIHJldHVybiArK19fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNh dGU+CmlubGluZSBfT3V0cHV0SXRlciB1bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9J bnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0 ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGlj YXRlIF9fYmluYXJ5X3ByZWQpIHsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX3Jl c3VsdDsKICByZXR1cm4gX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBf X2JpbmFyeV9wcmVkLAogICAgICAgICAgICAgICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnko IF9fcmVzdWx0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KX0ZvcndhcmRJ dGVyIHVuaXF1ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkgewog IF9fZmlyc3QgPSBhZGphY2VudF9maW5kKF9fZmlyc3QsIF9fbGFzdCk7CiAgcmV0dXJuIHVuaXF1 ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19maXJzdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Cl9Gb3J3YXJkSXRlciB1bmlxdWUoX0Zv cndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CiAgX19maXJzdCA9IGFkamFjZW50 X2ZpbmQoX19maXJzdCwgX19sYXN0LCBfX2JpbmFyeV9wcmVkKTsKICByZXR1cm4gdW5pcXVlX2Nv cHkoX19maXJzdCwgX19sYXN0LCBfX2ZpcnN0LCBfX2JpbmFyeV9wcmVkKTsKfQoKIAoKdGVtcGxh dGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4Kdm9pZCBfX3JldmVyc2UoX0JpZGlyZWN0aW9u YWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsIAogICAgICAgICAgICAg ICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykgewogIHdoaWxlICh0cnVlKQogICAgaWYgKF9f Zmlyc3QgPT0gX19sYXN0IHx8IF9fZmlyc3QgPT0gLS1fX2xhc3QpCiAgICAgIHJldHVybjsKICAg IGVsc2UKICAgICAgaXRlcl9zd2FwKF9fZmlyc3QrKywgX19sYXN0KTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9SYW5kb21BY2Nlc3NJdGVyPgp2b2lkIF9fcmV2ZXJzZShfUmFuZG9tQWNjZXNzSXRlciBf X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgIHJhbmRvbV9h Y2Nlc3NfaXRlcmF0b3JfdGFnKSB7CiAgd2hpbGUgKF9fZmlyc3QgPCBfX2xhc3QpCiAgICBpdGVy X3N3YXAoX19maXJzdCsrLCAtLV9fbGFzdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rp b25hbEl0ZXI+CmlubGluZSB2b2lkIHJldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3Qs IF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKICBfX3JldmVyc2UoX19maXJzdCwgX19sYXN0 LCBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9C aWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Cl9PdXRwdXRJdGVyIHJldmVyc2Vf Y29weShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewog ICAgLS1fX2xhc3Q7CiAgICAqX19yZXN1bHQgPSAqX19sYXN0OwogICAgKytfX3Jlc3VsdDsKICB9 CiAgcmV0dXJuIF9fcmVzdWx0Owp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0V1Y2xpZGVhblJpbmdF bGVtZW50PgpfRXVjbGlkZWFuUmluZ0VsZW1lbnQgX19nY2QoX0V1Y2xpZGVhblJpbmdFbGVtZW50 IF9fbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBf X24pCnsKICB3aGlsZSAoX19uICE9IDApIHsKICAgIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX3Qg PSBfX20gJSBfX247CiAgICBfX20gPSBfX247CiAgICBfX24gPSBfX3Q7CiAgfQogIHJldHVybiBf X207Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KX0Zv cndhcmRJdGVyIF9fcm90YXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAg ICAgICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgX0Zvcndh cmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosCiAgICAgICAg ICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykgewogIGlmIChfX2ZpcnN0ID09IF9f bWlkZGxlKQogICAgcmV0dXJuIF9fbGFzdDsKICBpZiAoX19sYXN0ICA9PSBfX21pZGRsZSkKICAg IHJldHVybiBfX2ZpcnN0OwoKICBfRm9yd2FyZEl0ZXIgX19maXJzdDIgPSBfX21pZGRsZTsKICBk byB7CiAgICBzd2FwKCpfX2ZpcnN0KyssICpfX2ZpcnN0MisrKTsKICAgIGlmIChfX2ZpcnN0ID09 IF9fbWlkZGxlKQogICAgICBfX21pZGRsZSA9IF9fZmlyc3QyOwogIH0gd2hpbGUgKF9fZmlyc3Qy ICE9IF9fbGFzdCk7CgogIF9Gb3J3YXJkSXRlciBfX25ld19taWRkbGUgPSBfX2ZpcnN0OwoKICBf X2ZpcnN0MiA9IF9fbWlkZGxlOwoKICB3aGlsZSAoX19maXJzdDIgIT0gX19sYXN0KSB7CiAgICBz d2FwICgqX19maXJzdCsrLCAqX19maXJzdDIrKyk7CiAgICBpZiAoX19maXJzdCA9PSBfX21pZGRs ZSkKICAgICAgX19taWRkbGUgPSBfX2ZpcnN0MjsKICAgIGVsc2UgaWYgKF9fZmlyc3QyID09IF9f bGFzdCkKICAgICAgX19maXJzdDIgPSBfX21pZGRsZTsKICB9CgogIHJldHVybiBfX25ld19taWRk bGU7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFu Y2U+Cl9CaWRpcmVjdGlvbmFsSXRlciBfX3JvdGF0ZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJz dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRs ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpIHsKICBpZiAoX19maXJzdCA9 PSBfX21pZGRsZSkKICAgIHJldHVybiBfX2xhc3Q7CiAgaWYgKF9fbGFzdCAgPT0gX19taWRkbGUp CiAgICByZXR1cm4gX19maXJzdDsKCiAgX19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlk aXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CiAgX19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3Qs ICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CgogIHdoaWxlIChfX2ZpcnN0ICE9IF9f bWlkZGxlICYmIF9fbWlkZGxlICE9IF9fbGFzdCkKICAgIHN3YXAgKCpfX2ZpcnN0KyssICotLV9f bGFzdCk7CgogIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKSB7CiAgICBfX3JldmVyc2UoX19taWRk bGUsIF9fbGFzdCwgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKICAgIHJldHVybiBf X2xhc3Q7CiAgfQogIGVsc2UgewogICAgX19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlk aXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CiAgICByZXR1cm4gX19maXJzdDsKICB9Cn0KCnRl bXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBf VHA+Cl9SYW5kb21BY2Nlc3NJdGVyIF9fcm90YXRlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAog ICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSAqLCBfVHAgKikgewoKICBfRGlzdGFuY2Ug X19uID0gX19sYXN0ICAgLSBfX2ZpcnN0OwogIF9EaXN0YW5jZSBfX2sgPSBfX21pZGRsZSAtIF9f Zmlyc3Q7CiAgX0Rpc3RhbmNlIF9fbCA9IF9fbiAtIF9fazsKICBfUmFuZG9tQWNjZXNzSXRlciBf X3Jlc3VsdCA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19taWRkbGUpOwoKICBpZiAoX19rID09IF9f bCkgewogICAgc3dhcF9yYW5nZXMoX19maXJzdCwgX19taWRkbGUsIF9fbWlkZGxlKTsKICAgIHJl dHVybiBfX3Jlc3VsdDsKICB9CgogIF9EaXN0YW5jZSBfX2QgPSBfX2djZChfX24sIF9fayk7Cgog IGZvciAoX0Rpc3RhbmNlIF9faSA9IDA7IF9faSA8IF9fZDsgX19pKyspIHsKICAgIF9UcCBfX3Rt cCA9ICpfX2ZpcnN0OwogICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19wID0gX19maXJzdDsKCiAgICBp ZiAoX19rIDwgX19sKSB7CiAgICAgIGZvciAoX0Rpc3RhbmNlIF9faiA9IDA7IF9faiA8IF9fbC9f X2Q7IF9faisrKSB7CiAgICAgICAgaWYgKF9fcCA+IF9fZmlyc3QgKyBfX2wpIHsKICAgICAgICAg ICpfX3AgPSAqKF9fcCAtIF9fbCk7CiAgICAgICAgICBfX3AgLT0gX19sOwogICAgICAgIH0KCiAg ICAgICAgKl9fcCA9ICooX19wICsgX19rKTsKICAgICAgICBfX3AgKz0gX19rOwogICAgICB9CiAg ICB9CgogICAgZWxzZSB7CiAgICAgIGZvciAoX0Rpc3RhbmNlIF9faiA9IDA7IF9faiA8IF9fay9f X2QgLSAxOyBfX2ogKyspIHsKICAgICAgICBpZiAoX19wIDwgX19sYXN0IC0gX19rKSB7CiAgICAg ICAgICAqX19wID0gKihfX3AgKyBfX2spOwogICAgICAgICAgX19wICs9IF9fazsKICAgICAgICB9 CgogICAgICAgICpfX3AgPSAqIChfX3AgLSBfX2wpOwogICAgICAgIF9fcCAtPSBfX2w7CiAgICAg IH0KICAgIH0KCiAgICAqX19wID0gX190bXA7CiAgICArK19fZmlyc3Q7CiAgfQoKICByZXR1cm4g X19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CmlubGluZSBfRm9yd2Fy ZEl0ZXIgcm90YXRlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUs CiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2xhc3QpIHsKICByZXR1 cm4gX19yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg X19kaXN0YW5jZV90eXBlKCBfX2ZpcnN0ICkgLAogICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9y X2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwg Y2xhc3MgX091dHB1dEl0ZXI+Cl9PdXRwdXRJdGVyIHJvdGF0ZV9jb3B5KF9Gb3J3YXJkSXRlciBf X2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBj b3B5KF9fZmlyc3QsIF9fbWlkZGxlLCBjb3B5KF9fbWlkZGxlLCBfX2xhc3QsIF9fcmVzdWx0KSk7 Cn0KCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX0Rpc3RhbmNlIF9f cmFuZG9tX251bWJlcihfRGlzdGFuY2UgX19uKSB7CgoKCiAgcmV0dXJuIGxyYW5kNDgoKSAlIF9f bjsKCn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KaW5saW5lIHZvaWQg cmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CiAgaWYgKF9fZmlyc3QgPT0g X19sYXN0KSByZXR1cm47CiAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX2ZpcnN0ICsg MTsgX19pICE9IF9fbGFzdDsgKytfX2kpCiAgICBpdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgX19y YW5kb21fbnVtYmVyKChfX2kgLSBfX2ZpcnN0KSArIDEpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9S YW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgp2b2lkIHJhbmRv bV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQp IHsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKICBmb3IgKF9SYW5kb21BY2Nlc3NJ dGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKICAgIGl0ZXJfc3dh cChfX2ksIF9fZmlyc3QgKyBfX3JhbmQoKF9faSAtIF9fZmlyc3QpICsgMSkpOwp9CgogCgp0ZW1w bGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3Rh bmNlPgpfT3V0cHV0SXRlciByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9G b3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRl ciBfX291dCwgY29uc3QgX0Rpc3RhbmNlIF9fbikKewogIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9 IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX3JlbWFpbmluZyk7CiAgX0Rpc3RhbmNl IF9fbSA9IG1pbihfX24sIF9fcmVtYWluaW5nKTsKCiAgd2hpbGUgKF9fbSA+IDApIHsKICAgIGlm IChfX3JhbmRvbV9udW1iZXIoX19yZW1haW5pbmcpIDwgX19tKSB7CiAgICAgICpfX291dCA9ICpf X2ZpcnN0OwogICAgICArK19fb3V0OwogICAgICAtLV9fbTsKICAgIH0KCiAgICAtLV9fcmVtYWlu aW5nOwogICAgKytfX2ZpcnN0OwogIH0KICByZXR1cm4gX19vdXQ7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2UsCiAgICAg ICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgpfT3V0cHV0SXRlciByYW5kb21fc2Ft cGxlX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX291dCwgY29uc3QgX0Rpc3RhbmNlIF9f biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9f cmFuZCkKewogIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwg X19sYXN0LCBfX3JlbWFpbmluZyk7CiAgX0Rpc3RhbmNlIF9fbSA9IG1pbihfX24sIF9fcmVtYWlu aW5nKTsKCiAgd2hpbGUgKF9fbSA+IDApIHsKICAgIGlmIChfX3JhbmQoX19yZW1haW5pbmcpIDwg X19tKSB7CiAgICAgICpfX291dCA9ICpfX2ZpcnN0OwogICAgICArK19fb3V0OwogICAgICAtLV9f bTsKICAgIH0KCiAgICAtLV9fcmVtYWluaW5nOwogICAgKytfX2ZpcnN0OwogIH0KICByZXR1cm4g X19vdXQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNz SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgpfUmFuZG9tQWNjZXNzSXRlciBfX3JhbmRvbV9zYW1wbGUo X0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikKewogIF9EaXN0YW5jZSBfX20g PSAwOwogIF9EaXN0YW5jZSBfX3QgPSBfX247CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAm JiBfX20gPCBfX247ICsrX19tLCArK19fZmlyc3QpIAogICAgX19vdXRbX19tXSA9ICpfX2ZpcnN0 OwoKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgICsrX190OwogICAgX0Rpc3RhbmNl IF9fTSA9IF9fcmFuZG9tX251bWJlcihfX3QpOwogICAgaWYgKF9fTSA8IF9fbikKICAgICAgX19v dXRbX19NXSA9ICpfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogIH0KCiAgcmV0dXJuIF9fb3V0ICsg X19tOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXIsCiAgICAgICAgICBjbGFzcyBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBjbGFzcyBfRGlzdGFu Y2U+Cl9SYW5kb21BY2Nlc3NJdGVyIF9fcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3Qs IF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jh bmRvbUFjY2Vzc0l0ZXIgX19vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf UmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBfRGlzdGFuY2UgX19uKQp7CiAgX0Rpc3RhbmNlIF9fbSA9IDA7CiAgX0Rp c3RhbmNlIF9fdCA9IF9fbjsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fbSA8IF9f bjsgKytfX20sICsrX19maXJzdCkKICAgIF9fb3V0W19fbV0gPSAqX19maXJzdDsKCiAgd2hpbGUg KF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICArK19fdDsKICAgIF9EaXN0YW5jZSBfX00gPSBfX3Jh bmQoX190KTsKICAgIGlmIChfX00gPCBfX24pCiAgICAgIF9fb3V0W19fTV0gPSAqX19maXJzdDsK ICAgICsrX19maXJzdDsKICB9CgogIHJldHVybiBfX291dCArIF9fbTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgX1JhbmRvbUFj Y2Vzc0l0ZXIKcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19s YXN0LAogICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBfUmFuZG9t QWNjZXNzSXRlciBfX291dF9sYXN0KSAKewogIHJldHVybiBfX3JhbmRvbV9zYW1wbGUoX19maXJz dCwgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfZmlyc3QsIF9fb3V0X2xh c3QgLSBfX291dF9maXJzdCk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3Mg X1JhbmRvbUFjY2Vzc0l0ZXIsIAogICAgICAgICAgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRv cj4KaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyCnJhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2Zp cnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBf X291dF9maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCwKICAgICAgICAgICAgICBf UmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpIAp7CiAgcmV0dXJuIF9fcmFuZG9tX3NhbXBs ZShfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX291dF9maXJzdCwg X19yYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgX19vdXRfbGFzdCAtIF9fb3V0X2ZpcnN0 KTsKfQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4K X0ZvcndhcmRJdGVyIF9fcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAoJCSAgICAgICAg IF9Gb3J3YXJkSXRlciBfX2xhc3QsCgkJCSBfUHJlZGljYXRlICAgX19wcmVkLAoJCQkgZm9yd2Fy ZF9pdGVyYXRvcl90YWcpIHsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0 OwoKICB3aGlsZSAoX19wcmVkKCpfX2ZpcnN0KSkKICAgIGlmICgrK19fZmlyc3QgPT0gX19sYXN0 KSByZXR1cm4gX19maXJzdDsKCiAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CgogIHdo aWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCiAgICBpZiAoX19wcmVkKCpfX25leHQpKSB7CiAgICAg IHN3YXAoKl9fZmlyc3QsICpfX25leHQpOwogICAgICArK19fZmlyc3Q7CiAgICB9CgogIHJldHVy biBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBf UHJlZGljYXRlPgpfQmlkaXJlY3Rpb25hbEl0ZXIgX19wYXJ0aXRpb24oX0JpZGlyZWN0aW9uYWxJ dGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25h bEl0ZXIgX19sYXN0LAoJCQkgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCgkJCSAgICAgICBiaWRp cmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykgewogIHdoaWxlICh0cnVlKSB7CiAgICB3aGlsZSAodHJ1 ZSkKICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgICAgIHJldHVybiBfX2ZpcnN0Owog ICAgICBlbHNlIGlmIChfX3ByZWQoKl9fZmlyc3QpKQogICAgICAgICsrX19maXJzdDsKICAgICAg ZWxzZQogICAgICAgIGJyZWFrOwogICAgLS1fX2xhc3Q7CiAgICB3aGlsZSAodHJ1ZSkKICAgICAg aWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgICAgIHJldHVybiBfX2ZpcnN0OwogICAgICBlbHNl IGlmICghX19wcmVkKCpfX2xhc3QpKQogICAgICAgIC0tX19sYXN0OwogICAgICBlbHNlCiAgICAg ICAgYnJlYWs7CiAgICBpdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKICAgICsrX19maXJzdDsK ICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Cmlu bGluZSBfRm9yd2FyZEl0ZXIgcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAJCQkg ICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAoJCQkgICAgICBfUHJlZGljYXRlICAgX19wcmVkKSB7 CiAgcmV0dXJuIF9fcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfX2l0ZXJhdG9y X2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIs IGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9EaXN0YW5jZT4KX0ZvcndhcmRJdGVyIF9faW5wbGFj ZV9zdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2Ug X19sZW4pIHsKICBpZiAoX19sZW4gPT0gMSkKICAgIHJldHVybiBfX3ByZWQoKl9fZmlyc3QpID8g X19sYXN0IDogX19maXJzdDsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGUgPSBfX2ZpcnN0OwogIGFk dmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7CiAgcmV0dXJuIHJvdGF0ZShfX2lucGxhY2Vfc3Rh YmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLCAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVuIC8gMiksCiAgICAgICAgICAgICAgICBf X21pZGRsZSwKICAgICAgICAgICAgICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fbWlk ZGxlLCBfX2xhc3QsIF9fcHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9fbGVuIC0gX19sZW4gLyAyKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0 ZXIsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfUHJlZGljYXRlLCAKICAgICAgICAgIGNsYXNzIF9E aXN0YW5jZT4KX0ZvcndhcmRJdGVyIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfRm9yd2Fy ZEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf Rm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4sCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpIAp7CiAg aWYgKF9fbGVuIDw9IF9fYnVmZmVyX3NpemUpIHsKICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdDEg PSBfX2ZpcnN0OwogICAgX1BvaW50ZXIgX19yZXN1bHQyID0gX19idWZmZXI7CiAgICBmb3IgKCA7 IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0KQogICAgICBpZiAoX19wcmVkKCpfX2ZpcnN0 KSkgewogICAgICAgICpfX3Jlc3VsdDEgPSAqX19maXJzdDsKICAgICAgICArK19fcmVzdWx0MTsK ICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAqX19yZXN1bHQyID0gKl9fZmlyc3Q7CiAgICAg ICAgKytfX3Jlc3VsdDI7CiAgICAgIH0KICAgIGNvcHkoX19idWZmZXIsIF9fcmVzdWx0MiwgX19y ZXN1bHQxKTsKICAgIHJldHVybiBfX3Jlc3VsdDE7CiAgfQogIGVsc2UgewogICAgX0ZvcndhcmRJ dGVyIF9fbWlkZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7 CiAgICByZXR1cm4gcm90YXRlKF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZSgKICAgICAgICAg ICAgICAgICAgICAgICAgICBfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLAogICAgICAgICAgICAg ICAgICAgICAgICAgIF9fbGVuIC8gMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpLAogICAgICAg ICAgICAgICAgICAgIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgIF9fc3RhYmxlX3BhcnRp dGlvbl9hZGFwdGl2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSwgX19sYXN0 LCBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4gLSBfX2xlbiAvIDIsIF9f YnVmZmVyLCBfX2J1ZmZlcl9zaXplKSk7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5l IF9Gb3J3YXJkSXRlcgpfX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0 LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRl IF9fcHJlZCwgX1RwKiwgX0Rpc3RhbmNlKikKewogIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJk SXRlciwgX1RwPiBfX2J1ZihfX2ZpcnN0LCBfX2xhc3QpOwogIGlmIChfX2J1Zi5zaXplKCkgPiAw KQogICAgcmV0dXJuIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3Qs IF9fcHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNl KF9fYnVmLnJlcXVlc3RlZF9zaXplKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfX2J1Zi5iZWdpbigpLCBfX2J1Zi5zaXplKCkpOwogIGVsc2UKICAgIHJldHVybiBf X2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fYnVmLnJlcXVlc3Rl ZF9zaXplKCkpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1ByZWRp Y2F0ZT4KaW5saW5lIF9Gb3J3YXJkSXRlciBzdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBf X2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVy IF9fbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRl IF9fcHJlZCkgewogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKICAgIHJldHVybiBfX2ZpcnN0Owog IGVsc2UKICAgIHJldHVybiBfX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9fZmlyc3QsIF9fbGFzdCwg X19wcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKCBf X2ZpcnN0ICkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90 eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBj bGFzcyBfVHA+Cl9SYW5kb21BY2Nlc3NJdGVyIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfUmFuZG9t QWNjZXNzSXRlciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfVHAgX19waXZvdCkgCnsKICB3aGlsZSAodHJ1ZSkgewogICAgd2hpbGUg KCpfX2ZpcnN0IDwgX19waXZvdCkKICAgICAgKytfX2ZpcnN0OwogICAgLS1fX2xhc3Q7CiAgICB3 aGlsZSAoX19waXZvdCA8ICpfX2xhc3QpCiAgICAgIC0tX19sYXN0OwogICAgaWYgKCEoX19maXJz dCA8IF9fbGFzdCkpCiAgICAgIHJldHVybiBfX2ZpcnN0OwogICAgaXRlcl9zd2FwKF9fZmlyc3Qs IF9fbGFzdCk7CiAgICArK19fZmlyc3Q7CiAgfQp9ICAgIAoKdGVtcGxhdGUgPGNsYXNzIF9SYW5k b21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgpfUmFuZG9tQWNjZXNzSXRl ciBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xh c3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwIF9fcGl2b3Qs IF9Db21wYXJlIF9fY29tcCkgCnsKICB3aGlsZSAodHJ1ZSkgewogICAgd2hpbGUgKF9fY29tcCgq X19maXJzdCwgX19waXZvdCkpCiAgICAgICsrX19maXJzdDsKICAgIC0tX19sYXN0OwogICAgd2hp bGUgKF9fY29tcChfX3Bpdm90LCAqX19sYXN0KSkKICAgICAgLS1fX2xhc3Q7CiAgICBpZiAoIShf X2ZpcnN0IDwgX19sYXN0KSkKICAgICAgcmV0dXJuIF9fZmlyc3Q7CiAgICBpdGVyX3N3YXAoX19m aXJzdCwgX19sYXN0KTsKICAgICsrX19maXJzdDsKICB9Cn0KCmNvbnN0IGludCBfX3N0bF90aHJl c2hvbGQgPSAxNjsKCiAKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3Mg X1RwPgp2b2lkIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19s YXN0LCBfVHAgX192YWwpIHsKICBfUmFuZG9tQWNjZXNzSXRlciBfX25leHQgPSBfX2xhc3Q7CiAg LS1fX25leHQ7CiAgd2hpbGUgKF9fdmFsIDwgKl9fbmV4dCkgewogICAgKl9fbGFzdCA9ICpfX25l eHQ7CiAgICBfX2xhc3QgPSBfX25leHQ7CiAgICAtLV9fbmV4dDsKICB9CiAgKl9fbGFzdCA9IF9f dmFsOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xh c3MgX0NvbXBhcmU+CnZvaWQgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfUmFuZG9tQWNjZXNz SXRlciBfX2xhc3QsIF9UcCBfX3ZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf Q29tcGFyZSBfX2NvbXApIHsKICBfUmFuZG9tQWNjZXNzSXRlciBfX25leHQgPSBfX2xhc3Q7CiAg LS1fX25leHQ7ICAKICB3aGlsZSAoX19jb21wKF9fdmFsLCAqX19uZXh0KSkgewogICAgKl9fbGFz dCA9ICpfX25leHQ7CiAgICBfX2xhc3QgPSBfX25leHQ7CiAgICAtLV9fbmV4dDsKICB9CiAgKl9f bGFzdCA9IF9fdmFsOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNz IF9UcD4KaW5saW5lIHZvaWQgX19saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmly c3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0 LCBfVHAqKSB7CiAgX1RwIF9fdmFsID0gKl9fbGFzdDsKICBpZiAoX192YWwgPCAqX19maXJzdCkg ewogICAgY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCArIDEpOwogICAgKl9f Zmlyc3QgPSBfX3ZhbDsKICB9CiAgZWxzZQogICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChf X2xhc3QsIF9fdmFsKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFz cyBfVHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgdm9pZCBfX2xpbmVhcl9pbnNlcnQoX1JhbmRv bUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9t QWNjZXNzSXRlciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29tcCkgewogIF9UcCBfX3ZhbCA9 ICpfX2xhc3Q7CiAgaWYgKF9fY29tcChfX3ZhbCwgKl9fZmlyc3QpKSB7CiAgICBjb3B5X2JhY2t3 YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0ICsgMSk7CiAgICAqX19maXJzdCA9IF9fdmFsOwog IH0KICBlbHNlCiAgICBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9fbGFzdCwgX192YWwsIF9f Y29tcCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4Kdm9pZCBfX2luc2Vy dGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9f bGFzdCkgewogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOyAKICBmb3IgKF9SYW5kb21B Y2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKICAgIF9f bGluZWFyX2luc2VydChfX2ZpcnN0LCBfX2ksIF9fdmFsdWVfdHlwZSggX19maXJzdCApICk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+CnZvaWQg X19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAg ICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKICBp ZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9f aSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKICAgIF9fbGluZWFyX2luc2Vy dChfX2ZpcnN0LCBfX2ksIF9fdmFsdWVfdHlwZSggX19maXJzdCApICwgX19jb21wKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHA+CnZvaWQgX191bmd1YXJk ZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9U cCopIHsKICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xh c3Q7ICsrX19pKQogICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2ksIF9UcCgqX19pKSk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KaW5saW5lIHZvaWQgX191bmd1 YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KSB7CiAgX191 bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV90eXBl KCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFz cyBfVHAsIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0X2F1 eChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfVHAqLCBfQ29tcGFyZSBfX2NvbXApIHsKICBmb3IgKF9SYW5kb21BY2Nl c3NJdGVyIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQogICAgX191bmd1YXJk ZWRfbGluZWFyX2luc2VydChfX2ksIF9UcCgqX19pKSwgX19jb21wKTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgX191bmd1 YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7 CiAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1 ZV90eXBlKCBfX2ZpcnN0ICkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Nv bXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CnZvaWQgX19maW5hbF9p bnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkgewogIGlmIChfX2xhc3QgLSBf X2ZpcnN0ID4gX19zdGxfdGhyZXNob2xkKSB7CiAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3Qs IF9fZmlyc3QgKyBfX3N0bF90aHJlc2hvbGQpOwogICAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3Nv cnQoX19maXJzdCArIF9fc3RsX3RocmVzaG9sZCwgX19sYXN0KTsKICB9CiAgZWxzZQogICAgX19p bnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRv bUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQo X1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBf UmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkgewogIGlmIChfX2xhc3Qg LSBfX2ZpcnN0ID4gX19zdGxfdGhyZXNob2xkKSB7CiAgICBfX2luc2VydGlvbl9zb3J0KF9fZmly c3QsIF9fZmlyc3QgKyBfX3N0bF90aHJlc2hvbGQsIF9fY29tcCk7CiAgICBfX3VuZ3VhcmRlZF9p bnNlcnRpb25fc29ydChfX2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkLCBfX2xhc3QsIF9fY29tcCk7 CiAgfQogIGVsc2UKICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXAp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CmlubGluZSBfU2l6ZSBfX2xnKF9TaXplIF9fbikg ewogIF9TaXplIF9fazsKICBmb3IgKF9fayA9IDA7IF9fbiAhPSAxOyBfX24gPj49IDEpICsrX19r OwogIHJldHVybiBfX2s7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xh c3MgX1RwLCBjbGFzcyBfU2l6ZT4Kdm9pZCBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJ dGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xh c3QsIF9UcCosCiAgICAgICAgICAgICAgICAgICAgICBfU2l6ZSBfX2RlcHRoX2xpbWl0KQp7CiAg d2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX3N0bF90aHJlc2hvbGQpIHsKICAgIGlmIChfX2Rl cHRoX2xpbWl0ID09IDApIHsKICAgICAgcGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19s YXN0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLS1fX2RlcHRoX2xpbWl0OwogICAgX1JhbmRv bUFjY2Vzc0l0ZXIgX19jdXQgPQogICAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCwg X19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKF9fbWVkaWFuKCpfX2ZpcnN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19maXJzdCArIChf X2xhc3QgLSBfX2ZpcnN0KS8yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqKF9fbGFzdCAtIDEpKSkpOwogICAgX19pbnRyb3NvcnRfbG9vcChfX2N1dCwgX19sYXN0 LCAoX1RwKikgMCwgX19kZXB0aF9saW1pdCk7CiAgICBfX2xhc3QgPSBfX2N1dDsKICB9Cn0KCnRl bXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfU2l6ZSwg Y2xhc3MgX0NvbXBhcmU+CnZvaWQgX19pbnRyb3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlciBf X2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBf VHAqLAogICAgICAgICAgICAgICAgICAgICAgX1NpemUgX19kZXB0aF9saW1pdCwgX0NvbXBhcmUg X19jb21wKQp7CiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX3N0bF90aHJlc2hvbGQpIHsK ICAgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApIHsKICAgICAgcGFydGlhbF9zb3J0KF9fZmlyc3Qs IF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOwogICAgICByZXR1cm47CiAgICB9CiAgICAtLV9fZGVw dGhfbGltaXQ7CiAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9CiAgICAgIF9fdW5ndWFyZGVk X3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBf VHAoX19tZWRpYW4oKl9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKihfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICooX19sYXN0IC0gMSksIF9fY29tcCkpLAogICAgICAg X19jb21wKTsKICAgIF9faW50cm9zb3J0X2xvb3AoX19jdXQsIF9fbGFzdCwgKF9UcCopIDAsIF9f ZGVwdGhfbGltaXQsIF9fY29tcCk7CiAgICBfX2xhc3QgPSBfX2N1dDsKICB9Cn0KCnRlbXBsYXRl IDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KaW5saW5lIHZvaWQgc29ydChfUmFuZG9tQWNjZXNz SXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpIHsKICBpZiAoX19maXJzdCAh PSBfX2xhc3QpIHsKICAgIF9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSAsCiAgICAgICAgICAgICAgICAg ICAgIF9fbGcoX19sYXN0IC0gX19maXJzdCkgKiAyKTsKICAgIF9fZmluYWxfaW5zZXJ0aW9uX3Nv cnQoX19maXJzdCwgX19sYXN0KTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNz SXRlciwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSB2b2lkIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIg X19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgIF9Db21w YXJlIF9fY29tcCkgewogIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgX19pbnRyb3NvcnRf bG9vcChfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSgg X19maXJzdCApICwKICAgICAgICAgICAgICAgICAgICAgX19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAq IDIsCiAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgICBfX2ZpbmFsX2luc2VydGlvbl9z b3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKICB9Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBf UmFuZG9tQWNjZXNzSXRlcj4Kdm9pZCBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vz c0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0 ZXIgX19sYXN0KSB7CiAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAxNSkgewogICAgX19pbnNlcnRp b25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOwogICAgcmV0dXJuOwogIH0KICBfUmFuZG9tQWNjZXNz SXRlciBfX21pZGRsZSA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkgLyAyOwogIF9faW5w bGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX21pZGRsZSk7CiAgX19pbnBsYWNlX3N0YWJsZV9z b3J0KF9fbWlkZGxlLCBfX2xhc3QpOwogIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwg X19taWRkbGUsIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlkZGxlIC0gX19m aXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGFzdCAtIF9fbWlkZGxlKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4Kdm9pZCBfX2lu cGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXAp IHsKICBpZiAoX19sYXN0IC0gX19maXJzdCA8IDE1KSB7CiAgICBfX2luc2VydGlvbl9zb3J0KF9f Zmlyc3QsIF9fbGFzdCwgX19jb21wKTsKICAgIHJldHVybjsKICB9CiAgX1JhbmRvbUFjY2Vzc0l0 ZXIgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKICBfX2lucGxh Y2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CiAgX19pbnBsYWNlX3N0 YWJsZV9zb3J0KF9fbWlkZGxlLCBfX2xhc3QsIF9fY29tcCk7CiAgX19tZXJnZV93aXRob3V0X2J1 ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAg X19taWRkbGUgLSBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX19sYXN0IC0gX19t aWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JhbmRvbUFjY2Vzc0l0ZXIxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjIsCiAgICAgICAg ICBjbGFzcyBfRGlzdGFuY2U+CnZvaWQgX19tZXJnZV9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0 ZXIxIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIxIF9f bGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIyIF9fcmVzdWx0 LCBfRGlzdGFuY2UgX19zdGVwX3NpemUpIHsKICBfRGlzdGFuY2UgX190d29fc3RlcCA9IDIgKiBf X3N0ZXBfc2l6ZTsKCiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX190d29fc3RlcCkgewog ICAgX19yZXN1bHQgPSBtZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCiAgICAg ICAgICAgICAgICAgICAgIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwgX19maXJzdCArIF9fdHdvX3N0 ZXAsCiAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0KTsKICAgIF9fZmlyc3QgKz0gX190d29f c3RlcDsKICB9CgogIF9fc3RlcF9zaXplID0gbWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0 KSwgX19zdGVwX3NpemUpOwogIG1lcmdlKF9fZmlyc3QsIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwg X19maXJzdCArIF9fc3RlcF9zaXplLCBfX2xhc3QsCiAgICAgICAgX19yZXN1bHQpOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIxLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjIs CiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fbWVyZ2Vf c29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyMSBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAg ICAgIF9SYW5kb21BY2Nlc3NJdGVyMSBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgIF9S YW5kb21BY2Nlc3NJdGVyMiBfX3Jlc3VsdCwgX0Rpc3RhbmNlIF9fc3RlcF9zaXplLAogICAgICAg ICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewogIF9EaXN0YW5jZSBfX3R3b19zdGVw ID0gMiAqIF9fc3RlcF9zaXplOwoKICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX3R3b19z dGVwKSB7CiAgICBfX3Jlc3VsdCA9IG1lcmdlKF9fZmlyc3QsIF9fZmlyc3QgKyBfX3N0ZXBfc2l6 ZSwKICAgICAgICAgICAgICAgICAgICAgX19maXJzdCArIF9fc3RlcF9zaXplLCBfX2ZpcnN0ICsg X190d29fc3RlcCwKICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQsCiAgICAgICAgICAgICAg ICAgICAgIF9fY29tcCk7CiAgICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7CiAgfQogIF9fc3RlcF9z aXplID0gbWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwgX19zdGVwX3NpemUpOwoKICBt ZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCiAgICAgICAgX19maXJzdCArIF9f c3RlcF9zaXplLCBfX2xhc3QsCiAgICAgICAgX19yZXN1bHQsCiAgICAgICAgX19jb21wKTsKfQoK Y29uc3QgaW50IF9fc3RsX2NodW5rX3NpemUgPSA3OwogICAgICAgIAp0ZW1wbGF0ZSA8Y2xhc3Mg X1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4Kdm9pZCBfX2NodW5rX2luc2VydGlv bl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfRGlzdGFuY2UgX19jaHVua19zaXplKQp7 CiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX19jaHVua19zaXplKSB7CiAgICBfX2luc2Vy dGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUpOwogICAgX19maXJzdCAr PSBfX2NodW5rX3NpemU7CiAgfQogIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNs YXNzIF9Db21wYXJlPgp2b2lkIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0 ZXIgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRl ciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19jaHVua19z aXplLCBfQ29tcGFyZSBfX2NvbXApCnsKICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2No dW5rX3NpemUpIHsKICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19maXJzdCArIF9fY2h1 bmtfc2l6ZSwgX19jb21wKTsKICAgIF9fZmlyc3QgKz0gX19jaHVua19zaXplOwogIH0KICBfX2lu c2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX0Rpc3RhbmNlPgp2b2lk IF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlKikg ewogIF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgX1BvaW50ZXIgX19idWZm ZXJfbGFzdCA9IF9fYnVmZmVyICsgX19sZW47CgogIF9EaXN0YW5jZSBfX3N0ZXBfc2l6ZSA9IF9f c3RsX2NodW5rX3NpemU7CiAgX19jaHVua19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3Qs IF9fc3RlcF9zaXplKTsKCiAgd2hpbGUgKF9fc3RlcF9zaXplIDwgX19sZW4pIHsKICAgIF9fbWVy Z2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsIF9fc3RlcF9zaXplKTsKICAg IF9fc3RlcF9zaXplICo9IDI7CiAgICBfX21lcmdlX3NvcnRfbG9vcChfX2J1ZmZlciwgX19idWZm ZXJfbGFzdCwgX19maXJzdCwgX19zdGVwX3NpemUpOwogICAgX19zdGVwX3NpemUgKj0gMjsKICB9 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNs YXNzIF9EaXN0YW5jZSwKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fbWVyZ2Vfc29y dF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfUG9pbnRlciBfX2J1ZmZl ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgX0NvbXBhcmUgX19j b21wKSB7CiAgX0Rpc3RhbmNlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKICBfUG9pbnRlciBf X2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKCiAgX0Rpc3RhbmNlIF9fc3RlcF9zaXpl ID0gX19zdGxfY2h1bmtfc2l6ZTsKICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9f bGFzdCwgX19zdGVwX3NpemUsIF9fY29tcCk7CgogIHdoaWxlIChfX3N0ZXBfc2l6ZSA8IF9fbGVu KSB7CiAgICBfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLCBfX3N0 ZXBfc2l6ZSwgX19jb21wKTsKICAgIF9fc3RlcF9zaXplICo9IDI7CiAgICBfX21lcmdlX3NvcnRf bG9vcChfX2J1ZmZlciwgX19idWZmZXJfbGFzdCwgX19maXJzdCwgX19zdGVwX3NpemUsIF9fY29t cCk7CiAgICBfX3N0ZXBfc2l6ZSAqPSAyOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX0Rpc3RhbmNlPgp2b2lkIF9fc3RhYmxl X3NvcnRfYWRhcHRpdmUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Qb2ludGVyIF9fYnVmZmVy LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpIHsK ICBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKICBfUmFuZG9t QWNjZXNzSXRlciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKICBpZiAoX19sZW4gPiBfX2J1 ZmZlcl9zaXplKSB7CiAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxl LCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CiAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9f bWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKICB9CiAgZWxzZSB7CiAg ICBfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyLCAo X0Rpc3RhbmNlKikwKTsKICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX21pZGRsZSwgX19s YXN0LCBfX2J1ZmZlciwgKF9EaXN0YW5jZSopMCk7CiAgfQogIF9fbWVyZ2VfYWRhcHRpdmUoX19m aXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX0Rpc3RhbmNlKF9fbWlkZGxlIC0gX19maXJzdCksIAog ICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fbWlkZGxlKSwgX19idWZmZXIs IF9fYnVmZmVyX3NpemUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNs YXNzIF9Qb2ludGVyLCBjbGFzcyBfRGlzdGFuY2UsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmU+ CnZvaWQgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1Bv aW50ZXIgX19idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19i dWZmZXJfc2l6ZSwgX0NvbXBhcmUgX19jb21wKSB7CiAgX0Rpc3RhbmNlIF9fbGVuID0gKF9fbGFz dCAtIF9fZmlyc3QgKyAxKSAvIDI7CiAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUgPSBfX2Zp cnN0ICsgX19sZW47CiAgaWYgKF9fbGVuID4gX19idWZmZXJfc2l6ZSkgewogICAgX19zdGFibGVf c29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUs IAogICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwogICAgX19zdGFibGVfc29ydF9h ZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgfQogIGVsc2UgewogICAgX19tZXJnZV9z b3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgKF9EaXN0YW5jZSop MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgICBfX21lcmdlX3Nv cnRfd2l0aF9idWZmZXIoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIsIChfRGlzdGFuY2UqKTAs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwogIH0KICBfX21lcmdlX2Fk YXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9EaXN0YW5jZShfX21pZGRsZSAtIF9f Zmlyc3QpLCAKICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2xhc3QgLSBfX21pZGRsZSks IF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgX19jb21wKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4KaW5saW5lIHZvaWQgX19zdGFibGVfc29ydF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19m aXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19s YXN0LCBfVHAqLCBfRGlzdGFuY2UqKSB7CiAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vz c0l0ZXIsIF9UcD4gYnVmKF9fZmlyc3QsIF9fbGFzdCk7CiAgaWYgKGJ1Zi5iZWdpbigpID09IDAp CiAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0KTsKICBlbHNlIAogICAg X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIGJ1Zi5iZWdpbigpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UoYnVmLnNpemUoKSkpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlLCBj bGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgX19zdGFibGVfc29ydF9hdXgoX1JhbmRvbUFjY2Vz c0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vz c0l0ZXIgX19sYXN0LCBfVHAqLCBfRGlzdGFuY2UqLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfQ29tcGFyZSBfX2NvbXApIHsKICBfVGVtcG9yYXJ5X2J1ZmZlcjxfUmFuZG9tQWNjZXNz SXRlciwgX1RwPiBidWYoX19maXJzdCwgX19sYXN0KTsKICBpZiAoYnVmLmJlZ2luKCkgPT0gMCkK ICAgIF9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CiAgZWxz ZSAKICAgIF9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBidWYuYmVnaW4o KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKGJ1Zi5zaXplKCkpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRv bUFjY2Vzc0l0ZXI+CmlubGluZSB2b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9f Zmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkg ewogIF9fc3RhYmxlX3NvcnRfYXV4KF9fZmlyc3QsIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSAsCiAgICAgICAgICAgICAgICAgICAgX19kaXN0YW5j ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVy LCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0 ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19s YXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKICBfX3N0YWJsZV9zb3J0X2F1eChfX2ZpcnN0LCBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgLAogICAgICAg ICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZSggX19maXJzdCApICwgCiAgICAgICAgICAgICAg ICAgICAgX19jb21wKTsKfQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBj bGFzcyBfVHA+CnZvaWQgX19wYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwg X1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFj Y2Vzc0l0ZXIgX19sYXN0LCBfVHAqKSB7CiAgbWFrZV9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlKTsK ICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fbWlkZGxlOyBfX2kgPCBfX2xhc3Q7ICsr X19pKQogICAgaWYgKCpfX2kgPCAqX19maXJzdCkgCiAgICAgIF9fcG9wX2hlYXAoX19maXJzdCwg X19taWRkbGUsIF9faSwgX1RwKCpfX2kpLAogICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlw ZSggX19maXJzdCApICk7CiAgc29ydF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgdm9pZCBwYXJ0aWFsX3NvcnQoX1Jh bmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21B Y2Nlc3NJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vz c0l0ZXIgX19sYXN0KSB7CiAgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFz dCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fcGFydGlhbF9zb3J0 KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAog ICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0NvbXBh cmUgX19jb21wKSB7CiAgbWFrZV9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOwogIGZv ciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19taWRkbGU7IF9faSA8IF9fbGFzdDsgKytfX2kp CiAgICBpZiAoX19jb21wKCpfX2ksICpfX2ZpcnN0KSkKICAgICAgX19wb3BfaGVhcChfX2ZpcnN0 LCBfX21pZGRsZSwgX19pLCBfVHAoKl9faSksIF9fY29tcCwKICAgICAgICAgICAgICAgICBfX2Rp c3RhbmNlX3R5cGUoIF9fZmlyc3QgKSApOwogIHNvcnRfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwg X19jb21wKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29t cGFyZT4KaW5saW5lIHZvaWQgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKICAg ICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUg X19jb21wKSB7CiAgX19wYXJ0aWFsX3NvcnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX192 YWx1ZV90eXBlKCBfX2ZpcnN0ICkgLCBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0 SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKICAgICAgICAg IGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vzc0l0ZXIgX19wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJ dGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgX1RwKikgewog IGlmIChfX3Jlc3VsdF9maXJzdCA9PSBfX3Jlc3VsdF9sYXN0KSByZXR1cm4gX19yZXN1bHRfbGFz dDsKICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9yZWFsX2xhc3QgPSBfX3Jlc3VsdF9maXJz dDsKICB3aGlsZShfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3Jlc3VsdF9yZWFsX2xhc3QgIT0gX19y ZXN1bHRfbGFzdCkgewogICAgKl9fcmVzdWx0X3JlYWxfbGFzdCA9ICpfX2ZpcnN0OwogICAgKytf X3Jlc3VsdF9yZWFsX2xhc3Q7CiAgICArK19fZmlyc3Q7CiAgfQogIG1ha2VfaGVhcChfX3Jlc3Vs dF9maXJzdCwgX19yZXN1bHRfcmVhbF9sYXN0KTsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3Qp IHsKICAgIGlmICgqX19maXJzdCA8ICpfX3Jlc3VsdF9maXJzdCkgCiAgICAgIF9fYWRqdXN0X2hl YXAoX19yZXN1bHRfZmlyc3QsIF9EaXN0YW5jZSgwKSwKICAgICAgICAgICAgICAgICAgICBfRGlz dGFuY2UoX19yZXN1bHRfcmVhbF9sYXN0IC0gX19yZXN1bHRfZmlyc3QpLAogICAgICAgICAgICAg ICAgICAgIF9UcCgqX19maXJzdCkpOwogICAgKytfX2ZpcnN0OwogIH0KICBzb3J0X2hlYXAoX19y ZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCk7CiAgcmV0dXJuIF9fcmVzdWx0X3JlYWxf bGFzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJ dGVyPgppbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXIKcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRl ciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgX1JhbmRvbUFj Y2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3QsCiAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJ dGVyIF9fcmVzdWx0X2xhc3QpIHsKICByZXR1cm4gX19wYXJ0aWFsX3NvcnRfY29weShfX2ZpcnN0 LCBfX2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0LCAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoIF9fcmVzdWx0X2ZpcnN0ICkgLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSggX19maXJzdCApICk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Nv bXBhcmUsCiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vz c0l0ZXIgX19wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1 bHRfZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRv bUFjY2Vzc0l0ZXIgX19yZXN1bHRfbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9EaXN0YW5jZSosIF9UcCopIHsKICBpZiAoX19y ZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkgcmV0dXJuIF9fcmVzdWx0X2xhc3Q7CiAgX1Jh bmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfcmVhbF9sYXN0ID0gX19yZXN1bHRfZmlyc3Q7CiAgd2hp bGUoX19maXJzdCAhPSBfX2xhc3QgJiYgX19yZXN1bHRfcmVhbF9sYXN0ICE9IF9fcmVzdWx0X2xh c3QpIHsKICAgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKICAgICsrX19yZXN1bHRf cmVhbF9sYXN0OwogICAgKytfX2ZpcnN0OwogIH0KICBtYWtlX2hlYXAoX19yZXN1bHRfZmlyc3Qs IF9fcmVzdWx0X3JlYWxfbGFzdCwgX19jb21wKTsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3Qp IHsKICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdF9maXJzdCkpCiAgICAgIF9fYWRq dXN0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9EaXN0YW5jZSgwKSwKICAgICAgICAgICAgICAgICAg ICBfRGlzdGFuY2UoX19yZXN1bHRfcmVhbF9sYXN0IC0gX19yZXN1bHRfZmlyc3QpLAogICAgICAg ICAgICAgICAgICAgIF9UcCgqX19maXJzdCksCiAgICAgICAgICAgICAgICAgICAgX19jb21wKTsK ICAgICsrX19maXJzdDsKICB9CiAgc29ydF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9y ZWFsX2xhc3QsIF9fY29tcCk7CiAgcmV0dXJuIF9fcmVzdWx0X3JlYWxfbGFzdDsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29t cGFyZT4KaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyCnBhcnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0 ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgIF9SYW5kb21B Y2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LAogICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNz SXRlciBfX3Jlc3VsdF9sYXN0LCBfQ29tcGFyZSBfX2NvbXApIHsKICByZXR1cm4gX19wYXJ0aWFs X3NvcnRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoIF9fcmVzdWx0X2ZpcnN0ICkgLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSggX19maXJzdCApICk7Cn0KCiAKCnRlbXBs YXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgp2b2lkIF9fbnRoX2VsZW1l bnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCiAg ICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCopIHsKICB3aGls ZSAoX19sYXN0IC0gX19maXJzdCA+IDMpIHsKICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fY3V0ID0K ICAgICAgX191bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9UcChfX21lZGlhbigqX19maXJzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqKF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkvMiks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2xhc3QgLSAxKSkp KTsKICAgIGlmIChfX2N1dCA8PSBfX250aCkKICAgICAgX19maXJzdCA9IF9fY3V0OwogICAgZWxz ZSAKICAgICAgX19sYXN0ID0gX19jdXQ7CiAgfQogIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwg X19sYXN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgdm9p ZCBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRl ciBfX250aCwKICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0 KSB7CiAgX19udGhfZWxlbWVudChfX2ZpcnN0LCBfX250aCwgX19sYXN0LCBfX3ZhbHVlX3R5cGUo IF9fZmlyc3QgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNz IF9UcCwgY2xhc3MgX0NvbXBhcmU+CnZvaWQgX19udGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRl ciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250aCwKICAgICAgICAgICAgICAgICAgIF9S YW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKiwgX0NvbXBhcmUgX19jb21wKSB7CiAgd2hpbGUg KF9fbGFzdCAtIF9fZmlyc3QgPiAzKSB7CiAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9CiAg ICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfVHAoX19tZWRpYW4oKl9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKihfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLCAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fbGFzdCAtIDEpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCkpLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKICAgIGlmIChfX2N1dCA8PSBfX250aCkKICAg ICAgX19maXJzdCA9IF9fY3V0OwogICAgZWxzZSAKICAgICAgX19sYXN0ID0gX19jdXQ7CiAgfQog IF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgdm9pZCBudGhf ZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX250 aCwKICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9f Y29tcCkgewogIF9fbnRoX2VsZW1lbnQoX19maXJzdCwgX19udGgsIF9fbGFzdCwgX192YWx1ZV90 eXBlKCBfX2ZpcnN0ICkgLCBfX2NvbXApOwp9CgoKIAoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJk SXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Cl9Gb3J3YXJkSXRlciBfX2xvd2VyX2Jv dW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfRGlzdGFuY2UqKSAKewogIF9EaXN0 YW5jZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7CiAgX0Rp c3RhbmNlIF9faGFsZjsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGU7CgogIHdoaWxlIChfX2xlbiA+ IDApIHsKICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CiAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CiAg ICBhZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOwogICAgaWYgKCpfX21pZGRsZSA8IF9fdmFsKSB7 CiAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKICAgICAgKytfX2ZpcnN0OwogICAgICBfX2xlbiA9 IF9fbGVuIC0gX19oYWxmIC0gMTsKICAgIH0KICAgIGVsc2UKICAgICAgX19sZW4gPSBfX2hhbGY7 CiAgfQogIHJldHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBj bGFzcyBfVHA+CmlubGluZSBfRm9yd2FyZEl0ZXIgbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9f Zmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgX1RwJiBfX3ZhbCkgewogIHJldHVybiBfX2xvd2VyX2JvdW5kKF9fZmlyc3Qs IF9fbGFzdCwgX192YWwsCiAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKCBf X2ZpcnN0ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBj bGFzcyBfQ29tcGFyZSwgY2xhc3MgX0Rpc3RhbmNlPgpfRm9yd2FyZEl0ZXIgX19sb3dlcl9ib3Vu ZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wLCBfRGlz dGFuY2UqKQp7CiAgX0Rpc3RhbmNlIF9fbGVuID0gMDsKICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xh c3QsIF9fbGVuKTsKICBfRGlzdGFuY2UgX19oYWxmOwogIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsK CiAgd2hpbGUgKF9fbGVuID4gMCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlk ZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoX19j b21wKCpfX21pZGRsZSwgX192YWwpKSB7CiAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKICAgICAg KytfX2ZpcnN0OwogICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKICAgIH0KICAgIGVs c2UKICAgICAgX19sZW4gPSBfX2hhbGY7CiAgfQogIHJldHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUg X0ZvcndhcmRJdGVyIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192 YWwsIF9Db21wYXJlIF9fY29tcCkgewogIHJldHVybiBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9f bGFzdCwgX192YWwsIF9fY29tcCwKICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3RhbmNlX3R5 cGUoIF9fZmlyc3QgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBf VHAsIGNsYXNzIF9EaXN0YW5jZT4KX0ZvcndhcmRJdGVyIF9fdXBwZXJfYm91bmQoX0ZvcndhcmRJ dGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNvbnN0IF9UcCYgX192YWwsIF9EaXN0YW5jZSopCnsKICBfRGlzdGFuY2UgX19sZW4gPSAw OwogIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwogIF9EaXN0YW5jZSBfX2hhbGY7 CiAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlOwoKICB3aGlsZSAoX19sZW4gPiAwKSB7CiAgICBfX2hh bGYgPSBfX2xlbiA+PiAxOwogICAgX19taWRkbGUgPSBfX2ZpcnN0OwogICAgYWR2YW5jZShfX21p ZGRsZSwgX19oYWxmKTsKICAgIGlmIChfX3ZhbCA8ICpfX21pZGRsZSkKICAgICAgX19sZW4gPSBf X2hhbGY7CiAgICBlbHNlIHsKICAgICAgX19maXJzdCA9IF9fbWlkZGxlOwogICAgICArK19fZmly c3Q7CiAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwogICAgfQogIH0KICByZXR1cm4g X19maXJzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxp bmUgX0ZvcndhcmRJdGVyIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2Fy ZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYg X192YWwpIHsKICByZXR1cm4gX191cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAog ICAgICAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZSggX19maXJzdCApICk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNs YXNzIF9EaXN0YW5jZT4KX0ZvcndhcmRJdGVyIF9fdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyIF9f Zmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlKikKewogIF9EaXN0YW5j ZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7CiAgX0Rpc3Rh bmNlIF9faGFsZjsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGU7CgogIHdoaWxlIChfX2xlbiA+IDAp IHsKICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CiAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CiAgICBh ZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOwogICAgaWYgKF9fY29tcChfX3ZhbCwgKl9fbWlkZGxl KSkKICAgICAgX19sZW4gPSBfX2hhbGY7CiAgICBlbHNlIHsKICAgICAgX19maXJzdCA9IF9fbWlk ZGxlOwogICAgICArK19fZmlyc3Q7CiAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwog ICAgfQogIH0KICByZXR1cm4gX19maXJzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRl ciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIF9Gb3J3YXJkSXRlciB1cHBlcl9i b3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXAp IHsKICByZXR1cm4gX191cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAs CiAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+ CnBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+Cl9fZXF1YWxfcmFuZ2UoX0ZvcndhcmRJ dGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWwsCiAgICAg ICAgICAgICAgX0Rpc3RhbmNlKikKewogIF9EaXN0YW5jZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2Uo X19maXJzdCwgX19sYXN0LCBfX2xlbik7CiAgX0Rpc3RhbmNlIF9faGFsZjsKICBfRm9yd2FyZEl0 ZXIgX19taWRkbGUsIF9fbGVmdCwgX19yaWdodDsKCiAgd2hpbGUgKF9fbGVuID4gMCkgewogICAg X19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlkZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2Uo X19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoKl9fbWlkZGxlIDwgX192YWwpIHsKICAgICAgX19m aXJzdCA9IF9fbWlkZGxlOwogICAgICArK19fZmlyc3Q7CiAgICAgIF9fbGVuID0gX19sZW4gLSBf X2hhbGYgLSAxOwogICAgfQogICAgZWxzZSBpZiAoX192YWwgPCAqX19taWRkbGUpCiAgICAgIF9f bGVuID0gX19oYWxmOwogICAgZWxzZSB7CiAgICAgIF9fbGVmdCA9IGxvd2VyX2JvdW5kKF9fZmly c3QsIF9fbWlkZGxlLCBfX3ZhbCk7CiAgICAgIGFkdmFuY2UoX19maXJzdCwgX19sZW4pOwogICAg ICBfX3JpZ2h0ID0gdXBwZXJfYm91bmQoKytfX21pZGRsZSwgX19maXJzdCwgX192YWwpOwogICAg ICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX3JpZ2h0 KTsKICAgIH0KICB9CiAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9f Zmlyc3QsIF9fZmlyc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBf VHA+CmlubGluZSBwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPgplcXVhbF9yYW5nZShf Rm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3Zh bCkgewogIHJldHVybiBfX2VxdWFsX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCiAgICAg ICAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0Rpc3RhbmNlPgpwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPgpfX2VxdWFsX3Jhbmdl KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9f dmFsLAogICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlKikKewogIF9EaXN0 YW5jZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7CiAgX0Rp c3RhbmNlIF9faGFsZjsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGUsIF9fbGVmdCwgX19yaWdodDsK CiAgd2hpbGUgKF9fbGVuID4gMCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlk ZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoX19j b21wKCpfX21pZGRsZSwgX192YWwpKSB7CiAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKICAgICAg KytfX2ZpcnN0OwogICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKICAgIH0KICAgIGVs c2UgaWYgKF9fY29tcChfX3ZhbCwgKl9fbWlkZGxlKSkKICAgICAgX19sZW4gPSBfX2hhbGY7CiAg ICBlbHNlIHsKICAgICAgX19sZWZ0ID0gbG93ZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsIF9f dmFsLCBfX2NvbXApOwogICAgICBhZHZhbmNlKF9fZmlyc3QsIF9fbGVuKTsKICAgICAgX19yaWdo dCA9IHVwcGVyX2JvdW5kKCsrX19taWRkbGUsIF9fZmlyc3QsIF9fdmFsLCBfX2NvbXApOwogICAg ICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4oX19sZWZ0LCBfX3JpZ2h0 KTsKICAgIH0KICB9CiAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9f Zmlyc3QsIF9fZmlyc3QpOwp9ICAgICAgICAgICAKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0 ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSBwYWlyPF9Gb3J3YXJkSXRlciwg X0ZvcndhcmRJdGVyPgplcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJ dGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKICAgICAgICAgICAgX0NvbXBhcmUgX19jb21w KSB7CiAgcmV0dXJuIF9fZXF1YWxfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwgX19jb21w LAogICAgICAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZSggX19maXJzdCApICk7Cn0g Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CmJvb2wgYmluYXJ5X3Nl YXJjaChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpIHsKICBfRm9yd2FyZEl0ZXIgX19pID0gbG93ZXJf Ym91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CiAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYg IShfX3ZhbCA8ICpfX2kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBf VHAsIGNsYXNzIF9Db21wYXJlPgpib29sIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyIF9fZmly c3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9f dmFsLAogICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CiAgX0ZvcndhcmRJdGVy IF9faSA9IGxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCk7CiAgcmV0 dXJuIF9faSAhPSBfX2xhc3QgJiYgIV9fY29tcChfX3ZhbCwgKl9faSk7Cn0KCiAKCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVy PgpfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19s YXN0MSwKICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIy IF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CiAgd2hp bGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewogICAgaWYg KCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CiAg ICAgICsrX19maXJzdDI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgKl9fcmVzdWx0ID0gKl9fZmly c3QxOwogICAgICArK19fZmlyc3QxOwogICAgfQogICAgKytfX3Jlc3VsdDsKICB9CiAgcmV0dXJu IGNvcHkoX19maXJzdDIsIF9fbGFzdDIsIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0 KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNs YXNzIF9PdXRwdXRJdGVyLAogICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Cl9PdXRwdXRJdGVyIG1l cmdlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAg ICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKICAgICAg ICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkgewogIHdo aWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKICAgIGlm IChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2Zp cnN0MjsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICAgIGVsc2UgewogICAgICAqX19yZXN1bHQg PSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICArK19fcmVzdWx0OwogIH0K ICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwg X19yZXN1bHQpKTsKfQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xh c3MgX0Rpc3RhbmNlPgp2b2lkIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJ dGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0 ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0 ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwg X0Rpc3RhbmNlIF9fbGVuMikgewogIGlmIChfX2xlbjEgPT0gMCB8fCBfX2xlbjIgPT0gMCkKICAg IHJldHVybjsKICBpZiAoX19sZW4xICsgX19sZW4yID09IDIpIHsKICAgIGlmICgqX19taWRkbGUg PCAqX19maXJzdCkKICAgICAgaXRlcl9zd2FwKF9fZmlyc3QsIF9fbWlkZGxlKTsKICAgIHJldHVy bjsKICB9CiAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKICBfQmlk aXJlY3Rpb25hbEl0ZXIgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CiAgX0Rpc3RhbmNlIF9fbGVu MTEgPSAwOwogIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKICBpZiAoX19sZW4xID4gX19sZW4yKSB7 CiAgICBfX2xlbjExID0gX19sZW4xIC8gMjsKICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVu MTEpOwogICAgX19zZWNvbmRfY3V0ID0gbG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9f Zmlyc3RfY3V0KTsKICAgIGRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGVuMjIp OwogIH0KICBlbHNlIHsKICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOwogICAgYWR2YW5jZShfX3Nl Y29uZF9jdXQsIF9fbGVuMjIpOwogICAgX19maXJzdF9jdXQgPSB1cHBlcl9ib3VuZChfX2ZpcnN0 LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCk7CiAgICBkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0 X2N1dCwgX19sZW4xMSk7CiAgfQogIF9CaWRpcmVjdGlvbmFsSXRlciBfX25ld19taWRkbGUKICAg ID0gcm90YXRlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKICBfX21lcmdl X3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsCiAgICAg ICAgICAgICAgICAgICAgICAgICBfX2xlbjExLCBfX2xlbjIyKTsKICBfX21lcmdlX3dpdGhvdXRf YnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVuMSAtIF9fbGVu MTEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlbjIgLSBfX2xlbjIyKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29t cGFyZT4Kdm9pZCBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9CaWRpcmVjdGlvbmFsSXRlciBfX2Zp cnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlk ZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFz dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5j ZSBfX2xlbjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApIHsK ICBpZiAoX19sZW4xID09IDAgfHwgX19sZW4yID09IDApCiAgICByZXR1cm47CiAgaWYgKF9fbGVu MSArIF9fbGVuMiA9PSAyKSB7CiAgICBpZiAoX19jb21wKCpfX21pZGRsZSwgKl9fZmlyc3QpKQog ICAgICBpdGVyX3N3YXAoX19maXJzdCwgX19taWRkbGUpOwogICAgcmV0dXJuOwogIH0KICBfQmlk aXJlY3Rpb25hbEl0ZXIgX19maXJzdF9jdXQgPSBfX2ZpcnN0OwogIF9CaWRpcmVjdGlvbmFsSXRl ciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CiAgX0Rp c3RhbmNlIF9fbGVuMjIgPSAwOwogIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKICAgIF9fbGVuMTEg PSBfX2xlbjEgLyAyOwogICAgYWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CiAgICBfX3Nl Y29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsIF9f Y29tcCk7CiAgICBkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKICB9 CiAgZWxzZSB7CiAgICBfX2xlbjIyID0gX19sZW4yIC8gMjsKICAgIGFkdmFuY2UoX19zZWNvbmRf Y3V0LCBfX2xlbjIyKTsKICAgIF9fZmlyc3RfY3V0ID0gdXBwZXJfYm91bmQoX19maXJzdCwgX19t aWRkbGUsICpfX3NlY29uZF9jdXQsIF9fY29tcCk7CiAgICBkaXN0YW5jZShfX2ZpcnN0LCBfX2Zp cnN0X2N1dCwgX19sZW4xMSk7CiAgfQogIF9CaWRpcmVjdGlvbmFsSXRlciBfX25ld19taWRkbGUK ICAgID0gcm90YXRlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKICBfX21l cmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsIF9f bGVuMTEsIF9fbGVuMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwogIF9fbWVy Z2Vfd2l0aG91dF9idWZmZXIoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwgX19s ZW4xIC0gX19sZW4xMSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVuMiAtIF9fbGVuMjIs IF9fY29tcCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBf QmlkaXJlY3Rpb25hbEl0ZXIyLAogICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgpfQmlkaXJlY3Rp b25hbEl0ZXIxIF9fcm90YXRlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIx IF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVj dGlvbmFsSXRlcjEgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2J1ZmZlciwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkgewog IF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXJfZW5kOwogIGlmIChfX2xlbjEgPiBfX2xlbjIg JiYgX19sZW4yIDw9IF9fYnVmZmVyX3NpemUpIHsKICAgIF9fYnVmZmVyX2VuZCA9IGNvcHkoX19t aWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOwogICAgY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX21p ZGRsZSwgX19sYXN0KTsKICAgIHJldHVybiBjb3B5KF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9f Zmlyc3QpOwogIH0KICBlbHNlIGlmIChfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkgewogICAgX19i dWZmZXJfZW5kID0gY29weShfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOwogICAgY29weShf X21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0KTsKICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fYnVm ZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbGFzdCk7CiAgfQogIGVsc2UKICAgIHJldHVybiByb3RhdGUo X19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rp b25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAogICAgICAgICAgY2xhc3MgX0Jp ZGlyZWN0aW9uYWxJdGVyMz4KX0JpZGlyZWN0aW9uYWxJdGVyMyBfX21lcmdlX2JhY2t3YXJkKF9C aWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fZmlyc3QyLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2xhc3QyLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMyBf X3Jlc3VsdCkgewogIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQogICAgcmV0dXJuIGNvcHlfYmFj a3dhcmQoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKICBpZiAoX19maXJzdDIgPT0gX19s YXN0MikKICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3Vs dCk7CiAgLS1fX2xhc3QxOwogIC0tX19sYXN0MjsKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKCpf X2xhc3QyIDwgKl9fbGFzdDEpIHsKICAgICAgKi0tX19yZXN1bHQgPSAqX19sYXN0MTsKICAgICAg aWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCiAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19m aXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOwogICAgICAtLV9fbGFzdDE7CiAgICB9CiAgICBl bHNlIHsKICAgICAgKi0tX19yZXN1bHQgPSAqX19sYXN0MjsKICAgICAgaWYgKF9fZmlyc3QyID09 IF9fbGFzdDIpCiAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDEsICsrX19sYXN0 MSwgX19yZXN1bHQpOwogICAgICAtLV9fbGFzdDI7CiAgICB9CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKICAgICAg ICAgIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjMsIGNsYXNzIF9Db21wYXJlPgpfQmlkaXJlY3Rp b25hbEl0ZXIzIF9fbWVyZ2VfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEg X19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlv bmFsSXRlcjIgX19maXJzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf QmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIzIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CiAgaWYgKF9fZmlyc3QxID09IF9f bGFzdDEpCiAgICByZXR1cm4gY29weV9iYWNrd2FyZChfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1 bHQpOwogIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQogICAgcmV0dXJuIGNvcHlfYmFja3dhcmQo X19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKICAtLV9fbGFzdDE7CiAgLS1fX2xhc3QyOwog IHdoaWxlICh0cnVlKSB7CiAgICBpZiAoX19jb21wKCpfX2xhc3QyLCAqX19sYXN0MSkpIHsKICAg ICAgKi0tX19yZXN1bHQgPSAqX19sYXN0MTsKICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEp CiAgICAgICAgcmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1 bHQpOwogICAgICAtLV9fbGFzdDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgKi0tX19yZXN1bHQg PSAqX19sYXN0MjsKICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCiAgICAgICAgcmV0dXJu IGNvcHlfYmFja3dhcmQoX19maXJzdDEsICsrX19sYXN0MSwgX19yZXN1bHQpOwogICAgICAtLV9f bGFzdDI7CiAgICB9CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBj bGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Qb2ludGVyPgp2b2lkIF9fbWVyZ2VfYWRhcHRpdmUoX0Jp ZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rp b25hbEl0ZXIgX19taWRkbGUsIAogICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJ dGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0 YW5jZSBfX2xlbjIsCiAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rp c3RhbmNlIF9fYnVmZmVyX3NpemUpIHsKICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEg PD0gX19idWZmZXJfc2l6ZSkgewogICAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gY29weShfX2Zp cnN0LCBfX21pZGRsZSwgX19idWZmZXIpOwogICAgbWVyZ2UoX19idWZmZXIsIF9fYnVmZmVyX2Vu ZCwgX19taWRkbGUsIF9fbGFzdCwgX19maXJzdCk7CiAgfQogIGVsc2UgaWYgKF9fbGVuMiA8PSBf X2J1ZmZlcl9zaXplKSB7CiAgICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBjb3B5KF9fbWlkZGxl LCBfX2xhc3QsIF9fYnVmZmVyKTsKICAgIF9fbWVyZ2VfYmFja3dhcmQoX19maXJzdCwgX19taWRk bGUsIF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbGFzdCk7CiAgfQogIGVsc2UgewogICAgX0Jp ZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKICAgIF9CaWRpcmVjdGlvbmFs SXRlciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsK ICAgIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKICAg ICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CiAgICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVu MTEpOwogICAgICBfX3NlY29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAq X19maXJzdF9jdXQpOwogICAgICBkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xl bjIyKTsgCiAgICB9CiAgICBlbHNlIHsKICAgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CiAgICAg IGFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKICAgICAgX19maXJzdF9jdXQgPSB1cHBl cl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCk7CiAgICAgIGRpc3RhbmNl KF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKICAgIH0KICAgIF9CaWRpcmVjdGlvbmFs SXRlciBfX25ld19taWRkbGUgPQogICAgICBfX3JvdGF0ZV9hZGFwdGl2ZShfX2ZpcnN0X2N1dCwg X19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sZW4xIC0gX19sZW4xMSwKICAgICAgICAgICAgICAg ICAgICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOwogICAgX19tZXJnZV9h ZGFwdGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLAogICAg ICAgICAgICAgICAgICAgICBfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CiAgICBf X21lcmdlX2FkYXB0aXZlKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVu MSAtIF9fbGVuMTEsCiAgICAgICAgICAgICAgICAgICAgIF9fbGVuMiAtIF9fbGVuMjIsIF9fYnVm ZmVyLCBfX2J1ZmZlcl9zaXplKTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25h bEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1BvaW50ZXIsCiAgICAgICAgICBjbGFzcyBf Q29tcGFyZT4Kdm9pZCBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0 LCAKICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwgCiAg ICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAogICAgICAgICAg ICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKICAgICAgICAg ICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwK ICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewogIGlmIChfX2xlbjEgPD0g X19sZW4yICYmIF9fbGVuMSA8PSBfX2J1ZmZlcl9zaXplKSB7CiAgICBfUG9pbnRlciBfX2J1ZmZl cl9lbmQgPSBjb3B5KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CiAgICBtZXJnZShfX2J1 ZmZlciwgX19idWZmZXJfZW5kLCBfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0LCBfX2NvbXApOwog IH0KICBlbHNlIGlmIChfX2xlbjIgPD0gX19idWZmZXJfc2l6ZSkgewogICAgX1BvaW50ZXIgX19i dWZmZXJfZW5kID0gY29weShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CiAgICBfX21lcmdl X2JhY2t3YXJkKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgfQogIGVsc2UgewogICAgX0JpZGly ZWN0aW9uYWxJdGVyIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKICAgIF9CaWRpcmVjdGlvbmFsSXRl ciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKICAg IF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKICAgICAg X19sZW4xMSA9IF9fbGVuMSAvIDI7CiAgICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEp OwogICAgICBfX3NlY29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19m aXJzdF9jdXQsIF9fY29tcCk7CiAgICAgIGRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQs IF9fbGVuMjIpOyAgIAogICAgfQogICAgZWxzZSB7CiAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAy OwogICAgICBhZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CiAgICAgIF9fZmlyc3RfY3V0 ID0gdXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsIF9fY29tcCk7 CiAgICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKICAgIH0KICAg IF9CaWRpcmVjdGlvbmFsSXRlciBfX25ld19taWRkbGUgPQogICAgICBfX3JvdGF0ZV9hZGFwdGl2 ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sZW4xIC0gX19sZW4xMSwK ICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUp OwogICAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxl LCBfX2xlbjExLAogICAgICAgICAgICAgICAgICAgICBfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZm ZXJfc2l6ZSwgX19jb21wKTsKICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3Nl Y29uZF9jdXQsIF9fbGFzdCwgX19sZW4xIC0gX19sZW4xMSwKICAgICAgICAgICAgICAgICAgICAg X19sZW4yIC0gX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CiAgfQp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9E aXN0YW5jZT4KaW5saW5lIHZvaWQgX19pbnBsYWNlX21lcmdlX2F1eChfQmlkaXJlY3Rpb25hbEl0 ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25h bEl0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0 aW9uYWxJdGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKikgewogIF9EaXN0YW5jZSBfX2xlbjEg PSAwOwogIGRpc3RhbmNlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xlbjEpOwogIF9EaXN0YW5jZSBf X2xlbjIgPSAwOwogIGRpc3RhbmNlKF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMik7CgogIF9UZW1w b3JhcnlfYnVmZmVyPF9CaWRpcmVjdGlvbmFsSXRlciwgX1RwPiBfX2J1ZihfX2ZpcnN0LCBfX2xh c3QpOwogIGlmIChfX2J1Zi5iZWdpbigpID09IDApCiAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVy KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yKTsKICBlbHNlCiAgICBf X21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4y LAogICAgICAgICAgICAgICAgICAgICBfX2J1Zi5iZWdpbigpLCBfRGlzdGFuY2UoX19idWYuc2l6 ZSgpKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9UcCwg CiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgdm9pZCBf X2lucGxhY2VfbWVyZ2VfYXV4KF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LCBfVHAq LCBfRGlzdGFuY2UqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9f Y29tcCkgewogIF9EaXN0YW5jZSBfX2xlbjEgPSAwOwogIGRpc3RhbmNlKF9fZmlyc3QsIF9fbWlk ZGxlLCBfX2xlbjEpOwogIF9EaXN0YW5jZSBfX2xlbjIgPSAwOwogIGRpc3RhbmNlKF9fbWlkZGxl LCBfX2xhc3QsIF9fbGVuMik7CgogIF9UZW1wb3JhcnlfYnVmZmVyPF9CaWRpcmVjdGlvbmFsSXRl ciwgX1RwPiBfX2J1ZihfX2ZpcnN0LCBfX2xhc3QpOwogIGlmIChfX2J1Zi5iZWdpbigpID09IDAp CiAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9f bGVuMSwgX19sZW4yLCBfX2NvbXApOwogIGVsc2UKICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19maXJz dCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLCBfX2xlbjIsCiAgICAgICAgICAgICAgICAgICAg IF9fYnVmLmJlZ2luKCksIF9EaXN0YW5jZShfX2J1Zi5zaXplKCkpLAogICAgICAgICAgICAgICAg ICAgICBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyPgppbmxp bmUgdm9pZCBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0KSB7CiAgaWYgKF9fZmly c3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQogICAgcmV0dXJuOwogIF9faW5w bGFjZV9tZXJnZV9hdXgoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKICAgICAgICAgICAgICAg ICAgICAgIF9fdmFsdWVfdHlwZSggX19maXJzdCApICwgX19kaXN0YW5jZV90eXBlKCBfX2ZpcnN0 ICkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBh cmU+CmlubGluZSB2b2lkIGlucGxhY2VfbWVyZ2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAog ICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsIF9Db21w YXJlIF9fY29tcCkgewogIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbWlkZGxlID09IF9f bGFzdCkKICAgIHJldHVybjsKICBfX2lucGxhY2VfbWVyZ2VfYXV4KF9fZmlyc3QsIF9fbWlkZGxl LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSAs IF9fZGlzdGFuY2VfdHlwZSggX19maXJzdCApICwKICAgICAgICAgICAgICAgICAgICAgIF9fY29t cCk7Cn0KCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0 SXRlcjI+CmJvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9f bGFzdDEsCiAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9f bGFzdDIpIHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xh c3QyKQogICAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKICAgICAgcmV0dXJuIGZhbHNlOwog ICAgZWxzZSBpZigqX19maXJzdDEgPCAqX19maXJzdDIpIAogICAgICArK19fZmlyc3QxOwogICAg ZWxzZQogICAgICArK19fZmlyc3QxLCArK19fZmlyc3QyOwoKICByZXR1cm4gX19maXJzdDIgPT0g X19sYXN0MjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVy MiwgY2xhc3MgX0NvbXBhcmU+CmJvb2wgaW5jbHVkZXMoX0lucHV0SXRlcjEgX19maXJzdDEsIF9J bnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9J bnB1dEl0ZXIyIF9fbGFzdDIsIF9Db21wYXJlIF9fY29tcCkgewogIHdoaWxlIChfX2ZpcnN0MSAh PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoX19jb21wKCpfX2ZpcnN0 MiwgKl9fZmlyc3QxKSkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgZWxzZSBpZihfX2NvbXAoKl9f Zmlyc3QxLCAqX19maXJzdDIpKSAKICAgICAgKytfX2ZpcnN0MTsKICAgIGVsc2UKICAgICAgKytf X2ZpcnN0MSwgKytfX2ZpcnN0MjsKCiAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRw dXRJdGVyPgpfT3V0cHV0SXRlciBzZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1 dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0 MiwgX0lucHV0SXRlcjIgX19sYXN0MiwKICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVy IF9fcmVzdWx0KSB7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0g X19sYXN0MikgewogICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikgewogICAgICAqX19yZXN1 bHQgPSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICBlbHNlIGlmICgqX19m aXJzdDIgPCAqX19maXJzdDEpIHsKICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOwogICAgICAr K19fZmlyc3QyOwogICAgfQogICAgZWxzZSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsK ICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICAgICsrX19yZXN1bHQ7 CiAgfQogIHJldHVybiBjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBjb3B5KF9fZmlyc3QxLCBfX2xh c3QxLCBfX3Jlc3VsdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9J bnB1dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgpf T3V0cHV0SXRlciBzZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9f bGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0 SXRlcjIgX19sYXN0MiwKICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0 LCBfQ29tcGFyZSBfX2NvbXApIHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2Zp cnN0MiAhPSBfX2xhc3QyKSB7CiAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkg ewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAg ICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CiAgICAgICpfX3Jlc3Vs dCA9ICpfX2ZpcnN0MjsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICAgIGVsc2UgewogICAgICAq X19yZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICAgICsrX19maXJzdDI7 CiAgICB9CiAgICArK19fcmVzdWx0OwogIH0KICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0 MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+Cl9PdXRw dXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIx IF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJz dDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091 dHB1dEl0ZXIgX19yZXN1bHQpIHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2Zp cnN0MiAhPSBfX2xhc3QyKSAKICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpIAogICAgICAr K19fZmlyc3QxOwogICAgZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKSAKICAgICAgKytf X2ZpcnN0MjsKICAgIGVsc2UgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsr X19maXJzdDE7CiAgICAgICsrX19maXJzdDI7CiAgICAgICsrX19yZXN1bHQ7CiAgICB9CiAgcmV0 dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1 dEl0ZXIyLCBjbGFzcyBfT3V0cHV0SXRlciwKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgpfT3V0 cHV0SXRlciBzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVy MSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmly c3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9P dXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApIHsKICB3aGlsZSAoX19maXJzdDEg IT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQogICAgaWYgKF9fY29tcCgqX19maXJz dDEsICpfX2ZpcnN0MikpCiAgICAgICsrX19maXJzdDE7CiAgICBlbHNlIGlmIChfX2NvbXAoKl9f Zmlyc3QyLCAqX19maXJzdDEpKQogICAgICArK19fZmlyc3QyOwogICAgZWxzZSB7CiAgICAgICpf X3Jlc3VsdCA9ICpfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsK ICAgICAgKytfX3Jlc3VsdDsKICAgIH0KICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgpf T3V0cHV0SXRlciBzZXRfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRl cjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJz dDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRw dXRJdGVyIF9fcmVzdWx0KSB7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJz dDIgIT0gX19sYXN0MikKICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpIHsKICAgICAgKl9f cmVzdWx0ID0gKl9fZmlyc3QxOwogICAgICArK19fZmlyc3QxOwogICAgICArK19fcmVzdWx0Owog ICAgfQogICAgZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQogICAgICArK19fZmlyc3Qy OwogICAgZWxzZSB7CiAgICAgICsrX19maXJzdDE7CiAgICAgICsrX19maXJzdDI7CiAgICB9CiAg cmV0dXJuIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsIAog ICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Cl9PdXRwdXRJdGVyIHNldF9kaWZmZXJlbmNlKF9JbnB1 dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MiwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2Nv bXApIHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3Qy KQogICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKICAgICAgKl9fcmVzdWx0 ID0gKl9fZmlyc3QxOwogICAgICArK19fZmlyc3QxOwogICAgICArK19fcmVzdWx0OwogICAgfQog ICAgZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKICAgICAgKytfX2ZpcnN0 MjsKICAgIGVsc2UgewogICAgICArK19fZmlyc3QxOwogICAgICArK19fZmlyc3QyOwogICAgfQog IHJldHVybiBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgpf T3V0cHV0SXRlciAKc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3Qx LCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRl cjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAg ICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYm IF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKSB7CiAg ICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX3Jl c3VsdDsKICAgIH0KICAgIGVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkgewogICAgICAq X19yZXN1bHQgPSAqX19maXJzdDI7CiAgICAgICsrX19maXJzdDI7CiAgICAgICsrX19yZXN1bHQ7 CiAgICB9CiAgICBlbHNlIHsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAg IH0KICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0 MSwgX19yZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5w dXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KX091 dHB1dEl0ZXIgCnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwg X0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIy IF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAg X091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBf X2NvbXApIHsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xh c3QyKQogICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKICAgICAgKl9fcmVz dWx0ID0gKl9fZmlyc3QxOwogICAgICArK19fZmlyc3QxOwogICAgICArK19fcmVzdWx0OwogICAg fQogICAgZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkgewogICAgICAqX19y ZXN1bHQgPSAqX19maXJzdDI7CiAgICAgICsrX19maXJzdDI7CiAgICAgICsrX19yZXN1bHQ7CiAg ICB9CiAgICBlbHNlIHsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0K ICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwg X19yZXN1bHQpKTsKfQoKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgpfRm9yd2Fy ZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xh c3QpIHsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwogIF9Gb3J3YXJk SXRlciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CiAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpIAog ICAgaWYgKCpfX3Jlc3VsdCA8ICpfX2ZpcnN0KQogICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CiAg cmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBf Q29tcGFyZT4KX0ZvcndhcmRJdGVyIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBf Rm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUg X19jb21wKSB7CiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKICBfRm9y d2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0 KSAKICAgIGlmIChfX2NvbXAoKl9fcmVzdWx0LCAqX19maXJzdCkpIF9fcmVzdWx0ID0gX19maXJz dDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+Cl9G b3J3YXJkSXRlciBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVy IF9fbGFzdCkgewogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fZmlyc3Q7CiAgX0Zv cndhcmRJdGVyIF9fcmVzdWx0ID0gX19maXJzdDsKICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFz dCkgCiAgICBpZiAoKl9fZmlyc3QgPCAqX19yZXN1bHQpCiAgICAgIF9fcmVzdWx0ID0gX19maXJz dDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNs YXNzIF9Db21wYXJlPgpfRm9yd2FyZEl0ZXIgbWluX2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmly c3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29t cGFyZSBfX2NvbXApIHsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0Owog IF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CiAgd2hpbGUgKCsrX19maXJzdCAhPSBf X2xhc3QpIAogICAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9fcmVzdWx0KSkKICAgICAgX19yZXN1 bHQgPSBfX2ZpcnN0OwogIHJldHVybiBfX3Jlc3VsdDsKfQoKIAogCgp0ZW1wbGF0ZSA8Y2xhc3Mg X0JpZGlyZWN0aW9uYWxJdGVyPgpib29sIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJ dGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpIHsKICBpZiAoX19maXJzdCA9 PSBfX2xhc3QpCiAgICByZXR1cm4gZmFsc2U7CiAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faSA9IF9f Zmlyc3Q7CiAgKytfX2k7CiAgaWYgKF9faSA9PSBfX2xhc3QpCiAgICByZXR1cm4gZmFsc2U7CiAg X19pID0gX19sYXN0OwogIC0tX19pOwoKICBmb3IoOzspIHsKICAgIF9CaWRpcmVjdGlvbmFsSXRl ciBfX2lpID0gX19pOwogICAgLS1fX2k7CiAgICBpZiAoKl9faSA8ICpfX2lpKSB7CiAgICAgIF9C aWRpcmVjdGlvbmFsSXRlciBfX2ogPSBfX2xhc3Q7CiAgICAgIHdoaWxlICghKCpfX2kgPCAqLS1f X2opKQogICAgICAgIHt9CiAgICAgIGl0ZXJfc3dhcChfX2ksIF9faik7CiAgICAgIHJldmVyc2Uo X19paSwgX19sYXN0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoX19pID09IF9f Zmlyc3QpIHsKICAgICAgcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOwogICAgICByZXR1cm4gZmFs c2U7CiAgICB9CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFz cyBfQ29tcGFyZT4KYm9vbCBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2Zp cnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgX0Nv bXBhcmUgX19jb21wKSB7CiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNl OwogIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OwogICsrX19pOwogIGlmIChfX2kg PT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNlOwogIF9faSA9IF9fbGFzdDsKICAtLV9faTsKCiAg Zm9yKDs7KSB7CiAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19paSA9IF9faTsKICAgIC0tX19pOwog ICAgaWYgKF9fY29tcCgqX19pLCAqX19paSkpIHsKICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9f aiA9IF9fbGFzdDsKICAgICAgd2hpbGUgKCFfX2NvbXAoKl9faSwgKi0tX19qKSkKICAgICAgICB7 fQogICAgICBpdGVyX3N3YXAoX19pLCBfX2opOwogICAgICByZXZlcnNlKF9faWksIF9fbGFzdCk7 CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKF9faSA9PSBfX2ZpcnN0KSB7CiAgICAg IHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0K fQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KYm9vbCBwcmV2X3Blcm11dGF0 aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0 KSB7CiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNlOwogIF9CaWRpcmVj dGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OwogICsrX19pOwogIGlmIChfX2kgPT0gX19sYXN0KQog ICAgcmV0dXJuIGZhbHNlOwogIF9faSA9IF9fbGFzdDsKICAtLV9faTsKCiAgZm9yKDs7KSB7CiAg ICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19paSA9IF9faTsKICAgIC0tX19pOwogICAgaWYgKCpfX2lp IDwgKl9faSkgewogICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19qID0gX19sYXN0OwogICAgICB3 aGlsZSAoISgqLS1fX2ogPCAqX19pKSkKICAgICAgICB7fQogICAgICBpdGVyX3N3YXAoX19pLCBf X2opOwogICAgICByZXZlcnNlKF9faWksIF9fbGFzdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAg fQogICAgaWYgKF9faSA9PSBfX2ZpcnN0KSB7CiAgICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0 KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRp cmVjdGlvbmFsSXRlciwgY2xhc3MgX0NvbXBhcmU+CmJvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlk aXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkgewogIGlmIChfX2ZpcnN0ID09IF9fbGFz dCkKICAgIHJldHVybiBmYWxzZTsKICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19pID0gX19maXJzdDsK ICArK19faTsKICBpZiAoX19pID09IF9fbGFzdCkKICAgIHJldHVybiBmYWxzZTsKICBfX2kgPSBf X2xhc3Q7CiAgLS1fX2k7CgogIGZvcig7OykgewogICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faWkg PSBfX2k7CiAgICAtLV9faTsKICAgIGlmIChfX2NvbXAoKl9faWksICpfX2kpKSB7CiAgICAgIF9C aWRpcmVjdGlvbmFsSXRlciBfX2ogPSBfX2xhc3Q7CiAgICAgIHdoaWxlICghX19jb21wKCotLV9f aiwgKl9faSkpCiAgICAgICAge30KICAgICAgaXRlcl9zd2FwKF9faSwgX19qKTsKICAgICAgcmV2 ZXJzZShfX2lpLCBfX2xhc3QpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChfX2kg PT0gX19maXJzdCkgewogICAgICByZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CiAgICAgIHJldHVy biBmYWxzZTsKICAgIH0KICB9Cn0KCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFz cyBfRm9yd2FyZEl0ZXI+Cl9JbnB1dEl0ZXIgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmly c3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2Fy ZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyKQp7CiAgZm9yICggOyBfX2ZpcnN0 MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxKSAKICAgIGZvciAoX0ZvcndhcmRJdGVyIF9faXRlciA9 IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpCiAgICAgIGlmICgqX19maXJz dDEgPT0gKl9faXRlcikKICAgICAgICByZXR1cm4gX19maXJzdDE7CiAgcmV0dXJuIF9fbGFzdDE7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNz IF9CaW5hcnlQcmVkaWNhdGU+Cl9JbnB1dEl0ZXIgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9f Zmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfRm9y d2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAogICAgICAgICAgICAgICAg ICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCnsKICBmb3IgKCA7IF9fZmlyc3QxICE9 IF9fbGFzdDE7ICsrX19maXJzdDEpIAogICAgZm9yIChfRm9yd2FyZEl0ZXIgX19pdGVyID0gX19m aXJzdDI7IF9faXRlciAhPSBfX2xhc3QyOyArK19faXRlcikKICAgICAgaWYgKF9fY29tcCgqX19m aXJzdDEsICpfX2l0ZXIpKQogICAgICAgIHJldHVybiBfX2ZpcnN0MTsKICByZXR1cm4gX19sYXN0 MTsKfQoKCiAKIAogCiAKCiAKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9G b3J3YXJkSXRlcjI+Cl9Gb3J3YXJkSXRlcjEgX19maW5kX2VuZChfRm9yd2FyZEl0ZXIxIF9fZmly c3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfRm9y d2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAg ICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsK ICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKICAgIHJldHVybiBfX2xhc3QxOwogIGVsc2Ugewog ICAgX0ZvcndhcmRJdGVyMSBfX3Jlc3VsdCA9IF9fbGFzdDE7CiAgICB3aGlsZSAoMSkgewogICAg ICBfRm9yd2FyZEl0ZXIxIF9fbmV3X3Jlc3VsdAogICAgICAgID0gc2VhcmNoKF9fZmlyc3QxLCBf X2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CiAgICAgIGlmIChfX25ld19yZXN1bHQgPT0gX19s YXN0MSkKICAgICAgICByZXR1cm4gX19yZXN1bHQ7CiAgICAgIGVsc2UgewogICAgICAgIF9fcmVz dWx0ID0gX19uZXdfcmVzdWx0OwogICAgICAgIF9fZmlyc3QxID0gX19uZXdfcmVzdWx0OwogICAg ICAgICsrX19maXJzdDE7CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9y d2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLAogICAgICAgICAgY2xhc3MgX0JpbmFyeVBy ZWRpY2F0ZT4KX0ZvcndhcmRJdGVyMSBfX2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEs IF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJk SXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MiwKICAgICAgICAgICAgICAgICAg ICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZywKICAgICAg ICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQp7CiAgaWYgKF9fZmly c3QyID09IF9fbGFzdDIpCiAgICByZXR1cm4gX19sYXN0MTsKICBlbHNlIHsKICAgIF9Gb3J3YXJk SXRlcjEgX19yZXN1bHQgPSBfX2xhc3QxOwogICAgd2hpbGUgKDEpIHsKICAgICAgX0ZvcndhcmRJ dGVyMSBfX25ld19yZXN1bHQKICAgICAgICA9IHNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19m aXJzdDIsIF9fbGFzdDIsIF9fY29tcCk7CiAgICAgIGlmIChfX25ld19yZXN1bHQgPT0gX19sYXN0 MSkKICAgICAgICByZXR1cm4gX19yZXN1bHQ7CiAgICAgIGVsc2UgewogICAgICAgIF9fcmVzdWx0 ID0gX19uZXdfcmVzdWx0OwogICAgICAgIF9fZmlyc3QxID0gX19uZXdfcmVzdWx0OwogICAgICAg ICsrX19maXJzdDE7CiAgICAgIH0KICAgIH0KICB9Cn0KCiAKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0Jp ZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMj4KX0JpZGlyZWN0aW9u YWxJdGVyMQpfX2ZpbmRfZW5kKF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdDEsIF9CaWRpcmVj dGlvbmFsSXRlcjEgX19sYXN0MSwKICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fZmly c3QyLCBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgYmlkaXJlY3Rpb25h bF9pdGVyYXRvcl90YWcsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQp7CiAgdHlwZWRlZiBy ZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcjE+IF9SZXZJdGVyMTsKICB0eXBlZGVm IHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyMj4gX1Jldkl0ZXIyOwoKICBfUmV2 SXRlcjEgX19ybGFzdDEoX19maXJzdDEpOwogIF9SZXZJdGVyMiBfX3JsYXN0MihfX2ZpcnN0Mik7 CiAgX1Jldkl0ZXIxIF9fcnJlc3VsdCA9IHNlYXJjaChfUmV2SXRlcjEoX19sYXN0MSksIF9fcmxh c3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jldkl0ZXIyKF9fbGFzdDIpLCBf X3JsYXN0Mik7CgogIGlmIChfX3JyZXN1bHQgPT0gX19ybGFzdDEpCiAgICByZXR1cm4gX19sYXN0 MTsKICBlbHNlIHsKICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19yZXN1bHQgPSBfX3JyZXN1bHQu YmFzZSgpOwogICAgYWR2YW5jZShfX3Jlc3VsdCwgLWRpc3RhbmNlKF9fZmlyc3QyLCBfX2xhc3Qy KSk7CiAgICByZXR1cm4gX19yZXN1bHQ7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0 aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKICAgICAgICAgIGNsYXNzIF9C aW5hcnlQcmVkaWNhdGU+Cl9CaWRpcmVjdGlvbmFsSXRlcjEKX19maW5kX2VuZChfQmlkaXJlY3Rp b25hbEl0ZXIxIF9fZmlyc3QxLCBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCiAgICAgICAg ICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2xh c3QyLAogICAgICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBiaWRpcmVjdGlvbmFs X2l0ZXJhdG9yX3RhZywgCiAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCnsKICB0 eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyMT4gX1Jldkl0ZXIxOwog IHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXIyPiBfUmV2SXRlcjI7 CgogIF9SZXZJdGVyMSBfX3JsYXN0MShfX2ZpcnN0MSk7CiAgX1Jldkl0ZXIyIF9fcmxhc3QyKF9f Zmlyc3QyKTsKICBfUmV2SXRlcjEgX19ycmVzdWx0ID0gc2VhcmNoKF9SZXZJdGVyMShfX2xhc3Qx KSwgX19ybGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmV2SXRlcjIoX19s YXN0MiksIF9fcmxhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsK CiAgaWYgKF9fcnJlc3VsdCA9PSBfX3JsYXN0MSkKICAgIHJldHVybiBfX2xhc3QxOwogIGVsc2Ug ewogICAgX0JpZGlyZWN0aW9uYWxJdGVyMSBfX3Jlc3VsdCA9IF9fcnJlc3VsdC5iYXNlKCk7CiAg ICBhZHZhbmNlKF9fcmVzdWx0LCAtZGlzdGFuY2UoX19maXJzdDIsIF9fbGFzdDIpKTsKICAgIHJl dHVybiBfX3Jlc3VsdDsKICB9Cn0KCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwg Y2xhc3MgX0ZvcndhcmRJdGVyMj4KaW5saW5lIF9Gb3J3YXJkSXRlcjEgCmZpbmRfZW5kKF9Gb3J3 YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwgCiAgICAgICAgIF9Gb3J3 YXJkSXRlcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcjIgX19sYXN0MikKewogIHJldHVybiBfX2Zp bmRfZW5kKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKICAgICAgICAgICAg ICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0MSApICwKICAgICAgICAgICAgICAg ICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0MiApICk7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyLCAKICAgICAgICAgIGNsYXNzIF9C aW5hcnlQcmVkaWNhdGU+CmlubGluZSBfRm9yd2FyZEl0ZXIxIApmaW5kX2VuZChfRm9yd2FyZEl0 ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsIAogICAgICAgICBfRm9yd2FyZEl0 ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgIF9CaW5hcnlQcmVk aWNhdGUgX19jb21wKQp7CiAgcmV0dXJuIF9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9f Zmlyc3QyLCBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnko IF9fZmlyc3QxICkgLAogICAgICAgICAgICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9f Zmlyc3QyICkgLAogICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cn0KCiAKIAogCgp0ZW1wbGF0 ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KYm9vbCBfX2lzX2hl YXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX0Rpc3RhbmNlIF9fbikKewogIF9EaXN0YW5j ZSBfX3BhcmVudCA9IDA7CiAgZm9yIChfRGlzdGFuY2UgX19jaGlsZCA9IDE7IF9fY2hpbGQgPCBf X247ICsrX19jaGlsZCkgewogICAgaWYgKF9fZmlyc3RbX19wYXJlbnRdIDwgX19maXJzdFtfX2No aWxkXSkgCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICgoX19jaGlsZCAmIDEpID09IDApCiAg ICAgICsrX19wYXJlbnQ7CiAgfQogIHJldHVybiB0cnVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jh bmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmlu Zz4KYm9vbCBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1N0cmljdFdlYWtP cmRlcmluZyBfX2NvbXAsCiAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX24pCnsKICBfRGlzdGFu Y2UgX19wYXJlbnQgPSAwOwogIGZvciAoX0Rpc3RhbmNlIF9fY2hpbGQgPSAxOyBfX2NoaWxkIDwg X19uOyArK19fY2hpbGQpIHsKICAgIGlmIChfX2NvbXAoX19maXJzdFtfX3BhcmVudF0sIF9fZmly c3RbX19jaGlsZF0pKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBpZiAoKF9fY2hpbGQgJiAxKSA9 PSAwKQogICAgICArK19fcGFyZW50OwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgYm9vbCBpc19oZWFwKF9SYW5kb21BY2Nlc3NJ dGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkKewogIHJldHVybiBfX2lzX2hl YXAoX19maXJzdCwgX19sYXN0IC0gX19maXJzdCk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRv bUFjY2Vzc0l0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CmlubGluZSBib29sIGlzX2hl YXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAog ICAgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQp7CiAgcmV0dXJu IF9faXNfaGVhcChfX2ZpcnN0LCBfX2NvbXAsIF9fbGFzdCAtIF9fZmlyc3QpOwp9CgogCiAKIAoK dGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KYm9vbCBpc19zb3J0ZWQoX0ZvcndhcmRJdGVy IF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpCnsKICBpZiAoX19maXJzdCA9PSBfX2xhc3Qp CiAgICByZXR1cm4gdHJ1ZTsKCiAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CiAgZm9y ICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQp IHsKICAgIGlmICgqX19uZXh0IDwgKl9fZmlyc3QpCiAgICAgIHJldHVybiBmYWxzZTsKICB9Cgog IHJldHVybiB0cnVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU3Ry aWN0V2Vha09yZGVyaW5nPgpib29sIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0Zv cndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2Nv bXApCnsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICByZXR1cm4gdHJ1ZTsKCiAgX0Zvcndh cmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CiAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFz dDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpIHsKICAgIGlmIChfX2NvbXAoKl9fbmV4dCwg Kl9fZmlyc3QpKQogICAgICByZXR1cm4gZmFsc2U7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfQoKCgoK CiAKCgoKIAogCiAKIyA0MSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9oYXNodGFibGUuaCIgMiAzCgoKIyAxICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rs X2Z1bmN0aW9uLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCnRl bXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24g ewogIHR5cGVkZWYgX0FyZyBhcmd1bWVudF90eXBlOwogIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRf dHlwZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1 bHQ+CnN0cnVjdCBiaW5hcnlfZnVuY3Rpb24gewogIHR5cGVkZWYgX0FyZzEgZmlyc3RfYXJndW1l bnRfdHlwZTsKICB0eXBlZGVmIF9BcmcyIHNlY29uZF9hcmd1bWVudF90eXBlOwogIHR5cGVkZWYg X1Jlc3VsdCByZXN1bHRfdHlwZTsKfTsgICAgICAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVj dCBwbHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLF9UcD4gewogIF9UcCBvcGVy YXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194 ICsgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbWludXMgOiBwdWJsaWMg YmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsX1RwPiB7CiAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1Rw JiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLSBfX3k7IH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5j dGlvbjxfVHAsX1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25z dCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICogX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwPgpzdHJ1Y3QgZGl2aWRlcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxf VHA+IHsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNv bnN0IHsgcmV0dXJuIF9feCAvIF9feTsgfQp9OwoKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5s aW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KHBsdXM8X1RwPikgewogIHJldHVybiBfVHAoMCk7Cn0K dGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KG11bHRpcGxp ZXM8X1RwPikgewogIHJldHVybiBfVHAoMSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVj dCBtb2R1bHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLF9UcD4gCnsKICBfVHAg b3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJu IF9feCAlIF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IG5lZ2F0ZSA6IHB1 YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1RwPiAKewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9U cCYgX194KSBjb25zdCB7IHJldHVybiAtX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpz dHJ1Y3QgZXF1YWxfdG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4gCnsK ICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7 IHJldHVybiBfX3ggPT0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3Qgbm90 X2VxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9v bCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1 cm4gX194ICE9IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGdyZWF0ZXIg OiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4gCnsKICBib29sIG9wZXJhdG9y KCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPiBf X3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBsZXNzIDogcHVibGljIGJpbmFy eV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYg X194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IDwgX195OyB9Cn07Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgZ3JlYXRlcl9lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVu Y3Rpb248X1RwLF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBj b25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID49IF9feTsgfQp9OwoKdGVtcGxhdGUg PGNsYXNzIF9UcD4Kc3RydWN0IGxlc3NfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9U cCxfVHAsYm9vbD4gCnsKICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9U cCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPD0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwPgpzdHJ1Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAs Ym9vbD4KewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kp IGNvbnN0IHsgcmV0dXJuIF9feCAmJiBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0 cnVjdCBsb2dpY2FsX29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+CnsK ICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7 IHJldHVybiBfX3ggfHwgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbG9n aWNhbF9ub3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLGJvb2w+CnsKICBib29sIG9wZXJh dG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuICFfX3g7IH0KfTsKCnRlbXBsYXRl IDxjbGFzcyBfUHJlZGljYXRlPgpjbGFzcyB1bmFyeV9uZWdhdGUKICA6IHB1YmxpYyB1bmFyeV9m dW5jdGlvbjx0eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlLCBib29sPiB7CnByb3Rl Y3RlZDoKICBfUHJlZGljYXRlIF9NX3ByZWQ7CnB1YmxpYzoKICBleHBsaWNpdCB1bmFyeV9uZWdh dGUoY29uc3QgX1ByZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQogIGJvb2wgb3BlcmF0 b3IoKShjb25zdCB0eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiAhX01fcHJlZChfX3gpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUHJl ZGljYXRlPgppbmxpbmUgdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+IApub3QxKGNvbnN0IF9QcmVk aWNhdGUmIF9fcHJlZCkKewogIHJldHVybiB1bmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVk KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+IApjbGFzcyBiaW5hcnlfbmVnYXRlIAog IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfUHJlZGljYXRlOjpmaXJzdF9hcmd1 bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRl OjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD4g ewpwcm90ZWN0ZWQ6CiAgX1ByZWRpY2F0ZSBfTV9wcmVkOwpwdWJsaWM6CiAgZXhwbGljaXQgYmlu YXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHt9CiAgYm9v bCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5 cGUmIF9feCwgCiAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNl Y29uZF9hcmd1bWVudF90eXBlJiBfX3kpIGNvbnN0CiAgewogICAgcmV0dXJuICFfTV9wcmVkKF9f eCwgX195KTsgCiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CmlubGluZSBiaW5h cnlfbmVnYXRlPF9QcmVkaWNhdGU+IApub3QyKGNvbnN0IF9QcmVkaWNhdGUmIF9fcHJlZCkKewog IHJldHVybiBiaW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfT3BlcmF0aW9uPiAKY2xhc3MgYmluZGVyMXN0CiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rp b248dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVj dGVkOgogIF9PcGVyYXRpb24gb3A7CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1l bnRfdHlwZSB2YWx1ZTsKcHVibGljOgogIGJpbmRlcjFzdChjb25zdCBfT3BlcmF0aW9uJiBfX3gs CiAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5 cGUmIF9feSkKICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJh dGlvbjo6cmVzdWx0X3R5cGUKICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246 OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBvcCh2YWx1ZSwg X194KTsgCiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KaW5s aW5lIGJpbmRlcjFzdDxfT3BlcmF0aW9uPiAKYmluZDFzdChjb25zdCBfT3BlcmF0aW9uJiBfX29w ZXIsIGNvbnN0IF9UcCYgX194KSAKewogIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmly c3RfYXJndW1lbnRfdHlwZSBfQXJnMV90eXBlOwogIHJldHVybiBiaW5kZXIxc3Q8X09wZXJhdGlv bj4oX19vcGVyLCBfQXJnMV90eXBlKF9feCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlv bj4gCmNsYXNzIGJpbmRlcjJuZAogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9P cGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg dHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9PcGVyYXRp b24gb3A7CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7 CnB1YmxpYzoKICBiaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LAogICAgICAgICAgICBj b25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX195KSAKICAg ICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0 X3R5cGUKICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3Vt ZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIG9wKF9feCwgdmFsdWUpOyAKICB9Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbiwgY2xhc3MgX1RwPgppbmxpbmUgYmluZGVyMm5k PF9PcGVyYXRpb24+IApiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fb3BlciwgY29uc3QgX1Rw JiBfX3gpIAp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRf dHlwZSBfQXJnMl90eXBlOwogIHJldHVybiBiaW5kZXIybmQ8X09wZXJhdGlvbj4oX19vcGVyLCBf QXJnMl90eXBlKF9feCkpOwp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNz IF9PcGVyYXRpb24yPgpjbGFzcyB1bmFyeV9jb21wb3NlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rp b248dHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlPiAKewpwcm90ZWN0ZWQ6 CiAgX09wZXJhdGlvbjEgX19vcDE7CiAgX09wZXJhdGlvbjIgX19vcDI7CnB1YmxpYzoKICB1bmFy eV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kp IAogICAgOiBfX29wMShfX3gpLCBfX29wMihfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjE6 OnJlc3VsdF90eXBlCiAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uMjo6YXJn dW1lbnRfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX19vcDEoX19vcDIoX194KSk7CiAg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KaW5s aW5lIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjI+IApjb21wb3NlMShjb25z dCBfT3BlcmF0aW9uMSYgX19vcDEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX29wMikKewogIHJldHVy biB1bmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLF9PcGVyYXRpb24yPihfX29wMSwgX19vcDIpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBf T3BlcmF0aW9uMz4KY2xhc3MgYmluYXJ5X2NvbXBvc2UKICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlv bjx0eXBlbmFtZSBfT3BlcmF0aW9uMjo6YXJndW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAg ICAgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgog IF9PcGVyYXRpb24xIF9NX29wMTsKICBfT3BlcmF0aW9uMiBfTV9vcDI7CiAgX09wZXJhdGlvbjMg X01fb3AzOwpwdWJsaWM6CiAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwg Y29uc3QgX09wZXJhdGlvbjImIF9feSwgCiAgICAgICAgICAgICAgICAgY29uc3QgX09wZXJhdGlv bjMmIF9feikgCiAgICA6IF9NX29wMShfX3gpLCBfTV9vcDIoX195KSwgX01fb3AzKF9feikgeyB9 CiAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlCiAgb3BlcmF0b3IoKShjb25zdCB0 eXBlbmFtZSBfT3BlcmF0aW9uMjo6YXJndW1lbnRfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1 cm4gX01fb3AxKF9NX29wMihfX3gpLCBfTV9vcDMoX194KSk7CiAgfQp9OwoKdGVtcGxhdGUgPGNs YXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+Cmlu bGluZSBiaW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSwgX09wZXJhdGlvbjIsIF9PcGVyYXRpb24z PiAKY29tcG9zZTIoY29uc3QgX09wZXJhdGlvbjEmIF9fb3AxLCBjb25zdCBfT3BlcmF0aW9uMiYg X19vcDIsIAogICAgICAgICBjb25zdCBfT3BlcmF0aW9uMyYgX19vcDMpCnsKICByZXR1cm4gYmlu YXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjIsX09wZXJhdGlvbjM+CiAgICAoX19v cDEsIF9fb3AyLCBfX29wMyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0 PgpjbGFzcyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9u PF9BcmcsIF9SZXN1bHQ+IHsKcHJvdGVjdGVkOgogIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOwpw dWJsaWM6CiAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbigpIHt9CiAgZXhwbGljaXQgcG9pbnRl cl90b191bmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkgOiBfTV9wdHIoX194KSB7 fQogIF9SZXN1bHQgb3BlcmF0b3IoKShfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gX01fcHRyKF9f eCk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgppbmxpbmUgcG9p bnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiBwdHJfZnVuKF9SZXN1bHQgKCpf X3gpKF9BcmcpKQp7CiAgcmV0dXJuIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jl c3VsdD4oX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3Mg X1Jlc3VsdD4KY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOiAKICBwdWJsaWMgYmlu YXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IHsKcHJvdGVjdGVkOgogICAgX1Jlc3Vs dCAoKl9NX3B0cikoX0FyZzEsIF9BcmcyKTsKcHVibGljOgogICAgcG9pbnRlcl90b19iaW5hcnlf ZnVuY3Rpb24oKSB7fQogICAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX1Jl c3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkgCiAgICAgIDogX01fcHRyKF9feCkge30KICAgIF9S ZXN1bHQgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgewogICAgICByZXR1 cm4gX01fcHRyKF9feCwgX195KTsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xh c3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+CmlubGluZSBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlv bjxfQXJnMSxfQXJnMixfUmVzdWx0PiAKcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnMSwgX0Fy ZzIpKSB7CiAgcmV0dXJuIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9S ZXN1bHQ+KF9feCk7Cn0KCiAKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9JZGVudGl0eSA6 IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsX1RwPiB7CiAgY29uc3QgX1RwJiBvcGVyYXRvcigp KGNvbnN0IF9UcCYgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KfTsKCnRlbXBsYXRlIDxjbGFz cyBfVHA+IHN0cnVjdCBpZGVudGl0eSA6IHB1YmxpYyBfSWRlbnRpdHk8X1RwPiB7fTsKCiAKdGVt cGxhdGUgPGNsYXNzIF9QYWlyPgpzdHJ1Y3QgX1NlbGVjdDFzdCA6IHB1YmxpYyB1bmFyeV9mdW5j dGlvbjxfUGFpciwgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGU+IHsKICBjb25zdCB0eXBlbmFt ZSBfUGFpcjo6Zmlyc3RfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7 CiAgICByZXR1cm4gX194LmZpcnN0OwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4Kc3Ry dWN0IF9TZWxlY3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9Q YWlyOjpzZWNvbmRfdHlwZT4KewogIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYg b3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX194LnNlY29u ZDsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3Qxc3QgOiBwdWJs aWMgX1NlbGVjdDFzdDxfUGFpcj4ge307CnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4gc3RydWN0IHNl bGVjdDJuZCA6IHB1YmxpYyBfU2VsZWN0Mm5kPF9QYWlyPiB7fTsKCiAKdGVtcGxhdGUgPGNsYXNz IF9BcmcxLCBjbGFzcyBfQXJnMj4Kc3RydWN0IF9Qcm9qZWN0MXN0IDogcHVibGljIGJpbmFyeV9m dW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcxPiB7CiAgX0FyZzEgb3BlcmF0b3IoKShjb25zdCBf QXJnMSYgX194LCBjb25zdCBfQXJnMiYpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9OwoKdGVtcGxh dGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4Kc3RydWN0IF9Qcm9qZWN0Mm5kIDogcHVibGlj IGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcyPiB7CiAgX0FyZzIgb3BlcmF0b3Io KShjb25zdCBfQXJnMSYsIGNvbnN0IF9BcmcyJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feTsgfQp9 OwoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4gCnN0cnVjdCBwcm9qZWN0MXN0 IDogcHVibGljIF9Qcm9qZWN0MXN0PF9BcmcxLCBfQXJnMj4ge307Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0FyZzEsIGNsYXNzIF9BcmcyPgpzdHJ1Y3QgcHJvamVjdDJuZCA6IHB1YmxpYyBfUHJvamVjdDJu ZDxfQXJnMSwgX0FyZzI+IHt9OwoKIAogCiAKdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CnN0cnVj dCBjb25zdGFudF92b2lkX2Z1bgp7CiAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOwogIHJl c3VsdF90eXBlIF9fdmFsOwogIGNvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBf X3YpIDogX192YWwoX192KSB7fQogIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKCkgY29u c3QgeyByZXR1cm4gX192YWw7IH0KfTsgIAoKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFz cyBfQXJndW1lbnQgPSBfUmVzdWx0PgoKCgpzdHJ1Y3QgY29uc3RhbnRfdW5hcnlfZnVuIDogcHVi bGljIHVuYXJ5X2Z1bmN0aW9uPF9Bcmd1bWVudCwgX1Jlc3VsdD4gewogIF9SZXN1bHQgX01fdmFs OwogIGNvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpIDogX01fdmFsKF9fdikg e30KICBjb25zdCBfUmVzdWx0JiBvcGVyYXRvcigpKGNvbnN0IF9Bcmd1bWVudCYpIGNvbnN0IHsg cmV0dXJuIF9NX3ZhbDsgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJn MSA9IF9SZXN1bHQsIGNsYXNzIF9BcmcyID0gX0FyZzE+CgoKCnN0cnVjdCBjb25zdGFudF9iaW5h cnlfZnVuIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9SZXN1bHQ+IHsK ICBfUmVzdWx0IF9NX3ZhbDsKICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9f dikgOiBfTV92YWwoX192KSB7fQogIGNvbnN0IF9SZXN1bHQmIG9wZXJhdG9yKCkoY29uc3QgX0Fy ZzEmLCBjb25zdCBfQXJnMiYpIGNvbnN0IHsKICAgIHJldHVybiBfTV92YWw7CiAgfQp9OwoKdGVt cGxhdGUgPGNsYXNzIF9SZXN1bHQ+CmlubGluZSBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiBj b25zdGFudDAoY29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4gY29uc3RhbnRfdm9pZF9m dW48X1Jlc3VsdD4oX192YWwpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KaW5saW5lIGNv bnN0YW50X3VuYXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQ+IGNvbnN0YW50MShjb25zdCBfUmVzdWx0 JiBfX3ZhbCkKewogIHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0Pihf X3ZhbCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgppbmxpbmUgY29uc3RhbnRfYmluYXJ5 X2Z1bjxfUmVzdWx0LF9SZXN1bHQsX1Jlc3VsdD4gCmNvbnN0YW50Mihjb25zdCBfUmVzdWx0JiBf X3ZhbCkKewogIHJldHVybiBjb25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdCxfUmVz dWx0PihfX3ZhbCk7Cn0KCiAKIApjbGFzcyBzdWJ0cmFjdGl2ZV9ybmcgOiBwdWJsaWMgdW5hcnlf ZnVuY3Rpb248dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+IHsKcHJpdmF0ZToKICB1bnNpZ25l ZCBpbnQgX01fdGFibGVbNTVdOwogIHNpemVfdCBfTV9pbmRleDE7CiAgc2l6ZV90IF9NX2luZGV4 MjsKcHVibGljOgogIHVuc2lnbmVkIGludCBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX2xpbWl0 KSB7CiAgICBfTV9pbmRleDEgPSAoX01faW5kZXgxICsgMSkgJSA1NTsKICAgIF9NX2luZGV4MiA9 IChfTV9pbmRleDIgKyAxKSAlIDU1OwogICAgX01fdGFibGVbX01faW5kZXgxXSA9IF9NX3RhYmxl W19NX2luZGV4MV0gLSBfTV90YWJsZVtfTV9pbmRleDJdOwogICAgcmV0dXJuIF9NX3RhYmxlW19N X2luZGV4MV0gJSBfX2xpbWl0OwogIH0KCiAgdm9pZCBfTV9pbml0aWFsaXplKHVuc2lnbmVkIGlu dCBfX3NlZWQpCiAgewogICAgdW5zaWduZWQgaW50IF9fayA9IDE7CiAgICBfTV90YWJsZVs1NF0g PSBfX3NlZWQ7CiAgICBzaXplX3QgX19pOwogICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NDsgX19p KyspIHsKICAgICAgICBzaXplX3QgX19paSA9ICgyMSAqIChfX2kgKyAxKSAlIDU1KSAtIDE7CiAg ICAgICAgX01fdGFibGVbX19paV0gPSBfX2s7CiAgICAgICAgX19rID0gX19zZWVkIC0gX19rOwog ICAgICAgIF9fc2VlZCA9IF9NX3RhYmxlW19faWldOwogICAgfQogICAgZm9yIChpbnQgX19sb29w ID0gMDsgX19sb29wIDwgNDsgX19sb29wKyspIHsKICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8 IDU1OyBfX2krKykKICAgICAgICAgICAgX01fdGFibGVbX19pXSA9IF9NX3RhYmxlW19faV0gLSBf TV90YWJsZVsoMSArIF9faSArIDMwKSAlIDU1XTsKICAgIH0KICAgIF9NX2luZGV4MSA9IDA7CiAg ICBfTV9pbmRleDIgPSAzMTsKICB9CgogIHN1YnRyYWN0aXZlX3JuZyh1bnNpZ25lZCBpbnQgX19z ZWVkKSB7IF9NX2luaXRpYWxpemUoX19zZWVkKTsgfQogIHN1YnRyYWN0aXZlX3JuZygpIHsgX01f aW5pdGlhbGl6ZSgxNjE4MDMzOTh1KTsgfQp9OwoKCiAKCiAKIAogCiAKIAogCiAKCiAKIAogCiAK IAoKIAogCiAKIAogCgoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KY2xhc3MgbWVt X2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosX1JldD4gewpwdWJsaWM6CiAgZXhw bGljaXQgbWVtX2Z1bl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpIDogX01fZihfX3BmKSB7fQogIF9S ZXQgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0K cHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKSgpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SZXQs IGNsYXNzIF9UcD4KY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9u PGNvbnN0IF9UcCosX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl90KF9S ZXQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3Io KShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KcHJpdmF0 ZToKICBfUmV0IChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHA+CmNsYXNzIG1lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248 X1RwLF9SZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoq X19wZikoKSkgOiBfTV9mKF9fcGYpIHt9CiAgX1JldCBvcGVyYXRvcigpKF9UcCYgX19yKSBjb25z dCB7IHJldHVybiAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZiko KTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9m dW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+IHsKcHVibGljOgogIGV4 cGxpY2l0IGNvbnN0X21lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoqX19wZikoKSBjb25zdCkgOiBf TV9mKF9fcGYpIHt9CiAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IHJl dHVybiAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZikoKSBjb25z dDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNz IG1lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyxfUmV0PiB7CnB1 YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9N X2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7 IHJldHVybiAoX19wLT4qX01fZikoX194KTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2Yp KF9BcmcpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4K Y2xhc3MgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1Rw KixfQXJnLF9SZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3QoX1JldCAo X1RwOjoqX19wZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3Io KShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0CiAgICB7IHJldHVybiAoX19wLT4qX01f ZikoX194KTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0Owp9OwoK dGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgbWVtX2Z1 bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKcHVibGlj OgogIGV4cGxpY2l0IG1lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9N X2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7 IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZiko X0FyZyk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpj bGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9B cmcsX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3QoX1JldCAo X1RwOjoqX19wZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3Io KShjb25zdCBfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9f eCk7IH0KcHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgoKdGVt cGxhdGUgPGNsYXNzIF9UcD4KY2xhc3MgbWVtX2Z1bl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5h cnlfZnVuY3Rpb248X1RwKix2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuX3Qodm9p ZCAoX1RwOjoqX19wZikoKSkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBvcGVyYXRvcigpKF9UcCog X19wKSBjb25zdCB7IChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01f ZikoKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fdDx2b2lk LCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosdm9pZD4gewpwdWJsaWM6 CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDog X01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAo X19wLT4qX01fZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpjbGFzcyBtZW1fZnVuX3JlZl90PHZvaWQsIF9UcD4gOiBw dWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9m dW5fcmVmX3Qodm9pZCAoX1RwOjoqX19wZikoKSkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBvcGVy YXRvcigpKF9UcCYgX19yKSBjb25zdCB7IChfX3IuKl9NX2YpKCk7IH0KcHJpdmF0ZToKICB2b2lk IChfVHA6OipfTV9mKSgpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KY2xhc3MgY29uc3RfbWVt X2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCx2b2lkPiB7 CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYp KCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9f cikgY29uc3QgeyAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZiko KSBjb25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9m dW4xX3Q8dm9pZCwgX1RwLCBfQXJnPiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJn LHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW4xX3Qodm9pZCAoX1RwOjoqX19wZiko X0FyZykpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBf X3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6Oipf TV9mKShfQXJnKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNv bnN0X21lbV9mdW4xX3Q8dm9pZCwgX1RwLCBfQXJnPiAKICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rp b248Y29uc3QgX1RwKixfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9m dW4xX3Qodm9pZCAoX1RwOjoqX19wZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZv aWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9N X2YpKF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3JlZl90PHZv aWQsIF9UcCwgX0FyZz4KICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4g ewpwdWJsaWM6CiAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3Qodm9pZCAoX1RwOjoqX19wZikoX0Fy ZykpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fciwgX0FyZyBfX3gp IGNvbnN0IHsgKF9fci4qX01fZikoX194KTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2Yp KF9BcmcpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgY29uc3Rf bWVtX2Z1bjFfcmVmX3Q8dm9pZCwgX1RwLCBfQXJnPgogIDogcHVibGljIGJpbmFyeV9mdW5jdGlv bjxfVHAsX0FyZyx2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZf dCh2b2lkIChfVHA6OipfX3BmKShfQXJnKSBjb25zdCkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBv cGVyYXRvcigpKGNvbnN0IF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyAoX19yLipfTV9mKShf X3gpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07CgoKCiAK IAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmlubGluZSBtZW1fZnVuX3Q8 X1JldCxfVHA+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpKQogIHsgcmV0dXJuIG1lbV9mdW5f dDxfUmV0LF9UcD4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KaW5s aW5lIGNvbnN0X21lbV9mdW5fdDxfUmV0LF9UcD4gbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKCkg Y29uc3QpCiAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgbWVtX2Z1bl9yZWZfdDxfUmV0LF9U cD4gbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKSgpKSAKICB7IHJldHVybiBtZW1fZnVuX3Jl Zl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgpp bmxpbmUgY29uc3RfbWVtX2Z1bl9yZWZfdDxfUmV0LF9UcD4gbWVtX2Z1bl9yZWYoX1JldCAoX1Rw OjoqX19mKSgpIGNvbnN0KQogIHsgcmV0dXJuIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1JldCxfVHA+ KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Cmlu bGluZSBtZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShf QXJnKSkKICB7IHJldHVybiBtZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBs YXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1f ZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25z dCkKICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRl bXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVu MV9yZWZfdDxfUmV0LF9UcCxfQXJnPiBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9Bcmcp KQogIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBs YXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1f ZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPgptZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9B cmcpIGNvbnN0KQogIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+ KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+Cmlu bGluZSBtZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4xKF9SZXQgKF9UcDo6Kl9fZiko X0FyZykpCiAgeyByZXR1cm4gbWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVt X2Z1bjFfdDxfUmV0LF9UcCxfQXJnPiBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNv bnN0KQogIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoK dGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KaW5saW5lIG1lbV9m dW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4xX3JlZihfUmV0IChfVHA6OipfX2YpKF9B cmcpKQogIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRl bXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9t ZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPgptZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19m KShfQXJnKSBjb25zdCkKICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxf QXJnPihfX2YpOyB9CgogCgoKCiAKIAogCiMgNDMgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaGFzaHRhYmxlLmgiIDIgMwoK IyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1 ZGUvZysrLTMvc3RsX3ZlY3Rvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgogIAoKCgoKCgogCiAKIAogCiAKCgoKIAp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBf QWxsb2NhdG9yLCBib29sIF9Jc1N0YXRpYz4KY2xhc3MgX1ZlY3Rvcl9hbGxvY19iYXNlIHsKcHVi bGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0b3I+Ojph bGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUg Z2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2RhdGFfYWxsb2NhdG9yOyB9CgogIF9W ZWN0b3JfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfTV9kYXRh X2FsbG9jYXRvcihfX2EpLCBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3Rv cmFnZSgwKSAKICB7fQogIApwcm90ZWN0ZWQ6CiAgYWxsb2NhdG9yX3R5cGUgX01fZGF0YV9hbGxv Y2F0b3I7CiAgX1RwKiBfTV9zdGFydDsKICBfVHAqIF9NX2ZpbmlzaDsKICBfVHAqIF9NX2VuZF9v Zl9zdG9yYWdlOwoKICBfVHAqIF9NX2FsbG9jYXRlKHNpemVfdCBfX24pCiAgICB7IHJldHVybiBf TV9kYXRhX2FsbG9jYXRvci5hbGxvY2F0ZShfX24pOyB9CiAgdm9pZCBfTV9kZWFsbG9jYXRlKF9U cCogX19wLCBzaXplX3QgX19uKQogICAgeyBpZiAoX19wKSBfTV9kYXRhX2FsbG9jYXRvci5kZWFs bG9jYXRlKF9fcCwgX19uKTsgfQp9OwoKIAogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvY2F0b3I+CmNsYXNzIF9WZWN0b3JfYWxsb2NfYmFzZTxfVHAsIF9BbGxvY2F0b3IsIHRydWU+ IHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0 b3I+OjphbGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9y X3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKCk7IH0K CiAgX1ZlY3Rvcl9hbGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJikKICAgIDogX01fc3Rh cnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkgCiAge30KICAKcHJvdGVj dGVkOgogIF9UcCogX01fc3RhcnQ7CiAgX1RwKiBfTV9maW5pc2g7CiAgX1RwKiBfTV9lbmRfb2Zf c3RvcmFnZTsKCiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jYXRv cj46Ol9BbGxvY190eXBlIF9BbGxvY190eXBlOwogIF9UcCogX01fYWxsb2NhdGUoc2l6ZV90IF9f bikKICAgIHsgcmV0dXJuIF9BbGxvY190eXBlOjphbGxvY2F0ZShfX24pOyB9CiAgdm9pZCBfTV9k ZWFsbG9jYXRlKF9UcCogX19wLCBzaXplX3QgX19uKQogICAgeyBfQWxsb2NfdHlwZTo6ZGVhbGxv Y2F0ZShfX3AsIF9fbik7fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpz dHJ1Y3QgX1ZlY3Rvcl9iYXNlCiAgOiBwdWJsaWMgX1ZlY3Rvcl9hbGxvY19iYXNlPF9UcCwgX0Fs bG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2NfdHJhaXRzPF9UcCwgX0Fs bG9jPjo6X1NfaW5zdGFuY2VsZXNzPgp7CiAgdHlwZWRlZiBfVmVjdG9yX2FsbG9jX2Jhc2U8X1Rw LCBfQWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1Rw LCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsKICB0eXBlZGVmIHR5 cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgX1ZlY3Rvcl9i YXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7fQogIF9WZWN0b3Jf YmFzZShzaXplX3QgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IF9CYXNlKF9fYSkg ewogICAgX01fc3RhcnQgPSBfTV9hbGxvY2F0ZShfX24pOwogICAgX01fZmluaXNoID0gX01fc3Rh cnQ7CiAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9NX3N0YXJ0ICsgX19uOwogIH0KCiAgfl9WZWN0 b3JfYmFzZSgpIHsgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBf TV9zdGFydCk7IH0KfTsgICAgCgojIDE1MCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF92ZWN0b3IuaCIgMwoKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjwgX1RwID4gID4KY2xhc3MgdmVj dG9yIDogcHJvdGVjdGVkIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4gCnsKcHJpdmF0ZToKICB0 eXBlZGVmIF9WZWN0b3JfYmFzZTxfVHAsIF9BbGxvYz4gX0Jhc2U7CnB1YmxpYzoKICB0eXBlZGVm IF9UcCB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKICB0eXBlZGVm IGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBp dGVyYXRvcjsKICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X2l0ZXJhdG9yOwogIHR5 cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYg Y29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKICB0eXBlZGVmIHB0 cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CgogIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9j YXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3Io KSBjb25zdCB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CgoKICB0eXBlZGVmIHJl dmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CiAg dHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwoKCgoK CgoKcHJvdGVjdGVkOgoKICB1c2luZyBfQmFzZTo6X01fYWxsb2NhdGU7CiAgdXNpbmcgX0Jhc2U6 Ol9NX2RlYWxsb2NhdGU7CiAgdXNpbmcgX0Jhc2U6Ol9NX3N0YXJ0OwogIHVzaW5nIF9CYXNlOjpf TV9maW5pc2g7CiAgdXNpbmcgX0Jhc2U6Ol9NX2VuZF9vZl9zdG9yYWdlOwoKCnByb3RlY3RlZDoK ICB2b2lkIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gp OwogIHZvaWQgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uKTsKCnB1YmxpYzoKICBp dGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIF9NX3N0YXJ0OyB9CiAgY29uc3RfaXRlcmF0b3IgYmVn aW4oKSBjb25zdCB7IHJldHVybiBfTV9zdGFydDsgfQogIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJu IF9NX2ZpbmlzaDsgfQogIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2Zp bmlzaDsgfQoKICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpCiAgICB7IHJldHVybiByZXZlcnNl X2l0ZXJhdG9yKGVuZCgpKTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29u c3QKICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CiAgcmV2ZXJz ZV9pdGVyYXRvciByZW5kKCkKICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7 IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdAogICAgeyByZXR1cm4gY29u c3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQoKICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0 CiAgICB7IHJldHVybiBzaXplX3R5cGUoZW5kKCkgLSBiZWdpbigpKTsgfQogIHNpemVfdHlwZSBt YXhfc2l6ZSgpIGNvbnN0CiAgICB7IHJldHVybiBzaXplX3R5cGUoLTEpIC8gc2l6ZW9mKF9UcCk7 IH0KICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdAogICAgeyByZXR1cm4gc2l6ZV90eXBlKF9N X2VuZF9vZl9zdG9yYWdlIC0gYmVnaW4oKSk7IH0KICBib29sIGVtcHR5KCkgY29uc3QKICAgIHsg cmV0dXJuIGJlZ2luKCkgPT0gZW5kKCk7IH0KCiAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90 eXBlIF9fbikgeyByZXR1cm4gKihiZWdpbigpICsgX19uKTsgfQogIGNvbnN0X3JlZmVyZW5jZSBv cGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooYmVnaW4oKSArIF9fbik7 IH0KCiAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0 b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2EpIHt9CgogIHZlY3RvcihzaXplX3R5cGUgX19uLCBj b25zdCBfVHAmIF9fdmFsdWUsCiAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBh bGxvY2F0b3JfdHlwZSgpKSAKICAgIDogX0Jhc2UoX19uLCBfX2EpCiAgICB7IF9NX2ZpbmlzaCA9 IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0YXJ0LCBfX24sIF9fdmFsdWUpOyB9CgogIGV4cGxp Y2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQogICAgOiBfQmFzZShfX24sIGFsbG9jYXRvcl90eXBl KCkpCiAgICB7IF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0YXJ0LCBfX24s IF9UcCgpKTsgfQoKICB2ZWN0b3IoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KSAKICAg IDogX0Jhc2UoX194LnNpemUoKSwgX194LmdldF9hbGxvY2F0b3IoKSkKICAgIHsgX01fZmluaXNo ID0gdW5pbml0aWFsaXplZF9jb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9NX3N0YXJ0KTsg fQoKCiAgIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2ZWN0b3IoX0lucHV0 SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICBjb25zdCBh bGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBfQmFzZShfX2EpIHsKICAg IHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfSW50ZWdyYWwg X0ludGVncmFsOwogICAgX01faW5pdGlhbGl6ZV9hdXgoX19maXJzdCwgX19sYXN0LCBfSW50ZWdy YWwoKSk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CiAgdm9pZCBfTV9pbml0aWFs aXplX2F1eChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsdWUsIF9fdHJ1ZV90eXBlKSB7CiAg ICBfTV9zdGFydCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9N X3N0YXJ0ICsgX19uOyAKICAgIF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0 YXJ0LCBfX24sIF9fdmFsdWUpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9y PgogIHZvaWQgX01faW5pdGlhbGl6ZV9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0 SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBlKSB7 CiAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRl Z29yeSggX19maXJzdCApICk7CiAgfQoKCgoKCgoKCiAgfnZlY3RvcigpIHsgZGVzdHJveShfTV9z dGFydCwgX01fZmluaXNoKTsgfQoKICB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBvcGVyYXRvcj0oY29u c3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KTsKICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9f bikgewogICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKICAgICAgY29uc3Qgc2l6ZV90eXBlIF9f b2xkX3NpemUgPSBzaXplKCk7CiAgICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2NhdGVfYW5k X2NvcHkoX19uLCBfTV9zdGFydCwgX01fZmluaXNoKTsKICAgICAgZGVzdHJveShfTV9zdGFydCwg X01fZmluaXNoKTsKICAgICAgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3Jh Z2UgLSBfTV9zdGFydCk7CiAgICAgIF9NX3N0YXJ0ID0gX190bXA7CiAgICAgIF9NX2ZpbmlzaCA9 IF9fdG1wICsgX19vbGRfc2l6ZTsKICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfTV9zdGFydCAr IF9fbjsKICAgIH0KICB9CgogICAKICAgCiAgIAogICAKCiAgdm9pZCBhc3NpZ24oc2l6ZV90eXBl IF9fbiwgY29uc3QgX1RwJiBfX3ZhbCk7CgoKICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl cmF0b3I+CiAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0 b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJh dG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsKICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0 LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4K ICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBf X3RydWVfdHlwZSkKICAgIHsgYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOyB9 CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNo KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkKICAg IHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9f Zmlyc3QgKSApOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9N X2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpOwoKICB0ZW1wbGF0ZSA8 Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVy YXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpOyAKCgoKICByZWZlcmVuY2UgZnJvbnQoKSB7IHJldHVy biAqYmVnaW4oKTsgfQogIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpi ZWdpbigpOyB9CiAgcmVmZXJlbmNlIGJhY2soKSB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KICBj b25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQoKICB2 b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkgewogICAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9l bmRfb2Zfc3RvcmFnZSkgewogICAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCBfX3gpOwogICAgICAr K19NX2ZpbmlzaDsKICAgIH0KICAgIGVsc2UKICAgICAgX01faW5zZXJ0X2F1eChlbmQoKSwgX194 KTsKICB9CiAgdm9pZCBwdXNoX2JhY2soKSB7CiAgICBpZiAoX01fZmluaXNoICE9IF9NX2VuZF9v Zl9zdG9yYWdlKSB7CiAgICAgIGNvbnN0cnVjdChfTV9maW5pc2gpOwogICAgICArK19NX2Zpbmlz aDsKICAgIH0KICAgIGVsc2UKICAgICAgX01faW5zZXJ0X2F1eChlbmQoKSk7CiAgfQogIHZvaWQg c3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpIHsKICAgICA6OnN3YXAoX01fc3RhcnQsIF9f eC5fTV9zdGFydCk7CiAgICAgOjpzd2FwKF9NX2ZpbmlzaCwgX194Ll9NX2ZpbmlzaCk7CiAgICAg Ojpzd2FwKF9NX2VuZF9vZl9zdG9yYWdlLCBfX3guX01fZW5kX29mX3N0b3JhZ2UpOwogIH0KCiAg aXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KSB7CiAg ICBzaXplX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01fZmluaXNo ICE9IF9NX2VuZF9vZl9zdG9yYWdlICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKICAgICAgY29u c3RydWN0KF9NX2ZpbmlzaCwgX194KTsKICAgICAgKytfTV9maW5pc2g7CiAgICB9CiAgICBlbHNl CiAgICAgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgX194KTsKICAgIHJldHVybiBiZWdpbigp ICsgX19uOwogIH0KICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAg c2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOwogICAgaWYgKF9NX2ZpbmlzaCAh PSBfTV9lbmRfb2Zfc3RvcmFnZSAmJiBfX3Bvc2l0aW9uID09IGVuZCgpKSB7CiAgICAgIGNvbnN0 cnVjdChfTV9maW5pc2gpOwogICAgICArK19NX2ZpbmlzaDsKICAgIH0KICAgIGVsc2UKICAgICAg X01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uKTsKICAgIHJldHVybiBiZWdpbigpICsgX19uOwogIH0K CiAgIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydChpdGVy YXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0lu dGVncmFsIF9JbnRlZ3JhbDsKICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwg X19sYXN0LCBfSW50ZWdyYWwoKSk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CiAg dm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0lu dGVnZXIgX192YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5cGUpIHsKICAg IGluc2VydChfX3BvcywgKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7CiAgfQoKICB0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRl cmF0b3IgX19wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19m aXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9f ZmFsc2VfdHlwZSkgewogICAgX01fcmFuZ2VfaW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3Qs IF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOwogIH0KCgoKCgogIHZvaWQgaW5zZXJ0 IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpOwoKICB2b2lk IHBvcF9iYWNrKCkgewogICAgLS1fTV9maW5pc2g7CiAgICBkZXN0cm95KF9NX2ZpbmlzaCk7CiAg fQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsKICAgIGlmIChfX3Bvc2l0 aW9uICsgMSAhPSBlbmQoKSkKICAgICAgY29weShfX3Bvc2l0aW9uICsgMSwgX01fZmluaXNoLCBf X3Bvc2l0aW9uKTsKICAgIC0tX01fZmluaXNoOwogICAgZGVzdHJveShfTV9maW5pc2gpOwogICAg cmV0dXJuIF9fcG9zaXRpb247CiAgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3Qs IGl0ZXJhdG9yIF9fbGFzdCkgewogICAgaXRlcmF0b3IgX19pID0gY29weShfX2xhc3QsIF9NX2Zp bmlzaCwgX19maXJzdCk7CiAgICBkZXN0cm95KF9faSwgX01fZmluaXNoKTsKICAgIF9NX2Zpbmlz aCA9IF9NX2ZpbmlzaCAtIChfX2xhc3QgLSBfX2ZpcnN0KTsKICAgIHJldHVybiBfX2ZpcnN0Owog IH0KCiAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IF9UcCYgX194KSB7 CiAgICBpZiAoX19uZXdfc2l6ZSA8IHNpemUoKSkgCiAgICAgIGVyYXNlKGJlZ2luKCkgKyBfX25l d19zaXplLCBlbmQoKSk7CiAgICBlbHNlCiAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAt IHNpemUoKSwgX194KTsKICB9CiAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpIHsg cmVzaXplKF9fbmV3X3NpemUsIF9UcCgpKTsgfQogIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2lu KCksIGVuZCgpKTsgfQoKcHJvdGVjdGVkOgoKCiAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRl cmF0b3I+CiAgaXRlcmF0b3IgX01fYWxsb2NhdGVfYW5kX2NvcHkoc2l6ZV90eXBlIF9fbiwgX0Zv cndhcmRJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKewogICAgaXRlcmF0b3IgX19y ZXN1bHQgPSBfTV9hbGxvY2F0ZShfX24pOwogICAgdHJ5ICB7CiAgICAgIHVuaW5pdGlhbGl6ZWRf Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKICAgICAgcmV0dXJuIF9fcmVzdWx0Owog ICAgfQogICAgY2F0Y2goLi4uKSB7ICBfTV9kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pIDsgdGhy b3c7IH0gOwogIH0KIyA0NDAgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfdmVjdG9yLmgiIDMKCgoKCiAgdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVy YXRvciBfX2ZpcnN0LCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9y IF9fbGFzdCwgaW5wdXRfaXRlcmF0b3JfdGFnKQogIHsKICAgIGZvciAoIDsgX19maXJzdCAhPSBf X2xhc3Q7ICsrX19maXJzdCkKICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKICB9CgogICAKICB0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KICB2b2lkIF9NX3JhbmdlX2luaXRpYWxp emUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBf Rm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgZm9yd2FyZF9pdGVyYXRvcl90YWcpCiAgewogICAgc2l6 ZV90eXBlIF9fbiA9IDA7CiAgICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbik7CiAgICBf TV9zdGFydCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9NX3N0 YXJ0ICsgX19uOwogICAgX01fZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9f bGFzdCwgX01fc3RhcnQpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgog IHZvaWQgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAogICAgICAgICAgICAgICAgICAg ICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpOwoKICB0ZW1wbGF0ZSA8Y2xhc3Mg X0ZvcndhcmRJdGVyYXRvcj4KICB2b2lkIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywK ICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJk SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3Jf dGFnKTsKCgp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9v bCAKb3BlcmF0b3I9PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3Rv cjxfVHAsIF9BbGxvYz4mIF9feSkKewogIHJldHVybiBfX3guc2l6ZSgpID09IF9feS5zaXplKCkg JiYKICAgICAgICAgZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIApvcGVyYXRv cjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxs b2M+JiBfX3kpCnsKICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCks IF9feC5lbmQoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feS5iZWdpbigp LCBfX3kuZW5kKCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KaW5s aW5lIHZvaWQgc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIHZlY3RvcjxfVHAsIF9BbGxv Yz4mIF9feSkKewogIF9feC5zd2FwKF9feSk7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xh c3MgX0FsbG9jPgp2ZWN0b3I8X1RwLF9BbGxvYz4mIAp2ZWN0b3I8X1RwLF9BbGxvYz46Om9wZXJh dG9yPShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpCnsKICBpZiAoJl9feCAhPSB0aGlz KSB7CiAgICBjb25zdCBzaXplX3R5cGUgX194bGVuID0gX194LnNpemUoKTsKICAgIGlmIChfX3hs ZW4gPiBjYXBhY2l0eSgpKSB7CiAgICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2NhdGVfYW5k X2NvcHkoX194bGVuLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKICAgICAgZGVzdHJveShfTV9z dGFydCwgX01fZmluaXNoKTsKICAgICAgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29m X3N0b3JhZ2UgLSBfTV9zdGFydCk7CiAgICAgIF9NX3N0YXJ0ID0gX190bXA7CiAgICAgIF9NX2Vu ZF9vZl9zdG9yYWdlID0gX01fc3RhcnQgKyBfX3hsZW47CiAgICB9CiAgICBlbHNlIGlmIChzaXpl KCkgPj0gX194bGVuKSB7CiAgICAgIGl0ZXJhdG9yIF9faSA9IGNvcHkoX194LmJlZ2luKCksIF9f eC5lbmQoKSwgYmVnaW4oKSk7CiAgICAgIGRlc3Ryb3koX19pLCBfTV9maW5pc2gpOwogICAgfQog ICAgZWxzZSB7CiAgICAgIGNvcHkoX194LmJlZ2luKCksIF9feC5iZWdpbigpICsgc2l6ZSgpLCBf TV9zdGFydCk7CiAgICAgIHVuaW5pdGlhbGl6ZWRfY29weShfX3guYmVnaW4oKSArIHNpemUoKSwg X194LmVuZCgpLCBfTV9maW5pc2gpOwogICAgfQogICAgX01fZmluaXNoID0gX01fc3RhcnQgKyBf X3hsZW47CiAgfQogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0FsbG9jPgp2b2lkIHZlY3RvcjxfVHAsIF9BbGxvYz46OmFzc2lnbihzaXplX3QgX19uLCBjb25z dCB2YWx1ZV90eXBlJiBfX3ZhbCkgewogIGlmIChfX24gPiBjYXBhY2l0eSgpKSB7CiAgICB2ZWN0 b3I8X1RwLCBfQWxsb2M+IF9fdG1wKF9fbiwgX192YWwsIGdldF9hbGxvY2F0b3IoKSk7CiAgICBf X3RtcC5zd2FwKCp0aGlzKTsKICB9CiAgZWxzZSBpZiAoX19uID4gc2l6ZSgpKSB7CiAgICBmaWxs KGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CiAgICBfTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2Zp bGxfbihfTV9maW5pc2gsIF9fbiAtIHNpemUoKSwgX192YWwpOwogIH0KICBlbHNlCiAgICBlcmFz ZShmaWxsX24oYmVnaW4oKSwgX19uLCBfX3ZhbCksIGVuZCgpKTsKfQoKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwLCBjbGFzcyBfQWxsb2M+IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgp2b2lkIHZl Y3RvcjxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5w dXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu cHV0X2l0ZXJhdG9yX3RhZykgewogIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKICBmb3IgKCA7 IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3Qp CiAgICAqX19jdXIgPSAqX19maXJzdDsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICBlcmFz ZShfX2N1ciwgZW5kKCkpOwogIGVsc2UKICAgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0 KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8Y2xhc3Mg X0ZvcndhcmRJdGVyPgp2b2lkCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9hdXgoX0Zv cndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKICBzaXplX3R5cGUgX19s ZW4gPSAwOwogIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwoKICBpZiAoX19sZW4g PiBjYXBhY2l0eSgpKSB7CiAgICBpdGVyYXRvciBfX3RtcCA9IF9NX2FsbG9jYXRlX2FuZF9jb3B5 KF9fbGVuLCBfX2ZpcnN0LCBfX2xhc3QpOwogICAgZGVzdHJveShfTV9zdGFydCwgX01fZmluaXNo KTsKICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3Rh cnQpOwogICAgX01fc3RhcnQgPSBfX3RtcDsKICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX01fZmlu aXNoID0gX01fc3RhcnQgKyBfX2xlbjsKICB9CiAgZWxzZSBpZiAoc2l6ZSgpID49IF9fbGVuKSB7 CiAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX01fc3Rh cnQpOwogICAgZGVzdHJveShfX25ld19maW5pc2gsIF9NX2ZpbmlzaCk7CiAgICBfTV9maW5pc2gg PSBfX25ld19maW5pc2g7CiAgfQogIGVsc2UgewogICAgX0ZvcndhcmRJdGVyIF9fbWlkID0gX19m aXJzdDsKICAgIGFkdmFuY2UoX19taWQsIHNpemUoKSk7CiAgICBjb3B5KF9fZmlyc3QsIF9fbWlk LCBfTV9zdGFydCk7CiAgICBfTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9f bGFzdCwgX01fZmluaXNoKTsKICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Fs bG9jPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9f cG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQp7CiAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9lbmRfb2Zf c3RvcmFnZSkgewogICAgY29uc3RydWN0KF9NX2ZpbmlzaCwgKihfTV9maW5pc2ggLSAxKSk7CiAg ICArK19NX2ZpbmlzaDsKICAgIF9UcCBfX3hfY29weSA9IF9feDsKICAgIGNvcHlfYmFja3dhcmQo X19wb3NpdGlvbiwgX01fZmluaXNoIC0gMiwgX01fZmluaXNoIC0gMSk7CiAgICAqX19wb3NpdGlv biA9IF9feF9jb3B5OwogIH0KICBlbHNlIHsKICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXpl ID0gc2l6ZSgpOwogICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSAhPSAwID8g MiAqIF9fb2xkX3NpemUgOiAxOwogICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9hbGxvY2F0 ZShfX2xlbik7CiAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKICAgIHRy eSAgewogICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX01fc3RhcnQsIF9f cG9zaXRpb24sIF9fbmV3X3N0YXJ0KTsKICAgICAgY29uc3RydWN0KF9fbmV3X2ZpbmlzaCwgX194 KTsKICAgICAgKytfX25ld19maW5pc2g7CiAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6 ZWRfY29weShfX3Bvc2l0aW9uLCBfTV9maW5pc2gsIF9fbmV3X2ZpbmlzaCk7CiAgICB9CiAgICBj YXRjaCguLi4pIHsgIChkZXN0cm95KF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksIAogICAgICAg ICAgICAgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LF9fbGVuKSkgOyB0aHJvdzsgfSA7 CiAgICBkZXN0cm95KGJlZ2luKCksIGVuZCgpKTsKICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQs IF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQpOwogICAgX01fc3RhcnQgPSBfX25ld19zdGFy dDsKICAgIF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICAgIF9NX2VuZF9vZl9zdG9yYWdlID0g X19uZXdfc3RhcnQgKyBfX2xlbjsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvYz4Kdm9pZCAKdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01faW5zZXJ0X2F1eChpdGVyYXRvciBf X3Bvc2l0aW9uKQp7CiAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAg Y29uc3RydWN0KF9NX2ZpbmlzaCwgKihfTV9maW5pc2ggLSAxKSk7CiAgICArK19NX2ZpbmlzaDsK ICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgX01fZmluaXNoIC0gMiwgX01fZmluaXNoIC0g MSk7CiAgICAqX19wb3NpdGlvbiA9IF9UcCgpOwogIH0KICBlbHNlIHsKICAgIGNvbnN0IHNpemVf dHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOwogICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19v bGRfc2l6ZSAhPSAwID8gMiAqIF9fb2xkX3NpemUgOiAxOwogICAgaXRlcmF0b3IgX19uZXdfc3Rh cnQgPSBfTV9hbGxvY2F0ZShfX2xlbik7CiAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfX25l d19zdGFydDsKICAgIHRyeSAgewogICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2Nv cHkoX01fc3RhcnQsIF9fcG9zaXRpb24sIF9fbmV3X3N0YXJ0KTsKICAgICAgY29uc3RydWN0KF9f bmV3X2ZpbmlzaCk7CiAgICAgICsrX19uZXdfZmluaXNoOwogICAgICBfX25ld19maW5pc2ggPSB1 bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX01fZmluaXNoLCBfX25ld19maW5pc2gpOwog ICAgfQogICAgY2F0Y2goLi4uKSB7ICAoZGVzdHJveShfX25ld19zdGFydCxfX25ld19maW5pc2gp LCAKICAgICAgICAgICAgICAgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpIDsg dGhyb3c7IH0gOwogICAgZGVzdHJveShiZWdpbigpLCBlbmQoKSk7CiAgICBfTV9kZWFsbG9jYXRl KF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgIF9NX3N0YXJ0ID0g X19uZXdfc3RhcnQ7CiAgICBfTV9maW5pc2ggPSBfX25ld19maW5pc2g7CiAgICBfTV9lbmRfb2Zf c3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6aW5zZXJ0KGl0ZXJhdG9y IF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBfVHAmIF9feCkKewogIGlmIChfX24gIT0gMCkgewogICAgaWYgKHNpemVfdHlw ZShfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ZpbmlzaCkgPj0gX19uKSB7CiAgICAgIF9UcCBfX3hf Y29weSA9IF9feDsKICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPSBfTV9maW5p c2ggLSBfX3Bvc2l0aW9uOwogICAgICBpdGVyYXRvciBfX29sZF9maW5pc2ggPSBfTV9maW5pc2g7 CiAgICAgIGlmIChfX2VsZW1zX2FmdGVyID4gX19uKSB7CiAgICAgICAgdW5pbml0aWFsaXplZF9j b3B5KF9NX2ZpbmlzaCAtIF9fbiwgX01fZmluaXNoLCBfTV9maW5pc2gpOwogICAgICAgIF9NX2Zp bmlzaCArPSBfX247CiAgICAgICAgY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfX29sZF9maW5p c2ggLSBfX24sIF9fb2xkX2ZpbmlzaCk7CiAgICAgICAgZmlsbChfX3Bvc2l0aW9uLCBfX3Bvc2l0 aW9uICsgX19uLCBfX3hfY29weSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgdW5pbml0 aWFsaXplZF9maWxsX24oX01fZmluaXNoLCBfX24gLSBfX2VsZW1zX2FmdGVyLCBfX3hfY29weSk7 CiAgICAgICAgX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CiAgICAgICAgdW5pbml0 aWFsaXplZF9jb3B5KF9fcG9zaXRpb24sIF9fb2xkX2ZpbmlzaCwgX01fZmluaXNoKTsKICAgICAg ICBfTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKICAgICAgICBmaWxsKF9fcG9zaXRpb24sIF9f b2xkX2ZpbmlzaCwgX194X2NvcHkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgY29u c3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7ICAgICAgICAKICAgICAgY29uc3Qgc2l6 ZV90eXBlIF9fbGVuID0gX19vbGRfc2l6ZSArIG1heChfX29sZF9zaXplLCBfX24pOwogICAgICBp dGVyYXRvciBfX25ld19zdGFydCA9IF9NX2FsbG9jYXRlKF9fbGVuKTsKICAgICAgaXRlcmF0b3Ig X19uZXdfZmluaXNoID0gX19uZXdfc3RhcnQ7CiAgICAgIHRyeSAgewogICAgICAgIF9fbmV3X2Zp bmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfTV9zdGFydCwgX19wb3NpdGlvbiwgX19uZXdfc3Rh cnQpOwogICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fbmV3X2Zp bmlzaCwgX19uLCBfX3gpOwogICAgICAgIF9fbmV3X2ZpbmlzaAogICAgICAgICAgPSB1bmluaXRp YWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX01fZmluaXNoLCBfX25ld19maW5pc2gpOwogICAgICB9 CiAgICAgIGNhdGNoKC4uLikgeyAgKGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwg CiAgICAgICAgICAgICAgICAgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikpIDsg dGhyb3c7IH0gOwogICAgICBkZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBfTV9k ZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgICAg X01fc3RhcnQgPSBfX25ld19zdGFydDsKICAgICAgX01fZmluaXNoID0gX19uZXdfZmluaXNoOwog ICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CiAgICB9CiAgfQp9 CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9J bnB1dEl0ZXJhdG9yPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9yYW5nZV9pbnNlcnQo aXRlcmF0b3IgX19wb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcmF0b3IgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyAr K19fZmlyc3QpIHsKICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CiAgICArK19f cG9zOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8 Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4Kdm9pZCAKdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fcmFu Z2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQp7CiAgaWYgKF9fZmly c3QgIT0gX19sYXN0KSB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAgIGRpc3RhbmNlKF9fZmly c3QsIF9fbGFzdCwgX19uKTsKICAgIGlmIChzaXplX3R5cGUoX01fZW5kX29mX3N0b3JhZ2UgLSBf TV9maW5pc2gpID49IF9fbikgewogICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9 IF9NX2ZpbmlzaCAtIF9fcG9zaXRpb247CiAgICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IF9N X2ZpbmlzaDsKICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKICAgICAgICB1bmluaXRp YWxpemVkX2NvcHkoX01fZmluaXNoIC0gX19uLCBfTV9maW5pc2gsIF9NX2ZpbmlzaCk7CiAgICAg ICAgX01fZmluaXNoICs9IF9fbjsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIF9f b2xkX2ZpbmlzaCAtIF9fbiwgX19vbGRfZmluaXNoKTsKICAgICAgICBjb3B5KF9fZmlyc3QsIF9f bGFzdCwgX19wb3NpdGlvbik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgX0ZvcndhcmRJ dGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CiAgICAgICAgYWR2YW5jZShfX21pZCwgX19lbGVtc19h ZnRlcik7CiAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fbWlkLCBfX2xhc3QsIF9NX2Zpbmlz aCk7CiAgICAgICAgX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CiAgICAgICAgdW5p bml0aWFsaXplZF9jb3B5KF9fcG9zaXRpb24sIF9fb2xkX2ZpbmlzaCwgX01fZmluaXNoKTsKICAg ICAgICBfTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKICAgICAgICBjb3B5KF9fZmlyc3QsIF9f bWlkLCBfX3Bvc2l0aW9uKTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGNvbnN0IHNp emVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOwogICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4g PSBfX29sZF9zaXplICsgbWF4KF9fb2xkX3NpemUsIF9fbik7CiAgICAgIGl0ZXJhdG9yIF9fbmV3 X3N0YXJ0ID0gX01fYWxsb2NhdGUoX19sZW4pOwogICAgICBpdGVyYXRvciBfX25ld19maW5pc2gg PSBfX25ld19zdGFydDsKICAgICAgdHJ5ICB7CiAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0 aWFsaXplZF9jb3B5KF9NX3N0YXJ0LCBfX3Bvc2l0aW9uLCBfX25ld19zdGFydCk7CiAgICAgICAg X19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19uZXdf ZmluaXNoKTsKICAgICAgICBfX25ld19maW5pc2gKICAgICAgICAgID0gdW5pbml0aWFsaXplZF9j b3B5KF9fcG9zaXRpb24sIF9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsKICAgICAgfQogICAgICBj YXRjaCguLi4pIHsgIChkZXN0cm95KF9fbmV3X3N0YXJ0LF9fbmV3X2ZpbmlzaCksIAogICAgICAg ICAgICAgICAgICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSA7IHRocm93OyB9 IDsKICAgICAgZGVzdHJveShfTV9zdGFydCwgX01fZmluaXNoKTsKICAgICAgX01fZGVhbGxvY2F0 ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydCk7CiAgICAgIF9NX3N0YXJ0 ID0gX19uZXdfc3RhcnQ7CiAgICAgIF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICAgICAgX01f ZW5kX29mX3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOwogICAgfQogIH0KfQoKIyA4MTAg Ii91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfdmVjdG9yLmgiIDMKCgoKCgoKCiAgCgoKCiAKIAogCiMgNDQgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaGFz aHRhYmxlLmgiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2hfZnVuLmgiIDEgMwogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKIyAzNDIgIi91c3IvbGliL2djYy1saWIvaTM4Ni1s aW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKIyAzNCAiL3Vzci9saWIvZ2NjLWxpYi9p Mzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9oYXNoX2Z1bi5o IiAyIDMKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleT4gc3RydWN0IGhhc2ggeyB9OwoKaW5saW5l IHNpemVfdCBfX3N0bF9oYXNoX3N0cmluZyhjb25zdCBjaGFyKiBfX3MpCnsKICB1bnNpZ25lZCBs b25nIF9faCA9IDA7IAogIGZvciAoIDsgKl9fczsgKytfX3MpCiAgICBfX2ggPSA1Kl9faCArICpf X3M7CiAgCiAgcmV0dXJuIHNpemVfdChfX2gpOwp9Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgaGFzaDxj aGFyKj4KewogIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIF9fcykgY29uc3QgeyByZXR1 cm4gX19zdGxfaGFzaF9zdHJpbmcoX19zKTsgfQp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IGhhc2g8 Y29uc3QgY2hhcio+CnsKICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBfX3MpIGNvbnN0 IHsgcmV0dXJuIF9fc3RsX2hhc2hfc3RyaW5nKF9fcyk7IH0KfTsKCnRlbXBsYXRlPD4gIHN0cnVj dCBoYXNoPGNoYXI+IHsKICBzaXplX3Qgb3BlcmF0b3IoKShjaGFyIF9feCkgY29uc3QgeyByZXR1 cm4gX194OyB9Cn07CnRlbXBsYXRlPD4gIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGNoYXI+IHsKICBz aXplX3Qgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9 Cn07CnRlbXBsYXRlPD4gIHN0cnVjdCBoYXNoPHNpZ25lZCBjaGFyPiB7CiAgc2l6ZV90IG9wZXJh dG9yKCkodW5zaWduZWQgY2hhciBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9Owp0ZW1wbGF0 ZTw+ICBzdHJ1Y3QgaGFzaDxzaG9ydD4gewogIHNpemVfdCBvcGVyYXRvcigpKHNob3J0IF9feCkg Y29uc3QgeyByZXR1cm4gX194OyB9Cn07CnRlbXBsYXRlPD4gIHN0cnVjdCBoYXNoPHVuc2lnbmVk IHNob3J0PiB7CiAgc2l6ZV90IG9wZXJhdG9yKCkodW5zaWduZWQgc2hvcnQgX194KSBjb25zdCB7 IHJldHVybiBfX3g7IH0KfTsKdGVtcGxhdGU8PiAgc3RydWN0IGhhc2g8aW50PiB7CiAgc2l6ZV90 IG9wZXJhdG9yKCkoaW50IF9feCkgY29uc3QgeyByZXR1cm4gX194OyB9Cn07CnRlbXBsYXRlPD4g IHN0cnVjdCBoYXNoPHVuc2lnbmVkIGludD4gewogIHNpemVfdCBvcGVyYXRvcigpKHVuc2lnbmVk IGludCBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9Owp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgaGFz aDxsb25nPiB7CiAgc2l6ZV90IG9wZXJhdG9yKCkobG9uZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9f eDsgfQp9Owp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBsb25nPiB7CiAgc2l6ZV90 IG9wZXJhdG9yKCkodW5zaWduZWQgbG9uZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9OwoK IAoKCgogCiAKIAojIDQ1ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2h0YWJsZS5oIiAyIDMKCgogCgp0ZW1wbGF0ZSA8 Y2xhc3MgX1ZhbD4Kc3RydWN0IF9IYXNodGFibGVfbm9kZQp7CiAgX0hhc2h0YWJsZV9ub2RlKiBf TV9uZXh0OwogIF9WYWwgX01fdmFsOwp9OyAgCgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3Mg X0tleSwgY2xhc3MgX0hhc2hGY24sCiAgICAgICAgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3Mg X0VxdWFsS2V5LCBjbGFzcyBfQWxsb2MgPSBhbGxvYz4KY2xhc3MgaGFzaHRhYmxlOwoKdGVtcGxh dGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IYXNoRmNuLAogICAgICAgICAgY2xh c3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0hh c2h0YWJsZV9pdGVyYXRvcjsKCnRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFz cyBfSGFzaEZjbiwKICAgICAgICAgIGNsYXNzIF9FeHRyYWN0S2V5LCBjbGFzcyBfRXF1YWxLZXks IGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I7Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCiAgICAgICAgICBjbGFz cyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBfSGFz aHRhYmxlX2l0ZXJhdG9yIHsKICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hhc2hGY24s X0V4dHJhY3RLZXksX0VxdWFsS2V5LF9BbGxvYz4KICAgICAgICAgIF9IYXNodGFibGU7CiAgdHlw ZWRlZiBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgogICAg ICAgICAgaXRlcmF0b3I7CiAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWws IF9LZXksIF9IYXNoRmNuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0V4 dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgogICAgICAgICAgY29uc3RfaXRlcmF0b3I7CiAg dHlwZWRlZiBfSGFzaHRhYmxlX25vZGU8X1ZhbD4gX05vZGU7CgogIHR5cGVkZWYgZm9yd2FyZF9p dGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgc2l6ZV90IHNp emVfdHlwZTsKICB0eXBlZGVmIF9WYWwmIHJlZmVyZW5jZTsKICB0eXBlZGVmIF9WYWwqIHBvaW50 ZXI7CgogIF9Ob2RlKiBfTV9jdXI7CiAgX0hhc2h0YWJsZSogX01faHQ7CgogIF9IYXNodGFibGVf aXRlcmF0b3IoX05vZGUqIF9fbiwgX0hhc2h0YWJsZSogX190YWIpIAogICAgOiBfTV9jdXIoX19u KSwgX01faHQoX190YWIpIHt9CiAgX0hhc2h0YWJsZV9pdGVyYXRvcigpIHt9CiAgcmVmZXJlbmNl IG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1ci0+X01fdmFsOyB9CgogIHBvaW50ZXIg b3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CgogIGl0ZXJhdG9y JiBvcGVyYXRvcisrKCk7CiAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOwogIGJvb2wgb3BlcmF0 b3I9PShjb25zdCBpdGVyYXRvciYgX19pdCkgY29uc3QKICAgIHsgcmV0dXJuIF9NX2N1ciA9PSBf X2l0Ll9NX2N1cjsgfQogIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgX19pdCkgY29u c3QKICAgIHsgcmV0dXJuIF9NX2N1ciAhPSBfX2l0Ll9NX2N1cjsgfQp9OwoKCnRlbXBsYXRlIDxj bGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKICAgICAgICAgIGNsYXNzIF9F eHRyYWN0S2V5LCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9IYXNodGFi bGVfY29uc3RfaXRlcmF0b3IgewogIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWwsX0tleSxfSGFzaEZj bixfRXh0cmFjdEtleSxfRXF1YWxLZXksX0FsbG9jPgogICAgICAgICAgX0hhc2h0YWJsZTsKICB0 eXBlZGVmIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCxfS2V5LF9IYXNoRmNuLCAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0V4dHJhY3RLZXksX0VxdWFsS2V5LF9BbGxvYz4KICAgICAg ICAgIGl0ZXJhdG9yOwogIHR5cGVkZWYgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBf S2V5LCBfSGFzaEZjbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FeHRy YWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOwogIHR5 cGVkZWYgX0hhc2h0YWJsZV9ub2RlPF9WYWw+IF9Ob2RlOwoKICB0eXBlZGVmIGZvcndhcmRfaXRl cmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1ZhbCB2YWx1ZV90eXBlOwog IHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHNpemVfdCBzaXpl X3R5cGU7CiAgdHlwZWRlZiBjb25zdCBfVmFsJiByZWZlcmVuY2U7CiAgdHlwZWRlZiBjb25zdCBf VmFsKiBwb2ludGVyOwoKICBjb25zdCBfTm9kZSogX01fY3VyOwogIGNvbnN0IF9IYXNodGFibGUq IF9NX2h0OwoKICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlKiBfX24sIGNv bnN0IF9IYXNodGFibGUqIF9fdGFiKQogICAgOiBfTV9jdXIoX19uKSwgX01faHQoX190YWIpIHt9 CiAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcigpIHt9CiAgX0hhc2h0YWJsZV9jb25zdF9pdGVy YXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkgCiAgICA6IF9NX2N1cihfX2l0Ll9NX2N1ciksIF9N X2h0KF9faXQuX01faHQpIHt9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJu IF9NX2N1ci0+X01fdmFsOyB9CgogIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJu ICYob3BlcmF0b3IqKCkpOyB9CgogIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CiAgY29u c3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOwogIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb25z dF9pdGVyYXRvciYgX19pdCkgY29uc3QgCiAgICB7IHJldHVybiBfTV9jdXIgPT0gX19pdC5fTV9j dXI7IH0KICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIGNvbnN0 IAogICAgeyByZXR1cm4gX01fY3VyICE9IF9faXQuX01fY3VyOyB9Cn07CgogCnN0YXRpYyBjb25z dCBpbnQgX19zdGxfbnVtX3ByaW1lcyA9IDI4OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBf X3N0bF9wcmltZV9saXN0W19fc3RsX251bV9wcmltZXNdID0KewogIDUzdWwsICAgICAgICAgOTd1 bCwgICAgICAgICAxOTN1bCwgICAgICAgMzg5dWwsICAgICAgIDc2OXVsLAogIDE1NDN1bCwgICAg ICAgMzA3OXVsLCAgICAgICA2MTUxdWwsICAgICAgMTIyODl1bCwgICAgIDI0NTkzdWwsCiAgNDkx NTd1bCwgICAgICA5ODMxN3VsLCAgICAgIDE5NjYxM3VsLCAgICAzOTMyNDF1bCwgICAgNzg2NDMz dWwsCiAgMTU3Mjg2OXVsLCAgICAzMTQ1NzM5dWwsICAgIDYyOTE0Njl1bCwgICAxMjU4MjkxN3Vs LCAgMjUxNjU4NDN1bCwKICA1MDMzMTY1M3VsLCAgIDEwMDY2MzMxOXVsLCAgMjAxMzI2NjExdWws IDQwMjY1MzE4OXVsLCA4MDUzMDY0NTd1bCwgCiAgMTYxMDYxMjc0MXVsLCAzMjIxMjI1NDczdWws IDQyOTQ5NjcyOTF1bAp9OwoKaW5saW5lIHVuc2lnbmVkIGxvbmcgX19zdGxfbmV4dF9wcmltZSh1 bnNpZ25lZCBsb25nIF9fbikKewogIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fZmlyc3QgPSBfX3N0 bF9wcmltZV9saXN0OwogIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fbGFzdCA9IF9fc3RsX3ByaW1l X2xpc3QgKyBfX3N0bF9udW1fcHJpbWVzOwogIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBvcyA9IGxv d2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX19uKTsKICByZXR1cm4gcG9zID09IF9fbGFzdCA/ ICooX19sYXN0IC0gMSkgOiAqcG9zOwp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3Mg X0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KY2xhc3Mg aGFzaHRhYmxlOwoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwg Y2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CmJvb2wgb3BlcmF0b3I9PShjb25zdCBo YXNodGFibGU8X1ZhbCxfS2V5LF9IRixfRXgsX0VxLF9BbGw+JiBfX2h0MSwKICAgICAgICAgICAg ICAgIGNvbnN0IGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD4mIF9faHQyKTsK CgogCiAKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3Mg X0hhc2hGY24sCiAgICAgICAgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBj bGFzcyBfQWxsb2M+CmNsYXNzIGhhc2h0YWJsZSB7CnB1YmxpYzoKICB0eXBlZGVmIF9LZXkga2V5 X3R5cGU7CiAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfSGFzaEZjbiBoYXNo ZXI7CiAgdHlwZWRlZiBfRXF1YWxLZXkga2V5X2VxdWFsOwoKICB0eXBlZGVmIHNpemVfdCAgICAg ICAgICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgIGRpZmZlcmVuY2Vf dHlwZTsKICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25z dCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAg cmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOwoK ICBoYXNoZXIgaGFzaF9mdW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2hhc2g7IH0KICBrZXlfZXF1 YWwga2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01fZXF1YWxzOyB9Cgpwcml2YXRlOgogIHR5cGVk ZWYgX0hhc2h0YWJsZV9ub2RlPF9WYWw+IF9Ob2RlOwoKCnB1YmxpYzoKICB0eXBlZGVmIHR5cGVu YW1lIF9BbGxvY190cmFpdHM8X1ZhbCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3Jf dHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01f bm9kZV9hbGxvY2F0b3I7IH0KcHJpdmF0ZToKICB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9Ob2Rl LCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBfTV9ub2RlX2FsbG9jYXRvcjsKICBfTm9kZSogX01f Z2V0X25vZGUoKSB7IHJldHVybiBfTV9ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsgfQogIHZv aWQgX01fcHV0X25vZGUoX05vZGUqIF9fcCkgeyBfTV9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRl KF9fcCwgMSk7IH0KCiMgMjI1ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2h0YWJsZS5oIiAzCgoKcHJpdmF0ZToKICBo YXNoZXIgICAgICAgICAgICAgICAgX01faGFzaDsKICBrZXlfZXF1YWwgICAgICAgICAgICAgX01f ZXF1YWxzOwogIF9FeHRyYWN0S2V5ICAgICAgICAgICBfTV9nZXRfa2V5OwogIHZlY3RvcjxfTm9k ZSosX0FsbG9jPiBfTV9idWNrZXRzOwogIHNpemVfdHlwZSAgICAgICAgICAgICBfTV9udW1fZWxl bWVudHM7CgpwdWJsaWM6CiAgdHlwZWRlZiBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsX0tleSxf SGFzaEZjbixfRXh0cmFjdEtleSxfRXF1YWxLZXksX0FsbG9jPgogICAgICAgICAgaXRlcmF0b3I7 CiAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsX0tleSxfSGFzaEZjbixf RXh0cmFjdEtleSxfRXF1YWxLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9BbGxvYz4KICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOwoKICBmcmllbmQgc3RydWN0CiAgX0hh c2h0YWJsZV9pdGVyYXRvcjxfVmFsLF9LZXksX0hhc2hGY24sX0V4dHJhY3RLZXksX0VxdWFsS2V5 LF9BbGxvYz47CiAgZnJpZW5kIHN0cnVjdAogIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8X1Zh bCxfS2V5LF9IYXNoRmNuLF9FeHRyYWN0S2V5LF9FcXVhbEtleSxfQWxsb2M+OwoKcHVibGljOgog IGhhc2h0YWJsZShzaXplX3R5cGUgX19uLAogICAgICAgICAgICBjb25zdCBfSGFzaEZjbiYgICAg X19oZiwKICAgICAgICAgICAgY29uc3QgX0VxdWFsS2V5JiAgIF9fZXFsLAogICAgICAgICAgICBj b25zdCBfRXh0cmFjdEtleSYgX19leHQsCiAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBl JiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfTV9ub2RlX2FsbG9jYXRvciggX19hICks IAogICAgICBfTV9oYXNoKF9faGYpLAogICAgICBfTV9lcXVhbHMoX19lcWwpLAogICAgICBfTV9n ZXRfa2V5KF9fZXh0KSwKICAgICAgX01fYnVja2V0cyhfX2EpLAogICAgICBfTV9udW1fZWxlbWVu dHMoMCkKICB7CiAgICBfTV9pbml0aWFsaXplX2J1Y2tldHMoX19uKTsKICB9CgogIGhhc2h0YWJs ZShzaXplX3R5cGUgX19uLAogICAgICAgICAgICBjb25zdCBfSGFzaEZjbiYgICAgX19oZiwKICAg ICAgICAgICAgY29uc3QgX0VxdWFsS2V5JiAgIF9fZXFsLAogICAgICAgICAgICBjb25zdCBhbGxv Y2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX01fbm9kZV9hbGxvY2F0 b3IoIF9fYSApLCAKICAgICAgX01faGFzaChfX2hmKSwKICAgICAgX01fZXF1YWxzKF9fZXFsKSwK ICAgICAgX01fZ2V0X2tleShfRXh0cmFjdEtleSgpKSwKICAgICAgX01fYnVja2V0cyhfX2EpLAog ICAgICBfTV9udW1fZWxlbWVudHMoMCkKICB7CiAgICBfTV9pbml0aWFsaXplX2J1Y2tldHMoX19u KTsKICB9CgogIGhhc2h0YWJsZShjb25zdCBoYXNodGFibGUmIF9faHQpCiAgICA6IF9NX25vZGVf YWxsb2NhdG9yKCBfX2h0LmdldF9hbGxvY2F0b3IoKSApLCAKICAgICAgX01faGFzaChfX2h0Ll9N X2hhc2gpLAogICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLAogICAgICBfTV9nZXRfa2V5 KF9faHQuX01fZ2V0X2tleSksCiAgICAgIF9NX2J1Y2tldHMoX19odC5nZXRfYWxsb2NhdG9yKCkp LAogICAgICBfTV9udW1fZWxlbWVudHMoMCkKICB7CiAgICBfTV9jb3B5X2Zyb20oX19odCk7CiAg fQoKCgogIGhhc2h0YWJsZSYgb3BlcmF0b3I9IChjb25zdCBoYXNodGFibGUmIF9faHQpCiAgewog ICAgaWYgKCZfX2h0ICE9IHRoaXMpIHsKICAgICAgY2xlYXIoKTsKICAgICAgX01faGFzaCA9IF9f aHQuX01faGFzaDsKICAgICAgX01fZXF1YWxzID0gX19odC5fTV9lcXVhbHM7CiAgICAgIF9NX2dl dF9rZXkgPSBfX2h0Ll9NX2dldF9rZXk7CiAgICAgIF9NX2NvcHlfZnJvbShfX2h0KTsKICAgIH0K ICAgIHJldHVybiAqdGhpczsKICB9CgogIH5oYXNodGFibGUoKSB7IGNsZWFyKCk7IH0KCiAgc2l6 ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KICBzaXplX3R5 cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CiAgYm9vbCBlbXB0 eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CgogIHZvaWQgc3dhcChoYXNodGFibGUm IF9faHQpCiAgewogICAgIDo6c3dhcChfTV9oYXNoLCBfX2h0Ll9NX2hhc2gpOwogICAgIDo6c3dh cChfTV9lcXVhbHMsIF9faHQuX01fZXF1YWxzKTsKICAgICA6OnN3YXAoX01fZ2V0X2tleSwgX19o dC5fTV9nZXRfa2V5KTsKICAgIF9NX2J1Y2tldHMuc3dhcChfX2h0Ll9NX2J1Y2tldHMpOwogICAg IDo6c3dhcChfTV9udW1fZWxlbWVudHMsIF9faHQuX01fbnVtX2VsZW1lbnRzKTsKICB9CgogIGl0 ZXJhdG9yIGJlZ2luKCkKICB7IAogICAgZm9yIChzaXplX3R5cGUgX19uID0gMDsgX19uIDwgX01f YnVja2V0cy5zaXplKCk7ICsrX19uKQogICAgICBpZiAoX01fYnVja2V0c1tfX25dKQogICAgICAg IHJldHVybiBpdGVyYXRvcihfTV9idWNrZXRzW19fbl0sIHRoaXMpOwogICAgcmV0dXJuIGVuZCgp OwogIH0KCiAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoMCwgdGhpcyk7IH0KCiAg Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAogIHsKICAgIGZvciAoc2l6ZV90eXBlIF9fbiA9 IDA7IF9fbiA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19fbikKICAgICAgaWYgKF9NX2J1Y2tldHNb X19uXSkKICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dLCB0aGlz KTsKICAgIHJldHVybiBlbmQoKTsKICB9CgogIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsg cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDAsIHRoaXMpOyB9CgogIGZyaWVuZCBib29sCiAgb3BlcmF0 b3I9PSA8PiAgKGNvbnN0IGhhc2h0YWJsZSYsIGNvbnN0IGhhc2h0YWJsZSYpOwoKcHVibGljOgoK ICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01fYnVja2V0cy5zaXpl KCk7IH0KCiAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291bnQoKSBjb25zdAogICAgeyByZXR1cm4g X19zdGxfcHJpbWVfbGlzdFtfX3N0bF9udW1fcHJpbWVzIC0gMV07IH0gCgogIHNpemVfdHlwZSBl bGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fYnVja2V0KSBjb25zdAogIHsKICAgIHNpemVfdHlw ZSBfX3Jlc3VsdCA9IDA7CiAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9NX2J1Y2tldHNbX19idWNr ZXRdOyBfX2N1cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkKICAgICAgX19yZXN1bHQgKz0gMTsK ICAgIHJldHVybiBfX3Jlc3VsdDsKICB9CgogIHBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF91 bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCiAgewogICAgcmVzaXplKF9NX251bV9lbGVt ZW50cyArIDEpOwogICAgcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOwogIH0K CiAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQogIHsKICAg IHJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyAxKTsKICAgIHJldHVybiBpbnNlcnRfZXF1YWxfbm9y ZXNpemUoX19vYmopOwogIH0KCiAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3VuaXF1ZV9u b3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CiAgaXRlcmF0b3IgaW5zZXJ0X2VxdWFs X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKIAoKICB0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlcmF0b3I+CiAgdm9pZCBpbnNlcnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZiwg X0lucHV0SXRlcmF0b3IgX19sKQogIHsKICAgIGluc2VydF91bmlxdWUoX19mLCBfX2wsIF9faXRl cmF0b3JfY2F0ZWdvcnkoIF9fZiApICk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl cmF0b3I+CiAgdm9pZCBpbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVy YXRvciBfX2wpCiAgewogICAgaW5zZXJ0X2VxdWFsKF9fZiwgX19sLCBfX2l0ZXJhdG9yX2NhdGVn b3J5KCBfX2YgKSApOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZv aWQgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwK ICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQogIHsKICAgIGZvciAoIDsg X19mICE9IF9fbDsgKytfX2YpCiAgICAgIGluc2VydF91bmlxdWUoKl9fZik7CiAgfQoKICB0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBpbnNlcnRfZXF1YWwoX0lucHV0SXRl cmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRf aXRlcmF0b3JfdGFnKQogIHsKICAgIGZvciAoIDsgX19mICE9IF9fbDsgKytfX2YpCiAgICAgIGlu c2VydF9lcXVhbCgqX19mKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9y PgogIHZvaWQgaW5zZXJ0X3VuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVy YXRvciBfX2wsCiAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQogIHsK ICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgZGlzdGFuY2UoX19mLCBfX2wsIF9fbik7CiAgICBy ZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKICAgIGZvciAoIDsgX19uID4gMDsgLS1fX24s ICsrX19mKQogICAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOwogIH0KCiAgdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CiAgdm9pZCBpbnNlcnRfZXF1YWwoX0ZvcndhcmRJ dGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAogICAgICAgICAgICAgICAgICAgIGZv cndhcmRfaXRlcmF0b3JfdGFnKQogIHsKICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgZGlzdGFu Y2UoX19mLCBfX2wsIF9fbik7CiAgICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKICAg IGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQogICAgICBpbnNlcnRfZXF1YWxfbm9yZXNp emUoKl9fZik7CiAgfQoKIyA0NTQgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaGFzaHRhYmxlLmgiIDMKCgogIHJlZmVyZW5j ZSBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CgogIGl0ZXJhdG9yIGZp bmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSAKICB7CiAgICBzaXplX3R5cGUgX19uID0gX01fYmt0 X251bV9rZXkoX19rZXkpOwogICAgX05vZGUqIF9fZmlyc3Q7CiAgICBmb3IgKCBfX2ZpcnN0ID0g X01fYnVja2V0c1tfX25dOwogICAgICAgICAgX19maXJzdCAmJiAhX01fZXF1YWxzKF9NX2dldF9r ZXkoX19maXJzdC0+X01fdmFsKSwgX19rZXkpOwogICAgICAgICAgX19maXJzdCA9IF9fZmlyc3Qt Pl9NX25leHQpCiAgICAgIHt9CiAgICByZXR1cm4gaXRlcmF0b3IoX19maXJzdCwgdGhpcyk7CiAg fSAKCiAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CiAg ewogICAgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKICAgIGNvbnN0IF9O b2RlKiBfX2ZpcnN0OwogICAgZm9yICggX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKICAgICAg ICAgIF9fZmlyc3QgJiYgIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9f a2V5KTsKICAgICAgICAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQogICAgICB7fQogICAg cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpOwogIH0gCgogIHNpemVfdHlwZSBj b3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CiAgewogICAgY29uc3Qgc2l6ZV90eXBl IF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKICAgIHNpemVfdHlwZSBfX3Jlc3VsdCA9IDA7 CgogICAgZm9yIChjb25zdCBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07IF9fY3VyOyBf X2N1ciA9IF9fY3VyLT5fTV9uZXh0KQogICAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19j dXItPl9NX3ZhbCksIF9fa2V5KSkKICAgICAgICArK19fcmVzdWx0OwogICAgcmV0dXJuIF9fcmVz dWx0OwogIH0KCiAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IAogIGVxdWFsX3JhbmdlKGNvbnN0 IGtleV90eXBlJiBfX2tleSk7CgogIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9y PiAKICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0OwoKICBzaXplX3R5 cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KTsKICB2b2lkIGVyYXNlKGNvbnN0IGl0ZXJh dG9yJiBfX2l0KTsKICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFz dCk7CgogIHZvaWQgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpOwogIHZvaWQgZXJh c2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KTsKCiAgdm9p ZCByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpOwogIHZvaWQgY2xlYXIoKTsK CnByaXZhdGU6CiAgc2l6ZV90eXBlIF9NX25leHRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAog ICAgeyByZXR1cm4gX19zdGxfbmV4dF9wcmltZShfX24pOyB9CgogIHZvaWQgX01faW5pdGlhbGl6 ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCiAgewogICAgY29uc3Qgc2l6ZV90eXBlIF9fbl9idWNr ZXRzID0gX01fbmV4dF9zaXplKF9fbik7CiAgICBfTV9idWNrZXRzLnJlc2VydmUoX19uX2J1Y2tl dHMpOwogICAgX01fYnVja2V0cy5pbnNlcnQoX01fYnVja2V0cy5lbmQoKSwgX19uX2J1Y2tldHMs IChfTm9kZSopIDApOwogICAgX01fbnVtX2VsZW1lbnRzID0gMDsKICB9CgogIHNpemVfdHlwZSBf TV9ia3RfbnVtX2tleShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CiAgewogICAgcmV0dXJu IF9NX2JrdF9udW1fa2V5KF9fa2V5LCBfTV9idWNrZXRzLnNpemUoKSk7CiAgfQoKICBzaXplX3R5 cGUgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgY29uc3QKICB7CiAgICByZXR1 cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaikpOwogIH0KCiAgc2l6ZV90eXBlIF9N X2JrdF9udW1fa2V5KGNvbnN0IGtleV90eXBlJiBfX2tleSwgc2l6ZV90IF9fbikgY29uc3QKICB7 CiAgICByZXR1cm4gX01faGFzaChfX2tleSkgJSBfX247CiAgfQoKICBzaXplX3R5cGUgX01fYmt0 X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaiwgc2l6ZV90IF9fbikgY29uc3QKICB7CiAgICBy ZXR1cm4gX01fYmt0X251bV9rZXkoX01fZ2V0X2tleShfX29iaiksIF9fbik7CiAgfQoKICBfTm9k ZSogX01fbmV3X25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCiAgewogICAgX05vZGUqIF9f biA9IF9NX2dldF9ub2RlKCk7CiAgICBfX24tPl9NX25leHQgPSAwOwogICAgdHJ5ICB7CiAgICAg IGNvbnN0cnVjdCgmX19uLT5fTV92YWwsIF9fb2JqKTsKICAgICAgcmV0dXJuIF9fbjsKICAgIH0K ICAgIGNhdGNoKC4uLikgeyAgX01fcHV0X25vZGUoX19uKSA7IHRocm93OyB9IDsKICB9CiAgCiAg dm9pZCBfTV9kZWxldGVfbm9kZShfTm9kZSogX19uKQogIHsKICAgIGRlc3Ryb3koJl9fbi0+X01f dmFsKTsKICAgIF9NX3B1dF9ub2RlKF9fbik7CiAgfQoKICB2b2lkIF9NX2VyYXNlX2J1Y2tldChj b25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19maXJzdCwgX05vZGUqIF9fbGFzdCk7CiAgdm9p ZCBfTV9lcmFzZV9idWNrZXQoY29uc3Qgc2l6ZV90eXBlIF9fbiwgX05vZGUqIF9fbGFzdCk7Cgog IHZvaWQgX01fY29weV9mcm9tKGNvbnN0IGhhc2h0YWJsZSYgX19odCk7Cgp9OwoKdGVtcGxhdGUg PGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0Vx SywgCiAgICAgICAgICBjbGFzcyBfQWxsPgpfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsX0tleSxf SEYsX0V4SyxfRXFLLF9BbGw+JgpfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsX0tleSxfSEYsX0V4 SyxfRXFLLF9BbGw+OjpvcGVyYXRvcisrKCkKewogIGNvbnN0IF9Ob2RlKiBfX29sZCA9IF9NX2N1 cjsKICBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7CiAgaWYgKCFfTV9jdXIpIHsKICAgIHNpemVf dHlwZSBfX2J1Y2tldCA9IF9NX2h0LT5fTV9ia3RfbnVtKF9fb2xkLT5fTV92YWwpOwogICAgd2hp bGUgKCFfTV9jdXIgJiYgKytfX2J1Y2tldCA8IF9NX2h0LT5fTV9idWNrZXRzLnNpemUoKSkKICAg ICAgX01fY3VyID0gX01faHQtPl9NX2J1Y2tldHNbX19idWNrZXRdOwogIH0KICByZXR1cm4gKnRo aXM7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNz IF9FeEssIGNsYXNzIF9FcUssIAogICAgICAgICAgY2xhc3MgX0FsbD4KaW5saW5lIF9IYXNodGFi bGVfaXRlcmF0b3I8X1ZhbCxfS2V5LF9IRixfRXhLLF9FcUssX0FsbD4KX0hhc2h0YWJsZV9pdGVy YXRvcjxfVmFsLF9LZXksX0hGLF9FeEssX0VxSyxfQWxsPjo6b3BlcmF0b3IrKyhpbnQpCnsKICBp dGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICsrKnRoaXM7CiAgcmV0dXJuIF9fdG1wOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXhLLCBjbGFz cyBfRXFLLCAKICAgICAgICAgIGNsYXNzIF9BbGw+Cl9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8 X1ZhbCxfS2V5LF9IRixfRXhLLF9FcUssX0FsbD4mCl9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8 X1ZhbCxfS2V5LF9IRixfRXhLLF9FcUssX0FsbD46Om9wZXJhdG9yKysoKQp7CiAgY29uc3QgX05v ZGUqIF9fb2xkID0gX01fY3VyOwogIF9NX2N1ciA9IF9NX2N1ci0+X01fbmV4dDsKICBpZiAoIV9N X2N1cikgewogICAgc2l6ZV90eXBlIF9fYnVja2V0ID0gX01faHQtPl9NX2JrdF9udW0oX19vbGQt Pl9NX3ZhbCk7CiAgICB3aGlsZSAoIV9NX2N1ciAmJiArK19fYnVja2V0IDwgX01faHQtPl9NX2J1 Y2tldHMuc2l6ZSgpKQogICAgICBfTV9jdXIgPSBfTV9odC0+X01fYnVja2V0c1tfX2J1Y2tldF07 CiAgfQogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXks IGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywgCiAgICAgICAgICBjbGFzcyBfQWxs PgppbmxpbmUgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLF9LZXksX0hGLF9FeEssX0Vx SyxfQWxsPgpfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsX0tleSxfSEYsX0V4SyxfRXFL LF9BbGw+OjpvcGVyYXRvcisrKGludCkKewogIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7 CiAgKysqdGhpczsKICByZXR1cm4gX190bXA7Cn0KCiMgNjY0ICIvdXNyL2xpYi9nY2MtbGliL2kz ODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2h0YWJsZS5o IiAzCgoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3Mg X0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qg aGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4LF9FcSxfQWxsPiYgX19odDEsCiAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4LF9FcSxfQWxsPiYg X19odDIpCnsKICB0eXBlZGVmIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxf RXEsX0FsbD46Ol9Ob2RlIF9Ob2RlOwogIGlmIChfX2h0MS5fTV9idWNrZXRzLnNpemUoKSAhPSBf X2h0Mi5fTV9idWNrZXRzLnNpemUoKSkKICAgIHJldHVybiBmYWxzZTsKICBmb3IgKGludCBfX24g PSAwOyBfX24gPCBfX2h0MS5fTV9idWNrZXRzLnNpemUoKTsgKytfX24pIHsKICAgIF9Ob2RlKiBf X2N1cjEgPSBfX2h0MS5fTV9idWNrZXRzW19fbl07CiAgICBfTm9kZSogX19jdXIyID0gX19odDIu X01fYnVja2V0c1tfX25dOwogICAgZm9yICggOyBfX2N1cjEgJiYgX19jdXIyICYmIF9fY3VyMS0+ X01fdmFsID09IF9fY3VyMi0+X01fdmFsOwogICAgICAgICAgX19jdXIxID0gX19jdXIxLT5fTV9u ZXh0LCBfX2N1cjIgPSBfX2N1cjItPl9NX25leHQpCiAgICAgIHt9CiAgICBpZiAoX19jdXIxIHx8 IF9fY3VyMikKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfSAgCgoKCnRl bXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeHRyYWN0 LCBjbGFzcyBfRXFLZXksIAogICAgICAgICAgY2xhc3MgX0FsbD4KaW5saW5lIHZvaWQgc3dhcCho YXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXh0cmFjdCwgX0VxS2V5LCBfQWxsPiYgX19odDEs CiAgICAgICAgICAgICAgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4dHJhY3QsIF9F cUtleSwgX0FsbD4mIF9faHQyKSB7CiAgX19odDEuc3dhcChfX2h0Mik7Cn0KCgoKCnRlbXBsYXRl IDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0Vx LCBjbGFzcyBfQWxsPgpwYWlyPHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxf RXEsX0FsbD46Oml0ZXJhdG9yLCBib29sPiAKaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4LF9F cSxfQWxsPgogIDo6aW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29i aikKewogIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKICBfTm9kZSog X19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKCiAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0 OyBfX2N1cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkgCiAgICBpZiAoX01fZXF1YWxzKF9NX2dl dF9rZXkoX19jdXItPl9NX3ZhbCksIF9NX2dldF9rZXkoX19vYmopKSkKICAgICAgcmV0dXJuIHBh aXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fY3VyLCB0aGlzKSwgZmFsc2UpOwoKICBfTm9k ZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CiAgX190bXAtPl9NX25leHQgPSBfX2ZpcnN0 OwogIF9NX2J1Y2tldHNbX19uXSA9IF9fdG1wOwogICsrX01fbnVtX2VsZW1lbnRzOwogIHJldHVy biBwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3RtcCwgdGhpcyksIHRydWUpOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNs YXNzIF9FcSwgY2xhc3MgX0FsbD4KdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4 LF9FcSxfQWxsPjo6aXRlcmF0b3IgCmhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0Fs bD4KICA6Omluc2VydF9lcXVhbF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKewog IGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKICBfTm9kZSogX19maXJz dCA9IF9NX2J1Y2tldHNbX19uXTsKCiAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0OyBfX2N1 cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkgCiAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXko X19jdXItPl9NX3ZhbCksIF9NX2dldF9rZXkoX19vYmopKSkgewogICAgICBfTm9kZSogX190bXAg PSBfTV9uZXdfbm9kZShfX29iaik7CiAgICAgIF9fdG1wLT5fTV9uZXh0ID0gX19jdXItPl9NX25l eHQ7CiAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX190bXA7CiAgICAgICsrX01fbnVtX2VsZW1lbnRz OwogICAgICByZXR1cm4gaXRlcmF0b3IoX190bXAsIHRoaXMpOwogICAgfQoKICBfTm9kZSogX190 bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CiAgX190bXAtPl9NX25leHQgPSBfX2ZpcnN0OwogIF9N X2J1Y2tldHNbX19uXSA9IF9fdG1wOwogICsrX01fbnVtX2VsZW1lbnRzOwogIHJldHVybiBpdGVy YXRvcihfX3RtcCwgdGhpcyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBj bGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgp0eXBlbmFtZSBoYXNo dGFibGU8X1ZhbCxfS2V5LF9IRixfRXgsX0VxLF9BbGw+OjpyZWZlcmVuY2UgCmhhc2h0YWJsZTxf VmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD46OmZpbmRfb3JfaW5zZXJ0KGNvbnN0IHZhbHVlX3R5 cGUmIF9fb2JqKQp7CiAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOwoKICBzaXplX3R5cGUg X19uID0gX01fYmt0X251bShfX29iaik7CiAgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19f bl07CgogIGZvciAoX05vZGUqIF9fY3VyID0gX19maXJzdDsgX19jdXI7IF9fY3VyID0gX19jdXIt Pl9NX25leHQpCiAgICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9N X2dldF9rZXkoX19vYmopKSkKICAgICAgcmV0dXJuIF9fY3VyLT5fTV92YWw7CgogIF9Ob2RlKiBf X3RtcCA9IF9NX25ld19ub2RlKF9fb2JqKTsKICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CiAg X01fYnVja2V0c1tfX25dID0gX190bXA7CiAgKytfTV9udW1fZWxlbWVudHM7CiAgcmV0dXJuIF9f dG1wLT5fTV92YWw7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBf SEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgpwYWlyPHR5cGVuYW1lIGhhc2h0 YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD46Oml0ZXJhdG9yLAogICAgIHR5cGVuYW1l IGhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD46Oml0ZXJhdG9yPiAKaGFzaHRh YmxlPF9WYWwsX0tleSxfSEYsX0V4LF9FcSxfQWxsPjo6ZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5 cGUmIF9fa2V5KQp7CiAgdHlwZWRlZiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX1BpaTsKICBj b25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOwoKICBmb3IgKF9Ob2Rl KiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOyBfX2ZpcnN0OyBfX2ZpcnN0ID0gX19maXJzdC0+ X01fbmV4dCkKICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBf X2tleSkpIHsKICAgICAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0LT5fTV9uZXh0OyBfX2N1 cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkKICAgICAgICBpZiAoIV9NX2VxdWFscyhfTV9nZXRf a2V5KF9fY3VyLT5fTV92YWwpLCBfX2tleSkpCiAgICAgICAgICByZXR1cm4gX1BpaShpdGVyYXRv cihfX2ZpcnN0LCB0aGlzKSwgaXRlcmF0b3IoX19jdXIsIHRoaXMpKTsKICAgICAgZm9yIChzaXpl X3R5cGUgX19tID0gX19uICsgMTsgX19tIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19tKQogICAg ICAgIGlmIChfTV9idWNrZXRzW19fbV0pCiAgICAgICAgICByZXR1cm4gX1BpaShpdGVyYXRvcihf X2ZpcnN0LCB0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IoX01fYnVja2V0c1tf X21dLCB0aGlzKSk7CiAgICAgIHJldHVybiBfUGlpKGl0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLCBl bmQoKSk7CiAgICB9CiAgcmV0dXJuIF9QaWkoZW5kKCksIGVuZCgpKTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNs YXNzIF9BbGw+CnBhaXI8dHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4LF9FcSxf QWxsPjo6Y29uc3RfaXRlcmF0b3IsIAogICAgIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLF9LZXks X0hGLF9FeCxfRXEsX0FsbD46OmNvbnN0X2l0ZXJhdG9yPiAKaGFzaHRhYmxlPF9WYWwsX0tleSxf SEYsX0V4LF9FcSxfQWxsPgogIDo6ZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBj b25zdAp7CiAgdHlwZWRlZiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX1Bp aTsKICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOwoKICBmb3Ig KGNvbnN0IF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dIDsKICAgICAgIF9fZmlyc3Q7 IAogICAgICAgX19maXJzdCA9IF9fZmlyc3QtPl9NX25leHQpIHsKICAgIGlmIChfTV9lcXVhbHMo X01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpIHsKICAgICAgZm9yIChjb25zdCBf Tm9kZSogX19jdXIgPSBfX2ZpcnN0LT5fTV9uZXh0OwogICAgICAgICAgIF9fY3VyOwogICAgICAg ICAgIF9fY3VyID0gX19jdXItPl9NX25leHQpCiAgICAgICAgaWYgKCFfTV9lcXVhbHMoX01fZ2V0 X2tleShfX2N1ci0+X01fdmFsKSwgX19rZXkpKQogICAgICAgICAgcmV0dXJuIF9QaWkoY29uc3Rf aXRlcmF0b3IoX19maXJzdCwgdGhpcyksCiAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVy YXRvcihfX2N1ciwgdGhpcykpOwogICAgICBmb3IgKHNpemVfdHlwZSBfX20gPSBfX24gKyAxOyBf X20gPCBfTV9idWNrZXRzLnNpemUoKTsgKytfX20pCiAgICAgICAgaWYgKF9NX2J1Y2tldHNbX19t XSkKICAgICAgICAgIHJldHVybiBfUGlpKGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLAog ICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoX01fYnVja2V0c1tfX21dLCB0aGlz KSk7CiAgICAgIHJldHVybiBfUGlpKGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLCBlbmQo KSk7CiAgICB9CiAgfQogIHJldHVybiBfUGlpKGVuZCgpLCBlbmQoKSk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBj bGFzcyBfQWxsPgp0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfRXgsX0VxLF9BbGw+ OjpzaXplX3R5cGUgCmhhc2h0YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD46OmVyYXNl KGNvbnN0IGtleV90eXBlJiBfX2tleSkKewogIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3Rf bnVtX2tleShfX2tleSk7CiAgX05vZGUqIF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CiAgc2l6 ZV90eXBlIF9fZXJhc2VkID0gMDsKCiAgaWYgKF9fZmlyc3QpIHsKICAgIF9Ob2RlKiBfX2N1ciA9 IF9fZmlyc3Q7CiAgICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CiAgICB3aGlsZSAo X19uZXh0KSB7CiAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX25leHQtPl9NX3ZhbCks IF9fa2V5KSkgewogICAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OwogICAg ICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CiAgICAgICAgX19uZXh0ID0gX19jdXItPl9NX25l eHQ7CiAgICAgICAgKytfX2VyYXNlZDsKICAgICAgICAtLV9NX251bV9lbGVtZW50czsKICAgICAg fQogICAgICBlbHNlIHsKICAgICAgICBfX2N1ciA9IF9fbmV4dDsKICAgICAgICBfX25leHQgPSBf X2N1ci0+X01fbmV4dDsKICAgICAgfQogICAgfQogICAgaWYgKF9NX2VxdWFscyhfTV9nZXRfa2V5 KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KSkgewogICAgICBfTV9idWNrZXRzW19fbl0gPSBfX2Zp cnN0LT5fTV9uZXh0OwogICAgICBfTV9kZWxldGVfbm9kZShfX2ZpcnN0KTsKICAgICAgKytfX2Vy YXNlZDsKICAgICAgLS1fTV9udW1fZWxlbWVudHM7CiAgICB9CiAgfQogIHJldHVybiBfX2VyYXNl ZDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3Mg X0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CnZvaWQgaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYs X0V4LF9FcSxfQWxsPjo6ZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9faXQpCnsKICBpZiAoX05vZGUq IGNvbnN0IF9fcCA9IF9faXQuX01fY3VyKSB7CiAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01f Ymt0X251bShfX3AtPl9NX3ZhbCk7CiAgICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07 CgogICAgaWYgKF9fY3VyID09IF9fcCkgewogICAgICBfTV9idWNrZXRzW19fbl0gPSBfX2N1ci0+ X01fbmV4dDsKICAgICAgX01fZGVsZXRlX25vZGUoX19jdXIpOwogICAgICAtLV9NX251bV9lbGVt ZW50czsKICAgIH0KICAgIGVsc2UgewogICAgICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25l eHQ7CiAgICAgIHdoaWxlIChfX25leHQpIHsKICAgICAgICBpZiAoX19uZXh0ID09IF9fcCkgewog ICAgICAgICAgX19jdXItPl9NX25leHQgPSBfX25leHQtPl9NX25leHQ7CiAgICAgICAgICBfTV9k ZWxldGVfbm9kZShfX25leHQpOwogICAgICAgICAgLS1fTV9udW1fZWxlbWVudHM7CiAgICAgICAg ICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBfX2N1ciA9IF9fbmV4 dDsKICAgICAgICAgIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OwogICAgICAgIH0KICAgICAgfQog ICAgfQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwg Y2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CnZvaWQgaGFzaHRhYmxlPF9WYWwsX0tl eSxfSEYsX0V4LF9FcSxfQWxsPgogIDo6ZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3Ig X19sYXN0KQp7CiAgc2l6ZV90eXBlIF9fZl9idWNrZXQgPSBfX2ZpcnN0Ll9NX2N1ciA/IAogICAg X01fYmt0X251bShfX2ZpcnN0Ll9NX2N1ci0+X01fdmFsKSA6IF9NX2J1Y2tldHMuc2l6ZSgpOwog IHNpemVfdHlwZSBfX2xfYnVja2V0ID0gX19sYXN0Ll9NX2N1ciA/IAogICAgX01fYmt0X251bShf X2xhc3QuX01fY3VyLT5fTV92YWwpIDogX01fYnVja2V0cy5zaXplKCk7CgogIGlmIChfX2ZpcnN0 Ll9NX2N1ciA9PSBfX2xhc3QuX01fY3VyKQogICAgcmV0dXJuOwogIGVsc2UgaWYgKF9fZl9idWNr ZXQgPT0gX19sX2J1Y2tldCkKICAgIF9NX2VyYXNlX2J1Y2tldChfX2ZfYnVja2V0LCBfX2ZpcnN0 Ll9NX2N1ciwgX19sYXN0Ll9NX2N1cik7CiAgZWxzZSB7CiAgICBfTV9lcmFzZV9idWNrZXQoX19m X2J1Y2tldCwgX19maXJzdC5fTV9jdXIsIDApOwogICAgZm9yIChzaXplX3R5cGUgX19uID0gX19m X2J1Y2tldCArIDE7IF9fbiA8IF9fbF9idWNrZXQ7ICsrX19uKQogICAgICBfTV9lcmFzZV9idWNr ZXQoX19uLCAwKTsKICAgIGlmIChfX2xfYnVja2V0ICE9IF9NX2J1Y2tldHMuc2l6ZSgpKQogICAg ICBfTV9lcmFzZV9idWNrZXQoX19sX2J1Y2tldCwgX19sYXN0Ll9NX2N1cik7CiAgfQp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNz IF9FcSwgY2xhc3MgX0FsbD4KaW5saW5lIHZvaWQKaGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4 LF9FcSxfQWxsPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19sYXN0KQp7CiAg ZXJhc2UoaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZSo+KF9fZmlyc3QuX01fY3VyKSwKICAgICAg ICAgICAgICAgICBjb25zdF9jYXN0PGhhc2h0YWJsZSo+KF9fZmlyc3QuX01faHQpKSwKICAgICAg ICBpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19sYXN0Ll9NX2N1ciksCiAgICAgICAgICAg ICAgICAgY29uc3RfY2FzdDxoYXNodGFibGUqPihfX2xhc3QuX01faHQpKSk7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0Vx LCBjbGFzcyBfQWxsPgppbmxpbmUgdm9pZApoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfRXgsX0Vx LF9BbGw+OjplcmFzZShjb25zdCBjb25zdF9pdGVyYXRvciYgX19pdCkKewogIGVyYXNlKGl0ZXJh dG9yKGNvbnN0X2Nhc3Q8X05vZGUqPihfX2l0Ll9NX2N1ciksCiAgICAgICAgICAgICAgICAgY29u c3RfY2FzdDxoYXNodGFibGUqPihfX2l0Ll9NX2h0KSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Zh bCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0Fs bD4Kdm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfRXgsX0VxLF9BbGw+CiAgOjpyZXNpemUo c2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpCnsKICBjb25zdCBzaXplX3R5cGUgX19vbGRf biA9IF9NX2J1Y2tldHMuc2l6ZSgpOwogIGlmIChfX251bV9lbGVtZW50c19oaW50ID4gX19vbGRf bikgewogICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX25leHRfc2l6ZShfX251bV9lbGVtZW50 c19oaW50KTsKICAgIGlmIChfX24gPiBfX29sZF9uKSB7CiAgICAgIHZlY3RvcjxfTm9kZSosIF9B bGw+IF9fdG1wKF9fbiwgKF9Ob2RlKikoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9NX2J1Y2tldHMuZ2V0X2FsbG9jYXRvcigpKTsKICAgICAgdHJ5ICB7CiAgICAgICAgZm9y IChzaXplX3R5cGUgX19idWNrZXQgPSAwOyBfX2J1Y2tldCA8IF9fb2xkX247ICsrX19idWNrZXQp IHsKICAgICAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX2J1Y2tldF07CiAgICAg ICAgICB3aGlsZSAoX19maXJzdCkgewogICAgICAgICAgICBzaXplX3R5cGUgX19uZXdfYnVja2V0 ID0gX01fYmt0X251bShfX2ZpcnN0LT5fTV92YWwsIF9fbik7CiAgICAgICAgICAgIF9NX2J1Y2tl dHNbX19idWNrZXRdID0gX19maXJzdC0+X01fbmV4dDsKICAgICAgICAgICAgX19maXJzdC0+X01f bmV4dCA9IF9fdG1wW19fbmV3X2J1Y2tldF07CiAgICAgICAgICAgIF9fdG1wW19fbmV3X2J1Y2tl dF0gPSBfX2ZpcnN0OwogICAgICAgICAgICBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX2J1Y2tldF07 ICAgICAgICAgIAogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfTV9idWNrZXRzLnN3YXAo X190bXApOwogICAgICB9CgogICAgICBjYXRjaCguLi4pIHsKICAgICAgICBmb3IgKHNpemVfdHlw ZSBfX2J1Y2tldCA9IDA7IF9fYnVja2V0IDwgX190bXAuc2l6ZSgpOyArK19fYnVja2V0KSB7CiAg ICAgICAgICB3aGlsZSAoX190bXBbX19idWNrZXRdKSB7CiAgICAgICAgICAgIF9Ob2RlKiBfX25l eHQgPSBfX3RtcFtfX2J1Y2tldF0tPl9NX25leHQ7CiAgICAgICAgICAgIF9NX2RlbGV0ZV9ub2Rl KF9fdG1wW19fYnVja2V0XSk7CiAgICAgICAgICAgIF9fdG1wW19fYnVja2V0XSA9IF9fbmV4dDsK ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3c7CiAgICAgIH0KCiAgICB9CiAgfQp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgs IGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4Kdm9pZCBoYXNodGFibGU8X1ZhbCxfS2V5LF9IRixfRXgs X0VxLF9BbGw+CiAgOjpfTV9lcmFzZV9idWNrZXQoY29uc3Qgc2l6ZV90eXBlIF9fbiwgX05vZGUq IF9fZmlyc3QsIF9Ob2RlKiBfX2xhc3QpCnsKICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19f bl07CiAgaWYgKF9fY3VyID09IF9fZmlyc3QpCiAgICBfTV9lcmFzZV9idWNrZXQoX19uLCBfX2xh c3QpOwogIGVsc2UgewogICAgX05vZGUqIF9fbmV4dDsKICAgIGZvciAoX19uZXh0ID0gX19jdXIt Pl9NX25leHQ7IAogICAgICAgICBfX25leHQgIT0gX19maXJzdDsgCiAgICAgICAgIF9fY3VyID0g X19uZXh0LCBfX25leHQgPSBfX2N1ci0+X01fbmV4dCkKICAgICAgOwogICAgd2hpbGUgKF9fbmV4 dCkgewogICAgICBfX2N1ci0+X01fbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKICAgICAgX01fZGVs ZXRlX25vZGUoX19uZXh0KTsKICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CiAgICAgIC0t X01fbnVtX2VsZW1lbnRzOwogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNz IF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CnZvaWQg aGFzaHRhYmxlPF9WYWwsX0tleSxfSEYsX0V4LF9FcSxfQWxsPgogIDo6X01fZXJhc2VfYnVja2V0 KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2xhc3QpCnsKICBfTm9kZSogX19jdXIgPSBf TV9idWNrZXRzW19fbl07CiAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdCkgewogICAgX05vZGUqIF9f bmV4dCA9IF9fY3VyLT5fTV9uZXh0OwogICAgX01fZGVsZXRlX25vZGUoX19jdXIpOwogICAgX19j dXIgPSBfX25leHQ7CiAgICBfTV9idWNrZXRzW19fbl0gPSBfX2N1cjsKICAgIC0tX01fbnVtX2Vs ZW1lbnRzOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9I RiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CnZvaWQgaGFzaHRhYmxlPF9WYWws X0tleSxfSEYsX0V4LF9FcSxfQWxsPjo6Y2xlYXIoKQp7CiAgZm9yIChzaXplX3R5cGUgX19pID0g MDsgX19pIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19pKSB7CiAgICBfTm9kZSogX19jdXIgPSBf TV9idWNrZXRzW19faV07CiAgICB3aGlsZSAoX19jdXIgIT0gMCkgewogICAgICBfTm9kZSogX19u ZXh0ID0gX19jdXItPl9NX25leHQ7CiAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fY3VyKTsKICAgICAg X19jdXIgPSBfX25leHQ7CiAgICB9CiAgICBfTV9idWNrZXRzW19faV0gPSAwOwogIH0KICBfTV9u dW1fZWxlbWVudHMgPSAwOwp9CgogICAgCnRlbXBsYXRlIDxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5 LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgp2b2lkIGhhc2h0 YWJsZTxfVmFsLF9LZXksX0hGLF9FeCxfRXEsX0FsbD4KICA6Ol9NX2NvcHlfZnJvbShjb25zdCBo YXNodGFibGUmIF9faHQpCnsKICBfTV9idWNrZXRzLmNsZWFyKCk7CiAgX01fYnVja2V0cy5yZXNl cnZlKF9faHQuX01fYnVja2V0cy5zaXplKCkpOwogIF9NX2J1Y2tldHMuaW5zZXJ0KF9NX2J1Y2tl dHMuZW5kKCksIF9faHQuX01fYnVja2V0cy5zaXplKCksIChfTm9kZSopIDApOwogIHRyeSAgewog ICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19odC5fTV9idWNrZXRzLnNpemUoKTsg KytfX2kpIHsKICAgICAgaWYgKGNvbnN0IF9Ob2RlKiBfX2N1ciA9IF9faHQuX01fYnVja2V0c1tf X2ldKSB7CiAgICAgICAgX05vZGUqIF9fX2NvcHkgPSBfTV9uZXdfbm9kZShfX2N1ci0+X01fdmFs KTsKICAgICAgICBfTV9idWNrZXRzW19faV0gPSBfX19jb3B5OwoKICAgICAgICBmb3IgKF9Ob2Rl KiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsgCiAgICAgICAgICAgICBfX25leHQ7IAogICAgICAg ICAgICAgX19jdXIgPSBfX25leHQsIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0KSB7CiAgICAgICAg ICBfX19jb3B5LT5fTV9uZXh0ID0gX01fbmV3X25vZGUoX19uZXh0LT5fTV92YWwpOwogICAgICAg ICAgX19fY29weSA9IF9fX2NvcHktPl9NX25leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAg ICBfTV9udW1fZWxlbWVudHMgPSBfX2h0Ll9NX251bV9lbGVtZW50czsKICB9CiAgY2F0Y2goLi4u KSB7ICBjbGVhcigpIDsgdGhyb3c7IH0gOwp9CgogCgoKCiAKIAogCiMgMzEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9oYXNoX21h cCIgMiAzCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9oYXNoX21hcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKIAoKCgoKCgoKIAoKCgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9U cCwgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9LZXk+LAogICAgICAgICAgY2xhc3MgX0VxdWFsS2V5 ID0gZXF1YWxfdG88X0tleT4sCiAgICAgICAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8IF9U cCA+ICA+CgoKCgpjbGFzcyBoYXNoX21hcAp7CnByaXZhdGU6CiAgdHlwZWRlZiBoYXNodGFibGU8 cGFpcjxjb25zdCBfS2V5LF9UcD4sX0tleSxfSGFzaEZjbiwKICAgICAgICAgICAgICAgICAgICBf U2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSxfVHA+ID4sX0VxdWFsS2V5LF9BbGxvYz4gX0h0Owog IF9IdCBfTV9odDsKCnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5 X3R5cGU7CiAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOwogIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBl OwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CiAgdHlwZWRl ZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omtl eV9lcXVhbCBrZXlfZXF1YWw7CiAgCiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBz aXplX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJl bmNlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKICB0eXBl ZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYg dHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0 Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9I dDo6aXRlcmF0b3IgaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJh dG9yIGNvbnN0X2l0ZXJhdG9yOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5 cGUgYWxsb2NhdG9yX3R5cGU7CgogIGhhc2hlciBoYXNoX2Z1bmN0KCkgY29uc3QgeyByZXR1cm4g X01faHQuaGFzaF9mdW5jdCgpOyB9CiAga2V5X2VxdWFsIGtleV9lcSgpIGNvbnN0IHsgcmV0dXJu IF9NX2h0LmtleV9lcSgpOyB9CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0 IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQoKcHVibGljOgogIGhhc2hfbWFwKCkg OiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30K ICBleHBsaWNpdCBoYXNoX21hcChzaXplX3R5cGUgX19uKQogICAgOiBfTV9odChfX24sIGhhc2hl cigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KICBoYXNoX21hcChzaXplX3R5 cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCiAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2Vx dWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CiAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29u c3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAogICAgICAgICAgIGNvbnN0 IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfTV9odChfX24s IF9faGYsIF9fZXFsLCBfX2EpIHt9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCiAgICA6 IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQogICAg eyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQogIHRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyYXRvcj4KICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9y IF9fbCwgc2l6ZV90eXBlIF9fbikKICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFs KCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wp OyB9CiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIGhhc2hfbWFwKF9JbnB1dEl0 ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAogICAgICAgICAg IGNvbnN0IGhhc2hlciYgX19oZikKICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwg YWxsb2NhdG9yX3R5cGUoKSkKICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0K ICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgaGFzaF9tYXAoX0lucHV0SXRlcmF0 b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCiAgICAgICAgICAgY29u c3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAogICAgICAgICAgIGNvbnN0 IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfTV9odChfX24s IF9faGYsIF9fZXFsLCBfX2EpCiAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9 CgojIDE0NCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9oYXNoX21hcC5oIiAzCgoKcHVibGljOgogIHNpemVfdHlwZSBzaXpl KCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CiAgc2l6ZV90eXBlIG1heF9zaXplKCkg Y29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdCB7 IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CiAgdm9pZCBzd2FwKGhhc2hfbWFwJiBfX2hzKSB7IF9N X2h0LnN3YXAoX19ocy5fTV9odCk7IH0KICBmcmllbmQgYm9vbAogIG9wZXJhdG9yPT0gPD4gIChj b25zdCBoYXNoX21hcCYsIGNvbnN0IGhhc2hfbWFwJik7CgogIGl0ZXJhdG9yIGJlZ2luKCkgeyBy ZXR1cm4gX01faHQuYmVnaW4oKTsgfQogIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2h0LmVu ZCgpOyB9CiAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdp bigpOyB9CiAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7 IH0KCnB1YmxpYzoKICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBl JiBfX29iaikKICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CgogIHRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRv ciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2Ys X19sKTsgfQoKCgoKCgoKICBwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydF9ub3Jlc2l6ZShjb25z dCB2YWx1ZV90eXBlJiBfX29iaikKICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9y ZXNpemUoX19vYmopOyB9ICAgIAoKICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tl eSkgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KICBjb25zdF9pdGVyYXRvciBmaW5kKGNv bnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QgCiAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5 KTsgfQoKICBfVHAmIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7CiAgICByZXR1 cm4gX01faHQuZmluZF9vcl9pbnNlcnQodmFsdWVfdHlwZShfX2tleSwgX1RwKCkpKS5zZWNvbmQ7 CiAgfQoKICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdCB7IHJl dHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KICAKICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4g ZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQogICAgeyByZXR1cm4gX01faHQuZXF1 YWxfcmFuZ2UoX19rZXkpOyB9CiAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+ CiAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAogICAgeyByZXR1cm4g X01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CgogIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlf dHlwZSYgX19rZXkpIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CiAgdm9pZCBlcmFzZShp dGVyYXRvciBfX2l0KSB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CiAgdm9pZCBlcmFzZShpdGVyYXRv ciBfX2YsIGl0ZXJhdG9yIF9fbCkgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KICB2b2lkIGNs ZWFyKCkgeyBfTV9odC5jbGVhcigpOyB9CgogIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQp IHsgX01faHQucmVzaXplKF9faGludCk7IH0KICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29u c3QgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KICBzaXplX3R5cGUgbWF4X2J1Y2tl dF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQogIHNp emVfdHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKICAgIHsgcmV0dXJu IF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwg Y2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgpp bmxpbmUgYm9vbCAKb3BlcmF0b3I9PShjb25zdCBoYXNoX21hcDxfS2V5LF9UcCxfSGFzaEZjbixf RXFsS2V5LF9BbGxvYz4mIF9faG0xLAogICAgICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksX1Rw LF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPiYgX19obTIpCnsKICByZXR1cm4gX19obTEuX01faHQg PT0gX19obTIuX01faHQ7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xh c3MgX0hhc2hGY24sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3 YXAoaGFzaF9tYXA8X0tleSxfVHAsX0hhc2hGY24sX0VxbEtleSxfQWxsb2M+JiBfX2htMSwKICAg ICBoYXNoX21hcDxfS2V5LF9UcCxfSGFzaEZjbixfRXFsS2V5LF9BbGxvYz4mIF9faG0yKQp7CiAg X19obTEuc3dhcChfX2htMik7Cn0KCgoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAs IGNsYXNzIF9IYXNoRmNuID0gaGFzaDxfS2V5PiwKICAgICAgICAgIGNsYXNzIF9FcXVhbEtleSA9 IGVxdWFsX3RvPF9LZXk+LAogICAgICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVHAg PiAgPgoKCgoKY2xhc3MgaGFzaF9tdWx0aW1hcAp7CnByaXZhdGU6CiAgdHlwZWRlZiBoYXNodGFi bGU8cGFpcjxjb25zdCBfS2V5LCBfVHA+LCBfS2V5LCBfSGFzaEZjbiwKICAgICAgICAgICAgICAg ICAgICBfU2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfRXF1YWxLZXksIF9BbGxv Yz4gCiAgICAgICAgICBfSHQ7CiAgX0h0IF9NX2h0OwoKcHVibGljOgogIHR5cGVkZWYgdHlwZW5h bWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CiAgdHlw ZWRlZiBfVHAgbWFwcGVkX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUg dmFsdWVfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKICB0eXBl ZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKCiAgdHlwZWRlZiB0eXBlbmFt ZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZl cmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50 ZXIgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9w b2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogIHR5 cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwoKICB0 eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwoKICB0eXBlZGVmIHR5cGVuYW1l IF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CgogIGhhc2hlciBoYXNoX2Z1bmN0 KCkgY29uc3QgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CiAga2V5X2VxdWFsIGtleV9l cSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CiAgYWxsb2NhdG9yX3R5cGUgZ2V0 X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQoKcHVi bGljOgogIGhhc2hfbXVsdGltYXAoKSA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgp LCBhbGxvY2F0b3JfdHlwZSgpKSB7fQogIGV4cGxpY2l0IGhhc2hfbXVsdGltYXAoc2l6ZV90eXBl IF9fbikKICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90 eXBlKCkpIHt9CiAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9f aGYpCiAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkp IHt9CiAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNv bnN0IGtleV9lcXVhbCYgX19lcWwsCiAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlw ZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwg X19hKSB7fQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIGhhc2hfbXVsdGlt YXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCiAgICA6IF9NX2h0KDEw MCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQogICAgeyBfTV9odC5p bnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9y PgogIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2ws IHNpemVfdHlwZSBfX24pCiAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBh bGxvY2F0b3JfdHlwZSgpKQogICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CiAg dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIGhhc2hfbXVsdGltYXAoX0lucHV0SXRl cmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCiAgICAgICAgICAg ICAgICBjb25zdCBoYXNoZXImIF9faGYpCiAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFs KCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7 IH0KICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgaGFzaF9tdWx0aW1hcChfSW5w dXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKICAgICAg ICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKICAg ICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgp KQogICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCiAgICB7IF9NX2h0Lmluc2VydF9l cXVhbChfX2YsIF9fbCk7IH0KCiMgMzI3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45 NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2hfbWFwLmgiIDMKCgpwdWJsaWM6 CiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KICBzaXpl X3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CiAgYm9v bCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KICB2b2lkIHN3YXAoaGFz aF9tdWx0aW1hcCYgX19ocykgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CiAgZnJpZW5kIGJv b2wKICBvcGVyYXRvcj09IDw+ICAoY29uc3QgaGFzaF9tdWx0aW1hcCYsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcCYpOwoKICBpdGVyYXRvciBi ZWdpbigpIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVy biBfTV9odC5lbmQoKTsgfQogIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4g X01faHQuYmVnaW4oKTsgfQogIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9N X2h0LmVuZCgpOyB9CgpwdWJsaWM6CiAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUm IF9fb2JqKSAKICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KCiAgdGVt cGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9y IF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKSAKICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixf X2wpOyB9CgoKCgoKCgogIGl0ZXJhdG9yIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBl JiBfX29iaikKICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7 IH0gICAgCgogIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7IHJldHVybiBf TV9odC5maW5kKF9fa2V5KTsgfQogIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUm IF9fa2V5KSBjb25zdCAKICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CgogIHNpemVf dHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmNv dW50KF9fa2V5KTsgfQogIAogIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShj b25zdCBrZXlfdHlwZSYgX19rZXkpCiAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tl eSk7IH0KICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KICBlcXVhbF9yYW5n ZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CiAgICB7IHJldHVybiBfTV9odC5lcXVhbF9y YW5nZShfX2tleSk7IH0KCiAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkg e3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9faXQp IHsgX01faHQuZXJhc2UoX19pdCk7IH0KICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0 b3IgX19sKSB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQogIHZvaWQgY2xlYXIoKSB7IF9NX2h0 LmNsZWFyKCk7IH0KCnB1YmxpYzoKICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KSB7IF9N X2h0LnJlc2l6ZShfX2hpbnQpOyB9CiAgc2l6ZV90eXBlIGJ1Y2tldF9jb3VudCgpIGNvbnN0IHsg cmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CiAgc2l6ZV90eXBlIG1heF9idWNrZXRfY291 bnQoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KICBzaXplX3R5 cGUgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CiAgICB7IHJldHVybiBfTV9o dC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNz IF9UcCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJvb2wg Cm9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LF9UcCxfSEYsX0VxS2V5LF9BbGxv Yz4mIF9faG0xLAogICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSxfVHAsX0hGLF9F cUtleSxfQWxsb2M+JiBfX2htMikKewogIHJldHVybiBfX2htMS5fTV9odCA9PSBfX2htMi5fTV9o dDsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZjbiwg Y2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgdm9pZCAKc3dhcChoYXNoX211bHRp bWFwPF9LZXksX1RwLF9IYXNoRmNuLF9FcWxLZXksX0FsbG9jPiYgX19obTEsCiAgICAgaGFzaF9t dWx0aW1hcDxfS2V5LF9UcCxfSGFzaEZjbixfRXFsS2V5LF9BbGxvYz4mIF9faG0yKQp7CiAgX19o bTEuc3dhcChfX2htMik7Cn0KCgoKCgoKCgogCgoKCiAKIAogCiMgMzQgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9oYXNoX21hcCIg MiAzCgoKCgogCiAKIAojIDUgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uL2ludFF1YWRyYXR1 cmUuaCIgMgoKCgoKCiAKCiAKCgoKCgoKCgpjbGFzcyBpbnRfUXVhZHJhdHVyZSB7CnB1YmxpYzoK ICAgCgoKCgogIGludF9RdWFkcmF0dXJlKHVuc2lnbmVkIGludCBuKTsKCiAgIAogIGlubGluZSBk b3VibGUgY29uc3QgKiBhYnNjaXNzYXMoKSBjb25zdCB7IHJldHVybiBhYnNjaXNzYXNfOyB9Cgog ICAKICBpbmxpbmUgZG91YmxlIGNvbnN0ICogd2VpZ2h0cygpIGNvbnN0IHsgcmV0dXJuIHdlaWdo dHNfOyB9CgogICAKICBpbmxpbmUgY29uc3QgdW5zaWduZWQgaW50IG4oKSBjb25zdCB7IHJldHVy biBuXzsgfQpwcm90ZWN0ZWQ6CiAgIAogIGRvdWJsZSogYWJzY2lzc2FzXzsKCiAgIAogIGRvdWJs ZSogd2VpZ2h0c187CgogICAKCgogIGJvb2wgdXNhYmxlXzsKCnByaXZhdGU6CiAgIAoKCgogIHN0 YXRpYyBoYXNoX21hcDx1bnNpZ25lZCBpbnQsIGRvdWJsZSo+IGFic2Npc3Nhc19IOwoKICAgCgoK CiAgc3RhdGljIGhhc2hfbWFwPHVuc2lnbmVkIGludCwgZG91YmxlKj4gd2VpZ2h0c19IOwoKICAg CiAgdW5zaWduZWQgaW50IG5fOwp9OwoKIAoKIAoKCgoKCgoKCgpjbGFzcyBpbnRfR2F1c3NMb2Jh dHRvIDogcHVibGljIGludF9RdWFkcmF0dXJlIHsKcHVibGljOgogIGludF9HYXVzc0xvYmF0dG8o dW5zaWduZWQgaW50IHApOwpwcml2YXRlOgogIHVuc2lnbmVkIGludCBwXzsKfTsKCiAKCiAKCgoK CgoKCgoKCmNsYXNzIGludF9HYXVzc0phY29iaUxvYmF0dG8gOiBwdWJsaWMgaW50X1F1YWRyYXR1 cmUgewogIGludF9HYXVzc0phY29iaUxvYmF0dG8odW5zaWduZWQgaW50IHApOwpwcml2YXRlOgog IHVuc2lnbmVkIGludCBwXzsKfTsKCiAKCiAKCgoKCgoKCgoKCmNsYXNzIGludF9HYXVzc0phY29i aTJMb2JhdHRvIDogcHVibGljIGludF9RdWFkcmF0dXJlIHsKICBpbnRfR2F1c3NKYWNvYmkyTG9i YXR0byh1bnNpZ25lZCBpbnQgcCk7CnByaXZhdGU6CiAgdW5zaWduZWQgaW50IHBfOwp9OwoKCiMg MTUgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCgogCgojIDEgIi4uL2Z1bmN0aW9u Ly4uL2ludGVncmF0aW9uL2ludExwbDAwMC5oIiAxCiAKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50 ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbDAwMCB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3Ig KCkoY29uc3QgUmVhbDNkJiB4LCBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbSwgdWludCBnYXVz cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZWFsIGRscFtdKSBjb25zdDsKfTsKCgojIDE5ICIuLi9mdW5jdGlvbi8uLi9pbnRl Z3JhdGlvbi5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uL2ludExwbDAwMS5o IiAxCiAKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbDAw MSB7CgogcHVibGljOgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmVhbDNkJiB4LCBjb25zdCBz cGNfQ29uc3RhbnQzZDAwMCYgZWxtLCB1aW50IGdhdXNzLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsKiBkbHApIGNvbnN0 Owp9OwoKCiMgMjAgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCiMgMSAiLi4vZnVu Y3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBsMDAzLmgiIDEKIAoKCgoKCgoKCgoKCgoKI3ByYWdt YSBpbnRlcmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsMDAzIHsKCiBwdWJsaWM6CgogIHZvaWQgb3Bl cmF0b3IoKShjb25zdCBSZWFsM2QmIHgsIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtLCB1aW50 IGdhdXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlYWwgc2xwW10pIGNvbnN0Owp9OwoKCiMgMjEgIi4uL2Z1bmN0aW9uLy4u L2ludGVncmF0aW9uLmgiIDIKCiMgMSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBs MDA0LmgiIDEKIAoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpjbGFzcyBpbnRf THBsMDA0IHsKCiBwdWJsaWM6CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJlYWwzZCYgeCwgY29u c3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbSwgdWludCBnYXVzcywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCogc2xwKSBj b25zdDsKfTsKCgojIDIyICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi5oIiAyCgoKIAoKIyAx ICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxDb2wwMDAuaCIgMQogCgoKCgoKCgoK CgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbENvbDAwMCB7CgogcHVibGlj OgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZ2VvX1ZlcnRleDNkJiB4LCBjb25zdCBnZW9fVHJp YW5nbGUzZCYgcG5sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVp bnQgZGVnLCByZWFsIHNscFtdLCByZWFsIGRscFtdKSBjb25zdDsKfTsKCgojIDI2ICIuLi9mdW5j dGlvbi8uLi9pbnRlZ3JhdGlvbi5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9u L2ludExwbENvbDAwMS5oIiAxCiAKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpj bGFzcyBpbnRfTHBsQ29sMDAxIHsKCiBwdWJsaWM6CgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBn ZW9fVmVydGV4M2QmIHgsIGNvbnN0IGdlb19UcmlhbmdsZTNkJiBwbmwsIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgc2xwW10sIHJlYWwgZGxw W10pIGNvbnN0Owp9OwoKCiMgMjcgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCiMg MSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBsQ29sMDAyLmgiIDEKIAoKCgoKCgoK CgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsQ29sMDAyIHsKCiBwdWJs aWM6CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGdlb19WZXJ0ZXgzZCYgeCwgY29uc3QgZ2VvX1Ry aWFuZ2xlM2QmIHBubCwgdWludCBkZWcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVpbnQgZ2F1c3MsIHJlYWwgc2xwW10pIGNvbnN0Owp9OwoKCiMg MjggIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCiMgMSAiLi4vZnVuY3Rpb24vLi4v aW50ZWdyYXRpb24vaW50THBsQ29sMDAzLmgiIDEKIAoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRl cmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsQ29sMDAzIHsKCiBwdWJsaWM6CiAgdm9pZCBvcGVyYXRv cigpKGNvbnN0IGdlb19WZXJ0ZXgzZCYgeCwgY29uc3QgZ2VvX1RyaWFuZ2xlM2QmIHBubCwgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBnYXVz cywgcmVhbCBzbHBbXSkgY29uc3Q7Cn07CgoKIyAyOSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRp b24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxDb2wwMDQuaCIg MQogCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNzIGludF9McGxDb2ww MDQgewoKIHB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZ2VvX1ZlcnRleDNkJiB4LCBj b25zdCBnZW9fVHJpYW5nbGUzZCYgcG5sLCB1aW50IGRlZywgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBnYXVzcywgcmVhbCBkbHBbXSkgY29u c3Q7Cn07CgoKIyAzMCAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9m dW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxDb2wwMDUuaCIgMQogCgoKCgoKCgoKCgoKCgoj cHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNzIGludF9McGxDb2wwMDUgewoKIHB1YmxpYzoKICB2 b2lkIG9wZXJhdG9yKCkoY29uc3QgZ2VvX1ZlcnRleDNkJiB4LCBjb25zdCBnZW9fVHJpYW5nbGUz ZCYgcG5sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1aW50IGdhdXNzLCByZWFsIGRscFtdKSBjb25zdDsKfTsKCgojIDMxICIuLi9mdW5jdGlvbi8u Li9pbnRlZ3JhdGlvbi5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uL2ludExw bENvbDAwNi5oIiAxCiAKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNz IGludF9McGxDb2wwMDYgewoKICBwdWJsaWM6CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19E aXJhYzNkMDAwJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVksIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGdhdXNzLCByZWFsIGRpc3QsIHJlYWwg c2xwW10pIGNvbnN0Owp9OwoKCiMgMzIgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIK CiMgMSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBsQ29sMDA3LmgiIDEKIAoKCgoK CgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbENvbDAwNyB7Cgog cHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfRGlyYWMzZDAwMCYgZWxtWCwgY29u c3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdWludCBnYXVzcywgcmVhbCBkaXN0LCByZWFsIGRscFtdKSBjb25zdDsKfTsKCgoj IDMzICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi5oIiAyCgoKIAoKIyAxICIuLi9mdW5jdGlv bi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxHYWwwMDAuaCIgMQogCgoKCgoKCgoKCgoKCgojcHJhZ21h IGludGVyZmFjZQoKCgoKCmNsYXNzIGludF9McGxHYWwwMDAgewoKIHB1YmxpYzoKICB2b2lkIG9w ZXJhdG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2Qw MDAmIGVsbVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgc3Ryb3VkSWQs IHVpbnQgZ2F1c3NJZCwgcmVhbCBzbHBbXSkgY29uc3Q7Cn07CgoKIyAzNyAiLi4vZnVuY3Rpb24v Li4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRM cGxHYWwwMDEuaCIgMQogCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNz IGludF9McGxHYWwwMDEgewoKIHB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0xp bmVhcjNkMDAwJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVpbnQgc3Ryb3VkSWQsIHVpbnQgZ2F1c3NJZCwgcmVhbCBk bHBbXSkgY29uc3Q7Cn07CgoKIyAzOCAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24uaCIgMgoK IyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxHYWwwMDIuaCIgMQogCgoKCgoK CgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNzIGludF9McGxHYWwwMDIgewoKIHB1 YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1YLCBjb25z dCBzcGNfTGluZWFyM2QwMDAmIGVsbVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVpbnQgc3Ryb3VkSWQsIHVpbnQgZ2F1c3NJZCwgcmVhbCBoeXBbXSkgY29uc3Q7Cn07CgoKIyAz OSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9p bnRlZ3JhdGlvbi9pbnRMcGxHYWwwMDQuaCIgMQogCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVy ZmFjZQoKCgoKCmNsYXNzIGludF9McGxHYWwwMDQgewoKIHB1YmxpYzoKICB2b2lkIG9wZXJhdG9y KCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVs bVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQg Z2F1c3NJZCwgcmVhbCBkbHBbXSkgY29uc3Q7Cn07CgoKIyA0MCAiLi4vZnVuY3Rpb24vLi4vaW50 ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxHYWww MDUuaCIgMQogCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgoKCmNsYXNzIGludF9M cGxHYWwwMDUgewoKIHB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNk MDAwJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZ2F1c3NJZCwgcmVhbCBoeXBbXSkg Y29uc3Q7Cn07CgoKIyA0MSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIu Li9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRMcGxHYWwwMDYuaCIgMQogCgoKCgoKCgoKCgoK CgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsR2FsMDA2IHsKCiBwdWJsaWM6 CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWCwgY29uc3Qgc3Bj X0xpbmVhcjNkMDAwJiBlbG1ZLAogICAgICAgICAgICAgICAgICAgICAgdWludCBzdHJvdWRJZCwg dWludCBnYXVzc0lkLCByZWFsIGRpc3QsIHJlYWwgc2xwW10pIGNvbnN0Owp9OwoKCiMgNDIgIi4u L2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCiMgMSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdy YXRpb24vaW50THBsR2FsMDA3LmgiIDEKIAoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNl CgoKCgoKY2xhc3MgaW50X0xwbEdhbDAwNyB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShj b25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwK ICAgICAgICAgICAgICAgICAgICAgIHVpbnQgc3Ryb3VkSWQsIHVpbnQgZ2F1c3NJZCwgcmVhbCBk aXN0LCByZWFsIGRscFtdKSBjb25zdDsKfTsKCgojIDQzICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3Jh dGlvbi5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uL2ludExwbEdhbDAwOC5o IiAxCiAKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbEdh bDAwOCB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAm IGVsbVgsIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwKICAgICAgICAgICAgICAgICAgICAg IHVpbnQgc3Ryb3VkSWQsIHVpbnQgZ2F1c3NJZCwgcmVhbCBkaXN0LCByZWFsIGh5cFtdKSBjb25z dDsKfTsKCgojIDQ0ICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi5oIiAyCgojIDEgIi4uL2Z1 bmN0aW9uLy4uL2ludGVncmF0aW9uL2ludExwbEdhbDAwOS5oIiAxCiAKCgoKCgoKCgoKCgoKCiNw cmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbEdhbDAwOSB7CgogcHVibGljOgogIHZv aWQgb3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIGNvbnN0IHNwY19MaW5l YXIzZDAwMCYgZWxtWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1aW50IGdhdXNzLCByZWFsIGRscFtdKSBjb25zdDsKfTsKCgojIDQ1ICIuLi9mdW5j dGlvbi8uLi9pbnRlZ3JhdGlvbi5oIiAyCgojIDEgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9u L2ludExwbEdhbDAxMC5oIiAxCiAKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoK Y2xhc3MgaW50X0xwbEdhbDAxMCB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBz cGNfQ29uc3RhbnQzZDAwMCYgZWxtWCwgY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVksIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQgYWNy eVtdLCByZWFsKiBkbHApIGNvbnN0Owp9OwoKCiMgNDYgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0 aW9uLmgiIDIKCiMgMSAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBsR2FsMDExLmgi IDEKIAoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCgoKY2xhc3MgaW50X0xwbEdh bDAxMSB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfQ29uc3RhbnQzZDAw MCYgZWxtWCwgY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVksIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50IGFjcnlbXSwgcmVhbCBkLCByZWFsKiBkbHAp IGNvbnN0Owp9OwoKCiMgNDcgIi4uL2Z1bmN0aW9uLy4uL2ludGVncmF0aW9uLmgiIDIKCiMgMSAi Li4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24vaW50THBsR2FsMDEyLmgiIDEKIAoKCgoKCgoKCgoK CgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsR2FsMDEyIHsKCiBwdWJsaWM6 CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1YLCBjb25zdCBz cGNfQ29uc3RhbnQzZDAwMCYgZWxtWSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgdWludCBhY3J5W10sIHJlYWwqIGRscCkgY29uc3Q7Cn07CgoKIyA0 OCAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9p bnRlZ3JhdGlvbi9pbnRMcGxHYWwwMTQuaCIgMQogCgoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRl cmZhY2UKCgoKCgpjbGFzcyBpbnRfTHBsR2FsMDE0IHsKCiBwdWJsaWM6CiAgdm9pZCBvcGVyYXRv cigpKGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1YLCBjb25zdCBzcGNfQ29uc3RhbnQzZDAw MCYgZWxtWSwgCiAgICAgICAgICAgICAgICAgICAgICAgdWludCBzdHJvdWRJZCwgdWludCBnYXVz c0lkLCByZWFsIGRpc3QsIHJlYWwqIGRscCkgY29uc3Q7Cn07CgoKIyA0OSAiLi4vZnVuY3Rpb24v Li4vaW50ZWdyYXRpb24uaCIgMgoKIyAxICIuLi9mdW5jdGlvbi8uLi9pbnRlZ3JhdGlvbi9pbnRM cGxHYWwwMTguaCIgMQogCgoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgpjbGFz cyBpbnRfTHBsR2FsMDE4IHsKCiBwdWJsaWM6CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19D b25zdGFudDNkMDAwJiBlbG1YLCBjb25zdCBzcGNfQ29uc3RhbnQzZDAwMCYgZWxtWSwgCiAgICAg ICAgICAgICAgICAgICAgICAgdWludCBzdHJvdWRJZCwgdWludCBnYXVzc0lkLCByZWFsIGRpc3Qs IHJlYWwqIHNscCkgY29uc3Q7Cn07CgoKIyA1MCAiLi4vZnVuY3Rpb24vLi4vaW50ZWdyYXRpb24u aCIgMgoKCgojIDE0ICIuLi9mdW5jdGlvbi9mbmNMRm9ybS5oIiAyCgoKCiAKCiAKCnRlbXBsYXRl PGNsYXNzIEY+CmNsYXNzIGZuY19MaW5lYXJGb3JtIHsKCiBwdWJsaWM6CiAgIAogIHZpcnR1YWwg fmZuY19MaW5lYXJGb3JtKCkge30KCiAgIAoKCgoKICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShj b25zdCBzcGNfRWxlbWVudDxGPiYgZWxtLCAKCQkJICBzcGNfRWxlbWVudE1hdHJpeDxGPiYgZW0p ID0gMDsgCn07CgogCgpjbGFzcyBmbmNfTGFwbGFjZVNMUCA6IHB1YmxpYyBmbmNfTGluZWFyRm9y bTxyZWFsPiB7CgogIGludF9McGwwMDMgcXJBXzsKICBpbnRfTHBsMDA0IHFyQl87CgogIFJlYWwz ZCB4XzsKICB1aW50ICAgZ2F1c3NfOwoKIHB1YmxpYzoKICBpbmxpbmUgZm5jX0xhcGxhY2VTTFAo Y29uc3QgUmVhbDNkJiB4LCB1aW50IGdhdXNzID0gMCk7IAoKICB2b2lkIG9wZXJhdG9yKCkoY29u c3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsK ICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtLCAKCQkJ IHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShj b25zdCBzcGNfQ29uc3RhbnQzZDAwMCYgZWxtLCAKCQkJIHNwY19FbGVtZW50TWF0cml4PHJlYWw+ JiBlbSk7Cn07IAoKaW5saW5lIGZuY19MYXBsYWNlU0xQOjpmbmNfTGFwbGFjZVNMUChjb25zdCBS ZWFsM2QmIHgsIHVpbnQgZ2F1c3MpIHsKICB4XyA9IHg7IGdhdXNzXyA9IGdhdXNzOwp9Cgppbmxp bmUgdm9pZCBmbmNfTGFwbGFjZVNMUDo6b3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAm IGVsbSwgCgkJCQkgICAgICAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKSB7CiAgcmVhbCBt WzNdOwkJCQkJCSAgCiAgcXJBXyh4XywgZWxtLCBnYXVzc18sIG0pOwoKICBlbS5yZXNpemUoMywg MSk7IGVtKDAsIDApID0gbVswXTsgZW0oMSwgMCkgPSBtWzFdOyBlbSgyLCAwKSA9IG1bMl07Cn0K CmlubGluZSB2b2lkIGZuY19MYXBsYWNlU0xQOjpvcGVyYXRvcigpKGNvbnN0IHNwY19Db25zdGFu dDNkMDAwJiBlbG0sCgkJCQkgICAgICAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKSB7CiAg cmVhbCBtOwkJCQkJCSAgCiAgcXJCXyh4XywgZWxtLCBnYXVzc18sICZtKTsKCiAgZW0ucmVzaXpl KDEsIDEpOyBlbSgwLCAwKSA9IG07Cn0KCiAKCmNsYXNzIGZuY19MYXBsYWNlRExQIDogcHVibGlj IGZuY19MaW5lYXJGb3JtPHJlYWw+IHsKCiAgaW50X0xwbDAwMCBxckFfOwogIGludF9McGwwMDEg cXJCXzsKCiAgUmVhbDNkIHhfOwogIHVpbnQgICBnYXVzc187CgogcHVibGljOgogIGlubGluZSBm bmNfTGFwbGFjZURMUChjb25zdCBSZWFsM2QmIHgsIHVpbnQgZ2F1c3MgPSAwKTsgCgogIHZvaWQg b3BlcmF0b3IoKShjb25zdCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtLCBzcGNfRWxlbWVudE1hdHJp eDxyZWFsPiYgZW0pOwogIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNk MDAwJiBlbG0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOwogIGlubGluZSB2b2lkIG9wZXJhdG9yKCko Y29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7Cn07IAoK aW5saW5lIGZuY19MYXBsYWNlRExQOjpmbmNfTGFwbGFjZURMUChjb25zdCBSZWFsM2QmIHgsIHVp bnQgZ2F1c3MpIHsKICB4XyA9IHg7IGdhdXNzXyA9IGdhdXNzOwp9CgppbmxpbmUgdm9pZCBmbmNf TGFwbGFjZURMUDo6b3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbSwgCgkJCQkg ICAgICAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKSB7CiAgcmVhbCBtWzNdOwkJCQkJCSAg CiAgcXJBXyh4XywgZWxtLCBnYXVzc18sIG0pOwoKICBlbS5yZXNpemUoMywgMSk7IGVtKDAsIDAp ID0gbVswXTsgZW0oMSwgMCkgPSBtWzFdOyBlbSgyLCAwKSA9IG1bMl07Cn0KCmlubGluZSB2b2lk IGZuY19MYXBsYWNlRExQOjpvcGVyYXRvcigpKGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG0s IAoJCQkJICAgICAgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSkgewogIHJlYWwgbTsKICBx ckJfKHhfLCBlbG0sIGdhdXNzXywgJm0pOwoKICBlbS5yZXNpemUoMSwgMSk7IGVtKDAsIDApID0g bTsKfQoKIAoKIAoKCgoKY2xhc3MgZm5jX1JpZXN6IDogcHVibGljIGZuY19MaW5lYXJGb3JtPHJl YWw+IHsKCnB1YmxpYzoKICAgCgoKCgogIGZuY19SaWVzeihjb25zdCBjaGFyKiBmb3JtdWxhciwg dWludCBnYXVzcyA9IDApOyAKICB2aXJ0dWFsIGlubGluZSB+Zm5jX1JpZXN6KCk7CgogICAKCgoK CgoKCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBlbG0sIHNwY19F bGVtZW50TWF0cml4PHJlYWw+JiBlbSk7CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19MaW5l YXIzZDAwMCYgZWxtLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOwogIHZvaWQgb3BlcmF0 b3IoKShjb25zdCBzcGNfQ29uc3RhbnQzZDAwMCYgZWxtLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFs PiYgZW0pOwogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfRGlyYWMzZDAwMCYgZWxtLCBzcGNf RWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOwogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfTGlu ZWFyMmQwMDAmIGVsbSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsKICB2b2lkIG9wZXJh dG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAxJiBlbG0sIHNwY19FbGVtZW50TWF0cml4PHJlYWw+ JiBlbSk7CgogIGlubGluZSBjb25zdCB1Y2hhciogcGdtKCkgY29uc3Q7CiAgaW5saW5lIHVpbnQg Z2F1c3MoKSBjb25zdDsKCnByaXZhdGU6CiAgIAogIHVjaGFyKiBwZ21fOwoKICAgCiAgdWludCAg IGdhdXNzXzsKfTsgCgppbmxpbmUgZm5jX1JpZXN6Ojp+Zm5jX1JpZXN6KCkgewogIGRlbGV0ZVtd IHBnbV87IAp9CgppbmxpbmUgY29uc3QgdWNoYXIqIGZuY19SaWVzejo6cGdtKCkgY29uc3Qgewog IHJldHVybiBwZ21fOyAKfQoKaW5saW5lIHVpbnQgZm5jX1JpZXN6OjpnYXVzcygpIGNvbnN0IHsK ICByZXR1cm4gZ2F1c3NfOyAKfQoKCiMgMTkgIi4uL2Z1bmN0aW9uL2ZuY0Z1bmN0aW9uLmgiIDIK CiMgMSAiLi4vZnVuY3Rpb24vZm5jRGVidWcuaCIgMQoKCgoKCgoKIAoKCgoKCgojIDIwICIuLi9m dW5jdGlvbi9mbmNGdW5jdGlvbi5oIiAyCgoKIAoKIyA2NCAiLi4vZnVuY3Rpb24vZm5jRnVuY3Rp b24uaCIKCgp0ZW1wbGF0ZTxjbGFzcyBGPgpjbGFzcyBmbmNfRnVuY3Rpb247Cgp0ZW1wbGF0ZTxj bGFzcyBGPgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgZm5j X0Z1bmN0aW9uPEY+JiBmbmMpIHsKICByZXR1cm4gZm5jLmluZm8ob3MpOyAKfQoKIAogCnRlbXBs YXRlPGNsYXNzIEY+CmNsYXNzIGZuY19GdW5jdGlvbiB7CgogICAKICBmcmllbmQgb3N0cmVhbSYg b3BlcmF0b3I8PCA8PiAob3N0cmVhbSYgb3MsIGNvbnN0IGZuY19GdW5jdGlvbiYgZm5jKTsKCiAg Y29uc3Qgc3BjX1NwYWNlPEY+JiBzcGNfOwoKcHVibGljOgogIGlubGluZSBmbmNfRnVuY3Rpb24o Y29uc3Qgc3BjX1NwYWNlPEY+JiBzcGMpOwogIHZpcnR1YWwgfmZuY19GdW5jdGlvbigpIHt9IAoK ICB2aXJ0dWFsIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3I9KGNvbnN0IGZuY19GdW5jdGlvbjxG PiYgZm5jKSA9IDA7CiAgdmlydHVhbCBGJiBvcGVyYXRvcigpKHNwY19CRm5jSW5kZXggaSkgPSAw OwogIHZpcnR1YWwgRiBvcGVyYXRvcigpKHNwY19CRm5jSW5kZXggaSkgY29uc3QgPSAwOwogIHZp cnR1YWwgZm5jX0Z1bmN0aW9uPEY+JiBvcGVyYXRvcis9KGNvbnN0IGZuY19GdW5jdGlvbjxGPiYg Zm5jKTsKICB2aXJ0dWFsIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3IrPShGIGMpOwogIHZpcnR1 YWwgZm5jX0Z1bmN0aW9uPEY+JiBvcGVyYXRvci09KGNvbnN0IGZuY19GdW5jdGlvbjxGPiYgZm5j KTsKICB2aXJ0dWFsIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3ItPShGIGMpOwogIHZpcnR1YWwg Zm5jX0Z1bmN0aW9uPEY+JiBvcGVyYXRvcio9KEYgYSk7CgogIHZpcnR1YWwgZm5jX0Z1bmN0aW9u PEY+JiBhZGQoY29uc3QgZm5jX0Z1bmN0aW9uPEY+JiBmbmMsIEYgYSk7CiAgdmlydHVhbCBvc3Ry ZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdCA9IDA7CiAgY29uc3Qgc3BjX1NwYWNlPEY+JiBz cGFjZSgpIGNvbnN0Owp9OwoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIGZuY19GdW5jdGlvbjxG Pjo6Zm5jX0Z1bmN0aW9uKGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjKSA6IHNwY18oc3BjKSB7IAp9 CiAgCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIGZuY19GdW5j dGlvbjxGPjo6c3BhY2UoKSBjb25zdCB7IAogIHJldHVybiBzcGNfOyAKfQogIAoKCiAKCiAKCnRl bXBsYXRlPGNsYXNzIEY+CmNsYXNzIGZuY19WZWN0b3IgOiBwdWJsaWMgZm5jX0Z1bmN0aW9uPEY+ IHsKCiAgIAogIGNvbnN0IHVpbnQgbl87CgogICAKICBGKiAgICAgICAgIHZfOwoKcHVibGljOgoK ICAgCgogIGZuY19WZWN0b3IoY29uc3QgZm5jX1ZlY3RvcjxGPiYgZm5jKTsKCiAgIAoKCiAgZm5j X1ZlY3Rvcihjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYyk7CgogICAKCgoKICBmbmNfVmVjdG9yKGNv bnN0IHNwY19TcGFjZTxGPiYgc3BjLCBmbmNfTGluZWFyRm9ybTxGPiYgbGYpOwoKICAgCgoKCiAg Zm5jX1ZlY3Rvcihjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYywgY2hhciogZm5hbWUpOwoKICAgCiAg aW5saW5lIH5mbmNfVmVjdG9yKCk7CgogICAKCiAgaW5saW5lIGZuY19GdW5jdGlvbjxGPiYgb3Bl cmF0b3I9KGNvbnN0IGZuY19GdW5jdGlvbjxGPiYgZm5jKTsKCiAgIAoKICBpbmxpbmUgZm5jX1Zl Y3RvcjxGPiYgb3BlcmF0b3I9KGNvbnN0IGZuY19WZWN0b3I8Rj4mIGZuYyk7CgogICAKCiAgaW5s aW5lIGZuY19WZWN0b3I8Rj4mIG9wZXJhdG9yPShGIGMpOwoKICAgCgogIGZuY19WZWN0b3I8Rj4m IG9wZXJhdG9yPShmbmNfTGluZWFyRm9ybTxGPiYgbGYpOwoKICAgCgogIGlubGluZSBGJiBvcGVy YXRvcigpKHNwY19CRm5jSW5kZXggaSk7CgogICAKCiAgaW5saW5lIEYgb3BlcmF0b3IoKShzcGNf QkZuY0luZGV4IGkpIGNvbnN0OwoKICAgCgogIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3IrPShj b25zdCBmbmNfVmVjdG9yPEY+JiBmbmMpOwoKICAgCgogIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0 b3IrPShGIGMpOwoKICAgCgogIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3ItPShjb25zdCBmbmNf VmVjdG9yPEY+JiBmbmMpOwoKICAgCgogIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3ItPShGIGMp OwoKICAgCgogIGZuY19GdW5jdGlvbjxGPiYgb3BlcmF0b3IqPShGIHNjKTsKICAKICAgCiAgRiBv cGVyYXRvciooZm5jX1ZlY3RvcjxGPiYgZm5jKTsKCiAgIAoKICBpbmxpbmUgb3BlcmF0b3IgRioo KSBjb25zdDsKCiAgZm5jX0Z1bmN0aW9uPEY+JiBhZGQoY29uc3QgZm5jX1ZlY3RvcjxGPiYgZm5j LCBGIHNjKTsKICB2aXJ0dWFsIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAg CiAgcmVhbCBsMSgpOwoKICAgCiAgaW5saW5lIHJlYWwgbDIoKTsKCiAgIAogIHJlYWwgbDJfMigp OwoKICAgCiAgcmVhbCBtYXgoKTsKCiAgIAogIGlubGluZSB1aW50IG4oKSBjb25zdDsKCiAgIAoK CgogIGZuY19WZWN0b3I8Rj4mIHdyaXRlKGNoYXIqIGZuYW1lKTsKfTsKCnRlbXBsYXRlPGNsYXNz IEY+CmlubGluZSBmbmNfVmVjdG9yPEY+Ojp+Zm5jX1ZlY3RvcigpIHsgCiAgZGVsZXRlW10gdl87 IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgZm5jX0Z1bmN0aW9uPEY+JiBmbmNfVmVjdG9y PEY+OjpvcGVyYXRvcj0oY29uc3QgZm5jX0Z1bmN0aW9uPEY+JiBmbmMpIHsKICBmb3IodWludCBp ID0gMDsgaSA8IG5fOyArK2kpIHZfW2ldID0gZm5jKGkpOwogIHJldHVybiAqdGhpczsKfQoKdGVt cGxhdGU8Y2xhc3MgRj4KaW5saW5lIGZuY19WZWN0b3I8Rj4mIGZuY19WZWN0b3I8Rj46Om9wZXJh dG9yPShjb25zdCBmbmNfVmVjdG9yPEY+JiBmbmMpIHsKICBtZW1jcHkodl8sIGZuYy52Xywgbl8g KiBzaXplb2Yodl9bMF0pKTsKICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+Cmlu bGluZSBmbmNfVmVjdG9yPEY+JiBmbmNfVmVjdG9yPEY+OjpvcGVyYXRvcj0oRiBjKSB7CiAgaWYg KGMpIHsKICAgIGZvcih1aW50IGkgPSAwOyBpIDwgbl87ICsraSkgdl9baV0gPSBjOwogIH0gZWxz ZSAKICAgIG1lbXNldCh2XywgMCwgbl8gKiBzaXplb2Yodl9bMF0pKTsKICByZXR1cm4gKnRoaXM7 Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBGJiBmbmNfVmVjdG9yPEY+OjpvcGVyYXRvcigp KHNwY19CRm5jSW5kZXggaSkgeyAKICByZXR1cm4gdl9baV07IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBG PgppbmxpbmUgRiBmbmNfVmVjdG9yPEY+OjpvcGVyYXRvcigpKHNwY19CRm5jSW5kZXggaSkgY29u c3QgeyAKICByZXR1cm4gdl9baV07IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgZm5jX1Zl Y3RvcjxGPjo6b3BlcmF0b3IgRiooKSBjb25zdCB7IAogIHJldHVybiB2XzsKfQoKdGVtcGxhdGU8 Y2xhc3MgRj4KaW5saW5lIHJlYWwgZm5jX1ZlY3RvcjxGPjo6bDIoKSB7IAogIHJldHVybiBzcXJ0 KGwyXzIoKSk7IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgdWludCBmbmNfVmVjdG9yPEY+ OjpuKCkgY29uc3QgeyAKICByZXR1cm4gbl87IAp9CgogCgojIDEgIi4uL2Z1bmN0aW9uL2ZuY0Z1 bmN0aW9uLnQiIDEKIAoKCgoKCgogICNwcmFnbWEgaW1wbGVtZW50YXRpb24KCgoKCiMgMSAiL3Vz ci9pbmNsdWRlL21lbW9yeS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoK CgoKIyAxMyAiLi4vZnVuY3Rpb24vZm5jRnVuY3Rpb24udCIgMgoKCiAKCnRlbXBsYXRlPGNsYXNz IEY+CmZuY19GdW5jdGlvbjxGPiYgZm5jX0Z1bmN0aW9uPEY+OjpvcGVyYXRvcis9KGNvbnN0IGZu Y19GdW5jdGlvbjxGPiYgZm5jKSB7CgogIGZvciAoc3BjX0JGbmNJbmRleCBpID0gc3BjXy5kaW0o KTsgaS0tOykgKCp0aGlzKShpKSArPSBmbmMoaSk7CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0 ZTxjbGFzcyBGPgpmbmNfRnVuY3Rpb248Rj4mIGZuY19GdW5jdGlvbjxGPjo6b3BlcmF0b3IrPShG IGMpIHsKCiAgZm9yIChzcGNfQkZuY0luZGV4IGkgPSBzcGNfLmRpbSgpOyBpLS07KSAoKnRoaXMp KGkpICs9IGM7CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpmbmNfRnVuY3Rp b248Rj4mIGZuY19GdW5jdGlvbjxGPjo6b3BlcmF0b3ItPShjb25zdCBmbmNfRnVuY3Rpb248Rj4m IGZuYykgewoKICBmb3IgKHNwY19CRm5jSW5kZXggaSA9IHNwY18uZGltKCk7IGktLTspICgqdGhp cykoaSkgLT0gZm5jKGkpOwogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KZm5j X0Z1bmN0aW9uPEY+JiBmbmNfRnVuY3Rpb248Rj46Om9wZXJhdG9yLT0oRiBjKSB7CgogIGZvciAo c3BjX0JGbmNJbmRleCBpID0gc3BjXy5kaW0oKTsgaS0tOykgKCp0aGlzKShpKSAtPSBjOwogIHJl dHVybiAqdGhpczsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KZm5jX0Z1bmN0aW9uPEY+JiBmbmNfRnVu Y3Rpb248Rj46Om9wZXJhdG9yKj0oRiBhKSB7CgogIGZvciAoc3BjX0JGbmNJbmRleCBpID0gc3Bj Xy5kaW0oKTsgaS0tOykgKCp0aGlzKShpKSAqPSBhOwogIHJldHVybiAqdGhpczsKfQoKdGVtcGxh dGU8Y2xhc3MgRj4KZm5jX0Z1bmN0aW9uPEY+JiBmbmNfRnVuY3Rpb248Rj46OmFkZChjb25zdCBm bmNfRnVuY3Rpb248Rj4mIGZuYywgRiBhKSB7CgogIGZvciAoc3BjX0JGbmNJbmRleCBpID0gc3Bj Xy5kaW0oKTsgaS0tOykgKCp0aGlzKShpKSArPSBhICogZm5jKGkpOwogIHJldHVybiAqdGhpczsK fQoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4KZm5jX1ZlY3RvcjxGPjo6Zm5jX1ZlY3Rvcihjb25zdCBm bmNfVmVjdG9yPEY+JiBmKSA6IGZuY19GdW5jdGlvbjxGPihmLnNwYWNlKCkpLCAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG5fKGYubl8pIHsKICB2XyA9IG5ldyBGW25fXTsgbWVtY3B5KHZfLCBmLnZfLCBuXyAqIHNp emVvZih2X1swXSkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpmbmNfVmVjdG9yPEY+OjpmbmNfVmVj dG9yKGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjKSA6IGZuY19GdW5jdGlvbjxGPihzcGMpLCAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu XyhzcGMuZGltKCkpIHsKICB2XyA9IG5ldyBGW25fXTsgbWVtc2V0KHZfLCAwLCBuXyAqIHNpemVv Zih2X1swXSkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpmbmNfVmVjdG9yPEY+OjpmbmNfVmVjdG9y KGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjLCBmbmNfTGluZWFyRm9ybTxGPiYgbGYpIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm5jX0Z1bmN0aW9uPEY+KHNwYyksIG5fKHNw Yy5kaW0oKSkgewogIHZfID0gbmV3IEZbbl9dOyBtZW1zZXQodl8sIDAsIG5fICogc2l6ZW9mKHZf WzBdKSk7CgogIHNwY19FbGVtZW50TWF0cml4PEY+IEEoMywgMSk7CQogIHNwY19FbGVtZW50TWF0 cml4PEY+IEIoMywgMSk7CQoKICBzcGNfU3BhY2U8Rj46OnNwY19TY2FuKiBzYyA9IHNwYWNlKCku c2NhbigpOwogIHdoaWxlICgqc2MpIHsKICAgIHNwY19FbGVtZW50PEY+JiBlbG0gPSAoKnNjKSsr OwogICAgY29uc3Qgc3BjX1Q8Rj4mIFQgPSBlbG0uVCgpOwogIAogICAgbGYoZWxtLCBBKTsgQS50 cmFuc3Bvc2UoKTsgVChBLCBCKTsgQi50cmFuc3Bvc2UoKTsKICAgIGZvcih1aW50IGkgPSBULm0o KTsgaS0tOykgewogICAgICB2X1tULmluZGV4KGkpXSArPSBCKGksIDApOwogICAgICBpZiggMCAg IT0wKSBjb3V0IDw8ICAgJ1snIDw8ICAiLi4vZnVuY3Rpb24vZm5jRnVuY3Rpb24udCIgPDwgIiwg bGluZSAiIDw8IDkwCgkgIDw8ICJdIGZuY19WZWN0b3I6OmZuY19WZWN0b3IgLS0gdlsiIDw8IGkg PDwgIl0gPSIgIDw8ICIgIiA8PCAgIHZfW1QuaW5kZXgoaSldICA8PCBlbmRsOyA7CiAgICB9CiAg fQogIGRlbGV0ZSBzYzsJCn0KCnRlbXBsYXRlPGNsYXNzIEY+CmZuY19WZWN0b3I8Rj46OmZuY19W ZWN0b3IoY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGMsIGNoYXIqIGZuYW1lKSA6IAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5jX0Z1bmN0aW9uPEY+KHNwYyksIG5fKHNwYy5k aW0oKSkgewogIHZfID0gbmV3IEZbbl9dOyAKCiAgaWZzdHJlYW0gaWZzKGZuYW1lKTsKICB1aW50 ICAgICBuID0gMDsgaWZzLnJlYWQoKGNoYXIqKSAmbiwgc2l6ZW9mKG4pKTsKCiAgaWYgKG5fICE9 IG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGNl cnIgPDwgJ1snIDw8ICAiLi4vZnVuY3Rpb24vZm5jRnVuY3Rpb24udCIgPDwgIiwgbGluZSAiIDw8 IDEwNTsKICAgIGNlcnIgPDwgIl0gZm5jX1ZlY3Rvcjo6cmVhZCgpIC0tIGRpbWVuc2lvbiBtaXNt YXRjaFxuIjsKICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgfQoKICBpZnMucmVhZCgoY2hhciopIHZfLCBuICogc2l6ZW9mKHZf WzBdKSk7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmZuY19WZWN0b3I8Rj4mIGZuY19WZWN0b3I8Rj46 Om9wZXJhdG9yPShmbmNfTGluZWFyRm9ybTxGPiYgbGYpIHsKCiAgbWVtc2V0KHZfLCAwLCBuXyAq IHNpemVvZih2X1swXSkpOwoKICBzcGNfRWxlbWVudE1hdHJpeDxGPiBBKDMsIDEpOwkKICBzcGNf RWxlbWVudE1hdHJpeDxGPiBCKDMsIDEpOwkKCiAgc3BjX1NwYWNlPEY+OjpzcGNfU2Nhbiogc2Mg PSBzcGFjZSgpLnNjYW4oKTsKICB3aGlsZSAoKnNjKSB7CiAgICBzcGNfRWxlbWVudDxGPiYgZWxt ID0gKCpzYykrKzsKICAgIGNvbnN0IHNwY19UPEY+JiBUID0gZWxtLlQoKTsKICAKICAgIGxmKGVs bSwgQSk7IEEudHJhbnNwb3NlKCk7IFQoQSwgQik7IEIudHJhbnNwb3NlKCk7CiAgICBmb3IodWlu dCBpID0gVC5tKCk7IGktLTspIAoJdl9bVC5pbmRleChpKV0gKz0gQihpLCAwKTsKICB9CiAgZGVs ZXRlIHNjOwkKCiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpmbmNfRnVuY3Rp b248Rj4mIGZuY19WZWN0b3I8Rj46Om9wZXJhdG9yKz0oY29uc3QgZm5jX1ZlY3RvcjxGPiYgZm5j KSB7CgogIGNvbnN0IEYqIHMgPSBmbmMudl87CiAgRiogICAgICAgZCA9IHZfOwogIGZvciAodWlu dCBpID0gbl87IGk7IC0taSkgKmQrKyArPSAqcysrOwoKICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBs YXRlPGNsYXNzIEY+CmZuY19GdW5jdGlvbjxGPiYgZm5jX1ZlY3RvcjxGPjo6b3BlcmF0b3IrPShG IGMpIHsKCiAgRiogdiA9IHZfOyAgCiAgZm9yICh1aW50IGkgPSBuXzsgaTsgLS1pKSAqdisrICs9 IGM7CgogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KZm5jX0Z1bmN0aW9uPEY+ JiBmbmNfVmVjdG9yPEY+OjpvcGVyYXRvci09KGNvbnN0IGZuY19WZWN0b3I8Rj4mIGZuYykgewoK ICBjb25zdCBGKiBzID0gZm5jLnZfOwogIEYqICAgICAgIGQgPSB2XzsKICBmb3IgKHVpbnQgaSA9 IG5fOyBpOyBpLS0pICpkKysgLT0gKnMrKzsKCiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxj bGFzcyBGPgpmbmNfRnVuY3Rpb248Rj4mIGZuY19WZWN0b3I8Rj46Om9wZXJhdG9yLT0oRiBjKSB7 CgogIEYqIHYgPSB2XzsgIAogIGZvciAodWludCBpID0gbl87IGk7IC0taSkgKnYrKyAtPSBjOwoK ICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmZuY19GdW5jdGlvbjxGPiYgZm5j X1ZlY3RvcjxGPjo6b3BlcmF0b3IqPShGIHNjKSB7CgogIEYqIHYgPSB2XzsKICBmb3IodWludCBp ID0gbl87IGk7IC0taSkgKnYrKyAqPSBzYzsKCiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxj bGFzcyBGPgpmbmNfRnVuY3Rpb248Rj4mIGZuY19WZWN0b3I8Rj46OmFkZChjb25zdCBmbmNfVmVj dG9yJiBmbmMsIEYgc2MpIHsKCiAgY29uc3QgRiogcyA9IGZuYy52XzsKICBGKiAgICAgICBkID0g dl87CiAgZm9yICh1aW50IGkgPSBuXzsgaTsgLS1pKSAqZCsrICs9IHNjICogKnMrKzsKCiAgcmV0 dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpvc3RyZWFtJiBmbmNfVmVjdG9yPEY+Ojpp bmZvKG9zdHJlYW0mIG9zKSBjb25zdCB7CgogIG9zIDw8ICJmbmNfVmVjdG9yKCIgPDwgbl8gPDwg IiAsWyI7CgogIEYqIHYgPSB2XzsgCiAgZm9yICh1aW50IGkgPSBuXzsgaTsgLS1pKSBvcyA8PCAq disrIDw8IChpID09IDEgPyAiXSkiIDogIiwgIik7CgogIHJldHVybiBvczsKfQoKdGVtcGxhdGU8 Y2xhc3MgRj4KZm5jX1ZlY3RvcjxGPiYgZm5jX1ZlY3RvcjxGPjo6d3JpdGUoY2hhciogZm5hbWUp IHsKCiAgb2ZzdHJlYW0gb2ZzKGZuYW1lKTsKCiAgb2ZzLndyaXRlKChjb25zdCBjaGFyKikgJm5f LCBzaXplb2Yobl8pKTsKICBvZnMud3JpdGUoKGNvbnN0IGNoYXIqKSB2Xywgbl8gKiBzaXplb2Yo dl9bMF0pKTsKICAgIAogIHJldHVybiAqdGhpczsKfQojIDI4MSAiLi4vZnVuY3Rpb24vZm5jRnVu Y3Rpb24uaCIgMgoKCgojIDEzICJsaW5lbC5jYyIgMgoKIyAxICIuLi9vcGVyYXRvci9vcE9wZXJh dG9yLmgiIDEKIAoKCgoKCgoKICAjcHJhZ21hIGludGVyZmFjZSAKCgoKCgoKCiMgMSAiLi4vb3Bl cmF0b3IvLi4vdG9vbGJveC90YnhTTWF0cml4LmgiIDEKIAoKCgoKCgoKCiAgI3ByYWdtYSBpbnRl cmZhY2UKCgoKCgoKCgoKIAoKY2xhc3MgU3BhcnNlTWF0cml4IHsKCiAgIAoKCgogIHN0cnVjdCBW YWx1ZSB7CiAgICBWYWx1ZSogbG5rOwogICAgdWludCAgIGlkeDsKICAgIHJlYWwgICB2YWw7Cgog ICAgIAoKCgoKCgoKCiAgICBWYWx1ZShWYWx1ZSogbCwgaW50IGksIHJlYWwgdiA9IDAuMCkgeyBs bmsgPSBsOyBpZHggPSBpOyB2YWwgPSB2OyB9CiAgICAKICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhz aXplX3Qgc3opIHsKICAgICAgY291dCA8PCAiVmFsdWU6Om5ldyhzaXplX3QpXG4iOyAKICAgICAg cmV0dXJuIG5ldyBjaGFyW3N6XTsgCiAgICB9CiAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90 LCBQb29sPFNwYXJzZU1hdHJpeDo6VmFsdWU+JiBwb29sKSB7IAogICAgICByZXR1cm4gcG9vbC5h bGxvYygpOyB9CiAgfTsKCiAgUG9vbDxWYWx1ZT4gcG9vbDsKICBWYWx1ZSoqICAgICBtYXRyaXg7 CiAgdWludCAgICAgICAgX3VzZWQ7CgogICAKICB1aW50ICAgICAgICBub2ZSb3dzOwoKICAgCiAg dWludCAgICAgICAgbm9mQ29sczsKCiAgdWludCAgICAgICAgaGFzaEJpdHM7CiAgdWludCAgICAg ICAgaGFzaE1zazsKCiAgU3BhcnNlTWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeCYpOwogIHZvaWQg b3BlcmF0b3IgPShjb25zdCBTcGFyc2VNYXRyaXgmKTsKCnB1YmxpYzoKICAgCgoKCgoKICBTcGFy c2VNYXRyaXgodWludCByLCB1aW50IGMsIHVpbnQgaCk7CiAgflNwYXJzZU1hdHJpeCgpOwoKICBp bmxpbmUgVmFsdWUqKiBNYXRyaXgoKSBjb25zdCB7IHJldHVybiBtYXRyaXg7IH0gIAogIGlubGlu ZSB1aW50IEhhc2hCaXRzKCkgY29uc3QgeyByZXR1cm4gaGFzaEJpdHM7IH0gIAoKICAgCgoKCgoK ICByZWFsJiBvcGVyYXRvcigpKGNvbnN0IHVpbnQgciwgY29uc3QgdWludCBjKTsKICB2b2lkIG9w ZXJhdG9yKCkoY29uc3QgcmVhbCBmW10sIHJlYWwgZ1tdKSBjb25zdDsKCiAgIAogIHVpbnQgdXNl ZCgpIGNvbnN0IHsgcmV0dXJuIF91c2VkOyB9CiAgZmxvYXQgbWVtb3J5KCkgY29uc3QgeyAKICAg IHJldHVybiBzaXplb2YoU3BhcnNlTWF0cml4KSArIHBvb2wubWVtb3J5KCkgCiAgICAgIC0gc2l6 ZW9mKHBvb2wpOyAKICB9CgogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwogIHZv aWQgd3JpdGUob2ZzdHJlYW0mIG9mcykgY29uc3Q7CiAgdm9pZCBvdXRwdXRNYXRsYWIob2ZzdHJl YW0mIG9mcykgY29uc3Q7CgogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvciA8PChvc3RyZWFtJiBv cywgY29uc3QgU3BhcnNlTWF0cml4JiBtKSB7CiAgICByZXR1cm4gbS5pbmZvKG9zKTsgfQp9OwoK CiMgMTcgIi4uL29wZXJhdG9yL29wT3BlcmF0b3IuaCIgMgoKCiMgMSAiLi4vb3BlcmF0b3Ivb3BC Rm9ybS5oIiAxCiAKCgoKCgoKCgoKCgoKCiMgMSAiLi4vb3BlcmF0b3IvLi4vaW50ZWdyYXRpb24v aW50QWJzY1dnaHQuaCIgMQogCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKCgoKCgoKCmV4 dGVybiBjb25zdCByZWFsIGludF8xX1BJNDsKZXh0ZXJuIGNvbnN0IHJlYWwgaW50XzFfUEk4Owpl eHRlcm4gY29uc3QgcmVhbCBpbnRfMV9mYWtbXTsKCmV4dGVybiBjb25zdCByZWFsKiBjb25zdCAg aW50X0dhdXNzQWJzY1dnaHRTeW1bOF07CmV4dGVybiBjb25zdCByZWFsKiBjb25zdCAgaW50X0dh dXNzQWJzY1dnaHRbMjVdOwoKZXh0ZXJuIGNvbnN0IHJlYWwqIGNvbnN0ICBpbnRfU3Ryb3VkQWJz Y1dnaHRbN107CmV4dGVybiBjb25zdCByZWFsKiBjb25zdCAgaW50X1N0cm91ZExpblRyaWFsV2do dFs3XTsKCnVpbnQgaW50X21hdGNoKGNvbnN0IGdlb19UcmlhbmdsZSYgdHJpWCwgY29uc3QgZ2Vv X1RyaWFuZ2xlJiB0cmlZKTsKCgpleHRlcm4gIkMiIHsKCgogICAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiAgdm9pZCBpbnRfR2F1c3NMb2JhdHRvQWJzY1dnaHQocmVhbCogeCwgcmVhbCog dywgY29uc3QgdWludCBwLAoJCQkJY29uc3QgdWludCBqID0gMCk7CgogICAKCgoKCgoKCgoKCgoK CgoKCgoKCgogIHZvaWQgaW50X0phY29iaVBvbChjb25zdCBkb3VibGUgYWxmLCBjb25zdCBkb3Vi bGUgYmV0LCBjb25zdCBpbnQgbWF4biwKCQkgICAgIGNvbnN0IGRvdWJsZSogeCwgY29uc3QgaW50 IG0sIGRvdWJsZSogcCk7CgogICAKCgoKCgoKCgoKCgoKICB2b2lkIGludF9KYWNvYmlaZXJvcyhk b3VibGUqIHgsIGludCBwLCBkb3VibGUgYWxmLCBkb3VibGUgYmV0KTsKCgp9CgoKCiMgMTUgIi4u L29wZXJhdG9yL29wQkZvcm0uaCIgMgoKCgogCgogCgoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNz IG9wX0JpbGluZWFyRm9ybSB7CgogcHVibGljOgogICAKCgogIHZpcnR1YWwgdm9pZCBvcGVyYXRv cigpKGNvbnN0IHNwY19FbGVtZW50PEY+JiBlbG1YLCAKCQkJICBjb25zdCBzcGNfRWxlbWVudDxG PiYgZWxtWSwgCgkJCSAgc3BjX0VsZW1lbnRNYXRyaXg8Rj4mIGVtKSA9IDA7Cn07CgogCgpjbGFz cyBvcF9MYXBsYWNlU0wgOiBwdWJsaWMgb3BfQmlsaW5lYXJGb3JtPHJlYWw+IHsKCiAgaW50X0xw bENvbDAwNiBxckFfOwogIGludF9McGxHYWwwMDYgcXJCXzsKICBpbnRfTHBsR2FsMDE4IHFyQ187 CgogIHVpbnQgIHN0cm91ZF8sIGdhdXNzXzsKICByZWFsICBkaXN0XzsKCiBwdWJsaWM6CiAgaW5s aW5lIG9wX0xhcGxhY2VTTCh1aW50IHN0cm91ZCA9IDAsIHVpbnQgZ2F1c3MgPSAwLCByZWFsIGRp c3QgPSAwLjApOwoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVs bVgsIAoJCSAgY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVksIHNwY19FbGVtZW50TWF0cml4 PHJlYWw+JiBlbSk7IAogIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0RpcmFjM2Qw MDAmIGVsbVgsIAoJCQkgY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1ZLCAKCQkJIHNwY19FbGVt ZW50TWF0cml4PHJlYWw+JiBlbSk7IAogIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3Bj X0NvbnN0YW50M2QwMDAmIGVsbVgsIAoJCQkgY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVks IAoJCQkgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsgCiAgaW5saW5lIHZvaWQgb3BlcmF0 b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIAoJCQkgY29uc3Qgc3BjX0xpbmVhcjNk MDAwJiBlbG1ZLCAKCQkJIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7IAp9OyAKCmlubGlu ZSBvcF9MYXBsYWNlU0w6Om9wX0xhcGxhY2VTTCh1aW50IHN0cm91ZCwgdWludCBnYXVzcywgcmVh bCBkaXN0KSB7IAoKICBzdHJvdWRfID0gc3Ryb3VkOyBnYXVzc18gPSBnYXVzczsgZGlzdF8gPSBk aXN0OyAKfQoKaW5saW5lIHZvaWQgb3BfTGFwbGFjZVNMOjpvcGVyYXRvcigpKGNvbnN0IHNwY19E aXJhYzNkMDAwJiBlbG1YLCAKCQkJCSAgICAgY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1ZLCAK CQkJCSAgICAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKSB7IAogIHJlYWwgbVs5XTsKICBx ckFfKGVsbVgsIGVsbVksIGdhdXNzXywgZGlzdF8sIG0pOwoKICB1aW50IG4gPSBlbG1YLlQoKS5u KCk7CiAgcmVhbCogbW0gPSBtOwoKICBlbS5yZXNpemUobiwgMyk7CiAgZm9yKHVpbnQgaSA9IDA7 IGkgPCBuOyArK2kpIHsKICAgIGVtKGksIDApID0gKm1tKys7IGVtKGksIDEpID0gKm1tKys7IGVt KGksIDIpID0gKm1tKys7CiAgfQp9CgppbmxpbmUgdm9pZCBvcF9MYXBsYWNlU0w6Om9wZXJhdG9y KCkoY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVgsIAoJCQkJICAgICBjb25zdCBzcGNfQ29u c3RhbnQzZDAwMCYgZWxtWSwgCgkJCQkgICAgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSkg eyAKICByZWFsIG07CiAgcXJDXyhlbG1YLCBlbG1ZLCBzdHJvdWRfLCBnYXVzc18sIGRpc3RfLCAm bSk7CgogIGVtLnJlc2l6ZSgxLCAxKTsKICBlbSgwLCAwKSA9IG07Cn0KCmlubGluZSB2b2lkIG9w X0xhcGxhY2VTTDo6b3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIAoJCQkJ ICAgICBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVksIAoJCQkJICAgICBzcGNfRWxlbWVudE1h dHJpeDxyZWFsPiYgZW0pIHsgCiAgcmVhbCBtWzldOwogIHFyQl8oZWxtWCwgZWxtWSwgc3Ryb3Vk XywgZ2F1c3NfLCBkaXN0XywgbSk7CgogIGVtLnJlc2l6ZSgzLCAzKTsKICBlbSgwLCAwKSA9IG1b MF07IGVtKDAsIDEpID0gbVsxXTsgZW0oMCwgMikgPSBtWzJdOwogIGVtKDEsIDApID0gbVszXTsg ZW0oMSwgMSkgPSBtWzRdOyBlbSgxLCAyKSA9IG1bNV07CiAgZW0oMiwgMCkgPSBtWzZdOyBlbSgy LCAxKSA9IG1bN107IGVtKDIsIDIpID0gbVs4XTsKfQoKIAoKY2xhc3Mgb3BfTGFwbGFjZURMIDog cHVibGljIG9wX0JpbGluZWFyRm9ybTxyZWFsPiB7CgogIGludF9McGxDb2wwMDcgcXJBXzsKICBp bnRfTHBsR2FsMDA3IHFyQl87CiAgaW50X0xwbEdhbDAxNCBxckNfOwoKICB1aW50ICBzdHJvdWRf LCBnYXVzc187CiAgcmVhbCAgZGlzdF87CgogcHVibGljOgogIGlubGluZSBvcF9MYXBsYWNlREwo dWludCBzdHJvdWQgPSAwLCB1aW50IGdhdXNzID0gMCwgcmVhbCBkaXN0ID0gMC4wKTsgCgogIHZv aWQgb3BlcmF0b3IoKShjb25zdCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtWCwgCiAgICAgICAgICAg ICAgICAgICAgY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVksIHNwY19FbGVtZW50TWF0cml4 PHJlYWw+JiBlbSk7IAogIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0RpcmFjM2Qw MDAmIGVsbVgsIAoJCSAgICAgIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwgc3BjX0VsZW1l bnRNYXRyaXg8cmVhbD4mIGVtKTsgCiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNf Q29uc3RhbnQzZDAwMCYgZWxtWCwgCgkJICAgIGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1Z LCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKICBpbmxpbmUgdm9pZCBvcGVyYXRvcigp KGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWCwgCgkJICAgICAgY29uc3Qgc3BjX0xpbmVhcjNk MDAwJiBlbG1ZLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKfTsgCgppbmxpbmUgb3Bf TGFwbGFjZURMOjpvcF9MYXBsYWNlREwodWludCBzdHJvdWQsIHVpbnQgZ2F1c3MsIHJlYWwgZGlz dCkgeyAKCiAgZ2F1c3NfID0gZ2F1c3MsIHN0cm91ZF8gPSBzdHJvdWQ7IGRpc3RfID0gZGlzdDsK fQoKaW5saW5lIHZvaWQgb3BfTGFwbGFjZURMOjpvcGVyYXRvcigpKGNvbnN0IHNwY19EaXJhYzNk MDAwJiBlbG1YLCAKCQkgICAgIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwgc3BjX0VsZW1l bnRNYXRyaXg8cmVhbD4mIGVtKSB7IAogIHJlYWwgbVs5XTsKICBxckFfKGVsbVgsIGVsbVksIGdh dXNzXywgZGlzdF8sIG0pOwoKICB1aW50IG4gPSBlbG1YLlQoKS5uKCk7CiAgcmVhbCogbW0gPSBt OwoKICBlbS5yZXNpemUobiwgMyk7CiAgZm9yKHVpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAg IGVtKGksIDApID0gKm1tKys7IGVtKGksIDEpID0gKm1tKys7IGVtKGksIDIpID0gKm1tKys7CiAg fQp9CgppbmxpbmUgdm9pZCBvcF9MYXBsYWNlREw6Om9wZXJhdG9yKCkoY29uc3Qgc3BjX0NvbnN0 YW50M2QwMDAmIGVsbVgsIAoJCSAgIGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1ZLCBzcGNf RWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pIHsgCiAgcmVhbCBtOwogIHFyQ18oZWxtWCwgZWxtWSwg c3Ryb3VkXywgZ2F1c3NfLCBkaXN0XywgJm0pOwoKICBlbS5yZXNpemUoMSwgMSk7CiAgZW0oMCwg MCkgPSBtOwp9CgppbmxpbmUgdm9pZCBvcF9MYXBsYWNlREw6Om9wZXJhdG9yKCkoY29uc3Qgc3Bj X0xpbmVhcjNkMDAwJiBlbG1YLCAKCQkgICAgIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwg c3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKSB7IAogIHJlYWwgbVs5XTsKICBxckJfKGVsbVgs IGVsbVksIHN0cm91ZF8sIGdhdXNzXywgZGlzdF8sIG0pOwoKICBlbS5yZXNpemUoMywgMyk7CiAg ZW0oMCwgMCkgPSBtWzBdOyBlbSgwLCAxKSA9IG1bMV07IGVtKDAsIDIpID0gbVsyXTsKICBlbSgx LCAwKSA9IG1bM107IGVtKDEsIDEpID0gbVs0XTsgZW0oMSwgMikgPSBtWzVdOwogIGVtKDIsIDAp ID0gbVs2XTsgZW0oMiwgMSkgPSBtWzddOyBlbSgyLCAyKSA9IG1bOF07Cn0KCiAKCmNsYXNzIG9w X0xhcGxhY2VQTEQgOiBwdWJsaWMgb3BfQmlsaW5lYXJGb3JtPHJlYWw+IHsKCiAgaW50X0xwbEdh bDAwNyBxckFfOwogIGludF9McGxHYWwwMTQgcXJCXzsKCiAgdWludCAgc3Ryb3VkXywgZ2F1c3Nf OwogIHJlYWwgIGRpc3RfOwoKIHB1YmxpYzoKICBpbmxpbmUgb3BfTGFwbGFjZVBMRCh1aW50IHN0 cm91ZCA9IDAsIHVpbnQgZ2F1c3MgPSAwLCByZWFsIGRpc3QgPSAwLjApOyAKCiAgdm9pZCBvcGVy YXRvcigpKGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBlbG1YLCAKCQkgICAgY29uc3Qgc3BjX0Vs ZW1lbnQ8cmVhbD4mIGVsbVksIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7IAogIGlubGlu ZSB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVgsIAoJCSAgICBj b25zdCBzcGNfQ29uc3RhbnQzZDAwMCYgZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVt KTsgCiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgs IAoJCSAgICAgIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8 cmVhbD4mIGVtKTsgCn07IAoKaW5saW5lIG9wX0xhcGxhY2VQTEQ6Om9wX0xhcGxhY2VQTEQodWlu dCBzdHJvdWQsIHVpbnQgZ2F1c3MsIHJlYWwgZGlzdCkgeyAKCiAgZ2F1c3NfID0gZ2F1c3MsIHN0 cm91ZF8gPSBzdHJvdWQ7IGRpc3RfID0gZGlzdDsKfQoKaW5saW5lIHZvaWQgb3BfTGFwbGFjZVBM RDo6b3BlcmF0b3IoKShjb25zdCBzcGNfQ29uc3RhbnQzZDAwMCYgZWxtWCwgCgkJICAgY29uc3Qg c3BjX0NvbnN0YW50M2QwMDAmIGVsbVksIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSkgeyAK ICByZWFsIG07CiAgcXJCXyhlbG1ZLCBlbG1YLCBzdHJvdWRfLCBnYXVzc18sIGRpc3RfLCAmbSk7 CgogIGVtLnJlc2l6ZSgxLCAxKTsKICBlbSgwLCAwKSA9IG07Cn0KCmlubGluZSB2b2lkIG9wX0xh cGxhY2VQTEQ6Om9wZXJhdG9yKCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAwJiBlbG1YLCAKCQkgICAg IGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVt KSB7IAogIHJlYWwgbVs5XTsKICBxckFfKGVsbVksIGVsbVgsIHN0cm91ZF8sIGdhdXNzXywgZGlz dF8sIG0pOwoKICBlbS5yZXNpemUoMywgMyk7CiAgZW0oMCwgMCkgPSBtWzBdOyBlbSgwLCAxKSA9 IG1bMV07IGVtKDAsIDIpID0gbVsyXTsKICBlbSgxLCAwKSA9IG1bM107IGVtKDEsIDEpID0gbVs0 XTsgZW0oMSwgMikgPSBtWzVdOwogIGVtKDIsIDApID0gbVs2XTsgZW0oMiwgMSkgPSBtWzddOyBl bSgyLCAyKSA9IG1bOF07Cn0KCiAKCmNsYXNzIG9wX0xhcGxhY2VIeXAgOiBwdWJsaWMgb3BfQmls aW5lYXJGb3JtPHJlYWw+IHsKCiAgaW50X0xwbEdhbDAwOCBxckFfOwoKICB1aW50ICBzdHJvdWRf LCBnYXVzc187CiAgcmVhbCAgZGlzdF87CgogcHVibGljOgogIGlubGluZSBvcF9MYXBsYWNlSHlw KHVpbnQgc3Ryb3VkID0gMCwgdWludCBnYXVzcyA9IDAsIHJlYWwgZGlzdCA9IDAuMCk7IAoKICB2 b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVgsIAoJCSAgICBjb25z dCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsg CiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIAoJ CSAgICAgIGNvbnN0IHNwY19MaW5lYXIzZDAwMCYgZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVh bD4mIGVtKTsgCn07IAoKaW5saW5lIG9wX0xhcGxhY2VIeXA6Om9wX0xhcGxhY2VIeXAodWludCBz dHJvdWQsIHVpbnQgZ2F1c3MsIHJlYWwgZGlzdCkgewoKICBnYXVzc18gPSBnYXVzczsgc3Ryb3Vk XyA9IHN0cm91ZDsgZGlzdF8gPSBkaXN0OyAKfQoKaW5saW5lIHZvaWQgb3BfTGFwbGFjZUh5cDo6 b3BlcmF0b3IoKShjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVgsIAogICAgICAgICAgICAgICAg ICAgICBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVsbVksIHNwY19FbGVtZW50TWF0cml4PHJlYWw+ JiBlbSkgeyAKICByZWFsIG1bOV07CiAgcXJBXyhlbG1YLCBlbG1ZLCBzdHJvdWRfLCBnYXVzc18s IGRpc3RfLCBtKTsKCiAgZW0ucmVzaXplKDMsIDMpOwogIGVtKDAsIDApID0gbVswXTsgZW0oMCwg MSkgPSBtWzFdOyBlbSgwLCAyKSA9IG1bMl07CiAgZW0oMSwgMCkgPSBtWzNdOyBlbSgxLCAxKSA9 IG1bNF07IGVtKDEsIDIpID0gbVs1XTsKICBlbSgyLCAwKSA9IG1bNl07IGVtKDIsIDEpID0gbVs3 XTsgZW0oMiwgMikgPSBtWzhdOwp9CgogCgpjbGFzcyBvcF9MYXBsYWNlIDogcHVibGljIG9wX0Jp bGluZWFyRm9ybTxyZWFsPiB7CgogcHVibGljOgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNf RWxlbWVudDxyZWFsPiYgZWxtWCwgCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BjX0VsZW1l bnQ8cmVhbD4mIGVsbVksIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7IAogIHZvaWQgb3Bl cmF0b3IoKShjb25zdCBzcGNfTGluZWFyMmQwMDAmIGVsbVgsIAogICAgICAgICAgICAgICAgICAg ICAgY29uc3Qgc3BjX0xpbmVhcjJkMDAwJiBlbG1ZLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYg ZW0pOyAKfTsgCgogCgpjbGFzcyBvcF9JZGVudGl0eSA6IHB1YmxpYyBvcF9CaWxpbmVhckZvcm08 cmVhbD4gewoKIHB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVh bD4mIGVsbVgsIAoJCSAgICBjb25zdCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtWSwgc3BjX0VsZW1l bnRNYXRyaXg8cmVhbD4mIGVtKTsgCiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNf Q29uc3RhbnQzZDAwMCYgZWxtWCwgCgkJICAgIGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1Z LCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qg c3BjX0xpbmVhcjNkMDAwJiBlbG1YLCAKCQkgICAgICBjb25zdCBzcGNfTGluZWFyM2QwMDAmIGVs bVksIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7IAogIHZvaWQgb3BlcmF0b3IoKShjb25z dCBzcGNfTGluZWFyMmQwMDAmIGVsbVgsIAoJCSAgICAgIGNvbnN0IHNwY19MaW5lYXIyZDAwMCYg ZWxtWSwgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsgCn07IAoKaW5saW5lIHZvaWQgb3Bf SWRlbnRpdHk6Om9wZXJhdG9yKCkoY29uc3Qgc3BjX0NvbnN0YW50M2QwMDAmIGVsbVgsIAoJCSAg IGNvbnN0IHNwY19Db25zdGFudDNkMDAwJiBlbG1ZLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYg ZW0pIHsgCiAgZW0ucmVzaXplKDEsIDEpOwogIGVtKDAsIDApID0gKGVsbVguc3VwcG9ydCgpLmtl eSgpICE9IGVsbVkuc3VwcG9ydCgpLmtleSgpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiBlbG1YLm4oKS5sZW5ndGgoKSAqIDAuNTsKfQoK CiMgMTkgIi4uL29wZXJhdG9yL29wT3BlcmF0b3IuaCIgMgoKIyAxICIuLi9vcGVyYXRvci9vcERl YnVnLmgiIDEKCgoKCgoKCiAKCgoKIAoKCiAKCgogCgoKCgoKIyAyMCAiLi4vb3BlcmF0b3Ivb3BP cGVyYXRvci5oIiAyCgoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3Mgb3BfTG9jYWw7CgogCgoj IDUxICIuLi9vcGVyYXRvci9vcE9wZXJhdG9yLmgiCgoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3Mg b3BfT3BlcmF0b3I7Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8 PChvc3RyZWFtJiBvcywgY29uc3Qgb3BfT3BlcmF0b3I8Rj4mIG9wKSB7CiAgcmV0dXJuIG9wLmlu Zm8ob3MpOyAKfQoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3Mgb3BfT3BlcmF0b3IgewogIGZy aWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8IDw+IChvc3RyZWFtJiBvcywgY29uc3Qgb3BfT3BlcmF0 b3I8Rj4mIG9wKTsKCiBwdWJsaWM6CiAgdmlydHVhbCB+b3BfT3BlcmF0b3IoKSB7fQoKICAgCiAg dmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZm5jX0Z1bmN0aW9uPEY+JiBmbmNZLCAKCQkJ ICBmbmNfRnVuY3Rpb248Rj4mIGZuY1gpID0gMDsKCiAgIAogIHZpcnR1YWwgb3N0cmVhbSYgaW5m byhvc3RyZWFtJiBvcykgY29uc3QgPSAwOwoKICAgCiAgdmlydHVhbCBjb25zdCBzcGNfU3BhY2U8 Rj4mIHNwYWNlWCgpIGNvbnN0ID0gMDsKCiAgIAogIHZpcnR1YWwgY29uc3Qgc3BjX1NwYWNlPEY+ JiBzcGFjZVkoKSBjb25zdCA9IDA7Cn07CgoKCiAKCiAKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNz IG9wX0NvbXBvc2UgOiBwdWJsaWMgb3BfT3BlcmF0b3I8Rj4geyAgICAgICAgICAgIAoKICBvcF9P cGVyYXRvcjxGPiYgQV87CiAgb3BfT3BlcmF0b3I8Rj4mIEJfOwogIGZuY19WZWN0b3I8Rj4gICBm XzsKCiBwdWJsaWM6CiAgaW5saW5lIG9wX0NvbXBvc2Uob3BfT3BlcmF0b3I8Rj4mIEEsIG9wX09w ZXJhdG9yPEY+JiBCKTsKCiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBmbmNfRnVuY3Rp b248Rj4mIGZuY1ksIGZuY19GdW5jdGlvbjxGPiYgZm5jWCk7CgogIGlubGluZSBvc3RyZWFtJiBp bmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKICBpbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGFj ZVgoKSBjb25zdDsKICBpbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGFjZVkoKSBjb25zdDsK fTsKCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBvcF9Db21wb3NlPEY+OjpvcF9Db21wb3NlKG9w X09wZXJhdG9yPEY+JiBBLCBvcF9PcGVyYXRvcjxGPiYgQikgCiAgOiBBXyhBKSwgQl8oQiksIGZf KEIuc3BhY2VYKCkpIHsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIHZvaWQgb3BfQ29tcG9z ZTxGPjo6b3BlcmF0b3IoKShjb25zdCBmbmNfRnVuY3Rpb248Rj4mIGZuY1ksIAoJCQkJICAgICAg Zm5jX0Z1bmN0aW9uPEY+JiBmbmNYKSB7CiAgQl8oZm5jWSwgZl8pOyBBXyhmXywgZm5jWCk7Cn0K CnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBvc3RyZWFtJiBvcF9Db21wb3NlPEY+OjppbmZvKG9z dHJlYW0mIG9zKSBjb25zdCB7IAogIHJldHVybiBvcyA8PCAib3BfQ29tcG9zZSAtLSAoQSAqIEIp IjsgCn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIG9wX0Nv bXBvc2U8Rj46OnNwYWNlWCgpIGNvbnN0IHsKICByZXR1cm4gQV8uc3BhY2VYKCk7IAp9Cgp0ZW1w bGF0ZTxjbGFzcyBGPgppbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9Db21wb3NlPEY+Ojpz cGFjZVkoKSBjb25zdCB7CiAgcmV0dXJuIEJfLnNwYWNlWSgpOyAKfQoKIAoKIAoKdGVtcGxhdGU8 Y2xhc3MgRj4KY2xhc3Mgb3BfQUkgOiBwdWJsaWMgb3BfT3BlcmF0b3I8Rj4geyAgICAgICAgCgog IG9wX09wZXJhdG9yPEY+JiBBXzsKICBGICAgICAgICAgICAgICAgYV87CiAgRiAgICAgICAgICAg ICAgIGJfOwoKIHB1YmxpYzoKICBpbmxpbmUgb3BfQUkob3BfT3BlcmF0b3I8Rj4mIEEsIHJlYWwg YSA9IDEuMCwgcmVhbCBiID0gMS4wKTsKCiAgIAoKCgoKCiAgaW5saW5lIHZvaWQgb3BlcmF0b3Io KShjb25zdCBmbmNfRnVuY3Rpb248Rj4mIGZuY1ksIGZuY19GdW5jdGlvbjxGPiYgZm5jWCk7Cgog IGlubGluZSBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKICBpbmxpbmUgY29uc3Qg c3BjX1NwYWNlPEY+JiBzcGFjZVgoKSBjb25zdDsKICBpbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+ JiBzcGFjZVkoKSBjb25zdDsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBvcF9BSTxGPjo6 b3BfQUkob3BfT3BlcmF0b3I8Rj4mIEEsIHJlYWwgYSwgcmVhbCBiKSA6IAogIEFfKEEpLCBhXyhh KSwgYl8oYikgewp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgdm9pZCBvcF9BSTxGPjo6b3Bl cmF0b3IoKShjb25zdCBmbmNfRnVuY3Rpb248Rj4mIGZuY1ksIAoJCQkJIGZuY19GdW5jdGlvbjxG PiYgZm5jWCkgewogIEFfKGZuY1ksIGZuY1gpOyBpZiAoYV8gIT0gMS4wKSBmbmNYICo9IGFfOyBp ZiAoYl8gIT0gMC4wKSBmbmNYLmFkZChmbmNZLCBiXyk7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+Cmlu bGluZSBvc3RyZWFtJiBvcF9BSTxGPjo6aW5mbyhvc3RyZWFtJiBvcykgY29uc3QgeyAKICByZXR1 cm4gb3MgPDwgIm9wX0FJIC0tIChhICogQSArIGIgKiBJKSI7IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBG PgppbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9BSTxGPjo6c3BhY2VYKCkgY29uc3Qgewog IHJldHVybiBBXy5zcGFjZVgoKTsgCn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBz cGNfU3BhY2U8Rj4mIG9wX0FJPEY+OjpzcGFjZVkoKSBjb25zdCB7CiAgcmV0dXJuIEFfLnNwYWNl WSgpOyAKfQoKIAoKIAoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3Mgb3BfTGlDbyA6IHB1YmxpYyBv cF9PcGVyYXRvcjxGPiB7ICAgICAgCgogIG9wX09wZXJhdG9yPEY+JiBBXzsKICBvcF9PcGVyYXRv cjxGPiYgQl87CiAgRiAgICAgICAgICAgICAgIGFfOwogIEYgICAgICAgICAgICAgICBiXzsKICBm bmNfVmVjdG9yPEY+ICAgZl87CgogcHVibGljOgogICAKCgoKCgoKCiAgaW5saW5lIG9wX0xpQ28o b3BfT3BlcmF0b3I8Rj4mIEEsIG9wX09wZXJhdG9yPEY+JiBCLCAKCQkgcmVhbCBhID0gMS4wLCBy ZWFsIGIgPSAxLjApOwoKICAgCgoKCgoKCiAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBm bmNfRnVuY3Rpb248Rj4mIGZuY1ksIGZuY19GdW5jdGlvbjxGPiYgZm5jWCk7CgogICAKICBpbmxp bmUgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKICBpbmxpbmUgY29uc3Qg c3BjX1NwYWNlPEY+JiBzcGFjZVgoKSBjb25zdDsKCiAgIAogIGlubGluZSBjb25zdCBzcGNfU3Bh Y2U8Rj4mIHNwYWNlWSgpIGNvbnN0OwoKICAgCiAgIAoKCgoKCgoKCgoKCgoKCgogIGJvb2wgY29s bGFwc2Uob3BfTG9jYWw8Rj4mIGRlc3QsIGNvbnN0IGRvdWJsZSBmYWN0ID0gMS4wKSBjb25zdDsK fTsKCnRlbXBsYXRlPGNsYXNzIEY+Cm9wX0xpQ288Rj46Om9wX0xpQ28ob3BfT3BlcmF0b3I8Rj4m IEEsIG9wX09wZXJhdG9yPEY+JiBCLCByZWFsIGEsIHJlYWwgYikgCiAgOiBBXyhBKSwgQl8oQiks IGFfKGEpLCBiXyhiKSwgZl8oQS5zcGFjZVgoKSkgewp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxp bmUgdm9pZCBvcF9MaUNvPEY+OjpvcGVyYXRvcigpKGNvbnN0IGZuY19GdW5jdGlvbjxGPiYgZm5j WSwgCgkJCQkgICBmbmNfRnVuY3Rpb248Rj4mIGZuY1gpIHsKICBBXyhmbmNZLCBmbmNYKTsgZm5j WCAqPSBhXzsgQl8oZm5jWSwgZl8pOyBmbmNYLmFkZChmXywgYl8pOyAKfQoKdGVtcGxhdGU8Y2xh c3MgRj4KaW5saW5lIG9zdHJlYW0mIG9wX0xpQ288Rj46OmluZm8ob3N0cmVhbSYgb3MpIGNvbnN0 IHsgCiAgcmV0dXJuIG9zIDw8ICJvcF9MaUNvIC0tIChhICogQSArIGIgKiBCKSI7IAp9Cgp0ZW1w bGF0ZTxjbGFzcyBGPgppbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9MaUNvPEY+OjpzcGFj ZVgoKSBjb25zdCB7CiAgcmV0dXJuIEFfLnNwYWNlWCgpOyAKfQoKdGVtcGxhdGU8Y2xhc3MgRj4K aW5saW5lIGNvbnN0IHNwY19TcGFjZTxGPiYgb3BfTGlDbzxGPjo6c3BhY2VZKCkgY29uc3Qgewog IHJldHVybiBBXy5zcGFjZVkoKTsgCn0KCnRlbXBsYXRlPGNsYXNzIEY+ICAKYm9vbCBvcF9MaUNv PEY+Ojpjb2xsYXBzZShvcF9Mb2NhbDxGPiYgZGVzdCwgY29uc3QgZG91YmxlIGZhY3QpIGNvbnN0 IHsKCiAgYm9vbCByZXN1bHQgPSB0cnVlOwoKICBpZiggMCAgIT0wKSBjb3V0IDw8ICAgJ1snIDw8 ICAiLi4vb3BlcmF0b3Ivb3BPcGVyYXRvci5oIiA8PCAiLCBsaW5lICIgPDwgMjgxIAogICAgICA8 PCAiIF0gb3BfTGlDbzo6Y29sbGFwc2UgLS0gQSBpcyIgIDw8ICIgIiA8PCAgIHR5cGVpZChBXyku bmFtZSgpICA8PCBlbmRsOyA7CgogIG9wX0xvY2FsPEY+KiBBID0gZHluYW1pY19jYXN0PG9wX0xv Y2FsPEY+Kj4oJkFfKTsKICBpZiAoQSkKICAgIEEtPmFkZEludG8oZGVzdCwgYV8qZmFjdCk7CiAg ZWxzZSB7CiAgICBvcF9MaUNvPEY+KkFBID0gZHluYW1pY19jYXN0PG9wX0xpQ288Rj4qPigmQV8p OwogICAgaWYgKEFBKQogICAgICByZXN1bHQgJj0gQUEtPmNvbGxhcHNlKGRlc3QsIGFfKmZhY3Qp OwogICAgZWxzZQogICAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoIXJlc3VsdCkKICAgIHJl dHVybiByZXN1bHQ7CgogIGlmKCAwICAhPTApIGNvdXQgPDwgICAnWycgPDwgICIuLi9vcGVyYXRv ci9vcE9wZXJhdG9yLmgiIDw8ICIsIGxpbmUgIiA8PCAyOTggCiAgICAgIDw8ICIgXSBvcF9MaUNv Ojpjb2xsYXBzZSAtLSBCIGlzIiAgPDwgIiAiIDw8ICAgdHlwZWlkKEJfKS5uYW1lKCkgIDw8IGVu ZGw7IDsKCiAgb3BfTG9jYWw8Rj4qIEIgPSBkeW5hbWljX2Nhc3Q8b3BfTG9jYWw8Rj4qPigmQl8p OwogIGlmIChCKQogICAgQi0+YWRkSW50byhkZXN0LCBiXypmYWN0KTsKICBlbHNlIHsKICAgIG9w X0xpQ288Rj4qQkIgPSBkeW5hbWljX2Nhc3Q8b3BfTGlDbzxGPio+KCZCXyk7CiAgICBpZiAoQkIp CiAgICAgIHJlc3VsdCAmPSBCQi0+Y29sbGFwc2UoZGVzdCwgYl8qZmFjdCk7CiAgICBlbHNlCiAg ICAgIHJldHVybiBmYWxzZTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KCiAKCiAKCnRlbXBsYXRl PGNsYXNzIEY+CmNsYXNzIG9wX01hdHJpeCA6IHB1YmxpYyBvcF9PcGVyYXRvcjxGPiB7CgogICAK ICBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwY1hfOwoKICAgCiAgdWludCAgICAgICAgICAgICAgICBu WF87CgogICAKICBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwY1lfOwoKICAgCiAgdWludCAgICAgICAg ICAgICAgICBuWV87CgogICAKICBGKiBtXzsKCiAgb3BfTWF0cml4KGNvbnN0IG9wX01hdHJpeCYp OwogIHZvaWQgb3BlcmF0b3I9KGNvbnN0IG9wX01hdHJpeCYpOwoKIHB1YmxpYzoKICAgCgoKCgoK CgoKICBvcF9NYXRyaXgoY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGNYLCBjb25zdCBzcGNfU3BhY2U8 Rj4mIHNwY1ksIAoJICAgIG9wX0JpbGluZWFyRm9ybTxGPiYgYmYpOwogIG9wX01hdHJpeChjb25z dCBzcGNfU3BhY2U8Rj4mIHNwYywgb3BfQmlsaW5lYXJGb3JtPEY+JiBiZik7CiAgb3BfTWF0cml4 KGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjWCwgY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGNZLCBjaGFy KiBmbmFtZSk7CgogIH5vcF9NYXRyaXgoKTsKCiAgIAoKCgogIHZvaWQgb3BlcmF0b3IoKShjb25z dCBmbmNfRnVuY3Rpb248Rj4mIGZuY1ksIGZuY19GdW5jdGlvbjxGPiYgZm5jWCk7CiAgdm9pZCBv cGVyYXRvcigpKGNvbnN0IGZuY19WZWN0b3I8Rj4mIGZuY1ksIGZuY19WZWN0b3I8Rj4mIGZuY1gp OwoKICAgCgoKCiAgRiYgb3BlcmF0b3IoKShjb25zdCB1aW50IGksIGNvbnN0IHVpbnQgaikgY29u c3QgewogICAgcmV0dXJuIG1fW2kqbllfK2pdOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgRiooKSBj b25zdDsKCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKICBpbmxpbmUg dWludCBuWCgpIGNvbnN0OwoKICAgCiAgaW5saW5lIHVpbnQgblkoKSBjb25zdDsKCiAgIAogIGlu bGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYWNlWCgpIGNvbnN0OwoKICAgCiAgaW5saW5lIGNv bnN0IHNwY19TcGFjZTxGPiYgc3BhY2VZKCkgY29uc3Q7CgogICAKCgogIHZvaWQgd3JpdGUoY2hh ciogZm5hbWUpIGNvbnN0Owp9OwoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5saW5lIG9wX01hdHJpeDxG Pjo6fm9wX01hdHJpeCgpIHsKICBkZWxldGVbXSBtXzsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaW5s aW5lIG9wX01hdHJpeDxGPjo6b3BlcmF0b3IgRiooKSBjb25zdCB7CiAgcmV0dXJuIG1fOwp9CiAg ICAgIAp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgdWludCBvcF9NYXRyaXg8Rj46Om5YKCkgY29u c3QgewogIHJldHVybiBuWF87Cn0KICAgICAgCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSB1aW50 IG9wX01hdHJpeDxGPjo6blkoKSBjb25zdCB7CiAgcmV0dXJuIG5ZXzsKfQogICAgICAKdGVtcGxh dGU8Y2xhc3MgRj4KaW5saW5lIGNvbnN0IHNwY19TcGFjZTxGPiYgb3BfTWF0cml4PEY+OjpzcGFj ZVgoKSBjb25zdCB7CiAgcmV0dXJuIHNwY1hfOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUg Y29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9NYXRyaXg8Rj46OnNwYWNlWSgpIGNvbnN0IHsKICByZXR1 cm4gc3BjWV87Cn0KCiAKCiAKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIG9wX0xvY2FsIDogcHVi bGljIG9wX09wZXJhdG9yPEY+IHsKCiAgIAogIGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjWF87Cgog ICAKICB1aW50ICAgICAgICAgICAgICAgIG5YXzsKCiAgIAogIGNvbnN0IHNwY19TcGFjZTxGPiYg c3BjWV87CgogICAKICB1aW50ICAgICAgICAgICAgICAgIG5ZXzsKCiAgIAogIFNwYXJzZU1hdHJp eCBtXzsKCiAgb3BfTG9jYWwoY29uc3Qgb3BfTG9jYWwmKTsKICB2b2lkIG9wZXJhdG9yPShjb25z dCBvcF9Mb2NhbCYpOwoKcHVibGljOgogICAKCiAgb3BfTG9jYWwoY29uc3Qgc3BjX1NwYWNlPEY+ JiBzcGNYLCBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwY1kpIDoKICAgIHNwY1hfKHNwY1gpLCBuWF8o c3BjWC5kaW0oKSksIHNwY1lfKHNwY1kpLCBuWV8oc3BjWS5kaW0oKSksIAogICAgbV8oc3BjWC5k aW0oKSwgc3BjWS5kaW0oKSwgMikge30KCiAgIAoKCiAgb3BfTG9jYWwoY29uc3Qgc3BjX1NwYWNl PEY+JiBzcGNYLCBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwY1ksIAoJICAgb3BfQmlsaW5lYXJGb3Jt PEY+JiBiZik7CgogICAKCgogIG9wX0xvY2FsKGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjLCBvcF9C aWxpbmVhckZvcm08Rj4mIGJmKTsKCiAgIAoKCgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZm5j X0Z1bmN0aW9uPEY+JiBmbmNZLCBmbmNfRnVuY3Rpb248Rj4mIGZuY1gpOwoKICAgCgoKCgogIHZv aWQgb3BlcmF0b3IoKShjb25zdCBmbmNfVmVjdG9yPEY+JiBmbmNZLCBmbmNfVmVjdG9yPEY+JiBm bmNYKTsKICAKICAgCiAgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKICBp bmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGFjZVgoKSBjb25zdDsKCiAgIAogIGlubGluZSBj b25zdCBzcGNfU3BhY2U8Rj4mIHNwYWNlWSgpIGNvbnN0OwoKICAgCgoKCiAgdm9pZCB3cml0ZShj aGFyKiBmbmFtZSkgY29uc3Q7CgogICAKICBpbmxpbmUgU3BhcnNlTWF0cml4KiBtKCkge3JldHVy biAmbV87fTsgIAoKICAgCiAgIAoKCgoKICB2b2lkIGFkZEludG8ob3BfTG9jYWw8Rj4mIGRlc3Qs IGNvbnN0IGRvdWJsZSBmYWN0KSBjb25zdDsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSB2 b2lkIG9wX0xvY2FsPEY+OjpvcGVyYXRvcigpKGNvbnN0IGZuY19WZWN0b3I8Rj4mIGZuY1ksIAoJ CQkJICAgIGZuY19WZWN0b3I8Rj4mIGZuY1gpIHsKICBtXyhmbmNZLCBmbmNYKTsgCn0KICAgICAg CnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIG9wX0xvY2FsPEY+ OjpzcGFjZVgoKSBjb25zdCB7CiAgcmV0dXJuIHNwY1hfOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgpp bmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9Mb2NhbDxGPjo6c3BhY2VZKCkgY29uc3Qgewog IHJldHVybiBzcGNZXzsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4gIAp2b2lkIG9wX0xvY2FsPEY+Ojph ZGRJbnRvKG9wX0xvY2FsPEY+JiBkZXN0LCBjb25zdCBkb3VibGUgZmFjdCkgY29uc3QgewoKICBp ZiggMCAgIT0wKSBjb3V0IDw8ICAgJ1snIDw8ICAiLi4vb3BlcmF0b3Ivb3BPcGVyYXRvci5oIiA8 PCAiLCBsaW5lICIgPDwgNTI2IAogICAgICA8PCAiIF0gb3BfTG9jYWw6OmFkZEludG8gLS0gZmFj dCA9IiAgPDwgIiAiIDw8ICAgZmFjdCAgPDwgZW5kbDsgOwoKICBpZiAoZmFjdCAhPSAwLjApIHsK ICAgIGludCBoYXNoQml0cyA9IG1fLkhhc2hCaXRzKCk7CiAgICBpbnQgcCA9IDEgPDwgaGFzaEJp dHM7CiAgICB1aW50IG4gPSBzcGFjZVgoKS5kaW0oKTsKICAgIFNwYXJzZU1hdHJpeDo6VmFsdWUq KiBtYXRyaXggPSBtXy5NYXRyaXgoKTsKCiAgICBmb3IgKHVpbnQgciA9IDA7IHIgPCBuOyArK3Ip IHsKICAgICAgZm9yIChpbnQgY19tb2QgPSAwOyBjX21vZCA8IHA7ICsrY19tb2QpIHsKCWZvciAo U3BhcnNlTWF0cml4OjpWYWx1ZSogdiA9IG1hdHJpeFsocjw8aGFzaEJpdHMpICsgY19tb2RdOyAK CSAgICAgdiAhPSBfX251bGwgOyB2ID0gdi0+bG5rKSB7CgkgIGlmICh2LT52YWwgIT0gMC4wKSB7 CgkgICAgKCpkZXN0Lm0oKSkociwgdi0+aWR4KSArPSAodi0+dmFsKmZhY3QpOwoJICB9Cgl9CiAg ICAgIH0KICAgIH0KICB9Cn0KCiAKCmNsYXNzIG9wX1MwMSA6IHB1YmxpYyBvcF9NYXRyaXg8cmVh bD4gewoKIHB1YmxpYzoKICBvcF9TMDEoY29uc3Qgc3BjX1NwYWNlPHJlYWw+JiBzcGNYLCBjb25z dCBzcGNfU3BhY2U8cmVhbD4mIHNwY1ksIAoJIG9wX0JpbGluZWFyRm9ybTxyZWFsPiYgYmYpOwog IG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0Owp9OwoKIAoKIyAxICIuLi9vcGVyYXRv ci9vcE9wZXJhdG9yLnQiIDEKIAoKCgoKCgogICNwcmFnbWEgaW1wbGVtZW50YXRpb24KCgoKCgoK CgogCgp0ZW1wbGF0ZTxjbGFzcyBGPgpvcF9NYXRyaXg8Rj46Om9wX01hdHJpeChjb25zdCBzcGNf U3BhY2U8Rj4mIHNwY1gsIGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjWSwgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvcF9CaWxpbmVhckZvcm08Rj4mIGJmKSA6IHNwY1hfKHNwY1gpLCBzcGNZ XyhzcGNZKSB7CgogIG5YXyA9IHNwY1guZGltKCk7CiAgbllfID0gc3BjWS5kaW0oKTsKIAkJCQkJ CSAKICBtXyA9IG5ldyByZWFsW25YXyAqIG5ZX107CiAgbWVtc2V0KG1fLCAwLCBzaXplb2YobV9b MF0pICogblhfICogbllfKTsKCQkJCQkJIAogIHNwY19FbGVtZW50TWF0cml4PEY+IEEoMywgMyk7 CQogIHNwY19FbGVtZW50TWF0cml4PEY+IEIoMywgMyk7CQoKICBzcGNfU3BhY2U8Rj46OnNwY19T Y2FuKiBzY1ggPSBzcGNYLnNjYW4oKTsKICB3aGlsZSAoKnNjWCkgewogICAgc3BjX0VsZW1lbnQ8 Rj4mIGVsbVggPSAoKnNjWCkrKzsKICAgIGNvbnN0IHNwY19UPEY+JiBUWCA9IGVsbVguVCgpOwog IAogICAgc3BjX1NwYWNlPEY+OjpzcGNfU2Nhbiogc2NZID0gc3BjWS5zY2FuKCk7CiAgICB3aGls ZSAoKnNjWSkgewogICAgICBzcGNfRWxlbWVudDxGPiYgZWxtWSA9ICgqc2NZKSsrOwogICAgICBj b25zdCBzcGNfVDxGPiYgVFkgPSBlbG1ZLlQoKTsKCiAgICAgIGJmKGVsbVgsIGVsbVksIEEpOwog ICAgICBUWShBLCBCKTsgQi50cmFuc3Bvc2UoKTsgVFgoQiwgQSk7IEEudHJhbnNwb3NlKCk7Cgog ICAgICAgCiAKIAogCiAKIAoKICAgICAgIAogICAgICAgIGZvcih1aW50IGkgPSBUWS5tKCk7IGkt LTspIHsKICAgICAgICAgIEYqIG0gPSBtXyArICBuWF8gKiBUWS5pbmRleChpKTsJCiAgICAgICAg ICBmb3IodWludCBqID0gVFgubSgpOyBqLS07KSAKICAgICAgICAgICAgbVtUWC5pbmRleChqKV0g Kz0gQShqLCBpKTsKICAgICAgICB9CQogICAgfQogICAgZGVsZXRlIHNjWTsJCiAgfQogIGRlbGV0 ZSBzY1g7CSAKfQoKdGVtcGxhdGU8Y2xhc3MgRj4Kb3BfTWF0cml4PEY+OjpvcF9NYXRyaXgoY29u c3Qgc3BjX1NwYWNlPEY+JiBzcGMsIG9wX0JpbGluZWFyRm9ybTxGPiYgYmYpIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNwY1hfKHNwYyks IHNwY1lfKHNwYykgewogIG5YXyA9IG5ZXyA9IHNwYy5kaW0oKTsKIAkJCQkJCSAKICBtXyA9IG5l dyByZWFsW25YXyAqIG5ZX107CiAgbWVtc2V0KG1fLCAwLCBzaXplb2YobV9bMF0pICogblhfICog bllfKTsKCQkJCQkJIAogIHNwY19FbGVtZW50TWF0cml4PEY+IEEoMywgMyk7CQogIHNwY19FbGVt ZW50TWF0cml4PEY+IEIoMywgMyk7CQoKICBzcGNfU3BhY2U8Rj46OnNwY19TY2FuKiBzY1ggPSBz cGMuc2NhbigpOwogIHdoaWxlICgqc2NYKSB7CiAgICBzcGNfRWxlbWVudDxGPiYgZWxtWCA9ICgq c2NYKSsrOwogICAgY29uc3Qgc3BjX1Q8Rj4mIFRYID0gZWxtWC5UKCk7CiAgCiAgICBiZihlbG1Y LCBlbG1YLCBBKTsKICAgIFRYKEEsIEIpOyBCLnRyYW5zcG9zZSgpOyBUWChCLCBBKTsgQS50cmFu c3Bvc2UoKTsKCiAgICBmb3IodWludCBpID0gVFgubSgpOyBpLS07KSB7CiAgICAgIEYqIG0gPSBt XyArICBuWV8gKiBUWC5pbmRleChpKTsJCiAgICAgIGZvcih1aW50IGogPSBUWC5tKCk7IGotLTsp IAoJbVtUWC5pbmRleChqKV0gKz0gQShpLCBqKTsKICAgIH0JCgogICAgc3BjX1NwYWNlPEY+Ojpz cGNfU2Nhbiogc2NZID0gc2NYLT5jbG9uZSgpOwogICAgd2hpbGUgKCpzY1kpIHsKICAgICAgc3Bj X0VsZW1lbnQ8Rj4mIGVsbVkgPSAoKnNjWSkrKzsKICAgICAgY29uc3Qgc3BjX1Q8Rj4mIFRZID0g ZWxtWS5UKCk7CgogICAgICBiZihlbG1YLCBlbG1ZLCBBKTsKICAgICAgVFkoQSwgQik7IEIudHJh bnNwb3NlKCk7IFRYKEIsIEEpOyBBLnRyYW5zcG9zZSgpOwoKICAgICAgZm9yKHVpbnQgaSA9IFRY Lm0oKTsgaS0tOykgewogICAgICAgIEYqIG0gPSBtXyArICBuWV8gKiBUWC5pbmRleChpKTsJCiAg ICAgICAgZm9yKHVpbnQgaiA9IFRZLm0oKTsgai0tOykgCiAgICAgICAgICBtW1RZLmluZGV4KGop XSArPSBBKGksIGopOwogICAgICB9CQogICAgICAKICAgICAgYmYoZWxtWSwgZWxtWCwgQSk7CiAg ICAgIFRYKEEsIEIpOyBCLnRyYW5zcG9zZSgpOyBUWShCLCBBKTsgQS50cmFuc3Bvc2UoKTsKCgoK CgoKCgogICAgICBmb3IodWludCBpID0gVFkubSgpOyBpLS07KSB7CiAgICAgICAgRiogbSA9IG1f ICsgIG5ZXyAqIFRZLmluZGV4KGkpOwkKICAgICAgICBmb3IodWludCBqID0gVFgubSgpOyBqLS07 KSAKICAgICAgICAgIG1bVFguaW5kZXgoaildICs9IEEoaSwgaik7CiAgICAgIH0JCgogICAgfQog ICAgZGVsZXRlIHNjWTsKICB9CiAgZGVsZXRlIHNjWDsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4Kb3Bf TWF0cml4PEY+OjpvcF9NYXRyaXgoY29uc3Qgc3BjX1NwYWNlPEY+JiBzcGNYLCBjb25zdCBzcGNf U3BhY2U8Rj4mIHNwY1ksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj aGFyKiBmbmFtZSkgOiBzcGNYXyhzcGNYKSwgc3BjWV8oc3BjWSkgewoKICBuWF8gPSBzcGNYLmRp bSgpOwogIG5ZXyA9IHNwY1kuZGltKCk7CiAJCQkJCQkgCiAgbV8gPSBuZXcgcmVhbFtuWF8gKiBu WV9dOwogIG1lbXNldChtXywgMCwgc2l6ZW9mKG1fWzBdKSAqIG5YXyAqIG5ZXyk7CgogIGlmc3Ry ZWFtICBpZnMoZm5hbWUpOwogIHVpbnQgICAgICBmb287CgogIGlmcy5yZWFkKChjaGFyKikgJmZv bywgc2l6ZW9mKGZvbykpOwogIGlmIChmb28gPT0gblhfKSB7CiAgICBpZnMucmVhZCgoY2hhciop ICZmb28sIHNpemVvZihmb28pKTsKICAgIGlmIChmb28gPT0gbllfKSB7CiAgICAgIGlmcy5yZWFk KChjaGFyKikgbV8sIG5YXyAqIG5ZXyAqIHNpemVvZihtX1swXSkpOwogICAgfQogIH0KfSAKCnRl bXBsYXRlPGNsYXNzIEY+CnZvaWQgb3BfTWF0cml4PEY+OjpvcGVyYXRvcigpKGNvbnN0IGZuY19G dW5jdGlvbjxGPiYgZm5jWSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZm5jX0Z1bmN0aW9uPEY+JiBmbmNYKSB7CiAgY29uc3QgZm5jX1Zl Y3RvcjxGPiogZm5jWUE7CiAgaWYgKChmbmNZQSA9IGR5bmFtaWNfY2FzdDxjb25zdCBmbmNfVmVj dG9yPEY+Kj4oJmZuY1kpKSkgewogICAgZm5jX1ZlY3RvcjxGPiogZm5jWEE7CiAgICBpZiAoKGZu Y1hBID0gZHluYW1pY19jYXN0PGZuY19WZWN0b3I8Rj4qPigmZm5jWCkpKSB7CiAgICAgICgqdGhp cykoKmZuY1lBLCAqZm5jWEEpOyByZXR1cm47CiAgICB9CiAgfQoKICBjb25zdCByZWFsKiBtID0g bV87CiAgZm9yIChzcGNfQkZuY0luZGV4IGkgPSAwOyBpIDwgblhfOyArK2kpIHsKICAgIHJlYWwg ZmkgPSAwLjA7CiAgICBmb3IgKHNwY19CRm5jSW5kZXggaiA9IDA7IGogPCBuWV87ICsraikgZmkg Kz0gKm0rKyAqIGZuY1koaik7CiAgICBmbmNYKGkpID0gZmk7CiAgfQp9Cgp0ZW1wbGF0ZTxjbGFz cyBGPgp2b2lkIG9wX01hdHJpeDxGPjo6b3BlcmF0b3IoKShjb25zdCBmbmNfVmVjdG9yPEY+JiBm bmNZLCBmbmNfVmVjdG9yPEY+JiBmbmNYKSB7CgogIEYqIG0obV8pOwogIEYqIHgoZm5jWCk7CQoJ CiAgZm9yIChzcGNfQkZuY0luZGV4IGkgPSAwOyBpIDwgblhfOyArK2kpIHsKICAgIEYqIHkoZm5j WSk7CQogICAgRiAgZmkgPSAwLjA7CiAgICBmb3IgKHNwY19CRm5jSW5kZXggaiA9IDA7IGogPCBu WV87ICsraikgZmkgKz0gKm0rKyAqICp5Kys7CiAgICAqeCsrID0gZmk7CiAgfQp9CiAgICAgIAp0 ZW1wbGF0ZTxjbGFzcyBGPgpvc3RyZWFtJiBvcF9NYXRyaXg8Rj46OmluZm8ob3N0cmVhbSYgb3Mp IGNvbnN0IHsKCiAgRiogbSA9IG1fOyAKCiAgZm9yIChzcGNfQkZuY0luZGV4IGkgPSAwOyBpIDwg blhfOyBpKyspIHsKICAgIG9zIDw8IChpID8gIiAgIiA6ICJvcF9NYXRyaXgoXG4gICIpOwogICAg Zm9yIChzcGNfQkZuY0luZGV4IGogPSAwOyBqIDwgbllfOyBqKyspIG9zIDw8ICptKysgPDwgJyAn OwogICAgb3MgPDwgJ1xuJzsKICB9CgogIHJldHVybiBvcyA8PCAnKSc7Cn0KCnRlbXBsYXRlPGNs YXNzIEY+CnZvaWQgb3BfTWF0cml4PEY+Ojp3cml0ZShjaGFyKiBmbmFtZSkgY29uc3QgewoKICBv ZnN0cmVhbSAgb2ZzKGZuYW1lKTsKICAKICBvZnMud3JpdGUoKGNvbnN0IGNoYXIqKSAmblhfLCBz aXplb2YoblhfKSk7CiAgb2ZzLndyaXRlKChjb25zdCBjaGFyKikgJm5ZXywgc2l6ZW9mKG5ZXykp OwoKICBvZnMud3JpdGUoKGNvbnN0IGNoYXIqKSBtXywgblhfICogbllfICogc2l6ZW9mKG1fWzBd KSk7Cn0KCiAKCiAKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCnRlbXBs YXRlPGNsYXNzIEY+Cm9wX0xvY2FsPEY+OjpvcF9Mb2NhbChjb25zdCBzcGNfU3BhY2U8Rj4mIHNw Y1gsIGNvbnN0IHNwY19TcGFjZTxGPiYgc3BjWSwKCQkgICAgICBvcF9CaWxpbmVhckZvcm08Rj4m IGJmKSA6IAogIHNwY1hfKHNwY1gpLCBzcGNZXyhzcGNZKSwgCiAgbV8oc3BjWC5kaW0oKSwgc3Bj WS5kaW0oKSwgMikgewogIG5YXyA9IHNwY1guZGltKCk7CiAgbllfID0gc3BjWS5kaW0oKTsKIAkJ CQkJCSAKICBzcGNfRWxlbWVudE1hdHJpeDxGPiBBKDMsIDMpOwkKICBzcGNfRWxlbWVudE1hdHJp eDxGPiBCKDMsIDMpOwkKCiAgc3BjX1NwYWNlPEY+OjpzcGNfU2Nhbiogc2NYID0gc3BjWC5zY2Fu KCk7CiAgd2hpbGUgKCpzY1gpIHsKICAgIHNwY19FbGVtZW50PEY+JiBlbG1YID0gKCpzY1gpKys7 CiAgICBjb25zdCBzcGNfVDxGPiYgVFggPSBlbG1YLlQoKTsKICAKICAgIHNwY19TcGFjZTxGPjo6 c3BjX1NjYW4qIHNjWSA9IHNwY1kuc2NhbigpOwogICAgd2hpbGUgKCpzY1kpIHsKICAgICAgc3Bj X0VsZW1lbnQ8Rj4mIGVsbVkgPSAoKnNjWSkrKzsKCiAgICAgIGNvbnN0IHNwY19UPEY+JiBUWSA9 IGVsbVkuVCgpOwoKICAgICAgYmYoZWxtWCwgZWxtWSwgQSk7CiAgICAgIFRZKEEsIEIpOyBCLnRy YW5zcG9zZSgpOyBUWChCLCBBKTsgQS50cmFuc3Bvc2UoKTsKCiAgICAgIGZvcih1aW50IGkgPSBU WS5tKCk7IGktLTspIHsKCWZvcih1aW50IGogPSBUWC5tKCk7IGotLTspIHsKCSAgcmVhbCBhID0g QShqLGkpOwoJICBpZiAoYSAhPSAwLjApIHsKCSAgICBtXyhUWS5pbmRleChpKSwgVFguaW5kZXgo aikpICs9IGE7CgkgIH0gIAoJfSAgCiAgICAgIH0gIAogICAgfSAgCiAgICBkZWxldGUgc2NZOwog IH0gIAogIGRlbGV0ZSBzY1g7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+Cm9wX0xvY2FsPEY+OjpvcF9M b2NhbChjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYywgb3BfQmlsaW5lYXJGb3JtPEY+JiBiZikgCiAg ICAgICAgICAgICAgICAgICAgICAgICA6IHNwY1hfKHNwYyksIHNwY1lfKHNwYyksIG1fKHNwYy5k aW0oKSwgc3BjLmRpbSgpLCAyKSB7CgogIG5ZXyA9IG5YXyA9IHNwYy5kaW0oKTsKCiAgc3BjX0Vs ZW1lbnRNYXRyaXg8Rj4gQSgzLCAzKTsJCiAgc3BjX0VsZW1lbnRNYXRyaXg8Rj4gQigzLCAzKTsJ CgogIHNwY19TcGFjZTxGPjo6c3BjX1NjYW4qIHNjID0gc3BjLnNjYW4oKTsKICB3aGlsZSAoKnNj KSB7CiAgICBzcGNfRWxlbWVudDxGPiYgZWxtID0gKCpzYykrKzsKICAgIGNvbnN0IHNwY19UPEY+ JiBUID0gZWxtLlQoKTsKCiAgICBiZihlbG0sIGVsbSwgQSk7CiAgICBUKEEsIEIpOyBCLnRyYW5z cG9zZSgpOyBUKEIsIEEpOyBBLnRyYW5zcG9zZSgpOwoKICAgIGZvcih1aW50IGkgPSBULm0oKTsg aS0tOykgCiAgICAgIGZvcih1aW50IGogPSBULm0oKTsgai0tOykgCgltXyhULmluZGV4KGkpLCBU LmluZGV4KGopKSArPSBBKGksIGopOwogIH0JCiAgZGVsZXRlIHNjOwp9Cgp0ZW1wbGF0ZTxjbGFz cyBGPgp2b2lkIG9wX0xvY2FsPEY+OjpvcGVyYXRvcigpKGNvbnN0IGZuY19GdW5jdGlvbjxGPiYg Zm5jWSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBmbmNfRnVuY3Rpb248Rj4mIGZuY1gpIHsKICBjb25zdCBmbmNfVmVjdG9yPEY+KiBmbmNZQTsK ICBpZiAoKGZuY1lBID0gZHluYW1pY19jYXN0PGNvbnN0IGZuY19WZWN0b3I8Rj4qPigmZm5jWSkp KSB7CiAgICBmbmNfVmVjdG9yPEY+KiBmbmNYQTsKICAgIGlmICgoZm5jWEEgPSBkeW5hbWljX2Nh c3Q8Zm5jX1ZlY3RvcjxGPio+KCZmbmNYKSkpIHsKICAgICAgKCp0aGlzKSgqZm5jWUEsICpmbmNY QSk7IHJldHVybjsgCiAgICB9CiAgfQoKICBjZXJyIDw8ICdbJyA8PCAgIi4uL29wZXJhdG9yL29w T3BlcmF0b3IudCIgPDwgIiwgbGluZSAiIDw8IDMyMDsKICBjZXJyIDw8ICJdIG9wX0xvY2FsOjpv cGVyYXRvcigpIDogdW5rbm93biB0eXBlIG9mIGZ1bmN0aW9uXG4iOwogIGV4aXQoMSk7Cn0KCnRl bXBsYXRlPGNsYXNzIEY+Cm9zdHJlYW0mIG9wX0xvY2FsPEY+OjppbmZvKG9zdHJlYW0mIG9zKSBj b25zdCB7CgogIHJldHVybiBvcyA8PCAib3BfTG9jYWwoICIgPDwgbV8gPDwgIikiOwp9Cgp0ZW1w bGF0ZTxjbGFzcyBGPgp2b2lkIG9wX0xvY2FsPEY+Ojp3cml0ZShjaGFyKiBmbmFtZSkgY29uc3Qg ewoKICBvZnN0cmVhbSBvZnMoZm5hbWUpOwogIG1fLndyaXRlKG9mcyk7Cn0KCgoKCgoKIyA1NTkg Ii4uL29wZXJhdG9yL29wT3BlcmF0b3IuaCIgMgoKCgojIDE0ICJsaW5lbC5jYyIgMgoKIyAxICJs aW5lbFNwYWNlLmgiIDEKIAoKCgoKCgojIDEgIi4uL2hwL2hwRWxlbWVudHMuaCIgMQogCgoKCgoK CgoKCgoKCgoKIyAxICIuLi9ocC9ocEVsZW1lbnQuaCIgMQogCgoKCgoKCgoKCgogCgp0eXBlZGVm IHZvaWQgKCpocF9TTWFwKShjb25zdCBzcGNfVENvbHVtbjxyZWFsPiYsIHNwY19UQ29sdW1uPHJl YWw+JiwgdWludCk7CgogCgogCgoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIGhwX0hQMmRYWFgg OiBwdWJsaWMgc3BjX0VsZW1lbnQ8Rj4gewoKIHB1YmxpYzoKICAgCgoKCiAgaW5saW5lIGhwX0hQ MmRYWFgodWludCBwKTsKCiAgIAogIGlubGluZSB1c2hvcnQgcCgpIGNvbnN0OwoKICAgCgoKICB2 aXJ0dWFsIGNvbnN0IGdlb19Db25uZWN0b3IyJiBzdXBwb3J0KCkgY29uc3QgPSAwOwoKIHByaXZh dGU6CiAgIAogIHVzaG9ydCBwXzsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBocF9IUDJk WFhYPEY+OjpocF9IUDJkWFhYKHVpbnQgcCkgewogIHBfID0gcDsKfQoKdGVtcGxhdGU8Y2xhc3Mg Rj4KaW5saW5lIHVzaG9ydCBocF9IUDJkWFhYPEY+OjpwKCkgY29uc3QgewogIHJldHVybiBwXzsK fQoKCiMgMTYgIi4uL2hwL2hwRWxlbWVudHMuaCIgMgoKIyAxICIuLi9ocC9ocEhQMmQwMDAuaCIg MQogCgoKCgoKCgoKIAoKIAoKCgoKCgoKY2xhc3MgaHBfSFAyZDAwMCA6IHB1YmxpYyBocF9IUDJk WFhYPHJlYWw+IHsKCnB1YmxpYzoKICBzdGF0aWMgdm9pZCBTMChjb25zdCBzcGNfVENvbHVtbjxy ZWFsPiYgc3JjLCBzcGNfVENvbHVtbjxyZWFsPiYgZHN0LCB1aW50IHApOwogIHN0YXRpYyB2b2lk IFMxKGNvbnN0IHNwY19UQ29sdW1uPHJlYWw+JiBzcmMsIHNwY19UQ29sdW1uPHJlYWw+JiBkc3Qs IHVpbnQgcCk7CiAgc3RhdGljIHZvaWQgUzIoY29uc3Qgc3BjX1RDb2x1bW48cmVhbD4mIHNyYywg c3BjX1RDb2x1bW48cmVhbD4mIGRzdCwgdWludCBwKTsKICBzdGF0aWMgdm9pZCBTMyhjb25zdCBz cGNfVENvbHVtbjxyZWFsPiYgc3JjLCBzcGNfVENvbHVtbjxyZWFsPiYgZHN0LCB1aW50IHApOwog IHN0YXRpYyBpbmxpbmUgaHBfU01hcCBTKHVpbnQgaSk7ICAKCiAgIAoKCgoKCgogIGlubGluZSBo cF9IUDJkMDAwKGNvbnN0IGdlb19UcmlhbmdsZTJkJiBjZWxsLCB1aW50IHAsIHNwY19UQ29sdW1u PHJlYWw+KiBUMCwKCQkgICAgc3BjX1RDb2x1bW48cmVhbD4qIFQxKTsKCiAgIAogIG9zdHJlYW0m IGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAgCgogIGlubGluZSBjb25zdCBnZW9fVHJpYW5n bGUmIHN1cHBvcnQoKSBjb25zdDsKCiAgIAogIGlubGluZSBjb25zdCBzcGNfVDxyZWFsPiYgVCgp IGNvbnN0OwoKICAgCgoKCgoKCgogIHZvaWQgZXZhbHVhdGUocmVhbCB4aSwgcmVhbCBldGEsIHJl YWwgc2hwZm5jW10pIGNvbnN0OwoKICAgCgoKCiAgUmVhbDJkIHZlcnRleCh1aW50IGkpIGNvbnN0 OwoKcHJpdmF0ZToKICAgCgoKICBzdGF0aWMgaHBfU01hcCBTX1s0XTsgIAoKICAgCiAgc3RhdGlj IGNvbnN0IHVpbnQgcG1heF8gPSA1OwoKICAgCiAgY29uc3QgZ2VvX1RyaWFuZ2xlMmQmIGNlbGxf OwoKICAgCiAgc3BjX1RNYXRyaXg8cmVhbD4gICAgIFRfOwp9OwoKaW5saW5lIGhwX1NNYXAgaHBf SFAyZDAwMDo6Uyh1aW50IGkpIHsgCiAgcmV0dXJuIGkgPCA0ID8gU19baV0gOiBfX251bGwgOwp9 CgpocF9IUDJkMDAwOjpocF9IUDJkMDAwKGNvbnN0IGdlb19UcmlhbmdsZTJkICZjZWxsLCB1aW50 IHAsIAoJCSAgICAgICBzcGNfVENvbHVtbjxyZWFsPiogVDAsIHNwY19UQ29sdW1uPHJlYWw+KiBU MSkgOgogIGhwX0hQMmRYWFg8cmVhbD4ocCA8IHBtYXhfID8gcCA6IHBtYXhfKSwgY2VsbF8oY2Vs bCksIFRfKFQxKSB7CgogIGlmIChUMCAhPSBfX251bGwgKSBUXy5hcHBlbmQoVDApOwp9Cgppbmxp bmUgY29uc3Qgc3BjX1Q8cmVhbD4mIGhwX0hQMmQwMDA6OlQoKSBjb25zdCB7IAogIHJldHVybiBU XzsgCn0KCmlubGluZSBjb25zdCBnZW9fVHJpYW5nbGUmIGhwX0hQMmQwMDA6OnN1cHBvcnQoKSBj b25zdCB7CiAgcmV0dXJuIGNlbGxfLmNvbm5lY3RvcigpOwp9CgoKIyAxNyAiLi4vaHAvaHBFbGVt ZW50cy5oIiAyCgojIDEgIi4uL2hwL2hwSFAyZDAwMS5oIiAxCiAKCgoKCgoKCgogCgogCgoKCgoK CmNsYXNzIGhwX0hQMmQwMDEgOiBwdWJsaWMgaHBfSFAyZFhYWDxyZWFsPiB7CgpwdWJsaWM6CiAg c3RhdGljIHZvaWQgUzAoY29uc3Qgc3BjX1RDb2x1bW48cmVhbD4mIHNyYywgc3BjX1RDb2x1bW48 cmVhbD4mIGRzdCwgdWludCBwKTsKICBzdGF0aWMgdm9pZCBTMShjb25zdCBzcGNfVENvbHVtbjxy ZWFsPiYgc3JjLCBzcGNfVENvbHVtbjxyZWFsPiYgZHN0LCB1aW50IHApOwogIHN0YXRpYyB2b2lk IFMyKGNvbnN0IHNwY19UQ29sdW1uPHJlYWw+JiBzcmMsIHNwY19UQ29sdW1uPHJlYWw+JiBkc3Qs IHVpbnQgcCk7CiAgc3RhdGljIHZvaWQgUzMoY29uc3Qgc3BjX1RDb2x1bW48cmVhbD4mIHNyYywg c3BjX1RDb2x1bW48cmVhbD4mIGRzdCwgdWludCBwKTsKCiAgIAogIHN0YXRpYyBpbmxpbmUgaHBf U01hcCBTKHVpbnQgaSk7ICAKCiAgIAoKCgoKCgogIGlubGluZSBocF9IUDJkMDAxKGNvbnN0IGdl b19RdWFkMmQmIGNlbGwsIHVpbnQgcCwgc3BjX1RDb2x1bW48cmVhbD4qIFQwLAoJCSAgICBzcGNf VENvbHVtbjxyZWFsPiogVDEpOwoKICAgCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0m IG9zKSBjb25zdDsKCiAgIAoKCiAgaW5saW5lIGNvbnN0IGdlb19RdWFkJiBzdXBwb3J0KCkgY29u c3Q7CgogICAKICBpbmxpbmUgY29uc3Qgc3BjX1Q8cmVhbD4mIFQoKSBjb25zdDsKCiAgIAoKCgoK CgoKICB2b2lkIGV2YWx1YXRlKHJlYWwgeGksIHJlYWwgZXRhLCByZWFsIHZhbFtdKSBjb25zdDsK CiAgIAoKCgoKCgoKCiAgdm9pZCBldmFsdWF0ZUQocmVhbCB4aSwgcmVhbCBldGEsIFJlYWwyZCB2 YWxbXSkgY29uc3Q7CgogICAKCgoKICBSZWFsMmQgdmVydGV4KHVpbnQgaSkgY29uc3Q7Cgpwcm90 ZWN0ZWQ6CiAgIAoKCiAgc3RhdGljIGhwX1NNYXAgU19bNF07CgogICAKICBjb25zdCBnZW9fUXVh ZDJkJiBjZWxsXzsKCiAgIAogIHNwY19UTWF0cml4PHJlYWw+IFRfOwoKcHJpdmF0ZToKICAgCiAg c3RhdGljIGNvbnN0IHVpbnQgcG1heF8gPSAxNTsKfTsKCmlubGluZSBocF9TTWFwIGhwX0hQMmQw MDE6OlModWludCBpKSB7IAogIHJldHVybiBpIDwgNCA/IFNfW2ldIDogX19udWxsIDsKfQoKaHBf SFAyZDAwMTo6aHBfSFAyZDAwMShjb25zdCBnZW9fUXVhZDJkJiBjZWxsLCB1aW50IHAsIAoJCSAg ICAgICBzcGNfVENvbHVtbjxyZWFsPiogVDAsIHNwY19UQ29sdW1uPHJlYWw+KiBUMSkgOgogIGhw X0hQMmRYWFg8cmVhbD4ocCA8IHBtYXhfID8gcCA6IHBtYXhfKSwgY2VsbF8oY2VsbCksIFRfKFQx KSB7CgogIGlmIChUMCAhPSBfX251bGwgKSBUXy5hcHBlbmQoVDApOwp9CgppbmxpbmUgY29uc3Qg c3BjX1Q8cmVhbD4mIGhwX0hQMmQwMDE6OlQoKSBjb25zdCB7IAogIHJldHVybiBUXzsgCn0KCmlu bGluZSBjb25zdCBnZW9fUXVhZCYgaHBfSFAyZDAwMTo6c3VwcG9ydCgpIGNvbnN0IHsKICByZXR1 cm4gY2VsbF8uY29ubmVjdG9yKCk7Cn0KCgojIDE4ICIuLi9ocC9ocEVsZW1lbnRzLmgiIDIKCiAK CgoKIyA4ICJsaW5lbFNwYWNlLmgiIDIKCiMgMSAibGluZWxCb3VuZGFyeS5oIiAxCiAKCgoKCgoK CgojIDEgInRieEJvdW5kYXJ5Mi5oIiAxCiAKCgoKCgoKCiMgMSAiLi4vdG9vbGJveC90YnhCb3Vu ZGFyeS5oIiAxCiAKCgoKCgoKCiMgMSAiLi4vdG9vbGJveC90YnhGb3JtdWxhLmgiIDEKIAoKCgoK CgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0cmluZyIgMSAzCiAKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmluZy5oIiAx IDMKIAogCgogCiAKIAogCiAKCiAKIAogCiAKCiAKIAogCgogCiAKIAogCiAKCiAKIAoKCgoKCiNw cmFnbWEgaW50ZXJmYWNlCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvY3N0ZGRlZiIgMSAzCiAKIAoKCgojIDEgIi91c3Iv bGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQy ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMK CiMgNiAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL2NzdGRkZWYiIDIgMwoKCiMgMzUgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGQvYmFzdHJpbmcuaCIgMiAzCgoj IDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVk ZS9nKystMy9zdGQvc3RyYWl0cy5oIiAxIDMKIAogCgogCiAKIAogCiAKCiAKIAogCiAKCiAKIAog CgogCiAKIAogCiAKCiAKIAoKCgoKCiAKI3ByYWdtYSBpbnRlcmZhY2UgInN0ZC9zdHJhaXRzLmgi CgoKCgpleHRlcm4gIkMrKyIgewp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CnN0cnVjdCBzdHJpbmdf Y2hhcl90cmFpdHMgewogIHR5cGVkZWYgY2hhclQgY2hhcl90eXBlOyAgCgogICAKCiAgc3RhdGlj IHZvaWQgYXNzaWduIChjaGFyX3R5cGUmIGMxLCBjb25zdCBjaGFyX3R5cGUmIGMyKQogICAgeyBj MSA9IGMyOyB9CiAgc3RhdGljIGJvb2wgZXEgKGNvbnN0IGNoYXJfdHlwZSYgYzEsIGNvbnN0IGNo YXJfdHlwZSYgYzIpCiAgICB7IHJldHVybiAoYzEgPT0gYzIpOyB9CiAgc3RhdGljIGJvb2wgbmUg KGNvbnN0IGNoYXJfdHlwZSYgYzEsIGNvbnN0IGNoYXJfdHlwZSYgYzIpCiAgICB7IHJldHVybiAh KGMxID09IGMyKTsgfQogIHN0YXRpYyBib29sIGx0IChjb25zdCBjaGFyX3R5cGUmIGMxLCBjb25z dCBjaGFyX3R5cGUmIGMyKQogICAgeyByZXR1cm4gKGMxIDwgYzIpOyB9CiAgc3RhdGljIGNoYXJf dHlwZSBlb3MgKCkgeyByZXR1cm4gY2hhcl90eXBlKCk7IH0gIAogIHN0YXRpYyBib29sIGlzX2Rl bChjaGFyX3R5cGUgYSkgeyByZXR1cm4gMDsgfQogICAKICAKICAgCgogIHN0YXRpYyBpbnQgY29t cGFyZSAoY29uc3QgY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4p CiAgICB7CiAgICAgIHNpemVfdCBpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJaWYg KG5lIChzMVtpXSwgczJbaV0pKQoJICByZXR1cm4gbHQgKHMxW2ldLCBzMltpXSkgPyAtMSA6IDE7 CgogICAgICByZXR1cm4gMDsKICAgIH0KICAgIAogIHN0YXRpYyBzaXplX3QgbGVuZ3RoIChjb25z dCBjaGFyX3R5cGUqIHMpCiAgICB7CiAgICAgIHNpemVfdCBsID0gMDsKICAgICAgd2hpbGUgKG5l ICgqcysrLCBlb3MgKCkpKQoJKytsOwogICAgICByZXR1cm4gbDsKICAgIH0KCiAgc3RhdGljIGNo YXJfdHlwZSogY29weSAoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90 IG4pCiAgICB7CiAgICAgIGZvciAoOyBuLS07ICkKCWFzc2lnbiAoczFbbl0sIHMyW25dKTsKICAg ICAgcmV0dXJuIHMxOwogICAgfQoKICBzdGF0aWMgY2hhcl90eXBlKiBtb3ZlIChjaGFyX3R5cGUq IHMxLCBjb25zdCBjaGFyX3R5cGUqIHMyLCBzaXplX3QgbikKICAgIHsKICAgICAgY2hhcl90eXBl IGFbbl07CiAgICAgIHNpemVfdCBpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJYXNz aWduIChhW2ldLCBzMltpXSk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCglhc3NpZ24g KHMxW2ldLCBhW2ldKTsKICAgICAgcmV0dXJuIHMxOwogICAgfQoKICBzdGF0aWMgY2hhcl90eXBl KiBzZXQgKGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSYgYywgc2l6ZV90IG4pCiAgICB7 CiAgICAgIGZvciAoOyBuLS07ICkKCWFzc2lnbiAoczFbbl0sIGMpOwogICAgICByZXR1cm4gczE7 CiAgICB9Cn07CgpjbGFzcyBpc3RyZWFtOwpjbGFzcyBvc3RyZWFtOwojIDEgIi91c3IvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9jY3R5cGUi IDEgMwogCiAKCgoKIyAxICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMSAzCiAKCgoKCgoKCgoKCgoK CgoKCgogCgoKCgoKCgoKCmV4dGVybiAiQyIgeyAKCgogCgoKCgoKCgoKCgoKCgoKZW51bQp7CiAg X0lTdXBwZXIgPSAoKCAwICkgPCA4ID8gKCgxIDw8ICggMCApKSA8PCA4KSA6ICgoMSA8PCAoIDAg KSkgPj4gOCkpICwJIAogIF9JU2xvd2VyID0gKCggMSApIDwgOCA/ICgoMSA8PCAoIDEgKSkgPDwg OCkgOiAoKDEgPDwgKCAxICkpID4+IDgpKSAsCSAKICBfSVNhbHBoYSA9ICgoIDIgKSA8IDggPyAo KDEgPDwgKCAyICkpIDw8IDgpIDogKCgxIDw8ICggMiApKSA+PiA4KSkgLAkgCiAgX0lTZGlnaXQg PSAoKCAzICkgPCA4ID8gKCgxIDw8ICggMyApKSA8PCA4KSA6ICgoMSA8PCAoIDMgKSkgPj4gOCkp ICwJIAogIF9JU3hkaWdpdCA9ICgoIDQgKSA8IDggPyAoKDEgPDwgKCA0ICkpIDw8IDgpIDogKCgx IDw8ICggNCApKSA+PiA4KSkgLAkgCiAgX0lTc3BhY2UgPSAoKCA1ICkgPCA4ID8gKCgxIDw8ICgg NSApKSA8PCA4KSA6ICgoMSA8PCAoIDUgKSkgPj4gOCkpICwJIAogIF9JU3ByaW50ID0gKCggNiAp IDwgOCA/ICgoMSA8PCAoIDYgKSkgPDwgOCkgOiAoKDEgPDwgKCA2ICkpID4+IDgpKSAsCSAKICBf SVNncmFwaCA9ICgoIDcgKSA8IDggPyAoKDEgPDwgKCA3ICkpIDw8IDgpIDogKCgxIDw8ICggNyAp KSA+PiA4KSkgLAkgCiAgX0lTYmxhbmsgPSAoKCA4ICkgPCA4ID8gKCgxIDw8ICggOCApKSA8PCA4 KSA6ICgoMSA8PCAoIDggKSkgPj4gOCkpICwJIAogIF9JU2NudHJsID0gKCggOSApIDwgOCA/ICgo MSA8PCAoIDkgKSkgPDwgOCkgOiAoKDEgPDwgKCA5ICkpID4+IDgpKSAsCSAKICBfSVNwdW5jdCA9 ICgoIDEwICkgPCA4ID8gKCgxIDw8ICggMTAgKSkgPDwgOCkgOiAoKDEgPDwgKCAxMCApKSA+PiA4 KSkgLAkgCiAgX0lTYWxudW0gPSAoKCAxMSApIDwgOCA/ICgoMSA8PCAoIDExICkpIDw8IDgpIDog KCgxIDw8ICggMTEgKSkgPj4gOCkpIAkgCn07CgoKIAoKCgoKCgoKCgoKZXh0ZXJuIF9fY29uc3Qg dW5zaWduZWQgc2hvcnQgaW50ICpfX2N0eXBlX2I7CSAKZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90 ICpfX2N0eXBlX3RvbG93ZXI7ICAKZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICpfX2N0eXBlX3Rv dXBwZXI7ICAKCgoKCgoKCgoKIAoKCgpleHRlcm4gaW50ICBpc2FsbnVtICAoaW50KSB0aHJvdyAo KSAgOwpleHRlcm4gaW50ICBpc2FscGhhICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBp c2NudHJsICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc2RpZ2l0ICAoaW50KSB0aHJv dyAoKSAgOwpleHRlcm4gaW50ICBpc2xvd2VyICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50 ICBpc2dyYXBoICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3ByaW50ICAoaW50KSB0 aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3B1bmN0ICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4g aW50ICBpc3NwYWNlICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3VwcGVyICAoaW50 KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3hkaWdpdCAgKGludCkgdGhyb3cgKCkgIDsKCgoK CgoKIApleHRlcm4gaW50IHRvbG93ZXIgKGludCBfX2MpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGlu dCB0b3VwcGVyIChpbnQgX19jKSB0aHJvdyAoKSA7CgoKCgogCgpleHRlcm4gaW50IGlzYXNjaWkg KGludCBfX2MpIHRocm93ICgpIDsKCiAKCmV4dGVybiBpbnQgdG9hc2NpaSAoaW50IF9fYykgdGhy b3cgKCkgOwoKIAoKZXh0ZXJuIGludCAgX3RvdXBwZXIgIChpbnQpIHRocm93ICgpICA7CmV4dGVy biBpbnQgIF90b2xvd2VyICAoaW50KSB0aHJvdyAoKSAgOwoKCiAKCiMgMTQ4ICIvdXNyL2luY2x1 ZGUvY3R5cGUuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgojIDE3OSAiL3Vzci9pbmNsdWRlL2N0eXBl LmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoKIyAyNzUgIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAzCgoK fSAKCgojIDYgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9jY3R5cGUiIDIgMwoKCiMgMTA1ICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL3N0cmFpdHMuaCIgMiAz CgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9jc3RyaW5nIiAxIDMKIAogCgoKCgoKCiMgOTQgIi91c3IvbGliL2djYy1saWIv aTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9jc3RyaW5nIiAzCgoK CiMgMTA2ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2lu Y2x1ZGUvZysrLTMvc3RkL3N0cmFpdHMuaCIgMiAzCgoKc3RydWN0IHN0cmluZ19jaGFyX3RyYWl0 cyA8Y2hhcj4gewogIHR5cGVkZWYgY2hhciBjaGFyX3R5cGU7CgogIHN0YXRpYyB2b2lkIGFzc2ln biAoY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikKICAgIHsgYzEgPSBjMjsgfQog IHN0YXRpYyBib29sIGVxIChjb25zdCBjaGFyX3R5cGUgJiBjMSwgY29uc3QgY2hhcl90eXBlJiBj MikKICAgIHsgcmV0dXJuIChjMSA9PSBjMik7IH0KICBzdGF0aWMgYm9vbCBuZSAoY29uc3QgY2hh cl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikKICAgIHsgcmV0dXJuIChjMSAhPSBjMik7 IH0KICBzdGF0aWMgYm9vbCBsdCAoY29uc3QgY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBl JiBjMikKICAgIHsgcmV0dXJuIChjMSA8IGMyKTsgfQogIHN0YXRpYyBjaGFyX3R5cGUgZW9zICgp IHsgcmV0dXJuIDA7IH0KICBzdGF0aWMgYm9vbCBpc19kZWwoY2hhcl90eXBlIGEpIHsgcmV0dXJu IChfX2N0eXBlX2JbKGludCkgKCAoIGEgKSApXSAmICh1bnNpZ25lZCBzaG9ydCBpbnQpICAgX0lT c3BhY2UgKSAgOyB9CgogIHN0YXRpYyBpbnQgY29tcGFyZSAoY29uc3QgY2hhcl90eXBlKiBzMSwg Y29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pCiAgICB7IHJldHVybiBtZW1jbXAgKHMxLCBz Miwgbik7IH0KICBzdGF0aWMgc2l6ZV90IGxlbmd0aCAoY29uc3QgY2hhcl90eXBlKiBzKQogICAg eyByZXR1cm4gc3RybGVuIChzKTsgfQogIHN0YXRpYyBjaGFyX3R5cGUqIGNvcHkgKGNoYXJfdHlw ZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKQogICAgeyByZXR1cm4gKGNoYXJf dHlwZSopIG1lbWNweSAoczEsIHMyLCBuKTsgfQogIHN0YXRpYyBjaGFyX3R5cGUqIG1vdmUgKGNo YXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKQogICAgeyByZXR1cm4g KGNoYXJfdHlwZSopIG1lbW1vdmUgKHMxLCBzMiwgbik7IH0KICBzdGF0aWMgY2hhcl90eXBlKiBz ZXQgKGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSYgYywgc2l6ZV90IG4pCiAgICB7IHJl dHVybiAoY2hhcl90eXBlKikgbWVtc2V0IChzMSwgYywgbik7IH0KfTsKCiMgMTU5ICIvdXNyL2xp Yi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rk L3N0cmFpdHMuaCIgMwoKfSAgCgojIDM2ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45 NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL2Jhc3RyaW5nLmgiIDIgMwoKCiAKIyAx ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvYWxsb2MuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNDAgIi91c3IvbGli L2djYy1saWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9hbGxv Yy5oIiAzCgoKCgogCiAKIAojIDM5ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL2Jhc3RyaW5nLmgiIDIgMwoKCmV4dGVybiAi QysrIiB7CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CgojIDEgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9pdGVyYXRvciIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGli L2kzODYtbGludXgvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM0MiAiL3Vzci9saWIv Z2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgojIDMyICIvdXNy L2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv aXRlcmF0b3IiIDIgMwoKCgoKCgoKCgoKIAogCiAKIyA0NCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2 LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmluZy5oIiAy IDMKCgoKCmV4dGVybiB2b2lkIF9fb3V0X29mX3JhbmdlIChjb25zdCBjaGFyICopOwpleHRlcm4g dm9pZCBfX2xlbmd0aF9lcnJvciAoY29uc3QgY2hhciAqKTsKCgoKCgoKCgoKCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cyA9IHN0cmluZ19jaGFyX3RyYWl0czxjaGFyVD4s CgkgIGNsYXNzIEFsbG9jYXRvciA9IGFsbG9jID4KY2xhc3MgYmFzaWNfc3RyaW5nCnsKcHJpdmF0 ZToKICBzdHJ1Y3QgUmVwIHsKICAgIHNpemVfdCBsZW4sIHJlcywgcmVmOwogICAgYm9vbCBzZWxm aXNoOwoKICAgIGNoYXJUKiBkYXRhICgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhclQg Kj4odGhpcyArIDEpOyB9CiAgICBjaGFyVCYgb3BlcmF0b3JbXSAoc2l6ZV90IHMpIHsgcmV0dXJu IGRhdGEgKCkgW3NdOyB9CiAgICBjaGFyVCogZ3JhYiAoKSB7IGlmIChzZWxmaXNoKSByZXR1cm4g Y2xvbmUgKCk7ICsrcmVmOyByZXR1cm4gZGF0YSAoKTsgfQojIDEwOCAiL3Vzci9saWIvZ2NjLWxp Yi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmlu Zy5oIiAzCgogICAgdm9pZCByZWxlYXNlICgpIHsgaWYgKC0tcmVmID09IDApIGRlbGV0ZSB0aGlz OyB9CgoKICAgIGlubGluZSBzdGF0aWMgdm9pZCAqIG9wZXJhdG9yIG5ldyAoc2l6ZV90LCBzaXpl X3QpOwogICAgaW5saW5lIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqKTsKICAg IGlubGluZSBzdGF0aWMgUmVwKiBjcmVhdGUgKHNpemVfdCk7CiAgICBjaGFyVCogY2xvbmUgKCk7 CgogICAgaW5saW5lIHZvaWQgY29weSAoc2l6ZV90LCBjb25zdCBjaGFyVCAqLCBzaXplX3QpOwog ICAgaW5saW5lIHZvaWQgbW92ZSAoc2l6ZV90LCBjb25zdCBjaGFyVCAqLCBzaXplX3QpOwogICAg aW5saW5lIHZvaWQgc2V0ICAoc2l6ZV90LCBjb25zdCBjaGFyVCwgICBzaXplX3QpOwoKICAgIGlu bGluZSBzdGF0aWMgYm9vbCBleGNlc3Nfc2xvcCAoc2l6ZV90LCBzaXplX3QpOwogICAgaW5saW5l IHN0YXRpYyBzaXplX3QgZnJvYl9zaXplIChzaXplX3QpOwoKICBwcml2YXRlOgogICAgUmVwICZv cGVyYXRvcj0gKGNvbnN0IFJlcCAmKTsKICB9OwoKcHVibGljOgogCiAgdHlwZWRlZgkgICB0cmFp dHMJCXRyYWl0c190eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzOjpjaGFyX3R5cGUJdmFs dWVfdHlwZTsKICB0eXBlZGVmCSAgIEFsbG9jYXRvcgkJYWxsb2NhdG9yX3R5cGU7CgogIHR5cGVk ZWYgc2l6ZV90IHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7 CiAgdHlwZWRlZiBjaGFyVCYgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgY2hhclQmIGNvbnN0 X3JlZmVyZW5jZTsKICB0eXBlZGVmIGNoYXJUKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgY2hh clQqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBwb2ludGVyIGl0ZXJhdG9yOwogIHR5cGVkZWYg Y29uc3RfcG9pbnRlciBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIDo6cmV2ZXJzZV9pdGVyYXRv cjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIDo6cmV2ZXJzZV9pdGVyYXRv cjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICBzdGF0aWMgY29uc3Qg c2l6ZV90eXBlIG5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKCnByaXZhdGU6CiAg UmVwICpyZXAgKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXAgKj4oZGF0KSAt IDE7IH0KICB2b2lkIHJlcHVwIChSZXAgKnApIHsgcmVwICgpLT5yZWxlYXNlICgpOyBkYXQgPSBw LT5kYXRhICgpOyB9CgpwdWJsaWM6CiAgY29uc3QgY2hhclQqIGRhdGEgKCkgY29uc3QKICAgIHsg cmV0dXJuIHJlcCAoKS0+ZGF0YSgpOyB9CiAgc2l6ZV90eXBlIGxlbmd0aCAoKSBjb25zdAogICAg eyByZXR1cm4gcmVwICgpLT5sZW47IH0KICBzaXplX3R5cGUgc2l6ZSAoKSBjb25zdAogICAgeyBy ZXR1cm4gcmVwICgpLT5sZW47IH0KICBzaXplX3R5cGUgY2FwYWNpdHkgKCkgY29uc3QKICAgIHsg cmV0dXJuIHJlcCAoKS0+cmVzOyB9CiAgc2l6ZV90eXBlIG1heF9zaXplICgpIGNvbnN0CiAgICB7 IHJldHVybiAobnBvcyAtIDEpL3NpemVvZiAoY2hhclQpOyB9CQkgCiAgYm9vbCBlbXB0eSAoKSBj b25zdAogICAgeyByZXR1cm4gc2l6ZSAoKSA9PSAwOyB9CgogCiAgYmFzaWNfc3RyaW5nJiBvcGVy YXRvcj0gKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyKQogICAgewogICAgICBpZiAoJnN0ciAhPSB0 aGlzKSB7IHJlcCAoKS0+cmVsZWFzZSAoKTsgZGF0ID0gc3RyLnJlcCAoKS0+Z3JhYiAoKTsgfQog ICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIGV4cGxpY2l0IGJhc2ljX3N0cmluZyAoKTogZGF0 IChuaWxSZXAuZ3JhYiAoKSkgeyB9CiAgYmFzaWNfc3RyaW5nIChjb25zdCBiYXNpY19zdHJpbmcm IF9zdHIpOiBkYXQgKF9zdHIucmVwICgpLT5ncmFiICgpKSB7IH0KICBiYXNpY19zdHJpbmcgKGNv bnN0IGJhc2ljX3N0cmluZyYgX3N0ciwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4gPSBucG9z KQogICAgOiBkYXQgKG5pbFJlcC5ncmFiICgpKSB7IGFzc2lnbiAoX3N0ciwgcG9zLCBuKTsgfQog IGJhc2ljX3N0cmluZyAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBuKQogICAgOiBkYXQgKG5p bFJlcC5ncmFiICgpKSB7IGFzc2lnbiAocywgbik7IH0KICBiYXNpY19zdHJpbmcgKGNvbnN0IGNo YXJUKiBzKQogICAgOiBkYXQgKG5pbFJlcC5ncmFiICgpKSB7IGFzc2lnbiAocyk7IH0KICBiYXNp Y19zdHJpbmcgKHNpemVfdHlwZSBuLCBjaGFyVCBjKQogICAgOiBkYXQgKG5pbFJlcC5ncmFiICgp KSB7IGFzc2lnbiAobiwgYyk7IH0KCiAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KICAg IGJhc2ljX3N0cmluZyhJbnB1dEl0ZXJhdG9yIF9fYmVnaW4sIElucHV0SXRlcmF0b3IgX19lbmQp CgoKCiAgICA6IGRhdCAobmlsUmVwLmdyYWIgKCkpIHsgYXNzaWduIChfX2JlZ2luLCBfX2VuZCk7 IH0KCiAgfmJhc2ljX3N0cmluZyAoKQogICAgeyByZXAgKCktPnJlbGVhc2UgKCk7IH0KCiAgdm9p ZCBzd2FwIChiYXNpY19zdHJpbmcgJnMpIHsgY2hhclQgKmQgPSBkYXQ7IGRhdCA9IHMuZGF0OyBz LmRhdCA9IGQ7IH0KCiAgYmFzaWNfc3RyaW5nJiBhcHBlbmQgKGNvbnN0IGJhc2ljX3N0cmluZyYg X3N0ciwgc2l6ZV90eXBlIHBvcyA9IDAsCgkJCXNpemVfdHlwZSBuID0gbnBvcykKICAgIHsgcmV0 dXJuIHJlcGxhY2UgKGxlbmd0aCAoKSwgMCwgX3N0ciwgcG9zLCBuKTsgfQogIGJhc2ljX3N0cmlu ZyYgYXBwZW5kIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIG4pCiAgICB7IHJldHVybiByZXBs YWNlIChsZW5ndGggKCksIDAsIHMsIG4pOyB9CiAgYmFzaWNfc3RyaW5nJiBhcHBlbmQgKGNvbnN0 IGNoYXJUKiBzKQogICAgeyByZXR1cm4gYXBwZW5kIChzLCB0cmFpdHM6Omxlbmd0aCAocykpOyB9 CiAgYmFzaWNfc3RyaW5nJiBhcHBlbmQgKHNpemVfdHlwZSBuLCBjaGFyVCBjKQogICAgeyByZXR1 cm4gcmVwbGFjZSAobGVuZ3RoICgpLCAwLCBuLCBjKTsgfQoKICB0ZW1wbGF0ZTxjbGFzcyBJbnB1 dEl0ZXJhdG9yPgogICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoSW5wdXRJdGVyYXRvciBmaXJzdCwg SW5wdXRJdGVyYXRvciBsYXN0KQoKCgogICAgeyByZXR1cm4gcmVwbGFjZSAoaWVuZCAoKSwgaWVu ZCAoKSwgZmlyc3QsIGxhc3QpOyB9CgogIGJhc2ljX3N0cmluZyYgYXNzaWduIChjb25zdCBiYXNp Y19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDAsCgkJCXNpemVfdHlwZSBuID0gbnBvcykK ICAgIHsgcmV0dXJuIHJlcGxhY2UgKDAsIG5wb3MsIHN0ciwgcG9zLCBuKTsgfQogIGJhc2ljX3N0 cmluZyYgYXNzaWduIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIG4pCiAgICB7IHJldHVybiBy ZXBsYWNlICgwLCBucG9zLCBzLCBuKTsgfQogIGJhc2ljX3N0cmluZyYgYXNzaWduIChjb25zdCBj aGFyVCogcykKICAgIHsgcmV0dXJuIGFzc2lnbiAocywgdHJhaXRzOjpsZW5ndGggKHMpKTsgfQog IGJhc2ljX3N0cmluZyYgYXNzaWduIChzaXplX3R5cGUgbiwgY2hhclQgYykKICAgIHsgcmV0dXJu IHJlcGxhY2UgKDAsIG5wb3MsIG4sIGMpOyB9CgogIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0 b3I+CiAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0 ZXJhdG9yIGxhc3QpCgoKCiAgICB7IHJldHVybiByZXBsYWNlIChpYmVnaW4gKCksIGllbmQgKCks IGZpcnN0LCBsYXN0KTsgfQoKICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPSAoY29uc3QgY2hhclQq IHMpCiAgICB7IHJldHVybiBhc3NpZ24gKHMpOyB9CiAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0g KGNoYXJUIGMpCiAgICB7IHJldHVybiBhc3NpZ24gKDEsIGMpOyB9CgogIGJhc2ljX3N0cmluZyYg b3BlcmF0b3IrPSAoY29uc3QgYmFzaWNfc3RyaW5nJiByaHMpCiAgICB7IHJldHVybiBhcHBlbmQg KHJocyk7IH0KICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yKz0gKGNvbnN0IGNoYXJUKiBzKQogICAg eyByZXR1cm4gYXBwZW5kIChzKTsgfQogIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPSAoY2hhclQg YykKICAgIHsgcmV0dXJuIGFwcGVuZCAoMSwgYyk7IH0KCiAgYmFzaWNfc3RyaW5nJiBpbnNlcnQg KHNpemVfdHlwZSBwb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwKCQkJc2l6ZV90eXBlIHBv czIgPSAwLCBzaXplX3R5cGUgbiA9IG5wb3MpCiAgICB7IHJldHVybiByZXBsYWNlIChwb3MxLCAw LCBzdHIsIHBvczIsIG4pOyB9CiAgYmFzaWNfc3RyaW5nJiBpbnNlcnQgKHNpemVfdHlwZSBwb3Ms IGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgbikKICAgIHsgcmV0dXJuIHJlcGxhY2UgKHBvcywg MCwgcywgbik7IH0KICBiYXNpY19zdHJpbmcmIGluc2VydCAoc2l6ZV90eXBlIHBvcywgY29uc3Qg Y2hhclQqIHMpCiAgICB7IHJldHVybiBpbnNlcnQgKHBvcywgcywgdHJhaXRzOjpsZW5ndGggKHMp KTsgfQogIGJhc2ljX3N0cmluZyYgaW5zZXJ0IChzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiwg Y2hhclQgYykKICAgIHsgcmV0dXJuIHJlcGxhY2UgKHBvcywgMCwgbiwgYyk7IH0KICBpdGVyYXRv ciBpbnNlcnQoaXRlcmF0b3IgcCwgY2hhclQgYykKICAgIHsgc2l6ZV90eXBlIF9fbyA9IHAgLSBp YmVnaW4gKCk7CiAgICAgIGluc2VydCAocCAtIGliZWdpbiAoKSwgMSwgYyk7IHNlbGZpc2ggKCk7 CiAgICAgIHJldHVybiBpYmVnaW4gKCkgKyBfX287IH0KICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0 b3IgcCwgc2l6ZV90eXBlIG4sIGNoYXJUIGMpCiAgICB7IHNpemVfdHlwZSBfX28gPSBwIC0gaWJl Z2luICgpOwogICAgICBpbnNlcnQgKHAgLSBpYmVnaW4gKCksIG4sIGMpOyBzZWxmaXNoICgpOwog ICAgICByZXR1cm4gaWJlZ2luICgpICsgX19vOyB9CgogIHRlbXBsYXRlPGNsYXNzIElucHV0SXRl cmF0b3I+CiAgICB2b2lkIGluc2VydChpdGVyYXRvciBwLCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJ bnB1dEl0ZXJhdG9yIGxhc3QpCgoKCiAgICB7IHJlcGxhY2UgKHAsIHAsIGZpcnN0LCBsYXN0KTsg fQoKICBiYXNpY19zdHJpbmcmIGVyYXNlIChzaXplX3R5cGUgcG9zID0gMCwgc2l6ZV90eXBlIG4g PSBucG9zKQogICAgeyByZXR1cm4gcmVwbGFjZSAocG9zLCBuLCAoc2l6ZV90eXBlKTAsIChjaGFy VCkwKTsgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHApCiAgICB7IHNpemVfdHlwZSBfX28g PSBwIC0gYmVnaW4oKTsKICAgICAgcmVwbGFjZSAoX19vLCAxLCAoc2l6ZV90eXBlKTAsIChjaGFy VCkwKTsgc2VsZmlzaCAoKTsKICAgICAgcmV0dXJuIGliZWdpbigpICsgX19vOyB9CiAgaXRlcmF0 b3IgZXJhc2UoaXRlcmF0b3IgZiwgaXRlcmF0b3IgbCkKICAgIHsgc2l6ZV90eXBlIF9fbyA9IGYg LSBpYmVnaW4oKTsKICAgICAgcmVwbGFjZSAoX19vLCBsLWYsIChzaXplX3R5cGUpMCwgKGNoYXJU KTApO3NlbGZpc2ggKCk7CiAgICAgIHJldHVybiBpYmVnaW4oKSArIF9fbzsgfQoKICBiYXNpY19z dHJpbmcmIHJlcGxhY2UgKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGJhc2lj X3N0cmluZyYgc3RyLAoJCQkgc2l6ZV90eXBlIHBvczIgPSAwLCBzaXplX3R5cGUgbjIgPSBucG9z KTsKICBiYXNpY19zdHJpbmcmIHJlcGxhY2UgKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwg Y29uc3QgY2hhclQqIHMsCgkJCSBzaXplX3R5cGUgbjIpOwogIGJhc2ljX3N0cmluZyYgcmVwbGFj ZSAoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBjb25zdCBjaGFyVCogcykKICAgIHsgcmV0 dXJuIHJlcGxhY2UgKHBvcywgbjEsIHMsIHRyYWl0czo6bGVuZ3RoIChzKSk7IH0KICBiYXNpY19z dHJpbmcmIHJlcGxhY2UgKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwgc2l6ZV90eXBlIG4y LCBjaGFyVCBjKTsKICBiYXNpY19zdHJpbmcmIHJlcGxhY2UgKHNpemVfdHlwZSBwb3MsIHNpemVf dHlwZSBuLCBjaGFyVCBjKQogICAgeyByZXR1cm4gcmVwbGFjZSAocG9zLCBuLCAxLCBjKTsgfQog IGJhc2ljX3N0cmluZyYgcmVwbGFjZSAoaXRlcmF0b3IgaTEsIGl0ZXJhdG9yIGkyLCBjb25zdCBi YXNpY19zdHJpbmcmIHN0cikKICAgIHsgcmV0dXJuIHJlcGxhY2UgKGkxIC0gaWJlZ2luICgpLCBp MiAtIGkxLCBzdHIpOyB9CiAgYmFzaWNfc3RyaW5nJiByZXBsYWNlIChpdGVyYXRvciBpMSwgaXRl cmF0b3IgaTIsIGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgbikKICAgIHsgcmV0dXJuIHJlcGxh Y2UgKGkxIC0gaWJlZ2luICgpLCBpMiAtIGkxLCBzLCBuKTsgfQogIGJhc2ljX3N0cmluZyYgcmVw bGFjZSAoaXRlcmF0b3IgaTEsIGl0ZXJhdG9yIGkyLCBjb25zdCBjaGFyVCogcykKICAgIHsgcmV0 dXJuIHJlcGxhY2UgKGkxIC0gaWJlZ2luICgpLCBpMiAtIGkxLCBzKTsgfQogIGJhc2ljX3N0cmlu ZyYgcmVwbGFjZSAoaXRlcmF0b3IgaTEsIGl0ZXJhdG9yIGkyLCBzaXplX3R5cGUgbiwgY2hhclQg YykKICAgIHsgcmV0dXJuIHJlcGxhY2UgKGkxIC0gaWJlZ2luICgpLCBpMiAtIGkxLCBuLCBjKTsg fQoKICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgogICAgYmFzaWNfc3RyaW5nJiByZXBs YWNlKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwKCQkJICBJbnB1dEl0ZXJhdG9yIGoxLCBJbnB1 dEl0ZXJhdG9yIGoyKTsKCgoKCgpwcml2YXRlOgogIHN0YXRpYyBjaGFyVCBlb3MgKCkgeyByZXR1 cm4gdHJhaXRzOjplb3MgKCk7IH0KICB2b2lkIHVuaXF1ZSAoKSB7IGlmIChyZXAgKCktPnJlZiA+ IDEpIGFsbG9jIChsZW5ndGggKCksIHRydWUpOyB9CiAgdm9pZCBzZWxmaXNoICgpIHsgdW5pcXVl ICgpOyByZXAgKCktPnNlbGZpc2ggPSB0cnVlOyB9CgpwdWJsaWM6CiAgY2hhclQgb3BlcmF0b3Jb XSAoc2l6ZV90eXBlIHBvcykgY29uc3QKICAgIHsKICAgICAgaWYgKHBvcyA9PSBsZW5ndGggKCkp CglyZXR1cm4gZW9zICgpOwogICAgICByZXR1cm4gZGF0YSAoKVtwb3NdOwogICAgfQoKICByZWZl cmVuY2Ugb3BlcmF0b3JbXSAoc2l6ZV90eXBlIHBvcykKICAgIHsgc2VsZmlzaCAoKTsgcmV0dXJu ICgqcmVwICgpKVtwb3NdOyB9CgogIHJlZmVyZW5jZSBhdCAoc2l6ZV90eXBlIHBvcykKICAgIHsK ICAgICAgZG8geyBpZiAoIHBvcyA+PSBsZW5ndGggKCkgKSBfX291dF9vZl9yYW5nZSAoInBvcyA+ PSBsZW5ndGggKCkiKTsgfSB3aGlsZSAoMCkgOwogICAgICByZXR1cm4gKCp0aGlzKVtwb3NdOwog ICAgfQogIGNvbnN0X3JlZmVyZW5jZSBhdCAoc2l6ZV90eXBlIHBvcykgY29uc3QKICAgIHsKICAg ICAgZG8geyBpZiAoIHBvcyA+PSBsZW5ndGggKCkgKSBfX291dF9vZl9yYW5nZSAoInBvcyA+PSBs ZW5ndGggKCkiKTsgfSB3aGlsZSAoMCkgOwogICAgICByZXR1cm4gZGF0YSAoKVtwb3NdOwogICAg fQoKcHJpdmF0ZToKICB2b2lkIHRlcm1pbmF0ZSAoKSBjb25zdAogICAgeyB0cmFpdHM6OmFzc2ln biAoKCpyZXAgKCkpW2xlbmd0aCAoKV0sIGVvcyAoKSk7IH0KCnB1YmxpYzoKICBjb25zdCBjaGFy VCogY19zdHIgKCkgY29uc3QKICAgIHsgY29uc3QgY2hhclQqIG51bGxfc3RyID0gIiI7IAogICAg ICBpZiAobGVuZ3RoICgpID09IDApIHJldHVybiBudWxsX3N0cjsgdGVybWluYXRlICgpOyByZXR1 cm4gZGF0YSAoKTsgfQogIHZvaWQgcmVzaXplIChzaXplX3R5cGUgbiwgY2hhclQgYyk7CiAgdm9p ZCByZXNpemUgKHNpemVfdHlwZSBuKQogICAgeyByZXNpemUgKG4sIGVvcyAoKSk7IH0KICB2b2lk IHJlc2VydmUgKHNpemVfdHlwZSkgeyB9CgogIHNpemVfdHlwZSBjb3B5IChjaGFyVCogcywgc2l6 ZV90eXBlIG4sIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKCiAgc2l6ZV90eXBlIGZpbmQgKGNv bnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QKICAgIHsgcmV0 dXJuIGZpbmQgKHN0ci5kYXRhKCksIHBvcywgc3RyLmxlbmd0aCgpKTsgfQogIHNpemVfdHlwZSBm aW5kIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0Owog IHNpemVfdHlwZSBmaW5kIChjb25zdCBjaGFyVCogX3MsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25z dAogICAgeyByZXR1cm4gZmluZCAoX3MsIHBvcywgdHJhaXRzOjpsZW5ndGggKF9zKSk7IH0KICBz aXplX3R5cGUgZmluZCAoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwoKICBzaXpl X3R5cGUgcmZpbmQgKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gbnBv cykgY29uc3QKICAgIHsgcmV0dXJuIHJmaW5kIChzdHIuZGF0YSgpLCBwb3MsIHN0ci5sZW5ndGgo KSk7IH0KICBzaXplX3R5cGUgcmZpbmQgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBz aXplX3R5cGUgbikgY29uc3Q7CiAgc2l6ZV90eXBlIHJmaW5kIChjb25zdCBjaGFyVCogcywgc2l6 ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0CiAgICB7IHJldHVybiByZmluZCAocywgcG9zLCB0cmFp dHM6Omxlbmd0aCAocykpOyB9CiAgc2l6ZV90eXBlIHJmaW5kIChjaGFyVCBjLCBzaXplX3R5cGUg cG9zID0gbnBvcykgY29uc3Q7CgogIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mIChjb25zdCBiYXNp Y19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0CiAgICB7IHJldHVybiBmaW5k X2ZpcnN0X29mIChzdHIuZGF0YSgpLCBwb3MsIHN0ci5sZW5ndGgoKSk7IH0KICBzaXplX3R5cGUg ZmluZF9maXJzdF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBu KSBjb25zdDsKICBzaXplX3R5cGUgZmluZF9maXJzdF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVf dHlwZSBwb3MgPSAwKSBjb25zdAogICAgeyByZXR1cm4gZmluZF9maXJzdF9vZiAocywgcG9zLCB0 cmFpdHM6Omxlbmd0aCAocykpOyB9CiAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YgKGNoYXJUIGMs IHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdAogICAgeyByZXR1cm4gZmluZCAoYywgcG9zKTsgfQoK ICBzaXplX3R5cGUgZmluZF9sYXN0X29mIChjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90 eXBlIHBvcyA9IG5wb3MpIGNvbnN0CiAgICB7IHJldHVybiBmaW5kX2xhc3Rfb2YgKHN0ci5kYXRh KCksIHBvcywgc3RyLmxlbmd0aCgpKTsgfQogIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YgKGNvbnN0 IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7CiAgc2l6ZV90eXBl IGZpbmRfbGFzdF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25z dAogICAgeyByZXR1cm4gZmluZF9sYXN0X29mIChzLCBwb3MsIHRyYWl0czo6bGVuZ3RoIChzKSk7 IH0KICBzaXplX3R5cGUgZmluZF9sYXN0X29mIChjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gbnBv cykgY29uc3QKICAgIHsgcmV0dXJuIHJmaW5kIChjLCBwb3MpOyB9CgogIHNpemVfdHlwZSBmaW5k X2ZpcnN0X25vdF9vZiAoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MgPSAw KSBjb25zdAogICAgeyByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YgKHN0ci5kYXRhKCksIHBvcywg c3RyLmxlbmd0aCgpKTsgfQogIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZiAoY29uc3QgY2hh clQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdDsKICBzaXplX3R5cGUgZmlu ZF9maXJzdF9ub3Rfb2YgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QK ICAgIHsgcmV0dXJuIGZpbmRfZmlyc3Rfbm90X29mIChzLCBwb3MsIHRyYWl0czo6bGVuZ3RoIChz KSk7IH0KICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YgKGNoYXJUIGMsIHNpemVfdHlwZSBw b3MgPSAwKSBjb25zdDsKCiAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YgKGNvbnN0IGJhc2lj X3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QKICAgIHsgcmV0dXJuIGZp bmRfbGFzdF9ub3Rfb2YgKHN0ci5kYXRhKCksIHBvcywgc3RyLmxlbmd0aCgpKTsgfQogIHNpemVf dHlwZSBmaW5kX2xhc3Rfbm90X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6 ZV90eXBlIG4pIGNvbnN0OwogIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mIChjb25zdCBjaGFy VCogcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0CiAgICB7IHJldHVybiBmaW5kX2xhc3Rf bm90X29mIChzLCBwb3MsIHRyYWl0czo6bGVuZ3RoIChzKSk7IH0KICBzaXplX3R5cGUgZmluZF9s YXN0X25vdF9vZiAoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OwoKICBiYXNp Y19zdHJpbmcgc3Vic3RyIChzaXplX3R5cGUgcG9zID0gMCwgc2l6ZV90eXBlIG4gPSBucG9zKSBj b25zdAogICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nICgqdGhpcywgcG9zLCBuKTsgfQoKICBpbnQg Y29tcGFyZSAoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MgPSAwLCBzaXpl X3R5cGUgbiA9IG5wb3MpIGNvbnN0OwogICAKICBpbnQgY29tcGFyZSAoY29uc3QgY2hhclQqIHMs IHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdDsKICBpbnQgY29tcGFyZSAoY29uc3Qg Y2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdAogICAgeyByZXR1cm4gY29tcGFyZSAo cywgcG9zLCB0cmFpdHM6Omxlbmd0aCAocykpOyB9CgogIGl0ZXJhdG9yIGJlZ2luICgpIHsgc2Vs ZmlzaCAoKTsgcmV0dXJuICYoKnRoaXMpWzBdOyB9CiAgaXRlcmF0b3IgZW5kICgpIHsgc2VsZmlz aCAoKTsgcmV0dXJuICYoKnRoaXMpW2xlbmd0aCAoKV07IH0KCnByaXZhdGU6CiAgaXRlcmF0b3Ig aWJlZ2luICgpIGNvbnN0IHsgcmV0dXJuICYoKnJlcCAoKSlbMF07IH0KICBpdGVyYXRvciBpZW5k ICgpIGNvbnN0IHsgcmV0dXJuICYoKnJlcCAoKSlbbGVuZ3RoICgpXTsgfQoKcHVibGljOgogIGNv bnN0X2l0ZXJhdG9yIGJlZ2luICgpIGNvbnN0IHsgcmV0dXJuIGliZWdpbiAoKTsgfQogIGNvbnN0 X2l0ZXJhdG9yIGVuZCAoKSBjb25zdCB7IHJldHVybiBpZW5kICgpOyB9CgogIHJldmVyc2VfaXRl cmF0b3IgICAgICAgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvciAoZW5kICgpKTsg fQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QKICAgIHsgcmV0dXJuIGNv bnN0X3JldmVyc2VfaXRlcmF0b3IgKGVuZCAoKSk7IH0KICByZXZlcnNlX2l0ZXJhdG9yICAgICAg IHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yIChiZWdpbiAoKSk7IH0KICBjb25zdF9y ZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdAogICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9p dGVyYXRvciAoYmVnaW4gKCkpOyB9Cgpwcml2YXRlOgogIHZvaWQgYWxsb2MgKHNpemVfdHlwZSBz aXplLCBib29sIHNhdmUpOwogIHN0YXRpYyBzaXplX3R5cGUgX2ZpbmQgKGNvbnN0IGNoYXJUKiBw dHIsIGNoYXJUIGMsIHNpemVfdHlwZSB4cG9zLCBzaXplX3R5cGUgbGVuKTsKICBpbmxpbmUgYm9v bCBjaGVja19yZWFsbG9jIChzaXplX3R5cGUgcykgY29uc3Q7CgogIHN0YXRpYyBSZXAgbmlsUmVw OwogIGNoYXJUICpkYXQ7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMs IGNsYXNzIEFsbG9jYXRvcj4gdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CmJhc2ljX3N0 cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJh aXRzLCBBbGxvY2F0b3I+OjoKcmVwbGFjZSAoaXRlcmF0b3IgaTEsIGl0ZXJhdG9yIGkyLCBJbnB1 dEl0ZXJhdG9yIGoxLCBJbnB1dEl0ZXJhdG9yIGoyKQoKCgoKCnsKICBjb25zdCBzaXplX3R5cGUg bGVuID0gbGVuZ3RoICgpOwogIHNpemVfdHlwZSBwb3MgPSBpMSAtIGliZWdpbiAoKTsKICBzaXpl X3R5cGUgbjEgPSBpMiAtIGkxOwogIHNpemVfdHlwZSBuMiA9IGoyIC0gajE7CgogIGRvIHsgaWYg KCBwb3MgPiBsZW4gKSBfX291dF9vZl9yYW5nZSAoInBvcyA+IGxlbiIpOyB9IHdoaWxlICgwKSA7 CiAgaWYgKG4xID4gbGVuIC0gcG9zKQogICAgbjEgPSBsZW4gLSBwb3M7CiAgZG8geyBpZiAoIGxl biAtIG4xID4gbWF4X3NpemUgKCkgLSBuMiApIF9fbGVuZ3RoX2Vycm9yICgibGVuIC0gbjEgPiBt YXhfc2l6ZSAoKSAtIG4yIik7IH0gd2hpbGUgKDApIDsKICBzaXplX3QgbmV3bGVuID0gbGVuIC0g bjEgKyBuMjsKCiAgaWYgKGNoZWNrX3JlYWxsb2MgKG5ld2xlbikpCiAgICB7CiAgICAgIFJlcCAq cCA9IFJlcDo6Y3JlYXRlIChuZXdsZW4pOwogICAgICBwLT5jb3B5ICgwLCBkYXRhICgpLCBwb3Mp OwogICAgICBwLT5jb3B5IChwb3MgKyBuMiwgZGF0YSAoKSArIHBvcyArIG4xLCBsZW4gLSAocG9z ICsgbjEpKTsKICAgICAgZm9yICg7IGoxICE9IGoyOyArK2oxLCArK3BvcykKCXRyYWl0czo6YXNz aWduICgoKnApW3Bvc10sICpqMSk7CiAgICAgIHJlcHVwIChwKTsKICAgIH0KICBlbHNlCiAgICB7 CiAgICAgIHJlcCAoKS0+bW92ZSAocG9zICsgbjIsIGRhdGEgKCkgKyBwb3MgKyBuMSwgbGVuIC0g KHBvcyArIG4xKSk7CiAgICAgIGZvciAoOyBqMSAhPSBqMjsgKytqMSwgKytwb3MpCgl0cmFpdHM6 OmFzc2lnbiAoKCpyZXAgKCkpW3Bvc10sICpqMSk7CiAgICB9CiAgcmVwICgpLT5sZW4gPSBuZXds ZW47CgogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFp dHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPgpvcGVyYXRvcisgKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPiYgbGhzLAoJICAgY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+JiByaHMpCnsKICBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRv cj4gX3N0ciAobGhzKTsKICBfc3RyLmFwcGVuZCAocmhzKTsKICByZXR1cm4gX3N0cjsKfQoKdGVt cGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5l IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgpvcGVyYXRvcisgKGNvbnN0 IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y PiYgcmhzKQp7CiAgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+IF9zdHIg KGxocyk7CiAgX3N0ci5hcHBlbmQgKHJocyk7CiAgcmV0dXJuIF9zdHI7Cn0KCnRlbXBsYXRlIDxj bGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBiYXNpY19z dHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4Kb3BlcmF0b3IrIChjaGFyVCBsaHMsIGNv bnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+IF9zdHIgKDEsIGxocyk7CiAgX3N0 ci5hcHBlbmQgKHJocyk7CiAgcmV0dXJuIF9zdHI7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwg Y2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj4Kb3BlcmF0b3IrIChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykKewogIGJhc2ljX3N0 cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiBfc3RyIChsaHMpOwogIF9zdHIuYXBwZW5k IChyaHMpOwogIHJldHVybiBfc3RyOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRy YWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRz LCBBbGxvY2F0b3I+Cm9wZXJhdG9yKyAoY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRz LCBBbGxvY2F0b3I+JiBsaHMsIGNoYXJUIHJocykKewogIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPiBzdHIgKGxocyk7CiAgc3RyLmFwcGVuZCAoMSwgcmhzKTsKICByZXR1 cm4gc3RyOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxs b2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcj09IChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgICBjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAobGhzLmNvbXBhcmUgKHJocykg PT0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxv Y2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yPT0gKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJh c2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChy aHMuY29tcGFyZSAobGhzKSA9PSAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0 cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I9PSAoY29uc3QgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGNoYXJUKiBy aHMpCnsKICByZXR1cm4gKGxocy5jb21wYXJlIChyaHMpID09IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVy YXRvciE9IChjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFp dHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAocmhzLmNvbXBhcmUgKGxocykgIT0gMCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+ CmlubGluZSBib29sCm9wZXJhdG9yIT0gKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0 cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKQp7CiAgcmV0dXJuIChsaHMuY29t cGFyZSAocmhzKSAhPSAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMs IGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJp bmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgICBjb25zdCBiYXNpY19zdHJp bmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAobGhzLmNvbXBh cmUgKHJocykgPCAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNs YXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8IChjb25zdCBjaGFyVCogbGhzLCBj b25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJl dHVybiAocmhzLmNvbXBhcmUgKGxocykgPiAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBj bGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8IChjb25z dCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hh clQqIHJocykKewogIHJldHVybiAobGhzLmNvbXBhcmUgKHJocykgPCAwKTsKfQoKdGVtcGxhdGUg PGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wK b3BlcmF0b3I+IChjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0 cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAocmhzLmNvbXBhcmUgKGxocykgPCAw KTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRv cj4KaW5saW5lIGJvb2wKb3BlcmF0b3I+IChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFp dHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykKewogIHJldHVybiAobGhzLmNv bXBhcmUgKHJocykgPiAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMs IGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8PSAoY29uc3QgY2hhclQqIGxo cywgY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpCnsK ICByZXR1cm4gKHJocy5jb21wYXJlIChsaHMpID49IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hh clQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcjw9 IChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29u c3QgY2hhclQqIHJocykKewogIHJldHVybiAobGhzLmNvbXBhcmUgKHJocykgPD0gMCk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGlu ZSBib29sCm9wZXJhdG9yPj0gKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZyA8 Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChyaHMuY29tcGFyZSAo bGhzKSA8PSAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNz IEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I+PSAoY29uc3QgYmFzaWNfc3RyaW5nIDxj aGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGNoYXJUKiByaHMpCnsKICByZXR1 cm4gKGxocy5jb21wYXJlIChyaHMpID49IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNs YXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvciE9IChjb25z dCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgICBjb25z dCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVy biAobGhzLmNvbXBhcmUgKHJocykgIT0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xh c3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yPiAoY29uc3Qg YmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsCgkgICBjb25zdCBi YXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAo bGhzLmNvbXBhcmUgKHJocykgPiAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0 cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8PSAoY29uc3QgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsCgkgICAgY29uc3QgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpCnsKICByZXR1cm4gKGxo cy5jb21wYXJlIChyaHMpIDw9IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRy YWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcj49IChjb25zdCBiYXNp Y19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgICBjb25zdCBiYXNp Y19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAobGhz LmNvbXBhcmUgKHJocykgPj0gMCk7Cn0KCmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnRl bXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+IGlzdHJl YW0mCm9wZXJhdG9yPj4gKGlzdHJlYW0mLCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFs bG9jYXRvcj4mKTsKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFs bG9jYXRvcj4gb3N0cmVhbSYKb3BlcmF0b3I8PCAob3N0cmVhbSYsIGNvbnN0IGJhc2ljX3N0cmlu ZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYpOwp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNs YXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPiBpc3RyZWFtJgpnZXRsaW5lIChpc3RyZWFtJiwg YmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiwgY2hhclQgZGVsaW0gPSAn XG4nKTsKCn0gIAoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL2Jhc3RyaW5nLmNjIiAxIDMKIAogCgogCiAKIAogCiAK CiAKIAogCiAKCiAKIAogCgogCiAKIAogCiAKCiAKIAoKZXh0ZXJuICJDKysiIHsKdGVtcGxhdGUg PGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIHZvaWQg KiBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcDo6Cm9wZXJhdG9y IG5ldyAoc2l6ZV90IHMsIHNpemVfdCBleHRyYSkKewogIHJldHVybiBBbGxvY2F0b3I6OmFsbG9j YXRlKHMgKyBleHRyYSAqIHNpemVvZiAoY2hhclQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJU LCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIHZvaWQgYmFzaWNfc3RyaW5n IDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpSZXA6OgpvcGVyYXRvciBkZWxldGUgKHZvaWQg KiBwdHIpCnsKICBBbGxvY2F0b3I6OmRlYWxsb2NhdGUocHRyLCBzaXplb2YoUmVwKSArCgkJCXJl aW50ZXJwcmV0X2Nhc3Q8UmVwICo+KHB0ciktPnJlcyAqCgkJCXNpemVvZiAoY2hhclQpKTsKfQoK dGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5s aW5lIHNpemVfdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcDo6 CmZyb2Jfc2l6ZSAoc2l6ZV90IHMpCnsKICBzaXplX3QgaSA9IDE2OwogIHdoaWxlIChpIDwgcykg aSAqPSAyOwogIHJldHVybiBpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0 cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+OjpSZXAgKgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46 OlJlcDo6CmNyZWF0ZSAoc2l6ZV90IGV4dHJhKQp7CiAgZXh0cmEgPSBmcm9iX3NpemUgKGV4dHJh ICsgMSk7CiAgUmVwICpwID0gbmV3IChleHRyYSkgUmVwOwogIHAtPnJlcyA9IGV4dHJhOwogIHAt PnJlZiA9IDE7CiAgcC0+c2VsZmlzaCA9IGZhbHNlOwogIHJldHVybiBwOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpjaGFyVCAqIGJhc2lj X3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6UmVwOjoKY2xvbmUgKCkKewogIFJl cCAqcCA9IFJlcDo6Y3JlYXRlIChsZW4pOwogIHAtPmNvcHkgKDAsIGRhdGEgKCksIGxlbik7CiAg cC0+bGVuID0gbGVuOwogIHJldHVybiBwLT5kYXRhICgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hh clQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbCBiYXNpY19zdHJp bmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcDo6CmV4Y2Vzc19zbG9wIChzaXplX3Qg cywgc2l6ZV90IHIpCnsKICByZXR1cm4gMiAqIChzIDw9IDE2ID8gMTYgOiBzKSA8IHI7Cn0KCnRl bXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGlu ZSBib29sIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CmNoZWNrX3Jl YWxsb2MgKGJhc2ljX3N0cmluZzo6c2l6ZV90eXBlIHMpIGNvbnN0CnsKICBzICs9IHNpemVvZiAo Y2hhclQpOwogIHJlcCAoKS0+c2VsZmlzaCA9IGZhbHNlOwogIHJldHVybiAocmVwICgpLT5yZWYg PiAxCgkgIHx8IHMgPiBjYXBhY2l0eSAoKQoJICB8fCBSZXA6OmV4Y2Vzc19zbG9wIChzLCBjYXBh Y2l0eSAoKSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3Mg QWxsb2NhdG9yPgp2b2lkIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6 CmFsbG9jIChiYXNpY19zdHJpbmc6OnNpemVfdHlwZSBfX3NpemUsIGJvb2wgX19zYXZlKQp7CiAg aWYgKCEgY2hlY2tfcmVhbGxvYyAoX19zaXplKSkKICAgIHJldHVybjsKCiAgUmVwICpwID0gUmVw OjpjcmVhdGUgKF9fc2l6ZSk7CgogIGlmIChfX3NhdmUpCiAgICB7CiAgICAgIHAtPmNvcHkgKDAs IGRhdGEgKCksIGxlbmd0aCAoKSk7CiAgICAgIHAtPmxlbiA9IGxlbmd0aCAoKTsKICAgIH0KICBl bHNlCiAgICBwLT5sZW4gPSAwOwoKICByZXB1cCAocCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFy VCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPiYKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ OjoKcmVwbGFjZSAoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwKCSBjb25zdCBiYXNpY19z dHJpbmcmIF9zdHIsIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbjIpCnsKICBjb25zdCBzaXpl X3QgbGVuMiA9IF9zdHIubGVuZ3RoICgpOwoKICBpZiAocG9zMSA9PSAwICYmIG4xID49IGxlbmd0 aCAoKSAmJiBwb3MyID09IDAgJiYgbjIgPj0gbGVuMikKICAgIHJldHVybiBvcGVyYXRvcj0gKF9z dHIpOwoKICBkbyB7IGlmICggcG9zMiA+IGxlbjIgKSBfX291dF9vZl9yYW5nZSAoInBvczIgPiBs ZW4yIik7IH0gd2hpbGUgKDApIDsKCiAgaWYgKG4yID4gbGVuMiAtIHBvczIpCiAgICBuMiA9IGxl bjIgLSBwb3MyOwoKICByZXR1cm4gcmVwbGFjZSAocG9zMSwgbjEsIF9zdHIuZGF0YSAoKSArIHBv czIsIG4yKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFs bG9jYXRvcj4KaW5saW5lIHZvaWQgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+OjpSZXA6Ogpjb3B5IChzaXplX3QgcG9zLCBjb25zdCBjaGFyVCAqcywgc2l6ZV90IG4pCnsK ICBpZiAobikKICAgIHRyYWl0czo6Y29weSAoZGF0YSAoKSArIHBvcywgcywgbik7Cn0KCnRlbXBs YXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSB2 b2lkIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6UmVwOjoKbW92ZSAo c2l6ZV90IHBvcywgY29uc3QgY2hhclQgKnMsIHNpemVfdCBuKQp7CiAgaWYgKG4pCiAgICB0cmFp dHM6Om1vdmUgKGRhdGEgKCkgKyBwb3MsIHMsIG4pOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQs IGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFp dHMsIEFsbG9jYXRvcj4mCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6 CnJlcGxhY2UgKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwgY29uc3QgY2hhclQqIHMsIHNp emVfdHlwZSBuMikKewogIGNvbnN0IHNpemVfdHlwZSBsZW4gPSBsZW5ndGggKCk7CiAgZG8geyBp ZiAoIHBvcyA+IGxlbiApIF9fb3V0X29mX3JhbmdlICgicG9zID4gbGVuIik7IH0gd2hpbGUgKDAp IDsKICBpZiAobjEgPiBsZW4gLSBwb3MpCiAgICBuMSA9IGxlbiAtIHBvczsKICBkbyB7IGlmICgg bGVuIC0gbjEgPiBtYXhfc2l6ZSAoKSAtIG4yICkgX19sZW5ndGhfZXJyb3IgKCJsZW4gLSBuMSA+ IG1heF9zaXplICgpIC0gbjIiKTsgfSB3aGlsZSAoMCkgOwogIHNpemVfdCBuZXdsZW4gPSBsZW4g LSBuMSArIG4yOwoKICBpZiAoY2hlY2tfcmVhbGxvYyAobmV3bGVuKSkKICAgIHsKICAgICAgUmVw ICpwID0gUmVwOjpjcmVhdGUgKG5ld2xlbik7CiAgICAgIHAtPmNvcHkgKDAsIGRhdGEgKCksIHBv cyk7CiAgICAgIHAtPmNvcHkgKHBvcyArIG4yLCBkYXRhICgpICsgcG9zICsgbjEsIGxlbiAtIChw b3MgKyBuMSkpOwogICAgICBwLT5jb3B5IChwb3MsIHMsIG4yKTsKICAgICAgcmVwdXAgKHApOwog ICAgfQogIGVsc2UKICAgIHsKICAgICAgcmVwICgpLT5tb3ZlIChwb3MgKyBuMiwgZGF0YSAoKSAr IHBvcyArIG4xLCBsZW4gLSAocG9zICsgbjEpKTsKICAgICAgcmVwICgpLT5jb3B5IChwb3MsIHMs IG4yKTsKICAgIH0KICByZXAgKCktPmxlbiA9IG5ld2xlbjsKCiAgcmV0dXJuICp0aGlzOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxp bmUgdm9pZCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcDo6CnNl dCAoc2l6ZV90IHBvcywgY29uc3QgY2hhclQgYywgc2l6ZV90IG4pCnsKICB0cmFpdHM6OnNldCAg KGRhdGEgKCkgKyBwb3MsIGMsIG4pOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRy YWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9j YXRvcj4mIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CnJlcGxhY2Ug KHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwgc2l6ZV90eXBlIG4yLCBjaGFyVCBjKQp7CiAg Y29uc3Qgc2l6ZV90IGxlbiA9IGxlbmd0aCAoKTsKICBkbyB7IGlmICggcG9zID4gbGVuICkgX19v dXRfb2ZfcmFuZ2UgKCJwb3MgPiBsZW4iKTsgfSB3aGlsZSAoMCkgOwogIGlmIChuMSA+IGxlbiAt IHBvcykKICAgIG4xID0gbGVuIC0gcG9zOwogIGRvIHsgaWYgKCBsZW4gLSBuMSA+IG1heF9zaXpl ICgpIC0gbjIgKSBfX2xlbmd0aF9lcnJvciAoImxlbiAtIG4xID4gbWF4X3NpemUgKCkgLSBuMiIp OyB9IHdoaWxlICgwKSA7CiAgc2l6ZV90IG5ld2xlbiA9IGxlbiAtIG4xICsgbjI7CgogIGlmIChj aGVja19yZWFsbG9jIChuZXdsZW4pKQogICAgewogICAgICBSZXAgKnAgPSBSZXA6OmNyZWF0ZSAo bmV3bGVuKTsKICAgICAgcC0+Y29weSAoMCwgZGF0YSAoKSwgcG9zKTsKICAgICAgcC0+Y29weSAo cG9zICsgbjIsIGRhdGEgKCkgKyBwb3MgKyBuMSwgbGVuIC0gKHBvcyArIG4xKSk7CiAgICAgIHAt PnNldCAgKHBvcywgYywgbjIpOwogICAgICByZXB1cCAocCk7CiAgICB9CiAgZWxzZQogICAgewog ICAgICByZXAgKCktPm1vdmUgKHBvcyArIG4yLCBkYXRhICgpICsgcG9zICsgbjEsIGxlbiAtIChw b3MgKyBuMSkpOwogICAgICByZXAgKCktPnNldCAgKHBvcywgYywgbjIpOwogICAgfQogIHJlcCAo KS0+bGVuID0gbmV3bGVuOwoKICByZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFy VCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CnZvaWQgYmFzaWNfc3RyaW5nIDxjaGFy VCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKcmVzaXplIChzaXplX3R5cGUgbiwgY2hhclQgYykKewog IGRvIHsgaWYgKCBuID4gbWF4X3NpemUgKCkgKSBfX2xlbmd0aF9lcnJvciAoIm4gPiBtYXhfc2l6 ZSAoKSIpOyB9IHdoaWxlICgwKSA7CgogIGlmIChuID4gbGVuZ3RoICgpKQogICAgYXBwZW5kIChu IC0gbGVuZ3RoICgpLCBjKTsKICBlbHNlCiAgICBlcmFzZSAobik7Cn0KCnRlbXBsYXRlIDxjbGFz cyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hh clQsIHRyYWl0cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPjo6CmNvcHkgKGNoYXJUKiBzLCBzaXplX3R5cGUgbiwgc2l6ZV90eXBl IHBvcykgY29uc3QKewogIGRvIHsgaWYgKCBwb3MgPiBsZW5ndGggKCkgKSBfX291dF9vZl9yYW5n ZSAoInBvcyA+IGxlbmd0aCAoKSIpOyB9IHdoaWxlICgwKSA7CgogIGlmIChuID4gbGVuZ3RoICgp IC0gcG9zKQogICAgbiA9IGxlbmd0aCAoKSAtIHBvczsKCiAgdHJhaXRzOjpjb3B5IChzLCBkYXRh ICgpICsgcG9zLCBuKTsKICByZXR1cm4gbjsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFz cyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+OjoKZmluZCAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBj b25zdAp7CiAgc2l6ZV90IHhwb3MgPSBwb3M7CiAgZm9yICg7IHhwb3MgKyBuIDw9IGxlbmd0aCAo KTsgKyt4cG9zKQogICAgaWYgKHRyYWl0czo6ZXEgKGRhdGEgKCkgW3hwb3NdLCAqcykKCSYmIHRy YWl0czo6Y29tcGFyZSAoZGF0YSAoKSArIHhwb3MsIHMsIG4pID09IDApCiAgICAgIHJldHVybiB4 cG9zOwogIHJldHVybiBucG9zOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0 cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+OjoKX2ZpbmQgKGNvbnN0IGNoYXJUKiBwdHIsIGNoYXJUIGMsIHNpemVfdHlwZSB4cG9zLCBz aXplX3R5cGUgbGVuKQp7CiAgZm9yICg7IHhwb3MgPCBsZW47ICsreHBvcykKICAgIGlmICh0cmFp dHM6OmVxIChwdHIgW3hwb3NdLCBjKSkKICAgICAgcmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5wb3M7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+ CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2lj X3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CmZpbmQgKGNoYXJUIGMsIHNpemVf dHlwZSBwb3MpIGNvbnN0CnsKICByZXR1cm4gX2ZpbmQgKGRhdGEgKCksIGMsIHBvcywgbGVuZ3Ro ICgpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9j YXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5cGUK YmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKcmZpbmQgKGNvbnN0IGNo YXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QKewogIGlmIChuID4gbGVu Z3RoICgpKQogICAgcmV0dXJuIG5wb3M7CgogIHNpemVfdCB4cG9zID0gbGVuZ3RoICgpIC0gbjsK ICBpZiAoeHBvcyA+IHBvcykKICAgIHhwb3MgPSBwb3M7CgogIGZvciAoKyt4cG9zOyB4cG9zLS0g PiAwOyApCiAgICBpZiAodHJhaXRzOjplcSAoZGF0YSAoKSBbeHBvc10sICpzKQoJJiYgdHJhaXRz Ojpjb21wYXJlIChkYXRhICgpICsgeHBvcywgcywgbikgPT0gMCkKICAgICAgcmV0dXJuIHhwb3M7 CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBj bGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6 c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CnJmaW5k IChjaGFyVCBjLCBzaXplX3R5cGUgcG9zKSBjb25zdAp7CiAgaWYgKDEgPiBsZW5ndGggKCkpCiAg ICByZXR1cm4gbnBvczsKCiAgc2l6ZV90IHhwb3MgPSBsZW5ndGggKCkgLSAxOwogIGlmICh4cG9z ID4gcG9zKQogICAgeHBvcyA9IHBvczsKCiAgZm9yICgrK3hwb3M7IHhwb3MtLSA+IDA7ICkKICAg IGlmICh0cmFpdHM6OmVxIChkYXRhICgpIFt4cG9zXSwgYykpCiAgICAgIHJldHVybiB4cG9zOwog IHJldHVybiBucG9zOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xh c3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OnNp emVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OgpmaW5kX2Zp cnN0X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0 CnsKICBzaXplX3QgeHBvcyA9IHBvczsKICBmb3IgKDsgeHBvcyA8IGxlbmd0aCAoKTsgKyt4cG9z KQogICAgaWYgKF9maW5kIChzLCBkYXRhICgpIFt4cG9zXSwgMCwgbikgIT0gbnBvcykKICAgICAg cmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xh c3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2Nh dG9yPjo6CmZpbmRfbGFzdF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVf dHlwZSBuKSBjb25zdAp7CiAgaWYgKGxlbmd0aCgpID09IDApCiAgICByZXR1cm4gbnBvczsKICBz aXplX3QgeHBvcyA9IGxlbmd0aCAoKSAtIDE7CiAgaWYgKHhwb3MgPiBwb3MpCiAgICB4cG9zID0g cG9zOwogIGZvciAoKyt4cG9zOyB4cG9zLS0gPiAwOykKICAgIGlmIChfZmluZCAocywgZGF0YSAo KSBbeHBvc10sIDAsIG4pICE9IG5wb3MpCiAgICAgIHJldHVybiB4cG9zOwogIHJldHVybiBucG9z Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9y PgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OnNpemVfdHlwZQpiYXNp Y19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OgpmaW5kX2ZpcnN0X25vdF9vZiAo Y29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdAp7CiAgc2l6 ZV90IHhwb3MgPSBwb3M7CiAgZm9yICg7IHhwb3MgPCBsZW5ndGggKCk7ICsreHBvcykKICAgIGlm IChfZmluZCAocywgZGF0YSAoKSBbeHBvc10sIDAsIG4pID09IG5wb3MpCiAgICAgIHJldHVybiB4 cG9zOwogIHJldHVybiBucG9zOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0 cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRv cj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46Ogpm aW5kX2ZpcnN0X25vdF9vZiAoY2hhclQgYywgc2l6ZV90eXBlIHBvcykgY29uc3QKewogIHNpemVf dCB4cG9zID0gcG9zOwogIGZvciAoOyB4cG9zIDwgbGVuZ3RoICgpOyArK3hwb3MpCiAgICBpZiAo dHJhaXRzOjpuZSAoZGF0YSAoKSBbeHBvc10sIGMpKQogICAgICByZXR1cm4geHBvczsKICByZXR1 cm4gbnBvczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFs bG9jYXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5 cGUKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKZmluZF9sYXN0X25v dF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdAp7 CiAgaWYgKGxlbmd0aCgpID09IDApCiAgICByZXR1cm4gbnBvczsKICBzaXplX3QgeHBvcyA9IGxl bmd0aCAoKSAtIDE7CiAgaWYgKHhwb3MgPiBwb3MpCiAgICB4cG9zID0gcG9zOwogIGZvciAoKyt4 cG9zOyB4cG9zLS0gPiAwOykKICAgIGlmIChfZmluZCAocywgZGF0YSAoKSBbeHBvc10sIDAsIG4p ID09IG5wb3MpCiAgICAgIHJldHVybiB4cG9zOwogIHJldHVybiBucG9zOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcg PGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj46OgpmaW5kX2xhc3Rfbm90X29mIChjaGFyVCBjLCBzaXplX3R5 cGUgcG9zKSBjb25zdAp7CiAgaWYgKGxlbmd0aCgpID09IDApCiAgICByZXR1cm4gbnBvczsKICBz aXplX3QgeHBvcyA9IGxlbmd0aCAoKSAtIDE7CiAgaWYgKHhwb3MgPiBwb3MpCiAgICB4cG9zID0g cG9zOwogIGZvciAoKyt4cG9zOyB4cG9zLS0gPiAwOykKICAgIGlmICh0cmFpdHM6Om5lIChkYXRh ICgpIFt4cG9zXSwgYykpCiAgICAgIHJldHVybiB4cG9zOwogIHJldHVybiBucG9zOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbnQgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKY29tcGFyZSAoY29uc3QgYmFz aWNfc3RyaW5nJiBfc3RyLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QKewogIGRv IHsgaWYgKCBwb3MgPiBsZW5ndGggKCkgKSBfX291dF9vZl9yYW5nZSAoInBvcyA+IGxlbmd0aCAo KSIpOyB9IHdoaWxlICgwKSA7CgogIHNpemVfdCBybGVuID0gbGVuZ3RoICgpIC0gcG9zOwogIGlm IChybGVuID4gbikKICAgIHJsZW4gPSBuOwogIGlmIChybGVuID4gX3N0ci5sZW5ndGggKCkpCiAg ICBybGVuID0gX3N0ci5sZW5ndGggKCk7CiAgaW50IHIgPSB0cmFpdHM6OmNvbXBhcmUgKGRhdGEg KCkgKyBwb3MsIF9zdHIuZGF0YSAoKSwgcmxlbik7CiAgaWYgKHIgIT0gMCkKICAgIHJldHVybiBy OwogIGlmIChybGVuID09IG4pCiAgICByZXR1cm4gMDsKICByZXR1cm4gKGxlbmd0aCAoKSAtIHBv cykgLSBfc3RyLmxlbmd0aCAoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFp dHMsIGNsYXNzIEFsbG9jYXRvcj4KaW50IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPjo6CmNvbXBhcmUgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5 cGUgbikgY29uc3QKewogIGRvIHsgaWYgKCBwb3MgPiBsZW5ndGggKCkgKSBfX291dF9vZl9yYW5n ZSAoInBvcyA+IGxlbmd0aCAoKSIpOyB9IHdoaWxlICgwKSA7CgogIHNpemVfdCBybGVuID0gbGVu Z3RoICgpIC0gcG9zOwogIGlmIChybGVuID4gbikKICAgIHJsZW4gPSBuOwogIGludCByID0gdHJh aXRzOjpjb21wYXJlIChkYXRhICgpICsgcG9zLCBzLCBybGVuKTsKICBpZiAociAhPSAwKQogICAg cmV0dXJuIHI7CiAgcmV0dXJuIChsZW5ndGggKCkgLSBwb3MpIC0gbjsKfQoKCgp0ZW1wbGF0ZSA8 Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppc3RyZWFtICYKb3Bl cmF0b3I+PiAoaXN0cmVhbSAmaXMsIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2Nh dG9yPiAmcykKewogIGludCB3ID0gaXMud2lkdGggKDApOwogIGlmIChpcy5pcGZ4MCAoKSkKICAg IHsKICAgICAgcmVnaXN0ZXIgc3RyZWFtYnVmICpzYiA9IGlzLnJkYnVmICgpOwogICAgICBzLnJl c2l6ZSAoMCk7CiAgICAgIHdoaWxlICgxKQoJewoJICBpbnQgY2ggPSBzYi0+c2J1bXBjICgpOwoJ ICBpZiAoY2ggPT0gKC0xKSApCgkgICAgewoJICAgICAgaXMuc2V0c3RhdGUgKGlvczo6ZW9mYml0 KTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgZWxzZSBpZiAodHJhaXRzOjppc19kZWwgKGNoKSkK CSAgICB7CgkgICAgICBzYi0+c3VuZ2V0YyAoKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgcyAr PSBzdGF0aWNfY2FzdDxjaGFyVD4gKGNoKTsKCSAgaWYgKC0tdyA9PSAxKQoJICAgIGJyZWFrOwoJ fQogICAgfQoKICBpcy5pc2Z4ICgpOwogIGlmIChzLmxlbmd0aCAoKSA9PSAwKQogICAgaXMuc2V0 c3RhdGUgKGlvczo6ZmFpbGJpdCk7CgogIHJldHVybiBpczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNo YXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4Kb3N0cmVhbSAmCm9wZXJhdG9yPDwg KG9zdHJlYW0gJm8sIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y PiYgcykKewogIHJldHVybiBvLndyaXRlIChzLmRhdGEgKCksIHMubGVuZ3RoICgpKTsKfQoKdGVt cGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaXN0cmVh bSYKZ2V0bGluZSAoaXN0cmVhbSAmaXMsIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPiYgcywgY2hhclQgZGVsaW0pCnsKICBpZiAoaXMuaXBmeDEgKCkpCiAgICB7CiAgICAg IHNpemVfdCAgIGNvdW50ID0gMDsKICAgICAgc3RyZWFtYnVmICpzYiA9IGlzLnJkYnVmICgpOwog ICAgICBzLnJlc2l6ZSAoMCk7CgogICAgICB3aGlsZSAoMSkKCXsKCSAgaW50IGNoID0gc2ItPnNi dW1wYyAoKTsKCSAgaWYgKGNoID09ICgtMSkgKQoJICAgIHsKCSAgICAgIGlzLnNldHN0YXRlIChj b3VudCA9PSAwCgkJCSAgID8gKGlvczo6ZmFpbGJpdHxpb3M6OmVvZmJpdCkKCQkJICAgOiBpb3M6 OmVvZmJpdCk7CgkgICAgICBicmVhazsKCSAgICB9CgoJICArK2NvdW50OwoKCSAgaWYgKGNoID09 IGRlbGltKQoJICAgIGJyZWFrOwoKCSAgcyArPSBzdGF0aWNfY2FzdDxjaGFyVD4gKGNoKTsKCgkg IGlmIChzLmxlbmd0aCAoKSA9PSBzLm5wb3MgLSAxKQoJICAgIHsKCSAgICAgIGlzLnNldHN0YXRl IChpb3M6OmZhaWxiaXQpOwoJICAgICAgYnJlYWs7CgkgICAgfQoJfQogICAgfQoKICAgCiAgIAog IGlzLmlzZnggKCk7CgogIHJldHVybiBpczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFz cyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+OjpSZXAKYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46Om5p bFJlcCA9IHsgMCwgMCwgMSwgZmFsc2UgfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3Mg dHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0 cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPjo6bnBvczsKCn0gIAojIDY1MyAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIu OTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmluZy5oIiAyIDMKCgoKIyA2 ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RyaW5nIiAyIDMKCgpleHRlcm4gIkMrKyIgewp0eXBlZGVmIGJhc2ljX3N0cmluZyA8 Y2hhcj4gc3RyaW5nOwoKCgp9ICAKCgojIDEwICIuLi90b29sYm94L3RieEZvcm11bGEuaCIgMgoK CiAKCiAKCgoKCgoKCmNsYXNzIHRieF9Gb3JtdWxhIHsKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0 b3I8PChvc3RyZWFtJiBvcywgY29uc3QgdGJ4X0Zvcm11bGEmIGZvcm11bGEpOwoKcHVibGljOgog ICAKCiAgdGJ4X0Zvcm11bGEoY29uc3QgY2hhciogZm9ybXVsYSk7CgogICAKCiAgdGJ4X0Zvcm11 bGEoY29uc3QgdGJ4X0Zvcm11bGEmIGZybSk7CgogICAKCgoKCgoKICB2aXJ0dWFsIHRieF9Gb3Jt dWxhKiBjbG9uZSgpIGNvbnN0OwoKICB2aXJ0dWFsIH50YnhfRm9ybXVsYSgpOwoKICAgCgoKICB2 aXJ0dWFsIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAgCgogIHZpcnR1YWwg dGJ4X0Zvcm11bGEmIG9wZXJhdG9yPShjb25zdCB0YnhfRm9ybXVsYSYgZnJtKTsKCiAgIAoKICB2 aXJ0dWFsIHJlYWwgb3BlcmF0b3IoKSAoY29uc3QgcmVhbCBwKSBjb25zdDsKCiAgIAoKICB2aXJ0 dWFsIHJlYWwgb3BlcmF0b3IoKSAoY29uc3QgUmVhbDJkJiBwKSBjb25zdDsKCiAgIAoKICB2aXJ0 dWFsIHJlYWwgb3BlcmF0b3IoKSAoY29uc3QgUmVhbDNkJiBwKSBjb25zdDsKCnByaXZhdGU6CiAg IAogIHVjaGFyKiBwZ21fOwoKICAgCiAgdWludCBsZW5fOwoKICAgCiAgc3RyaW5nIGZvcm11bGFf Owp9OwoKaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IHRieF9G b3JtdWxhJiBmb3JtdWxhKSB7CiAgcmV0dXJuIGZvcm11bGEuaW5mbyhvcyk7Cn0KCgojIDkgIi4u L3Rvb2xib3gvdGJ4Qm91bmRhcnkuaCIgMgoKCiAKCiAKCgoKCgoKCmNsYXNzIHRieF9Cb3VuZGFy eSB7CiAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IHRieF9C b3VuZGFyeSYgYm91bmRhcnkpOwoKcHVibGljOgogICAKICBlbnVtIGJvdW5kYXJ5VHlwZXMgeyBG UkVFID0gMCwgRElSSUNITEVULCBORVVNQU5OLCBNQVhfVFlQRSB9OwoKICAgCgogIHRieF9Cb3Vu ZGFyeSgpOwoKICAgCgoKCgoKCgoKCiAgdGJ4X0JvdW5kYXJ5KGNvbnN0IGVudW0gYm91bmRhcnlU eXBlcyB0eXBlLCBjb25zdCBjaGFyKiBmcm0pOwoKICAgCgoKCgoKCgoKCgoKCgoKICB0YnhfQm91 bmRhcnkoY29uc3QgZW51bSBib3VuZGFyeVR5cGVzIHR5cGUsIGNvbnN0IHRieF9Gb3JtdWxhJiBm cm0pOwoKICAgCgogIHRieF9Cb3VuZGFyeShjb25zdCB0YnhfQm91bmRhcnkmIGJuZCk7CgogIHZp cnR1YWwgfnRieF9Cb3VuZGFyeSgpOwoKICAgCiAgaW5saW5lIGNvbnN0IGVudW0gYm91bmRhcnlU eXBlcyB0eXBlKCkgY29uc3Q7CgogICAKCiAgdmlydHVhbCB0YnhfQm91bmRhcnkmIG9wZXJhdG9y PShjb25zdCB0YnhfQm91bmRhcnkmIGJuZCk7CgogICAKCiAgaW5saW5lIGNvbnN0IHJlYWwgb3Bl cmF0b3IoKShjb25zdCByZWFsIHgpIGNvbnN0OwoKICAgCgogIGlubGluZSBjb25zdCByZWFsIG9w ZXJhdG9yKCkoY29uc3QgUmVhbDJkJiB4KSBjb25zdDsKCiAgIAoKICBpbmxpbmUgY29uc3QgcmVh bCBvcGVyYXRvcigpKGNvbnN0IFJlYWwzZCYgeCkgY29uc3Q7CgogICAKICB2aXJ0dWFsIG9zdHJl YW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKcHJpdmF0ZToKICAgCiAgZW51bSBib3VuZGFy eVR5cGVzIHR5cGVfOwoKICAgCiAgY29uc3QgdGJ4X0Zvcm11bGEqIGZybV87Cn07CgppbmxpbmUg b3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgdGJ4X0JvdW5kYXJ5JiBib3Vu ZGFyeSkgewoKICByZXR1cm4gYm91bmRhcnkuaW5mbyhvcyk7Cn0KCmNvbnN0IGVudW0gdGJ4X0Jv dW5kYXJ5Ojpib3VuZGFyeVR5cGVzIHRieF9Cb3VuZGFyeTo6dHlwZSgpIGNvbnN0IHsKCiAgcmV0 dXJuIHR5cGVfOwp9Cgpjb25zdCByZWFsIHRieF9Cb3VuZGFyeTo6b3BlcmF0b3IoKShjb25zdCBy ZWFsIHgpIGNvbnN0IHsKCiAgaWYgKGZybV8pIHsKICAgIHJldHVybiAoKmZybV8pKHgpOwogIH0g ZWxzZSB7CiAgICByZXR1cm4gMC4wOwogIH0KfQoKY29uc3QgcmVhbCB0YnhfQm91bmRhcnk6Om9w ZXJhdG9yKCkoY29uc3QgUmVhbDJkJiB4KSBjb25zdCB7CgogIGlmIChmcm1fKSB7CiAgICByZXR1 cm4gKCpmcm1fKSh4KTsKICB9IGVsc2UgewogICAgcmV0dXJuIDAuMDsKICB9Cn0KCmNvbnN0IHJl YWwgdGJ4X0JvdW5kYXJ5OjpvcGVyYXRvcigpKGNvbnN0IFJlYWwzZCYgeCkgY29uc3QgewoKICBp ZiAoZnJtXykgewogICAgcmV0dXJuICgqZnJtXykoeCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiAw LjA7CiAgfQp9CgoKIyA5ICJ0YnhCb3VuZGFyeTIuaCIgMgoKCmV4dGVybiB0YnhfRm9ybXVsYSBm ZmZmOwoKCmNsYXNzIHRieF9Cb3VuZGFyeTIgewogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8 KG9zdHJlYW0mIG9zLCBjb25zdCB0YnhfQm91bmRhcnkyJiBib3VuZGFyeSk7CiBwdWJsaWM6CiAg dGJ4X0JvdW5kYXJ5IHg7CiAgdGJ4X0JvdW5kYXJ5IHk7CgogICAKCiAgdGJ4X0JvdW5kYXJ5Migp OiB4KCksIHkoKSB7fTsKICB0YnhfQm91bmRhcnkyKGNvbnN0IGVudW0gdGJ4X0JvdW5kYXJ5Ojpi b3VuZGFyeVR5cGVzIHR5cFgsIGNvbnN0IGNoYXIqIGZvcm1YLAoJCWNvbnN0IGVudW0gdGJ4X0Jv dW5kYXJ5Ojpib3VuZGFyeVR5cGVzIHR5cFksIGNvbnN0IGNoYXIqIGZvcm1ZKSA6CiAgICAgICAg ICAgICAgICAgIHgodHlwWCwgZm9ybVgpLCB5KHR5cFksIGZvcm1ZKSB7fTsKCiAgdGJ4X0JvdW5k YXJ5Mihjb25zdCBlbnVtIHRieF9Cb3VuZGFyeTo6Ym91bmRhcnlUeXBlcyB0eXBYLCBjb25zdCB0 YnhfRm9ybXVsYSYgZnJtWCwKCQljb25zdCBlbnVtIHRieF9Cb3VuZGFyeTo6Ym91bmRhcnlUeXBl cyB0eXBZLCBjb25zdCB0YnhfRm9ybXVsYSYgZnJtWSkgOgogICAgICAgICAgICAgICAgICAgIHgo dHlwWCwgZmZmZiksIHkodHlwWSwgZmZmZikge307CgogICAKCiAgdGJ4X0JvdW5kYXJ5Mihjb25z dCB0YnhfQm91bmRhcnkyJiBibmQpIDogeChibmQueCksIHkoYm5kLnkpIHt9OwoKICB2aXJ0dWFs IH50YnhfQm91bmRhcnkyKCkge307CgogICAKICBpbmxpbmUgdmlydHVhbCBvc3RyZWFtJiBpbmZv KG9zdHJlYW0mIG9zKSBjb25zdDsKCn07CgppbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3Ry ZWFtJiBvcywgY29uc3QgdGJ4X0JvdW5kYXJ5MiYgYm91bmRhcnkpIHsKICByZXR1cm4gYm91bmRh cnkuaW5mbyhvcyk7Cn0KCmlubGluZSBvc3RyZWFtJiB0YnhfQm91bmRhcnkyOjppbmZvKG9zdHJl YW0mIG9zKSBjb25zdCB7CiAgcmV0dXJuIHkuaW5mbyh4LmluZm8ob3MpIDw8ICIsIik7Cn0KCgoK CiMgMTAgImxpbmVsQm91bmRhcnkuaCIgMgoKIyAxICIuLi9nZW9tZXRyeS9nZW9TZW1hbnRpY3Mu aCIgMQogCgoKCgoKCgoKIAoKIAoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgZ2VvX1NlbWFudGlj cyB7CiAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IGdlb19T ZW1hbnRpY3M8VD4mIHMpIHsKICAgIHJldHVybiBzLmluZm8ob3MpOwogIH0KcHVibGljOgogICAK CiAgdmlydHVhbCBUIG9wZXJhdG9yKCkoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIpIGNvbnN0ID0gMDsK CiAgIAogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3QgPSAwOwp9OwoK IAoKIAoKCmNsYXNzIGdlb19Cb29sIDogcHVibGljIGdlb19TZW1hbnRpY3M8Ym9vbD4gewoKcHVi bGljOgogICAKCgogIGlubGluZSBib29sIG9wZXJhdG9yKCkoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIp IGNvbnN0Owp9OwoKaW5saW5lIGJvb2wgZ2VvX0Jvb2w6Om9wZXJhdG9yKCkoZ2VvX0F0dHJpYnV0 ZSBhdHRyaWIpIGNvbnN0IHsKICByZXR1cm4gYXR0cmliICE9IDA7Cn0KCgogCgogIAoKIyAxMSAi bGluZWxCb3VuZGFyeS5oIiAyCgoKIAoKIAoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIGxpbmVsX0Jv dW5kYXJ5Q29uZGl0aW9uIDogcHVibGljIGdlb19TZW1hbnRpY3M8dGJ4X0JvdW5kYXJ5Mj4gewoK cHVibGljOgogICAKCiAgbGluZWxfQm91bmRhcnlDb25kaXRpb24oKSA6IGJvdW5kYXJpZXNfKCkg e307CgoKICB2aXJ0dWFsIH5saW5lbF9Cb3VuZGFyeUNvbmRpdGlvbigpOwoKICAgCgoKCgoKCgog IGlubGluZSBjb25zdCB0YnhfQm91bmRhcnkyJiBvcGVyYXRvcigpIChnZW9fQXR0cmlidXRlIGF0 dHJpYik7CgogIHZpcnR1YWwgdGJ4X0JvdW5kYXJ5MiBvcGVyYXRvcigpIChnZW9fQXR0cmlidXRl IGF0dHJpYikgY29uc3Q7CgogICAKCgoKCgoKCgogIHZvaWQgYWRkKGNvbnN0IGdlb19BdHRyaWJ1 dGUmIGF0dHJpYiwgY29uc3QgdGJ4X0JvdW5kYXJ5MiYgYmNPYmplY3QpOwoKICB2aXJ0dWFsIG9z dHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0Owpwcml2YXRlOgogICAKCgogIG11dGFibGUg aGFzaF9tYXA8dWludCwgdGJ4X0JvdW5kYXJ5Mj4gYm91bmRhcmllc187Cn07Cgpjb25zdCB0Ynhf Qm91bmRhcnkyJiAKbGluZWxfQm91bmRhcnlDb25kaXRpb246Om9wZXJhdG9yKCkgKGdlb19BdHRy aWJ1dGUgYXR0cmliKSB7CiAgcmV0dXJuIGJvdW5kYXJpZXNfW2F0dHJpYi5hdHRyaWIoKV07Cn0K CgojIDkgImxpbmVsU3BhY2UuaCIgMgoKCgoKCgoKCiMgMSAiLi4vaHAvaHBTcGFjZS5oIiAxCiAK CgoKCgoKCiMgMSAiLi4vaHAvaHBCb3VuZGFyeS5oIiAxCiAKCgoKCgoKCgoKCgogCgogCgoKCgoK CgoKCgoKCgoKCgoKY2xhc3MgaHBfQm91bmRhcnlDb25kaXRpb24gOiBwdWJsaWMgZ2VvX1NlbWFu dGljczx0YnhfQm91bmRhcnk+IHsKCnB1YmxpYzoKICAgCgogIGhwX0JvdW5kYXJ5Q29uZGl0aW9u KCkgOiBib3VuZGFyaWVzXygpIHt9CgogICAKCgoKCiAgdmlydHVhbCB+aHBfQm91bmRhcnlDb25k aXRpb24oKTsKCiAgIAoKCgoKCgoKICBpbmxpbmUgY29uc3QgdGJ4X0JvdW5kYXJ5JiBvcGVyYXRv cigpIChnZW9fQXR0cmlidXRlIGF0dHJpYik7CgogIHZpcnR1YWwgdGJ4X0JvdW5kYXJ5IG9wZXJh dG9yKCkgKGdlb19BdHRyaWJ1dGUgYXR0cmliKSBjb25zdDsKCiAgIAoKCgoKCgoKCiAgdm9pZCBh ZGQoY29uc3QgZ2VvX0F0dHJpYnV0ZSYgYXR0cmliLCBjb25zdCB0YnhfQm91bmRhcnkmIGJjT2Jq ZWN0KTsKCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKcHJpdmF0 ZToKICAgCgoKICBtdXRhYmxlIGhhc2hfbWFwPHVpbnQsIHRieF9Cb3VuZGFyeT4gYm91bmRhcmll c187Cn07Cgpjb25zdCB0YnhfQm91bmRhcnkmIApocF9Cb3VuZGFyeUNvbmRpdGlvbjo6b3BlcmF0 b3IoKSAoZ2VvX0F0dHJpYnV0ZSBhdHRyaWIpIHsKCiAgcmV0dXJuIGJvdW5kYXJpZXNfW2F0dHJp Yi5hdHRyaWIoKV07Cn0KCgojIDkgIi4uL2hwL2hwU3BhY2UuaCIgMgoKCgoKCgoKCgogCgpjbGFz cyB0YnhfU2NhbjxocF9IUDJkWFhYPHJlYWw+ID4gOiBwdWJsaWMgdGJ4X1NjYW48c3BjX0VsZW1l bnQ8cmVhbD4gPiB7CnB1YmxpYzogIAogIGhwX0hQMmRYWFg8cmVhbD4mIG9wZXJhdG9yKysoaW50 KSA9IDA7Cn07CgogCnR5cGVkZWYgdGJ4X1NjYW48aHBfSFAyZFhYWDxyZWFsPiA+IGhwX0hQMmRT Y2FuOwogIAogCgogCgoKY2xhc3MgaHBfSFAyZCA6IHB1YmxpYyBzcGNfU3BhY2U8cmVhbD4gewoK cHVibGljOgogICAKCgoKCgoKCgoKICBocF9IUDJkKGdlb19NZXNoMiYgbXNoLCB1aW50IGwsIHVp bnQgcCwgaHBfQm91bmRhcnlDb25kaXRpb24qIGJjID0gX19udWxsICk7CiAgaW5saW5lIHZpcnR1 YWwgfmhwX0hQMmQoKTsKICAKICAgCiAgaW5saW5lIHVpbnQgZGltKCkgY29uc3Q7CgogIHZpcnR1 YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcywgdWludCBtb2RlID0gMCkgY29uc3Q7CgogICAK ICBpbmxpbmUgdWludCBuZWxtKCkgY29uc3Q7CgogICAKICBpbmxpbmUgaHBfSFAyZFNjYW4qIHNj YW4oKSBjb25zdDsKCiAgaW5saW5lIHNob3J0IGwoaHBfSFAyZFhYWDxyZWFsPiYgZWxtKSB7CiAg ICBBZGp1c3QmIGFkaihhZGpfW2VsbS5zdXBwb3J0KCkua2V5KCldKTsKICAgIHJldHVybiBhZGou bDsKICB9CgogICAKCgoKCgoKICB2b2lkIGFkanVzdChocF9IUDJkWFhYPHJlYWw+JiBlbG0sIGlu dCBsLCBpbnQgcCk7CgogICAKCgoKCgoKCgoKCgoKCgogIHZvaWQgcmVidWlsZCgpOwoKICAgCgog IHZpcnR1YWwgdm9pZCBza2V0Y2gob3N0cmVhbSYgb3MsIFJlYWwyZCBvZmZzZXQsIHJlYWwgc2Nh bGUsIHVpbnQgZGVsdGEgPSAyKTsKCnByb3RlY3RlZDoKICAgCgogIHN0cnVjdCBDb250cm9sIHsK ICAgICAKCgoKCgoKCgogICAgdWNoYXIgICAgICAgICB0YWc7CgogICAgIAogICAgdXNob3J0ICAg ICAgICBwOwoKICAgICAKICAgIHNwY19CRm5jSW5kZXggaWR4OwoKICAgICAKCiAgICBDb250cm9s KCkgeyB0YWcgPSAwOyB9CiAgfTsKCiAgIAoKCiAgc3RydWN0IEFkanVzdCB7CiAgICAgCgoKICAg IHNob3J0IHA7CgogICAgIAoKCiAgICBzaG9ydCBsOwoKICAgICAKCgogICAgQWRqdXN0KCkgeyBw ID0gbCA9IDA7IH0KICB9OwoKICAgCiAgZ2VvX01lc2gyJiBtc2hfOwoKICAgCiAgaHBfQm91bmRh cnlDb25kaXRpb24qIGJjXzsKCiAgIAogIHRieF9Db25uZWN0b3I8aHBfSFAyZFhYWDxyZWFsPios IDE+KiBlbG1fOwoKICAgCiAgdGJ4X0R5bkFycmF5PENvbnRyb2w+IGN0cmwwXzsKCiAgIAogIHRi eF9EeW5BcnJheTxDb250cm9sPiBjdHJsMV87CgogICAKICB0YnhfRHluQXJyYXk8Q29udHJvbD4g Y3RybDJfOwoKICAgCiAgdGJ4X0R5bkFycmF5PEFkanVzdD4gYWRqXzsKCiAgIAogIHVpbnQgZGlt XzsKCiAgIAogIHVpbnQgbmVsbV87CgogICAKICBib29sIHJlYnVpbGRfOwoKICAgCgoKCgoKCgoK CgoKICB2aXJ0dWFsIHZvaWQgcmVidWlsZDBfKGdlb19Db25uZWN0b3IyJiBjbnRyLCBpbnQgbCwg aW50JiBMLCBpbnQmIFApOwogIHZpcnR1YWwgdm9pZCByZWJ1aWxkMV8oZ2VvX1RyaWFuZ2xlMmQm IGNlbGwsIHNwY19UQ29sdW1uPHJlYWw+KiBUID0gX19udWxsICk7CiAgdmlydHVhbCB2b2lkIHJl YnVpbGQxXyhnZW9fUXVhZDJkJiBjZWxsLCBzcGNfVENvbHVtbjxyZWFsPiogVCA9IF9fbnVsbCAp OwoKICBpbmxpbmUgdm9pZCBkZWFjdGl2YXRlXyhnZW9fRWRnZSYgZWRnKTsKICBpbmxpbmUgdm9p ZCBkZWFjdGl2YXRlXyhnZW9fVmVydGV4JiB2dHgpOwp9OwoKaW5saW5lIHVpbnQgaHBfSFAyZDo6 ZGltKCkgY29uc3QgeyAKICBpZiAocmVidWlsZF8pICgoaHBfSFAyZCopdGhpcyktPnJlYnVpbGQo KTsgICAKICByZXR1cm4gZGltXzsgCn0KCmlubGluZSB1aW50IGhwX0hQMmQ6Om5lbG0oKSBjb25z dCB7IAogIGlmIChyZWJ1aWxkXykgKChocF9IUDJkKil0aGlzKS0+cmVidWlsZCgpOyAgIAogIHJl dHVybiBuZWxtXzsgCn0KCmlubGluZSBocF9IUDJkU2NhbiogaHBfSFAyZDo6c2NhbigpIGNvbnN0 IHsgCiAgaWYgKHJlYnVpbGRfKSAoKGhwX0hQMmQqKXRoaXMpLT5yZWJ1aWxkKCk7ICAgCiAgcmV0 dXJuIG5ldyB0YnhfUExpc3RTY2FuPGhwX0hQMmRYWFg8cmVhbD4gPigqZWxtXyk7Cn0KCmlubGlu ZSB2b2lkIGhwX0hQMmQ6OmRlYWN0aXZhdGVfKGdlb19FZGdlJiBlZGcpIHsKICBjdHJsMV9bZWRn LmNoaWxkKDApLT5rZXkoKV0udGFnIHw9IDI7CiAgY3RybDFfW2VkZy5jaGlsZCgxKS0+a2V5KCld LnRhZyB8PSAyOwogIGN0cmwwX1tlZGcuY2hpbGQoMSktPnZlcnRleCgwKS0+a2V5KCldLnRhZyB8 PSAyOwp9CgppbmxpbmUgdm9pZCBocF9IUDJkOjpkZWFjdGl2YXRlXyhnZW9fVmVydGV4JiB2dHgp IHsKICBjdHJsMF9bdnR4LmNoaWxkKDApLT5rZXkoKV0udGFnIHw9IDI7Cn0KCgojIDE3ICJsaW5l bFNwYWNlLmgiIDIKCgogCgogCiAKIAogCgogCiAKdHlwZWRlZiBocF9IUDJkU2NhbiBsaW5lbF9I UDJkU2NhbjsKCiAKCiAKCgpjbGFzcyBsaW5lbF9MaW5FbDJkIDogcHVibGljIHNwY19TcGFjZTxy ZWFsPiB7CgpwdWJsaWM6CiAgIAoKCgoKCgoKCgogIGxpbmVsX0xpbkVsMmQoZ2VvX01lc2gyJiBt c2gsIHVpbnQgbCwgdWludCBwLCBsaW5lbF9Cb3VuZGFyeUNvbmRpdGlvbiogYmMgPSBfX251bGwg KTsKICBpbmxpbmUgdmlydHVhbCB+bGluZWxfTGluRWwyZCgpOwogIAogICAKICBpbmxpbmUgdWlu dCBkaW0oKSBjb25zdDsKCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zLCB1aW50 IG1vZGUgPSAwKSBjb25zdDsKCiAgIAogIGlubGluZSB1aW50IG5lbG0oKSBjb25zdDsKCiAgIAog IGlubGluZSBsaW5lbF9IUDJkU2Nhbiogc2NhbigpIGNvbnN0OwoKICBpbmxpbmUgc2hvcnQgbCho cF9IUDJkWFhYPHJlYWw+JiBlbG0pIHsKICAgIEFkanVzdCYgYWRqKGFkal9bZWxtLnN1cHBvcnQo KS5rZXkoKV0pOwogICAgcmV0dXJuIGFkai5sOwogIH0KCiAgIAoKCgoKCgogIHZvaWQgYWRqdXN0 KGhwX0hQMmRYWFg8cmVhbD4mIGVsbSwgaW50IGwsIGludCBwKTsKCiAgIAoKCgoKCgoKCgoKCgoK CiAgdm9pZCByZWJ1aWxkKCk7CgogICAKCiAgdmlydHVhbCB2b2lkIHNrZXRjaChvc3RyZWFtJiBv cywgUmVhbDJkIG9mZnNldCwgcmVhbCBzY2FsZSwgdWludCBkZWx0YSA9IDIpOwoKcHJvdGVjdGVk OgogICAKCiAgc3RydWN0IENvbnRyb2wgewogICAgIAoKCgoKCgoKCiAgICB1Y2hhciAgICAgICAg IHRhZzsKCiAgICAgCiAgICB1c2hvcnQgICAgICAgIHA7CgogICAgIAogICAgc3BjX0JGbmNJbmRl eCBpZHg7CgogICAgIAoKICAgIENvbnRyb2woKSB7IHRhZyA9IDA7IH0KICB9OwoKICAgCgoKICBz dHJ1Y3QgQWRqdXN0IHsKICAgICAKCgogICAgc2hvcnQgcDsKCiAgICAgCgoKICAgIHNob3J0IGw7 CgogICAgIAoKCiAgICBBZGp1c3QoKSB7IHAgPSBsID0gMDsgfQogIH07CgogICAKICBnZW9fTWVz aDImIG1zaF87CgogICAKICBsaW5lbF9Cb3VuZGFyeUNvbmRpdGlvbiogYmNfOwoKICAgCiAgdGJ4 X0Nvbm5lY3RvcjxocF9IUDJkWFhYPHJlYWw+KiwgMT4qIGVsbV87CgogICAKICB0YnhfRHluQXJy YXk8Q29udHJvbD4gY3RybDBfOwoKICAgCiAgdGJ4X0R5bkFycmF5PENvbnRyb2w+IGN0cmwxXzsK CiAgIAogIHRieF9EeW5BcnJheTxDb250cm9sPiBjdHJsMl87CgogICAKICB0YnhfRHluQXJyYXk8 QWRqdXN0PiBhZGpfOwoKICAgCiAgdWludCBkaW1fOwoKICAgCiAgdWludCBuZWxtXzsKCiAgIAog IGJvb2wgcmVidWlsZF87CgogICAKCgoKCgoKCgoKCgogIHZpcnR1YWwgdm9pZCByZWJ1aWxkMF8o Z2VvX0Nvbm5lY3RvcjImIGNudHIsIGludCBsLCBpbnQmIEwsIGludCYgUCk7CiAgdmlydHVhbCB2 b2lkIHJlYnVpbGQxXyhnZW9fVHJpYW5nbGUyZCYgY2VsbCwgc3BjX1RDb2x1bW48cmVhbD4qIFQg PSBfX251bGwgKTsKICB2aXJ0dWFsIHZvaWQgcmVidWlsZDFfKGdlb19RdWFkMmQmIGNlbGwsIHNw Y19UQ29sdW1uPHJlYWw+KiBUID0gX19udWxsICk7CgogIGlubGluZSB2b2lkIGRlYWN0aXZhdGVf KGdlb19FZGdlJiBlZGcpOwogIGlubGluZSB2b2lkIGRlYWN0aXZhdGVfKGdlb19WZXJ0ZXgmIHZ0 eCk7Cn07CgppbmxpbmUgdWludCBsaW5lbF9MaW5FbDJkOjpkaW0oKSBjb25zdCB7IAogIGlmIChy ZWJ1aWxkXykgKChsaW5lbF9MaW5FbDJkKil0aGlzKS0+cmVidWlsZCgpOyAgIAogIHJldHVybiBk aW1fOyAKfQoKaW5saW5lIHVpbnQgbGluZWxfTGluRWwyZDo6bmVsbSgpIGNvbnN0IHsgCiAgaWYg KHJlYnVpbGRfKSAoKGxpbmVsX0xpbkVsMmQqKXRoaXMpLT5yZWJ1aWxkKCk7ICAgCiAgcmV0dXJu IG5lbG1fOyAKfQoKaW5saW5lIGxpbmVsX0hQMmRTY2FuKiBsaW5lbF9MaW5FbDJkOjpzY2FuKCkg Y29uc3QgeyAKICBpZiAocmVidWlsZF8pICgobGluZWxfTGluRWwyZCopdGhpcyktPnJlYnVpbGQo KTsgICAKICByZXR1cm4gbmV3IHRieF9QTGlzdFNjYW48aHBfSFAyZFhYWDxyZWFsPiA+KCplbG1f KTsKfQoKaW5saW5lIHZvaWQgbGluZWxfTGluRWwyZDo6ZGVhY3RpdmF0ZV8oZ2VvX0VkZ2UmIGVk ZykgewogIGN0cmwxX1tlZGcuY2hpbGQoMCktPmtleSgpXS50YWcgfD0gMjsKICBjdHJsMV9bZWRn LmNoaWxkKDEpLT5rZXkoKV0udGFnIHw9IDI7CiAgY3RybDBfW2VkZy5jaGlsZCgxKS0+dmVydGV4 KDApLT5rZXkoKV0udGFnIHw9IDI7Cn0KCmlubGluZSB2b2lkIGxpbmVsX0xpbkVsMmQ6OmRlYWN0 aXZhdGVfKGdlb19WZXJ0ZXgmIHZ0eCkgewogIGN0cmwwX1t2dHguY2hpbGQoMCktPmtleSgpXS50 YWcgfD0gMjsKfQoKCiMgMTUgImxpbmVsLmNjIiAyCgoKIyAxICJsaW5lbEJGb3JtLmgiIDEKIAoK CgoKCgoKCgoKCgoKIAoKY2xhc3MgbGluZWxfQkZvcm0gOiBwdWJsaWMgb3BfQmlsaW5lYXJGb3Jt PHJlYWw+IHsKCiBwdWJsaWM6CiAgIAoKCiAgaW5saW5lIGxpbmVsX0JGb3JtKHVpbnQgZ2F1c3Ms IHRieF9Gb3JtdWxhICptYXRtYXQpOwogIGlubGluZSB2aXJ0dWFsIH5saW5lbF9CRm9ybSgpOwoK ICAgCgoKCgoKCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBlbG1Y LCAKCQkgIGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50TWF0 cml4PHJlYWw+JiBlbSk7IAoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgaHBfSFAyZDAwMSYgZWxt WCwgY29uc3QgaHBfSFAyZDAwMSYgZWxtWSwgCgkJICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYg ZW0pOyAKCiBwcml2YXRlOgogICAKICB1aW50ICBuXzsKCiAgIAogIFJlYWwyZCogc2hwZm5jRF87 CiAKICAgCiAgdWludCBnYXVzc187CiAgCiAgIAogIGNvbnN0IHRieF9Gb3JtdWxhICptYXRtYXRf Owp9OyAKCgppbmxpbmUgbGluZWxfQkZvcm06OmxpbmVsX0JGb3JtKHVpbnQgZ2F1c3MsIHRieF9G b3JtdWxhICptYXRtYXQpewogIG5fID0gMDsgc2hwZm5jRF8gPSBfX251bGwgOwogIGdhdXNzXyA9 IGdhdXNzOwogIG1hdG1hdF8gPSBtYXRtYXQ7Cn0KCmlubGluZSBsaW5lbF9CRm9ybTo6fmxpbmVs X0JGb3JtKCkgewogIGRlbGV0ZVtdIHNocGZuY0RfOwp9IAoKCiMgMTcgImxpbmVsLmNjIiAyCgoj IDEgImxpbmVsTEZvcm0uaCIgMQogCgoKCgoKCgoKCgoKCiAKCiAKCgoKCmNsYXNzIGxpbmVsX0xG b3JtIDogcHVibGljIGZuY19MaW5lYXJGb3JtPHJlYWw+IHsKCnB1YmxpYzoKICAgCgoKCgoKCgog IGxpbmVsX0xGb3JtKGNvbnN0IHRieF9Gb3JtdWxhICZzZm9yY2UsIGNvbnN0IHRieF9Gb3JtdWxh ICZ2Zm9yY2UsCgkgICB1aW50IGdhdXNzID0gMCwgbGluZWxfQm91bmRhcnlDb25kaXRpb24qIGJj ID0gMCk7IAogIGlubGluZSB+bGluZWxfTEZvcm0oKTsKCiAgIAoKCgoKCgoKICB2b2lkIG9wZXJh dG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbSwKCQkJICBzcGNfRWxlbWVudE1hdHJp eDxyZWFsPiYgZW0pOwogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDJkMDAxJiBlbG0sIHNw Y19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7Cgpwcml2YXRlOgogICAKICBjb25zdCB0YnhfRm9y bXVsYSogc2ZvcmNlXzsKICBjb25zdCB0YnhfRm9ybXVsYSogdmZvcmNlXzsKCiAgIAogIHVpbnQg ICBnYXVzc187CgogICAKICByZWFsKiAgc2hwZm5jXzsKCiAgIAogIHVpbnQgICBuXzsKCiAgIAoK ICBsaW5lbF9Cb3VuZGFyeUNvbmRpdGlvbiogYmNfOwp9OyAKCgppbmxpbmUgbGluZWxfTEZvcm06 On5saW5lbF9MRm9ybSgpIHsKICBkZWxldGVbXSBzaHBmbmNfOwp9CgoKIyAxOCAibGluZWwuY2Mi IDIKCiMgMSAiY3JhY2tlZF9wYW5lbC5oIiAxCgoKCgoKCgoKCgogCgpjbGFzcyBjcmFja2VkX3Bh bmVsIDogcHVibGljIGdlb19NZXNoMiB7CiAgCiAgY2xhc3MgUyA6IHB1YmxpYyB0YnhfU2Nhbjxn ZW9fQ2VsbDI+IHsKCiAgICB1aW50ICAgICAgICAgICBpZHhfOwogICAgZ2VvX1F1YWQyZCAqKCYg Y2VsbF8pWzRdOwoKICAgcHVibGljOgogICAgaW5saW5lIFMoZ2VvX1F1YWQyZCAqY29uc3QoJmNl bGwpWzRdKTsgCiAgICBpbmxpbmUgUyhjb25zdCBTJiBzY2FuKTsgCiAgICAKICAgIGlubGluZSBi b29sIGVvcygpIGNvbnN0OwogICAgaW5saW5lIGdlb19DZWxsMiYgb3BlcmF0b3IrKyhpbnQpOwoK ICAgIGlubGluZSBnZW9fU2NhbjIqIGNsb25lKCkgY29uc3Q7CiAgfTsKCiAgZ2VvX1ZlcnRleCAg ICAqdnR4X1sxMF07CiAgZ2VvX0VkZ2UgICAgICAqZWRnX1sxM107CiAgZ2VvX1F1YWQgICAgICAq cWRfWzRdOwoKICBnZW9fUXVhZDJkICpjZWxsX1s0XTsKCiBwdWJsaWM6CiAgY3JhY2tlZF9wYW5l bCgpOwogIHZpcnR1YWwgfmNyYWNrZWRfcGFuZWwoKTsKCiAgaW5saW5lIHVpbnQgbmNlbGwoKSBj b25zdDsKICBpbmxpbmUgZ2VvX1NjYW4yKiBzY2FuKCkgY29uc3Q7Cn07CgppbmxpbmUgY3JhY2tl ZF9wYW5lbDo6Uzo6UyhnZW9fUXVhZDJkKiBjb25zdCgmY2VsbClbNF0pIDogaWR4XygwKSwgY2Vs bF8oY2VsbCkgewp9CgppbmxpbmUgY3JhY2tlZF9wYW5lbDo6Uzo6Uyhjb25zdCBTJiBzY2FuKSA6 IGlkeF8oc2Nhbi5pZHhfKSwgIGNlbGxfKHNjYW4uY2VsbF8pIHsKfQoKaW5saW5lIGJvb2wgY3Jh Y2tlZF9wYW5lbDo6Uzo6ZW9zKCkgY29uc3QgewogIHJldHVybiBpZHhfID09IDQ7Cn0KCmlubGlu ZSBnZW9fQ2VsbDImIGNyYWNrZWRfcGFuZWw6OlM6Om9wZXJhdG9yKysoaW50KSB7CiAgcmV0dXJu ICpjZWxsX1tpZHhfKytdOwp9CgppbmxpbmUgZ2VvX1NjYW4yKiBjcmFja2VkX3BhbmVsOjpTOjpj bG9uZSgpIGNvbnN0IHsKICByZXR1cm4gbmV3IFMoKnRoaXMpOwp9CgppbmxpbmUgdWludCBjcmFj a2VkX3BhbmVsOjpuY2VsbCgpIGNvbnN0IHsKICByZXR1cm4gNDsKfQoKaW5saW5lIGdlb19TY2Fu MiogY3JhY2tlZF9wYW5lbDo6c2NhbigpIGNvbnN0IHsKICByZXR1cm4gbmV3IFMoY2VsbF8pOwp9 CgoKIyAxOSAibGluZWwuY2MiIDIKCgoKIAoKIyAxICIuLi9nZW9tZXRyeS5oIiAxCiAKCgoKCgoK CgoKIyAxICIuLi9nZW9tZXRyeS9nZW9MaXN0cy5oIiAxCiAKCgoKCgoKCiMgMSAiLi4vZ2VvbWV0 cnkvLi4vdG9vbGJveC90YnhQb3N0cHJvY2Vzcy5oIiAxCiAKCgoKCgoKCgojIDEgIi4uL2dlb21l dHJ5Ly4uL3Rvb2xib3gvdGJ4RGVidWcuaCIgMQogCgoKCgoKCgoKCgogCgoKIAoKCiAKCgoKCgoj IDEwICIuLi9nZW9tZXRyeS8uLi90b29sYm94L3RieFBvc3Rwcm9jZXNzLmgiIDIKCgogCgp0ZW1w bGF0ZTxjbGFzcyBGPgpjbGFzcyB0YnhfQ2VsbFBvc3Rwcm9jZXNzOwoKdGVtcGxhdGU8Y2xhc3Mg Rj4Kb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IHRieF9DZWxsUG9zdHBy b2Nlc3M8Rj4mIHApIHsKICByZXR1cm4gcC5pbmZvKG9zKTsgCn0KCiAKCgoKCgoKCgp0ZW1wbGF0 ZTxjbGFzcyBGPgpjbGFzcyB0YnhfQ2VsbFBvc3Rwcm9jZXNzIHsKICBmcmllbmQgb3N0cmVhbSYg b3BlcmF0b3I8PCA8PiAob3N0cmVhbSYgb3MsIGNvbnN0IHRieF9DZWxsUG9zdHByb2Nlc3MmIHAp OwoKcHVibGljOgogICAKICB2aXJ0dWFsIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0 IHsgcmV0dXJuIG9zOyB9CgogICAKCgoKCiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0 IHNwY19FbGVtZW50PEY+JiBlbG0pIHt9CgogICAKCgoKCiAgdmlydHVhbCB2b2lkIG9wZXJhdG9y KCkgKGNvbnN0IGdlb19DZWxsJiBjZWxsKSB7fQp9OwoKIAoKIAoKCgoKCgoKCgoKCnRlbXBsYXRl PGNsYXNzIEY+CmNsYXNzIHRieF9HbG9iYWxQb3N0cHJvY2VzcyB7CgpwdWJsaWM6CiAgIAoKCgog IHRieF9HbG9iYWxQb3N0cHJvY2VzcyhzcGNfU3BhY2U8Rj4mIHNwYykgOiBzcGNfKCZzcGMpLCBt c2hfKDApIHt9CgogICAKCgoKICB0YnhfR2xvYmFsUG9zdHByb2Nlc3MoZ2VvX01lc2gmIG1zaCkg OiBzcGNfKDApLCBtc2hfKCZtc2gpIHt9CgogICAKCgoKCgogIGlubGluZSB2b2lkIG9wZXJhdG9y KCkgKHRieF9DZWxsUG9zdHByb2Nlc3M8Rj4mIHBlckNlbGwpIGNvbnN0OwoKcHJpdmF0ZToKICAg CiAgc3BjX1NwYWNlPEY+KiBzcGNfOwoKICAgCiAgZ2VvX01lc2gqIG1zaF87Cn07Cgp0ZW1wbGF0 ZSA8Y2xhc3MgRj4Kdm9pZCB0YnhfR2xvYmFsUG9zdHByb2Nlc3M8Rj46Om9wZXJhdG9yKCkgCiAg KHRieF9DZWxsUG9zdHByb2Nlc3M8Rj4mIHBlckNlbGwpIGNvbnN0IHsKCiAgaWYgKHNwY18pIHsK ICAgIGlmKCAwICAhPTApIGNvdXQgPDwgICAnWycgPDwgICIuLi9nZW9tZXRyeS8uLi90b29sYm94 L3RieFBvc3Rwcm9jZXNzLmgiIDw8ICIsIGxpbmUgIiAKCTw8IDEwNyA8PCAiXSB0YnhfR2xvYmFs UG9zdHByb2Nlc3M6Om9wZXJhdG9yKCkgLS0gc2Nhbm5pbmciICA8PCAiICIgPDwgICAKCSJzcGFj ZSIgIDw8IGVuZGw7IDsKICAgIHNwY19TcGFjZTxGPjo6c3BjX1NjYW4qIHNjID0gc3BjXy0+c2Nh bigpOwogICAgd2hpbGUgKCpzYykgewogICAgICBzcGNfRWxlbWVudDxGPiYgZWxtID0gKCpzYykr KzsKICAgICAgcGVyQ2VsbChlbG0pOwogICAgfSAgCiAgICBkZWxldGUgc2M7CiAgfSAgCgogIGlm IChtc2hfKSB7CiAgICBpZiggMCAgIT0wKSBjb3V0IDw8ICAgJ1snIDw8ICAiLi4vZ2VvbWV0cnkv Li4vdG9vbGJveC90YnhQb3N0cHJvY2Vzcy5oIiA8PCAiLCBsaW5lICIgCgk8PCAxMTkgPDwgIl0g dGJ4X0dsb2JhbFBvc3Rwcm9jZXNzOjpvcGVyYXRvcigpIC0tIHNjYW5uaW5nIiAgPDwgIiAiIDw8 ICAgCgkibWVzaCIgIDw8IGVuZGw7IDsKICAgIGdlb19TY2FuKiBzYyA9IG1zaF8tPnNjYW4oKTsK ICAgIHdoaWxlICgqc2MpIHsKICAgICAgZ2VvX0NlbGwmIGNlbGwgPSAoKnNjKSsrOwogICAgICBp ZiggMCAgIT0wKSBjb3V0IDw8ICAgJ1snIDw8ICAiLi4vZ2VvbWV0cnkvLi4vdG9vbGJveC90YnhQ b3N0cHJvY2Vzcy5oIiA8PCAiLCBsaW5lICIgCgkgIDw8IDEyNSA8PCAiXSB0YnhfR2xvYmFsUG9z dHByb2Nlc3M6Om9wZXJhdG9yKCkgLS0gY2VsbCA9IiAgPDwgIiAiIDw8ICAgCgkgIGNlbGwgIDw8 IGVuZGw7IDsKICAgICAgcGVyQ2VsbChjZWxsKTsKICAgIH0gIAogICAgZGVsZXRlIHNjOwogIH0g IAp9CgoKIyA5ICIuLi9nZW9tZXRyeS9nZW9MaXN0cy5oIiAyCgojIDEgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9oYXNoX3NldCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1s aWIvaTM4Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaGFzaF9z ZXQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKIAoKCgoKCgoKdGVt cGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9WYWx1ZT4sCiAgICAg ICAgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfVmFsdWU+LAogICAgICAgICAgY2xhc3Mg X0FsbG9jID0gYWxsb2NhdG9yPCBfVmFsdWUgPiAgPgoKCgoKY2xhc3MgaGFzaF9zZXQKewpwcml2 YXRlOgogIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwgX0lkZW50 aXR5PF9WYWx1ZT4sIAogICAgICAgICAgICAgICAgICAgIF9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7 CiAgX0h0IF9NX2h0OwoKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBr ZXlfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwog IHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOwogIHR5cGVkZWYgdHlwZW5hbWUg X0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90 eXBlIHNpemVfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRp ZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBwb2lu dGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7 CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSByZWZlcmVuY2U7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CgogIHR5 cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKICB0eXBlZGVmIHR5 cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CgogIHR5cGVkZWYgdHlw ZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgaGFzaGVyIGhhc2hf ZnVuY3QoKSBjb25zdCB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KICBrZXlfZXF1YWwg a2V5X2VxKCkgY29uc3QgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KICBhbGxvY2F0b3JfdHlw ZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9 CgpwdWJsaWM6CiAgaGFzaF9zZXQoKQogICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1 YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KICBleHBsaWNpdCBoYXNoX3NldChzaXplX3R5cGUg X19uKQogICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5 cGUoKSkge30KICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCiAg ICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CiAg aGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1 YWwmIF9fZXFsLAogICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0 b3JfdHlwZSgpKQogICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CgoKICB0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19m LCBfSW5wdXRJdGVyYXRvciBfX2wpCiAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVh bCgpLCBhbGxvY2F0b3JfdHlwZSgpKQogICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19s KTsgfQogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICBoYXNoX3NldChfSW5wdXRJ dGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKICAgIDogX01f aHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7IF9N X2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXJhdG9yPgogIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19s LCBzaXplX3R5cGUgX19uLAogICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKICAgIDogX01f aHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKICAgIHsgX01faHQu aW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0 b3I+CiAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNp emVfdHlwZSBfX24sCiAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1 YWwmIF9fZXFsLAogICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0 b3JfdHlwZSgpKQogICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCiAgICB7IF9NX2h0 Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CiMgMTQyICIvdXNyL2xpYi9nY2MtbGliL2kzODYt bGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2hhc2hfc2V0LmgiIDMK CgpwdWJsaWM6CiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5zaXplKCk7 IH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgp OyB9CiAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KICB2b2lk IHN3YXAoaGFzaF9zZXQmIF9faHMpIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQogIGZyaWVu ZCBib29sIG9wZXJhdG9yPT0gPD4gIChjb25zdCBoYXNoX3NldCYsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaF9zZXQmKTsKCiAgaXRlcmF0 b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CiAgaXRlcmF0b3IgZW5k KCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KCnB1YmxpYzoKICBwYWlyPGl0ZXJhdG9y LCBib29sPiBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCiAgICB7CiAgICAgIHBhaXI8 dHlwZW5hbWUgX0h0OjppdGVyYXRvciwgYm9vbD4gX19wID0gX01faHQuaW5zZXJ0X3VuaXF1ZShf X29iaik7CiAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGJvb2w+KF9fcC5maXJzdCwgX19wLnNl Y29uZCk7CiAgICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGlu c2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkgCiAgICB7IF9NX2h0 Lmluc2VydF91bmlxdWUoX19mLF9fbCk7IH0KCgoKCgoKCiAgcGFpcjxpdGVyYXRvciwgYm9vbD4g aW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQogIHsKICAgIHBhaXI8dHlw ZW5hbWUgX0h0OjppdGVyYXRvciwgYm9vbD4gX19wID0gCiAgICAgIF9NX2h0Lmluc2VydF91bmlx dWVfbm9yZXNpemUoX19vYmopOwogICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5m aXJzdCwgX19wLnNlY29uZCk7CiAgfQoKICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBf X2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KCiAgc2l6ZV90eXBlIGNv dW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuY291bnQoX19r ZXkpOyB9CiAgCiAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3JhbmdlKGNvbnN0IGtl eV90eXBlJiBfX2tleSkgY29uc3QKICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5 KTsgfQoKICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSB7cmV0dXJuIF9N X2h0LmVyYXNlKF9fa2V5KTsgfQogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19pdCkgeyBfTV9odC5l cmFzZShfX2l0KTsgfQogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpIHsg X01faHQuZXJhc2UoX19mLCBfX2wpOyB9CiAgdm9pZCBjbGVhcigpIHsgX01faHQuY2xlYXIoKTsg fQoKcHVibGljOgogIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsgX01faHQucmVzaXpl KF9faGludCk7IH0KICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gX01f aHQuYnVja2V0X2NvdW50KCk7IH0KICBzaXplX3R5cGUgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0 IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQogIHNpemVfdHlwZSBlbGVtc19p bl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2lu X2J1Y2tldChfX24pOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZj biwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIApvcGVyYXRvcj09 KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSxfSGFzaEZjbixfRXF1YWxLZXksX0FsbG9jPiYgX19oczEs CiAgICAgICAgICAgY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxs b2M+JiBfX2hzMikKewogIHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsKfQoKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xh c3MgX0FsbG9jPgppbmxpbmUgdm9pZCAKc3dhcChoYXNoX3NldDxfVmFsLF9IYXNoRmNuLF9FcXVh bEtleSxfQWxsb2M+JiBfX2hzMSwKICAgICBoYXNoX3NldDxfVmFsLF9IYXNoRmNuLF9FcXVhbEtl eSxfQWxsb2M+JiBfX2hzMikKewogIF9faHMxLnN3YXAoX19oczIpOwp9CgoKCgoKdGVtcGxhdGUg PGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9WYWx1ZT4sCiAgICAgICAgICBj bGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfVmFsdWU+LAogICAgICAgICAgY2xhc3MgX0FsbG9j ID0gYWxsb2NhdG9yPCBfVmFsdWUgPiAgPgoKCgoKY2xhc3MgaGFzaF9tdWx0aXNldAp7CnByaXZh dGU6CiAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRp dHk8X1ZhbHVlPiwgCiAgICAgICAgICAgICAgICAgICAgX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsK ICBfSHQgX01faHQ7CgpwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtl eV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CiAg dHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBf SHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CgogIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5 cGUgc2l6ZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlm ZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIHBvaW50 ZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsK ICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIHJlZmVyZW5jZTsKICB0eXBl ZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKCiAgdHlw ZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOwogIHR5cGVkZWYgdHlw ZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKCiAgdHlwZWRlZiB0eXBl bmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBoYXNoZXIgaGFzaF9m dW5jdCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQogIGtleV9lcXVhbCBr ZXlfZXEoKSBjb25zdCB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQogIGFsbG9jYXRvcl90eXBl IGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0K CnB1YmxpYzoKICBoYXNoX211bHRpc2V0KCkKICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5 X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CiAgZXhwbGljaXQgaGFzaF9tdWx0aXNldChz aXplX3R5cGUgX19uKQogICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxs b2NhdG9yX3R5cGUoKSkge30KICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhh c2hlciYgX19oZikKICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9y X3R5cGUoKSkge30KICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYg X19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9j YXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfTV9odChfX24sIF9faGYs IF9fZXFsLCBfX2EpIHt9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgaGFz aF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKICAgIDog X01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7 IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0 SXRlcmF0b3I+CiAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJh dG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2Vx dWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9f bCk7IH0KICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgaGFzaF9tdWx0aXNldChf SW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKICAg ICAgICAgICAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKICAgIDogX01faHQoX19uLCBfX2hmLCBr ZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9f ZiwgX19sKTsgfQogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICBoYXNoX211bHRp c2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19u LAogICAgICAgICAgICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9f ZXFsLAogICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRv cl90eXBlKCkpCiAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKICAgIHsgX01faHQu aW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQojIDMyMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxp bnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9oYXNoX3NldC5oIiAzCgoK cHVibGljOgogIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9 CiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsg fQogIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CiAgdm9pZCBz d2FwKGhhc2hfbXVsdGlzZXQmIGhzKSB7IF9NX2h0LnN3YXAoaHMuX01faHQpOyB9CiAgZnJpZW5k IGJvb2wgb3BlcmF0b3I9PSA8PiAgKGNvbnN0IGhhc2hfbXVsdGlzZXQmLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQmKTsK CiAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CiAgaXRl cmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KCnB1YmxpYzoKICBpdGVy YXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCiAgICB7IHJldHVybiBfTV9odC5p bnNlcnRfZXF1YWwoX19vYmopOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkgCiAg ICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQoKCgoKCgoKICBpdGVyYXRvciBpbnNl cnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCiAgICB7IHJldHVybiBfTV9odC5p bnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9ICAgIAoKICBpdGVyYXRvciBmaW5kKGNvbnN0 IGtleV90eXBlJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KCiAg c2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QgeyByZXR1cm4gX01f aHQuY291bnQoX19rZXkpOyB9CiAgCiAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IGVxdWFsX3Jh bmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFs X3JhbmdlKF9fa2V5KTsgfQoKICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5 KSB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19p dCkgeyBfTV9odC5lcmFzZShfX2l0KTsgfQogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVy YXRvciBfX2wpIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CiAgdm9pZCBjbGVhcigpIHsgX01f aHQuY2xlYXIoKTsgfQoKcHVibGljOgogIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpIHsg X01faHQucmVzaXplKF9faGludCk7IH0KICBzaXplX3R5cGUgYnVja2V0X2NvdW50KCkgY29uc3Qg eyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KICBzaXplX3R5cGUgbWF4X2J1Y2tldF9j b3VudCgpIGNvbnN0IHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQogIHNpemVf dHlwZSBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKICAgIHsgcmV0dXJuIF9N X2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ZhbCwgY2xh c3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCAK b3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsX0hhc2hGY24sX0VxdWFsS2V5LF9B bGxvYz4mIF9faHMxLAogICAgICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCxfSGFzaEZj bixfRXF1YWxLZXksX0FsbG9jPiYgX19oczIpCnsKICByZXR1cm4gX19oczEuX01faHQgPT0gX19o czIuX01faHQ7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFz cyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3YXAoaGFzaF9tdWx0aXNl dDxfVmFsLF9IYXNoRmNuLF9FcXVhbEtleSxfQWxsb2M+JiBfX2hzMSwKICAgICBoYXNoX211bHRp c2V0PF9WYWwsX0hhc2hGY24sX0VxdWFsS2V5LF9BbGxvYz4mIF9faHMyKSB7CiAgX19oczEuc3dh cChfX2hzMik7Cn0KCgoKCgoKCgogCgoKCiAKIAogCiMgMzQgIi91c3IvbGliL2djYy1saWIvaTM4 Ni1saW51eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9oYXNoX3NldCIgMiAzCgoK CgogCiAKIAojIDEwICIuLi9nZW9tZXRyeS9nZW9MaXN0cy5oIiAyCgoKCiAKCiAKCgoKCgoKCgpj bGFzcyBnZW9fVmVydGV4SW5mbyB7CiAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJl YW0mIG9zLCBjb25zdCBnZW9fVmVydGV4SW5mbyYgdik7CgpwdWJsaWM6CiAgIAoKCgogIGdlb19W ZXJ0ZXhJbmZvKFJlYWwzZCBjb29yZCwgdWludCBpbmRleCA9IDApIDogCiAgICBpbmRleF8oaW5k ZXgpLCBjb29yZF8oY29vcmQpIHt9CgogICAKICB2b2lkIGFkZEVkZ2UodWludCBlZGdlKTsKCiAg IAogIHZvaWQgYWRkRmFjZSh1aW50IGZhY2UpOwoKICAgCiAgdm9pZCBhZGRWb2x1bWUodWludCB2 b2x1bWUpOwoKICAgCiAgdWludCYgaW5kZXgoKTsKCiAgIAogIFJlYWwzZCBjb29yZGluYXRlcygp IGNvbnN0OwoKcHJpdmF0ZToKICAgCgoKCgogIHVpbnQgaW5kZXhfOwoKICAgCiAgUmVhbDNkIGNv b3JkXzsKCiAgIAogIGhhc2hfc2V0PHVpbnQ+IGVkZ2VzXzsKCiAgIAogIGhhc2hfc2V0PHVpbnQ+ IGZhY2VzXzsKCiAgIAogIGhhc2hfc2V0PHVpbnQ+IHZvbHVtZXNfOwp9OwoKIAoKIAoKCgoKCgoK CgoKCmNsYXNzIGdlb19WZXJ0ZXhMaXN0IDogcHVibGljIHRieF9DZWxsUG9zdHByb2Nlc3M8cmVh bD4gewoKcHVibGljOgogIHR5cGVkZWYgaGFzaF9tYXA8dWludCwgZ2VvX1ZlcnRleEluZm8+Ojpp dGVyYXRvciBpdGVyYXRvcjsKCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBj b25zdDsKCiAgIAoKCgoKCiAgZW51bSB2dHhJbmZvIHsgQ09PUkQgPSAwLCBFREdFUyA9IDEsIEZB Q0VTID0gMiwgVk9MVU1FUyA9IDQsIEFMTCA9IDcgfTsKCiAgIAoKICBnZW9fVmVydGV4TGlzdChl bnVtIHZ0eEluZm8gaW5mbyA9IEFMTCkgOiB2dHhJbmZvXyhpbmZvKSB7fQoKICB2aXJ0dWFsIH5n ZW9fVmVydGV4TGlzdCgpIHt9CgogICAKCgoKCiAgZ2VvX1ZlcnRleEluZm8qIHZlcnRleCh1aW50 IHYpOwoKICAgCgoKCgoKCiAgZ2VvX1ZlcnRleEluZm8qIGFkZFZlcnRleCh1aW50IHYsIFJlYWwz ZCBjb29yZCk7CgogICAKICB1aW50IHNpemUoKSBjb25zdCB7IHJldHVybiB2ZXJ0aWNlc18uc2l6 ZSgpOyB9CgogICAKICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHZlcnRpY2VzXy5iZWdpbigp OyB9CgogICAKICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB2ZXJ0aWNlc18uZW5kKCk7IH0KCiAg IAogIGl0ZXJhdG9yIGZpbmQodWludCBrKSB7IHJldHVybiB2ZXJ0aWNlc18uZmluZChrKTsgfQoK ICAgCgoKCgogIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpIChjb25zdCBnZW9fQ2VsbCYgY2VsbCk7 CgogICAKCgoKCiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IHNwY19FbGVtZW50PHJl YWw+JiBlbG0pOwoKICAgCiAgZW51bSB2dHhJbmZvIHZlcnRleEluZm8oKSBjb25zdCB7IHJldHVy biB2dHhJbmZvXzsgfQoKcHJpdmF0ZToKICAgCiAgaGFzaF9tYXA8dWludCwgZ2VvX1ZlcnRleElu Zm8+IHZlcnRpY2VzXzsKCiAgIAogIGVudW0gdnR4SW5mbyB2dHhJbmZvXzsKfTsKCgojIDExICIu Li9nZW9tZXRyeS5oIiAyCgoKCiMgMjQgImxpbmVsLmNjIiAyCgojIDEgIi4uL29wZXJhdG9yLmgi IDEKIAoKCgoKCgojIDEgIi4uL29wZXJhdG9yL29wQ0cuaCIgMQogCgoKCgoKCgoKCiAKCiAKCgp0 ZW1wbGF0ZTxjbGFzcyBGPgpjbGFzcyBvcF9DRyA6IHB1YmxpYyBvcF9PcGVyYXRvcjxGPiB7Cgog IG9wX09wZXJhdG9yPEY+KiAgV187CiAgb3BfT3BlcmF0b3I8Rj4mICBBXzsKCiAgcmVhbCBtYXhl cHNfOwogIHVpbnQgbWF4aXRfOwogIHJlYWwgZXBzXzsKICB1aW50IGl0XzsKCiBwdWJsaWM6CiAg IAoKCgoKICBpbmxpbmUgb3BfQ0cob3BfT3BlcmF0b3I8Rj4mIEEsIHJlYWwgbWF4ZXBzLCBpbnQg bWF4aXQgPSAwKTsKCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGZuY19GdW5jdGlvbjxGPiYgZm5j WSwgZm5jX0Z1bmN0aW9uPEY+JiBmbmNYKTsKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZm5jX1Zl Y3RvcjxGPiYgZm5jWSwgZm5jX1ZlY3RvcjxGPiYgZm5jWCk7CgogIG9zdHJlYW0mIGluZm8ob3N0 cmVhbSYgb3MpIGNvbnN0OwogIGlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYWNlWCgpIGNv bnN0OwogIGlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYWNlWSgpIGNvbnN0Owp9OwoKdGVt cGxhdGU8Y2xhc3MgRj4KaW5saW5lIG9wX0NHPEY+OjpvcF9DRyhvcF9PcGVyYXRvcjxGPiYgQSwg cmVhbCBtYXhlcHMsIGludCBtYXhpdCkgOiBBXyhBKSB7CiAKICAgIFdfID0gX19udWxsIDsgbWF4 ZXBzXyA9IG1heGVwcyAqIG1heGVwczsgbWF4aXRfID0gbWF4aXQ7IAp9Cgp0ZW1wbGF0ZTxjbGFz cyBGPgppbmxpbmUgY29uc3Qgc3BjX1NwYWNlPEY+JiBvcF9DRzxGPjo6c3BhY2VYKCkgY29uc3Qg eyAKICByZXR1cm4gQV8uc3BhY2VZKCk7IAp9Cgp0ZW1wbGF0ZTxjbGFzcyBGPgppbmxpbmUgY29u c3Qgc3BjX1NwYWNlPEY+JiBvcF9DRzxGPjo6c3BhY2VZKCkgY29uc3QgeyAKICByZXR1cm4gQV8u c3BhY2VYKCk7IAp9CgogCgojIDEgIi4uL29wZXJhdG9yL29wQ0cudCIgMQogCgoKCgoKCgogCgp0 ZW1wbGF0ZTxjbGFzcyBGPgp2b2lkIG9wX0NHPEY+OjpvcGVyYXRvcigpKGNvbnN0IGZuY19GdW5j dGlvbjxGPiYgZm5jWSwgZm5jX0Z1bmN0aW9uPEY+JiBmbmNYKSB7CgogIGNvbnN0IGZuY19WZWN0 b3I8Rj4qIGZuY1lBOwogIGlmICgoZm5jWUEgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgZm5jX1ZlY3Rv cjxGPio+KCZmbmNZKSkpIHsKICAgIGZuY19WZWN0b3I8Rj4qIGZuY1hBOwogICAgaWYgKChmbmNY QSA9IGR5bmFtaWNfY2FzdDxmbmNfVmVjdG9yPEY+Kj4oJmZuY1gpKSkgewogICAgICAoKnRoaXMp KCpmbmNZQSwgKmZuY1hBKTsgcmV0dXJuOwogICAgfQogIH0KCiAgY2VyciA8PCAnWycgPDwgICIu Li9vcGVyYXRvci9vcENHLnQiIDw8ICIsIGxpbmUgIiA8PCAyMjsKICBjZXJyIDw8ICJdIG9wX0NH OjpvcGVyYXRvcigpIDogdW5rbm93biB0eXBlIG9mIGZ1bmN0aW9uXG4iOwogIGV4aXQoMSk7Cn0K CnRlbXBsYXRlPGNsYXNzIEY+Cm9zdHJlYW0mIG9wX0NHPEY+OjppbmZvKG9zdHJlYW0mIG9zKSBj b25zdCB7CgogIHJldHVybiBvcyA8PCAib3BfQ0coZXBzID0gIiA8PCBlcHNfIDw8ICIsIGl0ID0g IiA8PCBpdF8gPDwgJyknOwp9CiMgNjEgIi4uL29wZXJhdG9yL29wQ0cuaCIgMgoKCgojIDggIi4u L29wZXJhdG9yLmgiIDIKCiMgMSAiLi4vb3BlcmF0b3Ivb3BHTVJlcy5oIiAxCiAKCgoKCgoKCgoK IAoKIAoKCnRlbXBsYXRlPGNsYXNzIEY+CmNsYXNzIG9wX0dNUmVzIDogcHVibGljIG9wX09wZXJh dG9yPEY+IHsKCiAgc3RydWN0IFIgewogICAgUiogICAgICAgICAgICAgcmlnaHQ7CiAgICBSKiAg ICAgICAgICAgICBsZWZ0OwogICAgZm5jX1ZlY3RvcjxGPiogdjsKICAgIEYgICAgICAgICAgICAg IHNpbjsKICAgIEYgICAgICAgICAgICAgIGNvczsKICAgIEYgICAgICAgICAgICAgIGhbMV07Cgog ICAgUihSKiBsbmsgPSBfX251bGwgKSB7IHJpZ2h0ID0gX19udWxsIDsgdiA9IF9fbnVsbCA7IGlm ICgobGVmdCA9IGxuaykpIAogICAgICBsbmstPnJpZ2h0ID0gdGhpczsgfQogICAgflIoKSB7IGRl bGV0ZSB2OyB9CgogICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzejAsIGludCBzejEpIHsg CiAgICAgIHJldHVybiBuZXcgY2hhcltzejAgKyAoc3oxIC0gMSkgKiBzaXplb2YocmVhbCldOwog ICAgfQogIH07CgogIG9wX09wZXJhdG9yPEY+KiAgV187CiAgb3BfT3BlcmF0b3I8Rj4mICBBXzsK CiAgcmVhbCBtYXhlcHNfOwogIHVpbnQgbWF4aXRfOwogIHJlYWwgZXBzXzsKICB1aW50IGl0XzsK ICB1aW50IHJzXzsKCiBwdWJsaWM6CiAgIAoKCgoKCiAgb3BfR01SZXMob3BfT3BlcmF0b3I8Rj4m IEEsIHJlYWwgbWF4ZXBzLCBpbnQgbWF4aXQgPSAwLCB1aW50IHJzID0gMCk7CiAgfm9wX0dNUmVz KCkgewogICAgZGVsZXRlIFdfOwogIH0KCiAgIAoKCgoKCgogIHZvaWQgb3BlcmF0b3IoKShjb25z dCBmbmNfRnVuY3Rpb248Rj4mIGZuY1ksIGZuY19GdW5jdGlvbjxGPiYgZm5jWCk7CgogICAKCgoK CgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZm5jX1ZlY3RvcjxGPiYgZm5jWSwgZm5jX1ZlY3Rv cjxGPiYgZm5jWCk7CgogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwogIGlubGlu ZSBjb25zdCBzcGNfU3BhY2U8Rj4mIHNwYWNlWCgpIGNvbnN0OwogIGlubGluZSBjb25zdCBzcGNf U3BhY2U8Rj4mIHNwYWNlWSgpIGNvbnN0OwoKICAgCgoKICBjb25zdCB1aW50IGl0ZXJhdGlvbnMo KSBjb25zdDsKCiAgIAoKCiAgY29uc3QgcmVhbCBlcHNpbG9uKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0 ZTxjbGFzcyBGPgppbmxpbmUgb3BfR01SZXM8Rj46Om9wX0dNUmVzKG9wX09wZXJhdG9yPEY+JiBB LCByZWFsIG1heGVwcywgaW50IG1heGl0LCAKCQkJICAgICB1aW50IHJzKSA6IEFfKEEpIHsKICBX XyA9IF9fbnVsbCA7IG1heGVwc18gPSBtYXhlcHM7IG1heGl0XyA9IG1heGl0OyBycyA9IHJzID8g cnMgOiBtYXhpdDsgCn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBzcGNfU3BhY2U8 Rj4mIG9wX0dNUmVzPEY+OjpzcGFjZVgoKSBjb25zdCB7IAogIHJldHVybiBBXy5zcGFjZVkoKTsg Cn0KCnRlbXBsYXRlPGNsYXNzIEY+CmlubGluZSBjb25zdCBzcGNfU3BhY2U8Rj4mIG9wX0dNUmVz PEY+OjpzcGFjZVkoKSBjb25zdCB7IAogIHJldHVybiBBXy5zcGFjZVgoKTsgCn0KCiAKCiMgMSAi Li4vb3BlcmF0b3Ivb3BHTVJlcy50IiAxCiAKCgoKCgoKIyAxICIuLi9vcGVyYXRvci9vcEdNUmVz LmgiIDEKIAoKCgojIDExMCAiLi4vb3BlcmF0b3Ivb3BHTVJlcy5oIgoKIyA4ICIuLi9vcGVyYXRv ci9vcEdNUmVzLnQiIDIKCgogCgp0ZW1wbGF0ZTxjbGFzcyBGPgp2b2lkIG9wX0dNUmVzPEY+Ojpv cGVyYXRvcigpKGNvbnN0IGZuY19GdW5jdGlvbjxGPiYgZm5jWSwgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5jX0Z1bmN0aW9uPEY+JiBm bmNYKSB7CiAgY29uc3QgZm5jX1ZlY3RvcjxGPiogZm5jWUE7CiAgaWYgKChmbmNZQSA9IGR5bmFt aWNfY2FzdDxjb25zdCBmbmNfVmVjdG9yPEY+Kj4oJmZuY1kpKSkgewogICAgZm5jX1ZlY3RvcjxG PiogZm5jWEE7CiAgICBpZiAoKGZuY1hBID0gZHluYW1pY19jYXN0PGZuY19WZWN0b3I8Rj4qPigm Zm5jWCkpKSB7CiAgICAgICgqdGhpcykoKmZuY1lBLCAqZm5jWEEpOyByZXR1cm47CiAgICB9CiAg fQoKICBjZXJyIDw8ICdbJyA8PCAgIi4uL29wZXJhdG9yL29wR01SZXMudCIgPDwgIiwgbGluZSAi IDw8IDIzOwogIGNlcnIgPDwgIl0gb3BfR01SZXM6Om9wZXJhdG9yKCkgOiB1bmtub3duIGZ1bmN0 aW9uXG4iOwogIGV4aXQoMSk7Cn0KCnRlbXBsYXRlPGNsYXNzIEY+Cm9zdHJlYW0mIG9wX0dNUmVz PEY+OjppbmZvKG9zdHJlYW0mIG9zKSBjb25zdCB7CgogIHJldHVybiBvcyA8PCAib3BfR01SZXMo ZXBzID0gIiA8PCBlcHNfIDw8ICIsIGl0ID0gIiA8PCBpdF8gPDwgJyknOwp9CgoKCgojIDEwOCAi Li4vb3BlcmF0b3Ivb3BHTVJlcy5oIiAyCgoKCiMgOSAiLi4vb3BlcmF0b3IuaCIgMgoKIyAxICIu Li9vcGVyYXRvci9vcERHRVNWLmgiIDEKIAoKCgoKCgoKCgoKCgoKICAKCgoKZXh0ZXJuICJDIiB7 CgoKICBleHRlcm4gdm9pZCAgZGdlc3ZfIChjb25zdCBpbnQmIE4sIGNvbnN0IGludCYgTlJIUywg CgkJCSAgICAgcmVhbCogQSwgY29uc3QgaW50JiBMREEsIGludCogSVBJViwgCgkJCSAgICAgcmVh bCogQiwgY29uc3QgaW50JiBMREIsIGludCYgSU5GTyk7CgogIGV4dGVybiB2b2lkICBkZ2V0cmZf IChjb25zdCBpbnQmIE0sIGNvbnN0IGludCYgTiwKCQkJICAgICAgcmVhbCogQSwgY29uc3QgaW50 JiBMREEsIGludCogSVBJViwKCQkJICAgICAgaW50JiBpbmZvKTsKCiAgZXh0ZXJuIHZvaWQgIGRn Y29uXyAoY29uc3QgY2hhciYgTk9STSwgY29uc3QgaW50JiBOLAoJCQkgICAgIHJlYWwqIEEsIGNv bnN0IGludCYgTERBLCBjb25zdCByZWFsJiBBTk9STSwKCQkJICAgICByZWFsJiBSQ09ORCwgcmVh bCogV09SSywgaW50KiBJV09SSywKCQkJICAgICBpbnQmIGluZm8pOwoKICBleHRlcm4gdm9pZCAg ZGdlc3Z4XyAoY29uc3QgY2hhciYgRkFDVCwgY29uc3QgY2hhciYgVFJBTlMsCgkJCSAgICAgIGNv bnN0IGludCYgTiwgY29uc3QgaW50JiBOUkhTLCAKCQkJICAgICAgcmVhbCogQSwgY29uc3QgaW50 JiBMREEsIAoJCQkgICAgICByZWFsKiBBRiwgY29uc3QgaW50JiBMREFELAoJCQkgICAgICBpbnQq IElQSVYsIGNoYXImIEVRVUVELCAKCQkJICAgICAgcmVhbCogUiwKCQkJICAgICAgcmVhbCogQywg CgkJCSAgICAgIHJlYWwqIEIsIGNvbnN0IGludCYgTERCLAoJCQkgICAgICByZWFsKiBYLCBjb25z dCBpbnQmIExEWCwKCQkJICAgICAgcmVhbCYgUkNPTkQsIHJlYWwmIEZFUlIsIHJlYWwmIEJFUlIs CgkJCSAgICAgIHJlYWwqIFdPUkssIGludCogSVdPUkssIGludCYgaW5mbyk7CgkJCSAgICAgIAoK Cn0KCgogCgogCgoKCgoKCgoKCgoKCmNsYXNzIG9wX0RHRVNWIDogcHVibGljIG9wX09wZXJhdG9y PHJlYWw+IHsKCnB1YmxpYzoKICAgCgoKICBvcF9ER0VTVihvcF9PcGVyYXRvcjxyZWFsPiYgQSk7 CgogIH5vcF9ER0VTVigpOwoKICAgCgoKCgogIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKGNvbnN0 IGZuY19GdW5jdGlvbjxyZWFsPiYgZm5jWSwKCQkJICBmbmNfRnVuY3Rpb248cmVhbD4mIGZuY1gp OwoKICAgCgoKCgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBmbmNfVmVjdG9yPHJlYWw+JiBmbmNZ LCBmbmNfVmVjdG9yPHJlYWw+JiBmbmNYKTsKCiAgIAoKCiAgcmVhbCBjb25kaXRpb24oKTsKCiAg IAogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhvc3RyZWFtJiBvcykgY29uc3Q7CgogICAKICB2aXJ0 dWFsIGlubGluZSBjb25zdCBzcGNfU3BhY2U8cmVhbD4mIHNwYWNlWCgpIGNvbnN0OwoKICAgCiAg dmlydHVhbCBpbmxpbmUgY29uc3Qgc3BjX1NwYWNlPHJlYWw+JiBzcGFjZVkoKSBjb25zdDsKCnBy aXZhdGU6CgogICAKICBvcF9PcGVyYXRvcjxyZWFsPiYgQV87CgogICAKICByZWFsKiBtYXRyaXhf OwoKICAgCiAgcmVhbCogbWF0cml4TFVfOwoKICAgCiAgaW50KiBpcGl2XzsKCiAgIAogIGJvb2wg bHVfOwoKICAgCiAgdWludCBuXzsKCiAgIAogIHJlYWwgY29uZF87Cn07CgppbmxpbmUgY29uc3Qg c3BjX1NwYWNlPHJlYWw+JiBvcF9ER0VTVjo6c3BhY2VYKCkgY29uc3QgeyAKICByZXR1cm4gQV8u c3BhY2VYKCk7IAp9CgppbmxpbmUgY29uc3Qgc3BjX1NwYWNlPHJlYWw+JiBvcF9ER0VTVjo6c3Bh Y2VZKCkgY29uc3QgeyAKICByZXR1cm4gQV8uc3BhY2VZKCk7IAp9CgoKIyAxMCAiLi4vb3BlcmF0 b3IuaCIgMgoKIyAxICIuLi9vcGVyYXRvci9vcFN1cGVyTFUuaCIgMQogCgoKCgoKCgojIDEgIi4u L29wZXJhdG9yLy4uL29wZXJhdG9yLmgiIDEKIAoKCiMgMTcgIi4uL29wZXJhdG9yLy4uL29wZXJh dG9yLmgiCgojIDkgIi4uL29wZXJhdG9yL29wU3VwZXJMVS5oIiAyCgoKIyAxICIuLi9vcGVyYXRv ci9TdXBlckxVL3N1cGVybWF0cml4LmgiIDEKCgoKIAoKCnR5cGVkZWYgZW51bSB7CiAgICBOQywg ICAgICAgICAKICAgIE5SLCAgICAgICAgIAogICAgU0MsICAgICAgICAgCiAgICBTUiwgICAgICAg ICAKICAgIE5DUCwgICAgICAgIAoKCiAgICBETiAgICAgICAgICAKfSBTdHlwZV90OwoKdHlwZWRl ZiBlbnVtIHsKICAgIF9TLCAgICAgICAgICAKICAgIF9ELCAgICAgICAgICAKICAgIF9DLCAgICAg ICAgICAKICAgIF9aICAgICAgICAgICAKfSBEdHlwZV90OwoKdHlwZWRlZiBlbnVtIHsKICAgIEdF LCAgICAgICAgIAogICAgVFJMVSwgICAgICAgCiAgICBUUlVVLCAgICAgICAKICAgIFRSTCwgICAg ICAgIAogICAgVFJVLCAgICAgICAgCiAgICBTWUwsICAgICAgICAKICAgIFNZVSwgICAgICAgIAog ICAgSEVMLCAgICAgICAgCiAgICBIRVUgICAgICAgICAKfSBNdHlwZV90OwoKdHlwZWRlZiBzdHJ1 Y3QgewoJU3R5cGVfdCBTdHlwZTsgIAoKCUR0eXBlX3QgRHR5cGU7ICAKCU10eXBlX3QgTXR5cGU7 ICAKCglpbnQgIG5yb3c7ICAgICAgCglpbnQgIG5jb2w7ICAgICAgCgl2b2lkICpTdG9yZTsgICAg Cn0gU3VwZXJNYXRyaXg7CgogCgoKCiAKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50ICBubno7CSAg IAogICAgdm9pZCAqbnp2YWw7ICAgCiAgICBpbnQgICpyb3dpbmQ7ICAKICAgIGludCAgKmNvbHB0 cjsgIAoKICAgICAgICAgICAgICAgICAgIAoKCgp9IE5DZm9ybWF0OwoKIAp0eXBlZGVmIHN0cnVj dCB7CiAgICBpbnQgIG5uejsJICAgCiAgICB2b2lkICpuenZhbDsgICAKICAgIGludCAgKmNvbGlu ZDsgIAogICAgaW50ICAqcm93cHRyOyAgCgogICAgICAgICAgICAgICAgICAgCgoKCn0gTlJmb3Jt YXQ7CgogCnR5cGVkZWYgc3RydWN0IHsKICBpbnQgIG5uejsJICAgICAgCiAgaW50ICBuc3VwZXI7 ICAgICAgICAKICB2b2lkICpuenZhbDsgICAgICAgIAogIGludCAgKm56dmFsX2NvbHB0cjsgCiAg aW50ICAqcm93aW5kOyAgICAgICAKCiAgaW50ICpyb3dpbmRfY29scHRyOyAKICBpbnQgKmNvbF90 b19zdXA7ICAgIAoKICBpbnQgKnN1cF90b19jb2w7ICAgIAoKCgogICAgICAgICAgICAgICAgICAg ICAgCgoKCgp9IFNDZm9ybWF0OwoKIAp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgbm56OwkgICAK ICAgIHZvaWQgKm56dmFsOyAgIAogICAgaW50ICpyb3dpbmQ7ICAgCgkJICAgCiAgICBpbnQgKmNv bGJlZzsgICAKCiAgICBpbnQgKmNvbGVuZDsgICAKCgkJICAgCgoKCgp9IE5DUGZvcm1hdDsKCiAK dHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IGxkYTsgICAgICAgCiAgICB2b2lkICpuenZhbDsgICAK fSBETmZvcm1hdDsKCgoKIAoKCgoKCgoKCgoKCiMgMTEgIi4uL29wZXJhdG9yL29wU3VwZXJMVS5o IiAyCgoKIAoKIAoKCgpjbGFzcyBvcF9TdXBlckxVIDogcHVibGljIG9wX09wZXJhdG9yPHJlYWw+ IHsKCnB1YmxpYzoKICAgCgogIG9wX1N1cGVyTFUob3BfT3BlcmF0b3I8cmVhbD4mIEEpOwoKICB2 aXJ0dWFsIH5vcF9TdXBlckxVKCk7CgogICAKCiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoY29u c3QgZm5jX0Z1bmN0aW9uPHJlYWw+JiBmbmNZLAoJCQkgIGZuY19GdW5jdGlvbjxyZWFsPiYgZm5j WCk7CgogICAKCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGZuY19WZWN0b3I8cmVhbD4mIGZuY1ks IGZuY19WZWN0b3I8cmVhbD4mIGZuY1gpOwoKICAgCgogIHZpcnR1YWwgb3N0cmVhbSYgaW5mbyhv c3RyZWFtJiBvcykgY29uc3Q7CgogICAKICB2aXJ0dWFsIGNvbnN0IHNwY19TcGFjZTxyZWFsPiYg c3BhY2VYKCkgY29uc3Q7CgogICAKICB2aXJ0dWFsIGNvbnN0IHNwY19TcGFjZTxyZWFsPiYgc3Bh Y2VZKCkgY29uc3Q7CnByaXZhdGU6ICAKICAgCiAgU3VwZXJNYXRyaXggQV87CgogICAKICB1aW50 IG5fOwoKICAgCiAgb3BfT3BlcmF0b3I8cmVhbD4mIE9fOwp9OwoKCiMgMTEgIi4uL29wZXJhdG9y LmgiIDIKCgojIDEgIi4uL29wZXJhdG9yL29wQkZvcm0zRC5oIiAxCiAKCgoKCgoKCgoKCgogCgpj bGFzcyBvcF9MYXBsYWNlTGluZWFyM0QgOiBwdWJsaWMgb3BfQmlsaW5lYXJGb3JtPHJlYWw+IHsK CnB1YmxpYzoKICBpbmxpbmUgb3BfTGFwbGFjZUxpbmVhcjNEKCk7CgogIHZvaWQgb3BlcmF0b3Io KShjb25zdCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtWCwgY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4m IGVsbVksCgkJICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKICB2b2lkIG9wZXJhdG9y KCkoY29uc3Qgc3BjX0xpbmVhcjNkMDAxJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDEmIGVs bVksIAoJCSAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsgCn07IAoKIAoKY2xhc3Mgb3Bf SWRlbnRpdHlMaW5lYXIzRCA6IHB1YmxpYyBvcF9CaWxpbmVhckZvcm08cmVhbD4gewoKcHVibGlj OgogIGlubGluZSBvcF9JZGVudGl0eUxpbmVhcjNEKCk7CgogIHZvaWQgb3BlcmF0b3IoKShjb25z dCBzcGNfRWxlbWVudDxyZWFsPiYgZWxtWCwgY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVks CgkJICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKICB2b2lkIG9wZXJhdG9yKCkoY29u c3Qgc3BjX0xpbmVhcjNkMDAxJiBlbG1YLCBjb25zdCBzcGNfTGluZWFyM2QwMDEmIGVsbVksIAoJ CSAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsgCn07IAoKCiMgMTMgIi4uL29wZXJhdG9y LmgiIDIKCgojIDEgIi4uL29wZXJhdG9yL29wTlJMc29sdmVyLmgiIDEKIAoKCgoKCgoKIyAxICIu Li9vcGVyYXRvci8uLi9vcGVyYXRvci5oIiAxCiAKCgojIDE3ICIuLi9vcGVyYXRvci8uLi9vcGVy YXRvci5oIgoKIyA5ICIuLi9vcGVyYXRvci9vcE5STHNvbHZlci5oIiAyCgoKIyAxICIuLi9vcGVy YXRvci9OUkxzb2x2ZXIvaW5jbHVkZS9sdWRlY29tcC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgpleHRlcm4gIkMiIHsKCgojIDEgIi4uL29wZXJhdG9yL05STHNvbHZlci9pbmNsdWRlL2Rh dGF0eXBlLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyOCAiLi4v b3BlcmF0b3IvTlJMc29sdmVyL2luY2x1ZGUvbHVkZWNvbXAuaCIgMgoKIyAxICIuLi9vcGVyYXRv ci9OUkxzb2x2ZXIvaW5jbHVkZS9ub256ZXJvcy5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCmV4dGVybiAiQyIgewoKCgoKdHlwZWRlZiBzdHJ1Y3QgX05vblplcm9zIHsKICB1bnNpZ25l ZCBpbnQgICBub2RlczsKICB1bnNpZ25lZCBpbnQgKiBpbmRleDsKICB1bnNpZ25lZCBpbnQgKiBh ZGpjbnQ7CiAgdW5zaWduZWQgaW50ICAgYWRqbGVuOwp9ICpOb25aZXJvczsKCnZvaWQgICAgIE91 dHB1dE5aKE5vblplcm9zIG5vbnplcm9zLCBjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ck5vblplcm9z IFJlYWRJbk5aKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKdW5zaWduZWQgaW50ICAgICAgRGVsZXRl TlooTm9uWmVyb3Mgbm9uemVyb3MpOwp1bnNpZ25lZCBpbnQgICAgICBTaXplT2ZOWihOb25aZXJv cyBub256ZXJvcyk7CnZvaWQgICAgIFByaW50TlooTm9uWmVyb3Mgbm9uemVyb3MsIGNvbnN0IHVu c2lnbmVkIGludCAqIHBlcm11dGUsIGNvbnN0IHVuc2lnbmVkIGludCAqIGludmVyc2UsCgkJIEZJ TEUqIHN0cmVhbSk7CnZvaWQgICAgIENoZWNrTlooTm9uWmVyb3Mgbm9uemVyb3MsIEZJTEUqIHN0 cmVhbSk7Ck5vblplcm9zIFBlcm11dGVOWihOb25aZXJvcyBub256ZXJvcywgY29uc3QgdW5zaWdu ZWQgaW50ICogcGVybXV0ZSwgY29uc3QgdW5zaWduZWQgaW50ICogaW52ZXJzZSk7CgoKfQoKCgoj IDI5ICIuLi9vcGVyYXRvci9OUkxzb2x2ZXIvaW5jbHVkZS9sdWRlY29tcC5oIiAyCgoKdHlwZWRl ZiBzdHJ1Y3QgX0dsb2JhbE1hdHJpeCogR2xvYmFsTWF0cml4OwoKIAoKCgoKCgoKR2xvYmFsTWF0 cml4IENyZWF0ZUdNKE5vblplcm9zIG1hdHJpeCwgY29uc3QgY2hhciogcHJlZml4KTsKCiAKCgp1 bnNpZ25lZCBpbnQgRGVsZXRlR00oR2xvYmFsTWF0cml4IG1hdHJpeCk7CgogCgoKdW5zaWduZWQg aW50IFJlbnVtYmVyR00oR2xvYmFsTWF0cml4IG1hdHJpeCwgdW5zaWduZWQgaW50IGRvZik7Cgog CgoKdW5zaWduZWQgaW50IEludlJlbnVtR00oR2xvYmFsTWF0cml4IG1hdHJpeCwgdW5zaWduZWQg aW50IGRvZik7CgogCgoKdW5zaWduZWQgaW50IERpbWVuc2lvbkdNKEdsb2JhbE1hdHJpeCBtYXRy aXgpOwoKIAoKCgoKdm9pZCBBc3NlbWJsZUdNKEdsb2JhbE1hdHJpeCBtYXRyaXgsIHVuc2lnbmVk IGludCBzaXplLCBjb25zdCBpbnQqIGluZGV4LAoJCWNvbnN0IHZvaWQqIGVtYXQpOwoKIAoKCgpk b3VibGUgIExvb2tVcEVNKGNvbnN0IHZvaWQqIGVtYXQsIHVuc2lnbmVkIGludCByb3csIHVuc2ln bmVkIGludCBjb2wpOwoKIAoKCnZvaWQgU2V0RW50cnlHTShHbG9iYWxNYXRyaXggbWF0cml4LCB1 bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLAoJCWRvdWJsZSAgdmFsdWUpOwoKIAoK Cgp2b2lkIEZhY3RvckdNKEdsb2JhbE1hdHJpeCBtYXRyaXgsIHVuc2lnbmVkIGludCBpbmRleCk7 CgogCgoKCgp2b2lkIFNvbHZlR00oR2xvYmFsTWF0cml4IG1hdHJpeCwgdW5zaWduZWQgaW50IG51 bXZlY3MsCgkgICAgIGRvdWJsZSAqKiB2ZWN0b3JzKTsKCiAKCgp2b2lkIE11bHRpcGx5R00oR2xv YmFsTWF0cml4IG1hdHJpeCwgY29uc3QgZG91YmxlICogdmVjdG9yLAoJCWRvdWJsZSAqIHByb2R1 Y3QpOwoKIAoKCgp2b2lkIFZlcmlmeUdNKEdsb2JhbE1hdHJpeCBjb2VmLCBjb25zdCBkb3VibGUg KiBzb2xuLAoJICAgICAgY29uc3QgZG91YmxlICogdmVjdCk7CgogCgoKCgp2b2lkIFJlc2V0R00o R2xvYmFsTWF0cml4IGNvZWYpOwoKIAoKCn0KCgoKIyAxMSAiLi4vb3BlcmF0b3Ivb3BOUkxzb2x2 ZXIuaCIgMgoKCgogCgogCgoKCmNsYXNzIG9wX05STHNvbHZlckxVIDogcHVibGljIG9wX09wZXJh dG9yPHJlYWw+IHsKCnB1YmxpYzoKICAgCgogIG9wX05STHNvbHZlckxVKG9wX09wZXJhdG9yPHJl YWw+JiBBKTsKCiAgdmlydHVhbCB+b3BfTlJMc29sdmVyTFUoKTsKCiAgIAoKICB2aXJ0dWFsIHZv aWQgb3BlcmF0b3IoKShjb25zdCBmbmNfRnVuY3Rpb248cmVhbD4mIGZuY1ksCgkJCSAgZm5jX0Z1 bmN0aW9uPHJlYWw+JiBmbmNYKTsKCiAgIAoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgZm5jX1Zl Y3RvcjxyZWFsPiYgZm5jWSwgZm5jX1ZlY3RvcjxyZWFsPiYgZm5jWCk7CgogICAKCiAgdmlydHVh bCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zKSBjb25zdDsKCiAgIAogIHZpcnR1YWwgY29uc3Qg c3BjX1NwYWNlPHJlYWw+JiBzcGFjZVgoKSBjb25zdDsKCiAgIAogIHZpcnR1YWwgY29uc3Qgc3Bj X1NwYWNlPHJlYWw+JiBzcGFjZVkoKSBjb25zdDsKcHJpdmF0ZTogIAogICAKICBHbG9iYWxNYXRy aXggQV87CgogICAKICBfTm9uWmVyb3Mgc3BhcnNpdHlfOwoKICAgCiAgdWludCBuXzsKCiAgIAog IG9wX09wZXJhdG9yPHJlYWw+JiBPXzsKfTsKCgojIDE1ICIuLi9vcGVyYXRvci5oIiAyCgoKCiMg MjUgImxpbmVsLmNjIiAyCgojIDEgIi4uL2hwLmgiIDEKIAoKCgoKCgojIDEgIi4uL2hwL2hwQkZv cm0uaCIgMQogCgoKCgoKCgoKCgogCgogCgpjbGFzcyBocF9MYXBsYWNlIDogcHVibGljIG9wX0Jp bGluZWFyRm9ybTxyZWFsPiB7CgogcHVibGljOgogICAKCgogIGlubGluZSBocF9MYXBsYWNlKHVp bnQgZ2F1c3MpOwogIGlubGluZSB2aXJ0dWFsIH5ocF9MYXBsYWNlKCk7CgogICAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4m IGVsbVgsIAoJCSAgY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVksIAoJCSAgc3BjX0VsZW1l bnRNYXRyaXg8cmVhbD4mIGVtKTsgCgoKCgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDJk MDAwJiBlbG1YLCBjb25zdCBocF9IUDJkMDAwJiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50TWF0cml4 PHJlYWw+JiBlbSk7CgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDJkMDAxJiBlbG1YLCBj b25zdCBocF9IUDJkMDAxJiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7 CiAgCiAgcHJpdmF0ZToKICAgCiAgdWludCAgbl87CgogICAKICBSZWFsMmQqIHNocGZuY0RfOwoK ICAgCiAgdWludCBnYXVzc187CiAKfTsgCgppbmxpbmUgaHBfTGFwbGFjZTo6aHBfTGFwbGFjZSh1 aW50IGdhdXNzKSB7CiAgbl8gPSAwOyBzaHBmbmNEXyA9IF9fbnVsbCA7CiAgZ2F1c3NfID0gZ2F1 c3M7Cn0KCmlubGluZSBocF9MYXBsYWNlOjp+aHBfTGFwbGFjZSgpIHsKICBkZWxldGVbXSBzaHBm bmNEXzsKfSAKCiAKCiAKCgpjbGFzcyBocF9JZGVudGl0eSA6IHB1YmxpYyBvcF9CaWxpbmVhckZv cm08cmVhbD4gewoKIHB1YmxpYzoKICAgCgoKICBpbmxpbmUgaHBfSWRlbnRpdHkodWludCBnYXVz cyk7CiAgaW5saW5lIHZpcnR1YWwgfmhwX0lkZW50aXR5KCk7CgogICAKCgoKCgoKICB2b2lkIG9w ZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVgsIAoJCSAgY29uc3Qgc3BjX0Vs ZW1lbnQ8cmVhbD4mIGVsbVksIAoJCSAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsgCgoK CgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDJkMDAwJiBlbG1YLCBjb25zdCBocF9IUDJk MDAwJiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7IAoKICB2b2lkIG9w ZXJhdG9yKCkoY29uc3QgaHBfSFAyZDAwMSYgZWxtWCwgY29uc3QgaHBfSFAyZDAwMSYgZWxtWSwg CgkJICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOyAKCiBwcml2YXRlOgogICAKICB1aW50 ICBuXzsKCiAgIAogIHJlYWwqIHNocGZuY187CiAKICAgCiAgdWludCBnYXVzc187Cn07IAoKaW5s aW5lIGhwX0lkZW50aXR5OjpocF9JZGVudGl0eSh1aW50IGdhdXNzKSB7CiAgbl8gPSAwOyBzaHBm bmNfID0gX19udWxsIDsKICBnYXVzc18gPSBnYXVzczsKfQoKaW5saW5lIGhwX0lkZW50aXR5Ojp+ aHBfSWRlbnRpdHkoKSB7CiAgZGVsZXRlW10gc2hwZm5jXzsKfQoKCiMgOCAiLi4vaHAuaCIgMgoK CiMgMSAiLi4vaHAvaHBMRm9ybS5oIiAxCiAKCgoKCgoKCgoKCgoKIAoKIAoKCgoKY2xhc3MgaHBf Umllc3ogOiBwdWJsaWMgZm5jX0xpbmVhckZvcm08cmVhbD4gewoKcHVibGljOgogICAKCgoKCgoK CiAgaHBfUmllc3ooY29uc3QgdGJ4X0Zvcm11bGEmIGZybSwgdWludCBnYXVzcyA9IDAsIAoJICAg aHBfQm91bmRhcnlDb25kaXRpb24qIGJjID0gMCk7IAogIGlubGluZSB+aHBfUmllc3ooKTsKCiAg IAoKCgoKCgoKICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbSwK CQkJICBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOwoKCgogIHZvaWQgb3BlcmF0b3IoKShj b25zdCBocF9IUDJkMDAwJiBlbG0sIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7CgogIHZv aWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDJkMDAxJiBlbG0sIHNwY19FbGVtZW50TWF0cml4PHJl YWw+JiBlbSk7Cgpwcml2YXRlOgogICAKICBjb25zdCB0YnhfRm9ybXVsYSogZnJtXzsKCiAgIAog IHVpbnQgICBnYXVzc187CgogICAKICByZWFsKiAgc2hwZm5jXzsKCiAgIAogIHVpbnQgICBuXzsK CiAgIAoKICBocF9Cb3VuZGFyeUNvbmRpdGlvbiogYmNfOwp9OyAKCmlubGluZSBocF9SaWVzejo6 fmhwX1JpZXN6KCkgewogIGRlbGV0ZVtdIHNocGZuY187Cn0KCgojIDEwICIuLi9ocC5oIiAyCgoK CiMgMSAiLi4vaHAvaHBMaXN0cy5oIiAxCiAKCgoKCgoKCgoKCiAKCiAKCgoKCmNsYXNzIGhwX1Zl cnRleExpc3QgOiBwdWJsaWMgZ2VvX1ZlcnRleExpc3QgewoKcHVibGljOgogICAKCiAgaHBfVmVy dGV4TGlzdChlbnVtIGdlb19WZXJ0ZXhMaXN0Ojp2dHhJbmZvIGluZm8gPSBBTEwpIDogCiAgICBn ZW9fVmVydGV4TGlzdChpbmZvKSB7fQoKICB2aXJ0dWFsIH5ocF9WZXJ0ZXhMaXN0KCk7CgogICAK CgoKCiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBl bG0pOwp9OwoKCiMgMTMgIi4uL2hwLmgiIDIKCgogCiMgMSAiLi4vaHAvaHBTcGFjZTNkLmgiIDEK IAoKCgoKCgojIDEgIi4uL2hwL2hwRWxlbWVudHMzZC5oIiAxCiAKCgoKCgoKCgojIDEgIi4uL2hw L2hwRWxlbWVudDNkLmgiIDEKIAoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGlu dXgvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdmVjdG9yIiAxIDMKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTM4Ni1saW51 eC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYnZlY3Rvci5oIiAxIDMKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogIAoKc3RhdGljIGNvbnN0IGludCBfX1dP UkRfQklUID0gaW50KDggKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKCgoKCgoKc3RydWN0IF9CaXRf cmVmZXJlbmNlIHsKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX21hc2s7 CiAgX0JpdF9yZWZlcmVuY2UodW5zaWduZWQgaW50KiBfX3gsIHVuc2lnbmVkIGludCBfX3kpIAog ICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7fQoKcHVibGljOgogIF9CaXRfcmVmZXJlbmNl KCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHt9CiAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0 dXJuICEoISgqX01fcCAmIF9NX21hc2spKTsgfQogIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0o Ym9vbCBfX3gpCiAgewogICAgaWYgKF9feCkgICpfTV9wIHw9IF9NX21hc2s7CiAgICBlbHNlICAg ICAgKl9NX3AgJj0gfl9NX21hc2s7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9CaXRfcmVmZXJl bmNlJiBvcGVyYXRvcj0oY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgCiAgICB7IHJldHVybiAq dGhpcyA9IGJvb2woX194KTsgfQogIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfQml0X3JlZmVyZW5j ZSYgX194KSBjb25zdAogICAgeyByZXR1cm4gYm9vbCgqdGhpcykgPT0gYm9vbChfX3gpOyB9CiAg Ym9vbCBvcGVyYXRvcjwoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QgewogICAgcmV0 dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7CiAgfQogIHZvaWQgZmxpcCgpIHsgKl9NX3Ag Xj0gX01fbWFzazsgfQp9OwoKaW5saW5lIHZvaWQgc3dhcChfQml0X3JlZmVyZW5jZSBfX3gsIF9C aXRfcmVmZXJlbmNlIF9feSkKewogIGJvb2wgX190bXAgPSBfX3g7CiAgX194ID0gX195OwogIF9f eSA9IF9fdG1wOwp9CgpzdHJ1Y3QgX0JpdF9pdGVyYXRvciA6IHB1YmxpYyByYW5kb21fYWNjZXNz X2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZfdD4gewogIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UgIHJl ZmVyZW5jZTsKICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOwogIHR5cGVkZWYgX0Jp dF9pdGVyYXRvciAgIGl0ZXJhdG9yOwoKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQg aW50IF9NX29mZnNldDsKICB2b2lkIGJ1bXBfdXAoKSB7CiAgICBpZiAoX01fb2Zmc2V0KysgPT0g X19XT1JEX0JJVCAtIDEpIHsKICAgICAgX01fb2Zmc2V0ID0gMDsKICAgICAgKytfTV9wOwogICAg fQogIH0KICB2b2lkIGJ1bXBfZG93bigpIHsKICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7CiAg ICAgIF9NX29mZnNldCA9IF9fV09SRF9CSVQgLSAxOwogICAgICAtLV9NX3A7CiAgICB9CiAgfQoK ICBfQml0X2l0ZXJhdG9yKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQoMCkge30KICBfQml0X2l0ZXJh dG9yKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSAKICAgIDogX01fcChfX3gp LCBfTV9vZmZzZXQoX195KSB7fQogIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVy biByZWZlcmVuY2UoX01fcCwgMVUgPDwgX01fb2Zmc2V0KTsgfQogIGl0ZXJhdG9yJiBvcGVyYXRv cisrKCkgewogICAgYnVtcF91cCgpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVyYXRvciBv cGVyYXRvcisrKGludCkgewogICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIGJ1bXBfdXAo KTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CiAgICBi dW1wX2Rvd24oKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaXRlcmF0b3Igb3BlcmF0b3ItLShp bnQpIHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICBidW1wX2Rvd24oKTsKICAgIHJl dHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9f aSkgewogICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9faSArIF9NX29mZnNldDsKICAgIF9NX3Ag Kz0gX19uIC8gX19XT1JEX0JJVDsKICAgIF9fbiA9IF9fbiAlIF9fV09SRF9CSVQ7CiAgICBpZiAo X19uIDwgMCkgewogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBfX24gKyBfX1dPUkRf QklUOwogICAgICAtLV9NX3A7CiAgICB9IGVsc2UKICAgICAgX01fb2Zmc2V0ID0gKHVuc2lnbmVk IGludCkgX19uOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVyYXRvciYgb3BlcmF0b3ItPShk aWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICAqdGhpcyArPSAtX19pOwogICAgcmV0dXJuICp0aGlz OwogIH0KICBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3Qgewog ICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIHJldHVybiBfX3RtcCArPSBfX2k7CiAgfQog IGl0ZXJhdG9yIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdCB7CiAgICBpdGVy YXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wIC09IF9faTsKICB9CiAgZGlmZmVy ZW5jZV90eXBlIG9wZXJhdG9yLShpdGVyYXRvciBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfX1dP UkRfQklUICogKF9NX3AgLSBfX3guX01fcCkgKyBfTV9vZmZzZXQgLSBfX3guX01fb2Zmc2V0Owog IH0KICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19pKSB7IHJldHVybiAq KCp0aGlzICsgX19pKTsgfQogIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgX194KSBj b25zdCB7CiAgICByZXR1cm4gX01fcCA9PSBfX3guX01fcCAmJiBfTV9vZmZzZXQgPT0gX194Ll9N X29mZnNldDsKICB9CiAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiBfTV9wICE9IF9feC5fTV9wIHx8IF9NX29mZnNldCAhPSBfX3guX01fb2Zm c2V0OwogIH0KICBib29sIG9wZXJhdG9yPChpdGVyYXRvciBfX3gpIGNvbnN0IHsKICAgIHJldHVy biBfTV9wIDwgX194Ll9NX3AgfHwgKF9NX3AgPT0gX194Ll9NX3AgJiYgX01fb2Zmc2V0IDwgX194 Ll9NX29mZnNldCk7CiAgfQp9OwoKc3RydWN0IF9CaXRfY29uc3RfaXRlcmF0b3IKICA6IHB1Ymxp YyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZfdD4KewogIHR5cGVkZWYgYm9v bCAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwogIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAg ICAgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgYm9vbCogICAgICAgICAgcG9pbnRl cjsKICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgIGNvbnN0X2l0ZXJhdG9yOwoKICB1bnNp Z25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNldDsKICB2b2lkIGJ1bXBfdXAo KSB7CiAgICBpZiAoX01fb2Zmc2V0KysgPT0gX19XT1JEX0JJVCAtIDEpIHsKICAgICAgX01fb2Zm c2V0ID0gMDsKICAgICAgKytfTV9wOwogICAgfQogIH0KICB2b2lkIGJ1bXBfZG93bigpIHsKICAg IGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7CiAgICAgIF9NX29mZnNldCA9IF9fV09SRF9CSVQgLSAx OwogICAgICAtLV9NX3A7CiAgICB9CiAgfQoKICBfQml0X2NvbnN0X2l0ZXJhdG9yKCkgOiBfTV9w KDApLCBfTV9vZmZzZXQoMCkge30KICBfQml0X2NvbnN0X2l0ZXJhdG9yKHVuc2lnbmVkIGludCog X194LCB1bnNpZ25lZCBpbnQgX195KSAKICAgIDogX01fcChfX3gpLCBfTV9vZmZzZXQoX195KSB7 fQogIF9CaXRfY29uc3RfaXRlcmF0b3IoY29uc3QgX0JpdF9pdGVyYXRvciYgX194KSAKICAgIDog X01fcChfX3guX01fcCksIF9NX29mZnNldChfX3guX01fb2Zmc2V0KSB7fQogIGNvbnN0X3JlZmVy ZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CiAgICByZXR1cm4gX0JpdF9yZWZlcmVuY2UoX01fcCwg MVUgPDwgX01fb2Zmc2V0KTsKICB9CiAgY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CiAg ICBidW1wX3VwKCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGNvbnN0X2l0ZXJhdG9yIG9wZXJh dG9yKysoaW50KSB7CiAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgYnVtcF91 cCgpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3ItLSgp IHsKICAgIGJ1bXBfZG93bigpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBjb25zdF9pdGVyYXRv ciBvcGVyYXRvci0tKGludCkgewogICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAg IGJ1bXBfZG93bigpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBjb25zdF9pdGVyYXRvciYgb3Bl cmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0g X19pICsgX01fb2Zmc2V0OwogICAgX01fcCArPSBfX24gLyBfX1dPUkRfQklUOwogICAgX19uID0g X19uICUgX19XT1JEX0JJVDsKICAgIGlmIChfX24gPCAwKSB7CiAgICAgIF9NX29mZnNldCA9ICh1 bnNpZ25lZCBpbnQpIF9fbiArIF9fV09SRF9CSVQ7CiAgICAgIC0tX01fcDsKICAgIH0gZWxzZQog ICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBfX247CiAgICByZXR1cm4gKnRoaXM7CiAg fQogIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKICAg ICp0aGlzICs9IC1fX2k7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGNvbnN0X2l0ZXJhdG9yIG9w ZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdCB7CiAgICBjb25zdF9pdGVyYXRvciBf X3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wICs9IF9faTsKICB9CiAgY29uc3RfaXRlcmF0 b3Igb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0IHsKICAgIGNvbnN0X2l0ZXJh dG9yIF9fdG1wID0gKnRoaXM7CiAgICByZXR1cm4gX190bXAgLT0gX19pOwogIH0KICBkaWZmZXJl bmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0X2l0ZXJhdG9yIF9feCkgY29uc3QgewogICAgcmV0dXJu IF9fV09SRF9CSVQgKiAoX01fcCAtIF9feC5fTV9wKSArIF9NX29mZnNldCAtIF9feC5fTV9vZmZz ZXQ7CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX2kp IHsgCiAgICByZXR1cm4gKigqdGhpcyArIF9faSk7IAogIH0KICBib29sIG9wZXJhdG9yPT0oY29u c3QgY29uc3RfaXRlcmF0b3ImIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3AgPT0gX194Ll9N X3AgJiYgX01fb2Zmc2V0ID09IF9feC5fTV9vZmZzZXQ7CiAgfQogIGJvb2wgb3BlcmF0b3IhPShj b25zdCBjb25zdF9pdGVyYXRvciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fcCAhPSBfX3gu X01fcCB8fCBfTV9vZmZzZXQgIT0gX194Ll9NX29mZnNldDsKICB9CiAgYm9vbCBvcGVyYXRvcjwo Y29uc3RfaXRlcmF0b3IgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fcCA8IF9feC5fTV9wIHx8 IChfTV9wID09IF9feC5fTV9wICYmIF9NX29mZnNldCA8IF9feC5fTV9vZmZzZXQpOwogIH0KfTsK CiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yLCBib29sIF9faXNfc3RhdGljPgpj bGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlIHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0Fs bG9jX3RyYWl0czxib29sLCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgIGFs bG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJl dHVybiBfTV9kYXRhX2FsbG9jYXRvcjsgfQoKICBfQnZlY3Rvcl9hbGxvY19iYXNlKGNvbnN0IGFs bG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9NX2RhdGFfYWxsb2NhdG9yKF9fYSksIF9NX3N0YXJ0 KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSB7fQoKcHJvdGVjdGVkOgogIHVu c2lnbmVkIGludCogX01fYml0X2FsbG9jKHNpemVfdCBfX24pIAogICAgeyByZXR1cm4gX01fZGF0 YV9hbGxvY2F0b3IuYWxsb2NhdGUoKF9fbiArIF9fV09SRF9CSVQgLSAxKS9fX1dPUkRfQklUKTsg fQogIHZvaWQgX01fZGVhbGxvY2F0ZSgpIHsKICAgIGlmIChfTV9zdGFydC5fTV9wKQogICAgICBf TV9kYXRhX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQuX01fcCk7 CiAgfSAgCgogIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dW5zaWduZWQgaW50LCBfQWxsb2NhdG9y Pjo6YWxsb2NhdG9yX3R5cGUgCiAgICAgICAgICBfTV9kYXRhX2FsbG9jYXRvcjsKICBfQml0X2l0 ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwogIHVuc2lnbmVkIGlu dCogX01fZW5kX29mX3N0b3JhZ2U7Cn07CgogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yPgpj bGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvY2F0b3IsIHRydWU+IHsKcHVibGljOgogIHR5 cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9y X3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxv Y2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgpOyB9CgogIF9CdmVjdG9yX2Fs bG9jX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKQogICAgOiBfTV9zdGFydCgpLCBfTV9maW5p c2goKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkge30KCnByb3RlY3RlZDoKICB0eXBlZGVmIHR5cGVu YW1lIF9BbGxvY190cmFpdHM8dW5zaWduZWQgaW50LCBfQWxsb2NhdG9yPjo6X0FsbG9jX3R5cGUK ICAgICAgICAgIF9BbGxvY190eXBlOwogICAgICAgICAgCiAgdW5zaWduZWQgaW50KiBfTV9iaXRf YWxsb2Moc2l6ZV90IF9fbikgCiAgICB7IHJldHVybiBfQWxsb2NfdHlwZTo6YWxsb2NhdGUoKF9f biArIF9fV09SRF9CSVQgLSAxKS9fX1dPUkRfQklUKTsgfQogIHZvaWQgX01fZGVhbGxvY2F0ZSgp IHsKICAgIGlmIChfTV9zdGFydC5fTV9wKQogICAgICBfQWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShf TV9zdGFydC5fTV9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9lbmRfb2Zfc3Rv cmFnZSAtIF9NX3N0YXJ0Ll9NX3ApOwogIH0gIAoKICBfQml0X2l0ZXJhdG9yIF9NX3N0YXJ0Owog IF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwogIHVuc2lnbmVkIGludCogX01fZW5kX29mX3N0b3Jh Z2U7Cn07ICAKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmNsYXNzIF9CdmVjdG9yX2Jhc2UKICA6 IHB1YmxpYyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9BbGxvY190cmFpdHM8Ym9vbCwgX0FsbG9jPjo6X1NfaW5zdGFuY2VsZXNzPgp7 CiAgdHlwZWRlZiBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+ CiAgICAgICAgICBfQmFzZTsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9j YXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBfQnZlY3Rvcl9iYXNlKGNvbnN0IGFsbG9jYXRv cl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7fQogIH5fQnZlY3Rvcl9iYXNlKCkgeyBfQmFzZTo6 X01fZGVhbGxvY2F0ZSgpOyB9Cn07CgojIDM0OCAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4 LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9idmVjdG9yLmgiIDMKCgogCiAK IAogCgoKCgoKCgoKCgogICAgICAgIAoKICAgICAgICAKdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPiBj bGFzcyB2ZWN0b3I8Ym9vbCxfQWxsb2M+CiAgOiBwdWJsaWMgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+ CgoKCgp7CgogIHR5cGVkZWYgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+IF9CYXNlOwoKCgpwdWJsaWM6 CiAgdHlwZWRlZiBib29sIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwog IHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsgCiAgdHlwZWRlZiBfQml0X3JlZmVy ZW5jZSByZWZlcmVuY2U7CiAgdHlwZWRlZiBib29sIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVm IF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgYm9vbCogY29uc3RfcG9p bnRlcjsKCiAgdHlwZWRlZiBfQml0X2l0ZXJhdG9yICAgICAgICAgICAgICAgIGl0ZXJhdG9yOwog IHR5cGVkZWYgX0JpdF9jb25zdF9pdGVyYXRvciAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKCgog IHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9p dGVyYXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRl cmF0b3I7CgoKCgoKCgogIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFs bG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJl dHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9Cgpwcm90ZWN0ZWQ6CgoKCgoKCgoKcHJvdGVj dGVkOgogIHZvaWQgX01faW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKSB7CiAgICB1bnNpZ25lZCBp bnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX24pOwogICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3Eg KyAoX19uICsgX19XT1JEX0JJVCAtIDEpL19fV09SRF9CSVQ7CiAgICBfTV9zdGFydCA9IGl0ZXJh dG9yKF9fcSwgMCk7CiAgICBfTV9maW5pc2ggPSBfTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShf X24pOwogIH0KICB2b2lkIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgYm9vbCBf X3gpIHsKICAgIGlmIChfTV9maW5pc2guX01fcCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAg ICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIF9NX2ZpbmlzaCwgX01fZmluaXNoICsgMSk7CiAg ICAgICpfX3Bvc2l0aW9uID0gX194OwogICAgICArK19NX2ZpbmlzaDsKICAgIH0KICAgIGVsc2Ug ewogICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgPyAyICogc2l6ZSgpIDogX19XT1JEX0JJ VDsKICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBfTV9iaXRfYWxsb2MoX19sZW4pOwogICAgICBp dGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkp OwogICAgICAqX19pKysgPSBfX3g7CiAgICAgIF9NX2ZpbmlzaCA9IGNvcHkoX19wb3NpdGlvbiwg ZW5kKCksIF9faSk7CiAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAgICAgX01fZW5kX29mX3N0b3Jh Z2UgPSBfX3EgKyAoX19sZW4gKyBfX1dPUkRfQklUIC0gMSkvX19XT1JEX0JJVDsKICAgICAgX01f c3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAgfQogIH0KCgogIHRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luaXRpYWxpemVfcmFuZ2UoX0lucHV0SXRlcmF0b3Ig X19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAg ICBpbnB1dF9pdGVyYXRvcl90YWcpIHsKICAgIF9NX3N0YXJ0ID0gaXRlcmF0b3IoKTsKICAgIF9N X2ZpbmlzaCA9IGl0ZXJhdG9yKCk7CiAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IDA7CiAgICBmb3Ig KCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIAogICAgICBwdXNoX2JhY2soKl9fZmly c3QpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CiAgdm9pZCBfTV9p bml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRv ciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFn KSB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X19uKTsKICAgIF9NX2luaXRpYWxpemUoX19uKTsKICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBf TV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBf TV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykgewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9f bGFzdDsgKytfX2ZpcnN0KSB7CiAgICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7 CiAgICAgICsrX19wb3M7CiAgICB9CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVy YXRvcj4KICB2b2lkIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3Bvc2l0aW9uLAogICAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRv ciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpIHsK ICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgICBzaXplX3R5cGUgX19uID0gMDsKICAg ICAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24pOwogICAgICBpZiAoY2FwYWNpdHkoKSAt IHNpemUoKSA+PSBfX24pIHsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgp LCBfTV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CiAgICAgICAgY29weShfX2ZpcnN0 LCBfX2xhc3QsIF9fcG9zaXRpb24pOwogICAgICAgIF9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5 cGUoX19uKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzaXplX3R5cGUgX19sZW4gPSBz aXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAgICAgIHVuc2lnbmVkIGludCogX19xID0gX01f Yml0X2FsbG9jKF9fbGVuKTsKICAgICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9f cG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwogICAgICAgIF9faSA9IGNvcHkoX19maXJzdCwg X19sYXN0LCBfX2kpOwogICAgICAgIF9NX2ZpbmlzaCA9IGNvcHkoX19wb3NpdGlvbiwgZW5kKCks IF9faSk7CiAgICAgICAgX01fZGVhbGxvY2F0ZSgpOwogICAgICAgIF9NX2VuZF9vZl9zdG9yYWdl ID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAtIDEpL19fV09SRF9CSVQ7CiAgICAgICAgX01f c3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAgICB9CiAgICB9CiAgfSAgICAgIAoKCgpwdWJs aWM6CiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV9zdGFydDsgfQogIGNvbnN0X2l0ZXJh dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fc3RhcnQ7IH0KICBpdGVyYXRvciBlbmQoKSB7 IHJldHVybiBfTV9maW5pc2g7IH0KICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy biBfTV9maW5pc2g7IH0KCiAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZl cnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkg Y29uc3QgeyAKICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgCiAgfQog IHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4o KSk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IAogICAgcmV0dXJu IGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IAogIH0KCiAgc2l6ZV90eXBlIHNpemUo KSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoZW5kKCkgLSBiZWdpbigpKTsgfQogIHNpemVfdHlw ZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KICBzaXplX3R5cGUg Y2FwYWNpdHkoKSBjb25zdCB7CiAgICByZXR1cm4gc2l6ZV90eXBlKGNvbnN0X2l0ZXJhdG9yKF9N X2VuZF9vZl9zdG9yYWdlLCAwKSAtIGJlZ2luKCkpOwogIH0KICBib29sIGVtcHR5KCkgY29uc3Qg eyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQogIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVf dHlwZSBfX24pIHsKICAgIHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7 CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsK ICAgIHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CiAgfQoKICBleHBs aWNpdCB2ZWN0b3IgKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgp KQogICAgOiBfQmFzZShfX2EpIHt9CgogIHZlY3RvciAoc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3Zh bHVlLAogICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5 cGUoKSkKICAgIDogX0Jhc2UoX19hKQogIHsKICAgIF9NX2luaXRpYWxpemUoX19uKTsKICAgIGZp bGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIF9fdmFsdWUgPyB+MCA6IDApOwog IH0KCiAgZXhwbGljaXQgdmVjdG9yIChzaXplX3R5cGUgX19uKQogICAgOiBfQmFzZShhbGxvY2F0 b3JfdHlwZSgpKQogIHsKICAgIF9NX2luaXRpYWxpemUoX19uKTsKICAgIGZpbGwoX01fc3RhcnQu X01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIDApOwogIH0KCiAgdmVjdG9yIChjb25zdCB2ZWN0b3Ig JiBfX3gpIDogX0Jhc2UoX194LmdldF9hbGxvY2F0b3IoKSkgewogICAgX01faW5pdGlhbGl6ZShf X3guc2l6ZSgpKTsKICAgIGNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX01fc3RhcnQpOwog IH0KCgogICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdmVjdG9yIChfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgIGNv bnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShf X2EpCiAgewogICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46 Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3Qs IF9fbGFzdCwgX0ludGVncmFsKCkpOwogIH0KICAgIAogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdl cj4KICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBf X3gsIF9fdHJ1ZV90eXBlKSB7CiAgICBfTV9pbml0aWFsaXplKF9fbik7CiAgICBmaWxsKF9NX3N0 YXJ0Ll9NX3AsIF9NX2VuZF9vZl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOwogIH0KICAgIAogIHRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0 Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX2ZhbHNlX3R5cGUpIHsKICAgIF9NX2luaXRpYWxpemVf cmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsK ICB9CiMgNTg3ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4u L2luY2x1ZGUvZysrLTMvc3RsX2J2ZWN0b3IuaCIgMwoKCiAgfnZlY3RvciAoKSB7IH0KCiAgdmVj dG9yICYgb3BlcmF0b3I9KGNvbnN0IHZlY3RvciAmIF9feCkgewogICAgaWYgKCZfX3ggPT0gdGhp cykgcmV0dXJuICp0aGlzOwogICAgaWYgKF9feC5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CiAgICAg IF9NX2RlYWxsb2NhdGUoKTsKICAgICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKICAgIH0K ICAgIGNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgYmVnaW4oKSk7CiAgICBfTV9maW5pc2gg PSBiZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9feC5zaXplKCkpOwogICAgcmV0dXJuICp0aGlz OwogIH0KCiAgIAogICAKICAgCiAgIAoKICB2b2lkIGFzc2lnbihzaXplX3QgX19uLCBib29sIF9f eCkgewogICAgaWYgKF9fbiA+IHNpemUoKSkgewogICAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9N X2VuZF9vZl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOwogICAgICBpbnNlcnQoZW5kKCksIF9fbiAt IHNpemUoKSwgX194KTsKICAgIH0KICAgIGVsc2UgewogICAgICBlcmFzZShiZWdpbigpICsgX19u LCBlbmQoKSk7CiAgICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIF9f eCA/IH4wIDogMCk7CiAgICB9CiAgfQoKCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRv cj4KICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBf X2xhc3QpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+ OjpfSW50ZWdyYWwgX0ludGVncmFsOwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9f bGFzdCwgX0ludGVncmFsKCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZv aWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1 ZV90eXBlKQogICAgeyBhc3NpZ24oKHNpemVfdCkgX19uLCAoYm9vbCkgX192YWwpOyB9CgogIHRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1 dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkKICAgIHsgX01f YXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3Qg KSApOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2Fzc2ln bl9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpIHsKICAgIGl0ZXJhdG9yIF9fY3Vy ID0gYmVnaW4oKTsKICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5k KCk7ICsrX19jdXIsICsrX19maXJzdCkKICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7CiAgICBpZiAo X19maXJzdCA9PSBfX2xhc3QpCiAgICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CiAgICBlbHNlCiAg ICAgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKICB9CgogIHRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9y IF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICBm b3J3YXJkX2l0ZXJhdG9yX3RhZykgewogICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKICAgIGRpc3Rh bmNlKF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwogICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQogICAg ICBlcmFzZShjb3B5KF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSksIGVuZCgpKTsKICAgIGVsc2Ug ewogICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKICAgICAgYWR2YW5jZShf X21pZCwgc2l6ZSgpKTsKICAgICAgY29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CiAgICAg IGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CiAgICB9CiAgfSAgICAKCgoKICB2b2lkIHJl c2VydmUoc2l6ZV90eXBlIF9fbikgewogICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKICAgICAg dW5zaWduZWQgaW50KiBfX3EgPSBfTV9iaXRfYWxsb2MoX19uKTsKICAgICAgX01fZmluaXNoID0g Y29weShiZWdpbigpLCBlbmQoKSwgaXRlcmF0b3IoX19xLCAwKSk7CiAgICAgIF9NX2RlYWxsb2Nh dGUoKTsKICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAgICBfTV9lbmRfb2Zf c3RvcmFnZSA9IF9fcSArIChfX24gKyBfX1dPUkRfQklUIC0gMSkvX19XT1JEX0JJVDsKICAgIH0K ICB9CgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVm ZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFj aygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQogIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29u c3QgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CiAgdm9pZCBwdXNoX2JhY2soYm9vbCBfX3gpIHsK ICAgIGlmIChfTV9maW5pc2guX01fcCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkKICAgICAgKl9NX2Zp bmlzaCsrID0gX194OwogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBfX3gpOwog IH0KICB2b2lkIHN3YXAodmVjdG9yICYgX194KSB7CiAgICAgOjpzd2FwKF9NX3N0YXJ0LCBfX3gu X01fc3RhcnQpOwogICAgIDo6c3dhcChfTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOwogICAgIDo6 c3dhcChfTV9lbmRfb2Zfc3RvcmFnZSwgX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKICB9CiAgaXRl cmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7CiAg ICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01f ZmluaXNoLl9NX3AgIT0gX01fZW5kX29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkK ICAgICAgKl9NX2ZpbmlzaCsrID0gX194OwogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KF9f cG9zaXRpb24sIF9feCk7CiAgICByZXR1cm4gYmVnaW4oKSArIF9fbjsKICB9CgoKICAgCiAgdGVt cGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9z aXRpb24sCiAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0 b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJh dG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsKICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0 aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFz cyBfSW50ZWdlcj4KICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0lu dGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX190cnVl X3R5cGUpIHsKICAgIGluc2VydChfX3BvcywgKHNpemVfdHlwZSkgX19uLCAoYm9vbCkgX194KTsK ICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9k aXNwYXRjaChpdGVyYXRvciBfX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJ dGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgX19mYWxzZV90eXBlKSB7CiAgICBfTV9pbnNlcnRfcmFuZ2UoX19wb3MsIF9fZmly c3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRlZ29yeSggX19maXJzdCApICk7CiAgfQojIDc2MSAi L3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9idmVjdG9yLmgiIDMKCiAgCiAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlv biwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpIHsKICAgIGlmIChfX24gPT0gMCkgcmV0dXJuOwog ICAgaWYgKGNhcGFjaXR5KCkgLSBzaXplKCkgPj0gX19uKSB7CiAgICAgIGNvcHlfYmFja3dhcmQo X19wb3NpdGlvbiwgZW5kKCksIF9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKICAg ICAgZmlsbChfX3Bvc2l0aW9uLCBfX3Bvc2l0aW9uICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9f eCk7CiAgICAgIF9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKICAgIH0KICAgIGVs c2UgewogICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwog ICAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX2xlbik7CiAgICAgIGl0ZXJh dG9yIF9faSA9IGNvcHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CiAg ICAgIGZpbGxfbihfX2ksIF9fbiwgX194KTsKICAgICAgX01fZmluaXNoID0gY29weShfX3Bvc2l0 aW9uLCBlbmQoKSwgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOwogICAgICBfTV9kZWFsbG9j YXRlKCk7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJ VCAtIDEpL19fV09SRF9CSVQ7CiAgICAgIF9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKICAg IH0KICB9CgogIHZvaWQgcG9wX2JhY2soKSB7IC0tX01fZmluaXNoOyB9CiAgaXRlcmF0b3IgZXJh c2UoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgp KQogICAgICBjb3B5KF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CiAgICAgIC0t X01fZmluaXNoOwogICAgcmV0dXJuIF9fcG9zaXRpb247CiAgfQogIGl0ZXJhdG9yIGVyYXNlKGl0 ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkgewogICAgX01fZmluaXNoID0gY29weShf X2xhc3QsIGVuZCgpLCBfX2ZpcnN0KTsKICAgIHJldHVybiBfX2ZpcnN0OwogIH0KICB2b2lkIHJl c2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgYm9vbCBfX3ggPSBib29sKCkpIHsKICAgIGlmIChf X25ld19zaXplIDwgc2l6ZSgpKSAKICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlw ZShfX25ld19zaXplKSwgZW5kKCkpOwogICAgZWxzZQogICAgICBpbnNlcnQoZW5kKCksIF9fbmV3 X3NpemUgLSBzaXplKCksIF9feCk7CiAgfQogIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCks IGVuZCgpKTsgfQp9OwoKCgp0eXBlZGVmIHZlY3Rvcjxib29sLCBhbGxvYz4gYml0X3ZlY3RvcjsK CiMgODIyICIvdXNyL2xpYi9nY2MtbGliL2kzODYtbGludXgvMi45NS4yLy4uLy4uLy4uLy4uL2lu Y2x1ZGUvZysrLTMvc3RsX2J2ZWN0b3IuaCIgMwoKCgoKCgoKCgoKICAKCgoKIAogCiAKIyAzNSAi L3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3ZlY3RvciIgMiAzCgoKCgogCiAKIAojIDkgIi4uL2hwL2hwRWxlbWVudDNkLmgiIDIKCgoK CiAKCiAKCgoKdGVtcGxhdGU8Y2xhc3MgRj4KY2xhc3MgaHBfSFAzZFhYWCA6IHB1YmxpYyBzcGNf RWxlbWVudDxGPiB7CnB1YmxpYzoKICAgCgoKCgogIGlubGluZSBocF9IUDNkWFhYKHNwY19UQ29s dW1uPHJlYWw+KiBULCB1aW50IHApOwoKICAgCgoKCgoKCiAgaW5saW5lIGhwX0hQM2RYWFgoc3Bj X1RDb2x1bW48cmVhbD4qIFQsIHVpbnQgcDAsIHVpbnQgcDEsIHVpbnQgcDIpOwoKICAgCgogIGlu bGluZSBjb25zdCB1c2hvcnQqIHAoKSBjb25zdDsKCiAgIAoKCgogIHZpcnR1YWwgY29uc3QgZ2Vv X0Nvbm5lY3RvcjMmIHN1cHBvcnQoKSBjb25zdCA9IDA7CgogICAKCgogIHZpcnR1YWwgdm9pZCBz aHBmY3RJbmRpY2VzKGNvbnN0IHVpbnQgbiwgdmVjdG9yPHVpbnQ+JiBpbmRpY2VzKSBjb25zdDsK CiAgdmlydHVhbCBjb25zdCBzcGNfVDxyZWFsPiYgVCgpIGNvbnN0IHsgcmV0dXJuIFRfOyB9Cgog ICAKCgoKICB2aXJ0dWFsIFJlYWwzZCB2ZXJ0ZXgodW5zaWduZWQgaW50IGkpIGNvbnN0ID0gMDsK cHJpdmF0ZToKICAgCiAgdXNob3J0IHBfWzNdOwoKcHJvdGVjdGVkOgogICAKICBzcGNfVE1hdHJp eDxyZWFsPiBUXzsKfTsKCnRlbXBsYXRlPGNsYXNzIEY+CmhwX0hQM2RYWFg8Rj46OmhwX0hQM2RY WFgoc3BjX1RDb2x1bW48cmVhbD4qIFQsIHVpbnQgcCkgOiBUXyhUKSB7CiAgcF9bMF0gPSBwOyBw X1sxXSA9IHA7IHBfWzJdID0gcDsKfQoKdGVtcGxhdGU8Y2xhc3MgRj4KaHBfSFAzZFhYWDxGPjo6 aHBfSFAzZFhYWChzcGNfVENvbHVtbjxyZWFsPiogVCwgdWludCBwMCwgdWludCBwMSwgdWludCBw MikgOiAKICBUXyhUKSB7CgogIHBfWzBdID0gcDA7IHBfWzFdID0gcDE7IHBfWzJdID0gcDI7Cn0K CnRlbXBsYXRlPGNsYXNzIEY+CmNvbnN0IHVzaG9ydCogaHBfSFAzZFhYWDxGPjo6cCgpIGNvbnN0 IHsKICByZXR1cm4gcF87Cn0KCgojIDEwICIuLi9ocC9ocEVsZW1lbnRzM2QuaCIgMgoKIyAxICIu Li9ocC9ocEhQM2QwMDAuaCIgMQogCgoKCgoKCgoKCiMgMSAiLi4vaHAvaHBLYXJuaWFkYWtpcy5o IiAxCiAKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LWxpbnV4LzIuOTUuMi8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3RyZWFtIiAxIDMKIAogCgoKCgoKIyA5ICIuLi9ocC9o cEthcm5pYWRha2lzLmgiIDIKCgoKIyAxICIuLi9ocC9ocERlYnVnLmgiIDEKIAoKCgoKCgoKCgoK IAoKCgoKCgogCgoKCgoKIAoKCiAKCgogCgoKCiAKCgogCgoKCgoKIyAxMiAiLi4vaHAvaHBLYXJu aWFkYWtpcy5oIiAyCgoKIAoKIAoKCgp0ZW1wbGF0ZTxpbnQgbnVtYmVyPgpjbGFzcyBvcmRlcnMg ewogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3Qgb3JkZXJz PG51bWJlcj4mIG8pIHsgCiAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bWJlcjsg KytpKSB7CiAgICAgIG9zIDw8ICJwKCIgPDwgaSA8PCAiKSA9ICIgPDwgby5wX1tpXSA8PCAiLCBQ KCIgPDwgaSA8PCAiKSA9ICIgPDwgby5QX1tpXTsKICAgICAgaWYgKGkgPCBudW1iZXItMSkKCW9z IDw8ICIsICI7CiAgICB9CiAgICByZXR1cm4gb3M7CiAgfQpwdWJsaWM6CiAgIAogIG9yZGVycygp IHsKICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtYmVyOyArK2kpIHsKICAgICAg cF9baV0gPSAwOyBQX1tpXSA9IDA7CiAgICB9CiAgfQoKIAogCiAKIAogCiAKCiAgIAoKICBvcmRl cnMoY29uc3QgaW50IHAwLCBjb25zdCBpbnQgUDAsIAoJIGNvbnN0IGludCBwMSA9IDAsIGNvbnN0 IGludCBQMSA9IDAsIAoJIGNvbnN0IGludCBwMiA9IDAsIGNvbnN0IGludCBQMiA9IDApIHsKICAg IGlmIChudW1iZXIgPiAwKSB7CiAgICAgIHBfWzBdID0gcDA7CiAgICAgIFBfWzBdID0gUDA7CiAg ICB9CiAgICBpZiAobnVtYmVyID4gMSkgewogICAgICBwX1sxXSA9IHAxOwogICAgICBQX1sxXSA9 IFAxOwogICAgfQogICAgaWYgKG51bWJlciA+IDIpIHsKICAgICAgcF9bMl0gPSBwMjsKICAgICAg UF9bMl0gPSBwMjsKICAgIH0KICB9CgogICAKICBpbnQgcF9bbnVtYmVyXTsKCiAgIAogIGludCBQ X1tudW1iZXJdOwoKICAgCiAgaW5saW5lIGludCBwKGNvbnN0IHVuc2lnbmVkIGludCBpKSBjb25z dCB7IAogICAgaWYgKGkgPCBudW1iZXIpCiAgICAgIHJldHVybiBwX1tpXTsKICAgIGVsc2UKICAg ICAgcmV0dXJuIDA7CiAgfQoKICAgCiAgaW5saW5lIGludCBQKGNvbnN0IHVuc2lnbmVkIGludCBp KSBjb25zdCB7IAogICAgaWYgKGkgPCBudW1iZXIpCiAgICAgIHJldHVybiBQX1tpXTsKICAgIGVs c2UKICAgICAgcmV0dXJuIDA7CiAgfQoKICAgCiAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25z dCBvcmRlcnM8bnVtYmVyPiYgbykgY29uc3QgewogICAgYm9vbCBlcXVhbCA9IHRydWU7CiAgICBm b3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bWJlcjsgKytpKQogICAgICBlcXVhbCAmPSAo cF9baV0gPT0gby5wX1tpXSkgJiYgKFBfW2ldID09IG8uUF9baV0pOwogICAgcmV0dXJuIGVxdWFs OwogIH0KfTsKCnRlbXBsYXRlPGludCBudW1iZXI+CnN0cnVjdCBoYXNoPG9yZGVyczxudW1iZXI+ ID4gewogIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IG9yZGVyczxudW1iZXI+JiBvKSBjb25zdCB7 CiAKICAgIHJldHVybiAxOwogIH0KfTsKCnRlbXBsYXRlPGludCB0eXBlLCBpbnQgbW9kZT4KY2xh c3MgaHBfS2FybmlhZGFraXM7CgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKdGVtcGxhdGU8aW50IHR5cGUsIGludCBtb2RlPgpjbGFzcyBocF9LYXJuaWFkYWtpcyB7CiAg ZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwKICAob3N0cmVhbSYgb3MsIGNvbnN0IGhwX0thcm5p YWRha2lzPHR5cGUsIG1vZGU+JiBleHApIHsgcmV0dXJuCgkJCQkJCQkgICBleHAuaW5mbyhvcyk7 IH0KcHVibGljOgogICAKCiAgaHBfS2FybmlhZGFraXMoKSA6IHByaW5jaXBhbF8oMCkge30KCiAg IAoKCgoKCgoKCgoKCgogIGhwX0thcm5pYWRha2lzKGNvbnN0IGludCBQLCBjb25zdCBkb3VibGUq IHhQLCBjb25zdCBpbnQgTnhQLAoJCSBjb25zdCBpbnQgUSA9IDAsIGNvbnN0IGRvdWJsZSogeFEg PSAwLCBjb25zdCBpbnQgTnhRID0gMCwKCQkgY29uc3QgaW50IFIgPSAwLCBjb25zdCBkb3VibGUq IHhSID0gMCwgY29uc3QgaW50IE54UiA9IDApOwoKICAgCgogIGhwX0thcm5pYWRha2lzKGNvbnN0 IGhwX0thcm5pYWRha2lzPHR5cGUsIG1vZGU+JiBhcmcpOwoKICAgCgogIGhwX0thcm5pYWRha2lz PHR5cGUsIG1vZGU+JiBvcGVyYXRvcj0oY29uc3QgaHBfS2FybmlhZGFraXM8dHlwZSwgbW9kZT4m IGFyZyk7CgogIH5ocF9LYXJuaWFkYWtpcygpIHt9CgogICAKCiAgdW5zaWduZWQgaW50IG4oKSBj b25zdCB7CiAgICByZXR1cm4gKG9yZGVyc18ucCgwKSArIDEpKihvcmRlcnNfLnAoMSkgKyAxKSoo b3JkZXJzXy5wKDIpICsgMSkgKyAxOwogIH0KCiAgIAogIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYg b3MpIGNvbnN0OwoKICAgCgoKICBpbmxpbmUgcmVhbCogdmFsdWVzKCkgY29uc3QgeyByZXR1cm4g cHJpbmNpcGFsXzsgfQpwcml2YXRlOgogICAKICBvcmRlcnM8dHlwZT4gb3JkZXJzXzsKCiAgIAog IHJlYWwqIHByaW5jaXBhbF87CiAgIAoKCgogIHN0YXRpYyBoYXNoX21hcDxvcmRlcnM8dHlwZT4s IHJlYWwqPiBwcmluY2lwYWxfSDsKfTsKCiMgMzI0ICIuLi9ocC9ocEthcm5pYWRha2lzLmgiCgoK CiMgMTEgIi4uL2hwL2hwSFAzZDAwMC5oIiAyCgoKCgoKCgogCgogCgoKCmNsYXNzIGhwX0hQM2Qw MDAgOiBwdWJsaWMgaHBfSFAzZFhYWDxyZWFsPiB7CnB1YmxpYzoKICBocF9IUDNkMDAwKGNvbnN0 IGdlb19IZXhhaGVkcm9uM2QmIGNlbGwsIHVpbnQgcCwgc3BjX1RDb2x1bW48cmVhbD4qIFQwLCAK CSAgICAgc3BjX1RDb2x1bW48cmVhbD4qIFQxKTsKCiAgdmlydHVhbCB+aHBfSFAzZDAwMCgpOwoK ICB2aXJ0dWFsIG9zdHJlYW0mIGluZm8ob3N0cmVhbSYgb3MpIGNvbnN0OwoKICAgCgogIHZpcnR1 YWwgY29uc3QgZ2VvX0hleGFoZWRyb24mIHN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBjZWxsXy5j b25uZWN0b3IoKTsgfQoKICB2aXJ0dWFsIFJlYWwzZCB2ZXJ0ZXgodW5zaWduZWQgaW50IGkpIGNv bnN0OwoKICBpbmxpbmUgY29uc3QgaHBfS2FybmlhZGFraXM8MSwwPiogc2hwZmN0WCgpIGNvbnN0 IHsgcmV0dXJuIHNocGZjdFhfLmdldCgpOyB9CiAgaW5saW5lIGNvbnN0IGhwX0thcm5pYWRha2lz PDEsMD4qIHNocGZjdFkoKSBjb25zdCB7IHJldHVybiBzaHBmY3RZXy5nZXQoKTsgfQogIGlubGlu ZSBjb25zdCBocF9LYXJuaWFkYWtpczwxLDA+KiBzaHBmY3RaKCkgY29uc3QgeyByZXR1cm4gc2hw ZmN0Wl8uZ2V0KCk7IH0KCiAgaW5saW5lIGNvbnN0IGhwX0thcm5pYWRha2lzPDEsMT4qIHNocGZj dERYKCkgY29uc3QgeyByZXR1cm4gCgkJCQkJCQkgc2hwZmN0RFhfLmdldCgpOyB9CiAgaW5saW5l IGNvbnN0IGhwX0thcm5pYWRha2lzPDEsMT4qIHNocGZjdERZKCkgY29uc3QgeyByZXR1cm4gCgkJ CQkJCQkgc2hwZmN0RFlfLmdldCgpOyB9CiAgaW5saW5lIGNvbnN0IGhwX0thcm5pYWRha2lzPDEs MT4qIHNocGZjdERaKCkgY29uc3QgeyByZXR1cm4gCgkJCQkJCQkgc2hwZmN0RFpfLmdldCgpOyB9 CgogIGlubGluZSBjb25zdCBpbnRfUXVhZHJhdHVyZSogaW50ZWdyYXRpb25YKCkgY29uc3QgeyBy ZXR1cm4gaW50WF8uZ2V0KCk7IH0KICBpbmxpbmUgY29uc3QgaW50X1F1YWRyYXR1cmUqIGludGVn cmF0aW9uWSgpIGNvbnN0IHsgcmV0dXJuIGludFlfLmdldCgpOyB9CiAgaW5saW5lIGNvbnN0IGlu dF9RdWFkcmF0dXJlKiBpbnRlZ3JhdGlvblooKSBjb25zdCB7IHJldHVybiBpbnRaXy5nZXQoKTsg fQoKICBpbmxpbmUgY29uc3QgUmVhbDNkIGNoaShyZWFsIHgsIHJlYWwgeSwgcmVhbCB6KSBjb25z dCB7CiAgICBpZiggIDAgICAhPTApIGNvdXQgPDwgICAnWyc8PCAgIi4uL2hwL2hwSFAzZDAwMC5o IiAgPDwgIiwgbGluZSAiIDw8IDU1IDw8ICJdICIgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAi IC0tIiAgPDwgIiAiIDw8ICAgICAnKCcgPDwgeCA8PCAiLCAiIDw8IHkgPDwgIiwgIiA8PCB6IDw8 ICcpJyAgIDw8IGVuZGw7ICA7CiAgICByZXR1cm4gY2VsbF8uY2hpKHgsIHksIHopOyB9CgogIGlu bGluZSBjb25zdCByZWFsIGphY29iaWFuKHJlYWwgeCwgcmVhbCB5LCByZWFsIHopIGNvbnN0IHsK ICAgIGlmKCAgMCAgICE9MCkgY291dCA8PCAgICdbJzw8ICAiLi4vaHAvaHBIUDNkMDAwLmgiICA8 PCAiLCBsaW5lICIgPDwgNTkgPDwgIl0gIiA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICIgLS0i ICA8PCAiICIgPDwgICAgICcoJyA8PCB4IDw8ICIsICIgPDwgeSA8PCAiLCAiIDw8IHogPDwgJykn ICAgPDwgZW5kbDsgIDsKICAgIHJldHVybiBjZWxsXy5qYWNvYmlhbih4LCB5LCB6KTsgfQpwcml2 YXRlOgogIGNvbnN0IGdlb19IZXhhaGVkcm9uM2QmIGNlbGxfOwogIGF1dG9fcHRyPGhwX0thcm5p YWRha2lzPDEsMD4gPiBzaHBmY3RYXywgc2hwZmN0WV8sIHNocGZjdFpfOwogIGF1dG9fcHRyPGhw X0thcm5pYWRha2lzPDEsMT4gPiBzaHBmY3REWF8sIHNocGZjdERZXywgc2hwZmN0RFpfOwogIGF1 dG9fcHRyPGludF9HYXVzc0xvYmF0dG8+IGludFhfLCBpbnRZXywgaW50Wl87Cn07CgoKIyAxMSAi Li4vaHAvaHBFbGVtZW50czNkLmgiIDIKCgoKIyA4ICIuLi9ocC9ocFNwYWNlM2QuaCIgMgoKCgoK CgoKCgoKIAoKY2xhc3MgdGJ4X1NjYW48aHBfSFAzZFhYWDxyZWFsPiA+IDogcHVibGljIHRieF9T Y2FuPHNwY19FbGVtZW50PHJlYWw+ID4gewpwdWJsaWM6ICAKICBocF9IUDNkWFhYPHJlYWw+JiBv cGVyYXRvcisrKGludCkgPSAwOwp9OwoKIAp0eXBlZGVmIHRieF9TY2FuPGhwX0hQM2RYWFg8cmVh bD4gPiBocF9IUDNkU2NhbjsKCiAKCiAKCgpjbGFzcyBocF9IUDNkIDogcHVibGljIHNwY19TcGFj ZTxyZWFsPiB7CgpwdWJsaWM6CiAgIAoKCgoKCgoKCgogIGhwX0hQM2QoZ2VvX01lc2gzJiBtc2gs IHVpbnQgbCwgdWludCBwLCBocF9Cb3VuZGFyeUNvbmRpdGlvbiogYmMgPSBfX251bGwgKTsKICBp bmxpbmUgdmlydHVhbCB+aHBfSFAzZCgpOwogIAogICAKICBpbmxpbmUgdWludCBkaW0oKSBjb25z dDsKCiAgdmlydHVhbCBvc3RyZWFtJiBpbmZvKG9zdHJlYW0mIG9zLCB1aW50IG1vZGUgPSAwKSBj b25zdDsKCiAgIAogIGlubGluZSB1aW50IG5lbG0oKSBjb25zdDsKCiAgIAogIGlubGluZSBocF9I UDNkU2Nhbiogc2NhbigpIGNvbnN0OwoKICBpbmxpbmUgc2hvcnQgbChocF9IUDNkWFhYPHJlYWw+ JiBlbG0pIHsKICAgIEFkanVzdCYgYWRqKGFkal9bZWxtLnN1cHBvcnQoKS5rZXkoKV0pOwogICAg cmV0dXJuIGFkai5sOwogIH0KCiAgIAoKCgoKCgogIHZvaWQgYWRqdXN0KGhwX0hQM2RYWFg8cmVh bD4mIGVsbSwgaW50IGwsIGludCBwKTsKCiAgIAoKCgoKCgoKCgoKCgoKCiAgdm9pZCByZWJ1aWxk KCk7Cgpwcm90ZWN0ZWQ6CiAgIAoKCgoKCiAgdGVtcGxhdGU8aW50IGRpbT4KICBzdHJ1Y3QgQ29u dHJvbCB7CiAgICAgCgoKCgoKCgoKICAgIHVjaGFyICAgICAgICAgdGFnOwoKICAgICAKICAgIHVz aG9ydCAgICAgICAgcFtkaW1dOwoKICAgICAKICAgIHNwY19CRm5jSW5kZXggaWR4OwoKICAgICAK CiAgICBDb250cm9sKCkgeyB0YWcgPSAwOyB9CiAgfTsKCiAgIAoKCgoKCiAgc3RydWN0IENvbnRy b2wwICB7CiAgICAgCgoKCgoKCgoKICAgIHVjaGFyICAgICAgICAgdGFnOwoKICAgICAKICAgIHNw Y19CRm5jSW5kZXggaWR4OwoKICAgICAKCiAgICBDb250cm9sMCgpIHsgdGFnID0gMDsgfQogIH07 CgogICAKCgogIHN0cnVjdCBBZGp1c3QgewogICAgIAoKCiAgICBzaG9ydCBwOwoKICAgICAKCgog ICAgc2hvcnQgbDsKCiAgICAgCgoKICAgIEFkanVzdCgpIHsgcCA9IGwgPSAwOyB9CiAgfTsKCiAg IAogIGdlb19NZXNoMyYgbXNoXzsKCiAgIAogIGhwX0JvdW5kYXJ5Q29uZGl0aW9uKiBiY187Cgog ICAKICB0YnhfQ29ubmVjdG9yPGhwX0hQM2RYWFg8cmVhbD4qLCAxPiogZWxtXzsKCiAgIAogIHRi eF9EeW5BcnJheTxDb250cm9sMD4gY3RybDBfOwoKICAgCiAgdGJ4X0R5bkFycmF5PENvbnRyb2w8 MT4gPiBjdHJsMV87CgogICAKICB0YnhfRHluQXJyYXk8Q29udHJvbDwyPiA+IGN0cmwyXzsKCiAg IAogIHRieF9EeW5BcnJheTxDb250cm9sPDM+ID4gY3RybDNfOwoKICAgCiAgdGJ4X0R5bkFycmF5 PEFkanVzdD4gYWRqXzsKCiAgIAogIHVpbnQgZGltXzsKCiAgIAogIHVpbnQgbmVsbV87CgogICAK ICBib29sIHJlYnVpbGRfOwoKICAgCgoKCgoKCgoKCgoKICB2aXJ0dWFsIHZvaWQgcmVidWlsZDBf KGdlb19Db25uZWN0b3IzJiBjbnRyLCBpbnQgbCwgaW50JiBMLCBpbnQmIFApOwogIHZpcnR1YWwg dm9pZCByZWJ1aWxkMV8oZ2VvX0hleGFoZWRyb24zZCYgY2VsbCwgc3BjX1RDb2x1bW48cmVhbD4q IFQgPSBfX251bGwgKTsKCiAgaW5saW5lIHZvaWQgZGVhY3RpdmF0ZV8oZ2VvX0Nvbm5lY3RvcjIm IGZhY2UpOwogIGlubGluZSB2b2lkIGRlYWN0aXZhdGVfKGdlb19FZGdlJiBlZGcpOwogIGlubGlu ZSB2b2lkIGRlYWN0aXZhdGVfKGdlb19WZXJ0ZXgmIHZ0eCk7Cn07Cgp1aW50IGhwX0hQM2Q6OmRp bSgpIGNvbnN0IHsgCiAgaWYgKHJlYnVpbGRfKSAoKGhwX0hQM2QqKXRoaXMpLT5yZWJ1aWxkKCk7 ICAgCiAgcmV0dXJuIGRpbV87IAp9Cgp1aW50IGhwX0hQM2Q6Om5lbG0oKSBjb25zdCB7IAogIGlm IChyZWJ1aWxkXykgKChocF9IUDNkKil0aGlzKS0+cmVidWlsZCgpOyAgIAogIHJldHVybiBuZWxt XzsgCn0KCmhwX0hQM2RTY2FuKiBocF9IUDNkOjpzY2FuKCkgY29uc3QgeyAKICBpZiAocmVidWls ZF8pICgoaHBfSFAzZCopdGhpcyktPnJlYnVpbGQoKTsgICAKICByZXR1cm4gbmV3IHRieF9QTGlz dFNjYW48aHBfSFAzZFhYWDxyZWFsPiA+KCplbG1fKTsKfQoKdm9pZCBocF9IUDNkOjpkZWFjdGl2 YXRlXyhnZW9fQ29ubmVjdG9yMiYgZmFjZSkgewoKICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsg aSA8IDQ7ICsraSkKICAgIGN0cmwyX1tmYWNlLmNoaWxkKGkpLT5rZXkoKV0udGFnIHw9IDI7Cgog IGdlb19UcmlhbmdsZSogdHJpID0gZHluYW1pY19jYXN0PGdlb19UcmlhbmdsZSo+KCZmYWNlKTsK ICBpZiAodHJpKSB7CiAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7ICsraSkKICAg ICAgY3RybDFfW3RyaS0+Y2hpbGQoNCktPmVkZ2UoaSktPmtleSgpXS50YWcgfD0gMjsKICAgIHJl dHVybjsKICB9CiAgZ2VvX1F1YWQqIHF1YWQgPSBkeW5hbWljX2Nhc3Q8Z2VvX1F1YWQqPigmZmFj ZSk7CiAgaWYgKHF1YWQpIHsKICAgIGN0cmwxX1txdWFkLT5jaGlsZCgwKS0+ZWRnZSgxKS0+a2V5 KCldLnRhZyB8PSAyOwogICAgY3RybDFfW3F1YWQtPmNoaWxkKDApLT5lZGdlKDIpLT5rZXkoKV0u dGFnIHw9IDI7CiAgICBjdHJsMV9bcXVhZC0+Y2hpbGQoMiktPmVkZ2UoMCktPmtleSgpXS50YWcg fD0gMjsKICAgIGN0cmwxX1txdWFkLT5jaGlsZCgyKS0+ZWRnZSgzKS0+a2V5KCldLnRhZyB8PSAy OwogICAgY3RybDBfW3F1YWQtPmNoaWxkKDApLT52ZXJ0ZXgoMiktPmtleSgpXS50YWcgfD0gMjsK ICAgIHJldHVybjsKICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogIGNlcnIgPDwgJ1snIDw8ICIuLi9ocC9ocFNwYWNlM2QuaCIg PDwgIiwgbGluZSAiIDw8IDI1NyA8PCAiXSAiIAogICAgICAgPDwgX19QUkVUVFlfRlVOQ1RJT05f XyA8PCAiIC0tIGRlYWN0aXZhdGUgbm90IHN1cHBvcnRlZC4iIDw8IGVuZGw7CiAgZXhpdCgxKTsK fQoKdm9pZCBocF9IUDNkOjpkZWFjdGl2YXRlXyhnZW9fRWRnZSYgZWRnKSB7CiAgY3RybDFfW2Vk Zy5jaGlsZCgwKS0+a2V5KCldLnRhZyB8PSAyOwogIGN0cmwxX1tlZGcuY2hpbGQoMSktPmtleSgp XS50YWcgfD0gMjsKICBjdHJsMF9bZWRnLmNoaWxkKDEpLT52ZXJ0ZXgoMCktPmtleSgpXS50YWcg fD0gMjsKfQoKdm9pZCBocF9IUDNkOjpkZWFjdGl2YXRlXyhnZW9fVmVydGV4JiB2dHgpIHsKICBj dHJsMF9bdnR4LmNoaWxkKDApLT5rZXkoKV0udGFnIHw9IDI7Cn0KCgojIDE2ICIuLi9ocC5oIiAy CgojIDEgIi4uL2hwL2hwQkZvcm0zZC5oIiAxCiAKCgoKCgoKCgoKCgogCgogCgpjbGFzcyBocF9M YXBsYWNlM2QgOiBwdWJsaWMgb3BfQmlsaW5lYXJGb3JtPHJlYWw+IHsKICBmcmllbmQgb3N0cmVh bSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgaHBfTGFwbGFjZTNkJiBiKTsKcHVibGlj OgogICAKCiAgaHBfTGFwbGFjZTNkKCkge30KICB2aXJ0dWFsIH5ocF9MYXBsYWNlM2QoKSB7fQoK ICAgCgoKCgoKCgoKCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBl bG1YLCAKCQkgIGNvbnN0IHNwY19FbGVtZW50PHJlYWw+JiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50 TWF0cml4PHJlYWw+JiBlbSk7IAogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBocF9IUDNkMDAwJiBl bG1YLCBjb25zdCBocF9IUDNkMDAwJiBlbG1ZLCAKCQkgIHNwY19FbGVtZW50TWF0cml4PHJlYWw+ JiBlbSk7CiAgCnByaXZhdGU6Cn07IAoKIAoKIAoKY2xhc3MgaHBfSWRlbnRpdHkzZCA6IHB1Ymxp YyBvcF9CaWxpbmVhckZvcm08cmVhbD4gewogIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9z dHJlYW0mIG9zLCBjb25zdCBocF9JZGVudGl0eTNkJiBiKTsKcHVibGljOgogICAKCiAgaHBfSWRl bnRpdHkzZCgpIHt9CiAgdmlydHVhbCB+aHBfSWRlbnRpdHkzZCgpIHt9CgogICAKCgoKCgoKCgoK ICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVgsIAoJCSAgY29u c3Qgc3BjX0VsZW1lbnQ8cmVhbD4mIGVsbVksIAoJCSAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4m IGVtKTsgCiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGhwX0hQM2QwMDAmIGVsbVgsIGNvbnN0IGhw X0hQM2QwMDAmIGVsbVksIAoJCSAgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD4mIGVtKTsKICAKcHJp dmF0ZToKICAgCiAgdmVjdG9yPHJlYWw+IGludGVybWVkaWF0ZV87CiAgdmVjdG9yPHJlYWw+IGph Y29iaWFuXzsKfTsgCgoKIyAxNyAiLi4vaHAuaCIgMgoKIyAxICIuLi9ocC9ocExGb3JtM2QuaCIg MQogCgoKCgoKCgoKCgoKCgoKIAoKIAoKCgoKCgpjbGFzcyBocF9SaWVzejNkIDogcHVibGljIGZu Y19MaW5lYXJGb3JtPHJlYWw+IHsKICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFt JiBvcywgY29uc3QgaHBfUmllc3ozZCYgbCk7CnB1YmxpYzoKICAgCgoKCgoKCgogIGhwX1JpZXN6 M2QoY29uc3QgdGJ4X0Zvcm11bGEmIGZybSwgaHBfQm91bmRhcnlDb25kaXRpb24qIGJjID0gMCk7 IAoKICAgCgoKCgoKCgogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzcGNfRWxlbWVudDxyZWFsPiYg ZWxtLCBzcGNfRWxlbWVudE1hdHJpeDxyZWFsPiYgZW0pOwogIHZvaWQgb3BlcmF0b3IoKShjb25z dCBocF9IUDNkMDAwJiBlbG0sIHNwY19FbGVtZW50TWF0cml4PHJlYWw+JiBlbSk7Cgpwcml2YXRl OgogICAKICBjb25zdCB0YnhfRm9ybXVsYSogZnJtXzsKCiAgIAogIHZlY3RvcjxyZWFsPiBpbnRl cm1lZGlhdGVfOwogIHZlY3RvcjxyZWFsPiBqYWNvYmlhbl87CgogICAKCiAgaHBfQm91bmRhcnlD b25kaXRpb24qIGJjXzsKfTsgCgoKIyAxOCAiLi4vaHAuaCIgMgoKCgojIDI2ICJsaW5lbC5jYyIg MgoKIAoKCgoKCgp0ZW1wbGF0ZSBjbGFzcyBvcF9MaUNvPHJlYWw+Owp0ZW1wbGF0ZSBjbGFzcyBv cF9Mb2NhbDxyZWFsPjsKIAp0ZW1wbGF0ZSBjbGFzcyBvcF9DRzxyZWFsPjsKdGVtcGxhdGUgY2xh c3Mgc3BjX0VsZW1lbnRNYXRyaXg8cmVhbD47CnRlbXBsYXRlIGNsYXNzIGdlb19TZW1hbnRpY3M8 Ym9vbD47CgoKIAogCnZvaWQgYWRhcHQoaHBfSFAyZCYgc3BjLCBSZWFsMmQgUykgewoKICBocF9I UDJkU2Nhbiogc2MgPSBzcGMuc2NhbigpOwogIHdoaWxlICgqc2MpIHsKICAgIGhwX0hQMmRYWFg8 cmVhbD4mIGVsbSA9ICgqc2MpKys7CgogICAgaW50IGwgPSAwLCBwID0gMDsKCiAgICBocF9IUDJk MDAxKiBlbG1CID0gZHluYW1pY19jYXN0PGhwX0hQMmQwMDEqPigmZWxtKTsKICAgIGlmIChlbG1C KSB7CiAgICAgIFJlYWwyZCB4MChlbG1CLT52ZXJ0ZXgoMCkpOwogICAgICBSZWFsMmQgeDEoZWxt Qi0+dmVydGV4KDEpKTsKICAgICAgUmVhbDJkIHgyKGVsbUItPnZlcnRleCgyKSk7CiAgICAgIFJl YWwyZCB4MyhlbG1CLT52ZXJ0ZXgoMykpOwogIAogICAgICByZWFsIHByID0gUmVhbDJkKHgwIC0g UykubDIoKSAqIFJlYWwyZCh4MSAtIFMpLmwyKCkgKgogICAgICAgICAgICAgICAJICAgICAgICAg ICAgIFJlYWwyZCh4MiAtIFMpLmwyKCkgKiBSZWFsMmQoeDMgLSBTKS5sMigpOyAgCgogICAgICBp ZiAocHIgPT0gMC4wKSB7CglsID0gc3BjLmwoZWxtKSArIDE7CglwID0gMDsKICAgICAgfQogICAg fQogICAgc3BjLmFkanVzdChlbG0sIGwsIHApOwogIH0KICBkZWxldGUgc2M7Cn0KCiAKCmludCBt YWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewoKICB1aW50IGwgPSAwOwogIHVpbnQgcCA9IDE7 CiAgdWludCBhID0gMDsKICB1aW50IGdhdXNzID0gMjA7CiAgcmVhbCBlcHMgPSAxLmUtMjA7Cgog IGlmIChhcmdjID4gMSkgbCA9IGF0b2koYXJndlsxXSk7CiAgaWYgKGFyZ2MgPiAyKSBwID0gYXRv aShhcmd2WzJdKTsKICBpZiAoYXJnYyA+IDMpIGEgPSBhdG9pKGFyZ3ZbM10pOwogIGlmIChhcmdj ID4gNCkgZ2F1c3MgPSBhdG9pKGFyZ3ZbNF0pOwogIGlmIChhcmdjID4gNSkgZXBzID0gYXRvZihh cmd2WzVdKTsKCiAgY291dCA8PCAnWycgPDwgYXJndlswXSA8PCAiXSAiOwogIGNvdXQgPDwgImwg PSAiIDw8IGwgPDwgIiwgcCA9ICI8PCBwIDw8ICIsIGEgPSAiIDw8IGE7CiAgY291dCA8PCAiLCBn YXVzcyA9ICIgPDwgZ2F1c3MgPDwgIiwgZXBzID0gIiA8PCBlcHMgPDwgJ1xuJzsKCgogCgogIHh5 X2Z1bmN0aW9uIGZbMl0gPSB7IHh5X2Z1bmN0aW9uKCIoMCkiKSwgeHlfZnVuY3Rpb24oIigwKSIp IH07CgogIHh5X2Z1bmN0aW9uIGdbMTBdID0gewogICAgeHlfZnVuY3Rpb24oIihjb3MoMy80KnBp LTMvMiphdGFuKHgpKSpjb3MocGkvNC1hdGFuKHgpLzIpKnNpbihwaS80LWF0YW4oeCkvMikvc3Fy dCgyKnBpKS8oMSt4KngpXjAuMjUpIiksCiAgICB4eV9mdW5jdGlvbigiKC1jb3MocGkvNC1hdGFu KHgpLzIpKigyK3gvc3FydCgxK3gqeCkrY29zKDIqYXRhbih4KSkpLzIvc3FydCgyKnBpKS8oMSt4 KngpXjAuMjUpIiksCiAgCiAgICB4eV9mdW5jdGlvbigiKGNvcyhhdGFuKHkpLzIpKigxLXNpbihh dGFuKHkpLzIpKnNpbigzLzIqYXRhbih5KSkpL3NxcnQoMipwaSkvKDEreSp5KV4wLjI1KSIpLAog ICAgeHlfZnVuY3Rpb24oIihjb3MoYXRhbih5KS8yKSpjb3MoMy8yKmF0YW4oeSkpKnNpbihhdGFu KHkpLzIpL3NxcnQoMipwaSkvKDEreSp5KV4wLjI1KSIpLAoKICAgIHh5X2Z1bmN0aW9uKCIoY29z KChwaS0yKmF0YW4oeCkpLzQpKmNvcygzLzQqKHBpLTIqYXRhbih4KSkpKnNpbigocGktMiphdGFu KHgpKS80KS9zcXJ0KDIqcGkpLygxK3gqeCleMC4yNSkiKSwKICAgIHh5X2Z1bmN0aW9uKCIoY29z KChwaS0yKmF0YW4oeCkpLzQpKigyK3gvc3FydCgxK3gqeCkrY29zKDIqYXRhbih4KSkpLzIvc3Fy dCgyKnBpKS8oMSt4KngpXjAuMjUpIiksCgogICAgeHlfZnVuY3Rpb24oIigtKDIrMS9zcXJ0KDEr eSp5KStjb3MoMiphdGFuKHkpKSkqc2luKGF0YW4oeSkvMikvMi9zcXJ0KDIqcGkpLygxK3kqeSle MC4yNSkiKSwKICAgIHh5X2Z1bmN0aW9uKCIoKDIqY29zKGF0YW4oeSkvMikrY29zKDMvMiphdGFu KHkpKSkqKHNpbihhdGFuKHkpLzIpKSooc2luKGF0YW4oeSkvMikpL3NxcnQoMipwaSkvKDEreSp5 KV4wLjI1KSIpLAoKICAgIHh5X2Z1bmN0aW9uKCIoKDMqc2luKGF0YW4oeSkvMikrc2luKDUvMiph dGFuKHkpKSkvNC9zcXJ0KDIqcGkpLygxK3kqeSleMC4yNSkiKSwKICAgIHh5X2Z1bmN0aW9uKCIo LSgyKmNvcyhhdGFuKHkpLzIpK2NvcygzLzIqYXRhbih5KSkpKihzaW4oYXRhbih5KS8yKSkqKHNp bihhdGFuKHkpLzIpKS9zcXJ0KDIqcGkpLygxK3kqeSleMC4yNSkiKQogICAKICB9OwoKCiAKCiAg eHlfZnVuY3Rpb24gTWF0TWF0WzZdID0gewogICAgeHlfZnVuY3Rpb24oIigxKigxLTAuMjUpLygx LTIqMC4yNSkvKDErMC4yNSkpIiksCiAgICB4eV9mdW5jdGlvbigiKDEqMC4yNS8oMS0yKjAuMjUp LygxKzAuMjUpKSIpLAogICAgeHlfZnVuY3Rpb24oIigwKSIpLAogICAgCiAgICB4eV9mdW5jdGlv bigiKDEqKDEtMC4yNSkvKDEtMiowLjI1KS8oMSswLjI1KSkiKSwKICAgIHh5X2Z1bmN0aW9uKCIo MCkiKSwKCiAgICB4eV9mdW5jdGlvbigiKDAuNCkiKQogIH07CgogIGNyYWNrZWRfcGFuZWwgbXNo OwogCiAgIAoKICBsaW5lbF9TcGFjZSBzcGMobXNoLCBsLCBwKTsKICBjb3V0LnNldGYoaW9zOjpz Y2llbnRpZmljLCBpb3M6OmZsb2F0ZmllbGQpOyBjb3V0LnByZWNpc2lvbigxKTsKICBvZnN0cmVh bSBvZnMoInVjMC5lcHMiKTsKICBzcGMuc2tldGNoKG9mcywgUmVhbDJkKDAuMCwgMC4wKSwgODAs IDMpOwogIAogIFJlYWwyZCBTKDAuMCwgMC4wKTsKICBmb3IgKHVpbnQgaSA9IDA7IGkgPCBhOyBp KyspIHsKICAgIGFkYXB0KHNwYywgUyk7CiAgICBjaGFyIGZuYW1lWzEwXTsgc3ByaW50ZihmbmFt ZSwgInVjJWQuZXBzIiwgaSArIDEpOwogICAgb2ZzdHJlYW0gb2ZzKGZuYW1lKTsKICAgIHNwYy5z a2V0Y2gob2ZzLCBSZWFsMmQoMC4wLCAwLjApLCA4MCwgMyk7CiAgICBjb3V0IDw8IHNwYyA8PCBl bmRsOwogIH0KIAogIGNvdXQuc2V0Zihpb3M6OnNjaWVudGlmaWMsIGlvczo6ZmxvYXRmaWVsZCk7 IGNvdXQucHJlY2lzaW9uKDIwKTsKCiAgCgogIExpbkVsMl9CRm9ybSBiZihnYXVzcywgTWF0TWF0 KTsKIAogIG9wX0xvY2FsPHJlYWw+IE0oc3BjLCBiZik7CiAgY291dCA8PCAiYmYgJiBNXG4iOwoK ICB1aW50IGRpbSA9IHNwYy5kaW0oKTsKICBjb3V0IDw8IGRpbSA8PCAiICAiOwogIGNvdXQgPDwg c3BjLmluZGV4IDw8IGVuZGw7CgogCgoKCgoKCgoKCgoKCgoKCgoKCgogIG9wX0NHPHJlYWw+IE1p bnYoTSwgZXBzLCAxMDAwMCk7CgogIExpbkVsMl9MRm9ybSBsZihnYXVzcywgZywgZik7CgogIGZu Y19WZWN0b3I8cmVhbD4gTChzcGMsIGxmKTsgICAKICBjb3V0IDw8ICJsZiAmIExcbiI7CgogCgoK CgoKCgogIGZuY19WZWN0b3I8cmVhbD4gdShzcGMpOyAgCiAgTWludihMLCB1KTsKICBjb3V0IDw8 IE1pbnYgPDwgZW5kbDsKCgogCgoKCgoKCgogIGZuY19WZWN0b3I8cmVhbD4gdihzcGMpOwogIE0o dSwgdik7CgoKIAoKCgoKCgoKCiAgY291dCA8PCAiRW5lcmd5ID0gIiA8PCAodSAqIHYpIDw8IGVu ZGw7CiAgcmVhbCB1diA9ICh1ICogdik7CiAgY291dCA8PCAoMS4wNTIwNjIyMjMxMzU5NTggLSB1 dikvMS4wNTIwNjIyMjMxMzU5NTggPDwgZW5kbDsKCiAgcmV0dXJuIDA7Cn0K >>From nathan@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: nathan@gcc.gnu.org To: nathan@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c++/934 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010111134601.19985.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00210.html Content-length: 636 The following reply was made to PR c++/934; it has been noted by GNATS. From: nathan@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, nathan@gcc.gnu.org, snyder@fnal.gov Cc: Subject: Re: c++/934 Date: 11 Jan 2001 13:37:03 -0000 Synopsis: new-abi bug: collisions between flag variables for local statics State-Changed-From-To: analyzed->closed State-Changed-By: nathan State-Changed-When: Thu Jan 11 05:37:03 2001 State-Changed-Why: 2001-01-11 Nathan Sidwell * decl2.c (get_guard): Set linkage from guarded decl. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=934&database=gcc >>From jeff.sturm@appnet.com Sun Apr 01 00:00:00 2001 From: Jeff Sturm To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: java/1677 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010117182602.23812.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00420.html Content-length: 532 The following reply was made to PR java/1677; it has been noted by GNATS. From: Jeff Sturm To: p.thio@valescom.com, gcc-gnats@gcc.gnu.org Cc: Subject: Re: java/1677 Date: Wed, 17 Jan 2001 13:17:46 -0500 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=1677&database=gcc This may be a duplicate of PR/1516, which was fixed by this patch: http://sources.redhat.com/ml/java-patches/2000-q4/msg00284.html Can you try your code with a newer snapshot? -- Jeff Sturm jeff.sturm@commerceone.com >>From apbianco@cygnus.com Sun Apr 01 00:00:00 2001 From: Alexandre Petit-Bianco To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: java/2360: Internal compiler error make_class_data (constant stress test?) Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010326230600.2510.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg02591.html Content-length: 883 The following reply was made to PR java/2360; it has been noted by GNATS. From: Alexandre Petit-Bianco To: scgmille@indiana.edu Cc: gcc-gnats@gcc.gnu.org Subject: Re: java/2360: Internal compiler error make_class_data (constant stress test?) Date: Mon, 26 Mar 2001 15:01:58 -0800 (PST) scgmille@indiana.edu writes: > The class in question has a lot of constants and a rather > case statement. I can't reproduce the problem, gcj is missing some file before it can crash. apbianco@venonat[~/tmp]: gcj -c Primitives.class sisc/Primitives.java:0: Cannot find file for class sisc.Module. sisc/Primitives.java:0: confused by earlier errors, bailing out I tried the SISC Scheme interpreter package (since I'm guessing this is what your trying to build) and I was able to build it by simply running gcj -c sisc.jar --main=sisc.REPL ./A