From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20871 invoked by alias); 25 Feb 2013 19:53:18 -0000 Received: (qmail 20851 invoked by uid 22791); 25 Feb 2013 19:53:16 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-wg0-f49.google.com (HELO mail-wg0-f49.google.com) (74.125.82.49) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 25 Feb 2013 19:53:08 +0000 Received: by mail-wg0-f49.google.com with SMTP id 15so2683106wgd.28 for ; Mon, 25 Feb 2013 11:53:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type:x-gm-message-state; bh=Ra6HpvYWy8w9QhS5YZvOykNbcVB1xde1zZaMOfgsHgc=; b=ONDxlaI/yx0Y8Iee3ywZbJ40wpWw4oviUNeumc7PJoaiIPTlKSWJeJnpLLCZ3j+8FP 64qA5e/W6Zrqed0o8L9ZP+9xny1gdzaq9+L0By5yDLiiMg5ckCECiK3ugnUntVPgeXZa aSzzYWiu7kQ6lxt4uK78CiYodmT8YjLeKZFQSv05ZBpguX/OGRksRs82CzDEvL/EjyLZ ftvWuWpGkjfmHw8AQyqmyDhlLIpACOCEghE/GVvcFmTwlbP41uNM1tglJkIwXcan7axW 1MOdA5KeISyW/MXaIZvpMJmcS2mSi/LyqByAQh8nEhtqZelKls0Yn0URxC+jiIgeObbi 3Qyw== X-Received: by 10.180.87.98 with SMTP id w2mr14680828wiz.30.1361821986050; Mon, 25 Feb 2013 11:53:06 -0800 (PST) MIME-Version: 1.0 Received: by 10.194.151.232 with HTTP; Mon, 25 Feb 2013 11:52:45 -0800 (PST) In-Reply-To: References: From: Caroline Tice Date: Mon, 25 Feb 2013 19:53:00 -0000 Message-ID: Subject: Re: [PATCH, updated] Vtable pointer verification, runtime library changes (patch 3 of 3) To: GCC Patches , libstdc++@gcc.gnu.org Cc: Diego Novillo , Luis Lozano , Bhaskar Janakiraman Content-Type: multipart/mixed; boundary=f46d04182616b9d22b04d691e32a X-Gm-Message-State: ALoCoQl602fjHk4/b55rFtwWj8PU9bgRZwr1r7D5ZO79saxh3ArXTAvOmrQirUtTlffWfiCzE4ohBCBrYL6Mg+IidqZeCBpkrOC0+Rq1T6nzod8M6R3kZpqY6nltlAmt+1syBr1YZPki2OPbAL49DUS2WvjQGUIHQXS9C+NnkBno747GlQZNJnGHBKfjyFdgXtI8QoiDKSWD X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2013-02/txt/msg01126.txt.bz2 --f46d04182616b9d22b04d691e32a Content-Type: text/plain; charset=ISO-8859-1 Content-length: 2723 I got too excited about being done and forgot to attach the patch. :-( Sorry. Here it is. -- Caroline cmtice@google.com On Mon, Feb 25, 2013 at 11:31 AM, Caroline Tice wrote: > Here are the latest changes to the vtable pointer verification patches > (again there are 3 patches: c++ front end, main gcc, and c++ runtime > library). I think these address all the review comments I have > received so far. This patch is the for C++ runtime library changes. > Please review these changes and let me know if they will be ok to > commit once stage 1 opens. > > -- Caroline Tice > cmtice@google.com > > 2013-02-25 Caroline Tice > > * config/abi/pre/gnu.ver: Add vtable verification runtime functions to > the list of globally visible symbols. > * acinclude.m4: Add GLIBCXX_ENABLE_VTABLE_VERIFY option and comments. > * configure (ENABLE_VTABLE_VERIFY_FALSE, ENABLE_VTABLE_VERIFY_TRUE, > enable_vtable_verify): New definitions. > (predep_objects): Add vtv_start.o. if --enable-vtable-verify=yes was > used. > (postdep_objects): Add vtv_end.o. if --enable-vtable-verify=yes was > used. > Add test for --enable-vtabkle-verify=yes. Add definitions for > ENABLE_VTABLE_VERIFY_FALSE and ENABLE_VTABLE_VERIFY_TRUE. > * src/Makefile.am (libvtv__la_LIBADD): Add definition, conditioned on > ENABLE_VTABLE_VERIFY. > (LIBVTV_FLAGS): Add definition, conditioned on ENABLE_VTABLE_VERIFY. > (libstdc___la_LDFLAGS): Add 'Wl,-u_vtable_map_var_start, > -u_vtable_map_var_end' if ENABLE_VTABLE_VERIFY is true. > (CXXLINK): Add LIBVTV_FLAGS. > * src/Makefile.in: Regenerate from Makefile.am. > * configure.ac (GLIBCXX_ENABLE_VTABLE_VERIFY): New definition. > * libsupc++/vtv_utils.cc: New file. > * libsupc++/vtv_rts.h: New file. > * libsupc++/vtv_map.h: New file. > * libsupc++/vtv_set.h: New file. > * libsupc++/vtv_utils.h: New file. > * libsupc++/vtv_init.cc: New file. > * libsupc++/vtv_malloc.h: New file. > * libsupc++/Makefile.am (sources): Add vtv_rts.cc, vtv_malloc.cc and > vtv_utils.cc to the list. > (vtv_init_sources, vtv_stubs_soruces, libvtv_init_la_sources, > libvtv_stubs_la_sources): New definitions. > (toolexeclib_LTLIBRARIES): Add libvtv_init.la and libvtv_stubs.la. > * libsupc++/Makefile.in: Regenerate from Makefile.am. > * libsupc++/vtv_stubs.cc: New file. > * libsupc++/vtv_malloc.cc: New file. > * libsupc++/vtv_rts.cc: New file. > * libsupc++/vtv_fail.h: New file. --f46d04182616b9d22b04d691e32a Content-Type: application/octet-stream; name="fsf-vtable-verification.v5.runtime.patch" Content-Disposition: attachment; filename="fsf-vtable-verification.v5.runtime.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hdm1mkqp0 Content-length: 163387 SW5kZXg6IGxpYnN0ZGMrKy12My9jb25maWcvYWJpL3ByZS9nbnUudmVyCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYnN0ZGMrKy12My9jb25maWcv YWJpL3ByZS9nbnUudmVyCShyZXZpc2lvbiAxOTYyNjYpCisrKyBsaWJzdGRj KystdjMvY29uZmlnL2FiaS9wcmUvZ251LnZlcgkod29ya2luZyBjb3B5KQpA QCAtMTMzNiw2ICsxMzM2LDE5IEBAIEdMSUJDWFhfMy40LjE4IHsKICAgICAg IHN0ZDo6X19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5OjoqOwogICAg IH07CiAKKyAgICAjIFZpcnR1YWwgdGFibGUgdmVyaWZpY2F0aW9uIHN5bWJv bHMKKyAgICBfWjEyX19WTFRwcm90ZWN0djsKKyAgICBfWjE0X19WTFR1bnBy b3RlY3R2OworICAgIF9aMThfX1ZMVEluaXRTZXRTeW1ib2wqOworICAgIF9a MjNfX1ZMVEluaXRTZXRTeW1ib2xEZWJ1Zyo7CisgICAgX1oxN19fVkxUUmVn aXN0ZXJQYWlyKjsKKyAgICBfWjIyX19WTFRSZWdpc3RlclBhaXJEZWJ1Zyo7 CisgICAgX1oyMV9fVkxUQ2hhbmdlUGVybWlzc2lvbio7CisgICAgX1oyNF9f VkxUVmVyaWZ5VnRhYmxlUG9pbnRlcio7CisgICAgX1oyOV9fVkxUVmVyaWZ5 VnRhYmxlUG9pbnRlckRlYnVnKjsKKyAgICBfWjE3X192dHZfdmVyaWZ5X2Zh aWwqOworICAgIF9aMTdfX3Z0dl9yZWFsbHlfZmFpbCo7CisKICAgICAjIHN0 ZDo6dGhpc190aHJlYWQ6Ol9fc2xlZXBfZm9yCiAgICAgX1pOU3QxMXRoaXNf dGhyZWFkMTFfX3NsZWVwX2Zvcio7CiAKSW5kZXg6IGxpYnN0ZGMrKy12My9h Y2luY2x1ZGUubTQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGlic3Rk YysrLXYzL2FjaW5jbHVkZS5tNAkocmV2aXNpb24gMTk2MjY2KQorKysgbGli c3RkYysrLXYzL2FjaW5jbHVkZS5tNAkod29ya2luZyBjb3B5KQpAQCAtMjIw Miw2ICsyMjAyLDI1IEBAIEFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9FWFRF Uk5fVEVNUExBVEUKIF0pCiAKIGRubAorZG5sIFVzZSB2dGFibGUgdmVyaWZp Y2F0aW9uLgorZG5sCitkbmwgLS1lbmFibGUtdnRhYmxlLXZlcmlmeSBkZWZp bmVzIF9HTElCQ1hYX1ZUQUJMRV9WRVJJRlkgdG8gMQorZG5sIC0tZGlzYWJs ZS12dGFibGUtdmVyaWZ5IGRlZmluZXMgX0dMSUJDWFhfVlRBQkxFX1ZFUklG WSB0byAwCisKK2RubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9WVEFC TEVfVkVSSUZZWyhERUZBVUxUKV0KK2RubCAgICAgICBXaGVyZSBERUZBVUxU IGlzIGB5ZXMnIG9yIGBubycuCitkbmwKK0FDX0RFRlVOKFtHTElCQ1hYX0VO QUJMRV9WVEFCTEVfVkVSSUZZXSwgWworCisgIEdMSUJDWFhfRU5BQkxFKHZ0 YWJsZS12ZXJpZnksJDEsLFtlbmFibGUgdnRhYmxlIHZlcmlmeV0pCisKKyAg QUNfTVNHX0NIRUNLSU5HKFtmb3IgdnRhYmxlIHZlcmlmeSBzdXBwb3J0XSkK KyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV92dGFibGVfdmVyaWZ5XSkKKwor ICBHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9WVEFCTEVfVkVSSUZZLCB0 ZXN0ICRlbmFibGVfdnRhYmxlX3ZlcmlmeSA9IHllcykKK10pCisKK2RubAog ZG5sIENoZWNrIGZvciBwYXJhbGxlbCBtb2RlIHByZS1yZXF1aXNpdGVzLCBp bmNsdWRpbmcgT3Blbk1QIHN1cHBvcnQuCiBkbmwKIGRubCAgKyAgVXNhZ2U6 ICBHTElCQ1hYX0VOQUJMRV9QQVJBTExFTApJbmRleDogbGlic3RkYysrLXYz L2NvbmZpZ3VyZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJzdGRj KystdjMvY29uZmlndXJlCShyZXZpc2lvbiAxOTYyNjYpCisrKyBsaWJzdGRj KystdjMvY29uZmlndXJlCSh3b3JraW5nIGNvcHkpCkBAIC02NDUsNiArNjQ1 LDggQEAgR0xJQkNYWF9MREJMX0NPTVBBVF9GQUxTRQogR0xJQkNYWF9MREJM X0NPTVBBVF9UUlVFCiBFTkFCTEVfVklTSUJJTElUWV9GQUxTRQogRU5BQkxF X1ZJU0lCSUxJVFlfVFJVRQorRU5BQkxFX1ZUQUJMRV9WRVJJRllfRkFMU0UK K0VOQUJMRV9WVEFCTEVfVkVSSUZZX1RSVUUKIGxpYnRvb2xfVkVSU0lPTgog RU5BQkxFX1NZTVZFUlNfU1VOX0ZBTFNFCiBFTkFCTEVfU1lNVkVSU19TVU5f VFJVRQpAQCAtODYyLDYgKzg2NCw3IEBAIGVuYWJsZV9jb25jZXB0X2NoZWNr cwogZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncwogZW5hYmxlX2xpYnN0 ZGN4eF9kZWJ1ZwogZW5hYmxlX2N4eF9mbGFncworZW5hYmxlX3Z0YWJsZV92 ZXJpZnkKIGVuYWJsZV9mdWxseV9keW5hbWljX3N0cmluZwogZW5hYmxlX2V4 dGVybl90ZW1wbGF0ZQogd2l0aF9weXRob25fZGlyCkBAIC0xNTcwLDYgKzE1 NzMsOCBAQCBPcHRpb25hbCBGZWF0dXJlczoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgZW5hYmxlcyB2aXNpYmlsaXR5IHNhZmUgdXNhZ2UgW2RlZmF1 bHQ9eWVzXQogICAtLWVuYWJsZS1saWJzdGRjeHgtdGhyZWFkcwogICAgICAg ICAgICAgICAgICAgICAgICAgICBlbmFibGUgQysrMTEgdGhyZWFkcyBzdXBw b3J0IFtkZWZhdWx0PWF1dG9dCisgIC0tZW5hYmxlLXZ0YWJsZS12ZXJpZnkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIHZ0YWJsZSB2ZXJp ZmljYXRpb24gZmVhdHVyZSBbZGVmYXVsdD1ub10KICAgLS1lbmFibGUtdmVy c2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnMKICAgICAgICAgICAgICAgICAg ICAgICAgICAgU3BlY2lmeSB0aGF0IHJ1bnRpbWUgbGlicmFyaWVzIHNob3Vs ZCBiZSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4g YSBjb21waWxlci1zcGVjaWZpYyBkaXJlY3RvcnkKQEAgLTEzMjA2LDggKzEz MjExLDE0IEBAICRhc19lY2hvICIkbGRfc2hsaWJzX0NYWCIgPiY2OyB9CiAg ICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhl bSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKICAgICAjIyB3aGF0 IHlvdSBhcmUgZG9pbmcuLi4KICAgICAjIERlcGVuZGVuY2llcyB0byBwbGFj ZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgot cHJlZGVwX29iamVjdHNfQ1hYPQotcG9zdGRlcF9vYmplY3RzX0NYWD0KK2lm IHRlc3QgJGVuYWJsZV92dGFibGVfdmVyaWZ5ID0geWVzOyB0aGVuCisgIHBy ZWRlcF9vYmplY3RzX0NYWD0iJHtnbGliY3h4X2J1aWxkZGlyfS8uLi9saWJn Y2MvdnR2X3N0YXJ0Lm8iCisgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiR7Z2xp YmN4eF9idWlsZGRpcn0vLi4vbGliZ2NjL3Z0dl9lbmQubyIKK2Vsc2UKKyAg cHJlZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwX29iamVjdHNfQ1hYPQor ZmkKKwogcHJlZGVwc19DWFg9CiBwb3N0ZGVwc19DWFg9CiBjb21waWxlcl9s aWJfc2VhcmNoX3BhdGhfQ1hYPQpAQCAtMTcyMTAsOCArMTcyMjEsNiBAQCBl bHNlCiAgIGVuYWJsZV9saWJzdGRjeHhfZGVidWdfZmxhZ3M9Ii1nZHdhcmYt NCAtZzMgLU8wIgogZmkKIAotCi0KICAgIyBPcHRpb24gcGFyc2VkLCBub3cg c2V0IHRoaW5ncyBhcHByb3ByaWF0ZWx5CiAgIERFQlVHX0ZMQUdTPSIkZW5h YmxlX2xpYnN0ZGN4eF9kZWJ1Z19mbGFncyIKIApAQCAtMTcyMzksNiArMTcy NDgsMjEgQEAgZmkKICRhc19lY2hvICIkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1 ZyIgPiY2OyB9CiAKIAorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12 dGFibGUtdmVyaWZ5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3Z0 YWJsZV92ZXJpZnkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9 JGVuYWJsZV92dGFibGVfdmVyaWZ5OworICAgICAgY2FzZSAiJGVuYWJsZXZh bCIgaW4KKyAgICAgICB5ZXN8bm8pIDs7CisgICAgICAgKikgYXNfZm5fZXJy b3IgIkFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlIHZ0YWJsZS12ZXJpZnkg bXVzdCBiZSB5ZXMgb3Igbm8iICIkTElORU5PIiA1IDs7CisgICAgICBlc2Fj CisKK2Vsc2UKKyAgZW5hYmxlX3Z0YWJsZV92ZXJpZnk9bm8KK2ZpCisKKwor ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl c3VsdDogJGVuYWJsZV92dGFibGVfdmVyaWZ5IiA+JjUKKyRhc19lY2hvICIk ZW5hYmxlX3Z0YWJsZV92ZXJpZnkiID4mNjsgfQogCiAKICAgZW5hYmxlX3Bh cmFsbGVsPW5vOwpAQCAtNzI4NDksNiArNzI4NzMsMTMgQEAgZWxzZQogZmkK IAogCisgICAgaWYgdGVzdCAkZW5hYmxlX3Z0YWJsZV92ZXJpZnkgPSB5ZXM7 IHRoZW4KKyAgRU5BQkxFX1ZUQUJMRV9WRVJJRllfVFJVRT0KKyAgRU5BQkxF X1ZUQUJMRV9WRVJJRllfRkFMU0U9JyMnCitlbHNlCisgIEVOQUJMRV9WVEFC TEVfVkVSSUZZX1RSVUU9JyMnCisgIEVOQUJMRV9WVEFCTEVfVkVSSUZZX0ZB TFNFPQorZmkKIAogCiBjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKQEAgLTcz MjE3LDYgKzczMjQ4LDEwIEBAIGlmIHRlc3QgLXogIiR7R0xJQkNYWF9CVUlM RF9ERUJVR19UUlVFfSIKICAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwi R0xJQkNYWF9CVUlMRF9ERUJVR1wiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1 YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNv bmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQogZmkKK2lmIHRlc3QgLXogIiR7 RU5BQkxFX1ZUQUJMRV9WRVJJRllfVFJVRX0iICYmIHRlc3QgLXogIiR7RU5B QkxFX1ZUQUJMRV9WRVJJRllfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJv ciAiY29uZGl0aW9uYWwgXCJFTkFCTEVfVlRBQkxFX1ZFUklGWVwiIHdhcyBu ZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3 YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQor ZmkKIGlmIHRlc3QgLXogIiR7RU5BQkxFX0VYVEVSTl9URU1QTEFURV9UUlVF fSIgJiYgdGVzdCAteiAiJHtFTkFCTEVfRVhURVJOX1RFTVBMQVRFX0ZBTFNF fSI7IHRoZW4KICAgYXNfZm5fZXJyb3IgImNvbmRpdGlvbmFsIFwiRU5BQkxF X0VYVEVSTl9URU1QTEFURVwiIHdhcyBuZXZlciBkZWZpbmVkLgogVXN1YWxs eSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRp dGlvbmFsbHkuIiAiJExJTkVOTyIgNQpJbmRleDogbGlic3RkYysrLXYzL3Ny Yy9NYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJz dGRjKystdjMvc3JjL01ha2VmaWxlLmFtCShyZXZpc2lvbiAxOTYyNjYpCisr KyBsaWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkp CkBAIC02NiwxMiArNjYsMjMgQEAgbGlic3RkY19fX2xhX0RFUEVOREVOQ0lF UyA9IFwKIAkkKHRvcF9idWlsZGRpcikvc3JjL2MrKzk4L2xpYmMrKzk4Y29u dmVuaWVuY2UubGEgXAogCSQodG9wX2J1aWxkZGlyKS9zcmMvYysrMTEvbGli YysrMTFjb252ZW5pZW5jZS5sYQogCitpZiBFTkFCTEVfVlRBQkxFX1ZFUklG WQorbGlic3RkY19fX2xhX0xERkxBR1MgPSBcCisJLXZlcnNpb24taW5mbyAk KGxpYnRvb2xfVkVSU0lPTikgJHt2ZXJzaW9uX2FyZ30gLWxtIC1XbCwtdV92 dGFibGVfbWFwX3ZhcnNfc3RhcnQsLXVfdnRhYmxlX21hcF92YXJzX2VuZAor CitsaWJ2dHZfX19sYV9MSUJBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xp YnN1cGMrKy8ubGlicworTElCVlRWX0ZMQUdTID0gXAorCS1MJChsaWJ2dHZf X19sYV9MSUJBREQpIC0td2hvbGUtYXJjaGl2ZSAtbHZ0dl9pbml0IC0tbm8t d2hvbGUtYXJjaGl2ZQorZWxzZQogbGlic3RkY19fX2xhX0xERkxBR1MgPSBc CiAJLXZlcnNpb24taW5mbyAkKGxpYnRvb2xfVkVSU0lPTikgJHt2ZXJzaW9u X2FyZ30gLWxtCitsaWJ2dHZfX19sYV9MSUJBREQgPQorTElCVlRWX0ZMQUdT ID0KK2VuZGlmCiAKIGxpYnN0ZGNfX19sYV9MSU5LID0gJChDWFhMSU5LKSAk KGxpYnN0ZGNfX19sYV9MREZMQUdTKQogCi0KICMgVXNlIHNwZWNpYWwgcnVs ZXMgZm9yIGNvbXBhdGliaWxpdHktbGRibC5jYyBjb21waWxhdGlvbiwgYXMg d2UgbmVlZCB0bwogIyBwYXNzIC1tbG9uZy1kb3VibGUtNjQuCiBpZiBHTElC Q1hYX0xEQkxfQ09NUEFUCkBAIC0xNzMsNiArMTg0LDcgQEAgQ1hYTElOSyA9 IFwKIAkkKExJQlRPT0wpIC0tdGFnIENYWCBcCiAJJChBTV9MSUJUT09MRkxB R1MpICQoTElCVE9PTEZMQUdTKSBcCiAJLS1tb2RlPWxpbmsgJChDWFgpIFwK KwkkKExJQlZUVl9GTEFHUykgXAogCSQoT1BUX0xERkxBR1MpICQoU0VDVElP Tl9MREZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKExUTERGTEFHUykgLW8gJEAK IAogCkluZGV4OiBsaWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGxpYnN0ZGMrKy12My9zcmMvTWFrZWZp bGUuaW4JKHJldmlzaW9uIDE5NjI2NikKKysrIGxpYnN0ZGMrKy12My9zcmMv TWFrZWZpbGUuaW4JKHdvcmtpbmcgY29weSkKQEAgLTM2Niw4ICszNjYsMTkg QEAgbGlic3RkY19fX2xhX0RFUEVOREVOQ0lFUyA9IFwKIAkkKHRvcF9idWls ZGRpcikvc3JjL2MrKzk4L2xpYmMrKzk4Y29udmVuaWVuY2UubGEgXAogCSQo dG9wX2J1aWxkZGlyKS9zcmMvYysrMTEvbGliYysrMTFjb252ZW5pZW5jZS5s YQogCi1saWJzdGRjX19fbGFfTERGTEFHUyA9IFwKLQktdmVyc2lvbi1pbmZv ICQobGlidG9vbF9WRVJTSU9OKSAke3ZlcnNpb25fYXJnfSAtbG0KK0BFTkFC TEVfVlRBQkxFX1ZFUklGWV9GQUxTRUBsaWJzdGRjX19fbGFfTERGTEFHUyA9 IFwKK0BFTkFCTEVfVlRBQkxFX1ZFUklGWV9GQUxTRUAJLXZlcnNpb24taW5m byAkKGxpYnRvb2xfVkVSU0lPTikgJHt2ZXJzaW9uX2FyZ30gLWxtCisKK0BF TkFCTEVfVlRBQkxFX1ZFUklGWV9UUlVFQGxpYnN0ZGNfX19sYV9MREZMQUdT ID0gXAorQEVOQUJMRV9WVEFCTEVfVkVSSUZZX1RSVUVACS12ZXJzaW9uLWlu Zm8gJChsaWJ0b29sX1ZFUlNJT04pICR7dmVyc2lvbl9hcmd9IC1sbSAtV2ws LXVfdnRhYmxlX21hcF92YXJzX3N0YXJ0LC11X3Z0YWJsZV9tYXBfdmFyc19l bmQKKworQEVOQUJMRV9WVEFCTEVfVkVSSUZZX0ZBTFNFQGxpYnZ0dl9fX2xh X0xJQkFERCA9IAorQEVOQUJMRV9WVEFCTEVfVkVSSUZZX1RSVUVAbGlidnR2 X19fbGFfTElCQUREID0gXAorQEVOQUJMRV9WVEFCTEVfVkVSSUZZX1RSVUVA CSQodG9wX2J1aWxkZGlyKS9saWJzdXBjKysvLmxpYnMKKworQEVOQUJMRV9W VEFCTEVfVkVSSUZZX0ZBTFNFQExJQlZUVl9GTEFHUyA9IAorQEVOQUJMRV9W VEFCTEVfVkVSSUZZX1RSVUVATElCVlRWX0ZMQUdTID0gXAorQEVOQUJMRV9W VEFCTEVfVkVSSUZZX1RSVUVACS1MJChsaWJ2dHZfX19sYV9MSUJBREQpIC0t d2hvbGUtYXJjaGl2ZSAtbHZ0dl9pbml0IC0tbm8td2hvbGUtYXJjaGl2ZQog CiBsaWJzdGRjX19fbGFfTElOSyA9ICQoQ1hYTElOSykgJChsaWJzdGRjX19f bGFfTERGTEFHUykKIApAQCAtNDQ4LDYgKzQ1OSw3IEBAIENYWExJTksgPSBc CiAJJChMSUJUT09MKSAtLXRhZyBDWFggXAogCSQoQU1fTElCVE9PTEZMQUdT KSAkKExJQlRPT0xGTEFHUykgXAogCS0tbW9kZT1saW5rICQoQ1hYKSBcCisJ JChMSUJWVFZfRkxBR1MpIFwKIAkkKE9QVF9MREZMQUdTKSAkKFNFQ1RJT05f TERGTEFHUykgJChBTV9DWFhGTEFHUykgJChMVExERkxBR1MpIC1vICRACiAK IEBFTkFCTEVfU1lNVkVSU19UUlVFQENMRUFORklMRVMgPSBsaWJzdGRjKyst c3ltYm9scy52ZXIgJCh2ZXJzaW9uX2RlcCkKSW5kZXg6IGxpYnN0ZGMrKy12 My9jb25maWd1cmUuYWMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGli c3RkYysrLXYzL2NvbmZpZ3VyZS5hYwkocmV2aXNpb24gMTk2MjY2KQorKysg bGlic3RkYysrLXYzL2NvbmZpZ3VyZS5hYwkod29ya2luZyBjb3B5KQpAQCAt MTYwLDcgKzE2MCw3IEBAIEdMSUJDWFhfRU5BQkxFX0xPTkdfTE9ORyhbeWVz XSkKIEdMSUJDWFhfRU5BQkxFX1dDSEFSX1QoW3llc10pCiBHTElCQ1hYX0VO QUJMRV9DOTkoW3llc10pCiBHTElCQ1hYX0VOQUJMRV9DT05DRVBUX0NIRUNL Uyhbbm9dKQotR0xJQkNYWF9FTkFCTEVfREVCVUdfRkxBR1MoWyItZ2R3YXJm LTQgLWczIC1PMCJdKQorR0xJQkNYWF9FTkFCTEVfREVCVUdfRkxBR1MoWyIt Z2R3YXJmLTMgLWczIC1PMCJdKQogR0xJQkNYWF9FTkFCTEVfREVCVUcoW25v XSkKIEdMSUJDWFhfRU5BQkxFX1BBUkFMTEVMKFt5ZXNdKQogR0xJQkNYWF9F TkFCTEVfQ1hYX0ZMQUdTCkBAIC0xNjgsNiArMTY4LDcgQEAgR0xJQkNYWF9F TkFCTEVfRlVMTFlfRFlOQU1JQ19TVFJJTkcoW25vXQogR0xJQkNYWF9FTkFC TEVfRVhURVJOX1RFTVBMQVRFKFt5ZXNdKQogR0xJQkNYWF9FTkFCTEVfUFlU SE9OCiBHTElCQ1hYX0VOQUJMRV9XRVJST1IoW3llc10pCitHTElCQ1hYX0VO QUJMRV9WVEFCTEVfVkVSSUZZKFtOT10pCiAKICMgQ2hlY2tzIGZvciBvcGVy YXRpbmcgc3lzdGVtcyBzdXBwb3J0IHRoYXQgZG9lc24ndCByZXF1aXJlIGxp bmtpbmcuCiBHTElCQ1hYX0NIRUNLX1NURElPX1BST1RPCkluZGV4OiBsaWJz dGRjKystdjMvbGlic3VwYysrL3Z0dl91dGlscy5jYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBsaWJzdGRjKystdjMvbGlic3VwYysrL3Z0dl91dGls cy5jYwkocmV2aXNpb24gMCkKKysrIGxpYnN0ZGMrKy12My9saWJzdXBjKysv dnR2X3V0aWxzLmNjCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEwNiBAQAor LyogQ29weXJpZ2h0IChDKSAyMDEyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBH Q0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAg IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9u LgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2Yg R1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAg IHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGli cmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVu dGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh bTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVO VElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogVGhpcyBmaWxlIGlz IHBhcnQgb2YgdGhlIHZ0YWJsZSB2ZXJpY2F0aW9uIHJ1bnRpbWUgbGlicmFy eSAoc2VlCisgICBjb21tZW50cyBpbiB2dHZfcnRzLmNjIGZvciBtb3JlIGlu Zm9ybWF0aW9uIGFib3V0IHZ0YWJsZQorICAgdmVyaWZpY2F0aW9uKS4gIFRo aXMgZmlsZSBjb250YWlucyBsb2cgZmlsZSB1dGlsaXRpZXMuICAqLworCisj aW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4K KyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lu Y2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVk ZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUg InZ0dl91dGlscy5oIgorCisvKiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW50 byB3aGljaCBhbGwgdnRhYmxlIHZlcmljYXRpb24gbG9nIGZpbGVzCisgICBn ZXQgd3JpdHRlbi4gICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxv Z3NfZGlyID0gIi90bXAvdnR2X2xvZ3MiOworCisKKy8qIFRoaXMgZnVuY3Rp b24gdGFrZXMgdGhlIE5BTUUgb2YgYSBsb2cgZmlsZSB0byBvcGVuLCBhdHRl bXB0cyB0bworICAgb3BlbiBpdCBpbiB0aGUgbG9nc19kaXIgZGlyZWN0b3J5 LCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgIGRlY3JpcHRv ci4gICovCisKK2ludAordnR2X29wZW5fbG9nIChjb25zdCBjaGFyICpuYW1l KQoreworICBjaGFyIGxvZ19uYW1lWzI1Nl07CisgIHNucHJpbnRmIChsb2df bmFtZSwgc2l6ZW9mIChsb2dfbmFtZSksICIlcy8lcyIsIGxvZ3NfZGlyLCBu YW1lKTsKKyAgbWtkaXIgKGxvZ3NfZGlyLCBTX0lSV1hVKTsKKyAgaW50IGZk ID0gb3BlbiAobG9nX25hbWUsIE9fV1JPTkxZIHwgT19BUFBFTkQgfCBPX0NS RUFULCBTX0lSV1hVKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHZ0dl9hZGRf dG9fbG9nICgyLCAiQ2Fubm90IG9wZW4gbG9nIGZpbGUgJXMgJXNcbiIsIG5h bWUsCisJCSAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgcmV0dXJuIGZkOwor fQorCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZmlsZSBkZXNjcmlwdG9y IChGRCkgYW5kIGEgc3RyaW5nIChTVFIpIGFuZAorICAgdHJpZXMgdG8gd3Jp dGUgdGhlIHN0cmluZyB0byB0aGUgZmlsZS4gICovCisKK3N0YXRpYyBpbnQK K3Z0dl9sb2dfd3JpdGUgKGludCBmZCwgY29uc3QgY2hhciAqc3RyKQorewor ICBpZiAod3JpdGUgKGZkLCBzdHIsIHN0cmxlbiAoc3RyKSkgIT0gLTEpCisg ICAgcmV0dXJuIDA7CisKKyAgaWYgKGZkICE9IDIpIC8qIE1ha2Ugc3VyZSB3 ZSBkb250IGdldCBpbiBhIGxvb3AuICAqLworICAgIHZ0dl9hZGRfdG9fbG9n ICgyLCAiRXJyb3Igd3JpdGluZyB0byBsb2c6ICVzXG4iLCBzdHJlcnJvciAo ZXJybm8pKTsKKyAgcmV0dXJuIC0xOworfQorCisKKy8qIFRoaXMgZnVuY3Rp b24gdGFrZXMgYSBmaWxlIGRlY3JpcHRvciAoTE9HX0ZJTEUpIGFuZCBhbiBv dXRwdXQKKyBmb3JtYXQgc3RyaW5nIChGT1JNQVQpLCBmb2xsb3dlZCBieSB6 ZXJvIG9yIG1vcmUgcHJpbnQgZm9ybWF0CisgYXJndW1lbnRzICh0aGUgc2Ft ZSBhcyBmcHJpbnRmLCBmb3IgZXhhbXBsZSkuICBJdCBnZXRzIHRoZSBjdXJy ZW50CisgcHJvY2VzcyBJRCBhbmQgUFBJRCwgcHJlLXBlbmRzIHRoZW0gdG8g dGhlIGZvcm1hdHRlZCBtZXNzYWdlLCBhbmQKKyB3cml0ZXMgd3JpdGUgaXQg b3V0IHRvIHRoZSBsb2cgZmlsZSByZWZlcmVuY2VkIGJ5IExPR19GSUxFIHZp YSBjYWxsZXMKKyB0byB2dHZfbG9nX3dyaXRlLiAgKi8KKworaW50Cit2dHZf YWRkX3RvX2xvZyAoaW50IGxvZ19maWxlLCBjb25zdCBjaGFyICogZm9ybWF0 LCAuLi4pCit7CisgIC8qIFdlIGRvbnQgd2FudCB0byBkeW5hbWljYWxseSBh bGxvY2F0ZSB0aGlzIGJ1ZmZlci4gVGhpcyBzaG91bGQgYmUKKyAgICAgbW9y ZSB0aGFuIGVub3VnaCBpbiBtb3N0IGNhc2VzLiBJdCBpZiBpc24ndCB3ZSBh cmUgY2FyZWZ1bCBub3QgdG8KKyAgICAgZG8gYSBidWZmZXIgb3ZlcmZsb3cu ICAqLworICBjaGFyIG91dHB1dFsxMDI0XTsKKworICB2YV9saXN0IGFwOwor ICB2YV9zdGFydCAoYXAsIGZvcm1hdCk7CisKKyAgc25wcmludGYgKG91dHB1 dCwgc2l6ZW9mIChvdXRwdXQpLCAiVlRWOiBQSUQ9JWQgUFBJRD0lZCAiLCBn ZXRwaWQgKCksCisJICAgIGdldHBwaWQgKCkpOworICB2dHZfbG9nX3dyaXRl IChsb2dfZmlsZSwgb3V0cHV0KTsKKyAgdnNucHJpbnRmIChvdXRwdXQsIHNp emVvZiAob3V0cHV0KSwgZm9ybWF0LCBhcCk7CisgIHZ0dl9sb2dfd3JpdGUg KGxvZ19maWxlLCBvdXRwdXQpOworCisgIC8qIGZkYXRhc3luYyBpcyBxdWl0 ZSBleHBlbnNpdmUuIE9ubHkgZW5hYmxlIGlmIHlvdSBzdXNwZWN0IHlvdSBh cmUKKyAgICAgbG9vc2luZyBsb2cgZGF0YSBpbiBpbiBhIHByb2dyYW0gY3Jh c2g/ICAqLworICAvKiAgZmRhdGFzeW5jKGxvZ19maWxlKTsgICovCisKKyAg cmV0dXJuIDA7Cit9CkluZGV4OiBsaWJzdGRjKystdjMvbGlic3VwYysrL3Z0 dl9ydHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJzdGRjKyst djMvbGlic3VwYysrL3Z0dl9ydHMuaAkocmV2aXNpb24gMCkKKysrIGxpYnN0 ZGMrKy12My9saWJzdXBjKysvdnR2X3J0cy5oCShyZXZpc2lvbiAwKQpAQCAt MCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIKKy8vIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0 IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8v IGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBV bmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFu dGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0 aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8v IDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBj b3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9u ZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlO RzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3Qs IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisj aWZuZGVmIF9WVFZfUlRTX0gKKyNkZWZpbmUgX1ZUVl9SVFNfSCAxCisKKyNp bmNsdWRlIDxjc3RkbGliPgorCisvKiBUaGlzIHByb3RvdHlwZSBuZWVkcyB0 byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgY29tcGlsZXItCisgICBnZW5l cmF0ZWQgZGVjbGFyYXRpb24gaW4gdnRhYmxlLWNsYXNzLWhpZXJhcmNoeS5j LiAgKi8KKworLyogV2UgY291bGQgaGF2ZSB1c2VkIGFuIGVudW1lcmF0aW9u IGhlcmUgYnV0IGl0IGp1c3QgbWFrZXMgaXQgbW9yZQorICAgZGlmZmljdWx0 IGZvciB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYSBjYWxsIHRvIHRoaXMu ICAqLworI2RlZmluZSBfX1ZMVFBfUkVBRF9PTkxZICAwCisjZGVmaW5lIF9f VkxUUF9SRUFEX1dSSVRFIDEKKworZXh0ZXJuIHZvaWQgX19WTFRDaGFuZ2VQ ZXJtaXNzaW9uIChpbnQpOworZXh0ZXJuIHZvaWQgX19WTFRSZWdpc3RlclBh aXIgICAgICAodm9pZCAqKiwgY29uc3Qgdm9pZCAqKTsKK2V4dGVybiB2b2lk IF9fVkxUUmVnaXN0ZXJQYWlyRGVidWcgKHZvaWQgKiosIGNvbnN0IHZvaWQg KiwgY29uc3QgY2hhciAqLAorCQkJCSAgICBjb25zdCBjaGFyICopOworZXh0 ZXJuIGNvbnN0IHZvaWQgKl9fVkxUVmVyaWZ5VnRhYmxlUG9pbnRlciAgICAg ICh2b2lkICoqLCBjb25zdCB2b2lkICopOworZXh0ZXJuIGNvbnN0IHZvaWQg Kl9fVkxUVmVyaWZ5VnRhYmxlUG9pbnRlckRlYnVnICh2b2lkICoqLCBjb25z dCB2b2lkICosCisJCQkJCQkgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAq KTsKK2V4dGVybiB2b2lkIF9fVkxUSW5pdFNldFN5bWJvbERlYnVnICh2b2lk ICoqLCBjb25zdCB2b2lkICosIHN0ZDo6c2l6ZV90KTsKK2V4dGVybiB2b2lk IF9fVkxUSW5pdFNldFN5bWJvbCAgICAgICh2b2lkICoqLCBjb25zdCB2b2lk ICosIHN0ZDo6c2l6ZV90ICk7CisKKyNlbmRpZiAvKiBfVlRWX1JUU19IICov CkluZGV4OiBsaWJzdGRjKystdjMvbGlic3VwYysrL3Z0dl9tYXAuaAo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJzdGRjKystdjMvbGlic3VwYysr L3Z0dl9tYXAuaAkocmV2aXNpb24gMCkKKysrIGxpYnN0ZGMrKy12My9saWJz dXBjKysvdnR2X21hcC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMxMSBA QAorLyogQ29weXJpZ2h0IChDKSAyMDEyCisgICBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisg ICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK KyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJz aW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcg b2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwK KyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUg TGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0Mg UnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJv Z3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcu UlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6 Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfVlRW X01BUF9ICisjZGVmaW5lIF9WVFZfTUFQX0ggMQorCisjaW5jbHVkZSA8c3Ry aW5nLmg+CisjaW5jbHVkZSA8dnR2X3V0aWxzLmg+CisKK2lubGluZSB1aW50 NjRfdAorbG9hZDhieXRlcyAoY29uc3Qgdm9pZCAqcCkKK3sKKyAgdWludDY0 X3QgcmVzdWx0OworICBtZW1jcHkgKCZyZXN1bHQsIHAsIDgpOworICByZXR1 cm4gcmVzdWx0OworfQorCisvKiBJbnNlcnRfb25seV9oYXNoX21hcCBtYXBz IGtleXMgdG8gdmFsdWVzLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGEKKyAg IGJhc2ljIGhhc2ggdGFibGUgd2l0aCBvcGVuIGFkZHJlc3NpbmcuICBUaGUg a2V5cyBhcmUgbm90ICJvd25lZCIgYnkKKyAgIHRoZSB0YWJsZTsgaXQgb25s eSBzdG9yZXMgcG9pbnRlcnMgdG8ga2V5cy4gIFRoZSBrZXkgdHlwZSBpcwor ICAgc3BlY2lmaWVkIGJlbG93IChzZWUgaW5zZXJ0X29ubHlfaGFzaF9tYXA6 OmtleV90eXBlKSBhbmQgaXMsCisgICByb3VnaGx5IHNwZWFraW5nLCBhIHN0 cmluZyBvZiBhbnkgbGVuZ3RoIHdpdGggdGhlIHN0cmluZyBsZW5ndGggYW5k CisgICBhIGhhc2ggY29kZSBzdG9yZWQgYXQgdGhlIGZyb250LiAgVGhlIGNv ZGUgaGVyZSBkb2VzIG5vdCBjb21wdXRlCisgICBhbnkgaGFzaCBjb2Rlcywg YnV0IHJhdGhlciB1c2VzIHdoYXQncyBnaXZlbi4gICovCisKK3RlbXBsYXRl PHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jPgorY2xhc3MgaW5zZXJ0X29u bHlfaGFzaF9tYXAKKyAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYg c2l6ZV90IHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBl OworICAgICAgdHlwZWRlZiBBbGxvYyBhbGxvY190eXBlOworICAgICAgZW51 bSB7IG1pbl9jYXBhY2l0eSA9IDQgfTsKKyNpZiBIQVNITUFQX1NUQVRTCisg IGVudW0geyBzdGF0cyA9IHRydWUgfTsKKyNlbHNlCisgIGVudW0geyBzdGF0 cyA9IGZhbHNlIH07CisjZW5kaWYKKworICAvKiBLZXlzIGFyZSBhIGJ5dGUg c3RyaW5nICh1cCB0byAyXjMyIC0gMSBsb25nKSBwbHVzIGEgdWludDMyX3QK KyAgICAgdGhhdCdzIHVzZWQgYXMgYSBoYXNoIGNvZGUuICBUaGUgbGF0dGVy IGNhbiBlbmNvZGUgYXJiaXRyYXJ5CisgICAgIGluZm9ybWF0aW9uIGF0IHRo ZSBjbGllbnQncyBkaXNjcmV0aW9uLCBzbywgZS5nLiwgbXVsdGlwbGUga2V5 cworICAgICB0aGF0IGFyZSB0aGUgc2FtZSBzdHJpbmcgc3RpbGwgImRpZmZl ciIgaWYgdGhlIGhhc2ggY29kZXMgZGlmZmVyLgorICAgICBLZXlzIGFyZSBl cXVhbCBpZiB0aGUgZmlyc3QgOCBieXRlcyBhcmUgZXF1YWwgYW5kIHRoZSBu ZXh0IG4KKyAgICAgYnl0ZXMgYXJlIGVxdWFsLiAgKi8KKyAgc3RydWN0IGtl eV90eXBlCisgIHsKKyAgICB1aW50MzJfdCBuOworICAgIHVpbnQzMl90IGhh c2g7CisgICAgY2hhciBieXRlc1swXTsKKworICAgIGJvb2wKKyAgICBlcXVh bHMgKGNvbnN0IGtleV90eXBlICprKSBjb25zdDsKKyAgfTsKKworICAvKiBD cmVhdGUgYW4gZW1wdHkgbWFwIHdpdGggYSByZWFzb25hYmxlIG51bWJlciBv ZiBidWNrZXRzIGZvciB0aGUKKyAgICAgZXhwZWN0ZWQgc2l6ZS4gIFJldHVy bnMgTlVMTCBpZiB0aGUgYWxsb2NhdG9yIGZhaWxzLiAgKi8KKworICBzdGF0 aWMgaW5zZXJ0X29ubHlfaGFzaF9tYXAgKgorICBjcmVhdGUgKHNpemVfdHlw ZSBleHBlY3RlZF9zaXplKTsKKworICAvKiBUaGUgb3Bwb3NpdGUgb2YgY3Jl YXRlKCkuICBGcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSBnaXZlbiBtYXAuICAq LworCisgIHN0YXRpYyB2b2lkCisgIGRlc3Ryb3kgKGluc2VydF9vbmx5X2hh c2hfbWFwICptKQorICB7IEFsbG9jKCkuZGVhbGxvYyAobSwgbS0+c2l6ZV9p bl9ieXRlc18pOyB9CisKKyAgLyogUmV0dXJuIGEgbWFwIGlkZW50aWNhbCB0 byB0aGlzIGV4Y2VwdCB0aGF0ICprIGlzIG1hcHBlZCB0byB2LgorICAgICBU eXBjaWFsbHkgaXQncyBkb25lIGJ5IG1vZGlmeWluZyB0aGlzIGluIHBsYWNl LCBidXQgaWYgYSByZXNpemUKKyAgICAgaXMgbmVjZXNzYXJ5IHRoZW4gdGhp cyBpcyBkZWFsbG9jYXRlZCBhbmQgYSBuZXcgbWFwIGlzIHJldHVybmVkLgor ICAgICBSZXF1aXJlcyBrIHRvIGJlIG5vbi1OVUxMLiAgRG9lcyBub3RoaW5n IGFuZCByZXR1cm5zIE5VTEwgaWYgdGhlCisgICAgIGFsbG9jYXRvciBmYWls cy4gICovCisKKyAgaW5zZXJ0X29ubHlfaGFzaF9tYXAqCisgIHB1dCAoY29u c3Qga2V5X3R5cGUgKmssIGNvbnN0IHZhbHVlX3R5cGUgJnYpCisgIHsgcmV0 dXJuIHRoaXMtPnB1dF9pbnRlcm5hbCAoaywgdiwgZmFsc2UpOyB9CisKKyAg LyogSWYgKmsgaXMgYSBrZXkgaW4gdGhpcyB0aGVuIHNldCAqdiB0byBwb2lu dCB0byB0aGUgY29ycmVzcG9uZGluZworICAgICB2YWx1ZS4gIE90aGVyd2lz ZSwgZG8gdGhlIGVxdWl2YWxlbnQgb2YgaW5zZXJ0KGssIHZhbHVlX3R5cGUo KSkKKyAgICAgYW5kLCBpZiB0aGF0IHN1Y2NlZWRzLCBzZXQgKnYgdG8gcG9p bnQgdG8gdGhlIGluc2VydGVkIHZhbHVlLgorICAgICBSZXF1aXJlcyBrIHRv IGJlIG5vbi1OVUxMLiAgRG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIE5VTEwg aWYgdGhlCisgICAgIGFsbG9jYXRvciBmYWlscy4gIFR5cGljYWxseSByZXR1 cm5zIHRoaXMsIGJ1dCB3aWxsIHJldHVybiBhIG5ldworICAgICBpbnNlcnRf b25seV9oYXNoX21hcCBpZiBhIHJlc2l6ZSBvY2N1cnMuICBJZiB0aGUgcmV0 dXJuIHZhbHVlIGlzCisgICAgIG5vbi1OVUxMLCAqdiBpcyBzZXQgYW5kIGl0 J3MgdmFsaWQgdW50aWwgYSByZXNpemUgb2YgdGhlIG1hcCB0aGF0CisgICAg IGlzIHRoZSByZXR1cm4gdmFsdWUuICAqLworCisgIGluc2VydF9vbmx5X2hh c2hfbWFwICoKKyAgZmluZF9vcl9hZGRfa2V5IChjb25zdCBrZXlfdHlwZSAq aywgdmFsdWVfdHlwZSAqKnYpOworCisgIC8qIEdldCB0aGUgdmFsdWUgY29y cmVzcG9uZGluZyB0byAqay4gIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpcwor ICAgICBub25lLiAgUmVxdWlyZXMgayB0byBiZSBub24tTlVMTC4gIFRoZSBy ZXR1cm4gdmFsdWUgaXMgdmFsaWQKKyAgICAgdW50aWwgYW55IHJlc2l6ZS4g ICovCisgIGNvbnN0IHZhbHVlX3R5cGUgKmdldCAoY29uc3Qga2V5X3R5cGUg KmspIGNvbnN0OworCisgIHNpemVfdHlwZQorICBzaXplICgpIGNvbnN0Cisg IHsgcmV0dXJuIG51bV9lbnRyaWVzXzsgfQorCisgIGJvb2wKKyAgZW1wdHkg KCkgY29uc3QKKyAgeyByZXR1cm4gdGhpcy0+c2l6ZSAoKSA9PSAwOyB9CisK KyAgc2l6ZV90eXBlCisgIGJ1Y2tldF9jb3VudCAoKSBjb25zdAorICB7IHJl dHVybiBudW1fYnVja2V0c187IH0KKworIHByaXZhdGU6CisgIHR5cGVkZWYg c3RkOjpwYWlyIDxjb25zdCBrZXlfdHlwZSAqLCB2YWx1ZV90eXBlPiBidWNr ZXRfdHlwZTsKKworICBpbnNlcnRfb25seV9oYXNoX21hcCAqcHV0X2ludGVy bmFsIChjb25zdCBrZXlfdHlwZSAqLCBjb25zdCB2YWx1ZV90eXBlICYsCisJ CQkJICAgICAgYm9vbCk7CisKKyAgLyogVGhpcyBmdW5jdGlvbiBkZXRlcm1p bmVzIHdoZW4gdG8gcmVzaXplIHRoZSB0YWJsZS4gICovCisgIGJvb2wKKyAg aXNfdG9vX2Z1bGwgKHNpemVfdHlwZSBlbnRyaWVzKSBjb25zdAorICB7IHJl dHVybiBlbnRyaWVzID4gKHRoaXMtPmJ1Y2tldF9jb3VudCAoKSAqIDAuNyk7 IH0KKworICAvKiBSZXR1cm4gYSBjb3B5IHdpdGggZG91YmxlIHRoZSBudW1i ZXIgb2YgYnVja2V0cy4gIFJldHVybnMgTlVMTCBpZgorICAgICB0aGUgYWxs b2NhdG9yIGZhaWxzLiAgT3RoZXJ3aXNlLCBjYWxscyBkZXN0cm95ICh0aGlz KS4gICovCisgIGluc2VydF9vbmx5X2hhc2hfbWFwICpkZXN0cnVjdGl2ZV9j b3B5ICgpOworCisgLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIgbm90IGxlc3Mg dGhhbiBtaW5fY2FwYWNpdHkuICovCisgIHNpemVfdHlwZSBudW1fYnVja2V0 c187IAorICBzaXplX3R5cGUgbnVtX2VudHJpZXNfOworICBzaXplX3R5cGUg c2l6ZV9pbl9ieXRlc187CisgIGJ1Y2tldF90eXBlIGJ1Y2tldHNbMF07ICAv KiBBY3R1YWwgYXJyYXkgc2l6ZSBpcyBudW1fYnVja2V0cy4gICovCit9Owor Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2M+CitpbnNl cnRfb25seV9oYXNoX21hcCA8VCwgQWxsb2M+ICoKK2luc2VydF9vbmx5X2hh c2hfbWFwIDxULCBBbGxvYz46OmNyZWF0ZSAoc2l6ZV90eXBlIGV4cGVjdGVk X3NpemUpCit7CisgIHNpemVfdCBjYXAgPSBtaW5fY2FwYWNpdHk7CisgIHdo aWxlIChleHBlY3RlZF9zaXplID49IGNhcCkKKyAgICB7CisgICAgICBjYXAg Kj0gMjsKKyAgICB9CisgIHNpemVfdCBzaXplX2luX2J5dGVzID0gc2l6ZW9m IChpbnNlcnRfb25seV9oYXNoX21hcCA8VCwgQWxsb2M+KQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNh cCAqIHNpemVvZiAoYnVja2V0X3R5cGUpOworICBpbnNlcnRfb25seV9oYXNo X21hcCA8VCwgQWxsb2M+KiByZXN1bHQgPQorICAgICAgc3RhdGljX2Nhc3Qg PGluc2VydF9vbmx5X2hhc2hfbWFwIDxULCBBbGxvYz4qPiAoQWxsb2MgKCkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAuYWxsb2MgKHNpemVfaW5fYnl0ZXMpKTsKKyAgaWYgKHJl c3VsdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlc3VsdC0+c2l6ZV9pbl9i eXRlc18gPSBzaXplX2luX2J5dGVzOworICAgICAgcmVzdWx0LT5udW1fYnVj a2V0c18gPSBjYXA7CisgICAgICByZXN1bHQtPm51bV9lbnRyaWVzXyA9IDA7 CisgICAgICBtZW1zZXQgKHJlc3VsdC0+YnVja2V0cywgMCwgY2FwICogc2l6 ZW9mIChidWNrZXRfdHlwZSkpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsK K30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jPgor aW5zZXJ0X29ubHlfaGFzaF9tYXAgPFQsIEFsbG9jPioKK2luc2VydF9vbmx5 X2hhc2hfbWFwIDxULCBBbGxvYz46OmRlc3RydWN0aXZlX2NvcHkgKCkKK3sK KyAgaW5zZXJ0X29ubHlfaGFzaF9tYXAqIGNvcHkgPSBjcmVhdGUgKHRoaXMt PmJ1Y2tldF9jb3VudCAoKSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAg cmV0dXJuIE5VTEw7CisgIFZUVl9ERUJVR19BU1NFUlQgKGNvcHktPmJ1Y2tl dF9jb3VudCAoKSA9PSAyICogdGhpcy0+YnVja2V0X2NvdW50ICgpKTsKKyAg Zm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCB0aGlzLT5idWNrZXRfY291bnQg KCk7IGkrKykKKyAgICBpZiAodGhpcy0+YnVja2V0c1tpXS5maXJzdCAhPSBO VUxMKQorICAgICAgY29weS0+cHV0X2ludGVybmFsICh0aGlzLT5idWNrZXRz W2ldLmZpcnN0LCB0aGlzLT5idWNrZXRzW2ldLnNlY29uZCwKKwkJCSAgdHJ1 ZSk7CisgIFZUVl9ERUJVR19BU1NFUlQgKGNvcHktPnNpemUgKCkgPT0gdGhp cy0+c2l6ZSAoKSk7CisgIGRlc3Ryb3kgKHRoaXMpOworICByZXR1cm4gY29w eTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9j PgoraW5zZXJ0X29ubHlfaGFzaF9tYXAgPFQsIEFsbG9jPioKK2luc2VydF9v bmx5X2hhc2hfbWFwIDxULCBBbGxvYz46OmZpbmRfb3JfYWRkX2tleSAoY29u c3Qga2V5X3R5cGUgKmssCisJCQkJCQkgIHZhbHVlX3R5cGUgKip2KQorewor ICAvKiBUYWJsZSBzaXplIGlzIGFsd2F5cyBhIHBvd2VyIG9mIDIuICAqLwor ICBjb25zdCBzaXplX3R5cGUgbWFzayA9IHRoaXMtPmJ1Y2tldF9jb3VudCAo KSAtIDE7CisgIHNpemVfdHlwZSBidWNrZXRfaW5kZXggPSBrLT5oYXNoICYg bWFzazsKKyAgc2l6ZV90eXBlIHN0ZXAgPSAxOworICBmb3IgKDs7KQorICAg IHsKKyAgICAgIGJ1Y2tldF90eXBlICZidWNrZXQgPSB0aGlzLT5idWNrZXRz W2J1Y2tldF9pbmRleF07CisgICAgICBpZiAoYnVja2V0LmZpcnN0ID09IE5V TEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBLZXkgd2FzIG5vdCBwcmVz ZW50LiAqLworICAgICAgICAgIGlmICh0aGlzLT5pc190b29fZnVsbCAodGhp cy0+c2l6ZSAoKSArIDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICBpbnNlcnRfb25seV9oYXNoX21hcCA8VCwgQWxsb2M+KiByZXN1bHQgPQor CQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ ZGVzdHJ1Y3RpdmVfY29weSAoKTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJl c3VsdCA9PSBOVUxMCisgICAgICAgICAgICAgICAgICA/IE5VTEwKKyAgICAg ICAgICAgICAgICAgIDogcmVzdWx0LT5maW5kX29yX2FkZF9rZXkgKGssIHYp OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg IHsKKyAgICAgICAgICAgICAgYnVja2V0LmZpcnN0ID0gazsKKyAgICAgICAg ICAgICAgYnVja2V0LnNlY29uZCA9IFQgKCk7CisgICAgICAgICAgICAgIHRo aXMtPm51bV9lbnRyaWVzXysrOworICAgICAgICAgICAgICAqdiA9ICZidWNr ZXQuc2Vjb25kOworICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYnVja2V0LmZp cnN0LT5lcXVhbHMgKGspKQorICAgICAgICB7CisgICAgICAgICAgLyogS2V5 IHdhcyBwcmVzZW50LiAqLworICAgICAgICAgICp2ID0gJmJ1Y2tldC5zZWNv bmQ7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAg IGVsc2UKKyAgICAgICAgYnVja2V0X2luZGV4ID0gKGJ1Y2tldF9pbmRleCAr IHN0ZXArKykgJiBtYXNrOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVu YW1lIFQsIHR5cGVuYW1lIEFsbG9jPgoraW5zZXJ0X29ubHlfaGFzaF9tYXAg PFQsIEFsbG9jPioKK2luc2VydF9vbmx5X2hhc2hfbWFwIDxULCBBbGxvYz46 OnB1dF9pbnRlcm5hbCAoCisJCQkJICAgICBjb25zdCBpbnNlcnRfb25seV9o YXNoX21hcDo6a2V5X3R5cGUgKmssCisJCQkJICAgICBjb25zdCBpbnNlcnRf b25seV9oYXNoX21hcDo6dmFsdWVfdHlwZSAmdiwKKwkJCQkgICAgIGJvb2wg dW5pcXVlX2tleV9hbmRfcmVzaXplX25vdF9uZWVkZWQpCit7CisgIC8qIFRh YmxlIHNpemUgaXMgYWx3YXlzIGEgcG93ZXIgb2YgMi4gICovCisgIGNvbnN0 IHNpemVfdHlwZSBtYXNrID0gdGhpcy0+YnVja2V0X2NvdW50ICgpIC0gMTsK KyAgc2l6ZV90eXBlIGJ1Y2tldF9pbmRleCA9IGstPmhhc2ggJiBtYXNrOwor ICBzaXplX3R5cGUgc3RlcCA9IDE7CisgIGZvciAoOzspCisgICAgeworICAg ICAgYnVja2V0X3R5cGUgJmJ1Y2tldCA9IHRoaXMtPmJ1Y2tldHNbYnVja2V0 X2luZGV4XTsKKyAgICAgIGlmIChidWNrZXQuZmlyc3QgPT0gTlVMTCkKKyAg ICAgICAgeworICAgICAgICAgIC8qIEtleSB3YXMgbm90IHByZXNlbnQuICAq LworICAgICAgICAgIGlmICghdW5pcXVlX2tleV9hbmRfcmVzaXplX25vdF9u ZWVkZWQKKyAgICAgICAgICAgICAgJiYgdGhpcy0+aXNfdG9vX2Z1bGwgKHRo aXMtPnNpemUgKCkgKyAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg ICAgaW5zZXJ0X29ubHlfaGFzaF9tYXAgPFQsIEFsbG9jPiogcmVzdWx0ID0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdGhpcy0+ZGVzdHJ1Y3RpdmVfY29weSAoKTsKKyAgICAgICAg ICAgICAgcmV0dXJuIHJlc3VsdCA9PSBOVUxMCisgICAgICAgICAgICAgICAg ICA/IE5VTEwKKyAgICAgICAgICAgICAgICAgIDogcmVzdWx0LT5wdXRfaW50 ZXJuYWwgKGssIHYsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAg IGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVja2V0LmZp cnN0ID0gazsKKyAgICAgICAgICAgICAgYnVja2V0LnNlY29uZCA9IHY7Cisg ICAgICAgICAgICAgIHRoaXMtPm51bV9lbnRyaWVzXysrOworICAgICAgICAg ICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgICAgZWxzZSBpZiAoIXVuaXF1ZV9rZXlfYW5kX3Jlc2l6ZV9ub3RfbmVl ZGVkICYmIGJ1Y2tldC5maXJzdC0+ZXF1YWxzIChrKSkKKyAgICAgICAgewor ICAgICAgICAgIC8qIEtleSB3YXMgcHJlc2VudC4gIEp1c3QgY2hhbmdlIHRo ZSB2YWx1ZS4gICovCisgICAgICAgICAgYnVja2V0LnNlY29uZCA9IHY7Cisg ICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgIGVsc2UK KyAgICAgICAgYnVja2V0X2luZGV4ID0gKGJ1Y2tldF9pbmRleCArIHN0ZXAr KykgJiBtYXNrOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQs IHR5cGVuYW1lIEFsbG9jPgorY29uc3QgdHlwZW5hbWUgaW5zZXJ0X29ubHlf aGFzaF9tYXAgPFQsIEFsbG9jPjo6dmFsdWVfdHlwZSoKK2luc2VydF9vbmx5 X2hhc2hfbWFwIDxULCBBbGxvYz46OmdldCAoY29uc3QgaW5zZXJ0X29ubHlf aGFzaF9tYXA6OmtleV90eXBlICprKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdAoreworICAvKiBUYWJsZSBzaXplIGlzIGFsd2F5cyBh IHBvd2VyIG9mIDIuICAqLworICBjb25zdCBzaXplX3R5cGUgbWFzayA9IHRo aXMtPmJ1Y2tldF9jb3VudCAoKSAtIDE7CisgIHNpemVfdHlwZSBidWNrZXRf aW5kZXggPSBrLT5oYXNoICYgbWFzazsKKyAgc2l6ZV90eXBlIHN0ZXAgPSAx OworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGNvbnN0IGJ1Y2tldF90eXBl ICZidWNrZXQgPSB0aGlzLT5idWNrZXRzW2J1Y2tldF9pbmRleF07CisgICAg ICBpZiAoYnVja2V0LmZpcnN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBO VUxMOworICAgICAgZWxzZSBpZiAoYnVja2V0LmZpcnN0LT5lcXVhbHMgKGsp KQorICAgICAgICByZXR1cm4gJmJ1Y2tldC5zZWNvbmQ7CisgICAgICBlbHNl CisgICAgICAgIGJ1Y2tldF9pbmRleCA9IChidWNrZXRfaW5kZXggKyBzdGVw KyspICYgbWFzazsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBU LCB0eXBlbmFtZSBBbGxvYz4KK2Jvb2wKK2luc2VydF9vbmx5X2hhc2hfbWFw IDxULCBBbGxvYz46OmtleV90eXBlOjplcXVhbHMgKAorICAgICAgICAgICAg IGNvbnN0IHR5cGVuYW1lIGluc2VydF9vbmx5X2hhc2hfbWFwIDxULCBBbGxv Yz46OmtleV90eXBlICprKSBjb25zdAoreworICBjb25zdCBjaGFyKiB4ID0g cmVpbnRlcnByZXRfY2FzdCA8Y29uc3QgY2hhciAqPiAoayk7CisgIGNvbnN0 IGNoYXIqIHkgPSByZWludGVycHJldF9jYXN0IDxjb25zdCBjaGFyICo+ICh0 aGlzKTsKKyAgcmV0dXJuIChsb2FkOGJ5dGVzICh4KSA9PSBsb2FkOGJ5dGVz ICh5KQorICAgICAgICAgICYmIG1lbWNtcCAoeCArIDgsIHkgKyA4LCB0aGlz LT5uKSA9PSAwKTsKK30KKworI2VuZGlmICAvKiBfVlRWX01BUF9IICAqLwpJ bmRleDogbGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfc2V0LmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gbGlic3RkYysrLXYzL2xpYnN1cGMrKy92 dHZfc2V0LmgJKHJldmlzaW9uIDApCisrKyBsaWJzdGRjKystdjMvbGlic3Vw YysrL3Z0dl9zZXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2NTMgQEAK Ky8qIENvcHlyaWdodCAoQykgMjAxMgorICAgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAg R0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cisg ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lv bi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgICBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJD SEFOVEFCSUxJVFkKKyAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9m IEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisg ICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExp YnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorICAgYW5kIGEgY29weSBvZiB0aGUgR0NDIFJ1 bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzCisgICBw cm9ncmFtOyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJV TlRJTUUgcmVzcGVjdGl2ZWx5LgorICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfVlRWX1NF VF9ICisjZGVmaW5lIF9WVFZfU0VUX0ggMQorCisvKiBDb2RlIGluIHRoaXMg ZmlsZSBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBpbnNlcnQtb25seSBzZXRz LiAgV2UKKyAgIGhhdmUgb25seSB0ZXN0ZWQgdGhlIGNhc2Ugd2hlcmUgS2V5 IGlzIHVpbnRwdHJfdCwgdGhvdWdoIGl0CisgICB0aGVvcmV0aWNhbGx5IHNo b3VsZCB3b3JrIGZvciBzb21lIG90aGVyIGNhc2VzLiAgQWxsIG9kZCBrZXlz IGFyZQorICAgcmVzZXJ2ZWQsIGFuZCBtdXN0IG5vdCBiZSBpbnNlcnRlZCBp bnRvIGFueSBvZiB0aGUgc2V0cy4gIFRoaXMgY29kZQorICAgaXMgaW50ZW5k ZWQgcHJpbWFyaWx5IGZvciBzZXRzIG9mIHBvaW50ZXJzLCBhbmQgdGhlIGNv ZGUgaXMKKyAgIG9wdGltaXplZCBmb3Igc21hbGwgc2V0cyAoaW5jbHVkaW5n IHNpemUgMCBhbmQgMSksIGJ1dCByZWdhcmRsZXNzCisgICBvZiB0aGUgc2V0 IHNpemUsIGluc2VydCgpIGFuZCBjb250YWlucygpIGhhdmUgY2xvc2UgdG8g TygxKSBzcGVlZAorICAgaW4gcHJhY3RpY2UuCisKKyAgIFRPRE8oZ3Bpa2Up OiBmaXggdGhpcyBjb21tZW50LgorCisgICBSZWNvbW1lbmRlZCBtdWx0aXRo cmVhZGVkIHVzZSBvZiBhIHNldDoKKworICAgRm9yIHNwZWVkLCB3ZSB3YW50 IHRvIHVzZSBhIGxvY2stZnJlZSB0ZXN0IGZvciBzZXQgbWVtYmVyc2hpcC4g IFRoZQorICAgY29kZSBoYW5kbGVzIHNpbXVsdGFuZW91cyByZWFkcyBhbmQg aW5zZXJ0cywgYXMgbG9uZyBhcyBhdCBtb3N0IG9uZQorICAgaW5zZXJ0aW9u IGlzIGluIHByb2dyZXNzIGF0IGEgdGltZS4gIEFmdGVyIGFuIGluc2VydCwg b3RoZXIgdGhyZWFkcworICAgbWF5IG5vdCBpbW1lZGlhdGVseSAic2VlIiB0 aGUgaW5zZXJ0ZWQga2V5IGlmIHRoZXkgcGVyZm9ybSBhCisgICBsb2NrLWZy ZWUgcmVhZCwgc28gd2UgcmVjb21tZW5kIHJldHJ5aW5nLCBhcyBleHBsYWlu ZWQgYmVsb3cuCisKKyAgIEFsc28sIHRvIG1ha2UgZGF0YSBjb3JydXB0aW9u IGxlc3MgbGlrZWx5LCB3ZSByZWNvbW1lbmQgdXNpbmcgYQorICAgIm5vcm1h bCIgUlcgcGFnZSBhcyB3ZWxsIGFzIG9uZSBvciBwYWdlcyB0aGF0IGFyZSB0 eXBpY2FsbHkgUk8KKyAgIGJ1dCB0aGF0IGNhbiBiZSBzd2l0Y2hlZCB0byBS VyBhbmQgYmFjayBhcyBuZWVkZWQuICBUaGUgbGF0dGVyCisgICBwYWdlcyBz aG91bGQgY29udGFpbiBzZXRzLiAgVGhlIGZvcm1lciBzaG91bGQgY29udGFp biBhIGxvY2ssIEwsCisgICBhbmQgYW4gaW50IG9yIHNpbWlsYXIsIG51bV93 cml0ZXJzLiAgVGhlbiwgdG8gaW5zZXJ0LCBzb21ldGhpbmcKKyAgIGxpa2Ug dGhpcyB3b3VsZCBiZSBzYWZlOgorICAgIG8gQWNxdWlyZSBMLgorICAgIG8g SW5jcmVtZW50IG51bV93cml0ZXJzOyBpZiB0aGF0IG1hZGUgaXQgMSwgY2hh bmdlIHBhZ2VzIHRvIFJXLgorICAgIG8gUmVsZWFzZSBMLgorICAgIG8gd2hp bGUgKHRoZXJlIGFyZSBpbnNlcnRpb25zIHRvIGRvIGluIHNvbWUgc2V0LCBT KSB7CisgICAgICAgIGFjcXVpcmUgTDsKKyAgICAgICAgZG8gc29tZSBpbnNl cnRpb25zIGluIFM7CisgICAgICAgIHJlbGVhc2UgTDsKKyAgICAgIH0KKyAg ICBvIEFjcXVpcmUgTC4KKyAgICBvIERlY3JlbWVudCBudW1fd3JpdGVyczsg aWYgdGhhdCBtYWRlIGl0IDAsIGNoYW5nZSBwYWdlcyB0byBSTy4KKyAgICBv IFJlbGVhc2UgTC4KKworICAgQW5kIHRvIGNoZWNrIGlmIHRoZSBzZXQgY29u dGFpbnMgc29tZSBrZXksIG9uZSBjb3VsZCB1c2UKKyAgICAgc2V0LmNvbnRh aW5zKGtleSkgfHwKKyAgICAgICAoeyBBY3F1aXJlIEw7IGJvb2wgYiA9IHNl dC5jb250YWlucyhrZXkpOyBSZWxlYXNlIEw7IGI7IH0pCisKKyAgIEluIHRo aXMgc2NoZW1lLCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2l0aCByZWFkcyBp biBwcm9ncmVzcyBpc24ndAorICAgdHJhY2tlZCwgc28gb2xkIHNldHMgY2Fu IG5ldmVyIGJlIGRlbGV0ZWQuICBJbiBhZGRpdGlvbiwgb24gc29tZQorICAg YXJjaGl0ZWN0dXJlcyB0aGUgaW50ZW50aW9uYWxseSByYWN5IHJlYWRzIG1p Z2h0IGNhdXNlIGNvbnRhaW5zKCkKKyAgIHRvIHJldHVybiB0cnVlIHdoZW4g aXQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgZmFsc2UuICBUaGlzIHNob3VsZCBi ZQorICAgbm8gcHJvYmxlbSBvbiB4ODYsIGFuZCBtb3N0IG90aGVyIG1hY2hp bmVzLCB3aGVyZSByZWFkaW5nIG9yCisgICB3cml0aW5nIGFuIGFsaWduZWQg dWludHB0cl90IGlzIGF0b21pYy4gIEUuZy4sIG9uIHRob3NlIG1hY2hpbmVz LAorICAgaWYgKnAgaXMgMCBhbmQgb25lIHRocmVhZCBkb2VzICpwID0geCB3 aGlsZSBhbm90aGVyIHJlYWRzICpwLCB0aGUKKyAgIHJlYWQgd2lsbCBzZWUg ZWl0aGVyIDAgb3IgeC4KKworICAgVG8gbWFrZSB0aGUgYWJvdmUgZWFzaWVy LCB0aGUgaW5zZXJ0X29ubHlfaGFzaF9zZXRzIGNsYXNzIHByb3ZpZGVzCisg ICBhbiBpbnRlcmZhY2UgdG8gbWFuaXB1bGF0ZSBhbnkgbnVtYmVyIG9mIGhh c2ggc2V0cy4gIE9uZSBzaG91bGRuJ3QKKyAgIGNyZWF0ZSBvYmplY3RzIG9m IHRoYXQgY2xhc3MsIGFzIGl0IGhhcyBubyBtZW1iZXIgZGF0YSBhbmQgaXRz CisgICBtZXRob2RzIGFyZSBzdGF0aWMuCisKKyAgIFNvIHRoZSByZWNvbW1l bmRlZCBtb2RlbCBpcyB0byBoYXZlIGEgc2luZ2xlIGxvY2ssIGEgc2luZ2xl CisgICBudW1fd3JpdGVycyB2YXJpYWJsZSwgYW5kIHNvbWUgbnVtYmVyIG9m IHNldHMuICBJZiBsb2NrIGNvbnRlbnRpb24KKyAgIGJlY29tZXMgYSBwcm9i bGVtIHRoZW4gdGhlIHNldHMgY2FuIGJlIGRpdmlkZWQgaW50byBrIGdyb3Vw cywgZWFjaAorICAgb2Ygd2hpY2ggaGFzIGEgbG9jayBhbmQgYSBudW1fd3Jp dGVycyB2YXJpYWJsZTsgb3IgZWFjaCBzZXQgY2FuIGJlCisgICByZXByZXNl bnRlZCBhcyBhIHNldCBvZiB2YWx1ZXMgdGhhdCBlcXVhbCAwIG1vZCBtLCBh IHNldCBvZiB2YWx1ZXMKKyAgIHRoYXQgZXF1YWwgMSBtb2QgbSwgLi4uLCBw bHVzIGEgc2V0IG9mIHZhbHVlcyB0aGF0IGVxdWFsIG0tMSBtb2QgbS4KKwor ICAgSG93ZXZlciwgd2UgZXhwZWN0IG1vc3Qgb3IgYWxsIHVzZXMgb2YgdGhp cyBjb2RlIHRvIGNhbGwgY29udGFpbnMoKQorICAgbXVjaCBtb3JlIGZyZXF1 ZW50bHkgdGhhbiBhbnl0aGluZyBlbHNlLCBzbyBsb2NrIGNvbnRlbnRpb24g aXMKKyAgIGxpa2VseSB0byBiZSBsb3cuICAqLworCisjaW5jbHVkZSA8YWxn b3JpdGhtPgorCisjaWZuZGVmIEhBU0hUQUJMRV9TVEFUUworI2RlZmluZSBI QVNIVEFCTEVfU1RBVFMgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFTSFRBQkxF X1NUQVRTX0FUT01JQworI2RlZmluZSBIQVNIVEFCTEVfU1RBVFNfQVRPTUlD IDAKKyNlbmRpZgorCisjaWYgSEFTSFRBQkxFX1NUQVRTCisjaWYgSEFTSFRB QkxFX1NUQVRTX0FUT01JQworLyogU3RhdCBjb3VudGVycywgd2l0aCBhdG9t aWNzLiAqLworI2luY2x1ZGUgPGJpdHMvYXRvbWljX3dvcmQuaD4KKwordHlw ZWRlZiBfQXRvbWljX3dvcmQgX0F0b21pY1N0YXRDb3VudGVyOworCit2b2lk CitpbmNfYnkgKF9BdG9taWNTdGF0Q291bnRlciAmc3RhdCwgaW50IGFtb3Vu dCkKK3sgCisgIF9fYXRvbWljX2FkZF9mZXRjaCAoJnN0YXQsIGFtb3VudCwg IF9fQVRPTUlDX0FDUV9SRUwpOworfQorCisjZWxzZQorCisvKiBTdGF0IGNv dW50ZXJzLCBidXQgd2l0aG91dCBhdG9taWNzLiAqLwordHlwZWRlZiBpbnQg X0F0b21pY1N0YXRDb3VudGVyOworCit2b2lkCitpbmNfYnkgKF9BdG9taWNT dGF0Q291bnRlciYgc3RhdCwgaW50IGFtb3VudCkKK3sgCisgIHN0YXQgKz0g YW1vdW50OworfQorCisjZW5kaWYKKworCisvKiBOdW1iZXIgb2YgY2FsbHMg dG8gY29udGFpbnMoKSwgaW5zZXJ0KCksIGV0Yy4gKi8KK2V4dGVybiBfQXRv bWljU3RhdENvdW50ZXIgc3RhdF9pbnNlcnQ7CitleHRlcm4gX0F0b21pY1N0 YXRDb3VudGVyIHN0YXRfY29udGFpbnM7CitleHRlcm4gX0F0b21pY1N0YXRD b3VudGVyIHN0YXRfcmVzaXplOworZXh0ZXJuIF9BdG9taWNTdGF0Q291bnRl ciBzdGF0X2NyZWF0ZTsKKworLyogU3VtIG9mIHNldCBzaXplIG92ZXIgYWxs IGNhbGxzIHRvIGNvbnRhaW5zKCkuICAqLworZXh0ZXJuIF9BdG9taWNTdGF0 Q291bnRlciBzdGF0X2NvbnRhaW5zX3NpemVzOworCisvKiBjb250YWlucygp IGNhbGxzIGluIGEgc2V0IHdob3NlIGNhcGFjaXR5IGlzIG1vcmUgdGhhbiAx LiAqLworZXh0ZXJuIF9BdG9taWNTdGF0Q291bnRlciBzdGF0X2NvbnRhaW5z X2luX25vbl90cml2aWFsX3NldDsKKworLyogUHJvYmVzIGluIGEgc2V0IHdo b3NlIGNhcGFjaXR5IGlzIG1vcmUgdGhhbiAxLiAgSWRlYWxseSwgdGhpcyB3 aWxsCisgICBiZSBwcmV0dHkgY2xvc2UgdG8gc3RhdF9jb250YWluc19pbl9u b25fdHJpdmlhbF9zZXQuICBUaGF0IHdpbGwKKyAgIGhhcHBlbiBpZiBvdXIg aGFzaCBmdW5jdGlvbiBpcyBnb29kIGFuZC9vciBpbXBvcnRhbnQga2V5cyB3 ZXJlCisgICBpbnNlcnRlZCBiZWZvcmUgdW5pbXBvcnRhbnQga2V5cy4gICov CitleHRlcm4gX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfcHJvYmVzX2luX25v bl90cml2aWFsX3NldDsKKworLyogbnVtYmVyIG9mIGNhbGxzIHRvIGNvbnRh aW5zKCkgd2l0aCBzaXplPTAsIDEsIGV0Yy4gKi8KK2V4dGVybiBfQXRvbWlj U3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMDsKK2V4dGVybiBfQXRv bWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMTsKK2V4dGVybiBf QXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMjsKK2V4dGVy biBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMzsKK2V4 dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplNDsK K2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXpl NTsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19z aXplNjsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWlu c19zaXplNzsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250 YWluc19zaXplODsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9j b250YWluc19zaXplOTsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3Rh dF9jb250YWluc19zaXplMTA7CitleHRlcm4gX0F0b21pY1N0YXRDb3VudGVy IHN0YXRfY29udGFpbnNfc2l6ZTExOworZXh0ZXJuIF9BdG9taWNTdGF0Q291 bnRlciBzdGF0X2NvbnRhaW5zX3NpemUxMjsKK2V4dGVybiBfQXRvbWljU3Rh dENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMTNfb3JfbW9yZTsKK2V4dGVy biBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9ncm93X2Zyb21fc2l6ZTBfdG9f MTsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9ncm93X2Zyb21f c2l6ZTFfdG9fMjsKK2V4dGVybiBfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9k b3VibGVfdGhlX251bWJlcl9vZl9idWNrZXRzOworZXh0ZXJuIF9BdG9taWNT dGF0Q291bnRlciBzdGF0X2luc2VydF9rZXlfdGhhdF93YXNfYWxyZWFkeV9w cmVzZW50OworCisvKiBIYXNoIGNvbGxpc2lvbnMgZGV0ZWN0ZWQgZHVyaW5n IGluc2VydF9ub19yZXNpemUoKS4gIE9ubHkgY291bnRzCisgICBoYXNoZXIo aykgPT0gaGFzaGVyKGsnKTsgaGFzaGVyKGspICUgdGFibGVzaXplID09IGhh c2hlcihrJykgJQorICAgdGFibGVzaXplIGlzIG5vdCBzdWZmaWNpZW50LiAg V2lsbCBjb3VudCBjb2xsaXNpb25zIHRoYXQgYXJlCisgICBkZXRlY3RlZCBk dXJpbmcgdGFibGUgcmVzaXplcyBldGMuLCBzbyB0aGUgc2FtZSB0d28ga2V5 cyBtYXkgYWRkIHRvCisgICB0aGlzIHN0YXQgbXVsdGlwbGUgdGltZXMuICAq LworZXh0ZXJuIF9BdG9taWNTdGF0Q291bnRlciBzdGF0X2luc2VydF9mb3Vu ZF9oYXNoX2NvbGxpc2lvbjsKKworI2luY2x1ZGUgPHN0cmluZz4KKworc3Ry dWN0IGluc2VydF9vbmx5X2hhc2hfc2V0c19sb2dnZXIKK3sKKyAgc3RhdGlj IGNoYXIgKgorICBsb2cgKGNoYXIgYywgY2hhciAqYnVmKQorICB7CisgICAg KmJ1ZisrID0gYzsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgc3RhdGlj IGNoYXIgKgorICBsb2cgKGNvbnN0IGNoYXIgKnMsIGNoYXIgKmJ1ZikKKyAg eyByZXR1cm4gc3RyY3B5IChidWYsIHMpICsgc3RybGVuIChzKTsgfQorCisg IHN0YXRpYyBjaGFyICoKKyAgbG9nIChfQXRvbWljU3RhdENvdW50ZXIgaSwg Y2hhciAqYnVmKQorICB7CisgICAgaWYgKGkgPCAxMCkKKyAgICAgIHJldHVy biBsb2cgKChjaGFyKSAoJzAnICsgaSksIGJ1Zik7CisgICAgZWxzZQorICAg ICAgcmV0dXJuIGxvZyAoKGNoYXIpICgnMCcgKyBpICUgMTApLCBsb2cgKGkg LyAxMCwgYnVmKSk7CisgIH0KKworICBzdGF0aWMgY2hhciAqCisgIGxvZyAo Y29uc3QgY2hhciAqbGFiZWwsIF9BdG9taWNTdGF0Q291bnRlciBpLCBjaGFy ICpidWYpCisgIHsKKyAgICBidWYgPSBsb2cgKGxhYmVsLCBidWYpOworICAg IGJ1ZiA9IGxvZyAoIjogIiwgYnVmKTsKKyAgICBidWYgPSBsb2cgKGksIGJ1 Zik7CisgICAgcmV0dXJuIGxvZyAoJ1xuJywgYnVmKTsKKyAgfQorfTsKKwor Ly8gV3JpdGUgc3RhdHMgdG8gdGhlIGdpdmVuIGJ1ZmZlciwgd2hpY2ggc2hv dWxkIGJlIGF0IGxlYXN0IDQwMDAgYnl0ZXMuCitzdGF0aWMgaW5saW5lIHZv aWQKK2luc2VydF9vbmx5X2hhc2hfdGFibGVzX3N0YXRzIChjaGFyICpidWYp Cit7CisgIGJ1ZiA9IGluc2VydF9vbmx5X2hhc2hfc2V0c19sb2dnZXI6Omxv ZyAoImluc2VydCIsIHN0YXRfaW5zZXJ0LCBidWYpOworICBidWYgPSBpbnNl cnRfb25seV9oYXNoX3NldHNfbG9nZ2VyOjpsb2cgKCJjb250YWlucyIsIHN0 YXRfY29udGFpbnMsIGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5X2hhc2hf c2V0c19sb2dnZXI6OmxvZyAoInJlc2l6ZSIsIHN0YXRfcmVzaXplLCBidWYp OworICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3NldHNfbG9nZ2VyOjpsb2cg KCJjcmVhdGUiLCBzdGF0X2NyZWF0ZSwgYnVmKTsKKyAgYnVmID0gaW5zZXJ0 X29ubHlfaGFzaF9zZXRzX2xvZ2dlcjo6bG9nICgiaW5zZXJ0X2tleV90aGF0 X3dhc19hbHJlYWR5XyIKKwkJCQkgICAgICAicHJlc2VudCIsCisJCQkJICAg ICAgc3RhdF9pbnNlcnRfa2V5X3RoYXRfd2FzX2FscmVhZHlfcHJlc2VudCwK KwkJCQkgICAgICBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3Nl dHNfbG9nZ2VyOjpsb2cgKCJjb250YWluc19zaXplcyIsCisJCQkJCSAgIHN0 YXRfY29udGFpbnNfc2l6ZXMsIGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5 X2hhc2hfc2V0c19sb2dnZXI6OmxvZyAoImNvbnRhaW5zX2luX25vbl90cml2 aWFsX3NldCIsCisJCQkJCSAgIHN0YXRfY29udGFpbnNfaW5fbm9uX3RyaXZp YWxfc2V0LAorCQkJCQkgICBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9o YXNoX3NldHNfbG9nZ2VyOjpsb2cgKCJwcm9iZXNfaW5fbm9uX3RyaXZpYWxf c2V0IiwKKwkJCQkJICAgc3RhdF9wcm9iZXNfaW5fbm9uX3RyaXZpYWxfc2V0 LAorCQkJCQkgICBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3Nl dHNfbG9nZ2VyOjpsb2cgKCJjb250YWluc19zaXplMCIsCisJCQkJCSAgIHN0 YXRfY29udGFpbnNfc2l6ZTAsIGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5 X2hhc2hfc2V0c19sb2dnZXI6OmxvZyAoImNvbnRhaW5zX3NpemUxIiwKKwkJ CQkJICAgc3RhdF9jb250YWluc19zaXplMSwgYnVmKTsKKyAgYnVmID0gaW5z ZXJ0X29ubHlfaGFzaF9zZXRzX2xvZ2dlcjo6bG9nICgiY29udGFpbnNfc2l6 ZTIiLAorCQkJCQkgICBzdGF0X2NvbnRhaW5zX3NpemUyLCBidWYpOworICBi dWYgPSBpbnNlcnRfb25seV9oYXNoX3NldHNfbG9nZ2VyOjpsb2cgKCJjb250 YWluc19zaXplMyIsCisJCQkJCSAgIHN0YXRfY29udGFpbnNfc2l6ZTMsIGJ1 Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5X2hhc2hfc2V0c19sb2dnZXI6Omxv ZyAoImNvbnRhaW5zX3NpemU0IiwKKwkJCQkJICAgc3RhdF9jb250YWluc19z aXplNCwgYnVmKTsKKyAgYnVmID0gaW5zZXJ0X29ubHlfaGFzaF9zZXRzX2xv Z2dlcjo6bG9nICgiY29udGFpbnNfc2l6ZTUiLAorCQkJCQkgICBzdGF0X2Nv bnRhaW5zX3NpemU1LCBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9oYXNo X3NldHNfbG9nZ2VyOjpsb2cgKCJjb250YWluc19zaXplNiIsCisJCQkJCSAg IHN0YXRfY29udGFpbnNfc2l6ZTYsIGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9v bmx5X2hhc2hfc2V0c19sb2dnZXI6OmxvZyAoImNvbnRhaW5zX3NpemU3IiwK KwkJCQkJICAgc3RhdF9jb250YWluc19zaXplNywgYnVmKTsKKyAgYnVmID0g aW5zZXJ0X29ubHlfaGFzaF9zZXRzX2xvZ2dlcjo6bG9nICgiY29udGFpbnNf c2l6ZTgiLAorCQkJCQkgICBzdGF0X2NvbnRhaW5zX3NpemU4LCBidWYpOwor ICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3NldHNfbG9nZ2VyOjpsb2cgKCJj b250YWluc19zaXplOSIsCisJCQkJCSAgIHN0YXRfY29udGFpbnNfc2l6ZTks IGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5X2hhc2hfc2V0c19sb2dnZXI6 OmxvZyAoImNvbnRhaW5zX3NpemUxMCIsCisJCQkJCSAgIHN0YXRfY29udGFp bnNfc2l6ZTEwLCBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3Nl dHNfbG9nZ2VyOjpsb2cgKCJjb250YWluc19zaXplMTEiLAorCQkJCQkgICBz dGF0X2NvbnRhaW5zX3NpemUxMSwgYnVmKTsKKyAgYnVmID0gaW5zZXJ0X29u bHlfaGFzaF9zZXRzX2xvZ2dlcjo6bG9nICgiY29udGFpbnNfc2l6ZTEyIiwK KwkJCQkJICAgc3RhdF9jb250YWluc19zaXplMTIsIGJ1Zik7CisgIGJ1ZiA9 IGluc2VydF9vbmx5X2hhc2hfc2V0c19sb2dnZXI6OmxvZyAoImNvbnRhaW5z X3NpemUxM19vcl9tb3JlIiwKKwkJCQkJICAgc3RhdF9jb250YWluc19zaXpl MTNfb3JfbW9yZSwgYnVmKTsKKyAgYnVmID0gaW5zZXJ0X29ubHlfaGFzaF9z ZXRzX2xvZ2dlcjo6bG9nICgiZ3Jvd19mcm9tX3NpemUwX3RvXzEiLAorCQkJ CQkgICBzdGF0X2dyb3dfZnJvbV9zaXplMF90b18xLCBidWYpOworICBidWYg PSBpbnNlcnRfb25seV9oYXNoX3NldHNfbG9nZ2VyOjpsb2cgKCJncm93X2Zy b21fc2l6ZTFfdG9fMiIsCisJCQkJCSAgIHN0YXRfZ3Jvd19mcm9tX3NpemUx X3RvXzIsIGJ1Zik7CisgIGJ1ZiA9IGluc2VydF9vbmx5X2hhc2hfc2V0c19s b2dnZXI6OmxvZyAoImluc2VydF9mb3VuZF9oYXNoX2NvbGxpc2lvbiIsCisJ CQkJCSAgIHN0YXRfaW5zZXJ0X2ZvdW5kX2hhc2hfY29sbGlzaW9uLAorCQkJ CQkgICBidWYpOworICBidWYgPSBpbnNlcnRfb25seV9oYXNoX3NldHNfbG9n Z2VyOjpsb2cgKCJkb3VibGVfdGhlX251bWJlcl9vZl9idWNrZXRzIiwKKwkJ CQkJICAgc3RhdF9kb3VibGVfdGhlX251bWJlcl9vZl9idWNrZXRzLAorCQkJ CQkgICBidWYpOworICAqYnVmID0gJ1wwJzsKK30KKworI2Vsc2UKKworLyog Tm8gc3RhdHMuICovCisjZGVmaW5lIGluY19ieShzdGF0bmFtZSwgYW1vdW50 KSBkbyB7IH0gd2hpbGUgKGZhbHNlICYmIChhbW91bnQpKQorCisjZW5kaWYK KworI2RlZmluZSBpbmMoc3RhdG5hbWUpIGluY19ieSAoc3RhdG5hbWUsIDEp CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIGNsYXNzIEhhc2hGY24sIGNs YXNzIEFsbG9jPgorY2xhc3MgaW5zZXJ0X29ubHlfaGFzaF9zZXRzCit7Cisg cHVibGljOgorICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKKyAgdHlwZWRlZiBz aXplX3Qgc2l6ZV90eXBlOworICB0eXBlZGVmIEFsbG9jIGFsbG9jX3R5cGU7 CisgIGVudW0geyBpbGxlZ2FsX2tleSA9IDEgfTsKKyAgZW51bSB7IG1pbl9j YXBhY2l0eSA9IDQgfTsKKyNpZiBIQVNIVEFCTEVfU1RBVFMKKyAgZW51bSB7 IHN0YXRzID0gdHJ1ZSB9OworI2Vsc2UKKyAgZW51bSB7IHN0YXRzID0gZmFs c2UgfTsKKyNlbmRpZgorCisgIC8qIERvIG5vdCBkaXJlY3RseSB1c2UgaW5z ZXJ0X29ubHlfaGFzaF9zZXQuICBJbnN0ZWFkLCB1c2UgdGhlCisgICAgIHN0 YXRpYyBtZXRob2RzIGJlbG93IHRvIGNyZWF0ZSBhbmQgbWFuaXB1bGF0ZSBv YmplY3RzIG9mIHRoZQorICAgICBmb2xsb3dpbmcgY2xhc3MuCisgIAorICAg ICBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiBlYWNoIHNldCBpcyByZXByZXNl bnRlZCBieSBhIHBvaW50ZXIKKyAgICAgcGx1cywgcGVyaGFwcywgb3V0LW9m LWxpbmUgZGF0YSwgd2hpY2ggd291bGQgYmUgYW4gb2JqZWN0IG9mIHR5cGUK KyAgICAgaW5zZXJ0X29ubHlfaGFzaF9zZXQuICBGb3IgYSBwb2ludGVyLCBz LCB0aGUgaW50ZXJwcmV0YXRpb24gaXM6IHMKKyAgICAgPT0gTlVMTCBtZWFu cyBlbXB0eSBzZXQsIGxzYihzKSA9PSAxIG1lYW5zIGEgc2V0IHdpdGggb25l CisgICAgIGVsZW1lbnQsIHdoaWNoIGlzICh1aW50cHRyX3QpcyAtIDEsIGFu ZCBvdGhlcndpc2UgcyBpcyBhIHBvaW50ZXIKKyAgICAgb2YgdHlwZSBpbnNl cnRfb25seV9oYXNoX3NldCouICBTbywgdG8gaW5jcmVhc2UgdGhlIHNpemUg b2YgYSBzZXQKKyAgICAgd2UgaGF2ZSB0byBjaGFuZ2UgcyBhbmQvb3IgKnMu ICBUbyBjaGVjayBpZiBhIHNldCBjb250YWlucyBzb21lCisgICAgIGtleSB3 ZSBoYXZlIHRvIGV4YW1pbmUgcyBhbmQgcG9zc2libHkgKnMuICAqLworICBj bGFzcyBpbnNlcnRfb25seV9oYXNoX3NldAorICB7CisgICBwdWJsaWM6Cisg ICAgLyogSW5zZXJ0IGEga2V5LiAgVGhlIGtleSBtdXN0IG5vdCBiZSBhIHJl c2VydmVkIGtleS4gICovCisgICAgc3RhdGljIGlubGluZSBpbnNlcnRfb25s eV9oYXNoX3NldCAqaW5zZXJ0IChrZXlfdHlwZSBrZXksCisJCQkJCQlpbnNl cnRfb25seV9oYXNoX3NldCAqcyk7CisgICAgCisKKyAgICAvKiBDcmVhdGUg YW4gZW1wdHkgc2V0LiAgKi8KKyAgICBzdGF0aWMgaW5saW5lIGluc2VydF9v bmx5X2hhc2hfc2V0ICpjcmVhdGUgKHNpemVfdHlwZSBjYXBhY2l0eSk7CisK KyAgICAvKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4ga2V5IGlzIHByZXNl bnQuICBJZiBrZXkgaXMgaWxsZWdhbF9rZXkKKyAgICAgICB0aGVuIGVpdGhl ciB0cnVlIG9yIGZhbHNlIG1heSBiZSByZXR1cm5lZCwgYnV0IGZvciBhbGwg b3RoZXIKKyAgICAgICByZXNlcnZlZCBrZXlzIGZhbHNlIHdpbGwgYmUgcmV0 dXJuZWQuICAqLworICAgIHN0YXRpYyBib29sCisgICAgY29udGFpbnMgKGtl eV90eXBlIGtleSwgY29uc3QgaW5zZXJ0X29ubHlfaGFzaF9zZXQgKnMpCisg ICAgeworICAgICAgaWYgKHN0YXRzKQorCXsKKwkgIGluYyAoc3RhdF9jb250 YWlucyk7CisJICBzd2l0Y2ggKHNpemUgKHMpKQorCSAgICB7CisJICAgICAg Y2FzZSAwOiBpbmMgKHN0YXRfY29udGFpbnNfc2l6ZTApOyBicmVhazsKKwkg ICAgICBjYXNlIDE6IGluYyAoc3RhdF9jb250YWluc19zaXplMSk7IGJyZWFr OworCSAgICAgIGNhc2UgMjogaW5jIChzdGF0X2NvbnRhaW5zX3NpemUyKTsg YnJlYWs7CisJICAgICAgY2FzZSAzOiBpbmMgKHN0YXRfY29udGFpbnNfc2l6 ZTMpOyBicmVhazsKKwkgICAgICBjYXNlIDQ6IGluYyAoc3RhdF9jb250YWlu c19zaXplNCk7IGJyZWFrOworCSAgICAgIGNhc2UgNTogaW5jIChzdGF0X2Nv bnRhaW5zX3NpemU1KTsgYnJlYWs7CisJICAgICAgY2FzZSA2OiBpbmMgKHN0 YXRfY29udGFpbnNfc2l6ZTYpOyBicmVhazsKKwkgICAgICBjYXNlIDc6IGlu YyAoc3RhdF9jb250YWluc19zaXplNyk7IGJyZWFrOworCSAgICAgIGNhc2Ug ODogaW5jIChzdGF0X2NvbnRhaW5zX3NpemU4KTsgYnJlYWs7CisJICAgICAg Y2FzZSA5OiBpbmMgKHN0YXRfY29udGFpbnNfc2l6ZTkpOyBicmVhazsKKwkg ICAgICBjYXNlIDEwOiBpbmMgKHN0YXRfY29udGFpbnNfc2l6ZTEwKTsgYnJl YWs7CisJICAgICAgY2FzZSAxMTogaW5jIChzdGF0X2NvbnRhaW5zX3NpemUx MSk7IGJyZWFrOworCSAgICAgIGNhc2UgMTI6IGluYyAoc3RhdF9jb250YWlu c19zaXplMTIpOyBicmVhazsKKwkgICAgICBkZWZhdWx0OiBpbmMgKHN0YXRf Y29udGFpbnNfc2l6ZTEzX29yX21vcmUpOyBicmVhazsKKwkgICAgfQorICAg ICAgICAgIGluY19ieSAoc3RhdF9jb250YWluc19zaXplcywgc2l6ZSAocykp OworCX0KKworICAgICAgcmV0dXJuIChzaW5nbGV0b24gKHMpID8KKyAgICAg ICAgICAgICAgc2luZ2xldG9uX2tleSAoa2V5KSA9PSBzIDoKKyAgICAgICAg ICAgICAgKChzICE9IE5VTEwpICYmIHMtPmNvbnRhaW5zIChrZXkpKSk7Cisg ICAgfQorCisgICAgLyogUmV0dXJuIGEgc2V0J3Mgc2l6ZS4gICovCisgICAg c3RhdGljIHNpemVfdHlwZQorICAgIHNpemUgKGNvbnN0IGluc2VydF9vbmx5 X2hhc2hfc2V0ICpzKQorICAgIHsgcmV0dXJuIChzID09IE5VTEwpID8gMCA6 IChzaW5nbGV0b24gKHMpID8gMSA6IHMtPm51bV9lbnRyaWVzKTsgfQorCisg ICAgc3RhdGljIGlubGluZSBpbnNlcnRfb25seV9oYXNoX3NldCAqcmVzaXpl IChzaXplX3R5cGUgdGFyZ2V0X251bV9idWNrZXRzLAorCQkJCQkJaW5zZXJ0 X29ubHlfaGFzaF9zZXQgKnMpOworICAgIAorCisgICBwcml2YXRlOgorICAg IC8qIFJldHVybiB3aGV0aGVyIGEgc2V0IGhhcyBzaXplIDEuICovCisgICAg c3RhdGljIGJvb2wKKyAgICBzaW5nbGV0b24gKGNvbnN0IGluc2VydF9vbmx5 X2hhc2hfc2V0ICpzKQorICAgIHsgcmV0dXJuICh1aW50cHRyX3QpIHMgJiAx OyB9CisKKyAgICAvKiBSZXR1cm4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEg c2luZ2xldG9uIHNldCBjb250YWluaW5nIHRoZQorICAgICAgIGdpdmVuIGtl eS4gICovCisgICAgc3RhdGljIGluc2VydF9vbmx5X2hhc2hfc2V0ICoKKyAg ICBzaW5nbGV0b25fa2V5IChrZXlfdHlwZSBrZXkpCisgICAgeyByZXR1cm4g KGluc2VydF9vbmx5X2hhc2hfc2V0ICopICgodWludHB0cl90KSBrZXkgKyAx KTsgfQorCisgICAgLyogR2l2ZW4gYSBzaW5nbGV0b24gc2V0LCB3aGF0IGtl eSBkb2VzIGl0IGNvbnRhaW4/ICAqLworICAgIHN0YXRpYyBrZXlfdHlwZQor ICAgIGV4dHJhY3Rfc2luZ2xldG9uX2tleSAoY29uc3QgaW5zZXJ0X29ubHlf aGFzaF9zZXQgKnMpCisgICAgeworICAgICAgVlRWX0RFQlVHX0FTU0VSVCAo c2luZ2xldG9uIChzKSk7CisgICAgICByZXR1cm4gKGtleV90eXBlKSAoKHVp bnRwdHJfdCkgcyAtIDEpOworICAgIH0KKworICAgIHZvbGF0aWxlIGtleV90 eXBlICYKKyAgICBrZXlfYXRfaW5kZXggKHNpemVfdHlwZSBpbmRleCkKKyAg ICB7IHJldHVybiBidWNrZXRzW2luZGV4XTsgfQorCisgICAga2V5X3R5cGUK KyAgICBrZXlfYXRfaW5kZXggKHNpemVfdHlwZSBpbmRleCkgY29uc3QKKyAg ICB7IHJldHVybiBidWNrZXRzW2luZGV4XTsgfQorCisgICAgc2l6ZV90eXBl CisgICAgbmV4dF9pbmRleCAoc2l6ZV90eXBlIGluZGV4LCBzaXplX3R5cGUg aW5kaWNlc19leGFtaW5lZCkgY29uc3QKKyAgICB7IHJldHVybiAoaW5kZXgg KyBpbmRpY2VzX2V4YW1pbmVkKSAmIChudW1fYnVja2V0cyAtIDEpOyB9CisK KyAgICBpbmxpbmUgdm9pZCBpbnNlcnRfbm9fcmVzaXplIChrZXlfdHlwZSBr ZXkpOworICAgIAorICAgIGlubGluZSBib29sIGNvbnRhaW5zIChrZXlfdHlw ZSBrZXkpIGNvbnN0OworICAgIAorICAgIGlubGluZSBpbnNlcnRfb25seV9o YXNoX3NldCAqcmVzaXplX2lmX25lY2Vzc2FyeSAodm9pZCk7CisgICAgCisg ICAgc2l6ZV90eXBlIG51bV9idWNrZXRzOyAgLyogTXVzdCBiZSBhIHBvd2Vy IG9mIDIgbm90IGxlc3MgdGhhbgorCQkJICAgICAgIG1pbl9jYXBhY2l0eS4g ICovCisgICAgdm9sYXRpbGUgc2l6ZV90eXBlIG51bV9lbnRyaWVzOworICAg IHZvbGF0aWxlIGtleV90eXBlIGJ1Y2tldHNbMF07ICAvKiBBY3R1YWwgYXJy YXkgc2l6ZSBpcyBudW1fYnVja2V0cy4gICovCisgIH07CisKKyAgLyogQ3Jl YXRlIGFuIGVtcHR5IHNldCB3aXRoIHRoZSBnaXZlbiBjYXBhY2l0eS4gIFJl cXVpcmVzIHRoYXQgbiBiZQorICAgICAwIG9yIGEgcG93ZXIgb2YgMi4gIElm IDEgPCBuIDwgbWluX2NhcGFjaXR5IHRoZW4gdHJlYXQgbiBhcworICAgICBt aW5fY2FwYWNpdHkuICBTZXRzICpoYW5kbGUuICBSZXR1cm5zIHRydWUgdW5s ZXNzIHRoZSBhbGxvY2F0b3IKKyAgICAgZmFpbHMuICBTdWJzZXF1ZW50IG9w ZXJhdGlvbnMgb24gdGhpcyBzZXQgc2hvdWxkIHVzZSB0aGUgc2FtZQorICAg ICBoYW5kbGUuICovCisKKyAgc3RhdGljIGlubGluZSBib29sIGNyZWF0ZSAo c2l6ZV90eXBlIG4sIGluc2VydF9vbmx5X2hhc2hfc2V0ICoqaGFuZGxlKTsK KworICAvKiBGb3JjZSB0aGUgY2FwYWNpdHkgb2YgYSBzZXQgdG8gYmUgbiwg dW5sZXNzIGl0IHdhcyBtb3JlIHRoYW4gbgorICAgICBhbHJlYWR5LiAgUmVx dWlyZXMgdGhhdCBuIGJlIDAgb3IgYSBwb3dlciBvZiAyLiAgU2V0cyAqaGFu ZGxlCisgICAgIHVubGVzcyB0aGUgY3VycmVudCBjYXBhY2l0eSBpcyBuIG9y IG1vcmUuICBSZXR1cm5zIHRydWUgdW5sZXNzCisgICAgIHRoZSBhbGxvY2F0 b3IgZmFpbHMuICAqLworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCByZXNpemUg KHNpemVfdHlwZSBuLCBpbnNlcnRfb25seV9oYXNoX3NldCAqKmhhbmRsZSk7 CisKKyAgLyogSW5zZXJ0IGEga2V5LiAgKmhhbmRsZSBpcyB1bm1vZGlmaWVk IHVubGVzcyAoMSkgYSByZXNpemUgb2NjdXJzLAorICAgICBvciAoMikgdGhl IHNldCB3YXMgaW5pdGlhbGx5IGVtcHR5LiBSZXR1cm5zIHRydWUgdW5sZXNz IHRoZQorICAgICBhbGxvY2F0b3IgZmFpbHMgZHVyaW5nIGEgcmVzaXplLiAg SWYgdGhlIGFsbG9jYXRvciBmYWlscyBkdXJpbmcgYQorICAgICByZXNpemUg dGhlbiB0aGUgc2V0IGlzIHJlc2V0IHRvIGJlIHRoZSBlbXB0eSBzZXQuICBU aGUga2V5IG11c3QKKyAgICAgbm90IGJlIGEgcmVzZXJ2ZWQga2V5LiAgKi8K KworICBzdGF0aWMgaW5saW5lIGJvb2wgaW5zZXJ0IChrZXlfdHlwZSBrZXks IGluc2VydF9vbmx5X2hhc2hfc2V0ICoqaGFuZGxlKTsKKworICAvKiBDaGVj ayBmb3IgdGhlIHByZXNlbmNlIG9mIGEga2V5LiAgSWYga2V5IGlzIGlsbGVn YWxfa2V5IHRoZW4KKyAgICAgZWl0aGVyIHRydWUgb3IgZmFsc2UgbWF5IGJl IHJldHVybmVkLCBidXQgZm9yIGFsbCBvdGhlciByZXNlcnZlZAorICAgICBr ZXlzIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuICAqLworCisgIHN0YXRpYyBp bmxpbmUgYm9vbAorICBjb250YWlucyAoa2V5X3R5cGUga2V5LCAvKiBjb25z dCAqLyBpbnNlcnRfb25seV9oYXNoX3NldCAqKmhhbmRsZSkKKyAgeyByZXR1 cm4gaW5zZXJ0X29ubHlfaGFzaF9zZXQ6OmNvbnRhaW5zIChrZXksICpoYW5k bGUpOyB9CisKKyAgLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBz ZXQuICAqLworICBzdGF0aWMgc2l6ZV90eXBlCisgIHNpemUgKGNvbnN0IGlu c2VydF9vbmx5X2hhc2hfc2V0ICoqaGFuZGxlKQorICB7IHJldHVybiBpbnNl cnRfb25seV9oYXNoX3NldDo6c2l6ZSAoKmhhbmRsZSk7IH0KKworICBzdGF0 aWMgYm9vbAorICBpc19yZXNlcnZlZF9rZXkgKGtleV90eXBlIGtleSkKKyAg eyByZXR1cm4gKCh1aW50cHRyX3QpIGtleSAlIDIpID09IDE7IH0KK307CisK K3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIGNsYXNzIEhhc2hGY24sIGNsYXNz IEFsbG9jPgordHlwZW5hbWUgaW5zZXJ0X29ubHlfaGFzaF9zZXRzIDxLZXks IEhhc2hGY24sIEFsbG9jPjo6aW5zZXJ0X29ubHlfaGFzaF9zZXQgKgoraW5z ZXJ0X29ubHlfaGFzaF9zZXRzIDxLZXksIEhhc2hGY24sIEFsbG9jPjo6aW5z ZXJ0X29ubHlfaGFzaF9zZXQ6OnJlc2l6ZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90eXBlIG4sIGluc2VydF9v bmx5X2hhc2hfc2V0ICpzKQoreworICBpZiAocyA9PSBOVUxMKQorICAgIHJl dHVybiBjcmVhdGUgKG4pOworCisgIHNpemVfdHlwZSBjYXBhY2l0eSA9IHNp bmdsZXRvbiAocykgPyAxIDogcy0+bnVtX2J1Y2tldHM7CisKKyAgaWYgKG4g PD0gY2FwYWNpdHkpCisgICAgcmV0dXJuIHM7CisKKyAgaW5zZXJ0X29ubHlf aGFzaF9zZXQgKnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNyZWF0ZSAoc3RkOjptYXg8c2l6ZV90eXBlPiAobiwgbWluX2Nh cGFjaXR5KSk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICB7CisgICAg ICBpZiAoc2luZ2xldG9uIChzKSkKKyAgICAgICAgeworICAgICAgICAgIHJl c3VsdC0+aW5zZXJ0X25vX3Jlc2l6ZSAoZXh0cmFjdF9zaW5nbGV0b25fa2V5 IChzKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAg ICAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgcy0+bnVtX2J1Y2tl dHM7IGkrKykKKyAgICAgICAgICAgIGlmIChzLT5idWNrZXRzW2ldICE9IChr ZXlfdHlwZSkgaWxsZWdhbF9rZXkpCisgICAgICAgICAgICAgIHJlc3VsdC0+ aW5zZXJ0X25vX3Jlc2l6ZSAocy0+YnVja2V0c1tpXSk7CisgICAgICAgIH0K KyAgICAgIFZUVl9ERUJVR19BU1NFUlQgKHNpemUgKHJlc3VsdCkgPT0gc2l6 ZSAocykpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxh dGUgPHR5cGVuYW1lIEtleSwgY2xhc3MgSGFzaEZjbiwgY2xhc3MgQWxsb2M+ Cit0eXBlbmFtZSBpbnNlcnRfb25seV9oYXNoX3NldHMgPEtleSwgSGFzaEZj biwgQWxsb2M+OjppbnNlcnRfb25seV9oYXNoX3NldCAqCitpbnNlcnRfb25s eV9oYXNoX3NldHMgPEtleSwgSGFzaEZjbiwgQWxsb2M+OjppbnNlcnRfb25s eV9oYXNoX3NldDo6aW5zZXJ0IAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChrZXlfdHlwZSBrZXksIGluc2VydF9vbmx5X2hh c2hfc2V0ICpzKQoreworICBWVFZfREVCVUdfQVNTRVJUICghaXNfcmVzZXJ2 ZWRfa2V5IChrZXkpKTsKKworICBpbmNfYnkgKHN0YXRfZ3Jvd19mcm9tX3Np emUwX3RvXzEsIHMgPT0gTlVMTCk7CisKKyAgaWYgKHMgPT0gTlVMTCkKKyAg ICByZXR1cm4gc2luZ2xldG9uX2tleSAoa2V5KTsKKworICBpZiAoc2luZ2xl dG9uIChzKSkKKyAgICB7CisgICAgICBjb25zdCBrZXlfdHlwZSBvbGRfa2V5 ID0gZXh0cmFjdF9zaW5nbGV0b25fa2V5IChzKTsKKyAgICAgIGlmIChvbGRf a2V5ID09IGtleSkKKwlyZXR1cm4gczsKKworICAgICAgLyogR3JvdyBmcm9t IHNpemUgMSB0byBzaXplIDIuICAqLworICAgICAgaW5jIChzdGF0X2dyb3df ZnJvbV9zaXplMV90b18yKTsKKyAgICAgIHMgPSBjcmVhdGUgKDIpOworICAg ICAgaWYgKHMgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgcy0+ aW5zZXJ0X25vX3Jlc2l6ZSAob2xkX2tleSk7CisgICAgICBzLT5pbnNlcnRf bm9fcmVzaXplIChrZXkpOworICAgICAgVlRWX0RFQlVHX0FTU0VSVCAoc2l6 ZSAocykgPT0gMik7CisgICAgICByZXR1cm4gczsKKyAgICB9CisgIHMgPSBz LT5yZXNpemVfaWZfbmVjZXNzYXJ5KCk7CisgIGlmIChzICE9IE5VTEwpCisg ICAgcy0+aW5zZXJ0X25vX3Jlc2l6ZSAoa2V5KTsKKyAgcmV0dXJuIHM7Cit9 CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIGNsYXNzIEhhc2hGY24sIGNs YXNzIEFsbG9jPgordHlwZW5hbWUgaW5zZXJ0X29ubHlfaGFzaF9zZXRzIDxL ZXksIEhhc2hGY24sIEFsbG9jPjo6aW5zZXJ0X29ubHlfaGFzaF9zZXQgKgor aW5zZXJ0X29ubHlfaGFzaF9zZXRzIDxLZXksIEhhc2hGY24sIEFsbG9jPjo6 aW5zZXJ0X29ubHlfaGFzaF9zZXQ6OmNyZWF0ZQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo c2l6ZV90eXBlIGNhcGFjaXR5KQoreworICBpZiAoY2FwYWNpdHkgPD0gMSkK KyAgICByZXR1cm4gTlVMTDsKKworICBWVFZfREVCVUdfQVNTRVJUIChjYXBh Y2l0eSA+IDEgJiYgKGNhcGFjaXR5ICYgKGNhcGFjaXR5IC0gMSkpID09IDAp OworICBWVFZfREVCVUdfQVNTRVJUIChzaXplb2YgKGluc2VydF9vbmx5X2hh c2hfc2V0KSA9PSAyICogc2l6ZW9mIChzaXplX3R5cGUpKTsKKyAgY2FwYWNp dHkgPSBzdGQ6Om1heCA8c2l6ZV90eXBlPiAoY2FwYWNpdHksIG1pbl9jYXBh Y2l0eSk7CisgIGNvbnN0IHNpemVfdCBudW1fYnl0ZXMgPSBzaXplb2YgKGlu c2VydF9vbmx5X2hhc2hfc2V0KSArCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoa2V5X3R5cGUp ICogY2FwYWNpdHk7CisgIGFsbG9jX3R5cGUgYWxsb2M7CisgIGluc2VydF9v bmx5X2hhc2hfc2V0ICpyZXN1bHQgPSAoaW5zZXJ0X29ubHlfaGFzaF9zZXQg KikgYWxsb2MgKG51bV9ieXRlcyk7CisgIHJlc3VsdC0+bnVtX2J1Y2tldHMg PSBjYXBhY2l0eTsKKyAgcmVzdWx0LT5udW1fZW50cmllcyA9IDA7CisgIGZv ciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgY2FwYWNpdHk7IGkrKykKKyAgICBy ZXN1bHQtPmJ1Y2tldHNbaV0gPSAoa2V5X3R5cGUpIGlsbGVnYWxfa2V5Owor ICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5 LCBjbGFzcyBIYXNoRmNuLCBjbGFzcyBBbGxvYz4KK3ZvaWQKK2luc2VydF9v bmx5X2hhc2hfc2V0czxLZXksIEhhc2hGY24sCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBBbGxvYz46Omluc2VydF9vbmx5X2hhc2hfc2V0 OjppbnNlcnRfbm9fcmVzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlf dHlwZSBrZXkpCit7CisgIEhhc2hGY24gaGFzaGVyOworICBjb25zdCBzaXpl X3R5cGUgY2FwYWNpdHkgPSBudW1fYnVja2V0czsKKyAgVlRWX0RFQlVHX0FT U0VSVCAoY2FwYWNpdHkgPj0gbWluX2NhcGFjaXR5KTsKKyAgVlRWX0RFQlVH X0FTU0VSVCAoIWlzX3Jlc2VydmVkX2tleSAoa2V5KSk7CisgIHNpemVfdHlw ZSBpbmRleCA9IGhhc2hlciAoa2V5KSAmIChjYXBhY2l0eSAtIDEpOworICBr ZXlfdHlwZSBrID0ga2V5X2F0X2luZGV4IChpbmRleCk7CisgIHNpemVfdHlw ZSBpbmRpY2VzX2V4YW1pbmVkID0gMDsKKyAgd2hpbGUgKGsgIT0ga2V5KQor ICAgIHsKKyAgICAgICsraW5kaWNlc19leGFtaW5lZDsKKyAgICAgIGlmIChr ID09IChrZXlfdHlwZSkgaWxsZWdhbF9rZXkpCisgICAgICAgIHsKKyAgICAg ICAgICBrZXlfYXRfaW5kZXggKGluZGV4KSA9IGtleTsKKyAgICAgICAgICAr K251bV9lbnRyaWVzOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor ICAgICAgZWxzZQorCXsKKwkgIGluY19ieSAoc3RhdF9pbnNlcnRfZm91bmRf aGFzaF9jb2xsaXNpb24sCisJCSAgaGFzaGVyIChrKSA9PSBoYXNoZXIgKGtl eSkpOworCX0KKyAgICAgIFZUVl9ERUJVR19BU1NFUlQgKGluZGljZXNfZXhh bWluZWQgPCBjYXBhY2l0eSk7CisgICAgICBpbmRleCA9IG5leHRfaW5kZXgg KGluZGV4LCBpbmRpY2VzX2V4YW1pbmVkKTsKKyAgICAgIGsgPSBrZXlfYXRf aW5kZXggKGluZGV4KTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1l IEtleSwgY2xhc3MgSGFzaEZjbiwgY2xhc3MgQWxsb2M+Citib29sCitpbnNl cnRfb25seV9oYXNoX3NldHM8S2V5LCBIYXNoRmNuLCBBbGxvYz46Omluc2Vy dF9vbmx5X2hhc2hfc2V0Ojpjb250YWlucworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5 X3R5cGUga2V5KSBjb25zdAoreworICBpbmMgKHN0YXRfY29udGFpbnNfaW5f bm9uX3RyaXZpYWxfc2V0KTsKKyAgSGFzaEZjbiBoYXNoZXI7CisgIGNvbnN0 IHNpemVfdHlwZSBjYXBhY2l0eSA9IG51bV9idWNrZXRzOworICBzaXplX3R5 cGUgaW5kZXggPSBoYXNoZXIgKGtleSkgJiAoY2FwYWNpdHkgLSAxKTsKKyAg a2V5X3R5cGUgayA9IGtleV9hdF9pbmRleCAoaW5kZXgpOworICBzaXplX3R5 cGUgaW5kaWNlc19leGFtaW5lZCA9IDA7CisgIGluYyAoc3RhdF9wcm9iZXNf aW5fbm9uX3RyaXZpYWxfc2V0KTsKKyAgd2hpbGUgKGsgIT0ga2V5KQorICAg IHsKKyAgICAgICsraW5kaWNlc19leGFtaW5lZDsKKyAgICAgIGlmICgvKlVO TElLRUxZKi8oayA9PSAoa2V5X3R5cGUpIGlsbGVnYWxfa2V5CisJCSAgICAg ICB8fCBpbmRpY2VzX2V4YW1pbmVkID09IGNhcGFjaXR5KSkKKwlyZXR1cm4g ZmFsc2U7CisKKyAgICAgIGluZGV4ID0gbmV4dF9pbmRleCAoaW5kZXgsIGlu ZGljZXNfZXhhbWluZWQpOworICAgICAgayA9IGtleV9hdF9pbmRleCAoaW5k ZXgpOworICAgICAgaW5jIChzdGF0X3Byb2Jlc19pbl9ub25fdHJpdmlhbF9z ZXQpOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0 eXBlbmFtZSBLZXksIGNsYXNzIEhhc2hGY24sIGNsYXNzIEFsbG9jPgordHlw ZW5hbWUgaW5zZXJ0X29ubHlfaGFzaF9zZXRzIDxLZXksIEhhc2hGY24sIEFs bG9jPjo6aW5zZXJ0X29ubHlfaGFzaF9zZXQgKgorICAgaW5zZXJ0X29ubHlf aGFzaF9zZXRzPEtleSwgSGFzaEZjbiwKKyAgICAgICAgICAgICAgICAgICAg ICAgQWxsb2M+OjppbnNlcnRfb25seV9oYXNoX3NldDo6cmVzaXplX2lmX25l Y2Vzc2FyeSAodm9pZCkKK3sKKyAgVlRWX0RFQlVHX0FTU0VSVCAobnVtX2J1 Y2tldHMgPj0gbWluX2NhcGFjaXR5KTsKKyAgc2l6ZV90eXBlIHVudXNlZCA9 IG51bV9idWNrZXRzIC0gbnVtX2VudHJpZXM7CisgIGlmICh1bnVzZWQgPCAo bnVtX2J1Y2tldHMgPj4gMikpCisgICAgeworICAgICAgaW5jIChzdGF0X2Rv dWJsZV90aGVfbnVtYmVyX29mX2J1Y2tldHMpOworICAgICAgc2l6ZV90eXBl IG5ld19udW1fYnVja2V0cyA9IG51bV9idWNrZXRzICogMjsKKyAgICAgIGlu c2VydF9vbmx5X2hhc2hfc2V0ICpzID0gY3JlYXRlIChuZXdfbnVtX2J1Y2tl dHMpOworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYnVj a2V0czsgaSsrKQorICAgICAgICBpZiAoYnVja2V0c1tpXSAhPSAoa2V5X3R5 cGUpIGlsbGVnYWxfa2V5KQorICAgICAgICAgIHMtPmluc2VydF9ub19yZXNp emUgKGJ1Y2tldHNbaV0pOworICAgICAgVlRWX0RFQlVHX0FTU0VSVCAoc2l6 ZSAodGhpcykgPT0gc2l6ZSAocykpOworICAgICAgcmV0dXJuIHM7CisgICAg fQorICBlbHNlCisgICAgcmV0dXJuIHRoaXM7Cit9CisKK3RlbXBsYXRlPHR5 cGVuYW1lIEtleSwgY2xhc3MgSGFzaEZjbiwgY2xhc3MgQWxsb2M+Citib29s CitpbnNlcnRfb25seV9oYXNoX3NldHM8S2V5LCBIYXNoRmNuLCBBbGxvYz46 OmNyZWF0ZSAoc2l6ZV90eXBlIG4sCisJCQkJCQkgaW5zZXJ0X29ubHlfaGFz aF9zZXQgKipoYW5kbGUpCisgIAoreworICBpbmMgKHN0YXRfY3JlYXRlKTsK KyAgKmhhbmRsZSA9IGluc2VydF9vbmx5X2hhc2hfc2V0OjpjcmVhdGUgKG4p OworICByZXR1cm4gKG4gPD0gMSkgfHwgKCpoYW5kbGUgIT0gTlVMTCk7Cit9 CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtleSwgY2xhc3MgSGFzaEZjbiwgY2xh c3MgQWxsb2M+Citib29sCitpbnNlcnRfb25seV9oYXNoX3NldHM8S2V5LCBI YXNoRmNuLCBBbGxvYz46OnJlc2l6ZSAoc2l6ZV90eXBlIG4sCisJCQkJCSAg ICAgICAgIGluc2VydF9vbmx5X2hhc2hfc2V0ICoqaGFuZGxlKQoreworICBp bmMgKHN0YXRfcmVzaXplKTsKKyAgKmhhbmRsZSA9IGluc2VydF9vbmx5X2hh c2hfc2V0OjpyZXNpemUgKG4sICpoYW5kbGUpOworICByZXR1cm4gKG4gPD0g MSkgfHwgKCpoYW5kbGUgIT0gTlVMTCk7Cit9CisKK3RlbXBsYXRlPHR5cGVu YW1lIEtleSwgY2xhc3MgSGFzaEZjbiwgY2xhc3MgQWxsb2M+Citib29sCitp bnNlcnRfb25seV9oYXNoX3NldHM8S2V5LCBIYXNoRmNuLCBBbGxvYz46Omlu c2VydCAoa2V5X3R5cGUga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9vbmx5X2hhc2hfc2V0 ICoqaGFuZGxlKQoreworICBpbmMgKHN0YXRfaW5zZXJ0KTsKKyAgY29uc3Qg c2l6ZV90eXBlIG9sZF9zaXplID0gaW5zZXJ0X29ubHlfaGFzaF9zZXQ6OnNp emUgKCpoYW5kbGUpOworICAqaGFuZGxlID0gaW5zZXJ0X29ubHlfaGFzaF9z ZXQ6Omluc2VydCAoa2V5LCAqaGFuZGxlKTsKKyAgaWYgKCpoYW5kbGUgIT0g TlVMTCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgZGVsdGEgPSBp bnNlcnRfb25seV9oYXNoX3NldDo6c2l6ZSAoKmhhbmRsZSkgLSBvbGRfc2l6 ZTsKKyAgICAgIGluY19ieSAoc3RhdF9pbnNlcnRfa2V5X3RoYXRfd2FzX2Fs cmVhZHlfcHJlc2VudCwgZGVsdGEgPT0gMCk7CisgICAgfQorICByZXR1cm4g KmhhbmRsZSAhPSBOVUxMOworfQorCisjZW5kaWYgLyogVlRWX1NFVF9IICAq LwpJbmRleDogbGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfdXRpbHMuaAo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJzdGRjKystdjMvbGlic3Vw YysrL3Z0dl91dGlscy5oCShyZXZpc2lvbiAwKQorKysgbGlic3RkYysrLXYz L2xpYnN1cGMrKy92dHZfdXRpbHMuaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr MSw1MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyCisgICBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0ND LgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRl ciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0 aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0 aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1 bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisK KyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRo ZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENP UFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRl ZiBfVlRWX1VUSUxTX0gKKyNkZWZpbmUgX1ZUVl9VVElMU19IIDEKKworI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorCitleHRlcm4gYm9vbCB2dHZfZGVidWc7CisK Ky8qIEhhbmRsZXIgZm9yIHZlcmlmaWNhdGlvbiBydW50aW1lIGVycm9ycy4g ICovCisjZGVmaW5lIFZUVl9lcnJvciBhYm9ydAorCisvKiBBc3NlcnRpb24g bWFjcm9zIHVzZWQgaW4gdnRhYmxlIHZlcmlmaWNhdGlvbiBydW50aW1lLiAg Ki8KKyNkZWZpbmUgVlRWX0FTU0VSVChFWFBSKSAoKGJvb2wpICghKEVYUFIp ID8gVlRWX2Vycm9yKCkgOiAodm9pZCkgMCkpCisjZGVmaW5lIFZUVl9ERUJV R19BU1NFUlQoRVhQUikgXAorICAgICAgICAgICAgICAgICAgICAgICgoYm9v bCkgKHZ0dl9kZWJ1ZyAmJiAhKEVYUFIpKSA/IFZUVl9lcnJvcigpIDogKHZv aWQpIDApCisKKy8qIE5hbWUgb2YgdGhlIHNlY3Rpb24gd2hlcmUgd2UgcHV0 IGdlbmVyYWwgVlRWIHZhcmlhYmxlcyBmb3IgcHJvdGVjdGlvbiAqLworI2Rl ZmluZSBWVFZfUFJPVEVDVEVEX1ZBUlNfU0VDVElPTiAiLnZ0YWJsZV9tYXBf dmFycyIKKyNkZWZpbmUgVlRWX1BST1RFQ1RFRF9WQVIgXAorICAgICAgICAg ICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoVlRWX1BS T1RFQ1RFRF9WQVJTX1NFQ1RJT04pKSkKKworLyogVGhlIGZvbGxvd2luZyBs b2dnaW5nIHJvdXRpbmVzIHRyeSB0byB1c2UgbG93IGxldmVsIGZpbGUgYWNj ZXNzCisgICByb3V0aW5lcyBhbmQgYXZvaWQgY2FsbGluZyBtYWxsb2MuIFdl IG5lZWQgdGhpcyBzbyB0aGF0IHdlIGRvbnQKKyAgIGRpc3R1cmIgdGhlIG9y ZGVyIG9mIGNhbGxzIHRvIGRsb3Blbi4gIENoYW5naW5nIHRoZSBvcmRlciBv ZiBkbG9wZW4KKyAgIGNhbGxzIG1heSBsZWFkIHRvIGRlYWRsb2NrcyAqLwor aW50IHZ0dl9vcGVuX2xvZyAoY29uc3QgY2hhciAqIG5hbWUpOworaW50IHZ0 dl9hZGRfdG9fbG9nIChpbnQgbG9nLCBjb25zdCBjaGFyICogZm9ybWF0LCAu Li4pOworCisjZW5kaWYgLyogVlRWX1VUSUxTX0ggKi8KSW5kZXg6IGxpYnN0 ZGMrKy12My9saWJzdXBjKysvdnR2X2luaXQuY2MKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gbGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfaW5pdC5j YwkocmV2aXNpb24gMCkKKysrIGxpYnN0ZGMrKy12My9saWJzdXBjKysvdnR2 X2luaXQuY2MJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTYgQEAKKy8qIENv cHlyaWdodCAoQykgMjAxMgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBv ciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKwor ICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2 ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJt aXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkg RXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUg TGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07Cisg ICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUg cmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4gICovCisKKworLyogVGhpcyBmaWxlIGNvbnRh aW5zIGFsbCB0aGUgZGVmaW5pdGlvbnMgdGhhdCBnbyBpbnRvIHRoZSBsaWJ2 dHZfaW5pdAorICAgbGlicmFyeSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgdnRh YmxlIHZlcmlmaWNhdGlvbiBmZWF0dXJlLiAgVGhpcworICAgbGlicmFyeSBz aG91bGQgY29udGFpbiBleGFjdGx5IHR3byBmdW5jdGlvbnNhIChfX1ZMVHVu cHJvdGVjdCBhbmQKKyAgIF9fVkxUcHJvdGVjdCkgYW5kIG9uZSBnbG9iYWwg dmFyaWFibGUgZGVmaW5pdGlvbgorICAgKF9fdnR2X2RlZmluZWRfaW5fdnR2 X2luaXRfbGliKS4gIEFueSBwcm9ncmFtIHRoYXQgd2FzIGNvbXBpbGVkCisg ICB3aXRoIHRoZSBvcHRpb24gIi1mdnRhYmxlLXZlcmlmeT1zdGQiIE1VU1Qg YWxzbyBiZSBsaW5rZWQgd2l0aAorICAgbGlidnR2X2luaXQsIGJlY2F1c2Ug dGhlIHR3byBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSB1c2VkIGJ5IHRo ZQorICAgdnRhYmxlIHZlcmlmaWNhdGlvbiBjb2RlLiAgVGhlIHJlYXNvbiB0 aGV5IGFyZSBpbiBhIHNlcGFyYXRlCisgICBsaWJyYXJ5IHJhdGhlciB0aGFu IGluIGxpYnN0ZGMrKyB3aXRoIGFsbCB0aGUgcmVzdCBvZiB0aGUgdnRhYmxl CisgICB2ZXJpZmljYXRpb24gcnVudGltZSBjb2RlIGlzIGFzIGZvbGxvd3Mu ICBFYWNoIC5vIGZpbGUgdGhhdCB3YXMKKyAgIGNvbXBpbGVkIHdpdGggdnRh YmxlIHZlcmlmaWNhdGlvbiB3aWxsIGNvbnRhaW4gY2FsbHMgaW50byB0aGUK KyAgIHJ1bnRpbWUgKG1hZGUgZnJvbSBjb25zdHJ1Y3RvciBpbml0aWFsaXph dGlvbiBmdW5jdGlvbnMpIHRvIGJ1aWxkCisgICB0aGUgZGF0YSBzdHJ1Y3R1 cmVzIG5lZWRlZCBmb3IgdmVyaWZpY2F0aW9uLiAgQXQgYWxsIHRpbWVzIGV4 Y2VwdAorICAgd2hlbiB0aGV5IGFyZSBiZWluZyBjb25zdHJ1Y3RlZCwgdGhl c2UgZGF0YSBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUKKyAgIGluIHByb3RlY3Rl ZCBtZW1vcnksIHNvIHRoYXQgYXR0YWNrZXJzIGNhbm5vdCBjb3JydXB0IHRo ZW0uCisgICBfX1ZMVHVucHJvdGVjdCBzZXRzIHRoZSBtZW1vcnkgY29udGFp bmluZyB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgdG8KKyAgIGJlIHdyaXRhYmxl LCBmb3IgdXBkYXRlcy4gIF9fVkxUcHJvdGVjdCBtYWtlcyB0aGUgbWVtb3J5 IHJlYWQtb25seSwKKyAgIGZvciBhbGwgb3RoZXIgdGltZXMuICBUaGlzIG1l bW9yeSBwcm90ZWN0aW9uIGFuZCB1bnByb3RlY3Rpb24gaXMKKyAgIGRvbmUg dmlhIGNhbGxzIHRvIG1wcm90ZWN0LCB3aGljaCBhcmUgY29zdGx5LiAgU28g aW5zdGVhZCBvZgorICAgY2FsbGluZyBfX1ZMVHVucHJvdGVjdCBhbmQgX19W TFRwcm90ZWN0IG9uY2UgcGVyIG9iamVjdCBmaWxlIHdlCisgICB3YW50IHRv IGNhbGwgdGhlbSBvbmNlIHBlciBleGVjdXRhYmxlLiAgVGhlcmVmb3JlIGlu c3RlYWQgb2YKKyAgIHB1dHRpbmcgY2FsbHMgdG8gdGhlbSBkaXJlY3RseSBp bnRvIGVhY2ggb2JqZWN0IGZpbGUsIHdlIHB1dCB0aGUKKyAgIGNhbGxzIHRv IHRoZW0gb25seSBpbiBfX1ZMVFJlZ2lzdGVyUGFpciwgaW4gdGhlIGxpYnN0 ZGMrKyBsaWJyYXJ5LgorICAgV2UgZ2l2ZSBfX1ZMVHVucHJvdGVjdCBhbiBp bml0aWFsaXphdGlvbiBwcmlvcml0eSB0byBtYWtlIGl0IHJ1bgorICAgYmVm b3JlIGFsbCBvZiBvdXIgZGF0YSBzdHJ1Y3R1cmUgY29uc3RydWN0aW9uIGZ1 bmN0aW9ucywgYW5kIHdlCisgICBnaXZlIF9fVkxUcHJvdGVjdCBhbiBpbml0 aWFsaXphdGlvbiBwcmlvcml0eSB0byBtYWtlIGl0IHJ1biBhZnRlcgorICAg YWxsIG9mIG91ciBkYXRhIHN0cnVjdHVyZSBjb25zdHJ1Y3RpaW9uIGZ1bmN0 aW9ucy4gIFdlIHB1dCB0aGVtCisgICBpbnRvIGEgc2VwYXJhdGUgbGlicmFy eSBhbmQgbGluayB0aGF0IGxpYnJhcnkgd2l0aCB0aGUKKyAgICItLXdob2xl LWFyY2hpdmUiIGxpbmtlciBvcHRpb24sIHRvIG1ha2Ugc3VyZSB0aGF0IGJv dGggZnVuY3Rpb25zIGdldAorICAgbGlua2VkIGluIChzaW5jZSB0aGUgYWN0 dWFsIGNhbGxzIHRvIHRoZW0gYXJlIGluIHRoZSBsaWJzdGRjKysKKyAgIHJ1 bnRpbWUpLiAgV2UgY2FuJ3QgcHV0IHRoZW0gaW50byBsaWJzdGRjKysgYmVj YXVzZSBsaW5raW5nCisgICBsaWJzdGRjKysgd2l0aCAiLS13aG9sZS1hcmNo aXZlIiBpcyBwcm9iYWJseSBub3QgYSBnb29kIGlkZWEuCisKKyAgIFRoZSBf X3Z0dl9kZWZpbmVkX2luX3Z0dl9saWIgdmFyaWFibGUgaXMgcmVmZXJlbmNl ZCwgYnV0IG5vdAorICAgZGVmaW5lZCwgaW4gdGhlIGNvbnN0cnVjdG9yIGlu aXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB3aGVyZSB3ZSBoYXZlCisgICB0aGUg Y2FsbHMgdG8gYnVpbGQgb3VyIGRhdGEgc3RydWN0dXJlcy4gIFRoZSBwdXJw b3NlIG9mIHRoaXMKKyAgIHZhcmlhYmxlIGlzIHRvIGNhdXNlIGEgbGlua2Vy IGVycm9yIHRvIG9jY3VyIGlmIHRoZSBwcm9ncmFtbWVyCisgICBjb21waWxl ZCB3aXRoIC1mdnRhYmxlLXZlcmlmeT1zdGQgYW5kIGRpZCBub3QgbGluayB3 aXRoIHRoZSB2dHZfaW50CisgICBsaWJyYXJ5IChiZXR0ZXIgYSBsaW5rLXRp bWUgZXJyb3IgdGhhbiBhIHJ1bi10aW1lIGVycm9yKS4gICovCisKKworLyog TmVlZHMgdG8gYnVpbGQgd2l0aCBDKysgYmVjYXVzZSB0aGUgZGVmaW5pdGlv biBvZgorICAgX19WTFRDaGFuZ2VQZXJtaXNzaW9uIGlzIGluIEMrKy4gICov CisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZXJyb3IgIlRoaXMgZmlsZSBtdXN0 IGJlIGNvbXBpbGVkIHdpdGggYSBDKysgY29tcGlsZXIiCisjZW5kaWYKKwor I2luY2x1ZGUgInZ0dl9ydHMuaCIKKworLyogI2luY2x1ZGUgPHN0ZGlvLmg+ ICovCisKKy8qIERlZmluZSB0aGlzIGR1bW15IHN5bWJvbCB0byBkZXRlY3Qg YXQgbGluayB0aW1lIHRoZSBjYXNlcyB3aGVyZQorICAgdXNlciBpcyBjb21w aWxpbmcgd2l0aCAtZnZ0YWJsZS12ZXJpZnk9c3RkIGFuZCBub3QgbGlua2lu ZyB3aXRoIHRoZQorICAgdnR2X2luaXQgbGlicmFyeS4gTm90ZSB0aGF0IHRo ZSB2aXNpYmlsaXR5IG5lZWRzIHRvIGJlIGhpZGRlbi4gRWFjaAorICAgb2Jq ZWN0IG1vZHVsZSBpcyBzdXBwb3NlZCB0byBsaW5rIHdpdGggdGhlIHZ0dl9p bml0IGxpYnJhcnkgYW5kIHdlCisgICBkb24ndCB3YW50IHRoaXMgZGVmaW5p dGlvbiB0byBjb21lIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSAqLwordW5z aWduZWQgaW50CitfX3Z0dl9kZWZpbmVkX2luX3Z0dl9pbml0X2xpYiBfX2F0 dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgPSAwOworCisK K19fYXR0cmlidXRlX18gKChjb25zdHJ1Y3Rvcig5OCkpKSB2b2lkCitfX1ZM VHVucHJvdGVjdCAodm9pZCkKK3sKKyAgX19WTFRDaGFuZ2VQZXJtaXNzaW9u IChfX1ZMVFBfUkVBRF9XUklURSk7Cit9CisKK19fYXR0cmlidXRlX18gKChj b25zdHJ1Y3RvcigxMDApKSkgdm9pZAorX19WTFRwcm90ZWN0ICh2b2lkKQor eworICBfX1ZMVENoYW5nZVBlcm1pc3Npb24gKF9fVkxUUF9SRUFEX09OTFkp OworfQpJbmRleDogbGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfbWFsbG9j LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGlic3RkYysrLXYzL2xp YnN1cGMrKy92dHZfbWFsbG9jLmgJKHJldmlzaW9uIDApCisrKyBsaWJzdGRj KystdjMvbGlic3VwYysrL3Z0dl9tYWxsb2MuaAkocmV2aXNpb24gMCkKQEAg LTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyCisvLyBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFy dCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisv LyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gR0NDIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8g VW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3Jh bnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4g dGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisv LyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEg Y29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxv bmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJ TkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90 LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKwor I2lmbmRlZiBfVlRWX01BTExPQ19ICisjZGVmaW5lIF9WVFZfTUFMTE9DX0gg MQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIEFsaWdubWVudCBtYXNr IGZvciBhbnkgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBWVFYgbWVtb3J5IHBv b2wgKi8KKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBWVFZfQUxJR05NRU5U X01BU0sgKDB4NykKKyNlbHNlCisjZGVmaW5lIFZUVl9BTElHTk1FTlRfTUFT SyAoMHgzKQorI2VuZGlmCisKK2V4dGVybiB2b2lkIFZUVl9tYWxsb2NfaW5p dCAodm9pZCk7CisKK2V4dGVybiB2b2lkICpWVFZfbWFsbG9jIChzaXplX3Qg c2l6ZSk7CitleHRlcm4gdm9pZCBWVFZfZnJlZSAodm9pZCAqIHB0cik7CisK KworZXh0ZXJuIHZvaWQgVlRWX21hbGxvY19wcm90ZWN0ICh2b2lkKTsKK2V4 dGVybiB2b2lkIFZUVl9tYWxsb2NfdW5wcm90ZWN0ICh2b2lkKTsKKworZXh0 ZXJuIHZvaWQgVlRWX21hbGxvY19zdGF0cyAodm9pZCk7CitleHRlcm4gdm9p ZCBWVFZfbWFsbG9jX2R1bXBfc3RhdHMgKHZvaWQpOworCisjZW5kaWYgLyog dnR2X21hbGxvYy5oICovCkluZGV4OiBsaWJzdGRjKystdjMvbGlic3VwYysr L01ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYnN0 ZGMrKy12My9saWJzdXBjKysvTWFrZWZpbGUuYW0JKHJldmlzaW9uIDE5NjI2 NikKKysrIGxpYnN0ZGMrKy12My9saWJzdXBjKysvTWFrZWZpbGUuYW0JKHdv cmtpbmcgY29weSkKQEAgLTI1LDcgKzI1LDcgQEAgaW5jbHVkZSAkKHRvcF9z cmNkaXIpL2ZyYWdtZW50LmFtCiAjIE5lZWQgdGhpcyBsaWJyYXJ5IHRvIGJv dGggYmUgcGFydCBvZiBsaWJzdGRjKysuYSwgYW5kIGluc3RhbGxlZAogIyBz ZXBhcmF0ZWx5IHRvby4KICMgMSkgc2VwYXJhdGUgbGlic3VwYysrLmxhCi10 b29sZXhlY2xpYl9MVExJQlJBUklFUyA9IGxpYnN1cGMrKy5sYQordG9vbGV4 ZWNsaWJfTFRMSUJSQVJJRVMgPSBsaWJzdXBjKysubGEgbGlidnR2X2luaXQu bGEgbGlidnR2X3N0dWJzLmxhCiAjIDIpIGludGVncmF0ZWQgbGlic3VwYysr Y29udmVuaWVuY2UubGEgdGhhdCBpcyB0byBiZSBhIHBhcnQgb2YgbGlic3Rk YysrLmEKIG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYnN1cGMrK2NvbnZlbmll bmNlLmxhCiAKQEAgLTkyLDEwICs5MiwyMSBAQCBzb3VyY2VzID0gXAogCXRp bmZvMi5jYyBcCiAJdmVjLmNjIFwKIAl2bWlfY2xhc3NfdHlwZV9pbmZvLmNj IFwKLQl2dGVybWluYXRlLmNjCisJdnRlcm1pbmF0ZS5jYyBcCisJdnR2X3J0 cy5jYyBcCisJdnR2X21hbGxvYy5jYyBcCisJdnR2X3V0aWxzLmNjCisKK3Z0 dl9pbml0X3NvdXJjZXMgPSBcCisJdnR2X2luaXQuY2MKKwordnR2X3N0dWJz X3NvdXJjZXMgPSBcCisJdnR2X3N0dWJzLmNjIAogCiBsaWJzdXBjX19fbGFf U09VUkNFUyA9ICQoc291cmNlcykgJChjX3NvdXJjZXMpCiBsaWJzdXBjX19j b252ZW5pZW5jZV9sYV9TT1VSQ0VTID0gJChzb3VyY2VzKSAkKGNfc291cmNl cykKK2xpYnZ0dl9pbml0X2xhX1NPVVJDRVMgPSAkKHZ0dl9pbml0X3NvdXJj ZXMpCitsaWJ2dHZfc3R1YnNfbGFfU09VUkNFUyA9ICQodnR2X3N0dWJzX3Nv dXJjZXMpCiAKIGNwLWRlbWFuZ2xlLmM6CiAJcm0gLWYgJEAKSW5kZXg6IGxp YnN0ZGMrKy12My9saWJzdXBjKysvTWFrZWZpbGUuaW4KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gbGlic3RkYysrLXYzL2xpYnN1cGMrKy9NYWtlZmls ZS5pbgkocmV2aXNpb24gMTk2MjY2KQorKysgbGlic3RkYysrLXYzL2xpYnN1 cGMrKy9NYWtlZmlsZS5pbgkod29ya2luZyBjb3B5KQpAQCAtMTAzLDcgKzEw Myw4IEBAIGFtX19vYmplY3RzXzEgPSBhcnJheV90eXBlX2luZm8ubG8gYXRl eGkKIAluZXdfaGFuZGxlci5sbyBuZXdfb3AubG8gbmV3X29wbnQubG8gbmV3 X29wdi5sbyBuZXdfb3B2bnQubG8gXAogCXBiYXNlX3R5cGVfaW5mby5sbyBw bWVtX3R5cGVfaW5mby5sbyBwb2ludGVyX3R5cGVfaW5mby5sbyBcCiAJcHVy ZS5sbyBzaV9jbGFzc190eXBlX2luZm8ubG8gdGluZm8ubG8gdGluZm8yLmxv IHZlYy5sbyBcCi0Jdm1pX2NsYXNzX3R5cGVfaW5mby5sbyB2dGVybWluYXRl LmxvCisJdm1pX2NsYXNzX3R5cGVfaW5mby5sbyB2dGVybWluYXRlLmxvIHZ0 dl9ydHMubG8gdnR2X21hbGxvYy5sbyBcCisJdnR2X3V0aWxzLmxvCiBAR0xJ QkNYWF9IT1NURURfVFJVRUBhbV9fb2JqZWN0c18yID0gY3AtZGVtYW5nbGUu bG8KIGFtX2xpYnN1cGNfX19sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18x KSAkKGFtX19vYmplY3RzXzIpCiBsaWJzdXBjX19fbGFfT0JKRUNUUyA9ICQo YW1fbGlic3VwY19fX2xhX09CSkVDVFMpCkBAIC0xMTEsNiArMTEyLDE0IEBA IGxpYnN1cGNfX2NvbnZlbmllbmNlX2xhX0xJQkFERCA9CiBhbV9saWJzdXBj X19jb252ZW5pZW5jZV9sYV9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18xKSAk KGFtX19vYmplY3RzXzIpCiBsaWJzdXBjX19jb252ZW5pZW5jZV9sYV9PQkpF Q1RTID0gIFwKIAkkKGFtX2xpYnN1cGNfX2NvbnZlbmllbmNlX2xhX09CSkVD VFMpCitsaWJ2dHZfaW5pdF9sYV9MSUJBREQgPQorYW1fX29iamVjdHNfMyA9 IHZ0dl9pbml0LmxvCithbV9saWJ2dHZfaW5pdF9sYV9PQkpFQ1RTID0gJChh bV9fb2JqZWN0c18zKQorbGlidnR2X2luaXRfbGFfT0JKRUNUUyA9ICQoYW1f bGlidnR2X2luaXRfbGFfT0JKRUNUUykKK2xpYnZ0dl9zdHVic19sYV9MSUJB REQgPQorYW1fX29iamVjdHNfNCA9IHZ0dl9zdHVicy5sbworYW1fbGlidnR2 X3N0dWJzX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzQpCitsaWJ2dHZf c3R1YnNfbGFfT0JKRUNUUyA9ICQoYW1fbGlidnR2X3N0dWJzX2xhX09CSkVD VFMpCiBERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9w X2J1aWxkZGlyKQogZGVwY29tcCA9CiBhbV9fZGVwZmlsZXNfbWF5YmUgPQpA QCAtMTIzLDcgKzEzMiw4IEBAIExJTksgPSAkKExJQlRPT0wpIC0tdGFnPUND ICQoQU1fTElCVE9PTEYKIENYWENPTVBJTEUgPSAkKENYWCkgJChERUZTKSAk KERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKIAkkKEFNX0NQUEZM QUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQog Q1hYTEQgPSAkKENYWCkKLVNPVVJDRVMgPSAkKGxpYnN1cGNfX19sYV9TT1VS Q0VTKSAkKGxpYnN1cGNfX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMpCitTT1VS Q0VTID0gJChsaWJzdXBjX19fbGFfU09VUkNFUykgJChsaWJzdXBjX19jb252 ZW5pZW5jZV9sYV9TT1VSQ0VTKSBcCisJJChsaWJ2dHZfaW5pdF9sYV9TT1VS Q0VTKSAkKGxpYnZ0dl9zdHVic19sYV9TT1VSQ0VTKQogSEVBREVSUyA9ICQo Yml0c19IRUFERVJTKSAkKHN0ZF9IRUFERVJTKQogRVRBR1MgPSBldGFncwog Q1RBR1MgPSBjdGFncwpAQCAtMzQ3LDcgKzM1Nyw3IEBAIEFNX0NQUEZMQUdT ID0gJChHTElCQ1hYX0lOQ0xVREVTKQogIyBOZWVkIHRoaXMgbGlicmFyeSB0 byBib3RoIGJlIHBhcnQgb2YgbGlic3RkYysrLmEsIGFuZCBpbnN0YWxsZWQK ICMgc2VwYXJhdGVseSB0b28uCiAjIDEpIHNlcGFyYXRlIGxpYnN1cGMrKy5s YQotdG9vbGV4ZWNsaWJfTFRMSUJSQVJJRVMgPSBsaWJzdXBjKysubGEKK3Rv b2xleGVjbGliX0xUTElCUkFSSUVTID0gbGlic3VwYysrLmxhIGxpYnZ0dl9p bml0LmxhIGxpYnZ0dl9zdHVicy5sYQogIyAyKSBpbnRlZ3JhdGVkIGxpYnN1 cGMrK2NvbnZlbmllbmNlLmxhIHRoYXQgaXMgdG8gYmUgYSBwYXJ0IG9mIGxp YnN0ZGMrKy5hCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJzdXBjKytjb252 ZW5pZW5jZS5sYQogc3RkX0hFQURFUlMgPSBcCkBAIC00MTAsMTAgKzQyMCwy MSBAQCBzb3VyY2VzID0gXAogCXRpbmZvMi5jYyBcCiAJdmVjLmNjIFwKIAl2 bWlfY2xhc3NfdHlwZV9pbmZvLmNjIFwKLQl2dGVybWluYXRlLmNjCisJdnRl cm1pbmF0ZS5jYyBcCisJdnR2X3J0cy5jYyBcCisJdnR2X21hbGxvYy5jYyBc CisJdnR2X3V0aWxzLmNjCisKK3Z0dl9pbml0X3NvdXJjZXMgPSBcCisJdnR2 X2luaXQuY2MKKwordnR2X3N0dWJzX3NvdXJjZXMgPSBcCisJdnR2X3N0dWJz LmNjIAogCiBsaWJzdXBjX19fbGFfU09VUkNFUyA9ICQoc291cmNlcykgJChj X3NvdXJjZXMpCiBsaWJzdXBjX19jb252ZW5pZW5jZV9sYV9TT1VSQ0VTID0g JChzb3VyY2VzKSAkKGNfc291cmNlcykKK2xpYnZ0dl9pbml0X2xhX1NPVVJD RVMgPSAkKHZ0dl9pbml0X3NvdXJjZXMpCitsaWJ2dHZfc3R1YnNfbGFfU09V UkNFUyA9ICQodnR2X3N0dWJzX3NvdXJjZXMpCiAKICMgQU1fQ1hYRkxBR1Mg bmVlZHMgdG8gYmUgaW4gZWFjaCBzdWJkaXJlY3Rvcnkgc28gdGhhdCBpdCBj YW4gYmUKICMgbW9kaWZpZWQgaW4gYSBwZXItbGlicmFyeSBvciBwZXItc3Vi LWxpYnJhcnkgd2F5LiAgTmVlZCB0byBtYW51YWxseQpAQCAtNTc1LDYgKzU5 NiwxMCBAQCBsaWJzdXBjKysubGE6ICQobGlic3VwY19fX2xhX09CSkVDVFMp ICQoCiAJJChDWFhMSU5LKSAtcnBhdGggJCh0b29sZXhlY2xpYmRpcikgJChs aWJzdXBjX19fbGFfT0JKRUNUUykgJChsaWJzdXBjX19fbGFfTElCQUREKSAk KExJQlMpCiBsaWJzdXBjKytjb252ZW5pZW5jZS5sYTogJChsaWJzdXBjX19j b252ZW5pZW5jZV9sYV9PQkpFQ1RTKSAkKGxpYnN1cGNfX2NvbnZlbmllbmNl X2xhX0RFUEVOREVOQ0lFUykgCiAJJChDWFhMSU5LKSAgJChsaWJzdXBjX19j b252ZW5pZW5jZV9sYV9PQkpFQ1RTKSAkKGxpYnN1cGNfX2NvbnZlbmllbmNl X2xhX0xJQkFERCkgJChMSUJTKQorbGlidnR2X2luaXQubGE6ICQobGlidnR2 X2luaXRfbGFfT0JKRUNUUykgJChsaWJ2dHZfaW5pdF9sYV9ERVBFTkRFTkNJ RVMpIAorCSQoQ1hYTElOSykgLXJwYXRoICQodG9vbGV4ZWNsaWJkaXIpICQo bGlidnR2X2luaXRfbGFfT0JKRUNUUykgJChsaWJ2dHZfaW5pdF9sYV9MSUJB REQpICQoTElCUykKK2xpYnZ0dl9zdHVicy5sYTogJChsaWJ2dHZfc3R1YnNf bGFfT0JKRUNUUykgJChsaWJ2dHZfc3R1YnNfbGFfREVQRU5ERU5DSUVTKSAK KwkkKENYWExJTkspIC1ycGF0aCAkKHRvb2xleGVjbGliZGlyKSAkKGxpYnZ0 dl9zdHVic19sYV9PQkpFQ1RTKSAkKGxpYnZ0dl9zdHVic19sYV9MSUJBREQp ICQoTElCUykKIAogbW9zdGx5Y2xlYW4tY29tcGlsZToKIAktcm0gLWYgKi4k KE9CSkVYVCkKSW5kZXg6IGxpYnN0ZGMrKy12My9saWJzdXBjKysvdnR2X3N0 dWJzLmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYnN0ZGMrKy12 My9saWJzdXBjKysvdnR2X3N0dWJzLmNjCShyZXZpc2lvbiAwKQorKysgbGli c3RkYysrLXYzL2xpYnN1cGMrKy92dHZfc3R1YnMuY2MJKHJldmlzaW9uIDAp CkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMgorICAg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgIFRoaXMgZmlsZSBpcyBw YXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisg ICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAg VW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3Jh bnRlZCBhZGRpdGlvbmFsICAKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBp biB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24K KyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAg YSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09Q WUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBu b3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAg Ki8KKworI2luY2x1ZGUgInZ0dl9ydHMuaCIKKworLyogVGhlIGlzIHBhcnQg b2YgdGhlIHZ0YWJsZSB2ZXJpZmljYXRpb24gcnVudGltZSBsaWJyYXJ5LiAg Rm9yIG1vcmUKKyAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZmVhdHVyZSwg c2VlIHRoZSBjb21tZW50cyBpbiB2dHZfcnRzLmNjLiAgKi8KKworLyogVGhl IGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHVzZWQgdG8gY3JlYXRlIHRo ZSBsaWJ2dHZfc3R1YnMKKyAgIGxpYnJhcnksIGFzIHBhcnQgb2YgdGhlIHZ0 YWJsZSB2ZXJpZmljYXRpb24gZmVhdHVyZS4gIFdoZW4gYnVpbGRpbmcKKyAg IGEgYmluYXJ5IHdpdGhvdXQgdnRhYmxlIHZlcmlmaWNhdGlvbiwgYW5kIGxp bmtpbmcgaXQgd2l0aCBhCisgICAocG9zc2libHkgcHJlLWJ1aWx0IHRoaXJk LXBhcnR5KSBsaWJyYXJ5IHRoYXQgd2FzIGJ1aWx0IHdpdGgKKyAgIHZlcmlm aWNhdGlvbiwgaXQgaXMgcG9zc2libGUgdGhhdCB2dGFibGUgdmVyaWZpY2F0 aW9uIHdpbGwgZmFpbCBkdWUKKyAgIHRvIGluY29tcGxldGUgZGF0YSAocmF0 aGVyIHRoYW4gZHVlIHRvIGNvcnJ1cHQgdnRhYmxlIHBvaW50ZXJzKS4gIElu CisgICB0aGlzIGNhc2Ugd2UgbmVlZCB0byBnaXZlIHByb2dyYW1tZXJzIGEg d2F5IG9mIHR1cm5pbmcgb2ZmIHRoZQorICAgdnRhYmxlIHZlcmlmaWNhdGlv biBpbiB0aGVpciBsaWJyYXJpZXMuICBUaGV5IGNhbiBkbyBzbyBieSBsaW5r aW5nCisgICB3aXRoIHRoZSBsaWJ2dHZfc3R1YnMgbGlicmFyeSwgd2hpY2gg KGFzIHlvdSBjYW4gc2VlKSB3aWxsIHJlcGxhY2UKKyAgIHRoZSByZWFsIHZl cmlmaWNhdGlvbiBmdW5jdGlvbnMgd2l0aCBhIHNldCBvZiBmdW5jdGlvbnMg dGhhdCBkbworICAgbm90aGluZyAoc28gbm8gbW9yZSB2ZXJpZmljYXRpb24g ZmFpbHVyZXMvYWJvcnRzKS4gICovCisKK3ZvaWQKK19fVkxUQ2hhbmdlUGVy bWlzc2lvbiAoaW50IHBlcm0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykp KQoreworfQorCit2b2lkIF9fVkxUSW5pdFNldFN5bWJvbERlYnVnCisgICAg ICAgICAgICAgICAgICAgICAgKHZvaWQgKipzZXRfaGFuZGxlX3B0ciBfX2F0 dHJpYnV0ZV9fKChfX3VudXNlZF9fKSksCisJCSAgICAgICBjb25zdCB2b2lk ICpzZXRfc3ltYm9sX2tleSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSks CisJCSAgICAgICBzdGQ6OnNpemVfdCBzaXplX2hpbnQgX19hdHRyaWJ1dGVf XygoX191bnVzZWRfXykpKQoreworfQorCit2b2lkCitfX1ZMVFJlZ2lzdGVy UGFpckRlYnVnICh2b2lkICoqc2V0X2hhbmRsZV9wdHJyIF9fYXR0cmlidXRl X18oKF9fdW51c2VkX18pKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25z dCB2b2lkICp2dGFibGVfcHRyIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18p KSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXRfc3lt Ym9sX25hbWUgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpLAorCQkgICAg ICBjb25zdCBjaGFyICp2dGFibGVfbmFtZSBfX2F0dHJpYnV0ZV9fKChfX3Vu dXNlZF9fKSkpCit7Cit9CisKK2NvbnN0IHZvaWQgKgorX19WTFRWZXJpZnlW dGFibGVQb2ludGVyRGVidWcKKyAgICAgICAgICAgICAgICAgICAgICh2b2lk ICoqc2V0X2hhbmRsZV9wdHIgIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18p KSwKKwkgICAgICAgCSAgICAgIGNvbnN0IHZvaWQgKnZ0YWJsZV9wdHIsCisJ CSAgICAgIGNvbnN0IGNoYXIgKnNldF9zeW1ib2xfbmFtZSBfX2F0dHJpYnV0 ZV9fKChfX3VudXNlZF9fKSksCisJCSAgICAgIGNvbnN0IGNoYXIgKnZ0YWJs ZV9uYW1lIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKKworeworICBy ZXR1cm4gdnRhYmxlX3B0cjsKK30KKwordm9pZCBfX1ZMVEluaXRTZXRTeW1i b2wKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKnNldF9oYW5kbGVf cHRyIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSwKKyAgICAgICAgICAg ICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2V0X3N5bWJvbF9rZXkgX19hdHRy aWJ1dGVfXygoX191bnVzZWRfXykpLAorCQkgICAgICAgc3RkOjpzaXplX3Qg c2l6ZV9oaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKK3sKK30K Kwordm9pZAorX19WTFRSZWdpc3RlclBhaXIgKHZvaWQgKipzZXRfaGFuZGxl X3B0ciBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSksCisgICAgICAgICAg ICAgICAgICAgY29uc3Qgdm9pZCAqdnRhYmxlX3B0ciBfX2F0dHJpYnV0ZV9f KChfX3VudXNlZF9fKSkpCit7Cit9CisKK2NvbnN0IHZvaWQgKgorX19WTFRW ZXJpZnlWdGFibGVQb2ludGVyICh2b2lkICoqc2V0X2hhbmRsZV9wdHIgX19h dHRyaWJ1dGVfXygoX191bnVzZWRfXykpLAorICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCB2b2lkICp2dGFibGVfcHRyKQoreworICByZXR1cm4g dnRhYmxlX3B0cjsKK30KSW5kZXg6IGxpYnN0ZGMrKy12My9saWJzdXBjKysv dnR2X21hbGxvYy5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaWJz dGRjKystdjMvbGlic3VwYysrL3Z0dl9tYWxsb2MuY2MJKHJldmlzaW9uIDAp CisrKyBsaWJzdGRjKystdjMvbGlic3VwYysrL3Z0dl9tYWxsb2MuY2MJKHJl dmlzaW9uIDApCkBAIC0wLDAgKzEsMjA5IEBACisvKiBDb3B5cmlnaHQgKEMp IDIwMTIKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBUaGlz IGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIg b3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK KyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5 b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVz Y3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwg dmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhj ZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBm aWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVs eS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uICAqLworCisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdnRh YmxlIHZlcmlmaWNhdGlvbiBydW50aW1lIGxpYnJhcnkuICBJdAorICAgY29u dGFpbnMgb3VyIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24g cm91dGluZXMsIHdoaWNoIHdlCisgICB1c2UgaW4gb3JkZXIgdG8ga2VlcCB0 cmFjayBvZiB0aGUgcGFnZXMgaW4gbWVtb3J5IGluIHdoaWNoIG91ciBzZXRz CisgICBvZiB2YWxpZCB2dGFibGUgcG9pbnRlcyBhcmUgc3RvcmVkLiAgKFdl IG5lZWQgdG8ga25vdyB0aGUgcGFnZXMgc28KKyAgIHdlIGNhbiBzZXQgdGhl IHByb3RlY3Rpb25zIG9uIHRoZW0gYXBwcm9wcmlhdGVseSkuICBGb3IgbW9y ZQorICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZ0YWJsZSB2ZXJpZmljYXRp b24gZmVhdHVyZSwgc2VlIHRoZSBjb21tZW50cworICAgaW4gdnR2X3J0cy5j Yy4gIFdlIHVzZSB0aGUgZXhpc3Rpbmcgb2JzdGFjayBpbXBsZW1lbnRhdGlv biBpbiBvdXIKKyAgIG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZS4gICovCisK KyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNp bmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgor I2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNp bmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAidnR2X3V0aWxzLmgiCisj aW5jbHVkZSAidnR2X21hbGxvYy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIK KworLyogUHV0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIG91ciAiLnZ0 YWJsZV9tYXBfdmFycyIgc2VjdGlvbiBzbworICAgdGhhdCB0aGV5IGFyZSBw cm90ZWN0ZWQuICBUaGV5IGFyZSBleHBsaWNpdGx5IHVucHJvdGVjdGVkIGFu ZAorICAgcHJvdGVjdGVkIGFnYWluIGJ5IGNhbGxzIHRvIFZUVl91bnByb3Rl Y3QgYW5kIFZUVl9wcm90ZWN0ICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFj ayBWVFZfb2JzdGFjayBWVFZfUFJPVEVDVEVEX1ZBUjsKK3N0YXRpYyB1bnNp Z25lZCBsb25nIHBhZ2Vfc2l6ZSBWVFZfUFJPVEVDVEVEX1ZBUiA9IDA7Citz dGF0aWMgdm9pZCAqY3VycmVudF9jaHVuayBWVFZfUFJPVEVDVEVEX1ZBUiA9 IDA7CitzdGF0aWMgc2l6ZV90IGN1cnJlbnRfY2h1bmtfc2l6ZSBWVFZfUFJP VEVDVEVEX1ZBUiA9IDA7CitzdGF0aWMgaW50IG1hbGxvY19pbml0aWFsaXpl ZCBWVFZfUFJPVEVDVEVEX1ZBUiA9IDA7CisKK3N0YXRpYyBib29sIGRlYnVn X21hbGxvYyA9IGZhbHNlOworCisvKiBUaGlzIGZ1bmN0aW9uIGdvZXMgdGhy b3VnaCBhbGwgb2YgdGhlIHBhZ2VzIHdlIGhhdmUgYWxsb2NhdGVkIHNvCisg ICBmYXIgYW5kIGNhbGxzIG1wcm90ZWN0IHRvIG1ha2UgZWFjaCBwYWdlIHJl YWQtb25seS4gICovCisKK3ZvaWQKK1ZUVl9tYWxsb2NfcHJvdGVjdCAodm9p ZCkKK3sKKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rICpjaTsKKyAgY2kgPSAo c3RydWN0IF9vYnN0YWNrX2NodW5rICopIGN1cnJlbnRfY2h1bms7CisgIHdo aWxlIChjaSkKKyAgICB7CisgICAgICBWVFZfREVCVUdfQVNTRVJUICgoKHVu c2lnbmVkIGxvbmcpIGNpICYgKHBhZ2Vfc2l6ZSAtIDEpKSA9PSAwKTsKKyAg ICAgIGlmIChtcHJvdGVjdCAoY2ksIChjaS0+bGltaXQgLSAoY2hhciAqKSBj aSksIFBST1RfUkVBRCkgPT0gLTEpCisJVlRWX2Vycm9yICgpOworICAgICAg Y2kgPSBjaS0+cHJldjsKKyAgICB9CisKKyAgaWYgKGRlYnVnX21hbGxvYykK KyAgICBWVFZfbWFsbG9jX2R1bXBfc3RhdHMgKCk7Cit9CisKKy8qIFRoaXMg ZnVuY3Rpb24gZ29lcyB0aHJvdWdoIGFsbCBvZiB0aGUgcGFnZXMgd2UgaGF2 ZSBhbGxvY2F0ZWQgc28KKyAgIGZhciBhbmQgY2FsbHMgbXJwb3RlY3QgdG8g bWFrZSBlYWNoIHBhZ2UgcmVhZC13cml0ZS4gICovCisKK3ZvaWQKK1ZUVl9t YWxsb2NfdW5wcm90ZWN0ICh2b2lkKQoreworICBzdHJ1Y3QgX29ic3RhY2tf Y2h1bmsgKiBjaTsKKyAgY2kgPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICop IGN1cnJlbnRfY2h1bms7CisgIHdoaWxlIChjaSkKKyAgICB7CisgICAgICBW VFZfREVCVUdfQVNTRVJUICgoKHVuc2lnbmVkIGxvbmcpIGNpICYgKHBhZ2Vf c2l6ZSAtIDEpKSA9PSAwKTsKKyAgICAgIGlmIChtcHJvdGVjdCAoY2ksIChj aS0+bGltaXQgLSAoY2hhciAqKSBjaSksIFBST1RfUkVBRCB8IFBST1RfV1JJ VEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gLTEpCisJVlRW X2Vycm9yICgpOworICAgICAgY2kgPSBjaS0+cHJldjsKKyAgICB9Cit9CisK Ky8qIEFsbG9jYXRlcyBhIFNJWkUtc2l6ZWQgY2h1bmsgb2YgbWVtb3J5IHRo YXQgaXMgYWxpZ25lZCB0byBhIHBhZ2UKKyAgIGJvdW5kYXJ5LiAgVGhlIGFt b3VudCBvZiBtZW1vcnkgcmVxdWVzdGVkIChTSVpFKSBtdXN0IGJlIGEgbXVs dGlwbGUKKyAgIG9mIHRoZSBwYWdlIHNpemUuICBOb3RlOiBXZSBtdXN0IHVz ZSBtbWFwIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnk7CisgICB1c2luZyBtYWxs b2MgaGVyZSB3aWxsIGNhdXNlIHByb2JsZW1zLiAgKi8KKworc3RhdGljIHZv aWQgKgorb2JzdGFja19jaHVua19hbGxvYyAoc2l6ZV90IHNpemUpCit7Cisg IC8qIEluY3JlYXNlIHNpemUgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgcGFn ZV9zaXplLiAgICovCisgIHNpemUgPSAoc2l6ZSArIChwYWdlX3NpemUgLSAx KSkgJiAofihwYWdlX3NpemUgLSAxKSk7CisgIFZUVl9ERUJVR19BU1NFUlQg KChzaXplICYgKHBhZ2Vfc2l6ZSAtIDEpKSA9PSAwKTsKKyAgdm9pZCAqYWxs b2NhdGVkOworCisgIGlmICgoYWxsb2NhdGVkID0gbW1hcCAoTlVMTCwgc2l6 ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsICAtMSwgMCkp ID09IDApCisgICAgVlRWX2Vycm9yICgpOworCisgIFZUVl9ERUJVR19BU1NF UlQgKCgodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkICYgKHBhZ2Vfc2l6ZSAt IDEpKSA9PSAwKTsKKworICBjdXJyZW50X2NodW5rID0gYWxsb2NhdGVkOwor ICBjdXJyZW50X2NodW5rX3NpemUgPSBzaXplOworICByZXR1cm4gYWxsb2Nh dGVkOworfQorCitzdGF0aWMgdm9pZAorb2JzdGFja19jaHVua19mcmVlIChz aXplX3Qgc2l6ZSkKK3sKKyAgLyogRG8gbm90aGluZy4gRm9yIG91ciBwdXJw b3NlcyB0aGVyZSBzaG91bGQgYmUgdmVyeSBsaXR0bGUKKyAgICAgZGUtYWxs b2NhdGlvbi4gKi8KK30KKworLyogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFu ZCBpbml0aWFsaXplcyB0aGUgb2JzdGFjayBwaWVjZXMgZm9yIG91cgorICAg bWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lLiAgKi8KKwordm9pZAorVlRWX21h bGxvY19pbml0ICh2b2lkKQoreworICAvKiBNYWtlIHN1cmUgd2Ugb25seSBl eGVjdXRlIHRoZSBtYWluIGJvZHkgb2YgdGhpcyBmdW5jdGlvbiBPTkNFLiAg Ki8KKyAgaWYgKG1hbGxvY19pbml0aWFsaXplZCkKKyAgICByZXR1cm47CisK KyAgcGFnZV9zaXplID0gc3lzY29uZiAoX1NDX1BBR0VfU0laRSk7CisKKyAg b2JzdGFja19jaHVua19zaXplICgmVlRWX29ic3RhY2spID0gcGFnZV9zaXpl OworICBvYnN0YWNrX2FsaWdubWVudF9tYXNrICgmVlRWX29ic3RhY2spID0g c2l6ZW9mIChsb25nKSAtIDE7CisgIC8qIFdlIGd1YXJhbnRlZSB0aGF0IHRo ZSBvYnN0YWNrIGFsbG9jIGZhaWxlZCBoYW5kbGVyIHdpbGwgbmV2ZXIgYmUK KyAgICAgY2FsbGVkIGJlY2F1c2UgaW4gY2FzZSB0aGUgYWxsb2NhdGlvbiBv ZiB0aGUgY2h1bmsgZmFpbHMsIGl0IHdpbGwKKyAgICAgbmV2ZXIgcmV0dXJu ICovCisgIG9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIgPSBOVUxMOwor CisgIG9ic3RhY2tfaW5pdCAoJlZUVl9vYnN0YWNrKTsKKyAgbWFsbG9jX2lu aXRpYWxpemVkID0gMTsKK30KKworLyogVGhpcyBpcyBvdXIgZXh0ZXJuYWwg aW50ZXJmYWNlIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRpb24uICBTSVpFIGlz CisgICB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyB0byBiZSBhbGxv Y2F0ZWQvICAqLworCit2b2lkICoKK1ZUVl9tYWxsb2MgKHNpemVfdCBzaXpl KQoreworICByZXR1cm4gb2JzdGFja19hbGxvYyAoJlZUVl9vYnN0YWNrLCBz aXplKTsKK30KKworCisvKiBUaGlzIGlzIG91ciBleHRlcm5hbCBpbnRlcmZh Y2UgZm9yIG1lbW9yeSBkZWFsbG9jYXRpb24uICAqLworCit2b2lkCitWVFZf ZnJlZSAodm9pZCAqKQoreworICAvKiBEbyBub3RoaW5nLiBXZSBkb250IGNh cmUgYWJvdXQgcmVjb3ZlcmluZyB1bm5lZGVkIG1lbW9yeSBhdCB0aGlzCisg ICAgIHRpbWUuICAqLworfQorCisKKy8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcg ZnVuY3Rpb24gdGF0IGNvbGxlY3RzIHN0YXRpc3RpY3MgYWJvdXQgb3VyCisg ICBtZW1vcnkgYWxsb2NhdGlvbi4gICovCit2b2lkCitWVFZfbWFsbG9jX3N0 YXRzICh2b2lkKQoreworICBpbnQgY291bnQgPSAwOworICBzdHJ1Y3QgX29i c3RhY2tfY2h1bmsgKiBjaSA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikg Y3VycmVudF9jaHVuazsKKyAgd2hpbGUgKGNpKQorICAgIHsKKyAgICAgIGNv dW50Kys7CisgICAgICBjaSA9IGNpLT5wcmV2OworICAgIH0KKyAgZnByaW50 ZiAoc3RkZXJyLAorCSAgICJWVFZfbWFsbG9jX3N0YXRzOlxuICBQYWdlIFNp emUgPSAlbHUgYnl0ZXNcbiAgIgorCSAgICJOdW1iZXIgb2YgcGFnZXMgPSAl ZFxuIiwgcGFnZV9zaXplLCBjb3VudCk7Cit9CisKKy8qIFRoaXMgaXMgYSBk ZWJ1Z2dpbmcgZnVuY3Rpb24uICBJdCB3cml0ZXMgb3V0IG91ciBtZW1vcnkg YWxsb2NhdGlvbgorICAgc3RhdGlzdGljcyB0byBhIGxvZyBmaWxlLiAgKi8K Kwordm9pZAorVlRWX21hbGxvY19kdW1wX3N0YXRzICh2b2lkKQoreworICBz dGF0aWMgaW50IGZkID0gLTE7CisKKyAgaWYgKGZkID09IC0xKQorICAgIGZk ID0gdnR2X29wZW5fbG9nICgiL3RtcC92dHZfbWVtX3Byb3RlY3Rpb24ubG9n Iik7CisgIGlmIChmZCA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgaW50IGNv dW50ID0gMDsKKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rICogY2kgPSAoc3Ry dWN0IF9vYnN0YWNrX2NodW5rICopIGN1cnJlbnRfY2h1bms7CisgIHdoaWxl IChjaSkKKyAgICB7CisgICAgICBjb3VudCsrOworICAgICAgY2kgPSBjaS0+ cHJldjsKKyAgICB9CisKKyAgdnR2X2FkZF90b19sb2cgKGZkLCAiVlRWX21h bGxvY19wcm90ZWN0IHByb3RlY3RlZD0lZCBwYWdlc1xuIiwgY291bnQpOwor fQpJbmRleDogbGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfcnRzLmNjCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIGxpYnN0ZGMrKy12My9saWJzdXBj KysvdnR2X3J0cy5jYwkocmV2aXNpb24gMCkKKysrIGxpYnN0ZGMrKy12My9s aWJzdXBjKysvdnR2X3J0cy5jYwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx MTg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTIKKyBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24KKworIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKwor IEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAz LCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisK KyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJ TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorCisgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMs IHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgcGVybWlzc2lvbnMgZGVz Y3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwg dmVyc2lvbgorIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24uCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQK KyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9u IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworIHNlZSB0aGUgZmlsZXMgQ09Q WUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBu b3QsIHNlZQorIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICov CisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB2dGFibGUgc2VjdXJp dHkgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoZSB2dGFibGUgc2Vj dXJpdHkgZmVhdHVyZSBpcyBkZXNpZ25lZCB0byBkZXRlY3Qgd2hlbiBhIHZp cnR1YWwKKyAgIGNhbGwgaXMgYWJvdXQgdG8gYmUgbWFkZSB0aHJvdWdoIGFu IGludmFsaWQgdnRhYmxlIHBvaW50ZXIKKyAgIChwb3NzaWJseSBkdWUgdG8g ZGF0YSBjb3JydXB0aW9uIG9yIG1hbGljaW91cyBhdHRhY2tzKS4gVGhlCisg ICBjb21waWxlciBmaW5kcyBldmVyeSB2aXJ0dWFsIGNhbGwsIGFuZCBpbnNl cnRzIGEgdmVyaWZpY2F0aW9uIGNhbGwKKyAgIGJlZm9yZSB0aGUgdmlydHVh bCBjYWxsLiAgVGhlIHZlcmlmaWNhdGlvbiBjYWxsIHRha2VzIHRoZSBhY3R1 YWwKKyAgIHZ0YWJsZSBwb2ludGVyIHZhbHVlIGluIHRoZSBvYmplY3QgdGhy b3VnaCB3aGljaCB0aGUgdmlydHVhbCBjYWxsCisgICBpcyBiZWluZyBtYWRl LCBhbmQgY29tcGFyZXMgdGhlIHZ0YWJsZSBwb2ludGVyIGFnYWluc3QgYSBz ZXQgb2YgYWxsCisgICB2YWxpZCB2dGFibGUgcG9pbnRlcnMgdGhhdCB0aGUg b2JqZWN0IGNvdWxkIGNvbnRhaW4gKHRoaXMgc2V0IGlzCisgICBiYXNlZCBv biB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgb2JqZWN0KS4gIElmIHRoZSBw b2ludGVyIGlzIGluCisgICB0aGUgdmFsaWQgc2V0LCBleGVjdXRpb24gaXMg YWxsb3dlZCB0byBjb250aW51ZTsgb3RoZXJ3aXNlIHRoZQorICAgcHJvZ3Jh bSBpcyBoYWx0ZWQuCisKKyAgVGhlcmUgYXJlIHNldmVyYWwgcGllY2VzIG5l ZWRlZCBpbiBvcmRlciB0byBtYWtlIHRoaXMgd29yazogMS4gRm9yCisgIGV2 ZXJ5IHZpcnR1YWwgY2xhc3MgaW4gdGhlIHByb2dyYW0gKGkuZS4gYSBjbGFz cyB0aGF0IGNvbnRhaW5zCisgIHZpcnR1YWwgbWV0aG9kcyksIHdlIG5lZWQg dG8gYnVpbGQgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgdmFsaWQKKyAgdnRh YmxlcyB0aGF0IGFuIG9iamVjdCBvZiB0aGF0IGNsYXNzIGNvdWxkIHBvaW50 IHRvLiAgVGhpcyBpbmNsdWRlcworICB2dGFibGVzIGZvciBhbnkgY2xhc3Mo ZXMpIHRoYXQgaW5oZXJpdCBmcm9tIHRoZSBjbGFzcyB1bmRlcgorICBjb25z aWRlcmF0aW9uLiAgMi4gRm9yIGV2ZXJ5IHN1Y2ggZGF0YSBzZXQgd2UgYnVp bGQgdXAsIHdlIG5lZWQgYQorICB3YXkgdG8gZmluZCBhbmQgcmVmZXJlbmNl IHRoZSBkYXRhIHNldC4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlCisg IGZhY3QgdGhhdCB0aGUgcmVhbCB2dGFibGUgYWRkcmVzc2VzIGFyZSBub3Qg a25vd24gdW50aWwgcnVudGltZSwKKyAgd2hlbiB0aGUgcHJvZ3JhbSBpcyBs b2FkZWQgaW50byBtZW1vcnksIGJ1dCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0 aGUKKyAgc2V0cyBhdCBjb21waWxlIHRpbWUgd2hlbiB3ZSBhcmUgaW5zZXJ0 aW5nIHZlcmlmaWNhdGlvbiBjYWxscyBpbnRvCisgIHRoZSBwcm9ncmFtLiAg My4gIFdlIG5lZWQgdG8gZmluZCBldmVyeSB2aXJ0dWFsIGNhbGwgaW4gdGhl IHByb2dyYW0sCisgIGFuZCBpbnNlcnQgdGhlIHZlcmlmaWNhdGlvbiBjYWxs ICh3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMpCisgIGJlZm9yZSB0 aGUgdmlydHVhbCBjYWxsLiAgNC4gV2UgbmVlZCBzb21lIHJ1bnRpbWUgbGli cmFyeSBwaWVjZXM6CisgIHRoZSBjb2RlIHRvIGJ1aWxkIHVwIHRoZSBkYXRh IHNldHMgYXQgcnVudGltZTsgdGhlIGNvZGUgdG8gYWN0dWFsbHkKKyAgcGVy Zm9ybSB0aGUgdmVyaWZpY2F0aW9uIHVzaW5nIHRoZSBkYXRhIHNldHM7IGFu ZCBzb21lIGNvZGUgdG8gc2V0CisgIHByb3RlY3Rpb25zIG9uIHRoZSBkYXRh IHNldHMsIHNvIHRoZXkgdGhlbXNlbHZlcyBkbyBub3QgYmVjb21lCisgIGhh Y2tlciB0YXJnZXRzLgorCisgIFRvIGZpbmQgYW5kIHJlZmVyZW5jZSB0aGUg c2V0IG9mIHZhbGlkIHZ0YWJsZSBwb2ludGVycyBmb3IgYW55IGdpdmVuCisg IHZpcnR1YWwgY2xhc3MsIHdlIGNyZWF0ZSBhIHNwZWNpYWwgZ2xvYmFsIHZh cmlibGUgZm9yIGVhY2ggdmlydHVhbAorICBjbGFzcy4gIFdlIHJlZmVyIHRv IHRoaXMgYXMgdGhlICJ2dGFibGUgbWFwIHZhcmlhYmxlIiBmb3IgdGhhdAor ICBjbGFzcy4gIFRoZSB2dGFibGUgbWFwIHZhcmlhYmxlIGhhcyB0aGUgdHlw ZSAidm9pZCAqIiwgYW5kIGlzCisgIGluaXRpYWxpemVkIGJ5IHRoZSBjb21w aWxlciB0byBOVUxMLiAgQXQgcnVudGltZSB3aGVuIHRoZSBzZXQgb2YKKyAg dmFsaWQgdnRhYmxlIHBvaW50ZXJzIGZvciBhIHZpcnR1YWwgY2xhc3MsIGUu Zy4gY2xhc3MgRm9vLCBpcyBidWlsdCwKKyAgdGhlIHZ0YWJsZSBtYXAgdmFy aWFibGUgZm9yIGNsYXNzIEZvbyBpcyBtYWRlIHRvIHBvaW50IHRvIHRoZSBz ZXQuCisgIER1cmluZyBjb21waWxlIHRpbWUsIHdoZW4gdGhlIGNvbXBpbGVy IGlzIGluc2VydGluZyB2ZXJpZmljYXRpb24KKyAgY2FsbHMgaW50byB0aGUg cHJvZ3JhbSwgaXQgcGFzc2VzIHRoZSB2dGFibGUgbWFwIHZhcmlhYmxlIGZv ciB0aGUKKyAgYXBwcm9wcmlhdGUgY2xhc3MgdG8gdGhlIHZlcmlmaWNhdGlv biBjYWxsLCBzbyB0aGF0IGF0IHJ1bnRpbWUgdGhlCisgIHZlcmlmaWNhdGlv biBjYWxsIGNhbiBmaW5kIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHNldC4KKwor ICBUaGUgYWN0dWFsIHNldCBvZiB2YWxpZCB2dGFibGUgcG9pbnRlcnMgZm9y IGEgdmlydHVhbCBjbGFzcywKKyAgZS5nLiBjbGFzcyBGb28sIGNhbm5vdCBi ZSBidWlsdCB1bnRpbCBydW50aW1lLCB3aGVuIHRoZSB2dGFibGVzIGdldAor ICBsb2FkZWQgaW50byBtZW1vcnkgYW5kIHRoZWlyIGFkZHJlc3NlcyBhcmUg a25vd24uICBCdXQgdGhlIGtub3dsZWRnZQorICBhYm91dCB3aGljaCB2dGFi bGVzIGJlbG9uZyBpbiB3aGljaCBjbGFzcycgaGllcmFyY2h5IGlzIG9ubHkg a25vd24KKyAgYXQgY29tcGlsZSB0aW1lLiAgVGhlcmVmb3JlIGF0IGNvbXBp bGUgdGltZSB3ZSBjb2xsZWN0IGNsYXNzCisgIGhpZXJhcmNoeSBhbmQgdnRh YmxlIGluZm9ybWF0aW9uIGFib3V0IGV2ZXJ5IHZpcnR1YWwgY2xhc3MsIGFu ZCB3ZQorICBnZW5lcmF0ZSBjYWxscyB0byBidWlsZCB1cCB0aGUgZGF0YSBz ZXRzIGF0IHJ1bnRpbWUuICBUbyBidWlsZCB0aGUKKyAgZGF0YSBzZXRzLCB3 ZSBjYWxsIG9uZSBvZiB0aGUgZnVuY3Rpb25zIHdlIGFkZCB0byB0aGUgcnVu dGltZQorICBsaWJyYXJ5LCBfX1ZMVFJlZ2lzdGVyUGFpci4gIF9fVkxUUmVn aXN0ZXJQYWlyIHRha2VzIHR3byBhcmd1bWVudHMsCisgIGEgdnRhYmxlIG1h cCB2YXJpYWJsZSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSB2dGFibGUuICBJZiB0 aGUgdnRhYmxlCisgIG1hcCB2YXJpYWJsZSBpcyBjdXJyZW50bHkgTlVMTCwg aXQgY3JlYXRlcyBhIG5ldyBkYXRhIHNldCAoaGFzaAorICB0YWJsZSksIG1h a2VzIHRoZSB2dGFibGUgbWFwIHZhcmlhYmxlIHBvaW50IHRvIHRoZSBuZXcg ZGF0YSBzZXQsIGFuZAorICBpbnNlcnRzIHRoZSB2dGFibGUgYWRkcmVzcyBp bnRvIHRoZSBkYXRhIHNldC4gIElmIHRoZSB2dGFibGUgbWFwCisgIHZhcmlh YmxlIGlzIG5vdCBOVUxMLCBpdCBqdXN0IGluc2VydHMgdGhlIHZ0YWJsZSBh ZGRyZXNzIGludG8gdGhlCisgIGRhdGEgc2V0LiAgSW4gb3JkZXIgdG8gbWFr ZSBzdXJlIHRoYXQgb3VyIGRhdGEgc2V0cyBhcmUgYnVpbHQgYmVmb3JlCisg IGFueSB2ZXJpZmljYXRpb24gY2FsbHMgaGFwcGVuLCB3ZSBjcmVhdGUgYSBz cGVjaWFsIGNvbnN0cnVjdG9yCisgIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9u IGZvciBlYWNoIGNvbXBpbGF0aW9uIHVuaXQsIGdpdmUgaXQgYSB2ZXJ5Cisg IGhpZ2ggaW5pdGlhbGl6YXRpb24gcHJpb3JpdHksIGFuZCBpbnNlcnQgYWxs IG9mIG91ciBjYWxscyB0bworICBfX1ZMVFJlZ2lzdGVyUGFpciBpbnRvIG91 ciBzcGVjaWFsIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uCisgIGZ1bmN0 aW9uLiAgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGV4 dGVybmFsbHkgdmlzaWJsZSBydW50aW1lIGxpYnJhcnkKKyAgIGZ1bmN0aW9u cyBmb3IgdnRhYmxlIHZlcmlmaWNhdGlvbjogX19WTFRDaGFuZ2VQZXJtaXNz aW9uLAorICAgX19WTFRSZWdpc3RlclBhaXIsIGFuZCBfX1ZMVFZlcmlmeVZ0 YWJsZVBvaW50ZXIuICBJdCBhbHNvIGNvbnRhaW5zCisgICBkZWJ1ZyB2ZXJz aW9ucyBfX1ZMVFJlZ2lzdGVyUGFpckRlYnVnIGFuZAorICAgX19WTFRWZXJp ZnlWdGFibGVQb2ludGVyRGVidWcsIHdoaWNoIGhhdmUgZXh0cmEgcGFyYW1l dGVycyBpbiBvcmRlcgorICAgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZGVidWcg dmVyaWZpY2F0aW9uIGZhaWx1cmVzLgorCisgICBUaGlzIGZpbGUgYWxzbyBj b250YWlucyB0aGUgZmFpbHVyZSBmdW5jdGlvbnMgdGhhdCBnZXQgY2FsbGVk IHdoZW4KKyAgIGEgdnRhYmxlIHBvaW50ZXIgaXMgbm90IGZvdW5kIGluIHRo ZSBkYXRhIHNldC4gIFR3byBwYXJ0aWN1bGFybHkKKyAgIGltcG9ydGFudCBm dW5jdGlvbnMgYXJlIF9fdnR2X3ZlcmlmeV9mYWlsIGFuZCBfX3Z0dl9yZWFs bHlfZmFpbC4KKyAgIFRoZXkgYXJlIGJvdGggZXh0ZXJuYWxseSB2aXNpYmxl LiAgX192dHZfdmVyaWZ5X2ZhaWwgaXMgZGVmaW5lZCBpbgorICAgc3VjaCBh IHdheSB0aGF0IGl0IGNhbiBiZSByZXBsYWNlZCBieSBhIHByb2dyYW1tZXIs IGlmIGRlc2lyZWQuICBJdAorICAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgX19W TFRWZXJpZnlWdGFibGVQb2ludGVyIGNhbGxzIGlmIGl0IGNhbid0CisgICBm aW5kIHRoZSBwb2ludGVyIGluIHRoZSBkYXRhIHNldC4gIEFsbG93aW5nIHRo ZSBwcm9ncmFtbWVyIHRvCisgICBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiBt ZWFucyB0aGF0IGhlL3NoZSBjYW4gZG8gc29tZSBhbHRlcm5hdGUKKyAgIHZl cmlmaWNhdGlvbiwgaW5jbHVkaW5nIE5PVCBmYWlsaW5nIGluIGNlcnRhaW4g c3BlY2lmaWMgY2FzZXMsIGlmCisgICBkZXNpcmVkLiAgVGhpcyBtYXkgYmUg dGhlIGNhc2UgaWYgdGhlIHByb2dyYW1tZXIgaGFzIHRvIGRlYWwgd3RpaAor ICAgdW52ZXJpZmllZCB0aGlyZCBwYXJ0eSBzb2Z0d2FyZSwgZm9yIGV4YW1w bGUuICBfX3Z0dl9yZWFsbHlfZmFpbCBpcworICAgYXZhaWxhYmxlIGZvciB0 aGUgcHJvZ3JhbW1lciB0byBjYWxsIGZyb20gaGlzIHZlcnNpb24gb2YKKyAg IF9fdnR2X3ZlcmlmeV9mYWlsLCBpZiBoZSBkZWNpZGVzIHRoZSBmYWlsdXJl IGlzIHJlYWwuCisKKyAgIFRoZSBmaW5hbCBwaWVjZSBvZiBmdW5jdGlvbmFs aXR5IGltcGxlbWVudGVkIGluIHRoaXMgZmlsZSBpcyBzeW1ib2wKKyAgIHJl c29sdXRpb24gZm9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB2 dGFibGUgbWFwIHZhcmlhYmxlLgorICAgSWYgdGhlIHNhbWUgdmlydHVhbCBj bGFzcyBpcyB1c2VkIGluIHR3byBkaWZmZXJlbnQgY29tcGlsYXRpb24KKyAg IHVuaXRzLCB0aGVuIGVhY2ggY29tcGlsYXRpb24gdW5pdCB3aWxsIGNyZWF0 ZSBhIHZ0YWJsZSBtYXAgdmFyaWFibGUKKyAgIGZvciB0aGUgY2xhc3MuICBX ZSBuZWVkIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgdnRhYmxlIG1hcAor ICAgdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUgKHNpbmdsZSkgc2V0 IG9mIHZhbGlkIHZ0YWJsZQorICAgcG9pbnR0ZXJzIGZvciB0aGUgY2xhc3Ms IHNvIHdlIHdyb3RlIG91ciBvd24gaGFzaHRhYmxlLWJhc2VkIHN5bWJvbAor ICAgcmVzb2x1dGlvbiBmb3IgdnRhYmxlIG1hcCB2YXJpYWJsZXMgKHdpdGgg YSB0aW55IG9wdGltaXphdGlvbiBpbgorICAgdGhlIGNhc2Ugd2hlcmUgdGhl cmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmxlKS4KKwor ICAgVGhlcmUgYXJlIHR3byBvdGhlciBpbXBvcnRhbnQgcGllY2VzIHRvIHRo ZSBydW50aW1lIGZvciB2dGFibGUKKyAgIHZlcmlmaWNhdGlvbiBiZXNpZGVz IHRoZSBtYWluIHBpZWNlcyB0aGF0IGdvIGludG8gbGlic3RkYysrLnNvOiB0 d28KKyAgIHNwZWNpYWwgdGlueSBzaGFyZWQgbGlicmFyaWVzLCBsaWJ2dHZf aW5pdC5zbyBhbmQgbGlidnR2X3N0dWJzLnNvLgorICAgbGlidnR2X2luaXQu c28gaXMgYnVpbHQgZnJvbSB2dHZfaW5pdC5jYy4gIEl0IGlzIGRlc2lnbmVk IHRvIGhlbFtwCisgICBtaW5pbWl6ZSB0aGUgY2FsbHMgbWFkZSB0byBtcHJv dGVjdCAoc2VlIHRoZSBjb21tZW50cyBpbgorICAgdnR2X2luaXQuY2MgZm9y IG1vcmUgZGV0YWlscykuICBBbnl0aGluZyBjb21waWxlZCB3aXRoCisgICAi LWZ2dGFibGUtdmVyaWZ5PXN0ZCIgbXVzdCBiZSBsaW5rZWQgd2l0aCBsaWJ2 dHZfaW5pdC5zbyAodGhlIGdjYworICAgZHJpdmVyIGhhcyBiZWVuIG1vZGlm aWVkIHRvIGRvIHRoaXMpLiAgdnR2X3N0dWJzLnNvIGlzIGJ1aWx0IGZyb20K KyAgIHZ0dl9zdHVicy5jYy4gIEl0IHJlcGxhY2VzIHRoZSBtYWluIHJ1bnRp bWUgZnVuY3Rpb25zCisgICAoX19WTFRDaGFuZ2VQZXJtaXNzaW5vLCBfX1ZM VFJlZ2lzdGVyUGFpciBhbmQKKyAgIF9fVkxUVmVyaWZ5VnRhYmxlUG9pdG5l cikgd2l0aCBzdHViIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdGhpbmcuICBJZgor ICAgYSBwcm9ncmFtbWVyIGhhcyBhIGxpYnJhcnkgdGhhdCB3YXMgYnVpbHQg d2l0aCB2ZXJpZmljYXRpb24sIGJ1dAorICAgd2lzaGVzIHRvIG5vdCBoYXZl IHZlcmlmaWNhdGlvbiB0dXJuZWQgb24sIHRoZSBwcm9ncmFtbWVyIGNhbiBs aW5rCisgICBpbiB0aGUgdnR2X3N0dWJzLnNvIGxpYnJhcnkuICAqLworCisj aW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNs dWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxleGVjaW5mby5oPgorCisjaW5j bHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNs dWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbmsuaD4KKyNpbmNsdWRlIDxm Y250bC5oPgorCisvKiBGb3IgZ3RocmVhZHMgc3VwcHBvcnQgKi8KKyNpbmNs dWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJy ZW5jZS5oPgorCisjaW5jbHVkZSAidnR2X3V0aWxzLmgiCisjaW5jbHVkZSAi dnR2X21hbGxvYy5oIgorI2luY2x1ZGUgInZ0dl9zZXQuaCIKKyNpbmNsdWRl ICJ2dHZfbWFwLmgiCisjaW5jbHVkZSAidnR2X3J0cy5oIgorI2luY2x1ZGUg InZ0dl9mYWlsLmgiCisKK2Jvb2wgdnR2X2RlYnVnID0gZmFsc2U7CisKKy8q IFRoaXMgaXMgdXNlZCB0byBkaXNhYmxlIGFib3J0cyBmb3IgZGVidWdnaW5n IHB1cnBvc2VzLiAgKi8KK2Jvb2wgdnR2X25vX2Fib3J0ID0gZmFsc2U7CisK K2V4dGVybiAiQyIgeworCisgIC8qIF9fZm9ydGlmeV9mYWlsIGlzIGEgZnVu Y3Rpb24gaW4gZ2xpYmMgdGhhdCBjYWxscyBfX2xpYmNfbWVzc2FnZSwKKyAg ICAgY2F1c2luZyBpdCB0byBwcmludCBvdXQgYSBwcm9ncmFtIHRlcm1pbmF0 aW9uIGVycm9yIG1lc3NhZ2UKKyAgICAgKGluY2x1ZGluZyB0aGUgbmFtZSBv ZiB0aGUgYmluYXJ5IGJlaW5nIHRlcm1pbmF0ZWQpLCBhIHN0YWNrCisgICAg IHRyYWNlIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgYW5kIGEgbWVtb3J5 IG1hcCBkdW1wLiAgSWRlYWxseQorICAgICB3ZSB3b3VsZCBoYXZlIGNhbGxl ZCBfX2xpYmNfbWVzc2FnZSBkaXJlY3RseSwgYnV0IHRoYXQgZnVuY3Rpb24K KyAgICAgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFjY2Vzc2libGUgdG8gZnVu Y3Rpb25zIG91dHNpZGUgZ2xpYmMsCisgICAgIHdoZXJlYXMgX19mb3J0aWZ5 X2ZhaWwgaXMuICBXZSBjYWxsIF9fZm9ydGlmeV9mYWlsIGZyb20KKyAgICAg X192dHZfcmVhbGx5X2ZhaWwuICBXZSBsb29rZWQgYXQgY2FsbGluZyBfX2xp YmNfZmF0YWwsIHdoaWNoIGlzCisgICAgIGV4dGVybmFsbHkgYWNjZXNzaWJs ZSwgYnV0IGl0IGRvZXMgbm90IGRvIHRoZSBiYWNrIHRyYWNlIGFuZAorICAg ICBtZW1vcnkgZHVtcC4gICovCisKKyAgZXh0ZXJuIHZvaWQgX19mb3J0aWZ5 X2ZhaWwgKGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4p KTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworLyogQmUgY2FyZWZ1bCBh Ym91dCBpbml0aWFsaXphdGlvbiBvZiBzdGF0aWNzIGluIHRoaXMgZmlsZS4g IFNvbWUgb2YKKyAgIHRoZSByb3V0aW5lcyBiZWxvdyBhcmUgY2FsbGVkIGJl Zm9yZSBhbnkgcnVudGltZSBpbml0aWFsaXphdGlvbiBmb3IKKyAgIHN0YXRp Y3MgaW4gdGhpcyBmaWxlIHdpbGwgYmUgZG9uZS4gRm9yIGV4YW1wbGUsIGRv bnQgdHJ5IHRvCisgICBpbml0aWFsaXplIGFueSBvZiB0aGVzZSBzdGF0aWNz IHdpdGggYSBydW50aW1lIGNhbGwgKGZvciBleDoKKyAgIHN5c2NvbmYuIFRo ZSBpbml0aWFsaXphdGlvbiB3aWxsIGhhcHBlbiBhZnRlciBjYWxscyB0byB0 aGUgcm91dGluZXMKKyAgIHRvIHByb3RlY3QvdW5wcm90ZWMgdGhlIHZ0YWJs YV9tYXAgdmFyaWFibGVzICovCisKKy8qIE5vIG5lZWQgdG8gbWFyayB0aGUg Zm9sbG93aW5nIHZhcmlhYmxlcyB3aXRoIFZUVl9QUk9URUNURURfVkFSLgor ICAgVGhlc2UgYXJlIGVpdGhlciBjb25zdCBvciBhcmUgb25seSB1c2VkIGZv ciBkZWJ1Z2dpbmcvdHJhY2luZy4KKyAgIGRlYnVnZ2luZy90cmFjaW5nIHdp bGwgbm90IGJlIE9OIG9uIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzICovCisK K3N0YXRpYyBjb25zdCBib29sIGRlYnVnX2hhc2ggPSBIQVNIVEFCTEVfU1RB VFM7CitzdGF0aWMgY29uc3QgaW50IGRlYnVnX2Z1bmN0aW9ucyA9IDA7Citz dGF0aWMgY29uc3QgaW50IGRlYnVnX2luaXQgPSAwOworc3RhdGljIGNvbnN0 IGludCBkZWJ1Z192ZXJpZnlfdnRhYmxlID0gMDsKKworCisvKiBHbG9iYWwg ZmlsZSBkZXNjcmlwdG9yIHZhcmlhYmxlcyBmb3IgbG9nZ2luZywgdHJhY2lu ZyBhbmQgZGVidWdnaW5nLiAgKi8KKworc3RhdGljIGludCBpbml0X2xvZ19m ZCA9IC0xOworc3RhdGljIGludCB2ZXJpZnlfdnRhYmxlX2xvZ19mZCA9IC0x Oworc3RhdGljIGludCB2dHZfZmFpbHVyZXNfbG9nX2ZkID0gLTE7CitzdGF0 aWMgaW50IHNldF9sb2dfZmQgPSAtMTsKKworLyogVGhpcyBob2xkcyBhIGZv cm1hdHRlZCBlcnJvciBsb2dnaW5nIG1lc3NhZ2UsIHRvIGJlIHdyaXR0ZW4g dG8gdGhlCisgICB2dGFibGUgdmVyaWZ5IGZhaWx1cmVzIGxvZy4gICovCitz dGF0aWMgY2hhciBkZWJ1Z19sb2dfbWVzc2FnZVsxMDI0XTsKKworCisjaWZk ZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKK3N0YXRpYyBfX2d0aHJlYWRfbXV0 ZXhfdCBjaGFuZ2VfcGVybWlzc2lvbnNfbG9jayA9IF9fR1RIUkVBRF9NVVRF WF9JTklUOworI2Vsc2UKK3N0YXRpYyBfX2d0aHJlYWRfbXV0ZXhfdCBjaGFu Z2VfcGVybWlzc2lvbnNfbG9jazsKKyNlbmRpZgorCisKKy8qIFR5cGVzIG5l ZWRlZCBieSBpbnNlcnRfb25seV9oYXNoX3NldHMuICAqLwordHlwZWRlZiB1 aW50cHRyX3QgaW50X3ZwdHI7CisKKy8qIFRoZSBzZXQgb2YgdmFsaWQgdnRh YmxlIHBvaW50ZXJzIGZvciBlYWNoIHZpcnR1YWwgY2xhc3MgaXMgc3RvcmVk CisgICBpbiBhIGhhc2ggdGFibGUuICBUaGlzIGlzIHRoZSBoYXNoaW5nIGZ1 bmN0aW9uIHVzZWQgZm9yIHRoZSBoYXNoCisgICB0YWJsZS4gIEZvciBtb3Jl IGluZm9ybWF0aW9uIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFz aAorICAgdGFibGUsIHNlZSB0aGUgY2xhc3MgaW5zZXJ0X29ubHlfaGFzaF9z ZXRzIGluIHZ0dl9zZXQuaC4gICovCisKK3N0cnVjdCB2cHRyX2hhc2gKKyAg eworICAgIC8qIEhhc2ggZnVuY3Rpb24sIHVzZWQgdG8gY29udmVydCB2dGFi bGUgcG9pbnRlciwgViwgKGEgbWVtb3J5CisgICAgICAgYWRkcmVzcykgaW50 byBhbiBpbmRleCBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgICBzaXpl X3QKKyAgICBvcGVyYXRvcigpIChpbnRfdnB0ciB2KSBjb25zdAorICAgICAg eworCWNvbnN0IHVpbnQzMl90IHggPSAweDdhMzVlNGQ5OworCWNvbnN0IGlu dCBzaGlmdCA9IChzaXplb2YgKHYpID09IDgpID8gMjMgOiAyMTsKKwl2ID0g eCAqIHY7CisJcmV0dXJuIHYgXiAodiA+PiBzaGlmdCk7CisgICAgICB9Cisg IH07CisKKy8qIFRoaXMgaXMgdGhlIG1lbW9yeSBhbGxvY2F0b3IgdXNlZCB0 byBjcmVhdGUgdGhlIGhhc2ggdGFibGUgZGF0YQorICAgc2V0cyBvZiB2YWxp ZCB2dGFibGUgcG9pbnRlcnMuICBXZSB1c2UgVlRWX21hbGxvYyBpbiBvcmRl ciB0byBrZWVwCisgICB0cmFjayBvZiB3aGljaCBwYWdlcyBoYXZlIGJlZW4g YWxsb2NhdGVkLCBzbyB3ZSBjYW4gdXBkYXRlIHRoZQorICAgcHJvdGVjdGlv bnMgb24gdGhvc2UgcGFnZXMgYXBwcm9wcmlhdGVseS4gIFNlZSB0aGUgY2xh c3MKKyAgIGluc2VydF9vbmx5X2hhc2hfc2V0cyBpbiB2dHZfc2V0LmggZm9y IG1vcmUgaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgdnB0cl9zZXRfYWxs b2MKKyAgeworICAgIC8qIE1lbW9yeSBhbGxvY2F0b3Igb3BlcmF0b3IuICBO IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUKKyAgICAgICBhbGxvY2F0 ZWQuICAqLworICAgIHZvaWQgKgorICAgIG9wZXJhdG9yKCkgKHNpemVfdCBu KSBjb25zdAorICAgICAgeworCXJldHVybiBWVFZfbWFsbG9jIChuKTsKKyAg ICAgIH0KKyAgfTsKKworLyogSW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIGNs YXNzZXMgKGluIHZ0dl9zZXQuaCkgZm9yIG91ciBwYXJ0aWN1bGFyCisgICBo YXNoIHRhYmxlIG5lZWRzLiAgKi8KK3R5cGVkZWYgaW5zZXJ0X29ubHlfaGFz aF9zZXRzPGludF92cHRyLCB2cHRyX2hhc2gsIHZwdHJfc2V0X2FsbG9jPiB2 dHZfc2V0czsKK3R5cGVkZWYgdnR2X3NldHM6Omluc2VydF9vbmx5X2hhc2hf c2V0IHZ0dl9zZXQ7Cit0eXBlZGVmIHZ0dl9zZXQgKiB2dHZfc2V0X2hhbmRs ZTsKK3R5cGVkZWYgdnR2X3NldF9oYW5kbGUgKiB2dHZfc2V0X2hhbmRsZV9o YW5kbGU7IAorCisvKiBEYXRhIHN0cnVjdHVyZSBwYXNzZWQgdG8gb3VyIGRs X2l0ZXJhdGVfcGhkciBjYWxsYmFjayBmdW5jdGlvbiwKKyAgIGluZGljYXRp bmcgd2hldGhlciBtcHJvdGVjdCBzaG91bGQgbWFrZSB0aGUgcGFnZXMgcmVh ZG9ubHkgb3IKKyAgIHJlYWQvd3JpdGUsIGFuZCB3aGF0IHBhZ2Ugc2l6ZSB0 byB1c2UuICAqLworCitzdHJ1Y3QgbXByb3RlY3RfZGF0YQorICB7CisgICAg aW50IHByb3RfbW9kZTsKKyAgICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsK KyAgfTsKKworLyogVGhpcyBmdW5jdGlvbiB0cmllcyB0byByZWFkIENPVU5U IGJ5dGVzIG91dCBvZiB0aGUgZmlsZSByZWZlcnJlZCB0bworICAgYnkgRkQg aW50byB0aGUgYnVmZmVyIEJVRi4gIEl0IHJldHVybnMgdGhlIGFjdHVhbCBu dW1iZXIgb2YgYnl0ZXMKKyAgIGl0IHN1Y2NlZWRlZCBpbiByZWFkaW5nLiAg Ki8KKworc3RhdGljIHNpemVfdAorUmVhZFBlcnNpc3RlbnQgKGludCBmZCwg dm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIGNoYXIgKmJ1ZjAgPSAo Y2hhciAqKSBidWY7CisgIHNpemVfdCBudW1fYnl0ZXMgPSAwOworICB3aGls ZSAobnVtX2J5dGVzIDwgY291bnQpCisgICAgeworICAgICAgaW50IGxlbjsK KyAgICAgIGxlbiA9IHJlYWQgKGZkLCBidWYwICsgbnVtX2J5dGVzLCBjb3Vu dCAtIG51bV9ieXRlcyk7CisgICAgICBpZiAobGVuIDwgMCkKKwlyZXR1cm4g LTE7CisgICAgICBpZiAobGVuID09IDApCisJYnJlYWs7CisgICAgICBudW1f Ynl0ZXMgKz0gbGVuOworICAgIH0KKworICByZXR1cm4gbnVtX2J5dGVzOwor fQorCisvKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgQ09VTlQgYnl0 ZXMsIHN0YXJ0aW5nIGF0IE9GRlNFVCBmcm9tCisgICB0aGUgZmlsZSByZWZl cnJlZCB0byBieSBGRCwgYW5kIHB1dCB0aGVtIGludG8gQlVGLiAgSXQgY2Fs bHMKKyAgIFJlYWRQZXJzaXN0ZW50IHRvIGhlbHAgaXQgZG8gc28uICBJdCBy ZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mCisgICBieXRlcyByZWFkLCBv ciAtMSBpZiBpdCBmYWlscyBhbHRvZ2V0aGVyLiAgKi8KKworc3RhdGljIHNp emVfdAorUmVhZEZyb21PZmZzZXQgKGludCBmZCwgdm9pZCAqYnVmLCBjb25z dCBzaXplX3QgY291bnQsIGNvbnN0IG9mZl90IG9mZnNldCkKK3sKKyAgb2Zm X3Qgb2ZmID0gbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgaWYg KG9mZiAhPSAob2ZmX3QpIC0xKQorICAgIHJldHVybiBSZWFkUGVyc2lzdGVu dCAoZmQsIGJ1ZiwgY291bnQpOworICByZXR1cm4gLTE7Cit9CisKKy8qIFRo ZSBmdW5jdGlvbiB0YWtlcyBhIE1FU1NBR0UgYW5kIGF0dGVtcHRzIHRvIHdy aXRlIGl0IHRvIHRoZSB2dGFibGUKKyAgIG1lbW9yeSBwcm90ZWN0aW9uIGxv ZyAoZm9yIGRlYnVnZ2luZyBwdXJwb3NlcykuICBJZiB0aGUgZmlsZSBpcyBu b3QKKyAgIG9wZW4sIGl0IGF0dGVtcHRzIHRvIG9wZW4gdGhlIGZpbGUgZmly c3QuICBTb21ldGltZXMgbXVsdGlwbGUKKyAgIHByb2Nlc3NlcyBtYXkgYmUg YXR0ZW1wdGluZyB0byB3cml0ZSB0byB0aGUgbG9nIGZpbGUgYXQgdGhlIHNh bWUKKyAgIHRpbWUsIHNvIHdlIG1heSBhdHRlbXB0IHRvIG9wZW4gbXVsdGlw bGUgbG9nIGZpbGVzICh3aXRoIHZlcnNpb25lZAorICAgbmFtZXMpIGlmIHRo ZSBmaXJzdCBvcGVuIGZhaWxzLiAgKi8KKworc3RhdGljIHZvaWQKK2xvZ19t ZW1vcnlfcHJvdGVjdGlvbl9kYXRhIChjaGFyICptZXNzYWdlKQoreworICBz dGF0aWMgaW50IGxvZ19mZCA9IC0xOworCisgIGNoYXIgYnVmZmVyWzUwXTsK KyAgaW50IGkgPSAwOworCisgIC8qIEF0dGVtcHQgdG8gb3BlbiB1cCB0byAy NSBsb2cgZmlsZXMuKi8KKyAgd2hpbGUgKGxvZ19mZCA9PSAtMSAmJiBpIDwg MjUpCisgICAgeworICAgICAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChi dWZmZXIpLCAidnR2X21lbW9yeV9wcm90ZWN0aW9uX2RhdGFfJWQubG9nIiwK KwkJaSk7CisgIAorICAgICAgaWYgKGxvZ19mZCA9PSAtMSkKKwlsb2dfZmQg PSB2dHZfb3Blbl9sb2cgKGJ1ZmZlcik7CisgICAgICArK2k7CisgICAgfQor CisgIHZ0dl9hZGRfdG9fbG9nIChsb2dfZmQsICIlcyIsIG1lc3NhZ2UpOwor ICBmc3luYyAobG9nX2ZkKTsKK30KKworLyogVGhpcyBpcyB0aGUgY2FsbGJh Y2sgZnVuY3Rpb24gdXNlZCBieSBkbF9pdGVyYXRlX3BoZHIgKHdoaWNoIGlz CisgICBjYWxsZWQgZnJvbSBWVFZfdW5wcm90ZWN0X3Z0YWJsZV92YXJzIGFu ZCBWVFZfcHJvdGVjdF92dGFibGVfdmFycykuCisgICBJdCBhdHRlbXB0cyB0 byBmaW5kIHRoZSBiaW5hcnkgZmlsZSBvbiBkaXNrIGZvciB0aGUgSU5GTyBy ZWNvcmQKKyAgIHRoYXQgZGxfaXRlcmF0ZV9waGRyIHBhc3NlcyBpbjsgb3Bl biB0aGUgYmluYXJ5IGZpbGUsIGFuZCByZWFkIGl0cworICAgc2VjdGlvbiBo ZWFkZXIgaW5mb3JtYXRpb24uICBJZiB0aGUgZmlsZSBjb250YWlucyBhCisg ICAiLnZ0YWJsZV9tYXBfdmFycyIgc2VjdGlvbiwgcmVhZCB0aGUgc2VjdGlv biBvZmZzZXQgYW5kIHNpemUuICBVc2UKKyAgIHRoZSBzZWN0dGlvbiBvZmZz ZXQgYW5kIHNpemUsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRhdGEgaW4g SU5GTworICAgdG8gbG9jYXRlIHRoZSBwYWdlcyBpbiBtZW1vcnkgd2hlcmUg dGhlIHNlY3Rpb24gaXMuICBDYWxsCisgICAnbXByb3RlY3QnIG9uIHRob3Nl IHBhZ2VzLCBzZXR0aW5nIHRoZSBwcm90ZWN0aW9uIGVpdGhlciB0bworICAg cmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUsIGRlcGVuZGluZyBvbiB3aGF0J3Mg aW4gREFUQS4gICovCisKK3N0YXRpYyBpbnQKK2RsX2l0ZXJhdGVfcGhkcl9j YWxsYmFjayAoc3RydWN0IGRsX3BoZHJfaW5mbyAqaW5mbywgc2l6ZV90IHVu dXNlZCwgdm9pZCAqZGF0YSkKK3sKKyAgbXByb3RlY3RfZGF0YSAqIG1kYXRh ID0gKG1wcm90ZWN0X2RhdGEgKikgZGF0YTsKKyAgb2ZmX3QgbWFwX3NlY3Rf b2Zmc2V0ID0gMDsKKyAgRWxmVyAoV29yZCkgbWFwX3NlY3RfbGVuID0gMDsK KyAgRWxmVyAoQWRkcikgc3RhcnRfYWRkciA9IDA7CisgIGludCBqOworICBi b29sIGZvdW5kID0gZmFsc2U7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBj aGFyIHByb2dyYW1fbmFtZVsxMDI0XTsKKyAgY2hhciAqY3B0cjsKKyAgY29u c3QgRWxmVyAoUGhkcikgKnBoZHJfaW5mbyA9IGluZm8tPmRscGlfcGhkcjsK KyAgY29uc3QgRWxmVyAoRWhkcikgKmVoZHJfaW5mbyA9CisgICAgKGNvbnN0 IEVsZlcgKEVoZHIpICopIChpbmZvLT5kbHBpX2FkZHIgKyBpbmZvLT5kbHBp X3BoZHJbMF0ucF92YWRkcgorCQkJICAgLSBpbmZvLT5kbHBpX3BoZHJbMF0u cF9vZmZzZXQpOworCisgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgbWFpbiBl eGVjdXRhYmxlLiAgVGhpcyBtYXkgb3IgbWF5IG5vdCBpbmNsdWRlCisgICAg IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHByb2dyYW0uICBGaW5kIHRoZSBm aXJzdCBzcGFjZSwgYXNzdW1lIGl0CisgICAgIGlzIHRoZSBzdGFydCBvZiB0 aGUgYXJndW1lbnQgbGlzdCwgYW5kIGNoYW5nZSBpdCB0byBhICdcMCcuICov CisKKyAgc25wcmludGYgKHByb2dyYW1fbmFtZSwgc2l6ZW9mIChwcm9ncmFt X25hbWUpLCBwcm9ncmFtX2ludm9jYXRpb25fbmFtZSk7CisKKyAgLyogRmlu ZCB0aGUgZmlyc3Qgbm9uLWVzY2FwZWQgc3BhY2UgaW4gdGhlIHByb2dyYW0g bmFtZSBhbmQgbWFrZSBpdAorICAgICB0aGUgZW5kIG9mIHRoZSBzdHJpbmcu ICAqLworICBjcHRyID0gc3RyY2hyIChwcm9ncmFtX25hbWUsICcgJyk7Cisg IGlmIChjcHRyICE9IE5VTEwgJiYgY3B0clstMV0gIT0gJ1xcJykKKyAgICBj cHRyWzBdID0gJ1wwJzsKKworICBpZiAoKHBoZHJfaW5mby0+cF90eXBlID09 IFBUX1BIRFIgfHwgcGhkcl9pbmZvLT5wX3R5cGUgPT0gUFRfTE9BRCkKKyAg ICAgICYmIChlaGRyX2luZm8tPmVfc2hvZmYgJiYgZWhkcl9pbmZvLT5lX3No bnVtKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICptYXBfc2VjdF9uYW1l ID0gIi52dGFibGVfbWFwX3ZhcnMiOworICAgICAgaW50IG5hbWVfbGVuID0g c3RybGVuIChtYXBfc2VjdF9uYW1lKTsKKyAgICAgIGludCBmZCA9IC0xOwor CisgICAgICAvKiBBdHRlbXB0IHRvIG9wZW4gdGhlIGJpbmFyeSBmaWxlIG9u IGRpc2suICAqLworCisgICAgICBpZiAoc3RybGVuIChpbmZvLT5kbHBpX25h bWUpID09IDApCisJeworCSAgaWYgKHBoZHJfaW5mby0+cF90eXBlID09IFBU X1BIRFIpCisJICAgIGZkID0gb3BlbiAocHJvZ3JhbV9uYW1lLCBPX1JET05M WSk7CisJfQorICAgICAgZWxzZQorCWZkID0gb3BlbiAoaW5mby0+ZGxwaV9u YW1lLCBPX1JET05MWSk7CisgICAgICAKKyAgICAgIGlmIChmZCAhPSAtMSkK Kwl7CisJICAvKiBGaW5kIHRoZSBzZWN0aW9uIGhlYWRlciBpbmZvcm1hdGlv biBpbiB0aGUgZmlsZS4gICovCisJICAKKwkgIEVsZlcgKEhhbGYpIHN0cnRh Yl9pZHggPSBlaGRyX2luZm8tPmVfc2hzdHJuZHg7CisJICBFbGZXIChTaGRy KSBzaHN0cnRhYjsKKwkgIG9mZl90IHNoc3RydGFiX29mZnNldCA9IGVoZHJf aW5mby0+ZV9zaG9mZiArCisJICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGVoZHJfaW5mby0+ZV9zaGVudHNpemUgKiBzdHJ0YWJfaWR4KTsK KwkgIHNpemVfdCBieXRlc19yZWFkID0gUmVhZEZyb21PZmZzZXQgKGZkLCAm c2hzdHJ0YWIsIHNpemVvZiAoc2hzdHJ0YWIpLAorCQkJCQkgICAgICBzaHN0 cnRhYl9vZmZzZXQpOworCSAgaWYgKGJ5dGVzX3JlYWQgPT0gc2l6ZW9mIChz aHN0cnRhYikpCisJICAgIHsKKwkgICAgICBFbGZXIChTaGRyKSBzZWN0X2hk cjsKKwkgICAgICAvKiBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9uIGhl YWRlcnMsIGxvb2tpbmcgZm9yIG9uZQorCQkgd2hvc2UgbmFtZSBpcyAiLnZ0 YWJsZV9tYXBfdmFycyIuICAqLworCisJICAgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBlaGRyX2luZm8tPmVfc2hudW0gJiYgIWZvdW5kOyArK2kpCisJCXsK KwkJICBvZmZfdCBvZmZzZXQgPSBlaGRyX2luZm8tPmVfc2hvZmYKKwkJICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlaGRyX2luZm8tPmVf c2hlbnRzaXplICogaSk7CisJCSAgYnl0ZXNfcmVhZCA9IFJlYWRGcm9tT2Zm c2V0IChmZCwgJnNlY3RfaGRyLAorCQkJCQkgICAgICAgc2l6ZW9mIChzZWN0 X2hkciksIG9mZnNldCk7CisJCSAgaWYgKGJ5dGVzX3JlYWQgPT0gc2l6ZW9m IChzZWN0X2hkcikpCisJCSAgICB7CisJCSAgICAgIGNoYXIgaGVhZGVyX25h bWVbNjRdOworCQkgICAgICBvZmZfdCBuYW1lX29mZnNldCA9IHNoc3RydGFi LnNoX29mZnNldCArCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNlY3RfaGRyLnNoX25hbWU7CisJCSAgICAgIGJ5dGVzX3Jl YWQgPSBSZWFkRnJvbU9mZnNldCAoZmQsICZoZWFkZXJfbmFtZSwgNjQsCisJ CQkJCQkgICBuYW1lX29mZnNldCk7CisJCSAgICAgIGlmIChieXRlc19yZWFk ID4gMCkKKwkJCWlmIChtZW1jbXAgKGhlYWRlcl9uYW1lLCBtYXBfc2VjdF9u YW1lLCBuYW1lX2xlbikgPT0gMCkKKwkJCSAgeworCQkJICAgIC8qIFdlIGZv dW5kIHRoZSBzZWN0aW9uOyBnZXQgaXRzIGxvYWQKKwkJCSAgICAgICBvZmZz ZXQgYW5kIHNpemUuICAqLworCQkJICAgIG1hcF9zZWN0X29mZnNldCA9IHNl Y3RfaGRyLnNoX2FkZHI7CisJCQkgICAgbWFwX3NlY3RfbGVuID0gc2VjdF9o ZHIuc2hfc2l6ZSAtIG1kYXRhLT5wYWdlX3NpemU7CisJCQkgICAgZm91bmQg PSB0cnVlOworCQkJICB9CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgY2xv c2UgKGZkKTsKKwl9CisgICAgICAvKiBDYWxjdWxhdGUgdGhlIHN0YXJ0IGFk ZHJlc3Mgb2YgdGhlIHNlY3Rpb24gaW4gbWVtb3J5LiAgKi8KKyAgICAgIHN0 YXJ0X2FkZHIgPSAoY29uc3QgRWxmVyAoQWRkcikpIGluZm8tPmRscGlfYWRk ciArIG1hcF9zZWN0X29mZnNldDsKKyAgICB9CisgICAgICAKKworICBpZiAo ZGVidWdfZnVuY3Rpb25zKQorICAgIHsKKyAgICAgIHNucHJpbnRmIChidWZm ZXIsIHNpemVvZihidWZmZXIpLAorCQkiICBMb29raW5nIGF0IGxvYWQgbW9k dWxlICVzIHRvIGNoYW5nZSBwZXJtaXNzaW9ucyB0byAlc1xuIiwKKwkJKChz dHJsZW4gKGluZm8tPmRscGlfbmFtZSkgPT0gMCkgPyBwcm9ncmFtX25hbWUK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA6IGluZm8tPmRscGlfbmFtZSksCisJCShtZGF0YS0+cHJvdF9tb2Rl ICYgUFJPVF9XUklURSkgPyAiUkVBRC9XUklURSIgOiAiUkVBRC1PTkxZIik7 CisgICAgICBsb2dfbWVtb3J5X3Byb3RlY3Rpb25fZGF0YSAoYnVmZmVyKTsK KyAgICB9CisKKyAgLyogU2VlIGlmIHdlIGFjdHVhbGx5IGZvdW5kIHRoZSBz ZWN0aW9uLiAgKi8KKyAgaWYgKHN0YXJ0X2FkZHIgJiYgbWFwX3NlY3RfbGVu KQorICAgIHsKKyAgICAgIEVsZlcgKEFkZHIpIHJlbG9jYXRlZF9zdGFydF9h ZGRyID0gc3RhcnRfYWRkcjsKKyAgICAgIEVsZlcgKFdvcmQpIHNpemVfaW5f bWVtb3J5ID0gbWFwX3NlY3RfbGVuOworCisgICAgICBpZiAoKHJlbG9jYXRl ZF9zdGFydF9hZGRyICE9IDApCisJICAmJiAoc2l6ZV9pbl9tZW1vcnkgIT0g MCkpCisgICAgICAgIHsKKwkgIC8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyAm IHNpemUgdG8gcGFzcyB0byBtcHJvdGVjdC4gKi8KKyAgICAgICAgICBFbGZX IChBZGRyKSBtcF9sb3cgPSByZWxvY2F0ZWRfc3RhcnRfYWRkciAmIH4obWRh dGEtPnBhZ2Vfc2l6ZSAtIDEpOworICAgICAgICAgIHNpemVfdCBtcF9zaXpl ID0gc2l6ZV9pbl9tZW1vcnkgLSAxOworCisJICBpZiAoZGVidWdfZnVuY3Rp b25zKQorCSAgICB7CisJICAgICAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9m IChidWZmZXIpLAorCQkJIiAgKCVzKTogUHJvdGVjdGluZyAlcCB0byAlcFxu IiwgCisJCSAgICAgICAoKHN0cmxlbiAoaW5mby0+ZGxwaV9uYW1lKSA9PSAw KSA/IHByb2dyYW1fbmFtZQorCQkJICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA6IGluZm8tPmRscGlfbmFtZSksCisJCSAgICAgICAodm9pZCAq KSBtcF9sb3csCisJCSAgICAgICAoKHZvaWQgKikgbXBfbG93ICsgbXBfc2l6 ZSkpOworCSAgICAgIGxvZ19tZW1vcnlfcHJvdGVjdGlvbl9kYXRhIChidWZm ZXIpOworCSAgICB9CisJICAKKwkgIC8qIENoYW5nZSB0aGUgcHJvdGVjdGlv bnMgb24gdGhlIHBhZ2VzIGZvciB0aGUgc2VjdGlvbi4gICovCisgICAgICAg ICAgaWYgKG1wcm90ZWN0ICgodm9pZCAqKSBtcF9sb3csIG1wX3NpemUsIG1k YXRhLT5wcm90X21vZGUpID09IC0xKQorICAgICAgICAgICAgeworICAgICAg ICAgICAgICBpZiAoZGVidWdfZnVuY3Rpb25zKQorICAgICAgICAgICAgICAg IHsKKyAgICAgICAgICAgICAgICAgIHNucHJpbnRmIChidWZmZXIsIHNpemVv ZiAoYnVmZmVyKSwKKwkJCSAgICAiRmFpbGVkIGNhbGxlZCB0byBtcHJvdGVj dCBmb3IgJXMgZXJyb3I6ICIsCisJCQkgICAgKG1kYXRhLT5wcm90X21vZGUg JiBQUk9UX1dSSVRFKSA/CisJCQkgICAgIlJFQUQvV1JJVEUiIDogIlJFQUQt T05MWSIpOworCQkgIGxvZ19tZW1vcnlfcHJvdGVjdGlvbl9kYXRhIChidWZm ZXIpOworICAgICAgICAgICAgICAgICAgcGVycm9yKE5VTEwpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVlRWX2Vycm9yKCk7CisgICAg ICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoZGVidWdfZnVuY3Rpb25z KQorCSAgICB7CisJICAgICAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChi dWZmZXIpLAorCQkJIm1wcm90ZWN0J2VkIHJhbmdlIFslcCwgJXBdXG4iLAor CQkJKHZvaWQgKikgbXBfbG93LCAoY2hhciAqKSBtcF9sb3cgKyBtcF9zaXpl KTsKKwkgICAgICBsb2dfbWVtb3J5X3Byb3RlY3Rpb25fZGF0YSAoYnVmZmVy KTsKKwkgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOwor fQorCisvKiBVbnByb3RlY3QgYWxsIHRoZSB2dGFibGUgbWFwIHZhcnMgYW5k IG90aGVyIHNpZGUgZGF0YSB0aGF0IGlzIHVzZWQKKyAgIHRvIGtlZXAgdGhl IGNvcmUgaGFzaF9tYXAgZGF0YS4gQWxsIG9mIHRoZXNlIGRhdGEgaGF2ZSBi ZWVuIHB1dAorICAgaW50byByZWxybyBzZWN0aW9ucyAqLworCitzdGF0aWMg dm9pZAorVlRWX3VucHJvdGVjdF92dGFibGVfdmFycyAodm9pZCkKK3sKKyAg bXByb3RlY3RfZGF0YSBtZGF0YTsKKworICBtZGF0YS5wcm90X21vZGUgPSBQ Uk9UX1JFQUQgfCBQUk9UX1dSSVRFOworICBtZGF0YS5wYWdlX3NpemUgPSBz eXNjb25mIChfU0NfUEFHRV9TSVpFKTsKKyAgZGxfaXRlcmF0ZV9waGRyIChk bF9pdGVyYXRlX3BoZHJfY2FsbGJhY2ssICh2b2lkICopICZtZGF0YSk7Cit9 CisKKy8qIFByb3RlY3QgYWxsIHRoZSB2dGFibGUgbWFwIHZhcnMgYW5kIG90 aGVyIHNpZGUgZGF0YSB0aGF0IGlzIHVzZWQKKyAgIHRvIGtlZXAgdGhlIGNv cmUgaGFzaF9tYXAgZGF0YS4gQWxsIG9mIHRoZXNlIGRhdGEgaGF2ZSBiZWVu IHB1dAorICAgaW50byByZWxybyBzZWN0aW9ucyAqLworCitzdGF0aWMgdm9p ZAorVlRWX3Byb3RlY3RfdnRhYmxlX3ZhcnMgKHZvaWQpCit7CisgIG1wcm90 ZWN0X2RhdGEgbWRhdGE7CisKKyAgbWRhdGEucHJvdF9tb2RlID0gUFJPVF9S RUFEOworICBtZGF0YS5wYWdlX3NpemUgPSBzeXNjb25mIChfU0NfUEFHRV9T SVpFKTsKKyAgZGxfaXRlcmF0ZV9waGRyIChkbF9pdGVyYXRlX3BoZHJfY2Fs bGJhY2ssICh2b2lkICopICZtZGF0YSk7Cit9CisKKyNpZm5kZWYgX19HVEhS RUFEX01VVEVYX0lOSVQKK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX2NoYW5n ZV9wZXJtaXNzaW9uc19tdXRleGVzICgpCit7CisgIF9fR1RIUkVBRF9NVVRF WF9JTklUX0ZVTkNUSU9OICgmY2hhbmdlX3Blcm1pc3Npb25zX2xvY2spOwor fQorI2VuZGlmCisKKy8qICBWYXJpYWJsZXMgbmVlZGVkIGZvciBnZXR0aW5n IHRoZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXNodGFibGUgc2V0LiAgKi8K KyNpZiBIQVNIVEFCTEVfU1RBVFMKK19BdG9taWNTdGF0Q291bnRlciBzdGF0 X2NvbnRhaW5zID0gMDsKK19BdG9taWNTdGF0Q291bnRlciBzdGF0X2luc2Vy dCA9IDA7CitfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9yZXNpemUgPSAwOwor X0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY3JlYXRlID0gMDsKK19BdG9taWNT dGF0Q291bnRlciBzdGF0X3Byb2Jlc19pbl9ub25fdHJpdmlhbF9zZXQgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTAgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTEgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTIgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTMgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTQgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTUgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTYgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTcgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTggPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTkgPSAw OworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTEwID0g MDsKK19BdG9taWNTdGF0Q291bnRlciBzdGF0X2NvbnRhaW5zX3NpemUxMSA9 IDA7CitfQXRvbWljU3RhdENvdW50ZXIgc3RhdF9jb250YWluc19zaXplMTIg PSAwOworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfc2l6ZTEz X29yX21vcmUgPSAwOworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFp bnNfc2l6ZXMgPSAwOworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfZ3Jvd19m cm9tX3NpemUwX3RvXzEgPSAwOworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRf Z3Jvd19mcm9tX3NpemUxX3RvXzIgPSAwOworX0F0b21pY1N0YXRDb3VudGVy IHN0YXRfZG91YmxlX3RoZV9udW1iZXJfb2ZfYnVja2V0cyA9IDA7CitfQXRv bWljU3RhdENvdW50ZXIgc3RhdF9pbnNlcnRfZm91bmRfaGFzaF9jb2xsaXNp b24gPSAwOworX0F0b21pY1N0YXRDb3VudGVyIHN0YXRfY29udGFpbnNfaW5f bm9uX3RyaXZpYWxfc2V0ID0gMDsKK19BdG9taWNTdGF0Q291bnRlciBzdGF0 X2luc2VydF9rZXlfdGhhdF93YXNfYWxyZWFkeV9wcmVzZW50ID0gMDsKKyNl bmRpZgorLyogUmVjb3JkIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGhhc2ggdGFi bGUgc2V0cywgZm9yIGRlYnVnZ2luZy4gICovCisKK3N0YXRpYyB2b2lkCits b2dfc2V0X3N0YXRzICh2b2lkKQoreworI2lmIEhBU0hUQUJMRV9TVEFUUwor ICAgICAgaWYgKHNldF9sb2dfZmQgPT0gLTEpCisJc2V0X2xvZ19mZCA9IHZ0 dl9vcGVuX2xvZyAoInZ0dl9zZXRfc3RhdHMubG9nIik7CisKKyAgICAgIHZ0 dl9hZGRfdG9fbG9nIChzZXRfbG9nX2ZkLCAiLS0tXG4lc1xuIiwKKwkJICAg ICAgaW5zZXJ0X29ubHlfaGFzaF90YWJsZXNfc3RhdHMoKS5jX3N0cigpKTsK KyNlbmRpZgorfQorCisvKiBDaGFuZ2UgdGhlIHBlcm1pc3Npb25zIG9uIGFs bCB0aGUgcGFnZXMgd2UgaGF2ZSBhbGxvY2F0ZWQgZm9yIHRoZQorICAgZGF0 YSBzZXRzIGFuZCBhbGwgdGhlICIudnRhYmxlX21hcF92YXIiIHNlY3Rpb25z IGluIG1lbW9yeSAod2hpY2gKKyAgIGNvbnRhaW4gb3VyIHZ0YWJsZSBtYXAg dmFyaWFibGVzKS4gIFBFUk0gaW5kaWNhdGVzIHdoZXRoZXIgdG8gbWFrZQor ICAgdGhlIHBlcm1pc3Npb25zIHJlYWQtb25seSBvciByZWFkLXdyaXRlLiAg Ki8KKwordm9pZAorX19WTFRDaGFuZ2VQZXJtaXNzaW9uIChpbnQgcGVybSkK K3sKKyAgaWYgKGRlYnVnX2Z1bmN0aW9ucykKKyAgICB7CisgICAgICBpZiAo cGVybSA9PSBfX1ZMVFBfUkVBRF9XUklURSkKKwlmcHJpbnRmIChzdGRvdXQs ICJDaGFuZ2luZyBWTFQgcGVybWlzaXNvbnMgdG8gUmVhZC1Xcml0ZS5cbiIp OworICAgICAgZWxzZSBpZiAocGVybSA9PSBfX1ZMVFBfUkVBRF9PTkxZKQor CWZwcmludGYgKHN0ZG91dCwgIkNoYW5naW5nIFZMVCBwZXJtaXNzaW9ucyB0 byBSZWFkLW9ubHkuXG4iKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChzdGRv dXQsICJVbnJlY29nbml6ZWQgcGVybWlzc2lvbnMgdmFsdWU6ICVkXG4iLCBw ZXJtKTsKKyAgICB9CisKKyNpZm5kZWYgX19HVEhSRUFEX01VVEVYX0lOSVQK KyAgc3RhdGljIF9fZ3RocmVhZF9vbmNlX3QgbXV0ZXhfb25jZSBWVFZfUFJP VEVDVEVEX1ZBUiA9IF9fR1RIUkVBRF9PTkNFX0lOSVQ7CisKKyAgX19ndGhy ZWFkX29uY2UgKCZtdXRleF9vbmNlLCBpbml0aWFsaXplX2NoYW5nZV9wZXJt aXNzaW9uc19tdXRleGVzKTsKKyNlbmRpZgorCisgIC8qIE9yZGVyaW5nIG9m IHRoZXNlIHVucHJvdGVjdC9wcm90ZWN0IGNhbGxzIGlzIHZlcnkgaW1wb3J0 YW50LgorICAgICBZb3UgZmlyc3QgbmVlZCB0byB1bnByb3RlY3QgYWxsIHRo ZSBtYXAgdmFycyBhbmQgc2lkZQorICAgICBzdHJ1Y3R1cmVzIGJlZm9yZSB5 b3UgZG8gYW55dGhpbmcgd2l0aCB0aGUgY29yZSBkYXRhCisgICAgIHN0cnVj dHVyZXMgKGhhc2hfbWFwcykgKi8KKworICBpZiAocGVybSA9PSBfX1ZMVFBf UkVBRF9XUklURSkKKyAgICB7CisgICAgICAvKiBUT0RPOiBNZWVkIHRvIHJl dmlzaXQgdGhpcyBjb2RlIGZvciBkbG9wZW4uIEl0IG1vc3QgcHJvYmFibHkK KyAgICAgICAgIGlzIG5vdCB1bmxvY2tpbmcgdGhlIHByb3RlY3RlZCB2dGFi bGUgdmFycyBhZnRlciBmb3IgYSBsb2FkCisgICAgICAgICBtb2R1bGUgdGhh dCBpcyBub3QgdGhlIGZpcnN0IGxvYWQgbW9kdWxlLiAgKi8KKyAgICAgIF9f Z3RocmVhZF9tdXRleF9sb2NrICgmY2hhbmdlX3Blcm1pc3Npb25zX2xvY2sp OworCisgICAgICBWVFZfdW5wcm90ZWN0X3Z0YWJsZV92YXJzICgpOworICAg ICAgVlRWX21hbGxvY19pbml0ICgpOworICAgICAgVlRWX21hbGxvY191bnBy b3RlY3QgKCk7CisKKyAgICB9CisgIGVsc2UgaWYgKHBlcm0gPT0gX19WTFRQ X1JFQURfT05MWSkKKyAgICB7CisgICAgICBpZiAoZGVidWdfaGFzaCkKKyAg ICAgICAgbG9nX3NldF9zdGF0cygpOworCisgICAgICBWVFZfbWFsbG9jX3By b3RlY3QgKCk7CisgICAgICBWVFZfcHJvdGVjdF92dGFibGVfdmFycyAoKTsK KworICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jayAoJmNoYW5nZV9wZXJt aXNzaW9uc19sb2NrKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgdGhlIG1l bW9yeSBhbGxvY2F0b3IgdXNlZCB0byBjcmVhdGUgdGhlIGhhc2ggdGFibGUg dGhhdAorICAgbWFwcyBmcm9tIHZ0YWJsZSBtYXAgdmFyaWFibGUgbmFtZSB0 byB0aGUgZGF0YSBzZXQgdGhhdCB2dGFibGUgbWFwCisgICB2YXJpYWJsZSBz aG91bGQgcG9pbnQgdG8uICBUaGlzIGlzIHBhcnQgb2Ygb3VyIHZ0YWJsZSBt YXAgdmFyaWFibGUKKyAgIHN5bWJvbCByZXNvbHV0aW9uLCB3aGljaCBpcyBu ZWNlc3NhcnkgYmVjYXVzZSB0aGUgc2FtZSB2dGFibGUgbWFwCisgICB2YXJp YWJsZSBtYXkgYmUgY3JlYXRlZCBieSBtdWx0aXBsZSBjb21waWxhdGlvbiB1 bml0cyBhbmQgd2UgbmVlZCBhCisgICBtZXRob2QgdG8gbWFrZSBzdXJlIHRo YXQgYWxsIHZ0YWJsZSBtYXAgdmFyaWFibGVzIGZvciBhIHBhcnRpY3VsYXIK KyAgIGNsYXNzIHBvaW50IHRvIHRoZSBzYW1lIGRhdGEgc2V0IGF0IHJ1bnRp bWUuICAqLworCitzdHJ1Y3QgaW5zZXJ0X29ubHlfaGFzaF9tYXBfYWxsb2Nh dG9yCisgIHsKKyAgICAvKiBOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8g YWxsb2NhdGUuICAqLworICAgIHZvaWQgKgorICAgIGFsbG9jIChzaXplX3Qg bikgY29uc3QKKyAgICB7ICAKKyAgICAgIHJldHVybiBWVFZfbWFsbG9jIChu KTsKKyAgICB9CisKKyAgICAvKiBQIHBvaW50cyB0byB0aGUgbWVtb3J5IHRv IGJlIGRlYWxsb2NhdGVkOyBOIGlzIHRoZSBudW1iZXIgb2YKKyAgICAgICBi eXRlcyB0byBkZWFsbG9jYXRlLiAgKi8KKyAgICB2b2lkCisgICAgZGVhbGxv YyAodm9pZCAqcCwgc2l6ZV90IG4pIGNvbnN0CisgICAgeworICAgICAgVlRW X2ZyZWUgKHApOworICAgIH0KKyAgfTsKKworLyogRXhwbGljaXRseSBpbnN0 YW50aWF0ZSB0aGlzIGNsYXNzIHNpbmNlIHRoaXMgZmlsZSBpcyBjb21waWxl ZCB3aXRoCisgICAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcy4gIFRoZXNlIGFy ZSBmb3IgdGhlIGhhc2ggdGFibGUgdGhhdCBpcyB1c2VkCisgICB0byBkbyB2 dGFibGUgbWFwIHZhcmlhYmxlIHN5bWJvbCByZXNvbHV0aW9uLiAgKi8KK3Rl bXBsYXRlIGNsYXNzIGluc2VydF9vbmx5X2hhc2hfbWFwIDx2dHZfc2V0X2hh bmRsZSAqLCAKKwkJCQkgICAgIGluc2VydF9vbmx5X2hhc2hfbWFwX2FsbG9j YXRvciA+OwordHlwZWRlZiBpbnNlcnRfb25seV9oYXNoX21hcCA8dnR2X3Nl dF9oYW5kbGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu c2VydF9vbmx5X2hhc2hfbWFwX2FsbG9jYXRvciA+IHMyczsKK3R5cGVkZWYg Y29uc3QgczJzOjprZXlfdHlwZSAgdnR2X3N5bWJvbF9rZXk7CisKK3N0YXRp YyBzMnMgKiB2dHZfc3ltYm9sX3VuaWZpY2F0aW9uX21hcCBWVFZfUFJPVEVD VEVEX1ZBUiA9IE5VTEw7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgU0VUX0hB TkRMRV9IQU5ETEVfQklUID0gMHgyOworCisvKiBJbiB0aGUgY2FzZSB3aGVy ZSBhIHZ0YWJsZSBtYXAgdmFyaWFibGUgaXMgdGhlIG9ubHkgaW5zdGFuY2Ug b2YgdGhlCisgICB2YXJpYWJsZSB3ZSBoYXZlIHNlZW4sIGl0IHBvaW50cyBk aXJlY3RseSB0byB0aGUgc2V0IG9mIHZhbGlkCisgICB2dGFibGUgcG9pbnRl cnMuICBBbGwgc3Vic2VxdWVudCBpbnN0YW5jZXMgb2YgdGhlICdzYW1lJyB2 dGFibGUgbWFwCisgICB2YXJpYWJsZSBwb2ludCB0byB0aGUgZmlyc3QgdnRh YmxlIG1hcCB2YXJpYWJsZS4gIFRoaXMgZnVuY3Rpb24sCisgICBnaXZlbiBh IHZ0YWJsZSBtYXAgdmFyaWFibGUgUFRSLCBjaGVja3MgYSBiaXQgdG8gc2Vl IHdoZXRoZXIgaXQncworICAgcG9pbnRpbmcgZGlyZWN0bHkgdG8gdGhlIGRh dGEgc2V0IG9yIHRvIHRoZSBmaXJzdCB2dGFibGUgbWFwCisgICB2YXJpYWJs ZS4gICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXNfc2V0X2hhbmRsZV9o YW5kbGUgKHZvaWQgKiBwdHIpCit7CisgIHJldHVybiAoKHVuc2lnbmVkIGxv bmcpIHB0ciAmIFNFVF9IQU5ETEVfSEFORExFX0JJVCkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09 IFNFVF9IQU5ETEVfSEFORExFX0JJVDsKK30KKworLyogUmV0dXJucyB0aGUg YWN0dWFsIHBvaW50ZXIgdmFsdWUgb2YgYSB2dGFibGUgbWFwIHZhcmlhYmxl LCBQVFIgKHNlZQorICAgY29tbWVudHMgZm9yIGlzX3NldF9oYW5kbGVfaGFu ZGxlIGZvciBtb3JlIGRldGFpbHMpLiAgKi8KKworc3RhdGljIGlubGluZSB2 dHZfc2V0X2hhbmRsZSAqIAorcHRyX2Zyb21fc2V0X2hhbmRsZV9oYW5kbGUg KHZvaWQgKiBwdHIpCit7CisgIHJldHVybiAodnR2X3NldF9oYW5kbGUgKikg KCh1bnNpZ25lZCBsb25nKSBwdHIgJiB+U0VUX0hBTkRMRV9IQU5ETEVfQklU KTsKK30KKworLyogR2l2ZW4gYSB2dGFibGUgbWFwIHZhcmlhYmxlLCBQVFIs IHRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYml0IHRoYXQKKyAgIHNheXMgdGhp cyBpcyB0aGUgc2Vjb25kIChvciBsYXRlcikgaW5zdGFuY2Ugb2YgYSB2dGFi bGUgbWFwCisgICB2YXJpYWJsZS4gICovCisKK3N0YXRpYyBpbmxpbmUgdnR2 X3NldF9oYW5kbGVfaGFuZGxlCitzZXRfaGFuZGxlX2hhbmRsZSAodnR2X3Nl dF9oYW5kbGUgKiBwdHIpCit7CisgIHJldHVybiAodnR2X3NldF9oYW5kbGVf aGFuZGxlKSAoKHVuc2lnbmVkIGxvbmcpIHB0ciB8IFNFVF9IQU5ETEVfSEFO RExFX0JJVCk7Cit9CisKKy8qIE9wZW4gZXJyb3IgbG9nZ2luZyBmaWxlLCBp ZiBub3QgYWxyZWFkeSBvcGVuLCBhbmQgd3JpdGUgdnRhYmxlCisgICB2ZXJp ZmljYXRpb24gZmFpbHVyZSBtZXNzYWdlcyAoTE9HX01TRykgdG8gdGhlIGxv ZyBmaWxlLiAgQWxzbworICAgZ2VuZXJhdGUgYSBiYWNrdHJhY2UgaW4gdGhl IGxvZyBmaWxlLCBpZiBHRU5FUkFURV9CQUNLVFJBQ0UgaXMKKyAgIHNldC4g ICovCisKK3N0YXRpYyB2b2lkCitsb2dfZXJyb3JfbWVzc2FnZSAoY29uc3Qg Y2hhciAqbG9nX21zZywgYm9vbCBnZW5lcmF0ZV9iYWNrdHJhY2UpCit7Cisg IGlmICh2dHZfZmFpbHVyZXNfbG9nX2ZkID09IC0xKQorICAgIHZ0dl9mYWls dXJlc19sb2dfZmQgPSB2dHZfb3Blbl9sb2cgKCJ2dGFibGVfdmVyaWZpY2F0 aW9uX2ZhaWx1cmVzLmxvZyIpOworCisgIGlmICh2dHZfZmFpbHVyZXNfbG9n X2ZkID09IC0xKQorICAgIHJldHVybjsKKworICB2dHZfYWRkX3RvX2xvZyAo dnR2X2ZhaWx1cmVzX2xvZ19mZCwgIiVzIiwgbG9nX21zZyk7CisKKyAgaWYg KGdlbmVyYXRlX2JhY2t0cmFjZSkKKyAgICB7CisjZGVmaW5lIFNUQUNLX0RF UFRIIDIwCisgICAgICB2b2lkICpjYWxsZXJzW1NUQUNLX0RFUFRIXTsKKyAg ICAgIGludCBhY3R1YWxfZGVwdGggPSBiYWNrdHJhY2UgKGNhbGxlcnMsIFNU QUNLX0RFUFRIKTsKKyAgICAgIGJhY2t0cmFjZV9zeW1ib2xzX2ZkIChjYWxs ZXJzLCBhY3R1YWxfZGVwdGgsIHZ0dl9mYWlsdXJlc19sb2dfZmQpOworICAg IH0KK30KKworLyogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGEgc2V0IGhh bmRsZSB0byBhIHZ0YWJsZSBzZXQuIEl0IG1ha2VzCisgICBzdXJlIHRoYXQg dGhlcmUgaXMgb25seSBvbmUgc2V0IGhhbmRsZSBmb3IgYSBwYXJ0aWN1bGFy IHNldCBieQorICAgdXNpbmcgYSBtYXAgZnJvbSBzZXQgbmFtZSB0byBwb2lu dGVyIHRvIHNldCBoYW5kbGUuIFNpbmNlIHRoZXJlCisgICB3aWxsIGJlIG11 bHRpcGxlIGNvcGllcyBvZiB0aGUgcG9pbnRlciB0byB0aGUgc2V0IGhhbmRs ZSAob25lIHBlcgorICAgY29tcGlsYXRpb24gdW5pdCB0aGF0IHVzZXMgaXQp LCBpdCBtYWtlcyBzdXJlIHRvIGluaXRpYWxpemUgYWxsIHRoZQorICAgcG9p bnRlcnMgdG8gdGhlIHNldCBoYW5kbGUgc28gdGhhdCB0aGUgc2V0IGhhbmRs ZSBpcyB1bmlxdWUuIFRvCisgICBtYWtlIHRoaXMgYSBsaXR0bGUgbW9yZSBl ZmZpY2llbnQgYW5kIGF2b2lkIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KKyAg IGluIHNvbWUgY2FzZXMsIHRoZSBmaXJzdCBwb2ludGVyIHRvIGhhbmRsZSBm b3IgYSBwYXJ0aWN1bGFyIGhhbmRsZQorICAgYmVjb21lcyB0aGUgaGFuZGxl IGl0c2VsZiBhbmQgdGhlIG90aGVyIHBvaW50ZXJzIHdpbGwgcG9pbnQgdG8g dGhlCisgICBzZXQgaGFuZGxlLiAgVGhpcyBpcyB0aGUgZGVidWcgdmVyc2lv biBvZiB0aGlzIGZ1bmN0aW9uLCBzbyBpdAorICAgb3V0cHV0cyBleHRyYSBk ZWJ1Z2dpbmcgbWVzc2FnZXMgYW5kIGxvZ2dpbmcuICBTRVRfSEFORExFX1BU UiBpcworICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHZ0YWJsZSBtYXAgdmFyaWFi bGUsIFNFVF9TWU1CT0xfS0VZIGlzIHRoZSBoYXNoCisgICB0YWJsZSBrZXkg KGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIG1hcCB2YXJpYWJsZSBhbmQg dGhlIGhhc2gKKyAgIHZhbHVlKSBhbmQgU0laRV9ISU5UIGlzIGEgZ3Vlc3Mg Zm9yIHRoZSBiZXN0IGluaXRpYWwgc2l6ZSBmb3IgdGhlCisgICBzZXQgb2Yg dnRhYmxlIHBvaW50ZXJzIHRoYXQgU0VUX0hBTkRMRV9QT0lOVEVSIHdpbGwg cG9pbnQgdG8uICAqLworCit2b2lkIF9fVkxUSW5pdFNldFN5bWJvbERlYnVn ICh2b2lkICoqc2V0X2hhbmRsZV9wdHIsCisJCQkgICAgICBjb25zdCB2b2lk ICpzZXRfc3ltYm9sX2tleSwgCisJCQkgICAgICBzaXplX3Qgc2l6ZV9oaW50 KQoreworICBWVFZfREVCVUdfQVNTRVJUIChzZXRfaGFuZGxlX3B0cik7CisK KyAgaWYgKHZ0dl9zeW1ib2xfdW5pZmljYXRpb25fbWFwID09IE5VTEwpCisg ICAgeworICAgICAgLyogVE9ETzogIEZvciBub3cgd2UgaGF2ZSBjaG9zZW4g MTAyNCwgYnV0IHdlIG5lZWQgdG8gY29tZSB1cCB3aXRoIGEKKwkgYmV0dGVy IGluaXRpYWwgc2l6ZSBmb3IgdGhpcy4gICovCisgICAgICB2dHZfc3ltYm9s X3VuaWZpY2F0aW9uX21hcCA9IHMyczo6Y3JlYXRlICgxMDI0KTsKKyAgICAg IFZUVl9ERUJVR19BU1NFUlQodnR2X3N5bWJvbF91bmlmaWNhdGlvbl9tYXAp OworICAgIH0KKworICB2dHZfc2V0X2hhbmRsZSAqaGFuZGxlX3B0ciA9ICh2 dHZfc2V0X2hhbmRsZSAqKSBzZXRfaGFuZGxlX3B0cjsKKyAgdnR2X3N5bWJv bF9rZXkgKnN5bWJvbF9rZXlfcHRyID0gKHZ0dl9zeW1ib2xfa2V5ICopIHNl dF9zeW1ib2xfa2V5OworCisgIGNvbnN0IHMyczo6dmFsdWVfdHlwZSAqIG1h cF92YWx1ZV9wdHIgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHZ0dl9zeW1ib2xfdW5pZmljYXRpb25fbWFwLT5nZXQgKHN5bWJvbF9rZXlf cHRyKTsKKyAgY2hhciBidWZmZXJbMjAwXTsKKyAgaWYgKG1hcF92YWx1ZV9w dHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKmhhbmRsZV9wdHIgIT0g TlVMTCkKKwl7CisJICBzbnByaW50ZiAoYnVmZmVyLCBzaXplb2YoYnVmZmVy KSwgCisJCSAgICAiKioqIEZvdW5kIG5vbi1OVUxMIGxvY2FsIHNldCBwdHIg JXAgbWlzc2luZyBmb3Igc3ltYm9sIgorCQkgICAgIiAlLipzIiwKKwkJICAg ICpoYW5kbGVfcHRyLCBzeW1ib2xfa2V5X3B0ci0+biwgc3ltYm9sX2tleV9w dHItPmJ5dGVzKTsKKwkgIGxvZ19lcnJvcl9tZXNzYWdlIChidWZmZXIsIHRy dWUpOworCSAgVlRWX0RFQlVHX0FTU0VSVCAoMCk7CisJfQorICAgIH0KKyAg ZWxzZSBpZiAoKmhhbmRsZV9wdHIgIT0gTlVMTCAmJiAKKyAgICAgICAgICAg KGhhbmRsZV9wdHIgIT0gKm1hcF92YWx1ZV9wdHIgJiYgCisgICAgICAgICAg ICBwdHJfZnJvbV9zZXRfaGFuZGxlX2hhbmRsZSAoKmhhbmRsZV9wdHIpICE9 ICptYXBfdmFsdWVfcHRyKSkKKyAgICB7CisgICAgICBWVFZfREVCVUdfQVNT RVJUICgqbWFwX3ZhbHVlX3B0ciAhPSBOVUxMKTsKKyAgICAgIHNucHJpbnRm IChidWZmZXIsIHNpemVvZihidWZmZXIpLCAKKwkJIioqKiBGb3VuZCBkaWZm ZW5jZSBiZXR3ZWVuIGxvY2FsIHNldCBwdHIgJXAgYW5kIHNldCBwdHIgJXAi CisJCSJmb3Igc3ltYm9sICUuKnMiLCAKKwkJKmhhbmRsZV9wdHIsICptYXBf dmFsdWVfcHRyLCAKKwkJc3ltYm9sX2tleV9wdHItPm4sIHN5bWJvbF9rZXlf cHRyLT5ieXRlcyk7CisgICAgICBsb2dfZXJyb3JfbWVzc2FnZSAoYnVmZmVy LCB0cnVlKTsKKyAgICAgIFZUVl9ERUJVR19BU1NFUlQgKDApOworICAgIH0K KyAgZWxzZSBpZiAoKmhhbmRsZV9wdHIgPT0gTlVMTCkKKyAgICB7CisgICAg ICAvKiBFeGVjdXRpb24gc2hvdWxkIG5vdCByZWFjaCB0aGlzIHBvaW50LiAg Ki8KKyAgICB9CisKKyAgaWYgKCpoYW5kbGVfcHRyICE9IE5VTEwpCisgICAg eworICAgICAgaWYgKCFpc19zZXRfaGFuZGxlX2hhbmRsZSAoKnNldF9oYW5k bGVfcHRyKSkKKyAgICAgICAgaGFuZGxlX3B0ciA9ICh2dHZfc2V0X2hhbmRs ZSAqKSBzZXRfaGFuZGxlX3B0cjsKKyAgICAgIGVsc2UKKyAgICAgICAgaGFu ZGxlX3B0ciA9IHB0cl9mcm9tX3NldF9oYW5kbGVfaGFuZGxlICgqc2V0X2hh bmRsZV9wdHIpOworICAgICAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChi dWZmZXIpLCAiICBDYWxsaW5nIHJlc2l6ZSB3aXRoICVwXG4iLAorCQloYW5k bGVfcHRyKTsKKyAgICAgIGxvZ19tZW1vcnlfcHJvdGVjdGlvbl9kYXRhIChi dWZmZXIpOworICAgICAgdnR2X3NldHM6OnJlc2l6ZSAoc2l6ZV9oaW50LCBo YW5kbGVfcHRyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVlRWX0RF QlVHX0FTU0VSVCAoKmhhbmRsZV9wdHIgPT0gTlVMTCk7CisgIGlmIChtYXBf dmFsdWVfcHRyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCptYXBfdmFs dWVfcHRyID09IGhhbmRsZV9wdHIpCisJeworCSAgc25wcmludGYgKGJ1ZmZl ciwgc2l6ZW9mIChidWZmZXIpLCAiICBDYWxsaW5nIHJlc2l6ZSB3aXRoICVw XG4iLAorCQkgICAgKm1hcF92YWx1ZV9wdHIpOworCSAgbG9nX21lbW9yeV9w cm90ZWN0aW9uX2RhdGEgKGJ1ZmZlcik7CisJICB2dHZfc2V0czo6cmVzaXpl IChzaXplX2hpbnQsICptYXBfdmFsdWVfcHRyKTsKKwl9CisgICAgICBlbHNl CisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgb25lIGxldmVsIGhhbmRs ZSB0byB0aGUgc2V0IGFscmVhZHkgZXhpc3RzLiBTbywgd2UKKyAgICAgICAg ICAgICBhcmUgYWRkaW5nIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBoZXJl IGFuZCB3ZSB3aWxsCisgICAgICAgICAgICAgc3RvcmUgYSBwb2ludGVyIHRv IHRoZSBvbmUgbGV2ZWwgaGFuZGxlIGhlcmUuICAqLworCisgICAgICAgICAg dnR2X3NldF9oYW5kbGVfaGFuZGxlICogaGFuZGxlX2hhbmRsZV9wdHIgPSAK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo dnR2X3NldF9oYW5kbGVfaGFuZGxlICopaGFuZGxlX3B0cjsKKyAgICAgICAg ICAqaGFuZGxlX2hhbmRsZV9wdHIgPSBzZXRfaGFuZGxlX2hhbmRsZSgqbWFw X3ZhbHVlX3B0cik7CisgICAgICAgICAgVlRWX0RFQlVHX0FTU0VSVCgqaGFu ZGxlX2hhbmRsZV9wdHIgIT0gTlVMTCk7CisKKyAgICAgICAgICAvKiBUaGUg aGFuZGxlIGNhbiBpdHNlbGYgYmUgTlVMTCBpZiB0aGUgc2V0IGhhcyBvbmx5 CisJICAgICBiZWVuIGluaXRpYXpsaWVkIHdpdGggc2l6ZSBoaW50ID09IDEu ICovCisJICBzbnByaW50ZiAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksICIg IENhbGxpbmcgcmVzaXplIHdpdGggJXBcbiIsCisJCSAgICAqbWFwX3ZhbHVl X3B0cik7CisJICBsb2dfbWVtb3J5X3Byb3RlY3Rpb25fZGF0YSAoYnVmZmVy KTsKKyAgICAgICAgICB2dHZfc2V0czo6cmVzaXplIChzaXplX2hpbnQsICpt YXBfdmFsdWVfcHRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAg IHsKKyAgICAgIC8qIFdlIHdpbGwgY3JlYXRlIGEgbmV3IHNldC4gU28sIGlu IHRoaXMgY2FzZSBoYW5kbGVfcHRyIGlzIHRoZQorICAgICAgICAgb25lIGxl dmVsIHBvaW50ZXIgdG8gdGhlIHNldCBoYW5kbGUuICBDcmVhdGUgY29weSBv ZiBtYXAgbmFtZQorICAgICAgICAgaW4gY2FzZSB0aGUgbWVtb3J5IHdoZXJl IHRoaXMgY29tZXMgZnJvbSBnZXRzIHVubWFwcGVkIGJ5CisgICAgICAgICBk bGNsb3NlLiAgKi8KKyAgICAgIHNpemVfdCBtYXBfa2V5X2xlbiA9IHN5bWJv bF9rZXlfcHRyLT5uICsgc2l6ZW9mICh2dHZfc3ltYm9sX2tleSk7CisgICAg ICB2b2lkICptYXBfa2V5ID0gVlRWX21hbGxvYyAobWFwX2tleV9sZW4pOwor CisgICAgICBtZW1jcHkgKG1hcF9rZXksIHN5bWJvbF9rZXlfcHRyLCBtYXBf a2V5X2xlbik7CisKKyAgICAgIHMyczo6dmFsdWVfdHlwZSAqdmFsdWVfcHRy OworICAgICAgdnR2X3N5bWJvbF91bmlmaWNhdGlvbl9tYXAgPSAKKyAgICAg ICAgdnR2X3N5bWJvbF91bmlmaWNhdGlvbl9tYXAtPmZpbmRfb3JfYWRkX2tl eSAoKHZ0dl9zeW1ib2xfa2V5ICopbWFwX2tleSwKKwkJCQkJCSAgICAgJnZh bHVlX3B0cik7ICAgICAgICAgICAgICAKKyAgICAgICp2YWx1ZV9wdHIgPSBo YW5kbGVfcHRyOworCisgICAgICAvKiAgVE9ETzogV2Ugc2hvdWxkIHZlcmlm eSB0aGUgcmV0dXJuIHZhbHVlLiAqLworICAgICAgdnR2X3NldHM6OmNyZWF0 ZSAoc2l6ZV9oaW50LCBoYW5kbGVfcHRyKTsKKyAgICAgIFZUVl9ERUJVR19B U1NFUlQgKHNpemVfaGludCA8PSAxIHx8ICpoYW5kbGVfcHRyICE9IE5VTEwp OworICAgIH0KKworICBpZiAoZGVidWdfaW5pdCkKKyAgICB7CisgICAgICBp ZiAoaW5pdF9sb2dfZmQgPT0gLTEpCisJaW5pdF9sb2dfZmQgPSB2dHZfb3Bl bl9sb2cgKCJ2dHZfaW5pdC5sb2ciKTsKKworICAgICAgdnR2X2FkZF90b19s b2cgKGluaXRfbG9nX2ZkLCAKKwkJICAgICAgIkluaXQgaGFuZGxlOiVwIGZv ciBzeW1ib2w6JS4qcyBoYXNoOiV1IHNpemVfaGludDolbHUiCisJCSAgICAg ICJudW1iZXIgb2Ygc3ltYm9sczolbHUgXG4iLAorCQkgICAgICBzZXRfaGFu ZGxlX3B0ciwgc3ltYm9sX2tleV9wdHItPm4sCisJCSAgICAgIHN5bWJvbF9r ZXlfcHRyLT5ieXRlcywgc3ltYm9sX2tleV9wdHItPmhhc2gsIHNpemVfaGlu dCwgCisJCSAgICAgIHZ0dl9zeW1ib2xfdW5pZmljYXRpb25fbWFwLT5zaXpl ICgpKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB0 aGUgYWRkcmVzcyBvZiBhIHZ0YWJsZSBtYXAgdmFyaWFibGUKKyAgIChTRVRf SEFORExFX1BUUiksIGEgVlRBQkxFX1BUUiB0byBhZGQgdG8gdGhlIGRhdGEg c2V0LCB0aGUgbmFtZSBvZgorICAgdGhlIHZ0YWJsZSBtYXAgdmFyaWFibGUg KFNFVF9TWU1CT0xfTkFNRSkgYW5kIHRoZSBuYW1lIG9mIHRoZQorICAgdnRh YmxlIChWVEFCTEVfTkFNRSkgYmVpbmcgcG9pbnRlZCB0by4gIElmIHRoZSB2 dGFibGUgbWFwIHZhcmlhYmxlCisgICBpcyBOVUxMIGl0IGNyZWF0ZXMgYSBu ZXcgZGF0YSBzZXQgYW5kIGluaXRpYWxpemVzIHRoZSB2YXJpYWJsZSwKKyAg IG90aGVyd2lzZSBpdCB1c2VzIG91ciBzeW1ib2wgdW5pZmljYXRpb24gdG8g ZmluZCB0aGUgcmlnaHQgZGF0YQorICAgc2V0OyBpbiBlaXRoZXIgY2FzZSBp dCB0aGVuIGFkZHMgdGhlIHZ0YWJsZSBwb2ludGVyIHRvIHRoZSBzZXQuCisg ICBUaGUgb3RoZXIgdHdvIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGRlYnVn Z2luZyBpbmZvcm1hdGlvbi4gICovCisKK3ZvaWQKK19fVkxUUmVnaXN0ZXJQ YWlyRGVidWcgKHZvaWQgKipzZXRfaGFuZGxlX3B0ciwgY29uc3Qgdm9pZCAq dnRhYmxlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNo YXIgKnNldF9zeW1ib2xfbmFtZSwgY29uc3QgY2hhciAqdnRhYmxlX25hbWUp CisJCQkKK3sKKyAgVlRWX0RFQlVHX0FTU0VSVChzZXRfaGFuZGxlX3B0ciAh PSBOVUxMKTsKKyAgLyogc2V0X2hhbmRsZV9wdHIgY2FuIGJlIE5VTEwgaWYg dGhlIGNhbGwgdG8gSW5pdFNldFN5bWJvbCBoYWQgYQorICAgICBzaXplIGhp bnQgb2YgMS4gICovCisKKyAgaW50X3ZwdHIgdnRibF9wdHIgPSAoaW50X3Zw dHIpIHZ0YWJsZV9wdHI7CisgIFZUVl9ERUJVR19BU1NFUlQgKHZ0dl9zeW1i b2xfdW5pZmljYXRpb25fbWFwICE9IE5VTEwpOworCisgIHZ0dl9zZXRfaGFu ZGxlICpoYW5kbGVfcHRyOworICBpZiAoIWlzX3NldF9oYW5kbGVfaGFuZGxl ICgqc2V0X2hhbmRsZV9wdHIpKQorICAgIGhhbmRsZV9wdHIgPSAodnR2X3Nl dF9oYW5kbGUgKikgc2V0X2hhbmRsZV9wdHI7CisgIGVsc2UKKyAgICBoYW5k bGVfcHRyID0gcHRyX2Zyb21fc2V0X2hhbmRsZV9oYW5kbGUgKCpzZXRfaGFu ZGxlX3B0cik7CisKKyAgLyogVE9ETzogV2Ugc2hvdWxkIHZlcmlmeSB0aGUg cmV0dXJuIHZhbHVlLiAgKi8KKyAgdnR2X3NldHM6Omluc2VydCAodnRibF9w dHIsIGhhbmRsZV9wdHIpOworCisgIGlmIChkZWJ1Z19pbml0KQorICAgIHsK KyAgICAgIGlmIChpbml0X2xvZ19mZCA9PSAtMSkKKwlpbml0X2xvZ19mZCA9 IHZ0dl9vcGVuX2xvZygidnR2X2luaXQubG9nIik7CisKKyAgICAgIHZ0dl9h ZGRfdG9fbG9nKGluaXRfbG9nX2ZkLCAKKyAgICAgICAgICAgICAgICAgICAg ICJSZWdpc3RlcmVkICVzIDogJXMgKCVwKSAyIGxldmVsIGRlcmVmID0gJXNc biIsCisJCSAgICAgc2V0X3N5bWJvbF9uYW1lLCB2dGFibGVfbmFtZSwgdnRi bF9wdHIsIAorICAgICAgICAgICAgICAgICAgICAgaXNfc2V0X2hhbmRsZV9o YW5kbGUoKnNldF9oYW5kbGVfcHRyKSA/ICJ5ZXMiIDogIm5vIiApOworICAg IH0KK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX1ZM VFZlcmlmeVZ0YWJsZVBvaW50ZXJEZWJ1ZzsgaXQKKyAgIHNlbmRzIGFzIG11 Y2ggZGVidWdnaW5nIGluZm9ybWF0aW9uIGFzIGl0IGNhbiB0byB0aGUgZXJy b3IgbG9nCisgICBmaWxlLCB0aGVuIGNhbGxzIF9fdnR2X3ZlcmlmeV9mYWls LiAgU0VUX0hBTkRMRV9QVFIgaXMgdGhlIHBvaW50ZXIKKyAgIHRvIHRoZSBz ZXQgb2YgdmFsaWQgdnRhYmxlIHBvaW50ZXJzLCBWVEJMX1BUUiBpcyB0aGUg cG9pbnRlciB0aGF0CisgICB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXQsIGFu ZCBERUJVR19NU0cgaXMgdGhlIG1lc3NhZ2UgdG8gYmUKKyAgIHdyaXR0ZW4g dG8gdGhlIGxvZyBmaWxlIGJlZm9yZSBmYWlsaW5nLiBuICovCisKK3N0YXRp YyB2b2lkCitfX3Z0dl92ZXJpZnlfZmFpbF9kZWJ1ZyAodm9pZCAqKnNldF9o YW5kbGVfcHRyLCBjb25zdCB2b2lkICp2dGJsX3B0ciwgCisgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVidWdfbXNnKQoreworICBs b2dfZXJyb3JfbWVzc2FnZSAoZGVidWdfbXNnLCBmYWxzZSk7CisKKyAgLyog Q2FsbCB0aGUgcHVibGljIGludGVyZmFjZSBpbiBjYXNlIGl0IGhhcyBiZWVu IG92ZXJ3cml0dGVuIGJ5CisgICAgIHVzZXIuICAqLworICBfX3Z0dl92ZXJp ZnlfZmFpbCAoc2V0X2hhbmRsZV9wdHIsIHZ0YmxfcHRyKTsKKworICBsb2df ZXJyb3JfbWVzc2FnZSAoIlJldHVybmVkIGZyb20gX192dHZfdmVyaWZ5X2Zh aWwuIgorICAgICAgICAgICAgICAgICAgICAgIiBTZWNvbmRhcnkgdmVyaWZp Y2F0aW9uIHN1Y2NlZWRlZC5cbiIsIGZhbHNlKTsKK30KKworLyogVGhpcyBp cyB0aGUgZGVidWcgdmVyc2lvbiBvZiB0aGUgdmVyaWZpY2F0aW9uIGZ1bmN0 aW9uLiAgSXQgdGFrZXMKKyAgIHRoZSBhZGRyZXNzIG9mIGEgdnRhYmxlIG1h cCB2YXJpYWJsZSAoU0VUX0hBTkRMRV9QVFIpIGFuZCBhCisgICBWVEFCTEVf UFRSIHRvIHZhbGlkYXRlLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSB2 dGFibGUgbWFwCisgICB2YXJpYWJsZSAoU0VUX1NZTUJPTF9OQU1FKSBhbmQg VlRBQkxFX05BTUUsIHdoaWNoIGFyZSB1c2VkIGZvcgorICAgZGVidWdnaW5n IG1lc3NhZ2VzLiAgSXQgY2hlY2tzIHRvIHNlZSBpZiBWVEFCTEVfUFRSIGlz IGluIHRoZSBzZXQKKyAgIHBvaW50ZWQgdG8gYnkgU0VUX0hBTkRMRV9QVFIu ICBJZiBzbywgaXQgcmV0dXJucyBWVEFCTEVfUFRSLAorICAgb3RoZXJ3aXNl IGl0IGNhbGxzIF9fdnR2X3ZlcmlmeV9mYWlsLCB3aGljaCB1c3VhbGx5IGxv Z3MgZXJyb3IKKyAgIG1lc3NhZ2VzIGFuZCBjYWxscyBhYm9ydC4gICovCisK K2NvbnN0IHZvaWQgKgorX19WTFRWZXJpZnlWdGFibGVQb2ludGVyRGVidWcg KHZvaWQgKipzZXRfaGFuZGxlX3B0ciwgY29uc3Qgdm9pZCAqdnRhYmxlX3B0 ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy ICpzZXRfc3ltYm9sX25hbWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqdnRh YmxlX25hbWUpCit7CisgIFZUVl9ERUJVR19BU1NFUlQgKHNldF9oYW5kbGVf cHRyICE9IE5VTEwgJiYgKnNldF9oYW5kbGVfcHRyICE9IE5VTEwpOworICBp bnRfdnB0ciB2dGJsX3B0ciA9IChpbnRfdnB0cikgdnRhYmxlX3B0cjsKKwor ICB2dHZfc2V0X2hhbmRsZSAqaGFuZGxlX3B0cjsKKyAgaWYgKCFpc19zZXRf aGFuZGxlX2hhbmRsZSAoKnNldF9oYW5kbGVfcHRyKSkKKyAgICBoYW5kbGVf cHRyID0gKHZ0dl9zZXRfaGFuZGxlICopIHNldF9oYW5kbGVfcHRyOworICBl bHNlCisgICAgaGFuZGxlX3B0ciA9IHB0cl9mcm9tX3NldF9oYW5kbGVfaGFu ZGxlICgqc2V0X2hhbmRsZV9wdHIpOworCisgIGlmICh2dHZfc2V0czo6Y29u dGFpbnMgKHZ0YmxfcHRyLCBoYW5kbGVfcHRyKSkKKyAgICB7CisgICAgICBp ZiAoZGVidWdfdmVyaWZ5X3Z0YWJsZSkKKyAgICAgICAgeworICAgICAgICAg IGlmICh2ZXJpZnlfdnRhYmxlX2xvZ19mZCA9PSAtMSkKKyAgICAgICAgICAg IHZ0dl9vcGVuX2xvZyAoInZ0dl92ZXJpZnlfdnRhYmxlLmxvZyIpOworICAg ICAgICAgIHZ0dl9hZGRfdG9fbG9nICh2ZXJpZnlfdnRhYmxlX2xvZ19mZCwK KwkJCSAgIlZlcmlmaWVkICVzICVzIHZhbHVlID0gJXBcbiIsCisJCQkgIHNl dF9zeW1ib2xfbmFtZSwgdnRhYmxlX25hbWUsIHZ0YWJsZV9wdHIpOworICAg ICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgZmFp bGVkIHRvIGZpbmQgdGhlIHZ0YWJsZSBwb2ludGVyIGluIHRoZSBzZXQgb2Yg dmFsaWQKKwkgcG9pbnRlcnMuICBMb2cgdGhlIGVycm9yIGRhdGEgYW5kIGNh bGwgdGhlIGZhaWx1cmUKKwkgZnVuY3Rpb24uICAqLworICAgICAgc25wcmlu dGYgKGRlYnVnX2xvZ19tZXNzYWdlLCBzaXplb2YgKGRlYnVnX2xvZ19tZXNz YWdlKSwKKwkJIkxvb2tpbmcgZm9yICVzIGluICVzXG4iLCB2dGFibGVfbmFt ZSwgc2V0X3N5bWJvbF9uYW1lKTsKKyAgICAgIF9fdnR2X3ZlcmlmeV9mYWls X2RlYnVnIChzZXRfaGFuZGxlX3B0ciwgdnRhYmxlX3B0ciwgZGVidWdfbG9n X21lc3NhZ2UpOworCisgICAgICAvKiBOb3JtYWxseSBfX3Z0dl92ZXJpZnlf ZmFpbF9kZWJ1ZyB3aWxsIGNhbGwgYWJvcnQsIHNvIHdlIHdvbid0CisgICAg ICAgICBleGVjdXRlIHRoZSByZXR1cm4gYmVsb3cuICBJZiB3ZSBnZXQgdGhp cyBmYXIsIHRoZSBhc3N1bXB0aW9uCisgICAgICAgICBpcyB0aGF0IHRoZSBw cm9ncmFtbWVyIGhhcyByZXBsYWNlZCBfX3Z0dl92ZXJpZnlfZmFpbF9kZWJ1 ZworICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2Ygc2Vjb25kYXJ5IHZlcmlm aWNhdGlvbiBBTkQgdGhpcyBzZWNvbmRhcnkKKyAgICAgICAgIHZlcmlmaWNh dGlvbiBzdWNjZWVkZWQsIHNvIHRoZSB2dGFibGUgcG9pbnRlciBpcyB2YWxp ZC4gICovCisgICAgfQorCisgIHJldHVybiB2dGFibGVfcHRyOworfQorCisv KiBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgYSBzZXQgaGFuZGxlIHRvIGEg dnRhYmxlIHNldC4gSXQgbWFrZXMKKyAgIHN1cmUgdGhhdCB0aGVyZSBpcyBv bmx5IG9uZSBzZXQgaGFuZGxlIGZvciBhIHBhcnRpY3VsYXIgc2V0IGJ5Cisg ICB1c2luZyBhIG1hcCBmcm9tIHNldCBuYW1lIHRvIHBvaW50ZXIgdG8gc2V0 IGhhbmRsZS4gU2luY2UgdGhlcmUKKyAgIHdpbGwgYmUgbXVsdGlwbGUgY29w aWVzIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBzZXQgaGFuZGxlIChvbmUgcGVy CisgICBjb21waWxhdGlvbiB1bml0IHRoYXQgdXNlcyBpdCksIGl0IG1ha2Vz IHN1cmUgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlCisgICBwb2ludGVycyB0byB0 aGUgc2V0IGhhbmRsZSBzbyB0aGF0IHRoZSBzZXQgaGFuZGxlIGlzIHVuaXF1 ZS4gVG8KKyAgIG1ha2UgdGhpcyBhIGxpdHRsZSBtb3JlIGVmZmljaWVudCBh bmQgYXZvaWQgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbgorICAgaW4gc29tZSBj YXNlcywgdGhlIGZpcnN0IHBvaW50ZXIgdG8gaGFuZGxlIGZvciBhIHBhcnRp Y3VsYXIgaGFuZGxlCisgICBiZWNvbWVzIHRoZSBoYW5kbGUgaXRzZWxmIGFu ZCB0aGUgb3RoZXIgcG9pbnRlcnMgd2lsbCBwb2ludCB0byB0aGUKKyAgIHNl dCBoYW5kbGUuICBTRVRfSEFORExFX1BUUiBpcyB0aGUgYWRkcmVzcyBvZiB0 aGUgdnRhYmxlIG1hcAorICAgdmFyaWFibGUsIFNFVF9TWU1CT0xfS0VZIGlz IHRoZSBoYXNoIHRhYmxlIGtleSAoY29udGFpbmluZyB0aGUgbmFtZQorICAg b2YgdGhlIG1hcCB2YXJpYWJsZSBhbmQgdGhlIGhhc2ggdmFsdWUpIGFuZCBT SVpFX0hJTlQgaXMgYSBndWVzcworICAgZm9yIHRoZSBiZXN0IGluaXRpYWwg c2l6ZSBmb3IgdGhlIHNldCBvZiB2dGFibGUgcG9pbnRlcnMgdGhhdAorICAg U0VUX0hBTkRMRV9QT0lOVEVSIHdpbGwgcG9pbnQgdG8uKi8KKwordm9pZCBf X1ZMVEluaXRTZXRTeW1ib2wgKHZvaWQgKipzZXRfaGFuZGxlX3B0ciwgY29u c3Qgdm9pZCAqc2V0X3N5bWJvbF9rZXksCisJCQkgc2l6ZV90IHNpemVfaGlu dCkKK3sKKyAgdnR2X3NldF9oYW5kbGUgKmhhbmRsZV9wdHIgPSAodnR2X3Nl dF9oYW5kbGUgKikgc2V0X2hhbmRsZV9wdHI7CisgIGlmICgqaGFuZGxlX3B0 ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghaXNfc2V0X2hhbmRsZV9o YW5kbGUgKCpzZXRfaGFuZGxlX3B0cikpCisgICAgICAgIGhhbmRsZV9wdHIg PSAodnR2X3NldF9oYW5kbGUgKikgc2V0X2hhbmRsZV9wdHI7CisgICAgICBl bHNlCisgICAgICAgIGhhbmRsZV9wdHIgPSBwdHJfZnJvbV9zZXRfaGFuZGxl X2hhbmRsZSAoKnNldF9oYW5kbGVfcHRyKTsKKyAgICAgIHZ0dl9zZXRzOjpy ZXNpemUgKHNpemVfaGludCwgaGFuZGxlX3B0cik7CisgICAgICByZXR1cm47 CisgICAgfQorCisgIGlmICh2dHZfc3ltYm9sX3VuaWZpY2F0aW9uX21hcCA9 PSBOVUxMKQorICAgIHZ0dl9zeW1ib2xfdW5pZmljYXRpb25fbWFwID0gczJz OjpjcmVhdGUgKDEwMjQpOworCisgIHZ0dl9zeW1ib2xfa2V5ICpzeW1ib2xf a2V5X3B0ciA9ICh2dHZfc3ltYm9sX2tleSAqKSBzZXRfc3ltYm9sX2tleTsK KyAgY29uc3QgczJzOjp2YWx1ZV90eXBlICptYXBfdmFsdWVfcHRyID0gCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHZfc3ltYm9sX3VuaWZp Y2F0aW9uX21hcC0+Z2V0IChzeW1ib2xfa2V5X3B0cik7CisKKyAgaWYgKG1h cF92YWx1ZV9wdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKm1hcF92 YWx1ZV9wdHIgPT0gaGFuZGxlX3B0cikKKwl2dHZfc2V0czo6cmVzaXplIChz aXplX2hpbnQsICptYXBfdmFsdWVfcHRyKTsKKyAgICAgIGVsc2UKKwl7CisJ ICAvKiBUaGUgb25lIGxldmVsIGhhbmRsZSB0byB0aGUgc2V0IGFscmVhZHkg ZXhpc3RzLiBTbywgd2UKKwkgICAgIGFyZSBhZGRpbmcgb25lIGxldmVsIG9m IGluZGlyZWN0aW9uIGhlcmUgYW5kIHdlIHdpbGwKKwkgICAgIHN0b3JlIGEg cG9pbnRlciB0byB0aGUgb25lIGxldmVsIHBvaW50ZXIgaGVyZS4gICovCisJ ICB2dHZfc2V0X2hhbmRsZV9oYW5kbGUgKmhhbmRsZV9oYW5kbGVfcHRyID0g CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dHZfc2V0 X2hhbmRsZV9oYW5kbGUgKikgaGFuZGxlX3B0cjsKKwkgICpoYW5kbGVfaGFu ZGxlX3B0ciA9IHNldF9oYW5kbGVfaGFuZGxlICgqbWFwX3ZhbHVlX3B0cik7 CisJICB2dHZfc2V0czo6cmVzaXplIChzaXplX2hpbnQsICptYXBfdmFsdWVf cHRyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2Ug d2lsbCBjcmVhdGUgYSBuZXcgc2V0LiBTbywgaW4gdGhpcyBjYXNlIGhhbmRs ZV9wdHIgaXMgdGhlCisgICAgICAgICBvbmUgbGV2ZWwgcG9pbnRlciB0byB0 aGUgc2V0IGhhbmRsZS4gIENyZWF0ZSBjb3B5IG9mIG1hcCBuYW1lCisgICAg ICAgICBpbiBjYXNlIHRoZSBtZW1vcnkgd2hlcmUgdGhpcyBjb21lcyBmcm9t IGdldHMgdW5tYXBwZWQgYnkKKyAgICAgICAgIGRsY2xvc2UuICAqLworICAg ICAgc2l6ZV90IG1hcF9rZXlfbGVuID0gc3ltYm9sX2tleV9wdHItPm4gKyBz aXplb2YgKHZ0dl9zeW1ib2xfa2V5KTsKKyAgICAgIHZvaWQgKiBtYXBfa2V5 ID0gVlRWX21hbGxvYyAobWFwX2tleV9sZW4pOworICAgICAgbWVtY3B5ICht YXBfa2V5LCBzeW1ib2xfa2V5X3B0ciwgbWFwX2tleV9sZW4pOworCisgICAg ICBzMnM6OnZhbHVlX3R5cGUgKiB2YWx1ZV9wdHI7CisgICAgICB2dHZfc3lt Ym9sX3VuaWZpY2F0aW9uX21hcCA9IAorCXZ0dl9zeW1ib2xfdW5pZmljYXRp b25fbWFwLT5maW5kX29yX2FkZF9rZXkgKCh2dHZfc3ltYm9sX2tleSAqKW1h cF9rZXksCisJCQkJCQkgICAgICZ2YWx1ZV9wdHIpOworICAgICAgICAgICAg CisgICAgICAqdmFsdWVfcHRyID0gaGFuZGxlX3B0cjsKKworICAgICAgLyog VE9ETzogV2Ugc2hvdWxkIHZlcmlmeSB0aGUgcmV0dXJuIHZhbHVlLiAgKi8K KyAgICAgIHZ0dl9zZXRzOjpjcmVhdGUgKHNpemVfaGludCwgaGFuZGxlX3B0 cik7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdGhl IGFkZHJlc3Mgb2YgYSB2dGFibGUgbWFwIHZhcmlhYmxlCisgICAoU0VUX0hB TkRMRV9QVFIpIGFuZCBhIFZUQUJMRV9QVFIuICBJZiB0aGUgdnRhYmxlIG1h cCB2YXJpYWJsZSBpcworICAgTlVMTCBpdCBjcmVhdGVzIGEgbmV3IGRhdGEg c2V0IGFuZCBpbml0aWFsaXplcyB0aGUgdmFyaWFibGUsCisgICBvdGhlcndp c2UgaXQgdXNlcyBvdXIgc3ltYm9sIHVuaWZpY2F0aW9uIHRvIGZpbmQgdGhl IHJpZ2h0IGRhdGEKKyAgIHNldDsgaW4gZWl0aGVyIGNhc2UgaXQgdGhlbiBh ZGRzIHRoZSB2dGFibGUgcG9pbnRlciB0byB0aGUgc2V0LiAgKi8KKwordm9p ZCAKK19fVkxUUmVnaXN0ZXJQYWlyICh2b2lkICoqc2V0X2hhbmRsZV9wdHIs IGNvbnN0IHZvaWQgKnZ0YWJsZV9wdHIpCit7CisgIGludF92cHRyIHZ0Ymxf cHRyID0gKGludF92cHRyKSB2dGFibGVfcHRyOworCisgIHZ0dl9zZXRfaGFu ZGxlICpoYW5kbGVfcHRyOworICBpZiAoIWlzX3NldF9oYW5kbGVfaGFuZGxl ICgqc2V0X2hhbmRsZV9wdHIpKQorICAgIGhhbmRsZV9wdHIgPSAodnR2X3Nl dF9oYW5kbGUgKikgc2V0X2hhbmRsZV9wdHI7CisgIGVsc2UKKyAgICBoYW5k bGVfcHRyID0gcHRyX2Zyb21fc2V0X2hhbmRsZV9oYW5kbGUgKCpzZXRfaGFu ZGxlX3B0cik7CisKKyAgLyogVE9ETzogV2Ugc2hvdWxkIHZlcmlmeSB0aGUg cmV0dXJuIHZhbHVlLiAgKi8KKyAgdnR2X3NldHM6Omluc2VydCAodnRibF9w dHIsIGhhbmRsZV9wdHIpOworfQorCisKKy8qIFRoaXMgaXMgdGhlIG1haW4g dmVyaWZpY2F0aW9uIGZ1bmN0aW9uLiAgSXQgdGFrZXMgdGhlIGFkZHJlc3Mg b2YgYQorICAgdnRhYmxlIG1hcCB2YXJpYWJsZSAoU0VUX0hBTkRMRV9QVFIp IGFuZCBhIFZUQUJMRV9QVFIgdG8gdmFsaWRhdGUuCisgICBJdCBjaGVja3Mg dG8gc2VlIGlmIFZUQUJMRV9QVFIgaXMgaW4gdGhlIHNldCBwb2ludGVkIHRv IGJ5CisgICBTRVRfSEFORExFX1BUUi4gIElmIHNvLCBpdCByZXR1cm5zIFZU QUJMRV9QVFIsIG90aGVyd2lzZSBpdCBjYWxscworICAgX192dHZfdmVyaWZ5 X2ZhaWwsIHdoaWNoIHVzdWFsbHkgbG9ncyBlcnJvciBtZXNzYWdlcyBhbmQg Y2FsbHMKKyAgIGFib3J0LiAgU2luY2UgdGhpcyBmdW5jdGlvbiBnZXRzIGNh bGxlZCBWRVJZIGZyZXF1ZW50bHksIGl0IGlzCisgICBpbXBvcnRhbnQgZm9y IGl0IHRvIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4gICovCisKK2Nv bnN0IHZvaWQgKgorX19WTFRWZXJpZnlWdGFibGVQb2ludGVyICh2b2lkICoq IHNldF9oYW5kbGVfcHRyLCBjb25zdCB2b2lkICogdnRhYmxlX3B0cikKK3sK KyAgaW50X3ZwdHIgdnRibF9wdHIgPSAoaW50X3ZwdHIpIHZ0YWJsZV9wdHI7 CisKKyAgdnR2X3NldF9oYW5kbGUgKmhhbmRsZV9wdHI7CisgIGlmICghaXNf c2V0X2hhbmRsZV9oYW5kbGUgKCpzZXRfaGFuZGxlX3B0cikpCisgICAgaGFu ZGxlX3B0ciA9ICh2dHZfc2V0X2hhbmRsZSAqKSBzZXRfaGFuZGxlX3B0cjsK KyAgZWxzZQorICAgIGhhbmRsZV9wdHIgPSBwdHJfZnJvbV9zZXRfaGFuZGxl X2hhbmRsZSAoKnNldF9oYW5kbGVfcHRyKTsKKworICBpZiAoIXZ0dl9zZXRz Ojpjb250YWlucyAodnRibF9wdHIsIGhhbmRsZV9wdHIpKQorICAgIHsKKyAg ICAgIF9fdnR2X3ZlcmlmeV9mYWlsICgodm9pZCAqKikgaGFuZGxlX3B0ciwg dnRhYmxlX3B0cik7CisgICAgICAvKiBOb3JtYWxseSBfX3Z0dl92ZXJpZnlf ZmFpbCB3aWxsIGNhbGwgYWJvcnQsIHNvIHdlIHdvbid0CisgICAgICAgICBl eGVjdXRlIHRoZSByZXR1cm4gYmVsb3cuICBJZiB3ZSBnZXQgdGhpcyBmYXIs IHRoZSBhc3N1bXB0aW9uCisgICAgICAgICBpcyB0aGF0IHRoZSBwcm9ncmFt bWVyIGhhcyByZXBsYWNlZCBfX3Z0dl92ZXJpZnlfZmFpbCB3aXRoCisgICAg ICAgICBzb21lIGtpbmQgb2Ygc2Vjb25kYXJ5IHZlcmlmaWNhdGlvbiBBTkQg dGhpcyBzZWNvbmRhcnkKKyAgICAgICAgIHZlcmlmaWNhdGlvbiBzdWNjZWVk ZWQsIHNvIHRoZSB2dGFibGUgcG9pbnRlciBpcyB2YWxpZC4gICovCisgICAg fQorCisgIHJldHVybiB2dGFibGVfcHRyOworfQorCisvKiBUaGlzIGZ1bmN0 aW9uIGNhbGxzIF9fZm9ydGlmeV9mYWlsIHdpdGggYSBGQUlMVVJFX01TRyBh bmQgdGhlbgorICAgY2FsbHMgYWJvcnQuICAqLworCit2b2lkCitfX3Z0dl9y ZWFsbHlfZmFpbCAoY29uc3QgY2hhciAqZmFpbHVyZV9tc2cpCit7CisgIF9f Zm9ydGlmeV9mYWlsIChmYWlsdXJlX21zZyk7CisKKyAgLyogV2Ugc2hvdWxk IG5ldmVyIGdldCB0aGlzIGZhcjsgX19mb3J0aWZ5X2ZhaWwgY2FsbHMgX19s aWJjX21lc3NhZ2UKKyAgICAgd2hpY2ggcHJpbnRzIG91dCBhIGJhY2sgdHJh Y2UgYW5kIGEgbWVtb3J5IGR1bXAgYW5kIHRoZW4gaXMKKyAgICAgc3VwcG9z ZWQgdG8gY2FsbCBhYm9ydCwgYnV0IGxldCdzIHBsYXkgaXQgc2FmZSBhbnl3 YXkgYW5kIGNhbGwgYWJvcnQKKyAgICAgb3Vyc2VsdmVzLiAgKi8KKyAgYWJv cnQgKCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gZXJyb3Ig TVNHLCBhIHZ0YWJsZSBtYXAgdmFyaWFibGUKKyAgIChEQVRBX1NFVF9QVFIp IGFuZCBhIHZ0YWJsZSBwb2ludGVyIChWVEJMX1BUUikuICBJdCBpcyBjYWxs ZWQgd2hlbgorICAgYW4gYXR0ZW1wdCB0byB2ZXJpZnkgVlRCTF9QVFIgd2l0 aCB0aGUgc2V0IHBvaW50ZWQgdG8gYnkKKyAgIERBVEFfU0VUX1BUUiBmYWls ZWQuICBJdCBvdXRwdXRzIGEgZmFpbHVyZSBtZXNzYWdlIHdpdGggdGhlCisg ICBhZGRyZXNzZXMgaW52b2x2ZWQsIGFuZCBjYWxscyBfX3Z0dl9yZWFsbHlf ZmFpbC4gICovCisKK3N0YXRpYyB2b2lkCit2dHZfZmFpbCAoY29uc3QgY2hh ciAqbXNnLCB2b2lkICoqZGF0YV9zZXRfcHRyLCBjb25zdCB2b2lkICp2dGJs X3B0cikKK3sKKyAgY2hhciBidWZmZXJbMTI4XTsKKyAgaW50IGJ1Zl9sZW47 CisgIGNvbnN0IGNoYXIgKmZvcm1hdF9zdHIgPQorICAgICAgICAgICAgICAg ICAiKioqIFVuYWJsZSB0byB2ZXJpZnkgdnRhYmxlIHBvaW50ZXIgKCVwKSBp biBzZXQgKCVwKSAqKiogXG4iOworCisgIHNucHJpbnRmIChidWZmZXIsIHNp emVvZiAoYnVmZmVyKSwgZm9ybWF0X3N0ciwgdnRibF9wdHIsCisgICAgICAg ICAgICBpc19zZXRfaGFuZGxlX2hhbmRsZSgqZGF0YV9zZXRfcHRyKSA/Cisg ICAgICAgICAgICAgIHB0cl9mcm9tX3NldF9oYW5kbGVfaGFuZGxlICgqZGF0 YV9zZXRfcHRyKSA6CisJICAgICAgKmRhdGFfc2V0X3B0cik7CisgIGJ1Zl9s ZW4gPSBzdHJsZW4gKGJ1ZmZlcik7CisgIC8qICBTZW5kIHRoaXMgdG8gdG8g c3RkZXJyLiAgKi8KKyAgd3JpdGUgKDIsIGJ1ZmZlciwgYnVmX2xlbik7CisK KyAgaWYgKCF2dHZfbm9fYWJvcnQpCisgICAgX192dHZfcmVhbGx5X2ZhaWwg KG1zZyk7Cit9CisKKy8qIFNlbmQgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3 ZSB3ZXJlIHRyeWluZyB0byBkbyB3aGVuIHZlcmlmaWNhdGlvbgorICAgZmFp bGVkIHRvIHRoZSBlcnJvciBsb2csIHRoZW4gY2FsbCB2dHZfZmFpbC4gIFRo aXMgZnVuY3Rpb24gY2FuIGJlCisgICBvdmVyd3JpdHRlbi9yZXBsYWNlZCBi eSB0aGUgdXNlciwgdG8gaW1wbGVtZW50IGEgc2Vjb25kYXJ5CisgICB2ZXJp ZmljYXRpb24gZnVuY3Rpb24gaW5zdGVhZC4gIERBVEFfU0VUX1BUUiBpcyB0 aGUgdnRhYmxlIG1hcAorICAgdmFyaWFibGUgdXNlZCBmb3IgdGhlIGZhaWxl ZCB2ZXJpZmljYXRpb24sIGFuZCBWVEJMX1BUUiBpcyB0aGUKKyAgIHZ0YWJs ZSBwb2ludGVyIHRoYXQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2V0LiAgKi8K Kwordm9pZAorX192dHZfdmVyaWZ5X2ZhaWwgKHZvaWQgKipkYXRhX3NldF9w dHIsIGNvbnN0IHZvaWQgKnZ0YmxfcHRyKQoreworICBjaGFyIGxvZ19tc2db MjU2XTsKKyAgc25wcmludGYgKGxvZ19tc2csIHNpemVvZiAobG9nX21zZyks ICJMb29raW5nIGZvciB2dGFibGUgJXAgaW4gc2V0ICVwLlxuIiwKKyAgICAg ICAgICAgIHZ0YmxfcHRyLAorICAgICAgICAgICAgaXNfc2V0X2hhbmRsZV9o YW5kbGUgKCpkYXRhX3NldF9wdHIpID8KKyAgICAgICAgICAgICAgcHRyX2Zy b21fc2V0X2hhbmRsZV9oYW5kbGUgKCpkYXRhX3NldF9wdHIpIDoKKyAgICAg ICAgICAgICAgKmRhdGFfc2V0X3B0cik7CisgIGxvZ19lcnJvcl9tZXNzYWdl IChsb2dfbXNnLCBmYWxzZSk7CisKKyAgY29uc3QgY2hhciAqZm9ybWF0X3N0 ciA9CisgICAgICAgICAgICAiKioqIFVuYWJsZSB0byB2ZXJpZnkgdnRhYmxl IHBvaW50ZXIgKCVwKSBpbiBzZXQgKCVwKSAqKiogXG4iOworICBzbnByaW50 ZiAobG9nX21zZywgc2l6ZW9mIChsb2dfbXNnKSwgZm9ybWF0X3N0ciwgdnRi bF9wdHIsICpkYXRhX3NldF9wdHIpOworICBsb2dfZXJyb3JfbWVzc2FnZSAo bG9nX21zZywgZmFsc2UpOworICBsb2dfZXJyb3JfbWVzc2FnZSAoIiAgQmFj a3RyYWNlOiBcbiIsIHRydWUpOworCisgIGNvbnN0IGNoYXIgKmZhaWxfbXNn ID0gIlBvdGVudGlhbCB2dGFibGUgcG9pbnRlciBjb3JydXB0aW9uIGRldGVj dGVkISFcbiI7CisgIHZ0dl9mYWlsIChmYWlsX21zZywgZGF0YV9zZXRfcHRy LCB2dGJsX3B0cik7Cit9CkluZGV4OiBsaWJzdGRjKystdjMvbGlic3VwYysr L3Z0dl9mYWlsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGlic3Rk YysrLXYzL2xpYnN1cGMrKy92dHZfZmFpbC5oCShyZXZpc2lvbiAwKQorKysg bGlic3RkYysrLXYzL2xpYnN1cGMrKy92dHZfZmFpbC5oCShyZXZpc2lvbiAw KQpAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIKKy8v IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLy8KKy8vIFRoaXMgZmlsZSBp cyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlv bikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBHQ0MgaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8v IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor CisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFy ZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJl ZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNp b24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAor Ly8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlv biBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMg Q09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJ ZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgorCisjaWZuZGVmIF9WVFZfRkFJTF9ICisjZGVmaW5lIF9WVFZfRkFJTF9I IDEKKworLyogX192dHZfcmVhbGx5X2ZhaWwgcHJpbnRzIGEgYmFja3RyYWNl IGFuZCBhIG1lbW9yeSBkdW1wLCB0aGVuIGNhbGxzCisgIGFib3J0LiAgSXQg aXMgaGVyZSBmb3IgcHJvZ3JhbW1lcnMgdG8gY2FsbCwgcHJlc3VtYWJseSBm cm9tCisgIF9fdnR2X3ZlcmlmeV9mYWlsLCBpZiB0aGV5IGNob29zZSB0byBv dmVyd3JpdGUgdGhlIHN0YW5kYXJkCisgIF9fdnR2X3ZlcmlmeV9mYWlsIHdp dGggb25lIG9mIHRoZWlyIG93bi4gIFByb2dyYW1tZXJzIHNob3VsZCBOT1QK KyAgYXR0ZW1wdCB0byByZXdyaXRlIF9fdnR2X3JlYWxseV9mYWlsLiAqLwor CitleHRlcm4gdm9pZAorX192dHZfcmVhbGx5X2ZhaWwgKGNvbnN0IGNoYXIg KmZhaWxfbXNnKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworLyog X192dHZfdmVyaWZ5X2ZhaWwgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBj YWxsZWQgaWYgdGhlIHZ0YWJsZQorICB2ZXJpZmljYXRpb24gY29kZSBkaXNj b3ZlcnMgYSB2dGFibGUgcG9pbnRlciB0aGF0IGl0IGNhbm5vdCB2ZXJpZnkK KyAgYXMgdmFsaWQuICBOb3JtYWxseSBfX3Z0dl92ZXJpZnlfZmFpbCBjYWxs cyBfX3Z0dl9yZWFsbHlfZmFpbC4KKyAgSG93ZXZlciBwcm9ncmFtbWVycyBj YW4gd3JpdGUgYW5kIGxpbmsgaW4gdGhlaXIgb3duIHZlcnNpb24gb2YKKyAg X192dHZfdmVyaWZ5X2ZhaWwsIGlmIHRoZXkgd2lzaCB0byBkbyBzb21lIGtp bmQgb2Ygc2Vjb25kYXJ5CisgIHZlcmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUu ICBUaGUgbWFpbiB2ZXJpZmljYXRpb24gY29kZSBhc3N1bWVzIHRoYXQKKyAg SUYgX192dHZfdmVyaWZ5X2ZhaWwgcmV0dXJucywgdGhlbiBzb21lIGtpbmQg b2Ygc2Vjb25kYXJ5CisgIHZlcmlmaWNhdGlvbiB3YXMgZG9uZSBBTkQgdGhh dCB0aGUgc2Vjb25kYXJ5IHZlcmlmaWNhdGlvbiBzdWNjZWVkZWQsCisgIGku ZS4gdGhhdCB0aGUgdnRhYmxlIHBvaW50ZXIgaXMgYWN0dWFsbHkgdmFsaWQg YW5kIG9rIHRvIHVzZS4gIElmCisgIHRoZSBzZWNvbmRhcnkgdmVyaWZpY2F0 aW9uIGZhaWxzLCB0aGVuIF9fdnR2X3ZlcmlmeV9mYWlsIHNob3VsZCBub3QK KyAgcmV0dXJuLiAgKi8KKworZXh0ZXJuIHZvaWQKK19fdnR2X3ZlcmlmeV9m YWlsICh2b2lkICoqZGF0YV9zZXRfcHRyLCBjb25zdCB2b2lkICp2dGJsX3Bv aW50ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2F0 dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSk7CisKKyNlbmRp ZiAvKiBfVlRWX0ZBSUxfSCAqLwo= --f46d04182616b9d22b04d691e32a--