From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============6791825583879689293==" MIME-Version: 1.0 From: Christoph Paasch To: mptcp at lists.01.org Subject: [MPTCP] [syzkaller] WARNING: CPU: 0 PID: 9 at net/mptcp/protocol.c:200 __mptcp_move_skbs_from_subflow+0x371/0x4a0 net/mptcp/protocol.c:200 Date: Tue, 24 Mar 2020 18:39:43 -0700 Message-ID: <20200325013943.GC3854@MacBook-Pro-64.local> X-Status: X-Keywords: X-UID: 4061 --===============6791825583879689293== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hello, yet another one: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 9 at net/mptcp/protocol.c:200 __mptcp_move_skbs_from_s= ubflow+0x371/0x4a0 net/mptcp/protocol.c:200 Kernel panic - not syncing: panic_on_warn set ... CPU: 0 PID: 9 Comm: ksoftirqd/0 Not tainted 5.6.0-rc5 #62 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga= 5cab58e9a3f-prebuilt.qemu.org 04/01/2014 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xda/0x116 lib/dump_stack.c:118 panic+0x1ae/0x509 kernel/panic.c:221 __warn.cold+0x2a/0x2e kernel/panic.c:582 report_bug+0x1a9/0x1e0 lib/bug.c:195 fixup_bug arch/x86/kernel/traps.c:174 [inline] fixup_bug arch/x86/kernel/traps.c:169 [inline] do_error_trap+0x97/0xc0 arch/x86/kernel/traps.c:267 do_invalid_op+0x37/0x50 arch/x86/kernel/traps.c:286 invalid_op+0x1e/0x30 arch/x86/entry/entry_64.S:1027 RIP: 0010:__mptcp_move_skbs_from_subflow+0x371/0x4a0 net/mptcp/protocol.c:2= 00 Code: 00 01 41 89 44 24 28 8b 45 b8 03 45 a8 41 01 c7 44 2b 7d ac 44 89 fe = e8 ad d5 2e ff 44 39 fb 0f 86 0c fe ff ff e8 9f d4 2e ff <0f> 0b e9 51 fe f= f ff e8 93 d4 2e ff 49 83 be c8 00 00 00 00 0f 85 RSP: 0018:ffffc900000679e0 EFLAGS: 00010206 RAX: ffff88807d525040 RBX: 0000000000007fc9 RCX: ffffffff81faa183 RDX: 0000000000000100 RSI: ffffffff81faa191 RDI: 0000000000000004 RBP: ffffc90000067a48 R08: ffff88807d525040 R09: 000000006215a4a4 R10: 0000000036cc3e18 R11: 00000000f697ff28 R12: ffff888052c6ad18 R13: ffff8880539a06c0 R14: ffff888055e98080 R15: 0000000000007fc8 move_skbs_to_msk+0xe6/0xf0 net/mptcp/protocol.c:238 mptcp_data_ready+0xa8/0x150 net/mptcp/protocol.c:252 subflow_data_ready+0x8a/0xa0 net/mptcp/subflow.c:774 tcp_data_ready net/ipv4/tcp_input.c:4767 [inline] tcp_data_queue+0x692/0x15b0 net/ipv4/tcp_input.c:4833 tcp_rcv_established+0x302/0xae0 net/ipv4/tcp_input.c:5727 tcp_v4_do_rcv+0x231/0x350 net/ipv4/tcp_ipv4.c:1621 tcp_v4_rcv+0x10da/0x1220 net/ipv4/tcp_ipv4.c:2003 ip_protocol_deliver_rcu+0x20/0x130 net/ipv4/ip_input.c:204 ip_local_deliver_finish net/ipv4/ip_input.c:231 [inline] NF_HOOK include/linux/netfilter.h:421 [inline] ip_local_deliver+0xe0/0x100 net/ipv4/ip_input.c:252 dst_input include/net/dst.h:442 [inline] ip_rcv_finish net/ipv4/ip_input.c:428 [inline] ip_rcv_finish net/ipv4/ip_input.c:414 [inline] NF_HOOK include/linux/netfilter.h:421 [inline] ip_rcv+0x70/0xa0 net/ipv4/ip_input.c:538 __netif_receive_skb_one_core+0x68/0xa0 net/core/dev.c:5187 __netif_receive_skb+0x2a/0xa0 net/core/dev.c:5301 process_backlog+0x104/0x250 net/core/dev.c:6133 napi_poll net/core/dev.c:6571 [inline] net_rx_action+0x14a/0x520 net/core/dev.c:6639 __do_softirq+0x115/0x33f kernel/softirq.c:292 run_ksoftirqd+0x46/0x60 kernel/softirq.c:603 smpboot_thread_fn+0x297/0x390 kernel/smpboot.c:165 kthread+0x153/0x180 kernel/kthread.c:255 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352 Dumping ftrace buffer: (ftrace buffer empty) Kernel Offset: disabled Rebooting in 1 seconds.. On top of 402d1b0dc2e1 ("mptcp: re-check dsn before reading from subflow") syzkaller-repro: # {Threaded:true Collide:false Repeat:true RepeatTimes:0 Procs:1 Sandbox:no= ne Fault:false FaultCall:-1 FaultNth:0 Leak:false NetInjection:true NetDevi= ces:true NetReset:false Cgroups:true BinfmtMisc:true CloseFDs:true KCSAN:fa= lse DevlinkPCI:false UseTmpDir:true HandleSegv:false Repro:false Trace:fals= e} r0 =3D socket$inet_mptcp(0x2, 0x1, 0x106) r1 =3D socket$inet_mptcp(0x2, 0x1, 0x106) bind$inet(r1, &(0x7f00000013c0)=3D{0x2, 0x4e20, @multicast2}, 0x10) connect$inet(r1, &(0x7f0000000040)=3D{0x2, 0x0, @loopback}, 0x10) listen(r1, 0x3) r2 =3D socket$inet6_tcp(0xa, 0x1, 0x0) ioctl$sock_SIOCGIFVLAN_SET_VLAN_NAME_TYPE_CMD(r2, 0x8982, 0x0) connect$inet(r0, &(0x7f0000000040)=3D{0x2, 0x4e20, @loopback}, 0x4d) sendmsg$inet(r0, &(0x7f0000000280)=3D{0x0, 0x0, &(0x7f0000000000)=3D[{&(0x7= f0000000080)=3D"ff", 0xff3e}], 0x1}, 0x0) C-repro is attached. Christoph --===============6791825583879689293== Content-Type: text/plain MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="repro.c" Ly8gYXV0b2dlbmVyYXRlZCBieSBzeXprYWxsZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUv c3l6a2FsbGVyKQoKI2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgoj aW5jbHVkZSA8ZGlyZW50Lmg+CiNpbmNsdWRlIDxlbmRpYW4uaD4KI2luY2x1ZGUgPGVycm5vLmg+ CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXQvaWZf YXJwLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNs dWRlIDxzY2hlZC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2lu Y2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkaW8uaD4K I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvaW9j dGwuaD4KI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiNpbmNs dWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5 cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4K I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3Vpby5oPgojaW5jbHVkZSA8c3lz L3dhaXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUg PGxpbnV4L2NhcGFiaWxpdHkuaD4KI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiNpbmNsdWRlIDxs aW51eC9nZW5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX2FkZHIuaD4KI2luY2x1ZGUgPGxp bnV4L2lmX2V0aGVyLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CiNpbmNsdWRlIDxsaW51 eC9pZl90dW4uaD4KI2luY2x1ZGUgPGxpbnV4L2luNi5oPgojaW5jbHVkZSA8bGludXgvaXAuaD4K I2luY2x1ZGUgPGxpbnV4L25laWdoYm91ci5oPgojaW5jbHVkZSA8bGludXgvbmV0Lmg+CiNpbmNs dWRlIDxsaW51eC9uZXRsaW5rLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1 ZGUgPGxpbnV4L3RjcC5oPgojaW5jbHVkZSA8bGludXgvdmV0aC5oPgoKc3RhdGljIHVuc2lnbmVk IGxvbmcgbG9uZyBwcm9jaWQ7CgpzdGF0aWMgdm9pZCBzbGVlcF9tcyh1aW50NjRfdCBtcykKewog IHVzbGVlcChtcyAqIDEwMDApOwp9CgpzdGF0aWMgdWludDY0X3QgY3VycmVudF90aW1lX21zKHZv aWQpCnsKICBzdHJ1Y3QgdGltZXNwZWMgdHM7CiAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9O T1RPTklDLCAmdHMpKQogICAgZXhpdCgxKTsKICByZXR1cm4gKHVpbnQ2NF90KXRzLnR2X3NlYyAq IDEwMDAgKyAodWludDY0X3QpdHMudHZfbnNlYyAvIDEwMDAwMDA7Cn0KCnN0YXRpYyB2b2lkIHVz ZV90ZW1wb3JhcnlfZGlyKHZvaWQpCnsKICBjaGFyIHRtcGRpcl90ZW1wbGF0ZVtdID0gIi4vc3l6 a2FsbGVyLlhYWFhYWCI7CiAgY2hhciogdG1wZGlyID0gbWtkdGVtcCh0bXBkaXJfdGVtcGxhdGUp OwogIGlmICghdG1wZGlyKQogICAgZXhpdCgxKTsKICBpZiAoY2htb2QodG1wZGlyLCAwNzc3KSkK ICAgIGV4aXQoMSk7CiAgaWYgKGNoZGlyKHRtcGRpcikpCiAgICBleGl0KDEpOwp9CgpzdGF0aWMg dm9pZCB0aHJlYWRfc3RhcnQodm9pZCogKCpmbikodm9pZCopLCB2b2lkKiBhcmcpCnsKICBwdGhy ZWFkX3QgdGg7CiAgcHRocmVhZF9hdHRyX3QgYXR0cjsKICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0 cik7CiAgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0ciwgMTI4IDw8IDEwKTsKICBpbnQg aTsKICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgm dGgsICZhdHRyLCBmbiwgYXJnKSA9PSAwKSB7CiAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZh dHRyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGVycm5vID09IEVBR0FJTikgewogICAg ICB1c2xlZXAoNTApOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBleGl0 KDEpOwp9Cgp0eXBlZGVmIHN0cnVjdCB7CiAgaW50IHN0YXRlOwp9IGV2ZW50X3Q7CgpzdGF0aWMg dm9pZCBldmVudF9pbml0KGV2ZW50X3QqIGV2KQp7CiAgZXYtPnN0YXRlID0gMDsKfQoKc3RhdGlj IHZvaWQgZXZlbnRfcmVzZXQoZXZlbnRfdCogZXYpCnsKICBldi0+c3RhdGUgPSAwOwp9CgpzdGF0 aWMgdm9pZCBldmVudF9zZXQoZXZlbnRfdCogZXYpCnsKICBpZiAoZXYtPnN0YXRlKQogICAgZXhp dCgxKTsKICBfX2F0b21pY19zdG9yZV9uKCZldi0+c3RhdGUsIDEsIF9fQVRPTUlDX1JFTEVBU0Up OwogIHN5c2NhbGwoU1lTX2Z1dGV4LCAmZXYtPnN0YXRlLCBGVVRFWF9XQUtFIHwgRlVURVhfUFJJ VkFURV9GTEFHLCAxMDAwMDAwKTsKfQoKc3RhdGljIHZvaWQgZXZlbnRfd2FpdChldmVudF90KiBl dikKewogIHdoaWxlICghX19hdG9taWNfbG9hZF9uKCZldi0+c3RhdGUsIF9fQVRPTUlDX0FDUVVJ UkUpKQogICAgc3lzY2FsbChTWVNfZnV0ZXgsICZldi0+c3RhdGUsIEZVVEVYX1dBSVQgfCBGVVRF WF9QUklWQVRFX0ZMQUcsIDAsIDApOwp9CgpzdGF0aWMgaW50IGV2ZW50X2lzc2V0KGV2ZW50X3Qq IGV2KQp7CiAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbigmZXYtPnN0YXRlLCBfX0FUT01JQ19BQ1FV SVJFKTsKfQoKc3RhdGljIGludCBldmVudF90aW1lZHdhaXQoZXZlbnRfdCogZXYsIHVpbnQ2NF90 IHRpbWVvdXQpCnsKICB1aW50NjRfdCBzdGFydCA9IGN1cnJlbnRfdGltZV9tcygpOwogIHVpbnQ2 NF90IG5vdyA9IHN0YXJ0OwogIGZvciAoOzspIHsKICAgIHVpbnQ2NF90IHJlbWFpbiA9IHRpbWVv dXQgLSAobm93IC0gc3RhcnQpOwogICAgc3RydWN0IHRpbWVzcGVjIHRzOwogICAgdHMudHZfc2Vj ID0gcmVtYWluIC8gMTAwMDsKICAgIHRzLnR2X25zZWMgPSAocmVtYWluICUgMTAwMCkgKiAxMDAw ICogMTAwMDsKICAgIHN5c2NhbGwoU1lTX2Z1dGV4LCAmZXYtPnN0YXRlLCBGVVRFWF9XQUlUIHwg RlVURVhfUFJJVkFURV9GTEFHLCAwLCAmdHMpOwogICAgaWYgKF9fYXRvbWljX2xvYWRfbigmZXYt PnN0YXRlLCBfX0FUT01JQ19BQ1FVSVJFKSkKICAgICAgcmV0dXJuIDE7CiAgICBub3cgPSBjdXJy ZW50X3RpbWVfbXMoKTsKICAgIGlmIChub3cgLSBzdGFydCA+IHRpbWVvdXQpCiAgICAgIHJldHVy biAwOwogIH0KfQoKc3RhdGljIGJvb2wgd3JpdGVfZmlsZShjb25zdCBjaGFyKiBmaWxlLCBjb25z dCBjaGFyKiB3aGF0LCAuLi4pCnsKICBjaGFyIGJ1ZlsxMDI0XTsKICB2YV9saXN0IGFyZ3M7CiAg dmFfc3RhcnQoYXJncywgd2hhdCk7CiAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHdoYXQs IGFyZ3MpOwogIHZhX2VuZChhcmdzKTsKICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CiAgaW50 IGxlbiA9IHN0cmxlbihidWYpOwogIGludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFkgfCBPX0NM T0VYRUMpOwogIGlmIChmZCA9PSAtMSkKICAgIHJldHVybiBmYWxzZTsKICBpZiAod3JpdGUoZmQs IGJ1ZiwgbGVuKSAhPSBsZW4pIHsKICAgIGludCBlcnIgPSBlcnJubzsKICAgIGNsb3NlKGZkKTsK ICAgIGVycm5vID0gZXJyOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjbG9zZShmZCk7CiAgcmV0 dXJuIHRydWU7Cn0KCnN0cnVjdCBubG1zZyB7CiAgY2hhciogcG9zOwogIGludCBuZXN0aW5nOwog IHN0cnVjdCBubGF0dHIqIG5lc3RlZFs4XTsKICBjaGFyIGJ1ZlsxMDI0XTsKfTsKCnN0YXRpYyBz dHJ1Y3Qgbmxtc2cgbmxtc2c7CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2luaXQoc3RydWN0IG5sbXNn KiBubG1zZywgaW50IHR5cCwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgY29u c3Qgdm9pZCogZGF0YSwgaW50IHNpemUpCnsKICBtZW1zZXQobmxtc2csIDAsIHNpemVvZigqbmxt c2cpKTsKICBzdHJ1Y3Qgbmxtc2doZHIqIGhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKW5sbXNnLT5i dWY7CiAgaGRyLT5ubG1zZ190eXBlID0gdHlwOwogIGhkci0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9S RVFVRVNUIHwgTkxNX0ZfQUNLIHwgZmxhZ3M7CiAgbWVtY3B5KGhkciArIDEsIGRhdGEsIHNpemUp OwogIG5sbXNnLT5wb3MgPSAoY2hhciopKGhkciArIDEpICsgTkxNU0dfQUxJR04oc2l6ZSk7Cn0K CnN0YXRpYyB2b2lkIG5ldGxpbmtfYXR0cihzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgdHlwLCBj b25zdCB2b2lkKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCnsKICBz dHJ1Y3QgbmxhdHRyKiBhdHRyID0gKHN0cnVjdCBubGF0dHIqKW5sbXNnLT5wb3M7CiAgYXR0ci0+ bmxhX2xlbiA9IHNpemVvZigqYXR0cikgKyBzaXplOwogIGF0dHItPm5sYV90eXBlID0gdHlwOwog IG1lbWNweShhdHRyICsgMSwgZGF0YSwgc2l6ZSk7CiAgbmxtc2ctPnBvcyArPSBOTE1TR19BTElH TihhdHRyLT5ubGFfbGVuKTsKfQoKc3RhdGljIHZvaWQgbmV0bGlua19uZXN0KHN0cnVjdCBubG1z Zyogbmxtc2csIGludCB0eXApCnsKICBzdHJ1Y3QgbmxhdHRyKiBhdHRyID0gKHN0cnVjdCBubGF0 dHIqKW5sbXNnLT5wb3M7CiAgYXR0ci0+bmxhX3R5cGUgPSB0eXA7CiAgbmxtc2ctPnBvcyArPSBz aXplb2YoKmF0dHIpOwogIG5sbXNnLT5uZXN0ZWRbbmxtc2ctPm5lc3RpbmcrK10gPSBhdHRyOwp9 CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2RvbmUoc3RydWN0IG5sbXNnKiBubG1zZykKewogIHN0cnVj dCBubGF0dHIqIGF0dHIgPSBubG1zZy0+bmVzdGVkWy0tbmxtc2ctPm5lc3RpbmddOwogIGF0dHIt Pm5sYV9sZW4gPSBubG1zZy0+cG9zIC0gKGNoYXIqKWF0dHI7Cn0KCnN0YXRpYyBpbnQgbmV0bGlu a19zZW5kX2V4dChzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgc29jaywgdWludDE2X3QgcmVwbHlf dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVwbHlfbGVuKQp7CiAgaWYg KG5sbXNnLT5wb3MgPiBubG1zZy0+YnVmICsgc2l6ZW9mKG5sbXNnLT5idWYpIHx8IG5sbXNnLT5u ZXN0aW5nKQogICAgZXhpdCgxKTsKICBzdHJ1Y3Qgbmxtc2doZHIqIGhkciA9IChzdHJ1Y3Qgbmxt c2doZHIqKW5sbXNnLT5idWY7CiAgaGRyLT5ubG1zZ19sZW4gPSBubG1zZy0+cG9zIC0gbmxtc2ct PmJ1ZjsKICBzdHJ1Y3Qgc29ja2FkZHJfbmwgYWRkcjsKICBtZW1zZXQoJmFkZHIsIDAsIHNpemVv ZihhZGRyKSk7CiAgYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOwogIHVuc2lnbmVkIG4gPSBz ZW5kdG8oc29jaywgbmxtc2ctPmJ1ZiwgaGRyLT5ubG1zZ19sZW4sIDAsCiAgICAgICAgICAgICAg ICAgICAgICAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKICBpZiAobiAh PSBoZHItPm5sbXNnX2xlbikKICAgIGV4aXQoMSk7CiAgbiA9IHJlY3Yoc29jaywgbmxtc2ctPmJ1 Ziwgc2l6ZW9mKG5sbXNnLT5idWYpLCAwKTsKICBpZiAoaGRyLT5ubG1zZ190eXBlID09IE5MTVNH X0RPTkUpIHsKICAgICpyZXBseV9sZW4gPSAwOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChuIDwg c2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpCiAgICBleGl0KDEpOwogIGlmIChyZXBseV9sZW4gJiYg aGRyLT5ubG1zZ190eXBlID09IHJlcGx5X3R5cGUpIHsKICAgICpyZXBseV9sZW4gPSBuOwogICAg cmV0dXJuIDA7CiAgfQogIGlmIChuIDwgc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgKyBzaXplb2Yo c3RydWN0IG5sbXNnZXJyKSkKICAgIGV4aXQoMSk7CiAgaWYgKGhkci0+bmxtc2dfdHlwZSAhPSBO TE1TR19FUlJPUikKICAgIGV4aXQoMSk7CiAgcmV0dXJuIC0oKHN0cnVjdCBubG1zZ2VyciopKGhk ciArIDEpKS0+ZXJyb3I7Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19zZW5kKHN0cnVjdCBubG1zZyog bmxtc2csIGludCBzb2NrKQp7CiAgcmV0dXJuIG5ldGxpbmtfc2VuZF9leHQobmxtc2csIHNvY2ss IDAsIE5VTEwpOwp9CgpzdGF0aWMgaW50IG5ldGxpbmtfbmV4dF9tc2coc3RydWN0IG5sbXNnKiBu bG1zZywgdW5zaWduZWQgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCB0b3RhbF9sZW4pCnsKICBzdHJ1Y3Qgbmxtc2doZHIqIGhkciA9IChzdHJ1Y3Qg bmxtc2doZHIqKShubG1zZy0+YnVmICsgb2Zmc2V0KTsKICBpZiAob2Zmc2V0ID09IHRvdGFsX2xl biB8fCBvZmZzZXQgKyBoZHItPm5sbXNnX2xlbiA+IHRvdGFsX2xlbikKICAgIHJldHVybiAtMTsK ICByZXR1cm4gaGRyLT5ubG1zZ19sZW47Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX2Rldmlj ZV9pbXBsKHN0cnVjdCBubG1zZyogbmxtc2csIGNvbnN0IGNoYXIqIHR5cGUsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpCnsKICBzdHJ1Y3QgaWZp bmZvbXNnIGhkcjsKICBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwogIG5ldGxpbmtfaW5p dChubG1zZywgUlRNX05FV0xJTkssIE5MTV9GX0VYQ0wgfCBOTE1fRl9DUkVBVEUsICZoZHIsCiAg ICAgICAgICAgICAgIHNpemVvZihoZHIpKTsKICBpZiAobmFtZSkKICAgIG5ldGxpbmtfYXR0cihu bG1zZywgSUZMQV9JRk5BTUUsIG5hbWUsIHN0cmxlbihuYW1lKSk7CiAgbmV0bGlua19uZXN0KG5s bXNnLCBJRkxBX0xJTktJTkZPKTsKICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfSU5GT19LSU5E LCB0eXBlLCBzdHJsZW4odHlwZSkpOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2FkZF9kZXZpY2Uo c3RydWN0IG5sbXNnKiBubG1zZywgaW50IHNvY2ssIGNvbnN0IGNoYXIqIHR5cGUsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKQp7CiAgbmV0bGlua19hZGRf ZGV2aWNlX2ltcGwobmxtc2csIHR5cGUsIG5hbWUpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAg aW50IGVyciA9IG5ldGxpbmtfc2VuZChubG1zZywgc29jayk7CiAgKHZvaWQpZXJyOwp9CgpzdGF0 aWMgdm9pZCBuZXRsaW5rX2FkZF92ZXRoKHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrLCBj b25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIq IHBlZXIpCnsKICBuZXRsaW5rX2FkZF9kZXZpY2VfaW1wbChubG1zZywgInZldGgiLCBuYW1lKTsK ICBuZXRsaW5rX25lc3Qobmxtc2csIElGTEFfSU5GT19EQVRBKTsKICBuZXRsaW5rX25lc3Qobmxt c2csIFZFVEhfSU5GT19QRUVSKTsKICBubG1zZy0+cG9zICs9IHNpemVvZihzdHJ1Y3QgaWZpbmZv bXNnKTsKICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfSUZOQU1FLCBwZWVyLCBzdHJsZW4ocGVl cikpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAgbmV0bGlua19kb25lKG5sbXNnKTsKICBuZXRs aW5rX2RvbmUobmxtc2cpOwogIGludCBlcnIgPSBuZXRsaW5rX3NlbmQobmxtc2csIHNvY2spOwog ICh2b2lkKWVycjsKfQoKc3RhdGljIHZvaWQgbmV0bGlua19hZGRfaHNyKHN0cnVjdCBubG1zZyog bmxtc2csIGludCBzb2NrLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgY2hhciogc2xhdmUxLCBjb25zdCBjaGFyKiBzbGF2ZTIpCnsKICBuZXRsaW5r X2FkZF9kZXZpY2VfaW1wbChubG1zZywgImhzciIsIG5hbWUpOwogIG5ldGxpbmtfbmVzdChubG1z ZywgSUZMQV9JTkZPX0RBVEEpOwogIGludCBpZmluZGV4MSA9IGlmX25hbWV0b2luZGV4KHNsYXZl MSk7CiAgbmV0bGlua19hdHRyKG5sbXNnLCBJRkxBX0hTUl9TTEFWRTEsICZpZmluZGV4MSwgc2l6 ZW9mKGlmaW5kZXgxKSk7CiAgaW50IGlmaW5kZXgyID0gaWZfbmFtZXRvaW5kZXgoc2xhdmUyKTsK ICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfSFNSX1NMQVZFMiwgJmlmaW5kZXgyLCBzaXplb2Yo aWZpbmRleDIpKTsKICBuZXRsaW5rX2RvbmUobmxtc2cpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7 CiAgaW50IGVyciA9IG5ldGxpbmtfc2VuZChubG1zZywgc29jayk7CiAgKHZvaWQpZXJyOwp9Cgpz dGF0aWMgdm9pZCBuZXRsaW5rX2FkZF9saW5rZWQoc3RydWN0IG5sbXNnKiBubG1zZywgaW50IHNv Y2ssIGNvbnN0IGNoYXIqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBsaW5rKQp7CiAgbmV0bGlua19hZGRfZGV2aWNlX2lt cGwobmxtc2csIHR5cGUsIG5hbWUpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAgaW50IGlmaW5k ZXggPSBpZl9uYW1ldG9pbmRleChsaW5rKTsKICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfTElO SywgJmlmaW5kZXgsIHNpemVvZihpZmluZGV4KSk7CiAgaW50IGVyciA9IG5ldGxpbmtfc2VuZChu bG1zZywgc29jayk7CiAgKHZvaWQpZXJyOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2FkZF92bGFu KHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpbmssIHVpbnQxNl90IGlkLCB1aW50 MTZfdCBwcm90bykKewogIG5ldGxpbmtfYWRkX2RldmljZV9pbXBsKG5sbXNnLCAidmxhbiIsIG5h bWUpOwogIG5ldGxpbmtfbmVzdChubG1zZywgSUZMQV9JTkZPX0RBVEEpOwogIG5ldGxpbmtfYXR0 cihubG1zZywgSUZMQV9WTEFOX0lELCAmaWQsIHNpemVvZihpZCkpOwogIG5ldGxpbmtfYXR0cihu bG1zZywgSUZMQV9WTEFOX1BST1RPQ09MLCAmcHJvdG8sIHNpemVvZihwcm90bykpOwogIG5ldGxp bmtfZG9uZShubG1zZyk7CiAgbmV0bGlua19kb25lKG5sbXNnKTsKICBpbnQgaWZpbmRleCA9IGlm X25hbWV0b2luZGV4KGxpbmspOwogIG5ldGxpbmtfYXR0cihubG1zZywgSUZMQV9MSU5LLCAmaWZp bmRleCwgc2l6ZW9mKGlmaW5kZXgpKTsKICBpbnQgZXJyID0gbmV0bGlua19zZW5kKG5sbXNnLCBz b2NrKTsKICAodm9pZCllcnI7Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX21hY3ZsYW4oc3Ry dWN0IG5sbXNnKiBubG1zZywgaW50IHNvY2ssIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGluaykKewogIG5ldGxpbmtfYWRkX2Rl dmljZV9pbXBsKG5sbXNnLCAibWFjdmxhbiIsIG5hbWUpOwogIG5ldGxpbmtfbmVzdChubG1zZywg SUZMQV9JTkZPX0RBVEEpOwogIHVpbnQzMl90IG1vZGUgPSBNQUNWTEFOX01PREVfQlJJREdFOwog IG5ldGxpbmtfYXR0cihubG1zZywgSUZMQV9NQUNWTEFOX01PREUsICZtb2RlLCBzaXplb2YobW9k ZSkpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAgbmV0bGlua19kb25lKG5sbXNnKTsKICBpbnQg aWZpbmRleCA9IGlmX25hbWV0b2luZGV4KGxpbmspOwogIG5ldGxpbmtfYXR0cihubG1zZywgSUZM QV9MSU5LLCAmaWZpbmRleCwgc2l6ZW9mKGlmaW5kZXgpKTsKICBpbnQgZXJyID0gbmV0bGlua19z ZW5kKG5sbXNnLCBzb2NrKTsKICAodm9pZCllcnI7Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfYWRk X2dlbmV2ZShzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgc29jaywgY29uc3QgY2hhciogbmFtZSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZuaSwgc3RydWN0IGluX2Fk ZHIqIGFkZHI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluNl9hZGRy KiBhZGRyNikKewogIG5ldGxpbmtfYWRkX2RldmljZV9pbXBsKG5sbXNnLCAiZ2VuZXZlIiwgbmFt ZSk7CiAgbmV0bGlua19uZXN0KG5sbXNnLCBJRkxBX0lORk9fREFUQSk7CiAgbmV0bGlua19hdHRy KG5sbXNnLCBJRkxBX0dFTkVWRV9JRCwgJnZuaSwgc2l6ZW9mKHZuaSkpOwogIGlmIChhZGRyNCkK ICAgIG5ldGxpbmtfYXR0cihubG1zZywgSUZMQV9HRU5FVkVfUkVNT1RFLCBhZGRyNCwgc2l6ZW9m KCphZGRyNCkpOwogIGlmIChhZGRyNikKICAgIG5ldGxpbmtfYXR0cihubG1zZywgSUZMQV9HRU5F VkVfUkVNT1RFNiwgYWRkcjYsIHNpemVvZigqYWRkcjYpKTsKICBuZXRsaW5rX2RvbmUobmxtc2cp OwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAgaW50IGVyciA9IG5ldGxpbmtfc2VuZChubG1zZywg c29jayk7CiAgKHZvaWQpZXJyOwp9CgojZGVmaW5lIElGTEFfSVBWTEFOX0ZMQUdTIDIKI2RlZmlu ZSBJUFZMQU5fTU9ERV9MM1MgMgojdW5kZWYgSVBWTEFOX0ZfVkVQQQojZGVmaW5lIElQVkxBTl9G X1ZFUEEgMgoKc3RhdGljIHZvaWQgbmV0bGlua19hZGRfaXB2bGFuKHN0cnVjdCBubG1zZyogbmxt c2csIGludCBzb2NrLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgY2hhciogbGluaywgdWludDE2X3QgbW9kZSwgdWludDE2X3QgZmxhZ3MpCnsK ICBuZXRsaW5rX2FkZF9kZXZpY2VfaW1wbChubG1zZywgImlwdmxhbiIsIG5hbWUpOwogIG5ldGxp bmtfbmVzdChubG1zZywgSUZMQV9JTkZPX0RBVEEpOwogIG5ldGxpbmtfYXR0cihubG1zZywgSUZM QV9JUFZMQU5fTU9ERSwgJm1vZGUsIHNpemVvZihtb2RlKSk7CiAgbmV0bGlua19hdHRyKG5sbXNn LCBJRkxBX0lQVkxBTl9GTEFHUywgJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKICBuZXRsaW5rX2Rv bmUobmxtc2cpOwogIG5ldGxpbmtfZG9uZShubG1zZyk7CiAgaW50IGlmaW5kZXggPSBpZl9uYW1l dG9pbmRleChsaW5rKTsKICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfTElOSywgJmlmaW5kZXgs IHNpemVvZihpZmluZGV4KSk7CiAgaW50IGVyciA9IG5ldGxpbmtfc2VuZChubG1zZywgc29jayk7 CiAgKHZvaWQpZXJyOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2RldmljZV9jaGFuZ2Uoc3RydWN0 IG5sbXNnKiBubG1zZywgaW50IHNvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBjaGFyKiBuYW1lLCBib29sIHVwLCBjb25zdCBjaGFyKiBtYXN0ZXIsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtYWMsIGludCBtYWNzaXplLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmV3X25hbWUpCnsK ICBzdHJ1Y3QgaWZpbmZvbXNnIGhkcjsKICBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwog IGlmICh1cCkKICAgIGhkci5pZmlfZmxhZ3MgPSBoZHIuaWZpX2NoYW5nZSA9IElGRl9VUDsKICBo ZHIuaWZpX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgobmFtZSk7CiAgbmV0bGlua19pbml0KG5sbXNn LCBSVE1fTkVXTElOSywgMCwgJmhkciwgc2l6ZW9mKGhkcikpOwogIGlmIChuZXdfbmFtZSkKICAg IG5ldGxpbmtfYXR0cihubG1zZywgSUZMQV9JRk5BTUUsIG5ld19uYW1lLCBzdHJsZW4obmV3X25h bWUpKTsKICBpZiAobWFzdGVyKSB7CiAgICBpbnQgaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KG1h c3Rlcik7CiAgICBuZXRsaW5rX2F0dHIobmxtc2csIElGTEFfTUFTVEVSLCAmaWZpbmRleCwgc2l6 ZW9mKGlmaW5kZXgpKTsKICB9CiAgaWYgKG1hY3NpemUpCiAgICBuZXRsaW5rX2F0dHIobmxtc2cs IElGTEFfQUREUkVTUywgbWFjLCBtYWNzaXplKTsKICBpbnQgZXJyID0gbmV0bGlua19zZW5kKG5s bXNnLCBzb2NrKTsKICAodm9pZCllcnI7Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19hZGRfYWRkcihz dHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgc29jaywgY29uc3QgY2hhciogZGV2LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYWRkciwgaW50IGFkZHJzaXplKQp7CiAgc3Ry dWN0IGlmYWRkcm1zZyBoZHI7CiAgbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKICBoZHIu aWZhX2ZhbWlseSA9IGFkZHJzaXplID09IDQgPyBBRl9JTkVUIDogQUZfSU5FVDY7CiAgaGRyLmlm YV9wcmVmaXhsZW4gPSBhZGRyc2l6ZSA9PSA0ID8gMjQgOiAxMjA7CiAgaGRyLmlmYV9zY29wZSA9 IFJUX1NDT1BFX1VOSVZFUlNFOwogIGhkci5pZmFfaW5kZXggPSBpZl9uYW1ldG9pbmRleChkZXYp OwogIG5ldGxpbmtfaW5pdChubG1zZywgUlRNX05FV0FERFIsIE5MTV9GX0NSRUFURSB8IE5MTV9G X1JFUExBQ0UsICZoZHIsCiAgICAgICAgICAgICAgIHNpemVvZihoZHIpKTsKICBuZXRsaW5rX2F0 dHIobmxtc2csIElGQV9MT0NBTCwgYWRkciwgYWRkcnNpemUpOwogIG5ldGxpbmtfYXR0cihubG1z ZywgSUZBX0FERFJFU1MsIGFkZHIsIGFkZHJzaXplKTsKICByZXR1cm4gbmV0bGlua19zZW5kKG5s bXNnLCBzb2NrKTsKfQoKc3RhdGljIHZvaWQgbmV0bGlua19hZGRfYWRkcjQoc3RydWN0IG5sbXNn KiBubG1zZywgaW50IHNvY2ssIGNvbnN0IGNoYXIqIGRldiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgY2hhciogYWRkcikKewogIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CiAg aW5ldF9wdG9uKEFGX0lORVQsIGFkZHIsICZpbl9hZGRyKTsKICBpbnQgZXJyID0gbmV0bGlua19h ZGRfYWRkcihubG1zZywgc29jaywgZGV2LCAmaW5fYWRkciwgc2l6ZW9mKGluX2FkZHIpKTsKICAo dm9pZCllcnI7Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX2FkZHI2KHN0cnVjdCBubG1zZyog bmxtc2csIGludCBzb2NrLCBjb25zdCBjaGFyKiBkZXYsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IGNoYXIqIGFkZHIpCnsKICBzdHJ1Y3QgaW42X2FkZHIgaW42X2FkZHI7CiAg aW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyLCAmaW42X2FkZHIpOwogIGludCBlcnIgPSBuZXRsaW5r X2FkZF9hZGRyKG5sbXNnLCBzb2NrLCBkZXYsICZpbjZfYWRkciwgc2l6ZW9mKGluNl9hZGRyKSk7 CiAgKHZvaWQpZXJyOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2FkZF9uZWlnaChzdHJ1Y3Qgbmxt c2cqIG5sbXNnLCBpbnQgc29jaywgY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3Qgdm9pZCogYWRkciwgaW50IGFkZHJzaXplLCBjb25zdCB2b2lkKiBt YWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYWNzaXplKQp7CiAgc3RydWN0 IG5kbXNnIGhkcjsKICBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwogIGhkci5uZG1fZmFt aWx5ID0gYWRkcnNpemUgPT0gNCA/IEFGX0lORVQgOiBBRl9JTkVUNjsKICBoZHIubmRtX2lmaW5k ZXggPSBpZl9uYW1ldG9pbmRleChuYW1lKTsKICBoZHIubmRtX3N0YXRlID0gTlVEX1BFUk1BTkVO VDsKICBuZXRsaW5rX2luaXQobmxtc2csIFJUTV9ORVdORUlHSCwgTkxNX0ZfRVhDTCB8IE5MTV9G X0NSRUFURSwgJmhkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGhkcikpOwogIG5ldGxpbmtfYXR0 cihubG1zZywgTkRBX0RTVCwgYWRkciwgYWRkcnNpemUpOwogIG5ldGxpbmtfYXR0cihubG1zZywg TkRBX0xMQUREUiwgbWFjLCBtYWNzaXplKTsKICBpbnQgZXJyID0gbmV0bGlua19zZW5kKG5sbXNn LCBzb2NrKTsKICAodm9pZCllcnI7Cn0KCnN0YXRpYyBpbnQgdHVuZmQgPSAtMTsKc3RhdGljIGlu dCB0dW5fZnJhZ3NfZW5hYmxlZDsKCiNkZWZpbmUgVFVOX0lGQUNFICJzeXpfdHVuIgoKI2RlZmlu ZSBMT0NBTF9NQUMgMHhhYWFhYWFhYWFhYWEKI2RlZmluZSBSRU1PVEVfTUFDIDB4YWFhYWFhYWFh YWJiCgojZGVmaW5lIExPQ0FMX0lQVjQgIjE3Mi4yMC4yMC4xNzAiCiNkZWZpbmUgUkVNT1RFX0lQ VjQgIjE3Mi4yMC4yMC4xODciCgojZGVmaW5lIExPQ0FMX0lQVjYgImZlODA6OmFhIgojZGVmaW5l IFJFTU9URV9JUFY2ICJmZTgwOjpiYiIKCiNkZWZpbmUgSUZGX05BUEkgMHgwMDEwCiNkZWZpbmUg SUZGX05BUElfRlJBR1MgMHgwMDIwCgpzdGF0aWMgdm9pZCBpbml0aWFsaXplX3R1bih2b2lkKQp7 CiAgdHVuZmQgPSBvcGVuKCIvZGV2L25ldC90dW4iLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKICBp ZiAodHVuZmQgPT0gLTEpIHsKICAgIHByaW50ZigidHVuOiBjYW4ndCBvcGVuIC9kZXYvbmV0L3R1 bjogcGxlYXNlIGVuYWJsZSBDT05GSUdfVFVOPXlcbiIpOwogICAgcHJpbnRmKCJvdGhlcndpc2Ug ZnV6emluZyBvciByZXByb2R1Y2luZyBtaWdodCBub3Qgd29yayBhcyBpbnRlbmRlZFxuIik7CiAg ICByZXR1cm47CiAgfQogIGNvbnN0IGludCBrVHVuRmQgPSAyNDA7CiAgaWYgKGR1cDIodHVuZmQs IGtUdW5GZCkgPCAwKQogICAgZXhpdCgxKTsKICBjbG9zZSh0dW5mZCk7CiAgdHVuZmQgPSBrVHVu RmQ7CiAgc3RydWN0IGlmcmVxIGlmcjsKICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwog IHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBUVU5fSUZBQ0UsIElGTkFNU0laKTsKICBpZnIuaWZyX2Zs YWdzID0gSUZGX1RBUCB8IElGRl9OT19QSTsKICBpZiAoaW9jdGwodHVuZmQsIFRVTlNFVElGRiwg KHZvaWQqKSZpZnIpIDwgMCkgewogICAgZXhpdCgxKTsKICB9CiAgY2hhciBzeXNjdGxbNjRdOwog IHNwcmludGYoc3lzY3RsLCAiL3Byb2Mvc3lzL25ldC9pcHY2L2NvbmYvJXMvYWNjZXB0X2RhZCIs IFRVTl9JRkFDRSk7CiAgd3JpdGVfZmlsZShzeXNjdGwsICIwIik7CiAgc3ByaW50ZihzeXNjdGws ICIvcHJvYy9zeXMvbmV0L2lwdjYvY29uZi8lcy9yb3V0ZXJfc29saWNpdGF0aW9ucyIsIFRVTl9J RkFDRSk7CiAgd3JpdGVfZmlsZShzeXNjdGwsICIwIik7CiAgc3ByaW50ZihzeXNjdGwsICIvcHJv Yy9zeXMvbmV0L21wdGNwL3BtL2Fubm91bmNlX2FkZHIiKTsKICB3cml0ZV9maWxlKHN5c2N0bCwg TE9DQUxfSVBWNCk7CiAgaW50IHNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5F VExJTktfUk9VVEUpOwogIGlmIChzb2NrID09IC0xKQogICAgZXhpdCgxKTsKICBuZXRsaW5rX2Fk ZF9hZGRyNCgmbmxtc2csIHNvY2ssIFRVTl9JRkFDRSwgTE9DQUxfSVBWNCk7CiAgbmV0bGlua19h ZGRfYWRkcjYoJm5sbXNnLCBzb2NrLCBUVU5fSUZBQ0UsIExPQ0FMX0lQVjYpOwogIHVpbnQ2NF90 IG1hY2FkZHIgPSBSRU1PVEVfTUFDOwogIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CiAgaW5ldF9w dG9uKEFGX0lORVQsIFJFTU9URV9JUFY0LCAmaW5fYWRkcik7CiAgbmV0bGlua19hZGRfbmVpZ2go Jm5sbXNnLCBzb2NrLCBUVU5fSUZBQ0UsICZpbl9hZGRyLCBzaXplb2YoaW5fYWRkciksCiAgICAg ICAgICAgICAgICAgICAgJm1hY2FkZHIsIEVUSF9BTEVOKTsKICBzdHJ1Y3QgaW42X2FkZHIgaW42 X2FkZHI7CiAgaW5ldF9wdG9uKEFGX0lORVQ2LCBSRU1PVEVfSVBWNiwgJmluNl9hZGRyKTsKICBu ZXRsaW5rX2FkZF9uZWlnaCgmbmxtc2csIHNvY2ssIFRVTl9JRkFDRSwgJmluNl9hZGRyLCBzaXpl b2YoaW42X2FkZHIpLAogICAgICAgICAgICAgICAgICAgICZtYWNhZGRyLCBFVEhfQUxFTik7CiAg bWFjYWRkciA9IExPQ0FMX01BQzsKICBuZXRsaW5rX2RldmljZV9jaGFuZ2UoJm5sbXNnLCBzb2Nr LCBUVU5fSUZBQ0UsIHRydWUsIDAsICZtYWNhZGRyLCBFVEhfQUxFTiwKICAgICAgICAgICAgICAg ICAgICAgICAgTlVMTCk7CiAgY2xvc2Uoc29jayk7Cn0KCiNkZWZpbmUgREVWTElOS19GQU1JTFlf TkFNRSAiZGV2bGluayIKCiNkZWZpbmUgREVWTElOS19DTURfUE9SVF9HRVQgNQojZGVmaW5lIERF VkxJTktfQVRUUl9CVVNfTkFNRSAxCiNkZWZpbmUgREVWTElOS19BVFRSX0RFVl9OQU1FIDIKI2Rl ZmluZSBERVZMSU5LX0FUVFJfTkVUREVWX05BTUUgNwoKc3RhdGljIGludCBuZXRsaW5rX2Rldmxp bmtfaWRfZ2V0KHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrKQp7CiAgc3RydWN0IGdlbmxt c2doZHIgZ2VubGhkcjsKICBzdHJ1Y3QgbmxhdHRyKiBhdHRyOwogIGludCBlcnIsIG47CiAgdWlu dDE2X3QgaWQgPSAwOwogIG1lbXNldCgmZ2VubGhkciwgMCwgc2l6ZW9mKGdlbmxoZHIpKTsKICBn ZW5saGRyLmNtZCA9IENUUkxfQ01EX0dFVEZBTUlMWTsKICBuZXRsaW5rX2luaXQobmxtc2csIEdF TkxfSURfQ1RSTCwgMCwgJmdlbmxoZHIsIHNpemVvZihnZW5saGRyKSk7CiAgbmV0bGlua19hdHRy KG5sbXNnLCBDVFJMX0FUVFJfRkFNSUxZX05BTUUsIERFVkxJTktfRkFNSUxZX05BTUUsCiAgICAg ICAgICAgICAgIHN0cmxlbihERVZMSU5LX0ZBTUlMWV9OQU1FKSArIDEpOwogIGVyciA9IG5ldGxp bmtfc2VuZF9leHQobmxtc2csIHNvY2ssIEdFTkxfSURfQ1RSTCwgJm4pOwogIGlmIChlcnIpIHsK ICAgIHJldHVybiAtMTsKICB9CiAgYXR0ciA9IChzdHJ1Y3QgbmxhdHRyKikobmxtc2ctPmJ1ZiAr IE5MTVNHX0hEUkxFTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgTkxNU0dfQUxJR04oc2l6 ZW9mKGdlbmxoZHIpKSk7CiAgZm9yICg7IChjaGFyKilhdHRyIDwgbmxtc2ctPmJ1ZiArIG47CiAg ICAgICBhdHRyID0gKHN0cnVjdCBubGF0dHIqKSgoY2hhciopYXR0ciArIE5MTVNHX0FMSUdOKGF0 dHItPm5sYV9sZW4pKSkgewogICAgaWYgKGF0dHItPm5sYV90eXBlID09IENUUkxfQVRUUl9GQU1J TFlfSUQpIHsKICAgICAgaWQgPSAqKHVpbnQxNl90KikoYXR0ciArIDEpOwogICAgICBicmVhazsK ICAgIH0KICB9CiAgaWYgKCFpZCkgewogICAgcmV0dXJuIC0xOwogIH0KICByZWN2KHNvY2ssIG5s bXNnLT5idWYsIHNpemVvZihubG1zZy0+YnVmKSwgMCk7IC8qIHJlY3YgYWNrICovCiAgcmV0dXJu IGlkOwp9CgpzdGF0aWMgc3RydWN0IG5sbXNnIG5sbXNnMjsKCnN0YXRpYyB2b2lkIGluaXRpYWxp emVfZGV2bGlua19wb3J0cyhjb25zdCBjaGFyKiBidXNfbmFtZSwgY29uc3QgY2hhciogZGV2X25h bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuZXRk ZXZfcHJlZml4KQp7CiAgc3RydWN0IGdlbmxtc2doZHIgZ2VubGhkcjsKICBpbnQgbGVuLCB0b3Rh bF9sZW4sIGlkLCBlcnIsIG9mZnNldDsKICB1aW50MTZfdCBuZXRkZXZfaW5kZXg7CiAgaW50IHNv Y2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfR0VORVJJQyk7CiAgaWYg KHNvY2sgPT0gLTEpCiAgICBleGl0KDEpOwogIGludCBydHNvY2sgPSBzb2NrZXQoQUZfTkVUTElO SywgU09DS19SQVcsIE5FVExJTktfUk9VVEUpOwogIGlmIChydHNvY2sgPT0gLTEpCiAgICBleGl0 KDEpOwogIGlkID0gbmV0bGlua19kZXZsaW5rX2lkX2dldCgmbmxtc2csIHNvY2spOwogIGlmIChp ZCA9PSAtMSkKICAgIGdvdG8gZXJyb3I7CiAgbWVtc2V0KCZnZW5saGRyLCAwLCBzaXplb2YoZ2Vu bGhkcikpOwogIGdlbmxoZHIuY21kID0gREVWTElOS19DTURfUE9SVF9HRVQ7CiAgbmV0bGlua19p bml0KCZubG1zZywgaWQsIE5MTV9GX0RVTVAsICZnZW5saGRyLCBzaXplb2YoZ2VubGhkcikpOwog IG5ldGxpbmtfYXR0cigmbmxtc2csIERFVkxJTktfQVRUUl9CVVNfTkFNRSwgYnVzX25hbWUsIHN0 cmxlbihidXNfbmFtZSkgKyAxKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBERVZMSU5LX0FUVFJf REVWX05BTUUsIGRldl9uYW1lLCBzdHJsZW4oZGV2X25hbWUpICsgMSk7CiAgZXJyID0gbmV0bGlu a19zZW5kX2V4dCgmbmxtc2csIHNvY2ssIGlkLCAmdG90YWxfbGVuKTsKICBpZiAoZXJyKSB7CiAg ICBnb3RvIGVycm9yOwogIH0KICBvZmZzZXQgPSAwOwogIG5ldGRldl9pbmRleCA9IDA7CiAgd2hp bGUgKChsZW4gPSBuZXRsaW5rX25leHRfbXNnKCZubG1zZywgb2Zmc2V0LCB0b3RhbF9sZW4pKSAh PSAtMSkgewogICAgc3RydWN0IG5sYXR0ciogYXR0ciA9IChzdHJ1Y3QgbmxhdHRyKikobmxtc2cu YnVmICsgb2Zmc2V0ICsgTkxNU0dfSERSTEVOICsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE5MTVNHX0FMSUdOKHNpemVvZihnZW5saGRyKSkpOwogICAgZm9yICg7 IChjaGFyKilhdHRyIDwgbmxtc2cuYnVmICsgb2Zmc2V0ICsgbGVuOwogICAgICAgICBhdHRyID0g KHN0cnVjdCBubGF0dHIqKSgoY2hhciopYXR0ciArIE5MTVNHX0FMSUdOKGF0dHItPm5sYV9sZW4p KSkgewogICAgICBpZiAoYXR0ci0+bmxhX3R5cGUgPT0gREVWTElOS19BVFRSX05FVERFVl9OQU1F KSB7CiAgICAgICAgY2hhciogcG9ydF9uYW1lOwogICAgICAgIGNoYXIgbmV0ZGV2X25hbWVbSUZO QU1TSVpdOwogICAgICAgIHBvcnRfbmFtZSA9IChjaGFyKikoYXR0ciArIDEpOwogICAgICAgIHNu cHJpbnRmKG5ldGRldl9uYW1lLCBzaXplb2YobmV0ZGV2X25hbWUpLCAiJXMlZCIsIG5ldGRldl9w cmVmaXgsCiAgICAgICAgICAgICAgICAgbmV0ZGV2X2luZGV4KTsKICAgICAgICBuZXRsaW5rX2Rl dmljZV9jaGFuZ2UoJm5sbXNnMiwgcnRzb2NrLCBwb3J0X25hbWUsIHRydWUsIDAsIDAsIDAsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGRldl9uYW1lKTsKICAgICAgICBicmVhazsK ICAgICAgfQogICAgfQogICAgb2Zmc2V0ICs9IGxlbjsKICAgIG5ldGRldl9pbmRleCsrOwogIH0K ZXJyb3I6CiAgY2xvc2UocnRzb2NrKTsKICBjbG9zZShzb2NrKTsKfQoKI2RlZmluZSBERVZfSVBW NCAiMTcyLjIwLjIwLiVkIgojZGVmaW5lIERFVl9JUFY2ICJmZTgwOjolMDJ4IgojZGVmaW5lIERF Vl9NQUMgMHgwMGFhYWFhYWFhYWEKCnN0YXRpYyB2b2lkIG5ldGRldnNpbV9hZGQodW5zaWduZWQg aW50IGFkZHIsIHVuc2lnbmVkIGludCBwb3J0X2NvdW50KQp7CiAgY2hhciBidWZbMTZdOwogIHNw cmludGYoYnVmLCAiJXUgJXUiLCBhZGRyLCBwb3J0X2NvdW50KTsKICBpZiAod3JpdGVfZmlsZSgi L3N5cy9idXMvbmV0ZGV2c2ltL25ld19kZXZpY2UiLCBidWYpKSB7CiAgICBzbnByaW50ZihidWYs IHNpemVvZihidWYpLCAibmV0ZGV2c2ltJWQiLCBhZGRyKTsKICAgIGluaXRpYWxpemVfZGV2bGlu a19wb3J0cygibmV0ZGV2c2ltIiwgYnVmLCAibmV0ZGV2c2ltIik7CiAgfQp9CgojZGVmaW5lIFdH X0dFTkxfTkFNRSAid2lyZWd1YXJkIgplbnVtIHdnX2NtZCB7CiAgV0dfQ01EX0dFVF9ERVZJQ0Us CiAgV0dfQ01EX1NFVF9ERVZJQ0UsCn07CmVudW0gd2dkZXZpY2VfYXR0cmlidXRlIHsKICBXR0RF VklDRV9BX1VOU1BFQywKICBXR0RFVklDRV9BX0lGSU5ERVgsCiAgV0dERVZJQ0VfQV9JRk5BTUUs CiAgV0dERVZJQ0VfQV9QUklWQVRFX0tFWSwKICBXR0RFVklDRV9BX1BVQkxJQ19LRVksCiAgV0dE RVZJQ0VfQV9GTEFHUywKICBXR0RFVklDRV9BX0xJU1RFTl9QT1JULAogIFdHREVWSUNFX0FfRldN QVJLLAogIFdHREVWSUNFX0FfUEVFUlMsCn07CmVudW0gd2dwZWVyX2F0dHJpYnV0ZSB7CiAgV0dQ RUVSX0FfVU5TUEVDLAogIFdHUEVFUl9BX1BVQkxJQ19LRVksCiAgV0dQRUVSX0FfUFJFU0hBUkVE X0tFWSwKICBXR1BFRVJfQV9GTEFHUywKICBXR1BFRVJfQV9FTkRQT0lOVCwKICBXR1BFRVJfQV9Q RVJTSVNURU5UX0tFRVBBTElWRV9JTlRFUlZBTCwKICBXR1BFRVJfQV9MQVNUX0hBTkRTSEFLRV9U SU1FLAogIFdHUEVFUl9BX1JYX0JZVEVTLAogIFdHUEVFUl9BX1RYX0JZVEVTLAogIFdHUEVFUl9B X0FMTE9XRURJUFMsCiAgV0dQRUVSX0FfUFJPVE9DT0xfVkVSU0lPTiwKfTsKZW51bSB3Z2FsbG93 ZWRpcF9hdHRyaWJ1dGUgewogIFdHQUxMT1dFRElQX0FfVU5TUEVDLAogIFdHQUxMT1dFRElQX0Ff RkFNSUxZLAogIFdHQUxMT1dFRElQX0FfSVBBRERSLAogIFdHQUxMT1dFRElQX0FfQ0lEUl9NQVNL LAp9OwoKc3RhdGljIGludCBuZXRsaW5rX3dpcmVndWFyZF9pZF9nZXQoc3RydWN0IG5sbXNnKiBu bG1zZywgaW50IHNvY2spCnsKICBzdHJ1Y3QgZ2VubG1zZ2hkciBnZW5saGRyOwogIHN0cnVjdCBu bGF0dHIqIGF0dHI7CiAgaW50IGVyciwgbjsKICB1aW50MTZfdCBpZCA9IDA7CiAgbWVtc2V0KCZn ZW5saGRyLCAwLCBzaXplb2YoZ2VubGhkcikpOwogIGdlbmxoZHIuY21kID0gQ1RSTF9DTURfR0VU RkFNSUxZOwogIG5ldGxpbmtfaW5pdChubG1zZywgR0VOTF9JRF9DVFJMLCAwLCAmZ2VubGhkciwg c2l6ZW9mKGdlbmxoZHIpKTsKICBuZXRsaW5rX2F0dHIobmxtc2csIENUUkxfQVRUUl9GQU1JTFlf TkFNRSwgV0dfR0VOTF9OQU1FLAogICAgICAgICAgICAgICBzdHJsZW4oV0dfR0VOTF9OQU1FKSAr IDEpOwogIGVyciA9IG5ldGxpbmtfc2VuZF9leHQobmxtc2csIHNvY2ssIEdFTkxfSURfQ1RSTCwg Jm4pOwogIGlmIChlcnIpIHsKICAgIHJldHVybiAtMTsKICB9CiAgYXR0ciA9IChzdHJ1Y3Qgbmxh dHRyKikobmxtc2ctPmJ1ZiArIE5MTVNHX0hEUkxFTiArCiAgICAgICAgICAgICAgICAgICAgICAg ICAgTkxNU0dfQUxJR04oc2l6ZW9mKGdlbmxoZHIpKSk7CiAgZm9yICg7IChjaGFyKilhdHRyIDwg bmxtc2ctPmJ1ZiArIG47CiAgICAgICBhdHRyID0gKHN0cnVjdCBubGF0dHIqKSgoY2hhciopYXR0 ciArIE5MTVNHX0FMSUdOKGF0dHItPm5sYV9sZW4pKSkgewogICAgaWYgKGF0dHItPm5sYV90eXBl ID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKICAgICAgaWQgPSAqKHVpbnQxNl90KikoYXR0ciAr IDEpOwogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKCFpZCkgewogICAgcmV0dXJuIC0xOwog IH0KICByZWN2KHNvY2ssIG5sbXNnLT5idWYsIHNpemVvZihubG1zZy0+YnVmKSwgMCk7IC8qIHJl Y3YgYWNrICovCiAgcmV0dXJuIGlkOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX3dpcmVndWFyZF9z ZXR1cCh2b2lkKQp7CiAgY29uc3QgY2hhciBpZm5hbWVfYVtdID0gIndnMCI7CiAgY29uc3QgY2hh ciBpZm5hbWVfYltdID0gIndnMSI7CiAgY29uc3QgY2hhciBpZm5hbWVfY1tdID0gIndnMiI7CiAg Y29uc3QgY2hhciBwcml2YXRlX2FbXSA9ICJceGEwXHg1Y1x4YThceDRmXHg2Y1x4OWNceDhlXHgz OFx4NTNceGUyXHhmZFx4N2EiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDcwXHhhZVx4 MGZceGIyXHgwZlx4YTFceDUyXHg2MFx4MGNceGIwXHgwOFx4NDUiCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICJceDE3XHg0Zlx4MDhceDA3XHg2Zlx4OGRceDc4XHg0MyI7CiAgY29uc3QgY2hh ciBwcml2YXRlX2JbXSA9ICJceGIwXHg4MFx4NzNceGU4XHhkNFx4NGVceDkxXHhlM1x4ZGFceDky XHgyY1x4MjIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDQzXHg4Mlx4NDRceGJiXHg4 OFx4NWNceDY5XHhlMlx4NjlceGM4XHhlOVx4ZDgiCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICJceDM1XHhiMVx4MTRceDI5XHgzYVx4NGRceGRjXHg2ZSI7CiAgY29uc3QgY2hhciBwcml2YXRl X2NbXSA9ICJceGEwXHhjYlx4ODdceDlhXHg0N1x4ZjVceGJjXHg2NFx4NGNceDBlXHg2OVx4M2Yi CiAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGE2XHhkMFx4MzFceGM3XHg0YVx4MTVceDUz XHhiNlx4ZTlceDAxXHhiOVx4ZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDJmXHg1 MVx4OGNceDc4XHgwNFx4MmZceGI1XHg0MiI7CiAgY29uc3QgY2hhciBwdWJsaWNfYVtdID0gIlx4 OTdceDVjXHg5ZFx4ODFceGM5XHg4M1x4YzhceDIwXHg5ZVx4ZTdceDgxXHgyNVx4NGIiCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIlx4ODlceDlmXHg4ZVx4ZDlceDI1XHhhZVx4OWZceDA5XHgy M1x4YzJceDNjXHg2Mlx4ZjUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4M2NceDU3XHhj ZFx4YmZceDY5XHgxYyI7CiAgY29uc3QgY2hhciBwdWJsaWNfYltdID0gIlx4ZDFceDczXHgyOFx4 OTlceGY2XHgxMVx4Y2RceDg5XHg5NFx4MDNceDRkXHg3Zlx4NDEiCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIlx4M2RceGM5XHg1N1x4NjNceDBlXHg1NFx4OTNceGMyXHg4NVx4YWNceGE0XHgw MFx4NjUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2JceDYzXHgxMVx4YmVceDY5XHg2 YiI7CiAgY29uc3QgY2hhciBwdWJsaWNfY1tdID0gIlx4ZjRceDRkXHhhM1x4NjdceGE4XHg4ZVx4 ZTZceDU2XHg0Zlx4MDJceDAyXHgxMVx4NDUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4 NjdceDI3XHgwOFx4MmZceDVjXHhlYlx4ZWVceDhiXHgxYlx4ZjVceGViXHg3M1x4MzciCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIlx4MzRceDFiXHg0NVx4OWJceDM5XHgyMiI7CiAgY29uc3Qg dWludDE2X3QgbGlzdGVuX2EgPSAyMDAwMTsKICBjb25zdCB1aW50MTZfdCBsaXN0ZW5fYiA9IDIw MDAyOwogIGNvbnN0IHVpbnQxNl90IGxpc3Rlbl9jID0gMjAwMDM7CiAgY29uc3QgdWludDE2X3Qg YWZfaW5ldCA9IEFGX0lORVQ7CiAgY29uc3QgdWludDE2X3QgYWZfaW5ldDYgPSBBRl9JTkVUNjsK ICAvKiBVbnVzZWQsIGJ1dCB1c2VmdWwgaW4gY2FzZSB3ZSBjaGFuZ2UgdGhpczoKICBjb25zdCBz dHJ1Y3Qgc29ja2FkZHJfaW4gZW5kcG9pbnRfYV92NCA9IHsKICAgICAgLnNpbl9mYW1pbHkgPSBB Rl9JTkVULAogICAgICAuc2luX3BvcnQgPSBodG9ucyhsaXN0ZW5fYSksCiAgICAgIC5zaW5fYWRk ciA9IHtodG9ubChJTkFERFJfTE9PUEJBQ0spfX07Ki8KICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJf aW4gZW5kcG9pbnRfYl92NCA9IHsKICAgICAgLnNpbl9mYW1pbHkgPSBBRl9JTkVULAogICAgICAu c2luX3BvcnQgPSBodG9ucyhsaXN0ZW5fYiksCiAgICAgIC5zaW5fYWRkciA9IHtodG9ubChJTkFE RFJfTE9PUEJBQ0spfX07CiAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luIGVuZHBvaW50X2NfdjQg PSB7CiAgICAgIC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKICAgICAgLnNpbl9wb3J0ID0gaHRvbnMo bGlzdGVuX2MpLAogICAgICAuc2luX2FkZHIgPSB7aHRvbmwoSU5BRERSX0xPT1BCQUNLKX19Owog IHN0cnVjdCBzb2NrYWRkcl9pbjYgZW5kcG9pbnRfYV92NiA9IHsuc2luNl9mYW1pbHkgPSBBRl9J TkVUNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpbjZfcG9ydCA9 IGh0b25zKGxpc3Rlbl9hKX07CiAgZW5kcG9pbnRfYV92Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xv b3BiYWNrOwogIC8qIFVudXNlZCwgYnV0IHVzZWZ1bCBpbiBjYXNlIHdlIGNoYW5nZSB0aGlzOgog IGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgZW5kcG9pbnRfYl92NiA9IHsKICAgICAgLnNpbjZf ZmFtaWx5ID0gQUZfSU5FVDYsCiAgICAgIC5zaW42X3BvcnQgPSBodG9ucyhsaXN0ZW5fYil9Owog IGVuZHBvaW50X2JfdjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsgKi8KICBzdHJ1Y3Qg c29ja2FkZHJfaW42IGVuZHBvaW50X2NfdjYgPSB7LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaW42X3BvcnQgPSBodG9ucyhs aXN0ZW5fYyl9OwogIGVuZHBvaW50X2NfdjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsK ICBjb25zdCBzdHJ1Y3QgaW5fYWRkciBmaXJzdF9oYWxmX3Y0ID0gezB9OwogIGNvbnN0IHN0cnVj dCBpbl9hZGRyIHNlY29uZF9oYWxmX3Y0ID0ge2h0b25sKDEyOCA8PCAyNCl9OwogIGNvbnN0IHN0 cnVjdCBpbjZfYWRkciBmaXJzdF9oYWxmX3Y2ID0ge3t7MH19fTsKICBjb25zdCBzdHJ1Y3QgaW42 X2FkZHIgc2Vjb25kX2hhbGZfdjYgPSB7e3sweDgwfX19OwogIGNvbnN0IHVpbnQ4X3QgaGFsZl9j aWRyID0gMTsKICBjb25zdCB1aW50MTZfdCBwZXJzaXN0ZW50X2tlZXBhbGl2ZXNbXSA9IHsxLCAz LCA3LCA5LCAxNCwgMTl9OwogIHN0cnVjdCBnZW5sbXNnaGRyIGdlbmxoZHIgPSB7LmNtZCA9IFdH X0NNRF9TRVRfREVWSUNFLCAudmVyc2lvbiA9IDF9OwogIGludCBzb2NrOwogIGludCBpZCwgZXJy OwogIHNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfR0VORVJJQyk7 CiAgaWYgKHNvY2sgPT0gLTEpIHsKICAgIHJldHVybjsKICB9CiAgaWQgPSBuZXRsaW5rX3dpcmVn dWFyZF9pZF9nZXQoJm5sbXNnLCBzb2NrKTsKICBpZiAoaWQgPT0gLTEpCiAgICBnb3RvIGVycm9y OwogIG5ldGxpbmtfaW5pdCgmbmxtc2csIGlkLCAwLCAmZ2VubGhkciwgc2l6ZW9mKGdlbmxoZHIp KTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0RFVklDRV9BX0lGTkFNRSwgaWZuYW1lX2EsIHN0 cmxlbihpZm5hbWVfYSkgKyAxKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0RFVklDRV9BX1BS SVZBVEVfS0VZLCBwcml2YXRlX2EsIDMyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0RFVklD RV9BX0xJU1RFTl9QT1JULCAmbGlzdGVuX2EsIDIpOwogIG5ldGxpbmtfbmVzdCgmbmxtc2csIE5M QV9GX05FU1RFRCB8IFdHREVWSUNFX0FfUEVFUlMpOwogIG5ldGxpbmtfbmVzdCgmbmxtc2csIE5M QV9GX05FU1RFRCB8IDApOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHUEVFUl9BX1BVQkxJQ19L RVksIHB1YmxpY19iLCAzMik7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dQRUVSX0FfRU5EUE9J TlQsICZlbmRwb2ludF9iX3Y0LAogICAgICAgICAgICAgICBzaXplb2YoZW5kcG9pbnRfYl92NCkp OwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHUEVFUl9BX1BFUlNJU1RFTlRfS0VFUEFMSVZFX0lO VEVSVkFMLAogICAgICAgICAgICAgICAmcGVyc2lzdGVudF9rZWVwYWxpdmVzWzBdLCAyKTsKICBu ZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCBXR1BFRVJfQV9BTExPV0VESVBTKTsK ICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCAwKTsKICBuZXRsaW5rX2F0dHIo Jm5sbXNnLCBXR0FMTE9XRURJUF9BX0ZBTUlMWSwgJmFmX2luZXQsIDIpOwogIG5ldGxpbmtfYXR0 cigmbmxtc2csIFdHQUxMT1dFRElQX0FfSVBBRERSLCAmZmlyc3RfaGFsZl92NCwKICAgICAgICAg ICAgICAgc2l6ZW9mKGZpcnN0X2hhbGZfdjQpKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FM TE9XRURJUF9BX0NJRFJfTUFTSywgJmhhbGZfY2lkciwgMSk7CiAgbmV0bGlua19kb25lKCZubG1z Zyk7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxBX0ZfTkVTVEVEIHwgMCk7CiAgbmV0bGlua19h dHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9GQU1JTFksICZhZl9pbmV0NiwgMik7CiAgbmV0bGlu a19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9JUEFERFIsICZmaXJzdF9oYWxmX3Y2LAogICAg ICAgICAgICAgICBzaXplb2YoZmlyc3RfaGFsZl92NikpOwogIG5ldGxpbmtfYXR0cigmbmxtc2cs IFdHQUxMT1dFRElQX0FfQ0lEUl9NQVNLLCAmaGFsZl9jaWRyLCAxKTsKICBuZXRsaW5rX2RvbmUo Jm5sbXNnKTsKICBuZXRsaW5rX2RvbmUoJm5sbXNnKTsKICBuZXRsaW5rX2RvbmUoJm5sbXNnKTsK ICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCAwKTsKICBuZXRsaW5rX2F0dHIo Jm5sbXNnLCBXR1BFRVJfQV9QVUJMSUNfS0VZLCBwdWJsaWNfYywgMzIpOwogIG5ldGxpbmtfYXR0 cigmbmxtc2csIFdHUEVFUl9BX0VORFBPSU5ULCAmZW5kcG9pbnRfY192NiwKICAgICAgICAgICAg ICAgc2l6ZW9mKGVuZHBvaW50X2NfdjYpKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR1BFRVJf QV9QRVJTSVNURU5UX0tFRVBBTElWRV9JTlRFUlZBTCwKICAgICAgICAgICAgICAgJnBlcnNpc3Rl bnRfa2VlcGFsaXZlc1sxXSwgMik7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxBX0ZfTkVTVEVE IHwgV0dQRUVSX0FfQUxMT1dFRElQUyk7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxBX0ZfTkVT VEVEIHwgMCk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9GQU1JTFksICZh Zl9pbmV0LCAyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0lQQUREUiwg JnNlY29uZF9oYWxmX3Y0LAogICAgICAgICAgICAgICBzaXplb2Yoc2Vjb25kX2hhbGZfdjQpKTsK ICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0NJRFJfTUFTSywgJmhhbGZfY2lk ciwgMSk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxB X0ZfTkVTVEVEIHwgMCk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9GQU1J TFksICZhZl9pbmV0NiwgMik7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9J UEFERFIsICZzZWNvbmRfaGFsZl92NiwKICAgICAgICAgICAgICAgc2l6ZW9mKHNlY29uZF9oYWxm X3Y2KSk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9DSURSX01BU0ssICZo YWxmX2NpZHIsIDEpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIG5ldGxpbmtfZG9uZSgmbmxt c2cpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIGVy ciA9IG5ldGxpbmtfc2VuZCgmbmxtc2csIHNvY2spOwogIGlmIChlcnIpIHsKICB9CiAgbmV0bGlu a19pbml0KCZubG1zZywgaWQsIDAsICZnZW5saGRyLCBzaXplb2YoZ2VubGhkcikpOwogIG5ldGxp bmtfYXR0cigmbmxtc2csIFdHREVWSUNFX0FfSUZOQU1FLCBpZm5hbWVfYiwgc3RybGVuKGlmbmFt ZV9iKSArIDEpOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHREVWSUNFX0FfUFJJVkFURV9LRVks IHByaXZhdGVfYiwgMzIpOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHREVWSUNFX0FfTElTVEVO X1BPUlQsICZsaXN0ZW5fYiwgMik7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxBX0ZfTkVTVEVE IHwgV0dERVZJQ0VfQV9QRUVSUyk7CiAgbmV0bGlua19uZXN0KCZubG1zZywgTkxBX0ZfTkVTVEVE IHwgMCk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dQRUVSX0FfUFVCTElDX0tFWSwgcHVibGlj X2EsIDMyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR1BFRVJfQV9FTkRQT0lOVCwgJmVuZHBv aW50X2FfdjYsCiAgICAgICAgICAgICAgIHNpemVvZihlbmRwb2ludF9hX3Y2KSk7CiAgbmV0bGlu a19hdHRyKCZubG1zZywgV0dQRUVSX0FfUEVSU0lTVEVOVF9LRUVQQUxJVkVfSU5URVJWQUwsCiAg ICAgICAgICAgICAgICZwZXJzaXN0ZW50X2tlZXBhbGl2ZXNbMl0sIDIpOwogIG5ldGxpbmtfbmVz dCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IFdHUEVFUl9BX0FMTE9XRURJUFMpOwogIG5ldGxpbmtf bmVzdCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IDApOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdH QUxMT1dFRElQX0FfRkFNSUxZLCAmYWZfaW5ldCwgMik7CiAgbmV0bGlua19hdHRyKCZubG1zZywg V0dBTExPV0VESVBfQV9JUEFERFIsICZmaXJzdF9oYWxmX3Y0LAogICAgICAgICAgICAgICBzaXpl b2YoZmlyc3RfaGFsZl92NCkpOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0Ff Q0lEUl9NQVNLLCAmaGFsZl9jaWRyLCAxKTsKICBuZXRsaW5rX2RvbmUoJm5sbXNnKTsKICBuZXRs aW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCAwKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNn LCBXR0FMTE9XRURJUF9BX0ZBTUlMWSwgJmFmX2luZXQ2LCAyKTsKICBuZXRsaW5rX2F0dHIoJm5s bXNnLCBXR0FMTE9XRURJUF9BX0lQQUREUiwgJmZpcnN0X2hhbGZfdjYsCiAgICAgICAgICAgICAg IHNpemVvZihmaXJzdF9oYWxmX3Y2KSk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VE SVBfQV9DSURSX01BU0ssICZoYWxmX2NpZHIsIDEpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwog IG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIG5ldGxpbmtf bmVzdCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IDApOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdH UEVFUl9BX1BVQkxJQ19LRVksIHB1YmxpY19jLCAzMik7CiAgbmV0bGlua19hdHRyKCZubG1zZywg V0dQRUVSX0FfRU5EUE9JTlQsICZlbmRwb2ludF9jX3Y0LAogICAgICAgICAgICAgICBzaXplb2Yo ZW5kcG9pbnRfY192NCkpOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHUEVFUl9BX1BFUlNJU1RF TlRfS0VFUEFMSVZFX0lOVEVSVkFMLAogICAgICAgICAgICAgICAmcGVyc2lzdGVudF9rZWVwYWxp dmVzWzNdLCAyKTsKICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCBXR1BFRVJf QV9BTExPV0VESVBTKTsKICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCAwKTsK ICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0ZBTUlMWSwgJmFmX2luZXQsIDIp OwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0FfSVBBRERSLCAmc2Vjb25kX2hh bGZfdjQsCiAgICAgICAgICAgICAgIHNpemVvZihzZWNvbmRfaGFsZl92NCkpOwogIG5ldGxpbmtf YXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0FfQ0lEUl9NQVNLLCAmaGFsZl9jaWRyLCAxKTsKICBu ZXRsaW5rX2RvbmUoJm5sbXNnKTsKICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQg fCAwKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0ZBTUlMWSwgJmFmX2lu ZXQ2LCAyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0lQQUREUiwgJnNl Y29uZF9oYWxmX3Y2LAogICAgICAgICAgICAgICBzaXplb2Yoc2Vjb25kX2hhbGZfdjYpKTsKICBu ZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0NJRFJfTUFTSywgJmhhbGZfY2lkciwg MSk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgbmV0 bGlua19kb25lKCZubG1zZyk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgZXJyID0gbmV0bGlu a19zZW5kKCZubG1zZywgc29jayk7CiAgaWYgKGVycikgewogIH0KICBuZXRsaW5rX2luaXQoJm5s bXNnLCBpZCwgMCwgJmdlbmxoZHIsIHNpemVvZihnZW5saGRyKSk7CiAgbmV0bGlua19hdHRyKCZu bG1zZywgV0dERVZJQ0VfQV9JRk5BTUUsIGlmbmFtZV9jLCBzdHJsZW4oaWZuYW1lX2MpICsgMSk7 CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dERVZJQ0VfQV9QUklWQVRFX0tFWSwgcHJpdmF0ZV9j LCAzMik7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dERVZJQ0VfQV9MSVNURU5fUE9SVCwgJmxp c3Rlbl9jLCAyKTsKICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCBXR0RFVklD RV9BX1BFRVJTKTsKICBuZXRsaW5rX25lc3QoJm5sbXNnLCBOTEFfRl9ORVNURUQgfCAwKTsKICBu ZXRsaW5rX2F0dHIoJm5sbXNnLCBXR1BFRVJfQV9QVUJMSUNfS0VZLCBwdWJsaWNfYSwgMzIpOwog IG5ldGxpbmtfYXR0cigmbmxtc2csIFdHUEVFUl9BX0VORFBPSU5ULCAmZW5kcG9pbnRfYV92NiwK ICAgICAgICAgICAgICAgc2l6ZW9mKGVuZHBvaW50X2FfdjYpKTsKICBuZXRsaW5rX2F0dHIoJm5s bXNnLCBXR1BFRVJfQV9QRVJTSVNURU5UX0tFRVBBTElWRV9JTlRFUlZBTCwKICAgICAgICAgICAg ICAgJnBlcnNpc3RlbnRfa2VlcGFsaXZlc1s0XSwgMik7CiAgbmV0bGlua19uZXN0KCZubG1zZywg TkxBX0ZfTkVTVEVEIHwgV0dQRUVSX0FfQUxMT1dFRElQUyk7CiAgbmV0bGlua19uZXN0KCZubG1z ZywgTkxBX0ZfTkVTVEVEIHwgMCk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBf QV9GQU1JTFksICZhZl9pbmV0LCAyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJ UF9BX0lQQUREUiwgJmZpcnN0X2hhbGZfdjQsCiAgICAgICAgICAgICAgIHNpemVvZihmaXJzdF9o YWxmX3Y0KSk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9DSURSX01BU0ss ICZoYWxmX2NpZHIsIDEpOwogIG5ldGxpbmtfZG9uZSgmbmxtc2cpOwogIG5ldGxpbmtfbmVzdCgm bmxtc2csIE5MQV9GX05FU1RFRCB8IDApOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHQUxMT1dF RElQX0FfRkFNSUxZLCAmYWZfaW5ldDYsIDIpOwogIG5ldGxpbmtfYXR0cigmbmxtc2csIFdHQUxM T1dFRElQX0FfSVBBRERSLCAmZmlyc3RfaGFsZl92NiwKICAgICAgICAgICAgICAgc2l6ZW9mKGZp cnN0X2hhbGZfdjYpKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR0FMTE9XRURJUF9BX0NJRFJf TUFTSywgJmhhbGZfY2lkciwgMSk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgbmV0bGlua19k b25lKCZubG1zZyk7CiAgbmV0bGlua19kb25lKCZubG1zZyk7CiAgbmV0bGlua19uZXN0KCZubG1z ZywgTkxBX0ZfTkVTVEVEIHwgMCk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dQRUVSX0FfUFVC TElDX0tFWSwgcHVibGljX2IsIDMyKTsKICBuZXRsaW5rX2F0dHIoJm5sbXNnLCBXR1BFRVJfQV9F TkRQT0lOVCwgJmVuZHBvaW50X2JfdjQsCiAgICAgICAgICAgICAgIHNpemVvZihlbmRwb2ludF9i X3Y0KSk7CiAgbmV0bGlua19hdHRyKCZubG1zZywgV0dQRUVSX0FfUEVSU0lTVEVOVF9LRUVQQUxJ VkVfSU5URVJWQUwsCiAgICAgICAgICAgICAgICZwZXJzaXN0ZW50X2tlZXBhbGl2ZXNbNV0sIDIp OwogIG5ldGxpbmtfbmVzdCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IFdHUEVFUl9BX0FMTE9XRURJ UFMpOwogIG5ldGxpbmtfbmVzdCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IDApOwogIG5ldGxpbmtf YXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0FfRkFNSUxZLCAmYWZfaW5ldCwgMik7CiAgbmV0bGlu a19hdHRyKCZubG1zZywgV0dBTExPV0VESVBfQV9JUEFERFIsICZzZWNvbmRfaGFsZl92NCwKICAg ICAgICAgICAgICAgc2l6ZW9mKHNlY29uZF9oYWxmX3Y0KSk7CiAgbmV0bGlua19hdHRyKCZubG1z ZywgV0dBTExPV0VESVBfQV9DSURSX01BU0ssICZoYWxmX2NpZHIsIDEpOwogIG5ldGxpbmtfZG9u ZSgmbmxtc2cpOwogIG5ldGxpbmtfbmVzdCgmbmxtc2csIE5MQV9GX05FU1RFRCB8IDApOwogIG5l dGxpbmtfYXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0FfRkFNSUxZLCAmYWZfaW5ldDYsIDIpOwog IG5ldGxpbmtfYXR0cigmbmxtc2csIFdHQUxMT1dFRElQX0FfSVBBRERSLCAmc2Vjb25kX2hhbGZf djYsCiAgICAgICAgICAgICAgIHNpemVvZihzZWNvbmRfaGFsZl92NikpOwogIG5ldGxpbmtfYXR0 cigmbmxtc2csIFdHQUxMT1dFRElQX0FfQ0lEUl9NQVNLLCAmaGFsZl9jaWRyLCAxKTsKICBuZXRs aW5rX2RvbmUoJm5sbXNnKTsKICBuZXRsaW5rX2RvbmUoJm5sbXNnKTsKICBuZXRsaW5rX2RvbmUo Jm5sbXNnKTsKICBuZXRsaW5rX2RvbmUoJm5sbXNnKTsKICBlcnIgPSBuZXRsaW5rX3NlbmQoJm5s bXNnLCBzb2NrKTsKICBpZiAoZXJyKSB7CiAgfQoKZXJyb3I6CiAgY2xvc2Uoc29jayk7Cn0Kc3Rh dGljIHZvaWQgaW5pdGlhbGl6ZV9uZXRkZXZpY2VzKHZvaWQpCnsKICBjaGFyIG5ldGRldnNpbVsx Nl07CiAgc3ByaW50ZihuZXRkZXZzaW0sICJuZXRkZXZzaW0lZCIsIChpbnQpcHJvY2lkKTsKICBz dHJ1Y3QgewogICAgY29uc3QgY2hhciogdHlwZTsKICAgIGNvbnN0IGNoYXIqIGRldjsKICB9IGRl dnR5cGVzW10gPSB7CiAgICAgIHsiaXA2Z3JldGFwIiwgImlwNmdyZXRhcDAifSwgeyJicmlkZ2Ui LCAiYnJpZGdlMCJ9LAogICAgICB7InZjYW4iLCAidmNhbjAifSwgICAgICAgICAgIHsiYm9uZCIs ICJib25kMCJ9LAogICAgICB7InRlYW0iLCAidGVhbTAifSwgICAgICAgICAgIHsiZHVtbXkiLCAi ZHVtbXkwIn0sCiAgICAgIHsibmxtb24iLCAibmxtb24wIn0sICAgICAgICAgeyJjYWlmIiwgImNh aWYwIn0sCiAgICAgIHsiYmF0YWR2IiwgImJhdGFkdjAifSwgICAgICAgeyJ2eGNhbiIsICJ2eGNh bjEifSwKICAgICAgeyJuZXRkZXZzaW0iLCBuZXRkZXZzaW19LCAgICB7InZldGgiLCAwfSwKICAg ICAgeyJ4ZnJtIiwgInhmcm0wIn0sICAgICAgICAgICB7IndpcmVndWFyZCIsICJ3ZzAifSwKICAg ICAgeyJ3aXJlZ3VhcmQiLCAid2cxIn0sICAgICAgICB7IndpcmVndWFyZCIsICJ3ZzIifSwKICB9 OwogIGNvbnN0IGNoYXIqIGRldm1hc3RlcnNbXSA9IHsiYnJpZGdlIiwgImJvbmQiLCAidGVhbSIs ICJiYXRhZHYifTsKICBzdHJ1Y3QgewogICAgY29uc3QgY2hhciogbmFtZTsKICAgIGludCBtYWNz aXplOwogICAgYm9vbCBub2lwdjY7CiAgfSBkZXZpY2VzW10gPSB7CiAgICAgIHsibG8iLCBFVEhf QUxFTn0sCiAgICAgIHsic2l0MCIsIDB9LAogICAgICB7ImJyaWRnZTAiLCBFVEhfQUxFTn0sCiAg ICAgIHsidmNhbjAiLCAwLCB0cnVlfSwKICAgICAgeyJ0dW5sMCIsIDB9LAogICAgICB7ImdyZTAi LCAwfSwKICAgICAgeyJncmV0YXAwIiwgRVRIX0FMRU59LAogICAgICB7ImlwX3Z0aTAiLCAwfSwK ICAgICAgeyJpcDZfdnRpMCIsIDB9LAogICAgICB7ImlwNnRubDAiLCAwfSwKICAgICAgeyJpcDZn cmUwIiwgMH0sCiAgICAgIHsiaXA2Z3JldGFwMCIsIEVUSF9BTEVOfSwKICAgICAgeyJlcnNwYW4w IiwgRVRIX0FMRU59LAogICAgICB7ImJvbmQwIiwgRVRIX0FMRU59LAogICAgICB7InZldGgwIiwg RVRIX0FMRU59LAogICAgICB7InZldGgxIiwgRVRIX0FMRU59LAogICAgICB7InRlYW0wIiwgRVRI X0FMRU59LAogICAgICB7InZldGgwX3RvX2JyaWRnZSIsIEVUSF9BTEVOfSwKICAgICAgeyJ2ZXRo MV90b19icmlkZ2UiLCBFVEhfQUxFTn0sCiAgICAgIHsidmV0aDBfdG9fYm9uZCIsIEVUSF9BTEVO fSwKICAgICAgeyJ2ZXRoMV90b19ib25kIiwgRVRIX0FMRU59LAogICAgICB7InZldGgwX3RvX3Rl YW0iLCBFVEhfQUxFTn0sCiAgICAgIHsidmV0aDFfdG9fdGVhbSIsIEVUSF9BTEVOfSwKICAgICAg eyJ2ZXRoMF90b19oc3IiLCBFVEhfQUxFTn0sCiAgICAgIHsidmV0aDFfdG9faHNyIiwgRVRIX0FM RU59LAogICAgICB7ImhzcjAiLCAwfSwKICAgICAgeyJkdW1teTAiLCBFVEhfQUxFTn0sCiAgICAg IHsibmxtb24wIiwgMH0sCiAgICAgIHsidnhjYW4wIiwgMCwgdHJ1ZX0sCiAgICAgIHsidnhjYW4x IiwgMCwgdHJ1ZX0sCiAgICAgIHsiY2FpZjAiLCBFVEhfQUxFTn0sCiAgICAgIHsiYmF0YWR2MCIs IEVUSF9BTEVOfSwKICAgICAge25ldGRldnNpbSwgRVRIX0FMRU59LAogICAgICB7Inhmcm0wIiwg RVRIX0FMRU59LAogICAgICB7InZldGgwX3ZpcnRfd2lmaSIsIEVUSF9BTEVOfSwKICAgICAgeyJ2 ZXRoMV92aXJ0X3dpZmkiLCBFVEhfQUxFTn0sCiAgICAgIHsidmlydF93aWZpMCIsIEVUSF9BTEVO fSwKICAgICAgeyJ2ZXRoMF92bGFuIiwgRVRIX0FMRU59LAogICAgICB7InZldGgxX3ZsYW4iLCBF VEhfQUxFTn0sCiAgICAgIHsidmxhbjAiLCBFVEhfQUxFTn0sCiAgICAgIHsidmxhbjEiLCBFVEhf QUxFTn0sCiAgICAgIHsibWFjdmxhbjAiLCBFVEhfQUxFTn0sCiAgICAgIHsibWFjdmxhbjEiLCBF VEhfQUxFTn0sCiAgICAgIHsiaXB2bGFuMCIsIEVUSF9BTEVOfSwKICAgICAgeyJpcHZsYW4xIiwg RVRIX0FMRU59LAogICAgICB7InZldGgwX21hY3Z0YXAiLCBFVEhfQUxFTn0sCiAgICAgIHsidmV0 aDFfbWFjdnRhcCIsIEVUSF9BTEVOfSwKICAgICAgeyJtYWN2dGFwMCIsIEVUSF9BTEVOfSwKICAg ICAgeyJtYWNzZWMwIiwgRVRIX0FMRU59LAogICAgICB7InZldGgwX3RvX2JhdGFkdiIsIEVUSF9B TEVOfSwKICAgICAgeyJ2ZXRoMV90b19iYXRhZHYiLCBFVEhfQUxFTn0sCiAgICAgIHsiYmF0YWR2 X3NsYXZlXzAiLCBFVEhfQUxFTn0sCiAgICAgIHsiYmF0YWR2X3NsYXZlXzEiLCBFVEhfQUxFTn0s CiAgICAgIHsiZ2VuZXZlMCIsIEVUSF9BTEVOfSwKICAgICAgeyJnZW5ldmUxIiwgRVRIX0FMRU59 LAogICAgICB7IndnMCIsIDB9LAogICAgICB7IndnMSIsIDB9LAogICAgICB7IndnMiIsIDB9LAog IH07CiAgaW50IHNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfUk9V VEUpOwogIGlmIChzb2NrID09IC0xKQogICAgZXhpdCgxKTsKICB1bnNpZ25lZCBpOwogIGZvciAo aSA9IDA7IGkgPCBzaXplb2YoZGV2dHlwZXMpIC8gc2l6ZW9mKGRldnR5cGVzWzBdKTsgaSsrKQog ICAgbmV0bGlua19hZGRfZGV2aWNlKCZubG1zZywgc29jaywgZGV2dHlwZXNbaV0udHlwZSwgZGV2 dHlwZXNbaV0uZGV2KTsKICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRldm1hc3RlcnMpIC8gKHNp emVvZihkZXZtYXN0ZXJzWzBdKSk7IGkrKykgewogICAgY2hhciBtYXN0ZXJbMzJdLCBzbGF2ZTBb MzJdLCB2ZXRoMFszMl0sIHNsYXZlMVszMl0sIHZldGgxWzMyXTsKICAgIHNwcmludGYoc2xhdmUw LCAiJXNfc2xhdmVfMCIsIGRldm1hc3RlcnNbaV0pOwogICAgc3ByaW50Zih2ZXRoMCwgInZldGgw X3RvXyVzIiwgZGV2bWFzdGVyc1tpXSk7CiAgICBuZXRsaW5rX2FkZF92ZXRoKCZubG1zZywgc29j aywgc2xhdmUwLCB2ZXRoMCk7CiAgICBzcHJpbnRmKHNsYXZlMSwgIiVzX3NsYXZlXzEiLCBkZXZt YXN0ZXJzW2ldKTsKICAgIHNwcmludGYodmV0aDEsICJ2ZXRoMV90b18lcyIsIGRldm1hc3RlcnNb aV0pOwogICAgbmV0bGlua19hZGRfdmV0aCgmbmxtc2csIHNvY2ssIHNsYXZlMSwgdmV0aDEpOwog ICAgc3ByaW50ZihtYXN0ZXIsICIlczAiLCBkZXZtYXN0ZXJzW2ldKTsKICAgIG5ldGxpbmtfZGV2 aWNlX2NoYW5nZSgmbmxtc2csIHNvY2ssIHNsYXZlMCwgZmFsc2UsIG1hc3RlciwgMCwgMCwgTlVM TCk7CiAgICBuZXRsaW5rX2RldmljZV9jaGFuZ2UoJm5sbXNnLCBzb2NrLCBzbGF2ZTEsIGZhbHNl LCBtYXN0ZXIsIDAsIDAsIE5VTEwpOwogIH0KICBuZXRsaW5rX2RldmljZV9jaGFuZ2UoJm5sbXNn LCBzb2NrLCAiYnJpZGdlX3NsYXZlXzAiLCB0cnVlLCAwLCAwLCAwLCBOVUxMKTsKICBuZXRsaW5r X2RldmljZV9jaGFuZ2UoJm5sbXNnLCBzb2NrLCAiYnJpZGdlX3NsYXZlXzEiLCB0cnVlLCAwLCAw LCAwLCBOVUxMKTsKICBuZXRsaW5rX2FkZF92ZXRoKCZubG1zZywgc29jaywgImhzcl9zbGF2ZV8w IiwgInZldGgwX3RvX2hzciIpOwogIG5ldGxpbmtfYWRkX3ZldGgoJm5sbXNnLCBzb2NrLCAiaHNy X3NsYXZlXzEiLCAidmV0aDFfdG9faHNyIik7CiAgbmV0bGlua19hZGRfaHNyKCZubG1zZywgc29j aywgImhzcjAiLCAiaHNyX3NsYXZlXzAiLCAiaHNyX3NsYXZlXzEiKTsKICBuZXRsaW5rX2Rldmlj ZV9jaGFuZ2UoJm5sbXNnLCBzb2NrLCAiaHNyX3NsYXZlXzAiLCB0cnVlLCAwLCAwLCAwLCBOVUxM KTsKICBuZXRsaW5rX2RldmljZV9jaGFuZ2UoJm5sbXNnLCBzb2NrLCAiaHNyX3NsYXZlXzEiLCB0 cnVlLCAwLCAwLCAwLCBOVUxMKTsKICBuZXRsaW5rX2FkZF92ZXRoKCZubG1zZywgc29jaywgInZl dGgwX3ZpcnRfd2lmaSIsICJ2ZXRoMV92aXJ0X3dpZmkiKTsKICBuZXRsaW5rX2FkZF9saW5rZWQo Jm5sbXNnLCBzb2NrLCAidmlydF93aWZpIiwgInZpcnRfd2lmaTAiLAogICAgICAgICAgICAgICAg ICAgICAidmV0aDFfdmlydF93aWZpIik7CiAgbmV0bGlua19hZGRfdmV0aCgmbmxtc2csIHNvY2ss ICJ2ZXRoMF92bGFuIiwgInZldGgxX3ZsYW4iKTsKICBuZXRsaW5rX2FkZF92bGFuKCZubG1zZywg c29jaywgInZsYW4wIiwgInZldGgwX3ZsYW4iLCAwLCBodG9ucyhFVEhfUF84MDIxUSkpOwogIG5l dGxpbmtfYWRkX3ZsYW4oJm5sbXNnLCBzb2NrLCAidmxhbjEiLCAidmV0aDBfdmxhbiIsIDEsIGh0 b25zKEVUSF9QXzgwMjFBRCkpOwogIG5ldGxpbmtfYWRkX21hY3ZsYW4oJm5sbXNnLCBzb2NrLCAi bWFjdmxhbjAiLCAidmV0aDFfdmxhbiIpOwogIG5ldGxpbmtfYWRkX21hY3ZsYW4oJm5sbXNnLCBz b2NrLCAibWFjdmxhbjEiLCAidmV0aDFfdmxhbiIpOwogIG5ldGxpbmtfYWRkX2lwdmxhbigmbmxt c2csIHNvY2ssICJpcHZsYW4wIiwgInZldGgwX3ZsYW4iLCBJUFZMQU5fTU9ERV9MMiwgMCk7CiAg bmV0bGlua19hZGRfaXB2bGFuKCZubG1zZywgc29jaywgImlwdmxhbjEiLCAidmV0aDBfdmxhbiIs IElQVkxBTl9NT0RFX0wzUywKICAgICAgICAgICAgICAgICAgICAgSVBWTEFOX0ZfVkVQQSk7CiAg bmV0bGlua19hZGRfdmV0aCgmbmxtc2csIHNvY2ssICJ2ZXRoMF9tYWN2dGFwIiwgInZldGgxX21h Y3Z0YXAiKTsKICBuZXRsaW5rX2FkZF9saW5rZWQoJm5sbXNnLCBzb2NrLCAibWFjdnRhcCIsICJt YWN2dGFwMCIsICJ2ZXRoMF9tYWN2dGFwIik7CiAgbmV0bGlua19hZGRfbGlua2VkKCZubG1zZywg c29jaywgIm1hY3NlYyIsICJtYWNzZWMwIiwgInZldGgxX21hY3Z0YXAiKTsKICBjaGFyIGFkZHJb MzJdOwogIHNwcmludGYoYWRkciwgREVWX0lQVjQsIDE0ICsgMTApOwogIHN0cnVjdCBpbl9hZGRy IGdlbmV2ZV9hZGRyNDsKICBpZiAoaW5ldF9wdG9uKEFGX0lORVQsIGFkZHIsICZnZW5ldmVfYWRk cjQpIDw9IDApCiAgICBleGl0KDEpOwogIHN0cnVjdCBpbjZfYWRkciBnZW5ldmVfYWRkcjY7CiAg aWYgKGluZXRfcHRvbihBRl9JTkVUNiwgImZjMDA6OjAxIiwgJmdlbmV2ZV9hZGRyNikgPD0gMCkK ICAgIGV4aXQoMSk7CiAgbmV0bGlua19hZGRfZ2VuZXZlKCZubG1zZywgc29jaywgImdlbmV2ZTAi LCAwLCAmZ2VuZXZlX2FkZHI0LCAwKTsKICBuZXRsaW5rX2FkZF9nZW5ldmUoJm5sbXNnLCBzb2Nr LCAiZ2VuZXZlMSIsIDEsIDAsICZnZW5ldmVfYWRkcjYpOwogIG5ldGRldnNpbV9hZGQoKGludClw cm9jaWQsIDQpOwogIG5ldGxpbmtfd2lyZWd1YXJkX3NldHVwKCk7CiAgZm9yIChpID0gMDsgaSA8 IHNpemVvZihkZXZpY2VzKSAvIChzaXplb2YoZGV2aWNlc1swXSkpOyBpKyspIHsKICAgIGNoYXIg YWRkclszMl07CiAgICBzcHJpbnRmKGFkZHIsIERFVl9JUFY0LCBpICsgMTApOwogICAgbmV0bGlu a19hZGRfYWRkcjQoJm5sbXNnLCBzb2NrLCBkZXZpY2VzW2ldLm5hbWUsIGFkZHIpOwogICAgaWYg KCFkZXZpY2VzW2ldLm5vaXB2NikgewogICAgICBzcHJpbnRmKGFkZHIsIERFVl9JUFY2LCBpICsg MTApOwogICAgICBuZXRsaW5rX2FkZF9hZGRyNigmbmxtc2csIHNvY2ssIGRldmljZXNbaV0ubmFt ZSwgYWRkcik7CiAgICB9CiAgICB1aW50NjRfdCBtYWNhZGRyID0gREVWX01BQyArICgoaSArIDEw dWxsKSA8PCA0MCk7CiAgICBuZXRsaW5rX2RldmljZV9jaGFuZ2UoJm5sbXNnLCBzb2NrLCBkZXZp Y2VzW2ldLm5hbWUsIHRydWUsIDAsICZtYWNhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAg IGRldmljZXNbaV0ubWFjc2l6ZSwgTlVMTCk7CiAgfQogIGNsb3NlKHNvY2spOwp9CnN0YXRpYyB2 b2lkIGluaXRpYWxpemVfbmV0ZGV2aWNlc19pbml0KHZvaWQpCnsKICBpbnQgc29jayA9IHNvY2tl dChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CiAgaWYgKHNvY2sgPT0gLTEp CiAgICBleGl0KDEpOwogIHN0cnVjdCB7CiAgICBjb25zdCBjaGFyKiB0eXBlOwogICAgaW50IG1h Y3NpemU7CiAgICBib29sIG5vaXB2NjsKICAgIGJvb2wgbm91cDsKICB9IGRldnR5cGVzW10gPSB7 CiAgICAgIHsibnIiLCA3LCB0cnVlfSwKICAgICAgeyJyb3NlIiwgNSwgdHJ1ZSwgdHJ1ZX0sCiAg fTsKICB1bnNpZ25lZCBpOwogIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2dHlwZXMpIC8gc2l6 ZW9mKGRldnR5cGVzWzBdKTsgaSsrKSB7CiAgICBjaGFyIGRldlszMl0sIGFkZHJbMzJdOwogICAg c3ByaW50ZihkZXYsICIlcyVkIiwgZGV2dHlwZXNbaV0udHlwZSwgKGludClwcm9jaWQpOwogICAg c3ByaW50ZihhZGRyLCAiMTcyLjMwLiVkLiVkIiwgaSwgKGludClwcm9jaWQgKyAxKTsKICAgIG5l dGxpbmtfYWRkX2FkZHI0KCZubG1zZywgc29jaywgZGV2LCBhZGRyKTsKICAgIGlmICghZGV2dHlw ZXNbaV0ubm9pcHY2KSB7CiAgICAgIHNwcmludGYoYWRkciwgImZlODg6OiUwMng6JTAyeCIsIGks IChpbnQpcHJvY2lkICsgMSk7CiAgICAgIG5ldGxpbmtfYWRkX2FkZHI2KCZubG1zZywgc29jaywg ZGV2LCBhZGRyKTsKICAgIH0KICAgIGludCBtYWNzaXplID0gZGV2dHlwZXNbaV0ubWFjc2l6ZTsK ICAgIHVpbnQ2NF90IG1hY2FkZHIgPSAweGJiYmJiYiArCiAgICAgICAgICAgICAgICAgICAgICAg KCh1bnNpZ25lZCBsb25nIGxvbmcpaSA8PCAoOCAqIChtYWNzaXplIC0gMikpKSArCiAgICAgICAg ICAgICAgICAgICAgICAgKHByb2NpZCA8PCAoOCAqIChtYWNzaXplIC0gMSkpKTsKICAgIG5ldGxp bmtfZGV2aWNlX2NoYW5nZSgmbmxtc2csIHNvY2ssIGRldiwgIWRldnR5cGVzW2ldLm5vdXAsIDAs ICZtYWNhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3NpemUsIE5VTEwpOwogIH0K ICBjbG9zZShzb2NrKTsKfQoKc3RhdGljIGludCByZWFkX3R1bihjaGFyKiBkYXRhLCBpbnQgc2l6 ZSkKewogIGlmICh0dW5mZCA8IDApCiAgICByZXR1cm4gLTE7CiAgaW50IHJ2ID0gcmVhZCh0dW5m ZCwgZGF0YSwgc2l6ZSk7CiAgaWYgKHJ2IDwgMCkgewogICAgaWYgKGVycm5vID09IEVBR0FJTikK ICAgICAgcmV0dXJuIC0xOwogICAgaWYgKGVycm5vID09IEVCQURGRCkKICAgICAgcmV0dXJuIC0x OwogICAgZXhpdCgxKTsKICB9CiAgcmV0dXJuIHJ2Owp9CgpzdGF0aWMgdm9pZCBmbHVzaF90dW4o KQp7CiAgY2hhciBkYXRhWzEwMDBdOwogIHdoaWxlIChyZWFkX3R1bigmZGF0YVswXSwgc2l6ZW9m KGRhdGEpKSAhPSAtMSkgewogIH0KfQoKI2RlZmluZSBNQVhfRkRTIDMwCgpzdGF0aWMgdm9pZCBz ZXR1cF9jZ3JvdXBzKCkKewogIGlmIChta2RpcigiL3N5emNncm91cCIsIDA3NzcpKSB7CiAgfQog IGlmIChta2RpcigiL3N5emNncm91cC91bmlmaWVkIiwgMDc3NykpIHsKICB9CiAgaWYgKG1vdW50 KCJub25lIiwgIi9zeXpjZ3JvdXAvdW5pZmllZCIsICJjZ3JvdXAyIiwgMCwgTlVMTCkpIHsKICB9 CiAgaWYgKGNobW9kKCIvc3l6Y2dyb3VwL3VuaWZpZWQiLCAwNzc3KSkgewogIH0KICB3cml0ZV9m aWxlKCIvc3l6Y2dyb3VwL3VuaWZpZWQvY2dyb3VwLnN1YnRyZWVfY29udHJvbCIsCiAgICAgICAg ICAgICAiK2NwdSArbWVtb3J5ICtpbyArcGlkcyArcmRtYSIpOwogIGlmIChta2RpcigiL3N5emNn cm91cC9jcHUiLCAwNzc3KSkgewogIH0KICBpZiAobW91bnQoIm5vbmUiLCAiL3N5emNncm91cC9j cHUiLCAiY2dyb3VwIiwgMCwKICAgICAgICAgICAgImNwdXNldCxjcHVhY2N0LHBlcmZfZXZlbnQs aHVnZXRsYiIpKSB7CiAgfQogIHdyaXRlX2ZpbGUoIi9zeXpjZ3JvdXAvY3B1L2Nncm91cC5jbG9u ZV9jaGlsZHJlbiIsICIxIik7CiAgaWYgKGNobW9kKCIvc3l6Y2dyb3VwL2NwdSIsIDA3NzcpKSB7 CiAgfQogIGlmIChta2RpcigiL3N5emNncm91cC9uZXQiLCAwNzc3KSkgewogIH0KICBpZiAobW91 bnQoIm5vbmUiLCAiL3N5emNncm91cC9uZXQiLCAiY2dyb3VwIiwgMCwKICAgICAgICAgICAgIm5l dF9jbHMsbmV0X3ByaW8sZGV2aWNlcyxmcmVlemVyIikpIHsKICB9CiAgaWYgKGNobW9kKCIvc3l6 Y2dyb3VwL25ldCIsIDA3NzcpKSB7CiAgfQp9CgpzdGF0aWMgdm9pZCBzZXR1cF9jZ3JvdXBzX2xv b3AoKQp7CiAgaW50IHBpZCA9IGdldHBpZCgpOwogIGNoYXIgZmlsZVsxMjhdOwogIGNoYXIgY2dy b3VwZGlyWzY0XTsKICBzbnByaW50ZihjZ3JvdXBkaXIsIHNpemVvZihjZ3JvdXBkaXIpLCAiL3N5 emNncm91cC91bmlmaWVkL3N5eiVsbHUiLCBwcm9jaWQpOwogIGlmIChta2RpcihjZ3JvdXBkaXIs IDA3NzcpKSB7CiAgfQogIHNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIiVzL3BpZHMubWF4 IiwgY2dyb3VwZGlyKTsKICB3cml0ZV9maWxlKGZpbGUsICIzMiIpOwogIHNucHJpbnRmKGZpbGUs IHNpemVvZihmaWxlKSwgIiVzL21lbW9yeS5sb3ciLCBjZ3JvdXBkaXIpOwogIHdyaXRlX2ZpbGUo ZmlsZSwgIiVkIiwgMjk4IDw8IDIwKTsKICBzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIl cy9tZW1vcnkuaGlnaCIsIGNncm91cGRpcik7CiAgd3JpdGVfZmlsZShmaWxlLCAiJWQiLCAyOTkg PDwgMjApOwogIHNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIiVzL21lbW9yeS5tYXgiLCBj Z3JvdXBkaXIpOwogIHdyaXRlX2ZpbGUoZmlsZSwgIiVkIiwgMzAwIDw8IDIwKTsKICBzbnByaW50 ZihmaWxlLCBzaXplb2YoZmlsZSksICIlcy9jZ3JvdXAucHJvY3MiLCBjZ3JvdXBkaXIpOwogIHdy aXRlX2ZpbGUoZmlsZSwgIiVkIiwgcGlkKTsKICBzbnByaW50ZihjZ3JvdXBkaXIsIHNpemVvZihj Z3JvdXBkaXIpLCAiL3N5emNncm91cC9jcHUvc3l6JWxsdSIsIHByb2NpZCk7CiAgaWYgKG1rZGly KGNncm91cGRpciwgMDc3NykpIHsKICB9CiAgc25wcmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAi JXMvY2dyb3VwLnByb2NzIiwgY2dyb3VwZGlyKTsKICB3cml0ZV9maWxlKGZpbGUsICIlZCIsIHBp ZCk7CiAgc25wcmludGYoY2dyb3VwZGlyLCBzaXplb2YoY2dyb3VwZGlyKSwgIi9zeXpjZ3JvdXAv bmV0L3N5eiVsbHUiLCBwcm9jaWQpOwogIGlmIChta2RpcihjZ3JvdXBkaXIsIDA3NzcpKSB7CiAg fQogIHNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIiVzL2Nncm91cC5wcm9jcyIsIGNncm91 cGRpcik7CiAgd3JpdGVfZmlsZShmaWxlLCAiJWQiLCBwaWQpOwp9CgpzdGF0aWMgdm9pZCBzZXR1 cF9jZ3JvdXBzX3Rlc3QoKQp7CiAgY2hhciBjZ3JvdXBkaXJbNjRdOwogIHNucHJpbnRmKGNncm91 cGRpciwgc2l6ZW9mKGNncm91cGRpciksICIvc3l6Y2dyb3VwL3VuaWZpZWQvc3l6JWxsdSIsIHBy b2NpZCk7CiAgaWYgKHN5bWxpbmsoY2dyb3VwZGlyLCAiLi9jZ3JvdXAiKSkgewogIH0KICBzbnBy aW50ZihjZ3JvdXBkaXIsIHNpemVvZihjZ3JvdXBkaXIpLCAiL3N5emNncm91cC9jcHUvc3l6JWxs dSIsIHByb2NpZCk7CiAgaWYgKHN5bWxpbmsoY2dyb3VwZGlyLCAiLi9jZ3JvdXAuY3B1IikpIHsK ICB9CiAgc25wcmludGYoY2dyb3VwZGlyLCBzaXplb2YoY2dyb3VwZGlyKSwgIi9zeXpjZ3JvdXAv bmV0L3N5eiVsbHUiLCBwcm9jaWQpOwogIGlmIChzeW1saW5rKGNncm91cGRpciwgIi4vY2dyb3Vw Lm5ldCIpKSB7CiAgfQp9CgpzdGF0aWMgdm9pZCBzZXR1cF9jb21tb24oKQp7CiAgaWYgKG1vdW50 KDAsICIvc3lzL2ZzL2Z1c2UvY29ubmVjdGlvbnMiLCAiZnVzZWN0bCIsIDAsIDApKSB7CiAgfQog IHNldHVwX2Nncm91cHMoKTsKfQoKc3RhdGljIHZvaWQgbG9vcCgpOwoKc3RhdGljIHZvaWQgc2Fu ZGJveF9jb21tb24oKQp7CiAgcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCwgMCwgMCwg MCk7CiAgc2V0cGdycCgpOwogIHNldHNpZCgpOwogIHN0cnVjdCBybGltaXQgcmxpbTsKICBybGlt LnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9ICgyMDAgPDwgMjApOwogIHNldHJsaW1pdChSTElN SVRfQVMsICZybGltKTsKICBybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDMyIDw8IDIw OwogIHNldHJsaW1pdChSTElNSVRfTUVNTE9DSywgJnJsaW0pOwogIHJsaW0ucmxpbV9jdXIgPSBy bGltLnJsaW1fbWF4ID0gMTM2IDw8IDIwOwogIHNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGlt KTsKICBybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDEgPDwgMjA7CiAgc2V0cmxpbWl0 KFJMSU1JVF9TVEFDSywgJnJsaW0pOwogIHJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0g MDsKICBzZXRybGltaXQoUkxJTUlUX0NPUkUsICZybGltKTsKICBybGltLnJsaW1fY3VyID0gcmxp bS5ybGltX21heCA9IDI1NjsKICBzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW0pOwogIGlm ICh1bnNoYXJlKENMT05FX05FV05TKSkgewogIH0KICBpZiAodW5zaGFyZShDTE9ORV9ORVdJUEMp KSB7CiAgfQogIGlmICh1bnNoYXJlKDB4MDIwMDAwMDApKSB7CiAgfQogIGlmICh1bnNoYXJlKENM T05FX05FV1VUUykpIHsKICB9CiAgaWYgKHVuc2hhcmUoQ0xPTkVfU1lTVlNFTSkpIHsKICB9CiAg dHlwZWRlZiBzdHJ1Y3QgewogICAgY29uc3QgY2hhciogbmFtZTsKICAgIGNvbnN0IGNoYXIqIHZh bHVlOwogIH0gc3lzY3RsX3Q7CiAgc3RhdGljIGNvbnN0IHN5c2N0bF90IHN5c2N0bHNbXSA9IHsK ICAgICAgeyIvcHJvYy9zeXMva2VybmVsL3NobW1heCIsICIxNjc3NzIxNiJ9LAogICAgICB7Ii9w cm9jL3N5cy9rZXJuZWwvc2htYWxsIiwgIjUzNjg3MDkxMiJ9LAogICAgICB7Ii9wcm9jL3N5cy9r ZXJuZWwvc2htbW5pIiwgIjEwMjQifSwKICAgICAgeyIvcHJvYy9zeXMva2VybmVsL21zZ21heCIs ICI4MTkyIn0sCiAgICAgIHsiL3Byb2Mvc3lzL2tlcm5lbC9tc2dtbmkiLCAiMTAyNCJ9LAogICAg ICB7Ii9wcm9jL3N5cy9rZXJuZWwvbXNnbW5iIiwgIjEwMjQifSwKICAgICAgeyIvcHJvYy9zeXMv a2VybmVsL3NlbSIsICIxMDI0IDEwNDg1NzYgNTAwIDEwMjQifSwKICB9OwogIHVuc2lnbmVkIGk7 CiAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzeXNjdGxzKSAvIHNpemVvZihzeXNjdGxzWzBdKTsg aSsrKQogICAgd3JpdGVfZmlsZShzeXNjdGxzW2ldLm5hbWUsIHN5c2N0bHNbaV0udmFsdWUpOwp9 CgpzdGF0aWMgaW50IHdhaXRfZm9yX2xvb3AoaW50IHBpZCkKewogIGlmIChwaWQgPCAwKQogICAg ZXhpdCgxKTsKICBpbnQgc3RhdHVzID0gMDsKICB3aGlsZSAod2FpdHBpZCgtMSwgJnN0YXR1cywg X19XQUxMKSAhPSBwaWQpIHsKICB9CiAgcmV0dXJuIFdFWElUU1RBVFVTKHN0YXR1cyk7Cn0KCnN0 YXRpYyB2b2lkIGRyb3BfY2Fwcyh2b2lkKQp7CiAgc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0 cnVjdCBjYXBfaGRyID0ge307CiAgc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgY2FwX2Rh dGFbMl0gPSB7fTsKICBjYXBfaGRyLnZlcnNpb24gPSBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9O XzM7CiAgY2FwX2hkci5waWQgPSBnZXRwaWQoKTsKICBpZiAoc3lzY2FsbChTWVNfY2FwZ2V0LCAm Y2FwX2hkciwgJmNhcF9kYXRhKSkKICAgIGV4aXQoMSk7CiAgY29uc3QgaW50IGRyb3AgPSAoMSA8 PCBDQVBfU1lTX1BUUkFDRSkgfCAoMSA8PCBDQVBfU1lTX05JQ0UpOwogIGNhcF9kYXRhWzBdLmVm ZmVjdGl2ZSAmPSB+ZHJvcDsKICBjYXBfZGF0YVswXS5wZXJtaXR0ZWQgJj0gfmRyb3A7CiAgY2Fw X2RhdGFbMF0uaW5oZXJpdGFibGUgJj0gfmRyb3A7CiAgaWYgKHN5c2NhbGwoU1lTX2NhcHNldCwg JmNhcF9oZHIsICZjYXBfZGF0YSkpCiAgICBleGl0KDEpOwp9CgpzdGF0aWMgaW50IGRvX3NhbmRi b3hfbm9uZSh2b2lkKQp7CiAgaWYgKHVuc2hhcmUoQ0xPTkVfTkVXUElEKSkgewogIH0KICBpbnQg cGlkID0gZm9yaygpOwogIGlmIChwaWQgIT0gMCkKICAgIHJldHVybiB3YWl0X2Zvcl9sb29wKHBp ZCk7CiAgc2V0dXBfY29tbW9uKCk7CiAgc2FuZGJveF9jb21tb24oKTsKICBkcm9wX2NhcHMoKTsK ICBpbml0aWFsaXplX25ldGRldmljZXNfaW5pdCgpOwogIGlmICh1bnNoYXJlKENMT05FX05FV05F VCkpIHsKICB9CiAgaW5pdGlhbGl6ZV90dW4oKTsKICBpbml0aWFsaXplX25ldGRldmljZXMoKTsK ICBsb29wKCk7CiAgZXhpdCgxKTsKfQoKI2RlZmluZSBGU19JT0NfU0VURkxBR1MgX0lPVygnZics IDIsIGxvbmcpCnN0YXRpYyB2b2lkIHJlbW92ZV9kaXIoY29uc3QgY2hhciogZGlyKQp7CiAgRElS KiBkcDsKICBzdHJ1Y3QgZGlyZW50KiBlcDsKICBpbnQgaXRlciA9IDA7CnJldHJ5OgogIGRwID0g b3BlbmRpcihkaXIpOwogIGlmIChkcCA9PSBOVUxMKSB7CiAgICBpZiAoZXJybm8gPT0gRU1GSUxF KSB7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBleGl0KDEpOwogIH0KICB3aGlsZSAoKGVwID0g cmVhZGRpcihkcCkpKSB7CiAgICBpZiAoc3RyY21wKGVwLT5kX25hbWUsICIuIikgPT0gMCB8fCBz dHJjbXAoZXAtPmRfbmFtZSwgIi4uIikgPT0gMCkKICAgICAgY29udGludWU7CiAgICBjaGFyIGZp bGVuYW1lW0ZJTEVOQU1FX01BWF07CiAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVu YW1lKSwgIiVzLyVzIiwgZGlyLCBlcC0+ZF9uYW1lKTsKICAgIHN0cnVjdCBzdGF0IHN0OwogICAg aWYgKGxzdGF0KGZpbGVuYW1lLCAmc3QpKQogICAgICBleGl0KDEpOwogICAgaWYgKFNfSVNESVIo c3Quc3RfbW9kZSkpIHsKICAgICAgcmVtb3ZlX2RpcihmaWxlbmFtZSk7CiAgICAgIGNvbnRpbnVl OwogICAgfQogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CiAgICAgIGlmICh1bmxp bmsoZmlsZW5hbWUpID09IDApCiAgICAgICAgYnJlYWs7CiAgICAgIGlmIChlcnJubyA9PSBFUEVS TSkgewogICAgICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKICAgICAgICBp ZiAoZmQgIT0gLTEpIHsKICAgICAgICAgIGxvbmcgZmxhZ3MgPSAwOwogICAgICAgICAgaWYgKGlv Y3RsKGZkLCBGU19JT0NfU0VURkxBR1MsICZmbGFncykgPT0gMCkgewogICAgICAgICAgfQogICAg ICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAg ICAgIGlmIChlcnJubyA9PSBFUk9GUykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlm IChlcnJubyAhPSBFQlVTWSB8fCBpID4gMTAwKQogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgfQog IGNsb3NlZGlyKGRwKTsKICBpbnQgaTsKICBmb3IgKGkgPSAwOzsgaSsrKSB7CiAgICBpZiAocm1k aXIoZGlyKSA9PSAwKQogICAgICBicmVhazsKICAgIGlmIChpIDwgMTAwKSB7CiAgICAgIGlmIChl cnJubyA9PSBFUEVSTSkgewogICAgICAgIGludCBmZCA9IG9wZW4oZGlyLCBPX1JET05MWSk7CiAg ICAgICAgaWYgKGZkICE9IC0xKSB7CiAgICAgICAgICBsb25nIGZsYWdzID0gMDsKICAgICAgICAg IGlmIChpb2N0bChmZCwgRlNfSU9DX1NFVEZMQUdTLCAmZmxhZ3MpID09IDApIHsKICAgICAgICAg IH0KICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAg ICAgfQogICAgICBpZiAoZXJybm8gPT0gRVJPRlMpIHsKICAgICAgICBicmVhazsKICAgICAgfQog ICAgICBpZiAoZXJybm8gPT0gRUJVU1kpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAg ICBpZiAoZXJybm8gPT0gRU5PVEVNUFRZKSB7CiAgICAgICAgaWYgKGl0ZXIgPCAxMDApIHsKICAg ICAgICAgIGl0ZXIrKzsKICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgfQogICAgICB9CiAg ICB9CiAgICBleGl0KDEpOwogIH0KfQoKc3RhdGljIHZvaWQga2lsbF9hbmRfd2FpdChpbnQgcGlk LCBpbnQqIHN0YXR1cykKewogIGtpbGwoLXBpZCwgU0lHS0lMTCk7CiAga2lsbChwaWQsIFNJR0tJ TEwpOwogIGludCBpOwogIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogICAgaWYgKHdhaXRw aWQoLTEsIHN0YXR1cywgV05PSEFORyB8IF9fV0FMTCkgPT0gcGlkKQogICAgICByZXR1cm47CiAg ICB1c2xlZXAoMTAwMCk7CiAgfQogIERJUiogZGlyID0gb3BlbmRpcigiL3N5cy9mcy9mdXNlL2Nv bm5lY3Rpb25zIik7CiAgaWYgKGRpcikgewogICAgZm9yICg7OykgewogICAgICBzdHJ1Y3QgZGly ZW50KiBlbnQgPSByZWFkZGlyKGRpcik7CiAgICAgIGlmICghZW50KQogICAgICAgIGJyZWFrOwog ICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCAiLiIpID09IDAgfHwgc3RyY21wKGVudC0+ZF9u YW1lLCAiLi4iKSA9PSAwKQogICAgICAgIGNvbnRpbnVlOwogICAgICBjaGFyIGFib3J0WzMwMF07 CiAgICAgIHNucHJpbnRmKGFib3J0LCBzaXplb2YoYWJvcnQpLCAiL3N5cy9mcy9mdXNlL2Nvbm5l Y3Rpb25zLyVzL2Fib3J0IiwKICAgICAgICAgICAgICAgZW50LT5kX25hbWUpOwogICAgICBpbnQg ZmQgPSBvcGVuKGFib3J0LCBPX1dST05MWSk7CiAgICAgIGlmIChmZCA9PSAtMSkgewogICAgICAg IGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh3cml0ZShmZCwgYWJvcnQsIDEpIDwgMCkgewog ICAgICB9CiAgICAgIGNsb3NlKGZkKTsKICAgIH0KICAgIGNsb3NlZGlyKGRpcik7CiAgfSBlbHNl IHsKICB9CiAgd2hpbGUgKHdhaXRwaWQoLTEsIHN0YXR1cywgX19XQUxMKSAhPSBwaWQpIHsKICB9 Cn0KCnN0YXRpYyB2b2lkIHNldHVwX2xvb3AoKQp7CiAgc2V0dXBfY2dyb3Vwc19sb29wKCk7Cn0K CnN0YXRpYyB2b2lkIHNldHVwX3Rlc3QoKQp7CiAgcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lH S0lMTCwgMCwgMCwgMCk7CiAgc2V0cGdycCgpOwogIHNldHVwX2Nncm91cHNfdGVzdCgpOwogIHdy aXRlX2ZpbGUoIi9wcm9jL3NlbGYvb29tX3Njb3JlX2FkaiIsICIxMDAwIik7CiAgZmx1c2hfdHVu KCk7Cn0KCnN0YXRpYyB2b2lkIGNsb3NlX2ZkcygpCnsKICBpbnQgZmQ7CiAgZm9yIChmZCA9IDM7 IGZkIDwgTUFYX0ZEUzsgZmQrKykKICAgIGNsb3NlKGZkKTsKfQoKc3RhdGljIHZvaWQgc2V0dXBf YmluZm10X21pc2MoKQp7CiAgaWYgKG1vdW50KDAsICIvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mi LCAiYmluZm10X21pc2MiLCAwLCAwKSkgewogIH0KICB3cml0ZV9maWxlKCIvcHJvYy9zeXMvZnMv YmluZm10X21pc2MvcmVnaXN0ZXIiLCAiOnN5ejA6TTowOlx4MDE6Oi4vZmlsZTA6Iik7CiAgd3Jp dGVfZmlsZSgiL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3JlZ2lzdGVyIiwKICAgICAgICAgICAg ICI6c3l6MTpNOjE6XHgwMjo6Li9maWxlMDpQT0MiKTsKfQoKc3RydWN0IHRocmVhZF90IHsKICBp bnQgY3JlYXRlZCwgY2FsbDsKICBldmVudF90IHJlYWR5LCBkb25lOwp9OwoKc3RhdGljIHN0cnVj dCB0aHJlYWRfdCB0aHJlYWRzWzE2XTsKc3RhdGljIHZvaWQgZXhlY3V0ZV9jYWxsKGludCBjYWxs KTsKc3RhdGljIGludCBydW5uaW5nOwoKc3RhdGljIHZvaWQqIHRocih2b2lkKiBhcmcpCnsKICBz dHJ1Y3QgdGhyZWFkX3QqIHRoID0gKHN0cnVjdCB0aHJlYWRfdCopYXJnOwogIGZvciAoOzspIHsK ICAgIGV2ZW50X3dhaXQoJnRoLT5yZWFkeSk7CiAgICBldmVudF9yZXNldCgmdGgtPnJlYWR5KTsK ICAgIGV4ZWN1dGVfY2FsbCh0aC0+Y2FsbCk7CiAgICBfX2F0b21pY19mZXRjaF9zdWIoJnJ1bm5p bmcsIDEsIF9fQVRPTUlDX1JFTEFYRUQpOwogICAgZXZlbnRfc2V0KCZ0aC0+ZG9uZSk7CiAgfQog IHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBleGVjdXRlX29uZSh2b2lkKQp7CiAgaW50IGksIGNh bGwsIHRocmVhZDsKICBmb3IgKGNhbGwgPSAwOyBjYWxsIDwgOTsgY2FsbCsrKSB7CiAgICBmb3Ig KHRocmVhZCA9IDA7IHRocmVhZCA8IChpbnQpKHNpemVvZih0aHJlYWRzKSAvIHNpemVvZih0aHJl YWRzWzBdKSk7CiAgICAgICAgIHRocmVhZCsrKSB7CiAgICAgIHN0cnVjdCB0aHJlYWRfdCogdGgg PSAmdGhyZWFkc1t0aHJlYWRdOwogICAgICBpZiAoIXRoLT5jcmVhdGVkKSB7CiAgICAgICAgdGgt PmNyZWF0ZWQgPSAxOwogICAgICAgIGV2ZW50X2luaXQoJnRoLT5yZWFkeSk7CiAgICAgICAgZXZl bnRfaW5pdCgmdGgtPmRvbmUpOwogICAgICAgIGV2ZW50X3NldCgmdGgtPmRvbmUpOwogICAgICAg IHRocmVhZF9zdGFydCh0aHIsIHRoKTsKICAgICAgfQogICAgICBpZiAoIWV2ZW50X2lzc2V0KCZ0 aC0+ZG9uZSkpCiAgICAgICAgY29udGludWU7CiAgICAgIGV2ZW50X3Jlc2V0KCZ0aC0+ZG9uZSk7 CiAgICAgIHRoLT5jYWxsID0gY2FsbDsKICAgICAgX19hdG9taWNfZmV0Y2hfYWRkKCZydW5uaW5n LCAxLCBfX0FUT01JQ19SRUxBWEVEKTsKICAgICAgZXZlbnRfc2V0KCZ0aC0+cmVhZHkpOwogICAg ICBldmVudF90aW1lZHdhaXQoJnRoLT5kb25lLCA0NSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0K ICBmb3IgKGkgPSAwOyBpIDwgMTAwICYmIF9fYXRvbWljX2xvYWRfbigmcnVubmluZywgX19BVE9N SUNfUkVMQVhFRCk7IGkrKykKICAgIHNsZWVwX21zKDEpOwogIGNsb3NlX2ZkcygpOwp9CgpzdGF0 aWMgdm9pZCBleGVjdXRlX29uZSh2b2lkKTsKCiNkZWZpbmUgV0FJVF9GTEFHUyBfX1dBTEwKCnN0 YXRpYyB2b2lkIGxvb3Aodm9pZCkKewogIHNldHVwX2xvb3AoKTsKICBpbnQgaXRlcjsKICBmb3Ig KGl0ZXIgPSAwOzsgaXRlcisrKSB7CiAgICBjaGFyIGN3ZGJ1ZlszMl07CiAgICBzcHJpbnRmKGN3 ZGJ1ZiwgIi4vJWQiLCBpdGVyKTsKICAgIGlmIChta2Rpcihjd2RidWYsIDA3NzcpKQogICAgICBl eGl0KDEpOwogICAgaW50IHBpZCA9IGZvcmsoKTsKICAgIGlmIChwaWQgPCAwKQogICAgICBleGl0 KDEpOwogICAgaWYgKHBpZCA9PSAwKSB7CiAgICAgIGlmIChjaGRpcihjd2RidWYpKQogICAgICAg IGV4aXQoMSk7CiAgICAgIHNldHVwX3Rlc3QoKTsKICAgICAgZXhlY3V0ZV9vbmUoKTsKICAgICAg ZXhpdCgwKTsKICAgIH0KICAgIGludCBzdGF0dXMgPSAwOwogICAgdWludDY0X3Qgc3RhcnQgPSBj dXJyZW50X3RpbWVfbXMoKTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHdhaXRwaWQoLTEsICZz dGF0dXMsIFdOT0hBTkcgfCBXQUlUX0ZMQUdTKSA9PSBwaWQpCiAgICAgICAgYnJlYWs7CiAgICAg IHNsZWVwX21zKDEpOwogICAgICBpZiAoY3VycmVudF90aW1lX21zKCkgLSBzdGFydCA8IDUgKiAx MDAwKQogICAgICAgIGNvbnRpbnVlOwogICAgICBraWxsX2FuZF93YWl0KHBpZCwgJnN0YXR1cyk7 CiAgICAgIGJyZWFrOwogICAgfQogICAgcmVtb3ZlX2Rpcihjd2RidWYpOwogIH0KfQoKdWludDY0 X3QgclszXSA9IHsweGZmZmZmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmZmZiwgMHhmZmZm ZmZmZmZmZmZmZmZmfTsKCnZvaWQgZXhlY3V0ZV9jYWxsKGludCBjYWxsKQp7CiAgaW50cHRyX3Qg cmVzOwogIHN3aXRjaCAoY2FsbCkgewogIGNhc2UgMDoKICAgIHJlcyA9IHN5c2NhbGwoX19OUl9z b2NrZXQsIDJ1bCwgMXVsLCAweDEwNik7CiAgICBpZiAocmVzICE9IC0xKQogICAgICByWzBdID0g cmVzOwogICAgYnJlYWs7CiAgY2FzZSAxOgogICAgcmVzID0gc3lzY2FsbChfX05SX3NvY2tldCwg MnVsLCAxdWwsIDB4MTA2KTsKICAgIGlmIChyZXMgIT0gLTEpCiAgICAgIHJbMV0gPSByZXM7CiAg ICBicmVhazsKICBjYXNlIDI6CiAgICAqKHVpbnQxNl90KikweDIwMDAxM2MwID0gMjsKICAgICoo dWludDE2X3QqKTB4MjAwMDEzYzIgPSBodG9iZTE2KDB4NGUyMCk7CiAgICAqKHVpbnQzMl90Kikw eDIwMDAxM2M0ID0gaHRvYmUzMigweGUwMDAwMDAyKTsKICAgIHN5c2NhbGwoX19OUl9iaW5kLCBy WzFdLCAweDIwMDAxM2MwdWwsIDB4MTB1bCk7CiAgICBicmVhazsKICBjYXNlIDM6CiAgICAqKHVp bnQxNl90KikweDIwMDAwMDQwID0gMjsKICAgICoodWludDE2X3QqKTB4MjAwMDAwNDIgPSBodG9i ZTE2KDApOwogICAgKih1aW50MzJfdCopMHgyMDAwMDA0NCA9IGh0b2JlMzIoMHg3ZjAwMDAwMSk7 CiAgICBzeXNjYWxsKF9fTlJfY29ubmVjdCwgclsxXSwgMHgyMDAwMDA0MHVsLCAweDEwdWwpOwog ICAgYnJlYWs7CiAgY2FzZSA0OgogICAgc3lzY2FsbChfX05SX2xpc3RlbiwgclsxXSwgMyk7CiAg ICBicmVhazsKICBjYXNlIDU6CiAgICByZXMgPSBzeXNjYWxsKF9fTlJfc29ja2V0LCAweGF1bCwg MXVsLCAwKTsKICAgIGlmIChyZXMgIT0gLTEpCiAgICAgIHJbMl0gPSByZXM7CiAgICBicmVhazsK ICBjYXNlIDY6CiAgICBzeXNjYWxsKF9fTlJfaW9jdGwsIHJbMl0sIDB4ODk4MiwgMHVsKTsKICAg IGJyZWFrOwogIGNhc2UgNzoKICAgICoodWludDE2X3QqKTB4MjAwMDAwNDAgPSAyOwogICAgKih1 aW50MTZfdCopMHgyMDAwMDA0MiA9IGh0b2JlMTYoMHg0ZTIwKTsKICAgICoodWludDMyX3QqKTB4 MjAwMDAwNDQgPSBodG9iZTMyKDB4N2YwMDAwMDEpOwogICAgc3lzY2FsbChfX05SX2Nvbm5lY3Qs IHJbMF0sIDB4MjAwMDAwNDB1bCwgMHg0ZHVsKTsKICAgIGJyZWFrOwogIGNhc2UgODoKICAgICoo dWludDY0X3QqKTB4MjAwMDAyODAgPSAwOwogICAgKih1aW50MzJfdCopMHgyMDAwMDI4OCA9IDA7 CiAgICAqKHVpbnQ2NF90KikweDIwMDAwMjkwID0gMHgyMDAwMDAwMDsKICAgICoodWludDY0X3Qq KTB4MjAwMDAwMDAgPSAweDIwMDAwMDgwOwogICAgbWVtY3B5KCh2b2lkKikweDIwMDAwMDgwLCAi XHhmZiIsIDEpOwogICAgKih1aW50NjRfdCopMHgyMDAwMDAwOCA9IDB4ZmYzZTsKICAgICoodWlu dDY0X3QqKTB4MjAwMDAyOTggPSAxOwogICAgKih1aW50NjRfdCopMHgyMDAwMDJhMCA9IDA7CiAg ICAqKHVpbnQ2NF90KikweDIwMDAwMmE4ID0gMDsKICAgICoodWludDMyX3QqKTB4MjAwMDAyYjAg PSAwOwogICAgc3lzY2FsbChfX05SX3NlbmRtc2csIHJbMF0sIDB4MjAwMDAyODB1bCwgMHVsKTsK ICAgIGJyZWFrOwogIH0KfQppbnQgbWFpbih2b2lkKQp7CiAgc3lzY2FsbChfX05SX21tYXAsIDB4 MjAwMDAwMDB1bCwgMHgxMDAwMDAwdWwsIDN1bCwgMHgzMnVsLCAtMSwgMHVsKTsKICBzZXR1cF9i aW5mbXRfbWlzYygpOwogIHVzZV90ZW1wb3JhcnlfZGlyKCk7CiAgZG9fc2FuZGJveF9ub25lKCk7 CiAgcmV0dXJuIDA7Cn0KCg== --===============6791825583879689293==--