From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1200 invoked by alias); 5 Aug 2002 15:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 1176 invoked by uid 71); 5 Aug 2002 15:46:01 -0000 Resent-Date: 5 Aug 2002 15:46:01 -0000 Resent-Message-ID: <20020805154601.1175.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, sekelly@nist.gov Received: (qmail 676 invoked by uid 61); 5 Aug 2002 15:44:17 -0000 Message-Id: <20020805154417.675.qmail@sources.redhat.com> Date: Mon, 05 Aug 2002 08:46:00 -0000 From: sekelly@nist.gov Reply-To: sekelly@nist.gov To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/7497: ice on large bool array, not on small or huge array X-SW-Source: 2002-08/txt/msg00089.txt.bz2 List-Id: >Number: 7497 >Category: c++ >Synopsis: ice on large bool array, not on small or huge array >Confidential: no >Severity: serious >Priority: low >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Mon Aug 05 08:46:01 PDT 2002 >Closed-Date: >Last-Modified: >Originator: sekelly@nist.gov >Release: 2.95.2 19991024 >Organization: >Environment: >Description: Code declares a bool array. When the array is ~125000 square (large, yes, but that's not the biggest issue) g++ gives an ICE in 'assign_stack_temp_for_type'. When the size is significantly reduced, it compiles fine. Oddly enough, however, when the size is significantly increased (~1000000 square) it also compiles without error (of course it also seg faults when run, but that's beside the point). As I am not the administrator of the network I work on, I cannot upgrade to gcc 3.1 to determine if this problem still exists in the current release. >How-To-Repeat: declare boolean array of size ~125000x~125000 >Fix: use a smaller array (and break input data into smaller pieces, running program more times) >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="gtb-redlin.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gtb-redlin.ii" IyAxICJndGItcmVkbGluLmNwcCIKIAoKCgoKCgoKCgojIDEgIi91c3IvZnJlZXdhcmUvbGliL2dj Yy1saWIvbWlwcy1zZ2ktaXJpeDYuMi8yLjk1LjIvaW5jbHVkZS9nKysvaW9zdHJlYW0uaCIgMSAz CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCiMgMSAiL3Vz ci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBzLXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2cr Ky9zdHJlYW1idWYuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGlu dGVyZmFjZQoKCiAgIAoKCgpleHRlcm4gIkMiIHsKIyAxICIvdXNyL2ZyZWV3YXJlL2xpYi9nY2Mt bGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4yL2luY2x1ZGUvZysrL2xpYmlvLmgiIDEgMwogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvZnJlZXdhcmUvbGliL2djYy1saWIv bWlwcy1zZ2ktaXJpeDYuMi8yLjk1LjIvaW5jbHVkZS9nKysvX0dfY29uZmlnLmgiIDEgMwogIAoK CgoKCgoKCgp0eXBlZGVmICAgICAgICAgIGludCAgIF9HX2ludDhfdCBfX2F0dHJpYnV0ZV9fKChf X21vZGVfXyhfX1FJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQgaW50ICBfR191aW50OF90IF9fYXR0 cmlidXRlX18oKF9fbW9kZV9fKF9fUUlfXykpKTsKdHlwZWRlZiAgICAgICAgICBpbnQgIF9HX2lu dDE2X3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOwp0eXBlZGVmIHVuc2lnbmVk IGludCBfR191aW50MTZfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7CnR5cGVk ZWYgICAgICAgICAgaW50ICBfR19pbnQzMl90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lf XykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDMyX3QgX19hdHRyaWJ1dGVfXygoX19t b2RlX18oX19TSV9fKSkpOwp0eXBlZGVmICAgICAgICAgIGludCAgX0dfaW50NjRfdCBfX2F0dHJp YnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9HX3VpbnQ2 NF90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKTsKCl9fZXh0ZW5zaW9uX18gdHlw ZWRlZiBsb25nIGxvbmcgX0dfbGxvbmc7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBs b25nIGxvbmcgX0dfdWxsb25nOwoKCgoKCgoKCnR5cGVkZWYgbG9uZyBfR19jbG9ja190Owp0eXBl ZGVmIHVuc2lnbmVkIGxvbmcgX0dfZGV2X3Q7CnR5cGVkZWYgX0dfbGxvbmcgX0dfZnBvc190Owp0 eXBlZGVmIGxvbmcgX0dfZ2lkX3Q7CnR5cGVkZWYgX0dfdWxsb25nIF9HX2lub190Owp0eXBlZGVm IHVuc2lnbmVkIGxvbmcgX0dfbW9kZV90Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX0dfbmxpbmtf dDsKdHlwZWRlZiBfR19sbG9uZyBfR19vZmZfdDsKdHlwZWRlZiBsb25nIF9HX3BpZF90OwoKCgp0 eXBlZGVmIGludCAgX0dfcHRyZGlmZl90Owp0eXBlZGVmIGludCAgIF9HX3NpZ3NldF90OwoKCgp0 eXBlZGVmIHVuc2lnbmVkIGludCAgX0dfc2l6ZV90Owp0eXBlZGVmIGxvbmcgX0dfdGltZV90Owp0 eXBlZGVmIGxvbmcgX0dfdWlkX3Q7CnR5cGVkZWYgbG9uZyBfR193Y2hhcl90OwoKCgoKCgoKCgoK CgoKCgp0eXBlZGVmIGludCBfR19zc2l6ZV90Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfR193aW50 X3Q7CnR5cGVkZWYgY2hhciAqIF9HX3ZhX2xpc3Q7CgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNy L2ZyZWV3YXJlL2xpYi9nY2MtbGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4yL2luY2x1ZGUvc3Rk ZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBz LXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoK CiMgNjEgIi91c3IvZnJlZXdhcmUvbGliL2djYy1saWIvbWlwcy1zZ2ktaXJpeDYuMi8yLjk1LjIv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgog CgogCgojIDEzMSAiL3Vzci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBzLXNnaS1pcml4Ni4yLzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAxOTAgIi91c3IvZnJlZXdhcmUvbGli L2djYy1saWIvbWlwcy1zZ2ktaXJpeDYuMi8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgog CgoKCgogCgojIDI3MSAiL3Vzci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBzLXNnaS1pcml4Ni4y LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvZnJlZXdhcmUvbGliL2dj Yy1saWIvbWlwcy1zZ2ktaXJpeDYuMi8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAK CiMgMzE3ICIvdXNyL2ZyZWV3YXJlL2xpYi9nY2MtbGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA4NiAiL3Vz ci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBzLXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2cr Ky9fR19jb25maWcuaCIgMiAzCgoKIyAzMCAiL3Vzci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBz LXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2crKy9saWJpby5oIiAyIDMKCgoKCgoKCgoKCgoK CgoKCgojIDU1ICIvdXNyL2ZyZWV3YXJlL2xpYi9nY2MtbGliL21pcHMtc2dpLWlyaXg2LjIvMi45 NS4yL2luY2x1ZGUvZysrL2xpYmlvLmgiIDMKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9jZGVm cy5oIiAxIDMKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiNpZGVudCAgIiRSZXZpc2lvbjogMS4zICQi CgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgojIDU5ICIvdXNyL2ZyZWV3YXJlL2xpYi9nY2Mt bGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4yL2luY2x1ZGUvZysrL2xpYmlvLmgiIDIgMwoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCiMgMTA0ICIvdXNyL2ZyZWV3YXJlL2xpYi9n Y2MtbGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4yL2luY2x1ZGUvZysrL2xpYmlvLmgiIDMKCgoK CgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCnN0 cnVjdCBfSU9fanVtcF90OyAgc3RydWN0IF9JT19GSUxFOwoKIAojIDE3NCAiL3Vzci9mcmVld2Fy ZS9saWIvZ2NjLWxpYi9taXBzLXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2crKy9saWJpby5o IiAzCgoKCgoKCgoKCiAgICB0eXBlZGVmIHZvaWQgX0lPX2xvY2tfdDsKCgoKCgogCgpzdHJ1Y3Qg X0lPX21hcmtlciB7CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0OwogIHN0cnVjdCBfSU9fRklM RSAqX3NidWY7CiAgIAoKICAgCiAgaW50IF9wb3M7CiMgMjA3ICIvdXNyL2ZyZWV3YXJlL2xpYi9n Y2MtbGliL21pcHMtc2dpLWlyaXg2LjIvMi45NS4yL2luY2x1ZGUvZysrL2xpYmlvLmgiIDMKCn07 CgpzdHJ1Y3QgX0lPX0ZJTEUgewogIGludCBfZmxhZ3M7CQkgCgoKICAgCiAgIAogIGNoYXIqIF9J T19yZWFkX3B0cjsJIAogIGNoYXIqIF9JT19yZWFkX2VuZDsJIAogIGNoYXIqIF9JT19yZWFkX2Jh c2U7CSAKICBjaGFyKiBfSU9fd3JpdGVfYmFzZTsJIAogIGNoYXIqIF9JT193cml0ZV9wdHI7CSAK ICBjaGFyKiBfSU9fd3JpdGVfZW5kOwkgCiAgY2hhciogX0lPX2J1Zl9iYXNlOwkgCiAgY2hhciog X0lPX2J1Zl9lbmQ7CSAKICAgCiAgY2hhciAqX0lPX3NhdmVfYmFzZTsgIAogIGNoYXIgKl9JT19i YWNrdXBfYmFzZTsgICAKICBjaGFyICpfSU9fc2F2ZV9lbmQ7ICAKCiAgc3RydWN0IF9JT19tYXJr ZXIgKl9tYXJrZXJzOwoKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9jaGFpbjsKCiAgaW50IF9maWxlbm87 CiAgaW50IF9ibGtzaXplOwoKCgogIF9HX29mZl90ICBfb2Zmc2V0OwoKCgogICAKICB1bnNpZ25l ZCBzaG9ydCBfY3VyX2NvbHVtbjsKICBjaGFyIF91bnVzZWQ7CiAgY2hhciBfc2hvcnRidWZbMV07 CgogICAKCgoKCgoKCgp9OwoKCgoKCgoKCgoKCnN0cnVjdCBfSU9fRklMRV9wbHVzOwpleHRlcm4g c3RydWN0IF9JT19GSUxFX3BsdXMgX0lPX3N0ZGluXywgX0lPX3N0ZG91dF8sIF9JT19zdGRlcnJf OwoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIF9HX3NzaXplX3QgICgqcmVhZCkgIChzdHJ1Y3Qg X0lPX0ZJTEUgKiwgdm9pZCAqLCBfR19zc2l6ZV90ICkgIDsKICBfR19zc2l6ZV90ICAoKndyaXRl KSAgKHN0cnVjdCBfSU9fRklMRSAqLCBjb25zdCB2b2lkICosIF9HX3NzaXplX3QgKSAgOwogIF9H X2Zwb3NfdCAgKCpzZWVrKSAgKHN0cnVjdCBfSU9fRklMRSAqLCBfR19vZmZfdCAsIGludCkgIDsK ICBpbnQgKCpjbG9zZSkgIChzdHJ1Y3QgX0lPX0ZJTEUgKikgIDsKfSBfSU9fY29va2llX2lvX2Z1 bmN0aW9uc190OwoKIApzdHJ1Y3QgX0lPX2Nvb2tpZV9maWxlCnsKICBzdHJ1Y3QgX0lPX0ZJTEUg ZmlsZTsKICBjb25zdCB2b2lkICp2dGFibGU7CiAgdm9pZCAqY29va2llOwogIF9JT19jb29raWVf aW9fZnVuY3Rpb25zX3QgaW9fZnVuY3Rpb25zOwp9OwoKCgpleHRlcm4gIkMiIHsKCgpleHRlcm4g aW50IF9fdW5kZXJmbG93ICAoX0lPX0ZJTEUgKikgIDsKZXh0ZXJuIGludCBfX3VmbG93ICAoX0lP X0ZJTEUgKikgIDsKZXh0ZXJuIGludCBfX292ZXJmbG93ICAoX0lPX0ZJTEUgKiwgaW50KSAgOwoK CgoKCgoKCgoKCgoKCgoKCmV4dGVybiBpbnQgX0lPX2dldGMgIChfSU9fRklMRSAqX19mcCkgIDsK ZXh0ZXJuIGludCBfSU9fcHV0YyAgKGludCBfX2MsIF9JT19GSUxFICpfX2ZwKSAgOwpleHRlcm4g aW50IF9JT19mZW9mICAoX0lPX0ZJTEUgKl9fZnApICA7CmV4dGVybiBpbnQgX0lPX2ZlcnJvciAg KF9JT19GSUxFICpfX2ZwKSAgOwoKZXh0ZXJuIGludCBfSU9fcGVla2NfbG9ja2VkICAoX0lPX0ZJ TEUgKl9fZnApICA7CgogCgoKCmV4dGVybiB2b2lkIF9JT19mbG9ja2ZpbGUgIChfSU9fRklMRSAq KSAgOwpleHRlcm4gdm9pZCBfSU9fZnVubG9ja2ZpbGUgIChfSU9fRklMRSAqKSAgOwpleHRlcm4g aW50IF9JT19mdHJ5bG9ja2ZpbGUgIChfSU9fRklMRSAqKSAgOwoKCgoKCgoKCgoKCgoKZXh0ZXJu IGludCBfSU9fdmZzY2FuZiAgKF9JT19GSUxFICosIGNvbnN0IGNoYXIgKiwgX0dfdmFfbGlzdCAs IGludCAqKSAgOwpleHRlcm4gaW50IF9JT192ZnByaW50ZiAgKF9JT19GSUxFICosIGNvbnN0IGNo YXIgKiwgX0dfdmFfbGlzdCApICA7CmV4dGVybiBfR19zc2l6ZV90ICBfSU9fcGFkbiAgKF9JT19G SUxFICosIGludCwgX0dfc3NpemVfdCApICA7CmV4dGVybiBfR19zaXplX3QgIF9JT19zZ2V0biAg KF9JT19GSUxFICosIHZvaWQgKiwgX0dfc2l6ZV90ICkgIDsKCgoKCgpleHRlcm4gX0dfZnBvc190 ICBfSU9fc2Vla29mZiAgKF9JT19GSUxFICosIF9HX29mZl90ICwgaW50LCBpbnQpICA7CmV4dGVy biBfR19mcG9zX3QgIF9JT19zZWVrcG9zICAoX0lPX0ZJTEUgKiwgX0dfZnBvc190ICwgaW50KSAg OwoKCmV4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1cF9hcmVhICAoX0lPX0ZJTEUgKikgIDsKCgp9 CgoKCiMgMzYgIi91c3IvZnJlZXdhcmUvbGliL2djYy1saWIvbWlwcy1zZ2ktaXJpeDYuMi8yLjk1 LjIvaW5jbHVkZS9nKysvc3RyZWFtYnVmLmgiIDIgMwoKfQogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKZXh0ZXJuICJDKysiIHsKY2xhc3MgaXN0cmVhbTsgIApjbGFzcyBvc3RyZWFtOyBjbGFz cyBzdHJlYW1idWY7CgogCgoKCgoKCgp0eXBlZGVmIF9HX29mZl90ICBzdHJlYW1vZmY7CnR5cGVk ZWYgX0dfZnBvc190ICBzdHJlYW1wb3M7Cgp0eXBlZGVmIF9HX3NzaXplX3QgIHN0cmVhbXNpemU7 Cgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19mbXRmbGFnczsKdHlwZWRlZiB1bnNpZ25lZCBjaGFy IF9faW9zdGF0ZTsKCnN0cnVjdCBfaW9zX2ZpZWxkcwp7ICAKICAgIHN0cmVhbWJ1ZiAqX3N0cmJ1 ZjsKICAgIG9zdHJlYW0qIF90aWU7CiAgICBpbnQgX3dpZHRoOwogICAgX19mbXRmbGFncyBfZmxh Z3M7CiAgICBzaG9ydCAgX2ZpbGw7CiAgICBfX2lvc3RhdGUgX3N0YXRlOwogICAgX19pb3N0YXRl IF9leGNlcHRpb25zOwogICAgaW50IF9wcmVjaXNpb247CgogICAgdm9pZCAqX2FycmF5czsgIAp9 OwoKCgoKCgoKCgoKCgoKCgojIDEyNCAiL3Vzci9mcmVld2FyZS9saWIvZ2NjLWxpYi9taXBzLXNn aS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2crKy9zdHJlYW1idWYuaCIgMwoKCmNsYXNzIGlvcyA6 IHB1YmxpYyBfaW9zX2ZpZWxkcyB7CiAgaW9zJiBvcGVyYXRvcj0oaW9zJik7ICAgCiAgaW9zIChj b25zdCBpb3MmKTsgIAogIHB1YmxpYzoKICAgIHR5cGVkZWYgX19mbXRmbGFncyBmbXRmbGFnczsK ICAgIHR5cGVkZWYgaW50IGlvc3RhdGU7CiAgICB0eXBlZGVmIGludCBvcGVubW9kZTsKICAgIHR5 cGVkZWYgX0dfc3NpemVfdCAgc3RyZWFtc2l6ZTsKICAgIGVudW0gaW9fc3RhdGUgewoJZ29vZGJp dCA9IDAgLAoJZW9mYml0ID0gMSAsCglmYWlsYml0ID0gMiAsCgliYWRiaXQgPSA0ICB9OwogICAg ZW51bSBvcGVuX21vZGUgewoJaW4gPSAxICwKCW91dCA9IDIgLAoJYXRlID0gNCAsCglhcHAgPSA4 ICwKCXRydW5jID0gMTYgLAoJbm9jcmVhdGUgPSAzMiAsCglub3JlcGxhY2UgPSA2NCAsCgliaW4g PSAxMjggLCAgCgliaW5hcnkgPSAxMjggIH07CiAgICBlbnVtIHNlZWtfZGlyIHsgYmVnLCBjdXIs IGVuZH07CiAgICB0eXBlZGVmIGVudW0gc2Vla19kaXIgc2Vla2RpcjsKICAgICAKICAgIGVudW0g eyBza2lwd3M9IDAxICwKCSAgIGxlZnQ9IDAyICwgcmlnaHQ9IDA0ICwgaW50ZXJuYWw9IDAxMCAs CgkgICBkZWM9IDAyMCAsIG9jdD0gMDQwICwgaGV4PSAwMTAwICwKCSAgIHNob3diYXNlPSAwMjAw ICwgc2hvd3BvaW50PSAwNDAwICwKCSAgIHVwcGVyY2FzZT0gMDEwMDAgLCBzaG93cG9zPSAwMjAw MCAsCgkgICBzY2llbnRpZmljPSAwNDAwMCAsIGZpeGVkPSAwMTAwMDAgLAoJICAgdW5pdGJ1Zj0g MDIwMDAwICwgc3RkaW89IDA0MDAwMCAKCgoKCSAgIH07CiAgICBlbnVtIHsgIAoJYmFzZWZpZWxk PWRlYytvY3QraGV4LAoJZmxvYXRmaWVsZCA9IHNjaWVudGlmaWMrZml4ZWQsCglhZGp1c3RmaWVs ZCA9IGxlZnQrcmlnaHQraW50ZXJuYWwKICAgIH07CgojIDE3NyAiL3Vzci9mcmVld2FyZS9saWIv Z2NjLWxpYi9taXBzLXNnaS1pcml4Ni4yLzIuOTUuMi9pbmNsdWRlL2crKy9zdHJlYW1idWYuaCIg MwoKCiAgICBvc3RyZWFtKiB0aWUoKSBjb25zdCB7IHJldHVybiBfdGllOyB9CiAgICBvc3RyZWFt KiB0aWUob3N0cmVhbSogdmFsKSB7IG9zdHJlYW0qIHNhdmU9X3RpZTsgX3RpZT12YWw7IHJldHVy biBzYXZlOyB9CgogICAgIAogICAgc2hvcnQgIGZpbGwoKSBjb25zdCB7IHJldHVybiBfZmlsbDsg fQogICAgc2hvcnQgIGZpbGwoc2hvcnQgIG5ld2YpCgl7c2hvcnQgIG9sZGYgPSBfZmlsbDsgX2Zp bGwgPSBuZXdmOyByZXR1cm4gb2xkZjt9CiAgICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0 dXJuIF9mbGFnczsgfQogICAgZm10ZmxhZ3MgZmxhZ3MoZm10ZmxhZ3MgbmV3X3ZhbCkgewoJZm10 ZmxhZ3Mgb2xkX3ZhbCA9IF9mbGFnczsgX2ZsYWdzID0gbmV3X3ZhbDsgcmV0dXJuIG9sZF92YWw7 IH0KICAgIGludCBwcmVjaXNpb24oKSBjb25zdCB7IHJldHVybiBfcHJlY2lzaW9uOyB9CiAgICBp bnQgcHJlY2lzaW9uKGludCBuZXdwKSB7Cgl1bnNpZ25lZCBzaG9ydCBvbGRwID0gX3ByZWNpc2lv bjsgX3ByZWNpc2lvbiA9ICh1bnNpZ25lZCBzaG9ydCluZXdwOwoJcmV0dXJuIG9sZHA7IH0KICAg IGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFsKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdz OwoJX2ZsYWdzIHw9IHZhbDsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10 ZmxhZ3MgdmFsLCBmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJ X2ZsYWdzID0gKF9mbGFncyAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsgcmV0dXJuIG9sZGJpdHM7 IH0KICAgIGZtdGZsYWdzIHVuc2V0ZihmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRz ID0gX2ZsYWdzOwoJX2ZsYWdzICY9IH5tYXNrOyByZXR1cm4gb2xkYml0czsgfQogICAgaW50IHdp ZHRoKCkgY29uc3QgeyByZXR1cm4gX3dpZHRoOyB9CiAgICBpbnQgd2lkdGgoaW50IHZhbCkgeyBp bnQgc2F2ZSA9IF93aWR0aDsgX3dpZHRoID0gdmFsOyByZXR1cm4gc2F2ZTsgfQoKCgoKICAgIHZv aWQgX3Rocm93X2ZhaWx1cmUoKSBjb25zdCB7IH0KCiAgICB2b2lkIGNsZWFyKGlvc3RhdGUgc3Rh dGUgPSAwKSB7Cglfc3RhdGUgPSBfc3RyYnVmID8gc3RhdGUgOiBzdGF0ZXxiYWRiaXQ7CglpZiAo X3N0YXRlICYgX2V4Y2VwdGlvbnMpIF90aHJvd19mYWlsdXJlKCk7IH0KICAgIHZvaWQgc2V0KGlv c3RhdGUgZmxhZykgeyBfc3RhdGUgfD0gZmxhZzsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykg X3Rocm93X2ZhaWx1cmUoKTsgfQogICAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIGZsYWcpIHsgX3N0 YXRlIHw9IGZsYWc7ICAKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUo KTsgfQogICAgaW50IGdvb2QoKSBjb25zdCB7IHJldHVybiBfc3RhdGUgPT0gMDsgfQogICAgaW50 IGVvZigpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSAmIGlvczo6ZW9mYml0OyB9CiAgICBpbnQgZmFp bCgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSAmIChpb3M6OmJhZGJpdHxpb3M6OmZhaWxiaXQpOyB9 CiAgICBpbnQgYmFkKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlICYgaW9zOjpiYWRiaXQ7IH0KICAg IGlvc3RhdGUgcmRzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZTsgfQogICAgb3BlcmF0b3Ig dm9pZCooKSBjb25zdCB7IHJldHVybiBmYWlsKCkgPyAodm9pZCopMCA6ICh2b2lkKikoLTEpOyB9 CiAgICBpbnQgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gZmFpbCgpOyB9CiAgICBpb3N0YXRl IGV4Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiBfZXhjZXB0aW9uczsgfQogICAgdm9pZCBleGNl cHRpb25zKGlvc3RhdGUgZW5hYmxlKSB7CglfZXhjZXB0aW9ucyA9IGVuYWJsZTsKCWlmIChfc3Rh dGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQoKICAgIHN0cmVhbWJ1ZiogcmRi dWYoKSBjb25zdCB7IHJldHVybiBfc3RyYnVmOyB9CiAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVh bWJ1ZiAqX3MpIHsKICAgICAgc3RyZWFtYnVmICpfb2xkID0gX3N0cmJ1ZjsgX3N0cmJ1ZiA9IF9z OyBjbGVhciAoKTsgcmV0dXJuIF9vbGQ7IH0KCiAgICBzdGF0aWMgaW50IHN5bmNfd2l0aF9zdGRp byhpbnQgb24pOwogICAgc3RhdGljIHZvaWQgc3luY193aXRoX3N0ZGlvKCkgeyBzeW5jX3dpdGhf c3RkaW8oMSk7IH0KICAgIHN0YXRpYyBmbXRmbGFncyBiaXRhbGxvYygpOwogICAgc3RhdGljIGlu dCB4YWxsb2MoKTsKICAgIHZvaWQqJiBwd29yZChpbnQpOwogICAgdm9pZCogcHdvcmQoaW50KSBj b25zdDsKICAgIGxvbmcmIGl3b3JkKGludCk7CiAgICBsb25nIGl3b3JkKGludCkgY29uc3Q7CgoK CgoKCgoKCiAgICAgCiAgICBjbGFzcyBJbml0IHsKICAgIHB1YmxpYzoKICAgICAgSW5pdCAoKSB7 IH0KICAgIH07CgogIHByb3RlY3RlZDoKICAgIGlubGluZSBpb3Moc3RyZWFtYnVmKiBzYiA9IDAs IG9zdHJlYW0qIHRpZV90byA9IDApOwogICAgaW5saW5lIHZpcnR1YWwgfmlvcygpOwogICAgaW5s aW5lIHZvaWQgaW5pdChzdHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0aWUgPSAwKTsKfTsKCgoKCnR5 cGVkZWYgaW9zOjpzZWVrX2RpciBfc2Vla19kaXI7CgoKIAogCiAKIAogCgogCiAKY2xhc3Mgc3Ry ZWFtbWFya2VyIDogcHJpdmF0ZSBfSU9fbWFya2VyIHsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1i dWY7CiAgICB2b2lkIHNldF9vZmZzZXQoaW50IG9mZnNldCkgeyBfcG9zID0gb2Zmc2V0OyB9CiAg cHVibGljOgogICAgc3RyZWFtbWFya2VyKHN0cmVhbWJ1ZiAqc2IpOwogICAgfnN0cmVhbW1hcmtl cigpOwogICAgaW50IHNhdmluZygpIHsgcmV0dXJuICAxOyB9CiAgICBpbnQgZGVsdGEoc3RyZWFt bWFya2VyJik7CiAgICBpbnQgZGVsdGEoKTsKfTsKCnN0cnVjdCBzdHJlYW1idWYgOiBwdWJsaWMg X0lPX0ZJTEUgeyAgCiAgICBmcmllbmQgY2xhc3MgaW9zOwogICAgZnJpZW5kIGNsYXNzIGlzdHJl YW07CiAgICBmcmllbmQgY2xhc3Mgb3N0cmVhbTsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1tYXJr ZXI7CiAgICBjb25zdCB2b2lkIComX3Z0YWJsZSgpIHsgcmV0dXJuICooY29uc3Qgdm9pZCoqKSgo X0lPX0ZJTEUqKXRoaXMgKyAxKTsgfQogIHByb3RlY3RlZDoKICAgIHN0YXRpYyBzdHJlYW1idWYq IF9saXN0X2FsbDsgIAogICAgX0lPX0ZJTEUqJiB4Y2hhaW4oKSB7IHJldHVybiBfY2hhaW47IH0K ICAgIHZvaWQgX3VuX2xpbmsoKTsKICAgIHZvaWQgX2xpbmtfaW4oKTsKICAgIGNoYXIqIGdwdHIo KSBjb25zdAogICAgICB7IHJldHVybiBfZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVfYmFzZSA6 IF9JT19yZWFkX3B0cjsgfQogICAgY2hhciogcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0 ZV9wdHI7IH0KICAgIGNoYXIqIGVncHRyKCkgY29uc3QKICAgICAgeyByZXR1cm4gX2ZsYWdzICAm IDB4MTAwICA/IF9JT19zYXZlX2VuZCA6IF9JT19yZWFkX2VuZDsgfQogICAgY2hhciogZXBwdHIo KSBjb25zdCB7IHJldHVybiBfSU9fd3JpdGVfZW5kOyB9CiAgICBjaGFyKiBwYmFzZSgpIGNvbnN0 IHsgcmV0dXJuIF9JT193cml0ZV9iYXNlOyB9CiAgICBjaGFyKiBlYmFjaygpIGNvbnN0CiAgICAg IHsgcmV0dXJuIF9mbGFncyAgJiAweDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3JlYWRfYmFz ZTt9CiAgICBjaGFyKiBiYXNlKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9iYXNlOyB9CiAgICBj aGFyKiBlYnVmKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1Zl9lbmQ7IH0KICAgIGludCBibGVuKCkg Y29uc3QgeyByZXR1cm4gX0lPX2J1Zl9lbmQgLSBfSU9fYnVmX2Jhc2U7IH0KICAgIHZvaWQgeHB1 dF9jaGFyKGNoYXIgYykgeyAqX0lPX3dyaXRlX3B0cisrID0gYzsgfQogICAgaW50IHhmbGFncygp IHsgcmV0dXJuIF9mbGFncyA7IH0KICAgIGludCB4ZmxhZ3MoaW50IGYpIHtpbnQgZmwgPSBfZmxh Z3MgOyBfZmxhZ3MgID0gZjsgcmV0dXJuIGZsO30KICAgIHZvaWQgeHNldGZsYWdzKGludCBmKSB7 IF9mbGFncyAgfD0gZjsgfQogICAgdm9pZCB4c2V0ZmxhZ3MoaW50IGYsIGludCBtYXNrKQogICAg ICB7IF9mbGFncyAgPSAoX2ZsYWdzICAmIH5tYXNrKSB8IChmICYgbWFzayk7IH0KICAgIHZvaWQg Z2J1bXAoaW50IG4pCiAgICAgIHsgX2ZsYWdzICAmIDB4MTAwICA/IChfSU9fc2F2ZV9iYXNlKz1u KTooX0lPX3JlYWRfcHRyKz1uKTt9CiAgICB2b2lkIHBidW1wKGludCBuKSB7IF9JT193cml0ZV9w dHIgKz0gbjsgfQogICAgdm9pZCBzZXRiKGNoYXIqIGIsIGNoYXIqIGViLCBpbnQgYT0wKTsKICAg IHZvaWQgc2V0cChjaGFyKiBwLCBjaGFyKiBlcCkKICAgICAgeyBfSU9fd3JpdGVfYmFzZT1fSU9f d3JpdGVfcHRyPXA7IF9JT193cml0ZV9lbmQ9ZXA7IH0KICAgIHZvaWQgc2V0ZyhjaGFyKiBlYiwg Y2hhciogZywgY2hhciAqZWcpIHsKICAgICAgaWYgKF9mbGFncyAgJiAweDEwMCApIF9JT19mcmVl X2JhY2t1cF9hcmVhKHRoaXMpOyAKICAgICAgX0lPX3JlYWRfYmFzZSA9IGViOyBfSU9fcmVhZF9w dHIgPSBnOyBfSU9fcmVhZF9lbmQgPSBlZzsgfQogICAgY2hhciAqc2hvcnRidWYoKSB7IHJldHVy biBfc2hvcnRidWY7IH0KCiAgICBpbnQgaW5fYmFja3VwKCkgeyByZXR1cm4gX2ZsYWdzICYgMHgx MDAgOyB9CiAgICAgCiAgICBjaGFyICpHYmFzZSgpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lP X3NhdmVfYmFzZSA6IF9JT19yZWFkX2Jhc2U7IH0KICAgICAKICAgIGNoYXIgKmVHcHRyKCkgeyBy ZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fc2F2ZV9lbmQgOiBfSU9fcmVhZF9lbmQ7IH0KICAgICAK ICAgIGNoYXIgKkJiYXNlKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fcmVhZF9iYXNlIDog X0lPX3NhdmVfYmFzZTsgfQogICAgY2hhciAqQnB0cigpIHsgcmV0dXJuIF9JT19iYWNrdXBfYmFz ZTsgfQogICAgIAogICAgY2hhciAqZUJwdHIoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19y ZWFkX2VuZCA6IF9JT19zYXZlX2VuZDsgfQogICAgY2hhciAqTmJhc2UoKSB7IHJldHVybiBfSU9f c2F2ZV9iYXNlOyB9CiAgICBjaGFyICplTnB0cigpIHsgcmV0dXJuIF9JT19zYXZlX2VuZDsgfQog ICAgaW50IGhhdmVfYmFja3VwKCkgeyByZXR1cm4gX0lPX3NhdmVfYmFzZSAhPSBfX251bGwgOyB9 CiAgICBpbnQgaGF2ZV9tYXJrZXJzKCkgeyByZXR1cm4gX21hcmtlcnMgIT0gX19udWxsIDsgfQog ICAgdm9pZCBmcmVlX2JhY2t1cF9hcmVhKCk7CiAgICB2b2lkIHVuc2F2ZV9tYXJrZXJzKCk7ICAK ICAgIGludCBwdXRfbW9kZSgpIHsgcmV0dXJuIF9mbGFncyAmIDB4ODAwIDsgfQogICAgaW50IHN3 aXRjaF90b19nZXRfbW9kZSgpOwogICAgCiAgICBzdHJlYW1idWYoaW50IGZsYWdzPTApOwogIHB1 YmxpYzoKICAgIHN0YXRpYyBpbnQgZmx1c2hfYWxsKCk7CiAgICBzdGF0aWMgdm9pZCBmbHVzaF9h bGxfbGluZWJ1ZmZlcmVkKCk7ICAKICAgIHZpcnR1YWwgfnN0cmVhbWJ1ZigpOwogICAgdmlydHVh bCBpbnQgb3ZlcmZsb3coaW50IGMgPSAoLTEpICk7ICAKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxv dygpOyAgCiAgICB2aXJ0dWFsIGludCB1ZmxvdygpOyAgCiAgICB2aXJ0dWFsIGludCBwYmFja2Zh aWwoaW50IGMpOwogCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIqIHMs IHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgeHNnZXRuKGNoYXIqIHMsIHN0 cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzZWVrb2ZmKHN0cmVhbW9mZiwgX3Nl ZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlvczo6b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtcG9z IHNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KTsKCiAg ICBzdHJlYW1wb3MgcHVic2Vla29mZihzdHJlYW1vZmYgbywgX3NlZWtfZGlyIGQsIGludCBtb2Rl PWlvczo6aW58aW9zOjpvdXQpCiAgICAgIHsgcmV0dXJuIF9JT19zZWVrb2ZmICh0aGlzLCBvLCBk LCBtb2RlKTsgfQogICAgc3RyZWFtcG9zIHB1YnNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1v ZGUgPSBpb3M6OmlufGlvczo6b3V0KQogICAgICB7IHJldHVybiBfSU9fc2Vla3BvcyAodGhpcywg cG9zLCBtb2RlKTsgfQogICAgc3RyZWFtcG9zIHNzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGly LCBpbnQgbW9kZT1pb3M6OmlufGlvczo6b3V0KTsKICAgIHN0cmVhbXBvcyBzc2Vla3BvcyhzdHJl YW1wb3MgcG9zLCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJl YW1idWYqIHNldGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHZpcnR1YWwgaW50IHN5bmMoKTsK ICAgIHZpcnR1YWwgaW50IGRvYWxsb2NhdGUoKTsKCiAgICBpbnQgc2Vla21hcmsoc3RyZWFtbWFy a2VyJiBtYXJrLCBpbnQgZGVsdGEgPSAwKTsKICAgIGludCBzcHV0YmFja2MoY2hhciBjKTsKICAg IGludCBzdW5nZXRjKCk7CiAgICBpbnQgdW5idWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDIg ID8gMSA6IDA7IH0KICAgIGludCBsaW5lYnVmZmVyZWQoKSB7IHJldHVybiBfZmxhZ3MgJiAweDIw MCAgPyAxIDogMDsgfQogICAgdm9pZCB1bmJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdz IHw9IDIgOyBlbHNlIF9mbGFncyAmPSB+MiA7IH0KICAgIHZvaWQgbGluZWJ1ZmZlcmVkKGludCBp KQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDB4MjAwIDsgZWxzZSBfZmxhZ3MgJj0gfjB4MjAwIDsgfQog ICAgaW50IGFsbG9jYXRlKCkgeyAgCglpZiAoYmFzZSgpIHx8IHVuYnVmZmVyZWQoKSkgcmV0dXJu IDA7CgllbHNlIHJldHVybiBkb2FsbG9jYXRlKCk7IH0KICAgICAKICAgIHZvaWQgYWxsb2NidWYo KSB7IGlmIChiYXNlKCkgPT0gX19udWxsICkgZG9hbGxvY2J1ZigpOyB9CiAgICB2b2lkIGRvYWxs b2NidWYoKTsKICAgIGludCBpbl9hdmFpbCgpIHsgcmV0dXJuIF9JT19yZWFkX2VuZCAtIF9JT19y ZWFkX3B0cjsgfQogICAgaW50IG91dF93YWl0aW5nKCkgeyByZXR1cm4gX0lPX3dyaXRlX3B0ciAt IF9JT193cml0ZV9iYXNlOyB9CiAgICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0 cmVhbXNpemUgbikgeyByZXR1cm4geHNwdXRuKHMsIG4pOyB9CiAgICBzdHJlYW1zaXplIHBhZG4o Y2hhciBwYWQsIHN0cmVhbXNpemUgbikgeyByZXR1cm4gX0lPX3BhZG4odGhpcywgcGFkLCBuKTsg fQogICAgc3RyZWFtc2l6ZSBzZ2V0bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pIHsgcmV0dXJuIF9J T19zZ2V0bih0aGlzLCBzLCBuKTsgfQogICAgaW50IGlnbm9yZShpbnQpOwogICAgaW50IGdldF9j b2x1bW4oKTsKICAgIGludCBzZXRfY29sdW1uKGludCk7CiAgICBsb25nIHNnZXRsaW5lKGNoYXIq IGJ1ZiwgX0dfc2l6ZV90ICBuLCBjaGFyIGRlbGltLCBpbnQgcHV0YmFja19kZWxpbSk7CiAgICBp bnQgc3B1dGMoaW50IGMpIHsgcmV0dXJuIF9JT19wdXRjKGMsIHRoaXMpOyB9CiAgICBpbnQgc2J1 bXBjKCkgeyByZXR1cm4gX0lPX2dldGModGhpcyk7IH0KICAgIGludCBzZ2V0YygpIHsgcmV0dXJu ICgoICB0aGlzICApLT5fSU9fcmVhZF9wdHIgPj0gKCAgdGhpcyAgKS0+X0lPX3JlYWRfZW5kICYm IF9fdW5kZXJmbG93ICggIHRoaXMgICkgPT0gKC0xKSAgPyAoLTEpICA6ICoodW5zaWduZWQgY2hh ciAqKSAoICB0aGlzICApLT5fSU9fcmVhZF9wdHIpICA7IH0KICAgIGludCBzbmV4dGMoKSB7Cglp ZiAoX0lPX3JlYWRfcHRyID49IF9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyh0aGlzKSA9PSAo LTEpICkKCSAgcmV0dXJuICgtMSkgOwoJZWxzZSByZXR1cm4gX0lPX3JlYWRfcHRyKyssIHNnZXRj KCk7IH0KICAgIHZvaWQgc3Rvc3NjKCkgeyBpZiAoX0lPX3JlYWRfcHRyIDwgX0lPX3JlYWRfZW5k KSBfSU9fcmVhZF9wdHIrKzsgfQogICAgaW50IHZzY2FuKGNoYXIgY29uc3QgKmZtdDAsIF9HX3Zh X2xpc3QgIGFwLCBpb3MqIHN0cmVhbSA9IF9fbnVsbCApOwogICAgaW50IHNjYW4oY2hhciBjb25z dCAqZm10MCAuLi4pOwogICAgaW50IHZmb3JtKGNoYXIgY29uc3QgKmZtdDAsIF9HX3ZhX2xpc3Qg IGFwKTsKICAgIGludCBmb3JtKGNoYXIgY29uc3QgKmZtdDAgLi4uKTsKCgoKCiAgICB2aXJ0dWFs IHN0cmVhbXNpemUgc3lzX3JlYWQoY2hhciogYnVmLCBzdHJlYW1zaXplIHNpemUpOwogICAgdmly dHVhbCBzdHJlYW1zaXplIHN5c193cml0ZShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2 aXJ0dWFsIHN0cmVhbXBvcyBzeXNfc2VlayhzdHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0 dWFsIGludCBzeXNfY2xvc2UoKTsKICAgIHZpcnR1YWwgaW50IHN5c19zdGF0KHZvaWQqKTsgIAoK CgoKfTsKCiAKIAoKY2xhc3MgZmlsZWJ1ZiA6IHB1YmxpYyBzdHJlYW1idWYgewogIHByb3RlY3Rl ZDoKICAgIHZvaWQgaW5pdCgpOwogIHB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBpbnQgb3BlbnBy b3Q7ICAKICAgIGZpbGVidWYoKTsKICAgIGZpbGVidWYoaW50IGZkKTsKICAgIGZpbGVidWYoaW50 IGZkLCBjaGFyKiBwLCBpbnQgbGVuKTsKCgoKICAgIH5maWxlYnVmKCk7CiAgICBmaWxlYnVmKiBh dHRhY2goaW50IGZkKTsKICAgIGZpbGVidWYqIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNv bnN0IGNoYXIgKm1vZGUpOwogICAgZmlsZWJ1Ziogb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwg aW9zOjpvcGVubW9kZSBtb2RlLCBpbnQgcHJvdCA9IDA2NjQpOwogICAgdmlydHVhbCBpbnQgdW5k ZXJmbG93KCk7CiAgICB2aXJ0dWFsIGludCBvdmVyZmxvdyhpbnQgYyA9ICgtMSkgKTsKICAgIGlu dCBpc19vcGVuKCkgY29uc3QgeyByZXR1cm4gX2ZpbGVubyA+PSAwOyB9CiAgICBpbnQgZmQoKSBj b25zdCB7IHJldHVybiBpc19vcGVuKCkgPyBfZmlsZW5vIDogKC0xKSA7IH0KICAgIGZpbGVidWYq IGNsb3NlKCk7CiAgICB2aXJ0dWFsIGludCBkb2FsbG9jYXRlKCk7CiAgICB2aXJ0dWFsIHN0cmVh bXBvcyBzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlvczo6 b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtYnVmKiBzZXRidWYoY2hhciogcCwgaW50IGxlbik7CiAg ICBzdHJlYW1zaXplIHhzcHV0bihjb25zdCBjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwogICAgc3Ry ZWFtc2l6ZSB4c2dldG4oY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKICAgIHZpcnR1YWwgaW50IHN5 bmMoKTsKICBwcm90ZWN0ZWQ6ICAKIAogICAgaW50IGlzX3JlYWRpbmcoKSB7IHJldHVybiBlYmFj aygpICE9IGVncHRyKCk7IH0KICAgIGNoYXIqIGN1cl9wdHIoKSB7IHJldHVybiBpc19yZWFkaW5n KCkgPyAgZ3B0cigpIDogcHB0cigpOyB9CiAgICAgCiAgICBjaGFyKiBmaWxlX3B0cigpIHsgcmV0 dXJuIGVHcHRyKCk7IH0KICAgICAKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSBzeXNfcmVhZChjaGFy KiBidWYsIHN0cmVhbXNpemUgc2l6ZSk7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzeXNfc2Vlayhz dHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3dyaXRlKGNv bnN0IGNoYXIqLCBzdHJlYW1zaXplKTsKICAgIHZpcnR1YWwgaW50IHN5c19zdGF0KHZvaWQqKTsg IAogICAgdmlydHVhbCBpbnQgc3lzX2Nsb3NlKCk7CgoKCgp9OwoKaW5saW5lIHZvaWQgaW9zOjpp bml0KHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qIHRpZV90bykgewoJCV9zdGF0ZSA9IHNiID8gaW9z Ojpnb29kYml0IDogaW9zOjpiYWRiaXQ7IF9leGNlcHRpb25zPTA7CgkJX3N0cmJ1Zj1zYjsgX3Rp ZSA9IHRpZV90bzsgX3dpZHRoPTA7IF9maWxsPScgJzsKCgkJX2ZsYWdzPWlvczo6c2tpcHdzfGlv czo6ZGVjOwoKCgoJCV9wcmVjaXNpb249NjsgX2FycmF5cyA9IDA7IH0KCmlubGluZSBpb3M6Omlv cyhzdHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0aWVfdG8pIHsgaW5pdChzYiwgdGllX3RvKTsgfQoK aW5saW5lIGlvczo6fmlvcygpIHsKCgoKICAgICAKICAgICAKICAgIG9wZXJhdG9yIGRlbGV0ZVtd IChfYXJyYXlzKTsKfQp9ICAKCiMgMzEgIi91c3IvZnJlZXdhcmUvbGliL2djYy1saWIvbWlwcy1z Z2ktaXJpeDYuMi8yLjk1LjIvaW5jbHVkZS9nKysvaW9zdHJlYW0uaCIgMiAzCgoKZXh0ZXJuICJD KysiIHsKY2xhc3MgaXN0cmVhbTsgY2xhc3Mgb3N0cmVhbTsKdHlwZWRlZiBpb3MmICgqX19tYW5p cCkoaW9zJik7CnR5cGVkZWYgaXN0cmVhbSYgKCpfX2ltYW5pcCkoaXN0cmVhbSYpOwp0eXBlZGVm IG9zdHJlYW0mICgqX19vbWFuaXApKG9zdHJlYW0mKTsKCmV4dGVybiBpc3RyZWFtJiB3cyhpc3Ry ZWFtJiBpbnMpOwpleHRlcm4gb3N0cmVhbSYgZmx1c2gob3N0cmVhbSYgb3V0cyk7CmV4dGVybiBv c3RyZWFtJiBlbmRsKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgZW5kcyhvc3RyZWFt JiBvdXRzKTsKCmNsYXNzIG9zdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBpb3MKewogICAgIAogICAg dm9pZCBkb19vc2Z4KCk7CiAgcHVibGljOgogICAgb3N0cmVhbSgpIHsgfQogICAgb3N0cmVhbShz dHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0aWVkPSBfX251bGwgKTsKICAgIGludCBvcGZ4KCkgewoJ aWYgKCFnb29kKCkpIHJldHVybiAwOwoJZWxzZSB7IGlmIChfdGllKSBfdGllLT5mbHVzaCgpOyAg OyByZXR1cm4gMTt9IH0KICAgIHZvaWQgb3NmeCgpIHsgIDsKCQkgIGlmIChmbGFncygpICYgKGlv czo6dW5pdGJ1Znxpb3M6OnN0ZGlvKSkKCQkgICAgICBkb19vc2Z4KCk7IH0KICAgIG9zdHJlYW0m IGZsdXNoKCk7CiAgICBvc3RyZWFtJiBwdXQoY2hhciBjKSB7IF9zdHJidWYtPnNwdXRjKGMpOyBy ZXR1cm4gKnRoaXM7IH0KCgoKCgogICAgb3N0cmVhbSYgd3JpdGUoY29uc3QgY2hhciAqcywgc3Ry ZWFtc2l6ZSBuKTsKICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIHN0 cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gd3JpdGUoKGNvbnN0IGNoYXIqKXMsIG4pO30KICAg IG9zdHJlYW0mIHdyaXRlKGNvbnN0IHNpZ25lZCBjaGFyICpzLCBzdHJlYW1zaXplIG4pCiAgICAg IHsgcmV0dXJuIHdyaXRlKChjb25zdCBjaGFyKilzLCBuKTt9CiAgICBvc3RyZWFtJiB3cml0ZShj b25zdCB2b2lkICpzLCBzdHJlYW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25zdCBj aGFyKilzLCBuKTt9CiAgICBvc3RyZWFtJiBzZWVrcChzdHJlYW1wb3MpOwogICAgb3N0cmVhbSYg c2Vla3Aoc3RyZWFtb2ZmLCBfc2Vla19kaXIpOwogICAgc3RyZWFtcG9zIHRlbGxwKCk7CiAgICBv c3RyZWFtJiBmb3JtKGNvbnN0IGNoYXIgKmZvcm1hdCAuLi4pOwogICAgb3N0cmVhbSYgdmZvcm0o Y29uc3QgY2hhciAqZm9ybWF0LCBfR192YV9saXN0ICBhcmdzKTsKCiAgICBvc3RyZWFtJiBvcGVy YXRvcjw8KGNoYXIgYyk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgYykg eyByZXR1cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KHNp Z25lZCBjaGFyIGMpIHsgcmV0dXJuICgqdGhpcykgPDwgKGNoYXIpYzsgfQogICAgb3N0cmVhbSYg b3BlcmF0b3I8PChjb25zdCBjaGFyICpzKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qg dW5zaWduZWQgY2hhciAqcykKCXsgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0K ICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qgc2lnbmVkIGNoYXIgKnMpCgl7IHJldHVybiAo KnRoaXMpIDw8IChjb25zdCBjaGFyKilzOyB9CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0 IHZvaWQgKnApOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChpbnQgbik7CiAgICBvc3RyZWFtJiBv cGVyYXRvcjw8KHVuc2lnbmVkIGludCBuKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBu KTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBuKTsKCiAgICBfX2V4dGVu c2lvbl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBsb25nIG4pOwogICAgX19leHRlbnNpb25f XyBvc3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBuKTsKCiAgICBvc3RyZWFt JiBvcGVyYXRvcjw8KHNob3J0IG4pIHtyZXR1cm4gb3BlcmF0b3I8PCgoaW50KW4pO30KICAgIG9z dHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KCh1 bnNpZ25lZCBpbnQpbik7fQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoYm9vbCBiKSB7IHJldHVy biBvcGVyYXRvcjw8KChpbnQpYik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGRvdWJsZSBu KTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZmxvYXQgbikgeyByZXR1cm4gb3BlcmF0b3I8PCgo ZG91YmxlKW4pOyB9CgoKCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIG4pIHsg cmV0dXJuIG9wZXJhdG9yPDwoKGRvdWJsZSluKTsgfQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwo X19vbWFuaXAgZnVuYykgeyByZXR1cm4gKCpmdW5jKSgqdGhpcyk7IH0KICAgIG9zdHJlYW0mIG9w ZXJhdG9yPDwoX19tYW5pcCBmdW5jKSB7KCpmdW5jKSgqdGhpcyk7IHJldHVybiAqdGhpczt9CiAg ICBvc3RyZWFtJiBvcGVyYXRvcjw8KHN0cmVhbWJ1ZiopOwoKCgp9OwoKY2xhc3MgaXN0cmVhbSA6 IHZpcnR1YWwgcHVibGljIGlvcwp7CiAgICAgCnByb3RlY3RlZDoKICAgIF9HX3NpemVfdCAgX2dj b3VudDsKCiAgICBpbnQgX3NraXBfd3MoKTsKICBwdWJsaWM6CiAgICBpc3RyZWFtKCk6IF9nY291 bnQgKDApIHsgfQogICAgaXN0cmVhbShzdHJlYW1idWYqIHNiLCBvc3RyZWFtKnRpZWQ9IF9fbnVs bCApOwogICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdc bicpOwogICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBk ZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIqKXB0ciwgbGVuLCBkZWxpbSk7IH0KICAg IGlzdHJlYW0mIGdldChjaGFyJiBjKTsKICAgIGlzdHJlYW0mIGdldCh1bnNpZ25lZCBjaGFyJiBj KSB7IHJldHVybiBnZXQoKGNoYXImKWMpOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKGNoYXIqIHB0 ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0bGluZSh1bnNp Z25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0 bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBj aGFyJiBjKSAgeyByZXR1cm4gZ2V0KChjaGFyJiljKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25l ZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0KChj aGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKHNpZ25lZCBjaGFy KiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hh ciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgcmVhZChjaGFyICpwdHIsIHN0cmVh bXNpemUgbik7CiAgICBpc3RyZWFtJiByZWFkKHVuc2lnbmVkIGNoYXIgKnB0ciwgc3RyZWFtc2l6 ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFyKilwdHIsIG4pOyB9CiAgICBpc3RyZWFtJiBy ZWFkKHNpZ25lZCBjaGFyICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgo Y2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgcmVhZCh2b2lkICpwdHIsIHN0cmVhbXNpemUg bikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgZ2V0 KHN0cmVhbWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGlzdHJlYW0mIGdldHMoY2hh ciAqKnMsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGludCBpcGZ4KGludCBuZWVkID0gMCkgewoJ aWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAg IDsKCSAgaWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8fCByZGJ1ZigpLT5pbl9hdmFpbCgpIDwgbmVl ZCkpIF90aWUtPmZsdXNoKCk7CgkgIGlmICghbmVlZCAmJiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdz KSkgcmV0dXJuIF9za2lwX3dzKCk7CgkgIGVsc2UgcmV0dXJuIDE7Cgl9CiAgICB9CiAgICBpbnQg aXBmeDAoKSB7ICAKCWlmICghZ29vZCgpKSB7IHNldChpb3M6OmZhaWxiaXQpOyByZXR1cm4gMDsg fQoJZWxzZSB7CgkgICA7CgkgIGlmIChfdGllKSBfdGllLT5mbHVzaCgpOwoJICBpZiAoZmxhZ3Mo KSAmIGlvczo6c2tpcHdzKSByZXR1cm4gX3NraXBfd3MoKTsKCSAgZWxzZSByZXR1cm4gMTsKCX0K ICAgIH0KICAgIGludCBpcGZ4MSgpIHsgIAoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJp dCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgcmRidWYoKS0+aW5f YXZhaWwoKSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJICByZXR1cm4gMTsKCX0KICAgIH0KICAgIHZv aWQgaXNmeCgpIHsgIDsgfQogICAgaW50IGdldCgpIHsgaWYgKCFpcGZ4MSgpKSByZXR1cm4gKC0x KSA7CgkJZWxzZSB7IGludCBjaCA9IF9zdHJidWYtPnNidW1wYygpOwoJCSAgICAgICBpZiAoY2gg PT0gKC0xKSApIHNldChpb3M6OmVvZmJpdCk7CgkJICAgICAgIGlzZngoKTsKCQkgICAgICAgcmV0 dXJuIGNoOwoJCSAgICAgfSB9CiAgICBpbnQgcGVlaygpOwogICAgX0dfc2l6ZV90ICBnY291bnQo KSB7IHJldHVybiBfZ2NvdW50OyB9CiAgICBpc3RyZWFtJiBpZ25vcmUoaW50IG49MSwgaW50IGRl bGltID0gKC0xKSApOwogICAgaW50IHN5bmMgKCk7CiAgICBpc3RyZWFtJiBzZWVrZyhzdHJlYW1w b3MpOwogICAgaXN0cmVhbSYgc2Vla2coc3RyZWFtb2ZmLCBfc2Vla19kaXIpOwogICAgc3RyZWFt cG9zIHRlbGxnKCk7CiAgICBpc3RyZWFtJiBwdXRiYWNrKGNoYXIgY2gpIHsKCWlmIChnb29kKCkg JiYgX3N0cmJ1Zi0+c3B1dGJhY2tjKGNoKSA9PSAoLTEpICkgY2xlYXIoaW9zOjpiYWRiaXQpOwoJ cmV0dXJuICp0aGlzO30KICAgIGlzdHJlYW0mIHVuZ2V0KCkgewoJaWYgKGdvb2QoKSAmJiBfc3Ry YnVmLT5zdW5nZXRjKCkgPT0gKC0xKSApIGNsZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhp czt9CiAgICBpc3RyZWFtJiBzY2FuKGNvbnN0IGNoYXIgKmZvcm1hdCAuLi4pOwogICAgaXN0cmVh bSYgdnNjYW4oY29uc3QgY2hhciAqZm9ybWF0LCBfR192YV9saXN0ICBhcmdzKTsKCgoKCgoKICAg IGlzdHJlYW0mIG9wZXJhdG9yPj4oY2hhciopOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNp Z25lZCBjaGFyKiBwKSB7IHJldHVybiBvcGVyYXRvcj4+KChjaGFyKilwKTsgfQogICAgaXN0cmVh bSYgb3BlcmF0b3I+PihzaWduZWQgY2hhcipwKSB7IHJldHVybiBvcGVyYXRvcj4+KChjaGFyKilw KTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFyJiBjKTsKICAgIGlzdHJlYW0mIG9wZXJh dG9yPj4odW5zaWduZWQgY2hhciYgYykge3JldHVybiBvcGVyYXRvcj4+KChjaGFyJiljKTt9CiAg ICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFyJiBjKSB7cmV0dXJuIG9wZXJhdG9yPj4o KGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oaW50Jik7CiAgICBpc3RyZWFtJiBv cGVyYXRvcj4+KGxvbmcmKTsKCiAgICBfX2V4dGVuc2lvbl9fIGlzdHJlYW0mIG9wZXJhdG9yPj4o bG9uZyBsb25nJik7CiAgICBfX2V4dGVuc2lvbl9fIGlzdHJlYW0mIG9wZXJhdG9yPj4odW5zaWdu ZWQgbG9uZyBsb25nJik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzaG9ydCYpOwogICAgaXN0 cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4o dW5zaWduZWQgbG9uZyYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCYp OwoKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oYm9vbCYpOwoKICAgIGlzdHJlYW0mIG9wZXJhdG9y Pj4oZmxvYXQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oZG91YmxlJik7CiAgICBpc3RyZWFt JiBvcGVyYXRvcj4+KGxvbmcgZG91YmxlJik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KCBfX21h bmlwIGZ1bmMpIHsoKmZ1bmMpKCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIGlzdHJlYW0mIG9w ZXJhdG9yPj4oX19pbWFuaXAgZnVuYykgeyByZXR1cm4gKCpmdW5jKSgqdGhpcyk7IH0KICAgIGlz dHJlYW0mIG9wZXJhdG9yPj4oc3RyZWFtYnVmKik7Cn07CgpjbGFzcyBpb3N0cmVhbSA6IHB1Ymxp YyBpc3RyZWFtLCBwdWJsaWMgb3N0cmVhbQp7CiAgcHVibGljOgogICAgaW9zdHJlYW0oKSB7IH0K ICAgIGlvc3RyZWFtKHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qdGllZD0gX19udWxsICk7Cn07Cgpj bGFzcyBfSU9faXN0cmVhbV93aXRoYXNzaWduIDogcHVibGljIGlzdHJlYW0gewpwdWJsaWM6CiAg X0lPX2lzdHJlYW1fd2l0aGFzc2lnbiYgb3BlcmF0b3I9KGlzdHJlYW0mKTsKICBfSU9faXN0cmVh bV93aXRoYXNzaWduJiBvcGVyYXRvcj0oX0lPX2lzdHJlYW1fd2l0aGFzc2lnbiYgcmhzKQogICAg eyByZXR1cm4gb3BlcmF0b3I9IChzdGF0aWNfY2FzdDxpc3RyZWFtJj4gKHJocykpOyB9Cn07Cgpj bGFzcyBfSU9fb3N0cmVhbV93aXRoYXNzaWduIDogcHVibGljIG9zdHJlYW0gewpwdWJsaWM6CiAg X0lPX29zdHJlYW1fd2l0aGFzc2lnbiYgb3BlcmF0b3I9KG9zdHJlYW0mKTsKICBfSU9fb3N0cmVh bV93aXRoYXNzaWduJiBvcGVyYXRvcj0oX0lPX29zdHJlYW1fd2l0aGFzc2lnbiYgcmhzKQogICAg eyByZXR1cm4gb3BlcmF0b3I9IChzdGF0aWNfY2FzdDxvc3RyZWFtJj4gKHJocykpOyB9Cn07Cgpl eHRlcm4gX0lPX2lzdHJlYW1fd2l0aGFzc2lnbiBjaW47CiAKZXh0ZXJuIF9JT19vc3RyZWFtX3dp dGhhc3NpZ24gY291dCwgY2VycjsKCmV4dGVybiBfSU9fb3N0cmVhbV93aXRoYXNzaWduIGNsb2cK CgoKOwoKZXh0ZXJuIGlzdHJlYW0mIGxvY2soaXN0cmVhbSYgaW5zKTsKZXh0ZXJuIGlzdHJlYW0m IHVubG9jayhpc3RyZWFtJiBpbnMpOwpleHRlcm4gb3N0cmVhbSYgbG9jayhvc3RyZWFtJiBvdXRz KTsKZXh0ZXJuIG9zdHJlYW0mIHVubG9jayhvc3RyZWFtJiBvdXRzKTsKCnN0cnVjdCBJb3N0cmVh bV9pbml0IHsgfSA7ICAgCgppbmxpbmUgaW9zJiBkZWMoaW9zJiBpKQp7IGkuc2V0Zihpb3M6OmRl YywgaW9zOjpkZWN8aW9zOjpoZXh8aW9zOjpvY3QpOyByZXR1cm4gaTsgfQppbmxpbmUgaW9zJiBo ZXgoaW9zJiBpKQp7IGkuc2V0Zihpb3M6OmhleCwgaW9zOjpkZWN8aW9zOjpoZXh8aW9zOjpvY3Qp OyByZXR1cm4gaTsgfQppbmxpbmUgaW9zJiBvY3QoaW9zJiBpKQp7IGkuc2V0Zihpb3M6Om9jdCwg aW9zOjpkZWN8aW9zOjpoZXh8aW9zOjpvY3QpOyByZXR1cm4gaTsgfQp9ICAKCgojIDExICJndGIt cmVkbGluLmNwcCIgMgoKIyAxICIvdXNyL2ZyZWV3YXJlL2xpYi9nY2MtbGliL21pcHMtc2dpLWly aXg2LjIvMi45NS4yL2luY2x1ZGUvZysrL2ZzdHJlYW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBmc3Ry ZWFtYmFzZSA6IHZpcnR1YWwgcHVibGljIGlvcyB7CgogICAgbXV0YWJsZSBmaWxlYnVmIF9fbXlf ZmI7ICAKCiAgICB2b2lkIF9fZmJfaW5pdCAoKTsKICBwdWJsaWM6CiAgICBmc3RyZWFtYmFzZSgp OwogICAgZnN0cmVhbWJhc2UoaW50IGZkKTsKICAgIGZzdHJlYW1iYXNlKGludCBmZCwgY2hhciAq cCwgaW50IGwpOyAgCiAgICBmc3RyZWFtYmFzZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwg aW50IHByb3Q9MDY2NCk7CiAgICB2b2lkIGNsb3NlKCk7CgogICAgZmlsZWJ1ZiogcmRidWYoKSBj b25zdCB7IHJldHVybiAmX19teV9mYjsgfQoKCgogICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKm5h bWUsIGludCBtb2RlLCBpbnQgcHJvdD0wNjY0KTsKICAgIGludCBpc19vcGVuKCkgY29uc3QgeyBy ZXR1cm4gcmRidWYoKS0+aXNfb3BlbigpOyB9CiAgICB2b2lkIHNldGJ1ZihjaGFyICpwdHIsIGlu dCBsZW4pIHsgcmRidWYoKS0+c2V0YnVmKHB0ciwgbGVuKTsgfQogICAgdm9pZCBhdHRhY2goaW50 IGZkKTsKCgoKCn07CgpjbGFzcyBpZnN0cmVhbSA6IHB1YmxpYyBmc3RyZWFtYmFzZSwgcHVibGlj IGlzdHJlYW0gewogIHB1YmxpYzoKICAgIGlmc3RyZWFtKCkgOiBmc3RyZWFtYmFzZSgpIHsgfQog ICAgaWZzdHJlYW0oaW50IGZkKSA6IGZzdHJlYW1iYXNlKGZkKSB7IH0KICAgIGlmc3RyZWFtKGlu dCBmZCwgY2hhciAqcCwgaW50IGwpIDogZnN0cmVhbWJhc2UoZmQsIHAsIGwpIHsgfSAgCiAgICBp ZnN0cmVhbShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZT1pb3M6OmluLCBpbnQgcHJvdD0wNjY0 KQoJOiBmc3RyZWFtYmFzZShuYW1lLCBtb2RlLCBwcm90KSB7IH0KICAgIHZvaWQgb3Blbihjb25z dCBjaGFyICpuYW1lLCBpbnQgbW9kZT1pb3M6OmluLCBpbnQgcHJvdD0wNjY0KQoJeyBmc3RyZWFt YmFzZTo6b3BlbihuYW1lLCBtb2RlLCBwcm90KTsgfQp9OwoKY2xhc3Mgb2ZzdHJlYW0gOiBwdWJs aWMgZnN0cmVhbWJhc2UsIHB1YmxpYyBvc3RyZWFtIHsKICBwdWJsaWM6CiAgICBvZnN0cmVhbSgp IDogZnN0cmVhbWJhc2UoKSB7IH0KICAgIG9mc3RyZWFtKGludCBmZCkgOiBmc3RyZWFtYmFzZShm ZCkgeyB9CiAgICBvZnN0cmVhbShpbnQgZmQsIGNoYXIgKnAsIGludCBsKSA6IGZzdHJlYW1iYXNl KGZkLCBwLCBsKSB7IH0gIAogICAgb2ZzdHJlYW0oY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGU9 aW9zOjpvdXQsIGludCBwcm90PTA2NjQpCgk6IGZzdHJlYW1iYXNlKG5hbWUsIG1vZGUsIHByb3Qp IHsgfQogICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlPWlvczo6b3V0LCBp bnQgcHJvdD0wNjY0KQoJeyBmc3RyZWFtYmFzZTo6b3BlbihuYW1lLCBtb2RlLCBwcm90KTsgfQp9 OwoKY2xhc3MgZnN0cmVhbSA6IHB1YmxpYyBmc3RyZWFtYmFzZSwgcHVibGljIGlvc3RyZWFtIHsK ICBwdWJsaWM6CiAgICBmc3RyZWFtKCkgOiBmc3RyZWFtYmFzZSgpIHsgfQogICAgZnN0cmVhbShp bnQgZmQpIDogZnN0cmVhbWJhc2UoZmQpIHsgfQogICAgZnN0cmVhbShjb25zdCBjaGFyICpuYW1l LCBpbnQgbW9kZSwgaW50IHByb3Q9MDY2NCkKCTogZnN0cmVhbWJhc2UobmFtZSwgbW9kZSwgcHJv dCkgeyB9CiAgICBmc3RyZWFtKGludCBmZCwgY2hhciAqcCwgaW50IGwpIDogZnN0cmVhbWJhc2Uo ZmQsIHAsIGwpIHsgfSAgCiAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUs IGludCBwcm90PTA2NjQpCgl7IGZzdHJlYW1iYXNlOjpvcGVuKG5hbWUsIG1vZGUsIHByb3QpOyB9 Cn07Cn0gIAoKIyAxMiAiZ3RiLXJlZGxpbi5jcHAiIDIKCgoKaW50IG1haW4oKXsKCgljaGFyIGNo OwoJaW50IHBvaW50cywgZmFjZXMsIG9mYWNlczsKCWNoYXIgc1s4MCBdLCBjaHNbODAgKzJdOwoJ aW50IGksajsKCWJvb2wgbGluZXB0c1sxMjUwMDAgXVsxMjUwMDAgXTsKCWludCBwdGEsIHB0Yiwg dmVydHM7CglpZnN0cmVhbSBidWZmZXJpbjsKCW9mc3RyZWFtIGJ1ZmZlcm91dDsKCiAKCgkgCgoK CgoJCglidWZmZXJvdXQub3BlbigicmVkbGluX2J1ZmZlci50bXAiKTsKCiAKCmNlcnI8PCJ2YXJz IGluaXQnZCI8PGVuZGw7CgoJd2hpbGUoIWNpbi5lb2YoKSl7CgkgCgkJY2g9Y2luLnBlZWsoKTsK CQlpZiAoY2g9PScjJyl7CgkJCWNpbi5nZXRsaW5lKHMsODAgLTEsJ1xuJyk7CgkJCWNvdXQ8PHM8 PGVuZGw7CgkJfQoJCWVsc2V7CgkJCWNpbj4+cG9pbnRzPj5mYWNlczsKCQkJYnJlYWs7CgkJfQoJ fQpjZXJyPDxwb2ludHM8PGVuZGw7CglpZihwb2ludHM+IDEyNTAwMCApewoJCWNlcnI8PCJUcnlp bmcgdG8gcHJvY2VzcyBhIGZpbGUgb2YgdGhpcyBtYWduaXR1ZGUgd2lsbCBnZXQgdWdseS4iPDxl bmRsOwoJCWNlcnI8PCJTdWdnZXN0IHJlZHVjaW5nIGZpbGUgdG8gPCI8PCAxMjUwMDAgPDwiIHBv aW50cy4iPDxlbmRsOwoJCWV4aXQoMCk7Cgl9CgpjZXJyPDwicG9pbnRzL2ZhY2VzIHJlYWQiPDxl bmRsOwoKCW9mYWNlcz1mYWNlczsKCiAKCglpPTA7Cgl3aGlsZSghY2luLmVvZigpKXsKCQljaCA9 IGNpbi5wZWVrKCk7CgkJY2luLmdldGxpbmUocyw4MCAtMSwnXG4nKTsKCQlidWZmZXJvdXQ8PHM8 PGVuZGw7CgkgCgkJaWYgKChjaGFyKWNoIT0nIycpCgkJCWkrKzsKCQlpZiAoaT09cG9pbnRzKQoJ CQlicmVhazsKCX0KCQoJaWYgKGNpbi5lb2YoKSl7CgkJY2Vycjw8ImRhdGEgaW5jb21wbGV0ZSwg RU9GIHJlYWNoZWQgZHVyaW5nIGNvb3JkaW5hdGUgc2VjdGlvbiI8PGVuZGw7CgkJZXhpdCgwKTsK CX0KCiAKCglpPTA7Cgl3aGlsZSghY2luLmVvZigpKXsKCQlpZiAoaT09ZmFjZXMpCgkJCWJyZWFr OwoJCWNoID0gY2luLnBlZWsoKTsKCSAKCQlpZiAoKGNoYXIpY2g9PScjJyl7CgkJCWNpbi5nZXRs aW5lKHMsODAgLTEsJ1xuJyk7CgkJCWJ1ZmZlcm91dDw8czw8ZW5kbDsKCQl9CgkJZWxzZXsKCQkJ Y2luPj52ZXJ0czsKCQkJaWYgKHZlcnRzIT0yKXsKCQkJCWNpbi5nZXRsaW5lKHMsODAgLTEsJ1xu Jyk7CgkJCQlidWZmZXJvdXQ8PHM8PGVuZGw7CgkJCX0KCQkJZWxzZXsKCQkJCWNpbj4+cHRhPj5w dGI7CgkJCQlpZighbGluZXB0c1twdGEtMV1bcHRiLTFdICYmICFsaW5lcHRzW3B0Yi0xXVtwdGEt MV0pewoJCQkJCWxpbmVwdHNbcHRhLTFdW3B0Yi0xXT0xOwoJCQkJCWxpbmVwdHNbcHRiLTFdW3B0 YS0xXT0xOwoJCQkJfQoJCQkJZWxzZXsKCQkJCQlvZmFjZXMtLTsKCQkJCX0KCQkJfQoJCQlpKys7 CgkJfQoJfQoKY2Vycjw8ImFsbCBmYWNlcyByZWFkLCByZWR1bmRhbnQgbGluZXMgcmVtb3ZlZCI8 PGVuZGw7CgoJaWYgKGNpbi5lb2YoKSl7CgkJY2Vycjw8ImRhdGEgcG9zc2libHkgaW5jb21wbGV0 ZSwgRU9GIHJlYWNoZWQgZHVyaW5nIGZhY2Ugc2VjdGlvbiI8PGVuZGw7Cgl9CgkKCWJ1ZmZlcm91 dC5jbG9zZSgpOwoJYnVmZmVyaW4ub3BlbigicmVkbGluX2J1ZmZlci50bXAiKTsKCgljb3V0PDxw b2ludHM8PCcgJzw8b2ZhY2VzPDxlbmRsOwoJd2hpbGUoIWJ1ZmZlcmluLmVvZigpKXsKCQlidWZm ZXJpbj4+Y2g7CgkJY291dDw8Y2g7Cgl9CgkKY2Vycjw8Im91dHB1dCB0cmFuc2ZlcnJlZCBmcm9t IGJ1ZmZlciI8PGVuZGw7CgoJYnVmZmVyaW4uY2xvc2UoKTsKCQoJcmV0dXJuKDApOwp9Cg==